Skip to content

PvZ roof-favor conversation positions

The 5-8 friendly Conehead offer reached the model twice with different row numbers. lawn.roofFavor already used the player's one-based row, but story.roofFavor still copied the zero-based native field. A native row of 2 therefore appeared as both row 3 and row 2 in the same conversation. The old regression asserted only the first copy and missed the contradiction.

Both projections now share roofFavorObservation. They describe the same one-based row, and an unchosen native row of -1 becomes unknown (null) in both. The request, native receipt, chosen branch, save and returned action identity retain the original row index. This changes model context only; it adds no reward, pause, character line or gameplay action.

The expanded regression fails on the preceding public host for both a chosen row and an unchosen row. Validated English, Chinese and Spanish fixtures cover all five roof lanes plus the inactive state. The existing choice check proves that accepting spoken row 3 still returns native row 2 without mutating the request. Focused roof and position checks pass after the correction.

Evidence is retained in output/roof-row-{valid-red,focused}.log. The first red fixture used an inconsistent inactive revision; it is retained separately in output/roof-row-red.log, and was corrected to pass request validation before the authoritative red run. No provider generation or production data write is needed to establish this projection mismatch.

All 524 game-NPC checks, the hosted build and typecheck pass. Four previously captured EN/ZH WASM requests also pass the current schema and both prompt projections: spoken row 2 still returns native row 1. This is request replay, not a new browser playthrough or live-model writing result. Its receipt is output/roof-row-recorded.json.

OSS verification and deployment receipts will be recorded after they finish.