Repository navigation
Prepare the v0.3.0 final: immutable notes, the retained-column leaf in the final bundle, a release draft that is not a pre-release (#231) - #278
Conversation
…n the final bundle, a release draft that is not a pre-release (#231) - releases/v0.3.0.md: the final notes, from the prepared notes, naming both candidates (rc.1 2026-10-25, rc.2 2026-10-27) and what each carried, the selected retained-column/1 leaf as part of the release, RFC 0024 as not in it, the Policy companion unchanged, what the release pins, and a checks sentence whose run id and commit are completed at the tag. docs/releases/v0.3.0.md becomes a pointer (the published RC1 notes link to it); the site's 0.3.0 release page renders the immutable notes. - tools/build_release.py: the v0.3.0 bundle carries the leaf (the RC2 reader paths, releases/v0.3.0.retained-column.json and the milestone link) and no mapping. The final is held to RC2's leaf rules (inventory, RFC 0029 acceptance, draft maturity, milestone #2) and refused when its inventory differs from the published RC2 inventory in anything but its distribution, when either inventory is missing, or when a mapping sits beside a tag the RC allowlist does not name. - releases/v0.3.0.retained-column.json: RC2's inventory with distribution v0.3.0; every digest is unchanged and recomputed by the builder. - release.yml: the evidence job hands its route (the tag grammar) to the release job; a plain vMAJOR.MINOR.PATCH tag is drafted as a release, every other tag and any other route value as a pre-release. - VERSIONING.md names the rc.N and alpha.N forms; CHANGELOG.md records 0.3.0 and, for the move to be exact, 0.2.0-draft under their own headings, with RFC 0027 (0.4.0) left under Unreleased. Signed-off-by: kikashy <35789537+kikashy@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ceholders (#231) The "Checks run for this release" section now states the mechanism: the release reuses main's repository-conformance evidence for the exact commit through the release evidence gate, the reused run's id and attempt are in the release's decision artifact and are appended to the published release body at publication, and the candidates were reviewed on their pull requests (#246, #248 and #258 for rc.1; #274 for rc.2, with its same-vendor statement). The notes test checks that form and that no placeholder remains. Signed-off-by: kikashy <35789537+kikashy@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#231) The maintainer chose to make the final the leaf's normative home. - spec/retained-column.md, three lines: the support tuple's distribution version is 0.3.0; the inventory is releases/v0.3.0.retained-column.json; the normative support version is exactly 0.3.0 (the v0.3.0 distribution), v0.3.0-rc.2 was the candidate distribution of the same leaf bytes and remains published, and a support claim is made against a v0.3.0 installation. - tools/retained_column.py and dialect-verify-ts/src/retained.ts check the generated release-identity.json for tag v0.3.0 and releaseVersion 0.3.0, and releases/v0.3.0.retained-column.json with distribution v0.3.0, and report support version 0.3.0. They name 0.3.0 only: rc.2 installations run rc.2's published readers. - tools/build_release.py: the v0.3.0 bundles carry a generated release-identity.json (tag, releaseVersion, specVersion, maturity, sourceCommit), never a tracked mapping. The final's inventory must equal RC2's in schema, corpus and every other digest; only the companion page and the two readers may differ. Both readers must name the tag, its version and its inventory. - releases/v0.3.0.retained-column.json re-pins those three files; the schema and corpus digests are unchanged and the frozen corpus keeps its rc.2 labels, which the notes say in one sentence. - Tests: both readers' real installation check on a v0.3.0 copy; the builder's new rules; the CLI test builds a final bundle and both of its readers answer a 0.3.0 selection with support and a 0.3.0-rc.2 one with capability-unsupported. The RC2 route tests no longer validate RC2 on this tree, whose support identity is the final's. Signed-off-by: kikashy <35789537+kikashy@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…and candidate period (#231) Review fixes on the v0.3.0 final preparation: - tools/build_release.py: the final is compared with RC2's inventory only when that file has the SHA-256 tag v0.3.0-rc.2 published, so a leaf change re-pinned in both inventories is refused. Tests cover that case, the honest tree, and the comparison behind the digest. - releases/v0.3.0.md: the reused run's id and attempt are in the gate's decision record kept as the release run's release-evidence-<attempt> artifact (web/DEPLOYMENT.md, "Release evidence"); nothing claims a body edit. The rc.1 review list adds issues #259 and #261. A "Candidate period" paragraph gives both publication dates, the feedback record on #231 before the tag, and the one-week floor after rc.2. - VERSIONING.md: a candidate graduates with no change to its normative artifacts; text and tooling that named the candidate distribution are updated to name the release, and the release's notes list them. Signed-off-by: kikashy <35789537+kikashy@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…alect and RFC 0029 (#231) The maintainer's decision on the held finding (A2): the normative text stops naming RC2 as the leaf's home. - spec/retained-column.md line 6: accepted at draft maturity in the v0.3.0 release, first distributed as the v0.3.0-rc.2 candidate; line 266: the schema, corpus and digests are the candidate's, while the companion page and the two readers name the release. - spec/judgment-pack-core.md lines 54-55 and 371, spec/dialect.md lines 142 and 144: adopted at draft maturity in v0.3.0 (candidate distribution v0.3.0-rc.2), keeping each sentence's existing non-claims. - rfcs/0029: one dated note in the adoption section naming v0.3.0 as the accepted route's final distribution; its Status and history unchanged. - tools/build_release.py: the files allowed to differ from RC2's inventory are now the companion, Core and Dialect pages and the two readers (the RFC is not inventory-pinned); the final inventory re-pins the three pages. - releases/v0.3.0.md lists these text changes in one sentence. Signed-off-by: kikashy <35789537+kikashy@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Clean-room review record: spec PR #278 (v0.3.0 final preparation, #231)
VerdictNeeds fixes: 1 HIGH, 3 MEDIUM, 6 LOW. The HIGH is at the level of the decision. The fix changes a fourth line under Everything mechanical holds:
Probes and outcomes
Mutants re-run15 mutants were run in a scratch clone. Each was restored after its run, and the clone ended clean. For the reader mutants, the scratch inventory was re-pinned so that only the mutated logic could fail.
All named tests pass on the unmutated head. Findings
No finding concerns conformance or maturity overstatement in the notes. The notes keep Re-read (2026-10-28): head
|
| ID | Severity | Where | What |
|---|---|---|---|
| R1 | LOW | tools/build_release.py FINAL_REVISED_LEAF_FILES |
The allowed set is per file. Since A2, any change to the Core or Dialect page passes the comparison with rc.2's inventory (probe: changed and re-pinned, accepted). That the change was limited to the adoption sentences is shown by the diff and this review, not enforced by the builder. This is acceptable under the decision. |
| R2 | LOW | spec/judgment-pack-core.md:367 |
"For the proposed exact selected retained-column/1 contract only" still says "proposed" one sentence before line 371 says "adopted". This residual wording is outside the decided lines. |
| L3, L5, L6 | LOW | as above | Unchanged: the relative links in the GitHub release body; files outside the brief's list, which now also include the RFC 0029 dated note (decided under A2); and the two older inconsistencies that predate this PR. |
|
🎉 Thank you for your contribution to Judgment Pack! If you’d like another task, choose a path that interests you: |
Prepares the
v0.3.0final for milestone v0.3.0 (#231). This PR creates no tag; the tag is cut later. The published candidates' files underreleases/(rc.1, rc.2) are untouched. Nothing underconformance/,schema/orrfcs/changes.conformance/andschema/are unchanged, and underspec/andrfcs/only the leaf's adoption sentences change, per the maintainer's decisions below.Maintainer decision: the final is the leaf's normative support distribution
The maintainer chose to make
v0.3.0the normative home of the selectedretained-column/1leaf, so a final installation supports the leaf. Without this, the readers named only the rc.2 distribution, and the final bundle answered a leaf selection withcapability-unsupported. The change:spec/retained-column.md, lines 6, 23, 28 and 266 only:v0.3.0release, first distributed as thev0.3.0-rc.2candidate.0.3.0.releases/v0.3.0.retained-column.json.0.3.0, thev0.3.0distribution.v0.3.0-rc.2was its candidate distribution and remains published. The schema, corpus and digests are the candidate's, while the companion page and the two readers name the release.v0.3.0installation.tools/retained_column.py,tools/dialect-verify-ts/src/retained.ts):release-identity.json(tagv0.3.0, releaseVersion0.3.0, specVersion, maturity, a 40-hex sourceCommit).releases/v0.3.0.retained-column.json(distributionv0.3.0, every pinned byte).0.3.0. They name0.3.0only, because rc.2 installations run rc.2's published readers.v0.3.0bundles carry a generatedrelease-identity.json. It is generated, never a tracked mapping; noreleases/v0.3.0.jsonexists or is admitted.spec/judgment-pack-core.md,spec/dialect.md,tools/retained_column.pyandretained.ts.v0.3.0-rc.2published (RC2_RETAINED_INVENTORY_SHA256).v0.3.0-rc.2labels: thecases.jsonstatus, themanifest/capabilitiesdistribution and the synthetic test pins. The notes say in one sentence that these labels name the candidate distribution whose bytes the final publishes unchanged.0.3.0selection naming its own commit issupportedby both the Python and the TypeScript reader. A0.3.0-rc.2selection iscapability-unsupportedfrom both. The CLI test intests/test_retained_release.pyrepeats this probe on every run.What changed
Final notes at
releases/v0.3.0.md(the immutable path the builder prefers). They keep the prepared notes' Included work, Versioning and maturity, Migration note and preserved-schema sections. They add:repository-conformanceevidence for the exact commit through the release evidence gate. It says the reused run's id and attempt are in the gate's decision record, kept as the release run'srelease-evidence-<attempt>artifact (web/DEPLOYMENT.md, "Release evidence"). It names where the candidates were reviewed: rc.1 on Define 0.3.0 release naming and maturity status #246, Re-pin Core surfaces to specVersion 0.3.0 #248 and Support the exact Core 0.3.0 release candidate #258, with its review records on issues Restore historical schema identities and correct Core 0.3 migration claims before RC #259 and Pin release Node and recover the existing RC without moving its signed tag #261; rc.2 on Specify retained-column contract and prepare scoped Core RC2 #274, with its same-vendor statement.docs/releases/v0.3.0.mdbecomes a pointer; it is kept because the published rc.1 notes link to it. The site'sproject/releases/0.3.0/page renders the immutable notes.The leaf in the final bundle (
tools/build_release.py). Forv0.3.0,bundle_paths()adds the reader paths,releases/v0.3.0.retained-column.json,releases/v0.3.0.milestone.jsonand the notes, and no mapping.validate_artifacts()holds the final to RC2's leaf rules (a valid inventory with draft maturity, RFC 0029 Accepted, milestone Hosting: multi-site config + keyless CI/CD deploy (WIF) #2) plus the rules above. It refuses when:The draft is not a pre-release for a plain tag (
release.yml). The evidence job hands the release job itsrouteoutput, which is the tag grammar alone.--prereleaseis passed unless the route is exactlyevidence, sov0.3.0is drafted as a release the maintainer publishes, while RCs,policy-vtags and any other route value stay pre-releases.web/DEPLOYMENT.mdand.github/ci-evidence.json'sfresh_at_releasetext are updated to match.VERSIONING.mdnamesvX.Y.Z-rc.NandvX.Y.Z-alpha.N. A candidate graduates with no change to its normative artifacts (schemas, corpus, Core and companion rules). Text and tooling that named the candidate distribution are updated to name the release, and the release's notes list those changes.CHANGELOG.md:## \0.3.0``; RFC 0027 (targets 0.4.0) stays under Unreleased; a leaf entry is added.0.2.0-draft's entries, which were still under Unreleased, move verbatim under## \0.2.0-draft` — 2026-07-28`, so the move is exact.0.3.0heading has no date: the maintainer adds it at the tag.What the final bundle carries beyond rc.2's
releases/v0.3.0.md,releases/v0.3.0.retained-column.jsonandreleases/v0.3.0.milestone.json. The generatedrelease-identity.jsonnow namesv0.3.0.docs/releases/v0.3.0.md.Safeguards and their mutants
I broke each safeguard in a scratch copy and confirmed that the named test failed: 26 mutants, all caught, including the review round's published-digest rule and the narrowed revised-set mutant. When a mutant targeted a reader, the scratch copy re-pinned that reader's digest, so only the mutated logic could fail the test.
distributionand the three revised files_retained_column.pytest_retained_release.test_final_route_refuses_each_leaf_rule(and the pin tests for the widened set)v0.3.0-rc.2published (a leaf change re-pinned in both inventories is refused)test_retained_release.test_final_route_refuses_each_leaf_ruledistributionequals the exact tagv0.3.0test_final_bundle_paths_carry_the_leaf_without_a_mapping,test_final_cli_archives_the_leaf_and_its_readers_support_ittest_final_cli_archives_the_leaf_and_its_readers_support_itdistribution,releaseVersion, reported versiontest_retained_column.test_installed_identity_is_the_v0_3_0_distributionretained.test.ts"installed identity is the v0.3.0 distribution"--prereleaseonly outsidevMAJOR.MINOR.PATCHevidencetest_release_evidence.test_only_a_plain_release_tag_is_drafted_without_the_prerelease_flagThe RC2 route tests no longer validate RC2 against this tree, because the tree's support identity is now the final's. The rc.2 assertions on its own immutable files (mapping, milestone, inventory pins outside the revised three) stay. The RC2 route now refuses this tree, which is pinned by a test, so rc.2 is built only from its tag.
Tests
python -m unittest tests.test_release tests.test_retained_release tests.test_release_milestone: 41 tests, OK.python -m unittest tests.test_retained_column tests.test_site: 70 tests, OK.PYTHONPATH=tests python -m unittest test_release_evidence test_release_recovery test_historical_release test_dialect_ts: 62 tests, OK.node --disable-wasm-trap-handler --test test/*.test.ts): 385 tests, all pass.ulimit -v 4000000.--disable-wasm-trap-handler, the flag the suite's own Node calls use, lets Node's TypeScript stripping run under the cap.Checks
I ran
jpdev check --changed origin/mainon the head underulimit -v 4000000, withNODE_OPTIONS=--disable-wasm-trap-handler. That flag is the one the suite's own Node calls use, and it letstest_profilesrun under the cap. The workflow change is an unmapped path, so the whole list ran:Self-checks (AGENTS.md):
spec/, only the three support-identity lines named above changed;schema/has no diff.Review fixes (clean-room record of cdb9f6d)
validate_final_retained_inventoryuses RC2's inventory only when that file has the SHA-256 tagv0.3.0-rc.2published. That digest is a constant, so the tests read no tag. I checked it againstgit show refs/tags/v0.3.0-rc.2:releases/v0.3.0-rc.2.retained-column.json. The tests cover three cases: a leaf change re-pinned in both inventories (refused), the honest tree (accepted), and the comparison behind the digest.release-evidence-<attempt>, which is whatweb/DEPLOYMENT.md"Release evidence" already documents.VERSIONING.mdsentence now says what holds (item 4).v0.3.0as the leaf's adoption release, andv0.3.0-rc.2as its candidate.spec/retained-column.mdlines 6 and 266.spec/judgment-pack-core.mdlines 54–55 and 371.spec/dialect.mdlines 142 and 144: the closing "Immutable RC2 publication remains separate." is dropped.rfcs/0029-retained-column-conversions.mdgains one dated note after the first adoption paragraph (new line 19). It namesv0.3.0as the accepted route's final distribution; its Status and history are unchanged. RFC 0000 does not forbid this. It is a non-material note in the repository's dated-note convention, not an amendment of the design.🤖 Generated with Claude Code