Skip to content

docs(p022): re-record the #260 sweep from a CI run of its workflow - #344

Merged
PhysShell merged 3 commits into
mainfrom
claude/p022-shadow-sweep-ci-record
Sep 8, 2026
Merged

docs(p022): re-record the #260 sweep from a CI run of its workflow#344
PhysShell merged 3 commits into
mainfrom
claude/p022-shadow-sweep-ci-record

Conversation

@PhysShell

Copy link
Copy Markdown
Owner

Что и зачем

Запись свипа #260 теперь снята самим воркфлоу, а не локально: байты артефакта
прогона shadow sweep (#260) заменяют прежнюю локальную запись целиком.
Первый коммит правит воркфлоу так, чтобы файл фактов каждой ноги назывался по id
документа и записывался голым именем — прежняя CI-запись несла путь раннера
десять раз, и поле source было константой, а не провенансом. Второй коммит
кладёт запись того прогона, перегенерированный фрагмент и минимальные правки
ноты. Поведение продакшена не меняется нигде.

Тип изменения

  • docs — документация
  • refactor / chore / test / ci — без изменения поведения

Как проверено

  • python tests/shadow_sweep.py — OK, запись именует коммит прогона
  • python scripts/render_checkpoint_status.py --check
  • python tests/run_tests.py
  • ruff check . и mypy
  • Артефакт скачан аутентифицированным GET, сверен по sha256 и распакован как
    байты; sha256 файла в дереве равен sha256 скачанного члена архива

Связанные issue

Refs #250, #260

Чеклист

  • изменение покрыто тестом/селфтестом — запись проходит через тот же
    интерпретатор и тот же гейт, что и прежняя
  • README/docs обновлены при необходимости
  • коммиты в conventional-commit стиле

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
source distinguishes 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 or BOUNDARY_POLICY.
No production behaviour changes anywhere. The dirty bit, the
definition_sha256 check in the interpreter, .gitattributes and the
derived-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 its
shadow-sweep-run-summary artifact, taken as bytes.

Steady-state test command.

python tests/run_tests.py
ruff check . && mypy
python tests/shadow_sweep.py
python scripts/render_checkpoint_status.py --check

Production dependency changes. None.

Behavior changes. None in production. In CI: each sweep leg writes
<runner temp>/<document id>.facts.json instead of <runner temp>/facts.json
and 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.

  • The interpreter does not yet check a record's definition_sha256 against the
    definition's bytes, the way the renderer already does for campaigns.
  • .gitattributes for docs/evidence, tests/fixtures and docs/generated:
    three measured episodes now show an operator with core.autocrlf producing
    different bytes for one tree.
  • The dirty bit 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

…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
@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: f212229d-f380-4a66-829c-813ddd9b6eee


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

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
@PhysShell PhysShell changed the title docs(p022): re-record the #260 sweep from its first CI run docs(p022): re-record the #260 sweep from a CI run of its workflow Sep 8, 2026
@PhysShell
PhysShell merged commit f487806 into main Sep 8, 2026
45 of 46 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants