Commit Graph

191 Commits

Author SHA1 Message Date
Jordan Ritter 605bfb497d fix(showcase): collapsible legend footer for mobile (#4426)
## Summary
- Makes the fixed legend footer collapsible via a toggle button. Default
is open. On mobile the legend was taking up most of the screen, making
the table unusable.

## Test plan
- Click the "Legend" toggle — content collapses to a thin bar. Click
again to expand.
- Verify on mobile viewport — collapsed state leaves room for the table.
2026-04-29 07:32:11 -07:00
Jordan Ritter f99fb17f0a fix(showcase): make legend footer collapsible for mobile usability 2026-04-29 07:31:39 -07:00
github-actions[bot] 1f355b6594 style: auto-fix formatting 2026-04-29 14:03:44 +00:00
Alem Tuzlak 5961c8569f fix(showcase-dashboard): use 🚫 emoji for unsupported (not N/A text)
Per user preference, restore the 🚫 emoji as the unsupported marker in
both DepthChip and feature-grid. Keeps a slate-colored pill (vs the
dashed-gray unshipped chip and the red ✗ no-demo marker) so the three
states remain visually distinct.
2026-04-29 16:01:46 +02:00
Alem Tuzlak a912a2ddb0 fix(showcase-dashboard): render unsupported cells as N/A in feature-grid (not danger ✗)
The matrix view's links/depth overlays are rendered by feature-grid.tsx,
which had its own no-demo branch that displayed a hard ✗ in danger color
when integration.demos didn't contain an entry for the feature.

That branch fired even when the feature was architecturally unsupported
(in not_supported_features), because unsupported integrations don't add
the feature to their demos[] list. Result: 29 unsupported cells rendered
as a red ✗ titled 'No demo' — visually identical to the unshipped marker
the user is trying to distinguish from.

Now feature-grid checks integration.not_supported_features first; if the
feature is listed there, the cell renders the same slate N/A pill we use
in DepthChip (consistent with the unsupported branch added there in the
prior commit). The hard ✗ remains for genuine no-demo cases.

Also adds not_supported_features to the Integration TypeScript interface
in registry.ts (the field was already present in registry.json data;
the type just didn't expose it).
2026-04-29 16:01:45 +02:00
Alem Tuzlak 428a9e44cc fix(showcase-dashboard): use 'N/A' text for unsupported chip instead of 🚫 emoji
The 🚫 emoji falls back to a tofu/X-shaped glyph on systems without
color emoji support (notably Windows Chrome with default fonts), which
viewers misread as the unshipped X marker — making 29 unsupported cells
look indistinguishable from unshipped.

Switched to a slate-colored N/A pill with a distinct border so the
unsupported state reads clearly across all platforms regardless of emoji
font availability.
2026-04-29 15:04:40 +02:00
github-actions[bot] 7d131608c0 style: auto-fix formatting 2026-04-29 11:03:09 +00:00
Alem Tuzlak b375349e6a fix(showcase): cr-loop fixes — manifest validation, types, env-var fallbacks
- generate-registry: cross-validate not_supported_features against features list
- catalog-types: widen manifestation union to include 'starter'
- claude-sdk-python: drop invalid 'declarative-schema' from generative_ui enum
- crewai-crews: remove duplicate animated_preview_url key in mcp-apps demo
- built-in-agent + pydantic-ai: REASONING_MODEL env-var fallback so deployers can swap if gpt-5.2/gpt-5 isn't available
2026-04-29 12:58:31 +02:00
Alem Tuzlak 879b18740a feat(showcase-dashboard): add unsupported cell status distinct from unshipped
Adds a fourth cell status, "unsupported", to the showcase dashboard for
features whose framework cannot architecturally support them (e.g.,
no graph-interrupt API, no MCP tool runtime). This is distinct from
"unshipped" (just unbuilt).

- Manifest schema gains optional `not_supported_features: string[]`.
- generate-registry.ts: determineCellStatus checks `not_supported_features`
  first; CatalogCell/CatalogMetadata gain `unsupported`; max_depth=0 for
  unsupported cells; parity tier is computed against the supportable subset
  of the reference (unsupported features no longer drag a framework's tier
  down for gaps it legitimately cannot fill).
- depth-utils.ts: deriveDepth returns D0 with no regression for
  unsupported cells.
- DepthChip: renders a dashed gray border + 🚫 glyph with
  "Not supported by this framework" tooltip; data-status attribute
  distinguishes unshipped vs unsupported.
- CoverageBar gains diagonal-stripe gray segment for unsupported.
- StatsBar / AdaptiveStatsBar / CellsView: separate "Unsupported" chip.
- CellMatrix gaps filter excludes unsupported cells (not work to do).
- Tests: cover unsupported in DepthChip, depth-utils, cell-matrix, and
  catalog generator metadata/max_depth assertions.
2026-04-29 10:59:38 +02:00
Jordan Ritter bd17bc11e3 fix(showcase): docs overlay should render independently of health overlay 2026-04-29 00:58:36 -07:00
Jordan Ritter 8029b372c0 fix(showcase): align ref-depth column sticky offset with reduced feature column width 2026-04-29 00:54:19 -07:00
Jordan Ritter 34aeab2ec8 fix(showcase): add bottom padding to scroll area for fixed legend bar 2026-04-29 00:48:53 -07:00
Jordan Ritter 1980dcc210 fix(showcase): suppress health badges on CLI command cells
Command demos (npx copilotkit init) have no E2E/D5/D6 probes, so
health badges were perpetual gray noise. Skip HealthLayer when the
demo declares a command instead of a route.
2026-04-29 00:42:18 -07:00
Jordan Ritter 0213dbdcfd fix(showcase): dashboard UI — sticky headers, tighter cells, centered badges
Restructure page to viewport-filling flex layout so table column
headers stick below the overlay toggle bar on scroll. Halve cell
padding, reduce column min-width, center UWCT/health badges and
links. Remove duplicate CellStatus from CommandCell (ComposedCell
HealthLayer handles it). Split stats bar out of sticky container
so it scrolls away naturally.
2026-04-29 00:42:17 -07:00
Jordan Ritter 616a45bb1d fix(showcase): extend depth ladder to D5/D6 with emerald chips
Depth system was capped at D4 — D5/D6 PocketBase rows existed but
the chip never advanced past D4. Extends deriveDepth() through D6
with proper short-circuit gating, adds isD5Green() for multi-key
CATALOG_TO_D5_KEY resolution, and colors D5/D6 chips emerald to
distinguish from D3/D4 blue.
2026-04-29 00:42:17 -07:00
Jordan Ritter ea1caa4837 fix(showcase): D5 dashboard chip lookup + CLI deep-input mapping
Dashboard: resolveCell() looked up D5 rows by catalog feature ID
(e.g. d5:slug/hitl-in-chat) but the harness writes them keyed by D5
feature type (e.g. d5:slug/hitl-text-input). Added CATALOG_TO_D5_KEY
mapping so the dashboard resolves the correct PB row for each cell.

CLI: buildDeepInputs() passed manifest registry IDs as `features` but
the D5 driver only maps them through demosToFeatureTypes() when they
arrive as `demos`. Changed to pass `demos` so the driver's mapping
from registry IDs to D5 feature types activates correctly.
2026-04-28 23:30:57 -07:00
github-actions[bot] 45a71343c7 style: auto-fix formatting 2026-04-29 02:56:56 +00:00
Jordan Ritter bd0b32525f fix: resolve merge conflict in aimock-wiring.ts (ops→harness rename + starter exclusions) 2026-04-28 19:55:29 -07:00
Jordan Ritter 2001a40862 Merge slot B3 into blitz/dash-fixes/integration 2026-04-28 19:32:54 -07:00
Jordan Ritter 0f15d507df Merge slot B2 into blitz/dash-fixes/integration 2026-04-28 19:32:46 -07:00
Jordan Ritter 1a05269d4f test: add overlay selector integration tests with real UI components
Renders ComposedCell with real CellStatus, DocsRow, DepthChip, and Badge
components (only data layer mocked) to verify that overlay toggles
actually control visible content. Covers all 5 overlays individually,
key combinations (Health+Docs, Health-without-Docs), all 3 presets
(Catalog, Assessment, Parity Review), testing-kind D5/D6 hiding, and
the critical regression test proving Health-only no longer leaks docs
indicators after the CellStatus DocsRow removal fix.
2026-04-28 19:31:50 -07:00
Jordan Ritter 0b28c07946 fix: convert raw UTC timestamps to browser-local timezone in dashboard
Add shared formatTs() utility that converts ISO 8601 UTC strings to
the user's local timezone via toLocaleString(). Apply it to all raw
timestamp interpolation sites in tooltip/badge/drilldown rendering:
- live-status.ts formatTooltip() (4 sites)
- cell-pieces.tsx formatTransitionLine() (3 sites)
- level-strip.tsx resolveBadge() (1 site)
- cell-drilldown.tsx refactored to use shared formatTs()

Update existing live-status tests to expect formatted timestamps.
Add unit tests for formatTs() covering valid/invalid inputs.
2026-04-28 19:26:50 -07:00
Jordan Ritter 9af3e727f5 fix: remove duplicate DocsRow rendering from CellStatus
CellStatus unconditionally rendered DocsRow for non-testing features,
causing docs indicators (docs-og, docs-shell) to appear in matrix cells
whenever the Health overlay was active — even when the Docs overlay was
toggled OFF. DocsLayer in ComposedCell already handles docs rendering
correctly, gated on overlays.has("docs"). Remove the redundant DocsRow
from CellStatus so docs indicators respect the overlay toggle.
2026-04-28 19:26:25 -07:00
Jordan Ritter 016f355cd3 fix: hydration-safe initialization for useOverlays and useCollapsible 2026-04-28 18:05:55 -07:00
Jordan Ritter b6e58e7429 fix: TallyTrigger hydration mismatch causing production crash
Remove conditional early return that rendered different DOM structures
on server vs client (bare fragment vs div>button wrapper). All hooks
now run unconditionally; interaction is disabled via guards when items
array is empty. Fixes React errors #418 and #310.
2026-04-28 17:53:27 -07:00
github-actions[bot] 6d664ce101 style: auto-fix formatting 2026-04-29 00:13:58 +00:00
Jordan Ritter 3d48abde15 feat(shell-dashboard): merge B2 — TallyBreakdownPopover + header wiring 2026-04-28 17:09:15 -07:00
Jordan Ritter 34681013b8 feat(shell-dashboard): add TallyBreakdownPopover and wire into column headers
TallyTrigger wraps each tally count (green/amber/red) in OverlayColumnHeader
with hover-open (200ms delay) and click-pin semantics. The popover lists
which features/signals fall in each bucket with colored dots and dimension tags.
2026-04-28 17:08:38 -07:00
Jordan Ritter 4bd57eb88f feat: add computeColumnTallyDetail() and wire tallyDetails memo into FeatureGrid
Add companion function to computeColumnTally() that returns per-bucket
TallyItem arrays instead of numeric counts. Wire a tallyDetails memo
into FeatureGrid and pass tallyDetail prop to OverlayColumnHeader.

Includes 6 unit tests covering connection error, health routing,
e2e tone bucketing, and demo-less feature filtering.
2026-04-28 17:08:20 -07:00
Jordan Ritter 8e17586418 feat(shell-dashboard): add TallyDetail/TallyItem types for tally breakdown 2026-04-28 17:03:36 -07:00
Jordan Ritter c62dd66dc4 Merge remote-tracking branch 'origin/main' into blitz/showcase-harness-rename/integration
# Conflicts:
#	pnpm-lock.yaml
#	showcase/harness/config/alerts/smoke-red-tick.yml
#	showcase/harness/scripts/test-notify-harness-jq.sh
#	showcase/harness/src/probes/drivers/e2e-chat-tools.test.ts
#	showcase/harness/src/probes/drivers/e2e-chat-tools.ts
#	showcase/harness/src/probes/drivers/e2e-demos.test.ts
#	showcase/harness/src/probes/drivers/e2e-demos.ts
#	showcase/harness/src/probes/drivers/e2e-readiness.test.ts
#	showcase/harness/src/probes/drivers/e2e-readiness.ts
#	showcase/harness/src/probes/drivers/e2e-smoke.test.ts
#	showcase/harness/src/probes/drivers/e2e-smoke.ts
#	showcase/harness/src/probes/drivers/liveness.test.ts
#	showcase/harness/src/probes/drivers/liveness.ts
#	showcase/harness/src/probes/drivers/smoke.test.ts
#	showcase/harness/src/probes/drivers/smoke.ts
#	showcase/harness/src/probes/liveness.test.ts
#	showcase/harness/src/probes/liveness.ts
#	showcase/harness/src/probes/smoke.test.ts
#	showcase/harness/src/probes/smoke.ts
#	showcase/harness/test/fixtures/rules/valid/smoke-red-tick.yml
#	showcase/ops/src/probes/drivers/e2e-demos.test.ts
#	showcase/ops/src/probes/drivers/e2e-demos.ts
#	showcase/ops/src/probes/drivers/e2e-smoke.test.ts
#	showcase/ops/src/probes/drivers/e2e-smoke.ts
#	showcase/ops/src/probes/drivers/smoke.test.ts
#	showcase/ops/src/probes/drivers/smoke.ts
#	showcase/ops/src/probes/smoke.test.ts
#	showcase/ops/src/probes/smoke.ts
#	showcase/scripts/verify-railway-image-refs.ts
2026-04-28 16:04:44 -07:00
Jordan Ritter d815831a60 fix(shell-dashboard): update composed-cell test for docs dedup behavior 2026-04-28 15:48:47 -07:00
Jordan Ritter 1c7bead053 fix(shell-dashboard): center-align cell content to match X marks
The "no demo" X marks are text-center while depth chips and overlay
content were text-left, causing visual misalignment across all overlay
views. Center both the td and the ComposedCell flex column.
2026-04-28 15:45:27 -07:00
Jordan Ritter a322656e3d Merge branch 'blitz/dashboard-ux-fixes/b6' into blitz/dashboard-ux-fixes/integration 2026-04-28 15:45:08 -07:00
Jordan Ritter 9583b0b62b Merge branch 'blitz/dashboard-ux-fixes/b3' into blitz/dashboard-ux-fixes/integration 2026-04-28 15:45:05 -07:00
Jordan Ritter 6caa4a6e95 Merge branch 'blitz/dashboard-ux-fixes/b7' into blitz/dashboard-ux-fixes/integration 2026-04-28 15:45:01 -07:00
Jordan Ritter 8352ebe83d Merge branch 'blitz/dashboard-ux-fixes/b5' into blitz/dashboard-ux-fixes/integration 2026-04-28 15:44:58 -07:00
Jordan Ritter 1529b93392 Merge branch 'blitz/dashboard-ux-fixes/b4' into blitz/dashboard-ux-fixes/integration 2026-04-28 15:44:55 -07:00
Jordan Ritter 4f41f3aef5 feat(shell-dashboard): reorder toggle bar — presets before individual overlays 2026-04-28 15:36:19 -07:00
Jordan Ritter 1c2c81ebae fix(shell-dashboard): deduplicate docs row when health and docs overlays both active 2026-04-28 15:32:04 -07:00
Jordan Ritter 1d5fbd3ad3 feat(shell-dashboard): restore collapsible category rows in feature grid 2026-04-28 15:31:43 -07:00
Jordan Ritter 0c8d0ef71b feat(shell-dashboard): restore cell drilldown popup on depth chip click 2026-04-28 15:30:24 -07:00
Jordan Ritter 09ed887eba feat(shell-dashboard): sticky-pin overlay toggle bar to viewport top on scroll 2026-04-28 15:26:29 -07:00
Jordan Ritter d14dc2d003 feat(shell-dashboard): sticky-pin adaptive legend footer to viewport bottom 2026-04-28 15:26:09 -07:00
Jordan Ritter c789f43bbf chore(shell-dashboard): formatting and lint fixes
Split inline type imports into separate import-type statements per
oxlint consistent-type-specifier-style rule. Prefix unused connection
parameter. Apply oxfmt formatting.
2026-04-28 14:18:37 -07:00
Jordan Ritter 1332c10dec feat(shell-dashboard): wire overlays into page and feature grid
Collapse 5 tabs to 2 (Matrix | Ops). Page uses useOverlays for
composable state, passes overlays through to FeatureGrid and
ComposedCell. Grid gains overlay-aware column headers, ref-depth
column, and category separator colspan. Tab-shell gets deprecation
comment for future removal.
2026-04-28 14:18:36 -07:00
Jordan Ritter abb23516ac feat(shell-dashboard): adaptive stats bar and legend
Stats bar shows health/parity/docs summary counts that appear/hide
based on active overlays. Legend renders color-coded keys for each
active overlay layer.
2026-04-28 14:18:36 -07:00
Jordan Ritter 14974c1ada feat(shell-dashboard): overlay-aware column headers and ref-depth column
OverlayColumnHeader shows health strip, parity badge, and tally based
on active overlays. RefDepthColumn is a frozen column pinned after the
feature name that appears when the parity overlay is active.
2026-04-28 14:18:36 -07:00
Jordan Ritter ec99bbd587 feat(shell-dashboard): composed cell renderer
Stacks 4 overlay content layers (Links, Depth, Health, Docs) into a
single matrix cell. Each layer renders only when its overlay is active,
driven by the shared overlays Set from useOverlays.
2026-04-28 14:18:35 -07:00
Jordan Ritter a41d350b6e feat(shell-dashboard): overlay toggle bar with preset buttons
Pill-style toggle bar for 5 overlay layers with 3 presets (Default,
Developer, Ops). Each pill shows active state; presets apply curated
overlay combinations with one click.
2026-04-28 14:18:35 -07:00