ForgeKitFORGEKIT

Build Log

Open the Owner Loop Through ForgeKit

September 17, 2026

Built the first ForgeKit MCP plugin — a doorway into the real Owner Loop, not a second one — then proved the full lifecycle by recovering a real Actor concurrency incident and shipping the change it produced.

AlloyOwner LoopMCP Plugincanvas-2
5
MCP tools
5
new API routes
23
passing tests
1
real terminal Owner Loop cycle proven

Timeline

Start
Received the Charge, ran the Crucible
architect/qe/steward Council unanimously rejected a generic adapter registry — one in-app adapter for one Canvas app
+2h
Built the plugin + adapter
5-tool MCP server, thin canvas-2 adapter reusing existing lifecycle functions verbatim
+3h
Real end-to-end adapter proof
Idempotent submission, real AI-driven clarification round-trip against canvas-2's live DB
+4h
Zeb submitted a real request
A real Actor built, verified, and hit a real promotion-push concurrency incident
+5h
Recovered, deployed, verified live
Fixed the dispatch_status desync, ran finalize-owner-intent.mjs, deployed via the real deploy command, confirmed via direct HTTP
End
Merged, pushed, twice
Found and fixed a real gap between what was verified and what actually landed in the first commit

What shipped

packages/forgekit-owned-software/ — a private, local MCP (stdio) plugin: 5 tools (discover_apps, submit_owner_request, get_request_status, answer_clarification, get_request_result), a thin HTTP adapter-client with no DB/GitHub/deploy credential, a packaged skill teaching outcome-language discipline and refusal boundaries

experiments/canvas-2/lib/mcp-adapter.ts + mcp-auth.ts + 5 new API routes — the thinnest authenticated adapter, delegating entirely to canvas-2's existing lifecycle logic

New nullable mcp_idempotency_key column + partial unique index on requests

Refactored (not rewritten) lib/actions/requests.ts: submitRequest/replyToShaping's external interface unchanged, each now delegates to a new Core function the MCP adapter also calls directly

23 new passing tests (10 in the plugin package, 13 in canvas-2)

A real, complete Owner Loop cycle proof: a real Actor built and shipped a photo swap for canvas-2, recovered from a real documented concurrency incident, deployed, and independently confirmed live

Wire up a real actor and then commit.

Zeb, redirecting the session from 'stop at the adapter-level proof' to 'prove the actual terminal-result completion standard the Charge names' — this single redirect is what surfaced both the real concurrency incident and the disposition() defect.