Skip to content

release: 2.1.0 — the frames extra admits views-frames 2.x (#91) - #94

Merged
Polichinel merged 1 commit into
developmentfrom
release/2.1.0
Sep 19, 2026
Merged

Polichinel merged 1 commit into
developmentfrom
release/2.1.0

Conversation

@Polichinel

Copy link
Copy Markdown
Collaborator

Release 2.1.0 (MINOR) · #91. Release PR into development; the development → main PR, the v2.1.0 tag and the draft GitHub Release follow.

The release

pyproject.toml 2.0.0 → 2.1.0; CHANGELOG.md gains ## [2.1.0] — 2026-09-19 with 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_specifier now parses PEP 508 with packaging (poetry 2 writes views-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, 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 previous check read a key the parser never emitted, so it was vacuous), the full module-level 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. packaging is 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 python and 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 FLOOR with the helper's tokens in a comment; set +e plus own-line exit 0; continue-on-error; if: false; --no-deps dropped; pip check dropped; the import proof dropped. The verify step executed locally fails loudly on the floor major and passes on 2.0.0; the floor derivation prints 1.10.2 under 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: _SUPPRESSED gains the nine exit-status evasions the audit proved exit 0 under bash -e (pipes, set +xe, own-line exit of 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_ADDOPTS absent). Deliberate strictness noted in the docstring: a heredoc derivation or --no-deps on 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.sh passed.

🤖 Generated with Claude Code

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]>
@Polichinel
Polichinel merged commit 9a15f7c into development Sep 19, 2026
4 checks passed
@Polichinel
Polichinel deleted the release/2.1.0 branch September 19, 2026 03:51
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