Skip to content

feat(ui): show expected good failures as a green ✗ - #1140

Merged
kyle-compute merged 3 commits into
stagingfrom
feat/good-failure-result-x
Aug 10, 2026
Merged

feat(ui): show expected good failures as a green ✗#1140
kyle-compute merged 3 commits into
stagingfrom
feat/good-failure-result-x

Conversation

@kyle-compute

@kyle-compute kyle-compute commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Problem

A trial classified as GOOD_FAILURE rendered as a big red ✗ with a nearly invisible 4px green corner dot, and the analyzer legend labeled that dot "Pass" — so an expected failure either looked like a bad failure or read as a success. The mirror case (BAD_SUCCESS) showed an unqualified green ✓ with an invisible red dot.

Fix: shape = outcome, color = QA verdict

One uniform semiotic rule for result cells:

QA good QA bad unclassified
passed green ✓ red ✓ green ✓
failed green ✗ red ✗ red ✗

Good-success and bad-failure look exactly as before; only the two "cross" cases change color, so there's nothing new to learn for the common cases.

  • status-config.ts: getQaGlyphMatrixClass(status, classification) holds the 2×2 rule in one place; shared ANALYSIS_CLASSIFICATION_LABELS. Only binary outcomes take the tone — partials keep the warm ramp, transitional states stay neutral.
  • Trials matrix: tone fill applied; corner dot now appears only when it still carries information (QA running → pulsing blue, QA failed → yellow, classified partial/error) and is dropped once the glyph color says it; aria-label/tooltip use the classification label ("Good failure", …).
  • Legend: tone chips renamed Pass/Fail → Good/Bad, rendered as a ✓✗ glyph pair; anatomy demo teaches "shape = trial result / color = QA verdict".
  • Trial-detail navigator: same override via the shared helper.

Verification

  • tsc --noEmit and eslint clean on all three files; diff is 147 insertions across 3 files, no unrelated churn.
  • Rendered the real ExperimentTrialsTable in a temporary harness page with 10 synthetic cases (all classification × outcome combinations, analyzing, QA-failed, partial, unclassified, harness error), drove it in a browser, screenshot-confirmed the green ✗, and DOM-asserted every row's fill class, dot presence, aria-label, and tooltip. Harness removed afterward.

Note

Low Risk
Presentation-only changes to experiment/trial UI with no backend or data-model impact; behavior is gated consistently via showAnalysis for public shares.

Overview
Trial matrix cells and the trial-detail navigator now use a single rule: ✓/✗ shape is the harness outcome, and fill color is the QA verdict once analysis succeeds (green = good, red = bad). That makes good failures a green ✗ and bad successes a red ✓ instead of relying on a tiny corner dot.

Shared logic in status-config.ts adds getVisibleAnalysisClassification (central showAnalysis gate), getQaGlyphMatrixClass, classification labels, and QA tone classes. Matrix cells use those for fill, aria-label/tooltips, and hide the corner dot when the glyph color already carries the verdict.

The experiment table legend renames Pass/Fail chips to Good/Bad, shows ✓✗ pairs for those tones, and refreshes the anatomy tooltip to teach shape vs color.

Reviewed by Cursor Bugbot for commit 2135235. Bugbot is set up for automated code reviews on this repo. Configure here.

A GOOD_FAILURE trial rendered as a red X with a nearly invisible 4px
green corner dot, and the analyzer legend labeled that dot "Pass" — an
expected failure was indistinguishable from a bad one, or read as a
success. The mirror case (BAD_SUCCESS) showed an unqualified green
check.

Make the cell semiotics uniform: glyph shape encodes the execution
outcome (check/cross), fill color encodes the QA verdict once the trial
is classified (green = good, red = bad). A good failure is now a green
X, a bad success a red check; good-success and bad-failure look exactly
as before.

- status-config: getQaGlyphMatrixClass(status, classification) holds the
  2x2 rule; shared ANALYSIS_CLASSIFICATION_LABELS. Only binary outcomes
  take the tone — partials keep the warm ramp, transitional states stay
  neutral.
- trials matrix: apply the tone fill, show the corner dot only when it
  still carries information (QA running/failed, classified partial or
  error), and use the classification label in aria-label/tooltip.
- legend: rename tone chips Pass/Fail to Good/Bad rendered as a check+X
  glyph pair, and rewrite the anatomy demo to teach shape=result,
  color=QA verdict.
- trial-detail navigator: same override via the shared helper.

Verified with tsc, eslint, and a browser-rendered harness covering all
classification x outcome combinations (harness removed after).
@vercel

vercel Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
oddish-app Ready Ready Preview Aug 10, 2026 10:26pm

@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Oddish preview

Commit: 213523508c4240b88a65cb7d5fc95f53b403b6a0

Surface Link Target
Frontend https://pr-1140.oddish.app Vercel preview for 2135235
Backend oddish-pr-1140 oddish-pr-1140
Database project ztkkwnshjshmtthbonlh project ztkkwnshjshmtthbonlh

Vercel deployment URL: https://oddish-p12qq7cgv.oddish.app

Plan:

  • Frontend deploy: true
  • Backend deploy: false
  • Migrations: false

This comment is updated by the PR Preview workflow.

Comment thread frontend/src/components/trial-detail-panel.tsx
@cursor
cursor Bot requested review from charlesyhuang and stateofkate August 10, 2026 22:16

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Risk: medium. Left a non-blocking comment — Cursor Bugbot completed with 1 unresolved finding (QA glyph tone not gated by showAnalysis on share/public paths), so this is not auto-approved. Human review is needed; reviewers were assigned.

Open in Web View Automation 

Sent by Cursor Approval Agent: Pull Request Router and Approver

@github-actions
github-actions Bot had a problem deploying to Preview August 10, 2026 22:22 Failure
The QA-tone glyph change evaluated classification visibility ad hoc per
render site, and two of the new consumers forgot the showAnalysis gate:
the matrix aria-label announced "Good failure" on public share views,
and the trial-detail navigator applied the QA fill and classification
labels unconditionally. showAnalysis=false is the share-view contract
for hiding QA entirely; every other surface (verdict badge, analysis
card, live tab, repro command) honors it.

Root fix instead of per-callsite patches: getVisibleAnalysisClassification
(showAnalysis, trial) in status-config is now the single place the
visibility gate lives. Matrix cell fill/label and the navigator glyph
all derive from it, so a future consumer cannot forget the gate.

Verified: tsc + eslint clean; browser harness rendering the matrix with
showAnalysis on/off over classified trials — QA tones and labels show
when enabled, plain Pass/Fail with default fills when hidden.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 2135235. Configure here.

Comment thread frontend/src/components/experiment-trials-table.tsx
@kyle-compute
kyle-compute merged commit 33fa252 into staging Aug 10, 2026
16 checks passed
@kyle-compute
kyle-compute deleted the feat/good-failure-result-x branch August 10, 2026 22:28
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.

1 participant