Build Log
Owner Loop Hardening Charge 3 (+3.5) — Closing the Evidence Durability Boundary, Then Actually Closing It
September 2, 2026
Moved the final resolved/applied/rejected write behind independent authoritative-remote confirmation, proved all 5 required failure scenarios against real code and a real DB, fixed 4 real defects (2 critical) a fresh audit found in the finished mechanism — then, per Zeb's own review, closed the one remaining architectural gap (two kinds of 'done' sharing one status vocabulary) with a real provenance field and two liveness fixes, both independently proven against real production databases.
Timeline
What shipped
forgekit-os/scripts/finalize-owner-intent.mjs — new. Performs the real resolved/applied/rejected DB write ONLY after independently re-confirming the terminal-result evidence is reachable from origin/master (ancestor check + fresh git show + full contract re-validation). Idempotent; refuses a row not genuinely at dispatch_status='awaiting_promotion'. Now also writes resolution_origin='actor' (Charge 3.5) — the ONLY code path in the system that ever writes that value.
forgekit-os/scripts/resolve-owner-intent.mjs — completed-work dispositions (resolved/applied/rejected) now write dispatch_status='awaiting_promotion' only, never the final status, unless this is a same-status wording correction on a row whose original resolution is independently confirmed evidence-backed (new check, closes Finding 3's exploit) — needs_review/reopen unchanged.
.github/workflows/actor-spawn.yml — new 'Finalize Owner Loop request now that evidence is confirmed durable' step, runs only after the independent promotion-confirmation step succeeds.
forgekit-os/scripts/record-promotion-outcome.mjs — guard updated to recognize dispatch_status='awaiting_promotion' as the primary FROM-state for a blocked promotion (the new, expected shape post-§1), keeping the legacy NULL-dispatch-status case for any pre-Charge-3 in-flight rows.
forgekit-os/scripts/validate-terminal-contract.mjs — new intended_status field, required for BUILD/REJECT dispositions — the sole source of truth the finalizer uses for which real status to write.
forgekit-os/scripts/dispatch-owner-loop-requests.mjs — new --reconcile-only flag: a structural early return before claimNextOwnerLoopRequest()/spawnFreshExecution() are ever referenced. Charge 3.5: two new reconciliation functions — reconcileTerminalRowsWithStaleDispatchStatus() (the a800a21c shape) and reconcileAbandonedAwaitingPromotion() (workflow-died-mid-flight recovery, polling real GitHub Actions runs and retrying finalization only when independently confirmed CONFIRMED via checkPublicationStep).
products/medinaCHF/lib/actions/admin-intents.ts — Charge 3 Finding 1 fix: approveAdminIntent/rejectAdminIntent/resolveAdminIntent/dismissAdminIntent now refuse to write a terminal status while dispatch_status is awaiting_promotion/promotion_blocked. Charge 3.5: all 4 now write resolution_origin='coordinator' explicitly.
forgekit-os/scripts/accept-pending-candidate.mjs — Charge 3 Finding 2 fix: now calls finalize-owner-intent.mjs after a successful human-accepted promotion — a real production request (03d938e6) was found permanently stranded by this gap before the fix.
experiments/canvas-{1,2,3,4}/{components/RequestPanel.tsx,lib/request-display.ts} — Charge 3 Finding 4 fix: added the missing awaiting_promotion UI case across all 4 apps.
products/medinaCHF/lib/db/schema.ts, experiments/canvas-{1,2,3,4}/lib/db/schema.ts — Charge 3: five-class lifecycle model comment updates (no real column change). Charge 3.5: new resolution_origin column (real schema change), pushed to and independently verified against all 5 real production databases via information_schema.
products/medinaCHF/components/coordinator/AdminIntentPanel.tsx — resolutionOrigin added to the optimistic-update object (a real type error the schema change surfaced, fixed).
“The little splinter now is that ForgeKit has two kinds of "done" sharing one status vocabulary, plus two non-terminal states without general cleanup. Fix those, and then I'd be comfortable advancing to §3.”