docs(agents): the Phase 0 gate cannot see a working tree — it missed 468 lines

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 commit is contained in:
2026-09-14 20:44:48 +02:00
parent 34d3bbc8fd
commit b2f089e7d3

View File

@@ -259,6 +259,75 @@ deleting, or step 3 silently ratifies every omission in step 2.
The two `.jsonl` mission-state dumps alone are 4.3 MB, and one is an orphan.
## 🔴 A gate that walks `refs/heads` cannot see a working tree
**Found 2026-09-14, on the other machine, while pulling the repos.** `xenia-rs`
had **468 uncommitted lines plus an untracked 338-line `imports.rs`** sitting in
`crates/xenia-analysis` — the very crate Phase 3 lifted. Written 2026-09-10
21:0121:23; found four days later.
It existed in exactly one place, and that place was not git:
| | `imports.rs` | `import_address` | `zq.py impcalls` |
|---|---|---|---|
| PR #32, the lifted crate | ✗ | ✗ | ✗ |
| `iterate-4A` (committed) | ✗ | ✗ | ✗ |
| **xenia-rs working tree** | **✓** | **✓ (4 files)** | **✓** |
**Phase 0 is titled "Secure the single-copy work" and its gate passed anyway**,
because the gate tests branch *reachability* — it iterates `refs/heads`. A dirty
working tree has no ref. 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 called the archive honest while this sat beside them.
Phase 5 ends with *"delete the local clone"* and Phase 7 drops the emulator, so
this had a deletion scheduled against it.
**The gate needs a second half. Before archiving or deleting anything:**
```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 2026-09-14 across all four: only `xenia-canary` is dirty, and both entries
(`build-cross/`, `vkd3d-proton.cache`) are already on Phase 7's drop list.
**Secured**`xenia-rs` branch **`harvest/import-thunk-naming`** @ `b4f19f1`,
pushed. Committed exactly as found, not cleaned up: editing it first would have
destroyed the thing being preserved. `cargo check -p xenia-analysis` = **0**.
**Ported****PR (new)** `feat/xexdb-import-naming`, stacked on #32. The
lift's base is exactly the harvest's parent, so every file merged three-way:
**10 conflicts, all of them caused by the lift's reformatting pass** — 9 are the
harvest's additions landing inside blocks rustfmt had rewrapped (so the content
is kept and re-indented to the lift's style), and **1 is genuinely semantic**:
insertion *order*, because `xdbf_achievements.image_id` is now an FK onto
`xdbf_images(id)`, so the image rows must be inserted first. The conflict there
was the stale copy of the block left at its old position. `cargo test -p sylpheed-xexdb` 10/0, clippy and fmt clean.
📌 Two things it carries, both absent from #32 as lifted: import-thunk
recognition (disassembly says `xboxkrnl.exe::RtlEnterCriticalSection` instead of
`.long 0x01010194`), and **16 schema-wide foreign keys** — with `functions`
deliberately excluded and the golden test now *asserting* zero inbound FKs onto
it, since DuckDB's UPDATE is delete+insert and one inbound FK would make
`functions.name` un-updatable and break `apply_re_symbols.sql`.
### Phase 3 residue found while porting
* 🔴 **`tools/zq.py:48` hardcodes `/home/fabi/RE - Project Sylpheed/xenia-rs/sylpheed.db`**
— a default path *inside the repository Phase 5 archives and Phase 7 drops*.
Not changed here, because the right replacement is a decision (env var,
workspace-relative, or required argument) rather than a guess.
* `tools/zq.py:52` still tells the user to regenerate with `xenia-rs dis`, the
retired binary. `SCHEMA.md` is still headed *"`xenia-analysis` schema
reference"* and cites `xenia-rs dis --db`.
* Phase 3's "says SQLite, is DuckDB" correction **was** made where it counts
(README and the binary's module doc both say DuckDB), but two inline comments
at `sylph-xexdb.rs:499` and `:874` still say SQLite.
## Phase 5 — Verify the invariant, then archive ⬜ **NOT STARTED**
For each of `Syplheed-Reborn`, `Sylpheed-Godot`, `xenia-rs`, `xex2tractor`:
@@ -335,6 +404,7 @@ been merged** — merging is the human's, and #32 contains #30 and #31.
|---|---|---|
| **0** secure single-copy work | ✅ done | Canary `8e63a9542`, `sylpheed-re` + `audit-handle-lifecycle-probes` pushed |
| **1** make the archive honest | ✅ done | xenia-rs `iterate-4B/4C/4D/4E` pushed (32/52/56/59 commits) |
| **0b** the dirt the gate could not see | ✅ done 2026-09-14 | xenia-rs `harvest/import-thunk-naming` `b4f19f1`, ported in `feat/xexdb-import-naming` |
| **2** harvest xex2tractor | ✅ done | **PR #30** `harvest/xex2tractor-assets` |
| **3** lift the DB tool | ✅ done | **PR #32** `feat/xexdb-tool` |
| **4** captures + the missing check | ✅ done | **PR #33** `fix/capture-citations` |
@@ -343,7 +413,7 @@ been merged** — merging is the human's, and #32 contains #30 and #31.
| **5** archive the four repos | ⬜ **open — needs the human** | |
| **7** intended drops | ⬜ **open — partly needs the human** | |
## 🔴 Four claims on this page were wrong. Read these before trusting the rest.
## 🔴 Five claims on this page were wrong. Read these before trusting the rest.
1. **"10 dangling citations" was ONE.** Eight were *directory* references, which
resolve and are simply absent from `git ls-tree`; one was a path at the end of
@@ -354,6 +424,9 @@ been merged** — merging is the human's, and #32 contains #30 and #31.
3. **The Phase 0 gate compared branches by SHA** and called seven safe branches
unpushed. It tests reachability now.
4. **There is no DXC submodule drift.** The ` m` is *nested* submodule dirt.
5. **Phase 0 did not secure all the single-copy work**, and its gate could not
have: it walks `refs/heads`, and 468 uncommitted lines in `xenia-rs` have no
ref. Secured 2026-09-14 — see the section above Phase 5.
## What the other machine should do next