Repository navigation
v0.25.1
[0.25.1] - 2026-05-24
Changed: loop self-pause prohibition rail (templates/commands/hm/loop.md.j2)
After a 2026-05-24 forensic observed a /hm:loop driver halting iter 1/50 with an invented stop_reason="context-budget pause (operator decision; ... needs fresh context to avoid half-merged state)" instead of running /compact, the loop spec gains a 3-layer prohibition that closes the rationalization path:
- L0 — Self-pause prohibition rail (new subsection right after Safety rails). Negatively enumerates the 4 forbidden halt rationales (context-budget / phase-boundary / operator-decision / half-merge-risk) with corrective action per row. Output prefix is strict — final report MUST start with
loop done —;loop paused/loop stopped/loop suspended/loop holdare spec violations. - L1 —
/compactmandatory procedure (replaces the prior "Context advisory" block). The advisory wording is gone;iter % 10 == 0OR context usage ≥60% triggers a 4-step procedure (persist runtime →/compact→ reload counters → continue iter). Explicitly states/compactand halt are mutually exclusive — there is no third branch where pause is correct. - L6 — Per-iter anti-self-pause reminder (4-bullet block at every iter start). Reinforces legal halt list, mandatory
/compact, phase-boundary ≠ stopping point, and required output prefix. - Section 8 schema strictness —
stop_reasonfield now enumerates the 8 legal strings (incl.blocked: <reason>escape hatch anduser interrupt). Any other string surfaces as a regression, not normalized into schema.
Why patch-level
Behavior-strengthening only — no breaking change. Existing legitimate halts (max_iter / time_cap / failed_streak / feature×3 / Gate 0 exhausted / convergence) all continue to fire on the same conditions. The rail only blocks LLM-invented stop_reason strings that were never in the schema.
Boundary tests (advisory)
Layer 1 of PLAN-test-fidelity-gap. Pure parser checks; advisory only.
Status: ✅ PASS
============================= test session starts ==============================
platform linux -- Python 3.12.13, pytest-9.0.3, pluggy-1.6.0
rootdir: /home/runner/work/harness-maker/harness-maker
configfile: pyproject.toml
plugins: anyio-4.13.0, asyncio-1.3.0, respx-0.23.1
asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
collected 50 items
tests/integration/test_boundary_codex_toml.py ............ [ 24%]
tests/integration/test_boundary_cursor_mdc.py ....... [ 38%]
tests/integration/test_boundary_harness_yaml.py ........ [ 54%]
tests/integration/test_boundary_hooks_json.py ......... [ 72%]
tests/integration/test_boundary_meta.py ....... [ 86%]
tests/integration/test_boundary_settings_json.py ....... [100%]
============================== 50 passed in 3.09s ==============================