Skip to content

dashboard: truth pass — strip stubbed surfaces, ship reality#30

Merged
mastermanas805 merged 1 commit into
mainfrom
truth-pass/dashboard-2026-05-12
May 12, 2026
Merged

dashboard: truth pass — strip stubbed surfaces, ship reality#30
mastermanas805 merged 1 commit into
mainfrom
truth-pass/dashboard-2026-05-12

Conversation

@mastermanas805
Copy link
Copy Markdown
Member

Summary

  • Strip every user-flagged "this is a mock" surface across the dashboard
  • Ship the wave 1-3 agent work that was sitting uncommitted
  • Resolve the live URL complaint: /app/deployments no longer shows fake flashcards / marcus · 12m data — falls back to honest empty state when the api returns no stacks
  • 162 dashboard tests pass (was 90), 0 fail, tsc clean

Test plan

  • npx tsc --noEmit — clean
  • npm test -- --run — 162 passed, 3 skipped, 0 failed
  • Verify on https://instanode.dev/app/deployments after the GitHub Pages deploy completes — should show "No deployments yet" empty state, not the old flashcards · prod · 14:42:01 fixture rows
  • Verify /app/billing Usage section reflects real resource counts (not the hardcoded 47/500)
  • Verify /app/agent is gone (no longer in nav)
  • Verify ExpiryWarningBanner appears at top of any page when a free-tier resource is <6h from TTL

Known follow-ups (separate PRs)

  • §10.10 — single copyToClipboard() helper with execCommand fallback for HTTP/Safari
  • §10.20 — server-side /billing/usage + /team/summary endpoints with Redis cache + singleflight + Cache-Control headers per the new caching memory rule
  • §10.21 — finish FIXTURE_* fallback removal across remaining paths (vault, billing 503, activity, getStack)

🤖 Generated with Claude Code

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>
@mastermanas805 mastermanas805 merged commit 68813cd into main May 12, 2026
2 checks passed
@mastermanas805 mastermanas805 deleted the truth-pass/dashboard-2026-05-12 branch May 12, 2026 02:07
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