Repository navigation
trace-verify 0.4.2
pip install trace-verify==0.4.2
Behaviour changes
- Key rotation is now refused.
trace-verify chainfails a link whosekey_iddiffers from the previous checkpoint's. Each checkpoint names its own key, so a chain that changed signers midway used to verify clean. The chain format has no rotation statement, so a checkpoint signed by a new key is a break, not a continuation: there is no supported way to rotate the checkpoint key and keep a chain verifying. The anchor pipeline also refuses to extend a published chain when its configured signing key is not the one that signed the last checkpoint. trace-verify chainwith no checkpoints exits 1 (#88). It exited 0 and, with--json, reportedverified: truefor input containing no checkpoint. It now printsNOT VERIFIED, and--jsonreportsverified: false,checkpoints: 0,reason: "no_checkpoints".- Malformed input fails instead of raising (#94).
CheckpointRecord.from_dictraisesValueErrorfor a missing or mistyped member (it raisedKeyErrororTypeError) and refuses a boolean, float or numeric-string integer.verify_checkpoint_linkreturns a failure for a non-string root.InclusionProof.from_dictandConsistencyProof.from_dictraiseInvalidArgumentError. A non-stringcanonicalization_idis anUnknownCanonicalizationError. The CLI exits 2 for a file that is not UTF-8 or is nested too deeply, andchainreports a malformed checkpoint as a failure; both printed tracebacks. Found by the new ClusterFuzzLite targets in.clusterfuzzlite/.
Fixes
trace-verify --jsonprints one JSON document when the signature does not verify. It printed two (#93).trace-verify --entry-urlfollows a redirect only to an allowlisted https host. The allowlist was checked on the first URL only, and urllib followed any redirect after it (#93).
Registry side (not in the package)
- The pipeline, the aggregator and
tools/anchor.pyrefuse a claim outside the registry-anchor-v1 section 1 profile: a non-integer number, an integer outside -(2^53-1)..2^53-1, or a duplicate member name. Every claim already anchored is inside the profile (#93). - A staged record whose
produceris an array or object is rejected by name. It used to abort the scheduled run for every producer. CI now dry-runs staged records (#93). tools/check_append_only.pydiffs with--no-renamesand fails when the base SHA does not resolve (#93).- The aggregator caps request bodies at 4 MiB (413), answers a missing, negative or malformed
Content-Lengthwith 400, and answers 400 to a body nested too deeply to parse (#93, #94). tools/capture_witness_receipt.py --registry-entrylifts themmr_checkpointout of a registry entry file, with--batch-idfor a multi-line file (#78).- CI: ruff (#96), per-job write permissions (#95), pipeline runtime dependencies (#89), maintainer approval check (#92).
Full list in CHANGELOG.md.