Skip to content

v0.61.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 06:21
· 66 commits to main since this release

[0.61.0] - 2026-10-02

Added

  • World model follow-ups: a briefing digest instead of ledger greps. hm world_model digest
    is a read-only, at most 1.5 KB JSON briefing (newest tasks first, capped at 5) with an
    artifact-derived next_stage (approved SPEC, then REVIEW exists, then REVIEW APPROVED, then a
    fresh verify marker, then wrapup; a span end is a turn end, not stage completion) and an
    other_session flag. It reads the autopilot marker file directly (never autopilot.status,
    which migrates and GCs), matches slugs exactly (a sibling demo-two never leaks into demo) and
    checks artifacts only for the shown tasks under a 5 s deadline. The router briefs via !
    injection with a fallback (Codex: one bash line) and resumes from next_stage; /hm:help
    lists the router; the always-loaded ## World model pointer is shorter (at most 200 chars at the
    max name/handle). Interactive name/handle messages follow the locale; --add / --remove
    skill:world-model|<handle> are refused (the router is not a modular skill); commands/make.md
    forwards --world-model-name / --world-model-handle on every dispatch; U+FFFE / U+FFFF are
    rejected in names.
  • Named world model. harness.yaml gains world_model: {name, handle} (default Maker /
    maker, validated at load; a missing handle is derived from the name, an absent key equals the
    explicit default). One router skill renders at skills/<handle>/SKILL.md (and
    .agents/skills/<handle>/ for Codex) from a fixed template and only routes to existing surfaces
    (stages, intent-layer, project-knowledge, read-only status); its stage lookup reads the
    ledger from the git base root so it works inside a task worktree. The name is asked right after
    locale in the interview, commands/make.md, --ci and /hm:configure; a short ## World model
    pointer is added to every always-loaded variant. Reserved names, hm-*, bad grammar and length
    are rejected; a handle that equals a user-owned skill dir is kept and named in a warning. Renaming
    sweeps the pristine old router and keeps edited files.
  • hm review_churn attribute stamps caused_by deterministically. It diffs the round's
    fix commit (git diff -U0), maps each finding's line to the new-side hunks, and stamps only
    findings whose caused_by is unset. Round label convention: REVIEW round N <-> churn ref
    r{N}. Carried ids come from the same-run persisted payload store; a malformed file is left
    untouched. A fix-defect-rate report reads the stamped values.
  • hm observability.verification_cache run owns gate execution and the marker. It runs the
    CI-derived commands, writes a writer: run marker (with commands_sha256) only when every
    gate passes and the key is stable, and /hm:verify and /hm:wrapup trust only that marker
    for skip. Gates run in their own process group with cleanup on interrupt and a bounded reap;
    the stage recipe runs it in the background because the suite exceeds a foreground host cap.
  • CLAUDE.md character budget beside the line budget (Side 16,000 / Production 40,000
    characters, also AGENTS.md), folded into the existing readiness signal. Over-budget sections
    moved verbatim to docs/reference/*.md, which the documentation contract treats as
    historical snapshots.

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.15, pytest-9.0.3, pluggy-1.6.0
rootdir: /home/runner/work/harness-maker/harness-maker
configfile: pyproject.toml
plugins: asyncio-1.3.0, anyio-4.14.2, respx-0.23.1, hypothesis-6.155.7, xdist-3.8.0
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.77s ==============================