PROCITY/docs/LANES/ROUND10_INSTRUCTIONS.md
m3ultra 8bd4676593 Fable (integrator): round-10 instructions — interior giant-rig blocker, v2.0 tag pulled
Round-9 review: engineering landed but the headline feature is visibly broken — interior
rigs (keepers + browsers) render ~2x room scale, heads through the ceiling. Verified live:
head bone at world Y=3.83m in a 3.4m room vs requested 1.58-1.92m. Root cause narrowed to
bind-pose head measurement in rigs.js buildFigure (raw headY 82 at bind vs 180 animated,
~2.2x underestimate -> giant after normalize). Visible in D's own r9 acceptance shot and
F's tour 'browsers.png'; neither lane flagged it. Local v2.0 tag deleted (never pushed;
origin still ends at v2.0-rc). R10: D fixes pose-aware + adds a head-height QA gate, F
re-shoots browsers + night_crowd and re-tags v2.0 on the fixed commit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 12:12:55 +10:00

79 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PROCITY — Round 10 lane instructions (from Fable, integrator)
Date: 2026-07-15 · Written after round-9 review. **v2.0 does NOT ship yet** — round 9 landed a
blocking visual regression that both D and F missed in their own evidence. Round 10 is short and
surgical: fix it, prove it can't come back, re-shoot, then tag.
## Review verdict on round 9
The engineering was real — occupancy truth, browse points, buy-anywhere, the tram, the audit all
landed and the harness is green. But the round's headline feature shipped visibly broken:
**BLOCKER — interior figures are giants.** John spotted it in the preview shots ("people way too
big for the rooms, clipping thru roof") and he is right. Verified live in-browser today
(seed 20261990, "Second Time Redfern", room H = 3.4 m):
- keeper head bone at **world Y = 3.83 m** — a ~3.8 m person; `keepers.js` requested 1.581.92 m
- `buildFigure` (rigs.js) normalizes off the head bone measured in **bind pose**: raw headY ≈ 82
`inner.scale = 0.0213`. But once the idle clip poses the skeleton, the head sits at raw ≈ 180.
The bind-pose measurement underestimates the animated rig by ~2.2× → every interior rig is ~2×
room scale. The clip filter is NOT the cause (verified: idleClip has zero `.position` tracks).
- Street peds are unaffected (the sim's actor path scales differently) — which is exactly why the
street shots look fine and the interior ones don't.
- Evidence that this was missable but shouldn't have been missed: it is plainly visible in
**D's own acceptance shot** (`docs/shots/laneD/r9_browsers_in_shop.jpg` — heads through the
ceiling, a heel the size of the till) and in F's tour (`docs/shots/v2_tour/browsers.png`), which
F captioned "framing's a bit close". Compare `docs/shots/v1_tour/record_interior.png` — the v1
keeper was correct. The regression window is the R9 interior-presence work.
Consequences: local `v2.0` tag **deleted** (it pointed at the broken state; it was never pushed —
origin still ends at v2.0-rc). main IS pushed, so lanes work from a synced tree. F re-tags after
the fix lands.
## Process lesson (all lanes, please actually read)
A screenshot you attach is evidence you have LOOKED at. "Documents the feature" is not a review.
From this round on: any acceptance shot containing a humanoid gets one explicit sanity line in the
progress note — "figures human-sized relative to doors/fittings: yes". Ten seconds. The v1-vs-R9
comparison above is what it catches.
## Lane D — the fix (lead, blocking)
1. Fix interior rig scale in `rigs.js` `buildFigure` (or the `keepers.js` call into it): normalize
**pose-aware** — bind the idle clip, `mixer.update(0)` (or one small dt), THEN measure the head
bone and set the scale so runtime head-Y == requested height. Alternatively reuse the exact
normalization the street actor path uses (street peds are correct; keepers should ride the same
math). Keep feet-planting correct after the change (`minY` re-measure must use the same pose).
2. Re-verify determinism (same seed → same keeper/browser identity + height) and the leak/GPU-delta
soak you already have.
3. **Regression guard (required):** extend the interior smoke to enter a shop with occupancy and
assert for EVERY spawned interior fig: head-bone world-Y within [1.4, 2.0] AND < room `dims.H`.
Wire it into `tools/qa.sh` strict so a giant can never pass a gate again.
4. Re-shoot `laneD/r9_browsers_in_shop.jpg` `laneD/r10_browsers_fixed.jpg`, and write the
sanity line.
## Lane F — verify, re-shoot, ship (after D lands)
1. Pull D's fix, re-run the interior-presence smoke + the new scale gate; `qa.sh --strict` green.
2. **Re-shoot the tour shots containing interior figures**: `browsers.png` at minimum. Also re-shoot
`night_crowd.png` the current one is near-black with no visible crowd and HUD fps 21; the
money shot needs the video-shop neon crowd actually readable (push time to the open-late shop,
frame the queue, check fps 30 or note why).
3. Re-run the full-default soak once (the fix touches per-frame keeper code; confirm no perf drift).
4. Docs freeze addendum: one paragraph in the release notes on the R10 fix.
5. **Tag `v2.0` on the fixed commit** (fresh annotated tag), push main + tags. This closes v2.0.
6. Update the tour README so shot filenames stay stable for the v3 site.
## Lanes A / B / C / E — on call only
Nothing blocking from you this round. C: if D's pose-aware measure needs a browse-point clearance
guarantee (point too close to a shelf for a 1.9 m fig), answer quickly; otherwise all four lanes
stand by for v3 planning. B's tram and E's audit are accepted as shipped.
## Standing items
- **Audio: fourth round parked.** John one line unblocks it: "generate freely" / "use library X"
/ "skip for v2". Until then it stays out of scope.
- After `v2.0` tags: v3 epoch pick (editor/overrides · venue district + gigs · multiplayer
presence) John and Fable choose together.