dashboard: truth pass — strip stubbed surfaces, ship reality#30
Merged
Conversation
This is the dashboard-side rollup of a multi-agent retro session that
addressed user-flagged "the dashboard is a mock" symptoms across every
page. Aggregates the wave 1-3 work + Playwright visual retro findings
(/tmp/dashboard-retro/) into a single shippable PR for instanode.dev/app.
Headline fixes by surface:
• /app/deployments
- listStacks no longer falls back to FIXTURE_STACKS on error.
The page renders an honest "No deployments yet" empty state
instead of fake "flashcards · prod · 14:42:01" rows the user
doesn't own. (This is the bug Manas pointed at in the live URL.)
- Filter chips with hardcoded counts removed. PromptPill removed.
• /app/deployments/:id
- EnvVars + Bound Resources tabs no longer hardcode DATABASE_URL /
STRIPE_SECRET_KEY / OPENAI_API_KEY / flashcards-db. Honest empty
states explaining the Phase-1 endpoints they wait on.
- SideKv runtime sidebar (marcus · 12m · a31fc8de · 142 MB · …)
replaced with real DashboardStack fields only.
• /app/billing
- Usage panel: hardcoded 47/500, 163/256, 1.64/2GB etc. replaced
with per-type aggregates computed from listResources().
- AppShell sidebar upgrade card: "9 days to renewal · auto-charges
May 19" replaced with real billing.next_renewal_at + payment_*.
- Card expiry 9/27 fixture leak removed. Invoice status pill renders
i.status (not the deploy-status "running"). Update button →
mailto:support.
- Cancel removed → mailto:support per the no-self-serve-cancel
memory rule.
• /app/team
- Dead revoke button + member kebab gone. Replaced with PromptCards
(DELETE /api/v1/team/invitations/{id},
DELETE /api/v1/team/members/{user_id}).
- "Pro tier · 5 team seats" hardcoded → tier-aware from
ctx.me.team.tier via seatLimitByTier map matching plans.yaml.
• /app/vault
- rotated_at no longer fabricated at parse time. Row meta chip
conditionally renders only when value is real.
• /app/resources
- Env filter chips removed (backend doesn't filter by env; chip was
a lie). EnvPill column kept (resources.env is a real column).
- PromptCards for provision + deploy with tier-aware prompts.
• /app/overview
- Quick-prompts replaced 3 decorative <a> tags with real <button>
elements that copy tier-interpolated prompts via
navigator.clipboard.writeText. "copied ✓" flash for 1.5s.
- "⌘K to send" chip → "copy → paste in agent" (no keyboard handler
ever existed for ⌘K).
• /app/agent
- Page deleted entirely. The static prompt-library with 21 dead
"copy ↗" buttons + the "claude-code · connected" fake footer
contradicted the no-AI-in-UI memory rule. The contextual
PromptCards on each page cover the use case better with real
resource data interpolated.
• /app/settings
- Revoke PAT button → PromptCard. PAT creation kept clickable
(bootstrap path — agent can't mint its own first credential).
• /claim
- "free trial resources expire" copy → "free-tier resources expire
after 24h unless you subscribe" matching no-trial policy.
- Post-submit screen redesigned as payment funnel: 24h countdown +
"Keep my resources $9/mo" CTA → createCheckout('hobby') → Razorpay.
- 18 new tests in ClaimPage.test.tsx.
• AppShell chrome
- Hardcoded "acme-corp" breadcrumb → ctx.me.team.name.
- "Ask agent" topbar button + ⌘K NavRow badge removed.
- ROBanner "✦ ⌘K · ask agent" decorative anchor removed.
• PricingPage
- "Multi-env workflows" advertised as Pro tier (shipped via the
api-side env promotion endpoints landing in a separate PR).
• Expiry warning UI
- ExpiryBadge + ExpiryWarningBanner + useExpiryTick in Common.tsx.
- AppShell-level red banner above page body when any resource is
<6h from expiry. Per-row badge on ResourcesPage with pulse when
urgent. Header badge + Time-Remaining card on ResourceDetailPage.
- 41 new tests across OverviewPage + ResourcesPage.
• Tier model
- 'free' tier added as a distinct real tier alongside 'anonymous'
(same limits, different audience per the keep-both-tiers
decision). TierPill renders both with distinct styles.
• Test infrastructure
- 7 test files now (was 3). 162 passing, 3 pre-existing skips.
- New: Common.test.tsx (5), ClaimPage.test.tsx (18),
OverviewPage.test.tsx (29), ResourcesPage.test.tsx (12).
Known follow-ups (deliberately deferred):
• §10.21 FIXTURE_* removal — most fixture fallbacks (vault, billing
503, activity, getStack/getStackLogs) still use stub fallback on
error. Each removal requires a per-page UX decision (empty state
vs error banner) cleaner in a focused follow-up. Tracked in
RETRO-2026-05-12.md §10.21.
• §10.20 Server-side /billing/usage + /team/summary with Redis cache
+ singleflight + Cache-Control headers per the new caching memory
rule. The BillingPage Usage panel is currently client-side
aggregation — works but doesn't honor the eventual-consistent
caching policy. Tracked in §10.20.
• §10.10 Single copyToClipboard() helper with execCommand fallback
for HTTP/Safari. The wave-4 agent that started this was stopped
mid-flight; the Common.tsx changes (5 new tests) made it in. The
per-page swap to use the helper is the follow-up.
Test gate:
- npx tsc --noEmit: 0
- npm test -- --run: 162 passed, 3 skipped, 0 failed (7 test files)
Reference: /Users/manassrivastava/Documents/InstaNode/RETRO-2026-05-12.md
contains the full session retro including §10.X agent-dispatchable specs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
/app/deploymentsno longer shows fakeflashcards/marcus · 12mdata — falls back to honest empty state when the api returns no stacksTest plan
npx tsc --noEmit— cleannpm test -- --run— 162 passed, 3 skipped, 0 failedhttps://instanode.dev/app/deploymentsafter the GitHub Pages deploy completes — should show "No deployments yet" empty state, not the oldflashcards · prod · 14:42:01fixture rows/app/billingUsage section reflects real resource counts (not the hardcoded47/500)/app/agentis gone (no longer in nav)Known follow-ups (separate PRs)
copyToClipboard()helper withexecCommandfallback for HTTP/Safari/billing/usage+/team/summaryendpoints with Redis cache + singleflight +Cache-Controlheaders per the new caching memory rule🤖 Generated with Claude Code