Skip to content

Release 5.15.0 - #881

Merged
Masterplanner25 merged 1 commit into
mainfrom
release/5.15.0
Sep 25, 2026
Merged

Masterplanner25 merged 1 commit into
mainfrom
release/5.15.0

Conversation

@Masterplanner25

Copy link
Copy Markdown
Owner

Cuts 5.15.0. Seven entries — five fixes, two changes — every one on the far
side of a park-and-resume boundary, and every one reported by a project building
on Nodus rather than found here.

Issue What
#868 a derived VM inherits the host state it works for — twelve attributes across four derivation sites, not the two reported; plus a module function's agent_call reaching the process-global registry
#869 a run parked longer than the store's 30-day scan bound stopped existing
#870 reject-and-revise works again; #482 refused it on a false premise
#871 rehydrated data comes back in the order it was built
#873 a resume inherits the caller's bounds — five were lost, so a guest escaped its instruction budget and its deadline by parking
#875 max_terminal_runs can see the records it exists to delete

Why minor, not patch

CLAUDE.md says "a minor bump requires a substantive feature addition" and there
isn't one; docs/release.md calls restrictions "fixes, not breaks" and would
allow a patch. The two pulled different ways, so the choice was put to the
maintainer rather than assumed
. Deciding factor: #873 and #875 change behaviour
a user can hit, and in this project every "not additive" row sits on a minor,
never a patch — a patch reads as safe to take blindly, and two of these aren't.

Three rows added to that table (#873, #875, and #870 as a restoration).

Release sequence

Step State
1. gates ruff + mypy clean; nodus_gate --all green
2. version bump version.py and pyproject.toml both 5.15.0
2. README done before the tag — readme = "README.md" makes it the permanent PyPI page
3. CHANGELOG [Unreleased] → [5.15.0] - 2026-09-25
4. --closed-issues --section 5.15.0 6/6 — the post-cut run against [Unreleased] reports 0/0, which is the vacuous pass this step exists to avoid
4b. --versions after the bump 10 stale claims in 7 files, all fixed → 13/13
4c. suite after the edits llms.txt re-synced into the wheel; see below

Step 4b earned its place again. The pre-bump run passed by construction;
the post-bump run found ten stale claims across llms.txt, llms-full.txt,
CLAUDE.md, ECOSYSTEM_READINESS_ASSESSMENT.md (three), skills/nodus.skill
(two) and both project templates.

llms.txt ships inside the wheel and test_llms_txt_shipped.py byte-compares
the packaged copy, so python -m tools.sync_llms_txt ran after the edit. Skipping
it is how 5.7.0's release PR failed.

Probes: 130 → 136

Six new ones, written before the tag because they read the release's claims
rather than its code. The count moving is the check that they are wired — a
decorated probe nobody calls is dead code, which is #870's lesson from this same
session.

Three of the behavioural ones were falsified against neutered fixes, and each
fails with the symptom it exists to catch:

FAIL | a resumed step reaches the host's tool handler | returned 'error'
FAIL | a parked run older than the scan bound is findable | aged out of list_runs
FAIL | a resume inherits the caller's bounds | the deadline was not inherited

Two expected advisories

  • Closed-issues: 0 of 0 — the now-empty [Unreleased]. The real check is
    --section 5.15.0, above.
  • Consumers: 1/3 in step — nodus-run-action and the wiki track
    nodus_version, which just moved. Stage 6 work, post-publish.

What this PR is not

The full local suite is not this PR's evidence. The box is at 0.2 GB free
of 7.7 GB
— the thrashing condition CLAUDE.md documents, where every
timeout-shaped failure is untrustworthy and a run that would take 6 minutes on a
runner takes 20 or stalls. CI is the arbiter here, and it runs both
unittest discover and pytest, which are not interchangeable.

Steps 6–12 (tag, wheel, Gate 10, PyPI, Stage 5, GitHub release, Stage 6) follow
the merge. The GitHub release is created only after PyPI succeeds, since
release immutability is permanent.

🤖 Generated with Claude Code

What a run loses when it stops and starts again. Seven entries: five fixes and
two changes, every one on the far side of a park-and-resume boundary, and every
one reported by a project building on Nodus rather than found here.

  #868  a derived VM inherits the host state it works for -- twelve attributes
        across four derivation sites, not the two reported, plus a module
        function's agent_call reaching the process-global registry
  #869  a run parked longer than the store's 30-day scan bound stopped existing
  #870  reject-and-revise works again; #482 refused it on a false premise
  #871  rehydrated data comes back in the order it was built
  #873  a resume inherits the caller's bounds -- five were lost, so a guest
        escaped its instruction budget and its deadline by parking
  #875  max_terminal_runs can see the records it exists to delete

MINOR, not patch. CLAUDE.md's "a minor needs a substantive feature" and
docs/release.md's precedent pulled different ways; the deciding factor is that
#873 and #875 change behaviour a user can hit, and in this project every
"not additive" row sits on a minor. The version choice was put to the maintainer
rather than assumed.

Three "not additive" rows added, and CLAUDE.md's release note says where all
seven came from.

Six new release probes (130 -> 136), and the count moving is the check that they
are wired -- a decorated probe nobody calls is dead code, which is #870's
lesson. Three of the behavioural ones were falsified against neutered fixes:
each fails with the symptom it exists to catch.

llms.txt re-synced into the wheel (tools.sync_llms_txt). Editing the root copy
without that turns a green Gate 1 into a red CI, which is how 5.7.0's release PR
failed.

Gates: ruff and mypy clean; nodus_gate --all green with the two expected
advisories (Closed-issues 0/0 against the now-empty [Unreleased] -- the real
check is --section 5.15.0, 6/6; Consumers 1/3, which is Stage 6 work);
--versions re-run AFTER the bump found 10 stale claims in 7 files, all fixed,
now 13/13; probes 136/136.

The full local suite is not this commit's evidence: the box is at 0.2 GB free of
7.7 GB, the thrashing condition CLAUDE.md documents, where every timeout-shaped
failure is untrustworthy. CI on a clean runner is the arbiter, and it runs both
unittest and pytest.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@Masterplanner25
Masterplanner25 merged commit d3e9c07 into main Sep 25, 2026
6 checks passed
@Masterplanner25
Masterplanner25 deleted the release/5.15.0 branch September 25, 2026 05:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant