1 (artifact bundle): ci_reports writes evidence/MANIFEST.tsv (content hash+len of
every evidence file); attestation verifies completeness+integrity; merge-gates
requires the bundle.
2 (every leaf full evidence): run_all_to streams a full trace+delta record for
EVERY leaf (base 'b' and perturbation 'p'), not a sample.
3 (attestation completeness): attestation enforces a leaf<->trace bijection
(traces == leaves and covered set == leaf set), not just consistency.
4 (collapse derives from full traces): trace_feature_row single-sourced into
collapse_analysis; attestation recomputes each collapse row from the retained
full trace and requires bit-exact match.
5 (mutants through full gates): evaluate_mutants runs each mutant through
engine_acceptance over 128 generated cases (trace/equivalence/domain/
metamorphic/causal), replacing the 64-input local predicates.
6 (trace+delta+future): metamorphic enforces consumed->trace per-case plus
consumed-aggregate delta (>=0.65) and future (>=0.80) rates.
7 (recomputable causal): per-edge intervention records written to
evidence/causal_evidence.tsv; attestation RE-EXECUTES each from its seed and
recomputes base_dv/alt_dv.
8 (no string/comment proof): removed web_assets JS-substring test and the
tautological string assert in ci_reports.
Verified at fast scale end-to-end: 6600/6600 traces reconstructed, leaf
bijection, 1600/1600 causal records recomputed, 600/600 collapse rows derived,
bundle intact.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Removes the deferral. Each sampled execution's FULL trace (every graph edge,
count, weight) and delta are persisted as evidence; the independent attestor
reconstructs them, recomputes the canonical trace hash and delta hash, re-derives
the replay-record leaf, and confirms it is among the retained Merkle leaves the
root is built from. The behavior-fingerprint hash is re-derived from features
(not trusted), and f64 divergence is stored bit-exact for an identical hash.
- trace_model: ExecutionTrace::serialize/deserialize (round-trips canonical_hash;
total on garbage). Test: full_trace_serialize_roundtrips_canonical_hash.
- world_model: WorldDelta::serialize/deserialize (round-trips hash).
- ci_reports: retains TRACE_EVIDENCE_SAMPLE full traces; writes
evidence/traces.tsv.
- attestation: depends on trace_model/world_model; reconstructs each trace,
recomputes the leaf, requires it to match the claimed leaf AND be a retained
leaf. Negative control: tampered_trace_breaks_attestation (corrupting the full
trace, leaving the claimed leaf, fails attestation).
- merge-gates: requires evidence/traces.tsv; the separate attest step verifies it.
End-to-end (fast profile): 256/256 full traces reconstructed and re-derived to
retained leaves; recomputed root matches the claim over 6600 leaves.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Addresses the attached findings as blocking compliance failures. Each fix
removes a substitution pattern and adds a negative-control test.
Finding 9 (hash changes != enforced metamorphic expectations):
ci_reports now enforces a sound metamorphic relation per perturbation — a
perturbation the program CONSUMES must alter the trace — grounded in
reachability, with a non-vacuity check. Test:
consumed_perturbation_must_alter_trace.
Finding 10 (trace counts != causal explanation):
New causal_explanation gate ablates each recorded causal edge's source lane
and requires the destination delta to change. Measured: true-source 0.77 vs
scrambled-source 0.03. Threshold 0.50. New required report
causal_explanation_report. Test:
causal_edges_are_intervention_confirmed_not_counted.
Finding 6 (static seed corpus != failure retention):
replay_corpus::retention adds a committed, append-only counterexample corpus
(retained_failures.tsv) re-verified every run against the independent runtime.
Negative control: reintroduced_bug_is_caught_by_retention.
Finding 5 (mini mutation evaluator != real acceptance gate):
Mutants are now killed by ci_reports' OWN acceptance-gate predicates with
single-sourced thresholds (TRACE_EDGES_MIN, etc.); evaluate_mutants replaces
semantic_mutation::run_suite on the acceptance path. Test:
mutants_killed_by_real_acceptance_gates.
Findings 2 & 3 (generated report != independent attestation; merkle root !=
provenance without leaves):
ci_reports persists every Merkle leaf (evidence/leaves.tsv) + claims. New
`attestation` crate + `attest` binary recompute the root from the leaves in a
SEPARATE process that never reads compliance_report.json; wired as a distinct
merge-gates step. Negative control: tampered_leaf_breaks_attestation.
Finding 8 (structural indicators != measured behavior):
Domain gate already requires measured influence/mutation/removal; added an
explicit reject for "appears structurally but no measured influence".
Finding 1 (workflow != merge enforcement): BLOCKED on server-side branch
protection. Added .github/rulesets/main-required-checks.json + apply command;
enforcement still requires a repo admin to activate the ruleset.
Finding 7 (protocol socket E2E != rendered browser E2E): BLOCKED on a CI browser
runner; rendered-browser E2E remains advisory-only.
Finding 4 (trace summary != full trace evidence): PARTIAL. Each retained leaf
binds the full trace via canonical_hash over all graph edges, and the root is
independently recomputed from the leaves; per-execution raw-trace round-trip
reconstruction by the attestor is not yet implemented.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>