Skip to content

forge 0.13.2

Choose a tag to compare

@forcetrainer forcetrainer released this 03 Oct 05:46
· 146 commits to main since this release

A stable patch release. Both channels move to 0.13.2. This page covers what changed since 0.13.1 (#112, PR #117).

Acceptance clauses say what must happen

The acceptance runner used to execute every inline-code span on a task's **Acceptance:** field as a shell command and require exit 0. In 14 audited Codex runs it executed version strings and file paths (/bin/sh: 2023.12.20260918: command not found, $ scripts/README.md → Permission denied). One worker changed product code to satisfy a check that could never pass. A grep meant to find nothing exits 1 when it succeeds, so it was scored as a failure.

  • A clause that starts with inline code is a command clause, written `<command>` <outcome>. The outcome is one of:
    • passes: exit 0
    • exits <N>: exactly that exit code
    • prints nothing: no output at all; exit code not checked
    • prints `<text>`: output (stdout and stderr together) contains the text, and exit 0
  • Any other clause is prose. It is never executed; the reviewer checks it as a checklist item. A path or version string in prose is just text.
  • A command clause that doesn't parse is a lint error, naming the task, line and clause and listing the four outcomes. It is never read as prose and never assumed to mean passes.
  • The runner checks exactly the stated outcome. Receipts record the outcome and whether it passed, and a rework finding names the first failing clause.

Breaking for plans in flight: a plan with bare `cmd` clauses now fails lint. Add an outcome to each, usually passes. Completed plans are not migrated.

Repeated acceptance failures stop early

Failed acceptance was exempt from the stuck rule, so an identical failure repeated until the 5-attempt backstop. Seven tasks looped this way and four hit the backstop.

  • The same first-failing command clause on two attempts in a row now halts stuck. The halt shows the clause, its expected outcome and the last output.
  • Both harnesses share this rule. On the Claude path the orchestrator passes the failing command to forge_dispose.py with the new --failed-acceptance flag.

Timeout

The Codex docs recommended --timeout 900. Two turns died at about 900s mid-build, and later builds ran 15–30 minutes. The docs now point at the 3600-second default, so pass --timeout only to override it.

Codex

No hooks/hooks.json change since 0.13.1, so Codex doesn't ask you to re-trust forge's hooks.

Install

claude plugin marketplace update forge
claude plugin update forge@forge        # or: claude plugin install forge@forge
claude plugin update forge-beta@forge   # if you're on the beta channel

Restart the session to apply. On Codex: codex plugin marketplace add forcetrainer/forge --ref forge--v0.13.2, then codex plugin add forge@forge.