Views: release a failed base-completion claim; call graph retries a busy owner
Fixes the views round-trip failures (reservation ledger unreadable / "owned elsewhere: Busy") that kept knocking PRs out of the merge queue.
Cause: when a project's first connect failed partway through building the shared views data, AFT released its claim on that data only on success. A process that failed, or panicked during post-bootstrap reconciliation, kept the claim, so every other process waited behind a claim nobody would finish. In the Windows run that exposed it, the call graph retried 502 times in 60 seconds against that stranded claim.
Fix:
- The claim is released on every failure path, including a panic during reconciliation.
- The call-graph view now treats a busy live owner as "still building, retry shortly", backing off from 1 to about 30 seconds like the text view.
- A dead owner is still taken over, and a refused completion is no longer read as live-owner contention.
Tests (they fail without the fix): failed_base_completion_releases_claim_for_callgraph, failed_or_panicked_post_bootstrap_reconciliation_releases_live_claim and base_completion_refusal_is_not_live_owner_contention, driven through the real loading path.
Views are off by default, so this matters for turning views on and for merge-queue stability. Checks: formatting and the Linux compile with warnings denied passed on the build server, after merging current main. The job's result channel was lost before the tests reported, so CI is the gate for tests and Windows.
Summary by cubic
Fixes the views round-trip failures ("reservation ledger unreadable" / "owned elsewhere: Busy") that knocked PRs out of the merge queue, by releasing the base-completion claim on every failure path and making the call-graph view retry busy live owners.
- The base-completion claim is now released on every
verified_bindfailure path, including a panic during post-bootstrap reconciliation, so a stranded claim no longer blocks other processes. - The call-graph view treats a busy live owner as "still building" and backs off from 1 to about 30 seconds like the text view, instead of retrying as SQLite
BUSYon every request. - A dead owner is still taken over, and a refused completion is no longer read as live-owner contention.
- Views remain off by default, so this matters when turning views on and for merge-queue stability.