Release 0.1.8 - #122
Merged
Merged
Release 0.1.8#122
Conversation
Three defects closed, each reproduced before it was fixed and each carrying a test that is red without its fix. The MCP `execute` path, where one budget covered both a park and the work it authorised, so a human approving near the end of the park left ~120s for a tree-mutating run — and the docstring told the agent a timeout was safe to reissue, which the #100 guard could not catch because the stamp comes after the run returns. The live view, whose cursor was read from `stat()` after the events, so an append landing in that window left it claiming bytes the snapshot never saw and a finished run streamed as running for as long as the page stayed open. And the deadline guard's teardown, which an interrupt arriving inside its own critical section left holding a 50ms timer that re-raised into a pooled thread indefinitely. The last two were the sweep's remaining unverified findings; both are now demonstrated rather than suspected, the guard leak by measurement — six interrupts queued after the guard was released. Also the lockfile's copy of the version, which drifted through 0.1.6 and 0.1.7 reading 0.1.5 because nothing looked. All three declarations are checked now, which is what caught this bump being complete. CHANGELOG has the full account of each. The deep dive's figures are re-derived: 2,190 selected, 13 deselected, and `0.1.8` on PyPI once this ships. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The three declarations CI checks are not the only copies. The cookbook quotes the version it was verified against, and the serving chapter embeds it in two `/health` payloads that `tests/test_cookbook_serving.py` byte-compares against real output — so a bump that stops at pyproject, `__init__` and the lockfile fails those tests, which is what it should do. The README's footer carries it as well. Found by CI on the release PR rather than by looking, which is the right way round: the checks exist so the bump cannot be two-thirds done. 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.
Three defects closed, each reproduced before it was fixed and each carrying a test that is red without its fix.
CHANGELOG.mdhas the full account; the short version:executebounded a park and the work it authorised with one budget, so approving late left ~120s for a tree-mutating run — and the docstring told the agent a timeout was safe to reissue, which the #100 guard could not catch because the stamp comes after the run returns. Alsotimeout=Noneon the non-mutating branch, and a kill that spared grandchildren.stat()after the events, so an append landing in that window left it claiming bytes the snapshot never saw. The next poll saw no size change and rebuilt nothing — a finished run streamed as running for as long as the page stayed open.disarmholding a live 50 ms timer that re-raised into a pooled thread indefinitely.0.1.5, because the guard checked two of the three declarations.#120 and #121 were the 2026-08 sweep's remaining unverified findings. Both are now demonstrated rather than suspected — the guard leak by measurement, six interrupts queued after the guard was released. Nothing from that sweep is unverified any more; the only item still open is #110, which waits on a design decision rather than on work.
This bump
All three version declarations move together —
pyproject.toml,grapharc.__version__anduv.lock— which is the check #118 added, and it is what confirms this bump is complete rather than two-thirds done.Verified
GRAPHARC_UPDATE_FIGURES.0.1.8 on PyPIclaim is deliberately not auto-refreshed — whether a version is published is not something the tree can re-derive — so it is hand-written here and true once this ships.ruff check .clean. The full three-version matrix is this PR's CI.Note on publishing
PYPI_TRUSTED_PUBLISHINGhas been removed again. I had set it earlier in the session, but the one-time configuration on pypi.org that it depends on does not exist, so av*tag would have failed at the OIDC exchange rather than skipping. With the variable absent the publish job skips as it did before, and the release is uploaded out of band. Worth setting up properly at some point — the workflow is already written for it.🤖 Generated with Claude Code