diff --git a/docs/superpowers/specs/2026-06-12-surface-filterable-reflection-design.md b/docs/superpowers/specs/2026-06-12-surface-filterable-reflection-design.md new file mode 100644 index 0000000..623d3f5 --- /dev/null +++ b/docs/superpowers/specs/2026-06-12-surface-filterable-reflection-design.md @@ -0,0 +1,76 @@ +# Surface filterable reflection (Phase 2, piece A) + +**Date:** 2026-06-12 +**Status:** Approved + +## Problem + +The team's highest-value reflection feature — filterable LLM synthesis +("What's the status of Madrid?") — is buried in the middle of the `/review` +(Health) page as `ReflectionSection`. Meanwhile the nav's `/reflect` page is a +structured session ritual (convergence sparklines + guided-question textareas + +decisions log) whose textareas are the "homework" the primary user pushed back +on. The killer feature is behind the wrong door. + +## Goal + +Make `/reflect` the filterable reflection tool, and make `/review` (Health) a +focused review surface. + +## Changes + +### `/reflect` — becomes the filterable reflection tool + +- `src/app/reflect/page.tsx` (server): fetch the scope filter lists — `sites`, + `options`, `goalSpaces` — using the same queries currently in + `src/app/review/page.tsx`. Pass them to the client. Drop the `lastSession` + fetch. +- `src/app/reflect/ReflectClient.tsx`: rewritten to the filterable reflection + UI — a scope ` + + {goalSpaces.length > 0 && ( + + {goalSpaces.map(g => ( + + ))} + + )} + {sites.length > 0 && ( + + {sites.map(s => ( + + ))} + + )} + {options.length > 0 && ( + + {options.map(o => ( + + ))} + + )} + ) : ( -
- {goalSpaces.map(gs => ( -
-

{gs.title}

- -

- Score: {sparklineData[gs.id]?.latest?.score?.toFixed(1) ?? '---'} -

-
- ))} -
- )} - - - {/* Section 2: Guided Questions */} -
-

Reflection Questions

-
- {REFLECTION_QUESTIONS.map(q => ( -
- -