Build Log
Pursuits Fix, Canvas-1 Recovery, Two Owner Loop Charges, and forgekits.build Tells the Truth
September 14, 2026
A four-part session: fixed Alloy Pursuits' product-linking gap, recovered and redesigned canvas-1 for a real user, shipped two Owner Loop hardening Charges (Steward the Whole Product, Make App Differences Boring), then audited and rewrote the entire public website end to end against real evidence instead of memory.
Timeline
What shipped
products/alloy/lib/pursuits/synthesize.ts — gatherClaims() now follows productIds links to real Workpieces, not just directly-linked ones
forgekit-os/product-registry.json — added canvas-1..4 entries, fixed a regressed medina-chf/medinachf key drift
experiments/canvas-1/ — recovered 3 real stranded Owner Loop candidates via cherry-pick, plus a full navigation/visual redesign (BottomNav, real Home page, teal design tokens, Fraunces/Source Sans fonts)
forgekit-os/charges/steward-the-whole-product-2026-09-14.md — Council-reviewed, Zeb-tightened Charge doc
experiments/canvas-1/PRODUCT.md — bootstrapped durable product-knowledge doc
experiments/canvas-1/lib/db/schema.ts — pendingOwnerDisclosures table
forgekit-os/scripts/finalize-owner-intent.mjs — disclosure prepend at the one real terminal write path
forgekit-os/scripts/dispatch-owner-loop-requests.mjs — PRODUCT.md injection into every Owner Loop Charge
forgekit-os/charges/make-app-differences-boring-2026-09-13.md — final Charge doc with full Proof section
forgekit-os/config/apps.json — owner_loop namespace added to all 5 apps
forgekit-os/scripts/lib/owner-loop-app-contract.mjs + owner-loop-operations.mjs — the real fail-closed contract/operations layer
15 forgekit-os/scripts/ files migrated off hand-duplicated HAS_CANONICAL_COLUMNS/TABLE_NAME_BY_APP literals onto the contract
forgekit-os/scripts/check-owner-loop-app-shape-literals.mjs — new drift-guard gate, wired into test:os
products/alloy/lib/owner-loop-app-contract.ts + .test.ts — Alloy's own reader, cross-checked byte-identical against the OS's .mjs loader via a real spawned node subprocess
forgekit-os/charges/website-truth-corrected-findings-2026-09-14.md — Phase 0 Corrected Findings & Decisions Register, Known exposure decision recorded
forgekit-website/app/layout.tsx, app/page.tsx, app/about/page.tsx, components/Footer.tsx, public/manifest.json — Phase 1, global shell/homepage/About
forgekit-website/app/medinachf/{page,case-study/page,story/page}.tsx — Phase 2, MedinaCHF family's Act 2 (Owner Loop ownership story)
forgekit-website/app/research/page.tsx, app/labs/page.tsx — Phase 2, reorganized by real evidence status instead of a flat portfolio grid
forgekit-website/app/forgehome/page.tsx, app/forge/page.tsx — Phase 2, dead cross-site #contact anchors fixed
forgekit-website/app/known/page.tsx, app/known/prototype/layout.tsx — Phase 2, public-research-preview framing + noindex on the raw prototype demo
forgekit-website/app/brochure/page.tsx, app/journal/page.tsx — Phase 3, pricing correction + stale case-studies claim fixed
forgekit-website deployed to production — all 33 routes verified live at forgekits.build
“Truth-audit first, Crucible on the audit findings + plan, then build page-by-page.”