Repository navigation
forge 0.13.2
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 0exits <N>: exactly that exit codeprints nothing: no output at all; exit code not checkedprints `<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.pywith the new--failed-acceptanceflag.
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 channelRestart the session to apply. On Codex: codex plugin marketplace add forcetrainer/forge --ref forge--v0.13.2, then codex plugin add forge@forge.