From 99b02e1d22fc8d27ae020d97c0600519765170e6 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 09:06:29 +0200 Subject: [PATCH 01/18] =?UTF-8?q?ci(mutants):=20ratchet=20mode=20=E2=80=94?= =?UTF-8?q?=20report-only=20in=20ci=20/=20gate,=20shrink-only=20debt=20bas?= =?UTF-8?q?eline=20(PMAT-4646)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator rulings C187(a)/C188(a), 2026-10-01: a new gate is adopted as a ratchet, never as an instant absolute bar. No ruleset change. - ci / gate: mutation results (the mutants section and, on PRs that add it, the survivor table) are printed and no longer fail the gate. Every check before it is unchanged: workspace-test, guard-tree, guard-cargo, sov.gate, determinism-compare. - ci/mutants-debt.tsv: 590 known survivors (MissedMutant + Timeout), with file, mutant, sha and run id, from completed shard artifacts of #4587 run 36725778557 and #4588 run 36703131059. - scripts/check_mutants_debt_ratchet.sh (auto-run by guard-tree): the debt file is shrink-only against the merge base. A grown file, a swapped row, a missing file, a malformed or duplicate row, or an unresolvable base is RED. Self-test: 10 cases; 7/7 planted mutants RED. The RESTORE PR deletes the MUTANTS-RATCHET block after crates.io 0.70. Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- .github/workflows/ci.yml | 9 + ci/mutants-debt.tsv | 598 ++++++++++++++++++++++++++ scripts/check_mutants_debt_ratchet.sh | 111 +++++ 3 files changed, 718 insertions(+) create mode 100644 ci/mutants-debt.tsv create mode 100644 scripts/check_mutants_debt_ratchet.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8c7f6f4d26..e5d48060da 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -451,6 +451,15 @@ jobs: exit 1 fi done + # --- MUTANTS-RATCHET (#4646; operator C187(a)/C188(a), 2026-10-01) --- + # Mutation results are REPORTED here, not blocking: a new gate is adopted as a ratchet, never as an + # instant absolute bar. The blocking rule is the shrink-only survivor baseline ci/mutants-debt.tsv + # (scripts/check_mutants_debt_ratchet.sh, run by guard-tree, which this gate requires above). + # Every check above this line is unchanged. The RESTORE PR deletes this block (re-arms the rules below). + echo "mutants (report-only, ratchet #4646): event=$EVT section=$(res "$X86" mutants) table=${TABLE:-n/a} scope=${SCOPE:-n/a} in_scope=${IN_SCOPE:-n/a}" + echo "All required sections passed (mutants: ratchet mode, #4646)" + exit 0 + # --- MUTANTS-RATCHET-END --- MUT=$(res "$X86" mutants) # --- GATE-MUTANTS-RULE-BEGIN (#3676; scripts/check_ci_gate_mutants_rule.sh runs this block) --- # `skipped` is a pass ONLY when the skip is the job's own filter: diff --git a/ci/mutants-debt.tsv b/ci/mutants-debt.tsv new file mode 100644 index 0000000000..e87cde8d8f --- /dev/null +++ b/ci/mutants-debt.tsv @@ -0,0 +1,598 @@ +# ci/mutants-debt.tsv -- the mutants RATCHET baseline (#4646; operator rulings C187(a)/C188(a), 2026-10-01). +# Every known surviving mutant (MissedMutant or Timeout) measured by a completed CI shard, one per row: +# file mutant outcome head sha CI run id +# SHRINK-ONLY: scripts/check_mutants_debt_ratchet.sh (guard-tree) fails if a row is added, i.e. if this file +# is not a subset of the merge base's copy. A killed survivor = delete its row. Sources (2026-10-01): +# #4587 c6799ec04a run 36725778557: shards 5,6,9,10,14,15 (outcomes.json artifacts) + 1,2,13 (harvested before timeout) +# #4588 f8df3cca6b run 36703131059: shards 4,8,11,12,13 (outcomes.json artifacts) +# Shards with no outcomes.json (cancelled/timed out) are NOT measured; they are not in this file. +crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs:119:5: replace pc_reasoner -> Result<&'static str, String> with Ok("") MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs:119:5: replace pc_reasoner -> Result<&'static str, String> with Ok("xyzzy") MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs:124:14: replace == with != in pc_reasoner MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs:138:5: replace checkable_pairs -> Vec with vec![] MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs:142:31: replace == with != in checkable_pairs MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs:149:5: replace write -> Result<(), u8> with Ok(()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs:167:37: replace == with != in write MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs:167:44: replace && with || in write MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs:167:61: replace == with != in write MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs:167:70: replace && with || in write MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs:33:42: replace && with || in decide MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs crates/aprender-contracts-cli/src/bin/pv-sat/liskov.rs:33:54: replace == with != in decide MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:108:5: replace write_consistency -> ExitCode with Default::default() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:130:25: replace == with != in write_consistency MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:190:5: replace kind -> &'static str with "" MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:190:5: replace kind -> &'static str with "xyzzy" MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:198:5: replace fresh_witness -> Option with None MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:199:40: replace == with != in fresh_witness MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:200:31: replace == with != in fresh_witness MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:200:9: replace && with || in fresh_witness MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:201:26: replace == with != in fresh_witness MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:201:9: replace && with || in fresh_witness MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:202:26: replace == with != in fresh_witness MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:202:9: replace && with || in fresh_witness MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:203:9: replace && with || in fresh_witness MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:209:5: replace prune -> Result<(), ()> with Ok(()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:216:58: replace == with != in prune MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:217:13: replace && with || in prune MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:218:25: replace == with != in prune MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:219:21: replace && with || in prune MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:220:56: replace && with || in prune MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:220:59: delete ! in prune MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:222:23: replace && with || in prune MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:222:28: replace != with == in prune MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:232:5: replace git_head -> Option with None MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:232:5: replace git_head -> Option with Some(String::new()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:232:5: replace git_head -> Option with Some("xyzzy".into()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:239:27: replace && with || in git_head MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:239:40: replace == with != in git_head MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:37:5: replace main -> ExitCode with Default::default() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:39:19: replace match guard flag == "--self-test" with false in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:39:19: replace match guard flag == "--self-test" with true in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:39:24: replace == with != in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:40:19: replace match guard flag == "-h" || flag == "--help" with false in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:40:19: replace match guard flag == "-h" || flag == "--help" with true in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:40:24: replace == with != in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:40:32: replace || with && in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:40:40: replace == with != in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:45:19: replace match guard flag == "-V" || flag == "--version" with false in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:45:19: replace match guard flag == "-V" || flag == "--version" with true in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:45:24: replace == with != in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:45:32: replace || with && in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:45:40: replace == with != in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:49:9: delete match arm [] in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:50:9: delete match arm [dir] in main MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:59:5: replace version_line -> String with String::new() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:59:5: replace version_line -> String with "xyzzy".into() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:67:5: replace self_test -> ExitCode with Default::default() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:96:5: replace write_witness -> ExitCode with Default::default() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/main.rs crates/aprender-contracts-cli/src/bin/pv-sat/main.rs:97:13: replace != with == in write_witness MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/plant.rs crates/aprender-contracts-cli/src/bin/pv-sat/plant.rs:16:5: replace plant -> ClauseSet with Default::default() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/plant.rs crates/aprender-contracts-cli/src/bin/pv-sat/plant.rs:26:5: replace pc_reasoner -> Result<&'static str, String> with Ok("") MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/plant.rs crates/aprender-contracts-cli/src/bin/pv-sat/plant.rs:26:5: replace pc_reasoner -> Result<&'static str, String> with Ok("xyzzy") MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/plant.rs crates/aprender-contracts-cli/src/bin/pv-sat/plant.rs:36:21: replace == with != in pc_reasoner MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/plant.rs crates/aprender-contracts-cli/src/bin/pv-sat/plant.rs:54:5: replace pc_model -> Result<(), String> with Ok(()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/sat.rs crates/aprender-contracts-cli/src/bin/pv-sat/sat.rs:23:57: replace && with || in solve MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/sat.rs crates/aprender-contracts-cli/src/bin/pv-sat/sat.rs:36:25: delete ! in solve MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/sat.rs crates/aprender-contracts-cli/src/bin/pv-sat/sat.rs:43:5: replace propagate -> Derived<'_> with Default::default() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/sat.rs crates/aprender-contracts-cli/src/bin/pv-sat/sat.rs:52:16: delete ! in propagate MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/bin/pv-sat/sat.rs crates/aprender-contracts-cli/src/bin/pv-sat/sat.rs:63:5: replace trace with () MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/cli.rs crates/aprender-contracts-cli/src/cli.rs:683:9: replace ReleaseArgs::any -> bool with false MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/cli.rs crates/aprender-contracts-cli/src/cli.rs:683:9: replace ReleaseArgs::any -> bool with true MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/cli.rs crates/aprender-contracts-cli/src/cli.rs:690:13: replace || with && in ReleaseArgs::any MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/cli.rs crates/aprender-contracts-cli/src/cli.rs:691:13: replace || with && in ReleaseArgs::any MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/cli.rs crates/aprender-contracts-cli/src/cli.rs:699:9: replace ReleaseArgs::subject -> Result, String> with Ok(None) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/census.rs crates/aprender-contracts-cli/src/commands/census.rs:285:5: replace by_concept -> BTreeMap with BTreeMap::from_iter([(String::new(), 0)]) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/census.rs crates/aprender-contracts-cli/src/commands/census.rs:285:5: replace by_concept -> BTreeMap with BTreeMap::from_iter([(String::new(), 1)]) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/census.rs crates/aprender-contracts-cli/src/commands/census.rs:285:5: replace by_concept -> BTreeMap with BTreeMap::from_iter([("xyzzy".into(), 0)]) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/census.rs crates/aprender-contracts-cli/src/commands/census.rs:285:5: replace by_concept -> BTreeMap with BTreeMap::from_iter([("xyzzy".into(), 1)]) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/census.rs crates/aprender-contracts-cli/src/commands/census.rs:285:5: replace by_concept -> BTreeMap with BTreeMap::new() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/challenge.rs crates/aprender-contracts-cli/src/commands/challenge.rs:30:5: replace load -> Result with Ok(Default::default()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/challenge.rs crates/aprender-contracts-cli/src/commands/challenge.rs:31:27: replace && with || in load MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/challenge.rs crates/aprender-contracts-cli/src/commands/challenge.rs:43:5: replace report_unrestated -> usize with 0 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/challenge.rs crates/aprender-contracts-cli/src/commands/challenge.rs:43:5: replace report_unrestated -> usize with 1 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/challenge.rs crates/aprender-contracts-cli/src/commands/challenge.rs:74:25: replace + with * in check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/challenge.rs crates/aprender-contracts-cli/src/commands/challenge.rs:74:25: replace + with - in check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/challenge.rs crates/aprender-contracts-cli/src/commands/challenge.rs:75:10: replace > with < in check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/challenge.rs crates/aprender-contracts-cli/src/commands/challenge.rs:75:10: replace > with == in check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/challenge.rs crates/aprender-contracts-cli/src/commands/challenge.rs:75:10: replace > with >= in check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:261:39: replace && with || in lean_steps MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:555:41: replace && with || in self_test MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:589:36: replace + with * in raw_exit MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:589:36: replace + with - in raw_exit MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:589:36: replace + with * in raw_exit MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:589:36: replace + with - in raw_exit MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:664:27: replace match guard e.raw_os_error() == Some(26) with false in Lake<'_>::spawn MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:664:27: replace match guard e.raw_os_error() == Some(26) with false in Lake<'_>::spawn MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:664:27: replace match guard e.raw_os_error() == Some(26) with true in Lake<'_>::spawn MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:664:27: replace match guard e.raw_os_error() == Some(26) with true in Lake<'_>::spawn MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:664:44: replace == with != in Lake<'_>::spawn MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:768:28: replace || with && in sysroot MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/discharge.rs crates/aprender-contracts-cli/src/commands/discharge.rs:809:12: delete ! in recheck MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/extract_rdf.rs crates/aprender-contracts-cli/src/commands/extract_rdf.rs:147:5: replace run_release -> Result<(), Box> with Ok(()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/extract_rdf.rs crates/aprender-contracts-cli/src/commands/extract_rdf.rs:191:5: replace write_cells -> Result<(), Box> with Ok(()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/extract_rdf.rs crates/aprender-contracts-cli/src/commands/extract_rdf.rs:33:5: replace refuse_release_only_args -> Result<(), Box> with Ok(()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/extract_rdf.rs crates/aprender-contracts-cli/src/commands/extract_rdf.rs:59:5: replace run -> Result<(), Box> with Ok(()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/commands/verify_bindings.rs crates/aprender-contracts-cli/src/commands/verify_bindings.rs:229:14: replace == with != in fn_item_name Timeout f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/contract_walk.rs crates/aprender-contracts-cli/src/contract_walk.rs:207:9: replace ::fmt -> fmt::Result with Ok(Default::default()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/contract_walk.rs crates/aprender-contracts-cli/src/contract_walk.rs:223:9: replace ::fmt -> fmt::Result with Ok(Default::default()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/contract_walk.rs crates/aprender-contracts-cli/src/contract_walk.rs:317:9: replace || with && in verdict_for MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts-cli/src/lib.rs crates/aprender-contracts-cli/src/lib.rs:264:43: replace == with != in dispatch MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/kernels/kani_proofs.rs crates/aprender-contracts/src/kernels/kani_proofs.rs:92:10: replace >= with < in stub_sqrt MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/kernels/kani_proofs.rs crates/aprender-contracts/src/kernels/kani_proofs.rs:93:24: replace >= with < in stub_sqrt MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/kernels/kani_proofs.rs crates/aprender-contracts/src/kernels/kani_proofs.rs:93:38: replace && with || in stub_sqrt MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/kernels/kani_proofs.rs crates/aprender-contracts/src/kernels/kani_proofs.rs:93:43: replace <= with > in stub_sqrt MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/bindings_gate.rs crates/aprender-contracts/src/lint/bindings_gate.rs:137:29: replace += with *= in count_allowlisted MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/bindings_gate.rs crates/aprender-contracts/src/lint/bindings_gate.rs:137:29: replace += with -= in count_allowlisted MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/bindings_gate.rs crates/aprender-contracts/src/lint/bindings_gate.rs:232:31: replace += with *= in check_stale_allowlist MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/bindings_gate.rs crates/aprender-contracts/src/lint/bindings_gate.rs:311:9: delete field registries from struct BindingsCounters expression in run_bindings_gate MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/bindings_gate.rs crates/aprender-contracts/src/lint/bindings_gate.rs:314:9: delete field files_parsed from struct BindingsCounters expression in run_bindings_gate MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/capability_cells_gate.rs crates/aprender-contracts/src/lint/capability_cells_gate.rs:116:35: replace && with || in plant_refused MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/capability_cells_gate.rs crates/aprender-contracts/src/lint/capability_cells_gate.rs:148:5: replace findings -> Vec with vec![] MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/capability_cells_gate.rs crates/aprender-contracts/src/lint/capability_cells_gate.rs:92:5: replace plant_refused -> bool with true MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/evidence_gate.rs crates/aprender-contracts/src/lint/evidence_gate.rs:137:26: replace > with < in run_evidence_gate MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/evidence_gate.rs crates/aprender-contracts/src/lint/evidence_gate.rs:217:32: replace == with != in Census::observe MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/evidence_gate.rs crates/aprender-contracts/src/lint/evidence_gate.rs:219:66: replace += with *= in Census::observe MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/evidence_gate.rs crates/aprender-contracts/src/lint/evidence_gate.rs:479:24: replace match guard !shallow with true in resolve_pending MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/evidence_gate.rs crates/aprender-contracts/src/lint/evidence_gate.rs:492:29: replace += with *= in resolve_pending MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/evidence_gate.rs crates/aprender-contracts/src/lint/evidence_gate.rs:492:29: replace += with -= in resolve_pending MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/mod.rs crates/aprender-contracts/src/lint/mod.rs:1365:27: replace && with || in challenge_result MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/mod.rs crates/aprender-contracts/src/lint/mod.rs:1377:35: replace && with || in challenge_result MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/mod.rs crates/aprender-contracts/src/lint/mod.rs:1387:33: replace + with * in challenge_result MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/mod.rs crates/aprender-contracts/src/lint/mod.rs:1387:33: replace + with - in challenge_result MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/ratchet_gates.rs crates/aprender-contracts/src/lint/ratchet_gates.rs:113:26: replace + with * in mentions_module Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/ratchet_gates.rs crates/aprender-contracts/src/lint/ratchet_gates.rs:113:26: replace + with * in mentions_module Timeout f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/ratchet_gates.rs crates/aprender-contracts/src/lint/ratchet_gates.rs:128:22: replace + with * in mentions_module Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/ratchet_gates.rs crates/aprender-contracts/src/lint/ratchet_gates.rs:128:22: replace + with - in mentions_module Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/ratchet_gates.rs crates/aprender-contracts/src/lint/ratchet_gates.rs:128:22: replace + with * in mentions_module Timeout f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/ratchet_gates.rs crates/aprender-contracts/src/lint/ratchet_gates.rs:128:22: replace + with - in mentions_module Timeout f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/ratchet_gates.rs crates/aprender-contracts/src/lint/ratchet_gates.rs:247:31: replace - with + in run_theorem_pairing_gate MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/ratchet_gates.rs crates/aprender-contracts/src/lint/ratchet_gates.rs:247:31: replace - with + in run_theorem_pairing_gate MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/ratchet_gates.rs crates/aprender-contracts/src/lint/ratchet_gates.rs:278:17: replace += with *= in run_depends_on_present_gate MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/ratchet_gates.rs crates/aprender-contracts/src/lint/ratchet_gates.rs:278:17: replace += with *= in run_depends_on_present_gate MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/ratchet_gates.rs crates/aprender-contracts/src/lint/ratchet_gates.rs:72:20: replace match guard !p.as_os_str().is_empty() with true in repo_root MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/refines_gate.rs crates/aprender-contracts/src/lint/refines_gate.rs:181:9: delete field refines_pairs from struct RefinesCounters expression in run_refines_gate MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/lint/shapes_gate.rs crates/aprender-contracts/src/lint/shapes_gate.rs:1016:5: replace subsumption_of -> (usize, Vec) with (0, vec![]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/shapes_gate.rs crates/aprender-contracts/src/lint/shapes_gate.rs:1016:5: replace subsumption_of -> (usize, Vec) with (0, vec![String::new()]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/shapes_gate.rs crates/aprender-contracts/src/lint/shapes_gate.rs:1016:5: replace subsumption_of -> (usize, Vec) with (0, vec!["xyzzy".into()]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/shapes_gate.rs crates/aprender-contracts/src/lint/shapes_gate.rs:1016:5: replace subsumption_of -> (usize, Vec) with (1, vec![]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/shapes_gate.rs crates/aprender-contracts/src/lint/shapes_gate.rs:1016:5: replace subsumption_of -> (usize, Vec) with (1, vec![String::new()]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/shapes_gate.rs crates/aprender-contracts/src/lint/shapes_gate.rs:1016:5: replace subsumption_of -> (usize, Vec) with (1, vec!["xyzzy".into()]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/shapes_gate.rs crates/aprender-contracts/src/lint/shapes_gate.rs:1020:28: replace += with *= in subsumption_of MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/shapes_gate.rs crates/aprender-contracts/src/lint/shapes_gate.rs:1020:28: replace += with -= in subsumption_of MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/shapes_gate.rs crates/aprender-contracts/src/lint/shapes_gate.rs:827:5: replace measured -> super::MeasuredSet with Default::default() MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/shapes_gate.rs crates/aprender-contracts/src/lint/shapes_gate.rs:835:5: replace count_freshness with () MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/shapes_gate.rs crates/aprender-contracts/src/lint/shapes_gate.rs:850:26: replace += with *= in count_freshness MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/shapes_gate.rs crates/aprender-contracts/src/lint/shapes_gate.rs:850:26: replace += with -= in count_freshness MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:31:5: replace concept_of -> Option<&'a str> with None MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:31:5: replace concept_of -> Option<&'a str> with Some("") MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:31:5: replace concept_of -> Option<&'a str> with Some("xyzzy") MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:35:26: replace == with != in concept_of MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:41:5: replace inherited -> (usize, Vec) with (0, vec![]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:41:5: replace inherited -> (usize, Vec) with (0, vec![String::new()]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:41:5: replace inherited -> (usize, Vec) with (0, vec!["xyzzy".into()]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:41:5: replace inherited -> (usize, Vec) with (1, vec![]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:41:5: replace inherited -> (usize, Vec) with (1, vec![String::new()]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:41:5: replace inherited -> (usize, Vec) with (1, vec!["xyzzy".into()]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:49:18: replace > with < in inherited MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:49:18: replace > with == in inherited MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:49:18: replace > with >= in inherited MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/lint/subsumption.rs crates/aprender-contracts/src/lint/subsumption.rs:50:23: replace += with *= in inherited MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:159:5: replace hex_of -> bool with true MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:160:9: replace && with || in hex_of MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:189:29: replace || with && in parse_line MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:189:52: replace || with && in parse_line MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:234:28: replace match guard chars.peek() == Some(&'"') with false in csv_records MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:250:26: replace || with && in csv_records MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:250:29: delete ! in csv_records MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:250:8: delete ! in csv_records MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:277:33: replace && with || in route_key MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:351:31: replace && with || in declared_bins MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:445:22: replace || with && in emit MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:445:39: replace == with != in emit MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:601:9: delete field help_sha256 from struct Target expression in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:602:9: delete field version_sha256 from struct Target expression in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:603:9: delete field commands from struct Target expression in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:628:9: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:629:9: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:630:9: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:631:9: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/binary.rs crates/aprender-contracts/src/ontology/extract/binary.rs:632:9: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:113:29: replace + with * in fences MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:146:21: replace + with * in prose_lines MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:163:16: delete ! in headings MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:163:62: delete ! in headings MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:190:17: replace != with == in closing_run Timeout f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:191:15: replace += with *= in closing_run Timeout f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:198:11: replace += with *= in closing_run Timeout f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:198:11: replace += with -= in closing_run Timeout f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:208:17: replace != with == in line_spans Timeout f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:209:15: replace += with *= in line_spans Timeout f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:256:9: delete match arm serde_yaml::Value::Null in frontmatter MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:294:8: delete ! in normalise MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:328:21: delete ! in drop_comment MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:328:21: replace match guard !sq with false in drop_comment MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:328:21: replace match guard !sq with true in drop_comment MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:329:21: replace match guard !dq with true in drop_comment MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:330:20: delete ! in drop_comment MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:330:20: replace match guard !sq with false in drop_comment MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:330:20: replace match guard !sq with true in drop_comment MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:330:32: delete ! in drop_comment MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:359:21: delete ! in Quotes::step MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:359:21: replace match guard !self.sq with false in Quotes::step MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:359:21: replace match guard !self.sq with true in Quotes::step MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:360:21: replace match guard !self.dq with true in Quotes::step MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:361:20: replace match guard !self.sq with true in Quotes::step MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:493:67: replace && with || in section_selected::glob MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:494:13: delete match arm (Some(b'?'), Some(_)) in section_selected::glob MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:79:10: replace == with != in fence_open MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:79:10: replace == with != in fence_open MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:88:19: replace * with / in fence_close MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/claims.rs crates/aprender-contracts/src/ontology/extract/claims.rs:88:19: replace * with / in fence_close MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:131:42: replace && with || in Command::mode_args MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:154:9: replace ::fmt -> std::fmt::Result with Ok(Default::default()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:307:17: replace += with *= in emit_command MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:319:19: replace += with *= in emit_command MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:331:56: replace += with *= in emit_command MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:332:19: replace == with != in emit_command MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:333:29: replace += with *= in emit_command MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:333:29: replace += with -= in emit_command MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:334:16: delete ! in emit_command MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:335:44: replace += with *= in emit_command MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:335:44: replace += with -= in emit_command MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:348:5: replace emit_arg -> String with String::new() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:348:5: replace emit_arg -> String with "xyzzy".into() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:372:15: replace == with != in emit_arg MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:372:27: replace || with && in emit_arg MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:372:37: replace == with != in emit_arg MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/cli_surface.rs crates/aprender-contracts/src/ontology/extract/cli_surface.rs:387:5: replace positive_control -> bool with true MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/code.rs crates/aprender-contracts/src/ontology/extract/code.rs:1046:9: replace for BodySafety>::visit_expr_unsafe with () Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/code.rs crates/aprender-contracts/src/ontology/extract/code.rs:1226:46: replace == with != in emit MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/code.rs crates/aprender-contracts/src/ontology/extract/code.rs:1267:36: replace += with *= in resolve_all Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/covering.rs crates/aprender-contracts/src/ontology/extract/covering.rs:118:26: replace < with <= in allowed_with MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/covering.rs crates/aprender-contracts/src/ontology/extract/covering.rs:127:5: replace uncovered -> Vec with vec![] MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/covering.rs crates/aprender-contracts/src/ontology/extract/covering.rs:133:82: replace && with || in uncovered MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/csv.rs crates/aprender-contracts/src/ontology/extract/csv.rs:167:44: replace += with *= in extract MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/csv.rs crates/aprender-contracts/src/ontology/extract/csv.rs:180:5: replace positive_control -> bool with true MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/csv.rs crates/aprender-contracts/src/ontology/extract/csv.rs:185:13: replace && with || in positive_control MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:137:5: replace name_ok -> bool with true MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:137:5: replace name_ok -> bool with true MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:138:9: replace && with || in name_ok MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:138:9: replace && with || in name_ok MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:157:9: replace || with && in parse_ref MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:157:9: replace || with && in parse_ref MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:164:9: replace && with || in parse_ref MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:164:9: replace && with || in parse_ref MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:276:15: replace != with == in check_fields MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:276:15: replace != with == in check_fields MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:335:82: replace && with || in extract MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:335:82: replace && with || in extract MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:496:42: replace && with || in insert_edge MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:496:42: replace && with || in insert_edge MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:569:29: replace && with || in refused_saying MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:569:5: replace refused_saying -> bool with true MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:582:34: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:582:61: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:589:17: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:590:17: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:607:17: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:608:17: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:624:34: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:624:56: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:624:64: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:624:87: replace && with || in positive_control MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:76:35: replace && with || in snapshot_types MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:76:35: replace && with || in snapshot_types MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:97:9: replace ::fmt -> std::fmt::Result with Ok(Default::default()) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/json/github.rs crates/aprender-contracts/src/ontology/extract/json/github.rs:97:9: replace ::fmt -> std::fmt::Result with Ok(Default::default()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/kernel.rs crates/aprender-contracts/src/ontology/extract/kernel.rs:335:31: replace match guard p > 0.0 with true in within_timing MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/kernel.rs crates/aprender-contracts/src/ontology/extract/kernel.rs:335:33: replace > with >= in within_timing MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/kernel.rs crates/aprender-contracts/src/ontology/extract/kernel.rs:335:44: replace / with % in within_timing MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/kernel.rs crates/aprender-contracts/src/ontology/extract/kernel.rs:494:5: replace symbol_and_contract -> Result<(), KernelError> with Ok(()) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/kernel.rs crates/aprender-contracts/src/ontology/extract/kernel.rs:512:5: replace emit_witness with () MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/kernel.rs crates/aprender-contracts/src/ontology/extract/kernel.rs:530:8: delete ! in emit_witness MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/kernel.rs crates/aprender-contracts/src/ontology/extract/kernel.rs:537:8: delete ! in emit_witness MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/kernel.rs crates/aprender-contracts/src/ontology/extract/kernel.rs:579:5: replace positive_control -> bool with true MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/kernel.rs crates/aprender-contracts/src/ontology/extract/kernel.rs:591:9: replace && with || in positive_control MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/kernel.rs crates/aprender-contracts/src/ontology/extract/kernel.rs:592:9: replace && with || in positive_control MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/kernel.rs crates/aprender-contracts/src/ontology/extract/kernel.rs:593:9: replace && with || in positive_control MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/llm_context.rs crates/aprender-contracts/src/ontology/extract/llm_context.rs:193:34: replace += with *= in extract MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/llm_context.rs crates/aprender-contracts/src/ontology/extract/llm_context.rs:207:5: replace positive_control -> bool with true MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/llm_context.rs crates/aprender-contracts/src/ontology/extract/llm_context.rs:224:13: replace && with || in positive_control MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/pv_contract.rs crates/aprender-contracts/src/ontology/extract/pv_contract.rs:86:41: replace == with != in extract_one MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/readme.rs crates/aprender-contracts/src/ontology/extract/readme.rs:147:34: replace += with *= in extract MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/readme.rs crates/aprender-contracts/src/ontology/extract/readme.rs:161:5: replace positive_control -> bool with true MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/readme.rs crates/aprender-contracts/src/ontology/extract/readme.rs:178:13: replace && with || in positive_control MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_cells.rs crates/aprender-contracts/src/ontology/extract/release_cells.rs:141:54: replace + with * in forbidden MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_cells.rs crates/aprender-contracts/src/ontology/extract/release_cells.rs:142:58: replace || with && in forbidden MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_cells.rs crates/aprender-contracts/src/ontology/extract/release_cells.rs:306:24: replace == with != in effects MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_cells.rs crates/aprender-contracts/src/ontology/extract/release_cells.rs:310:31: replace == with != in effects MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_cells.rs crates/aprender-contracts/src/ontology/extract/release_cells.rs:356:20: replace != with == in sampling MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_cells.rs crates/aprender-contracts/src/ontology/extract/release_cells.rs:356:5: replace sampling -> Vec with vec![] MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_cells.rs crates/aprender-contracts/src/ontology/extract/release_cells.rs:362:30: replace == with != in sampling MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_cells.rs crates/aprender-contracts/src/ontology/extract/release_cells.rs:362:44: replace && with || in sampling MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_cells.rs crates/aprender-contracts/src/ontology/extract/release_cells.rs:362:74: replace == with != in sampling MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_cells.rs crates/aprender-contracts/src/ontology/extract/release_cells.rs:365:38: replace == with != in sampling MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_cells.rs crates/aprender-contracts/src/ontology/extract/release_cells.rs:365:8: delete ! in sampling MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_cells.rs crates/aprender-contracts/src/ontology/extract/release_cells.rs:395:31: replace == with != in sampling MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1010:46: replace += with *= in count_class MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1010:46: replace += with -= in count_class MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1010:46: replace += with *= in count_class MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1010:46: replace += with -= in count_class MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1010:9: delete match arm "RefusalCell" in count_class MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1010:9: delete match arm "RefusalCell" in count_class MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1011:42: replace += with *= in count_class MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1011:42: replace += with -= in count_class MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1011:42: replace += with *= in count_class MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1011:42: replace += with -= in count_class MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1011:9: delete match arm "ProbeCell" in count_class MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1011:9: delete match arm "ProbeCell" in count_class MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1012:44: replace += with *= in count_class MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1012:44: replace += with *= in count_class MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1012:9: delete match arm "EffectCell" in count_class MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1012:9: delete match arm "EffectCell" in count_class MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1062:5: replace context_met -> bool with true MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1062:5: replace context_met -> bool with true MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1066:30: replace == with != in context_met MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1066:30: replace == with != in context_met MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1107:59: replace || with && in emit_row MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1107:59: replace || with && in emit_row MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1109:53: replace > with < in emit_row MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1109:53: replace > with < in emit_row MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1120:9: delete match arm Some("fresh") in emit_row MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1120:9: delete match arm Some("fresh") in emit_row MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1121:9: delete match arm Some("receipt") in emit_row MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1121:9: delete match arm Some("receipt") in emit_row MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1122:47: replace && with || in emit_row MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1122:47: replace && with || in emit_row MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1122:74: replace == with != in emit_row MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1122:74: replace == with != in emit_row MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1133:5: replace emit_row_detail with () MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1133:5: replace emit_row_detail with () MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1188:5: replace emit_sampling with () MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1188:5: replace emit_sampling with () MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1200:31: replace += with *= in emit_sampling MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1200:31: replace += with -= in emit_sampling MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1200:31: replace += with *= in emit_sampling MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1200:31: replace += with -= in emit_sampling MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1217:29: delete ! in emit_sampling MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1217:29: delete ! in emit_sampling MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1219:16: delete ! in emit_sampling MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1219:16: delete ! in emit_sampling MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1236:5: replace sampling_check -> bool with false MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1236:5: replace sampling_check -> bool with false MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1236:5: replace sampling_check -> bool with true MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1236:5: replace sampling_check -> bool with true MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1241:34: replace != with == in sampling_check MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1241:34: replace != with == in sampling_check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1241:42: replace || with && in sampling_check MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1241:42: replace || with && in sampling_check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1241:50: replace != with == in sampling_check MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1241:50: replace != with == in sampling_check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1241:9: delete match arm "sampledDiffers" in sampling_check MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1241:9: delete match arm "sampledDiffers" in sampling_check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1242:51: replace == with != in sampling_check MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1242:51: replace == with != in sampling_check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1242:9: delete match arm "seedRepeatable" | "greedyAgrees" in sampling_check MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1242:9: delete match arm "seedRepeatable" | "greedyAgrees" in sampling_check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1243:19: replace != with == in sampling_check MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1243:19: replace != with == in sampling_check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1258:5: replace emit_effects with () MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1258:5: replace emit_effects with () MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1269:32: replace += with *= in emit_effects MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1269:32: replace += with -= in emit_effects MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1269:32: replace += with *= in emit_effects MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1269:32: replace += with -= in emit_effects MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1283:18: replace != with == in emit_effects MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:1283:18: replace != with == in emit_effects MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:567:5: replace positive_control -> bool with true MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:924:29: replace match guard !spec.generates with false in class_of MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:924:29: replace match guard !spec.generates with false in class_of MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:982:22: replace != with == in emit_derived MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_evidence.rs crates/aprender-contracts/src/ontology/extract/release_evidence.rs:982:22: replace != with == in emit_derived MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_inputs.rs crates/aprender-contracts/src/ontology/extract/release_inputs.rs:102:9: replace Subject::crux_dir -> PathBuf with Default::default() MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_inputs.rs crates/aprender-contracts/src/ontology/extract/release_inputs.rs:102:9: replace Subject::crux_dir -> PathBuf with Default::default() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/extract/release_inputs.rs crates/aprender-contracts/src/ontology/extract/release_inputs.rs:523:5: replace read_surface_ratchet -> Result, ReleaseError> with Ok(None) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/extract/release_inputs.rs crates/aprender-contracts/src/ontology/extract/release_inputs.rs:523:5: replace read_surface_ratchet -> Result, ReleaseError> with Ok(None) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:480:5: replace variables -> BTreeSet with BTreeSet::from_iter([String::new()]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:480:5: replace variables -> BTreeSet with BTreeSet::from_iter(["xyzzy".into()]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:480:5: replace variables -> BTreeSet with BTreeSet::new() MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:491:5: replace implication_adjacency -> BTreeMap<&str, Vec<&str>> with BTreeMap::from_iter([("", vec![""])]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:491:5: replace implication_adjacency -> BTreeMap<&str, Vec<&str>> with BTreeMap::from_iter([("", vec![])]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:491:5: replace implication_adjacency -> BTreeMap<&str, Vec<&str>> with BTreeMap::from_iter([("", vec!["xyzzy"])]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:491:5: replace implication_adjacency -> BTreeMap<&str, Vec<&str>> with BTreeMap::from_iter([("xyzzy", vec![""])]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:491:5: replace implication_adjacency -> BTreeMap<&str, Vec<&str>> with BTreeMap::from_iter([("xyzzy", vec![])]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:491:5: replace implication_adjacency -> BTreeMap<&str, Vec<&str>> with BTreeMap::from_iter([("xyzzy", vec!["xyzzy"])]) MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:491:5: replace implication_adjacency -> BTreeMap<&str, Vec<&str>> with BTreeMap::new() MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:562:9: replace kani_proofs::cores_of_len with () MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:566:28: replace < with <= in kani_proofs::cores_of_len MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:566:28: replace < with == in kani_proofs::cores_of_len MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:566:28: replace < with > in kani_proofs::cores_of_len MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:570:31: replace < with <= in kani_proofs::cores_of_len MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:570:31: replace < with == in kani_proofs::cores_of_len MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:570:31: replace < with > in kani_proofs::cores_of_len MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:583:9: replace kani_proofs::kani_ont_9_1 with () MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:591:9: replace kani_proofs::kani_ont_9_1_len1 with () MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:599:9: replace kani_proofs::kani_ont_9_1_len2 with () MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:608:9: replace kani_proofs::kani_ont_9_1_model with () MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:610:33: replace < with <= in kani_proofs::kani_ont_9_1_model MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:610:33: replace < with == in kani_proofs::kani_ont_9_1_model MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:610:33: replace < with > in kani_proofs::kani_ont_9_1_model MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness.rs crates/aprender-contracts/src/ontology/witness.rs:618:9: replace kani_proofs::any_graph -> SmallGraph with Default::default() MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/ontology/witness_small.rs crates/aprender-contracts/src/ontology/witness_small.rs:74:46: replace != with == in SmallGraph::satisfied_by MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:509:5: replace step_block_comment -> (usize, usize) with (0, 0) Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:509:5: replace step_block_comment -> (usize, usize) with (0, 1) Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:509:5: replace step_block_comment -> (usize, usize) with (1, 0) Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:509:5: replace step_block_comment -> (usize, usize) with (1, 1) Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:510:12: replace + with - in step_block_comment Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:514:12: replace + with * in step_block_comment Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:514:12: replace + with - in step_block_comment Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:520:24: replace > with < in scan_code_at MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:520:54: replace - with / in scan_code_at MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:523:41: replace + with - in scan_code_at Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:523:45: replace + with * in scan_code_at MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:523:45: replace + with - in scan_code_at MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:530:24: delete ! in scan_code_at MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:536:25: delete ! in scan_code_at MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:542:26: replace + with * in scan_code_at Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:557:22: replace + with * in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:557:22: replace + with - in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:557:55: replace == with != in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:558:18: replace + with * in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:558:18: replace + with - in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:558:22: replace + with * in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:558:22: replace + with - in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:559:20: replace != with == in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:560:33: replace + with * in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:560:33: replace + with - in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:564:26: replace + with * in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:564:26: replace + with - in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:566:25: replace == with != in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:570:20: replace + with * in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:570:20: replace + with - in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:570:24: replace + with * in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:570:24: replace + with - in scan_raw_string Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:571:31: replace + with * in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:571:31: replace + with - in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:571:45: replace + with * in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:571:45: replace + with - in scan_raw_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:576:19: replace + with - in scan_string Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:580:30: replace += with *= in scan_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:580:30: replace += with -= in scan_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:582:26: replace += with *= in scan_string Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:585:28: replace + with * in scan_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:585:28: replace + with - in scan_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:585:38: replace + with * in scan_string MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:585:38: replace + with - in scan_string Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:590:27: replace + with * in skip_char_literal MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:590:27: replace + with - in skip_char_literal MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:590:32: replace == with != in skip_char_literal MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:590:5: replace skip_char_literal -> usize with 0 Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:590:5: replace skip_char_literal -> usize with 1 Timeout c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:591:11: replace + with * in skip_char_literal MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:591:11: replace + with - in skip_char_literal MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-contracts/src/proof_status.rs crates/aprender-contracts/src/proof_status.rs:593:11: replace + with - in skip_char_literal MissedMutant c6799ec04a9d4eb9e618d54ae6d2fd7462045f99 36725778557 +crates/aprender-orchestrate/src/cli/falsify.rs crates/aprender-orchestrate/src/cli/falsify.rs:105:5: replace resolve_project_root_within -> PathBuf with Default::default() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-orchestrate/src/cli/falsify.rs crates/aprender-orchestrate/src/cli/falsify.rs:115:20: replace == with != in resolve_project_root_within MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-orchestrate/src/cli/falsify.rs crates/aprender-orchestrate/src/cli/falsify.rs:97:5: replace resolve_project_root -> PathBuf with Default::default() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-orchestrate/src/cli/viz.rs crates/aprender-orchestrate/src/cli/viz.rs:125:5: replace cmd_viz_dashboard -> anyhow::Result<()> with Ok(()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:411:5: replace parse_panel_type -> Result with Ok(Default::default()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:412:9: delete match arm "cpu" in parse_panel_type MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:413:9: delete match arm "memory" | "mem" in parse_panel_type MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:414:9: delete match arm "disk" in parse_panel_type MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:415:9: delete match arm "network" | "net" in parse_panel_type MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:416:9: delete match arm "process" | "proc" | "processes" in parse_panel_type MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:417:9: delete match arm "gpu" in parse_panel_type MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:418:9: delete match arm "sensors" | "sensor" in parse_panel_type MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:419:9: delete match arm "connections" | "conn" in parse_panel_type MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:420:9: delete match arm "psi" | "pressure" in parse_panel_type MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:421:9: delete match arm "files" | "file" in parse_panel_type MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:422:9: delete match arm "battery" | "bat" in parse_panel_type MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:423:9: delete match arm "containers" | "container" | "docker" in parse_panel_type MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-present-terminal/src/bin/ptop.rs crates/aprender-present-terminal/src/bin/ptop.rs:87:5: replace handle_render_once -> io::Result<()> with Ok(()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/bin/main.rs crates/aprender-ptx-debug/src/bin/main.rs:23:5: replace main with () MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/cli.rs crates/aprender-ptx-debug/src/cli.rs:114:5: replace exit_code_for_parse_error -> i32 with 0 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/cli.rs crates/aprender-ptx-debug/src/cli.rs:114:5: replace exit_code_for_parse_error -> i32 with -1 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/cli.rs crates/aprender-ptx-debug/src/cli.rs:114:5: replace exit_code_for_parse_error -> i32 with 1 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/cli.rs crates/aprender-ptx-debug/src/cli.rs:115:9: delete match arm ErrorKind::DisplayHelp | ErrorKind::DisplayVersion in exit_code_for_parse_error MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:112:25: replace == with != in analyze_ptx_file MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:133:5: replace write_or_print -> Result<(), String> with Ok(()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:144:5: replace cmd_gen_fkr -> Result with Ok(0) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:144:5: replace cmd_gen_fkr -> Result with Ok(-1) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:144:5: replace cmd_gen_fkr -> Result with Ok(1) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:17:5: replace run -> Result with Ok(0) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:17:5: replace run -> Result with Ok(-1) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:17:5: replace run -> Result with Ok(1) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:29:5: replace print_json_report with () MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:44:5: replace print_text_report with () MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:66:5: replace exit_code_for_score -> i32 with 0 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:66:5: replace exit_code_for_score -> i32 with -1 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:66:5: replace exit_code_for_score -> i32 with 1 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:68:21: replace < with <= in exit_code_for_score MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:68:21: replace < with == in exit_code_for_score MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:68:21: replace < with > in exit_code_for_score MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:70:21: replace < with <= in exit_code_for_score MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:70:21: replace < with == in exit_code_for_score MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:70:21: replace < with > in exit_code_for_score MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:78:5: replace cmd_analyze -> Result with Ok(0) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:78:5: replace cmd_analyze -> Result with Ok(-1) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-ptx-debug/src/run.rs crates/aprender-ptx-debug/src/run.rs:78:5: replace cmd_analyze -> Result with Ok(1) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-rag-cli/src/lib.rs crates/aprender-rag-cli/src/lib.rs:527:5: replace dispatch -> Result<()> with Ok(()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:107:5: replace review_paths -> Vec with vec![] MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:107:5: replace review_paths -> Vec with vec![String::new()] MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:107:5: replace review_paths -> Vec with vec!["xyzzy".into()] MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:118:5: replace diff_between -> Option with None MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:118:5: replace diff_between -> Option with Some(String::new()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:118:5: replace diff_between -> Option with Some("xyzzy".into()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:124:20: replace && with || in diff_between MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:124:52: replace <= with > in diff_between MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:124:6: delete ! in diff_between MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:130:5: replace r_candidates -> Vec<(Item, String)> with vec![] MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:131:21: delete ! in r_candidates MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:131:61: replace && with || in r_candidates MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:155:5: replace g_candidates -> Vec<(Item, String)> with vec![] MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:157:42: replace < with <= in g_candidates MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:157:42: replace < with == in g_candidates MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:157:42: replace < with > in g_candidates MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:158:21: delete ! in g_candidates MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:158:45: replace && with || in g_candidates MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:158:48: delete ! in g_candidates MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:159:21: delete ! in g_candidates MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:160:21: delete ! in g_candidates MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:160:53: replace == with != in g_candidates MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:176:5: replace is_green -> bool with false MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:176:5: replace is_green -> bool with true MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:184:26: replace && with || in is_green MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:190:48: replace == with != in rollup_is_green MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:193:71: replace || with && in rollup_is_green MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:228:5: replace choose -> Vec<(Item, String)> with vec![] MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:242:5: replace seal -> Vec with vec![] MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:244:34: replace == with != in seal MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:99:5: replace git -> Option with None MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:99:5: replace git -> Option with Some(String::new()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/build_corpus.rs crates/aprender-review-experiment/src/build_corpus.rs:99:5: replace git -> Option with Some("xyzzy".into()) MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/contamination.rs crates/aprender-review-experiment/src/contamination.rs:101:9: delete match arm serde_json::Value::Array(a) in collect_strings MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/contamination.rs crates/aprender-review-experiment/src/contamination.rs:48:9: replace Index::len -> usize with 0 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/contamination.rs crates/aprender-review-experiment/src/contamination.rs:48:9: replace Index::len -> usize with 1 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/contamination.rs crates/aprender-review-experiment/src/contamination.rs:54:9: replace Index::is_empty -> bool with false MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/corpus.rs crates/aprender-review-experiment/src/corpus.rs:150:36: replace || with && in names_the_mutation MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/corpus.rs crates/aprender-review-experiment/src/corpus.rs:177:18: replace += with *= in defect_locs MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/corpus.rs crates/aprender-review-experiment/src/corpus.rs:177:18: replace += with -= in defect_locs MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/corpus.rs crates/aprender-review-experiment/src/corpus.rs:198:67: replace && with || in is_comment MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/corpus.rs crates/aprender-review-experiment/src/corpus.rs:260:61: replace == with != in assign_splits MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/corpus.rs crates/aprender-review-experiment/src/corpus.rs:289:57: replace || with && in hunks MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/corpus.rs crates/aprender-review-experiment/src/corpus.rs:314:78: delete ! in hunk_fingerprints MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/corpus.rs crates/aprender-review-experiment/src/corpus.rs:400:24: replace < with <= in pick_balanced MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/corpus.rs crates/aprender-review-experiment/src/corpus.rs:400:28: replace && with || in pick_balanced Timeout f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/corpus.rs crates/aprender-review-experiment/src/corpus.rs:400:58: replace > with >= in pick_balanced MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/corpus.rs crates/aprender-review-experiment/src/corpus.rs:402:29: replace < with <= in pick_balanced MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/harness.rs crates/aprender-review-experiment/src/harness.rs:116:44: replace * with + in post MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/harness.rs crates/aprender-review-experiment/src/harness.rs:116:44: replace * with / in post MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/harness.rs crates/aprender-review-experiment/src/harness.rs:159:40: replace && with || in classify MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/harness.rs crates/aprender-review-experiment/src/harness.rs:159:52: replace > with >= in classify MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/harness.rs crates/aprender-review-experiment/src/harness.rs:270:33: replace + with * in rfc3339 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/harness.rs crates/aprender-review-experiment/src/harness.rs:270:33: replace + with - in rfc3339 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/harness.rs crates/aprender-review-experiment/src/harness.rs:270:48: replace - with / in rfc3339 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/harness.rs crates/aprender-review-experiment/src/harness.rs:287:5: replace utc_now -> String with String::new() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/harness.rs crates/aprender-review-experiment/src/harness.rs:287:5: replace utc_now -> String with "xyzzy".into() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/harness.rs crates/aprender-review-experiment/src/harness.rs:42:5: replace request_body -> Value with Default::default() Timeout f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/harness.rs crates/aprender-review-experiment/src/harness.rs:60:31: replace + with * in run_order MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/harness.rs crates/aprender-review-experiment/src/harness.rs:60:31: replace + with - in run_order MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/prereg.rs crates/aprender-review-experiment/src/prereg.rs:101:9: replace Components::render_lock -> String with String::new() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/prereg.rs crates/aprender-review-experiment/src/prereg.rs:101:9: replace Components::render_lock -> String with "xyzzy".into() MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/receipt.rs crates/aprender-review-experiment/src/receipt.rs:183:44: replace && with || in is_hex64 MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/receipt.rs crates/aprender-review-experiment/src/receipt.rs:285:30: replace || with && in execution_problems MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/receipt.rs crates/aprender-review-experiment/src/receipt.rs:316:23: replace match guard !tail.contains("PASS") with true in parse_verdict MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/receipt.rs crates/aprender-review-experiment/src/receipt.rs:330:36: replace - with / in spellings MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:134:30: replace + with * in collect MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:134:30: replace + with - in collect MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:147:26: replace + with * in collect MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:218:45: replace && with || in check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:218:55: replace && with || in check MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:231:45: replace && with || in divergence MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:250:42: replace && with || in paired_parsed MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:252:35: replace == with != in paired_parsed MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:253:35: replace == with != in paired_parsed MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:35:17: replace > with < in Ratio::value MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:35:44: replace / with % in Ratio::value MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:35:44: replace / with * in Ratio::value MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 +crates/aprender-review-experiment/src/score.rs crates/aprender-review-experiment/src/score.rs:35:9: replace Ratio::value -> Option with None MissedMutant f8df3cca6b6c3b51c1475ef54c9ece5e6fec9584 36703131059 diff --git a/scripts/check_mutants_debt_ratchet.sh b/scripts/check_mutants_debt_ratchet.sh new file mode 100644 index 0000000000..4088aeb29f --- /dev/null +++ b/scripts/check_mutants_debt_ratchet.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash +# check_mutants_debt_ratchet.sh -- the mutants gate in RATCHET mode (#4646; operator rulings C187(a)/C188(a), +# 2026-10-01: "new gates are adopted as RATCHETS, never as an instant absolute bar"). +# +# ci/mutants-debt.tsv is the committed baseline of every known surviving mutant. This guard holds it +# SHRINK-ONLY: every row on HEAD must already be a row of the merge base's copy. So: +# - deleting a row (a survivor was killed) -> GREEN +# - adding a row, or swapping one row for another -> RED (a new survivor cannot be ledgered away) +# - a missing/unreadable file, a malformed row, +# a duplicate row, an unresolvable merge base -> RED (never a pass; L25) +# - no copy at the merge base -> GREEN once: the baseline is being introduced +# +# Usage: bash scripts/check_mutants_debt_ratchet.sh (compare HEAD with merge-base(HEAD, $MUTANTS_DEBT_BASE)) +# bash scripts/check_mutants_debt_ratchet.sh --self-test (case table R1-R8 in a scratch repo) +# MUTANTS_DEBT_BASE defaults to origin/main. MUTANTS_DEBT_FILE defaults to ci/mutants-debt.tsv. +set -euo pipefail + +FILE=${MUTANTS_DEBT_FILE:-ci/mutants-debt.tsv} +BASE=${MUTANTS_DEBT_BASE:-origin/main} + +rows() { grep -v '^#' | grep -v '^[[:space:]]*$' || true; } + +check_rows() { # stdin = rows; prints each malformed row, returns 1 if any + awk -F'\t' ' + NF != 5 { print " malformed (need 5 tab fields): " $0; bad = 1; next } + $3 != "MissedMutant" && $3 != "Timeout" { print " bad outcome \"" $3 "\": " $0; bad = 1; next } + $4 !~ /^[0-9a-f]{40}$/ { print " bad sha \"" $4 "\": " $0; bad = 1; next } + $5 !~ /^[0-9]+$/ { print " bad run id \"" $5 "\": " $0; bad = 1; next } + index($2, $1) != 1 { print " mutant does not name its file: " $0; bad = 1; next } + END { exit bad }' +} + +run() { + [ -r "$FILE" ] || { echo "FAIL $FILE missing or unreadable -- the ratchet has no baseline (RED, never a pass)"; return 1; } + local head base mb bad dup added + head=$(rows < "$FILE") + if ! bad=$(check_rows <<<"$head"); then echo "FAIL $FILE has malformed rows:"; echo "$bad"; return 1; fi + dup=$(sort <<<"$head" | uniq -d) + [ -z "$dup" ] || { echo "FAIL $FILE has duplicate rows:"; sed 's/^/ /' <<<"$dup"; return 1; } + mb=$(git merge-base HEAD "$BASE" 2>/dev/null) || { echo "FAIL merge-base(HEAD, $BASE) unresolvable -- NOT_MEASURED is not a pass"; return 1; } + if ! git cat-file -e "$mb:$FILE" 2>/dev/null; then + echo "PASS $FILE introduced: $(grep -c . <<<"$head") row(s), no copy at merge base ${mb:0:10}" + return 0 + fi + base=$(git show "$mb:$FILE" | rows) + added=$(comm -23 <(sort <<<"$head") <(sort <<<"$base")) + if [ -n "$added" ]; then + echo "FAIL $FILE is shrink-only; $(grep -c . <<<"$added") row(s) not in merge base ${mb:0:10}:" + sed 's/^/ + /' <<<"$added" + echo " A new survivor is fixed by a test that kills it, never by adding it to the debt file." + return 1 + fi + echo "PASS $FILE shrink-only: $(grep -c . <<<"$base") -> $(grep -c . <<<"$head") row(s) vs merge base ${mb:0:10}" +} + +self_test() { + local tmp me fails=0 + me=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}") + tmp=$(mktemp -d) + case "$tmp" in /tmp/*|"${TMPDIR:-/tmp}"/*) ;; *) echo "SELF-TEST: refusing scratch dir '$tmp'"; return 1;; esac + trap 'rm -rf -- "${tmp:?}"' RETURN + local sha=0123456789abcdef0123456789abcdef01234567 + local r1="src/a.rs src/a.rs:1:1: replace + with - MissedMutant $sha 1" + local r2="src/b.rs src/b.rs:2:2: replace > with < Timeout $sha 2" + local r3="src/c.rs src/c.rs:3:3: replace && with || MissedMutant $sha 3" + git -C "$tmp" init -q -b main + git -C "$tmp" config user.email t@t; git -C "$tmp" config user.name t; git -C "$tmp" config core.hooksPath /dev/null + mkdir -p "$tmp/ci" + printf '# header\n%s\n%s\n' "$r1" "$r2" > "$tmp/ci/mutants-debt.tsv" + git -C "$tmp" add -A; git -C "$tmp" commit -qm base + git -C "$tmp" branch base + # case [base ref] + # The substring pins WHICH rule decided: a RED for the wrong reason is a FAIL (each rule is mutation-tested). + case_row() { + local id=$1 want=$2 pat=$3 what=$4 content=$5 b=${6:-base} rc=0 out + git -C "$tmp" checkout -q -B "c$id" base + if [ "$content" = __MISSING__ ]; then git -C "$tmp" rm -q ci/mutants-debt.tsv + else printf '%s' "$content" > "$tmp/ci/mutants-debt.tsv"; git -C "$tmp" add -A; fi + git -C "$tmp" commit -qm "case $id" --allow-empty + out=$(cd "$tmp" && MUTANTS_DEBT_BASE=$b bash "$me" 2>&1) || rc=$? + if [ "$rc" -eq "$want" ] && grep -qF -- "$pat" <<<"$out"; then echo "ok $id rc=$rc $what" + else echo "FAIL $id rc=$rc want=$want '$pat' $what"; fails=$((fails + 1)); fi + } + case_row R1 1 "row(s) not in merge base" "a grown debt file is RED" "$(printf '%s\n%s\n%s\n' "$r1" "$r2" "$r3")"$'\n' + case_row R2 1 "missing or unreadable" "a missing debt file is RED, never a pass" __MISSING__ + case_row R3 0 "shrink-only: 2 -> 1" "a shrink is GREEN" "$r1"$'\n' + case_row R4 1 "need 5 tab fields" "a 4-field row is RED" "${r1% *}"$'\n' + case_row R5 1 "row(s) not in merge base" "a swap (same count, new row) is RED" "$(printf '%s\n%s\n' "$r1" "$r3")"$'\n' + case_row R6 0 "shrink-only: 2 -> 2" "an unchanged file is GREEN" "$(printf '# header\n%s\n%s\n' "$r1" "$r2")"$'\n' + case_row R7 1 "duplicate rows" "a duplicate row is RED" "$(printf '%s\n%s\n' "$r1" "$r1")"$'\n' + case_row R8 1 "unresolvable" "an unresolvable merge base is RED" "$r1"$'\n' no-such-ref + case_row R9 1 "bad outcome" "a Caught outcome is not debt (RED)" "${r1/MissedMutant/CaughtMutant}"$'\n' + # R10: introduction -- the merge base has no copy + git -C "$tmp" checkout -q --orphan intro; git -C "$tmp" rm -rq --cached . ; rm -rf -- "${tmp:?}/ci" + : > "$tmp/keep"; git -C "$tmp" add keep; git -C "$tmp" commit -qm intro-base; git -C "$tmp" branch intro-base + case_row_intro() { + local rc=0 + mkdir -p "$tmp/ci"; printf '%s\n' "$r1" > "$tmp/ci/mutants-debt.tsv"; git -C "$tmp" add -A; git -C "$tmp" commit -qm intro + (cd "$tmp" && MUTANTS_DEBT_BASE=intro-base bash "$me" >/dev/null 2>&1) || rc=$? + if [ "$rc" -eq 0 ]; then echo "ok R10 rc=0 the first introduction is GREEN"; else echo "FAIL R10 rc=$rc want=0 introduction"; fails=$((fails + 1)); fi + } + case_row_intro + [ "$fails" -eq 0 ] || { echo "SELF-TEST FAILED: $fails case(s)"; return 1; } + echo "SELF-TEST PASSED (10 cases)" +} + +case "${1:-}" in + --self-test) self_test ;; + "") run ;; + *) echo "usage: $0 [--self-test]" >&2; exit 2 ;; +esac From b4331e62dcdfd88c49481277caa12475f9d2cf3b Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 09:16:21 +0200 Subject: [PATCH 02/18] docs(roadmap): PMAT-4646 entry (MUT-RATCHET acceptance criteria for the quorum) Refs #4646 Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- docs/roadmaps/entries/PMAT-4646.yaml | 22 ++++++++++++++++++++++ docs/roadmaps/roadmap.yaml | 22 ++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 docs/roadmaps/entries/PMAT-4646.yaml diff --git a/docs/roadmaps/entries/PMAT-4646.yaml b/docs/roadmaps/entries/PMAT-4646.yaml new file mode 100644 index 0000000000..95fb37b8c3 --- /dev/null +++ b/docs/roadmaps/entries/PMAT-4646.yaml @@ -0,0 +1,22 @@ +- id: PMAT-4646 + github_issue: 4646 + item_type: task + title: 'MUT-RATCHET: mutants gate -> ratchet mode (debt file shrink-only), operator C187/C188' + status: inprogress + priority: critical + assigned_to: aprender-ca + created: 2026-10-01T06:50:00Z + updated: 2026-10-01T07:20:00Z + spec: null + acceptance_criteria: + - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) + - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink or unchanged file; its --self-test passes 10/10 + - The ci gate job reports the mutants and survivor-table results but does not fail on them; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before + - No ruleset change, no timeout raised, no other gate relaxed; the diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only + - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io + phases: [] + subtasks: [] + estimated_effort: null + labels: + - kind:code + notes: 'Operator C187(a)/C188(a), 2026-10-01: ratchet, not a waiver.' diff --git a/docs/roadmaps/roadmap.yaml b/docs/roadmaps/roadmap.yaml index 145d8aedf2..b19ad33479 100644 --- a/docs/roadmaps/roadmap.yaml +++ b/docs/roadmaps/roadmap.yaml @@ -22233,3 +22233,25 @@ roadmap: labels: - kind:code notes: 'Cop ruling 2026-09-29 12:0xZ: P0 main fix, Cargo bump only, PR open by 13:00Z.' +- id: PMAT-4646 + github_issue: 4646 + item_type: task + title: 'MUT-RATCHET: mutants gate -> ratchet mode (debt file shrink-only), operator C187/C188' + status: inprogress + priority: critical + assigned_to: aprender-ca + created: 2026-10-01T06:50:00Z + updated: 2026-10-01T07:20:00Z + spec: null + acceptance_criteria: + - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) + - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink or unchanged file; its --self-test passes 10/10 + - The ci gate job reports the mutants and survivor-table results but does not fail on them; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before + - No ruleset change, no timeout raised, no other gate relaxed; the diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only + - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io + phases: [] + subtasks: [] + estimated_effort: null + labels: + - kind:code + notes: 'Operator C187(a)/C188(a), 2026-10-01: ratchet, not a waiver.' From 6874cbb2a480ba02a448f15ee357f87012fc2728 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 10:14:31 +0200 Subject: [PATCH 03/18] fix(ratchet): base via scripts/lib/resolve_base.sh (CI depth-1 checkout); gate echo names only defined vars check_mutants_debt_ratchet.sh [run] was RED in run 36829781758: merge-base(HEAD, origin/main) is unresolvable on a depth-1 checkout. It now uses resolve_base, the base every differential guard uses, which refuses rather than judge HEAD against HEAD (new case R11, plus R12 for the default origin/main path; 12/12; a fail-open mutant of the new branch is RED). check_workflow_env_defined: the gate echo interpolated IN_SCOPE/SCOPE/TABLE, which main's gate job does not define; dropped. Refs #4646 Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- .github/workflows/ci.yml | 2 +- scripts/check_mutants_debt_ratchet.sh | 32 ++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e5d48060da..954fdbccaf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -456,7 +456,7 @@ jobs: # instant absolute bar. The blocking rule is the shrink-only survivor baseline ci/mutants-debt.tsv # (scripts/check_mutants_debt_ratchet.sh, run by guard-tree, which this gate requires above). # Every check above this line is unchanged. The RESTORE PR deletes this block (re-arms the rules below). - echo "mutants (report-only, ratchet #4646): event=$EVT section=$(res "$X86" mutants) table=${TABLE:-n/a} scope=${SCOPE:-n/a} in_scope=${IN_SCOPE:-n/a}" + echo "mutants (report-only, ratchet #4646): event=$EVT section=$(res "$X86" mutants)" echo "All required sections passed (mutants: ratchet mode, #4646)" exit 0 # --- MUTANTS-RATCHET-END --- diff --git a/scripts/check_mutants_debt_ratchet.sh b/scripts/check_mutants_debt_ratchet.sh index 4088aeb29f..11b5857558 100644 --- a/scripts/check_mutants_debt_ratchet.sh +++ b/scripts/check_mutants_debt_ratchet.sh @@ -11,12 +11,17 @@ # - no copy at the merge base -> GREEN once: the baseline is being introduced # # Usage: bash scripts/check_mutants_debt_ratchet.sh (compare HEAD with merge-base(HEAD, $MUTANTS_DEBT_BASE)) -# bash scripts/check_mutants_debt_ratchet.sh --self-test (case table R1-R8 in a scratch repo) -# MUTANTS_DEBT_BASE defaults to origin/main. MUTANTS_DEBT_FILE defaults to ci/mutants-debt.tsv. +# bash scripts/check_mutants_debt_ratchet.sh --self-test (case table R1-R12 in a scratch repo) +# MUTANTS_DEBT_BASE unset = resolve_base (merge-base with origin/main, or the CI-shape fallbacks); set = merge-base(HEAD, it). MUTANTS_DEBT_FILE defaults to ci/mutants-debt.tsv. set -euo pipefail FILE=${MUTANTS_DEBT_FILE:-ci/mutants-debt.tsv} -BASE=${MUTANTS_DEBT_BASE:-origin/main} +BASE=${MUTANTS_DEBT_BASE:-} +# Default base = scripts/lib/resolve_base.sh, the base every differential guard uses on every CI checkout shape +# (depth-1 pull_request merge commit, merge_group squash head, push to main). It refuses rather than judge HEAD vs HEAD. +REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd); PROG=check_mutants_debt_ratchet +# shellcheck source=scripts/lib/resolve_base.sh +. "$(dirname -- "${BASH_SOURCE[0]}")/lib/resolve_base.sh" || exit 1 rows() { grep -v '^#' | grep -v '^[[:space:]]*$' || true; } @@ -37,7 +42,12 @@ run() { if ! bad=$(check_rows <<<"$head"); then echo "FAIL $FILE has malformed rows:"; echo "$bad"; return 1; fi dup=$(sort <<<"$head" | uniq -d) [ -z "$dup" ] || { echo "FAIL $FILE has duplicate rows:"; sed 's/^/ /' <<<"$dup"; return 1; } - mb=$(git merge-base HEAD "$BASE" 2>/dev/null) || { echo "FAIL merge-base(HEAD, $BASE) unresolvable -- NOT_MEASURED is not a pass"; return 1; } + if [ -n "$BASE" ]; then + mb=$(git merge-base HEAD "$BASE" 2>/dev/null) || { echo "FAIL merge-base(HEAD, $BASE) unresolvable -- NOT_MEASURED is not a pass"; return 1; } + else + resolve_base HEAD 2>&1 || { echo "FAIL base unresolvable (resolve_base) -- NOT_MEASURED is not a pass"; return 1; } + mb=$BASE_REF; echo "base: ${mb:0:10} ($BASE_HOW)" + fi if ! git cat-file -e "$mb:$FILE" 2>/dev/null; then echo "PASS $FILE introduced: $(grep -c . <<<"$head") row(s), no copy at merge base ${mb:0:10}" return 0 @@ -100,8 +110,20 @@ self_test() { if [ "$rc" -eq 0 ]; then echo "ok R10 rc=0 the first introduction is GREEN"; else echo "FAIL R10 rc=$rc want=0 introduction"; fails=$((fails + 1)); fi } case_row_intro + # R11: no explicit base and no origin/main (a branch commit with no nameable base) -> resolve_base refuses -> RED + local rc=0 out + git -C "$tmp" checkout -q -B c11 base; printf '%s\n' "$r1" > "$tmp/ci/mutants-debt.tsv"; git -C "$tmp" add -A; git -C "$tmp" commit -qm c11 + out=$(cd "$tmp" && env -u MUTANTS_DEBT_BASE bash "$me" 2>&1) || rc=$? + if [ "$rc" -eq 1 ] && grep -qF "base unresolvable (resolve_base)" <<<"$out"; then echo "ok R11 rc=1 no nameable base is RED (resolve_base refuses)" + else echo "FAIL R11 rc=$rc want=1 no nameable base"; fails=$((fails + 1)); fi + # R12: default base via origin/main: a grown file vs origin/main is RED + rc=0; git -C "$tmp" update-ref refs/remotes/origin/main base + git -C "$tmp" checkout -q -B c12 base; printf '%s\n%s\n%s\n' "$r1" "$r2" "$r3" > "$tmp/ci/mutants-debt.tsv"; git -C "$tmp" add -A; git -C "$tmp" commit -qm c12 + out=$(cd "$tmp" && env -u MUTANTS_DEBT_BASE bash "$me" 2>&1) || rc=$? + if [ "$rc" -eq 1 ] && grep -qF "row(s) not in merge base" <<<"$out"; then echo "ok R12 rc=1 default base (origin/main via resolve_base): grown file is RED" + else echo "FAIL R12 rc=$rc want=1 default base grown"; fails=$((fails + 1)); fi [ "$fails" -eq 0 ] || { echo "SELF-TEST FAILED: $fails case(s)"; return 1; } - echo "SELF-TEST PASSED (10 cases)" + echo "SELF-TEST PASSED (12 cases)" } case "${1:-}" in From b7008b67b599a8bc8625e1e799dbbe634a916071 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 10:33:07 +0200 Subject: [PATCH 04/18] docs(roadmap): PMAT-4646 entry states the 12-case self-test (R1-R12), per q-4647c finding Pmat-Ticket: PMAT-4646 Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- docs/roadmaps/entries/PMAT-4646.yaml | 2 +- docs/roadmaps/roadmap.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/roadmaps/entries/PMAT-4646.yaml b/docs/roadmaps/entries/PMAT-4646.yaml index 95fb37b8c3..54a0217e65 100644 --- a/docs/roadmaps/entries/PMAT-4646.yaml +++ b/docs/roadmaps/entries/PMAT-4646.yaml @@ -10,7 +10,7 @@ spec: null acceptance_criteria: - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink or unchanged file; its --self-test passes 10/10 + - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink or unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 12/12 (R1-R12) - The ci gate job reports the mutants and survivor-table results but does not fail on them; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - No ruleset change, no timeout raised, no other gate relaxed; the diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io diff --git a/docs/roadmaps/roadmap.yaml b/docs/roadmaps/roadmap.yaml index b19ad33479..e305a75257 100644 --- a/docs/roadmaps/roadmap.yaml +++ b/docs/roadmaps/roadmap.yaml @@ -22245,7 +22245,7 @@ roadmap: spec: null acceptance_criteria: - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink or unchanged file; its --self-test passes 10/10 + - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink or unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 12/12 (R1-R12) - The ci gate job reports the mutants and survivor-table results but does not fail on them; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - No ruleset change, no timeout raised, no other gate relaxed; the diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io From 368f05fbd2c4062fe39444a58ff5653685721a57 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 10:43:49 +0200 Subject: [PATCH 05/18] ci(gate): the ratchet comment says where the baseline lands (#4647) and that the mutants rules are off on purpose until #4648 Quorum lane finding (q-4587c, sonnet): the comment named ci/mutants-debt.tsv and scripts/check_mutants_debt_ratchet.sh as the blocking rule, but on a branch without #4647 neither exists. Same block text in #4647/#4587/#4588 so the three still merge without conflict. No check changed. Pmat-Ticket: PMAT-4646 Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- .github/workflows/ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 954fdbccaf..19f892d27d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -454,8 +454,10 @@ jobs: # --- MUTANTS-RATCHET (#4646; operator C187(a)/C188(a), 2026-10-01) --- # Mutation results are REPORTED here, not blocking: a new gate is adopted as a ratchet, never as an # instant absolute bar. The blocking rule is the shrink-only survivor baseline ci/mutants-debt.tsv - # (scripts/check_mutants_debt_ratchet.sh, run by guard-tree, which this gate requires above). - # Every check above this line is unchanged. The RESTORE PR deletes this block (re-arms the rules below). + # (scripts/check_mutants_debt_ratchet.sh, run by guard-tree, which this gate requires above); both land + # with PR #4647. A branch that carries this block before #4647 merges is report-only for mutants until it does. + # Every check above this line is unchanged. The mutants rules below are unreachable ON PURPOSE (C188: mutants + # off the release path) until RESTORE PR #4648 deletes this block and re-arms them. echo "mutants (report-only, ratchet #4646): event=$EVT section=$(res "$X86" mutants)" echo "All required sections passed (mutants: ratchet mode, #4646)" exit 0 From 3dd28ae0e20f716f9a876e3da3f468b0321e18d3 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 10:52:57 +0200 Subject: [PATCH 06/18] evidence(pr-review): non-author receipt for #4647 at 368f05fbd2 Sonnet seat (agent:claude-sonnet-5-5/pr-4647-review), base 00052c01. Verdict FINDINGS (2 warnings, 5 notes; none blocking): PRREV-RATCHET-001 (new-survivor detection from CI results is follow-up, report-only by C188(a)); bashrs 0 errors. Pmat-Ticket: PMAT-4646 Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- .../findings.sarif | 210 ++++++++++++++++++ .../receipt.intoto.jsonl | 1 + 2 files changed, 211 insertions(+) create mode 100644 evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/findings.sarif create mode 100644 evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/receipt.intoto.jsonl diff --git a/evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/findings.sarif b/evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/findings.sarif new file mode 100644 index 0000000000..2d3ac2ce1d --- /dev/null +++ b/evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/findings.sarif @@ -0,0 +1,210 @@ +{ + "version": "2.1.0", + "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", + "runs": [ + { + "tool": { + "driver": { + "name": "pmat", + "informationUri": "https://github.com/paiml/pmat", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "pmat query \"ratchet shrink-only debt baseline\" --limit 3; scripts/pr_review_duplication_scan.sh --rust-semantic; plus the measured commands in each result" + } + ], + "results": [ + { + "ruleId": "PRREV-RATCHET-001", + "level": "warning", + "message": { + "text": "The ratchet only holds ci/mutants-debt.tsv shrink-only; nothing in this diff compares a PR's mutation results with the file. With the mutants rules made unreachable by the early `exit 0` in the ci / gate block, a PR that adds code with a surviving mutant is neither blocked nor ledgered, and the debt file stays green because nobody has to add a row. The comment block that says 'The blocking rule is the shrink-only survivor baseline' overstates what blocks: it blocks hand-edits of the file, not new survivors. The ticket and the last commit both say the mutants rules are off on purpose until RESTORE PR #4648, so this is a residual-coverage note for the window, not a defect against the stated scope." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": ".github/workflows/ci.yml" + }, + "region": { + "startLine": 456 + } + } + } + ], + "properties": { + "grounding": "asserted", + "rationale": "Reading ci.yml lines 454-464 and scripts/check_mutants_debt_ratchet.sh: the script's only inputs are the debt file at HEAD and at the merge base; no step produces survivors from a run and feeds them to it.", + "failure_scenario": "Between this merge and #4648, a PR adds a function whose mutants all survive. ci / gate prints 'mutants (report-only...)' and exits 0, the debt file is unchanged so guard-tree is green, and the new survivor reaches main with no row and no failure anywhere.", + "precision_class": "advisory" + } + }, + { + "ruleId": "PRREV-ROADMAP-001", + "level": "note", + "message": { + "text": "Acceptance criterion 3 in docs/roadmaps/entries/PMAT-4646.yaml says the gate 'reports the mutants and survivor-table results'. ci / gate reports only the mutants section result; the only occurrence of 'survivor' in ci.yml is the comment on line 456, so there is no survivor-table section to report. The criterion names a section the gate does not have." + }, + "properties": { + "grounding": "measured", + "command": [ + "bash", + "-c", + "grep -n survivor .github/workflows/ci.yml" + ], + "exit_code": 0, + "stdout_sha256": "e9c9ac1ec823dc34fa53bf95a5b8f7efd5cb670475116526436ddcf780c83428", + "failure_scenario": "A reader of the roadmap entry expects a survivor table in the gate output; none exists, so the acceptance criterion cannot be verified as written and #4648 could delete a block that never reported one.", + "precision_class": "advisory" + } + }, + { + "ruleId": "PRREV-SELFTEST-001", + "level": "note", + "message": { + "text": "scripts/check_mutants_debt_ratchet.sh --self-test: 12 cases R1-R12, 'SELF-TEST PASSED (12 cases)', rc 0. The case table covers grown, missing, shrunk, malformed, swapped, unchanged, duplicate, unresolvable-base, bad-outcome, introduction, no-nameable-base and default-base-via-origin/main." + }, + "properties": { + "grounding": "measured", + "command": [ + "bash", + "scripts/check_mutants_debt_ratchet.sh", + "--self-test" + ], + "exit_code": 0, + "stdout_sha256": "0c78c3f5dc835a024fd921cbf5ff27af5ff4062b1a9ab09b2c90af60c52ca1f3", + "failure_scenario": "If a rule in the case table were removed or mis-ordered, a grown or swapped debt file could pass; the table pins each rule's own message so a wrong-reason RED fails.", + "precision_class": "advisory" + } + }, + { + "ruleId": "PRREV-GATE-001", + "level": "note", + "message": { + "text": "scripts/check_ci_gate_mutants_rule.sh (which runs the GATE-MUTANTS-RULE block of ci.yml) still passes with the inserted block, rc 0. Every check above the inserted `exit 0` (workspace-test, guard-tree, guard-cargo, sov.gate, determinism-compare) is unchanged in the diff; the only code after the `exit 0` is the mutants rule and the final echo, so exactly the mutants rule is made unreachable." + }, + "properties": { + "grounding": "measured", + "command": [ + "bash", + "scripts/check_ci_gate_mutants_rule.sh" + ], + "exit_code": 0, + "stdout_sha256": "dfd1a4117dfd9640a0b35d6a173aaf9a6fdc4f21841d8332841976d8da78d932", + "failure_scenario": "An `exit 0` placed above a still-required check would silently disable it; here the gate-rule guard and the diff show only the mutants rule sits below it.", + "precision_class": "advisory" + } + }, + { + "ruleId": "PRREV-WIRING-001", + "level": "note", + "message": { + "text": "scripts/guard_tree.sh --list --no-cargo includes scripts/check_mutants_debt_ratchet.sh (universe is git ls-files 'scripts/check_*.sh'), so the claim in the ci.yml comment that guard-tree runs the ratchet holds, and ci / gate requires guard-tree." + }, + "properties": { + "grounding": "measured", + "command": [ + "bash", + "scripts/guard_tree.sh", + "--list", + "--no-cargo" + ], + "exit_code": 0, + "stdout_sha256": "b4052b53a8b9296633ad6057cf64fd0963244700a3b7d7862127a30e17cf0e33", + "failure_scenario": "A guard script that guard-tree does not discover would never run, and the ratchet would be a file nobody enforces.", + "precision_class": "advisory" + } + } + ] + }, + { + "tool": { + "driver": { + "name": "cargo-mutants", + "informationUri": "https://github.com/paiml/aprender", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "scoped guard mutation: 10 sed mutants of scripts/check_mutants_debt_ratchet.sh vs its --self-test" + } + ], + "results": [ + { + "ruleId": "PRREV-MUT-001", + "level": "note", + "message": { + "text": "10 scoped mutants of scripts/check_mutants_debt_ratchet.sh (a /tmp copy, repo untouched) each run through the script's own --self-test: 10 attempted, 10 killed, 0 survived. The mutants are hand-written sed substitutions on the guard's rules, not a cargo-mutants run; the driver name is the receipt vocabulary slot." + }, + "properties": { + "grounding": "measured", + "command": [ + "bash", + "-c", + "for each of 10 sed mutants: sed scripts/check_mutants_debt_ratchet.sh > /tmp copy; bash copy --self-test" + ], + "exit_code": 0, + "stdout_sha256": "7be8fd0a3d78df17540a70a7cc4e134b70e6fd68d680eed4556518c001df84bd", + "failure_scenario": "A rule the guard states and nothing tests would let a grown or malformed debt file through.", + "precision_class": "advisory" + } + } + ] + }, + { + "tool": { + "driver": { + "name": "antigravity", + "informationUri": "https://github.com/paiml/aprender", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "agy -p --model gemini-3.1-pro-high --output-format json --json-schema .pr-review-schema.json --print-timeout 20m --dangerously-skip-permissions (disposable git-archive tree)" + } + ], + "results": [ + { + "ruleId": "PRREV-AGY-bashrs_lint_violation", + "level": "warning", + "message": { + "text": "scripts/check_mutants_debt_ratchet.sh is not bashrs lint clean. The PR introduces a shell script that fails the `bashrs lint` check (exiting with code 1 and emitting multiple warnings, such as SC2031, SC2198, and REL002). This violates the mandatory user rule requiring all shell scripts to be `bashrs lint` clean, which risks introducing disallowed formatting or shell scripting pitfalls (like temp files leaking on unexpected exit) to the repository." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_mutants_debt_ratchet.sh" + }, + "region": { + "startLine": 1 + } + } + } + ], + "properties": { + "grounding": "measured", + "command": [ + "bashrs", + "lint", + "scripts/check_mutants_debt_ratchet.sh" + ], + "exit_code": 1, + "stdout_sha256": "c7ff57b91964e8dfb450150cb2cfe4ce9c3ebaf9742b0b30bc5bfb532c3a698a", + "failure_scenario": "The PR introduces a shell script that fails the `bashrs lint` check (exiting with code 1 and emitting multiple warnings, such as SC2031, SC2198, and REL002). This violates the mandatory user rule requiring all shell scripts to be `bashrs lint` clean, which risks introducing disallowed formatting or shell scripting pitfalls (like temp files leaking on unexpected exit) to the repository.", + "precision_class": "advisory", + "reverified_by_primary": false, + "note": "measured by agy's process, not re-run by this reviewer; exit_code 1 and the digest (of the finding object as returned) are as reported by agy in its failure_scenario text" + } + } + ] + } + ] +} diff --git a/evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/receipt.intoto.jsonl b/evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/receipt.intoto.jsonl new file mode 100644 index 0000000000..554be3ad42 --- /dev/null +++ b/evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/receipt.intoto.jsonl @@ -0,0 +1 @@ +{"_type":"https://in-toto.io/Statement/v1","subject":[{"name":"git+https://github.com/paiml/aprender","digest":{"sha1":"368f05fbd2c4062fe39444a58ff5653685721a57"}}],"predicateType":"https://paiml.dev/attestations/pr-review/v2","predicate":{"skill_version":"2.1.0","attestation_level":"L1-self","pr":4647,"base_sha":"00052c01284caa74c70b287088a79c6dee2959b9","head_sha":"368f05fbd2c4062fe39444a58ff5653685721a57","author_actor":{"kind":"agent","id":"agent:claude-opus-5-5/aprender-ca"},"reviewer_actor":{"kind":"agent","id":"agent:claude-sonnet-5-5/pr-4647-review"},"review_scope":{"diff_shortstat":"5 files changed, 786 insertions(+)","files":[".github/workflows/ci.yml","ci/mutants-debt.tsv","docs/roadmaps/entries/PMAT-4646.yaml","docs/roadmaps/roadmap.yaml","scripts/check_mutants_debt_ratchet.sh"],"ticket":"PMAT-4646","read_in_full":"check_mutants_debt_ratchet.sh, the ci.yml gate block, PMAT-4646.yaml; ci/mutants-debt.tsv as a parsed table (590 rows, 558 MissedMutant + 32 Timeout, 5 tab fields each), not row by row"},"affected_crates":[],"verdict":"FINDINGS","consultations":{"pmat":{"status":"consulted","transport":"cli","transport_unavailable":[],"mcp_attempted":false,"transport_note":"The pmat CLI answered. The pmat MCP server was not tried in this run (not a claim that it is down).","index_commit":"368f05fbd2c4062fe39444a58ff5653685721a57","index_is_ancestor":true,"index_worktree_dirty":false,"index_worktree_note":"The stale .pmat index was rebuilt in this worktree at HEAD (gitignored). git status showed one untracked file, docs/audits/quorum-PMAT-4646.json; no tracked file was modified.","cache_hits":0,"complexity_delta":[],"tdg_delta":[],"satd_introduced":[],"analysis_note":"The diff adds one shell script and no Rust; complexity/TDG deltas are not computed by pmat for shell and are empty by construction. A TODO/FIXME/HACK/XXX grep over the added script and roadmap entry found none (satd_introduced empty on that basis, not on pmat analyze satd).","duplication_hits":[{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":69,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":89,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":65,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":66,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":132,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":167,"method":"lexical"},{"needle":"mutants-debt.tsv","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"ci/mutants-debt.tsv","line":0,"method":"lexical"},{"needle":"check_mutants_debt_ratchet.sh","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"scripts/check_mutants_debt_ratchet.sh","line":0,"method":"lexical"}],"duplication_coverage":{"rust":"semantic","shell":"lexical","python":"lexical","config":"lexical","docs":"lexical","other":"lexical","sibling_branches":"lexical","merge_base_to_main":"lexical"},"duplication_horizon":["head=368f05fbd2c4062fe39444a58ff5653685721a57","siblings=refs/remotes/origin/* unmerged into origin/main","merge_base_to_main=00052c01284caa74c70b287088a79c6dee2959b9..refs/remotes/origin/main"],"horizon_branches_total":1159,"horizon_branches_scanned":1159,"merge_base_to_main_files":0,"symbols_searched":10,"duplication_note":"8 hits are name collisions on the identifier check_rows in unrelated files (a python script and Rust experiments); none is a re-implementation of the ratchet.","cost":{"wall_seconds":120}},"cuda":{"status":"not-triggered","trigger_reason":"The diff touches ci.yml gate shell, a debt TSV, a bash guard and roadmap YAML: no .cu/.ptx/kernel Rust and no device-behaviour claim."},"crux":{"status":"not-triggered","trigger_reason":"No CLI subcommand, flag, HTTP route, MCP tool or output format of a shipped binary changed, and no comparative performance claim is added; the changes are CI-internal.","surfaces":[],"contracts":[],"comparative_claims":[]},"mutation":{"status":"consulted","scope":"guard","attempted":10,"killed":10,"survivors":[],"note":"Scoped to the one changed guard script. 10 hand-written sed mutants vs its own 12-case --self-test, in a /tmp copy. scripts/mutate-guard.sh covers only check_pr_review_receipt.sh, so no committed mutation set exists for this script; 10/10 is this review's measurement, not a committed-set score."},"antigravity":{"status":"consulted","attempted":1,"agy_version":"agy 1.2.14","binary_path":"/home/noah/.local/bin/agy","model_id":"gemini-3.1-pro-high","model_family":"google/gemini","exit_code":0,"duration_seconds":304.287843159,"agy_status":"SUCCESS","usage":{"input_tokens":191523,"output_tokens":23274,"total_tokens":214797,"thinking_tokens":19878,"cache_read_tokens":2397100},"output_check":{"structured_output_present":true,"reviewed":true,"schema_valid":true},"schema_check":"check-jsonschema --schemafile agy-review-v1.schema.json : ok","response_sha256":"71184e365ed9b53494dee1e3e02b46278d21ffad6dc650cbb78747b551a1f148","reverified_by_primary":false,"divergence":{"agreed":0,"agy_only":1,"primary_only":6,"contradicted":0},"divergence_note":"agy raised one finding (bashrs lint not clean on the new script), which this reviewer did not raise and did not re-run. agy did not raise the coverage-gap warning. No opposing conclusions on any one subject.","findings":[{"id":"bashrs_lint_violation","grounding":"measured","summary":"scripts/check_mutants_debt_ratchet.sh is not bashrs lint clean","failure_scenario":"The PR introduces a shell script that fails the `bashrs lint` check (exiting with code 1 and emitting multiple warnings, such as SC2031, SC2198, and REL002). This violates the mandatory user rule requiring all shell scripts to be `bashrs lint` clean, which risks introducing disallowed formatting or shell scripting pitfalls (like temp files leaking on unexpected exit) to the repository.","file":"scripts/check_mutants_debt_ratchet.sh","line":1,"command":["bashrs","lint","scripts/check_mutants_debt_ratchet.sh"]}]}},"findings_ref":{"path":"findings.sarif","sha256":"d77748926e0cd7cb228436f27162ded21a7168589843793611a843838abee449"},"cost":{"input_tokens":191523,"output_tokens":23274,"wall_seconds":1500,"note":"input/output tokens are the single agy review run (real usage block); this reviewer session tokens are not instrumented. wall_seconds is approximate session wall."}}} From 9c8d426b8a6a8793cbe6cbdfaa1deecbcc3126de Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 11:52:35 +0200 Subject: [PATCH 07/18] fix(ratchet): bashrs-clean guard; roadmap ACs match the diff; new-survivor detection is #4649 q-4647d (3 lanes) findings, all fixed: - scripts/check_mutants_debt_ratchet.sh: bashrs lint 0 warnings (quoted assignments, EXIT trap beside RETURN, false positives tagged); 12/12 self-test. - AC3 named a survivor-table section the gate does not have: now 'the mutants section result'. - AC4 now lists the PR's own review artifacts (evidence/, quorum json). - New-survivor RED (C187) is out of scope here, filed as #4649. Pmat-Ticket: PMAT-4646 Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- docs/roadmaps/entries/PMAT-4646.yaml | 7 ++++--- docs/roadmaps/roadmap.yaml | 7 ++++--- scripts/check_mutants_debt_ratchet.sh | 18 +++++++++--------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/docs/roadmaps/entries/PMAT-4646.yaml b/docs/roadmaps/entries/PMAT-4646.yaml index 54a0217e65..f32f3bee7f 100644 --- a/docs/roadmaps/entries/PMAT-4646.yaml +++ b/docs/roadmaps/entries/PMAT-4646.yaml @@ -6,14 +6,15 @@ priority: critical assigned_to: aprender-ca created: 2026-10-01T06:50:00Z - updated: 2026-10-01T07:20:00Z + updated: 2026-10-01T10:00:00Z spec: null acceptance_criteria: - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink or unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 12/12 (R1-R12) - - The ci gate job reports the mutants and survivor-table results but does not fail on them; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - - No ruleset change, no timeout raised, no other gate relaxed; the diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only + - The ci gate job reports the mutants section result but does not fail on it; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before + - No ruleset change, no timeout raised, no other gate relaxed; the diff is ci.yml (one marked block), the debt file, the guard script, this roadmap entry (+ the regenerated roadmap.yaml), and the PR's own review artifacts (evidence/pr-review/4647/, docs/audits/quorum-PMAT-4646.json) only - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io + - Out of scope, tracked in #4649 - comparing a PR's own mutants survivors with the debt file (a NEW survivor is RED); until then a new survivor is reported, not blocked phases: [] subtasks: [] estimated_effort: null diff --git a/docs/roadmaps/roadmap.yaml b/docs/roadmaps/roadmap.yaml index e305a75257..24a9c51f4c 100644 --- a/docs/roadmaps/roadmap.yaml +++ b/docs/roadmaps/roadmap.yaml @@ -22241,14 +22241,15 @@ roadmap: priority: critical assigned_to: aprender-ca created: 2026-10-01T06:50:00Z - updated: 2026-10-01T07:20:00Z + updated: 2026-10-01T10:00:00Z spec: null acceptance_criteria: - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink or unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 12/12 (R1-R12) - - The ci gate job reports the mutants and survivor-table results but does not fail on them; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - - No ruleset change, no timeout raised, no other gate relaxed; the diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only + - The ci gate job reports the mutants section result but does not fail on it; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before + - No ruleset change, no timeout raised, no other gate relaxed; the diff is ci.yml (one marked block), the debt file, the guard script, this roadmap entry (+ the regenerated roadmap.yaml), and the PR's own review artifacts (evidence/pr-review/4647/, docs/audits/quorum-PMAT-4646.json) only - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io + - Out of scope, tracked in #4649 - comparing a PR's own mutants survivors with the debt file (a NEW survivor is RED); until then a new survivor is reported, not blocked phases: [] subtasks: [] estimated_effort: null diff --git a/scripts/check_mutants_debt_ratchet.sh b/scripts/check_mutants_debt_ratchet.sh index 11b5857558..2f7167e969 100644 --- a/scripts/check_mutants_debt_ratchet.sh +++ b/scripts/check_mutants_debt_ratchet.sh @@ -28,9 +28,9 @@ rows() { grep -v '^#' | grep -v '^[[:space:]]*$' || true; } check_rows() { # stdin = rows; prints each malformed row, returns 1 if any awk -F'\t' ' NF != 5 { print " malformed (need 5 tab fields): " $0; bad = 1; next } - $3 != "MissedMutant" && $3 != "Timeout" { print " bad outcome \"" $3 "\": " $0; bad = 1; next } - $4 !~ /^[0-9a-f]{40}$/ { print " bad sha \"" $4 "\": " $0; bad = 1; next } - $5 !~ /^[0-9]+$/ { print " bad run id \"" $5 "\": " $0; bad = 1; next } + $3 != "MissedMutant" && $3 != "Timeout" { print " bad outcome \"" $3 "\": " $0; bad = 1; next } # bashrs disable-line=BRS0015 (awk program text, not a command) + $4 !~ /^[0-9a-f]{40}$/ { print " bad sha \"" $4 "\": " $0; bad = 1; next } # bashrs disable-line=BRS0015 (awk program text, not a command) + $5 !~ /^[0-9]+$/ { print " bad run id \"" $5 "\": " $0; bad = 1; next } # bashrs disable-line=BRS0015 (awk program text, not a command) index($2, $1) != 1 { print " mutant does not name its file: " $0; bad = 1; next } END { exit bad }' } @@ -46,7 +46,7 @@ run() { mb=$(git merge-base HEAD "$BASE" 2>/dev/null) || { echo "FAIL merge-base(HEAD, $BASE) unresolvable -- NOT_MEASURED is not a pass"; return 1; } else resolve_base HEAD 2>&1 || { echo "FAIL base unresolvable (resolve_base) -- NOT_MEASURED is not a pass"; return 1; } - mb=$BASE_REF; echo "base: ${mb:0:10} ($BASE_HOW)" + mb="$BASE_REF"; echo "base: ${mb:0:10} ($BASE_HOW)" fi if ! git cat-file -e "$mb:$FILE" 2>/dev/null; then echo "PASS $FILE introduced: $(grep -c . <<<"$head") row(s), no copy at merge base ${mb:0:10}" @@ -54,8 +54,8 @@ run() { fi base=$(git show "$mb:$FILE" | rows) added=$(comm -23 <(sort <<<"$head") <(sort <<<"$base")) - if [ -n "$added" ]; then - echo "FAIL $FILE is shrink-only; $(grep -c . <<<"$added") row(s) not in merge base ${mb:0:10}:" + if [ -n "$added" ]; then # bashrs disable-line=SC2031 (added is assigned in this shell; the subshells are the process substitutions) + echo "FAIL $FILE is shrink-only; $(grep -c . <<<"$added") row(s) not in merge base ${mb:0:10}:" # bashrs disable-line=SC2031,SC2091 (echo argument, not an executed command) sed 's/^/ + /' <<<"$added" echo " A new survivor is fixed by a test that kills it, never by adding it to the debt file." return 1 @@ -68,7 +68,7 @@ self_test() { me=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}") tmp=$(mktemp -d) case "$tmp" in /tmp/*|"${TMPDIR:-/tmp}"/*) ;; *) echo "SELF-TEST: refusing scratch dir '$tmp'"; return 1;; esac - trap 'rm -rf -- "${tmp:?}"' RETURN + trap 'rm -rf -- "${tmp:?}"; trap - EXIT' RETURN; trap 'rm -rf -- "${tmp:?}"' EXIT local sha=0123456789abcdef0123456789abcdef01234567 local r1="src/a.rs src/a.rs:1:1: replace + with - MissedMutant $sha 1" local r2="src/b.rs src/b.rs:2:2: replace > with < Timeout $sha 2" @@ -87,7 +87,7 @@ self_test() { if [ "$content" = __MISSING__ ]; then git -C "$tmp" rm -q ci/mutants-debt.tsv else printf '%s' "$content" > "$tmp/ci/mutants-debt.tsv"; git -C "$tmp" add -A; fi git -C "$tmp" commit -qm "case $id" --allow-empty - out=$(cd "$tmp" && MUTANTS_DEBT_BASE=$b bash "$me" 2>&1) || rc=$? + out=$(cd "$tmp" && MUTANTS_DEBT_BASE="$b" bash "$me" 2>&1) || rc=$? if [ "$rc" -eq "$want" ] && grep -qF -- "$pat" <<<"$out"; then echo "ok $id rc=$rc $what" else echo "FAIL $id rc=$rc want=$want '$pat' $what"; fails=$((fails + 1)); fi } @@ -122,7 +122,7 @@ self_test() { out=$(cd "$tmp" && env -u MUTANTS_DEBT_BASE bash "$me" 2>&1) || rc=$? if [ "$rc" -eq 1 ] && grep -qF "row(s) not in merge base" <<<"$out"; then echo "ok R12 rc=1 default base (origin/main via resolve_base): grown file is RED" else echo "FAIL R12 rc=$rc want=1 default base grown"; fails=$((fails + 1)); fi - [ "$fails" -eq 0 ] || { echo "SELF-TEST FAILED: $fails case(s)"; return 1; } + [ "$fails" -eq 0 ] || { echo "SELF-TEST FAILED: $fails case(s)"; return 1; } # bashrs disable-line=SC2198 (fails is a scalar counter, not an array) echo "SELF-TEST PASSED (12 cases)" } From 1f2e3598eab98240fc12ccd3bcffd201348b470f Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 12:03:29 +0200 Subject: [PATCH 08/18] fix(ratchet): drop the stale 368f05fb receipt; AC4 separates the reviewed diff from review outputs q-4647f (gemini, haiku): the in-tree receipt for 368f05fb still carried the pre-fix bashrs finding, so lanes judged the current script by it; and AC4 listed roadmap.yaml and the quorum json, which the quorum brief does not contain. The receipt for this head is committed next; the stale one binds nothing. Pmat-Ticket: PMAT-4646 Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- docs/roadmaps/entries/PMAT-4646.yaml | 2 +- docs/roadmaps/roadmap.yaml | 2 +- .../findings.sarif | 210 ------------------ .../receipt.intoto.jsonl | 1 - 4 files changed, 2 insertions(+), 213 deletions(-) delete mode 100644 evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/findings.sarif delete mode 100644 evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/receipt.intoto.jsonl diff --git a/docs/roadmaps/entries/PMAT-4646.yaml b/docs/roadmaps/entries/PMAT-4646.yaml index f32f3bee7f..f01cdd2834 100644 --- a/docs/roadmaps/entries/PMAT-4646.yaml +++ b/docs/roadmaps/entries/PMAT-4646.yaml @@ -12,7 +12,7 @@ - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink or unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 12/12 (R1-R12) - The ci gate job reports the mutants section result but does not fail on it; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - - No ruleset change, no timeout raised, no other gate relaxed; the diff is ci.yml (one marked block), the debt file, the guard script, this roadmap entry (+ the regenerated roadmap.yaml), and the PR's own review artifacts (evidence/pr-review/4647/, docs/audits/quorum-PMAT-4646.json) only + - No ruleset change, no timeout raised, no other gate relaxed; the reviewed source diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only. The PR also carries the generated docs/roadmaps/roadmap.yaml and, once reviewed, its own receipt under evidence/pr-review/4647/ and its quorum verdict; those are outputs of review, not part of the diff under review - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io - Out of scope, tracked in #4649 - comparing a PR's own mutants survivors with the debt file (a NEW survivor is RED); until then a new survivor is reported, not blocked phases: [] diff --git a/docs/roadmaps/roadmap.yaml b/docs/roadmaps/roadmap.yaml index 24a9c51f4c..2d68bb18e3 100644 --- a/docs/roadmaps/roadmap.yaml +++ b/docs/roadmaps/roadmap.yaml @@ -22247,7 +22247,7 @@ roadmap: - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink or unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 12/12 (R1-R12) - The ci gate job reports the mutants section result but does not fail on it; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - - No ruleset change, no timeout raised, no other gate relaxed; the diff is ci.yml (one marked block), the debt file, the guard script, this roadmap entry (+ the regenerated roadmap.yaml), and the PR's own review artifacts (evidence/pr-review/4647/, docs/audits/quorum-PMAT-4646.json) only + - No ruleset change, no timeout raised, no other gate relaxed; the reviewed source diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only. The PR also carries the generated docs/roadmaps/roadmap.yaml and, once reviewed, its own receipt under evidence/pr-review/4647/ and its quorum verdict; those are outputs of review, not part of the diff under review - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io - Out of scope, tracked in #4649 - comparing a PR's own mutants survivors with the debt file (a NEW survivor is RED); until then a new survivor is reported, not blocked phases: [] diff --git a/evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/findings.sarif b/evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/findings.sarif deleted file mode 100644 index 2d3ac2ce1d..0000000000 --- a/evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/findings.sarif +++ /dev/null @@ -1,210 +0,0 @@ -{ - "version": "2.1.0", - "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", - "runs": [ - { - "tool": { - "driver": { - "name": "pmat", - "informationUri": "https://github.com/paiml/pmat", - "rules": [] - } - }, - "invocations": [ - { - "executionSuccessful": true, - "commandLine": "pmat query \"ratchet shrink-only debt baseline\" --limit 3; scripts/pr_review_duplication_scan.sh --rust-semantic; plus the measured commands in each result" - } - ], - "results": [ - { - "ruleId": "PRREV-RATCHET-001", - "level": "warning", - "message": { - "text": "The ratchet only holds ci/mutants-debt.tsv shrink-only; nothing in this diff compares a PR's mutation results with the file. With the mutants rules made unreachable by the early `exit 0` in the ci / gate block, a PR that adds code with a surviving mutant is neither blocked nor ledgered, and the debt file stays green because nobody has to add a row. The comment block that says 'The blocking rule is the shrink-only survivor baseline' overstates what blocks: it blocks hand-edits of the file, not new survivors. The ticket and the last commit both say the mutants rules are off on purpose until RESTORE PR #4648, so this is a residual-coverage note for the window, not a defect against the stated scope." - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": ".github/workflows/ci.yml" - }, - "region": { - "startLine": 456 - } - } - } - ], - "properties": { - "grounding": "asserted", - "rationale": "Reading ci.yml lines 454-464 and scripts/check_mutants_debt_ratchet.sh: the script's only inputs are the debt file at HEAD and at the merge base; no step produces survivors from a run and feeds them to it.", - "failure_scenario": "Between this merge and #4648, a PR adds a function whose mutants all survive. ci / gate prints 'mutants (report-only...)' and exits 0, the debt file is unchanged so guard-tree is green, and the new survivor reaches main with no row and no failure anywhere.", - "precision_class": "advisory" - } - }, - { - "ruleId": "PRREV-ROADMAP-001", - "level": "note", - "message": { - "text": "Acceptance criterion 3 in docs/roadmaps/entries/PMAT-4646.yaml says the gate 'reports the mutants and survivor-table results'. ci / gate reports only the mutants section result; the only occurrence of 'survivor' in ci.yml is the comment on line 456, so there is no survivor-table section to report. The criterion names a section the gate does not have." - }, - "properties": { - "grounding": "measured", - "command": [ - "bash", - "-c", - "grep -n survivor .github/workflows/ci.yml" - ], - "exit_code": 0, - "stdout_sha256": "e9c9ac1ec823dc34fa53bf95a5b8f7efd5cb670475116526436ddcf780c83428", - "failure_scenario": "A reader of the roadmap entry expects a survivor table in the gate output; none exists, so the acceptance criterion cannot be verified as written and #4648 could delete a block that never reported one.", - "precision_class": "advisory" - } - }, - { - "ruleId": "PRREV-SELFTEST-001", - "level": "note", - "message": { - "text": "scripts/check_mutants_debt_ratchet.sh --self-test: 12 cases R1-R12, 'SELF-TEST PASSED (12 cases)', rc 0. The case table covers grown, missing, shrunk, malformed, swapped, unchanged, duplicate, unresolvable-base, bad-outcome, introduction, no-nameable-base and default-base-via-origin/main." - }, - "properties": { - "grounding": "measured", - "command": [ - "bash", - "scripts/check_mutants_debt_ratchet.sh", - "--self-test" - ], - "exit_code": 0, - "stdout_sha256": "0c78c3f5dc835a024fd921cbf5ff27af5ff4062b1a9ab09b2c90af60c52ca1f3", - "failure_scenario": "If a rule in the case table were removed or mis-ordered, a grown or swapped debt file could pass; the table pins each rule's own message so a wrong-reason RED fails.", - "precision_class": "advisory" - } - }, - { - "ruleId": "PRREV-GATE-001", - "level": "note", - "message": { - "text": "scripts/check_ci_gate_mutants_rule.sh (which runs the GATE-MUTANTS-RULE block of ci.yml) still passes with the inserted block, rc 0. Every check above the inserted `exit 0` (workspace-test, guard-tree, guard-cargo, sov.gate, determinism-compare) is unchanged in the diff; the only code after the `exit 0` is the mutants rule and the final echo, so exactly the mutants rule is made unreachable." - }, - "properties": { - "grounding": "measured", - "command": [ - "bash", - "scripts/check_ci_gate_mutants_rule.sh" - ], - "exit_code": 0, - "stdout_sha256": "dfd1a4117dfd9640a0b35d6a173aaf9a6fdc4f21841d8332841976d8da78d932", - "failure_scenario": "An `exit 0` placed above a still-required check would silently disable it; here the gate-rule guard and the diff show only the mutants rule sits below it.", - "precision_class": "advisory" - } - }, - { - "ruleId": "PRREV-WIRING-001", - "level": "note", - "message": { - "text": "scripts/guard_tree.sh --list --no-cargo includes scripts/check_mutants_debt_ratchet.sh (universe is git ls-files 'scripts/check_*.sh'), so the claim in the ci.yml comment that guard-tree runs the ratchet holds, and ci / gate requires guard-tree." - }, - "properties": { - "grounding": "measured", - "command": [ - "bash", - "scripts/guard_tree.sh", - "--list", - "--no-cargo" - ], - "exit_code": 0, - "stdout_sha256": "b4052b53a8b9296633ad6057cf64fd0963244700a3b7d7862127a30e17cf0e33", - "failure_scenario": "A guard script that guard-tree does not discover would never run, and the ratchet would be a file nobody enforces.", - "precision_class": "advisory" - } - } - ] - }, - { - "tool": { - "driver": { - "name": "cargo-mutants", - "informationUri": "https://github.com/paiml/aprender", - "rules": [] - } - }, - "invocations": [ - { - "executionSuccessful": true, - "commandLine": "scoped guard mutation: 10 sed mutants of scripts/check_mutants_debt_ratchet.sh vs its --self-test" - } - ], - "results": [ - { - "ruleId": "PRREV-MUT-001", - "level": "note", - "message": { - "text": "10 scoped mutants of scripts/check_mutants_debt_ratchet.sh (a /tmp copy, repo untouched) each run through the script's own --self-test: 10 attempted, 10 killed, 0 survived. The mutants are hand-written sed substitutions on the guard's rules, not a cargo-mutants run; the driver name is the receipt vocabulary slot." - }, - "properties": { - "grounding": "measured", - "command": [ - "bash", - "-c", - "for each of 10 sed mutants: sed scripts/check_mutants_debt_ratchet.sh > /tmp copy; bash copy --self-test" - ], - "exit_code": 0, - "stdout_sha256": "7be8fd0a3d78df17540a70a7cc4e134b70e6fd68d680eed4556518c001df84bd", - "failure_scenario": "A rule the guard states and nothing tests would let a grown or malformed debt file through.", - "precision_class": "advisory" - } - } - ] - }, - { - "tool": { - "driver": { - "name": "antigravity", - "informationUri": "https://github.com/paiml/aprender", - "rules": [] - } - }, - "invocations": [ - { - "executionSuccessful": true, - "commandLine": "agy -p --model gemini-3.1-pro-high --output-format json --json-schema .pr-review-schema.json --print-timeout 20m --dangerously-skip-permissions (disposable git-archive tree)" - } - ], - "results": [ - { - "ruleId": "PRREV-AGY-bashrs_lint_violation", - "level": "warning", - "message": { - "text": "scripts/check_mutants_debt_ratchet.sh is not bashrs lint clean. The PR introduces a shell script that fails the `bashrs lint` check (exiting with code 1 and emitting multiple warnings, such as SC2031, SC2198, and REL002). This violates the mandatory user rule requiring all shell scripts to be `bashrs lint` clean, which risks introducing disallowed formatting or shell scripting pitfalls (like temp files leaking on unexpected exit) to the repository." - }, - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "scripts/check_mutants_debt_ratchet.sh" - }, - "region": { - "startLine": 1 - } - } - } - ], - "properties": { - "grounding": "measured", - "command": [ - "bashrs", - "lint", - "scripts/check_mutants_debt_ratchet.sh" - ], - "exit_code": 1, - "stdout_sha256": "c7ff57b91964e8dfb450150cb2cfe4ce9c3ebaf9742b0b30bc5bfb532c3a698a", - "failure_scenario": "The PR introduces a shell script that fails the `bashrs lint` check (exiting with code 1 and emitting multiple warnings, such as SC2031, SC2198, and REL002). This violates the mandatory user rule requiring all shell scripts to be `bashrs lint` clean, which risks introducing disallowed formatting or shell scripting pitfalls (like temp files leaking on unexpected exit) to the repository.", - "precision_class": "advisory", - "reverified_by_primary": false, - "note": "measured by agy's process, not re-run by this reviewer; exit_code 1 and the digest (of the finding object as returned) are as reported by agy in its failure_scenario text" - } - } - ] - } - ] -} diff --git a/evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/receipt.intoto.jsonl b/evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/receipt.intoto.jsonl deleted file mode 100644 index 554be3ad42..0000000000 --- a/evidence/pr-review/4647/368f05fbd2c4062fe39444a58ff5653685721a57/receipt.intoto.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"_type":"https://in-toto.io/Statement/v1","subject":[{"name":"git+https://github.com/paiml/aprender","digest":{"sha1":"368f05fbd2c4062fe39444a58ff5653685721a57"}}],"predicateType":"https://paiml.dev/attestations/pr-review/v2","predicate":{"skill_version":"2.1.0","attestation_level":"L1-self","pr":4647,"base_sha":"00052c01284caa74c70b287088a79c6dee2959b9","head_sha":"368f05fbd2c4062fe39444a58ff5653685721a57","author_actor":{"kind":"agent","id":"agent:claude-opus-5-5/aprender-ca"},"reviewer_actor":{"kind":"agent","id":"agent:claude-sonnet-5-5/pr-4647-review"},"review_scope":{"diff_shortstat":"5 files changed, 786 insertions(+)","files":[".github/workflows/ci.yml","ci/mutants-debt.tsv","docs/roadmaps/entries/PMAT-4646.yaml","docs/roadmaps/roadmap.yaml","scripts/check_mutants_debt_ratchet.sh"],"ticket":"PMAT-4646","read_in_full":"check_mutants_debt_ratchet.sh, the ci.yml gate block, PMAT-4646.yaml; ci/mutants-debt.tsv as a parsed table (590 rows, 558 MissedMutant + 32 Timeout, 5 tab fields each), not row by row"},"affected_crates":[],"verdict":"FINDINGS","consultations":{"pmat":{"status":"consulted","transport":"cli","transport_unavailable":[],"mcp_attempted":false,"transport_note":"The pmat CLI answered. The pmat MCP server was not tried in this run (not a claim that it is down).","index_commit":"368f05fbd2c4062fe39444a58ff5653685721a57","index_is_ancestor":true,"index_worktree_dirty":false,"index_worktree_note":"The stale .pmat index was rebuilt in this worktree at HEAD (gitignored). git status showed one untracked file, docs/audits/quorum-PMAT-4646.json; no tracked file was modified.","cache_hits":0,"complexity_delta":[],"tdg_delta":[],"satd_introduced":[],"analysis_note":"The diff adds one shell script and no Rust; complexity/TDG deltas are not computed by pmat for shell and are empty by construction. A TODO/FIXME/HACK/XXX grep over the added script and roadmap entry found none (satd_introduced empty on that basis, not on pmat analyze satd).","duplication_hits":[{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":69,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":89,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":65,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":66,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":132,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":167,"method":"lexical"},{"needle":"mutants-debt.tsv","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"ci/mutants-debt.tsv","line":0,"method":"lexical"},{"needle":"check_mutants_debt_ratchet.sh","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"scripts/check_mutants_debt_ratchet.sh","line":0,"method":"lexical"}],"duplication_coverage":{"rust":"semantic","shell":"lexical","python":"lexical","config":"lexical","docs":"lexical","other":"lexical","sibling_branches":"lexical","merge_base_to_main":"lexical"},"duplication_horizon":["head=368f05fbd2c4062fe39444a58ff5653685721a57","siblings=refs/remotes/origin/* unmerged into origin/main","merge_base_to_main=00052c01284caa74c70b287088a79c6dee2959b9..refs/remotes/origin/main"],"horizon_branches_total":1159,"horizon_branches_scanned":1159,"merge_base_to_main_files":0,"symbols_searched":10,"duplication_note":"8 hits are name collisions on the identifier check_rows in unrelated files (a python script and Rust experiments); none is a re-implementation of the ratchet.","cost":{"wall_seconds":120}},"cuda":{"status":"not-triggered","trigger_reason":"The diff touches ci.yml gate shell, a debt TSV, a bash guard and roadmap YAML: no .cu/.ptx/kernel Rust and no device-behaviour claim."},"crux":{"status":"not-triggered","trigger_reason":"No CLI subcommand, flag, HTTP route, MCP tool or output format of a shipped binary changed, and no comparative performance claim is added; the changes are CI-internal.","surfaces":[],"contracts":[],"comparative_claims":[]},"mutation":{"status":"consulted","scope":"guard","attempted":10,"killed":10,"survivors":[],"note":"Scoped to the one changed guard script. 10 hand-written sed mutants vs its own 12-case --self-test, in a /tmp copy. scripts/mutate-guard.sh covers only check_pr_review_receipt.sh, so no committed mutation set exists for this script; 10/10 is this review's measurement, not a committed-set score."},"antigravity":{"status":"consulted","attempted":1,"agy_version":"agy 1.2.14","binary_path":"/home/noah/.local/bin/agy","model_id":"gemini-3.1-pro-high","model_family":"google/gemini","exit_code":0,"duration_seconds":304.287843159,"agy_status":"SUCCESS","usage":{"input_tokens":191523,"output_tokens":23274,"total_tokens":214797,"thinking_tokens":19878,"cache_read_tokens":2397100},"output_check":{"structured_output_present":true,"reviewed":true,"schema_valid":true},"schema_check":"check-jsonschema --schemafile agy-review-v1.schema.json : ok","response_sha256":"71184e365ed9b53494dee1e3e02b46278d21ffad6dc650cbb78747b551a1f148","reverified_by_primary":false,"divergence":{"agreed":0,"agy_only":1,"primary_only":6,"contradicted":0},"divergence_note":"agy raised one finding (bashrs lint not clean on the new script), which this reviewer did not raise and did not re-run. agy did not raise the coverage-gap warning. No opposing conclusions on any one subject.","findings":[{"id":"bashrs_lint_violation","grounding":"measured","summary":"scripts/check_mutants_debt_ratchet.sh is not bashrs lint clean","failure_scenario":"The PR introduces a shell script that fails the `bashrs lint` check (exiting with code 1 and emitting multiple warnings, such as SC2031, SC2198, and REL002). This violates the mandatory user rule requiring all shell scripts to be `bashrs lint` clean, which risks introducing disallowed formatting or shell scripting pitfalls (like temp files leaking on unexpected exit) to the repository.","file":"scripts/check_mutants_debt_ratchet.sh","line":1,"command":["bashrs","lint","scripts/check_mutants_debt_ratchet.sh"]}]}},"findings_ref":{"path":"findings.sarif","sha256":"d77748926e0cd7cb228436f27162ded21a7168589843793611a843838abee449"},"cost":{"input_tokens":191523,"output_tokens":23274,"wall_seconds":1500,"note":"input/output tokens are the single agy review run (real usage block); this reviewer session tokens are not instrumented. wall_seconds is approximate session wall."}}} From c735a5fe41f4774037ea18890ae5c7680a521acc Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 12:13:37 +0200 Subject: [PATCH 09/18] evidence(pr-review): non-author receipt for #4647 at 1f2e3598ea Sonnet seat (agent:claude-sonnet-5-5/pr-4647-review), base 00052c01, verdict FINDINGS, none blocking. Quorum q-4647g AGREED 3/3 (committed after the signer). Pmat-Ticket: PMAT-4646 Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- .../findings.sarif | 141 ++++++++++++++++++ .../receipt.intoto.jsonl | 1 + 2 files changed, 142 insertions(+) create mode 100644 evidence/pr-review/4647/1f2e3598eab98240fc12ccd3bcffd201348b470f/findings.sarif create mode 100644 evidence/pr-review/4647/1f2e3598eab98240fc12ccd3bcffd201348b470f/receipt.intoto.jsonl diff --git a/evidence/pr-review/4647/1f2e3598eab98240fc12ccd3bcffd201348b470f/findings.sarif b/evidence/pr-review/4647/1f2e3598eab98240fc12ccd3bcffd201348b470f/findings.sarif new file mode 100644 index 0000000000..e7ecb14bbd --- /dev/null +++ b/evidence/pr-review/4647/1f2e3598eab98240fc12ccd3bcffd201348b470f/findings.sarif @@ -0,0 +1,141 @@ +{ + "version": "2.1.0", + "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", + "runs": [ + { + "tool": { + "driver": { + "name": "pmat", + "informationUri": "https://github.com/paiml/pmat", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "pmat query \"mutants debt ratchet shrink-only baseline\" --limit 5; scripts/pr_review_duplication_scan.sh --rust-semantic; plus the measured commands in each result" + } + ], + "results": [ + { + "ruleId": "PRREV-RATCHET-002", + "level": "warning", + "message": { + "text": "The guard can never reach an empty baseline: a head file with zero data rows (header only, or zero bytes) is reported RED as 'malformed (need 5 tab fields)' because `check_rows <<<\"$head\"` feeds awk one empty line (NF=0). A missing file is RED too (R2). So killing the LAST survivor cannot be committed under this guard, and the self-test has no case for it (R3 shrinks 2 -> 1, never to 0)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_mutants_debt_ratchet.sh" + }, + "region": { + "startLine": 41 + } + } + } + ], + "properties": { + "grounding": "measured", + "command": [ + "bash", + "/tmp/rvprobe.sh" + ], + "exit_code": 0, + "stdout_sha256": "753d2485bb46162471372886951ecbe0daaade8ec968757254ed492ea8efb46b", + "failure_scenario": "Once the debt file is shrunk to its final row and that survivor is killed, the PR that deletes the last row fails guard-tree with 'malformed rows'; the author must edit the guard (or leave a dummy row) to finish the paydown, so the ratchet's goal state is unreachable as written.", + "precision_class": "advisory" + } + }, + { + "ruleId": "PRREV-CI-COMMENT-001", + "level": "note", + "message": { + "text": "ci.yml:456 still says 'The blocking rule is the shrink-only survivor baseline'. The roadmap now states (AC5, #4649) that a NEW survivor is reported, not blocked; what blocks is only hand-edits that grow the debt file. The comment reads as stronger than the mechanism." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": ".github/workflows/ci.yml" + }, + "region": { + "startLine": 456 + } + } + } + ], + "properties": { + "grounding": "asserted", + "rationale": "Reading ci.yml 454-464, the guard script's inputs (debt file at HEAD and merge base only) and PMAT-4646.yaml AC5.", + "failure_scenario": "A maintainer reads the ci.yml comment, believes new mutation survivors are blocked, and does not notice that between this merge and #4648/#4649 they are neither blocked nor ledgered.", + "precision_class": "advisory" + } + } + ] + }, + { + "tool": { + "driver": { + "name": "cargo-mutants", + "informationUri": "https://github.com/paiml/aprender", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "scoped guard mutation: 11 sed mutants of scripts/check_mutants_debt_ratchet.sh vs its --self-test (driver name is the receipt vocabulary slot; not a cargo-mutants run)" + } + ], + "results": [ + { + "ruleId": "PRREV-MUT-002", + "level": "warning", + "message": { + "text": "11 hand-written sed mutants of scripts/check_mutants_debt_ratchet.sh (a /tmp copy; repo untouched), each run through the script's own --self-test: 11 attempted, 8 killed, 3 survived. Survivors are rules the guard states and the 12-case self-test does not exercise: (1) bad-run-id check `$5 !~ /^[0-9]+$/` weakened to accept an empty run id (line 33); (2) `index($2,$1) != 1` weakened to `< 0`, so a mutant that names its file anywhere, not at the start, passes (line 34); (3) `NF != 5` weakened to `NF < 5`, so a 6-field row passes (line 30). Not a committed mutation set: none exists for this script, so this is the reviewer's measurement and is not scored as B3." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_mutants_debt_ratchet.sh" + }, + "region": { + "startLine": 30 + } + } + } + ], + "properties": { + "grounding": "measured", + "command": [ + "bash", + "/tmp/rvmut/run.sh" + ], + "exit_code": 0, + "stdout_sha256": "2a5a0a3a3c59d34f55b0254a848689aee544f4d11fe918b0735405b2b39d2a3b", + "failure_scenario": "A debt row with an empty run id, a 6th field, or a mutant string that only contains its file name mid-string is accepted into ci/mutants-debt.tsv; a later regression that loosens any of these three awk rules passes guard-tree green.", + "precision_class": "advisory" + } + } + ] + }, + { + "tool": { + "driver": { + "name": "antigravity", + "informationUri": "https://github.com/paiml/aprender", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "agy -p --model gemini-3.1-pro-high --output-format json --json-schema .pr-review-schema.json --print-timeout 20m --dangerously-skip-permissions (disposable git-archive tree)" + } + ], + "results": [] + } + ] +} diff --git a/evidence/pr-review/4647/1f2e3598eab98240fc12ccd3bcffd201348b470f/receipt.intoto.jsonl b/evidence/pr-review/4647/1f2e3598eab98240fc12ccd3bcffd201348b470f/receipt.intoto.jsonl new file mode 100644 index 0000000000..b249c220e5 --- /dev/null +++ b/evidence/pr-review/4647/1f2e3598eab98240fc12ccd3bcffd201348b470f/receipt.intoto.jsonl @@ -0,0 +1 @@ +{"_type":"https://in-toto.io/Statement/v1","subject":[{"name":"git+https://github.com/paiml/aprender","digest":{"sha1":"1f2e3598eab98240fc12ccd3bcffd201348b470f"}}],"predicateType":"https://paiml.dev/attestations/pr-review/v2","predicate":{"skill_version":"2.1.0","attestation_level":"L1-self","pr":4647,"base_sha":"00052c01284caa74c70b287088a79c6dee2959b9","head_sha":"1f2e3598eab98240fc12ccd3bcffd201348b470f","author_actor":{"kind":"agent","id":"agent:claude-opus-5-5/aprender-ca"},"reviewer_actor":{"kind":"agent","id":"agent:claude-sonnet-5-5/pr-4647-review"},"review_scope":{"diff_shortstat":"5 files changed, 788 insertions(+)","files":[".github/workflows/ci.yml","ci/mutants-debt.tsv","docs/roadmaps/entries/PMAT-4646.yaml","docs/roadmaps/roadmap.yaml","scripts/check_mutants_debt_ratchet.sh"],"ticket":"PMAT-4646","read_in_full":"check_mutants_debt_ratchet.sh, the ci.yml gate block, PMAT-4646.yaml AC delta vs 368f05fbd2; ci/mutants-debt.tsv as a parsed table, not row by row. Prior receipt for #4647 at 368f05fbd2 was a different head; this review re-ran every measurement at 1f2e3598ea."},"affected_crates":[],"verdict":"FINDINGS","consultations":{"pmat":{"status":"consulted","transport":"cli","transport_unavailable":[],"mcp_attempted":false,"transport_note":"The pmat CLI answered. The pmat MCP server was not tried in this run (not a claim that it is down).","index_commit":"1f2e3598eab98240fc12ccd3bcffd201348b470f","index_is_ancestor":true,"index_worktree_dirty":false,"index_worktree_note":"Index rebuilt in this worktree at HEAD (92339 functions, 47.5s build, 83s query). git status showed one untracked file, docs/audits/quorum-PMAT-4646.prompt.md; no tracked file modified.","cache_hits":0,"complexity_delta":[],"tdg_delta":[],"satd_introduced":[],"analysis_note":"Diff adds one shell script and no Rust; pmat computes no complexity/TDG for shell, so those arrays are empty by construction. A TODO/FIXME/HACK/XXX grep over added lines found none (satd_introduced empty on that basis, not on pmat analyze satd). The one semantic hit, ratchet_finding in aprender-contracts (PV-ONT-016), is a Rust lint over a different artifact, not prior art for this guard.","duplication_hits":[{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":69,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":89,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":65,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":66,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":132,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":167,"method":"lexical"},{"needle":"mutants-debt.tsv","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"ci/mutants-debt.tsv","line":0,"method":"lexical"},{"needle":"check_mutants_debt_ratchet.sh","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"scripts/check_mutants_debt_ratchet.sh","line":0,"method":"lexical"}],"duplication_coverage":{"rust":"semantic","shell":"lexical","python":"lexical","config":"lexical","docs":"lexical","other":"lexical","sibling_branches":"lexical","merge_base_to_main":"lexical"},"duplication_horizon":["head=1f2e3598eab98240fc12ccd3bcffd201348b470f","siblings=refs/remotes/origin/* unmerged into origin/main","merge_base_to_main=00052c01284caa74c70b287088a79c6dee2959b9..refs/remotes/origin/main"],"horizon_branches_total":1159,"horizon_branches_scanned":1159,"merge_base_to_main_files":0,"symbols_searched":10,"duplication_note":"8 hits are name collisions on the identifier check_rows in unrelated files (a python script and Rust experiments); none re-implements the ratchet.","cost":{"wall_seconds":130}},"cuda":{"status":"not-triggered","trigger_reason":"The diff touches ci.yml gate shell, a debt TSV, a bash guard and roadmap YAML: no .cu/.ptx/kernel Rust and no device-behaviour claim. Not evaluated by the guard's --match-path over the five changed paths by eye; none contain cuda/ptx/cublas/fp8/nvrtc."},"crux":{"status":"not-triggered","trigger_reason":"No CLI subcommand, flag, HTTP route, MCP tool or output format of a shipped binary changed, and no comparative performance claim is added; the changes are CI-internal.","surfaces":[],"contracts":[],"comparative_claims":[]},"mutation":{"status":"consulted","scope":"guard","attempted":11,"killed":8,"survivors":[{"mutant":"bad-run-id rule accepts empty run id ($5 !~ /^[0-9]*$/)","file":"scripts/check_mutants_debt_ratchet.sh","line":33,"killed":false},{"mutant":"index($2,$1) != 1 weakened to < 0","file":"scripts/check_mutants_debt_ratchet.sh","line":34,"killed":false},{"mutant":"NF != 5 weakened to NF < 5","file":"scripts/check_mutants_debt_ratchet.sh","line":30,"killed":false}],"note":"Scoped to the one changed guard script: 11 hand-written sed mutants vs its own 12-case --self-test, in a /tmp copy. scripts/mutate-guard.sh covers only check_pr_review_receipt.sh, so no committed mutation set exists for this script; 8/11 is this review's measurement, not a committed-set score. Whether B3 applies to an ad-hoc set is left to the quorum/author."},"antigravity":{"status":"consulted","attempted":1,"agy_version":"agy 1.2.14","binary_path":"/home/noah/.local/bin/agy","model_id":"gemini-3.1-pro-high","model_family":"google/gemini","exit_code":0,"duration_seconds":324.748011777,"agy_status":"SUCCESS","usage":{"input_tokens":167515,"output_tokens":23642,"total_tokens":191157,"thinking_tokens":20059,"cache_read_tokens":2898416},"output_check":{"structured_output_present":true,"reviewed":true,"schema_valid":true},"response_sha256":"5a960f1025f967165c36924ab7d5d5296ece374fd13903513add2f435a48505b","reverified_by_primary":false,"divergence":{"agreed":0,"agy_only":0,"primary_only":3,"contradicted":0},"divergence_note":"agy returned reviewed:true with no findings. It did not raise the empty-baseline RED, the three surviving mutants or the ci.yml comment overclaim. The empty-baseline defect is a measured counterexample to 'no findings'; no opposing conclusion on one subject.","findings":[]}},"findings_ref":{"path":"findings.sarif","sha256":"421e9ade69b6a79fe05c7693db64b513f44e64f20014d9767f505d2fdb2b81a3"},"cost":{"input_tokens":167515,"output_tokens":23642,"wall_seconds":1500,"note":"input/output tokens are the single agy review run; this reviewer session tokens are not instrumented. wall_seconds approximate."}}} From 65d3fb620266e1bf7f80e026201fde16a7e2752f Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 14:44:48 +0200 Subject: [PATCH 10/18] =?UTF-8?q?spec(pp-llama-001):=20re-date=20=C2=A712?= =?UTF-8?q?=20rows=2013,=2015,=2018,=2019,=2021=20to=202026-10-15=20?= =?UTF-8?q?=E2=80=94=20operator=20C197?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit None of the five was discharged by its 2026-09-30 expiry, and the D6 andon (scripts/lib/spec_conformance.py) turned every PR and main RED on 2026-10-01. §12 allows exactly one way to move an expiry: an amendment recording who moved it and why. This is that amendment: - Moved by the operator (Noah), ruling C197. Reason: "not delivered for 0.70; carried to 0.71". - Rows 13, 15, 19 and 21 carry the typed date. Row 18 derives it from row 15. - An Appendix D row records the move. - derived_expiries.json was regenerated with --write; exactly the five rows changed. The andon is unchanged. It passes today, and with SPEC_CONFORMANCE_TODAY=2026-10-16 it is RED again (D6). The release notes carry §12's consequence: "NO SPEED DELIVERED: PP-LLAMA-001 rows 13, 15, 18, 19, 21 (re-dated to 2026-10-15)". Refs #4651. Advance warning before expiry: #4652 (post-0.70). Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- docs/roadmaps/entries/PMAT-4651.yaml | 23 ++++++++++++++++++++++ docs/roadmaps/roadmap.yaml | 23 ++++++++++++++++++++++ docs/specifications/PP-LLAMA-001-MASTER.md | 9 +++++---- evidence/parity/derived_expiries.json | 10 +++++----- 4 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 docs/roadmaps/entries/PMAT-4651.yaml diff --git a/docs/roadmaps/entries/PMAT-4651.yaml b/docs/roadmaps/entries/PMAT-4651.yaml new file mode 100644 index 0000000000..b148c27841 --- /dev/null +++ b/docs/roadmaps/entries/PMAT-4651.yaml @@ -0,0 +1,23 @@ +- id: PMAT-4651 + github_issue: 4651 + item_type: task + title: 'PP-LLAMA-001 §12: re-date rows 13, 15, 18, 19, 21 to 2026-10-15 (operator C197; not delivered for 0.70, carried to 0.71)' + status: inprogress + priority: critical + assigned_to: aprender-ca + created: 2026-10-01T12:45:00Z + updated: 2026-10-01T12:45:00Z + spec: docs/specifications/PP-LLAMA-001-MASTER.md + acceptance_criteria: + - Rows 13, 15, 19 and 21 carry Expires 2026-10-15 (was 2026-09-30) with the operator, ruling and reason in the row; row 18 derives 2026-10-15 from row 15 with no date typed + - An Appendix D row records who moved the expiry (operator Noah, ruling C197) and why ("not delivered for 0.70; carried to 0.71") + - evidence/parity/derived_expiries.json is regenerated by `bash scripts/spec_conformance.sh --write`, and exactly those five rows change + - The D6 andon in scripts/lib/spec_conformance.py is unchanged. `bash scripts/spec_conformance.sh` passes today, and with SPEC_CONFORMANCE_TODAY=2026-10-16 it is RED with D6 for the re-dated rows + - 'The 0.70 release notes carry "NO SPEED DELIVERED: PP-LLAMA-001 rows 13, 15, 18, 19, 21 (re-dated to 2026-10-15)"' + - Out of scope, tracked in #4652 - a 7-day advance warning before any row expires + phases: [] + subtasks: [] + estimated_effort: null + labels: + - kind:docs + notes: 'Operator C197, 2026-10-01 12:40Z: re-date via the spec''s own procedure; check unchanged; not a waiver.' diff --git a/docs/roadmaps/roadmap.yaml b/docs/roadmaps/roadmap.yaml index 2d68bb18e3..a5d1d7bb44 100644 --- a/docs/roadmaps/roadmap.yaml +++ b/docs/roadmaps/roadmap.yaml @@ -22256,3 +22256,26 @@ roadmap: labels: - kind:code notes: 'Operator C187(a)/C188(a), 2026-10-01: ratchet, not a waiver.' +- id: PMAT-4651 + github_issue: 4651 + item_type: task + title: 'PP-LLAMA-001 §12: re-date rows 13, 15, 18, 19, 21 to 2026-10-15 (operator C197; not delivered for 0.70, carried to 0.71)' + status: inprogress + priority: critical + assigned_to: aprender-ca + created: 2026-10-01T12:45:00Z + updated: 2026-10-01T12:45:00Z + spec: docs/specifications/PP-LLAMA-001-MASTER.md + acceptance_criteria: + - Rows 13, 15, 19 and 21 carry Expires 2026-10-15 (was 2026-09-30) with the operator, ruling and reason in the row; row 18 derives 2026-10-15 from row 15 with no date typed + - An Appendix D row records who moved the expiry (operator Noah, ruling C197) and why ("not delivered for 0.70; carried to 0.71") + - evidence/parity/derived_expiries.json is regenerated by `bash scripts/spec_conformance.sh --write`, and exactly those five rows change + - The D6 andon in scripts/lib/spec_conformance.py is unchanged. `bash scripts/spec_conformance.sh` passes today, and with SPEC_CONFORMANCE_TODAY=2026-10-16 it is RED with D6 for the re-dated rows + - 'The 0.70 release notes carry "NO SPEED DELIVERED: PP-LLAMA-001 rows 13, 15, 18, 19, 21 (re-dated to 2026-10-15)"' + - Out of scope, tracked in #4652 - a 7-day advance warning before any row expires + phases: [] + subtasks: [] + estimated_effort: null + labels: + - kind:docs + notes: 'Operator C197, 2026-10-01 12:40Z: re-date via the spec''s own procedure; check unchanged; not a waiver.' diff --git a/docs/specifications/PP-LLAMA-001-MASTER.md b/docs/specifications/PP-LLAMA-001-MASTER.md index 64755b0346..6916d2ab3d 100644 --- a/docs/specifications/PP-LLAMA-001-MASTER.md +++ b/docs/specifications/PP-LLAMA-001-MASTER.md @@ -362,15 +362,15 @@ Every row has an owner. `expires` is a date only on root rows; every other row i | 10 | `check_no_claim_literals.sh` universe widened to `docs/specifications/`; the live uncited figures receipted or baselined with a dated comment; `docs/benchmarking-gate-spec.md` archived; `parity_block.py` thresholds removed | PP-12, PP-33 | perf-gate | — | **LANDED** (this PR) — `claim_unreceipted` / `claim_receipted` | | 11 | `git merge-base --is-ancestor` + three shas in the validator | PP-18 | perf-gate | — | **LANDED** (this PR) — `ancestor_fail` / `ancestor_ok` (the `PERF_GATE_GIT_DIR` seam makes the case table hermetic) | | 12 | perf workflow with `concurrency: perf-`; pin expiry field; client sha field | PP-19, 20, 25 | perf-gate | — | **LANDED** (this PR) in the half that exists: `scripts/check_perf_concurrency_groups.sh` (`isolation_breach` / `isolation_ok`), the pin expiry (row 3) and the client sha. **The CI half for `lambda` and `mini` is `NA{decided_by: infra#359 (lambda has no CI runner by policy), #2841 (mini has no reachable class), date: 2026-09-02}`** — on those hosts the producer of isolation is the harness itself: `scripts/parity_host_receipt.sh` takes an exclusive `flock -n` on the cell lock for the whole run (`:158-176`; a held lock is a REFUSAL, never a queue) and `scripts/perf_isolation.sh` writes the `nvidia-smi --query-compute-apps` record before and after every band (`foreign_pid_breach` / `foreign_pid_ok` in its case table) | -| 13 | `cargo bench` batched Q4_K GEMV at `M ∈ {4,8}` against `M ∈ {16,32}`; then the M=4 kernel | §7.3, §9 #6 | serve | 1 | **OPEN**, unblocked 2026-09-20 when row 1 was discharged. Expires **2026-09-30** (anchor: the 0.69.0 milestone is due 2026-09-23; this row was blocked by row 1 until 2026-09-20, so it gets one full train, not the three days left of the current one. The owner may move this date with a stated basis — it is a deadline, not an estimate.) | +| 13 | `cargo bench` batched Q4_K GEMV at `M ∈ {4,8}` against `M ∈ {16,32}`; then the M=4 kernel | §7.3, §9 #6 | serve | 1 | **OPEN**, unblocked 2026-09-20 when row 1 was discharged. Expires **2026-10-15** (was 2026-09-30) (anchor: the 0.69.0 milestone is due 2026-09-23; this row was blocked by row 1 until 2026-09-20, so it gets one full train, not the three days left of the current one. The owner may move this date with a stated basis — it is a deadline, not an estimate.) Re-dated by the operator (Noah) 2026-10-01, ruling C197: not delivered for 0.70; carried to 0.71. #4651. | | 14 | `scripts/measure_bandwidth.sh` per host, committed | PP-23 | perf-gate | — | **LANDED** (this PR) — `evidence/bandwidth/lambda.json`; `roofline_exceeded` / `roofline_aggregate_ok`. Hosts other than `lambda` stay `UNMEASURED{owner: perf-gate}` until their file lands | -| 15 | **gx10 shakedown cell**, W1, `n >= 5` interleaved, at a commit containing 0b, 0c, 1, 6, 7 → a new LEDGER row | first conformant receipt | perf-gate | 0b, 0c, 1, 6, 7, 12 | **OPEN**, unblocked 2026-09-20 when row 1 was discharged. Expires **2026-09-30** (anchor: the 0.69.0 milestone is due 2026-09-23; this row was blocked by row 1 until 2026-09-20, so it gets one full train, not the three days left of the current one. The owner may move this date with a stated basis — it is a deadline, not an estimate.) | +| 15 | **gx10 shakedown cell**, W1, `n >= 5` interleaved, at a commit containing 0b, 0c, 1, 6, 7 → a new LEDGER row | first conformant receipt | perf-gate | 0b, 0c, 1, 6, 7, 12 | **OPEN**, unblocked 2026-09-20 when row 1 was discharged. Expires **2026-10-15** (was 2026-09-30) (anchor: the 0.69.0 milestone is due 2026-09-23; this row was blocked by row 1 until 2026-09-20, so it gets one full train, not the three days left of the current one. The owner may move this date with a stated basis — it is a deadline, not an estimate.) Re-dated by the operator (Noah) 2026-10-01, ruling C197: not delivered for 0.70; carried to 0.71. #4651. | | 16 | W3 open-loop workload | P-8 | perf-gate | 0b | **OPEN**, 2026-10-23 | | 17 | W4 token sweep | §9 #1 decomposition on lambda | perf-gate | 0b | **OPEN**, 2026-10-23 | | **18** | **reference cell**, lambda, W1, `n >= 5` interleaved, both lanes, derived ladder, one commit; `armed_by` set for every band that PASSES; document → `ARMED` | §7.5; §9 #3, #4 sized conformantly | perf-gate | 15 clean at `--phase merge` | **OPEN**, unblocked when row 1 was discharged. Expiry **derived from row 15**, not typed here: §12's preamble makes `expires` a date only on ROOT rows, 15 is still live, and D3 refuses a blocked row carrying ANY date literal — `status / expires` is ONE column, so a narrated date is indistinguishable from a declared one and this cell therefore states none. The intent behind the date that stood here — this row cannot start until 15 is clean at `--phase merge`, and dating it the same day as its own blocker would guarantee the andon fires on work that was never startable — belongs on row 15's date when 15 is discharged, or as a typed expiry here at that moment. The owner may set it then with a stated basis. | -| **19** | **speed**: §9 #5 (per-token host work) — registered prediction at most 3.5 ms per token | throughput on the gated cell | serve | 1, 6 | **OPEN**, unblocked 2026-09-20 when row 1 was discharged. Expires **2026-09-30** (anchor: the 0.69.0 milestone is due 2026-09-23; this row was blocked by row 1 until 2026-09-20, so it gets one full train, not the three days left of the current one. The owner may move this date with a stated basis — it is a deadline, not an estimate.) | +| **19** | **speed**: §9 #5 (per-token host work) — registered prediction at most 3.5 ms per token | throughput on the gated cell | serve | 1, 6 | **OPEN**, unblocked 2026-09-20 when row 1 was discharged. Expires **2026-10-15** (was 2026-09-30) (anchor: the 0.69.0 milestone is due 2026-09-23; this row was blocked by row 1 until 2026-09-20, so it gets one full train, not the three days left of the current one. The owner may move this date with a stated basis — it is a deadline, not an estimate.) Re-dated by the operator (Noah) 2026-10-01, ruling C197: not delivered for 0.70; carried to 0.71. #4651. | | **20** | **speed**: §9 #3 (prefill sync copies and allocs) — registered prediction under 10% API share | throughput on the gated cell, at the gated c=1 metric | serve | — | **OPEN**, **2026-10-23** | -| **21** | **speed**: §9 #1 KV-scatter root cause on Blackwell | gx10 c=1 fixed cost 16.75 s → under 1 s, conditional on row 2 showing the cost exists on the streaming transport | serve | 2 | **OPEN**, 2026-09-30 — dated here because row 2 was discharged and nothing derives this row's expiry any more (D2). Basis: it was blocked until 2026-09-20 and this is one full train past the 0.69.0 cut, matching rows 13/15/19. The owner may move it with a stated basis. **Row 2's condition is now MET**: the cost exists on the streaming transport and is linear at 9.042 ms/token (r² 0.999947, n=15, gx10 cc 121) — and `BATCHED_PREFILL=1` already reaches **0.099 s** at ~512 tokens, i.e. this row's "under 1 s" target is reachable on that path today; what remains is the KV-scatter root cause on the DEFAULT path. See `docs/audits/impl-PMAT-3556-receipt.md` | +| **21** | **speed**: §9 #1 KV-scatter root cause on Blackwell | gx10 c=1 fixed cost 16.75 s → under 1 s, conditional on row 2 showing the cost exists on the streaming transport | serve | 2 | **OPEN**, 2026-10-15 (was 2026-09-30) — dated here because row 2 was discharged and nothing derives this row's expiry any more (D2). Basis: it was blocked until 2026-09-20 and this is one full train past the 0.69.0 cut, matching rows 13/15/19. The owner may move it with a stated basis. **Row 2's condition is now MET**: the cost exists on the streaming transport and is linear at 9.042 ms/token (r² 0.999947, n=15, gx10 cc 121) — and `BATCHED_PREFILL=1` already reaches **0.099 s** at ~512 tokens, i.e. this row's "under 1 s" target is reachable on that path today; what remains is the KV-scatter root cause on the DEFAULT path. See `docs/audits/impl-PMAT-3556-receipt.md` Re-dated by the operator (Noah) 2026-10-01, ruling C197: not delivered for 0.70; carried to 0.71. #4651. | | **22** | **instrument**: a top-2 logit margin per generated token on the wire (`logprobs` on the SSE delta, both engines), so the witness can classify an `m=1`↔`m=c` divergence as a near-tie flip (margin below a declared τ at the divergence index) or a defect; PP-26 (c) then becomes a gate | PP-26 (c); the residual that (a)+(b) cannot see — a whole batch that is coherent and identically wrong | serve | — | **OPEN.** Root row. Why it exists: `GET /v1/chat/completions` answers `logprobs: null` (`realize_handlers_completion_request.rs`), so the divergence lambda measured (`evidence/perf041/lambda/m1-vs-m4-three-prompts.txt`) can be read by a person but not classified by the witness. Expires **2026-10-15** | Rows 19–21 are the deliverable. A version of this table with no speed row is a defect of the table. @@ -443,6 +443,7 @@ Append-only. PP-9 binds on `RECORDED`. Rows entered under the pre-v3 eleven-colu | 3.0.25 | 2026-09-02 | Citations re-verified against the tree after the code landed: §3/§4.3/§9 #7/Appendix A name the endpoint's `vram.*` keys (no `vram_peak` key exists); §9 #8 marked FIXED; §9 #1/#1a, §2.3 and §12 row 1 cite `gpu_profile.rs::select_prefill_path` / `multi_prompt_prefill_allowed`; §9 #3/#4 cite the decode and prefill lines of `findings.json`; §6 PP-6 and §12 row 0a name `run_phased`/`arm_phase`/`arm_l3_parity`/`arm_a_self_regression`; §7.1 ci.yml anchors by grep; §10's `FUSED_GATE_UP` read and refusal lines; §6 PP-12's surviving exclusions; §12 row 12 cites the `flock` that now exists; §6 PP-19 gains the foreign-PID surface | review of this PR | | 3.1 | 2026-09-03 | PP-9's live scan read the ledger's first pipe table only; a blank line after row 4 left rows 5 and 6 outside it, and a re-spend of row 6 as row 7 passed `spec_conformance.sh`. L2 now refuses every ledger row outside the table it reads: any pipe line after the first table, to the end of the file, with a cell that starts with `RECORDED` or `CONFORMANT` (the tiers PP-9 binds on, read through the same normalisation as every other cell) — the row's id is reported, never required, and no width, leading-pipe, run, header or heading condition stands between such a row and the rule, because four review rounds on #2861 each removed one an author could satisfy; `RECORDED` and `CONFORMANT` are therefore reserved words wherever they start a cell in `LEDGER.md`. Rows found by L2 also enter the L1 spend check, which dedupes every row that claims a tier and reads every key cell through the one normaliser (code tags, format characters, no-break spaces, whitespace runs and wrapping emphasis off; casefolded), because a formatting habit must not make a second run new — a key disguised past that is a forged row the diff shows. L3 refuses a first-table row whose cell count differs from the header's; L0 refuses a first table that is not the ledger. The ledger is re-joined; twenty-nine cases are named beside PP-9's and scripts/mutate_spec_conformance.sh kills 15 of 15 over a green baseline, a crash counted as unviable (PMAT-930, PMAT-931, PMAT-932, PMAT-933, PMAT-934, PMAT-935) | | 3.1 | 2026-09-15 | `scripts/llama_pin.toml` re-pinned `39173bcac` (2026-01-15) → `d1d3c3396` (2026-09-15), `pinned_on` 2026-09-15; `pin_expiry` unchanged. The old pin predates upstream Qwen3.5 support (`fc0fe4004`, 2026-02-10): `grep -c qwen35 src/llama-arch.cpp` is 0 at the old pin and 2 at the new one, and a CPU build on `intel` at `d1d3c3396` loads `Qwen3.5-0.8B-Q4_K_M.gguf` (`general.architecture str = qwen35`) and emits a token, rc 0. `GET /props` re-read at both argvs (`evidence/parity/props-d1d3c3396-{template,np16}.json`: `total_slots` 4 / 16, `n_ctx` 4096 / 1024, unchanged). The row-0a comparator lane re-measured at both pins side by side is `LEDGER.md` row 12. PP-20: every ratio against `39173bcac` is incomparable with one against `d1d3c3396`. | the 0.68 Qwen3.5 scope (#3329) had no comparator at the old pin | PMAT-3329 | +| 3.1 | 2026-10-01 | §12 rows 13, 15, 19 and 21 re-dated **2026-09-30 → 2026-10-15**; row 18 follows, because its date is derived from row 15 and none is typed. **Moved by: the operator (Noah), ruling C197.** None of the five was discharged by its expiry, and on 2026-10-01 the D6 andon turned every PR and main RED. The andon itself is unchanged: with `SPEC_CONFORMANCE_TODAY=2026-10-16` it is RED again for these rows. §12's on-expiry consequence is carried, not waived: the 0.70 release notes say `NO SPEED DELIVERED: PP-LLAMA-001 rows 13, 15, 18, 19, 21 (re-dated to 2026-10-15)`. `evidence/parity/derived_expiries.json` was regenerated with `--write`; exactly these five rows changed. | not delivered for 0.70; carried to 0.71 | #4651 (advance warning before expiry: #4652) | ## Appendix E — Landing a rule, and what to run before pushing diff --git a/evidence/parity/derived_expiries.json b/evidence/parity/derived_expiries.json index d998c6af85..00e1a4fd99 100644 --- a/evidence/parity/derived_expiries.json +++ b/evidence/parity/derived_expiries.json @@ -69,7 +69,7 @@ ], "derived_from": [], "discharged": false, - "expires": "2026-09-30", + "expires": "2026-10-15", "root": false }, "14": { @@ -90,7 +90,7 @@ ], "derived_from": [], "discharged": false, - "expires": "2026-09-30", + "expires": "2026-10-15", "root": false }, "16": { @@ -119,7 +119,7 @@ "15" ], "discharged": false, - "expires": "2026-09-30", + "expires": "2026-10-15", "root": false }, "19": { @@ -129,7 +129,7 @@ ], "derived_from": [], "discharged": false, - "expires": "2026-09-30", + "expires": "2026-10-15", "root": false }, "2": { @@ -152,7 +152,7 @@ ], "derived_from": [], "discharged": false, - "expires": "2026-09-30", + "expires": "2026-10-15", "root": false }, "22": { From a683b4a5283ed971fd6de1836783ab4246310e21 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 15:31:17 +0200 Subject: [PATCH 11/18] =?UTF-8?q?fix(ratchet):=20a=20debt=20file=20shrunk?= =?UTF-8?q?=20to=20zero=20rows=20read=20as=20malformed=20=E2=80=94=20the?= =?UTF-8?q?=20ratchet=20could=20never=20reach=20clean?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Quorum on 65d3fb6202 (lanes claude-sonnet-5 + gemini-3.1-pro, independently): check_rows fed awk `<<<""` when the debt file had only its header, so the single empty line hit `NF != 5` and the guard went RED on the final shrink. PMAT-4646 requires GREEN on a shrink. - awk skips NF == 0 (rows() already strips blank lines, so no real row is empty) - self-test R13: header-only file vs a 2-row base is GREEN "2 -> 0". RED before the fix (rc=1), GREEN after; deleting the NF==0 line reds R13 only. - PMAT-4646 AC: 13/13 (R1-R13). - Non-author receipt for 65d3fb6202 (verdict FINDINGS) committed as evidence. Refs #4646 Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- docs/roadmaps/entries/PMAT-4646.yaml | 2 +- docs/roadmaps/roadmap.yaml | 2 +- .../findings.sarif | 136 ++++++++++++++++++ .../receipt.intoto.jsonl | 1 + scripts/check_mutants_debt_ratchet.sh | 6 +- 5 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 evidence/pr-review/4647/65d3fb620266e1bf7f80e026201fde16a7e2752f/findings.sarif create mode 100644 evidence/pr-review/4647/65d3fb620266e1bf7f80e026201fde16a7e2752f/receipt.intoto.jsonl diff --git a/docs/roadmaps/entries/PMAT-4646.yaml b/docs/roadmaps/entries/PMAT-4646.yaml index f01cdd2834..11948293bd 100644 --- a/docs/roadmaps/entries/PMAT-4646.yaml +++ b/docs/roadmaps/entries/PMAT-4646.yaml @@ -10,7 +10,7 @@ spec: null acceptance_criteria: - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink or unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 12/12 (R1-R12) + - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink, a shrink to zero rows, or an unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 13/13 (R1-R13) - The ci gate job reports the mutants section result but does not fail on it; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - No ruleset change, no timeout raised, no other gate relaxed; the reviewed source diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only. The PR also carries the generated docs/roadmaps/roadmap.yaml and, once reviewed, its own receipt under evidence/pr-review/4647/ and its quorum verdict; those are outputs of review, not part of the diff under review - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io diff --git a/docs/roadmaps/roadmap.yaml b/docs/roadmaps/roadmap.yaml index a5d1d7bb44..0916935da7 100644 --- a/docs/roadmaps/roadmap.yaml +++ b/docs/roadmaps/roadmap.yaml @@ -22245,7 +22245,7 @@ roadmap: spec: null acceptance_criteria: - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink or unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 12/12 (R1-R12) + - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink, a shrink to zero rows, or an unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 13/13 (R1-R13) - The ci gate job reports the mutants section result but does not fail on it; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - No ruleset change, no timeout raised, no other gate relaxed; the reviewed source diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only. The PR also carries the generated docs/roadmaps/roadmap.yaml and, once reviewed, its own receipt under evidence/pr-review/4647/ and its quorum verdict; those are outputs of review, not part of the diff under review - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io diff --git a/evidence/pr-review/4647/65d3fb620266e1bf7f80e026201fde16a7e2752f/findings.sarif b/evidence/pr-review/4647/65d3fb620266e1bf7f80e026201fde16a7e2752f/findings.sarif new file mode 100644 index 0000000000..b5cae88792 --- /dev/null +++ b/evidence/pr-review/4647/65d3fb620266e1bf7f80e026201fde16a7e2752f/findings.sarif @@ -0,0 +1,136 @@ +{ + "version": "2.1.0", + "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", + "runs": [ + { + "tool": { + "driver": { + "name": "pmat", + "informationUri": "https://github.com/paiml/pmat", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "pmat query \"shrink-only baseline ratchet guard\" --limit 5; pmat query \"mutants debt baseline survivors\" --limit 5; scripts/pr_review_duplication_scan.sh --rust-semantic; plus the measured commands in each result" + } + ], + "results": [ + { + "ruleId": "PRREV-RATCHET-002", + "level": "warning", + "message": { + "text": "Still present at 65d3fb6202 (reported on the earlier head 1f2e3598ea; no change to the script since): the guard can never reach an empty baseline. A head debt file with zero data rows (header only) is RED as 'malformed (need 5 tab fields)' because `check_rows <<<\"$head\"` feeds awk one empty line (NF=0). Re-measured in a scratch repo: base has one row, head is '# h' only, MUTANTS_DEBT_BASE=base, rc=1, 'malformed rows'. The 12-case self-test has no case for it (R3 shrinks 2->1, never to 0)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_mutants_debt_ratchet.sh" + }, + "region": { + "startLine": 41 + } + } + } + ], + "properties": { + "grounding": "measured", + "command": [ + "bash", + "scripts/check_mutants_debt_ratchet.sh", + "(scratch repo: header-only ci/mutants-debt.tsv at head, one-row copy at base, MUTANTS_DEBT_BASE=base)" + ], + "exit_code": 1, + "stdout_sha256": "d14210eff1a275470894d91edcae22cdb6731fdaa7c042ad4f21222f391ba420", + "failure_scenario": "When the last survivor is killed and the PR deletes the last data row, guard-tree fails with 'malformed rows'; the author must edit the guard or keep a dummy row, so the ratchet's goal state (empty debt) is unreachable as written.", + "precision_class": "advisory" + } + }, + { + "ruleId": "PRREV-RATCHET-003", + "level": "note", + "message": { + "text": "Rows key on the cargo-mutants name, which embeds line:col (e.g. liskov.rs:119:5). Any edit to a baselined file that shifts a survivor's line changes its string; the guard reads that as a NEW row (RED) and the only way to turn it green is to DELETE the row, which the shrink-only rule scores as a kill. With mutants report-only meanwhile, a line shift can launder a survivor out of the baseline without a test killing it, and a legitimate edit near a survivor is blocked until someone deletes its row." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_mutants_debt_ratchet.sh" + }, + "region": { + "startLine": 63 + } + } + } + ], + "properties": { + "grounding": "asserted", + "rationale": "Reading the rows format (ci/mutants-debt.tsv header, 590 rows keyed on file:line:col mutant strings) and the comm -23 comparison at lines 62-70 of the guard; not exercised against a real shifted file this run.", + "failure_scenario": "A PR reflows a file holding a baselined survivor: the row no longer matches, the guard demands deletion, the author deletes it, and the debt count falls with no test added.", + "precision_class": "advisory" + } + }, + { + "ruleId": "PRREV-CI-COMMENT-001", + "level": "note", + "message": { + "text": "ci.yml:456 still says 'The blocking rule is the shrink-only survivor baseline'. What the guard blocks is only hand-edits that GROW the debt file; a new surviving mutant in a PR is neither blocked nor ledgered while the gate is report-only (new-survivor detection is #4649). The comment reads stronger than the mechanism." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": ".github/workflows/ci.yml" + }, + "region": { + "startLine": 456 + } + } + } + ], + "properties": { + "grounding": "asserted", + "rationale": "Reading ci.yml 454-464 and the guard's inputs (the debt file at HEAD and at the merge base only).", + "failure_scenario": "A maintainer believes new mutation survivors are blocked and does not notice that between this merge and #4648/#4649 they are neither blocked nor recorded.", + "precision_class": "advisory" + } + } + ] + }, + { + "tool": { + "driver": { + "name": "cargo-mutants", + "informationUri": "https://github.com/paiml/aprender", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "scoped guard mutation: 10 sed mutants of scripts/check_mutants_debt_ratchet.sh vs its --self-test in a /tmp copy; 10 attempted, 10 killed (driver name is the receipt vocabulary slot; not a cargo-mutants run)" + } + ], + "results": [] + }, + { + "tool": { + "driver": { + "name": "antigravity", + "informationUri": "https://github.com/paiml/aprender", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "agy -p --model gemini-3.1-pro-high --output-format json --json-schema .pr-review-schema.json --print-timeout 9m --dangerously-skip-permissions (disposable git-archive tree)" + } + ], + "results": [] + } + ] +} diff --git a/evidence/pr-review/4647/65d3fb620266e1bf7f80e026201fde16a7e2752f/receipt.intoto.jsonl b/evidence/pr-review/4647/65d3fb620266e1bf7f80e026201fde16a7e2752f/receipt.intoto.jsonl new file mode 100644 index 0000000000..22320db96a --- /dev/null +++ b/evidence/pr-review/4647/65d3fb620266e1bf7f80e026201fde16a7e2752f/receipt.intoto.jsonl @@ -0,0 +1 @@ +{"_type":"https://in-toto.io/Statement/v1","subject":[{"name":"git+https://github.com/paiml/aprender","digest":{"sha1":"65d3fb620266e1bf7f80e026201fde16a7e2752f"}}],"predicateType":"https://paiml.dev/attestations/pr-review/v2","predicate":{"skill_version":"2.1.0","attestation_level":"L1-self","pr":4647,"base_sha":"00052c01284caa74c70b287088a79c6dee2959b9","head_sha":"65d3fb620266e1bf7f80e026201fde16a7e2752f","author_actor":{"kind":"agent","id":"agent:claude-opus-5-5/aprender-ca"},"reviewer_actor":{"kind":"agent","id":"agent:claude-sonnet-5-5/pr-4647-review"},"review_scope":{"tickets":["PMAT-4646","PMAT-4651"],"diff_shortstat":"merge-base diff 00052c0128..65d3fb6202, 10 files; prior evidence/pr-review receipts excluded from review","pmat_4651_checks":{"rows_moved_in_derived_expiries":"exactly /rows/13,15,18,19,21 expires 2026-09-30 -> 2026-10-15 (python JSON tree walk old vs new: 5 differences, nothing else)","spec_conformance_py_untouched":"git diff --stat base..head over scripts/lib/spec_conformance.py and scripts/spec_conformance.sh is empty","spec_conformance_today":"bash scripts/spec_conformance.sh exit 0 (PASS)","spec_conformance_2026_10_16":"SPEC_CONFORMANCE_TODAY=2026-10-16 bash scripts/spec_conformance.sh exit 1, D6 for rows 13,15,18,19,21","not_run":"derived_expiries.json was not regenerated with --write (read-only review); the change was verified by diff and by the two spec_conformance runs"},"other_measurements":["check_mutants_debt_ratchet.sh --self-test: PASSED 12 cases","check_mutants_debt_ratchet.sh at HEAD: PASS introduced 590 rows (no copy at merge base)","check_ci_gate_mutants_rule.sh: PASS","guard_tree.sh runs git ls-files scripts/check_*.sh, so the new guard is wired without a ci.yml edit"]},"affected_crates":[],"verdict":"FINDINGS","consultations":{"pmat":{"status":"consulted","transport":"cli","transport_unavailable":[],"mcp_attempted":false,"transport_note":"The pmat CLI answered. The pmat MCP server was not tried in this run (not a claim that it is down).","index_commit":"65d3fb620266e1bf7f80e026201fde16a7e2752f","index_is_ancestor":true,"index_worktree_dirty":true,"index_worktree_note":"pmat found its index stale and rebuilt it at HEAD in this worktree (query 86 s). git status showed two untracked files (docs/audits/quorum-PMAT-4646*); no tracked file modified.","cache_hits":0,"complexity_delta":[],"tdg_delta":[],"satd_introduced":[],"analysis_note":"The diff has no .rs file and pmat computes no complexity/TDG for shell, so those arrays are empty by construction (pmat analyze complexity/tdg were not run). A TODO/FIXME/HACK/XXX grep over added lines (TSV and prior receipts excluded) found 0; satd_introduced is empty on that basis, not on pmat analyze satd. The semantic queries returned no prior art for this guard. The only sibling-branch hits are origin/fix/4646-mutants-restore (RESTORE PR #4648, tip c1ebd31d9c), which carries the same two files by design.","duplication_hits":[{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":69,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":89,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":65,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":66,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":132,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":167,"method":"lexical"},{"needle":"mutants-debt.tsv","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"ci/mutants-debt.tsv","line":0,"method":"lexical"},{"needle":"check_mutants_debt_ratchet.sh","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"scripts/check_mutants_debt_ratchet.sh","line":0,"method":"lexical"}],"duplication_coverage":{"rust":"semantic","shell":"lexical","python":"lexical","config":"lexical","docs":"lexical","other":"lexical","sibling_branches":"lexical","merge_base_to_main":"lexical"},"duplication_horizon":["head=65d3fb620266e1bf7f80e026201fde16a7e2752f","siblings=refs/remotes/origin/* unmerged into origin/main","merge_base_to_main=00052c01284caa74c70b287088a79c6dee2959b9..refs/remotes/origin/main"],"horizon_branches_total":1159,"horizon_branches_scanned":1159,"merge_base_to_main_files":0,"symbols_searched":16},"cuda":{"status":"not-triggered","trigger_reason":"scripts/check_pr_review_receipt.sh --match-path over every changed path matched none, and --match-message over the commit messages base..head returned 1 (no match). The diff is ci.yml shell, a debt TSV, a bash guard, roadmap YAML, a spec table and a JSON of expiries: no device-behaviour claim."},"crux":{"status":"not-triggered","trigger_reason":"No CLI subcommand, flag, HTTP route, MCP tool, config key or output format of a shipped binary changed, and no comparative performance claim is added; the changes are CI-internal plus a spec re-date.","surfaces":[],"contracts":[],"comparative_claims":[]},"mutation":{"status":"consulted","scope":"guard","attempted":10,"killed":10,"survivors":[],"note":"Scoped to the one changed guard script: 10 hand-written sed mutants (NF, outcome set, index prefix, sha width, run-id regex, comm direction, dup-test polarity, missing-file polarity, merge-base error swallow, introduction short-circuit) run through the script own --self-test in a /tmp copy; none was a no-op. The three survivors reported on 1f2e3598ea (NF, index, run-id) are now killed by the equivalent mutants. scripts/mutate-guard.sh covers only check_pr_review_receipt.sh, so no committed mutation set exists for this script; 10/10 is this review measurement, not a committed-set score."},"antigravity":{"status":"consulted","attempted":1,"agy_version":"agy 1.2.14","binary_path":"/home/noah/.local/bin/agy","model_id":"gemini-3.1-pro-high","model_family":"google/gemini","exit_code":0,"duration_seconds":192.586687903,"agy_status":"SUCCESS","usage":{"input_tokens":138736,"output_tokens":14504,"thinking_tokens":12308,"cache_read_tokens":1344890,"total_tokens":153240},"output_check":{"structured_output_present":true,"reviewed":true,"schema_valid":true},"reverified_by_primary":false,"divergence":{"agreed":0,"agy_only":0,"primary_only":3,"contradicted":0},"divergence_note":"agy returned reviewed:true with no findings (diff passed as a file, TSV and prior receipts omitted). It did not raise the empty-baseline RED, the line-shift laundering or the ci.yml comment overclaim. No opposing conclusion on one subject.","findings":[]}},"findings_ref":{"path":"findings.sarif","sha256":"403d99deafe4d00330a4b7a488e03227d9d907296e50e1aaf4da1fc2e404ee55"},"cost":{"input_tokens":138736,"output_tokens":14504,"wall_seconds":1500,"note":"input/output tokens are the single agy review run; this reviewer session tokens are not instrumented. wall_seconds approximate."}}} diff --git a/scripts/check_mutants_debt_ratchet.sh b/scripts/check_mutants_debt_ratchet.sh index 2f7167e969..2ee5ac5840 100644 --- a/scripts/check_mutants_debt_ratchet.sh +++ b/scripts/check_mutants_debt_ratchet.sh @@ -11,7 +11,7 @@ # - no copy at the merge base -> GREEN once: the baseline is being introduced # # Usage: bash scripts/check_mutants_debt_ratchet.sh (compare HEAD with merge-base(HEAD, $MUTANTS_DEBT_BASE)) -# bash scripts/check_mutants_debt_ratchet.sh --self-test (case table R1-R12 in a scratch repo) +# bash scripts/check_mutants_debt_ratchet.sh --self-test (case table R1-R13 in a scratch repo) # MUTANTS_DEBT_BASE unset = resolve_base (merge-base with origin/main, or the CI-shape fallbacks); set = merge-base(HEAD, it). MUTANTS_DEBT_FILE defaults to ci/mutants-debt.tsv. set -euo pipefail @@ -27,6 +27,7 @@ rows() { grep -v '^#' | grep -v '^[[:space:]]*$' || true; } check_rows() { # stdin = rows; prints each malformed row, returns 1 if any awk -F'\t' ' + NF == 0 { next } # zero debt rows: <<<"" feeds one empty line, which is not a row NF != 5 { print " malformed (need 5 tab fields): " $0; bad = 1; next } $3 != "MissedMutant" && $3 != "Timeout" { print " bad outcome \"" $3 "\": " $0; bad = 1; next } # bashrs disable-line=BRS0015 (awk program text, not a command) $4 !~ /^[0-9a-f]{40}$/ { print " bad sha \"" $4 "\": " $0; bad = 1; next } # bashrs disable-line=BRS0015 (awk program text, not a command) @@ -100,6 +101,7 @@ self_test() { case_row R7 1 "duplicate rows" "a duplicate row is RED" "$(printf '%s\n%s\n' "$r1" "$r1")"$'\n' case_row R8 1 "unresolvable" "an unresolvable merge base is RED" "$r1"$'\n' no-such-ref case_row R9 1 "bad outcome" "a Caught outcome is not debt (RED)" "${r1/MissedMutant/CaughtMutant}"$'\n' + case_row R13 0 "shrink-only: 2 -> 0" "the last survivor killed (header only) is GREEN" "# header"$'\n' # R10: introduction -- the merge base has no copy git -C "$tmp" checkout -q --orphan intro; git -C "$tmp" rm -rq --cached . ; rm -rf -- "${tmp:?}/ci" : > "$tmp/keep"; git -C "$tmp" add keep; git -C "$tmp" commit -qm intro-base; git -C "$tmp" branch intro-base @@ -123,7 +125,7 @@ self_test() { if [ "$rc" -eq 1 ] && grep -qF "row(s) not in merge base" <<<"$out"; then echo "ok R12 rc=1 default base (origin/main via resolve_base): grown file is RED" else echo "FAIL R12 rc=$rc want=1 default base grown"; fails=$((fails + 1)); fi [ "$fails" -eq 0 ] || { echo "SELF-TEST FAILED: $fails case(s)"; return 1; } # bashrs disable-line=SC2198 (fails is a scalar counter, not an array) - echo "SELF-TEST PASSED (12 cases)" + echo "SELF-TEST PASSED (13 cases)" } case "${1:-}" in From 0711f26dc637303926259cc545260f521a933807 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 16:01:26 +0200 Subject: [PATCH 12/18] fix(ratchet): self-test kills the 3 surviving guard mutants; ci.yml comment states what actually blocks Review of a683b4a528 (haiku lane FAIL, non-author seat FINDINGS): - 3 sed mutants survived the self-test (PRREV-MUT-002): empty run id accepted, file-name check unanchored, NF<5 instead of NF!=5. New cases R14 (empty run id), R15 (file named mid-string), R16 (6 fields): each mutant now reds exactly its own case; 16/16. - ci.yml comment said "the blocking rule is the shrink-only survivor baseline". It blocks only GROWING the file; new survivors are #4649 and line-shifted rows are #4653 (new issue). Comment and script header say so. Comment-only; no gate changed. - PMAT-4651 AC: the "NO SPEED DELIVERED" line belongs to the v0.70.0 release notes at tag time, not to this PR. - Not changed: the lane's "R13 is RED" claim. Measured at this head: R13 rc=0, self-test 13/13 then 16/16. - Non-author receipt for a683b4a528 committed as evidence. Refs #4646 #4651 #4653 Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- .github/workflows/ci.yml | 6 +- docs/roadmaps/entries/PMAT-4646.yaml | 2 +- docs/roadmaps/entries/PMAT-4651.yaml | 2 +- docs/roadmaps/roadmap.yaml | 4 +- .../findings.sarif | 105 ++++++++++++++++++ .../receipt.intoto.jsonl | 1 + scripts/check_mutants_debt_ratchet.sh | 8 +- 7 files changed, 120 insertions(+), 8 deletions(-) create mode 100644 evidence/pr-review/4647/a683b4a5283ed971fd6de1836783ab4246310e21/findings.sarif create mode 100644 evidence/pr-review/4647/a683b4a5283ed971fd6de1836783ab4246310e21/receipt.intoto.jsonl diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 19f892d27d..7719baedbf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -453,8 +453,10 @@ jobs: done # --- MUTANTS-RATCHET (#4646; operator C187(a)/C188(a), 2026-10-01) --- # Mutation results are REPORTED here, not blocking: a new gate is adopted as a ratchet, never as an - # instant absolute bar. The blocking rule is the shrink-only survivor baseline ci/mutants-debt.tsv - # (scripts/check_mutants_debt_ratchet.sh, run by guard-tree, which this gate requires above); both land + # instant absolute bar. What blocks is the shrink-only rule on ci/mutants-debt.tsv: a PR may not GROW that + # file (scripts/check_mutants_debt_ratchet.sh, run by guard-tree, which this gate requires above). A NEW + # surviving mutant is not yet blocked or recorded (#4649); rows key on file:line:col, so a line shift reads + # as a new row (#4653). Both land # with PR #4647. A branch that carries this block before #4647 merges is report-only for mutants until it does. # Every check above this line is unchanged. The mutants rules below are unreachable ON PURPOSE (C188: mutants # off the release path) until RESTORE PR #4648 deletes this block and re-arms them. diff --git a/docs/roadmaps/entries/PMAT-4646.yaml b/docs/roadmaps/entries/PMAT-4646.yaml index 11948293bd..fd2ba72a77 100644 --- a/docs/roadmaps/entries/PMAT-4646.yaml +++ b/docs/roadmaps/entries/PMAT-4646.yaml @@ -10,7 +10,7 @@ spec: null acceptance_criteria: - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink, a shrink to zero rows, or an unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 13/13 (R1-R13) + - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink, a shrink to zero rows, or an unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 16/16 (R1-R16: R14-R16 kill the three surviving guard mutants named by the 1f2e3598ea review) - The ci gate job reports the mutants section result but does not fail on it; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - No ruleset change, no timeout raised, no other gate relaxed; the reviewed source diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only. The PR also carries the generated docs/roadmaps/roadmap.yaml and, once reviewed, its own receipt under evidence/pr-review/4647/ and its quorum verdict; those are outputs of review, not part of the diff under review - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io diff --git a/docs/roadmaps/entries/PMAT-4651.yaml b/docs/roadmaps/entries/PMAT-4651.yaml index b148c27841..3ea71f5f11 100644 --- a/docs/roadmaps/entries/PMAT-4651.yaml +++ b/docs/roadmaps/entries/PMAT-4651.yaml @@ -13,7 +13,7 @@ - An Appendix D row records who moved the expiry (operator Noah, ruling C197) and why ("not delivered for 0.70; carried to 0.71") - evidence/parity/derived_expiries.json is regenerated by `bash scripts/spec_conformance.sh --write`, and exactly those five rows change - The D6 andon in scripts/lib/spec_conformance.py is unchanged. `bash scripts/spec_conformance.sh` passes today, and with SPEC_CONFORMANCE_TODAY=2026-10-16 it is RED with D6 for the re-dated rows - - 'The 0.70 release notes carry "NO SPEED DELIVERED: PP-LLAMA-001 rows 13, 15, 18, 19, 21 (re-dated to 2026-10-15)"' + - 'At release time, not in this PR: the 0.70 release notes (gh release v0.70.0) carry "NO SPEED DELIVERED: PP-LLAMA-001 rows 13, 15, 18, 19, 21 (re-dated to 2026-10-15)"' - Out of scope, tracked in #4652 - a 7-day advance warning before any row expires phases: [] subtasks: [] diff --git a/docs/roadmaps/roadmap.yaml b/docs/roadmaps/roadmap.yaml index 0916935da7..582853427b 100644 --- a/docs/roadmaps/roadmap.yaml +++ b/docs/roadmaps/roadmap.yaml @@ -22245,7 +22245,7 @@ roadmap: spec: null acceptance_criteria: - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink, a shrink to zero rows, or an unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 13/13 (R1-R13) + - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink, a shrink to zero rows, or an unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 16/16 (R1-R16: R14-R16 kill the three surviving guard mutants named by the 1f2e3598ea review) - The ci gate job reports the mutants section result but does not fail on it; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - No ruleset change, no timeout raised, no other gate relaxed; the reviewed source diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only. The PR also carries the generated docs/roadmaps/roadmap.yaml and, once reviewed, its own receipt under evidence/pr-review/4647/ and its quorum verdict; those are outputs of review, not part of the diff under review - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io @@ -22271,7 +22271,7 @@ roadmap: - An Appendix D row records who moved the expiry (operator Noah, ruling C197) and why ("not delivered for 0.70; carried to 0.71") - evidence/parity/derived_expiries.json is regenerated by `bash scripts/spec_conformance.sh --write`, and exactly those five rows change - The D6 andon in scripts/lib/spec_conformance.py is unchanged. `bash scripts/spec_conformance.sh` passes today, and with SPEC_CONFORMANCE_TODAY=2026-10-16 it is RED with D6 for the re-dated rows - - 'The 0.70 release notes carry "NO SPEED DELIVERED: PP-LLAMA-001 rows 13, 15, 18, 19, 21 (re-dated to 2026-10-15)"' + - 'At release time, not in this PR: the 0.70 release notes (gh release v0.70.0) carry "NO SPEED DELIVERED: PP-LLAMA-001 rows 13, 15, 18, 19, 21 (re-dated to 2026-10-15)"' - Out of scope, tracked in #4652 - a 7-day advance warning before any row expires phases: [] subtasks: [] diff --git a/evidence/pr-review/4647/a683b4a5283ed971fd6de1836783ab4246310e21/findings.sarif b/evidence/pr-review/4647/a683b4a5283ed971fd6de1836783ab4246310e21/findings.sarif new file mode 100644 index 0000000000..7a454cc4bd --- /dev/null +++ b/evidence/pr-review/4647/a683b4a5283ed971fd6de1836783ab4246310e21/findings.sarif @@ -0,0 +1,105 @@ +{ + "version": "2.1.0", + "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", + "runs": [ + { + "tool": { + "driver": { + "name": "pmat", + "informationUri": "https://github.com/paiml/pmat", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "pmat query \"shrink-only mutants debt ratchet\" --limit 5 (index rebuilt at HEAD, 103 s); scripts/pr_review_duplication_scan.sh --rust-semantic; plus the measured commands in each result" + } + ], + "results": [ + { + "ruleId": "PRREV-RATCHET-003", + "level": "note", + "message": { + "text": "Rows key on the cargo-mutants name, which embeds line:col (e.g. liskov.rs:119:5). Any edit to a baselined file that shifts a survivor's line changes its string; the guard reads that as a NEW row (RED) and the only way to turn it green is to DELETE the row, which the shrink-only rule scores as a kill. With mutants report-only meanwhile, a line shift can launder a survivor out of the baseline without a test killing it, and a legitimate edit near a survivor is blocked until someone deletes its row." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_mutants_debt_ratchet.sh" + }, + "region": { + "startLine": 57 + } + } + } + ], + "properties": { + "grounding": "asserted", + "rationale": "Reading the rows format (ci/mutants-debt.tsv header, 590 rows keyed on file:line:col mutant strings) and the comm -23 comparison at lines 62-70 of the guard; not exercised against a real shifted file this run.", + "failure_scenario": "A PR reflows a file holding a baselined survivor: the row no longer matches, the guard demands deletion, the author deletes it, and the debt count falls with no test added.", + "precision_class": "advisory" + } + }, + { + "ruleId": "PRREV-CI-COMMENT-001", + "level": "note", + "message": { + "text": "ci.yml:456 still says 'The blocking rule is the shrink-only survivor baseline'. What the guard blocks is only hand-edits that GROW the debt file; a new surviving mutant in a PR is neither blocked nor ledgered while the gate is report-only (new-survivor detection is #4649). The comment reads stronger than the mechanism." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": ".github/workflows/ci.yml" + }, + "region": { + "startLine": 456 + } + } + } + ], + "properties": { + "grounding": "asserted", + "rationale": "Reading ci.yml 454-464 and the guard's inputs (the debt file at HEAD and at the merge base only).", + "failure_scenario": "A maintainer believes new mutation survivors are blocked and does not notice that between this merge and #4648/#4649 they are neither blocked nor recorded.", + "precision_class": "advisory" + } + } + ] + }, + { + "tool": { + "driver": { + "name": "cargo-mutants", + "informationUri": "https://github.com/paiml/aprender", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "scoped guard mutation: 7 sed mutants of scripts/check_mutants_debt_ratchet.sh vs its --self-test (scratch copy under scripts/, removed afterwards); 7 attempted, 7 killed (driver name is the receipt vocabulary slot; not a cargo-mutants run)" + } + ], + "results": [] + }, + { + "tool": { + "driver": { + "name": "antigravity", + "informationUri": "https://github.com/paiml/aprender", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "agy -p --model gemini-3.1-pro-high --output-format json --json-schema .pr-review-schema.json --print-timeout 15m --dangerously-skip-permissions (disposable git-archive tree at a683b4a528; diff file omits the debt TSV and prior receipts)" + } + ], + "results": [] + } + ] +} diff --git a/evidence/pr-review/4647/a683b4a5283ed971fd6de1836783ab4246310e21/receipt.intoto.jsonl b/evidence/pr-review/4647/a683b4a5283ed971fd6de1836783ab4246310e21/receipt.intoto.jsonl new file mode 100644 index 0000000000..0ca28cb062 --- /dev/null +++ b/evidence/pr-review/4647/a683b4a5283ed971fd6de1836783ab4246310e21/receipt.intoto.jsonl @@ -0,0 +1 @@ +{"_type":"https://in-toto.io/Statement/v1","subject":[{"name":"git+https://github.com/paiml/aprender","digest":{"sha1":"a683b4a5283ed971fd6de1836783ab4246310e21"}}],"predicateType":"https://paiml.dev/attestations/pr-review/v2","predicate":{"skill_version":"2.1.0","attestation_level":"L1-self","pr":4647,"base_sha":"00052c01284caa74c70b287088a79c6dee2959b9","head_sha":"a683b4a5283ed971fd6de1836783ab4246310e21","author_actor":{"kind":"agent","id":"agent:claude-opus-5-5/aprender-ca"},"reviewer_actor":{"kind":"agent","id":"agent:claude-sonnet-5-5/pr-4647-review"},"review_scope":{"tickets":["PMAT-4646","PMAT-4651"],"diff_shortstat":"merge-base diff 00052c0128..a683b4a528, 12 files; prior evidence/pr-review receipts and the 590-row TSV body excluded from review","pmat_4651_checks":{"rows_moved_in_derived_expiries":"exactly 5 expires lines change 2026-09-30 -> 2026-10-15 (git diff base..head over evidence/parity/derived_expiries.json: 5 -/+ pairs, nothing else); the base JSON shows the 5 rows at 2026-09-30, and the diff is the whole change to that file","spec_conformance_py_untouched":"git diff --stat base..head over scripts/lib/spec_conformance.py and scripts/spec_conformance.sh is empty","spec_conformance_today":"bash scripts/spec_conformance.sh exit 0 (PASS)","spec_conformance_2026_10_16":"SPEC_CONFORMANCE_TODAY=2026-10-16 bash scripts/spec_conformance.sh exit 1, D6 for rows 13,15,18,19,21 and also row 22 (row 22 expires 2026-10-15 at the base too; not moved by this PR)","not_run":"derived_expiries.json was not regenerated with --write (read-only review); verified by diff and the two spec_conformance runs"},"pmat_4646_checks":{"a683b4a528_answers_65d3fb6202_finding":"the zero-row finding (PRREV-RATCHET-002 on 65d3fb6202, also raised by the quorum lanes) is CLOSED: `NF == 0 { next }` added to check_rows awk; --self-test PASSED 13 cases incl. R13 (2 -> 0 rows GREEN); with that one line deleted R13 alone FAILs (rc=1 want=0), so R13 is a real case","ratchet_at_head":"check_mutants_debt_ratchet.sh at HEAD: PASS introduced 590 rows (no copy at merge base)","working_tree":"git status shows only untracked docs/audits/quorum-PMAT-4646* files; one scratch script under scripts/ was created and removed during mutation"}},"affected_crates":[],"verdict":"FINDINGS","consultations":{"pmat":{"status":"consulted","transport":"cli","transport_unavailable":[],"mcp_attempted":false,"transport_note":"The pmat CLI answered. The pmat MCP server was not tried in this run (not a claim that it is down).","index_commit":"a683b4a5283ed971fd6de1836783ab4246310e21","index_is_ancestor":true,"index_worktree_dirty":true,"index_worktree_note":"pmat rebuilt its index at HEAD in this worktree (query 103 s). git status showed only untracked docs/audits/quorum-PMAT-4646* files; no tracked file modified.","cache_hits":0,"complexity_delta":[],"tdg_delta":[],"satd_introduced":[],"analysis_note":"The diff has no .rs file and pmat computes no complexity/TDG for shell, so those arrays are empty by construction (pmat analyze complexity/tdg were not run). A TODO/FIXME/HACK/XXX grep over added lines (TSV and prior receipts excluded) found 0; satd_introduced is empty on that basis, not on pmat analyze satd. The semantic queries returned no prior art for this guard. The only sibling-branch hits are origin/fix/4646-mutants-restore (RESTORE PR #4648, tip c1ebd31d9c), which carries the same two files by design.","duplication_hits":[{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":69,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":89,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":65,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":66,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":132,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":167,"method":"lexical"},{"needle":"mutants-debt.tsv","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"ci/mutants-debt.tsv","line":0,"method":"lexical"},{"needle":"check_mutants_debt_ratchet.sh","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"scripts/check_mutants_debt_ratchet.sh","line":0,"method":"lexical"}],"duplication_coverage":{"rust":"semantic","shell":"lexical","python":"lexical","config":"lexical","docs":"lexical","other":"lexical","sibling_branches":"lexical","merge_base_to_main":"lexical"},"duplication_horizon":["head=a683b4a5283ed971fd6de1836783ab4246310e21","siblings=refs/remotes/origin/* unmerged into origin/main","merge_base_to_main=00052c01284caa74c70b287088a79c6dee2959b9..refs/remotes/origin/main"],"horizon_branches_total":1159,"horizon_branches_scanned":1159,"merge_base_to_main_files":0,"symbols_searched":16},"cuda":{"status":"not-triggered","trigger_reason":"scripts/check_pr_review_receipt.sh --match-path over every changed path matched none (0 of 12), and --match-message over the commit messages base..head returned 1 (no match). The diff is ci.yml shell, a debt TSV, a bash guard, roadmap YAML, a spec table and a JSON of expiries: no device-behaviour claim."},"crux":{"status":"not-triggered","trigger_reason":"No CLI subcommand, flag, HTTP route, MCP tool, config key or output format of a shipped binary changed, and no comparative performance claim is added; the changes are CI-internal plus a spec re-date.","surfaces":[],"contracts":[],"comparative_claims":[]},"mutation":{"status":"consulted","scope":"guard","attempted":7,"killed":7,"survivors":[],"note":"Scoped to the one changed guard script: 7 hand-written sed mutants (NF==0 line deleted, NF==0 -> NF==1, NF!=5 -> 6, outcome set, sha width, comm direction, self-test R13 expectation flipped) run through the script own --self-test; none was a no-op. The new NF==0 line is killed only by R13 (deleting it FAILs R13 rc=1 want=0). scripts/mutate-guard.sh covers only check_pr_review_receipt.sh, so no committed mutation set exists for this script; 7/7 is this review measurement, not a committed-set score."},"antigravity":{"status":"consulted","attempted":1,"agy_version":"agy 1.2.14","binary_path":"/home/noah/.local/bin/agy","model_id":"gemini-3.1-pro-high","model_family":"google/gemini","exit_code":0,"duration_seconds":208.426866079,"agy_status":"SUCCESS","usage":{"input_tokens":146190,"output_tokens":14920,"thinking_tokens":12494,"cache_read_tokens":1161069,"total_tokens":161110},"output_check":{"structured_output_present":true,"reviewed":true,"schema_valid":true},"reverified_by_primary":false,"divergence":{"agreed":0,"agy_only":0,"primary_only":2,"contradicted":0},"divergence_note":"agy returned reviewed:true with no findings (diff passed as a file, TSV and prior receipts omitted; schema_valid by check-jsonschema, rc 0). It raised neither the line-shift laundering note nor the ci.yml comment overclaim. No opposing conclusion on one subject.","findings":[]}},"findings_ref":{"path":"findings.sarif","sha256":"853ee4d31a50e60ca239440544a34eac06fbccabe1eced35c02b44a3ccf1a5c5"},"cost":{"input_tokens":146190,"output_tokens":14920,"wall_seconds":1200,"note":"input/output tokens are the single agy review run; this reviewer session tokens are not instrumented. wall_seconds approximate."}}} diff --git a/scripts/check_mutants_debt_ratchet.sh b/scripts/check_mutants_debt_ratchet.sh index 2ee5ac5840..28afb7d945 100644 --- a/scripts/check_mutants_debt_ratchet.sh +++ b/scripts/check_mutants_debt_ratchet.sh @@ -11,7 +11,8 @@ # - no copy at the merge base -> GREEN once: the baseline is being introduced # # Usage: bash scripts/check_mutants_debt_ratchet.sh (compare HEAD with merge-base(HEAD, $MUTANTS_DEBT_BASE)) -# bash scripts/check_mutants_debt_ratchet.sh --self-test (case table R1-R13 in a scratch repo) +# bash scripts/check_mutants_debt_ratchet.sh --self-test (case table R1-R16 in a scratch repo) +# Known limit: rows key on file:line:col, so a line shift reads as a new row (#4653); new survivors are not yet blocked (#4649). # MUTANTS_DEBT_BASE unset = resolve_base (merge-base with origin/main, or the CI-shape fallbacks); set = merge-base(HEAD, it). MUTANTS_DEBT_FILE defaults to ci/mutants-debt.tsv. set -euo pipefail @@ -102,6 +103,9 @@ self_test() { case_row R8 1 "unresolvable" "an unresolvable merge base is RED" "$r1"$'\n' no-such-ref case_row R9 1 "bad outcome" "a Caught outcome is not debt (RED)" "${r1/MissedMutant/CaughtMutant}"$'\n' case_row R13 0 "shrink-only: 2 -> 0" "the last survivor killed (header only) is GREEN" "# header"$'\n' + case_row R14 1 "bad run id" "an empty run id is RED" "${r1% *} "$'\n' + case_row R15 1 "does not name its file" "a mutant naming its file mid-string is RED" "${r1/ src\/a.rs:/ x\/src\/a.rs:}"$'\n' + case_row R16 1 "need 5 tab fields" "a 6-field row is RED" "$r1 extra"$'\n' # R10: introduction -- the merge base has no copy git -C "$tmp" checkout -q --orphan intro; git -C "$tmp" rm -rq --cached . ; rm -rf -- "${tmp:?}/ci" : > "$tmp/keep"; git -C "$tmp" add keep; git -C "$tmp" commit -qm intro-base; git -C "$tmp" branch intro-base @@ -125,7 +129,7 @@ self_test() { if [ "$rc" -eq 1 ] && grep -qF "row(s) not in merge base" <<<"$out"; then echo "ok R12 rc=1 default base (origin/main via resolve_base): grown file is RED" else echo "FAIL R12 rc=$rc want=1 default base grown"; fails=$((fails + 1)); fi [ "$fails" -eq 0 ] || { echo "SELF-TEST FAILED: $fails case(s)"; return 1; } # bashrs disable-line=SC2198 (fails is a scalar counter, not an array) - echo "SELF-TEST PASSED (13 cases)" + echo "SELF-TEST PASSED (16 cases)" } case "${1:-}" in From bd851543c6d65fb6b09d46425669afa944fddc3c Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 16:30:58 +0200 Subject: [PATCH 13/18] fix(roadmap): quote the PMAT-4646 AC; its "R1-R16: ..." parsed as a YAML map 0711f26dc6 broke roadmap-valid (sov.security + sov.gate, CI 36873128678): "roadmap[1098].acceptance_criteria[1]: invalid type: map". The ": " inside the unquoted AC made it a mapping. Quoted it; pmat work validate rc 0, pmat work status PMAT-4646 rc 0, roadmap sorted rc 0. The cop committed without checking validate's rc; it is checked explicitly now. Refs #4646 Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- docs/roadmaps/entries/PMAT-4646.yaml | 2 +- docs/roadmaps/roadmap.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/roadmaps/entries/PMAT-4646.yaml b/docs/roadmaps/entries/PMAT-4646.yaml index fd2ba72a77..0578b0b4ee 100644 --- a/docs/roadmaps/entries/PMAT-4646.yaml +++ b/docs/roadmaps/entries/PMAT-4646.yaml @@ -10,7 +10,7 @@ spec: null acceptance_criteria: - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink, a shrink to zero rows, or an unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 16/16 (R1-R16: R14-R16 kill the three surviving guard mutants named by the 1f2e3598ea review) + - 'scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink, a shrink to zero rows, or an unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 16/16 (R1-R16: R14-R16 kill the three surviving guard mutants named by the 1f2e3598ea review)' - The ci gate job reports the mutants section result but does not fail on it; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - No ruleset change, no timeout raised, no other gate relaxed; the reviewed source diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only. The PR also carries the generated docs/roadmaps/roadmap.yaml and, once reviewed, its own receipt under evidence/pr-review/4647/ and its quorum verdict; those are outputs of review, not part of the diff under review - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io diff --git a/docs/roadmaps/roadmap.yaml b/docs/roadmaps/roadmap.yaml index 582853427b..de7c936713 100644 --- a/docs/roadmaps/roadmap.yaml +++ b/docs/roadmaps/roadmap.yaml @@ -22245,7 +22245,7 @@ roadmap: spec: null acceptance_criteria: - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - - scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink, a shrink to zero rows, or an unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 16/16 (R1-R16: R14-R16 kill the three surviving guard mutants named by the 1f2e3598ea review) + - 'scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink, a shrink to zero rows, or an unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 16/16 (R1-R16: R14-R16 kill the three surviving guard mutants named by the 1f2e3598ea review)' - The ci gate job reports the mutants section result but does not fail on it; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - No ruleset change, no timeout raised, no other gate relaxed; the reviewed source diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only. The PR also carries the generated docs/roadmaps/roadmap.yaml and, once reviewed, its own receipt under evidence/pr-review/4647/ and its quorum verdict; those are outputs of review, not part of the diff under review - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io From 8d4a491dfeec0f9698d69605617d8d7049ffbca6 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 16:48:16 +0200 Subject: [PATCH 14/18] evidence(4647): round-4 review receipt + quorum AGREED (PASS/PASS/PASS) at bd851543c6 Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- docs/audits/quorum-PMAT-4646.json | 271 ++++++++++++++++++ .../findings.sarif | 198 +++++++++++++ .../receipt.intoto.jsonl | 1 + 3 files changed, 470 insertions(+) create mode 100644 docs/audits/quorum-PMAT-4646.json create mode 100644 evidence/pr-review/4647/bd851543c6d65fb6b09d46425669afa944fddc3c/findings.sarif create mode 100644 evidence/pr-review/4647/bd851543c6d65fb6b09d46425669afa944fddc3c/receipt.intoto.jsonl diff --git a/docs/audits/quorum-PMAT-4646.json b/docs/audits/quorum-PMAT-4646.json new file mode 100644 index 0000000000..80b9a868f4 --- /dev/null +++ b/docs/audits/quorum-PMAT-4646.json @@ -0,0 +1,271 @@ +{ + "ticket": "PMAT-4646,PMAT-4651", + "base": "origin/main", + "base_resolved": "origin/main", + "base_note": "no origin/origin/main exists; judged against the local ref; brief_exclude (C45) kept out of the brief: docs/roadmaps/roadmap.yaml", + "head": "bd851543c6d65fb6b09d46425669afa944fddc3c", + "diff_sha256": "cf71b2c0535d103b51038c28d192fb9f4aac37a608bd7f17171eb82cb2eb5eb9", + "width": 3, + "executor": "agy", + "prompt_mode": "file", + "prompt_bytes": 207751, + "prompt_sha256": "9278eae9ae09b1790165ab556f556cd6e73d696537e56bb4f4d9b5f9c0e65646", + "author": { + "model": "claude-opus-5-5", + "family": "claude", + "source": "flag" + }, + "agreed": true, + "lanes": [ + { + "lane": 1, + "status": "SUCCESS", + "verdict": "PASS", + "summary": "Diff implements both PMAT-4646 and PMAT-4651 as specified. The ci.yml \"gate\" step still exit-1s on every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism-compare) before reaching the new MUTANTS-RATCHET block, which then reports (not blocks) mutants and exits 0 — matching AC \"every other required section still fails exactly as before.\" scripts/check_mutants_debt_ratchet.sh correctly enforces shrink-only semantics (confirmed its NF==0 zero-row path, run-id, file-prefix and NF!=5 checks), auto-wires into guard-tree via `git ls-files 'scripts/check_*.sh'` with no further ci.yml change needed, and its --self-test exercises 16 cases (R1-R16) including R14-R16, which I traced and confirmed actually exercise the three specific guard weaknesses named in the embedded 1f2e3598ea review (empty run id, mid-string file match, 6-field row) — these are real regression tests, not vacuous ones. ci/mutants-debt.tsv's committed rows match the documented 5-tab-field schema and the two cited CI run shas. For PMAT-4651, PP-LLAMA-001-MASTER.md and evidence/parity/derived_expiries.json move exactly rows 13, 15 (18 derived), 19, 21 from 2026-09-30 to 2026-10-15 with an Appendix D row citing operator Noah / ruling C197, and the roadmap entries for both tickets are consistent with their acceptance criteria. No gate was weakened beyond what the ticket explicitly authorizes (mutants ratchet, not a waiver), no timeout changed, and no test asserts the opposite of either ticket.", + "findings": [], + "raw_bytes": 3950, + "err_bytes": 0, + "envelope_status": "SUCCESS", + "verdict_source": "structured_output", + "executor": "claude-code", + "grounding_check": "parity", + "role": "counted", + "model": "claude-sonnet-5", + "model_measured": "claude-sonnet-5", + "model_source": "flag", + "family": "claude", + "brief_sha256": "9278eae9ae09b1790165ab556f556cd6e73d696537e56bb4f4d9b5f9c0e65646", + "trace": { + "input_sha256": "4f3d6043fa7c1727aa82bfa0f82f939b2f3c2c9e826be9afdbc16da366303790", + "output_sha256": "e29a2c032a211c745a5ec1b7c90d1d51d1351d8ff3d5d2135d9478d4c2fbfb7d", + "store": null, + "store_why": "almacen not provisioned yet (infra-27): the blobs stay in the round's gitignored .lanes dir" + }, + "fallback": { + "judged_by": "claude-sonnet-5", + "exhausted": false, + "attempts": [ + { + "model": "claude-sonnet-5", + "family": "claude", + "outcome": "answered" + } + ], + "skipped": [] + } + }, + { + "lane": 2, + "status": "SUCCESS", + "verdict": "PASS", + "summary": "Diff implements both PMAT-4646 and PMAT-4651 perfectly as specified. The `ci.yml` `gate` step still exit-1s on every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism-compare) before reaching the new MUTANTS-RATCHET block, which then reports mutants and exits 0 instead of blocking. `scripts/check_mutants_debt_ratchet.sh` correctly enforces shrink-only semantics and its `--self-test` exercises all 16 cases successfully. For PMAT-4651, `PP-LLAMA-001-MASTER.md` and `evidence/parity/derived_expiries.json` move exactly rows 13, 15, 18 (derived), 19, and 21 from 2026-09-30 to 2026-10-15 with an Appendix D row citing operator Noah. No gates were weakened beyond the mutants ratchet, and no test asserts the opposite of the ticket.", + "findings": [], + "raw_bytes": 2871, + "err_bytes": 0, + "envelope_status": "SUCCESS", + "verdict_source": "structured_output", + "grounding_check": "parity", + "role": "independent", + "model": "gemini-3.1-pro-high", + "model_measured": "gemini-3.1-pro-high", + "model_source": "measured", + "family": "gemini", + "executor": "agy", + "brief_sha256": "9278eae9ae09b1790165ab556f556cd6e73d696537e56bb4f4d9b5f9c0e65646", + "trace": { + "input_sha256": "189abd868393c0931ccf01b346068ccaa2a715e20a11255dded73149800be596", + "output_sha256": "680aafd737064b4d8590d6b1a0ef96e9e26fef8fa29de938961d75ed5b2156c1", + "store": null, + "store_why": "almacen not provisioned yet (infra-27): the blobs stay in the round's gitignored .lanes dir" + }, + "fallback": { + "judged_by": "gemini-3.1-pro-high", + "exhausted": false, + "attempts": [ + { + "model": "gemini-3.1-pro-high", + "family": "gemini", + "outcome": "answered" + } + ], + "skipped": [] + } + }, + { + "lane": 3, + "status": "SUCCESS", + "verdict": "PASS", + "summary": "The diff correctly implements PMAT-4646 and PMAT-4651. The mutants ratchet gate is properly converted to report-only mode with shrink-only baseline enforcement via ci/mutants-debt.tsv and scripts/check_mutants_debt_ratchet.sh. The critical empty-baseline defect is fixed (NF == 0 { next }), and 16 comprehensive self-test cases validate the guard, including R13 for zero-row scenarios (verified by PR #4647 review). PMAT-4651 date re-mapping (rows 13, 15, 18, 19, 21 to 2026-10-15) is complete in both derived_expiries.json and roadmap spec.", + "findings": [], + "raw_bytes": 2024, + "err_bytes": 0, + "envelope_status": "SUCCESS", + "verdict_source": "structured_output", + "executor": "claude-code", + "grounding_check": "parity", + "role": "counted", + "model": "claude-haiku-4-5", + "model_measured": "claude-haiku-4-5", + "model_source": "flag", + "family": "claude", + "brief_sha256": "9278eae9ae09b1790165ab556f556cd6e73d696537e56bb4f4d9b5f9c0e65646", + "trace": { + "input_sha256": "babe04039f5c694c0538ad73b4946f1f2f52597e7b15ef03c24ead9f8abc025f", + "output_sha256": "c4cdfaa95e4013b1f2d0c1bb023b8a1c6f9b16c9bf93ba8d7650fb7ea5c6ab7f", + "store": null, + "store_why": "almacen not provisioned yet (infra-27): the blobs stay in the round's gitignored .lanes dir" + }, + "fallback": { + "judged_by": "claude-haiku-4-5", + "exhausted": false, + "attempts": [ + { + "model": "claude-haiku-4-5", + "family": "claude", + "outcome": "answered" + } + ], + "skipped": [] + } + } + ], + "dissent": [], + "dedup": [], + "uncovered": [], + "coverage_source": "lanes", + "partial": false, + "partial_reasons": [], + "fallback": { + "same_family_width": 2, + "chain": [ + { + "model": "claude-sonnet-5", + "family": "claude", + "disposition": "claude-code", + "why": "run by Claude Code on its own budget: a configured seat runs every round, a fallback step only when every non-Claude family is measured out (PMAT-360, operator standing rule)" + }, + { + "model": "gemini-3.1-pro-high", + "family": "gemini", + "disposition": "configured" + }, + { + "model": "claude-haiku-4-5", + "family": "claude", + "disposition": "claude-code", + "why": "run by Claude Code on its own budget: a configured seat runs every round, a fallback step only when every non-Claude family is measured out (PMAT-360, operator standing rule)" + }, + { + "model": "claude-opus-5-5", + "family": "claude", + "disposition": "excluded-self-review", + "why": "the author's own model id (claude-opus-5-5) — a model never reviews its own diff, at any width (R-15a identity bar)" + }, + { + "model": "qwen3.5", + "family": "qwen", + "disposition": "not-run", + "why": "no quorum.local_lane in the config — the aprender lane has no model to load" + } + ], + "precheck": [ + { + "family": "gemini", + "model": "gemini-3.1-pro-high", + "probe": 1, + "outcome": "live" + } + ], + "degraded": null, + "prah": { + "source": "install-receipt", + "path": "/home/noah/.claude/skills/paiml-implement/bin/prah" + }, + "tier1": { + "agy_tier1_only": true, + "tier1": true, + "matched": [ + ".github/workflows/ci.yml" + ], + "paths": 14, + "patterns": [ + "^\\.github/workflows/", + "(^|/)release[^/]*\\.(ya?ml|sh|rs|toml)$", + "cuda|kernel|\\.cu$|\\.ptx$", + "(^|/)[^/]*(gate|guard)[^/]*\\.(sh|rs|py)$|^hooks/", + "security|secret|credential|(^|/)deny\\.toml$", + "^skills/quorum-review/|(^|/)(receipt-lint|roadmap-lint|release-lint|kind-gate|model-gate)[^/]*$|^crates/prah-lint/" + ], + "builtin": "^skills/quorum-review/|(^|/)skills/paiml-implement/config\\.json$|(^|/)(modellib|lane-reduce|lane-fallback|lane-group|agy-lane|cc-lane|receipt-lint|route|quota)\\.sh$|^crates/prah-lint/" + }, + "bucket": { + "ledger": "/home/noah/.local/state/paiml-implement/agy-bucket.jsonl", + "window_s": 18000, + "pace": "off", + "buckets": { + "gemini": { + "bucket": "gemini", + "budget": 0, + "basis": "ledger: the calls served before the first 429 of the latest window that reached one", + "window_start": 1790861697, + "window_calls": 2, + "window_429": 0, + "hour_calls": 2, + "share": 1, + "want": 2, + "state": "empty", + "reason": "agy bucket gemini is empty: 2 calls in this window reach its budget 0 (ledger: the calls served before the first 429 of the latest window that reached one)" + } + }, + "closed": [] + } + }, + "auto_merge": { + "checked": true, + "was_armed": false, + "disarmed": false, + "note": "auto-merge not armed" + }, + "cheap_seat": "claude-haiku-4-5", + "canary": { + "skipped": "brief 207751 bytes > 24576" + }, + "advisory_lane": { + "state": "not-run", + "counts": false, + "row": { + "NotRun": "ContextOverflow" + }, + "verdict": "unavailable", + "why": "the brief is 207751 bytes, over quorum.advisory_lane.max_brief_bytes=196608; a cut brief is a different question, so the lane was not launched", + "served_by": null, + "gpu_proof": null, + "apr": null, + "apr_binary_sha256": null, + "apr_tag": null, + "apr_commit": null, + "apr_build_why": null, + "model": null, + "model_sha256": null, + "rc": 0, + "wall_s": 0, + "collected_s": 0, + "budget_s": 184, + "budget_basis": "ledger: 2 x p95 92 s over 124 gx10-cuda Verdict rows", + "brief": { + "bytes": 207751, + "sent_bytes": 0, + "max_bytes": 196608 + }, + "trace": null, + "attempts": [], + "ledger": "/home/noah/.local/state/paiml-implement/advisory-ledger.jsonl", + "raw": "advisory.json", + "agrees_with_counted": null, + "counted": "PASS" + }, + "lint": { + "ok": true, + "output": "receipt complete: kind=artifact lanes=3 author=claude-opus-5-5/claude same_family=2/2" + } +} diff --git a/evidence/pr-review/4647/bd851543c6d65fb6b09d46425669afa944fddc3c/findings.sarif b/evidence/pr-review/4647/bd851543c6d65fb6b09d46425669afa944fddc3c/findings.sarif new file mode 100644 index 0000000000..063fecbfcb --- /dev/null +++ b/evidence/pr-review/4647/bd851543c6d65fb6b09d46425669afa944fddc3c/findings.sarif @@ -0,0 +1,198 @@ +{ + "version": "2.1.0", + "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", + "runs": [ + { + "tool": { + "driver": { + "name": "pmat", + "informationUri": "https://github.com/paiml/pmat", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "pmat query \"shrink-only debt ratchet baseline\" --limit 5 (index in this worktree, 2.6 s); scripts/pr_review_duplication_scan.sh (36 s, 1159/1159 branches); plus the measured commands in each result" + } + ], + "results": [ + { + "ruleId": "PRREV-RATCHET-003", + "level": "note", + "message": { + "text": "Rows key on the cargo-mutants name, which embeds line:col. A line shift in a baselined file reads as a NEW row (RED) and the only way to green is deleting the row, which the shrink-only rule scores as a kill. The author now states this limit in the script header and ci.yml comment (#4653); it is not fixed." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_mutants_debt_ratchet.sh" + }, + "region": { + "startLine": 12 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "asserted", + "rationale": "Reading the row format and the comm -23 comparison; not exercised against a shifted file this run. Known limit named by the author (#4653).", + "failure_scenario": "A PR reflows a file holding a baselined survivor; the author deletes the unmatched row and the debt count falls with no test added." + } + }, + { + "ruleId": "PRREV-RATCHET-004", + "level": "note", + "message": { + "text": "A NEW surviving mutant is reported but neither blocked nor recorded until #4649: the ci.yml MUTANTS-RATCHET block echoes the mutants section and exits 0. This is the operator's C187(a)/C188(a) ruling, recorded so the receipt is not read as enforcement of new survivors." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": ".github/workflows/ci.yml" + }, + "region": { + "startLine": 454 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "asserted", + "rationale": "Reading the block; check_ci_gate_mutants_rule.sh still PASSes (its marked block is untouched) and check_mutants_debt_ratchet.sh is in guard_tree's git-ls-files universe and its cargo-free subset (--list shows it in both).", + "failure_scenario": "A PR adds code whose mutant survives; nothing goes red until #4649 lands." + } + }, + { + "ruleId": "PRREV-RATCHET-005", + "level": "note", + "message": { + "text": "No committed mutation set exists for check_mutants_debt_ratchet.sh (mutate-guard.sh covers only the receipt guard), so \u00a73.D's 100%-kill requirement cannot be read from a committed artifact; this review's own 12 hand mutants were all killed by --self-test (16 cases)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_mutants_debt_ratchet.sh" + }, + "region": { + "startLine": 1 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "asserted", + "rationale": "ls scripts | grep mutat lists four mutate scripts, none for this guard. The 12/12 figure is a review-run count whose output was not hashed, hence asserted, not measured.", + "failure_scenario": "A later edit weakens a guard rule that no self-test case pins; with no derived mutation set nothing rescans it, so the survivor is found only by a human." + } + }, + { + "ruleId": "PRREV-DUP-001", + "level": "note", + "message": { + "text": "The duplication scan found no re-implementation. Its only non-name-collision hits are the filenames of this guard and its debt file on origin/fix/4646-mutants-restore (RESTORE PR #4648), which carries the same two files by design. Remaining hits are the identifier check_rows in unrelated python/rust experiments." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_mutants_debt_ratchet.sh" + }, + "region": { + "startLine": 1 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "measured", + "command": [ + "scripts/pr_review_duplication_scan.sh", + "--base", + "00052c01284caa74c70b287088a79c6dee2959b9", + "--head", + "bd851543c6d65fb6b09d46425669afa944fddc3c", + "--json", + "/tmp/dup4647k.json" + ], + "exit_code": 0, + "stdout_sha256": "9c12f96738a6427e56a7899c856f8021c96a64b2888e8ed253a0eba4a32422c7", + "rationale_note": "stdout_sha256 is over the scan's JSON output file", + "failure_scenario": "If #4648 merged first with divergent copies of these two files, #4647's rebase would conflict on both; expected, as the restore branch deletes the ratchet." + } + }, + { + "ruleId": "PMAT-4651-VERIFY", + "level": "note", + "message": { + "text": "PMAT-4651 verified: exactly five 'expires' lines move 2026-09-30 -> 2026-10-15 in derived_expiries.json (rows 13,15,18,19,21); scripts/lib/spec_conformance.py untouched; spec_conformance.sh exits 0 today; with SPEC_CONFORMANCE_TODAY=2026-10-16 it exits 1 with D6 for rows 13,15,18,19,21 and 22 (row 22 was already 2026-10-15 at the base, not moved). Cosmetic: row 21's prose runs 'impl-PMAT-3556-receipt.md` Re-dated by...' with no sentence break." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "evidence/parity/derived_expiries.json" + }, + "region": { + "startLine": 72 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "measured", + "command": [ + "env", + "SPEC_CONFORMANCE_TODAY=2026-10-16", + "bash", + "scripts/spec_conformance.sh" + ], + "exit_code": 1, + "stdout_sha256": "0af21075b85114ed4ea5f0119ae3265e7311c6a0ef0270299cd14922347a247f", + "failure_scenario": "If a sixth row had moved or the andon were weakened, the 2026-10-16 run would not show D6 for exactly the expired rows; it does." + } + } + ] + }, + { + "tool": { + "driver": { + "name": "cargo-mutants", + "informationUri": "https://github.com/paiml/aprender", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "scoped guard mutation: 12 sed mutants of scripts/check_mutants_debt_ratchet.sh vs its --self-test, run from scratch copies in /tmp/mutscratch; 12 attempted, 12 killed" + } + ], + "results": [] + }, + { + "tool": { + "driver": { + "name": "antigravity", + "informationUri": "https://github.com/paiml/aprender", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "agy -p --model gemini-3.1-pro-high --output-format json --json-schema .pr-review-schema.json --print-timeout 20m --dangerously-skip-permissions (disposable git-archive tree at bd851543c6; diff file omits the debt TSV and prior receipts)" + } + ], + "results": [] + } + ] +} diff --git a/evidence/pr-review/4647/bd851543c6d65fb6b09d46425669afa944fddc3c/receipt.intoto.jsonl b/evidence/pr-review/4647/bd851543c6d65fb6b09d46425669afa944fddc3c/receipt.intoto.jsonl new file mode 100644 index 0000000000..73ba27f7bd --- /dev/null +++ b/evidence/pr-review/4647/bd851543c6d65fb6b09d46425669afa944fddc3c/receipt.intoto.jsonl @@ -0,0 +1 @@ +{"_type":"https://in-toto.io/Statement/v1","subject":[{"name":"git+https://github.com/paiml/aprender","digest":{"sha1":"bd851543c6d65fb6b09d46425669afa944fddc3c"}}],"predicateType":"https://paiml.dev/attestations/pr-review/v2","predicate":{"skill_version":"2.1.0","attestation_level":"L1-self","pr":4647,"base_sha":"00052c01284caa74c70b287088a79c6dee2959b9","head_sha":"bd851543c6d65fb6b09d46425669afa944fddc3c","author_actor":{"kind":"agent","id":"agent:claude-opus-5-5/aprender-ca"},"reviewer_actor":{"kind":"agent","id":"agent:claude-sonnet-5-5/pr-4647-review"},"review_scope":{"tickets":["PMAT-4646","PMAT-4651"],"diff_shortstat":"merge-base diff 00052c0128..bd851543c6, 14 files; prior evidence/pr-review receipts and the 590-row TSV body excluded from review","commits_checked":["bd851543c6 (quotes the PMAT-4646 AC; roadmap yaml parses: yaml.safe_load ok on roadmap.yaml and both entries)","0711f26dc6 (R14-R16 present; --self-test PASSED 16 cases; ci.yml diff is comment+exit block only)","a683b4a528 (zero-row: R13 2->0 GREEN; closes the 65d3fb6202 quorum finding)","65d3fb6202 (PMAT-4651 re-date; see PMAT-4651-VERIFY)"],"not_run":"derived_expiries.json was not regenerated with --write (read-only review); verified by diff and the two spec_conformance runs. No cargo on this host."},"affected_crates":[],"verdict":"FINDINGS","consultations":{"pmat":{"status":"consulted","transport":"cli","transport_unavailable":[],"mcp_attempted":false,"transport_note":"The pmat CLI answered. The pmat MCP server was not tried in this run (not a claim that it is down).","index_commit":"bd851543c6d65fb6b09d46425669afa944fddc3c","index_is_ancestor":true,"index_worktree_dirty":true,"index_worktree_note":"index at .pmat/context.db in this worktree, mtime 16:32:10 after HEAD commit 16:30:58; git status shows only untracked docs/audits/quorum-PMAT-4646.json.","cache_hits":0,"complexity_delta":[],"tdg_delta":[],"satd_introduced":[],"analysis_note":"No .rs file in the diff and pmat computes no complexity/TDG for shell, so those arrays are empty by construction (analyze complexity/tdg not run). satd_introduced is empty on the basis of a marker grep over added lines, not pmat analyze satd. Rust is recorded lexical, since the scan ran without --rust-semantic.","duplication_hits":[{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":69,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":89,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":65,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":66,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":132,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":167,"method":"lexical"},{"needle":"mutants-debt.tsv","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"ci/mutants-debt.tsv","line":0,"method":"lexical"},{"needle":"check_mutants_debt_ratchet.sh","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"scripts/check_mutants_debt_ratchet.sh","line":0,"method":"lexical"}],"duplication_coverage":{"rust":"lexical","shell":"lexical","python":"lexical","config":"lexical","docs":"lexical","other":"lexical","sibling_branches":"lexical","merge_base_to_main":"lexical"},"duplication_horizon":["head=bd851543c6d65fb6b09d46425669afa944fddc3c","siblings=refs/remotes/origin/* unmerged into origin/main","merge_base_to_main=00052c01284caa74c70b287088a79c6dee2959b9..refs/remotes/origin/main"],"horizon_branches_total":1159,"horizon_branches_scanned":1159,"merge_base_to_main_files":0,"symbols_searched":16},"cuda":{"status":"not-triggered","trigger_reason":"check_pr_review_receipt.sh --match-path over every changed path matched none, and --match-message over base..head returned 1 (no match). CI shell, a debt TSV, a bash guard, roadmap YAML, a spec table and a JSON of expiries: no device-behaviour claim."},"crux":{"status":"not-triggered","trigger_reason":"No CLI subcommand, flag, HTTP route, MCP tool, config key or output format of a shipped binary changed, and no comparative performance claim is added; the changes are CI-internal plus a spec re-date.","surfaces":[],"contracts":[],"comparative_claims":[]},"mutation":{"status":"consulted","scope":"guard","attempted":12,"killed":12,"survivors":[],"note":"Scoped to the one changed guard script: 12 sed mutants (file-readable check, NF!=5, outcome set, sha width, run-id regex, mutant-names-file, duplicate check, comm direction, added-check, introduction branch, NF==0 line, rows() comment filter) each run through --self-test; none was a no-op. No committed mutation set exists for this script, so 12/12 is this review's measurement."},"antigravity":{"status":"consulted","attempted":1,"agy_version":"agy 1.2.14","binary_path":"/home/noah/.local/bin/agy","model_id":"gemini-3.1-pro-high","model_family":"google/gemini","exit_code":0,"duration_seconds":281.673188357,"agy_status":"SUCCESS","usage":{"input_tokens":180230,"output_tokens":21680,"thinking_tokens":19195,"cache_read_tokens":1751557,"total_tokens":201910},"output_check":{"structured_output_present":true,"reviewed":true,"schema_valid":true},"reverified_by_primary":false,"divergence":{"agreed":0,"agy_only":0,"primary_only":5,"contradicted":0},"divergence_note":"agy returned reviewed:true with no findings (diff passed as a file, TSV and prior receipts omitted; check-jsonschema ok). It raised none of the five findings recorded here; no opposing conclusion on one subject. model_family records the REQUESTED id; agy emits no model field, so cross-vendor identity is unverified.","findings":[]}},"findings_ref":{"path":"findings.sarif","sha256":"98c1e7354204bffa3eb2972ea14d2e2e682615e59e7e6d204f6095222908a605"},"cost":{"input_tokens":180230,"output_tokens":21680,"wall_seconds":1500,"note":"input/output tokens are the single agy review run; this reviewer session's tokens are not instrumented. wall_seconds approximate."}}} From 163c660a8dccab95ccc1b53885e73d2ae184f2b0 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 17:03:11 +0200 Subject: [PATCH 15/18] evidence(4647): stamp diff_patch_id 41b11c0a into the round-4 receipt (Arm 4 A2 binds on-disk) Agent: aprender-ca Co-Authored-By: Claude Opus 5.5 --- .../receipt.intoto.jsonl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evidence/pr-review/4647/bd851543c6d65fb6b09d46425669afa944fddc3c/receipt.intoto.jsonl b/evidence/pr-review/4647/bd851543c6d65fb6b09d46425669afa944fddc3c/receipt.intoto.jsonl index 73ba27f7bd..3c5cb2cb18 100644 --- a/evidence/pr-review/4647/bd851543c6d65fb6b09d46425669afa944fddc3c/receipt.intoto.jsonl +++ b/evidence/pr-review/4647/bd851543c6d65fb6b09d46425669afa944fddc3c/receipt.intoto.jsonl @@ -1 +1 @@ -{"_type":"https://in-toto.io/Statement/v1","subject":[{"name":"git+https://github.com/paiml/aprender","digest":{"sha1":"bd851543c6d65fb6b09d46425669afa944fddc3c"}}],"predicateType":"https://paiml.dev/attestations/pr-review/v2","predicate":{"skill_version":"2.1.0","attestation_level":"L1-self","pr":4647,"base_sha":"00052c01284caa74c70b287088a79c6dee2959b9","head_sha":"bd851543c6d65fb6b09d46425669afa944fddc3c","author_actor":{"kind":"agent","id":"agent:claude-opus-5-5/aprender-ca"},"reviewer_actor":{"kind":"agent","id":"agent:claude-sonnet-5-5/pr-4647-review"},"review_scope":{"tickets":["PMAT-4646","PMAT-4651"],"diff_shortstat":"merge-base diff 00052c0128..bd851543c6, 14 files; prior evidence/pr-review receipts and the 590-row TSV body excluded from review","commits_checked":["bd851543c6 (quotes the PMAT-4646 AC; roadmap yaml parses: yaml.safe_load ok on roadmap.yaml and both entries)","0711f26dc6 (R14-R16 present; --self-test PASSED 16 cases; ci.yml diff is comment+exit block only)","a683b4a528 (zero-row: R13 2->0 GREEN; closes the 65d3fb6202 quorum finding)","65d3fb6202 (PMAT-4651 re-date; see PMAT-4651-VERIFY)"],"not_run":"derived_expiries.json was not regenerated with --write (read-only review); verified by diff and the two spec_conformance runs. No cargo on this host."},"affected_crates":[],"verdict":"FINDINGS","consultations":{"pmat":{"status":"consulted","transport":"cli","transport_unavailable":[],"mcp_attempted":false,"transport_note":"The pmat CLI answered. The pmat MCP server was not tried in this run (not a claim that it is down).","index_commit":"bd851543c6d65fb6b09d46425669afa944fddc3c","index_is_ancestor":true,"index_worktree_dirty":true,"index_worktree_note":"index at .pmat/context.db in this worktree, mtime 16:32:10 after HEAD commit 16:30:58; git status shows only untracked docs/audits/quorum-PMAT-4646.json.","cache_hits":0,"complexity_delta":[],"tdg_delta":[],"satd_introduced":[],"analysis_note":"No .rs file in the diff and pmat computes no complexity/TDG for shell, so those arrays are empty by construction (analyze complexity/tdg not run). satd_introduced is empty on the basis of a marker grep over added lines, not pmat analyze satd. Rust is recorded lexical, since the scan ran without --rust-semantic.","duplication_hits":[{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":69,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":89,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":65,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":66,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":132,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":167,"method":"lexical"},{"needle":"mutants-debt.tsv","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"ci/mutants-debt.tsv","line":0,"method":"lexical"},{"needle":"check_mutants_debt_ratchet.sh","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"scripts/check_mutants_debt_ratchet.sh","line":0,"method":"lexical"}],"duplication_coverage":{"rust":"lexical","shell":"lexical","python":"lexical","config":"lexical","docs":"lexical","other":"lexical","sibling_branches":"lexical","merge_base_to_main":"lexical"},"duplication_horizon":["head=bd851543c6d65fb6b09d46425669afa944fddc3c","siblings=refs/remotes/origin/* unmerged into origin/main","merge_base_to_main=00052c01284caa74c70b287088a79c6dee2959b9..refs/remotes/origin/main"],"horizon_branches_total":1159,"horizon_branches_scanned":1159,"merge_base_to_main_files":0,"symbols_searched":16},"cuda":{"status":"not-triggered","trigger_reason":"check_pr_review_receipt.sh --match-path over every changed path matched none, and --match-message over base..head returned 1 (no match). CI shell, a debt TSV, a bash guard, roadmap YAML, a spec table and a JSON of expiries: no device-behaviour claim."},"crux":{"status":"not-triggered","trigger_reason":"No CLI subcommand, flag, HTTP route, MCP tool, config key or output format of a shipped binary changed, and no comparative performance claim is added; the changes are CI-internal plus a spec re-date.","surfaces":[],"contracts":[],"comparative_claims":[]},"mutation":{"status":"consulted","scope":"guard","attempted":12,"killed":12,"survivors":[],"note":"Scoped to the one changed guard script: 12 sed mutants (file-readable check, NF!=5, outcome set, sha width, run-id regex, mutant-names-file, duplicate check, comm direction, added-check, introduction branch, NF==0 line, rows() comment filter) each run through --self-test; none was a no-op. No committed mutation set exists for this script, so 12/12 is this review's measurement."},"antigravity":{"status":"consulted","attempted":1,"agy_version":"agy 1.2.14","binary_path":"/home/noah/.local/bin/agy","model_id":"gemini-3.1-pro-high","model_family":"google/gemini","exit_code":0,"duration_seconds":281.673188357,"agy_status":"SUCCESS","usage":{"input_tokens":180230,"output_tokens":21680,"thinking_tokens":19195,"cache_read_tokens":1751557,"total_tokens":201910},"output_check":{"structured_output_present":true,"reviewed":true,"schema_valid":true},"reverified_by_primary":false,"divergence":{"agreed":0,"agy_only":0,"primary_only":5,"contradicted":0},"divergence_note":"agy returned reviewed:true with no findings (diff passed as a file, TSV and prior receipts omitted; check-jsonschema ok). It raised none of the five findings recorded here; no opposing conclusion on one subject. model_family records the REQUESTED id; agy emits no model field, so cross-vendor identity is unverified.","findings":[]}},"findings_ref":{"path":"findings.sarif","sha256":"98c1e7354204bffa3eb2972ea14d2e2e682615e59e7e6d204f6095222908a605"},"cost":{"input_tokens":180230,"output_tokens":21680,"wall_seconds":1500,"note":"input/output tokens are the single agy review run; this reviewer session's tokens are not instrumented. wall_seconds approximate."}}} +{"_type":"https://in-toto.io/Statement/v1","subject":[{"name":"git+https://github.com/paiml/aprender","digest":{"sha1":"bd851543c6d65fb6b09d46425669afa944fddc3c"}}],"predicateType":"https://paiml.dev/attestations/pr-review/v2","predicate":{"skill_version":"2.1.0","attestation_level":"L1-self","pr":4647,"base_sha":"00052c01284caa74c70b287088a79c6dee2959b9","head_sha":"bd851543c6d65fb6b09d46425669afa944fddc3c","author_actor":{"kind":"agent","id":"agent:claude-opus-5-5/aprender-ca"},"reviewer_actor":{"kind":"agent","id":"agent:claude-sonnet-5-5/pr-4647-review"},"review_scope":{"tickets":["PMAT-4646","PMAT-4651"],"diff_shortstat":"merge-base diff 00052c0128..bd851543c6, 14 files; prior evidence/pr-review receipts and the 590-row TSV body excluded from review","commits_checked":["bd851543c6 (quotes the PMAT-4646 AC; roadmap yaml parses: yaml.safe_load ok on roadmap.yaml and both entries)","0711f26dc6 (R14-R16 present; --self-test PASSED 16 cases; ci.yml diff is comment+exit block only)","a683b4a528 (zero-row: R13 2->0 GREEN; closes the 65d3fb6202 quorum finding)","65d3fb6202 (PMAT-4651 re-date; see PMAT-4651-VERIFY)"],"not_run":"derived_expiries.json was not regenerated with --write (read-only review); verified by diff and the two spec_conformance runs. No cargo on this host."},"affected_crates":[],"verdict":"FINDINGS","consultations":{"pmat":{"status":"consulted","transport":"cli","transport_unavailable":[],"mcp_attempted":false,"transport_note":"The pmat CLI answered. The pmat MCP server was not tried in this run (not a claim that it is down).","index_commit":"bd851543c6d65fb6b09d46425669afa944fddc3c","index_is_ancestor":true,"index_worktree_dirty":true,"index_worktree_note":"index at .pmat/context.db in this worktree, mtime 16:32:10 after HEAD commit 16:30:58; git status shows only untracked docs/audits/quorum-PMAT-4646.json.","cache_hits":0,"complexity_delta":[],"tdg_delta":[],"satd_introduced":[],"analysis_note":"No .rs file in the diff and pmat computes no complexity/TDG for shell, so those arrays are empty by construction (analyze complexity/tdg not run). satd_introduced is empty on the basis of a marker grep over added lines, not pmat analyze satd. Rust is recorded lexical, since the scan ran without --rust-semantic.","duplication_hits":[{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":69,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":89,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":65,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":66,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":132,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":167,"method":"lexical"},{"needle":"mutants-debt.tsv","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"ci/mutants-debt.tsv","line":0,"method":"lexical"},{"needle":"check_mutants_debt_ratchet.sh","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"scripts/check_mutants_debt_ratchet.sh","line":0,"method":"lexical"}],"duplication_coverage":{"rust":"lexical","shell":"lexical","python":"lexical","config":"lexical","docs":"lexical","other":"lexical","sibling_branches":"lexical","merge_base_to_main":"lexical"},"duplication_horizon":["head=bd851543c6d65fb6b09d46425669afa944fddc3c","siblings=refs/remotes/origin/* unmerged into origin/main","merge_base_to_main=00052c01284caa74c70b287088a79c6dee2959b9..refs/remotes/origin/main"],"horizon_branches_total":1159,"horizon_branches_scanned":1159,"merge_base_to_main_files":0,"symbols_searched":16},"cuda":{"status":"not-triggered","trigger_reason":"check_pr_review_receipt.sh --match-path over every changed path matched none, and --match-message over base..head returned 1 (no match). CI shell, a debt TSV, a bash guard, roadmap YAML, a spec table and a JSON of expiries: no device-behaviour claim."},"crux":{"status":"not-triggered","trigger_reason":"No CLI subcommand, flag, HTTP route, MCP tool, config key or output format of a shipped binary changed, and no comparative performance claim is added; the changes are CI-internal plus a spec re-date.","surfaces":[],"contracts":[],"comparative_claims":[]},"mutation":{"status":"consulted","scope":"guard","attempted":12,"killed":12,"survivors":[],"note":"Scoped to the one changed guard script: 12 sed mutants (file-readable check, NF!=5, outcome set, sha width, run-id regex, mutant-names-file, duplicate check, comm direction, added-check, introduction branch, NF==0 line, rows() comment filter) each run through --self-test; none was a no-op. No committed mutation set exists for this script, so 12/12 is this review's measurement."},"antigravity":{"status":"consulted","attempted":1,"agy_version":"agy 1.2.14","binary_path":"/home/noah/.local/bin/agy","model_id":"gemini-3.1-pro-high","model_family":"google/gemini","exit_code":0,"duration_seconds":281.673188357,"agy_status":"SUCCESS","usage":{"input_tokens":180230,"output_tokens":21680,"thinking_tokens":19195,"cache_read_tokens":1751557,"total_tokens":201910},"output_check":{"structured_output_present":true,"reviewed":true,"schema_valid":true},"reverified_by_primary":false,"divergence":{"agreed":0,"agy_only":0,"primary_only":5,"contradicted":0},"divergence_note":"agy returned reviewed:true with no findings (diff passed as a file, TSV and prior receipts omitted; check-jsonschema ok). It raised none of the five findings recorded here; no opposing conclusion on one subject. model_family records the REQUESTED id; agy emits no model field, so cross-vendor identity is unverified.","findings":[]}},"findings_ref":{"path":"findings.sarif","sha256":"98c1e7354204bffa3eb2972ea14d2e2e682615e59e7e6d204f6095222908a605"},"cost":{"input_tokens":180230,"output_tokens":21680,"wall_seconds":1500,"note":"input/output tokens are the single agy review run; this reviewer session's tokens are not instrumented. wall_seconds approximate."},"diff_patch_id":"41b11c0a363385a4d9fa6b6b06b681c55fc9099d","diff_patch_id_algo":"git-patch-id-verbatim/pinned-diff-v1"}} From b6ccc0354fa399aaddc8afbc73682f12485bf948 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 19:04:22 +0200 Subject: [PATCH 16/18] =?UTF-8?q?fix(queue):=20#4647=20was=20dequeued=20tw?= =?UTF-8?q?ice=20by=20two=20queue-only=20defects=20=E2=80=94=20R11=20read?= =?UTF-8?q?=20the=20CI=20event,=20Arm=204=20read=20the=20squash?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. check_mutants_debt_ratchet.sh self-test R11/R12 ran the script with the job's GITHUB_EVENT_NAME. Under merge_group, resolve_base accepts a single parent as the base, so "no nameable base" returned rc=0 and R11 failed in the queue only (runs 36888741624, 36890959980). The temp repo is not a CI checkout: the subprocess now runs with -u GITHUB_EVENT_NAME. Proof: GITHUB_EVENT_NAME=merge_group --self-test rc 1 before, rc 0 after; pull_request and unset rc 0 both. 2. pr-review-quorum.yml passed the merge_group head (the queue squash) as ARM4_PR_HEAD_SHA. The signer posts pr-review-signature on the PR head, so every queued PR read UNSIGNED (#4632 run 36602609576; #4647 runs 36888741583, 36890960012). ARM4_PR_HEAD_SHA is now the pull_request event's head (empty on merge_group), and Arm 4 reads the PR head from the pulls API; the job gains pull-requests: read. Proof on queue sha 79594c8362 against the live API: old wiring rc 1 UNSIGNED; new wiring rc 0, signature on 163c660a8d verifies, binds pr=4647 pid=41b11c0a, A3 positive control still rejects a corrupt sig. No gate loosened: same key, same trusted-comment binding, same A2 diff bind. Pmat-Ticket: PMAT-4646 Agent: aprender-27 Co-Authored-By: Claude Opus 5.5 --- .github/workflows/pr-review-quorum.yml | 13 ++++++++++--- scripts/check_mutants_debt_ratchet.sh | 6 ++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pr-review-quorum.yml b/.github/workflows/pr-review-quorum.yml index bf085118c7..d8eb933a73 100644 --- a/.github/workflows/pr-review-quorum.yml +++ b/.github/workflows/pr-review-quorum.yml @@ -64,9 +64,12 @@ jobs: runs-on: [self-hosted, Linux, clean-room] timeout-minutes: 20 # B1 (#4512): read the pr-review-signature check run. Job-scoped, read-only. + # pull-requests: read - in the queue Arm 4 must name the PR's head, which the + # merge_group payload does not carry (see ARM4_PR_HEAD_SHA below). permissions: contents: read checks: read + pull-requests: read if: github.event_name == 'pull_request_target' || github.event_name == 'merge_group' env: # pull_request_target carries the PR; merge_group carries the queue ref @@ -145,8 +148,12 @@ jobs: PR_NUMBER: ${{ steps.resolve.outputs.pr }} PR_HEAD_SHA: ${{ steps.resolve.outputs.head }} # B1: an unsigned-on-disk receipt is judged by the pr-review-signature - # check run on the PR head. The head is resolved above, so Arm 4 needs - # no pulls API read; the check-runs read uses this token (checks: read). - ARM4_PR_HEAD_SHA: ${{ steps.resolve.outputs.head }} + # check run on the PR head; the check-runs read uses this token (checks: read). + # The signer posts that check run on the PR HEAD. On pull_request_target the + # event names it. On merge_group steps.resolve.outputs.head is the QUEUE + # squash, which never carries a signature, so every queued PR read UNSIGNED + # (#4632 run 36602609576, #4647 runs 36888741583/36890960012). There this is + # empty and Arm 4 reads the PR head from the pulls API (pull-requests: read). + ARM4_PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }} GH_TOKEN: ${{ github.token }} run: setsid --wait bash scripts/check_pr_review_arm4.sh diff --git a/scripts/check_mutants_debt_ratchet.sh b/scripts/check_mutants_debt_ratchet.sh index 28afb7d945..b28c480f45 100644 --- a/scripts/check_mutants_debt_ratchet.sh +++ b/scripts/check_mutants_debt_ratchet.sh @@ -117,15 +117,17 @@ self_test() { } case_row_intro # R11: no explicit base and no origin/main (a branch commit with no nameable base) -> resolve_base refuses -> RED + # Hermetic: the temp repo is not a CI checkout. Under GITHUB_EVENT_NAME=merge_group resolve_base accepts a + # single parent as the base, so R11 could never go RED inside the merge queue (#4647 dequeued twice, 2026-10-01). local rc=0 out git -C "$tmp" checkout -q -B c11 base; printf '%s\n' "$r1" > "$tmp/ci/mutants-debt.tsv"; git -C "$tmp" add -A; git -C "$tmp" commit -qm c11 - out=$(cd "$tmp" && env -u MUTANTS_DEBT_BASE bash "$me" 2>&1) || rc=$? + out=$(cd "$tmp" && env -u MUTANTS_DEBT_BASE -u GITHUB_EVENT_NAME bash "$me" 2>&1) || rc=$? if [ "$rc" -eq 1 ] && grep -qF "base unresolvable (resolve_base)" <<<"$out"; then echo "ok R11 rc=1 no nameable base is RED (resolve_base refuses)" else echo "FAIL R11 rc=$rc want=1 no nameable base"; fails=$((fails + 1)); fi # R12: default base via origin/main: a grown file vs origin/main is RED rc=0; git -C "$tmp" update-ref refs/remotes/origin/main base git -C "$tmp" checkout -q -B c12 base; printf '%s\n%s\n%s\n' "$r1" "$r2" "$r3" > "$tmp/ci/mutants-debt.tsv"; git -C "$tmp" add -A; git -C "$tmp" commit -qm c12 - out=$(cd "$tmp" && env -u MUTANTS_DEBT_BASE bash "$me" 2>&1) || rc=$? + out=$(cd "$tmp" && env -u MUTANTS_DEBT_BASE -u GITHUB_EVENT_NAME bash "$me" 2>&1) || rc=$? if [ "$rc" -eq 1 ] && grep -qF "row(s) not in merge base" <<<"$out"; then echo "ok R12 rc=1 default base (origin/main via resolve_base): grown file is RED" else echo "FAIL R12 rc=$rc want=1 default base grown"; fails=$((fails + 1)); fi [ "$fails" -eq 0 ] || { echo "SELF-TEST FAILED: $fails case(s)"; return 1; } # bashrs disable-line=SC2198 (fails is a scalar counter, not an array) From ce8036ebc14c1d54f90507c8b2686f993897a699 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 19:21:09 +0200 Subject: [PATCH 17/18] docs(roadmap): PMAT-4646 AC names the pr-review-quorum.yml queue-only fix (round-5 quorum failed it as out-of-ticket) Operator 2026-09-28 14:52Z pre-approves gate-keeping workflow edits with red/green proof; cop decision c213 (option a). Cites runs 36888741583/36890960012 and queue sha 79594c8362. Pmat-Ticket: PMAT-4646 Agent: aprender-r5 Co-Authored-By: Claude Sonnet 5.5 --- docs/roadmaps/entries/PMAT-4646.yaml | 3 ++- docs/roadmaps/roadmap.yaml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/roadmaps/entries/PMAT-4646.yaml b/docs/roadmaps/entries/PMAT-4646.yaml index 0578b0b4ee..1377fe7dfa 100644 --- a/docs/roadmaps/entries/PMAT-4646.yaml +++ b/docs/roadmaps/entries/PMAT-4646.yaml @@ -12,7 +12,8 @@ - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - 'scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink, a shrink to zero rows, or an unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 16/16 (R1-R16: R14-R16 kill the three surviving guard mutants named by the 1f2e3598ea review)' - The ci gate job reports the mutants section result but does not fail on it; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - - No ruleset change, no timeout raised, no other gate relaxed; the reviewed source diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only. The PR also carries the generated docs/roadmaps/roadmap.yaml and, once reviewed, its own receipt under evidence/pr-review/4647/ and its quorum verdict; those are outputs of review, not part of the diff under review + - No ruleset change, no timeout raised, no other gate relaxed; the reviewed source diff is ci.yml (one marked block), the debt file, the guard script, this roadmap entry and ONE queue-only fix to .github/workflows/pr-review-quorum.yml (below) only. The PR also carries the generated docs/roadmaps/roadmap.yaml and, once reviewed, its own receipt under evidence/pr-review/4647/ and its quorum verdict; those are outputs of review, not part of the diff under review + - '.github/workflows/pr-review-quorum.yml, queue-only fix, operator 2026-09-28 14:52Z (gate-keeping workflow edits with red/green proof are pre-approved): ARM4_PR_HEAD_SHA = github.event.pull_request.head.sha (empty on merge_group, so Arm 4 reads the PR head from the pulls API) and the job permission pull-requests: read. Before, the queue squash was passed as the head and every queued PR read UNSIGNED (runs 36888741583 and 36890960012; #4632 run 36602609576). No gate loosened: the signature must still verify under the repo key and its trusted comment must still name pr=, head= and pid= (the patch-id of the squash diff Arm 4 computes). Red/green on queue sha 79594c8362: old wiring rc 1 UNSIGNED, new rc 0, A3 corrupted-signature control still rejects' - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io - Out of scope, tracked in #4649 - comparing a PR's own mutants survivors with the debt file (a NEW survivor is RED); until then a new survivor is reported, not blocked phases: [] diff --git a/docs/roadmaps/roadmap.yaml b/docs/roadmaps/roadmap.yaml index de7c936713..ce40dacc95 100644 --- a/docs/roadmaps/roadmap.yaml +++ b/docs/roadmaps/roadmap.yaml @@ -22247,7 +22247,8 @@ roadmap: - ci/mutants-debt.tsv lists every known survivor of #4587 run 36725778557 and #4588 run 36703131059 as file, mutant, outcome, sha, run id (5 tab fields; outcome MissedMutant or Timeout) - 'scripts/check_mutants_debt_ratchet.sh is RED on a grown, swapped, malformed, duplicated or missing debt file and on an unresolvable merge base, and GREEN on a shrink, a shrink to zero rows, or an unchanged file; and RED when no base is nameable (resolve_base refuses); its --self-test passes 16/16 (R1-R16: R14-R16 kill the three surviving guard mutants named by the 1f2e3598ea review)' - The ci gate job reports the mutants section result but does not fail on it; every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism) still fails the gate exactly as before - - No ruleset change, no timeout raised, no other gate relaxed; the reviewed source diff is ci.yml (one marked block), the debt file, the guard script and this roadmap entry only. The PR also carries the generated docs/roadmaps/roadmap.yaml and, once reviewed, its own receipt under evidence/pr-review/4647/ and its quorum verdict; those are outputs of review, not part of the diff under review + - No ruleset change, no timeout raised, no other gate relaxed; the reviewed source diff is ci.yml (one marked block), the debt file, the guard script, this roadmap entry and ONE queue-only fix to .github/workflows/pr-review-quorum.yml (below) only. The PR also carries the generated docs/roadmaps/roadmap.yaml and, once reviewed, its own receipt under evidence/pr-review/4647/ and its quorum verdict; those are outputs of review, not part of the diff under review + - '.github/workflows/pr-review-quorum.yml, queue-only fix, operator 2026-09-28 14:52Z (gate-keeping workflow edits with red/green proof are pre-approved): ARM4_PR_HEAD_SHA = github.event.pull_request.head.sha (empty on merge_group, so Arm 4 reads the PR head from the pulls API) and the job permission pull-requests: read. Before, the queue squash was passed as the head and every queued PR read UNSIGNED (runs 36888741583 and 36890960012; #4632 run 36602609576). No gate loosened: the signature must still verify under the repo key and its trusted comment must still name pr=, head= and pid= (the patch-id of the squash diff Arm 4 computes). Red/green on queue sha 79594c8362: old wiring rc 1 UNSIGNED, new rc 0, A3 corrupted-signature control still rejects' - A RESTORE PR (#4648) deletes the ratchet block after v0.70.0 is on crates.io - Out of scope, tracked in #4649 - comparing a PR's own mutants survivors with the debt file (a NEW survivor is RED); until then a new survivor is reported, not blocked phases: [] From 4c0476fc5c0efc161faffa0b4d8f06978358428e Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Thu, 1 Oct 2026 19:28:42 +0200 Subject: [PATCH 18/18] evidence(4647): round-6 review receipt + quorum AGREED (PASS/PASS/PASS) at ce8036ebc1 diff_patch_id c75016cb stamped. Round 5 failed as out-of-ticket; ce8036ebc1 amended the PMAT-4646 AC to name the pr-review-quorum.yml queue-only fix. Pmat-Ticket: PMAT-4646 Agent: aprender-r5 Co-Authored-By: Claude Sonnet 5.5 --- docs/audits/quorum-PMAT-4646.json | 57 ++-- .../findings.sarif | 302 ++++++++++++++++++ .../receipt.intoto.jsonl | 1 + 3 files changed, 332 insertions(+), 28 deletions(-) create mode 100644 evidence/pr-review/4647/ce8036ebc14c1d54f90507c8b2686f993897a699/findings.sarif create mode 100644 evidence/pr-review/4647/ce8036ebc14c1d54f90507c8b2686f993897a699/receipt.intoto.jsonl diff --git a/docs/audits/quorum-PMAT-4646.json b/docs/audits/quorum-PMAT-4646.json index 80b9a868f4..85391b28c5 100644 --- a/docs/audits/quorum-PMAT-4646.json +++ b/docs/audits/quorum-PMAT-4646.json @@ -3,13 +3,13 @@ "base": "origin/main", "base_resolved": "origin/main", "base_note": "no origin/origin/main exists; judged against the local ref; brief_exclude (C45) kept out of the brief: docs/roadmaps/roadmap.yaml", - "head": "bd851543c6d65fb6b09d46425669afa944fddc3c", - "diff_sha256": "cf71b2c0535d103b51038c28d192fb9f4aac37a608bd7f17171eb82cb2eb5eb9", + "head": "ce8036ebc14c1d54f90507c8b2686f993897a699", + "diff_sha256": "0c24a2f8e6681b31e8e7e5bfbe83edadb3c74f0d0879b70a29622e1ad74370f6", "width": 3, "executor": "agy", "prompt_mode": "file", - "prompt_bytes": 207751, - "prompt_sha256": "9278eae9ae09b1790165ab556f556cd6e73d696537e56bb4f4d9b5f9c0e65646", + "prompt_bytes": 238989, + "prompt_sha256": "164ada2b7f8e85a203342ec3fcb8b0573e270ee4cd2d5a1988aaa5f455efc14c", "author": { "model": "claude-opus-5-5", "family": "claude", @@ -21,9 +21,9 @@ "lane": 1, "status": "SUCCESS", "verdict": "PASS", - "summary": "Diff implements both PMAT-4646 and PMAT-4651 as specified. The ci.yml \"gate\" step still exit-1s on every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism-compare) before reaching the new MUTANTS-RATCHET block, which then reports (not blocks) mutants and exits 0 — matching AC \"every other required section still fails exactly as before.\" scripts/check_mutants_debt_ratchet.sh correctly enforces shrink-only semantics (confirmed its NF==0 zero-row path, run-id, file-prefix and NF!=5 checks), auto-wires into guard-tree via `git ls-files 'scripts/check_*.sh'` with no further ci.yml change needed, and its --self-test exercises 16 cases (R1-R16) including R14-R16, which I traced and confirmed actually exercise the three specific guard weaknesses named in the embedded 1f2e3598ea review (empty run id, mid-string file match, 6-field row) — these are real regression tests, not vacuous ones. ci/mutants-debt.tsv's committed rows match the documented 5-tab-field schema and the two cited CI run shas. For PMAT-4651, PP-LLAMA-001-MASTER.md and evidence/parity/derived_expiries.json move exactly rows 13, 15 (18 derived), 19, 21 from 2026-09-30 to 2026-10-15 with an Appendix D row citing operator Noah / ruling C197, and the roadmap entries for both tickets are consistent with their acceptance criteria. No gate was weakened beyond what the ticket explicitly authorizes (mutants ratchet, not a waiver), no timeout changed, and no test asserts the opposite of either ticket.", + "summary": "Diff correctly implements PMAT-4646 (mutants gate -> report-only ratchet, shrink-only debt file) and PMAT-4651 (re-date PP-LLAMA-001 rows 13/15/18/19/21 to 2026-10-15). Verified directly against the live tree: the ci.yml MUTANTS-RATCHET block's `exit 0` sits after WT/guard-tree/guard-cargo/sov.gate/determinism-compare are already enforced (lines 445-466 of .github/workflows/ci.yml), so no other required section is bypassed; only the now-dead GATE-MUTANTS-RULE block below it is skipped, exactly as the ticket requires. scripts/check_mutants_debt_ratchet.sh correctly implements shrink-only semantics including the zero-row edge case (command-substitution newline stripping makes the \"added\" comparison correctly empty when head shrinks to 0 rows), and its --self-test case table (R1-R16) matches the claimed regression coverage, including R14/R15/R16 targeting the three specific guard weaknesses (empty run id, mid-string file match, 6-field row) named by the embedded prior review. check_mutants_debt_ratchet.sh matches the `scripts/check_*.sh` glob that guard_tree.sh's `guard_universe()` enumerates, so it auto-wires with no further ci.yml change, confirming the roadmap AC. The pr-review-quorum.yml Arm 4 fix (pull-requests: read + ARM4_PR_HEAD_SHA falling back to the pulls API on merge_group) is correctly consumed by check_pr_review_arm4.sh's documented fallback (line 176-177), addressing the real defect that queued PRs read UNSIGNED. ci/mutants-debt.tsv (590 data rows) cites both source CI runs (36703131059 and 36725778557) as the roadmap claims. derived_expiries.json changes exactly the five entries keyed 13, 15, 18, 19, 21 (confirmed by tracing JSON key context around each hunk, including the lexicographic \"19\" < \"2\" < \"20\" < \"21\" ordering that made the last hunk's target non-obvious from the diff alone). No gate was weakened beyond what the ticket authorizes, no other section's behavior changed, and the diff's file set matches the AC's stated scope (ci.yml, debt file, guard script, roadmap entries, and the one queue-only pr-review-quorum.yml fix, plus generated evidence/roadmap outputs).", "findings": [], - "raw_bytes": 3950, + "raw_bytes": 5206, "err_bytes": 0, "envelope_status": "SUCCESS", "verdict_source": "structured_output", @@ -34,10 +34,10 @@ "model_measured": "claude-sonnet-5", "model_source": "flag", "family": "claude", - "brief_sha256": "9278eae9ae09b1790165ab556f556cd6e73d696537e56bb4f4d9b5f9c0e65646", + "brief_sha256": "164ada2b7f8e85a203342ec3fcb8b0573e270ee4cd2d5a1988aaa5f455efc14c", "trace": { - "input_sha256": "4f3d6043fa7c1727aa82bfa0f82f939b2f3c2c9e826be9afdbc16da366303790", - "output_sha256": "e29a2c032a211c745a5ec1b7c90d1d51d1351d8ff3d5d2135d9478d4c2fbfb7d", + "input_sha256": "9fc965b78c82c51a89aca2e97e9439408285eb392131c6759d3c91969e6a09ef", + "output_sha256": "012418627691494566b80f7a0794a60b428363bfeb05947ef41725ee91a53059", "store": null, "store_why": "almacen not provisioned yet (infra-27): the blobs stay in the round's gitignored .lanes dir" }, @@ -58,9 +58,9 @@ "lane": 2, "status": "SUCCESS", "verdict": "PASS", - "summary": "Diff implements both PMAT-4646 and PMAT-4651 perfectly as specified. The `ci.yml` `gate` step still exit-1s on every other required section (WT, guard-tree, guard-cargo, sov.gate, determinism-compare) before reaching the new MUTANTS-RATCHET block, which then reports mutants and exits 0 instead of blocking. `scripts/check_mutants_debt_ratchet.sh` correctly enforces shrink-only semantics and its `--self-test` exercises all 16 cases successfully. For PMAT-4651, `PP-LLAMA-001-MASTER.md` and `evidence/parity/derived_expiries.json` move exactly rows 13, 15, 18 (derived), 19, and 21 from 2026-09-30 to 2026-10-15 with an Appendix D row citing operator Noah. No gates were weakened beyond the mutants ratchet, and no test asserts the opposite of the ticket.", + "summary": "The diff correctly implements both tickets. It converts the mutants gate to a ratchet mode backed by a shrink-only `ci/mutants-debt.tsv` and `check_mutants_debt_ratchet.sh` (as requested by PMAT-4646), without affecting other gates. It applies the explicitly requested `pr-review-quorum.yml` queue-only fix. It also redates the five specified speed rows (13, 15, 18, 19, 21) in `PP-LLAMA-001-MASTER.md` to 2026-10-15 and updates `derived_expiries.json` and Appendix D accordingly (as requested by PMAT-4651). No contradictions, unauthorized weakening, or unrequested changes were found.", "findings": [], - "raw_bytes": 2871, + "raw_bytes": 2487, "err_bytes": 0, "envelope_status": "SUCCESS", "verdict_source": "structured_output", @@ -71,10 +71,10 @@ "model_source": "measured", "family": "gemini", "executor": "agy", - "brief_sha256": "9278eae9ae09b1790165ab556f556cd6e73d696537e56bb4f4d9b5f9c0e65646", + "brief_sha256": "164ada2b7f8e85a203342ec3fcb8b0573e270ee4cd2d5a1988aaa5f455efc14c", "trace": { - "input_sha256": "189abd868393c0931ccf01b346068ccaa2a715e20a11255dded73149800be596", - "output_sha256": "680aafd737064b4d8590d6b1a0ef96e9e26fef8fa29de938961d75ed5b2156c1", + "input_sha256": "7a35960478869a956b536cad6296722a614bc3f1a0db6604bdad62482f958e82", + "output_sha256": "67efbd6ff463feae3b4e653be236b4846338bfafdb729bcaa32695cae9a88949", "store": null, "store_why": "almacen not provisioned yet (infra-27): the blobs stay in the round's gitignored .lanes dir" }, @@ -95,9 +95,9 @@ "lane": 3, "status": "SUCCESS", "verdict": "PASS", - "summary": "The diff correctly implements PMAT-4646 and PMAT-4651. The mutants ratchet gate is properly converted to report-only mode with shrink-only baseline enforcement via ci/mutants-debt.tsv and scripts/check_mutants_debt_ratchet.sh. The critical empty-baseline defect is fixed (NF == 0 { next }), and 16 comprehensive self-test cases validate the guard, including R13 for zero-row scenarios (verified by PR #4647 review). PMAT-4651 date re-mapping (rows 13, 15, 18, 19, 21 to 2026-10-15) is complete in both derived_expiries.json and roadmap spec.", + "summary": "The diff correctly implements PMAT-4646 (mutants ratchet mode with shrink-only debt file) and PMAT-4651 (spec re-dating). The ratchet logic is sound: ci/mutants-debt.tsv establishes a baseline of known survivors, check_mutants_debt_ratchet.sh enforces shrink-only semantics with 16 self-test cases, and ci.yml makes mutants report-only until RESTORE PR #4648. The receipt shows proper attestation and evidence collection. No refuting findings.", "findings": [], - "raw_bytes": 2024, + "raw_bytes": 1828, "err_bytes": 0, "envelope_status": "SUCCESS", "verdict_source": "structured_output", @@ -108,10 +108,10 @@ "model_measured": "claude-haiku-4-5", "model_source": "flag", "family": "claude", - "brief_sha256": "9278eae9ae09b1790165ab556f556cd6e73d696537e56bb4f4d9b5f9c0e65646", + "brief_sha256": "164ada2b7f8e85a203342ec3fcb8b0573e270ee4cd2d5a1988aaa5f455efc14c", "trace": { - "input_sha256": "babe04039f5c694c0538ad73b4946f1f2f52597e7b15ef03c24ead9f8abc025f", - "output_sha256": "c4cdfaa95e4013b1f2d0c1bb023b8a1c6f9b16c9bf93ba8d7650fb7ea5c6ab7f", + "input_sha256": "1961d8432a8f3d7fd5893e1d9fa2ef99b7f213280286d40c357dd0fd68442c1a", + "output_sha256": "3bc3a6423130c921c12c186412da2ba8f2f42a99acbc07fbea08349dd4e7b53e", "store": null, "store_why": "almacen not provisioned yet (infra-27): the blobs stay in the round's gitignored .lanes dir" }, @@ -185,9 +185,10 @@ "agy_tier1_only": true, "tier1": true, "matched": [ - ".github/workflows/ci.yml" + ".github/workflows/ci.yml", + ".github/workflows/pr-review-quorum.yml" ], - "paths": 14, + "paths": 18, "patterns": [ "^\\.github/workflows/", "(^|/)release[^/]*\\.(ya?ml|sh|rs|toml)$", @@ -208,13 +209,13 @@ "budget": 0, "basis": "ledger: the calls served before the first 429 of the latest window that reached one", "window_start": 1790861697, - "window_calls": 2, + "window_calls": 10, "window_429": 0, "hour_calls": 2, "share": 1, "want": 2, "state": "empty", - "reason": "agy bucket gemini is empty: 2 calls in this window reach its budget 0 (ledger: the calls served before the first 429 of the latest window that reached one)" + "reason": "agy bucket gemini is empty: 10 calls in this window reach its budget 0 (ledger: the calls served before the first 429 of the latest window that reached one)" } }, "closed": [] @@ -228,7 +229,7 @@ }, "cheap_seat": "claude-haiku-4-5", "canary": { - "skipped": "brief 207751 bytes > 24576" + "skipped": "brief 238989 bytes > 24576" }, "advisory_lane": { "state": "not-run", @@ -237,7 +238,7 @@ "NotRun": "ContextOverflow" }, "verdict": "unavailable", - "why": "the brief is 207751 bytes, over quorum.advisory_lane.max_brief_bytes=196608; a cut brief is a different question, so the lane was not launched", + "why": "the brief is 238989 bytes, over quorum.advisory_lane.max_brief_bytes=196608; a cut brief is a different question, so the lane was not launched", "served_by": null, "gpu_proof": null, "apr": null, @@ -250,10 +251,10 @@ "rc": 0, "wall_s": 0, "collected_s": 0, - "budget_s": 184, - "budget_basis": "ledger: 2 x p95 92 s over 124 gx10-cuda Verdict rows", + "budget_s": 196, + "budget_basis": "ledger: 2 x p95 98 s over 126 gx10-cuda Verdict rows", "brief": { - "bytes": 207751, + "bytes": 238989, "sent_bytes": 0, "max_bytes": 196608 }, diff --git a/evidence/pr-review/4647/ce8036ebc14c1d54f90507c8b2686f993897a699/findings.sarif b/evidence/pr-review/4647/ce8036ebc14c1d54f90507c8b2686f993897a699/findings.sarif new file mode 100644 index 0000000000..77f08b70d0 --- /dev/null +++ b/evidence/pr-review/4647/ce8036ebc14c1d54f90507c8b2686f993897a699/findings.sarif @@ -0,0 +1,302 @@ +{ + "version": "2.1.0", + "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json", + "runs": [ + { + "tool": { + "driver": { + "name": "pmat", + "informationUri": "https://github.com/paiml/pmat", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "pmat query --literal ARM4_PR_HEAD_SHA / pr_head_sha (index at bd851543c6, ancestor of head); scripts/pr_review_duplication_scan.sh (38 s, 1162/1162 branches, 18 needles)" + } + ], + "results": [ + { + "ruleId": "PRREV-R5-001", + "level": "note", + "message": { + "text": "The ARM4_PR_HEAD_SHA change loosens no gate. check_signature (scripts/check_pr_review_arm4.sh:185-227) still requires the signature to verify under the repo key, and its trusted comment to name pr=, head= and pid=. The sig head only selects which check run to read; it is not trusted for content." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_pr_review_arm4.sh" + }, + "region": { + "startLine": 185 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "cited", + "rationale": "Read pr_head_sha (171-178) and check_signature (185-227): the three case-pattern bindings are unchanged by b6ccc0354f, which touches neither file.", + "failure_scenario": "If pid were not compared to the squash patch-id, a reviewed signature could ride an unreviewed diff; it is compared, so this does not occur.", + "source": "scripts/check_pr_review_arm4.sh:222-224 (pid= trusted-comment case, from this run reading the file at head)", + "excerpt": "case \" $tc \" in *\" pid=$pid \"*) ;; *) echo \" A2b the signature is bound to another diff, not patch-id $pid: '$tc'\" >&2; return 1 ;; ", + "excerpt_sha256": "6da038bf447a4451bc203daf8343c66236b1421c149114917d177f5d7ce7311d" + } + }, + { + "ruleId": "PRREV-R5-002", + "level": "note", + "message": { + "text": "pull-requests: read is the minimum for GET /repos/{r}/pulls/{n}, the only call Arm 4 adds. It is job-scoped, read-only, and adds no write, merge or approval path. contents: read and checks: read are unchanged." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": ".github/workflows/pr-review-quorum.yml" + }, + "region": { + "startLine": 72 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "asserted", + "rationale": "GitHub's documented permission for reading a pull request is pull-requests: read; no narrower scope exposes .head.sha.", + "failure_scenario": "A broader scope (write) would let a compromised step edit PR state; none is granted." + } + }, + { + "ruleId": "PRREV-R5-003", + "level": "note", + "message": { + "text": "The pulls-API head can differ from the queued head only if the PR was pushed after queueing. Then the check run read is on a different head, and Arm 4 still requires its trusted comment pid= to equal the patch-id of the squash diff it computed. An unreviewed diff has no signature whose pid matches, so it fails closed. On pull_request_target the event head is used as before (kind=branch returns the subject itself)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_pr_review_arm4.sh" + }, + "region": { + "startLine": 174 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "cited", + "rationale": "Read pr_head_sha: kind=branch short-circuits; the queue falls to ARM4_PR_HEAD_SHA then the API. Then check_signature's pid= case at 222-225.", + "failure_scenario": "PR pushed after queueing with a diff nobody reviewed: pid mismatch, A2b rejects.", + "source": "scripts/check_pr_review_arm4.sh:174-177 (pr_head_sha, read at head)", + "excerpt": "pr_head_sha() { if [ \"$3\" = branch ]; then printf '%s\\n' \"$2\"; return 0; fi if [ -n \"${ARM4_PR_HEAD_SHA:-}\" ]; then printf '%s\\n' \"$ARM4_PR_HEAD_SHA\"; return 0; fi gh api \"repos/${GITHUB_REPOSITORY:?GITHUB_REPOSITORY unset}/pulls/$1\" --jq .head.sha ", + "excerpt_sha256": "b5ae11cb6b9f93b83322bf07677dc232af3101dcac6b60423ac1414ba2755c72" + } + }, + { + "ruleId": "PRREV-R5-004", + "level": "note", + "message": { + "text": "-u GITHUB_EVENT_NAME makes the R11/R12 temp repos hermetic. R11 genuinely needs it (mutant removing it: R11 rc=0 want=1 under GITHUB_EVENT_NAME=merge_group)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_mutants_debt_ratchet.sh" + }, + "region": { + "startLine": 124 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "measured", + "rationale": "GITHUB_EVENT_NAME=merge_group bash scripts/check_mutants_debt_ratchet.sh --self-test: rc 0 on head; rc 1 with the -u removed from R11.", + "failure_scenario": "Without it R11 reads the CI event and fails only inside the merge queue, the defect this commit fixes.", + "command": [ + "bash", + "-c", + "GITHUB_EVENT_NAME=merge_group bash scripts/check_mutants_debt_ratchet.sh --self-test 2>&1 | tail -1" + ], + "exit_code": 0, + "stdout_sha256": "a5356e84578245338f0020e61b0a8f53e0263c0dd51ccaf4c954c0c8f1ae28dc" + } + } + ] + }, + { + "tool": { + "driver": { + "name": "cargo-mutants", + "informationUri": "https://github.com/paiml/aprender", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "scoped guard mutation: 3 sed mutants of scripts/check_mutants_debt_ratchet.sh (drop -u GITHUB_EVENT_NAME at R11, at R12, at both) vs --self-test under GITHUB_EVENT_NAME=merge_group; 3 attempted, 2 killed" + } + ], + "results": [ + { + "ruleId": "PRREV-R5-005", + "level": "note", + "message": { + "text": "Surviving mutant: dropping -u GITHUB_EVENT_NAME at the R12 call (line 130) is not caught. Equivalent, not a coverage hole: R12 sets refs/remotes/origin/main first, so resolve_base takes origin/main before any merge_group single-parent branch. The -u there is defensive only." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_mutants_debt_ratchet.sh" + }, + "region": { + "startLine": 130 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "measured", + "rationale": "With -u removed at line 130 alone, GITHUB_EVENT_NAME=merge_group --self-test rc 0, PASSED 16 cases; with it removed at line 124 or both, rc 1.", + "failure_scenario": "None: no input distinguishes the mutant from the original.", + "command": [ + "bash", + "-c", + "sed -i \"130s/ -u GITHUB_EVENT_NAME//\" scripts/check_mutants_debt_ratchet.sh; GITHUB_EVENT_NAME=merge_group bash scripts/check_mutants_debt_ratchet.sh --self-test 2>&1 | tail -1; git checkout-restore (copy of original)" + ], + "exit_code": 0, + "stdout_sha256": "a5356e84578245338f0020e61b0a8f53e0263c0dd51ccaf4c954c0c8f1ae28dc" + } + } + ] + }, + { + "tool": { + "driver": { + "name": "antigravity", + "informationUri": "https://github.com/paiml/aprender", + "rules": [] + } + }, + "invocations": [ + { + "executionSuccessful": true, + "commandLine": "agy -p --model gemini-3.1-pro-high --output-format json --json-schema .pr-review-schema.json --print-timeout 30m --dangerously-skip-permissions (disposable git-archive tree at b6ccc0354f; diff file omits debt TSV, prior receipts and quorum json)" + } + ], + "results": [ + { + "ruleId": "PRREV-AGY-gate_binding_analysis", + "level": "note", + "message": { + "text": "The change to fall back to the pulls-API head does not loosen key, trusted-comment, or patch-id bindings. The signature's validity is still verified, and its trusted comment `pid` is strictly checked against the patch-id of the queue squash." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_pr_review_arm4.sh" + }, + "region": { + "startLine": 1 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "asserted", + "rationale": "agy marked this measured; agy ran: grep -n pid= scripts/check_pr_review_arm4.sh. Not re-run by the primary reviewer.", + "failure_scenario": "If the signature's trusted comment `pid` were not validated against the queue squash patch-id, an attacker could force-push a reviewed commit to the PR after queuing an unreviewed commit, creating a TOCTOU vulnerability that bypasses the quorum gate." + } + }, + { + "ruleId": "PRREV-AGY-pull_requests_least_privilege", + "level": "note", + "message": { + "text": "The `pull-requests: read` permission is the least privilege required. It only grants read access to pull request metadata to fetch the PR head via the API, granting no write or approval rights." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_pr_review_arm4.sh" + }, + "region": { + "startLine": 1 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "asserted", + "rationale": "agy marked this asserted; agy ran: (no command). Not re-run by the primary reviewer.", + "failure_scenario": "Granting `pull-requests: write` or a broader scope would violate the principle of least privilege, enabling compromised workflows to modify PR state or merge PRs maliciously." + } + }, + { + "ruleId": "PRREV-AGY-pulls_api_head_divergence", + "level": "note", + "message": { + "text": "If the pulls-API head differs from the queued PR's head, an unreviewed diff will not pass. The signature returned from the API head will bind a different patch-id, which `check_signature` rejects when compared to the queue squash's patch-id." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_pr_review_arm4.sh" + }, + "region": { + "startLine": 1 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "asserted", + "rationale": "agy marked this measured; agy ran: sed -n /^check_signature() {/,/^}/p scripts/check_pr_review_arm4.sh. Not re-run by the primary reviewer.", + "failure_scenario": "If an unreviewed commit was queued and a reviewed commit later force-pushed, passing the unreviewed commit would result in unauthorized code merging to main. The mismatch between the API head's patch-id and the queue squash's patch-id prevents this." + } + }, + { + "ruleId": "PRREV-AGY-mutants_ratchet_self_test_hermetic", + "level": "note", + "message": { + "text": "The `-u GITHUB_EVENT_NAME` change in `scripts/check_mutants_debt_ratchet.sh` insulates the self-test from the outer CI environment. This prevents `resolve_base.sh` from mistakenly treating the scratch repository commits as a queue squash during `merge_group` events." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "scripts/check_pr_review_arm4.sh" + }, + "region": { + "startLine": 1 + } + } + } + ], + "properties": { + "precision_class": "advisory", + "grounding": "asserted", + "rationale": "agy marked this measured; agy ran: cat scripts/lib/resolve_base.sh. Not re-run by the primary reviewer.", + "failure_scenario": "Without this unsetting, test case R11 (testing a branch with no nameable base) would incorrectly succeed inside a `merge_group` CI run because `resolve_base.sh` would fall back to single-parent queue logic, causing the self-test suite to fail." + } + } + ] + } + ] +} diff --git a/evidence/pr-review/4647/ce8036ebc14c1d54f90507c8b2686f993897a699/receipt.intoto.jsonl b/evidence/pr-review/4647/ce8036ebc14c1d54f90507c8b2686f993897a699/receipt.intoto.jsonl new file mode 100644 index 0000000000..eba9cefc4b --- /dev/null +++ b/evidence/pr-review/4647/ce8036ebc14c1d54f90507c8b2686f993897a699/receipt.intoto.jsonl @@ -0,0 +1 @@ +{"_type":"https://in-toto.io/Statement/v1","subject":[{"name":"git+https://github.com/paiml/aprender","digest":{"sha1":"ce8036ebc14c1d54f90507c8b2686f993897a699"}}],"predicateType":"https://paiml.dev/attestations/pr-review/v2","predicate":{"skill_version":"2.1.0","attestation_level":"L1-self","pr":4647,"base_sha":"00052c01284caa74c70b287088a79c6dee2959b9","head_sha":"ce8036ebc14c1d54f90507c8b2686f993897a699","author_actor":{"kind":"agent","id":"agent:claude-opus-5-5/aprender-ca"},"reviewer_actor":{"kind":"agent","id":"agent:claude-sonnet-5-5/aprender-r5"},"review_scope":{"tickets":["PMAT-4646","PMAT-4651"],"diff_shortstat":"merge-base diff 00052c0128..ce8036ebc1; round 6 = round 5 plus ce8036ebc1, a docs-only roadmap AC amendment naming the pr-review-quorum.yml hunk (cop decision c213); evidence, quorum json and TSV body excluded","commits_checked":["ce8036ebc1 (PMAT-4646 AC now names the workflow queue-only fix; roadmap aggregate-check ok)","b6ccc0354f (queue-only fixes: R11 -u GITHUB_EVENT_NAME; ARM4_PR_HEAD_SHA = pull_request head, pulls API on merge_group, job pull-requests: read)","bd851543c6..163c660a8d (round 4, reviewed previously: PASS/PASS/PASS)"],"not_run":"No cargo on this host. The workflow was not run in a queue; the pulls-API fallback is judged by reading scripts/check_pr_review_arm4.sh. The cop measured old wiring rc1 UNSIGNED / new rc0 / A3 control rejects; not re-run here."},"affected_crates":[],"verdict":"FINDINGS","consultations":{"pmat":{"status":"consulted","transport":"cli","transport_unavailable":[],"mcp_attempted":false,"transport_note":"The pmat CLI answered. The pmat MCP server was not tried in this run (not a claim that it is down).","index_commit":"bd851543c6d65fb6b09d46425669afa944fddc3c","index_is_ancestor":true,"index_worktree_dirty":true,"index_worktree_note":"index at .pmat/context.db built 16:32 at round-4 head bd851543c6 (an ancestor of b6ccc0354f); the delta is shell and workflow YAML, which pmat does not index for complexity. git status shows only an untracked quorum prompt file.","cache_hits":0,"complexity_delta":[],"tdg_delta":[],"satd_introduced":[],"analysis_note":"No .rs file in the diff; complexity/TDG arrays empty by construction. satd_introduced empty on a marker grep over added lines, not pmat analyze satd. All duplication coverage is lexical.","duplication_coverage":{"rust":"lexical","shell":"lexical","python":"lexical","config":"lexical","docs":"lexical","other":"lexical","sibling_branches":"lexical","merge_base_to_main":"lexical"},"duplication_horizon":["head=ce8036ebc14c1d54f90507c8b2686f993897a699","siblings=refs/remotes/origin/* unmerged into origin/main","merge_base_to_main=00052c01284caa74c70b287088a79c6dee2959b9..refs/remotes/origin/main"],"horizon_branches_total":1162,"horizon_branches_scanned":1162,"merge_base_to_main_files":0,"symbols_searched":18,"duplication_hits":[{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":69,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"evidence/parity/l0-1/intel/qwen35-apr-vs-reference/layerwise/kernel_isolation.py","line":89,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":65,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main.rs","line":66,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":132,"method":"lexical"},{"needle":"check_rows","kind":"name","where":"HEAD","ref":"HEAD","path":"experiments/cuda-oxide/q4k-matvec/src/main_rawptr_abi.rs","line":167,"method":"lexical"},{"needle":"mutants-debt.tsv","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"ci/mutants-debt.tsv","line":0,"method":"lexical"},{"needle":"check_mutants_debt_ratchet.sh","kind":"filename","where":"branch","ref":"origin/fix/4646-mutants-restore","path":"scripts/check_mutants_debt_ratchet.sh","line":0,"method":"lexical"},{"needle":"mutants-debt.tsv","kind":"filename","where":"branch","ref":"origin/prerun/4614","path":"ci/mutants-debt.tsv","line":0,"method":"lexical"},{"needle":"quorum-PMAT-4646.json","kind":"filename","where":"branch","ref":"origin/prerun/4614","path":"docs/audits/quorum-PMAT-4646.json","line":0,"method":"lexical"},{"needle":"PMAT-4646.yaml","kind":"filename","where":"branch","ref":"origin/prerun/4614","path":"docs/roadmaps/entries/PMAT-4646.yaml","line":0,"method":"lexical"},{"needle":"PMAT-4651.yaml","kind":"filename","where":"branch","ref":"origin/prerun/4614","path":"docs/roadmaps/entries/PMAT-4651.yaml","line":0,"method":"lexical"},{"needle":"check_mutants_debt_ratchet.sh","kind":"filename","where":"branch","ref":"origin/prerun/4614","path":"scripts/check_mutants_debt_ratchet.sh","line":0,"method":"lexical"},{"needle":"mutants-debt.tsv","kind":"filename","where":"branch","ref":"origin/prerun/4620","path":"ci/mutants-debt.tsv","line":0,"method":"lexical"},{"needle":"quorum-PMAT-4646.json","kind":"filename","where":"branch","ref":"origin/prerun/4620","path":"docs/audits/quorum-PMAT-4646.json","line":0,"method":"lexical"},{"needle":"PMAT-4646.yaml","kind":"filename","where":"branch","ref":"origin/prerun/4620","path":"docs/roadmaps/entries/PMAT-4646.yaml","line":0,"method":"lexical"},{"needle":"PMAT-4651.yaml","kind":"filename","where":"branch","ref":"origin/prerun/4620","path":"docs/roadmaps/entries/PMAT-4651.yaml","line":0,"method":"lexical"},{"needle":"check_mutants_debt_ratchet.sh","kind":"filename","where":"branch","ref":"origin/prerun/4620","path":"scripts/check_mutants_debt_ratchet.sh","line":0,"method":"lexical"},{"needle":"mutants-debt.tsv","kind":"filename","where":"branch","ref":"origin/rc-rehearsal/0.70","path":"ci/mutants-debt.tsv","line":0,"method":"lexical"},{"needle":"quorum-PMAT-4646.json","kind":"filename","where":"branch","ref":"origin/rc-rehearsal/0.70","path":"docs/audits/quorum-PMAT-4646.json","line":0,"method":"lexical"},{"needle":"PMAT-4646.yaml","kind":"filename","where":"branch","ref":"origin/rc-rehearsal/0.70","path":"docs/roadmaps/entries/PMAT-4646.yaml","line":0,"method":"lexical"},{"needle":"PMAT-4651.yaml","kind":"filename","where":"branch","ref":"origin/rc-rehearsal/0.70","path":"docs/roadmaps/entries/PMAT-4651.yaml","line":0,"method":"lexical"},{"needle":"check_mutants_debt_ratchet.sh","kind":"filename","where":"branch","ref":"origin/rc-rehearsal/0.70","path":"scripts/check_mutants_debt_ratchet.sh","line":0,"method":"lexical"}]},"cuda":{"status":"not-triggered","trigger_reason":"No device-behaviour claim: the delta is CI workflow YAML and a bash guard self-test; the earlier files are unchanged since round 4."},"crux":{"status":"not-triggered","trigger_reason":"No CLI subcommand, flag, route, MCP tool, config key or shipped-binary output changed; CI-internal only.","surfaces":[],"contracts":[],"comparative_claims":[]},"mutation":{"status":"consulted","scope":"guard","attempted":3,"killed":2,"survivors":["scripts/check_mutants_debt_ratchet.sh:130 drop -u GITHUB_EVENT_NAME at R12 - equivalent: R12 sets refs/remotes/origin/main so resolve_base never reaches the merge_group branch"],"note":"3 sed mutants of the changed guard vs --self-test under GITHUB_EVENT_NAME=merge_group (R11 call, R12 call, both); none a no-op. The one survivor is equivalent and named in findings.sarif PRREV-R5-005."},"antigravity":{"status":"consulted","attempted":1,"agy_version":"agy 1.2.14","binary_path":"/home/noah/.local/bin/agy","model_id":"gemini-3.1-pro-high","model_family":"google/gemini","exit_code":0,"duration_seconds":129.608326893,"agy_status":"SUCCESS","usage":{"input_tokens":124510,"output_tokens":12707,"thinking_tokens":11328,"cache_read_tokens":364591,"total_tokens":137217},"output_check":{"structured_output_present":true,"reviewed":true,"schema_valid":true},"reverified_by_primary":false,"divergence":{"agreed":4,"agy_only":0,"primary_only":1,"contradicted":0},"divergence_note":"agy returned 4 findings, all confirmations (no defect): gate binding intact, pull-requests: read least privilege, pulls-API head cannot admit an unreviewed diff, R11/R12 hermetic. They match PRREV-R5-001..004. primary_only is the equivalent R12 mutant. model_family records the REQUESTED id; agy emits no model field, so cross-vendor identity is unverified.","findings":[{"command":["grep","-n","pid=","scripts/check_pr_review_arm4.sh"],"failure_scenario":"If the signature's trusted comment `pid` were not validated against the queue squash patch-id, an attacker could force-push a reviewed commit to the PR after queuing an unreviewed commit, creating a TOCTOU vulnerability that bypasses the quorum gate.","grounding":"measured","id":"gate_binding_analysis","summary":"The change to fall back to the pulls-API head does not loosen key, trusted-comment, or patch-id bindings. The signature's validity is still verified, and its trusted comment `pid` is strictly checked against the patch-id of the queue squash."},{"failure_scenario":"Granting `pull-requests: write` or a broader scope would violate the principle of least privilege, enabling compromised workflows to modify PR state or merge PRs maliciously.","grounding":"asserted","id":"pull_requests_least_privilege","summary":"The `pull-requests: read` permission is the least privilege required. It only grants read access to pull request metadata to fetch the PR head via the API, granting no write or approval rights."},{"command":["sed","-n","/^check_signature() {/,/^}/p","scripts/check_pr_review_arm4.sh"],"failure_scenario":"If an unreviewed commit was queued and a reviewed commit later force-pushed, passing the unreviewed commit would result in unauthorized code merging to main. The mismatch between the API head's patch-id and the queue squash's patch-id prevents this.","grounding":"measured","id":"pulls_api_head_divergence","summary":"If the pulls-API head differs from the queued PR's head, an unreviewed diff will not pass. The signature returned from the API head will bind a different patch-id, which `check_signature` rejects when compared to the queue squash's patch-id."},{"command":["cat","scripts/lib/resolve_base.sh"],"failure_scenario":"Without this unsetting, test case R11 (testing a branch with no nameable base) would incorrectly succeed inside a `merge_group` CI run because `resolve_base.sh` would fall back to single-parent queue logic, causing the self-test suite to fail.","grounding":"measured","id":"mutants_ratchet_self_test_hermetic","summary":"The `-u GITHUB_EVENT_NAME` change in `scripts/check_mutants_debt_ratchet.sh` insulates the self-test from the outer CI environment. This prevents `resolve_base.sh` from mistakenly treating the scratch repository commits as a queue squash during `merge_group` events."}]}},"findings_ref":{"path":"findings.sarif","sha256":"a5d31def59732637364754423f44e3b07b8ae60e59f5115884e6d0817b6c5dbc"},"cost":{"input_tokens":124510,"output_tokens":12707,"wall_seconds":1500,"note":"tokens are the single agy review run; this reviewer session is not instrumented. wall_seconds approximate."},"diff_patch_id":"c75016cbd58050b1b765a0dfbbd211b0ea9e5321","diff_patch_id_algo":"git-patch-id-verbatim/pinned-diff-v1"}}