docs: refresh handoff — promotion fix shipped, both fixes deployed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
claude (blind_chess)
2026-05-18 21:53:23 -04:00
parent c01244c850
commit d95ab2abf1
@@ -13,18 +13,22 @@
## Recent Commits (for context) ## Recent Commits (for context)
- `d10e581` fix(client): light outline on dark phantom glyphs for panel contrast — **NOT yet deployed** - `c01244c` fix: promotion dialog only fires for genuine pawn promotions — **deployed**
- `5d995eb` docs: update handoff
- `d10e581` fix(client): light outline on dark phantom glyphs for panel contrast — **deployed**
- `0773300` docs: table-fidelity batch deployed to both instances - `0773300` docs: table-fidelity batch deployed to both instances
- `0c0e739` docs: session handoff
- `2e80800` docs: record table-fidelity feature batch as code-complete - `2e80800` docs: record table-fidelity feature batch as code-complete
- `59717b3` docs: amend plan to reflect code-review fixes - Feature implementation range: `be8ecd9..2e80800` (20 commits); two follow-up fixes since (`d10e581`, `c01244c`), both deployed.
- Feature implementation range: `be8ecd9..2e80800` (20 commits).
## Current State Summary ## Current State Summary
The "table-fidelity feature batch" (three features Andrew Freiberg — Seth's dad, a physical-blind-chess player — requested by email) is **fully implemented, reviewed, committed to `main`, and deployed** (2026-05-18) to both live instances — `chess.sethpc.xyz` (CT 690) and `chess.local` (VDJ-RIG). All 12 plan tasks were executed via subagent-driven development with two-stage review per task plus a final whole-batch review. Build, typecheck, and the 87-test suite all pass. The "table-fidelity feature batch" (three features Andrew Freiberg — Seth's dad, a physical-blind-chess player — requested by email) is **fully implemented, reviewed, committed to `main`, and deployed** (2026-05-18) to both live instances — `chess.sethpc.xyz` (CT 690) and `chess.local` (VDJ-RIG). All 12 plan tasks were executed via subagent-driven development with two-stage review per task plus a final whole-batch review. Build, typecheck, and the 94-test suite all pass (32 shared + 62 server).
A **manual browser test pass is now underway** (Seth). It has surfaced one bug so far: opponent (black) phantom pieces had too little contrast on the dark `--panel` background. Fixed in `d10e581` — black piece glyphs in the palette, the Captures panel, and the drag-ghost now get a light text-shadow outline. **That fix is committed to `main` but NOT yet deployed** — the two live instances are at `0773300`, one commit behind `main`. A **manual browser test pass is underway** (Seth). It has surfaced two bugs so far — both fixed and deployed:
1. **Contrast** (`d10e581`): opponent (black) phantom pieces were near-invisible on the dark `--panel` background — black glyphs in the palette, Captures panel, and drag-ghost now get a light text-shadow outline.
2. **Spurious promotion dialog** (`c01244c`): the "Promote pawn" modal fired for any pawn "moved" toward the last rank because the commit paths checked the destination rank but not the pawn's *source* rank — easy to hit once the phantom layer filled ranks 7-8 with tappable phantoms. Fixed with a new shared `isPromotionMove(piece, from, to)` (pawn, from the rank adjacent to promotion, to the promotion rank, ≤1 file over), used by both client `onCommit` and server `isPromotionRequired`.
Both fixes are live — the two instances and `main` are all at `c01244c`.
## Architecture Overview ## Architecture Overview
@@ -73,16 +77,14 @@ All recorded in `DECISIONS.md` under "Table-fidelity features (2026-05-18)" and
## Immediate Next Steps ## Immediate Next Steps
1. **Decide and do the redeploy of `d10e581`** (the contrast fix). It is on `main` but not live. Seth was asked whether to deploy it now or batch it with further test-pass findings — undecided (he requested this handoff instead). Each redeploy drops in-memory games. Deploy steps: `CLAUDE.md` → Operations (both instances; for `chess.local` remember the explicit `systemctl restart` — see Potential Gotchas). 1. **Continue the manual browser/phone test pass.** Open https://chess.sethpc.xyz, create a **blind game vs computer**, and check: the moderator panel shows White/Black-labelled attempt lines; the Captures panel updates on a capture; the phantom layer renders 16 seeded pieces; dragging a phantom moves it / off-board removes it; the palette places phantoms; a *tap* still makes real moves; genuine pawn promotion (pawn e7→e8) still pops the dialog; phantoms persist across reload; vanilla mode shows no phantom UI; phantoms hide on game end. The phantom drag is the main mobile-risk surface — test on a phone.
2. **Continue the manual browser/phone test pass.** Open https://chess.sethpc.xyz, create a **blind game vs computer**, and check: the moderator panel shows White/Black-labelled attempt lines; the Captures panel updates on a capture; the phantom layer renders 16 seeded pieces; dragging a phantom moves it / off-board removes it; the palette places phantoms; a *tap* still makes real moves; phantoms persist across reload; vanilla mode shows no phantom UI; phantoms hide on game end. The phantom drag is the main mobile-risk surface — test on a phone. 2. **Check the board phantom glyph contrast.** `.phantom-b` (dark phantoms on the board) render at `opacity: 0.4` on the board squares; they have a dashed frame so the square reads, but the piece *type* may be hard to tell on dark squares. Flagged to Seth to eyeball during the test pass — if too faint, give `.phantom-b` a subtle light outline without killing the intentional translucency.
3. **Check the board phantom glyph contrast.** `.phantom-b` (dark phantoms on the board) render at `opacity: 0.4` on the board squares; they have a dashed frame so the square reads, but the piece *type* may be hard to tell on dark squares. Flagged to Seth to eyeball during the test pass — if too faint, give `.phantom-b` a subtle light outline without killing the intentional translucency. (Same root cause as the `d10e581` fix, left alone for now because board phantoms are deliberately ghostly.) 3. (Optional) Fix the `install-local.sh` redeploy gap, and reconcile the stale VDJ-RIG "no Caddy" note — see Potential Gotchas.
4. (Optional) Fix the `install-local.sh` redeploy gap — see Potential Gotchas.
## Blockers / Open Questions ## Blockers / Open Questions
- **Deploy timing for `d10e581` (contrast fix) — undecided.** Seth was asked "deploy now, or batch with other test-pass findings?" and requested a handoff instead. Resolve next session. The live site lacks the contrast fix until then. - **Board phantom glyph contrast — open question.** See Immediate Next Steps #2 — needs a human eye on a real board before deciding whether `.phantom-b` needs an outline.
- **Board phantom glyph contrast — open question.** See Immediate Next Steps #3 — needs a human eye on a real board before deciding whether `.phantom-b` needs an outline. - **Manual browser test pass is in progress, not complete.** Two bugs found and fixed+deployed so far (contrast, spurious promotion dialog); the rest of the checklist in Next Step #1 is unverified. The phantom drag-and-drop in particular (pointer events, tap-vs-drag, hit-testing) is verified only by code review, not by clicking.
- **Manual browser test pass is in progress, not complete.** Only the palette-contrast issue has been found and fixed so far; the rest of the checklist in Next Step #2 is unverified. The phantom drag-and-drop in particular (pointer events, tap-vs-drag, hit-testing) is verified only by code review, not by clicking.
## Deferred Items ## Deferred Items
@@ -93,21 +95,22 @@ All recorded in `DECISIONS.md` under "Table-fidelity features (2026-05-18)" and
## Important Context ## Important Context
- **Everything is on `main` and pushed.** Seth explicitly chose to work directly on `main` (no feature branch). There is nothing to merge. - **Everything is on `main` and pushed.** Seth explicitly chose to work directly on `main` (no feature branch). There is nothing to merge.
- **The feature batch is deployed and live** on both instances (`chess.sethpc.xyz` and `chess.local`) at commit `0773300`. The only un-deployed change is `d10e581` (the contrast fix). Deployment is outward-facing and drops in-memory games — confirm timing with Seth. - **The feature batch plus both follow-up fixes are deployed and live** on both instances (`chess.sethpc.xyz` and `chess.local`) at commit `c01244c``main` and the live site match. Deployment is outward-facing and drops in-memory games — confirm timing with Seth.
- **Two deploy instances now exist** (CLAUDE.md was updated mid-project): CT 690 / `chess.sethpc.xyz`, and `chess.local` on VDJ-RIG. Both need the update. - **Two deploy instances now exist** (CLAUDE.md was updated mid-project): CT 690 / `chess.sethpc.xyz`, and `chess.local` on VDJ-RIG. Both need the update.
- The final review confirmed the security invariant holds: no `phantom` token anywhere under `packages/server/src/`, `buildView`/`geometric.ts` byte-for-byte unchanged. - The final review confirmed the security invariant holds: no `phantom` token anywhere under `packages/server/src/`, `buildView`/`geometric.ts` byte-for-byte unchanged.
## Assumptions Made ## Assumptions Made
- The client a11y trade-off (phantom spans and palette pieces are pointer-only, with a documented `svelte-ignore a11y_no_static_element_interactions`) is acceptable — adding `tabindex` without a keyboard drag would be worse a11y. Real gameplay stays fully keyboard-operable via the square buttons. - The client a11y trade-off (phantom spans and palette pieces are pointer-only, with a documented `svelte-ignore a11y_no_static_element_interactions`) is acceptable — adding `tabindex` without a keyboard drag would be worse a11y. Real gameplay stays fully keyboard-operable via the square buttons.
- 87 is the expected test count (25 shared + 62 server); the client contributes 0 (no harness). - 94 is the expected test count (32 shared + 62 server); the client contributes 0 (no harness).
## Potential Gotchas ## Potential Gotchas
- `packages/server/tsconfig.tsbuildinfo` shows persistent `M` in `git status` — pre-existing drift (tracked before `*.tsbuildinfo` was gitignored), not this session's work. - `packages/server/tsconfig.tsbuildinfo` shows persistent `M` in `git status` — pre-existing drift (tracked before `*.tsbuildinfo` was gitignored), not this session's work.
- The pre-commit hook is `detect-secrets-hook --baseline .secrets.baseline`. - The pre-commit hook is `detect-secrets-hook --baseline .secrets.baseline`.
- Server restart on deploy drops all in-memory games. (CT 690 had 3 "active" games at deploy time — almost certainly stale abandoned games, since active games never auto-expire and uptime was 19 days; dropped per the pre-accepted MVP policy.) - Server restart on deploy drops all in-memory games. (CT 690 had 3 "active" games at deploy time — almost certainly stale abandoned games, since active games never auto-expire and uptime was 19 days; dropped per the pre-accepted MVP policy.)
- `deploy/install-local.sh` (the `chess.local` installer) ends with `systemctl enable --now blind-chess.service`, which does NOT restart an already-running service — a redeploy via the script alone leaves the old code running. This deploy worked around it with an explicit `sudo systemctl restart blind-chess` after the script. Proper fix: change the script's `enable --now` to `enable` then `restart`. - `deploy/install-local.sh` (the `chess.local` installer) ends with `systemctl enable --now blind-chess.service`, which does NOT restart an already-running service — a redeploy via the script alone leaves the old code running. Deploys work around it with an explicit `sudo systemctl restart blind-chess` after the script. Proper fix: change the script's `enable --now` to `enable` then `restart`.
- **VDJ-RIG port 80 has a Caddy** (host-routing): `curl http://chess.local/` serves the app correctly, but `curl http://localhost/` returns a Caddy `502`. CLAUDE.md's `chess.local` operations note says "no Caddy" — that note is stale or incomplete. Doesn't affect the instance; verify rig deploys via the `chess.local` hostname, not `localhost`.
## Environment State ## Environment State
@@ -120,7 +123,7 @@ All recorded in `DECISIONS.md` under "Table-fidelity features (2026-05-18)" and
- Spec: `docs/superpowers/specs/2026-05-18-table-fidelity-features-design.md` - Spec: `docs/superpowers/specs/2026-05-18-table-fidelity-features-design.md`
- Plan: `docs/superpowers/plans/2026-05-18-table-fidelity-features.md` - Plan: `docs/superpowers/plans/2026-05-18-table-fidelity-features.md`
- `DECISIONS.md` → "Table-fidelity features (2026-05-18)" - `DECISIONS.md` → "Table-fidelity features (2026-05-18)"
- Live URL: https://chess.sethpc.xyz (deployed at `0773300`) · Repo: https://git.sethpc.xyz/Seth/blind_chess (`main` at `d10e581`) - Live URL: https://chess.sethpc.xyz (deployed at `c01244c`) · Repo: https://git.sethpc.xyz/Seth/blind_chess (`main` at `c01244c`)
--- ---