19 KiB
Session log
This file tracks work completed across Claude Code sessions. Every agent MUST read this file before starting work and update it after completing work.
Earlier sessions (2026-03-24 through 2026-03-26d) archived in
docs/memory/archive/sessions-through-2026-03-26.md
Format
Each entry follows this structure:
### Session [date] — [brief description]
**Agent(s):** [which agents were active]
**Work completed:**
- [bullet points of what was done]
**Decisions made:**
- [any design/architecture decisions with brief rationale]
**Open questions:**
- [anything unresolved that needs human input]
**Next steps:**
- [what should happen next]
Sessions
Session 2026-03-29c — Grooming pass: critique/harden/polish all 15 steps
Agent(s): Claude Opus 4.6 (1M context)
Work completed:
- Full grooming pass across all 15 wizard steps — applied critique (UX design review), harden (edge cases/error states), and polish (visual alignment/copy/code) frameworks.
- [P0] CrematoriumStep bug fix:
<option>elements replaced with<MenuItem>— the MUI<TextField select>requires MenuItem children, not native option elements. The priority dropdown was non-functional. - [P1] Double-submit prevention: Added
if (!loading) onContinue()guard to all formonSubmithandlers across steps 1, 5, 6, 7, 8, 9, 10, 11, 12, 14 (10 steps with forms). Prevents keyboard Enter re-submission during async loading. - [P1] Accessibility — aria-busy: Added
aria-busy={loading}to all form elements so screen readers announce processing state. - [P1] Error colour normalisation: Replaced
color="error"(red #BC2F2F) withvar(--fa-color-text-brand)(copper #B0610F) across 7 steps (ProvidersStep, PackagesStep, VenueStep, CrematoriumStep, CemeteryStep, CoffinsStep, PaymentStep). Per D024, FA uses warm copper for errors rather than aggressive red. - [P2] Grief-sensitive copy: "Has the person died?" → "Has this person passed away?" (IntroStep). "About the person who died" → "About the person who has passed" (DateTimeStep).
- [P2] Results count copy: "Showing results from X providers" → "X providers found" (ProvidersStep).
- [P2] Empty state guidance: Added actionable guidance text to empty states in ProvidersStep, PackagesStep, VenueStep, CoffinsStep ("Try adjusting..." copy).
- Steps that passed with no issues: PreviewStep (4), SummaryStep (13), ConfirmationStep (15) — all clean.
- IntroStep critique score: 35/40 (Good) — full heuristic scoring completed as reference.
- D034 implemented: Form error styling unified to copper end-to-end. MuiOutlinedInput error border/ring, MuiFormHelperText error text, MuiFormLabel error state (neutral per D024), ToggleButtonGroup error border — all now use copper (#B0610F).
palette.error.mainremains red for non-form uses. - Tagged
v0.1-wizard-groomed— safe rollback point before user review checkpoint. - Roadmap documented in persistent memory (
project_roadmap.md) with 9 phases, checkpoint gates, and guiding principles.
Decisions made:
- D034: Form error styling uses copper across theme (MuiOutlinedInput, MuiFormHelperText, MuiFormLabel, ToggleButtonGroup).
palette.error.mainstays red for destructive buttons/system alerts. - User review checkpoint required before integration — tagged
v0.1-wizard-groomedas rollback point.
Open questions:
- None
Next steps:
- Phase 4: User review checkpoint — user reviews all 15 steps in Storybook, provides feedback, agent iterates
- Phase 5: Retroactive review backlog (can interleave with Phase 4)
- Phase 6: Integration planning (after checkpoint resolved)
Session 2026-03-29b — Wizard steps 5-15 (complete flow)
Agent(s): Claude Opus 4.6 (1M context)
Work completed:
- Step 5 — AuthGateStep: Centered-form, 3 progressive sub-steps (SSO/email → details → verify). Phone optional when email-only. Benefit framing ("Save your plan"). Audit 18/20, P1 fixed (responsive name fields).
- Step 6 — DateTimeStep: Centered-form, two fieldset sections (name + scheduling). Grief-sensitive labels ("Their first name"). Date/time radios + Autocomplete for religion (22 options). Save-and-exit CTA.
- Step 7 — VenueStep: Venue card grid (1-2 col) with search/filters. Inline venue detail (Collapse) with features + religions. Service toggles (photo, streaming, recording) via AddOnOption. VenueCard extended with selected + ARIA passthrough props.
- Step 8 — CrematoriumStep: Single crematorium confirmation card (most common) or multi-card grid. Witness question personalised with deceased name. Special instructions via progressive disclosure textarea.
- Step 9 — CemeteryStep: Triple progressive disclosure (have plot? → choose cemetery? → card grid). Dependent field resets. "Provider can arrange this" shortcut.
- Step 10 — CoffinsStep: 3-col card grid with category/price filters. "Most Popular" badge (Rec #10). Pagination support. Australian terminology ("coffin").
- Step 11 — CoffinDetailsStep: Coffin profile (image + specs grid) + 3 product option RadioGroups (handles, lining, nameplate) with branded selected state. Price: "Included" or "+$X".
- Step 12 — AdditionalServicesStep: Merged from optionals + extras (Rec #2). Section 1: complimentary (dressing, viewing, prayers, announcement). Section 2: paid (catering, music, bearing, newspaper). Multi-level progressive disclosure.
- Step 13 — SummaryStep: Accordion sections with edit buttons, dl/dt/dd definition lists, total bar (aria-live), share button. Pre-planning: "Save your plan" / at-need: "Confirm".
- Step 14 — PaymentStep: ToggleButtonGroup for plan (full/deposit) + method (card/bank). PayWay iframe slot. Bank transfer details display. Terms checkbox. Security reassurance.
- Step 15 — ConfirmationStep: Terminal page, no back/progress. At-need: "submitted" + callback info. Pre-planning: "saved" + return-anytime. Muted success icon, next-steps links.
Approach: Same as previous session — first pass build + quick audit + P0/P1 fixes only. Grooming pass comes later.
- Layout fixes: Corrected 3 steps that had wrong WizardLayout variants:
- VenueStep: centered-form → list-map (venue cards left, map slot right — matches ProvidersStep)
- CoffinsStep: centered-form → grid-sidebar (filter sidebar left, card grid right)
- CoffinDetailsStep: centered-form → detail-toggles (coffin profile left, option selectors right)
Decisions made:
- VenueCard extended with selected/ARIA props (same pattern as ProviderCard from step 2)
- CoffinDetailsStep uses OptionSection helper component for DRY RadioGroup rendering
- SummaryStep uses Accordion not Paper for sections (per spec's collapsible requirement)
- PaymentStep uses slot pattern for PayWay iframe (cardFormSlot prop)
Open questions:
- None
Next steps:
- All 15 wizard steps are now first-pass complete (steps 1-15) with correct layouts
- Grooming pass: /critique, /harden, /polish, /normalize across all steps
- Retroactive review backlog still pending
- Integration: routing, state management, GraphQL queries
Session 2026-03-29 — Wizard Phase 0 through Phase 4 (foundation + steps 1-4)
Agent(s): Claude Opus 4.6 (1M context)
Work completed:
- Phase 0 — Foundation components:
- WizardLayout template: 5 layout variants, nav slot, sticky help bar, back link, progress stepper + running total,
<main>landmark - Collapse atom: thin MUI Collapse wrapper with unmountOnExit
- ToggleButtonGroup atom: exclusive single-select with fieldset/legend a11y, FA brand styling
- WizardLayout template: 5 layout variants, nav slot, sticky help bar, back link, progress stepper + running total,
- Phase 1 — IntroStep (step 1):
- Centered-form layout, forWhom + hasPassedAway with progressive disclosure
- Auto-sets hasPassedAway="no" for "Myself", grief-sensitive copy adapts
- Audit 18→20/20 after fixes (
<main>landmark,<form>wrapper)
- Phase 2 — ProvidersStep (step 2):
- List-map split: provider cards w/ radiogroup + search + filter chips (left), map slot (right)
- ProviderCard extended with selected prop + HTML/ARIA passthrough
- Audit 18/20, P1 fixed (radio on focusable Card)
- Phase 3 — PackagesStep (step 3):
- List-detail split: ProviderCardCompact + budget filter + ServiceOption list (left), PackageDetail (right)
- "Most Popular" badge, mobile Continue button
- Phase 4 — PreviewStep (step 4):
- Informational review, "What happens next" numbered checklist
- Pre-planning variant shows "Explore other options" tertiary CTA
Approach: First pass of all steps (build + quick audit + P0/P1 fixes only), then grooming pass (critique/harden/polish/normalize) across the full flow.
Decisions made:
- Templates at
src/components/templates/, Pages atsrc/components/pages/ - ProviderCard/ServiceOption: ARIA passthrough for radiogroup patterns
- First-pass approach: build all steps, then groom — user confirmed
Open questions:
- None
Next steps:
- Step 5 (Auth Gate) — centered-form layout, account creation/login
- Continue through remaining steps (6-18)
- Retroactive review backlog still pending
Session 2026-03-27b — Retroactive review Phase 1 + 2.1, wizard planning
Agent(s): Claude Opus 4.6 (1M context)
Work completed:
- Retroactive review (morning housekeeping):
- Phase 1.1: Atoms normalize — 3 fixes (Input spacing, Card focus token, unused import)
- Phase 1.2: Atom audits — Button 20/20, Input 20/20, Card 18→20/20 (2 P1 fixes: keyboard activation + responsive padding)
- Phase 2.1: Molecules normalize — 7 fixes (StepIndicator timing/spacing/font, ProviderCardCompact star colour + icon size)
- Wizard flow documentation review:
- Read flow-spec.md (854 lines), flow-definition.yaml (616 lines), 3 representative step YAMLs
- Saved reference memories for flow documentation structure and project context
- Layout analysis:
- Analysed 5 layout reference images in /documentation/layouts/
- Identified 5 layout variants: Centered Form, List+Map, List+Detail, Grid+Sidebar, Detail+Toggles
- Mapped each layout to specific wizard steps
- Saved layout reference to memory
- Implementation plan:
- Created comprehensive plan at .claude/plans/validated-brewing-matsumoto.md
- Phase 0 (foundation): WizardLayout template, Collapse atom, ToggleButtonGroup atom
- Phases 1–7: Steps in build order with component dependencies
- ~11 new components, ~16 sessions estimated
- Plan approved by user, updated with layout variants
Decisions made:
- Step pages live at
src/components/pages/(new atomic tier) - CardSelectionGrid extracted after step 3 (not upfront)
- Build from specs, Figma for structural shape only
- Steps are pure presentation (props in, callbacks out) — no routing/state/GraphQL yet
Open questions:
- Hardcoded fontWeight on price typography varies across molecules — still unresolved from normalize
Next steps:
- Start Phase 0: Build WizardLayout template (5 variants), Collapse atom, ToggleButtonGroup atom
- Then Phase 1: Step 1 (Intro) — first wizard step
Session 2026-03-27b (earlier) — Retroactive review Phase 1 + 2.1
Agent(s): Claude Opus 4.6 (1M context)
Work completed:
- Phase 1.1 — Atoms normalize: Scanned all 11 atoms across 7 dimensions. Fixed 3 issues: Input raw px spacing → MUI units, Card focus-visible token → CSS var, removed unused Theme import.
- Phase 1.2 — Atom audits (high priority): Button 20/20, Input 20/20, Card 18/20 → fixed 2 P1s → 20/20.
- Card P1 fix: Added Enter/Space keyboard activation for interactive cards (WCAG 2.1.1)
- Card P1 fix: Responsive padding — 16px mobile / 24px desktop (convention alignment)
- Phase 2.1 — Molecules normalize: Scanned all 8 molecules across 7 dimensions. Fixed 7 issues:
- StepIndicator: transition 300ms → 150ms, raw px → MUI spacing, borderRadius → token, mobile font 10px → 11px (D020 floor)
- ProviderCardCompact: star colour → warning.main (match ProviderCard), meta icon 16px → 14px (match tier)
Decisions made:
- None (all fixes are convention enforcement, no new decisions)
Open questions:
- Hardcoded fontWeight on price typography varies across molecules (500 vs 600) — intentional design variation or normalize?
- Remaining atom audits (Typography, Badge, Chip, Switch, Radio, IconButton, Divider, Link) — all low/medium priority wrappers, likely 20/20. Run if time permits.
Next steps:
- Phase 2.2: Audit priority molecules (ServiceOption, AddOnOption, ProviderCardCompact)
- Phase 3: Organisms normalize + audit (Navigation, ServiceSelector, FuneralFinderV3)
- Phase 4: Cross-cutting (adapt, typeset, preflight)
- New component work as user directs
Session 2026-03-27a — Workflow improvement (5-phase infrastructure upgrade)
Agent(s): Claude Opus 4.6 (1M context)
Work completed:
- Phase 1A: Archived session log — moved 25 old sessions to
docs/memory/archive/sessions-through-2026-03-26.md, trimmed active log from 1096 to 91 lines - Phase 1B: Documented token access convention as D031 —
theme.palette.*for semantic tokens,var(--fa-*)for component tokens. Fixed Badge.tsx colour map inconsistency (unified to CSS vars). Updated component-conventions.md. - Phase 2: Added ESLint v9 (flat config) + Prettier. Installed
eslint,@eslint/js,typescript-eslint,eslint-plugin-react,eslint-plugin-react-hooks,eslint-plugin-jsx-a11y,eslint-config-prettier,prettier. Ran initial format pass across all 54 .tsx files. Fixed 5 empty interface warnings (Switch, Radio, Divider, IconButton, Link). Addedlint,lint:fix,format,format:checkscripts. - Phase 3: Created 7 new impeccable-adapted skills:
/polish,/harden,/normalize,/clarify,/typeset,/quieter,/adapt. Downloaded Vercel reference docs (web-design-guidelines, react-best-practices). Updated/auditand/review-componentwith optional Vercel references. Total skills: 19. - Phase 4: Added Husky v9 + lint-staged for pre-commit automation. ESLint + Prettier auto-run on staged files. Updated
/preflightskill with ESLint and Prettier checks (now 8 checks total). - Phase 5: Added Vitest v4 + jsdom + @testing-library/react. Created
vitest.config.tsand test setup. Created/write-testsskill for test generation guidance. Addedtestandtest:watchscripts. Note:@storybook/test-runnerdeferred — requires Storybook 10+ (we have 8).
Decisions made:
- D031: Token access convention — theme accessors for semantic, CSS vars for component (see decisions-log)
- ESLint story files exempt from
react-hooks/rules-of-hooksandno-console(Storybook render pattern) - Empty
interface extendschanged totype =for ESLint compliance (5 wrapper atoms) - Storybook test-runner deferred until Storybook upgrade to v10
- Prettier printWidth set to 100 (matching observed code style)
Also completed:
- Created
docs/reference/component-lifecycle.md— 10-stage quality gate sequence (build → QA → polish → present → iterate → normalize → preflight → commit) - Created
docs/reference/retroactive-review-plan.md— plan to review 30+ existing components (~3.5 sessions) - Updated
/build-atom,/build-molecule,/build-organismto include internal QA stages automatically - Added lifecycle reference as CLAUDE.md critical rule #8
Open questions:
- Storybook upgrade to v10 — would unlock
@storybook/test-runnerfor CI test execution - FuneralFinder version decision (v1/v2/v3) — needed before retroactive review of organisms
- Review depth — P0/P1 only (faster) or include P2?
Next steps (pick up in next session):
- Start retroactive review:
/normalize atoms→/audithigh-priority atoms - Interleave with new component work if preferred
- Use
/write-testson interactive components as time permits
Session 2026-03-26f — FuneralFinder v3 build + polish
Agent(s): Claude Opus 4.6 (1M context)
Work completed:
- Created FuneralFinderV3 — clean vertical form based on user's Figma layout (5919:29445), restyled to FA design system
- Two side-by-side StatusCards (Immediate Need default-selected / Pre-planning), stack on mobile
- Standard card container (surface.raised, card shadow) — initially built with glassmorphism, user redirected to standard palette
- Overline section labels (text.secondary) for "How Can We Help", "Funeral Type", "Location"
- Standard outlined fields (white bg, neutral border, brand border on focus, no focus ring per user request)
- Location input with LocationOnOutlined pin icon
- CTA "Find Funeral Directors →" always active — validates on click, scrolls to first missing field
- Dividers after header and before CTA for visual rhythm
- Funeral type options: same as V2 + "Show all options"
- WAI-ARIA roving tabindex on radiogroup, aria-labelledby via React.useId()
- Semantic tokens throughout (border-brand, surface-warm, text-brand, interactive-focus, text-disabled)
- Error messages conditionally rendered in aria-live regions (brand copper tone — gentle validation)
- First pass scored Critique 33/40, Audit 13/20 → iterated on all findings → re-audit 18/20
- Polish pass: revised copy, fixed spacing, defaults, label rename
Decisions made:
- Status cards replace V2's step-circle + dropdown — simpler, more visual, side-by-side on desktop
- Standard design system styling (user clarified Figma was for structure only, not colour scheme)
- "Immediate Need" selected by default — most common use case, status error essentially unreachable
- Section renamed from "Current Status" (programmatic) to "How Can We Help" (warm, human)
- Copy: "A recent loss or one expected soon" — "expected soon" differentiates from pre-planning gently
- Copy: "Planning ahead for yourself or a loved one" — "planning ahead" reinforces non-urgency
- No sequential unlock — all fields accessible immediately
- CTA always active — validates on click, scrolls to missing field
- Form simplified to 3 fields (status, funeral type, location) vs V2's 4
- Focus ring suppressed on Select/Input per user requirement — status cards retain focus-visible
- Error colour uses text.brand (copper) not feedback.error (red) — intentional for funeral context
Open questions:
- Location autocomplete integration still pending across all versions
- Decision: V1 vs V2 vs V3 for production
Next steps:
- User to review final V3 in Storybook
- If V3 chosen: location autocomplete, possible further refinements
Session 2026-03-26e — FuneralFinder v2 polish + consistency fixes
Agent(s): Claude Opus 4.6 (1M context)
Work completed:
- Fixed location input styling to match select fields (border color, hover, disabled, error states)
- Added
activeprop to StepCircle — step 1 uses brand-500 primary fill by default - Aligned Input with full selectSx overrides (bgcolor, disabled opacity+dashed, error border)
- Investigated systemic Input vs Select visual differences — confirmed issue is component-local overrides, not theme
Decisions made:
- Custom field styling kept within FuneralFinderV2 (intentional divergence from theme for this component's design)
- Step 1 circle uses primary fill since it's always active — visual "start here" signal
Next steps:
- v2 is feature-complete and polished — ready for user review in Storybook
- Decision pending: v1 vs v2 for production
- If v2 chosen: add location autocomplete, write flow logic reference doc