clay-borg/workplans/CB-WP-0017-legible-interaction.md
tegwick ca92db53bc Declare CB-WP-0017: legible interaction, tier M (structural S, chaos 4)
Provenance: the maintainer ran stage 1's check after CB-WP-0016, could
drag, and reported that the UI gives no way to tell what can be picked
up, what is being dragged, or where it may be dropped. Combined with the
prior finding that the page hides which moves are legal -- measured, 9
legal commands rendered as 5 cards each claiming all three target kinds,
with Investigate legal on problems 2 and 3 but not 1 -- highlighting drop
targets is not decoration, it is the first time the page tells the truth.

Structural tier S: presentation work inside an existing capability.
CHAOS ROLLED 4 -> OVERRIDE, drawn tier M. Second override in twelve
declarations and it rolls the opposite way from the first (CB-WP-0011 was
L rolled down to S), so the calibration window closes with one of each,
which is the minimum that makes its evaluation possible.

Declaration 12 of 12 -- the window closes here and T04 owes the verdict.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-02 22:32:50 +02:00

7.2 KiB

id kind title status
CB-WP-0017 product Legible interaction: what can be picked up, what is being dragged, where it can go todo

Purpose

structural tier  S   (presentation work inside an existing capability —
                      no new port, no canonical interface, no new
                      dependency, no change to the loop's own constraints)
chaos            d4 = 4  → OVERRIDE, tier drawn: M
declared tier    M (structural S, chaos 4 → M)

Declaration 12 of 12 — the chaos calibration window closes here, and owes its evaluation (T04).

This is the second override in twelve declarations, and it rolls the opposite way from the first: CB-WP-0011 was structural L rolled down to S, this is structural S rolled up to M. The window therefore has one of each to evaluate, which is the minimum that makes an evaluation possible at all.

Tier M means survey and decision merge into one document and the adversarial review is optional.

The report this pass exists for

The maintainer ran stage 1's human check again after CB-WP-0016 and could drag — but:

"it is not possible to get what moves are possible and how they affect the state of the game""Can i have better visualization of which Elements in the ui can be manipulated""If the element isnt shown as picked up, there is no way to understand that i am actually dragging it or where i am dragging it""visual clues about where something can be dropped when it is picked up"

Four requests, and one prior finding that makes them one pass: the page already hides which moves are legal.

Measured, seat P1 at round 1 step Select — 9 legal commands, rendered as 5 cards each claiming all three target kinds:

the card says actually legal
Investigate → "a seat, a problem, or the table" problem-2, problem-3
Solve → "a seat, a problem, or the table" problem-1
Attack → "a seat, a problem, or the table" seat-1, seat-2
Support → "a seat, a problem, or the table" seat-1, seat-2
Ground → "a seat, a problem, or the table" table

Investigate is legal on problems 2 and 3 but not 1; Solve on 1 but not 2 or 3. The card text is a constant"drag {a:?} onto a seat, a problem, or the table" — emitted whenever any legal command uses that action, then naming all three kinds regardless. legal carries the exact targets and the renderer discards them.

So highlighting drop targets is not decoration on top of a working table. It is the first time the page will tell the truth about what is legal.

Task: decide how far the JavaScript may grow

id: CB-WP-0017-T01
status: todo
priority: high

Write decisions/ADR-0010-*.md (tier M: survey and decision in one).

This is a real decision, not a formality. ADR-0007 Decision 5 says the page "reports raw pointer facts and nothing else, and Rust decides what command they mean", and doc.rs says of SCRIPT: "it does one thing". Everything asked for here needs the script to do more than one thing — track a drag in flight, move a ghost with the pointer, add and remove classes on other elements.

Decide, explicitly:

  • Does class-toggling violate control 5? The honest argument is that legality still comes from Rust as data and the script only renders it — but that argument must be made, because "the page renders what Rust said" is exactly what a page constructing commands would also claim.
  • What is the invariant that replaces "it does one thing"? If the script may grow, say what it may never do, in a form a test can check. The existing no-game-vocabulary test is the candidate and it is weak.
  • The cost. Marginal AM-4a is zero either way, so the budget does not decide this. Say what does.
id: CB-WP-0017-T02
status: todo
priority: high

Emit the legal targets derived from legal, per action, and render them so the table is legible without dragging anything.

The generic sentence goes. A card that says "onto a seat, a problem, or the table" when only problem-1 is legal is not a simplification, it is wrong.

Controls:

  • The emitted target set must equal the affordance targets of the legal list exactly — pure Rust, no browser, and it must go red when the sets diverge.
  • A drop that the page marked legal must resolve. If the page can advertise a target resolve then refuses, the two have drifted and the highlighting is worse than none.

Task: make picking up, dragging, and dropping visible

id: CB-WP-0017-T03
status: todo
priority: high

The four requests, in order of how badly they are needed:

  1. What can be manipulated at all — a resting affordance on every pickable element. The maintainer asked for a slight shadow; the point is that interactive and inert must not look identical.
  2. What is picked up — the grabbed element must visibly change while the pointer is down.
  3. Where it can go — every legal drop target for the thing currently held highlights, and nothing else does.
  4. Where it is going — the drag must be followable, not invisible.

Be honest about what is testable. Whether a shadow reads as "you can pick this up" is not something any test here can settle, and claiming otherwise would be this project's characteristic error in its newest costume. What is testable, and must be:

  • pointerdown marks the grabbed element and exactly the legal targets for it, and nothing else;
  • pointerup and cancellation clear every mark — a drag that ends leaves no residue, or the next drag highlights a stale set;
  • the highlighted set is the same set T02 emitted.

The JS DOM stub cannot express any of this today. It will have to model classList and element lookup, which is a real deepening of the harness — and CB-WP-0016 showed that a stub too thin to express a failure is how the failure survives.

Task: evidence, and close the chaos calibration window

id: CB-WP-0017-T04
status: todo
priority: high

evidence/CB-EV-0015-*.md, and then the evaluation the window has owed since 2026-07-31.

gates.toml states the retirement condition in its own words:

retire_if = "the window closes with no overridden tier producing a different outcome than the argued one — the evaluation this window exists to make possible"

So answer it, on the two overrides actually observed:

  • CB-WP-0011, structural L → S. What did the deleted survey cost or save? CB-EV-0009 §1 and CB-EV-0010 §5 already priced part of this (0.123 $/response at L against 0.099 at S on the same subject).
  • CB-WP-0017, structural S → M. What did the extra ADR buy that a tier-S provenance paragraph would not have? If the answer is nothing, say so — that is the finding the window was opened to produce, and a mechanism that survives its own evaluation by being graded generously is worse than one that is retired.

Then: keep, retire, or change the rate, with the argument.

Also due:

  • Whether stage 1 closes. It needs a human to drag again. Say so.
  • Quote CB-WP-0016's cost, and apply CB-EV-0013 §5's correction — quote a boundary that has actually settled, or say it has not.