Skip to content

Commit 71c75ee

Browse files
Francesco149claude
andcommitted
docs: intro v3 parity VERIFIED 1:1 — render faithful + in-phase, stale gaps closed
Closing pass over the opening prologue (user reframe: 'not whether visuals are missing — whether things are out of phase / not rendered faithfully / a logic approximation that should be closed'). The intro is verified 1:1 modulo the one deferred book-arrow phase: - Render: iv1_1 ALIGNED (0 divergent); iv1_2 = 4 benign batched + 1 inert b494 (0 px) via orv3_draws --material — NO retail-only effect texture, so the anger-marks/radial-lines 'gap' is NOT a render gap (ledger row resolved). - Phase: in-phase in the visible window (dialogue +121/+156, blink 21/85/149 on both); the only difference is invisible (conv-pose producer debt, under the load overlay). - Stale gaps closed: text-fade-on-dismiss = already ported (user); iv1_1->iv1_2 is a plain fade-to-black-and-back, NOT a shatter/melt grid (user ground-truth; the RE'd FUN_0045281c shatter is a different transition — corrected). - NEXT (queued): the shop customer selling loop — user recorded the tutorial trace runs/recordings/rec-20260617-051426.raw.jsonl. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 164eae5 commit 71c75ee

5 files changed

Lines changed: 119 additions & 2 deletions

File tree

docs/FRONT.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,34 @@
764764
RE/correction: `opening-prologue.md`. **Lesson (`feedback_verify_1to1_before_done`): eyeball both
765765
cached sides render the SAME scene before trusting any join verdict — a join pairs by anchor
766766
identity and will happily pair two unrelated cutscenes that share an anchor name.**
767+
**INTRO V3 PARITY — VERIFIED COMPLETE + stale gaps CLOSED 2026-06-17 PM** (user: "we can /clear
768+
and move onto the new trace"). Closing pass over the prologue, reframed by the user as "not whether
769+
visuals are missing — whether things are out of phase / not rendered faithfully / a logic
770+
approximation that should be closed": (1) **render program verified FAITHFUL on BOTH cutscenes**
771+
via the new `orv3_draws --material` (the batching-robust per-texture verdict, `164eae5`) — iv1_1 =
772+
**ALIGNED** (0 divergent: pure 2D bedroom, no HOUSE-3D batching); iv1_2 = the 88-vs-115 draw swamp
773+
collapses to **4 benign batched + 1 inert `b494` (0 px) — NO retail-only effect texture**, identical
774+
at every probed offset ⇒ the anger-marks/radial-lines "gap" is **NOT a render gap** (ledger row
775+
resolved). (2) **Phase verified IN-PHASE in the visible window** (from the cached anchor streams rel
776+
HF#2): dialogue `TEXT_ANIM_START/END` = +121/+156 on BOTH; `CONV_POSE_BLINK` cadence 21/85/149 on
777+
BOTH. The only phase difference is INVISIBLE — retail poses the chibis ~41f before HF#2 (under the
778+
load overlay), the port at load-end (`CONV_POSE_START` +1) = the documented conv-pose producer debt
779+
(derived talk-flag + load-end chibi spawn vs the real `FUN_00470a46` + mid-load spawn); 0 pixel
780+
impact, left as PORT-DEBT. (3) **Stale ledger rows CLOSED:** text-fade-on-dismiss = **already ported**
781+
(user); the iv1_1→iv1_2 transition is a **plain fade-to-black-and-back, NOT a shatter/melt grid**
782+
(user ground-truth — the RE'd `FUN_0045281c` shatter machinery is NOT this seam; engine-quirks +
783+
opening-prologue.md corrected). **Remaining intro gap (DEFERRED, user-OK):** the next-line "book"
784+
arrow anim slight phase mismatch (`rt->blink` not in `{phasepin}`) — the only thing the user still
785+
flags. ⇒ **the opening prologue is verified 1:1 (render faithful + in-phase) modulo the deferred
786+
book-arrow phase.**
787+
- **NEXT ARC (queued for next session) → SHOP CUSTOMER SELLING LOOP** — the core Recettear gameplay
788+
(customers enter → browse displayed items → haggle/sell), currently **0% ported** (no customer NPC /
789+
haggle / transaction; the `DAT_0438cc08==4` shop-open path + `FUN_0047019f`/`FUN_0041ee24` are
790+
stubbed). The user RECORDED the tutorial trace 2026-06-17: **`runs/recordings/rec-20260617-051426.raw.jsonl`**
791+
— walk to the counter → a "GO!"-style tooltip → press Z → the customer-service tutorial (alternating
792+
dialogue ↔ price haggling) → stops after the tutorial ends + the first real customer enters. Next
793+
session: convert the raw recording to a `{caprange}` v3 scenario, RE the customer-spawn/browse/haggle
794+
subsystem, port the first chip.
767795
- **SHOP-DOOR "GO!" TOOLTIP ✅ DONE + USER-CONFIRMED 1:1 2026-06-17** (`2fb6085`; parity ledger;
768796
user "looks good to me"). The user-flagged "tooltip at the door" = the free-roam interaction-
769797
affordance **emote bubble** (the unported inline block of `FUN_0040a765`, decomp L6900-6932): a

docs/PROGRESS.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,30 @@ the test harness has coverage metrics worth reporting.
77
> `port-ledger.{json,md}` (per-function port status). This log is the dated
88
> narrative; don't hand-track per-subsystem "done/not-done" status here.
99

10+
## 2026-06-17 PM — INTRO v3 parity VERIFIED 1:1 + `orv3_draws --material` + stale gaps closed
11+
12+
Closing pass over the opening prologue (user reframe: "not whether visuals are missing — whether
13+
things are out of phase / not rendered faithfully / a logic approximation that should be closed").
14+
15+
- **`orv3_draws --material` (`164eae5`)** — the CLI printed only the per-draw alignment, whose
16+
ALIGNED/DIVERGENT is swamped by the benign HOUSE-3D batching (iv1_2 overlays the live 3D shop ⇒
17+
port 88 / retail 115 draws). Exposed the batching-robust MATERIAL verdict already in the module
18+
(per-texture triangle totals → ALIGNED / BATCHING / DIVERGENT) — every run now prints it first,
19+
`--material` prints only it. "Fix the known diff so we can see real divergences."
20+
- **Render verified FAITHFUL both cutscenes:** iv1_1 ALIGNED (0 divergent, pure 2D); iv1_2 = 4 benign
21+
batched + 1 inert `b494` (0 px, HOUSE-wide) — NO retail-only effect texture ⇒ the **anger-marks /
22+
radial-lines "gap" is NOT a render gap**.
23+
- **Phase verified IN-PHASE (visible window)** from the cached anchor streams: dialogue +121/+156 on
24+
both, `CONV_POSE_BLINK` 21/85/149 on both. The only diff is invisible (retail poses the chibis
25+
~41f before HF#2 under the load overlay = the conv-pose producer PORT-DEBT, 0 px).
26+
- **Stale ledger rows CLOSED:** text-fade-on-dismiss = already ported (user); **iv1_1→iv1_2 is a
27+
plain fade-to-black-and-back, NOT a shatter/melt grid** (user ground-truth — the RE'd `FUN_0045281c`
28+
shatter is some other transition; corrected in `opening-prologue.md`).
29+
- ⇒ **opening prologue is verified 1:1** modulo the DEFERRED next-line book-arrow phase (user-OK).
30+
- **NEXT (queued):** the SHOP CUSTOMER SELLING LOOP — user recorded the tutorial trace
31+
`runs/recordings/rec-20260617-051426.raw.jsonl` (counter tooltip → Z → customer-service tutorial,
32+
dialogue ↔ haggle → first real customer). Convert to a v3 scenario + RE the haggle subsystem.
33+
1034
## 2026-06-17 — v3 base-anchor auto-detect (`ddeb421`) + iv1_2 mis-armed-retail CORRECTION
1135

1236
`v3cache.preserve_live` resolved a window's BASE anchor by occurrence #1; new

docs/STATUS.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,34 @@ Registry: `port-debt.md` / `.json`; retirement plan: `plans/un-mvp-structural-pa
783783
RE/correction: `opening-prologue.md`. **Lesson (`feedback_verify_1to1_before_done`): eyeball both
784784
cached sides render the SAME scene before trusting any join verdict — a join pairs by anchor
785785
identity and will happily pair two unrelated cutscenes that share an anchor name.**
786+
**INTRO V3 PARITY — VERIFIED COMPLETE + stale gaps CLOSED 2026-06-17 PM** (user: "we can /clear
787+
and move onto the new trace"). Closing pass over the prologue, reframed by the user as "not whether
788+
visuals are missing — whether things are out of phase / not rendered faithfully / a logic
789+
approximation that should be closed": (1) **render program verified FAITHFUL on BOTH cutscenes**
790+
via the new `orv3_draws --material` (the batching-robust per-texture verdict, `164eae5`) — iv1_1 =
791+
**ALIGNED** (0 divergent: pure 2D bedroom, no HOUSE-3D batching); iv1_2 = the 88-vs-115 draw swamp
792+
collapses to **4 benign batched + 1 inert `b494` (0 px) — NO retail-only effect texture**, identical
793+
at every probed offset ⇒ the anger-marks/radial-lines "gap" is **NOT a render gap** (ledger row
794+
resolved). (2) **Phase verified IN-PHASE in the visible window** (from the cached anchor streams rel
795+
HF#2): dialogue `TEXT_ANIM_START/END` = +121/+156 on BOTH; `CONV_POSE_BLINK` cadence 21/85/149 on
796+
BOTH. The only phase difference is INVISIBLE — retail poses the chibis ~41f before HF#2 (under the
797+
load overlay), the port at load-end (`CONV_POSE_START` +1) = the documented conv-pose producer debt
798+
(derived talk-flag + load-end chibi spawn vs the real `FUN_00470a46` + mid-load spawn); 0 pixel
799+
impact, left as PORT-DEBT. (3) **Stale ledger rows CLOSED:** text-fade-on-dismiss = **already ported**
800+
(user); the iv1_1→iv1_2 transition is a **plain fade-to-black-and-back, NOT a shatter/melt grid**
801+
(user ground-truth — the RE'd `FUN_0045281c` shatter machinery is NOT this seam; engine-quirks +
802+
opening-prologue.md corrected). **Remaining intro gap (DEFERRED, user-OK):** the next-line "book"
803+
arrow anim slight phase mismatch (`rt->blink` not in `{phasepin}`) — the only thing the user still
804+
flags. ⇒ **the opening prologue is verified 1:1 (render faithful + in-phase) modulo the deferred
805+
book-arrow phase.**
806+
- **NEXT ARC (queued for next session) → SHOP CUSTOMER SELLING LOOP** — the core Recettear gameplay
807+
(customers enter → browse displayed items → haggle/sell), currently **0% ported** (no customer NPC /
808+
haggle / transaction; the `DAT_0438cc08==4` shop-open path + `FUN_0047019f`/`FUN_0041ee24` are
809+
stubbed). The user RECORDED the tutorial trace 2026-06-17: **`runs/recordings/rec-20260617-051426.raw.jsonl`**
810+
— walk to the counter → a "GO!"-style tooltip → press Z → the customer-service tutorial (alternating
811+
dialogue ↔ price haggling) → stops after the tutorial ends + the first real customer enters. Next
812+
session: convert the raw recording to a `{caprange}` v3 scenario, RE the customer-spawn/browse/haggle
813+
subsystem, port the first chip.
786814
- **SHOP-DOOR "GO!" TOOLTIP ✅ DONE + USER-CONFIRMED 1:1 2026-06-17** (`2fb6085`; parity ledger;
787815
user "looks good to me"). The user-flagged "tooltip at the door" = the free-roam interaction-
788816
affordance **emote bubble** (the unported inline block of `FUN_0040a765`, decomp L6900-6932): a

docs/findings/confirmed-parity-ledger.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@
9494
| **Skip-prompt `savewindow.tga` banner + text ~−1 LSB — RESOLVED 2026-06-05 (root-caused, fixed, user-confirmed box 1:1)** | The ~−1 LSB on the gold (`[237,200,52]` vs retail `[238,201,52]`) and the text edges was **NOT** TGA/colour precision — it was a **wrong COLOROP**. `FUN_0043537e` draws the banner+text under `D3DTOP_ADDSIGNED` (=8, ≈ pass-through at the 0x7f7f7f vertex colour); the port used `D3DTOP_MODULATE2X` (=5, `texel·0.996` = 1 LSB darker) — `8` had been mis-labelled "MODULATE2X" (which is enum 5). The banner verts/UVs/diffuse were **bit-identical** port↔retail (decoded from `--d3d-trace-verts`), ruling out scale/phase/TGA. The text halo was a second facet: retail keeps ADDSIGNED through the prompt+Yes/No (resets to MODULATE only at the end) and draws them at 0x7f7f7f; the port reset early and drew full-white under MODULATE. Fix (`src/choice_box.c`): ADDSIGNED for the banner, hold it through the text @0x7f7f7f, reset after → box+text+cursor region **0 px** vs retail (both caps). engine-quirks §104. | user-flagged 2026-06-05; box+text confirmed 1:1 by user 2026-06-05 after fix. Residual full-frame delta = prologue bg §85 phase only. |
9595
| **LOAD-GAME picker: rotated clock day-hand ±1 LSB** | The picker's settled-frame residual (947 px ≤4 LSB, max Δ8, bbox x[138-224] y[171-230]) is **entirely the rotated gold clock needle + its hub** — the clock face, ring, pie segments, parchment cards, and 0.8 stat text are all **0 px**. **This is NOT the "scaling-filter" class.** The day-hand quad's *vertices/UVs/diffuse are bit-identical* port↔retail (decoded from `--d3d-trace-verts`, frame 120: both v0(149.175,152.23)…v3(212.256,247.77), u 0.4541→0.4834, diffuse 0xff7f7f7f), so the port's rotation math is exact. The delta is the **rasterizer bilinear-sampling a ROTATED quad**: every pixel hits a diagonal sub-texel position whose 4-texel blend weight differs by ≤1 LSB between the port's GPU and the retail (`cutestation.soy`) GPU — axis-aligned scaled quads sample grid-aligned and agree (→0 px), only the diagonal one disagrees. Not a port logic fix (POINT would diverge from retail's bilinear hand). **Also found:** retail draws **3** rotated quads on this frame, the port **2** — the port is missing one *off-screen* (x≈−875, alpha 0xc8) hand instance, likely a paged-off slot's needle (off-screen → no pixel effect, but a genuine structural gap). | user-confirmed "it's the clock hand" 2026-06-05. Evidence: `picker-residual-crop` feed push + `render_diff`-decoded strip verts. Distinct mechanism from the box-edge-halo row above (that's axis-aligned, suspected TGA/colour-precision; this is rotated-bilinear). |
9696
| ~~**iv1_2 opening: Recette look-up + blink**~~**RESOLVED → 1:1, 2026-06-17 (user-confirmed)** | the look-up + conversation-pose blink IS ported (the CONV_POSE driver) — `CONV_POSE_BLINK` fires ×5 in the iv1_2 v3 window and pairs port↔retail in the join, and the user confirmed the `intro-iv2-v3 win-0-300` window "bit exact and synchronized" (the only residual = the book-arrow next-line anim). The 2026-06-02 flag predated the v3 verification (the retail side couldn't be captured at iv1_2 until the occurrence-aware arm `869375f`). See the CONFIRMED-1:1 "iv1_2 prologue cutscene" row. | resolved 2026-06-17; the v3 join (279/299, paired frames pixel-1:1) was unblocked by the occurrence-aware retail arm. |
97-
| **iv1_2 opening: Tear angry pose + radial-lines** | same window — retail plays Tear an angry pose with a billboard radial-lines (manga anger-marks) effect; port absent. | user-flagged 2026-06-02. Same `intro-iv2-gap` zoom frames both Recette + Tear. opening-prologue.md #4(b). |
98-
| **Dialogue text fade-to-transparent on dismiss** | when a line is dismissed retail fades the glyph text out as the box closes; the port pops it off. | user-flagged 2026-06-02. `intro-iv2-gap` captures the dismiss window. Box-close alpha on the text in `FUN_0046c9a2`. opening-prologue.md #5. |
97+
| ~~**iv1_2 opening: Tear angry pose + radial-lines**~~ — **RESOLVED → NOT A RENDER GAP, 2026-06-17 (user-confirmed)** | The 2026-06-02 flag (a billboard radial-lines / manga anger-marks effect near Tear) does not hold up under v3. **(a) Render verdict:** `orv3_draws --material` over the WHOLE iv1_2 opening (`intro-iv2-v3`, every probed offset) shows the only render-program divergence is the **inert `b494` HOUSE draw (80 tris, ALPHATEST-α0 + ZWRITE=0 ⇒ 0 px) + benign HOUSE-3D batching** — there is **NO retail-only effect texture** (an anger-marks billboard would appear as one; it does not). **(b) User ground-truth:** the user, playing retail, reports there is **no melt/anger effect between the two intro dialogues — "it just fades to black and back".** So this was a pre-v3 / mis-armed-capture artifact (the conv-pose blink + RNG-phase wing-sparkle, both resolved under pinning), not a missing render. | resolved 2026-06-17 — material verdict + user. The `--material` flag (`164eae5`) is what surfaced this past the 88-vs-115 batching swamp. |
98+
| ~~**Dialogue text fade-to-transparent on dismiss**~~**RESOLVED → already ported, 2026-06-17 (user-confirmed)** | the box-close glyph fade IS ported — user (playing retail + port): "the glyph gradient to transparent is already ported". The 2026-06-02 flag is stale. | resolved 2026-06-17. |
9999
| **Recette idle animation phase** | idle pose **slightly off** at `house-movement` **cap_00 (first frame, idle free-roam)** — while her **walking is confirmed 1:1** (cap_01/02). **Narrowed 2026-06-04:** `phase_probe house-idle --window 120,80` shows the player idle anim cycle (`p.aframe/counter/anim/oct`) **machine-verified bit-exact** vs retail once `{phasepin}` normalizes the origin (now covers actor 0) → the idle anim *law* is 1:1; the visible cap_00 diff is the load-dependent phase ORIGIN (harness-normalized, not re-seeded per the shipped game), **plus** a separate idle-only RNG over-consumption (see Deferred) that can shift idle sparkle/effect phase. | user, 2026-06-01. NOT position (pure-black once moving) and NOT an anim-counter logic bug. Chase the visible residual via the idle-RNG gate + a phasepin'd idle pixel-diff; do NOT hand-wave as jitter. ([[project_next_char_controller]]) |
100100
| ~~**Tear (companion) appearance**~~ — **RESOLVED → 1:1, 2026-06-05 (user-confirmed "yes that is 1:1")** | The "persistent" Tear free-roam residual (drift bbox x[522-567] y[370-441] at `house-idle-npc-drift` cap_00, ~2000px@mean0.95, present even +2 post-`{phasepin}`) was **entirely RNG-phase noise**, NOT position, NOT anim-phase, NOT a render bug. The `house-idle-npc-drift` scenario trace carries `{phasepin}` but **no `{rngseed}`**, so the wing-sparkle particles (type-0x1f, RNG-jittered) spawned at a different LCG origin port↔retail and the whole Tear region lit up. **`phase_probe house-idle-npc-drift` (auto-adds `{rngseed}`) verdict: ✅ PHASE-CLEAN** — companion `cframe/ccnt/coct/canim` AND raw LCG (`rng`/`rngcalls`) all **bit-exact** vs retail at every frame +2…+258. Pinned pixel-diff: Tear crop cap_00 14.59%/mean0.77 → **0.55%/mean0.00**; cap_05 (+258, furthest from pin) **0.05%**; **FULL frame 0.04%/mean0.00 = bit-1:1** (diff panel black, feed-verified). So the companion sprite anim, wing-glow, AND wing-sparkle particles are all 1:1 given phase+RNG pinning. Supersedes the earlier "spring-follow-position and/or wing-flap+particle phase divergence" — the spring-follow position is also 1:1 (the body silhouette already overlapped pre-RNG-pin). | resolved 2026-06-05; method = `phase_probe` (one-command phase+RNG verdict). NB §73 "wing-sparkle renderer unported / invisible today" is **stale** — the particles render and match. ([[project_next_char_controller]]) |
101101
| ~~**Recette RENDERED walk cell**~~**RESOLVED → 1:1, 2026-06-04** | was flagged as a "different walk cell" on ~18% of frames; root cause was a **capture-tooling off-by-one** (Frida watch read one sim-tick before the render, mislabeling screenshots), NOT an engine divergence. Fixed (715b74c) + user-confirmed 1:1. See the CONFIRMED-1:1 row above + `scene1-recette-walk-cell.md`. | resolved 2026-06-04 |

0 commit comments

Comments
 (0)