docs(agents): the gate that cannot see a working tree, and the Phase 5/7 checks re-run #36

Merged
fabi merged 5 commits from docs/consolidation-dirty-tree-finding into main 2026-09-15 19:46:38 +00:00
Owner

Records a finding from 2026-09-14 that bears directly on Phases 5 and 7, both of
which are still open and both of which would have destroyed it.

⚠️ Based on plan/consolidation (#29) — one commit on top, so the diff is just this
change. Merge #29 first.

The finding

xenia-rs had 468 uncommitted lines plus an untracked 338-line imports.rs in
crates/xenia-analysis — the very crate Phase 3 lifted. Written 2026-09-10 21:01–21:23,
found four days later while pulling the repos.

It existed in exactly one place, and that place was not git — verified absent from both
iterate-4A and the lifted crate in #32.

Why the gate passed anyway

Phase 0 is titled "Secure the single-copy work". Its gate iterates refs/heads and
asks whether each branch is reachable from a remote. A dirty working tree has no ref,
so the gate is structurally incapable of seeing this. Canary's two dirty files were
secured only because a human already knew they were there — nothing found them. Phase 1
then pushed xenia-rs's four branches and declared the archive honest while this sat
beside them.

Phase 5 ends with "delete the local clone"; Phase 7 drops the emulator.

What this PR adds to the page

  • The finding, placed immediately before Phase 5 — the phase that would have
    destroyed it.

  • The missing half of the gate, as a runnable snippet:

    for d in Sylpheed sylpheed-reborn xenia-rs xenia-canary; do
      n=$(git -C "$d" status --porcelain | wc -l)
      [ "$n" = 0 ] || echo "🔴 $d has $n uncommitted path(s)"
    done
    

    Run across all four on 2026-09-14: only xenia-canary is dirty, and both entries
    (build-cross/, vkd3d-proton.cache) are already on Phase 7's drop list.

  • A fifth entry in the "claims on this page that were wrong" list, and the heading
    count corrected from four to five. Phase 0 was recorded as done; it was incomplete,
    and its gate could not have caught the gap.

  • A 0b row in the status table pointing at where the work now lives.

  • The Phase 3 residue found while porting. The sharpest was tools/zq.py
    defaulting its database path to a location inside xenia-rs — the repository
    Phase 5 archives and Phase 7 drops. That one is now fixed in #35 (38cc170):
    $SYLPH_XEXDB<repo root>/sylpheed.db → a refusal naming both, with no third
    fallback, because the database is an untracked build artefact and a default that
    silently resolves to the wrong one is worse than no default. SCHEMA.md's
    retired-repo heading remains outstanding and stays listed on the page.

Disposition of the work itself

secured xenia-rs harvest/import-thunk-naming @ b4f19f1, pushed — committed exactly as found, cargo check = 0
ported #35 feat/xexdb-import-naming, stacked on #32 — tests 10/0, clippy and fmt clean

This page's own closing advice is "Run them again rather than trusting the results
recorded here."
That is what turned this up.

🤖 Generated with Claude Code


Second commit: the Phase 5 and Phase 7 checks, re-run

This page says "Do not trust this page's ledger when you get there." So they were
run rather than read. Nothing was archived and nothing was deleted — both are
yours, and both phases stay open.

🔴 Phase 5's containment check is the wrong test for half the list it names

repo disposition tips contained
Syplheed-Reborn absorbed 21 21
Sylpheed-Godot absorbed 2 2

xenia-rs and xex2tractor were never absorbed — their disposition is
harvest, then archive. Run the containment check literally against xenia-rs and
it returns 42 of 42 refs "NOT PRESENT in Sylpheed": every line true, every line
unactionable. That is the failure this page already names once, about Phase 0's
first gate.

For those two the invariant is that the harvested artefacts are in Sylpheed and
the repo is archived, not deleted. Checked separately — and it turns up a
sequencing point:

artefact on main on its PR branch
docs/reference/xex2-format.md #30
docs/reference/xbox360-exports.json #30
LICENSE #30
crates/sylpheed-xexdb (32 files) #32

⚠️ The harvest is real but is not on main yet. Archiving stays safe — the
branches are pushed and archiving is reversible — but Phase 5 should follow the
harvest PRs rather than precede them.

Phase 5 · nothing outside git — re-verified, still true

0 issues / 0 PRs / 0 releases in all four retiring repos (Sylpheed: 36 / 19 / 0).

📌 has_wiki: true is the repository feature flag, not content — /wiki/pages
returns 404 on all six, i.e. never initialised. Read the flag as content and
you would report six wikis that do not exist.

📌 All six are still archived: false, private: false — the retention
question is unchanged, now with a number: docs/re/captures/ is ~87 MB of game
screenshots in a public repository.

Phase 7 · most of the drop list is not on this machine

item page here
agent-backups/ 687 MB absent
xenia-rs/audit-runs/ 57 MB 724 KB
local pi/* branches 3 0
texcompare/, ship_render/ 14 MB + 64 KB both absent
stock-oracle/ 34 MB 34 MB
Sylpheed/target/ 32 GB 34 GB

Phase 7's open question is answered. It asks to confirm nothing in docs/re/
cites texcompare/ or ship_render/. texcompare is cited nowhere. Four
ship_render citations exist and all four name the example program, not the
output directory
cargo run --example ship_render. The directories are
droppable; the example is tracked code and stays. Same directory-vs-file
distinction that made Phase 4's "10 dangling citations" turn out to be one.

⚠️ Disk is at 90 %, 96 GB free — the page records 83 %. Sylpheed/target/ is
34 GB of that and the only large item here, but deleting it is yours: it is hours
to rebuild.

Records a finding from 2026-09-14 that bears directly on **Phases 5 and 7**, both of which are still open and both of which would have destroyed it. ⚠️ **Based on `plan/consolidation` (#29)** — one commit on top, so the diff is just this change. Merge #29 first. ## The finding `xenia-rs` had **468 uncommitted lines plus an untracked 338-line `imports.rs`** in `crates/xenia-analysis` — the very crate Phase 3 lifted. Written 2026-09-10 21:01–21:23, found four days later while pulling the repos. It existed in exactly one place, and that place was not git — verified absent from both `iterate-4A` and the lifted crate in #32. ## Why the gate passed anyway **Phase 0 is titled "Secure the single-copy work".** Its gate iterates `refs/heads` and asks whether each branch is reachable from a remote. **A dirty working tree has no ref**, so the gate is structurally incapable of seeing this. Canary's two dirty files were secured only because a human already knew they were there — nothing *found* them. Phase 1 then pushed xenia-rs's four branches and declared the archive honest while this sat beside them. Phase 5 ends with *"delete the local clone"*; Phase 7 drops the emulator. ## What this PR adds to the page * The finding, placed immediately **before Phase 5** — the phase that would have destroyed it. * **The missing half of the gate**, as a runnable snippet: ```bash for d in Sylpheed sylpheed-reborn xenia-rs xenia-canary; do n=$(git -C "$d" status --porcelain | wc -l) [ "$n" = 0 ] || echo "🔴 $d has $n uncommitted path(s)" done ``` Run across all four on 2026-09-14: only `xenia-canary` is dirty, and both entries (`build-cross/`, `vkd3d-proton.cache`) are already on Phase 7's drop list. * A **fifth entry** in the "claims on this page that were wrong" list, and the heading count corrected from four to five. Phase 0 was recorded as done; it was incomplete, and its gate could not have caught the gap. * A `0b` row in the status table pointing at where the work now lives. * The **Phase 3 residue** found while porting. The sharpest was `tools/zq.py` defaulting its database path to a location *inside* `xenia-rs` — the repository Phase 5 archives and Phase 7 drops. **That one is now fixed** in #35 (`38cc170`): `$SYLPH_XEXDB` → `<repo root>/sylpheed.db` → a refusal naming both, with no third fallback, because the database is an untracked build artefact and a default that silently resolves to the wrong one is worse than no default. `SCHEMA.md`'s retired-repo heading remains outstanding and stays listed on the page. ## Disposition of the work itself | | | |---|---| | secured | `xenia-rs` `harvest/import-thunk-naming` @ `b4f19f1`, pushed — committed exactly as found, `cargo check` = 0 | | ported | **#35** `feat/xexdb-import-naming`, stacked on #32 — tests 10/0, clippy and fmt clean | This page's own closing advice is *"Run them again rather than trusting the results recorded here."* That is what turned this up. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- # Second commit: the Phase 5 and Phase 7 checks, re-run This page says *"Do not trust this page's ledger when you get there."* So they were run rather than read. **Nothing was archived and nothing was deleted** — both are yours, and both phases stay open. ## 🔴 Phase 5's containment check is the wrong test for half the list it names | repo | disposition | tips | contained | |---|---|---|---| | `Syplheed-Reborn` | absorbed | 21 | **21 ✅** | | `Sylpheed-Godot` | absorbed | 2 | **2 ✅** | `xenia-rs` and `xex2tractor` were **never absorbed** — their disposition is *harvest, then archive*. Run the containment check literally against `xenia-rs` and it returns **42 of 42 refs "NOT PRESENT in Sylpheed"**: every line true, every line unactionable. That is the failure this page already names once, about Phase 0's first gate. For those two the invariant is that the **harvested artefacts** are in Sylpheed and the repo is *archived, not deleted*. Checked separately — and it turns up a sequencing point: | artefact | on `main` | on its PR branch | |---|---|---| | `docs/reference/xex2-format.md` | ✗ | ✅ #30 | | `docs/reference/xbox360-exports.json` | ✗ | ✅ #30 | | `LICENSE` | ✗ | ✅ #30 | | `crates/sylpheed-xexdb` (32 files) | ✗ | ✅ #32 | ⚠️ **The harvest is real but is not on `main` yet.** Archiving stays safe — the branches are pushed and archiving is reversible — but **Phase 5 should follow the harvest PRs rather than precede them.** ## Phase 5 · nothing outside git — re-verified, still true 0 issues / 0 PRs / 0 releases in all four retiring repos (Sylpheed: 36 / 19 / 0). 📌 `has_wiki: true` is the repository *feature flag*, not content — `/wiki/pages` returns **404 on all six**, i.e. never initialised. Read the flag as content and you would report six wikis that do not exist. 📌 All six are still `archived: false`, **`private: false`** — the retention question is unchanged, now with a number: `docs/re/captures/` is ~87 MB of game screenshots in a public repository. ## Phase 7 · most of the drop list is not on this machine | item | page | here | |---|---|---| | `agent-backups/` | 687 MB | **absent** | | `xenia-rs/audit-runs/` | 57 MB | **724 KB** | | local `pi/*` branches | 3 | **0** | | `texcompare/`, `ship_render/` | 14 MB + 64 KB | **both absent** | | `stock-oracle/` | 34 MB | 34 MB ✅ | | `Sylpheed/target/` | 32 GB | **34 GB** ✅ | ✅ **Phase 7's open question is answered.** It asks to confirm nothing in `docs/re/` cites `texcompare/` or `ship_render/`. `texcompare` is cited nowhere. Four `ship_render` citations exist and **all four name the example *program*, not the output directory** — `cargo run --example ship_render`. The directories are droppable; the example is tracked code and stays. Same directory-vs-file distinction that made Phase 4's "10 dangling citations" turn out to be one. ⚠️ **Disk is at 90 %, 96 GB free** — the page records 83 %. `Sylpheed/target/` is 34 GB of that and the only large item here, but deleting it is yours: it is hours to rebuild.
fabi changed title from docs(agents): the Phase 0 gate cannot see a working tree — it missed 468 lines to docs(agents): the gate that cannot see a working tree, and the Phase 5/7 checks re-run 2026-09-14 19:01:18 +00:00
fabi changed target branch from plan/consolidation to main 2026-09-15 19:46:32 +00:00
fabi added 5 commits 2026-09-15 19:46:32 +00:00
Found 2026-09-14 while pulling the repos on the other machine: `xenia-rs` had
468 uncommitted lines plus an untracked 338-line `imports.rs` in the very crate
Phase 3 lifted, written 2026-09-10 and sitting there for four days. Verified
absent from `iterate-4A` and from the lifted crate in PR #32 — it existed in
exactly one place, and that place was not git.

Phase 0 is titled "Secure the single-copy work" and its gate passed anyway,
because the gate iterates `refs/heads` and a dirty working tree has no ref.
Canary's two dirty files were secured only because a human already knew about
them; nothing found them. Phase 1 then declared the archive honest while this
sat beside the branches it pushed. Phase 5 ends with "delete the local clone"
and Phase 7 drops the emulator, so a deletion was scheduled against it.

Records: the finding and the `git status --porcelain` half the gate was
missing (run across all four repos — only Canary is dirty, and both entries are
already on Phase 7's drop list); that it is secured on `harvest/import-thunk-
naming` and ported in `feat/xexdb-import-naming`; a fifth entry in the
wrong-claims list; and a `0b` row in the status table.

Also records three pieces of Phase 3 residue found while porting, the sharpest
being that `tools/zq.py` still defaults its database path to a location inside
`xenia-rs` — the repository Phase 5 archives and Phase 7 drops. Left unchanged:
the right replacement is a decision, not a guess.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This page recorded it as "not changed here, because the right replacement is a
decision". The decision was taken: PR #35 `38cc170` resolves `$SYLPH_XEXDB`,
then `<repo root>/sylpheed.db`, then refuses with both named — no third
fallback, because the database is an untracked build artefact and a default
that silently resolves to the wrong one is worse than no default.

Leaving the page saying otherwise would be the defect this section is about.

`SCHEMA.md`'s retired-repo heading is still outstanding and stays listed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This page says not to trust its own ledger on arrival, so the checks were run
again rather than read. Nothing was archived and nothing was deleted — both are
the human's, and both phases stay open.

The substantive finding is that Phase 5's containment check is the wrong test
for half the list it names. `xenia-rs` and `xex2tractor` were never absorbed;
their disposition is harvest-then-archive. Run the check literally against
`xenia-rs` and it returns 42 of 42 refs "not present in Sylpheed" — every line
true, every line unactionable, which is the failure this page already names
once about Phase 0's first gate. For those two the invariant is that the
harvested artefacts are in Sylpheed and the repository is archived rather than
deleted; that is now checked separately, and it shows the harvest is real but
lives only on the unmerged PR branches, so Phase 5 should follow them rather
than precede them.

Containment itself holds for the two repos it does apply to: 21/21 and 2/2.

Also answers Phase 7's one open question — nothing cites `texcompare/`, and all
four `ship_render` citations name the example program, not the output
directory — and records that most of Phase 7's list does not exist on this
machine, that `has_wiki: true` is a flag rather than content (all six wikis
return 404, never initialised), and that the disk is at 90%, not the 83% the
page records.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Re-checked against the server rather than the page. `Sylpheed` has 7 tags and
all 7 are `formats-pin-*`. The eighth this page counts, `formats-pin-2026-08-29`
without a letter suffix, is in `Syplheed-Reborn` — a repo a Sylpheed rewrite
would not touch, and one Phase 5 archives read-only regardless.

The pin itself is exactly as claimed: `formats-pin-2026-09-01` resolves to
`1cd5b8b1`, and the in-container build fetches that git dependency over the
network for real, so the blocker is live rather than theoretical.

Also updates the disk figures the "don't rewrite" recommendation rests on: 90%
used and 96 GB free, not 83% and 154 GB, with `target/` at 34 GB. The
recommendation is unchanged and the argument is now stronger — reclaiming
118 MB by rewriting history while 34 GB of rebuildable output sits beside it is
the wrong lever.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Closes the page's one explicitly outstanding result. Run in sylph-ci:local
(rustc 1.98.1, byte-identical to the runner) with the disc present and
--no-fail-fast: 45 suites, 367 passed, 1 failed, 14 ignored. The +9 against the
disc-less #35 run (377) is exactly #35's nine imports.rs unit tests.

The single failure is ui_prm_primitives_disc, red on main since #23 and
bisected there, not introduced by #32.

Records the three things that stopped the number being obtained, as rules:
--no-fail-fast (an earlier run silently covered half the workspace), a memory
cap sized to the host (the default 7 GB OOM-kills slb_leading_segment_disc on
this machine with the disc mounted), and a ~36 GB disk budget for a cold target
volume.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fabi merged commit d5f418f84b into main 2026-09-15 19:46:38 +00:00
Sign in to join this conversation.