**No source change.** Every literal stays counted and none gets an
exemption marker. What changes is that the census now points at these
three with the analysis attached, instead of making each worker who
reaches them re-derive it.
Peers have already done this well for `notification-service.ts` —
converted it, *measured* a real delivery regression, reverted, and left
it counted with the reason. These three had nothing at all, and one of
them is the highest-impact unowned site I found.
## `planner-overseer.ts` (3 guards) — REAL, and larger than three
literals suggest
On a renamed board `resolveWatchedStage` returns `null` for every card.
`observeTask` returns early on a null stage, so **no observation is
recorded**, no `overseer:intervention` entry is emitted, and
`PlannerRecoveryController` — which consumes those observations — has
nothing to steer, retry, or targeted-fix. **The entire oversight loop is
inert and silent about it**, exactly like the self-healing sweeps whose
queries returned empty arrays.
Not mechanical, which is why it is flagged rather than converted.
`resolveWatchedStage` is a pure sync function over a
`Partial<OverseerTaskRef>` with no store and no task id, so the lane
answer has to arrive as a parameter. Its only production caller,
`observeTask`, *is* async and the monitor *does* hold a store — but it
runs **once per task per poll**, so resolving inside it buys a workflow
read per card on a timer.
The shape that works is the one the board-load enrichment landed on in
#2845: resolve at the **poll**, once, with an IR cache keyed by
workflow, and pass the flags down. That makes it a change to
`project-engine.ts`'s poll as much as to this file — a cost judgement
about a periodic engine loop, not a rename. `columnFlags` is in the
unwired-lane-parameter vocabulary, so whoever adds the parameter cannot
leave it unwired.
## `async-mission-store-queries.ts` (1 of 3) — REAL
`getTerminalTaskEvidence` tests only `column === "done"` for its `done`
verdict, so a completed card on a renamed board falls through every
branch to `{ kind: "nonterminal" }`. The caller is mission **terminal
evidence repair**, so a finished feature reads as unfinished — a wrong
*verdict*, not an error. The `archived` test beside it has the same
defect, masked for soft-deleted rows by its `deletedAt` companion, which
is why only the `done` half bites in practice.
Takes a bare `QueryHandle`: no store, no task object, no workflow. The
fix is a resolved terminal-lane set threaded in by the caller — the same
shape `getLiveTaskColumn` needs, and it should land *with* it so the two
cannot disagree about what "finished" means.
## `audit-ops.ts` (2) — one sentinel, one real, and they look identical
```ts
if (state === "archived") // ← getLiveTaskColumn's MANUFACTURED value: do NOT convert
if (pgRow.column === "archived") // ← a real board lane: convertible
```
The first compares against a string `getLiveTaskColumn` *fabricates* for
an archived-or-soft-deleted parent, so converting it to
`isArchivedColumnRole` would keep passing on the built-in board and
start **failing** on a renamed one — a soft-deleted task's log would
become writable. The second reads the task row, so a renamed archived
column keeps accepting log writes; its `deletedAt` companion masks that
in practice.
Two lines that look the same and need opposite treatment is precisely
the reason these notes are worth more than the count.
## Verification
- `pnpm test:gate` — 161 / 487 / 13 / 71 passed
- `pnpm lint` — clean
- `tsc --noEmit` (`@fusion/core`, `@fusion/engine`) — clean
- `planner-overseer.test.ts` — 50 passed
- census `--strict` — exit 0, **counts unchanged** (that is the point)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>