ui: conclude card — quiz-chip outcomes, verdict-first; YOUR THINKING / AGENT THINKING

Owner round 3 (2026-10-05):

- CONCLUDE CARD: the stacked same-weight headings are gone. Plain
  'Concluded' eyebrow + the outcome in the quiz cards' EXACT chip
  register. Colors per outcome: solved green (the 'correct' twin),
  solvedWithHints amber (succeeded with cost), surrendered red (the
  problem won), movedOn muted (the agent's call, not a verdict against
  the learner). Verdict as plain 50% prose under the heading — the
  'Verdict:' label is gone — then a divider, then the labeled model
  solution.
- ALL-CAPS: 'YOUR THINKING' and 'AGENT THINKING' — display strings only
  (the model-facing marker label stays sentence-case). The two rows are
  equal-length over the shared rail, so the chevrons align vertically.
  Dock field labels match.
This commit is contained in:
amosblomqvist
2026-10-05 04:14:21 +03:00
parent b770834f29
commit 05f083748b
8 changed files with 62 additions and 35 deletions
+4 -4
View File
@@ -142,7 +142,7 @@ describe("render smoke tests", () => {
// The learner's voice: a labeled "Your thinking" composer-twin lives
// INSIDE the dock — never called optional, inviting the dump.
assert.ok(html.includes('data-testid="thinking-field"'), "thinking field present");
assert.match(html, /Your thinking/, "labeled as the learner's voice");
assert.match(html, /YOUR THINKING/, "labeled as the learner's voice (all caps, owner round 3)");
assert.match(html, /Why this answer\? What are you unsure about\?/, "placeholder invites, not apologizes");
assert.ok(!html.includes("optional"), "the field is never called optional");
assert.match(html, /Submit answer/, "send becomes Submit answer");
@@ -171,7 +171,7 @@ describe("render smoke tests", () => {
assert.ok(html.includes('role="radio"'), "Other row keeps the option role");
assert.match(html, /aria-checked="false"/, "circle starts unfilled");
assert.ok(html.includes('data-testid="thinking-field"'), "thinking field coexists with Other");
assert.match(html, /Your thinking/, "ask select-mode also gets the learner's voice");
assert.match(html, /YOUR THINKING/, "ask select-mode also gets the learner's voice");
});
it("multi-select ask renders checkbox rows and the select-all hint", () => {
@@ -287,7 +287,7 @@ describe("render smoke tests", () => {
});
const html = renderToStaticMarkup(<AnsweredCard answer={answer} />);
assert.ok(html.includes('data-testid="your-thinking"'), "the thinking row exists");
assert.match(html, /Your thinking/, "labeled as the learner's voice");
assert.match(html, /YOUR THINKING/, "labeled as the learner's voice (all caps, owner round 3)");
// COLLAPSED ARRIVAL (owner round 2, 2026-10-05): the SSR output is the
// trigger row only — the thinking text is one click away, never loud.
assert.ok(html.includes('data-testid="your-thinking-trigger"'), "the trigger row");
@@ -595,7 +595,7 @@ describe("predict vs check rendering", () => {
const cardAt = html.indexOf("answered-card");
assert.ok(blockAt !== -1, "the lifted block renders");
assert.ok(blockAt < cardAt, "it sits ABOVE the answered card");
assert.ok(html.includes("Your thinking"), "the plain label");
assert.ok(html.includes("YOUR THINKING"), "the plain label");
assert.ok(!html.includes("Your thinking while reading"), "the old verbose label is gone");
assert.ok(!html.includes("your-reading-thinking"), "the in-card inset is gone");
// COLLAPSED ARRIVAL: SSR shows the triggers, not the texts.