v0.9.1
A correctness-and-clarity patch.
Fixed
- Concurrent
/forge:decideruns can no longer collide on an ADR number. Number allocation was the one state mutation that ran without the.forgelock, so two racing decisions could both claim0004— duplicate ADRs and an ambiguous directive back-reference. Allocation and the ADR/directive/index writes now run together understate.lockedvia a newdecisions.record_decision, and the ADR is written atomically (temp +os.replace) and first, so a crash mid-write can at worst orphan an ADR — never leave a directive pointing at a number that was never written. - The coverage-floor check no longer trips on a comment. Detection of whether a project sets its own floor is now section-scoped:
fail_underonly counts in[tool.coverage.report],--cov-fail-underonly in[tool.pytest.ini_options], comments ignored. - The commit-time gate now measures coverage like the rest. forge's prek
pytesthook ran without--cov; it now runspytest -q --cov, matching the dev command and the in-session gate.
Changed
- Clearer command guidance.
/forge:buildstates the two--no-docsskip conditions as independent;/forge:initlists concrete type-detection markers instead of "from any existing files"; and the scaffoldedCLAUDE.mdnow documents thescripts/check_env_sync.pyguard that was already wired into pre-commit.
Full changelog: v0.9.0...v0.9.1