release: 2.1.0 — the frames extra admits views-frames 2.x (#91) - #94
Merged
Merged
Conversation
Version 2.0.0 → 2.1.0 (MINOR). CHANGELOG gains the `[2.1.0] — 2026-09-19` section with the six-item ADR-022 §7 checklist; the register gains the dated block. §3.2 notification to views-reporting posted before the tag (#289, comment 5738670537). The release review found fifteen defects in #91's guards and prose, fixed here and each seen red on an injected defect: - One specifier reader. `_views_frames_specifier` parses PEP 508 with `packaging` (poetry 2 writes `views-frames (>=1.10.2,<3)`), reads PEP 621 first, rejects environment markers; the CI floor step and the verify step both call it instead of carrying a second inline parser or a `!= '1'` literal. `packaging` is declared in the dev group rather than borrowed from pytest. - The floor step installs with `--no-deps`, runs `pip check`, proves the module importable on the floor (so importorskip cannot go dark), and runs the whole suite. Its guard asserts the helper call, the parser's own continue-on-error/if flag (the old check read a key that never existed), the full suppressed-exit list including an own-line `exit 0`, `--no-deps`, `pip check` and the import proof; the helper is exercised on fixtures for every layout it claims. - Honest checklist. Working the new stale-cap item found that numpy `<2.0.0` makes the wheel uninstallable from wheels on Python 3.13 and 3.14, both declared supported, and silently freezes scipy at 1.17.x (its 1.18 needs numpy ≥ 2): C-41's trigger, fired 2026-06-19 with a green build. C-41 re-tiered to 2 with the measurement; #93 filed; the checklist says so instead of "deliberate". The sixth item now names every capped entry including python and the dev group, not a fixed list. - Prose: consumer state in the frozen release notes is no longer asserted as present fact; C-36 records the checklist's six items; C-38's stale consumer line and C-41's description and location updated; the CIC points at pyproject and the guard rather than copying the range, and is dated. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This was referenced Sep 19, 2026
Merged
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.
Release 2.1.0 (MINOR) · #91. Release PR into
development; thedevelopment→mainPR, thev2.1.0tag and the draft GitHub Release follow.The release
pyproject.toml2.0.0 → 2.1.0;CHANGELOG.mdgains## [2.1.0] — 2026-09-19with the six-item ADR-022 §7 checklist (the sixth, on stale caps, was added by #92); the register gains the dated block. §3.2 notification to views-reporting posted before the tag (#289, comment 5738670537). The CHANGELOG guard was red on the bump and green after the section.What the release review found, and what changed
The release diff is
v2.0.0..HEAD: #92 plus this commit. Fifteen findings, all fixed here and each seen red on an injected defect.The one that matters to users: the numpy cap is stale. Answering the new checklist item honestly, measured with
pip install --dry-run --only-binary=:all:: on Python 3.13 and 3.14, both inside our declared>=3.11,<3.15, no numpy wheel satisfies<2.0.0, so the package cannot be installed from wheels there. scipy 1.18 (2026-06-19) requires numpy ≥ 2, so under our cap the resolver has been silently freezing scipy at 1.17.x for three months with a green build. That is C-41's trigger, fired unnoticed. Not fixed in this release: lifting the cap means measuring numpy 2.x, which is #93. C-41 is re-tiered to 2, and the checklist says "stale", not "deliberate".Guards, unified.
_views_frames_specifiernow parses PEP 508 withpackaging(poetry 2 writesviews-frames (>=1.10.2,<3), which a regex reader turned into an invalid specifier), reads PEP 621 first, and rejects environment markers. Both CI steps call it: the verify step asserts the resolved version is inside the declared range and not in the floor's major, the floor step derives the floor from it. No second parser, no!= '1'literal. The floor step installs with--no-deps, runspip check, proves the module importable on the floor (soimportorskipcannot go dark), and runs the whole suite. Its guard asserts the helper call, the parser's owncontinue-on-error/ifflag (the previous check read a key the parser never emitted, so it was vacuous), the full module-level suppressed-exit list including an own-lineexit 0,--no-deps,pip checkand the import proof. The helper is exercised on fixtures for every layout it claims.packagingis declared in the dev group rather than borrowed from pytest.Prose. Consumer state in the frozen release notes is no longer asserted as present-tense fact. C-36 records the checklist's six items; C-38's stale consumer line and C-41's description and location updated; the sixth checklist item names every capped entry including
pythonand the dev group; the CIC points at pyproject and the guard rather than copying the range, and is dated.C-37 evidence
Seen red: a literal
FLOORwith the helper's tokens in a comment;set +eplus own-lineexit 0;continue-on-error;if: false;--no-depsdropped;pip checkdropped; the import proof dropped. The verify step executed locally fails loudly on the floor major and passes on 2.0.0; the floor derivation prints1.10.2under both pyproject layouts. Independent guard audit (/falsify guard, clean-context subagent): 63 mutations over 7 guards. The held workflow text caught all 33 workflow mutations; the specific guards behind it were weak and are hardened here, each re-verified red:_SUPPRESSEDgains the nine exit-status evasions the audit proved exit 0 underbash -e(pipes,set +xe, own-lineexitof any spelling,echo $(...),while !,(cmd &)); the specifier reader collects every views-frames declaration and requires exactly one, with poetry keys canonicalised; the floor-step guard is structural (derivation → install → check → import proof → pytest, in order, FLOOR assigned exactly once, the derivation printing the helper's result,PYTEST_ADDOPTSabsent). Deliberate strictness noted in the docstring: a heredoc derivation or--no-depson another line is a red build until the guard is updated with it.Gate
1000 passed on views-frames 1.10.2 and on 2.0.0 · ruff clean ·
validate_docs.shpassed.🤖 Generated with Claude Code