From fc42afe89ee54e1cd4fd78a973c2350c7a59b237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20LAGACHE?= Date: Fri, 19 Jun 2026 15:41:27 +0200 Subject: [PATCH] docs(sdd): append hotfix summary for applyMutation and list keys --- .superpowers/sdd/task-4-report.md | 47 +++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 .superpowers/sdd/task-4-report.md diff --git a/.superpowers/sdd/task-4-report.md b/.superpowers/sdd/task-4-report.md new file mode 100644 index 00000000..4efd2100 --- /dev/null +++ b/.superpowers/sdd/task-4-report.md @@ -0,0 +1,47 @@ +# Task 4 Report — StepDbSettings Rewrite + +## Status: DONE_WITH_CONCERNS + +## Commit: d309faf + +## TSC Summary +Zero new errors introduced in `step-db-settings.tsx`. All pre-existing errors in the repo are unrelated (in `form.tsx`, `toaster.tsx`, `channel-form.tsx`, `database-form.action.ts`, etc.). + +## What Was Done +Replaced the placeholder implementation of `StepDbSettings` (~91 lines, only retention days + apply-to-all switch) with the full three-level phase navigation component (~1050 lines): + +- **Phase: grid** — lists all project databases with "Configured" badge when any section is set +- **Phase: db** — shows 4 section cards (Retention, Scheduling, Notifications, Storage) with per-section ✓ indicators and "Apply to all" button +- **Phase: section** — renders the appropriate inline section form + +All 4 sections implemented inline (no dashboard component imports): +- `RetentionSection`: count / days / GFS with storage impact estimate +- `SchedulingSection`: delegates to `BackupScheduleSelector` +- `NotificationsSection`: multi-policy, `MultiSelect` for events, empty-state when no notifiers +- `StorageSection`: multi-policy, empty-state when no storages + +Save flow: calls `applyOnboardingDbSettingsAction` → on success calls `updateDbSettings(dbId, patch)` → toast → phase back to db. + +"Apply to all": loops over other DB IDs, calls action with `section: "all"` for each, batch-updates context, shows toast, navigates to grid. + +## Concerns +1. **Type cast on `notificationPolicies`**: `OnboardingNotificationPolicy.eventKinds` is typed as `string[]` but the action's Zod schema uses a specific enum union. Two `as any` casts were added at action call sites to bridge the mismatch. The runtime is safe (Zod validates and rejects invalid values), but the type inconsistency between `types/index.ts` and `apply-db-settings.action.ts` should be resolved by tightening `OnboardingNotificationPolicy.eventKinds` to the same enum type as the action's `EventKindSchema`. + +2. **No browser test performed**: manual verification steps from the brief (Steps 3–5) were not executed as they require a running dev server and live DB. The component logic follows the brief exactly. + +--- + +## Hotfix Follow-up Commit: a6e528d + +Fixed two critical issues: + +1. **Wire `applyMutation.mutateAsync` everywhere** (5 sites): + - Replaced all direct `applyOnboardingDbSettingsAction(...)` calls with `await applyMutation.mutateAsync(...)` + - Removed `if (result?.data?.success)` guards since mutateAsync throws on error + - Mutation's `onError: () => toast.error(...)` handles failures + +2. **Stabilize list keys**: + - NotificationsSection: changed `key={index}` to `key={policy.channelId || index}` + - StorageSection: changed `key={index}` to `key={policy.channelId || index}` + +TypeScript: Zero new errors in target file. Pre-existing errors in form.tsx, toaster.tsx, channel-form.tsx (unrelated).