Perform Redesign — Feature Audit

ruthless audit
2026-05-18  ·  SHOTClubhouse/SHOTclubhouse @ feat/perform-redesign  ·  source: @liammcdow #2568 → #2581 (14 issues, all CLOSED except #2581)
87
Features extracted
across 14 issues
53
✓ Shipped
61% of total
17
⚠ Partial / un-tested
20% of total
17
✕ Not addressed
20% of total

Top 5 gaps — sorted by user-visible severity


1. Parent IDP — entire feature missing

#2581 OPEN
What ticket asked
Parent opens child's Development Report with period selector + share / print PDF. Spotlight entry “View [child's name]'s development →”. History tab “Generate report →” for parent.
What shipped
Nothing. ParentPerform.tsx contains zero IDP entry points. grep ParentIDPReport src/ → 0 hits.
Where it fails
AthleteIDPReport.tsx:34-35 hardcodes playerId = user?.id (parent's own ID, not child's). SpotlightTab.tsx:163 + PerformanceHistoryViewer.tsx:128 gate entry behind currentRole !== 'parent' / isSelfView.
Who feels it
Every parent user, free or paid. Whole feature missing.

2. Coach Team tab not redesigned

#2572 CLOSED
What ticket asked
Make Announcement at top + Team Development Report button. Flat alphabetical name+age-group list. Athlete sheet shows age-group label, guardian, message button (age-aware), last 5 attendance dots, trend.
What shipped
Same 48 KB TeamManagementTab.tsx with Team Settings edit, intensity controls, search, status badges, desktop table, inactive-athletes. Make Announcement is a toast.info() stub. AthleteDetailsBottomSheet missing every age-aware field.
Where it fails
TeamManagementTab.tsx (48 KB unchanged), TeamManagementTab.tsx:791 stub, AthleteDetailsBottomSheet.tsx:206-260 (no age/guardian/message/attendance/trend).
Who feels it
Every coach on every team. Looks identical to legacy. Make Announcement does nothing.

3. Admin tab is a deep-link hub, not real admin

#2574 CLOSED
What ticket asked
Team Settings inline edit · Player Intensity toggles per athlete · Framework explorer · Manage Clubs. All four as inline content, not nav cards.
What shipped
AdminTab.tsx:67-122 — 4 navigation cards. Each one history.push'es back to Team tab or toasts “coming soon”. Framework buttons trigger stubFrameworkChange. No ExplorePerform.tsx exists.
Where it fails
AdminTab.tsx:80-86 literally reads “Currently lives in the Team tab; will move here in a follow-up” — despite bead eo7l.26 being marked CLOSED.
Who feels it
Any coach exploring the Admin tab. Tap a section → bounced back to Team tab or “coming soon” toast. Feels broken.

4. Language audit never adopted by UI

#2573 CLOSED
What ticket asked
Replace “Pre-Session / Post-Session / Coach Evaluation” with “Prepare / Reflect / Feedback” across all UI copy via central src/constants/evalTypes.ts.
What shipped
Constants file shipped (EVAL_TYPE_LABELS = {pre:'Prepare', post:'Reflect', coach:'Feedback'}). grep EVAL_TYPE_LABELS src/zero external consumers.
Where it fails
Old labels still in ≥ 12 active code paths: createEvent.tsx:651, EventDetails.tsx:578, QuickAddEventPage.tsx:442, CreateEventFormSection.tsx:462-489, EventCardSection.tsx:502, CoachEvaluationTab.tsx, CoachFeedbackViewTab.tsx:460, MemberEventDetails.tsx:1084,1110, PostEvalJourney.tsx:260,266, PerformanceChart.tsx:20-21, ShadowEventDetailCard.tsx:129, ShadowEventCard.tsx:903.
Who feels it
Anyone creating or viewing an event sees “Pre-Session Evaluation”/“Coach Score”, contradicting the Spotlight + Report rename. Rebrand looks half-finished.

5. Coach Spotlight Recent Events — no quick actions

#2569 CLOSED
What ticket asked
Quick actions on Recent Event cards: Update Scorers · Add Commentary · Make Announcement — so post-event tasks don't require drilling in.
What shipped
RAG left-border on Recent Event cards (good). Zero quick-action buttons.
Where it fails
grep -i "scorers|commentary|announcement" in StandardEventCard.tsx + CoachSpotlightTab.tsx = 0 hits.
Who feels it
Every coach on the first screen they land on. They still drill into event detail for the 3 most common post-event tasks.

