CB-WP-0017: legible interaction, and the chaos window's verdict
Some checks failed
ci / check (push) Failing after 4s
Some checks failed
ci / check (push) Failing after 4s
Provenance (tier M, structural S, chaos d4=4 -> OVERRIDE drawn M): the maintainer could drag after CB-WP-0016 but could not tell what was pickable, held, or droppable. Underneath that, the page was WRONG about which moves exist: 9 legal commands rendered as 5 cards each claiming all three target kinds, from a const string in the emitter. Investigate is legal on problems 2 and 3 but not 1; Solve on 1 but not 2 or 3. The live page now says 'Solve onto problem 1'. ADR-0010 restates control 5, which this work would otherwise have outgrown in silence: every game fact the page acts on must arrive from Rust as data; the script may read, match and render it, never compute, infer, filter or default one. The survey's real finding is that the permitted and forbidden designs are indistinguishable from outside, so the vocabulary grep is demoted to a cheap first line and two behavioural properties become the controls -- the highlighted set EQUALS the set Rust emitted, and anything the page marks legal must resolve. Both mutation-proven; the derive-legality mutation produces a plausible highlight (seat-0,1,2 where only seat-1 is legal) and is caught. Visible now: .pick resting shadow, .held on the grabbed element, .dropok on every legal target including BOTH drawings of a seat, and a ghost following the pointer. Nothing perceptual is verified and ADR-0010 D5 says so. The DOM stub now models classList/querySelectorAll/createElement and builds its node set from the real emitted page. Trap recorded: QuickJS fixes its stack limit at Context creation relative to that frame, so a helper returning a Context makes every later eval report 'SyntaxError: stack overflow'. CHAOS WINDOW CLOSED, 12 declarations, 2 overrides, one each way. Both changed the outcome, so the retirement condition is not met. Verdict: keep, and recommend d4 -> d8 with a second window of 12 -- that is a change to the loop's own constraints and is owed to the next declaration as tier-M work, not made here. CB-EV-0014 corrected: it quoted CB-WP-0015 at $15.14/136 and called it the first settled figure quoted. Now $22.70/166. The number had been read during CB-WP-0015 itself, so there are two defects -- the boundary, and quoting from memory instead of re-running the instrument. make all exits 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
ca92db53bc
commit
a55e878bf0
9 changed files with 911 additions and 77 deletions
|
|
@ -2,7 +2,7 @@
|
|||
id: CB-WP-0017
|
||||
kind: product
|
||||
title: "Legible interaction: what can be picked up, what is being dragged, where it can go"
|
||||
status: todo
|
||||
status: done
|
||||
---
|
||||
|
||||
# Purpose
|
||||
|
|
@ -66,7 +66,7 @@ It is the first time the page will tell the truth about what is legal.
|
|||
|
||||
```task
|
||||
id: CB-WP-0017-T01
|
||||
status: todo
|
||||
status: done
|
||||
priority: high
|
||||
```
|
||||
|
||||
|
|
@ -91,11 +91,23 @@ Decide, explicitly:
|
|||
- **The cost.** Marginal AM-4a is zero either way, so the budget does not
|
||||
decide this. Say what does.
|
||||
|
||||
**Done 2026-08-02.**
|
||||
[ADR-0010](../decisions/ADR-0010-what-the-script-may-do.md) — *the script
|
||||
may render state it was given; it may not derive any.*
|
||||
|
||||
The survey's real output: the permitted design (Rust emits legality, the
|
||||
script matches it) and the forbidden one (the script derives legality from
|
||||
the DOM) are **indistinguishable from the outside** — both are "the page
|
||||
highlights some elements". So the vocabulary grep is demoted to a cheap
|
||||
first line and the load-bearing controls are stated over behaviour: the
|
||||
highlighted set must **equal** the set Rust emitted, and anything the page
|
||||
marks legal must **resolve**. Both are mutation-proven below.
|
||||
|
||||
## Task: tell the truth about which moves are legal
|
||||
|
||||
```task
|
||||
id: CB-WP-0017-T02
|
||||
status: todo
|
||||
status: done
|
||||
priority: high
|
||||
```
|
||||
|
||||
|
|
@ -114,11 +126,20 @@ wrong.
|
|||
advertise a target `resolve` then refuses, the two have drifted and the
|
||||
highlighting is worse than none.
|
||||
|
||||
**Done 2026-08-02.** From the live server: *"Solve onto problem 1"*,
|
||||
*"Investigate onto problem 2, problem 3"*, *"Attack onto P2, P3"*,
|
||||
*"Ground onto the table"*. The constant sentence is gone.
|
||||
|
||||
`everything_the_page_advertises_actually_resolves` drives four real bot
|
||||
games and checks every emitted target against `resolve` itself. Mutation —
|
||||
adding `table` to Investigate's targets — goes red with *"the page
|
||||
advertises action-investigate -> table but resolve refuses it"*.
|
||||
|
||||
## Task: make picking up, dragging, and dropping visible
|
||||
|
||||
```task
|
||||
id: CB-WP-0017-T03
|
||||
status: todo
|
||||
status: done
|
||||
priority: high
|
||||
```
|
||||
|
||||
|
|
@ -149,11 +170,39 @@ The JS DOM stub cannot express any of this today. It will have to model
|
|||
and CB-WP-0016 showed that a stub too thin to express a failure is how the
|
||||
failure survives.
|
||||
|
||||
**Done 2026-08-02.** `.pick` (resting shadow, lift on hover), `.held`
|
||||
(dimmed and scaled), `.dropok` (dashed outline on every legal target), and
|
||||
a ghost following the pointer.
|
||||
|
||||
The stub now models `classList`, `querySelectorAll`, `createElement` and a
|
||||
body, **and its node set is built from the real emitted page** via
|
||||
`droppables(html)` rather than from a list the harness invented.
|
||||
|
||||
Three mutations, each red:
|
||||
|
||||
| mutation | result |
|
||||
|---|---|
|
||||
| the script *derives* targets from the DOM instead of reading `data-targets` | red — marks `seat-0, seat-1, seat-2` where only `seat-1` is legal. **A plausible-looking highlight, caught.** This is ADR-0010 D1 enforced |
|
||||
| the page advertises a target `resolve` refuses | red |
|
||||
| `pointercancel` and the `clear()` on pointerup are dropped | red — *"marks survived `__up('seat-1')`"* |
|
||||
|
||||
**A seat highlights on both of its drawings** — card and graph node — and
|
||||
that is asserted rather than tolerated. The first draft of the assertion
|
||||
was wrong about it: it expected `seat-1` and read `seat-1,seat-1`.
|
||||
|
||||
**A real trap, recorded:** QuickJS fixes its stack limit at `Context`
|
||||
creation relative to the frame it was created in, so a helper that creates
|
||||
a context and *returns* it makes every later `eval` report `SyntaxError:
|
||||
stack overflow` — for `__all.length`. The caller must own the `Context`.
|
||||
|
||||
**Nothing perceptual is verified.** Whether a shadow reads as "pick me up"
|
||||
is not reachable from here (ADR-0010 D5).
|
||||
|
||||
## Task: evidence, and close the chaos calibration window
|
||||
|
||||
```task
|
||||
id: CB-WP-0017-T04
|
||||
status: todo
|
||||
status: done
|
||||
priority: high
|
||||
```
|
||||
|
||||
|
|
@ -184,3 +233,25 @@ 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.
|
||||
|
||||
**Done 2026-08-02.**
|
||||
[CB-EV-0015](../evidence/CB-EV-0015-legible-interaction.md). `make all`
|
||||
exits 0.
|
||||
|
||||
- **The chaos window's verdict: keep, at a lower rate.** Both overrides
|
||||
changed the outcome, so the retirement condition is not met. CB-WP-0011
|
||||
(L→S) bought a defect in the existing renderer that a toolkit survey
|
||||
would have walked past, at 0.099 $/response against 0.123. CB-WP-0017
|
||||
(S→M) bought the restatement of control 5 — at tier S the script would
|
||||
have outgrown ADR-0007 D5 under a one-paragraph commit note.
|
||||
**Recommendation: d4 → d8, second window of 12, retire if an override
|
||||
changes nothing twice running.** That is a change to how the loop
|
||||
constrains its own operation, so it is tier-M work this pass does not
|
||||
do — it is owed to the next declaration.
|
||||
- **CB-EV-0014 is corrected.** It quoted CB-WP-0015 at $15.14/136 and
|
||||
claimed that was the first settled figure this project had quoted. Both
|
||||
wrong: it now reads **$22.70/166**. The number had been read during
|
||||
CB-WP-0015 itself and carried forward, so there are two defects — the
|
||||
boundary, and quoting a figure from memory rather than re-running the
|
||||
instrument. Five for five, always low.
|
||||
- **Stage 1 stays open**, and now on a purely perceptual question.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue