Repository navigation
v0.39.0: vendor Spec v0.3.0 and the retained-column leaf at its release identity; audit line-format fingerprints (#327); tool taxonomy closure (#329) - #341
Conversation
Re-import the Core 0.3.0 bundle from the published v0.3.0 tag (bytes and bundle digest unchanged; the lock's ref and commit move to the tag). Remove the v0.3.0-rc.2 leaf import and import the leaf from the verified v0.3.0 archive; install its provenance pin and exact tuple, and switch the selected reader identity to 0.3.0. The installed reader refuses the candidate's release identity and selector. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: kikashy <35789537+kikashy@users.noreply.github.com>
Add a generated catalog of every persisted audit-trail line type (evaluations records and discontinuities, signature-sidecar record signatures and key rotations, stamps) with its normalized JSON shape and SHA-256 digest; hand-kept change records naming the format decision behind each digest; and a separate format-status record (writes, baseline, released) checked against the writer constants. The audit-formats check (dev.json, and the CI matrix with the other Go steps) regenerates the catalog and fails on a stale catalog, a digest without a change record or a status the writer constants contradict. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: kikashy <35789537+kikashy@users.noreply.github.com>
…review) F1: the record's canonical disposition is built from maps, so it was an opaque json value in the fingerprint. Declare its members in result.CanonicalDispositionShape and fingerprint the record through it; the check now holds exemplar lines from the writers' own encoders to the declared shapes and grammars (an undeclared member, a declared member no exemplar writes, or a stamp token that is not standard padded base64 fails). F2: status.json pins the released change records' count and digest; rewriting, reordering or removing one fails. F3: state that the fingerprint covers shape and declared grammars only. F5: remove a CI comment left behind by #333. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: kikashy <35789537+kikashy@users.noreply.github.com>
|
Verdict (re-read at 4760af6): RELEASABLE. 0 HIGH. F1, F2, F3 and F5 are resolved. One new MEDIUM (R1: the disposition shape is checked by exemplar sampling, so a member behind a branch no exemplar takes still passes). 2 LOW. F4 is unchanged and informational. (Superseded first-round verdict at 15bc1de: NOT YET RELEASABLE. 1 HIGH (#327 does not fingerprint the persisted Clean-room review record: runtime PR #341 (v0.39.0 final prep) and the pre-release pass over v0.38.0..15bc1de
Probes
Mutants
Every mutant was reverted with Findings
Depth 2: v0.38.0..15bc1de
None of the unreviewed PRs touches a security boundary, a record format or a public surface. Public changes for the release notes (v0.39.0 compared with v0.39.0-alpha.2)
What was not established
Re-read at 4760af6
Probes and mutants at 4760af6
All mutants were reverted, Answers to the re-read scope
Status of the first-round findings
New findings at 4760af6
Public changes for the release notesThe list above stands. The delta adds no public change: maintainer tooling, docs and a CI comment only. Persisted audit lines are byte-identical to v0.38.0. Not established at 4760af6The full suites and the macOS/Windows legs (CI owns them). Branch coverage of |
|
🎉 Thank you for your contribution to Judgment Pack! If you’d like another task, choose a path that interests you: |
Milestone v0.39.0. Release notes and the tag are left to the release step.
1. Core vendoring
internal/artifacts/jps/0.3.0was already present (registered; lock pinned to commit65c7cf5598a0f0fc532c80a9e2215090951104ce). It was removed and re-imported withtools/sync-spec-artifactsfrom a clean checkout at the published Spec tagv0.3.0(commit27cb29bf13e4a2d58d69fe19c7ebfeb762b014fc). All 165 files are byte-identical; only the lock'sref(v0.3.0) andbaseCommitchange. The bundle digest stays018b8221c424fa530d7482b160f4d7faa59cd9d2e80d3f6e2f8748dfb0d7e743. The registry is unchanged. README, VERSIONING, CONFORMANCE, architecture and the Core pin test now name the tag.2. Retained-column leaf at the release identity
v0.3.0tar.gz asset was re-verified before import: sha2566469a866b9c0e1671de3462c1b1823a1738561f6b84e52b470382fc620530ce9matches the release'schecksums.txt,gh attestation verifysucceeds, and the release is immutable and is neither a draft nor a pre-release. Inventoryreleases/v0.3.0.retained-column.jsonhas sha256c8e489b2cabd0ee0b794a8b6a817f06f901e338348e32ec23c8c83d7c40dfe58, with the same bytes in git at the tag. Its schema and corpus digests equal rc.2's.tools/sync-retained-columninto the emptiedofficial/. The bytes changed exactly where the Spec changed between rc.2 and the final release: the inventory (renamed),release-identity.json, the three spec pages and the two leaf readers.sha256:271bfd2b1858885a4748d8630e0cb98a3dcf3d93b015798ab4d7ad804dcb257b. The installed tuple is0.3.0at27cb29bf…, and the selector isretained-column/1@27cb29bf13e4a2d58d69fe19c7ebfeb762b014fc, which is a public value change. The source URL follows the revision, and maturity staysdraft.internal/retainedcolumnnow admits the final release: tagv0.3.0, version0.3.0, and a release identity with nodistributionmember. The importer's archive prefix comes from the version. The installed reader refuses the rc.2 identity, which is tested three ways: a syntheticrelease-identity.json(candidate form and the exact rc.2 identity), the rc.2 tuple against the installed bytes, and the rc.2 selector.Selected retained-column/1 v0.3.0 · <rev>) and the MCP descriptions and errors no longer say "RC2". The rc.2-named tests were renamed and updated. All 72 published cases and all 11 raw-value recipes run with the installed identity. Historical Draft resources are untouched.docs/dialect-retained-column.md; the alpha.2 CHANGELOG link now points at the doc as tagged. Indocs/releasing.mdthe leaf section takes the release identity, with one sentence on-rc.Nand-alpha.N.capabilities.jsonandmanifest.jsonstill say"distribution": "v0.3.0-rc.2". Their bytes are unchanged upstream, and the test keeps that label with a comment.tools/check-release --tag v0.39.0passes.3. #329: nothing missing
#329 was closed on 2026-10-25 after #330. Checked against its acceptance:
operationandeffectin_meta(internal/mcp/taxonomy.go).checktools carry acheckKind, andexperimentalis a flag. No tool name changed.docs/mcp-clients.mdgroups the tools by family. Cross-checked by script: 38/38 tools, no disagreement with the declarations.TestTaxonomyMissingDeclarationRefusesActualPublicationfails publication when a declaration is missing, andTestTaxonomyActualToolsPublicationpins the metadata and hints.Nothing was built for #329.
4. #327: audit line-format fingerprints
internal/audit/formats.golists the five persisted line types:evaluations.jsonlrecord and discontinuity,signatures.jsonlrecord-signature and key-rotation, andstamps.jsonlstamp, each with its writer constant.internal/auditformat/catalog.jsonis generated: the normalized JSON shape (grammaraudit-line-type/1) and its SHA-256 for each line type.changes.jsonis hand-kept and append-only. Each entry is abaseline, acompatible-additionat the same version, or anew-format-versionat the next integer with areadingRule, and every non-baseline entry needs a reason.status.jsonis kept apart. For each file it recordswrites(checked againstRecordVersion,SidecarVersionandStampVersion),baselineandreleased, withbaseline <= released <= writes. All three files are at 1/1/1.audit-formats(go run ./tools/audit-formats). It is indev.jsonand mapped injpdev.json. Following the repository rule, it is also a step in the CItestmatrix, so this PR edits.github/workflows/ci.yml. It fails on a stale catalog, on a digest that no change record names, and on a status the writer constants contradict.-writeregenerates only the catalog.sha256sum.distributionrefusal was mutated too and was caught bycandidate release identity.Closes #327. Refs #329.
Fix round (review of 15bc1de: F1, F2, F3, F5)
result.CanonicalDispositionShapelists the membersCanonicalWithwrites.LineFormat.Embeddedmaps the record'sdispositionmember to that type, and the fingerprint uses it instead of an opaquejson. The record's normalized type now spells out every disposition member.CanonicalWith, which together carry every member. It holds them to the declared shape. It fails on a member the builder writes that the shape does not declare, on a declared member that no exemplar writes, and on a required member that is absent.format:"base64", and the stamp exemplar must be standard padded base64.status.jsonnow carriesreleasedChanges, a count and digest pinning the released change-record prefix. Rewriting, reordering or removing a pinned record fails.ci.ymlcomment is removed.audit-formatswith "member disposition.extra is not declared by the line's shape".RawURLEncodingtoken) fails with "member token is not standard padded base64".-write, then the baseline rewritten in place) fails with "released change records … not unchanged and in order".CheckFiles.jpdev check --changed origin/main: 10 passed, 0 failed.Checks
Also:
go run ./tools/check-release --tag v0.39.0: "Release inputs verified for v0.39.0."🤖 Generated with Claude Code