build(deps): the frames extra admits views-frames 2.x (>=1.10.2,<3), measured on both majors (#91) - #92
Merged
Conversation
…measured on both majors (#91) Reported by views-pipeline-core's 3.3.0 range review: the `<2` cap outlived views-frames 2.0.0 (2026-08-18) by a month and travelled through the extra into every environment that requests it. Widened after measuring: full suite green on views-frames 1.10.2, 1.11.0 and 2.0.0; a MetricFrame saved under either major loads under the other identically. Safe because the package's only runtime import from views-frames is the FrameMetadata dataclass. Guards (each seen red on an injected defect): - TestViewsFramesRange (hosted outside the import-skipped module): the declared range as a SpecifierSet under either pyproject layout; the CI floor step derives the floor from pyproject.toml, carries no version literal, and runs the whole suite; the one-name import surface by AST, aliased and dotted imports included. - TestViewsFramesSurface: FrameMetadata's behaviour on the installed major — six keyword fields, to_dict omitting None, from_dict ignoring the keys load() passes through, int timestamp preserved — and the installed version inside the range. - CI: the verify step prints the resolved views-frames and asserts it is not the floor major; the floor step runs `pytest tests/` on the floor with no trailing reinstall (nothing after it touches Python). The review of this change found the report's premise false — the consumer named also declares its own `<2.0.0` — so the CHANGELOG, register and CIC state only this repo's contract. C-38's trigger now fires when a capped dependency publishes outside the range; C-41 records the widened admitted set; ADR-022 §7 gains a checklist line for stale caps. Register header 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.
#91 · Epic #66 follow-up. The
framesextra admits views-frames 2.x:>=1.10.2,<3, was<2. Ships as 2.1.0 (MINOR) in a release PR after this one.Why
views-frames 2.0.0 has been published since 2026-08-18; our cap excluded it from every environment that requests the extra. Reported by views-pipeline-core's 3.3.0 range review.
The report's premise was wrong, and this PR says so. #91 claimed our cap was the only thing holding reporting environments on 1.x. Verified by grep on 2026-09-19: views-reporting declares its own direct
views-frames>=1.10.2,<2.0.0on every branch and at v0.3.3. Widening our extra admits nothing there until they widen theirs. The change is still right, since our cap should not exist, and every note now states only this repo's contract.Measured before widening
timestampstaysintSafe because the package's only runtime import from views-frames is the
FrameMetadatadataclass; the tests' second dependency,assert_frame_envelope, has an unchanged body across the majors.Guards
TestViewsFramesRange(in the extras-guard module, which never import-skips): declared range as aSpecifierSetunder either pyproject layout; the CI floor step derives the floor from pyproject, carries no version literal, and runs the whole suite; the one-name import surface by AST, aliased and dotted imports included.TestViewsFramesSurface:FrameMetadata's behaviour on the installed major (six keyword fields,to_dictomitting None,from_dictignoring the keysload()passes through, int timestamp preserved) and the installed version inside the declared range.pytest tests/on the floor read from pyproject, with no trailing reinstall.Review findings addressed (15 of 15 from
/code-review max, 1 from/review-diff)False premise (above) · behavioural test did not exercise what
load()relies on · AST guard blind toimport views_frames as vf· CIC named one surface while documenting two · CI could silently test 1.x on both legs · C-38 trigger fired only on narrowing (widened; ADR-022 §7 gains a stale-cap checklist line) · C-41 stale range · floor coupling scanned comments and one of two literals (floor now derived, no literal) · hand-picked floor subset (whole suite) ·major in (1, 2)(SpecifierSet) · poetry-only dict equality (either layout) · static pins behind the import-skip (moved) · dead trailing reinstall (removed) · stale "994" count (dropped) · register date · (review-diff) floor literal in three places.C-37 evidence
Seen red: held text on the edited workflow before regeneration; range widened to
<4; a second name imported from views_frames, viafrom, via alias attribute, via dotted submodule import; a version literal in the floor step; a subset in place of the whole suite; a mismatched CI floor. Must-pass variants confirmed: reordered specifier, PEP 621 layout.Independent guard audit (
/falsify guard, clean-context subagent): 45 mutations over 8 guards; nothing decorative; survivors on four guards, all closed and re-verified red: the specifier helper read the poetry table before a PEP 621 table (now PEP 621 first, matching_extras_tableand poetry); an environment marker on the entry passed (now rejected);FrameMetadata.to_dictdropping falsy values passed (nowseed=0/timestamp=0round-trip);getattr(views_frames, "X")and_vf = views_frames; _vf.Xescaped the AST guard (now tracked); the floor-step check acceptedFLOOR=1.10.2with anecho, a derivation from the numpy key,-k,|| true(now exact commands and a keyed derivation). The CI derivation reads both layouts and strips whitespace. Residual: import machinery on views_frames is caught by the package-wide purity guard, not by this one.Gate
999 passed on views-frames 1.10.2 and on 2.0.0 · ruff clean ·
validate_docs.shpassed.🤖 Generated with Claude Code