Status: Codex planning artifact
Date: 2026-06-23
Scope: Non-normative eval design for future PRD-031 Phase 2 RED suite. This does not migrate live authority from TURNFILE.yaml, MAILBOX.md, or WORKLOG.md.
PRD-031 Phase 1 already derives mailbox-style surfaces from per-agent signal/outbox/read-state shards. Phase 2 should add task and status shards without changing Maintainer-facing authority until evals, implementation, and peer review converge.
These notes convert the mechanics plan into testable fixtures for a future eval author.
status-owner-match:working-session/agents/codex/status.yamlwithagent: codexfolds into the derived agent table.status-owner-mismatch:working-session/agents/codex/status.yamlwithagent: geminiemitsstatus-owner-mismatchand does not update Gemini state.unknown-agent-status:working-session/agents/qwen/status.yamlemits anunknown-agentcandidate record and does not grant task authority.single-task-flow: one owner emitstask.created,task.claimed,task.updated,task.completed; reducer emits a stable done task row.concurrent-claims: Codex and Gemini both claim the same task with no happens-before edge; reducer emitsclaim-conflictand retains both claims.owner-completion-only: Codex completes its delivery while Gemini still has an unresolved claim; reducer does not erase Gemini's competing claim unless task policy issingle_delivery.duplicate-create: two creates for the sametask_idwith no superseding event emitduplicate-task-create.causal-ordering: out-of-order file order still derives the same table whendepsproduce a deterministic graph.cycle-ordering: cyclicdepsemitdependency-cycleand fall back to deterministic timestamp plus id ordering for display only.read-only-aggregate: aggregate command writes noTURNFILE.yaml,MAILBOX.md,WORKLOG.md, mailbox JSON, or shard files.
Minimum --emit task-json shape:
{
"tasks": [],
"agents": [],
"conflicts": [],
"unknown_agents": [],
"source_events": []
}Minimum conflict fields:
{
"kind": "claim-conflict",
"task_id": "s-example",
"actors": ["codex", "gemini"],
"event_ids": ["TASK-codex-20260623-0001", "TASK-gemini-20260623-0001"],
"resolution": "allow-parallel-then-review"
}- Shard presence is evidence, not authority. Agent authority still comes from PRD-015 onboarding state, model ledger, ownership policy, and Maintainer decisions.
- Unknown local models must be reported as candidates only.
- Phase 2 reducers should be read-only by default and should require an explicit later migration command before touching live aggregate files.
- During migration, PRD-029
next-statediscipline still applies to shared-file writes. - The eval suite should include negative controls for Qwen-like local candidates so a status shard cannot bootstrap write authority.
node --test evals/prd-031-phase2.evals.mjsnode tools/aggregate-coordination.mjs --input fixtures/prd-031/phase2 --emit task-jsonnode tools/aggregate-coordination.mjs --input fixtures/prd-031/phase2 --emit turnfile-json --dry-run
- Should Phase 2 use
worklog.mdshards or defer worklog derivation until tasks/status are stable? - Should task policies live in each
task.createdpayload or in a separate immutable policy fixture? - Should claim conflicts remain visible indefinitely, or collapse after all competing deliveries are reviewed?