Build Log · August 25, 2026

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

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 Engine
  • M5
  • Autonomy
  • GitHub Actions
  • Cost Control
real Actor dispatches through the M4 boundary
2

real Actor dispatches through the M4 boundary

spent by the real Actor with zero durable result produced
$5.18

spent by the real Actor with zero durable result produced

new Actors spawned during the M5.1 autopsy/fix session
0

new Actors spawned during the M5.1 autopsy/fix session

Timeline

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

  2. 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]

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

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

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

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

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

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

  9. +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)