Skip to content

v0.25.1

Choose a tag to compare

@github-actions github-actions released this 23 May 23:55
· 562 commits to main since this release

[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 hold are spec violations.
  • L1 — /compact mandatory procedure (replaces the prior "Context advisory" block). The advisory wording is gone; iter % 10 == 0 OR context usage ≥60% triggers a 4-step procedure (persist runtime → /compact → reload counters → continue iter). Explicitly states /compact and 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_reason field now enumerates the 8 legal strings (incl. blocked: <reason> escape hatch and user 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 ==============================