ForgeKitFORGEKIT

Build Log

Empty Canvas Rehearsal, Owner Loop Speed Fixes, and Canvas-2 Provisioning

August 29, 2026

Ran canvas-1's end-to-end field-readiness rehearsal (both the direct and shaped/confirmation paths), found and fixed a real wrong-Neon-branch bug undermining app isolation, cut Owner Loop Actor run time from ~11 minutes toward ~3, shipped real request-panel UX, and automated canvas app provisioning end-to-end.

Empty CanvasOwner LoopNeonProvisioning AutomationMedinaCHF
2
real, blocking defects found and fixed via live rehearsal (table-name hardcoding, npm workspace-dependency 404)
1
real wrong-Neon-branch isolation bug found and corrected (4 real request rows migrated)
~11min → ~3min
reduction in real Owner Loop Actor run time (dependency pre-warm + removed unnecessary Playwright install)
2
canvas apps fully live and verified (canvas-1 real participant slot, canvas-2 playground)
1
reusable provisioning script written (provision-canvas-app.mjs) — Clerk app creation confirmed fully API-automatable

Timeline

Start
Continue toward field use
Fix the shaping-confirmation gap, then run a non-participant rehearsal of canvas-1's full Owner Loop lineage
Rehearsal
Direct-path rehearsal found 2 real infra defects
Hardcoded admin_intents table name in the dispatcher, and no npm-workspace-dependency resolution in promote-app.mjs's standalone deploy — both fixed and verified live
Deploy
canvas-1 reached genuine production, twice re-verified
Real Vercel token issue, missing dotenv dependency, and missing Clerk redirect env vars each found and fixed before the deploy was confirmed healthy via a real headless-browser load
Cost audit
Investigated a real Vercel build-minutes spike
Traced ~50% of the billing cycle's build minutes to forgekit-website deploying on every single git push (git integration) plus every retro run — Zeb disconnected git integration account-wide; retro.mjs's own auto-deploy step was removed
Shaping test
Ran the real shaped/confirmation path live
Confirmed the earlier shaping-confirmation fix works end-to-end against a genuinely vague real request
Speed fix
Cut Actor run time via real timing evidence
A real ~11-minute run's own step timestamps showed ~2 min of blind dependency trial-and-error and ~1.5 min installing Playwright unnecessarily — fixed both (cached npm ci pre-warm, a real publicVerificationPath check removing the felt need for a browser)
MedinaCHF observation
Preserved a real cross-request continuation Anvil/Strike
Three real MedinaCHF requests showed ForgeKit re-starting its own understanding at each message instead of recognizing a continuing responsibility — written up as field evidence, no architecture built
UX
Shipped real request-panel improvements
Live polling, response timestamps, honest working-status labels, then (per Zeb's follow-up) type-of-work labels, real duration, and a build-session link — the latter required a real, deliberately-confirmed schema widening
Branch bug
Found and fixed a real Neon branch-isolation defect
canvas-1 had been reading/writing the SHARED production branch all session, not its own dedicated one — root-caused to a neonctl flag mistake, fixed by migrating real data and rotating every credential
canvas-2
Provisioned a second, fully live canvas app
Playground, not a real participant slot — proved every provisioning step is programmatic, including Clerk application creation (previously assumed to require a manual dashboard step)
Automation
Extracted provision-canvas-app.mjs
Per Zeb's explicit instruction not to repeat manual provisioning a third time — folds in every real lesson from canvas-1/2's own provisioning

What shipped

forgekit-os/scripts/dispatch-owner-loop-requests.mjs — parameterized every hardcoded admin_intents SQL reference by real per-app table name (tableNameForApp), handled org_id's absence for canvas apps

forgekit-os/scripts/promote-app.mjs — added workspacePackages upload/rewrite mechanism (resolves real npm-workspace deps like forgekit-core in a standalone Vercel deploy), and publicVerificationPath-based liveness check (a real, declared public route gives an unambiguous 2xx instead of the prior always-check-root behavior that false-failed on Clerk-gated apps)

forgekit-os/scripts/spawn-fresh-actor.mjs — fixed a real cross-platform bug: the CLI entrypoint guard used a POSIX-only file:// URL comparison that silently never fired on Windows, meaning direct invocation from a Windows dev shell exited 0 having dispatched nothing

forgekit-os/scripts/retro.mjs — removed the unconditional `vercel --prod` auto-deploy step; retro now only regenerates journal/session artifacts, never deploys forgekit-website

.github/workflows/actor-spawn.yml — added a cached `npm ci` pre-warm step before the Actor starts, eliminating blind dependency-discovery trial-and-error on every run

experiments/canvas-1/lib/db/schema.ts (+ canvas-2/3/4) — added declaredClaims jsonb column

forgekit-os/scripts/resolve-owner-intent.mjs — widened (deliberately, confirmed with Zeb first) to accept an optional declaredClaimsJson argument, validated and written only for apps whose table has the column

experiments/canvas-1/lib/owner-loop-trigger.ts (+ canvas-2/3/4) — ported MedinaCHF's direct-dispatch trigger; canvas apps previously depended entirely on the apparently-never-firing scheduled cron

experiments/canvas-1/components/RequestPanel.tsx (+ canvas-2/3/4) — live polling while any request is in flight, response timestamps + real computed duration, honest dispatch-derived working-status labels, type-of-work labels, and a build-session (GitHub Actions run) link

forgekit-os/scripts/provision-canvas-app.mjs — new, fully automates Clerk app creation, Vercel project creation, Neon roles, all env vars, and all GitHub secrets for a canvas app

forgekit-os/journal/anvils.md + strikes.md — preserved the MedinaCHF cross-request continuation observation as field evidence

canvas-2 — a new, fully provisioned and live canvas app (Zeb's own playground, not a participant slot)