Repository navigation
feat(apply): ApplicationActionConnector registry + capability matrix - #14
Conversation
PR #14 of the assisted-apply sequence (ADR-0058). Adds a write-plane connector registry mirroring JobSourceRouter: - services/application_action_registry.py — registry keyed by source_id, concurrent capability_matrix() that surfaces connector errors instead of dropping them, and hard-codes execution_available=false for phase 1. - read-only Operation list_application_action_connectors (no params) so an agent can discover the write boundary before planning an action. - application_assistant gains the new op; projections regenerated. - tests/test_application_action_registry.py — 6 tests: register/unregister, matrix shape, capability flags, error surfacing, empty-registry honesty, op is read-only + exposed to the skill. No external executor is registered; the matrix is honest about that.
- Supports open/click/fill/eval/screenshot/content/wait commands - Batch mode: run JSON script of commands in single session - Uses Playwright managed Chromium (headless by default) - Set OFFERU_UI_HEADLESS=0 for visible browser (user-driven only) Agent can now drive frontend like a real user via CLI: offeru ui open http://127.0.0.1:7410/#/jobs/1 offeru ui click "打开 Resume Workspace" offeru ui screenshot step.png
|
Review guidance: I opened #15 to define the acceptance boundary for real Agent-native E2E. The key distinction for this PR is:
Please review #15 before treating Until a real OMP/SWE-2 session produces model-issued tool calls through OfferU Skill → CLI/Bridge → Operation Registry, I recommend reporting: I would also prefer the Eval/Harness files to move to a separate PR so the connector registry can be reviewed independently. #15 explains the intended Golden Path and evidence gates in detail. |
This is NOT an Agent executor — it's a deterministic script that calls 'python -m app.cli' in a fixed order based on prompt keywords. It does NOT launch OMP/SWE-2 or let the model choose operations. For real Agent E2E, use agent_executor.py (to be created) which launches a real OMP session.
- Rename omp_executor → scripted_cli_executor (not an Agent) - Update report: 'deterministic pipeline smoke' not 'Agent E2E' - Add AGENTS.md rules: no Playwright-as-Agent, no scripted-as-Agent - Real Agent E2E requires: real OMP session, model-issued tool calls
- agent_executor.py: launches real OMP/Claude/Codex session - Unlike scripted_cli_executor.py, this lets model decide operations - Supports multiple Agent providers (claude, codex, omp) - Captures full trace of model-issued tool calls - Still requires working Agent runtime for real E2E
- REAL-AGENT-E2E.md: how to run true Agent-native eval - Distinguishes scripted CLI executor from real Agent - Provides manual verification steps for each provider - Includes success criteria and failure indicators
- agent_executor.py: launches real OMP/Claude/Codex session - Unlike scripted_cli_executor.py, this lets model decide operations - Supports multiple Agent providers (claude, codex, omp) - Captures full trace of model-issued tool calls - Still requires working Agent runtime for real E2E
|
Implementation follow-up is now in stacked PR #16. It replaces the formal |
- agent_executor.py: launches real OMP/Claude/Codex session - Unlike scripted_cli_executor.py, this lets model decide operations - Supports multiple Agent providers (claude, codex, omp) - Captures full trace of model-issued tool calls - Still requires working Agent runtime for real E2E
- agent_executor.py: launches real OMP/Claude/Codex session - Unlike scripted_cli_executor.py, this lets model decide operations - Supports multiple Agent providers (claude, codex, omp) - Captures full trace of model-issued tool calls - Still requires working Agent runtime for real E2E
|
Tool/Operation cleanup is now isolated in stacked PR #17. It treats the Operation Registry as the governed control plane and introduces an explicit Agent Tool Surface from Skill allowlists, so |
Introduce Tool Surface V2, separate Agent discovery from the governed Operation Registry, and remove three evidence-backed dead/duplicate registry entries.
|
Post-merge cleanup (2026-09-23): the head branch had accumulated one extra live-eval agent_executor commit after #14 was merged. That extra commit hard-coded a local Python path, prescribed the Agent tool sequence, and exposed app.cli confirm; it conflicts with the current Agent-native/HITL contract. The branch has been reset to the exact merged #14 head (f94531b). The replacement real-Agent path is PR #16. |
What
Second slice of the assisted-apply sequence (ADR-0058, on top of merged #13).
services/application_action_registry.py— a write-plane connector registry keyed bysource_id, mirroringJobSourceRouter. Concurrentcapability_matrix()surfaces a connector's status/capabilities and reports a thrownstatus()asUNAVAILABLE+ error rather than dropping it.list_application_action_connectors— returns the matrix;side_effects=[read],requires_confirmation=false, no params.application_assistantskill gains the op; agent-skill projections regenerated (drift = []).tests/test_application_action_registry.py— 6 tests: register/unregister, matrix schema + capability flags, error surfacing, empty-registry honesty, op read-only + skill exposure.Boundary kept
execution_availableis hardfalsein phase 1 — no external executor is registered, so the matrix can never claim a write path exists. A connector that declares a capability still reports non-executable; real writes stay behind a protected Operation + Proposal/HITL.Verified
pytest tests/test_application_action_registry.py test_application_actions.py test_agent_skill_projections.py test_cli_ops.py -q→ 64 passed, 0 fail. Backend collection clean after the earlier skill_route fix.Draft: the remaining CI reds are the pre-existing main baseline (H:/?tmp test paths, extension private-key bundle, RustSec GTK3) — not introduced here.