docs(workflow): align CLAUDE.md + memory + roadmap with named-retail foundation

CLAUDE.md edits (6 surgical ranges):
  - Goal section: introduce named-retail/ as primary; old chunks
    remain as fallback for chunk-by-chunk address-range navigation.
  - Workflow renamed to "grep named -> decompile -> verify -> port"
    with a new STEP 0 GREP NAMED FIRST. Decompile demoted to a
    fallback (Step 1) for the rare obfuscated/packed minority that
    pseudo-C lacks.
  - Function-map citation updated to point at symbols.json + the
    cross-port hand-curated table.
  - "Do not guess" rule strengthened: PDB has the answer for almost
    everything; guessing is now negligence.
  - Phase completion checklist accepts named symbols + addresses.
  - Reference hierarchy table gets a new top row pointing at
    docs/research/named-retail/ as the primary oracle for any
    AC-specific algorithm — beats every other reference.

memory/project_named_decompilation.md (new): evergreen crib-sheet
with file inventory, grep examples, hard rules. Pattern matches
project_ui_architecture.md.

memory/project_retail_research_index.md: updated preamble to point
named-retail/ as first stop; older slices remain useful for
pseudocode + C# port sketches.

memory/project_collision_port.md: rewrote the "Decompiled ground
truth" section to put named-retail/ first, chunks second. The
"DECOMPILE FIRST" mandate becomes "GREP NAMED FIRST, then DECOMPILE
FALLBACK".

docs/architecture/acdream-architecture.md: Guiding Principle text
updated to introduce named-retail as the primary decomp source.

docs/plans/2026-04-11-roadmap.md: new Phase R block — Retail
research infrastructure. R.1 (corpus, shipped a9a01d8), R.2
(pdb-extract, shipped 69d884a), R.3 (actestclient vendored,
shipped a9a01d8). All marked SHIPPED 2026-04-25.

Auto-loaded MEMORY.md index updated with a new entry pointing at
project_named_decompilation.md so post-compaction sessions inherit
the workflow change automatically.

Acceptance verified:
  - grep -c "named-retail" CLAUDE.md = 9 (>= 3 required)
  - grep -c "named-retail" MEMORY.md = 1
  - dotnet build green (docs-only commit, but verified)

Foundation phases A + B + C all landed. Next: Phase D files
ISSUES #8/#9/#11 + closes #10 (KillerNotification orphan parser).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-04-25 17:36:53 +02:00
parent 69d884a3d6
commit 0a429a980c
6 changed files with 192 additions and 23 deletions

View file

@ -62,10 +62,19 @@ ground truth. ACE has the ENTIRE system already in C#:
- `references/ACE/Source/ACE.Server/Physics/Collision/CollisionInfo.cs`
- `references/ACE/Source/ACE.Server/Physics/Collision/ObjectInfo.cs`
### Decompiled ground truth:
- `docs/research/decompiled/chunk_00530000.c` — BSP, Polygon, Sphere collision
- `docs/research/decompiled/chunk_00500000.c` — PhysicsObj, transition callers
- `docs/research/acclient_function_map.md` — mapped functions
### Decompiled ground truth (named-retail is now primary, 2026-04-25):
- **`docs/research/named-retail/acclient_2013_pseudo_c.txt`** — grep for
`BSPTree::`, `BSPNode::`, `BSPLeaf::`, `CPolygon::`, `CCylSphere::`,
`Transition::`, `CPhysicsObj::`, `SpherePath::` to find named bodies.
- **`docs/research/named-retail/acclient.h`** — verbatim retail struct
layouts for the BSP / Sphere / Transition types.
- **`docs/research/named-retail/symbols.json`** — name↔address lookup.
- `docs/research/decompiled/chunk_00530000.c` — older Ghidra fallback for
BSP / Polygon / Sphere collision (FUN_xxx names).
- `docs/research/decompiled/chunk_00500000.c` — older Ghidra fallback for
PhysicsObj / transition callers.
- `docs/research/acclient_function_map.md` — hand-curated cross-port index
(ACE / ACME mappings + struct-offset notes).
### Pseudocode (already written):
- `docs/research/transition_pseudocode.md` — full system documented
@ -90,10 +99,12 @@ ground truth. ACE has the ENTIRE system already in C#:
For EVERY function:
1. **DECOMPILE FIRST.** Find the matching function in the decompiled
client (`docs/research/decompiled/`). Use the function map at
`docs/research/acclient_function_map.md`. If not mapped, search
by characteristic constants or struct offsets.
1. **GREP NAMED FIRST, then DECOMPILE FALLBACK.** Search the named
retail decomp first: `grep -n "ClassName::Method" docs/research/named-retail/acclient_2013_pseudo_c.txt`.
For struct layouts: `grep -n "^struct ClassName" docs/research/named-retail/acclient.h`.
Only if the named pseudo-C lacks a function (rare), fall back to the
older `docs/research/decompiled/` chunks via the function map at
`docs/research/acclient_function_map.md`.
2. **CROSS-REFERENCE ACE.** Read ACE's C# port of the same function.
ACE provides naming and structure. Note any differences.

