Skip to content

Commit fd0ea4a

Browse files
Merge branch 'main' into release/publish/monorepo/v1.59.5
2 parents 9bfeb74 + dc76bb4 commit fd0ea4a

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)