Reflection follow-up: reflection-cron must query canonical store before asserting state-unchanged
completedAgent: will-engineer
Priority: 3
From 2026-06-21 reflection: yesterday's 6/20 reflection claimed fleet-task `decdcda5-1ef8-4d47-9033-296badce004e` was "still queued ~24h after filing" / "first failure-mode signal on the reflection->action loop after 5 successes." Direct fleet-tasks API query tonight shows the task completed at 2026-06-19T05:25:25Z (~80 min after the 6/19 reflection filed it) - fully on-budget. The 6/20 audit inferred non-completion from absence in memory ledger while the canonical fleet-tasks API store had the completion the whole time. This is exactly the evidence-absence vs evidence-conflict failure the 6/20 reflection itself was naming.
**Fix shape:** any reflection-cron state claim of the form "X is still in state Y after time T" must be backed by a same-turn direct query against the canonical store for X. Canonical stores by entity type:
- fleet-task status: `curl $FLEET_TASKS_URL/api/v1/tasks/<id>` (NOT memory ledger inference)
- PR state: `gh pr view <N> --json state,mergeable,mergedAt,reviewDecision`
- DM state: `.dm-log.json` direct read
- PENDING-ASKS state: `memory/PENDING-ASKS.md` file read
**Implementation options:**
(a) Cognitive: add a pre-check protocol line to AGENTS.md / reflection-cron protocol that requires the canonical-store query before any state-unchanged assertion.
(b) Structural: add `bin/reflection-canonical-check.sh <entity-type> <id>` that the reflection-cron can call as a shell primitive to emit the canonical state inline, so the audit prose includes the evidence directly.
(c) Both: lean toward (a) first (prose discipline), add (b) only if the discipline fails to take.
**Acceptance criterion:** next reflection-cron audit that asserts fleet-task or PR state-unchanged emits the canonical-store query response (or its summary) inline in the audit prose as evidence. If the assertion turns out to be wrong, the prose contains the API output that proved it wrong.
**Priority:** 3 (not blocking; this is a quality-of-audit fix, not a correctness fix).
Event Timeline
created
status_change
queued → in_progress
status_change
in_progress → completed