Repository navigation
Name the instant freshness is judged against in verify-run's report (#55) - #65
Merged
Merged
Conversation
) verify-run's report and its line on standard error now say that each acquisition's freshness, and each computed calculator's table freshness, was judged against preparation.verifiedAt, which the export supplies and no signature covers: freshness is consistent with the instant the export supplies; nothing establishes that instant was the admission instant. The new member, unsignedFreshness, is present for every run any source of which was acquired, copy mappings included. It names the member and the instant, and lists each such source with its checks and target count, as the preparation's recomputation judged them. Exit codes, --require-signed, --require-witnessed and --require-sourced are unchanged. Committing the instant to signed material needs a member of the Runtime's record that a caller can fill (runtime #263). Part of #55. Signed-off-by: kikashy <35789537+kikashy@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of #65: - MEDIUM: nothing pinned the verified guard on the judged list. A subtest now puts a local file beside the acquired calculator and asserts that the local file is not named. - LOW: nothing pinned the member on the unwitnessed, signature-invalid and disposition-differs reports. The end-to-end test now asserts each refusal exactly, with the member. - LOW: MAPPING-V2 and the v0.9.0 bullet now say "a verified acquisition that was not skipped", and the bullet says the member is absent for an export without lineage. Part of #55. Signed-off-by: kikashy <35789537+kikashy@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 12, 2026
kikashy
added a commit
that referenced
this pull request
Oct 12, 2026
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.
Part of #55 (tracking #57).
What changes for a verifier's reader
verify-runnow says which instant freshness was judged against. When a run has a verified acquisition that was not skipped, the report carries one new member,unsignedFreshness. The line on standard error gives the same in words. This holds for copy mappings as well as rules, which closes the gap the audit found: a calculator on a copy mapping drew no warning at all.This is a report and refuses nothing new. The exit code and
--require-signed,--require-witnessedand--require-sourcedbehave as before. Two kinds of export carry no member: a run with no verified acquisition, which judged no freshness (a local file is not one), and an export without lineage.Design
Part 1, the report (this PR). Preparation lists every source whose freshness it judged against its instant, at the one place both checks have already passed. That covers every verified acquisition that was not skipped, and a calculator only when it computed: a calculator that did not compute has none of its tables held to their limits. Verification gets the list from its own recomputation of the preparation, so the report names exactly what was judged. Other callers of preparation ignore the list. The preparation's bytes, the export and the stored runs do not change.
Part 2, committing the instant: filed as Judgment-Pack/judgment-pack-runtime#263, not implemented here. Neither slot the brief names exists:
cites, andcitesis held to the shape of a gateway citation, so a digest cannot ride in it.The issue describes the missing member precisely:
--bindingwith{"kind","digest"}, where the digest is the SHA-256 of the canonicalpreparationobject.audit verifywould check: the shape only.verify-runwould then do: recompute the digest and refuse a mismatch.Until that lands, this report is the honest state.
What it establishes and what it does not
preparation.verifiedAt:at: it is signed, but it is the evaluation instant, which can come any time after admission. It boundsverifiedAtfrom above only, and this PR does not use it.Tests
TestVerifyRunNamesTheInstantFreshnessWasJudgedAgainst, cmd). A calculated source on a copy mapping is signed through the test's signing Runtime and witnessed by a held checkpoint. Then:--public-key --require-signed --expect --require-witnessed, the report and the line name the instant;retained lineage does not match recomputation;unsignedParametersis absent throughout.TestAPreparationMovedBySecondVerifiesAndItsInstantIsNamed). It moves the instant through Runner's ownnormalizeV2and asserts thatAuditBytes,AuditSignaturesandChainare unchanged.TestFreshnessJudgedAgainstTheInstantIsNamedSourceBySource):acquisitionandcalculation, and the copy case has nounsignedParameters;acquisitiononly, and the source skipped behind it is not named;TestTheFreshnessSentenceCountsWhatWasJudged).TestVerifyRunReportsUnsignedParametersEndToEnd,TestVerifyRunRefusesAnAssertedTargetBeforeAnUnsignedOne,TestVerifyRunReportsUnsignedParametersandTestVerifyRunAcceptsInputsDerivedFromReceipts.TestVerifyRunReportsUnsignedParametersWithTheReleaseRuntimeis updated the same way; it skips unless the Runtime under test is v0.24.0.Mutation tally
Eleven mutants, each run in a scratch copy against the focused tests: seven before review and four from it. Every one compiled and was caught.
Freshnessnil)TestAPreparationMovedBySecondVerifiesAndItsInstantIsNamed,TestVerifyRunNamesTheInstantFreshnessWasJudgedAgainst, and the four updated exact-report testsverified-inputsreport onlyTestVerifyRunNamesTheInstantFreshnessWasJudgedAgainst, and the four updated exact-report testsTestTheFreshnessSentenceCountsWhatWasJudged,TestVerifyRunNamesTheInstantFreshnessWasJudgedAgainst, and the four updated exact-report testsunsignedParametersscopes itself)TestFreshnessJudgedAgainstTheInstantIsNamedSourceBySource,TestAPreparationMovedBySecondVerifiesAndItsInstantIsNamed,TestVerifyRunNamesTheInstantFreshnessWasJudgedAgainst,TestVerifyRunAcceptsInputsDerivedFromReceiptsTestFreshnessJudgedAgainstTheInstantIsNamedSourceBySource,TestAPreparationMovedBySecondVerifiesAndItsInstantIsNamed,TestVerifyRunNamesTheInstantFreshnessWasJudgedAgainstTestFreshnessJudgedAgainstTheInstantIsNamedSourceBySourceTestFreshnessJudgedAgainstTheInstantIsNamedSourceBySourceverifiedguard dropped (a local file named)TestFreshnessJudgedAgainstTheInstantIsNamedSourceBySource/a_local_file_beside_an_acquired_calculatorunwitnessedreportTestVerifyRunNamesTheInstantFreshnessWasJudgedAgainstsignature-invalidreportTestVerifyRunNamesTheInstantFreshnessWasJudgedAgainstdisposition-differsreportTestVerifyRunNamesTheInstantFreshnessWasJudgedAgainstPart 2 is not in this PR, so there is no digest comparison to mutate.
Checks
gofmt -l .: clean.go vet ./...: clean.JPACK_TEST_BIN: pass. The neighbouring calculator and coverage tests also pass:TestCalculatedRunIsEvaluatedAndVerifiedOffline,TestACalculatedSignedAndWitnessedRunRefusesAnswerAndTableTimeTampering,TestAFailedCalculationIsSignedAndWitnessedAndAMalformedReceiptPinIsRefused,TestARunRecordedBeforeCalculatorsVerifiesUnchangedandTestVerificationCoverageInHelpAndGuide.gofmt -l .clean,go vet ./...clean, and the four new-or-extended focused tests pass. CI at e9a7457 is green: Runner (ubuntu-latest), Runner (macos-latest) and Release contents.Docs
docs/MAPPING-V2.md: one paragraph and an example member, afterunsignedParameters.docs/design/calculated-values.md: one bullet under "What this does not establish".docs/releases/v0.9.0.md: one bullet. An added report member is a minor version, as v0.7.0's added report status was.Not in this PR
preparation.verifiedAt, the mapping digest and the bound parameters to signed material: A caller-supplied binding digest on the evaluation record, so a companion can commit its preparation (runner #55) judgment-pack-runtime#263, after which Runner can pass the binding andverify-runcan refuse a mismatch.at.Review fixes
A claims review of 48687f6 by a second Claude agent found no HIGH. Its one MEDIUM and three LOW are fixed in e9a7457:
verifiedguard on the judged list was untested.TestFreshnessJudgedAgainstTheInstantIsNamedSourceBySourcegains a subtest that puts a local file beside the acquired calculator and asserts that the local file is not named. The mutant that drops the guard is now caught.TestVerifyRunNamesTheInstantFreshnessWasJudgedAgainstnow asserts the exact refusal and the member in three reports. The three mutants that drop it are now caught.unwitnessed: the held checkpoint withheld, with--require-witnessed.signature-invalid: another--public-key.disposition-differs: the moved export as version 2 with its answer changed, re-executed by the release's Runtime.docs/MAPPING-V2.mdand thev0.9.0bullet now say "a verified acquisition that was not skipped". The bullet also says the member is absent for an export without lineage.binding,verify-runkeeps reportingunsignedFreshnessand refuses only under an opt-in such as--require-bound;verify-runrefuses abindingof anotherkindbefore it compares digests;--require-witnessed) catches.Review
Seam: a verification claim. A second-reviewer round follows, run by the coordinator.
🤖 Generated with Claude Code