Skip to content

Commit ebfbd12

Browse files
committed
docs(p022): record the sweep run and level the surfaces to what it proved (#260 sweep.4)
The measurement, and every surface that describes #260 moved to what it says. THE RECORDED RUN. Ten documents over six targets, taken locally at `565de6d`: the five pinned OSS repositories of #243 each at a pin verified by `git rev-parse HEAD` before anything ran, the largest `.sln` of every one of them that has one, and `examples/`. Each document was extracted EXACTLY once through `own-check.sh --emit-facts` and compared from those bytes; the driver read each once, verified it against its `facts_sha256` before any engine started, and named the adapter it executed by digest. Every count is in the generated fragment and nowhere else, including in this commit message. Extraction is reproducible and that was checked rather than assumed: the ten documents were extracted three times on this host and all ten digests are identical across all three passes. WHAT THE MEASUREMENT FOUND — and it is worth stating plainly which half of the system it found it in. **No document diverged.** G.4's three resolution paths were not needed, no fixture under `tests/fixtures/` moved, `BOUNDARY_POLICY` is unwidened, and the owner-decision ledger is untouched because no decision was owed. What it did find is six defects in the HARNESSES, all six invisible on the platform CI runs on: a cross-drive `relpath` that killed the driver on a label; a timeout that never returned when the adapter had children; the control group that would have caught that one, which could not execute on Windows at all; and three in the mutation harness that between them meant no campaign in this repository could be recorded anywhere but Linux. Each is written out in the note's §5 with what it cost to find. Two measured facts about the matrix itself, neither a defect: MaterialDesign- InXamlToolkit carries only the `.slnx` solution format at its pin, which the extractor's classic-format resolver does not read, so that target is covered by its directory walk alone and the record says so per target; and a `.sln` document is not a subset of its directory walk but a differently ORDERED document of the same content — equal byte length, different digest — which is a better control than a subset would have been. THE SURFACES. P-022 row 7a, the proposals index, `spec/Bridge.md` §6 (an eighth point: a comparison is only evidence over a set somebody wrote down first) and the acceptance note's §6/§7 all move from "the sweep is still owed" to what the sweep proved, in their own registers, and none of them says "shadow mode achieved", "P-022 done" or "Rust is the default". The one line #259's review left open is closed in this touch: the final-acceptance note's header said `Status: in execution` while its §7 recorded final acceptance reached. THE CAMPAIGNS. `p022-shadow-sweep-1` is new and covers exactly the ways a sweep could report agreement it never measured — an identity taken from the wrong file, a stale manifest digest waved through, an empty run called agreement, unexplained counted as agreed, a skipped target that fails nothing — plus the five interpreter rules whose removal would let a short run pass. `p022-shadow-acc-1` and `p022-shadow-acc-2` are re-run because this branch moved both their target and their catcher files, and two of `acc-2`'s mutations are re-anchored onto the moved compare path, each still expressing its own rule. All three are recorded on a clean tree with no survivor and no missed catcher. THE WORDING THIS EARNS, and nothing beyond it: dual-engine compare mode reports zero acceptance-unexplained over its full test matrix — the committed corpus, the C# samples, the examples, the five pinned OSS repositories and the large-solution controls — at all three layers and on the derived SARIF, on byte-attested same input, with the OD-1 typed-door boundaries declared by policy; Python remains the public engine. The note's §6 says what is measured rather than claimed: the sweep workflow itself has never executed, because a `workflow_dispatch` workflow is only dispatchable once it is on the default branch; the C# samples leg is this branch's own CI; and the adapter digest names the BUILD rather than the port's source, measured by a clean rebuild of an unchanged tree that produced a different digest at the same byte length. The record names its documents by file name, not by host path. Refs #260, #269, #250, #243 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WPozrRezSfnH9RvQGfn1Nn
1 parent 565de6d commit ebfbd12

15 files changed

Lines changed: 1084 additions & 103 deletions

.github/workflows/ci.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,11 @@ jobs:
7272
- name: cargo test
7373
run: cargo test
7474

75-
# P-022 step 7a (#260) — COMPARE MODE over the committed corpus. Not #260's
76-
# acceptance: the five-repository sweep and the large-solution controls are
77-
# separate work, and nothing here may be read as shadow mode having been
78-
# achieved.
75+
# P-022 step 7a (#260) — COMPARE MODE over the committed corpus: the FAST half
76+
# of #260's test matrix, and one leg of it. The five pinned OSS repositories,
77+
# the large-solution controls and the examples tree are the scheduled/manual
78+
# half and live in `.github/workflows/shadow-sweep.yml`. Nothing here may be
79+
# read as shadow mode having been achieved.
7980
#
8081
# What it gates: every committed facts document through BOTH engines on
8182
# byte-attested same input, failing on any acceptance-`unexplained`

docs/evidence/p022-shadow-acc-1.result.json

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
"campaign": "p022-shadow-acc-1",
55
"definition": "docs/evidence/p022-shadow-acc-1.json",
66
"definition_sha256": "031ec599db9edd3e7be1cbfd8e99f582550c291c43acbe8197a6846d95153e39",
7-
"source_commit": "4c1c9d81972171c3d9c8c1d814debb73a4e471f5",
7+
"source_commit": "1c6a611f1ed8f3a7883896c497c2f443fd0f174c",
88
"dirty": false,
9-
"recorded_at": "2026-09-07T14:47:36Z",
9+
"recorded_at": "2026-09-08T01:58:34Z",
1010
"layers": [
1111
"python",
1212
"python-variants",
@@ -18,7 +18,7 @@
1818
"id": "M00",
1919
"outcome": "survived",
2020
"catchers": [],
21-
"elapsed_seconds": 7.7
21+
"elapsed_seconds": 19.7
2222
},
2323
"mutations": [
2424
{
@@ -27,50 +27,51 @@
2727
"catchers": [
2828
"python-compare::compare-control",
2929
"python-compare::compare-one-read",
30+
"python-compare::compare-summary",
3031
"python::artifact-golden",
3132
"python::capture-verify"
3233
],
33-
"elapsed_seconds": 6.1
34+
"elapsed_seconds": 8.9
3435
},
3536
{
3637
"id": "A02",
3738
"outcome": "caught",
3839
"catchers": [
3940
"rust/tests/engine.rs::this_engine_reproduces_its_committed_capture"
4041
],
41-
"elapsed_seconds": 7.3
42+
"elapsed_seconds": 10.8
4243
},
4344
{
4445
"id": "A03",
4546
"outcome": "caught",
4647
"catchers": [
4748
"python::carry-foreign"
4849
],
49-
"elapsed_seconds": 7.3
50+
"elapsed_seconds": 10.9
5051
},
5152
{
5253
"id": "A04",
5354
"outcome": "caught",
5455
"catchers": [
5556
"python::carry-foreign"
5657
],
57-
"elapsed_seconds": 7.0
58+
"elapsed_seconds": 10.9
5859
},
5960
{
6061
"id": "A05",
6162
"outcome": "caught",
6263
"catchers": [
6364
"python::structural-control"
6465
],
65-
"elapsed_seconds": 7.3
66+
"elapsed_seconds": 10.7
6667
},
6768
{
6869
"id": "A06",
6970
"outcome": "caught",
7071
"catchers": [
7172
"rust/src/lib.rs::base64::tests::a_non_canonical_encoding_is_refused"
7273
],
73-
"elapsed_seconds": 7.5
74+
"elapsed_seconds": 10.8
7475
},
7576
{
7677
"id": "A07",
@@ -83,23 +84,23 @@
8384
"rust/tests/engine.rs::this_engine_reproduces_its_committed_capture",
8485
"rust/tests/repro.rs::every_committed_artifact_round_trips_and_verifies"
8586
],
86-
"elapsed_seconds": 7.7
87+
"elapsed_seconds": 10.6
8788
},
8889
{
8990
"id": "A08",
9091
"outcome": "caught",
9192
"catchers": [
9293
"python::structural-control"
9394
],
94-
"elapsed_seconds": 7.6
95+
"elapsed_seconds": 10.9
9596
},
9697
{
9798
"id": "A09",
9899
"outcome": "caught",
99100
"catchers": [
100101
"rust/tests/repro.rs::verify_refuses_each_structural_violation"
101102
],
102-
"elapsed_seconds": 7.6
103+
"elapsed_seconds": 10.8
103104
},
104105
{
105106
"id": "A10",
@@ -108,23 +109,23 @@
108109
"python-compare::compare-control",
109110
"python::structural-control"
110111
],
111-
"elapsed_seconds": 7.3
112+
"elapsed_seconds": 10.8
112113
},
113114
{
114115
"id": "A11",
115116
"outcome": "caught",
116117
"catchers": [
117118
"rust/tests/repro.rs::verify_refuses_each_structural_violation"
118119
],
119-
"elapsed_seconds": 7.9
120+
"elapsed_seconds": 10.7
120121
},
121122
{
122123
"id": "A12",
123124
"outcome": "caught",
124125
"catchers": [
125126
"python-variants::variant-ledger"
126127
],
127-
"elapsed_seconds": 7.6
128+
"elapsed_seconds": 10.8
128129
}
129130
]
130131
}