View file

@ -0,0 +1,84 @@
# Project: named-retail decompilation foundation
**Agreed 2026-04-25.** Read once per session. Foundation commits:
`a9a01d8` (corpus), `69d884a` (pdb-extract tool).
## What changed
The retail-client decompilation has gone from "FUN_xxx Ghidra chunks +
71 hand-mapped functions" to **"18,366 named retail functions + 5,371
named struct types + verbatim retail headers"**, all committed under
`docs/research/named-retail/`. The `acclient.pdb` (Sept 2013 EoR build,
MSVC 7.00) is the source of truth.
## Files at `docs/research/named-retail/`
| File | What | When to use |
|---|---|---|
| `acclient_2013_pseudo_c.txt` (62 MB / 1.44 M lines) | Binary Ninja pseudo-C with 99.6% naming. Address-prefixed lines. | **Primary symbol lookup.** Grep by `class::method`. |
| `acclient.h` (1.7 MB / 70K lines) | IDA-decompiled retail headers. Every struct verbatim. | **Struct field names + offsets.** Grep by struct name. |
| `acclient.c` (46 MB / 1.3 M lines) | IDA full-binary export. Mixed FUN_/named, but has named struct fields. | **Cross-reference when pseudo-C body is corrupt.** |
| `symbols.json` (3 MB) | 18,366 entries: `address` + `name` (demangled `Class::Method`) + `mangled` (raw MSVC ABI). | **Programmatic name↔address lookup via jq.** |
| `types.json` (506 KB) | 5,371 named class/struct records with size + kind. | **Programmatic type-layout queries.** |
## Workflow change — STEP 0 GREP NAMED FIRST
`CLAUDE.md` workflow now starts with **Step 0** before the older
DECOMPILE step:
```bash
# Find a function body
grep -n "CEnchantmentRegistry::EnchantAttribute" \
docs/research/named-retail/acclient_2013_pseudo_c.txt
# Find a struct
grep -n "^struct.*CEnchantmentRegistry" \
docs/research/named-retail/acclient.h
# Programmatic
cat docs/research/named-retail/symbols.json | \
jq '.[] | select(.name == "CEnchantmentRegistry::EnchantAttribute")'
```
The older `docs/research/decompiled/` Ghidra chunks remain a fallback
for the obfuscated/packed minority that pseudo-C lacks. ~5 second
grep replaces ~30 minute archaeology for typical lookups.
## Hard rules
1. **Grep `named-retail/` first.** Always. The "Do not guess" rule in
CLAUDE.md is upgraded: with the PDB available, guessing is no
longer recoverable error — it's negligence.
2. **Match by name, not raw address.** The PDB build has a ~0xC00
byte delta vs the binary that produced our older chunks. Address
lookups in `symbols.json` are correct; the older
`acclient_function_map.md` had several mid-body addresses (issue
#9 sweep corrected them).
3. **Regenerate JSON sidecars when needed:**
```powershell
py tools\pdb-extract\pdb_extract.py refs\acclient.pdb
```
4. **`refs/` stays gitignored.** It's per-developer download cache;
the committed extracts at `docs/research/named-retail/` are what
subagents and post-compaction sessions inherit.
## Counts (Sept 2013 EoR build)
- 18,366 named public function symbols (`S_PUB32`, code flag set)
- 5,371 unique named class/struct types (filtered for non-forward-declared)
- 1,053 .obj compilation units recorded in DBI
- Build root preserved in PDB: `d:\ac1_sep13\`
## Why this matters
Closes / unblocks issues #6 (enchantment buffs in vital max — uses
`CEnchantmentRegistry::EnchantAttribute` at `0x594570`), #7
(PlayerDescription trailer — uses `CPlayerSystem::Handle_PlayerDescription`
at `0x5636A0`), plus reduces the cost of every future port from "30
min archaeology" to "5 sec grep".
## Links
- Plan: `C:/Users/erikn/.claude/plans/ticklish-conjuring-cake.md` (8-phase foundation)
- Tool: `tools/pdb-extract/` (pure Python, no deps)
- Reference: `docs/research/named-retail/README.md`

View file

@ -8,6 +8,13 @@ all Opus-4.7 high-effort).
subsystem. Open the slice for that subsystem BEFORE writing the first
line — every slice has pseudocode + C# port sketch + citations.
> **2026-04-25 update — named-retail foundation.** First stop for any
> AC-specific question is now `docs/research/named-retail/` (PDB-named
> Sept 2013 EoR decomp; 18,366 named functions, 5,371 named struct
> types, 1.4 M lines of pseudo-C). The slices below remain useful for
> their pseudocode + C# port sketches and the deeper research notes
> they synthesize. See `memory/project_named_decompilation.md`.
---
## UI layer (`docs/research/retail-ui/`) — 6 slices, ~30,000 words