Fixes call graph reads during transient SQLite lock contention so a busy store is reported as busy or pending instead of absent, avoiding misleading cold rebuilds and letting maintenance retry.
Readonly readiness probes propagate SQLite busy/locked errors as retryable instead of treating them as evidence the store is absent; each caller bounds its probe wait, and an old waiter on a consumed channel cannot retire the retry.
A published generation whose reopen probe is busy stays pending; the consumed completion is replaced with an epoch-fenced retry channel so later drains retry the reopen and retain force tokens and pending paths.
aft_inspect keeps dead-code results pending (callgraph_building) and count-free across scoped rollups and finalization, even when the store unlocks between probes, and background reconcile keeps unfinished ownership for another attempt.
Confidence Score: 5/5
The PR appears safe to merge; no new actionable issues remain.
Summary
The PR keeps a briefly locked call graph distinct from a missing one.
Busy call-graph stores stay distinct from missing stores.
Published call-graph stores retry opening after SQLite unlocks.
Both earlier, unnumbered findings are addressed in the current code. No new actionable issues were found.
Diagram
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Read published call graph] --> B{Database ready?}
B -->|Yes| C[Install reader]
B -->|Busy| D[Return busy or pending]
B -->|Absent| E[Use normal missing-store path]
F[Build completed] --> B
D --> G[Keep completion token and pending paths]
G --> H[Retry with a new receiver identity]
H --> B