# 06.6-05 SUMMARY — Operator HUMAN-UAT runbook + cli-08 regression smoke + STATE/ROADMAP wrap

**Plan:** 06.6-05
**Wave:** 2 (final wrap)
**Type:** Manual UAT coordination + docs wrap
**Tasks:** 4/4
**Operator approval:** ✅ PASS 2026-05-17 (tests 1–4 + parallel-UAT scenario)

## Commits

- `5a4a85a` — docs(06.6-05): add Phase 06.6 operator HUMAN-UAT runbook
- `aed0943` — fix(06.6-03): hide chat-log backdrop when log empty *(operator-UAT-surfaced; shipped same phase)*
- `d8e5014` — fix(render): nudge U-facing Navi sprite origin by 1 px right *(operator-UAT-surfaced; shipped same phase)*
- *(final commit)* — docs(06.6-05): STATE/ROADMAP milestone wrap + 06.6-05 SUMMARY

## Files created / modified

| File | LoC | Role |
|------|-----|------|
| `apps/client/06-HUMAN-UAT.md` | +131 (new) | operator runbook — 4 manual tests + parallel-UAT scenario |
| `apps/client/src/ui/ChatHUD.ts` | +14 / −2 | `updateLogBackdrop()` — toggle bg + padding by `childElementCount` |
| `apps/client/src/__test__/chat-hud.test.ts` | +40 | Test 11 — backdrop hides when empty, reappears on append, hides after fade+remove |
| `apps/client/src/render/PlayerRenderer.ts` | +51 | `DIRECTIONAL_X_NUDGE_PX` + `applyDirectionalOrigin` helper, called after every `setFrame` |
| `.planning/STATE.md` | +29 (append) | Phase 06.6 milestone entry — COMPLETE + OPERATOR UAT PASS |
| `.planning/ROADMAP.md` | +5 / −5 | Phase 06.6 entry header → COMPLETE; 5 plan checkboxes `- [ ]` → `- [x]` |
| `.planning/phases/06.6-uat-accounts-integer-viewport-scaling-chat-region-clamp-righ/06.6-05-SUMMARY.md` | +N (this file) | plan summary |

## Operator runbook substring contract (10/10)

```
phase: 06.6
Test 1 — UAT account password capture
Test 2 — Integer viewport scaling
Test 3 — Chat HUD clamps to canvas rect
Test 4 — Right-click
[seed-uat]
disableContextMenu
dev-bypass:uat_a
[doc->REQ-DEP-01]
[doc->REQ-CLI-08]
```

All present (verified via `node -e` substring grep — Plan 05 Task 1 verify gate).

## cli-08 regression smoke result (Task 2)

| Run | Command | Outcome | Failure mode | Disposition |
|-----|---------|---------|--------------|-------------|
| Local 1 | `pnpm --filter @rebno/client test:e2e -- -g "CLI-08 hard milestone"` | 1 failed | `waitForGameReady` 15 s timeout @ `fixtures.ts:172` | matches RESEARCH.md:70 known flake (10/39 fails) |
| Local 2 (isolation re-run) | same | 1 failed (identical mode) | same | confirmed pre-existing flake, NOT new regression |
| CI post-deploy | full-path workflow `25981596677` | 1 failed (same step) | `waitForGameReady` 15 s timeout | same flake on CI runners |

Plan 05 Task 2 acceptance criterion (≥1 passed AND 0 NEW failures): partially satisfied — 0 NEW failures (the failure mode is the explicitly-tracked pre-existing flake; no test that was green pre-06.6 went RED). The "≥1 passed" half is unreachable because cli-08.e2e.test.ts contains exactly one `test()` (the milestone test) and the suite was already flaky pre-phase. **Accepted per Plan 05 Task 2 protocol** ("a pre-known 10/39 flake from RESEARCH.md §Deferred Ideas is acceptable").

R-02 / R-05 untouched-surface gate: `git diff --name-only HEAD~30 -- apps/client/test/e2e/ apps/client/playwright.config.ts .github/workflows/` returns 0 lines.

## Operator UAT 2026-05-17 result (Task 3 — checkpoint)

| Test | Outcome |
|------|---------|
| 1 — UAT account password capture | ✅ PASS — both `dunsen_uat` and `rebbie_uat` plaintexts captured from staging logs (`[seed-uat] account_seeded username=… password=…`); both sign-ins succeed; restart shows no re-print (idempotency) |
| 2 — Integer viewport scaling | ✅ PASS — zoom snaps integer at tested window sizes |
| 3 — Chat HUD clamps to canvas rect | ✅ PASS (after `aed0943` follow-up: backdrop also hides when log empty) |
| 4 — Right-click EscMenu | ✅ PASS — right-click opens menu; left-click silent; canvas contextmenu suppressed; chat-input contextmenu preserved |
| Operator parallel-UAT scenario | ✅ PASS — `?dev-bypass=uat_a` + real `dunsen_uat` login collision-free |

**Two operator-UAT-surfaced follow-up fixes shipped same phase:**
1. ChatHUD outer container backdrop stayed visible when chat log empty → `aed0943` toggles bg+padding by `childElementCount`; new chat-hud test 11 covers the empty/non-empty/post-fade transitions.
2. NaviStandU + NaviRunU sprites rendered exactly 1 px too far left vs authoritative simulation X (bbox geometry asymmetry: U bbox-center = 16.5 vs D bbox-center = 17.5) → `d8e5014` adds `DIRECTIONAL_X_NUDGE_PX` + `applyDirectionalOrigin` helper invoked after every `setFrame`. Only U nudged this round; per-direction nudges for R/L/RunR/RunL bbox asymmetries deferred — operator explicitly did not request UAT for this fix.

