Skip to content

Release 0.1.8 - #122

Merged
Shashankss1205 merged 2 commits into
mainfrom
release/0.1.8
Sep 26, 2026
Merged

Shashankss1205 merged 2 commits into
mainfrom
release/0.1.8

Conversation

@Shashankss1205

Copy link
Copy Markdown
Collaborator

Three defects closed, each reproduced before it was fixed and each carrying a test that is red without its fix. CHANGELOG.md has the full account; the short version:

What it was
#117 MCP execute bounded 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. Also timeout=None on the non-mutating branch, and a kill that spared grandchildren.
#120 The live view's cursor came from 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.
#121 An interrupt arriving inside the deadline guard's own critical section left disarm holding a live 50 ms timer that re-raised into a pooled thread indefinitely.
#118 The lockfile's copy of the version drifted through 0.1.6 and 0.1.7 reading 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__ and uv.lock — which is the check #118 added, and it is what confirms this bump is complete rather than two-thirds done.

Verified

  • Figures re-derived: 2,190 selected, 13 deselected, written by GRAPHARC_UPDATE_FIGURES.
  • The deep dive's 0.1.8 on PyPI claim 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_PUBLISHING has 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 a v* 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

Shashankss1205 and others added 2 commits September 26, 2026 15:06
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>
@Shashankss1205
Shashankss1205 merged commit e928214 into main Sep 26, 2026
7 checks passed
@Shashankss1205
Shashankss1205 deleted the release/0.1.8 branch September 26, 2026 09:46
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