Repository navigation
Release 5.15.0 - #881
Merged
Merged
Release 5.15.0#881
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.
agent_callreaching the process-global registrymax_terminal_runscan see the records it exists to deleteWhy minor, not patch
CLAUDE.md says "a minor bump requires a substantive feature addition" and there
isn't one;
docs/release.mdcalls restrictions "fixes, not breaks" and wouldallow 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
nodus_gate --allgreenversion.pyandpyproject.tomlboth 5.15.0readme = "README.md"makes it the permanent PyPI page[Unreleased]→[5.15.0] - 2026-09-25--closed-issues --section 5.15.0[Unreleased]reports 0/0, which is the vacuous pass this step exists to avoid--versionsafter the bumpllms.txtre-synced into the wheel; see belowStep 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.txtships inside the wheel andtest_llms_txt_shipped.pybyte-comparesthe packaged copy, so
python -m tools.sync_llms_txtran after the edit. Skippingit 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:
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-actionand the wiki tracknodus_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.mddocuments, where everytimeout-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 discoverandpytest, 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