Restore #435: PR #472's rebuild reverted it, and the revert is on main nf-1n1l ← Beads

closed priority 2 task unassigned

Twinned from https://github.com/cfsh/ninefold/issues/490 by tools/beads/import_github.py's reconcile pass.

#472 (7af1b92) reverted merged PR #435 in full, and the revert is on main now. Found by ninefold-reviewer's review of #472; filed so the restoration is tracked rather than living in a comment on a merged PR.

Not a partial conflict — byte-for-byte the pre-#435 state:

``` art_dump/README.md @ f7f322c (pre-#435) 55f4dd21d56044813dc2f2ca4ee6aa5bdbd14376 art_dump/README.md @ origin/main NOW 55f4dd21d56044813dc2f2ca4ee6aa5bdbd14376 ```

CLAUDE.md's art-dump section is the same, minus the unrelated sections main gained in between: the delta is exactly the inverse of 9692826's CLAUDE.md hunk.

What to restore

| # | file(s) | what #435 gave, now missing | |---|---|---| | 1 | CLAUDE.md, art_dump/README.md | ⚠️ *"Run that in bash, never PowerShell"* + the redirect-free git checkout / git restore --staged form. Main is back to bare git show … > char2.png, which under PowerShell is Out-File and silently corrupts the PNG#435 measured 336 B → 596 B, surfacing much later as a broken Godot import | | 2 | CLAUDE.md, art_dump/README.md | mkdir -p games/explore/assets — without it the documented command fails on a fresh clone | | 3 | art_dump/README.md | *"Save the .aseprite at the top level of this folder — the exporter does not descend into sub-folders yet … (#432)"*, reverted to *"anywhere in this folder"*. #432 is still OPEN, so the export gap is live and the warning that covered it is gone | | 4 | art_dump/README.md | the whole *"Setting up a fresh art-dump clone"* section — credential.https://github.com.username, plus the ⚠️ that running it in a dev clone re-points that clone's pushes at the wrong account |

git show 9692826 -- CLAUDE.md art_dump/README.md is the exact content; a revert of the revert is the whole job.

Why it happened

636bf83's tree for these two files is the *old branch's* tree, not main's — the signature of a tree-snapshot squash (git reset --soft origin/main from the old tip, or git restore --source=<old-head> .), which commits the old tree wholesale, so anything main changed since the old base is reverted as a side effect. #435 merged at 01:55Z; the rebuild was committed at 02:02Z.

CLAUDE.md already mandates the safe form — *"cherry-pick (not rebase --onto) onto fresh main when rebuilding a stack after a squash-merge"* — and a cherry-pick of 636bf83's own commits could not have produced this, since none of them touch these files.

The systemic half, if anyone wants it

Nothing in the pipeline can see this class:

The cheap guard is a pre-push check on a rebuild: git diff origin/main..HEAD --stat, reconciled against the PR's declared scope. Two unexplained doc files with pure deletions were visible in gh pr view --json files from the moment the rebuild landed. Whether that is worth automating (a merge_pr preflight that flags paths in the diff which no commit on the branch touches) is a separate call — say so here rather than opening a second issue.

Dependencies

None.

Comments

No comments.

Add a comment