docs(p022): re-record the #260 sweep from a CI run of its workflow - #344
Merged
Conversation
…record it by that bare name The first CI execution of this workflow produced a record whose ten `source` fields were all `<runner temp>/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 `<runner temp>/<document id>.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 `<FACTS>`. Refs #250, #260 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WPozrRezSfnH9RvQGfn1Nn
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 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WPozrRezSfnH9RvQGfn1Nn
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
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 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WPozrRezSfnH9RvQGfn1Nn
This was referenced Sep 8, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что и зачем
Запись свипа #260 теперь снята самим воркфлоу, а не локально: байты артефакта
прогона
shadow sweep (#260)заменяют прежнюю локальную запись целиком.Первый коммит правит воркфлоу так, чтобы файл фактов каждой ноги назывался по id
документа и записывался голым именем — прежняя CI-запись несла путь раннера
десять раз, и поле
sourceбыло константой, а не провенансом. Второй коммиткладёт запись того прогона, перегенерированный фрагмент и минимальные правки
ноты. Поведение продакшена не меняется нигде.
Тип изменения
Как проверено
python tests/shadow_sweep.py— OK, запись именует коммит прогонаpython scripts/render_checkpoint_status.py --checkpython tests/run_tests.pyruff check .иmypyбайты; sha256 файла в дереве равен sha256 скачанного члена архива
Связанные issue
Refs #250, #260
Чеклист
интерпретатор и тот же гейт, что и прежняя
Checkpoint packet (#250)
Scope. Re-record #260's sweep from the workflow's own execution, and make
that record portable: each leg's facts file is named by its document id and
recorded by that bare name, so the assembled record names no runner path and
sourcedistinguishes the documents instead of repeating one constant.Explicit non-goals. No change to the sweep definition, the interpreter
(
tests/shadow_sweep.py), the compare driver, the fixtures orBOUNDARY_POLICY.No production behaviour changes anywhere. The
dirtybit, thedefinition_sha256check in the interpreter,.gitattributesand thederived-status counts stay separate tails.
Python source of truth. Unchanged. Python remains the public engine; the
adapter stays dev-only.
Frozen fixture. None moved. Nothing under
tests/fixtures/is touched.Fixture regeneration command. The sweep workflow itself —
gh workflow run "shadow sweep (#260)"— then the record is itsshadow-sweep-run-summaryartifact, taken as bytes.Steady-state test command.
Production dependency changes. None.
Behavior changes. None in production. In CI: each sweep leg writes
<runner temp>/<document id>.facts.jsoninstead of<runner temp>/facts.jsonand records that bare name; the driver reads the same bytes, the same once.
Acceptance changes. None. The same definition, the same interpreter, the
same gate; only the recorded run is newer.
Local commands. In the note's §7.
GitHub Actions links. The recorded run is named in the note's §3 and in the
record's
workflow_run_url.Known deferred cases.
definition_sha256against thedefinition's bytes, the way the renderer already does for campaigns.
.gitattributesfordocs/evidence,tests/fixturesanddocs/generated:three measured episodes now show an operator with
core.autocrlfproducingdifferent bytes for one tree.
dirtybit and the derived-status counts are untouched here..slnx: MaterialDesignInXamlToolkit still has no classic solution at its pin,so it is covered by its directory walk alone.
🤖 Generated with Claude Code
https://claude.ai/code/session_01WPozrRezSfnH9RvQGfn1Nn