release: 0.9.2.2 — the gates - #178
Merged
Merged
Conversation
Rolls the Unreleased accumulator into a named, dated block and bumps both version sites (pyproject METADATA + chimera.__version__, pinned equal by tests/test_version_parity.py). The name follows 0.9.2.1's "the verified grader": graders, published claims, on-disk paths and cwd-relative writes each moved from convention to a gate that can fail — and each move started by finding a defect the convention had hidden. Includes a fix for a test that had NEVER run in CI. tests/otter/test_server_tls.py raised TypeError on every invocation since e5d4d72 gave serve_http a pidfile_prefix argument its fake never accepted. The module sits behind pytest.importorskip("cryptography"), which CI does not install — and it is invisible to BOTH standard gates, since neither the full-suite run nor the CI-posture run has that dep either. It surfaced only under `uv sync --all-extras`, which playbook 14 now requires before a release: two lower postures cannot cover a test that both skip. The fake captures and asserts the new argument rather than swallowing it with **kwargs — a fake that silently absorbs new parameters stops testing the call contract it exists to test. Numbers quoted with their posture, since the same tree reports 10,470 under a partial extra set and 11,017 under all extras. The lower figure is not a smaller suite, it is a less-tested one; README and the release notes now say which posture they mean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…as gate The gate added an hour ago immediately earned itself. Under `uv sync --all-extras`, mypy reports three call-arg errors at chimera/env/e2b.py:107 — and they are real: e2b 2.30.0 moved template/api_key/timeout off the Sandbox constructor onto Sandbox.create(), while pyproject declares an unbounded e2b>=1.0. So `--env e2b` raises TypeError at construction with a current SDK. The reconnect branch is affected too: connect() is an instance method in 2.x, so Sandbox.connect(sandbox_id, ...) would bind the id to self. Two blind spots stacked to hide it. The tests inject a fake SDK at the module boundary — correct for CI, and documented in CLAUDE.md — but the flip side was never written down: a fake that never has to match the real signature cannot catch an upstream breaking change. And `mypy chimera/` is clean in CI precisely because CI installs no extras, leaving Sandbox as Any and the call unchecked. Filed as #177 with the measured signatures and a suggested shape: a signature-conformance test that, when the real SDK is importable, asserts our kwargs are accepted by the API we call — no network, no credentials — which generalises to the other fake-injected cloud backends. NOT fixed in this release, deliberately. It is a two-generation compatibility change in a cloud backend and I have no E2B credentials to verify a fix against real infrastructure; replacing a loud TypeError with an unverified code path would be worse than the current failure. Disclosed in the release notes and changelog so an upgrading user meets it in writing rather than at runtime. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Fills the measured CI-posture figure into the release notes and reconciles the prose with the table (it said "three postures" against two rows), and corrects 11017 -> 11018 in the README badge and status line — the otter fix added a passing test after those were first written. The pair now reads: 11,018 passed / 79 skipped under all extras, 10,501 passed / 133 skipped under the CI posture. The 517-test gap is entirely `pytest.importorskip` for deps CI does not install — not a smaller suite, a less-tested one. Playbook 14 carries the same pair and the rule: a bare test count without its posture is not a verifiable number, which is exactly how a broken test hid behind two green gates. Co-Authored-By: Claude Opus 5 <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 0.9.2.2 — the gates. Rolls the Unreleased accumulator into a named, dated block and bumps both version sites (
pyprojectMETADATA +chimera.__version__, pinned equal bytests/test_version_parity.py).The name
0.9.2.1 was the verified grader — it added a canary that grades the grader. This batch is the follow-through: graders, published claims, on-disk paths and cwd-relative writes each moved from convention to a gate that can fail. Every one of those moves started by finding a defect the convention had been hiding.
A sub-version, deliberately — the third digit is not a batch counter (playbook 14, rule 0).
Cutting the release found two more defects
A test broken for months that no gate could see.
tests/otter/test_server_tls.pyraisedTypeErroron every invocation sincee5d4d725gaveserve_httpapidfile_prefixargument its fake never accepted. It sits behindpytest.importorskip("cryptography")— skipped in the full-suite run, skipped in the CI-posture run. Invisible to both standard gates because neither installs that dep.Fixed here, and the fake now captures and asserts the argument rather than swallowing it with
**kwargs: a fake that silently absorbs new parameters stops testing the call contract it exists to test.uv sync --all-extrasis now a required release gate (playbook 14). Two lower postures cannot cover a test that both skip, and a release is the one moment worth paying for the highest posture.The E2B backend is broken against
e2b >= 2.x— filed as #177, disclosed and deliberately not fixed here. Measured against installed 2.30.0:template/api_key/timeoutmoved off theSandboxconstructor ontoSandbox.create(), whilepyprojectdeclares an unboundede2b>=1.0, so--env e2braisesTypeErrorat construction. The reconnect branch too —connectis an instance method in 2.x, soSandbox.connect(sandbox_id, ...)would bind the id toself.Two blind spots stacked to hide it: the tests inject a fake SDK at the module boundary (right for CI, but a fake never has to match the real signature), and
mypy chimera/is clean in CI precisely because CI installs no extras, leaving the call unchecked. It surfaced only under the new gate.Not fixed because verifying a two-generation compatibility change needs real E2B infrastructure, and replacing a loud
TypeErrorwith an unverified code path would be worse than the present failure. Disclosed in the release notes so an upgrading user meets it in writing rather than at runtime.How I found the first one
I distrusted my own test count. The README claimed 10735 as of 2026-07-28; I had measured 10,470 on a larger codebase. Tests do not vanish — so the number was wrong, not the suite. Re-measuring under all extras gave 11,017, and the extra tests included one that had never run in CI at all.
Numbers now travel with their posture
uv sync --all-extrasscripts/ci_posture_check.sh)mypy chimera/, CI postureThe 517-test gap is entirely
importorskipfor deps CI does not install — not a smaller suite, a less-tested one. That gap is exactly where the broken test lived.ruffclean, all 7 trademark scrubs pass, canary sweep 7 pass / 0 BROKEN.The single local failure in both runs is
test_validation_split, documented in CLAUDE.md as env-sensitive locally and green in CI.Contents
The block covers the grading work merged as
b72b7898(mbpp-plus 99.7% → 84.9%, the length-as-correctness and substring-grading classes, the static AST gates), plus the storage/paths registry withdoctor/gc, the claims gate readinggit ls-files, interception seams reaching every loop with/resynchot-swap, the experiment toolkit, and thebench-matrixexit-code fix.Full detail:
docs/releases/0.9.2.2.md.After merge
Tagging
v0.9.2.2triggers the publish workflow to PyPI. That step is held for explicit owner confirmation.🤖 Generated with Claude Code