Skip to content

release: 0.9.2.2 — the gates - #178

Merged
0bserver07 merged 3 commits into
masterfrom
release/0.9.2.2
Jul 31, 2026
Merged

release: 0.9.2.2 — the gates#178
0bserver07 merged 3 commits into
masterfrom
release/0.9.2.2

Conversation

@0bserver07

Copy link
Copy Markdown
Owner

Cuts 0.9.2.2 — the gates. 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

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.py raised TypeError on every invocation since e5d4d725 gave serve_http a pidfile_prefix argument its fake never accepted. It sits behind pytest.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-extras is 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 / timeout moved off the Sandbox constructor onto Sandbox.create(), while pyproject declares an unbounded e2b>=1.0, so --env e2b raises TypeError at construction. The reconnect branch 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 (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 TypeError with 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

posture result
uv sync --all-extras 11,018 passed / 79 skipped
CI posture (scripts/ci_posture_check.sh) 10,501 passed / 133 skipped
cold mypy chimera/, CI posture 736 files, 0 errors

The 517-test gap is entirely importorskip for deps CI does not install — not a smaller suite, a less-tested one. That gap is exactly where the broken test lived. ruff clean, 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 with doctor/gc, the claims gate reading git ls-files, interception seams reaching every loop with /resync hot-swap, the experiment toolkit, and the bench-matrix exit-code fix.

Full detail: docs/releases/0.9.2.2.md.

After merge

Tagging v0.9.2.2 triggers the publish workflow to PyPI. That step is held for explicit owner confirmation.

🤖 Generated with Claude Code

0bserver07 and others added 3 commits July 31, 2026 00:07
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>
@0bserver07
0bserver07 merged commit df727d8 into master Jul 31, 2026
8 checks passed
@0bserver07
0bserver07 deleted the release/0.9.2.2 branch August 5, 2026 04:07
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