Build Log · September 17, 2026

Open the Owner Loop Through ForgeKit

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.

  • Alloy
  • Owner Loop
  • MCP Plugin
  • canvas-2
MCP tools
5

MCP tools

new API routes
5

new API routes

passing tests
23

passing tests

real terminal Owner Loop cycle proven
1

real terminal Owner Loop cycle proven

Timeline

  1. 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

  2. +2h

    Built the plugin + adapter

    5-tool MCP server, thin canvas-2 adapter reusing existing lifecycle functions verbatim

  3. +3h

    Real end-to-end adapter proof

    Idempotent submission, real AI-driven clarification round-trip against canvas-2's live DB

  4. +4h

    Zeb submitted a real request

    A real Actor built, verified, and hit a real promotion-push concurrency incident

  5. +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

  6. 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.