From 321ab8b40e527f47423fa43a30c3535828e8e806 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 8 Sep 2026 09:23:03 +0500 Subject: [PATCH 1/3] ci(shadow-sweep): name each leg's facts file by its document id, and record it by that bare name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first CI execution of this workflow produced a record whose ten `source` fields were all `/facts.json` — one absolute runner path, repeated ten times, distinguishing nothing. Two defects in one field. It is a host path in what becomes a permanent artifact, which is the class three previous repairs of this branch existed to remove; and it is a constant wearing provenance's clothes, because every leg wrote the same name, so `id` was doing all the work `source` appeared to do. Each leg now extracts to `/.facts.json` and records that bare name. The manifest already sits in the same directory, and `load_manifest` resolves a relative source against the manifest's own directory, so nothing else has to change: the driver reads the same bytes, the same once, and the assembled record travels without naming the machine that took it. It also matches, literally, the convention the local runs have used since the record was first made portable. No semantics move: not the definition, not the interpreter, not the driver, not the compared documents. The extraction command each leg records is unchanged — it already elided the file as ``. Refs #250, #260 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WPozrRezSfnH9RvQGfn1Nn --- .github/workflows/shadow-sweep.yml | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/.github/workflows/shadow-sweep.yml b/.github/workflows/shadow-sweep.yml index 3b35ef5b..0f53be28 100644 --- a/.github/workflows/shadow-sweep.yml +++ b/.github/workflows/shadow-sweep.yml @@ -166,14 +166,19 @@ jobs: fi echo "extracting: $input" scripts/own-check.sh --format sarif --severity warning \ - --emit-facts "$RUNNER_TEMP/facts.json" -- "$input" \ + --emit-facts "$RUNNER_TEMP/${{ matrix.id }}.facts.json" -- "$input" \ > "$RUNNER_TEMP/findings.sarif.json" - ls -l "$RUNNER_TEMP/facts.json" + ls -l "$RUNNER_TEMP/${{ matrix.id }}.facts.json" - name: Describe the document run: | python - <<'PY' import hashlib, json, os - facts = os.path.join(os.environ["RUNNER_TEMP"], "facts.json") + # The manifest lives BESIDE the facts file and names it by a bare + # file name, so the assembled record carries no runner path; the + # name is the document's id, so `source` says which document it is + # rather than repeating one constant for every leg. + name = "${{ matrix.id }}.facts.json" + facts = os.path.join(os.environ["RUNNER_TEMP"], name) with open(facts, "rb") as f: digest = hashlib.sha256(f.read()).hexdigest() target = "${{ matrix.target }}" @@ -184,7 +189,7 @@ jobs: "targets": [target], "documents": [{ "id": "${{ matrix.id }}", - "source": facts, + "source": name, "target": target, "target_commit": "${{ matrix.commit }}", "extraction_mode": "${{ matrix.mode }}", @@ -241,13 +246,15 @@ jobs: - name: Extract the OwnIR facts, exactly once run: | scripts/own-check.sh --format sarif --severity warning \ - --emit-facts "$RUNNER_TEMP/facts.json" -- examples \ + --emit-facts "$RUNNER_TEMP/examples.facts.json" -- examples \ > "$RUNNER_TEMP/findings.sarif.json" - name: Describe the document run: | python - <<'PY' import hashlib, json, os - facts = os.path.join(os.environ["RUNNER_TEMP"], "facts.json") + # A bare file name, for the reason the document job states. + name = "examples.facts.json" + facts = os.path.join(os.environ["RUNNER_TEMP"], name) with open(facts, "rb") as f: digest = hashlib.sha256(f.read()).hexdigest() manifest = { @@ -255,7 +262,7 @@ jobs: "targets": ["examples"], "documents": [{ "id": "examples", - "source": facts, + "source": name, "target": "examples", "target_commit": os.environ["GITHUB_SHA"], "extraction_mode": "directory-walk", From 062f733048802f51a19a844285c43b42833b2c2e Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 8 Sep 2026 09:29:25 +0500 Subject: [PATCH 2/3] docs(p022): re-record the #260 sweep from its first CI run MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The sweep's record is now the workflow's own run rather than a local one. THE RUN: https://github.com/PhysShell/Own.NET/actions/runs/34186824607, a `workflow_dispatch` execution of `.github/workflows/shadow-sweep.yml` at `321ab8b`, every document leg on `ubuntu-latest` and the path-form leg on `windows-latest`. The aggregation assembled the record from the legs' own artifacts and checked it against the committed definition before the run went green; the bytes committed here are that artifact, downloaded and verified by digest, not re-derived. It REPLACES the local record whole. A re-run replaces a result; it never patches one, and nothing here is merged with what was there. The documents are extracted on Linux, so every raw and canonical identity differs from the local record's — which is the expected shape: the claim is one engine against the other over whichever bytes both received, not a claim about the bytes. Three files: the record, the generated fragment it is rendered into, and the note, whose §1.2, §3, §6 and §7 said the workflow had never executed. §6 also gains what this run measured about the adapter digest, beside what the local run measured. Refs #250, #260 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WPozrRezSfnH9RvQGfn1Nn --- docs/evidence/p022-shadow-sweep.result.json | 132 ++++++++++---------- docs/generated/p022-shadow-sweep.md | 30 ++--- docs/notes/p022-shadow-sweep.md | 52 ++++---- 3 files changed, 112 insertions(+), 102 deletions(-) diff --git a/docs/evidence/p022-shadow-sweep.result.json b/docs/evidence/p022-shadow-sweep.result.json index 948e0b4c..875e1171 100644 --- a/docs/evidence/p022-shadow-sweep.result.json +++ b/docs/evidence/p022-shadow-sweep.result.json @@ -4,15 +4,15 @@ "sweep": "p022-shadow-sweep", "definition": "docs/evidence/p022-shadow-sweep.json", "definition_sha256": "9edfaedd3ba1d1f918cd0f386f33b856f473fa5f2c1cbd4025265ecc06eacd74", - "source_commit": "565de6d49f3d38decbd9117723a39691dcb54aee", - "recorded_at": "2026-09-08T02:04:21Z", - "host": "Windows AMD64", - "workflow_run_url": null, + "source_commit": "321ab8b40e527f47423fa43a30c3535828e8e806", + "recorded_at": "2026-09-08T04:25:38Z", + "host": "Linux x86_64", + "workflow_run_url": "https://github.com/PhysShell/Own.NET/actions/runs/34186824607", "driver_version": 2, "adapters": [ { - "sha256": "94eda8fa31dd8c09443d60904d25c85b2670b584fc732bd787a8ea0458f5d9ef", - "bytes": 1614336 + "sha256": "1c937d122b0dcc4bf5b85660dd1c2b1a8796f83e737f791a7a572f9af80deaf5", + "bytes": 1895280 } ], "documents": [ @@ -23,16 +23,16 @@ "target_commit": "ed0bd149059469ac9bd39b13cf8a341b12a6c1da", "extraction_mode": "directory-walk", "extraction_command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning --emit-facts -- targets/AvalonEdit", - "facts_sha256": "f6e704f252f2dfcd421ab04e34abc301b1ca736965e7cc98ac81b92e1397a504", + "facts_sha256": "be8a026a2bbe35c6a6251d3476bb90c1a78a569b5f9c55814f8e975c4f69059b", "raw": { "algorithm": "sha256", - "digest": "f6e704f252f2dfcd421ab04e34abc301b1ca736965e7cc98ac81b92e1397a504", - "bytes": 34507 + "digest": "be8a026a2bbe35c6a6251d3476bb90c1a78a569b5f9c55814f8e975c4f69059b", + "bytes": 31363 }, "canonical": { "algorithm": "sha256", - "digest": "623af0f59c614bb28a78c02e83c7ccbdb3f6af3c9c493e17e5598f2ad76ec48a", - "bytes": 22130 + "digest": "b214221fc03bf0b8a9f6b5fe02f74c6106eb5ba21e6435fa847a3d88d1726709", + "bytes": 20090 }, "outcome": "agreed", "timeout_seconds": 600.0, @@ -49,7 +49,7 @@ "declared_boundary_observations": 0, "acceptance_unexplained_observations": 0, "derived_outcome": "equal", - "wall_clock_seconds": 0.016 + "wall_clock_seconds": 0.042 }, { "id": "AvalonEdit.sln", @@ -58,16 +58,16 @@ "target_commit": "ed0bd149059469ac9bd39b13cf8a341b12a6c1da", "extraction_mode": "solution", "extraction_command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning --emit-facts -- targets/AvalonEdit/ICSharpCode.AvalonEdit.sln", - "facts_sha256": "a5f2e5b70ff154acbe9a800d291295e34992662d3998ce4f990483bb3cafda2c", + "facts_sha256": "07fbd8d3327d56bd54655284878c5a61f42a30ce8743b87c2422f2768757fade", "raw": { "algorithm": "sha256", - "digest": "a5f2e5b70ff154acbe9a800d291295e34992662d3998ce4f990483bb3cafda2c", - "bytes": 34507 + "digest": "07fbd8d3327d56bd54655284878c5a61f42a30ce8743b87c2422f2768757fade", + "bytes": 31363 }, "canonical": { "algorithm": "sha256", - "digest": "c3515fceb38647a4e1b335221b54e3a04e76e860ac4188d06e14229c598c24fa", - "bytes": 22130 + "digest": "e6a23f1fe276a92ecd3aad3e5b37581ef2c1404365953244624a7c846abc4c82", + "bytes": 20090 }, "outcome": "agreed", "timeout_seconds": 600.0, @@ -84,7 +84,7 @@ "declared_boundary_observations": 0, "acceptance_unexplained_observations": 0, "derived_outcome": "equal", - "wall_clock_seconds": 0.016 + "wall_clock_seconds": 0.041 }, { "id": "ClosedXML.repo", @@ -93,16 +93,16 @@ "target_commit": "4e89dcedd83cad553e84d2d97f77fc3d7deb630f", "extraction_mode": "directory-walk", "extraction_command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning --emit-facts -- targets/ClosedXML", - "facts_sha256": "bbefbfb2089ea0b1ebb2f8a7144c8cbc294ba859fdae6335a72aea58ab8bfc63", + "facts_sha256": "8647eebb3aa0cca8f7b7cdcbf1d02bc1bd10fdcd44454d45bb23f80cc5d254da", "raw": { "algorithm": "sha256", - "digest": "bbefbfb2089ea0b1ebb2f8a7144c8cbc294ba859fdae6335a72aea58ab8bfc63", - "bytes": 201623 + "digest": "8647eebb3aa0cca8f7b7cdcbf1d02bc1bd10fdcd44454d45bb23f80cc5d254da", + "bytes": 181023 }, "canonical": { "algorithm": "sha256", - "digest": "4599cfe379cde82307f10a869d778f11abc56eaedbe0d35aeff680dce81778ed", - "bytes": 109227 + "digest": "9d7baa8ba18b306bc0720924ac97b577cdefe3159dca13771ebf78f8d25bccd7", + "bytes": 96531 }, "outcome": "agreed", "timeout_seconds": 600.0, @@ -119,7 +119,7 @@ "declared_boundary_observations": 0, "acceptance_unexplained_observations": 0, "derived_outcome": "equal", - "wall_clock_seconds": 0.109 + "wall_clock_seconds": 0.196 }, { "id": "ClosedXML.sln", @@ -128,16 +128,16 @@ "target_commit": "4e89dcedd83cad553e84d2d97f77fc3d7deb630f", "extraction_mode": "solution", "extraction_command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning --emit-facts -- targets/ClosedXML/ClosedXML.sln", - "facts_sha256": "ec045c96b3940790ca7a80a3a772f9a831abe98b9834a87b1273f83660dbeb52", + "facts_sha256": "93522a717ca1ce37a69532ed9ced5e55b4a9c27c3a3b16410ab07b32e456556c", "raw": { "algorithm": "sha256", - "digest": "ec045c96b3940790ca7a80a3a772f9a831abe98b9834a87b1273f83660dbeb52", - "bytes": 201623 + "digest": "93522a717ca1ce37a69532ed9ced5e55b4a9c27c3a3b16410ab07b32e456556c", + "bytes": 181023 }, "canonical": { "algorithm": "sha256", - "digest": "c6aabbe11592ff7d41723098df9b663bae08052f8cbb70d33a2bfd91ffb61317", - "bytes": 109227 + "digest": "7ca58a5c37cf879e6188fc856502b77b6fcfd0d51032eb6cd4ef5e5ea371ecea", + "bytes": 96531 }, "outcome": "agreed", "timeout_seconds": 600.0, @@ -154,7 +154,7 @@ "declared_boundary_observations": 0, "acceptance_unexplained_observations": 0, "derived_outcome": "equal", - "wall_clock_seconds": 0.109 + "wall_clock_seconds": 0.128 }, { "id": "MahApps.Metro.repo", @@ -163,16 +163,16 @@ "target_commit": "72099e310bac2d12ac98fd7560b69679252519f5", "extraction_mode": "directory-walk", "extraction_command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning --emit-facts -- targets/MahApps.Metro", - "facts_sha256": "f6a22fecf1bbb63eac26d72cdcce6db620206c32da90f78ef96fa038c81333b8", + "facts_sha256": "b9e24898f818b7b1fb85698d880a32017178e83096670dfb79937bf5495fa3bc", "raw": { "algorithm": "sha256", - "digest": "f6a22fecf1bbb63eac26d72cdcce6db620206c32da90f78ef96fa038c81333b8", - "bytes": 44712 + "digest": "b9e24898f818b7b1fb85698d880a32017178e83096670dfb79937bf5495fa3bc", + "bytes": 41578 }, "canonical": { "algorithm": "sha256", - "digest": "a1f0d30bcad70d8267fc9d9abfa1688a8406c2955f59ed789e2ac3e9fb539021", - "bytes": 28765 + "digest": "6d5442713b57e78c422a67d85f735eb14b8261b84c6e0c30cb0a714480858a8b", + "bytes": 27017 }, "outcome": "agreed", "timeout_seconds": 600.0, @@ -189,7 +189,7 @@ "declared_boundary_observations": 0, "acceptance_unexplained_observations": 0, "derived_outcome": "equal", - "wall_clock_seconds": 0.031 + "wall_clock_seconds": 0.046 }, { "id": "MahApps.Metro.sln", @@ -198,16 +198,16 @@ "target_commit": "72099e310bac2d12ac98fd7560b69679252519f5", "extraction_mode": "solution", "extraction_command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning --emit-facts -- targets/MahApps.Metro/src/MahApps.Metro.sln", - "facts_sha256": "97f644b3b58a3eea26aa39d1a1d8aa22917e4e7317d4bd20a08ee657eb16d0e3", + "facts_sha256": "b50509db92311bd329d45475f525d5ac39dace3834c9afe56f300ccf86239c6a", "raw": { "algorithm": "sha256", - "digest": "97f644b3b58a3eea26aa39d1a1d8aa22917e4e7317d4bd20a08ee657eb16d0e3", - "bytes": 44712 + "digest": "b50509db92311bd329d45475f525d5ac39dace3834c9afe56f300ccf86239c6a", + "bytes": 41578 }, "canonical": { "algorithm": "sha256", - "digest": "d9ffd61f879be57026e145239d6d90dfa5ac506635afd575990d2940ef9fd8ca", - "bytes": 28765 + "digest": "14c2ad831613239af53fab0d6c19db82cfa7ddbfb3b425fbb8d72ea141a36ef2", + "bytes": 27017 }, "outcome": "agreed", "timeout_seconds": 600.0, @@ -224,7 +224,7 @@ "declared_boundary_observations": 0, "acceptance_unexplained_observations": 0, "derived_outcome": "equal", - "wall_clock_seconds": 0.016 + "wall_clock_seconds": 0.046 }, { "id": "MaterialDesignInXamlToolkit.repo", @@ -233,16 +233,16 @@ "target_commit": "ef3a5ea434e39182b1848f5e11aaea6b3890581f", "extraction_mode": "directory-walk", "extraction_command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning --emit-facts -- targets/MaterialDesignInXamlToolkit", - "facts_sha256": "c0fa752cbe2dc0ce73d49ae8df56ebf676f844c3bb409e897405b36811c83ad3", + "facts_sha256": "05f0354706539dc0990527f8807eef5c5853c72a3c9b48e79c0f18673974926c", "raw": { "algorithm": "sha256", - "digest": "c0fa752cbe2dc0ce73d49ae8df56ebf676f844c3bb409e897405b36811c83ad3", - "bytes": 53007 + "digest": "05f0354706539dc0990527f8807eef5c5853c72a3c9b48e79c0f18673974926c", + "bytes": 48513 }, "canonical": { "algorithm": "sha256", - "digest": "3fd3416e502adff71f07de87489351cb2d3b7faf599ee879b1dd2b7c475c0c18", - "bytes": 35466 + "digest": "0cd808188b9a394872b1a92bb09b903a82ac40f228d79cec50ccc22581b0b25f", + "bytes": 32546 }, "outcome": "agreed", "timeout_seconds": 600.0, @@ -259,7 +259,7 @@ "declared_boundary_observations": 0, "acceptance_unexplained_observations": 0, "derived_outcome": "equal", - "wall_clock_seconds": 0.031 + "wall_clock_seconds": 0.047 }, { "id": "ShareX.repo", @@ -268,16 +268,16 @@ "target_commit": "0df9ca4d83eed9d2489048c539d7d1fc2860fdec", "extraction_mode": "directory-walk", "extraction_command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning --emit-facts -- targets/ShareX", - "facts_sha256": "8d94ea78b8ff26a45e41f5341d678de9912a1ea401a7d702451f4f1fa2a91f8a", + "facts_sha256": "055d8b4bb4126e1e539b96a131855b2ae9133c22cb44fc1172bd7dd4f2967f57", "raw": { "algorithm": "sha256", - "digest": "8d94ea78b8ff26a45e41f5341d678de9912a1ea401a7d702451f4f1fa2a91f8a", - "bytes": 249448 + "digest": "055d8b4bb4126e1e539b96a131855b2ae9133c22cb44fc1172bd7dd4f2967f57", + "bytes": 232591 }, "canonical": { "algorithm": "sha256", - "digest": "f3a30f10ac17dd830e756f751110e732d17898e6f0f6307fa9a436d6a5d1a851", - "bytes": 128850 + "digest": "68acb3b245b11618355aa72f326039da9eaca1c1ebf34f9b08337b3a40417382", + "bytes": 120570 }, "outcome": "agreed", "timeout_seconds": 600.0, @@ -294,7 +294,7 @@ "declared_boundary_observations": 0, "acceptance_unexplained_observations": 0, "derived_outcome": "equal", - "wall_clock_seconds": 0.187 + "wall_clock_seconds": 0.199 }, { "id": "ShareX.sln", @@ -303,16 +303,16 @@ "target_commit": "0df9ca4d83eed9d2489048c539d7d1fc2860fdec", "extraction_mode": "solution", "extraction_command": "OWN_EXTRA_REF_DIRS= scripts/own-check.sh --format sarif --severity warning --emit-facts -- targets/ShareX/ShareX.sln", - "facts_sha256": "f01fa1d3d9ef4ae9a08e45890ff5f8d49dc6d05730edfa58018a581a912601de", + "facts_sha256": "f3555bb8f86deeb63ef3d928b44baeba0c7083f10508c9e3b01e36455331cbf1", "raw": { "algorithm": "sha256", - "digest": "f01fa1d3d9ef4ae9a08e45890ff5f8d49dc6d05730edfa58018a581a912601de", - "bytes": 249448 + "digest": "f3555bb8f86deeb63ef3d928b44baeba0c7083f10508c9e3b01e36455331cbf1", + "bytes": 232591 }, "canonical": { "algorithm": "sha256", - "digest": "3a2c3c5eea1cebd612b22bbc1a30cb46a8db39787f6b80c30a5d9d048561c8db", - "bytes": 128850 + "digest": "d14138d99358e7e315001e42984940e8b0e796426610d2dba57b982f6d993a67", + "bytes": 120570 }, "outcome": "agreed", "timeout_seconds": 600.0, @@ -329,24 +329,24 @@ "declared_boundary_observations": 0, "acceptance_unexplained_observations": 0, "derived_outcome": "equal", - "wall_clock_seconds": 0.094 + "wall_clock_seconds": 0.184 }, { "id": "examples", "source": "examples.facts.json", "target": "examples", - "target_commit": "565de6d49f3d38decbd9117723a39691dcb54aee", + "target_commit": "321ab8b40e527f47423fa43a30c3535828e8e806", "extraction_mode": "directory-walk", "extraction_command": "scripts/own-check.sh --format sarif --severity warning --emit-facts -- examples", - "facts_sha256": "01e617d820d76af1f78057494db4cf065e2d845a84f683b9ce1d574f288f0050", + "facts_sha256": "624df0fe52c4ffc06cb93224f1370b7374a1ab92f2a283f55914eb58c8e4ec40", "raw": { "algorithm": "sha256", - "digest": "01e617d820d76af1f78057494db4cf065e2d845a84f683b9ce1d574f288f0050", - "bytes": 13291 + "digest": "624df0fe52c4ffc06cb93224f1370b7374a1ab92f2a283f55914eb58c8e4ec40", + "bytes": 12721 }, "canonical": { "algorithm": "sha256", - "digest": "322523ad9073af842ebcb0a0f8480abfb267f22404de47dc55f37eb01808bf71", + "digest": "17cf2d6c48af9f3aeee470b9a5ef7b9242fc297b1bf4fe55f0fbb8428f2948f5", "bytes": 6705 }, "outcome": "agreed", @@ -364,7 +364,7 @@ "declared_boundary_observations": 0, "acceptance_unexplained_observations": 0, "derived_outcome": "equal", - "wall_clock_seconds": 0.016 + "wall_clock_seconds": 0.024 } ], "targets": [ diff --git a/docs/generated/p022-shadow-sweep.md b/docs/generated/p022-shadow-sweep.md index 4188e4c1..ad096e14 100644 --- a/docs/generated/p022-shadow-sweep.md +++ b/docs/generated/p022-shadow-sweep.md @@ -21,10 +21,10 @@ nothing reached. | what | value | |---|---| -| Own.NET commit | `565de6d49f3d38decbd9117723a39691dcb54aee` | -| recorded at | 2026-09-08T02:04:21Z | -| host | Windows AMD64 | -| where | a local run (no workflow run URL) | +| Own.NET commit | `321ab8b40e527f47423fa43a30c3535828e8e806` | +| recorded at | 2026-09-08T04:25:38Z | +| host | Linux x86_64 | +| where | [the workflow run](https://github.com/PhysShell/Own.NET/actions/runs/34186824607) | | driver | `shadow_compare_version` 2 | The adapter each leg executed, by digest — a path is not an identity, so a @@ -32,22 +32,22 @@ stale build cannot stand in for the engine that was meant: | `own-shadow-engine` sha256 | bytes | |---|---:| -| `94eda8fa31dd8c09443d60904d25c85b2670b584fc732bd787a8ea0458f5d9ef` | 1614336 | +| `1c937d122b0dcc4bf5b85660dd1c2b1a8796f83e737f791a7a572f9af80deaf5` | 1895280 | ## The documents | document | target | mode | pin | raw bytes | raw sha256 | canonical sha256 | reduction | derived SARIF | declared-boundary | unexplained | wall clock (s) | timeout (s) | |---|---|---|---|---:|---|---|---|---|---:|---:|---:|---:| -| `AvalonEdit.repo` | `AvalonEdit` | directory-walk | `ed0bd1490594` | 34507 | `f6e704f252f2` | `623af0f59c61` | identical | equal | 0 | 0 | 0.02 | 600 | -| `AvalonEdit.sln` | `AvalonEdit` | solution | `ed0bd1490594` | 34507 | `a5f2e5b70ff1` | `c3515fceb386` | identical | equal | 0 | 0 | 0.02 | 600 | -| `ClosedXML.repo` | `ClosedXML` | directory-walk | `4e89dcedd83c` | 201623 | `bbefbfb2089e` | `4599cfe379cd` | identical | equal | 0 | 0 | 0.11 | 600 | -| `ClosedXML.sln` | `ClosedXML` | solution | `4e89dcedd83c` | 201623 | `ec045c96b394` | `c6aabbe11592` | identical | equal | 0 | 0 | 0.11 | 600 | -| `MahApps.Metro.repo` | `MahApps.Metro` | directory-walk | `72099e310bac` | 44712 | `f6a22fecf1bb` | `a1f0d30bcad7` | identical | equal | 0 | 0 | 0.03 | 600 | -| `MahApps.Metro.sln` | `MahApps.Metro` | solution | `72099e310bac` | 44712 | `97f644b3b58a` | `d9ffd61f879b` | identical | equal | 0 | 0 | 0.02 | 600 | -| `MaterialDesignInXamlToolkit.repo` | `MaterialDesignInXamlToolkit` | directory-walk | `ef3a5ea434e3` | 53007 | `c0fa752cbe2d` | `3fd3416e502a` | identical | equal | 0 | 0 | 0.03 | 600 | -| `ShareX.repo` | `ShareX` | directory-walk | `0df9ca4d83ee` | 249448 | `8d94ea78b8ff` | `f3a30f10ac17` | identical | equal | 0 | 0 | 0.19 | 600 | -| `ShareX.sln` | `ShareX` | solution | `0df9ca4d83ee` | 249448 | `f01fa1d3d9ef` | `3a2c3c5eea1c` | identical | equal | 0 | 0 | 0.09 | 600 | -| `examples` | `examples` | directory-walk | `565de6d49f3d` | 13291 | `01e617d820d7` | `322523ad9073` | identical | equal | 0 | 0 | 0.02 | 600 | +| `AvalonEdit.repo` | `AvalonEdit` | directory-walk | `ed0bd1490594` | 31363 | `be8a026a2bbe` | `b214221fc03b` | identical | equal | 0 | 0 | 0.04 | 600 | +| `AvalonEdit.sln` | `AvalonEdit` | solution | `ed0bd1490594` | 31363 | `07fbd8d3327d` | `e6a23f1fe276` | identical | equal | 0 | 0 | 0.04 | 600 | +| `ClosedXML.repo` | `ClosedXML` | directory-walk | `4e89dcedd83c` | 181023 | `8647eebb3aa0` | `9d7baa8ba18b` | identical | equal | 0 | 0 | 0.20 | 600 | +| `ClosedXML.sln` | `ClosedXML` | solution | `4e89dcedd83c` | 181023 | `93522a717ca1` | `7ca58a5c37cf` | identical | equal | 0 | 0 | 0.13 | 600 | +| `MahApps.Metro.repo` | `MahApps.Metro` | directory-walk | `72099e310bac` | 41578 | `b9e24898f818` | `6d5442713b57` | identical | equal | 0 | 0 | 0.05 | 600 | +| `MahApps.Metro.sln` | `MahApps.Metro` | solution | `72099e310bac` | 41578 | `b50509db9231` | `14c2ad831613` | identical | equal | 0 | 0 | 0.05 | 600 | +| `MaterialDesignInXamlToolkit.repo` | `MaterialDesignInXamlToolkit` | directory-walk | `ef3a5ea434e3` | 48513 | `05f035470653` | `0cd808188b9a` | identical | equal | 0 | 0 | 0.05 | 600 | +| `ShareX.repo` | `ShareX` | directory-walk | `0df9ca4d83ee` | 232591 | `055d8b4bb412` | `68acb3b245b1` | identical | equal | 0 | 0 | 0.20 | 600 | +| `ShareX.sln` | `ShareX` | solution | `0df9ca4d83ee` | 232591 | `f3555bb8f86d` | `d14138d99358` | identical | equal | 0 | 0 | 0.18 | 600 | +| `examples` | `examples` | directory-walk | `321ab8b40e52` | 12721 | `624df0fe52c4` | `17cf2d6c48af` | identical | equal | 0 | 0 | 0.02 | 600 | ## The denominators, per target diff --git a/docs/notes/p022-shadow-sweep.md b/docs/notes/p022-shadow-sweep.md index 58820643..c6af1969 100644 --- a/docs/notes/p022-shadow-sweep.md +++ b/docs/notes/p022-shadow-sweep.md @@ -57,9 +57,10 @@ compared *an* engine, not *the* engine. ### 1.2 What this environment is This environment **can** run the whole matrix, so it does: the G.0 fallback -(take the measurement through the workflow and read its artifacts back) is not -used, and the recorded run is a local one whose commands, commits and artifact -identities are on the record. What made that possible, measured rather than +(take the measurement through the workflow and read its artifacts back) was not +needed for the FIRST record, a local run whose commands, commits and artifact +identities were on the record; the record now on file is the CI run of §3, which +replaced it whole. What made that possible, measured rather than assumed: | capability | what is present | @@ -299,7 +300,9 @@ goes through. **A re-run replaces the result whole; it is never patched.** ## §3 — What ran, and what it found -One run, taken locally at `565de6d`, recorded whole in +One run, taken in CI at `321ab8b` ([run 34186824607](https://github.com/PhysShell/Own.NET/actions/runs/34186824607), +the first execution of `.github/workflows/shadow-sweep.yml`, every leg on +`ubuntu-latest` and the path-form leg on `windows-latest`), recorded whole in [`docs/evidence/p022-shadow-sweep.result.json`](../evidence/p022-shadow-sweep.result.json) and interpreted into [`docs/generated/p022-shadow-sweep.md`](../generated/p022-shadow-sweep.md), @@ -310,6 +313,11 @@ that was in force. Per **target** it names the denominators: documents extracted, documents compared, and the outcome breakdown — so a target that had been skipped would appear at zero rather than not appear at all. +It replaces the first record, a local run taken on a Windows host at the branch +commit the note below still describes; a re-run replaces the result whole and +never patches it, and the local run's identities are in the history of this +file, not on it. + **The environment, exactly as §1.2 promised and with the two differences from the 2026-07-12 remeasure on the record.** The extractor is the pinned `Microsoft.CodeAnalysis.CSharp` 4.9.2 built by a .NET 10.0.400 SDK against the @@ -465,25 +473,24 @@ Two measured facts about the matrix itself, neither of them a defect: the committed-corpus gate compares clean over every committed document, the driver's own controls run and pass under `OWN_SHADOW_COMPARE_REQUIRED=1`, and the sweep's own ten documents were compared on the same host with paths on a - different drive from the checkout. What is **not** claimed: anything about - GitHub's `windows-latest` runner. The job is wired in - `.github/workflows/shadow-sweep.yml` and has not run, because a - `workflow_dispatch` workflow is only dispatchable once it is on the default - branch. -* **Linux path forms.** Not exercised by this run. They are exercised by the - fast gate that already exists — `shadow compare (committed corpus)` and - `shadow compare (C# samples)` are `ubuntu-latest` jobs in `ci.yml` — and the - sweep workflow's own legs are `ubuntu-latest` too, unrun for the reason - above. + different drive from the checkout. The `windows-latest` leg of the sweep workflow + has since run green in the recorded CI run: the committed-corpus gate and the + driver's controls under `OWN_SHADOW_COMPARE_REQUIRED=1`, with an adapter built + on that runner. +* **Linux path forms.** Exercised by the recorded CI run: every document leg is + `ubuntu-latest`, so the ten documents were extracted and compared on Linux + path forms; the fast gate in `ci.yml` has been `ubuntu-latest` since PR #342. * **The C# samples.** Not re-measured here: that leg is a CI job fed by the `wpf-extractor` job's own OwnIR through one upload-artifact handshake, and it compared clean on `main` when PR #342 landed it. This branch's CI re-measures it; nothing in this note stands in for that result. -* **The sweep workflow itself.** Written and committed, never executed. The - recorded run is a **local** one, which is what #260 allows ("the - five-repository sweep may use a local/corpus-capable agent, but its commands, - commits and output artifacts must be recorded"), and the record carries - `workflow_run_url: null` rather than pretending otherwise. +* **The sweep workflow itself.** Executed: the recorded run IS its first + execution, on `main` at `4520a54`; every leg green, the aggregation assembled + the record from the legs' artifacts and checked it against the committed + definition, and `workflow_run_url` names it. The first record was a local run, + which #260 allowed; it was superseded whole by this one. A `workflow_dispatch` + workflow is dispatchable only once it is on the default branch, which is why + the first record could not be a CI run. * **Precision.** This sweep does not re-measure it. The finding counts the extractor produced over the five targets are not compared with #243's, and they would not be comparable: many analyses have landed since, and two @@ -497,7 +504,10 @@ Two measured facts about the matrix itself, neither of them a defect: can never stand in for the engine that was meant" — and it is emphatically not a content hash of the port: two legs of one sweep on two runners will name two digests, which is why the record carries the SET of adapters a run executed - rather than asserting one. + rather than asserting one. The recorded CI run measures the other side of + that: its `ubuntu-latest` legs each built the adapter independently and + produced one distinct digest between them, so irreproducibility is a + property of a build environment rather than of the port. * **The five repositories' facts documents are not in the repository.** Their identities are: the raw digest and byte length of each, and the canonical identity both engines derived from it, are in the recorded run. They are @@ -556,7 +566,7 @@ OWN_SHADOW_ENGINE= \ OWN_SHADOW_ENGINE= OWN_SHADOW_COMPARE_REQUIRED=1 \ python tests/test_shadow_compare.py -# the sweep in CI, once this workflow is on the default branch +# the sweep in CI (on the default branch) gh workflow run "shadow sweep (#260)" # the campaigns re-run in this branch, and the new one From 7ec03842269982a98bf81513daa6698a83dfa93e Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 8 Sep 2026 09:55:13 +0500 Subject: [PATCH 3/3] docs(p022): the sweep note names the run it records MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two sentences in the note described a run that is not the one on file. §3 called the recorded run "the first execution of the workflow" and §6 said "the recorded run IS its first execution, on `main` at `4520a54`". Both are false. The record on file is run 34186824607, dispatched by this PR's branch ref at `321ab8b` so that it executed the workflow as amended by this PR's first commit. The workflow's genuine first execution, run 34181417914 on `main`, agreed on every document but recorded each document's `source` as the runner's temp path — a constant dressed as provenance — which is exactly what the first commit fixes, and it is therefore not the record. The sentences came from wordings written for that first run and applied unchanged after the plan moved to a branch-ref dispatch; the diff is the two passages and nothing else. §6 now also says what the superseded run was, so the reader is not left inferring why a green CI run is not the one on file. The PR title is corrected in place for the same reason. The subject of the commit that carries the record keeps its wording: it is imprecise rather than false, and history is not rewritten for a phrasing. Refs #250, #260 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WPozrRezSfnH9RvQGfn1Nn --- docs/notes/p022-shadow-sweep.md | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/docs/notes/p022-shadow-sweep.md b/docs/notes/p022-shadow-sweep.md index c6af1969..ad40a670 100644 --- a/docs/notes/p022-shadow-sweep.md +++ b/docs/notes/p022-shadow-sweep.md @@ -301,8 +301,10 @@ goes through. **A re-run replaces the result whole; it is never patched.** ## §3 — What ran, and what it found One run, taken in CI at `321ab8b` ([run 34186824607](https://github.com/PhysShell/Own.NET/actions/runs/34186824607), -the first execution of `.github/workflows/shadow-sweep.yml`, every leg on -`ubuntu-latest` and the path-form leg on `windows-latest`), recorded whole in +a dispatch of `.github/workflows/shadow-sweep.yml` by the branch ref of +PR #344, after that PR's first commit taught each leg to name its document by +id; every leg on `ubuntu-latest` and the path-form leg on `windows-latest`), +recorded whole in [`docs/evidence/p022-shadow-sweep.result.json`](../evidence/p022-shadow-sweep.result.json) and interpreted into [`docs/generated/p022-shadow-sweep.md`](../generated/p022-shadow-sweep.md), @@ -484,13 +486,19 @@ Two measured facts about the matrix itself, neither of them a defect: `wpf-extractor` job's own OwnIR through one upload-artifact handshake, and it compared clean on `main` when PR #342 landed it. This branch's CI re-measures it; nothing in this note stands in for that result. -* **The sweep workflow itself.** Executed: the recorded run IS its first - execution, on `main` at `4520a54`; every leg green, the aggregation assembled - the record from the legs' artifacts and checked it against the committed - definition, and `workflow_run_url` names it. The first record was a local run, - which #260 allowed; it was superseded whole by this one. A `workflow_dispatch` - workflow is dispatchable only once it is on the default branch, which is why - the first record could not be a CI run. +* **The sweep workflow itself.** Executed: the recorded run is run + 34186824607, dispatched by the branch ref of PR #344 at `321ab8b` so that it + executed the workflow as amended by that PR's first commit; every leg green, + the aggregation assembled the record from the legs' artifacts and checked it + against the committed definition, and `workflow_run_url` names it. The + workflow's first execution, run 34181417914 on `main` at `4520a54`, agreed on + every document but recorded each document's `source` as the runner's temp + path — a constant dressed as provenance — and is superseded by the recorded + run; it is not on file. The first record was a local run, which #260 allowed; + it was superseded whole. A `workflow_dispatch` workflow is dispatchable only + once it is on the default branch, which is why the first record could not be a + CI run; once the file is there, a dispatch by branch ref runs the branch's + version of it. * **Precision.** This sweep does not re-measure it. The finding counts the extractor produced over the five targets are not compared with #243's, and they would not be comparable: many analyses have landed since, and two