# PC&C mesh jacket: status (2026-10-25 20:50 PDT)

- Branch: `spike-mesh-jacket` @ `508b799`
- `main` (production): `4d32467`

## Recent commits on the spike
```
508b799 docs: adopt the mesh-to-main brief (R7-0)
2567974 docs: chatpack for the road to main after the mesh win
0ad4d95 docs: F8b passed on three bodies, the mesh wins over F2
1a8276d docs: handoff at the end of the round-6 cuff session
2d67fa4 spike(r6b): review-gate fixes for CUFF_CLEAN and the R6 diag tools
845f671 docs: O2 owner phone test passed on the cleaned Hi3D cuffs
333a267 spike(r6b-b): owner touch-up, wool on the cuff band becomes cuff rib (red patch), speck fill
84bd38c docs: R6b-B result and the owner's picks after R6b-M
91bcb04 spike(r6b-b): CUFF_CLEAN cleans the Hi3D cuff stripes along their own path (try 2)
9b880d3 spike(r6b-m): measure the Hi3D cuff (texel + screen), setDbg(6), waist guard, DECISIONS #62-#69
c3437af Merge branch 'spike-r6a-measure' into spike-r6b-measure
184971a docs: adopt mesh round 6b brief (fix the Hi3D cuff's own flaws)
```

## Next step

