186 lines
7 KiB
Markdown
186 lines
7 KiB
Markdown
|
|
---
|
||
|
|
id: CB-WP-0020
|
||
|
|
kind: product
|
||
|
|
title: "The table you can read: the card in your hand, the border that moves, the game that ends"
|
||
|
|
status: ready
|
||
|
|
---
|
||
|
|
|
||
|
|
# Purpose
|
||
|
|
|
||
|
|
```
|
||
|
|
structural tier S (presentation inside an existing capability — no new
|
||
|
|
port, no canonical interface, no new dependency)
|
||
|
|
chaos d8 = 8 → OVERRIDE, tier drawn: S
|
||
|
|
declared tier S (structural S, chaos 8 → S)
|
||
|
|
```
|
||
|
|
|
||
|
|
Declaration 3 of chaos window 2, and **the first override at d8** — it
|
||
|
|
fired on the second roll at the new rate. It changed nothing, which is
|
||
|
|
the first half of window 2's retirement condition (*retire if an override
|
||
|
|
changes nothing twice running*). **One.**
|
||
|
|
|
||
|
|
## What the perceptual check found
|
||
|
|
|
||
|
|
The maintainer ran it on 2026-08-03. **Item 1 passes** — the resting
|
||
|
|
affordance reads. Everything else has a defect, and several are defects in
|
||
|
|
things the tests call green, because no test here can see a layout.
|
||
|
|
|
||
|
|
Quoted, because the wording carries the diagnosis:
|
||
|
|
|
||
|
|
1. **Pickable is legible.** ✅ Nothing to do.
|
||
|
|
2. *"the card is picked up but the linebreak vanishes and the card below
|
||
|
|
does not vanish. So it is a little as if we have two cards now"*
|
||
|
|
3. *"the upper and left borders of the dashed lines seem to be hidden for
|
||
|
|
some items. Also for players the rectangle is quite large. Maybe we
|
||
|
|
should not have a new dashed line but just set the existing borderline
|
||
|
|
to dashed so that the layout is more stable and less complicated"*
|
||
|
|
4. *"replacing the content of the picked up card breaks the visual clue
|
||
|
|
about a card being moved"*
|
||
|
|
5. *"the orange status line does not change as you describe. It seems to
|
||
|
|
switch only if i put back a card"*
|
||
|
|
6. *"I cant follow the actions of the other players too well because they
|
||
|
|
do not visualize on the board other than by result and the log"*
|
||
|
|
7. *"maybe should read 'Game finished' if the players have been
|
||
|
|
successful… There is no button to start a new game"*
|
||
|
|
|
||
|
|
## Task: the border moves, nothing else does
|
||
|
|
|
||
|
|
```task
|
||
|
|
id: CB-WP-0020-T01
|
||
|
|
status: todo
|
||
|
|
priority: high
|
||
|
|
```
|
||
|
|
|
||
|
|
**Adopt the maintainer's design instruction**: a legal drop target changes
|
||
|
|
its **existing border** to dashed and coloured. No second box.
|
||
|
|
|
||
|
|
The current `outline: 2px dashed; outline-offset: 3px` draws a *new*
|
||
|
|
rectangle outside the element. That is why the top and left edges vanish
|
||
|
|
on some items — an `outline` on an SVG `<g>` is clipped by the SVG
|
||
|
|
viewport, and on a card it collides with the neighbour's margin. It is
|
||
|
|
also why a seat's highlight is *"quite large"*: it outlines a whole card
|
||
|
|
when only the border needed to change.
|
||
|
|
|
||
|
|
- HTML targets: restyle `border-style`/`border-color` in place.
|
||
|
|
- SVG targets: change the existing `stroke`, not an added outline.
|
||
|
|
|
||
|
|
**Control:** the marked set must still equal the set Rust emitted
|
||
|
|
(ADR-0010 D2 property 1) — the mutation that derives targets instead of
|
||
|
|
reading them must stay red. This is a style change and must not become a
|
||
|
|
behaviour change.
|
||
|
|
|
||
|
|
## Task: the thing in your hand looks like a thing in your hand
|
||
|
|
|
||
|
|
```task
|
||
|
|
id: CB-WP-0020-T02
|
||
|
|
status: todo
|
||
|
|
priority: high
|
||
|
|
```
|
||
|
|
|
||
|
|
Two reports, one cause. The ghost is a `textContent` copy of the card, so
|
||
|
|
(2) the `<br>` collapses and it reads as a *second card*, and (4) the
|
||
|
|
explanation **replaces** the label, so the only thing identifying what you
|
||
|
|
are carrying disappears exactly when you need it.
|
||
|
|
|
||
|
|
- The ghost must not impersonate a card. Make it read as a held token:
|
||
|
|
smaller, distinct, and it may keep the line break.
|
||
|
|
- The explanation is **additional**, never a replacement. Carrying
|
||
|
|
*"Attack"* and hovering P2 should show both — the label and *"commit
|
||
|
|
Attack against P2"*.
|
||
|
|
- The element left behind must look **left behind**, so there are not two
|
||
|
|
cards.
|
||
|
|
|
||
|
|
**Control:** the description shown must still be the one Rust wrote for
|
||
|
|
that pair (ADR-0010 D1) — the neighbouring-pair mutation stays red. And a
|
||
|
|
new one: the ghost must still name what is held when an explanation is
|
||
|
|
showing, so a mutation that drops the label goes red.
|
||
|
|
|
||
|
|
## Task: say why a drop was refused, in words
|
||
|
|
|
||
|
|
```task
|
||
|
|
id: CB-WP-0020-T03
|
||
|
|
status: todo
|
||
|
|
priority: high
|
||
|
|
```
|
||
|
|
|
||
|
|
Reported: the status line *"seems to switch only if i put back a card"*,
|
||
|
|
and then reads `action-attack -> action-attack is not a legal move here`.
|
||
|
|
|
||
|
|
Two defects.
|
||
|
|
|
||
|
|
**The refusal is written in element ids.** `resolve` returns
|
||
|
|
`"{down} -> {up} is not a legal move here"`, which is the vocabulary of
|
||
|
|
the DOM, not of the game. A player reads *"you cannot Attack yourself"*.
|
||
|
|
|
||
|
|
**And the no-target path apparently never fires.** CB-WP-0018 added
|
||
|
|
*"took … , let go over nothing droppable"* for a drop on nothing, and the
|
||
|
|
maintainer did not see it. Find out why before changing anything —
|
||
|
|
the likely answer is that there is almost no bare background to drop on,
|
||
|
|
every part of the page being a card, in which case the message is correct
|
||
|
|
and unreachable, and the fix is elsewhere. **Do not "fix" a message that
|
||
|
|
already works; reproduce the report first.**
|
||
|
|
|
||
|
|
## Task: show what the other players did
|
||
|
|
|
||
|
|
```task
|
||
|
|
id: CB-WP-0020-T04
|
||
|
|
status: todo
|
||
|
|
priority: medium
|
||
|
|
```
|
||
|
|
|
||
|
|
Reported: *"I cant follow the actions of the other players"*.
|
||
|
|
|
||
|
|
After Reveal, selections are public (GR-R04) and the seat card **does**
|
||
|
|
carry them — as `Selection { action: Solve, target: None, problem: Some(1) }`.
|
||
|
|
That is a `Debug` impl on a player-facing surface, which is the same
|
||
|
|
defect the log fixed in CB-WP-0018 and did not fix here.
|
||
|
|
|
||
|
|
Render a seat's revealed selection in the same words the log uses. Reuse,
|
||
|
|
do not re-phrase: a second vocabulary drifts from the first.
|
||
|
|
|
||
|
|
**Control:** a seat's rendered selection must match the log's phrasing for
|
||
|
|
the same command, asserted rather than eyeballed.
|
||
|
|
|
||
|
|
## Task: the game ends in a way you can act on
|
||
|
|
|
||
|
|
```task
|
||
|
|
id: CB-WP-0020-T05
|
||
|
|
status: todo
|
||
|
|
priority: medium
|
||
|
|
```
|
||
|
|
|
||
|
|
Three things, in the order they matter:
|
||
|
|
|
||
|
|
- **"game over" is the wrong headline when the group succeeded.** It
|
||
|
|
should say what happened — the outcome carries `group_success`, so use
|
||
|
|
it.
|
||
|
|
- **A new game.** Reported as *"would be nice"*, and it is more than that:
|
||
|
|
the only way to play twice today is to go back to a terminal, which
|
||
|
|
makes the browser a strictly worse client than the CLI it was meant to
|
||
|
|
replace.
|
||
|
|
- **The scores read 0 and the winner is nobody.** That is very likely the
|
||
|
|
stand-in dataset, not a scoring bug — GROUND-WP-0002 T01 has now ruled
|
||
|
|
the edition data authoritative. **Do not fix scoring here.** Confirm the
|
||
|
|
cause and record it; the import is its own pass.
|
||
|
|
|
||
|
|
## Task: evidence
|
||
|
|
|
||
|
|
```task
|
||
|
|
id: CB-WP-0020-T06
|
||
|
|
status: todo
|
||
|
|
priority: high
|
||
|
|
```
|
||
|
|
|
||
|
|
`evidence/CB-EV-0018-*.md`.
|
||
|
|
|
||
|
|
- **What the perceptual check bought this time**, and the running count:
|
||
|
|
four runs, four sets of defects no test could reach.
|
||
|
|
- **Which of these the test suite called green**, and whether any of them
|
||
|
|
*could* have been caught mechanically — for those that could, say why
|
||
|
|
they were not, and for those that could not, say so plainly rather than
|
||
|
|
proposing a check that would not work.
|
||
|
|
- **Chaos: the first override at d8**, and that it changed nothing. That
|
||
|
|
is one half of window 2's retirement condition; record it as such.
|
||
|
|
- **Quote CB-WP-0019's cost by re-running the instrument**, per the rule
|
||
|
|
it wrote.
|