Symptom
When an auditor task (e.g. pact-auditor in concurrent-observation role) completes by going idle without emitting an explicit final HANDOFF, the orchestrator can transition the audit-parent task to completed before the auditor's HANDOFF gets either a metadata.handoff entry or an agent_handoff journal event. Once the auditor task is garbage-collected from TaskList (typical in long sessions, ~hours), the secretary's harvest pass has no source-of-truth for the auditor's verdict — TaskGet returns not-found, session-journal.jsonl has zero agent_handoff events for that task_id, and metadata.handoff was never written.
This regresses the "silence ≠ concurrence" discipline ("GREEN-at-end IS concurrence; silence alone is NOT") documented in the webapp-home-page #22 audit institutional record (lesson [12]).
Evidence
Observed across two independent sessions in different teams this week:
Two recurrences in two teams in one week = recurring failure mode, not session-local quirk.
Suggested fix
Modify agent_handoff_emitter.py (or the auditor-task-completion path) so the auditor emits a final agent_handoff journal event with an explicit verdict (GREEN / YELLOW / RED) before idling — even when the verdict is implicit silent-default. Suggested verdict-payload shape:
{
"type": "agent_handoff",
"agent": "auditor",
"task_id": "...",
"handoff": {
"verdict": "GREEN" | "YELLOW" | "RED",
"signals_emitted": ["silent-default" | "RED@<phase>" | ...],
"produced": "...auditor's wrap-up summary..."
}
}
This makes silent-default a journaled observation rather than a missing artifact, which preserves the 067d2b51c3 lesson [12] discipline programmatically.
Cross-references
Symptom
When an auditor task (e.g.
pact-auditorin concurrent-observation role) completes by going idle without emitting an explicit final HANDOFF, the orchestrator can transition the audit-parent task to completed before the auditor's HANDOFF gets either ametadata.handoffentry or anagent_handoffjournal event. Once the auditor task is garbage-collected from TaskList (typical in long sessions, ~hours), the secretary's harvest pass has no source-of-truth for the auditor's verdict —TaskGetreturns not-found,session-journal.jsonlhas zeroagent_handoffevents for that task_id, andmetadata.handoffwas never written.This regresses the "silence ≠ concurrence" discipline ("GREEN-at-end IS concurrence; silence alone is NOT") documented in the webapp-home-page #22 audit institutional record (lesson [12]).
Evidence
Observed across two independent sessions in different teams this week:
pact-3655e8cc(reflectica/webapp-frontend audit feat: implement Agent Teams executor backend with hook integration #158): auditor task [P3] Add edge case test examples to pact-testing-patterns #21 GC'd before HANDOFF captured.TaskGet 21→ not found;session-journal.jsonlagent_handoff events for task 21 = 0;metadata.handoffon task 21 = absent. Secretary's harvest at task [P1] Generalize security guidance in pact-security-patterns #31 surfaced the gap to the lead, who ruled to accept test-engineer [P0] Replace hard-coded dates in pact-api-design deprecation examples #28's YELLOW verification as an explicit substitution rather than silent-default.pact-7642b0c9(PACT-prompt actor-discriminator bundle PR fix(#781, #760, #738): actor-discriminator capture-shape HARD GATE bundle #808): per the cross-contaminated processed-tasks log left by that session's secretary, task [Assets] Add assets/ directory to pact-database-patterns (Tier 2 - Majority) #24 auditor metadata was "unrecoverable post-GC, only the 2 substantive FINDINGS reconstructable via cross-references in adjacent HANDOFFs."Two recurrences in two teams in one week = recurring failure mode, not session-local quirk.
Suggested fix
Modify
agent_handoff_emitter.py(or the auditor-task-completion path) so the auditor emits a finalagent_handoffjournal event with an explicit verdict (GREEN / YELLOW / RED) before idling — even when the verdict is implicit silent-default. Suggested verdict-payload shape:{ "type": "agent_handoff", "agent": "auditor", "task_id": "...", "handoff": { "verdict": "GREEN" | "YELLOW" | "RED", "signals_emitted": ["silent-default" | "RED@<phase>" | ...], "produced": "...auditor's wrap-up summary..." } }This makes silent-default a journaled observation rather than a missing artifact, which preserves the 067d2b51c3 lesson [12] discipline programmatically.
Cross-references
18ca924b(webapp-frontend feat: implement Agent Teams executor backend with hook integration #158 organizational state snapshot — auditor-handoff-capture-gap entity now PROMOTED to enforcement-candidate per pattern-promotion-threshold)067d2b51c3(webapp-home-page [Assets] Add assets/ directory to pact-api-design (Tier 1 - Strong Consensus) #22 institutional record — original 'silence ≠ concurrence' discipline at lesson [12])