Per-issue snapshot — 14 issues, traffic-light


Issue Title
#2568Coach Perform: 5-tab bottom nav (Pulse-V2 pattern)410
#2569Coach Spotlight redesign441
#2570Coach Events: search + upcoming/past402
#2571Coach History: match stats + framework gaps420
#2572Coach Team: roster + IDP + age-aware contact333
#2573Language audit: Pre/Post/Coach → Prepare/Reflect/Feedback214
#2574Coach Admin: team settings + intensity + framework + clubs223
#2575Athlete & Parent Perform: 4-tab bottom nav410
#2576Athlete & Parent Spotlight declutter711
#2577Athlete & Parent Events: search + split700
#2578Athlete & Parent History: stats + framework grid601
#2579Athlete IDP: real data into Development Report710
#2580Athlete & Parent Team tab: teammates + coach info720
#2581Parent IDP: view child's report (OPEN)006

Visual — ✓ / ⚠ / ✕ per issue


Total ✓ shipped ⚠ partial ✕ missing #2568 4 · 1 · 0 #2569 4 · 4 · 1 #2570 4 · 0 · 2 #2571 4 · 2 · 0 #2572 3 · 3 · 3   « Coach Team gap #2573 2 · 1 · 4   « Language audit gap #2574 2 · 2 · 3   « Admin tab gap #2575 4 · 1 · 0 #2576 7 · 1 · 1 #2577 7 · 0 · 0 #2578 6 · 0 · 1 #2579 7 · 1 · 0 #2580 7 · 2 · 0 #2581 0 · 0 · 6   « Parent IDP (still OPEN)
Each row is one issue. Bar shows shipped / partial / missing feature count. Three inline callouts mark the rows driving the report's headlines.

Process flags — closed beads that didn't actually close


FALSE CLOSE
shotclubhouse-ag-eo7l.26lift Player Intensity to AdminTab. Code state contradicts: AdminTab.tsx:80-86 still defers to Team tab. · Coach Admin section, P2
FALSE CLOSE
shotclubhouse-ag-eo7l.11B6 Coach Team tab. Closed with 4+ TODOs explicitly surfaced in epic close-reason as “KNOWN FOLLOW-UPS”. · Coach Team tab, P1 surface
FALSE CLOSE
shotclubhouse-ag-eo7l.20B7 Coach Admin. Closed as navigation hub, not admin surface; no ExplorePerform.tsx ever created. · Coach Admin tab, P2
FALSE CLOSE
shotclubhouse-ag-eo7l.21B12 Athlete IDP. Athlete self-view works, but parent self-view path was explicitly punted (matches #2581 still being OPEN). · Parent IDP, P0
CI BLIND
Zero new Playwright specs for the Perform Redesign. Vitest only covers data-layer hooks (5 new) + pgTAP for the 4 new RPCs. Visual + flow regressions invisible to the pipeline — the 17 ✕ and 17 ⚠ above would not surface in CI.

Triage rubric — map a user-reported flaw in 30 seconds


When Stevie reports a flaw, run through this rubric in order. Each step gives you a concrete artifact to act on.

  1. Match the surface to an issue. Is it on the Coach side or Athlete/Parent side? Is it Spotlight / Events / History / Team / Admin? Map to one of #2568–#2581 using the per-issue table above.
  2. Find the feature row in the audit. Open .agents/scratch/perform-feature-audit.md, jump to the issue's sub-table, find the closest feature description. Status column tells you ✓/⚠/✕ and code site.
  3. If ✕ or ⚠, check the bead. bd show shotclubhouse-ag-eo7l.<N>. If marked CLOSED falsely, reopen with bd update <id> --status=open --notes="reopened per audit — <reason>".
  4. Find the code site to fix. The audit's “Code evidence” column already has file:line refs. Open in editor, write the fix.
  5. Write the test that would have caught it. Audit's “Tests” column reads “None” for almost every row. Each fix lands with a Playwright spec or vitest test so the same flaw can't slip again. Add to playwright/tests/perform/<area>.spec.ts (create if missing).
  6. If the audit says the feature shipped (✓) but Stevie's still seeing a flaw, the audit is wrong — re-grep with broader patterns. Update the audit row to ⚠ + add the new finding to the gap list at the top.