From c9ba4a1b066a9823a8d6e3f3bbc13d9d43e1974d Mon Sep 17 00:00:00 2001 From: amosblomqvist Date: Tue, 15 Sep 2026 17:10:49 +0300 Subject: [PATCH] =?UTF-8?q?Minimal-color=20round=202=20(owner):=20the=20ch?= =?UTF-8?q?ip=20is=20label-only=20=E2=80=94=20spinner=20out=20of=20the=20t?= =?UTF-8?q?op=20bar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The round-1 experiment put the braille spinner in the chip's old dot slot; rejected live: the pill's curve and the square braille cell fought for space (visually squeezed), and the chat surface already shows in-flight work (thinking shimmer, the dock) — the chip stating the phase is its whole job. PhaseChip back to a label-only pill (busy prop removed, single-child gap dropped); work-state lives in exactly one place: the sidebar row's spinner. Doc note + test pin the decision so it doesn't get re-tried blind. Gates: typecheck, lint, 469/469, build. --- components/chat.tsx | 2 +- components/phase-divider.tsx | 17 ++++++++++------- tests/render-phase-divider.test.tsx | 12 +++--------- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/components/chat.tsx b/components/chat.tsx index 38f36c8..5a5ea65 100644 --- a/components/chat.tsx +++ b/components/chat.tsx @@ -605,7 +605,7 @@ export function Chat({ Plan )} - +
diff --git a/components/phase-divider.tsx b/components/phase-divider.tsx index 56aac68..9d6f617 100644 --- a/components/phase-divider.tsx +++ b/components/phase-divider.tsx @@ -1,4 +1,3 @@ -import { BrailleSpinner } from "@/components/braille-spinner"; import type { Phase3 } from "@/src/core"; /** @@ -17,6 +16,12 @@ import type { Phase3 } from "@/src/core"; * never a banner. Probe never renders a divider: phases only advance, so * probe is the start of the transcript and "Planning"/"Teaching" are the two * visible seams. + * + * Owner, minimal-color round 2: the chip is LABEL-ONLY, deliberately — a + * working-state spinner was tried here and rejected: the pill's curve and + * the square braille cell fought for space, and the chat surface already + * shows in-flight work (thinking shimmer, the dock). The chip states the + * phase; work-state is the sidebar row's spinner. */ /** Header-chip labels: the phases as the learner thinks of them. */ @@ -26,18 +31,16 @@ const CHIP_LABEL: Record = { teach: "Teaching", }; -/** The header chip: the phase label, monochrome; while a turn is in - * flight the old dot slot shows the braille spinner (motion = the honest - * state signal — see BrailleSpinner). */ -export function PhaseChip({ phase, busy = false }: { phase: Phase3; busy?: boolean }) { +/** The header chip: the phase label, monochrome — label-only by design + * (see the component note: the pill's curve suits text, not glyphs). */ +export function PhaseChip({ phase }: { phase: Phase3 }) { return ( - {busy && } {CHIP_LABEL[phase]} ); diff --git a/tests/render-phase-divider.test.tsx b/tests/render-phase-divider.test.tsx index 72f2005..71b00f3 100644 --- a/tests/render-phase-divider.test.tsx +++ b/tests/render-phase-divider.test.tsx @@ -30,16 +30,10 @@ describe("PhaseChip (header)", () => { } }); - it("busy: the old dot slot becomes the braille spinner (motion = turn in flight)", () => { - const html = renderToStaticMarkup(); - assert.ok(html.includes('data-testid="braille-spinner"'), "spinner in the chip"); - assert.ok(html.includes("Teaching"), "label stays"); - assert.ok((html.match(/class="braille-frame"/g) ?? []).length === 10, "all ten frames"); - }); - - it("idle: no spinner — the chip is the label alone", () => { + it("NEVER shows a working spinner — the pill's curve suits text, not glyph cells (owner, round 2)", () => { const html = renderToStaticMarkup(); - assert.ok(!html.includes("braille-spinner")); + assert.ok(!html.includes("braille-spinner"), "the chip is label-only by design"); + assert.ok(!html.includes("braille-frame"), "no spinner frames leak in"); }); });