Skip to content

feat(apply): ApplicationActionConnector registry + capability matrix - #14

Merged
avabbbb merged 14 commits into
mainfrom
feat/action-connector-registry
Sep 22, 2026
Merged

avabbbb merged 14 commits into
mainfrom
feat/action-connector-registry

Conversation

@avabbbb

@avabbbb avabbbb commented Sep 21, 2026

Copy link
Copy Markdown
Owner

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 by source_id, mirroring JobSourceRouter. Concurrent capability_matrix() surfaces a connector's status/capabilities and reports a thrown status() as UNAVAILABLE + error rather than dropping it.
  • New read-only Operation list_application_action_connectors — returns the matrix; side_effects=[read], requires_confirmation=false, no params.
  • application_assistant skill 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_available is hard false in 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.

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

avabbbb commented Sep 22, 2026

Copy link
Copy Markdown
Owner Author

Review guidance: I opened #15 to define the acceptance boundary for real Agent-native E2E.

The key distinction for this PR is:

  • ApplicationActionConnector Registry / capability matrix: valid product-infrastructure work
  • current omp_executor.py: deterministic scripted CLI executor, useful for smoke coverage but not evidence that OMP/SWE-2 chose the operations
  • Playwright flow: frontend regression evidence, not Agent-native E2E evidence

Please review #15 before treating docs/evals/E2E-EVAL-REPORT.md as an Agent result.

Until a real OMP/SWE-2 session produces model-issued tool calls through OfferU Skill → CLI/Bridge → Operation Registry, I recommend reporting:

DETERMINISTIC_PIPELINE_SMOKE = PASS
FRONTEND_PLAYWRIGHT_FLOW     = PASS
AGENT_NATIVE_E2E             = NOT_RUN
MODEL_IDENTITY               = UNVERIFIED
MODEL_TOOL_SELECTION         = NOT_VERIFIED

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

avabbbb commented Sep 22, 2026

Copy link
Copy Markdown
Owner Author

Implementation follow-up is now in stacked PR #16. It replaces the formal --runtime omp eval path with a real OMP --mode rpc Agent process and model-issued tool-event capture. The deterministic scripted_cli_executor.py remains smoke-only. I recommend reviewing #14 for Connector Registry scope and #16 for Agent/Eval runtime scope separately.

- 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

avabbbb commented Sep 22, 2026

Copy link
Copy Markdown
Owner Author

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 --group no longer exposes route-level CRUD/legacy/diagnostic entries. It also removes 3 evidence-backed redundant/dead Registry entries. Please keep #14 focused on Assisted Apply Connector behavior.

Introduce Tool Surface V2, separate Agent discovery from the governed Operation Registry, and remove three evidence-backed dead/duplicate registry entries.
@avabbbb
avabbbb marked this pull request as ready for review September 22, 2026 07:55
@avabbbb
avabbbb merged commit 7fee782 into main Sep 22, 2026
9 of 12 checks passed

avabbbb commented Sep 23, 2026

Copy link
Copy Markdown
Owner Author

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant