Second of the four long-red live-PG suites, after #2669. This one is
**stale documentation making a stale test look like a code bug** —
behaviour is unchanged.
## What was wrong
`getWorkflowSettingsProjectIdImpl` documented a three-step resolution
order:
```
(a) store.asyncLayer?.projectId — central-registry id (PG)
(b) store.db.getProjectIdentity()?.id — legacy SQLite identity
(c) store.rootDir — last-resort key
```
The code does (a), then returns `rootDir`. **Step (b) was removed** by
`FNXC:SqliteDualPathCleanup 2026-07-26-14:15` — but the doc block kept
describing it, and a comment three lines above the return still said
*"Only the true legacy (non-backend) path consults the SQLite
identity"*, which has been false for every caller since.
## Which side was wrong — settled by construction, not judgement
In my triage on #2669 I said I would not guess between "the test is
stale" and "the code lost a needed branch", because the two have
opposite consequences and the stale comments made the intent unreadable
from outside. That was the right call then; it is now answerable:
`dbImpl` **throws unconditionally and ignores its store argument**
(`task-id-integrity.ts:58`):
```ts
export function dbImpl(_store: TaskStore): Database {
throw new Error("TaskStore.db: SQLite Database is not available in backend mode …");
}
```
There is no mode in which `store.db` yields a usable SQLite handle. Step
(b) is unreachable **by construction**, not merely unused — so the code
is right and the documentation was wrong.
## Why the tests passed review originally
They build a store double whose `getProjectIdentity()` **returns** a
value:
```ts
db: { getProjectIdentity() { return { id: "legacy_identity_id" }; } }
```
Production cannot produce that shape. The double made an unreachable
branch look testable, which is how the assertion survived the cleanup
that deleted the branch.
Rewritten to the shipped contract. A neighbouring case that already
asserted `rootDir` *when the stub throws* was passing all along — the
two forms of the same store disagreed inside one file.
## Verification
Suite **7/9 → 9/9**. `pnpm test:gate` green (10 / 158 / 487 / 71). `pnpm
check:lifecycle-columns` exits 0. `tsc -p packages/core/tsconfig.json`
clean. `pnpm lint` clean.
No changeset: no behaviour change, and no user-visible effect.
## Remaining from the four
- ✅ `store-wedge-resolution` — real product bug, fixed in #2669
- ✅ `workflow-settings-project-identity` — this PR
- ⬜ `agent-logs-and-monitor` — `expected +0 to be 2` on an aggregation
- ⬜ `central-archive-secrets` — an assertion on `warn` arguments
Two of four were real problems hiding behind "pre-existing". The other
two are still unruled-out.
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>