INTERNAL SYNTHETIC ARTIFACT CHECKS — 2 NOVEMBER 2026 Inspect or reproduce: - [Portable runner](verifier-artifact-checks-2026-11-02.mjs) - [Raw result transcript](verifier-artifact-checks-2026-11-02.json) - Subject source: ../verify/verify.mjs - Existing synthetic fixtures: ../verify/sample/ Run with Node 22 or newer from any working directory: node /verifier-artifact-checks-2026-11-02.mjs Keep this reviews directory beside the supplied verify directory. The runner resolves paths relative to itself and writes only its sibling JSON transcript. It does not regenerate fixtures or modify the verifier, draft or existing samples. Environment recorded: Node v22.22.3. Verifier SHA-256: 9ac83302aaf72fbf03ac886fed0aa5cd3f30dd41a663d624ec1a7e92e89dbc8a Method and observations 1. Read-only supplied-fixture checks: receipt with trust/head exits 0; receipt without trust exits 3; tampered and forged-root fixtures exit 1. In the forged-root fixture, signature fails while inclusion against the actual signed head passes. That fixture changes a signed field without resigning. It does not test every possible attacker-chosen root. 2. Independently construct eight leaf hashes and binary tree layers from UTF-8 strings leaf-0 through leaf-7. Leaf = SHA-256(0x00 || input); parent = SHA-256(0x01 || left || right). Build bottom-up sibling paths without using the subject generator, then invoke the exported inclusionRoot function. The expected root is ca6b7b3e674ac86c1027b59c87c064fc3bc27b313294c75f83bd05fdd13f0dcf. Indexes 1, 3, 4 and 6 mismatch; 0, 2, 5 and 7 match. Exact roots are in the transcript. The supplied fixture uses index 5, a symmetric direction sequence. 3. Generate local Ed25519 issuer and log keys. Explicitly accept their PUBLIC keys in a temporary test trust store. Sign a one-leaf receipt whose body contains only aar, retained and log. Omit run_id, issued_at, runtime, model, policy, attestation, tools and ledger. The prototype returns VERIFIED, exit 0. These are our own synthetic test keys, not a forgery against an external issuer. 4. Serialize that same signed input with duplicate retained properties: first 99, then 0. JSON.parse retains zero; the prototype returns VERIFIED, exit 0. This observes missing duplicate-name rejection, not an alteration of the final signed object. It does not validate JCS input conformance. 5. Restore the minimal receipt. Add timestamp = 2099-01-01T00:00:00Z to its signed head without changing the signature. The prototype still returns VERIFIED, exit 0. sthBytes includes only log ID, root and tree size. The extra time field is outside the authenticated bytes; the result supplies no trusted event time. 6. Direct canonicalizer probes preserve a lone surrogate and turn parsed numeric overflow into null. Exact inputs and outputs are in the runner and transcript. These are selected counterexamples, not a complete malformed-input assessment. The runner creates temporary receipt, head and PUBLIC-key trust files for checks 3–5 and deletes those files afterward. Generated private keys stay in memory and are never serialized. The shareable runner and transcript contain no private-key material, user documents, credentials or machine-specific home/temp paths. Limits This is an internal local check, not external human review. The independent tree covers size eight only. The minimal-body tests use the subject canonicalizer to construct messages the subject accepts; they test field/input requirements, not independent canonicalization correctness. No invalid-proof acceptance rate, population failure rate, general conformance or security verdict follows. No real agent task, hardware attestation, public log, observed erasure or provider retention was tested. No implementation repair or proposed reviewer study was performed. Passing these particular inputs means only that those checks returned the recorded results against the specified synthetic keys and data.