ForgeKitFORGEKIT

Build Log

One Real Cycle, One Unbounded Actor, and the $5.18 Lesson

August 25, 2026

M5 ran the first real Strategist-to-Actor continuation cycle through the M4 boundary — it produced no durable result, and the honest autopsy in M5.1 found the boundary had never set --max-turns or --max-budget-usd, both already-documented CLI flags.

OS EngineM5AutonomyGitHub ActionsCost Control
2
real Actor dispatches through the M4 boundary
$5.18
spent by the real Actor with zero durable result produced
0
new Actors spawned during the M5.1 autopsy/fix session

Timeline

Start
M5 Charge received: run one real, non-probe Charge through the M4 fresh-execution boundary
Strategist role required by the Charge itself — select the work without Zeb choosing it
15m
Inspected 3 candidates (boundary reuse, 3 punted deferrals, 2 OS drift files); selected closing the boundary's one-real-consumer gap
Directly named in M4's own nextItems[1]
25m
Froze and committed the M5 Charge, then dispatched — but fired before pushing to origin
Self-caught via the Verification Gate: headSha on the Actor's checkout was 5 commits behind
35m
Pushed, re-dispatched. Real Actor ran 86 turns, 14.5 min, $5.18, is_error: false — zero commits, no artifact anywhere
Confirmed via git log/branches/PRs/artifacts on origin — all empty
50m
M5 declared PARTIALLY DEMONSTRATED — Strategist/freeze/handoff worked, Actor execution exposed a real unresolved boundary
Per the Charge's own Partial Success criteria, not treated as failure
M5.1 start
Follow-up Charge: autopsy the $5.18 run using only evidence already paid for — no new Actor
Explicit stop condition: investigate + implement earned guardrails, do not re-run
+20m
Found --max-turns and --max-budget-usd, both documented by name in the action's own docs/configuration.md and claude --help — neither had ever been set
The exact 'embarrassingly small fix' the Charge hoped for
+30m
Found show_full_output was left at its default false — the real run's turn-by-turn activity (what was denied, where turns went) is genuinely unrecoverable now
Named honestly as UNKNOWN rather than guessed at
+45m
Implemented 4 mechanical fixes: turn/budget/time ceiling + terminal-reserve prompt instruction, pre-dispatch Charge-presence gate, and a terminal-contract check that a provider 'success' alone can no longer satisfy
One commit, zero Actor spend

What shipped

forgekit-os/charges/m5-real-continuation-cycle-2026-08-25-charge.md — frozen M5 Charge (still unconsumed by any successful run; the right test case for the next bounded verification attempt)

.github/workflows/actor-spawn.yml — added --max-turns 30, --max-budget-usd 3.00, timeout-minutes: 20 backstop, show_full_output: true, and a terminal-reserve prompt instruction

forgekit-os/scripts/spawn-fresh-actor.mjs — added a pre-dispatch gate (git ls-tree against origin/<ref> before dispatching) and verifyTerminalArtifact()/--verify (a provider-independent terminal-contract check)

One Real Cycle, One Unbounded Actor, and the $5.18 Lesson — August 25, 2026 · ForgeKit