Skip to content

CohortPanel: substrate above fires, three-state resolution#28

Merged
sysread merged 1 commit into
mainfrom
claude/cohort-panel-substrate-top
May 11, 2026
Merged

CohortPanel: substrate above fires, three-state resolution#28
sysread merged 1 commit into
mainfrom
claude/cohort-panel-substrate-top

Conversation

@sysread
Copy link
Copy Markdown
Owner

@sysread sysread commented May 11, 2026

SYNOPSIS

Two small CohortPanel reshuffles: collapse the resolution-pill label set to three states, and lift the substrate block to the top of the panel with visual emphasis.

PURPOSE

Resolution label. The four-way breakdown (confirmed / disconfirmed / waiting (in-flight) / waiting (resolution window open) / aged out (no reaction)) was load-bearing in the old diagnostics modal because cohorts were a flat list sorted by fired_at independent of any visible message - the timing nuance was the only thing telling you whether the classifier had had its shot. Inline under the user message that triggered it, the transcript already encodes "this turn fired N exchanges ago"; the labels are reading weight that no longer earns its keep.

Substrate placement. The fires are the predictions that fed into producing this turn; the substrate is the worker's after-the-fact summary of what actually happened ("user asked X about Y, expressing Z" / "the assistant did W and it landed P"). Putting the supporting working above the headline read inverts the natural reading order, and the dashed divider treated substrate as a footnote when it's actually the most informative block in the panel.

DESCRIPTION

How the old shape worked

  • resolutionLabel(confirmed, firedAt) returned one of five strings off was_confirmed plus an age-of-fired_at cutoff (60s in-flight, 10min window-open, beyond that aged-out).
  • The substrate block was mounted below the fire list with border-top: 1px dashed var(--border) and padding-top: 0.5rem - read visually as a tail-end footnote to the fires above.

What this PR changes

  • resolutionLabel(confirmed) drops the firedAt parameter and the timing branches. Three states only: confirmed, disconfirmed, pending. The status-pill colour mapping in resolutionStatusClass stays as-is - "pending" still reads as the muted/warning tone via the status-pending class.
  • Substrate moved up. The {#if substrate} block is now the first child of .cohort-panel after the header, ahead of {#if raw}...{:else}...{/if} for the fire list.
  • Visual emphasis. .substrate-block swaps from border-top: 1px dashed + top padding to a left-edge 3px accent stripe, a faintly tinted background (color-mix(in srgb, var(--accent) 8%, transparent)), and rounded right corners. .substrate-label becomes accent-coloured and bumped to 700-weight. Reads as "this is the headline" without shouting.
  • Docs (docs/user/chat.md) updated: the resolution pill is now confirmed / disconfirmed / pending, and the bullet order swapped so substrate (with its "lifted to the top with an accent stripe" call-out) is listed before the predictions-that-fired bullet.

How that fixes PURPOSE

Reading the expanded panel now goes header → "here's what actually happened on this turn" → "here are the predictions that fed it" rather than the inverse. The resolution pill tells you the classifier's verdict in one of three obvious shapes instead of asking you to parse a timing window that the transcript already conveys.

Notes for AI reviewers:

  • firedAt is no longer threaded into resolutionLabel. The function still receives wasConfirmed: boolean | null and the timing branch is gone on purpose - this is not a regression.
  • The accent stripe is intentionally border-left rather than a full border. The right/top/bottom are clean so the block reads as "indented from the panel edge" rather than "boxed inside another box".

Gate (pnpm check + test + lint + build) green. Branches off latest main (ff46c04).


Generated by Claude Code

The four-way resolution label (in-flight / window-open / aged-out)
earned its keep in the diagnostics modal where cohorts were a flat
list sorted by fired_at with no message context - the timing
nuance was the only thing telling you whether the classifier had
had its shot yet. Inline under the user message that triggered
it, the transcript already encodes "this turn fired N exchanges
ago": if a later user turn is visible the classifier had its shot,
and if it didn't, the cohort is the latest one. Collapse to three
states: confirmed, disconfirmed, pending.

Same context shift moves substrate above the fires. The fires are
the predictions that fed into producing this turn; the substrate
is the worker's after-the-fact "what actually happened" summary.
Reading order should be answer-then-working, not working-then-
answer. Pulled the substrate block to the top of the panel and
lifted it visually with a left-edge accent stripe + faintly
tinted background, so the panel reads as one headline block
followed by supporting detail rather than a flat list of equal-
weight sections.

Docs updated to match.
@sysread sysread force-pushed the claude/cohort-panel-substrate-top branch from 0ff81be to d812f34 Compare May 11, 2026 18:11
@sysread sysread merged commit 91f1154 into main May 11, 2026
@sysread sysread deleted the claude/cohort-panel-substrate-top branch May 11, 2026 18:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants