|
|
@@ -14,9 +14,9 @@ The browser regression test reproduced the report on current master: at 800×720
|
|
|
|
|
|
The row wraps instead of shrinking its left group into the right group's area: `.row { flex-wrap: wrap }` plus `margin-left: auto` on `.trailing`, which re-anchors the trailing group (model + send) to the right edge of its wrapped line while `space-between` already pins it right on a single line. Wrapping is the acceptance's "wrap, fold, or re-arrange controls when space runs out" option, keeps every control at full width (no label folding that would hide the model name or the Plan wordmark), and holds at every viewport width by construction instead of at a calibrated container-query threshold.
|
|
|
|
|
|
-Add `apps/web/tests/plan-control-row.e2e.ts`: enter plan mode once through the real `/plan` command during record (the model replies OK and calls no tool, so the review takeover never replaces the control row), then replay the recorded turn keyless. Plan state folds from the session log (`plan/mode`, last one wins), so the chip renders at replay time without a model call. The file joins the `apps/web/tsconfig.json` exclude list like every web e2e that imports host-plane types, so the client graph never compiles it.
|
|
|
+Add `apps/web/tests/plan-control-row.e2e.ts`: enter plan mode once through the real `/plan` command during record (the model replies OK and calls no tool, so the review takeover never replaces the control row), then replay the recorded turn keyless. Plan state folds from the session log (`plan/mode`, last one wins), so the chip renders at replay time without a model call. The file joins the host-plane e2e pairing like every sibling: excluded from the client graph in `apps/web/tsconfig.json` (it imports host-plane types) AND included in the host aggregate in `tsconfig.host.json`, so exactly one TypeScript program owns it — the pairing that also gives the lint type service its program.
|
|
|
|
|
|
-The geometry golden records stable facts — viewport membership, the center hit-test verdict, the gap between the chip's right edge and the trigger's left edge, the overlap area, and the exit result — never absolute coordinates, whose pixel values depend on installed fonts. The behavior assertions implement the acceptance directly: the chip center hit-tests to the chip, the click areas are disjoint, and clicking the chip leaves plan mode through the real command channel (`/plan off` via `commands.execute`).
|
|
|
+The geometry golden records stable facts — viewport membership on both axes and disjoint click areas — never absolute coordinates, whose pixel values depend on installed fonts and differ between macOS and Linux. The behavior assertions implement the acceptance directly: the click areas are disjoint, the click at the chip's center (Playwright's actionability check) leaves plan mode through the real command channel (`/plan off` via `commands.execute`), and the last `plan/mode` event in the session log flips inactive.
|
|
|
|
|
|
## Alternatives considered
|
|
|
|
|
|
@@ -30,4 +30,4 @@ The geometry golden records stable facts — viewport membership, the center hit
|
|
|
|
|
|
## Consequences
|
|
|
|
|
|
-Any future change to the control row layout — fonts, gaps, media or container queries — that re-introduces overlap or moves the chip out of viewport fails this test. Recording needs a real API key locally; CI replays keyless. The fixture's recorded user prompt is the single source tying the drive step to the recorded reality (`fixtureUserPrompts`), so prompt and fixture cannot drift.
|
|
|
+Any future change to the control row layout — fonts, gaps, media or container queries — that re-introduces overlap or moves the chip out of the viewport on either axis fails this test. Recording needs a real API key locally; CI replays keyless. The fixture's recorded user prompt is the single source tying the drive step to the recorded reality (`fixtureUserPrompts`), so prompt and fixture cannot drift.
|