**R7-A in a fresh session** (`docs/BRIEF-mesh-jacket-to-main-2026-10-25.md` §2, plus the warning block's extra measures: the stale-world-matrix anchor check, a ΔE + seam/interior split script for B1, the #82 load-weight options including a vendored DRACOLoader, and a fallback-image capture for #88). 0 renders. Then **the owner audit at default zoom** on White, Scarlet black and Pirate purple, marking items 1/4/8/9 seen or not. Then Jarvis approves the #74 and #77 numbers before R7-B.

**Owner to-dos, outside the rounds (critical path):**
- the Hi3D zipper reference (#89; **Private licence**);
- the Hi3D licence record for the current model, and whether it survives cancelling the plan (#84.1);
- the kie.ai terms (#84.2);
- **Heather's written OK** (#84.3).


## F8b result, 2026-10-25
**Pass, no kill item hit.** Samsung folded (cover screen 1080×2520, Chrome), `spike-mesh-jacket` @ `1a8276d` (code `2d67fa4`), `?mesh=1`, 2K tier. Part 1 (2026-10-24, see HANDOFF): fps mean 83.4 / min 60.3, 0 frames over 100 ms; the 60 s fallback did not fire; preset switching without a reload or context loss.

Look check, owner at the phone: Navy & Ivory **pass**; White **pass** ("clean not blotchy", arms and cuffs pass); Scarlet black **pass** ("red is clean", "cuffs are ok", "same to similar fixes to the white body"). The owner's rule for the run: "the shots i had you take are what my eye caught anything that wasnt taken is a pass so far (may change with later fixes)". So every owner shot is a fix, not a kill.
- **#63 (cuffs):** pass on all three bodies. Cuff stripe tone (tan next to white on light stripe colours) and a notch are fixes.
- **D15 (mottling):** pass on white and red.
- **#57 (rib bleed):** the owner shot red on the black back-waistband rib (shots 19-21, also visible at default zoom in 21; white on navy in 13). Recorded as a fix. By #57 it cannot kill before B2 has run, and B1/B2 were skipped after O1, so it goes to the after-decision list; if the mesh wins, B1 (measure) then B2 (fix) are its route.

Fix list (21 shots with notes): `~/pcc-audit/rounds/f8b/look/fixlist.md`. Themes: ragged label edges wherever a light body meets the trim (yoke, raglan seams, hem line above the waistband, placket, pocket welts; M-10/D9); body colour inside the back waistband rib (D16); stripe colour on the sleeve under the collar, both sides; a black blotch low on the underarm seam; snaps (dark crescent on one side, lumpy domes, left/right mismatch on Navy); collar specks and white streaks (M-17) plus a small rectangle at the collar's back centre, to check against the removed logo; leather triangle facets (N-5) and a gold tint in the leather highlights.

**Outcome by the punch-list brief (F8b, "Otherwise the mesh wins"): the mesh wins over F2**, confirmed by Jarvis 2026-10-25 ("mesh win"). F2 stays paused at 1b-i. The fixes above go to the after-decision list; next by the round-6b brief §2 are step 6 (delete `spike-bands-r3-cuffs`, Jarvis confirms the remote delete) and step 7 (pinstripe #68, the pre-`main` cleanup with the tube removal #62 and the `/assets/jacket-mesh/` route, the snap fix #50).

Most shots were taken zoomed in by the owner. For shot 21, Claude reset the camera to the default zoom by sending a dblclick to `#c3d` over CDP (camera only, no state change).

## #70 — Release gate rule (to-main brief)
A defect blocks `main` if it is visible on the phone at default zoom (no pinch) on a tested body: Navy & Ivory, White, Scarlet black and **Pirate purple** (the white-stripe preset; its Black trim base also shows rib bleed). Zoom-only defects ship and go to the after-`main` list. Owner shots stay fixes, not kills.

## #71 — What blocks `main` (to-main brief)
F8b items 1 (ragged label edges), 2 (body colour in the back waistband rib), 3 (stripe patch on the sleeve under the collar), the collar tag, 5 (snaps, with #50) and 8 (light cuff stripes); the pre-`main` cleanup; #36 (already in the spike, #81); the asset route; option parity (#80, #89); zones and decals on the mesh; the rights gate (#84). Items 4 and 9 join only if the R7-A owner audit sees them at default zoom.

## #72 — After `main` (to-main brief)
Item 7 (leather facets N-5, gold tint), item 9 and item 4 unless #71 pulls them in, M-17 collar specks that survive R7-B, pinstripe #68, punch-list §5.

## #73 — Edge pass: one global bake pass over every body/trim boundary (to-main brief)
Per label: blur the weight and re-threshold it, then a morphological open/close. It covers the yoke, raglan seams, hem line, placket, pocket welts and collar base. The cuff region is frozen at 0 changed texels, by `band_part ∈ {2,3}` **and** coarse `lab==2`. The pass must update `slot_base` / the mask selector, because shipped masks come from the `final_base` snapshot (`build_mask.py:242`).

## #74 — Edge metrics (to-main brief)
Islands within 8 texels of a boundary: none over 4 texels (the #48 bar). Roughness `R = length / length after σ=4 smoothing`, per named boundary: `(R−1)` must drop ≥ 50% from the R7-A baseline. First guesses; Jarvis approves the numbers after R7-A.

## #75 — Waistband interior = B1 then B2 (to-main brief)
B1 in R7-A: red→white swap, a rib pixel is bleed at ΔE > 10, the bar is ≤ 0.5% per fixed view (#53). The existing probe counts a summed RGB difference > 24 and has no seam/interior split, so R7-A writes that script. B2 in R7-B: fill the band interior to rib, guided by `band_field.py`. #48 must still pass.

## #76 — Targeted relabels (to-main brief)
The stripe-label patch on each sleeve under the collar becomes leather. What remains of the baked neck label at the collar back centre is painted out, finishing #43/G (per Jarvis, it is PC&C's own brand, garbled by the AI). Both are recorded in the manifest.

## #77 — Light stripe colours use the rib mode (to-main brief; amends #65)
Stripe colours with a linear luminance above 0.5 render as catalog colour x shade; darker ones keep albedo x gain. Bright Gold sits on the line (≈ 0.50); R7-A lists the split and Jarvis confirms it.

## #78 — Shader sharpen in its own round (to-main brief)
A `smoothstep` on the label weights, with the edge width as a named constant. It runs after #73, so a bake failure and a shader failure can be told apart.

## #79 — Snaps: Blender repair first (to-main brief)
One Blender 4.5 job: the 108-face snap (#50), the dark crescent, lumpy domes, the left/right mismatch. Two tries. Plan B (procedural snaps at the Hi3D centroids, +1 draw call) needs Jarvis's yes.

## #80 — Option parity (to-main brief, amended at adopt)
Gold snaps already recolour on the mesh (`index.html:2570`), so this is verify only. The snap hexes are hardcoded, not taken from the catalog. Zipper front: see #89.

## #81 — #36 is already in the spike (to-main brief, amended at adopt)
The brief said to cherry-pick #36 onto the spike. It is already an ancestor (`44dd6a1`). R7-E keeps only the shoulder-blade yaw check on the mesh path.

## #82 — Assets that ship (to-main brief, amended at adopt)
`jacket_parts_smooth.glb` plus the 2K maps and masks ship. The 4K tier, `jacket_parts.glb`, `_plain.glb` and `_nocuff.glb` do not. Measured first load is ≈ 6.5 MB, over the 5 MB guess. R7-A reports the options (a vendored DRACOLoader brings it to ≈ 4.1 MB; or raise the budget); Jarvis picks. Egress is ~$0.05/GB, from memory; check the Railway bill.

## #83 — Fallback (to-main brief; superseded by #88)
The brief kept the procedural jacket as the fallback and named a "60 s fps fallback". There is no fps fallback (the 60 s one is a load timeout), and WebGL init failure and context loss have no handler. See #88.

## #84 — Rights gate, blocks `main` (to-main brief)
1. The Hi3D account record shows the licence (Private/commercial expected, since Jarvis was on a paid plan), and the rights survive cancelling the plan; if it says CC BY 4.0, show the credit line in Hi3D's wording.
2. The kie.ai terms allow commercial use of the reference image.
3. Heather OKs the mesh, in writing (blocked on Heather).
4. No baked lettering or marks remain in the albedo.

## #85 — Bookkeeping (to-main brief)
Pinstripe #68 after `main`, blocked on Heather. The `cuffL` slow-wave question is closed (the owner passed the cuffs on three bodies). `debug=1` ships (see #90). The two-scale shade stays parked, tied to the item 9 diagnosis.

## #86 — `spike-bands-r3-cuffs` (to-main brief, resolved at adopt)
There is no remote branch to delete. Its one unmerged commit (`714f4a2`) is kept by tag `archive/spike-bands-r3-cuffs`. The local branch stays unless Jarvis says to delete it.

## #87 — Rollback (to-main brief)
Before the merge, tag `main` as `pre-mesh-<date>`; rollback = revert the merge commit and redeploy. Also tagged at adopt: `spike-mesh-pre-r7` → `2567974` (the spike before any R7 round).

## #88 — No-3D fallback = picture + message + Retry; the F2 jacket never shows (owner, 2026-10-25)
The merge carries F2 Steps 0-1b-i to `main`, because the spike was cut from F2's tip. The owner does not want that half-built jacket shown. Every fallback trigger (60 s load timeout, GLB error, first-build error, and new handlers for WebGL init failure and context loss) shows:
- a still image of the mesh jacket (`assets/jacket-mesh/fallback.jpg`, rendered once, Navy & Ivory);
- "3D preview didn't load on this device; your picks still go in your quote";
- a Retry button.

The option controls and the quote form keep working. The mesh becomes the default (no `?mesh=1`). On `main` the F2 code survives only as anchor maths (`torso` / `bodyPoint` / `backPoint`). Amends #34 §3 and #36 rule 2, and replaces #83. Lands in R7-E/F.

## #89 — Zipper front shows on the mesh before `main` (owner, 2026-10-25)
Jarvis makes a Hi3D zipper reference. This is an exception to the brief's "no Hi3D regeneration", for a zipper-front variant only, generated under Hi3D's **Private** licence. It is its own track (reference → chatpack → brief: mesh, masks, bake, phone test), and R7-G waits on it. Until then the "Not shown in 3D preview" label stays.

## #90 — Probe shader modes stay, only behind `debug=1` (owner, 2026-10-25)
Amends the round-5 brief's Q6 ("probe modes removed"): the diag tools (`r6b_screen.py`, `r6b_texel.py`) need `setDbg(6)` for the after-`main` work. R7-E also gates `raw=1`, `look=`, `fps=1` and `cuff=tube` behind `debug=1`, or removes them with the tube. `bodyshade=` is still removed.

## #91 — CLAUDE.md review gates run at the `main` merge (owner, 2026-10-25)
Amends the brief's §3 ("agents only if Jarvis invokes them"). R7-A to R7-F use owner phone tests only. Before `main`:
- `/code-review` + cavecrew-reviewer on the merge diff;
- sec-auditor, scoped to the new `/assets/jacket-mesh/` route (file allowlist, traversal, content type, cache), `debug=1` / `window.__pcc`, and the formerly un-gated params;
- the mandatory browser check.

## R7-0 result, 2026-10-25
The to-main brief was adopted as `docs/BRIEF-mesh-jacket-to-main-2026-10-25.md`; its warning block wins over its body. The §0 fact-checks were run read-only (table in the brief). Rollback tag `spike-mesh-pre-r7` → `2567974`. #86 needed no action. The stale `look/README.md` copy step (it would have shipped the unpainted metal/rough map) was fixed. The `pcc-build-run-verify` skill now serves on 127.0.0.1 and reaches the phone through `adb reverse`; the dev server had been exposing `/.env` to the LAN and tailnet (fixed earlier the same day). Next: R7-A in a fresh session. Critical path to `main`: Heather's written OK (#84.3) and the zipper track (#89).
