Skip to content

Commit dc76bb4

Browse files
committed
fix(showcase): render absent-starter columns as 🚫 unsupported, not grey/red βœ—
A STARTER-row column for an integration that has NO starter (the 7 columns absent from STARTER_TO_COLUMN) was rendering a grey "βœ—" with a "no starter for this integration" tooltip. That mis-communicates the truth: a grey/red βœ— reads as "we expected data and got none" or "a probe ran and failed", when the reality is "this integration is architecturally unsupported in the starter row". buildStarterBadge's mapping-derived !isSupported branch now returns the same 🚫 "Not supported by this framework" treatment depth-chip/unified-cell already use for unsupported cells. Columns that DO have a starter keep surfacing their real probe status β€” a genuinely-red starter still renders red βœ— and is never masked as 🚫.
1 parent dd1dcb3 commit dc76bb4

3 files changed

Lines changed: 53 additions & 22 deletions

File tree

β€Žshowcase/shell-dashboard/src/components/feature-grid.test.tsxβ€Ž

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,13 +283,16 @@ describe("FeatureGrid β€” Starter row-group", () => {
283283
expect(cell.textContent).toContain("?");
284284
});
285285

286-
it("an unmapped column renders the not-supported βœ— with the 'no starter' tooltip", () => {
286+
it("an unmapped column renders the 🚫 not-supported cell with the framework tooltip", () => {
287287
expect(unmapped, "registry must have β‰₯1 unmapped column").toBeDefined();
288288
const { getByTestId } = renderGrid(new Map());
289289
const cell = getByTestId(`starter-cell-${unmapped!.slug}-health`);
290-
expect(cell.textContent).toContain("βœ—");
290+
// An integration with NO starter renders the 🚫 unsupported treatment β€”
291+
// NOT a grey/no-data `?` and NOT a red smoke-failed `βœ—`.
292+
expect(cell.textContent).toContain("🚫");
293+
expect(cell.textContent).not.toContain("βœ—");
291294
const chip = cell.querySelector("[title]");
292-
expect(chip?.getAttribute("title")).toBe("no starter for this integration");
295+
expect(chip?.getAttribute("title")).toBe("Not supported by this framework");
293296
});
294297

295298
it("βœ“ green for a passing mapped starter cell", () => {

β€Žshowcase/shell-dashboard/src/lib/live-status.test.tsβ€Ž

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -992,20 +992,23 @@ describe("buildStarterBadge β€” 5-state cell vocabulary (Β§d)", () => {
992992
expect(b.label).toBe("?");
993993
});
994994

995-
it("not-supported βœ—: unmapped column β†’ gray βœ—, mapping-derived (not data-derived)", () => {
996-
// Keyed off isSupported=false, NOT off a missing row β€” so it is visually
997-
// distinct from the gray `?` not-yet-run state (same tone, different glyph)
998-
// AND from the red smoke-failed βœ— (different tone).
995+
it("not-supported 🚫: unmapped column β†’ 🚫 unsupported chip, mapping-derived (not data-derived)", () => {
996+
// Keyed off isSupported=false, NOT off a missing row. An integration with
997+
// NO starter is architecturally unsupported in the starter row, so it
998+
// renders the SAME 🚫 "Not supported by this framework" treatment the
999+
// depth-chip/unified-cell already use β€” NOT a grey/no-data `?`, and NOT a
1000+
// red smoke-failed `βœ—` (which would mis-communicate "we tried and failed").
9991001
const b = buildStarterBadge("health", false, null, NOW, "live");
1000-
expect(b.tone).toBe("gray");
1001-
expect(b.label).toBe("βœ—");
1002-
expect(b.tooltip).toBe("no starter for this integration");
1002+
expect(b.label).toBe("🚫");
1003+
expect(b.tooltip).toBe("Not supported by this framework");
1004+
// It must be visually distinct from a data-bearing red FAIL: never red.
1005+
expect(b.tone).not.toBe("red");
10031006
expect(b.row).toBeNull();
10041007
});
10051008

1006-
it("not-supported βœ— is independent of any row data (mapping wins)", () => {
1009+
it("not-supported 🚫 is independent of any row data (mapping wins)", () => {
10071010
// Even if a stray row existed, an unmapped column must still render the
1008-
// not-supported state β€” the caller passes row=null for unmapped columns,
1011+
// not-supported 🚫 state β€” the caller passes row=null for unmapped columns,
10091012
// but assert buildStarterBadge ignores row entirely when !isSupported.
10101013
const b = buildStarterBadge(
10111014
"health",
@@ -1014,8 +1017,24 @@ describe("buildStarterBadge β€” 5-state cell vocabulary (Β§d)", () => {
10141017
NOW,
10151018
"live",
10161019
);
1020+
expect(b.label).toBe("🚫");
1021+
expect(b.tone).not.toBe("red");
1022+
});
1023+
1024+
it("supported column with a genuinely-red row still renders red βœ— (NOT masked as 🚫)", () => {
1025+
// Guard the inverse: only ABSENT starters become 🚫. A starter that exists
1026+
// and FAILED must keep surfacing its real red βœ— β€” never reframed as
1027+
// "unsupported".
1028+
const b = buildStarterBadge(
1029+
"chat",
1030+
true,
1031+
row("starter:agno/chat", "starter", "red"),
1032+
NOW,
1033+
"live",
1034+
);
1035+
expect(b.tone).toBe("red");
10171036
expect(b.label).toBe("βœ—");
1018-
expect(b.tone).toBe("gray");
1037+
expect(b.label).not.toBe("🚫");
10191038
});
10201039

10211040
it("tooltip carries the per-level descriptor for data-bearing states", () => {

β€Žshowcase/shell-dashboard/src/lib/live-status.tsβ€Ž

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -430,10 +430,16 @@ const STARTER_LEVEL_DESCRIPTION: Readonly<Record<StarterLevel, string>> = {
430430
* Build a `BadgeRender` for one starter sub-cell, applying the FULL 5-state
431431
* cell vocabulary (Β§d):
432432
*
433-
* - not-supported β†’ grey "βœ—", mapping-derived (`!isSupported`),
434-
* tooltip "no starter for this integration". Distinct
435-
* from the red smoke-failed βœ—. Resolved FIRST so it can
436-
* never collide with the gray `?` initial state.
433+
* - not-supported β†’ 🚫 unsupported chip, mapping-derived (`!isSupported`),
434+
* tooltip "Not supported by this framework". An
435+
* integration with NO starter is architecturally
436+
* unsupported in this row, so it renders the SAME 🚫
437+
* treatment the depth-chip/unified-cell already use for
438+
* "framework cannot support this feature" β€” NOT a
439+
* grey/no-data `?` ("we expected data and got none") and
440+
* NOT a red smoke-failed βœ— ("we tried and failed").
441+
* Resolved FIRST so it can never collide with the gray
442+
* `?` initial state.
437443
* - gray `?` β†’ no row yet (not-yet-run / initial).
438444
* - βœ“ green β†’ last probe passed.
439445
* - red βœ— β†’ last probe failed (actionable regression).
@@ -453,13 +459,16 @@ export function buildStarterBadge(
453459
connection: ConnectionStatus,
454460
): BadgeRender {
455461
if (!isSupported) {
456-
// Mapping-derived: this column has no starter (Β§a). Grey βœ—,
457-
// visually distinct from a red smoke-failed βœ—. NOT data-derived, so it
458-
// renders identically before and after the first probe tick.
462+
// Mapping-derived: this column has no starter (§a). Renders the 🚫
463+
// "unsupported" treatment (matching depth-chip/unified-cell), which is
464+
// distinct from BOTH the gray `?` no-data state AND the red smoke-failed
465+
// βœ—. NOT data-derived, so it renders identically before and after the
466+
// first probe tick. Tone stays slate/gray (the muted unsupported fill);
467+
// the 🚫 glyph β€” not the tone β€” is what communicates "unsupported".
459468
return {
460469
tone: "gray",
461-
label: "βœ—",
462-
tooltip: "no starter for this integration",
470+
label: "🚫",
471+
tooltip: "Not supported by this framework",
463472
row: null,
464473
};
465474
}

0 commit comments

Comments
Β (0)