diff --git a/README.md b/README.md index fda26a26a..1046d8635 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,25 @@ before publication to remove game-derived files from every revision. Old commit were replaced by inert tokens (`commit:NNNN`, the commit's ordinal); [`docs/commit-map.tsv`](docs/commit-map.tsv) maps them to the commits you see, and documents at the tip cite the current hashes directly. +## Standards, and how the AI was used + +**Accuracy.** A function is matched only when its compiled instructions are identical to the original, register allocation +included, and the whole binary's SHA1 equals the original's. That check runs inside every build of every binary, and a clean +rebuild follows every batch of banked functions. Nothing "functionally equivalent" is counted, and the default build never +links unmatched C. What is not our C is listed above, not hidden. + +**Readability.** The code is matched but not yet finished in the sense other decompilation projects mean. Most functions still +carry generated names, thousands of register hints that were matching levers remain, and shared engine code lives in one large +header. Bringing it to the community's standard is the next generation of the project; we adopt sotn-decomp's style guide as the +baseline, and the rules are written down in [`docs/gen3-standards.md`](docs/gen3-standards.md): names only with recorded +evidence, every match-forcing trick removed or marked, structures unified before they are named, and everything still +byte-identical. + +**How the AI was used.** An agent did the work under a written constitution, two human gates per phase, and a rule set +distilled from what went wrong. The byte gate, not the model, decides what counts as done. Communication with other projects is +written by the maintainer, we do not automate against community infrastructure such as decomp.me, and other projects' policies +on AI-assisted contributions are read and followed before anything is submitted. + ## Tools from this project Things built here that stand on their own, for other decompilation projects: diff --git a/docs/SETUP.md b/docs/SETUP.md index e9d7183f4..f32cb1e40 100644 --- a/docs/SETUP.md +++ b/docs/SETUP.md @@ -780,6 +780,8 @@ Every script under `tools/` (plus the two report make-targets), grouped by purpo | | `docs/outreach/archipelago.md` | **(P33 E2)** The Archipelago outreach: what AP and the BFM world are (v0.8.1, BizHawk, US+JP, 342 polled addresses, runtime-injected MIPS patches), the table of what our source says about their data (the day-of-week byte CONFIRMED and our memory map corrected; their four patch sites and the Time-Sanity hook resolved to shared engine functions; the town-ID patch retired as historic; the version-check string offset), what we ask (their unpublished US RAM notes; attribution consent), the ready-to-send GitHub issue + a Discord short form (plain style; send only after the flip), and the G5 procedure for the reply. | | | `docs/outreach/tools-announcement.md` | **(P33 S89)** The post-flip announcement of xsig for the decomp community (Discord tools channel / a Decompedia tools-page row), written in a developer's voice, with the facts it rests on. | | | `docs/wiki/Tools-from-this-project.md` | **(P33 S89)** The wiki page mirroring the README's "Tools from this project" section: xsig, the permuter driver (upstream as a pinned unmodified submodule + our class swap; offered upstream and declined), the codegen map, the decomp.me replica, the drafter write-up, the how-to. Linked from the sidebar and the Home table. | +| | `docs/gen3-standards.md` | **(P33 S89)** The charter for Gen3 and the project's public standard: §1 accuracy (met; whole-binary SHA1 every build, no NON_MATCHING, clean rebuild per batch — stricter than the field), §2 readability (sotn STYLE.md adopted as baseline + four rules of our own: names only with evidence, every pin off or `// !FAKE:`, shared bodies as C not macros, types from code / names from observation), §3 the use of AI — conduct (byte gate as the only claim; no guessed names; outward text written by a person; no automated traffic to decomp.me; target projects' AI policies followed), §4 the measured gap and the order of work + a proposed definition of done. | +| | `docs/phase34-seed.md` | **(P33 S89)** The seed for Phase 34 (re-charter, Drew 2026-09-07): Phase 33 closes on what is done (v1.32.0); the flip-gated remainder — probe, C10, E1/E2/D3/F3 outward, tool discoverability, C11, the v2.0.0 PhaseEnd = Gen2 EXIT — becomes Phase 34 with every task's actor, effort and carrying document, the full inventory of what Phase 33 delivered, and the milestone (Phase 33's original items 2–4). Gen3 opens at Phase 35. | | | `tools/objdiff_report.py [--in docs/progress.json] [--out report.json]` | **(P33 D3)** progress.json → objdiff's report format (report.proto v2, snake_case — validated with `objdiff-cli` 3.8.1 `report changes`): one unit per binary (code = instructions × 4, functions byte-identical / matchable, metadata complete), categories `game-code` and `linked-sony-objects` (functions only). `.github/workflows/progress.yml` runs it on every push (no rebuild — the committed JSON) and uploads the artifact **`SLUS_007.26_report`** for decomp.dev (Drew registers at decomp.dev/manage/new after the flip). | | | `tools/frogress_upload.py [--push --project bfm --version us]` | **(P33 D3)** stdlib; `--dry-run` is the default (prints the payload); `--push` POSTs `{"api_key","entries":[{git_hash,timestamp,categories:{default:{measures…}}}]}` to `progress.deco.mp/data///` with `FROGRESS_API_SECRET` from the environment (never a file). frogress projects are admin-created — Drew requests the slug + key after the flip. | | | `tools/public_rewrite/` (P33 C1) | **The history-rewrite package** (`docs/public-flip-runbook.md` §3 is the operating table). `common.py` (shared: the purge rules, the DERIVED content-hash sets, identities from the log, the one hash regex, a persistent `cat-file --batch`) · `hash_dict.py [--write-mailmap]` (every commit OBJECT → `commit:NNNN` / twin / orphan; prefix index 7..40; asserts 0 ambiguous; records content-hash collisions as excluded; writes the scratch mailmap) · `scrub.py --test \| --sample \| --file` (THE scrub: hash tokens, addresses → noreply, trailer lines in messages; 12 known-true cases; the HEAD sample with git's own object lookup as the independent oracle) · `gate_scan.py --all\|--refs … [--worktree] [--expect-fail FIXTURE]` (paths ever touched × purge rules; every reachable blob's content sha1 × the ROM set; 5 byte signatures; 50 MiB; emits `rom_blob_ids.txt` = hits ∪ every blob ever under a purge path; the fixture `expected_offenders.txt` is the R39 negative control) · `run_filter.py [--sample]` (the git-filter-repo 2.47.0 module-API run inside the scratch bare clone; refuses elsewhere) · `verify_rewrite.py --old --new` (the pairwise proof) · `build_commit_map.py [--out]` (`docs/commit-map.tsv`, asserted free of old hashes) · `resolve_tokens.py [--check] [--map]` (tokens → shortest unique ≥9-char new abbreviations at the tip) · `absent_scan.py [--repo] [--tree]` (nothing old anywhere) · `probe_github.sh [--after-flip]` (Drew's purge probe). Scratch (`.run/public_rewrite/`, never committed): `dict.json`, `mailmap`, `rom_blob_ids.txt`, `old-to-new.tsv`, `repo.git`, the bundle. · `probe_github.sh [--after-flip]` (Drew's daily post-purge probe, C10: 33 sampled old shas via `gh api` + a fetch; **S88, R57:** the fetch runs in a throwaway bare repo under `.run/public_rewrite/` with `--filter=blob:none --depth=1`, never in the working repo — a successful fetch of an old sha imports its purged closure, which the S87/S88 runs did (5.97 GiB unreachable) — and it ends with a self-check naming any sampled old commit the working repo still holds + the gc recipe) | diff --git a/docs/gen3-standards.md b/docs/gen3-standards.md new file mode 100644 index 000000000..8b6cf9be0 --- /dev/null +++ b/docs/gen3-standards.md @@ -0,0 +1,118 @@ +# Standards: accuracy, readability, and the use of AI — the bar this project holds itself to + +> **Written 2026-09-07 (P33 S89) at the owner's direction, as the charter document for Gen3.** Two things are true at once about +> this repository: it is the largest fully machine-carried matching decompilation on record, and it is not yet code a human +> maintainer would call finished. This page states the standard on both counts — the accuracy bar already met and held, the +> readability bar Gen3 exists to meet — and the conduct rules for using AI that keep the project from being confused with +> low-effort machine output. The measurements are dated; re-derive them before quoting (R37, R41). + +## 1. Accuracy — met, held, and stricter than the field + +"Matched" here means one thing: the compiled output is instruction-identical to the original, register allocation included, +**and** the whole binary's SHA1 equals the original's (rule G3). Nothing "functionally equivalent" is ever counted (P9). The +enforcement is structural, not procedural: + +| Guarantee | How it is enforced | Where the proof lives | +|---|---|---| +| Every shipped binary is byte-identical | `config/check.*.sha` is checked inside every `make build`; there is no third state between "identical" and "failed" | `docs/verification.md` (the recorded contract run: 218 of 218 from a clean rebuild) | +| No unmatched C in a default build | the `NON_MATCHING` guard (G4); the census reads 0 | `make audit-frontier`, `docs/progress.json` | +| A bank is verified from a clean rebuild, never incremental | R22 after every banked batch; main gated only by `gate_main`'s clean rebuild | the phase logs, `.run/P33/verify/` | +| The measuring instruments are themselves audited | corpus/cdecl/sig oracles in `make tools-health`; a second, disagreeing oracle where one is structurally blind (R34) | `docs/SETUP.md` §6, the P26/P27 audits | +| What is *not* our C is stated, not hidden | 1,256 Sony PsyQ objects linked byte-identical; 5 hand-written assembly routines kept verbatim, censused in `config/verbatim_manifest.json` | `README.md`, `docs/verification.md` | + +Most projects gate per function with a diff score and check the whole ROM periodically; here the whole-binary hash runs on +every build of every binary, and a clean rebuild follows every batch. Accuracy is therefore not a Gen3 concern. It is the +floor Gen3 stands on: every edit below is byte-neutral by definition and is rejected the moment it is not. + +## 2. Readability — the bar Gen3 meets + +The community's expectations are written down; the clearest statement is sotn-decomp's `docs/STYLE.md`, and this project +adopts it as the baseline (read 2026-09-07): + +- **Naming:** locals `camelCase`, globals `g_PascalCase`, statics `s_PascalCase`, struct members `camelCase`, types and + functions `PascalCase`, enum values and macros `SCREAMING_SNAKE_CASE`, files `snake_case`. "Ideally names should be both + short and clear, although it's better to be clear than short." +- **Types:** the project's own `u8 … u32` types; "We always write our enums and structs as typedefs." +- **Formatting:** clang-format — 4 spaces, 80 columns, braces on the same line, pointer on the type; a blank line between + declarations and code; braces on every conditional and loop body. +- **Numbers:** decimal for counts, timers and indices; hexadecimal for angles, addresses and masks; `bool` for 0/1 returns; + "It's better to not hardcode array sizes (easier to mod)." +- **Honesty markers:** `// !FAKE:` on code that exists only to force a match; `//! @bug` on original bugs; a comment wherever + something is strange. +- **The rule this project ranks first:** *"If you are not sure what something does, it is better to leave it unnamed than name + it wrongly."* +- **Organisation:** functions in the order of the assembly, in a file that belongs to the system they implement. + +To that baseline this project adds four rules of its own, because its code was produced by a machine at scale and the +failure modes are different: + +1. **Every name carries evidence.** A function or variable is renamed only on a recorded basis — a string it prints, a + cross-reference chain, the debug menu, a live-RAM datapoint (R10), a community label with provenance (G5). The evidence is + recorded the way addresses are recorded in `docs/memory-map.md`. No evidence, no name: it stays `func_80xxxxxx` / + `D_80xxxxxx`, which is honest and greppable. A model may *propose* a name; it may never *assert* one. +2. **Every register pin goes.** `register … __asm__("$N")` was a matching lever; in finished code each one is either removed + (the body re-shaped so the compiler allocates naturally — P32 showed every pin in the last drafts came off) or, if a body + genuinely cannot be shaped, kept with a `// !FAKE:` line that names the residual. The count is a published metric until it is 0. +3. **Shared engine functions live as C, not as macros.** The 5,147 `DEFINE_func_…()` macro bodies in `src/shared/engine_core.h` + were the dedup engine's way of instantiating one body in every location overlay. A reader expects a `.c` file per system, + shared the way other overlay-heavy projects share it. The restructuring is byte-neutral and is proven so per family. +4. **Types come from the code, names from observation.** Structure is recovered from access patterns the compiler locked into + the bytes (many functions reading a `u16` at one offset from one base); meaning comes from observation. The 1,232 struct + definitions are unified before any field is named; a duplicate type is a defect, a wrong name is a worse one. + +Every step is checked the only way this project checks anything: 218 binaries rebuild identical. + +## 3. The use of AI — conduct + +The project is openly machine-carried and says so in its README; that is the disclosure, made once, at the project level. +The conduct rules below are what keep that fact from being a liability: + +- **The byte gate is the only claim of success.** The agent never reports a match the gate has not proven; "the compiler ran" + and "looks equivalent" are not results (P9). Every "banked" is written from a tool's printed success line (R66). +- **Names and types are evidence-based, never guessed** (§2 rule 1). Hallucinated meaning is the specific way a model would + damage a decompilation without any test catching it. +- **Outward text is written by a person.** Issues, pull requests, forum posts and outreach to other projects are written by the + maintainer, the way a developer writes — short, plain, no dense inline-code formatting, no bullet walls, no evidence + scaffolding — and never a model draft with the tells removed. The model supplies facts. (Rule candidate (j); the lesson cost a + closed pull request.) Before any submission, the target project's own AI policy is read and followed: sotn-decomp, for one, + requires that "commit messages and Pull Requests [be] submitted without autonomous tooling such as an LLM or coding agent." +- **No automated traffic against community infrastructure.** decomp.me asks that nobody "scrape the site, hook up an LLM, or + otherwise make repeated, automated, requests"; the project's decomp.me use is a person in a browser, and its local replica + (`tools/decompme_replica.sh`) exists so that proofs are run at home. +- **Agents assist; a person owns.** Every change is justifiable by a person from the record (the phase logs, the decision log, + the cookbook's byte proofs). Governance — the constitution, the two gates per phase, the rule set distilled from failures — is + what made the machine's output auditable; it stays in force in Gen3. + +## 4. The gap, measured (2026-09-07), and the order of work + +| Bar (§2) | This tree today | +|---|---| +| Named functions | 1,094 named in the symbol files vs **16,335** `func_80xxxxxx` | +| Named data | **61,898** `D_80xxxxxx` (most are per-overlay script data; many will honestly stay unnamed) | +| Typed structures | **1,232** struct definitions, many drafter-invented variants of one type; **143** raw address casts | +| No match-forcing tricks | **43,857** register pins (`grep -rhoE 'register [^;]*__asm__\("\$[0-9a-z]+"\)' src \| wc -l`) | +| Readable organisation | **5,147** shared bodies as macros in one 8.4 MB, 227,730-line header; **3,558** of 4,287 C files are `_jr_` carve splits | +| Formatting, comments | no `.clang-format`, no `make format`; almost no code comments | + +The order, each step gated by the 218 hashes and each sized by a probe before it is priced (R37): + +1. **Pins off** — mechanical, batched by function family (`tools/alloc_table.py` + `tools/cc1_dumps_tu.sh` name the + allocation order; the P32 recipes in cookbook §501 show the reshaping); publish the count as it falls. +2. **Macro bodies → shared C files** — one family first, measured, then the rest; the carve-split file layout regrouped by + system where the linker script permits. +3. **Struct unification** — cluster the 1,232 definitions by access pattern (`tools/lift_types.py` knows the collision classes), + one canonical type per shape, then field names only with evidence. +4. **Names with evidence** — the evidence ladder (strings → debug menu → xrefs → live RAM → community labels), recorded per name. +5. **Formatting and comments** — adopt clang-format with sotn's settings; a file-level description per system; `// !FAKE:` on + every residual. + +**Definition of done for Gen3 (proposed; the Gen3 plan ratifies):** 0 pins or each one `// !FAKE:`-marked with its reason; 0 +macro bodies; one definition per structure; every renamed symbol with a recorded basis; clang-format clean; and, unchanged, +218 of 218 byte-identical from a clean rebuild. + +## 5. Related + +`docs/gen3-handoff.md` (the census, the levers, the sequencing against Phase 33) · `docs/verification.md` (the accuracy record) +· `docs/decision-log.md` P33 S89 (the closed pull request and what it taught) · `docs/how-to-ai-decomp/` (the method) · +`docs/retrospective.md` · sotn-decomp `docs/STYLE.md` and `CONTRIBUTING.md`; decomp.me FAQ; `ser-pounce/rood-reverse` — all +read 2026-09-07 as data (X2). diff --git a/docs/phase34-seed.md b/docs/phase34-seed.md new file mode 100644 index 000000000..05fd2608c --- /dev/null +++ b/docs/phase34-seed.md @@ -0,0 +1,57 @@ +# Phase 34 — the flip and the Gen2 exit (the post-flip half of Phase 33, re-chartered 2026-09-07) + +> **Why this phase exists.** Phase 33 planned the contract verification, the history rewrite, the publishing surface, the +> releases, the writing, and the public flip as one phase. Everything that does not depend on GitHub Support is done (see §2). +> The flip is gated on Support purging the old objects (ticket #4736982, filed 2026-09-07; `tools/public_rewrite/probe_github.sh` +> must print PASS first), which is calendar time nobody controls. The owner's decision (2026-09-07): **close Phase 33 now on what +> is done, put the flip-gated remainder into Phase 34 as the last Gen2 phase, and open Gen3 at Phase 35.** Phase 33 therefore +> closes at v1.32.0; Phase 34 closes at **v2.0.0 = Gen2 EXIT**. This file is the seed for Phase 34's plan-mode session (Tier 1, +> Max): it carries every task, every document the task uses, and the milestone, so nothing from Phase 33 is lost. + +## 1. Tasks (in order; effort per task; the actor) + +| # | Task | Actor | Effort | The document that carries it | +|---|---|---|---|---| +| 0 | **Daily probe** until PASS: `tools/public_rewrite/probe_github.sh` (S89 baseline 31 of 33 old hashes still ALIVE). Fallback if Support stalls past ~a week: delete and recreate the repository under the same name and push the same rewritten history (a new object network and a fresh Activity log; nothing else exists to lose). | Claude runs; Drew decides the fallback | Low | `docs/public-flip-runbook.md` §11 (the Activity-view leak, the ticket route, the fallback) | +| 1 | **C10 the flip:** Settings → General → Danger Zone → Change visibility → Public; then `gh api repos/Druthulu/BFM-decomp --jq .private` → `false`; `probe_github.sh --after-flip`; the Actions tab green; enable Settings → Features → Wikis (free plan: wikis need a public repo). | Drew | Max (decision) | runbook §11; checkpoint §0b | +| 2 | **E1 outward — the decomp.me preset:** the six steps (log in; scratch from `.run/decompme/drew_bundle/` → 100%; the preset-request issue on `decompme/decomp.me` in Drew's words; the manual search closing SETUP ledger row 14; report URLs). Regenerate the bundle with `tools/decompme_replica.sh` if `.run/` was pruned. | Drew | xHigh | `docs/decompme-preset.md` §5 | +| 3 | **E2 outward — the Archipelago note:** the GitHub issue on `AegeusEvander/Brave-Fencer-Musashi-AP-World` (or the Discord short form), in Drew's words; on reply, memory-map rows per its §5. | Drew | xHigh | `docs/outreach/archipelago.md` §4–§5 | +| 4 | **D3 outward — progress boards:** decomp.dev → log in → `decomp.dev/manage/new` → add the repo (reads the `SLUS_007.26_report` artifact `progress.yml` uploads); frogress: request slug `bfm` + key, then `FROGRESS_API_SECRET=… .venv/bin/python tools/frogress_upload.py --push`. | Drew | xHigh | SETUP P33 D1–D3 section; `tools/objdiff_report.py`, `tools/frogress_upload.py` | +| 5 | **F3 outward — the wiki:** Wiki tab → "Create the first page" → `tools/wiki_sync.sh --push` → check the sidebar links render. | Drew | Low | `tools/wiki_sync.sh`; `docs/wiki/`, `docs/how-to-ai-decomp/` | +| 6 | **Tool discoverability:** `gh repo edit Druthulu/xsig --add-topic decompilation --add-topic mips --add-topic playstation --add-topic psx --add-topic psyq --add-topic dedup --add-topic reverse-engineering -h https://github.com/Druthulu/BFM-decomp`; delete the fork `Druthulu/decomp-permuter` (the patch stays tracked in-tree); post the tools announcement in Drew's words. | Drew (or Claude on Drew's word) | Low | `docs/outreach/tools-announcement.md`; README "Tools from this project" | +| 7 | **C11 aftercare:** other clones `git fetch origin && git reset --hard origin/main && git reflog expire --expire=now --all && git gc --prune=now` (never `git pull`); `gh auth logout`; delete `.run/public_rewrite/` and `.run/objdiff/`; prune `.run/`; DIGEST §0/§1 and the decision-log entry for the flip. | Claude | xHigh | runbook §12 | +| 8 | **G2 — PhaseEnd_Phase34 v2.0.0 (Gen2 EXIT):** the PhaseEnd, `CURRENT_PHASE.md` → `phase-ends/logs/Phase34.md`, DIGEST §0/§2/§3 appended, the annotated `v2.0.0` tag; Drew pushes `main --tags`. Rule candidates (a)–(j) of Phase 33 are proposed at the Phase 33 close; any Phase 34 candidates are added here. | Claude, then Drew (gate 2, push) | Max, Tier 1 | this file; `phase-ends/PhaseEnd_Phase33.md` | + +Every outward action is done by Drew or **explicitly recorded as pending** in the PhaseEnd (P9 — never claimed). Every outward +text is written by Drew the way a developer writes it (rule candidate (j); `docs/gen3-standards.md` §3). + +## 2. What Phase 33 delivered (the record Phase 34 inherits — nothing here is redone) + +Verification and instruments: `docs/verification.md` (the recorded contract run, 218 of 218), `tools/verify_contract.sh`, `make +sdk-dual`, `make disc-extract`, `tools/bootstrap.sh`, `tools/fetch_psyq.sh`, the ROM-free CI (`.github/workflows/no-rom.yml`, +`tools/audit_public.py`, `tools/compile_only.py`), `dumps/CHECKSUMS.sha1`, `config/ghidra/*.jsonl` + `ROSTER.md` +(`tools/ghidra_rebuild.sh --proof`). The history rewrite: `tools/public_rewrite/`, `docs/commit-map.tsv`, +`docs/public-flip-runbook.md`, the private archive `Druthulu/BFM-decomp-archive`, the force-pushed rewritten `main`. The +publishing surface: `README.md` (generated numbers, Special thanks, "Standards, and how the AI was used", "Tools from this +project"), `LICENSE`, `src/NOTICE.md`, `THIRD_PARTY.md`, `docs/progress.json` + `docs/badges/`, `tools/objdiff_report.py`, +`tools/frogress_upload.py`, `.github/workflows/progress.yml`, `tools/doc_links.py`. The releases: `docs/gcc-2.7.2-map/README.md` ++ `tools/gccmap_cites.py`; `tools/xsig/` + `github.com/Druthulu/xsig`; `docs/permuter-ils.md` + the tracked patch (offered +upstream, declined); `docs/matching-drafter-pipeline.md`; `docs/decompme-preset.md` + `tools/decompme_replica.sh`; +`docs/outreach/archipelago.md`; `docs/outreach/tools-announcement.md`. The writing: `docs/story.md` + `docs/story-timeline.md/.svg` +(`tools/timeline.py`), `docs/retrospective.md` (`tools/mine_hindsight.py`), `docs/wiki/` (13 pages) + `docs/how-to-ai-decomp/` +(13 chapters) + `tools/wiki_render.py` / `tools/wiki_sync.sh`. Gen3: `docs/gen3-handoff.md`, `docs/gen3-standards.md`. Memory +map: the S89 corrections (day-of-week, the patch-site functions, Q#13). Rules: R65–R73 ratified at gate 1; candidates (a)–(j) +recorded in the Phase 33 checkpoint and proposed at its close. + +## 3. Milestone (gate 2 of Phase 34 — what Drew confirms; these are Phase 33's original items 2–4) + +1. `gh api repos/Druthulu/BFM-decomp --jq .private` → `false`; `probe_github.sh` exit 0 (old hashes 404); `.github/workflows/ + no-rom.yml` green on the public repo; the wiki live; the fresh-clone criterion met with the disc (B3's proof stands). +2. Every outward action done or recorded as pending: the decomp.me preset request, the Archipelago note, decomp.dev and + frogress, the wiki push, the xsig topics, the fork deletion, the tools post. +3. C11 done; `PhaseEnd_Phase34.md` v2.0.0 + DIGEST append + the `v2.0.0` tag pushed. **Gen2 EXIT.** + +## 4. What comes after (not this phase) + +Gen3 opens at Phase 35 in a fresh plan-mode session from `docs/gen3-handoff.md` and `docs/gen3-standards.md`: pins off, the +macro-body header into shared C files, struct unification, names with evidence, formatting — every step gated by the 218 hashes. diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index df88f6505..411d471c5 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -700,8 +700,18 @@ Mid-phase rules check after every 4 completed tasks (P6). Commit banked artifact macros in one 8.4 MB header**; 3,558 of 4,287 C files are carve splits. Sequencing decided: Gen3 execution after v2.0.0 in a fresh plan-mode session; measurement-only preparation under G1 meanwhile; delete-and-recreate if Support stalls past ~a week. Drew replied to the permuter maintainer in his own words (sent). Commit: see below. +- **2026-09-07 (S89, Max) — the Gen3 charter, the memory, the README stance, and the RE-CHARTER into Phase 34.** `docs/gen3-standards.md` + (NEW): accuracy met and stricter than the field; readability = sotn STYLE.md as baseline + four rules of ours (names only with + evidence; every pin off or `// !FAKE:`; shared bodies as C not macros; types from code, names from observation); the conduct rules + for using AI; the measured gap and the order of work; a proposed definition of done. Memory `decomp-community-ai-standards` + written (the essentials, so no future session slips). README gains "Standards, and how the AI was used" (accuracy / readability / + how the AI was used, plain voice). **Drew's decision:** close Phase 33 NOW on what is done (v1.32.0); the flip-gated remainder is + **Phase 34 — the flip and the Gen2 exit** (`docs/phase34-seed.md`, NEW: tasks with actor/effort/carrying doc, the full inventory of + P33 deliverables, the milestone = P33's original items 2–4; v2.0.0 = Gen2 EXIT); Gen3 opens at Phase 35. Recorded as a P33 + deviation (the milestone's items 2–4 move, not redefined — P9). Wiring: doc_links default (+2), SETUP rows (+2), checkpoint §0a + + header. NEXT = G2 (gate 2). Commit: see below. -## 🛑 SESSION CHECKPOINT — A1–A5 ✓, B1–B9/C3 ✓, C1–C9 ✓, D1–D5 ✓, F1–F3 ✓, E1–E6 ✓, G1 ✓ (36 of 41); C10 = SUPPORT TICKET #4736982 FILED, PROBE DAILY; NEXT = the probe-gated chain (Drew: flip → E1/E2/D3 outward → wiki push), then C11, G2 (2026-09-07, written by S88, updated by S89 after the ticket + E1; SUPERSEDES the earlier blocks) +## 🛑 SESSION CHECKPOINT — A1–A5 ✓, B1–B9/C3 ✓, C1–C9 ✓, D1–D5 ✓, F1–F3 ✓, E1–E6 ✓, G1 ✓ (36 of 41); C10 = SUPPORT TICKET #4736982 FILED, PROBE DAILY; RE-CHARTERED 2026-09-07: NEXT = G2 = the Phase 33 close at v1.32.0 (gate 2, Tier 1) — the flip chain is PHASE 34 (`docs/phase34-seed.md`), Gen3 = PHASE 35+ (written by S88, updated by S89; SUPERSEDES the earlier blocks) ### 0. How to use this block You are a FRESH SESSION that has read `PROJECT_CONTEXT.md`, `phase-ends/DIGEST.md`, `PhaseEnd_Phase30/31/32.md` and this file, @@ -725,6 +735,13 @@ Drew's instruction: `Druthulu/xsig` is public (`c8d862c`); (5) DONE — PR simon hashes only** (the history was rewritten; `docs/commit-map.tsv` maps ordinals → new hashes; the scratch `.run/public_rewrite/` holds the old ones and stays until the probe passes). **Never `git clean -x`** (CLAUDE.md fail-safe). +### 0a. RE-CHARTER (Drew, 2026-09-07, S89): Phase 33 CLOSES NOW on what is done; the flip-gated remainder is PHASE 34; Gen3 opens at PHASE 35 +The flip waits on GitHub Support (ticket #4736982) — calendar time nobody controls. Owner's decision: close Phase 33 at **v1.32.0** with +A1–A5, B1–B9/C3, C1–C9, D1–D5, E1–E6 (documents + local proofs; outward halves pending), F1–F3, G1 done and C10/C11 + the outward +actions moved to **Phase 34 — the flip and the Gen2 exit** (`docs/phase34-seed.md`: every task, actor, effort, carrying document, the +milestone = Phase 33's original items 2–4; closes at **v2.0.0 = Gen2 EXIT**). Gen3 = Phase 35+ (`docs/gen3-handoff.md`, +`docs/gen3-standards.md`). The checklist below is now Phase 34's task list; it stays here for the replay. + ### 0b. DREW'S POST-FLIP CHECKLIST (consolidated 2026-09-07, S89 — the one list to replay; every item's detail is in the doc named) 0. **Before the flip:** run `tools/public_rewrite/probe_github.sh` daily until it prints PASS (Support ticket #4736982; S89: 31 of 33 ALIVE). Push the local commits (`git push origin main`) and confirm both Actions workflows are green on the push. diff --git a/tools/doc_links.py b/tools/doc_links.py index 8101f4256..e7a61af91 100644 --- a/tools/doc_links.py +++ b/tools/doc_links.py @@ -22,7 +22,8 @@ DEFAULT = ["README.md", "THIRD_PARTY.md", "CLAUDE.md", "src/NOTICE.md", "tools/R "docs/story.md", "docs/story-timeline.md", "docs/retrospective.md", "phase-ends/README.md", "phase-ends/DIGEST.md", "docs/gcc-2.7.2-map/README.md", "tools/xsig/README.md", "docs/permuter-ils.md", "docs/matching-drafter-pipeline.md", - "docs/gen3-handoff.md", "docs/decompme-preset.md", "docs/outreach/archipelago.md", "docs/outreach/tools-announcement.md"] + "docs/gen3-handoff.md", "docs/decompme-preset.md", "docs/outreach/archipelago.md", "docs/outreach/tools-announcement.md", + "docs/gen3-standards.md", "docs/phase34-seed.md"] # whole directories in the default set (P33 F3): the wiki pages and the how-to chapters — every file, so a new page is # checked the moment it exists (the glob is expanded at run time; the count is printed with the rest, R41) DEFAULT_GLOBS = ["docs/wiki/*.md", "docs/how-to-ai-decomp/*.md"]