You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
V48 Gate 3 (specification-implementation): surface reconnect-required state on deposit branch/commit selects (V48-Gate3-F32)
Live QA: with a repository already selected, Branch and Commit stayed on
"Select branch.../Select commit..." forever — no loading spinner, no error,
and clicking didn't even open the dropdowns.
Root cause: the branch/commit fetch effects in DepositSourceSelection.tsx
gate on connectionStatus.valid (a live re-check of the GitHub session), not
just .connected. A GitHub App installation token expires roughly hourly, so
connected:true/valid:false is a normal, recurring state — the repository
list still populates (it doesn't need .valid), but Branch/Commit silently
stay empty, and disabled={branches.length === 0} makes the selects inert
with nothing telling the depositor why.
The legacy TerminalRepositoryContextPanel this component replaced had
dedicated "reconnect required" messaging + a Reconnect CTA for exactly this
state; it was dropped in the deposit-native rewrite. Restored it: an amber
banner explaining Branch/Commit are empty until the live session
reconnects, a Reconnect GitHub button (reusing TerminalOpenAuxillariesButton
directly — its own logic has no terminal-workspace coupling), and matching
inline hints under each select.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: BITCODE_V48_QA.md
+6Lines changed: 6 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -520,6 +520,12 @@ Track 3-4 scripts (BTD ledger, settlement, pack journaling) get added when those
520
520
- Cause: `POST /api/deposit/synthesize-options` (V48-Gate3-F26-B) dispatches the run then returns `{status:'dispatched'}` immediately, with the actual multi-agent synthesis (`runSynthesis()`) continuing as a bare `void runSynthesis()` promise after the response completes. Vercel Functions (including Fluid Compute) do not guarantee an instance stays alive to finish work started before the response but not awaited by it — the platform is free to freeze/recycle the instance once the response is flushed, unless the continuation is registered via `waitUntil()`. This is the same failure class `execution-orphan-sweep.ts`'s own header comment already names as the reason its sweep exists ("dev-server restarts (and crashed serverless boxes) kill in-process pipelines … leaving them running forever" — QA runs `7f023f23` and the 2026-07-03 pre-restart orphans): that sweep detects and relabels the resulting stuck-`running` rows as `interrupted`, but nothing previously stopped the box from being killed mid-run in the first place. The same bare-`void` pattern was also on the orphan sweep's own fire-and-forget call at dispatch time.
521
521
- Repair: added `@vercel/functions` and wrapped both fire-and-forget continuations in `waitUntil()` — the `runSynthesis()` background run and the `sweepOrphanedExecutions()` call in `uapi/app/api/deposit/synthesize-options/route.ts`. This keeps the Function instance alive until the promise settles, so a dispatched run either completes or fails and finalizes its row through the normal `finalizeExecutionRow`/error-banner path, instead of being silently killed mid-flight. Checked the only sibling background-dispatch route (`/api/pipeline-harness/asset-pack`) and confirmed it does NOT have this defect: its continuation runs inside an open `ReadableStream` (SSE), whose lifetime keeps the Function instance alive by construction — no `waitUntil` needed there. Verified: `tsc --noEmit` 0; `depositSynthesizeOptionsRoute.test.ts` 6/6 green.
522
522
523
+
### V48-Gate3-F32 — Branch/Commit selects on `/deposits` silently stuck on a stale GitHub connection, no explanation (FIXED)
524
+
525
+
- Severity: high (reported live, 2026-07-08: "branch and commit selects seem broken … not loading lists+defaults nor is clicking opening dropdowns" — with a repository already selected).
526
+
- Cause: `DepositSourceSelection.tsx` (the deposit-native replacement for the legacy `TerminalRepositoryContextPanel`/`TerminalSupplySelectionPanel`) fetches the repository list gated only on `connectionStatus.connected`, but gates the Branch and Commit fetch effects on BOTH `connectionStatus.connected` AND `connectionStatus.valid` (same asymmetry as the legacy panel). `valid` comes from `validateStoredConnection`, which re-checks the live GitHub session/token — a GitHub App installation token expires ~hourly and is regenerated lazily, so `connected:true, valid:false` is a normal, recurring state, not an edge case. In that state a repository is still selectable (stored inventory doesn't need `valid`), but Branch/Commit silently stay at `[]` forever: `disabled={... || branches.length === 0}` (and the same for commits) keeps the selects inert with no loading spinner and no error text — the legacy panel this replaced had dedicated "reconnect required" messaging + a Reconnect CTA for exactly this state (`connectionStatus?.connected && !connectionStatus.valid`, `TerminalRepositoryContextPanel.tsx`), but that messaging was dropped when `DepositSourceSelection` replaced it — the refactor's docblock even says it "carries no terminal-UI dependency," which is what left this state unhandled.
527
+
- Repair: added a `connectionNeedsReconnect` derived flag to `DepositSourceSelection.tsx`; when true, an amber banner (mirroring the legacy panel's messaging) explains that Branch/Commit stay empty until the live session reconnects, with a "Reconnect GitHub" button (`TerminalOpenAuxillariesButton`, opens Auxillaries → Externals — reused directly since its own logic has no terminal-workspace coupling, only its file location is under `app/terminal/`). The Branch/Commit helper hints below each select also swap to "Reconnect required to load branches/commits" instead of the normal "default is selected when available" copy in this state. `TerminalOpenAuxillariesButton.tsx` was missing an explicit `React` import (never directly rendered by a test before — ts-jest's classic JSX transform needs it in scope); added it. Verified: `tsc --noEmit` 0; new `depositSourceSelection.test.tsx` coverage (valid connection → no banner; invalid → banner + Reconnect button + both hint texts) 5/5 green; full uapi jest suite 639/640 green (1 pre-existing skip).
528
+
523
529
## Track 1 — Identity / Authentication / Auxillaries — COMPLETE 2026-06-12 (email deferred by decision; F2/F9 and legacy eradication queued for gates)
524
530
525
531
-[x] Sign up / sign in via Connect Wallet (nav CTA → SignUpWindow → wallet signature on testnet4 → `custom:bitcode-bitcoin` session → `/tps/supabase/callback`) — verified 2026-06-12 after F5 fix; lands on `/packs`. Re-verified from fully nuked state (purged user + cleared site data): created 19:29:21 → session 19:29:25 → binding auto-written 19:29:29 by the bridge on `/packs` mount with no Auxillaries visit; UI consistent across nav, Wallet, and Profile panes.
0 commit comments