Summary
Give Sentinel the ability to verify acceptance criteria that require executing code, without granting it access to Forge's workspace. Sentinel sends a typed verify task over A2A; Forge (as executor) runs it in its own workspace and returns structured results. A central A2A relay hosted by nexus mediates all traffic.
This also fixes the "Sentinel wakes up blind" incident by making Sentinel hard-fail (never approve) when required artifacts are missing.
Full design and task breakdown: .kilo/plans/1785948146715-sentinel-forge-a2a-verify.md
Locked design decisions
- Delegated verification — Sentinel never SSHes into Forge, never mounts its filesystem. Executor = Forge (v1). Dedicated
verifier worker role is a v2 extension point.
- Transport — A2A (JSON-RPC + SSE) over a central relay hosted by
nexus. Workspaces are outbound-only clients. No peer-to-peer, no Coder tunnels, no A2A-over-Redis.
- Source-of-truth split — Redis SharedStore remains authoritative for durable artifacts (
pair:{id}:plan, pair:{id}:contract, pair:{id}:handoff, new pair:{id}:verification). A2A relay carries only live task exchange; every terminal result is mirrored to Redis before ack.
- Agent-facing surface stays
openflows-harness — new verify request / verify serve / verify list subcommands wrap A2A. Harness remains the sole A2A/Redis client in worker workspaces.
- AuthN reuses the existing workspace token; AuthZ enforced in nexus against the pair's role map (pair-scoped routing).
- Sentinel gate policy — hard-fail (never approve) when
pair:{id}:plan is missing or unreadable; return blocked: missing_artifacts.
Non-goals
- Ephemeral per-review verifier workspaces (deferred).
- Arbitrary shell for Sentinel — only the typed
verify task shape is exposed.
- Replacing Redis SharedStore or the harness typed-write contract.
Task checklist
0. Create tracking issue
1. Schema + shared types
2. Nexus A2A relay
3. Harness client + executor subcommands
4. Sentinel gate refusal policy
5. Forge executor role
6. Worker template wiring
7. Documentation (required)
8. Tests
Rollout
- Ship behind feature flag
a2a_verification (default off)
- Enable on a staging pair; run E2E
- Enable by default; keep flag one release
- Remove flag
Definition of Done
References
- Plan file:
.kilo/plans/1785948146715-sentinel-forge-a2a-verify.md
- Related:
docs/architecture/OpenFlows_Coder_Integrated_Architecture.md (line 719 — "no shared filesystem across workspaces")
- Related:
orchestration/agent/agents/sentinel.agent.md (current gate approval flow)
Summary
Give Sentinel the ability to verify acceptance criteria that require executing code, without granting it access to Forge's workspace. Sentinel sends a typed
verifytask over A2A; Forge (as executor) runs it in its own workspace and returns structured results. A central A2A relay hosted bynexusmediates all traffic.This also fixes the "Sentinel wakes up blind" incident by making Sentinel hard-fail (never approve) when required artifacts are missing.
Full design and task breakdown:
.kilo/plans/1785948146715-sentinel-forge-a2a-verify.mdLocked design decisions
verifierworker role is a v2 extension point.nexus. Workspaces are outbound-only clients. No peer-to-peer, no Coder tunnels, no A2A-over-Redis.pair:{id}:plan,pair:{id}:contract,pair:{id}:handoff, newpair:{id}:verification). A2A relay carries only live task exchange; every terminal result is mirrored to Redis before ack.openflows-harness— newverify request/verify serve/verify listsubcommands wrap A2A. Harness remains the sole A2A/Redis client in worker workspaces.pair:{id}:planis missing or unreadable; returnblocked: missing_artifacts.Non-goals
verifytask shape is exposed.Task checklist
0. Create tracking issue
1. Schema + shared types
crates/a2a-protocolwith serde types + JSON schemas forverifyrequest / result / progress eventspair:{id}:verification,audit:a2a:{task_id},audit:a2a:rejected2. Nexus A2A relay
crates/agent-nexus(message/send,message/stream,tasks/get,tasks/cancel,tasks/resubscribe)(pair_id, role) → sessioncwdvalidation middleware; log rejections toaudit:a2a:rejected(pair_id, sha256(body))with TTLpair:{id}:verification+audit:a2a:{task_id}:*before ack/.well-known/agent-card.json3. Harness client + executor subcommands
crates/openflows-harness(reuses workspace token)openflows-harness verify request(Sentinel-side)openflows-harness verify serve(Forge-side, sandboxed execution + timeout)openflows-harness verify list [--pair PAIR_ID]4. Sentinel gate refusal policy
crates/agent-sentinel: blockgate approvewhenpair:{id}:planmissing/unparseable → emitblocked: missing_artifactsorchestration/plugin/skills/sentinel-review/SKILL.mdwith refusal rule +verify requestusageorchestration/agent/agents/sentinel.agent.md5. Forge executor role
crates/agent-forgebootstrap spawnsverify servealongside heartbeatorchestration/agent/agents/forge.agent.md6. Worker template wiring
verify requestonPATHverify servein session start / systemd-user unit7. Documentation (required)
docs/architecture/a2a-verification.md(topology, schema, allowlist, failure modes)docs/architecture/agent-orchestration-protocol.md(new "Live verification tasks (A2A)" section + key table)docs/architecture/OpenFlows_Coder_Integrated_Architecture.md(~line 719)docs/ORCHESTRATOR.md(nexus relay responsibility, harness command inventory)docs/AGENT_BOOTSTRAP.md(verify serve,verify request)docs/governance.md(A2A allowlist + audit trail row)README.md(one-line mention of delegated verification)orchestration/plugin/skills/sentinel-review/SKILL.mdandorchestration/plugin/commands/plan.mdfor gate refusal rule8. Tests
cwdescape rejection; idempotency deduptimeout_secskills runaway commandtasks/resubscriberecovers artifactgate approvewhen plan missingdocs/phase8-e2e-validation.mdwith acargo testverify before approvalRollout
a2a_verification(default off)Definition of Done
pair:{id}:planis missing (integration test)cargo testin Forge's workspace and receive structured result (integration test)audit:a2a:{task_id}; every rejected one inaudit:a2a:rejectedopenflows-harnessremains sole A2A client (CI grep guard passes)References
.kilo/plans/1785948146715-sentinel-forge-a2a-verify.mddocs/architecture/OpenFlows_Coder_Integrated_Architecture.md(line 719 — "no shared filesystem across workspaces")orchestration/agent/agents/sentinel.agent.md(current gate approval flow)