ForgeKitFORGEKIT

Build Log

Alloy Bank Phase — Completion

July 26, 2026

Finished Alloy's Bank phase rebuild — the 7th and final Arc lifecycle phase — closing out the full Orient through Bank arc, then a live adversarial audit found and fixed 3 real bugs before wrap.

AlloyFeatureTestingMilestone
6
remaining Bank tickets completed
3
real bugs found and fixed by adversarial audit
9
unit/integration tests, all passing
4/5
e2e tests in bank-phase-contract.spec.ts passing (1 known-failing: 'Historical Bank', root cause undetermined)

Timeline

Start
Resumed the paused Bank build
Ticket 1 (schema) was already done from a prior session; Tickets 2-7 remained
Build
Tickets 2-7 built in one pass
repository-custody.ts, bank-snapshot.ts, actions.ts extensions, BankPanels.tsx + page rebuild, e2e spec
Anvil
Zeb: is this recreating what the OS session already does?
Checked against the Crucible-is-the-only-second-model Strike — confirmed Bank's new fields are real Arc/repo/Workpiece bookkeeping, not a duplicate retro narrative
Polish
Iterative screenshot-driven layout pass
Title fix (Workpiece name not raw UUID), stacked Learnings/Open Items, moved Confirm Bank button to the right rail, fancier button treatment, panel-size tuning
Audit
Independent adversarial audit dispatched before wrap
Dogfooded the Adversarial Build Audit Gate written earlier this session — found 3 real bugs
Fix
Fixed the critical + moderate findings
Rename-parsing bug, a second self-discovered leading-space bug, and wired real server-side readiness enforcement into bankArc
Close
Debugged one e2e failure to a dead end, stopped, documented honestly

What shipped

products/alloy/lib/repository-custody.ts — resolveRepositoryCustody, real git shell-out (branch/HEAD/ahead-behind/working-tree-status), fixed a rename-parsing bug and a leading-space-trim bug found by its own regression test

products/alloy/lib/repository-custody.test.ts — 4 new real-git tests (rename, plain modification, clean tree, non-git directory)

products/alloy/lib/bank-snapshot.ts — buildBankSnapshot, deriveBankReadiness (uncommitted-changes rule downgraded from blocking to attention)

products/alloy/lib/actions.ts — bankArc extended to collect new closure fields, resolve real custody server-side, and enforce readiness before mutation; recordWorkpieceDisposition widened to also write the 5-way bankWorkpieceDisposition column; transitionArcPhase's close CTE widened with COALESCE clauses for all new bank* fields

products/alloy/lib/db/bank-close-cte.integration.test.ts — 3 new real-DB tests proving the widened close CTE (full field set, COALESCE-preserves-unset-fields, stale-control-version fence)

products/alloy/components/BankPanels.tsx — 9 real panels (BankReadinessPanel, ArcOutcomePanel, RepositoryCustodyPanel, DeliveryStatusPanel, BankDecisionsInterventionsPanel, ContinuitySealPanel, VerificationPanel, BankArcForm, ConfirmBankButton), all using the shared PanelHeader convention

products/alloy/app/bank/page.tsx — rebuilt to consume one BankSnapshot, height-bounded 3-column + rail layout matching Quench/Temper's convention, Workpiece-title page header instead of raw Arc UUID

products/alloy/tests/e2e/bank-phase-contract.spec.ts — 5 real browser e2e tests, 4 passing + 1 known-failing (documented in-file)

products/alloy/components/BankArcForm.tsx — retired (superseded by the same-named function inside BankPanels.tsx)