ForgeKitFORGEKIT

Build Log

Closing the Owner Loop's Isolation Gap

September 6, 2026

Traced a real production incident (a consequential Owner Loop candidate leaking onto master unreviewed) to its exact root cause, fixed and proved it live, then processed a full backlog of real MedinaCHF coordinator requests through the repaired pipeline.

MedinaCHFAlloyOwner LoopProduction IncidentBug Fix
5
real MedinaCHF owner requests shipped
3
root-cause bugs found and fixed
9
production deploys
1
notification system built + proven live

Timeline

Start
MedinaCHF welcome-email edits finished, deploy blocked
Deploy Gate stale-evidence error traced to a genuinely missing npm workspace entry for products/medinaCHF
+1h
Poll-authority question resolved by tracing real code
Confirmed coordinator override was intentional, not a gap
+2h
Canvas app read-only access fixed end to end
3 of 4 canvas apps had no working DB role at all; wired all 4 into Railway, verified live
+3h
First Owner Loop acceptance-boundary bug found
d578d2e1 landed on master unreviewed despite its own record saying awaiting_human_acceptance
+4h
Root cause found and fixed: isolated-worktree commit
Proven with a real scratch-repo reproduction before shipping
+5h
business_policy_semantics narrowed after 2 real false positives
Zeb confirmed neither of two blocked requests actually needed his review
+6h
Fix proven live in production
The next real candidate (421fcf85) stayed correctly isolated — confirmed via git ls-remote
+7h
Zeb's notification email built, wired, and delivery-confirmed
Then found silently broken by a dotenvx stdout-banner leak into the GitHub secret itself
+8h
Briefing page fixed: dead cache, missing button, C-suite voice
Rewrote the synthesis prompt after Zeb called the bullets meaningless
End
5 real coordinator UI/copy requests shipped and deployed
Collapsible Recent Requests, email preview collapse, button rename — all verified against the real send path

What shipped

Fixed products/medinaCHF missing from the root npm workspaces array — deploy:medinachf was silently broken

Provisioned working read-only DB credentials for all 4 canvas apps (only 1 of 4 previously worked) and wired them into Alloy's Railway environment

Root-caused and fixed the Owner Loop acceptance-boundary isolation bug: commitPendingAcceptanceRecord() now commits via an isolated git worktree, never the runner's own HEAD

Built check-pending-acceptance-isolation.mjs — a mechanical sweep that would have caught the incident directly; found 2 more pre-existing leaked candidates on canvas-2

Built and delivery-confirmed a real email notification (sendZebEscalationEmail via a new shared lib/send-zeb-email.mjs) that fires the moment a candidate is parked awaiting acceptance — then found and fixed the actual reason it failed once in production (a dotenvx banner line corrupting the GitHub secret at creation time)

Narrowed business_policy_semantics's definition in the Charge template after 2 real requests were blocked for no real reason — added a concrete reversal-cost test

Fixed the Alloy Briefing page: it was bypassing its own cache-first design (2 real OpenAI calls per page load) and had a fully-built but never-rendered Refresh button

Rewrote the Briefing synthesis prompt's voice and added namedDevelopmentSummaries so bullets are human sentences, not raw internal claim strings

Shipped 5 real MedinaCHF coordinator UI requests: Idea Bank rename + publish flow, 7-day event-planning-credit rule, unified Ideas/Polls/Community leadership page, collapsible Recent Requests + email preview, member-detail button rename