docs/evidence/p022-shadow-acc-2.result.json

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
"comment": "Recorded mutation-campaign run (scripts/mutate_campaign.py --run). Raw facts only: outcomes, catchers, provenance. Counts are derived by scripts/render_checkpoint_status.py; regenerate this file by re-running the campaign, never by hand.",
44
"campaign": "p022-shadow-acc-2",
55
"definition": "docs/evidence/p022-shadow-acc-2.json",
6-
"definition_sha256": "a7cb74b7bb120c34a6d139d067f55fee738e3eb00b15b023604de964d392e223",
7-
"source_commit": "4c1c9d81972171c3d9c8c1d814debb73a4e471f5",
6+
"definition_sha256": "49ba5fbd28b7e0ab3b0829aa1e82ae2ac11840926e6c30546f6d458d3c3b8cee",
7+
"source_commit": "1c6a611f1ed8f3a7883896c497c2f443fd0f174c",
88
"dirty": false,
9-
"recorded_at": "2026-09-07T14:49:53Z",
9+
"recorded_at": "2026-09-08T02:01:52Z",
1010
"layers": [
1111
"python",
1212
"python-compare",
@@ -17,7 +17,7 @@
1717
"id": "M00",
1818
"outcome": "survived",
1919
"catchers": [],
20-
"elapsed_seconds": 7.3
20+
"elapsed_seconds": 10.7
2121
},
2222
"mutations": [
2323
{
@@ -28,39 +28,39 @@
2828
"python::reduction-scope",
2929
"python::verdict-pairing"
3030
],
31-
"elapsed_seconds": 5.8
31+
"elapsed_seconds": 8.8
3232
},
3333
{
3434
"id": "B02",
3535
"outcome": "caught",
3636
"catchers": [
3737
"python::reduction-golden"
3838
],
39-
"elapsed_seconds": 6.9
39+
"elapsed_seconds": 10.5
4040
},
4141
{
4242
"id": "B03",
4343
"outcome": "caught",
4444
"catchers": [
4545
"rust/tests/reduce.rs::every_reduction_golden_is_reproduced_byte_for_byte"
4646
],
47-
"elapsed_seconds": 7.1
47+
"elapsed_seconds": 10.7
4848
},
4949
{
5050
"id": "B04",
5151
"outcome": "caught",
5252
"catchers": [
5353
"python::boundary-policy"
5454
],
55-
"elapsed_seconds": 7.2
55+
"elapsed_seconds": 10.7
5656
},
5757
{
5858
"id": "B05",
5959
"outcome": "caught",
6060
"catchers": [
6161
"python::boundary-policy"
6262
],
63-
"elapsed_seconds": 7.0
63+
"elapsed_seconds": 10.8
6464
},
6565
{
6666
"id": "B06",
@@ -69,7 +69,7 @@
6969
"rust/tests/reduce.rs::every_reduction_golden_is_reproduced_byte_for_byte",
7070
"rust/tests/reduce.rs::the_boundary_policy_explains_exactly_what_it_names"
7171
],
72-
"elapsed_seconds": 7.7
72+
"elapsed_seconds": 10.6
7373
},
7474
{
7575
"id": "B07",
@@ -78,7 +78,7 @@
7878
"python::boundary-policy",
7979
"python::reduction-golden"
8080
],
81-
"elapsed_seconds": 7.4
81+
"elapsed_seconds": 10.6
8282
},
8383
{
8484
"id": "B08",
@@ -87,7 +87,7 @@
8787
"rust/tests/reduce.rs::every_reduction_golden_is_reproduced_byte_for_byte",
8888
"rust/tests/reduce.rs::the_boundary_policy_explains_exactly_what_it_names"
8989
],
90-
"elapsed_seconds": 7.4
90+
"elapsed_seconds": 10.8
9191
},
9292
{
9393
"id": "B09",
@@ -97,7 +97,7 @@
9797
"python::reduction-control",
9898
"python::verdict-pairing"
9999
],
100-
"elapsed_seconds": 7.4
100+
"elapsed_seconds": 10.7
101101
},
102102
{
103103
"id": "B10",
@@ -108,7 +108,7 @@
108108
"rust/tests/reduce.rs::the_reducer_is_silent_on_unchanged_data_and_names_a_synthetic_divergence",
109109
"rust/tests/reduce.rs::the_same_fields_in_a_different_key_order_are_a_difference"
110110
],
111-
"elapsed_seconds": 7.4
111+
"elapsed_seconds": 10.6
112112
},
113113
{
114114
"id": "B11",
@@ -117,32 +117,34 @@
117117
"python::trace-golden",
118118
"python::trace-shape"
119119
],
120-
"elapsed_seconds": 7.6
120+
"elapsed_seconds": 10.6
121121
},
122122
{
123123
"id": "B12",
124124
"outcome": "caught",
125125
"catchers": [
126126
"rust/tests/trace.rs::every_trace_golden_is_reproduced_byte_for_byte"
127127
],
128-
"elapsed_seconds": 7.8
128+
"elapsed_seconds": 10.7
129129
},
130130
{
131131
"id": "B13",
132132
"outcome": "caught",
133133
"catchers": [
134+
"python-compare::compare-control",
134135
"python-compare::compare-one-read",
136+
"python-compare::compare-summary",
135137
"python::artifact-golden"
136138
],
137-
"elapsed_seconds": 7.1
139+
"elapsed_seconds": 10.5
138140
},
139141
{
140142
"id": "B14",
141143
"outcome": "caught",
142144
"catchers": [
143145
"rust/tests/engine.rs::this_engine_reproduces_its_committed_capture"
144146
],
145-
"elapsed_seconds": 7.4
147+
"elapsed_seconds": 10.9
146148
},
147149
{
148150
"id": "B15",
@@ -151,32 +153,34 @@
151153
"python-compare::<non-zero exit with no reported failure>",
152154
"python::derived-control"
153155
],
154-
"elapsed_seconds": 7.3
156+
"elapsed_seconds": 7.8
155157
},
156158
{
157159
"id": "B16",
158160
"outcome": "caught",
159161
"catchers": [
162+
"python-compare::compare-adapter-identity",
160163
"python-compare::compare-control"
161164
],
162-
"elapsed_seconds": 7.0
165+
"elapsed_seconds": 10.7
163166
},
164167
{
165168
"id": "B17",
166169
"outcome": "caught",
167170
"catchers": [
168171
"python-compare::compare-control",
169-
"python-compare::compare-one-read"
172+
"python-compare::compare-one-read",
173+
"python-compare::compare-summary"
170174
],
171-
"elapsed_seconds": 7.3
175+
"elapsed_seconds": 10.6
172176
},
173177
{
174178
"id": "B18",
175179
"outcome": "caught",
176180
"catchers": [
177181
"python-compare::compare-control"
178182
],
179-
"elapsed_seconds": 7.5
183+
"elapsed_seconds": 10.5
180184
}
181185
]
182186
}

0 commit comments

Comments
 (0)