clay-borg/workplans/CB-WP-0043-a-problem-sits-where-its-stress-lands.md
tegwick 471de44632
Some checks failed
ci / check (push) Failing after 3s
Sync hub id for CB-WP-0043
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 17:30:59 +02:00

80 lines
3 KiB
Markdown

---
id: CB-WP-0043
kind: product
title: "A Problem sits where its Stress lands"
status: done
state_hub_workstream_id: "9b80b371-d947-41e4-a027-4c3ee9dbc542"
---
# Purpose
```
structural tier M (adds a field to the projection, which is a
canonical interface)
declared tier M
```
**No chaos roll** — retired by
[ADR-0021](../decisions/ADR-0021-the-chaos-roll-is-retired.md).
## The report
> *"We need to place the problems next to the player that is affected.
> Only global problems affecting all should go to the middle of the table.
> Problems attached to people that also affect their bonds should be
> placed close to the bond lines of the player."*
**The picture had become a lie.** A row of Problems across the middle says
*these are the table's*, which is true under the baseline and false under
H2, where three of five cards fall on particular seats.
## Task: place them where the Stress lands
```task
id: CB-WP-0043-T01
status: done
priority: high
state_hub_task_id: "9e7a24de-b392-402a-aa08-8b20906c1f0f"
```
| scope | where |
|---|---|
| `global` | the middle — it really is everyone's |
| `personal` | beside its owner, 52% of the way from the seat to the table centre |
| `bond` | the mean midpoint of the owner's Bond edges — *on the lines* |
**Controls:**
- **the baseline page is unchanged.** A variant that redraws the baseline
invalidates every prior look at it — the scoped layout is taken only
when a non-global scope exists;
- **a bond Problem with no Bonds is drawn as personal**, because that is
the *rule* (`bond_network` falls back to the owner at degree 0) and the
picture must agree with the arithmetic;
- the placement is asserted, not the fact that something was drawn.
**Done 2026-08-08.**
**The scope reaches the view as a separate marker**, not as a field on
`ProblemView`: the delta says *"place owner marker on the card"* — a token
beside a card — and it is **public while the card is face down**, which a
variant of `ProblemView` could not express.
**The coverage probe forced a real improvement.** It demanded a text token
for the new fields, and a *position* is not a token. That is the probe
being right: **position alone is invisible to `text_of` and to a screen
reader, and illegible when two anchors coincide.** So each scoped Problem
now *says* whose it is — "everyone's", "P1's alone", "P2's Bond network",
and "P1's alone — no Bond to share it" at degree 0.
**The fixture gained a third Problem.** With two, one of the three
placement rules was unexercised and the probe unsatisfiable — a fixture
that cannot reach a branch is how a rule ships untested.
## Not done
- **Nothing tells a player what the scope *means*** — that an unclaimed
personal card ticks only its owner. The position and the label say
*whose*, not *what happens*. That is a rules-legibility question and
the edition's `Rules_Text.csv` for H2 is vendored and unread.
- **No felt-play.** Whether the placement reads as intended at a table is
exactly the class ADR-0010 D5 says only a human answers.