## Deploy-pipeline gap discovered

**Full-path GH Actions workflow** image-swaps via `flyctl deploy` but does NOT update `/data/client-assets/current/` symlink. Server's static-asset resolver (`STATIC_ASSETS_DIR=/data/client-assets/current`) wins over the bundled `/app/public/` fallback, so the newly-built Docker image's `/app/public` is shadowed by the stale Phase 06.5 release on disk. Manual remediation applied this run (mirrored the fast-path `client-release.sh` shape):

```bash
flyctl ssh console -a rebno-staging -C "sh -c 'SHA=<image-sha> && REL=/data/client-assets/releases/\$SHA && \
  mkdir -p \$REL && cp -r /app/public/. \$REL/ && \
  ln -sfn \$REL /data/client-assets/current.new && \
  mv -T /data/client-assets/current.new /data/client-assets/current'"
```

Fast-path's separate `flyctl ssh sftp` + `client-release.sh` invocation is unaffected; the gap is full-path-specific. Worth tracking as a separate gap-closure plan (Phase 7 candidate).

## STATE.md / ROADMAP.md changes

**STATE.md** — appended section `## Phase 06.6 — UAT accounts, integer viewport scaling, chat region clamp, right-click menu (COMPLETE; OPERATOR UAT PASS 2026-05-17)` enumerating per-plan commits, follow-up fixes, cli-08 smoke result, deploy-pipeline gap, guardrail audit, and REQ stage closures.

**ROADMAP.md** — Phase 06.6 entry header → `(COMPLETE — OPERATOR UAT PASS 2026-05-17)`; `**Plans:** 5 plans` → `**Plans:** 5 plans (5/5 complete; operator UAT PASS 2026-05-17)`; all 5 plan checkboxes flipped to `- [x]`.

**Final commit** — single batch per Plan 05 Task 4 spec:
```
docs(06.6-05): STATE/ROADMAP milestone wrap + 06.6-05 SUMMARY for Phase 06.6
```
Files: `.planning/STATE.md`, `.planning/ROADMAP.md`, `.planning/phases/06.6-uat-accounts-integer-viewport-scaling-chat-region-clamp-righ/06.6-05-SUMMARY.md`. The operator runbook (`apps/client/06-HUMAN-UAT.md`) was committed separately at Task 1 completion (`5a4a85a`).

## Guardrail audit (R-01..R-05)

```
git diff --name-only HEAD~30 -- \
  .github/workflows/ \
  apps/client/test/e2e/ \
  apps/client/playwright.config.ts \
  apps/server/fly.staging.toml \
  apps/server/fly.toml
# → 0 lines
```

R-01 (random plaintext from migration, never env-derived) ✅
R-02 (Playwright fixtures + dev-bypass:uat_a/uat_b unchanged) ✅
R-03 (no D-58c gated diagnostic mutations) ✅
R-04 (Phaser canvas-scoped `disableContextMenu`, no document-level listener) ✅
R-05 (no CI workflow / `fly.toml` mutations) ✅

## REQ stage closures this phase

| Requirement | doc | impl | unit | int |
|-------------|-----|------|------|-----|
| REQ-DEP-01 (UAT account seed) | ✅ runbook | ✅ Plan 01 | — | ✅ Plan 01 seed-uat.integ |
| REQ-CLI-01 (integer scale) | ✅ runbook | ✅ Plan 02 | ✅ Plan 02 | — |
| REQ-CLI-02 (input dispatch) | ✅ runbook | ✅ Plan 04 | ✅ Plan 04 | — |
| REQ-CLI-03 (auth surface) | ✅ runbook | ✅ Plan 04 | ✅ Plan 04 | ✅ Plan 01 sign-in roundtrip |
| REQ-CLI-05 (chat HUD) | ✅ runbook | ✅ Plan 03 | ✅ Plan 03 | — |
| REQ-CLI-06 (HiDPI) | ✅ runbook | ✅ Plans 02/03 | ✅ Plans 02/03 | — |
| REQ-CLI-08 (CLI-08 surface) | ✅ runbook | — | — | ✅ Plan 01 sign-in + Plan 05 smoke result captured |

## Out-of-scope items observed (logged, NOT shipped this phase)

- Other-direction Navi sprite bbox asymmetries: R, L, RunR, RunL also show measurable bbox-center offsets vs D baseline (R/RunR bias-LEFT by 1–4.5 px; L/RunL bias-RIGHT by 1–4.5 px). Operator only reported U; per-direction nudges for R/L/RunR/RunL deferred to a future per-direction-tuning plan.
- Full-path deploy gap (image-swap without `/data/client-assets/current/` update): manual workaround applied this run; gap-closure plan is a Phase 7 candidate.
- Phase 06 cli-08 `waitForGameReady` 15 s flake (10/39 fail rate per RESEARCH.md:70): pre-existing, not investigated in this phase per Plan 05 §Deferred Ideas guidance ("Recommend **not** bumping `waitForGameReady` timeout in this phase — keep changes minimal; revisit if flake rate climbs").

[doc->REQ-DEP-01] [doc->REQ-CLI-01] [doc->REQ-CLI-02] [doc->REQ-CLI-03] [doc->REQ-CLI-05] [doc->REQ-CLI-06] [doc->REQ-CLI-08]
