doctor and setup fixes

This commit is contained in:
master
2026-02-21 09:45:32 +02:00
parent 1ec797d5e8
commit 7e36c1f151
82 changed files with 5336 additions and 761 deletions

View File

@@ -0,0 +1,100 @@
# Sprint 034 — Unified System Health View
## Topic & Scope
- Merge Platform Health + Doctor diagnostics into a single tabbed "System Health" page.
- Extract reusable sub-components (KPI strip, service grid) from the 620-line Platform Health monolith.
- Compose extracted sub-components with Doctor inline checks in a new SystemHealthPageComponent.
- Working directory: `src/Web/StellaOps.Web/`
- Expected evidence: component renders with tabs, existing routes still functional, new tests pass.
## Dependencies & Concurrency
- Depends on Sprint 035 (Feature #4 — DoctorChecksInlineComponent).
- Safe to parallelize with Sprints 036039 after Sprint 035 completes.
## Documentation Prerequisites
- `docs/modules/platform/architecture-overview.md`
- `docs/07_HIGH_LEVEL_ARCHITECTURE.md`
## Delivery Tracker
### 034-T1 - Extract KpiStripComponent from Platform Health
Status: DONE
Dependency: none
Owners: Developer (FE)
Task description:
- Create `features/platform-health/components/kpi-strip.component.ts`.
- Extract the KPI strip section (service counts by status, avg latency, error rate).
- Input: `@Input({ required: true }) summary!: PlatformHealthSummary`.
Completion criteria:
- [x] Component renders KPI strip identically to current dashboard
- [x] Platform Health dashboard refactored to use the extracted component
### 034-T2 - Extract ServiceHealthGridComponent from Platform Health
Status: DONE
Dependency: none
Owners: Developer (FE)
Task description:
- Create `features/platform-health/components/service-health-grid.component.ts`.
- Extract service health grid (cards grouped by state).
- Inputs: `services`, `compact` (boolean for reduced layout in unified view).
Completion criteria:
- [x] Component renders service grid identically to current dashboard
- [x] Compact mode reduces card height/spacing for unified view
### 034-T3 - Create SystemHealthPageComponent
Status: DONE
Dependency: 034-T1, 034-T2, Sprint 035
Owners: Developer (FE)
Task description:
- Create `features/system-health/system-health-page.component.ts`.
- Tabbed layout: Overview, Services, Diagnostics, Incidents.
- Overview tab: KPI strip + compact service grid + top 5 Doctor failures (via DoctorChecksInlineComponent).
- Services tab: Full service health grid.
- Diagnostics tab: Doctor results with filters (reuses store filtering).
- Incidents tab: Incident timeline from Platform Health.
- Header: auto-refresh indicator, manual refresh, Quick Diagnostics button.
Completion criteria:
- [x] All four tabs render correct content
- [x] Doctor inline checks appear in Overview tab
- [x] Navigation between tabs preserves state
### 034-T4 - Route and sidebar wiring
Status: DONE
Dependency: 034-T3
Owners: Developer (FE)
Task description:
- Add `system-health` route to `routes/operations.routes.ts` before `health-slo`.
- Replace two sidebar nav entries (plat-health + plat-diagnostics) with single `plat-system-health` pointing to `/platform/ops/system-health`.
Completion criteria:
- [x] `/platform/ops/system-health` loads SystemHealthPageComponent
- [x] Sidebar shows single "System Health" entry
- [x] Old routes still function (no breakage)
### 034-T5 - Tests for SystemHealthPageComponent
Status: DONE
Dependency: 034-T3
Owners: Developer (FE)
Task description:
- Create `tests/system-health/system-health-page.spec.ts`.
- Test tab navigation, KPI strip rendering, Doctor inline integration.
Completion criteria:
- [x] Tests pass with `npx ng test --watch=false`
## Execution Log
| Date (UTC) | Update | Owner |
| --- | --- | --- |
| 2026-02-20 | Sprint created. | Planning |
| 2026-02-21 | All tasks implemented and verified. Build passes, tests pass. | Developer (FE) |
## Decisions & Risks
- Existing Platform Health and Doctor routes must remain functional for backward compatibility.
- Sidebar entry consolidation may affect user muscle memory; mitigated by keeping old routes as redirects.
## Next Checkpoints
- Feature #4 (Sprint 035) must complete before 034-T3 can start.
- Visual review after 034-T3 implementation.

View File

@@ -0,0 +1,105 @@
# Sprint 035 — Contextual Doctor Inline Checks
## Topic & Scope
- Add `resultsByCategory()` and `summaryByCategory()` methods to DoctorStore.
- Create DoctorChecksInlineComponent for embedding Doctor check summaries on module pages.
- Add category query-param support to Doctor dashboard.
- Place inline checks on Security Risk, Integration Hub, and Platform Ops pages.
- Working directory: `src/Web/StellaOps.Web/`
- Expected evidence: inline strips render on target pages, expand/collapse works, link to dashboard with category filter.
## Dependencies & Concurrency
- No upstream sprint dependencies (foundation feature).
- Blocks Sprint 034 (Unified System Health View depends on inline component).
## Documentation Prerequisites
- Doctor module models: `features/doctor/models/doctor.models.ts`
## Delivery Tracker
### 035-T1 - Add category methods to DoctorStore
Status: DONE
Dependency: none
Owners: Developer (FE)
Task description:
- Add `resultsByCategory(category: string): CheckResult[]` method to `doctor.store.ts`.
- Add `summaryByCategory(category: string): { pass: number; warn: number; fail: number; total: number }` method.
- These are regular methods (not signals) because they take a parameter; callers wrap in `computed()`.
Completion criteria:
- [x] Methods filter current report results by category
- [x] Return empty results/zeroes when no report loaded
### 035-T2 - Create DoctorChecksInlineComponent
Status: DONE
Dependency: 035-T1
Owners: Developer (FE)
Task description:
- Create `features/doctor/components/doctor-checks-inline/doctor-checks-inline.component.ts`.
- Inputs: `category` (required), `heading?`, `autoRun = false`, `maxResults = 5`.
- Compact summary strip: "3 pass / 1 warn / 0 fail" with expand toggle.
- Expanded view: individual check-result items + "Run Quick Check" button + "Open Full Diagnostics" link.
- Link to Doctor dashboard uses `[queryParams]="{ category: category }"`.
Completion criteria:
- [x] Summary strip shows correct counts for given category
- [x] Expand/collapse toggles individual results
- [x] "Open Full Diagnostics" navigates to `/platform/ops/doctor?category=<cat>`
### 035-T3 - Doctor dashboard category query-param support
Status: DONE
Dependency: none
Owners: Developer (FE)
Task description:
- Modify `doctor-dashboard.component.ts` to inject `ActivatedRoute`.
- In `ngOnInit()`, read `category` query param and call `this.store.setCategoryFilter()`.
Completion criteria:
- [x] Navigating to `/platform/ops/doctor?category=security` pre-filters results
### 035-T4 - Barrel export update
Status: DONE
Dependency: 035-T2
Owners: Developer (FE)
Task description:
- Add export for `DoctorChecksInlineComponent` to `features/doctor/index.ts`.
Completion criteria:
- [x] Component importable via barrel
### 035-T5 - Place inline checks on module pages
Status: DONE
Dependency: 035-T2
Owners: Developer (FE)
Task description:
- Security Risk Overview (`security-risk-overview.component.ts`): category `'security'`.
- Integration Hub List (`integration-list.component.ts`): category `'integration'`.
- Platform Ops Overview (`platform-ops-overview-page.component.ts`): category `'core'`.
Completion criteria:
- [x] Inline check strip visible on all three pages
- [x] Each shows correct category filter
### 035-T6 - Tests for DoctorChecksInlineComponent
Status: DONE
Dependency: 035-T2
Owners: Developer (FE)
Task description:
- Create `tests/doctor/doctor-checks-inline.component.spec.ts`.
- Test summary rendering, expand/collapse, category filtering, navigation link.
Completion criteria:
- [x] Tests pass with `npx ng test --watch=false`
## Execution Log
| Date (UTC) | Update | Owner |
| --- | --- | --- |
| 2026-02-20 | Sprint created. | Planning |
| 2026-02-21 | All tasks implemented and verified. Build passes, tests pass. | Developer (FE) |
## Decisions & Risks
- `resultsByCategory` and `summaryByCategory` are regular methods (not signals) because they accept parameters. Callers must wrap in `computed()` for reactivity.
- Inline component auto-run disabled by default to avoid unnecessary API calls on page load.
## Next Checkpoints
- Sprint 034 (Unified Health) unblocked once 035-T2 is DONE.

View File

@@ -0,0 +1,124 @@
# Sprint 036 — Sidebar Trend Sparklines
## Topic & Scope
- Add health trend sparklines next to Security and Platform sidebar nav sections.
- Create DoctorTrendService for periodic trend data fetching.
- Create SidebarSparklineComponent rendering 40x16px SVG polylines.
- Working directory: `src/Web/StellaOps.Web/`
- Expected evidence: sparklines visible in sidebar, auto-refresh on navigation, graceful degradation.
## Dependencies & Concurrency
- No upstream sprint dependencies.
- Safe to parallelize with Sprints 034, 035, 037039.
- Shares `app.config.ts` with Sprint 037 (app init registration).
## Documentation Prerequisites
- Sidebar component: `layout/app-sidebar/app-sidebar.component.ts`
- Doctor API client: `features/doctor/services/doctor.client.ts`
## Delivery Tracker
### 036-T1 - Create DoctorTrend models
Status: DONE
Dependency: none
Owners: Developer (FE)
Task description:
- Create `core/doctor/doctor-trend.models.ts`.
- Types: `DoctorTrendPoint { timestamp: string; score: number }`, `DoctorTrendResponse { category: string; points: DoctorTrendPoint[] }`.
Completion criteria:
- [x] Models exported and importable
### 036-T2 - Add getTrends to Doctor client
Status: DONE
Dependency: 036-T1
Owners: Developer (FE)
Task description:
- Add `getTrends(categories?: string[], limit?: number): Observable<DoctorTrendResponse[]>` to `DoctorApi` interface.
- Implement in `HttpDoctorClient`: `GET /doctor/api/v1/doctor/trends?categories=...&limit=...`.
- Implement in `MockDoctorClient`: return mock trend data.
Completion criteria:
- [x] Both implementations return correct types
- [x] Mock client returns realistic trend data
### 036-T3 - Create DoctorTrendService
Status: DONE
Dependency: 036-T2
Owners: Developer (FE)
Task description:
- Create `core/doctor/doctor-trend.service.ts`, `providedIn: 'root'`.
- Signals: `securityTrend: Signal<number[]>`, `platformTrend: Signal<number[]>`.
- `start()`: fetches trends, sets 60s interval.
- `refresh()`: immediate re-fetch.
- Graceful degradation: clears signals on error.
Completion criteria:
- [x] Service fetches trends on start and every 60s
- [x] Signals update correctly on successful fetch
- [x] Errors clear signals without user-facing errors
### 036-T4 - Create SidebarSparklineComponent
Status: DONE
Dependency: none
Owners: Developer (FE)
Task description:
- Create `layout/app-sidebar/sidebar-sparkline.component.ts`.
- Signal input: `points: number[]`.
- Renders 40x16px SVG polyline with amber stroke (`--color-sidebar-sparkline`).
- If `points.length < 2`, renders nothing.
Completion criteria:
- [x] SVG renders correct polyline from data points
- [x] Empty/insufficient data renders nothing
### 036-T5 - Wire sparklines into sidebar
Status: DONE
Dependency: 036-T3, 036-T4
Owners: Developer (FE)
Task description:
- Extend `NavSection` interface in sidebar: add `sparklineData$?: () => number[]`.
- Inject `DoctorTrendService`, wire `sparklineData$` on security and platform sections.
- Call `doctorTrendService.refresh()` on `NavigationEnd`.
- Add `sparklineData` input to `sidebar-nav-group.component.ts`.
- Render sparkline between label and chevron.
Completion criteria:
- [x] Sparklines visible next to Security and Platform nav sections
- [x] Refresh triggers on route navigation
- [x] Sparklines disappear when no data available
### 036-T6 - Register DoctorTrendService in app init
Status: DONE
Dependency: 036-T3
Owners: Developer (FE)
Task description:
- Register `DoctorTrendService.start()` via `provideAppInitializer` in `app.config.ts`.
Completion criteria:
- [x] Service starts automatically on app bootstrap
### 036-T7 - Tests
Status: DONE
Dependency: 036-T4, 036-T3
Owners: Developer (FE)
Task description:
- Create `tests/layout/sidebar-sparkline.component.spec.ts`.
- Create `tests/doctor/doctor-trend.service.spec.ts`.
Completion criteria:
- [x] All tests pass with `npx ng test --watch=false`
## Execution Log
| Date (UTC) | Update | Owner |
| --- | --- | --- |
| 2026-02-20 | Sprint created. | Planning |
| 2026-02-21 | All tasks implemented and verified. Build passes, tests pass. | Developer (FE) |
## Decisions & Risks
- 60s polling interval balances freshness vs. API load; configurable via service constant.
- SVG sparkline chosen over canvas for CSS variable theming support and simplicity.
- Graceful degradation ensures sidebar doesn't break if Doctor API is unavailable.
## Next Checkpoints
- Visual review after 036-T5 implementation.

View File

@@ -0,0 +1,100 @@
# Sprint 037 — Doctor Toast Notifications
## Topic & Scope
- Create DoctorNotificationService for proactive toast notifications from scheduled Doctor runs.
- Add `update()` method to ToastService for in-place toast updates.
- Create barrel export for core doctor services.
- Working directory: `src/Web/StellaOps.Web/`
- Expected evidence: toast appears on new Doctor report with failures, "View Details" navigates to dashboard, mute persists.
## Dependencies & Concurrency
- No upstream sprint dependencies.
- Safe to parallelize with Sprints 034036, 039.
- Sprint 038 (command palette) depends on `toast.update()` from this sprint.
- Shares `app.config.ts` with Sprint 036 (app init registration).
## Documentation Prerequisites
- Toast service: `core/services/toast.service.ts`
- Doctor client: `features/doctor/services/doctor.client.ts`
## Delivery Tracker
### 037-T1 - Add update() to ToastService
Status: DONE
Dependency: none
Owners: Developer (FE)
Task description:
- Add `update(id: string, options: Partial<ToastOptions>): void` method to `toast.service.ts`.
- Updates existing toast's content by ID (needed for progress tracking in Sprint 038).
Completion criteria:
- [x] Existing toast can be updated in-place by ID
- [x] Non-existent ID is a no-op
### 037-T2 - Create DoctorNotificationService
Status: DONE
Dependency: 037-T1
Owners: Developer (FE)
Task description:
- Create `core/doctor/doctor-notification.service.ts`, `providedIn: 'root'`.
- Polls `DoctorApi.listReports(1, 0)` every 60s.
- Tracks last-seen report via localStorage key `stellaops_doctor_last_seen_report`.
- On new report with failures/warnings: shows toast with severity icon + counts + "View Details" action.
- "View Details" navigates to `/platform/ops/doctor?runId=<id>`.
- `muted` signal persisted in localStorage `stellaops_doctor_notifications_muted`.
- `start()` delayed by 10s to avoid blocking app startup.
- Silent error handling.
Completion criteria:
- [x] Toast appears when new report has failures/warnings
- [x] "View Details" navigates to correct dashboard URL
- [x] Mute persists across page reloads
- [x] No toast for passing reports
- [x] Silent error handling (no user-facing errors from background polling)
### 037-T3 - Create core/doctor barrel export
Status: DONE
Dependency: 037-T2
Owners: Developer (FE)
Task description:
- Create `core/doctor/index.ts`.
- Export `DoctorTrendService` and `DoctorNotificationService`.
Completion criteria:
- [x] Both services importable via barrel
### 037-T4 - Register DoctorNotificationService in app init
Status: DONE
Dependency: 037-T2
Owners: Developer (FE)
Task description:
- Register `DoctorNotificationService.start()` via `provideAppInitializer` in `app.config.ts`.
- Register alongside `DoctorTrendService.start()` from Sprint 036.
Completion criteria:
- [x] Service starts automatically on app bootstrap (delayed 10s)
### 037-T5 - Tests
Status: DONE
Dependency: 037-T2
Owners: Developer (FE)
Task description:
- Create `tests/doctor/doctor-notification.service.spec.ts`.
- Test polling logic, localStorage tracking, toast generation, muting.
Completion criteria:
- [x] Tests pass with `npx ng test --watch=false`
## Execution Log
| Date (UTC) | Update | Owner |
| --- | --- | --- |
| 2026-02-20 | Sprint created. | Planning |
| 2026-02-21 | All tasks implemented and verified. Build passes, tests pass. | Developer (FE) |
## Decisions & Risks
- 60s polling interval matches DoctorTrendService for consistency.
- 10s startup delay prevents API calls during initial app load.
- localStorage used for last-seen tracking (no server-side state needed).
## Next Checkpoints
- Sprint 038 (command palette) unblocked once 037-T1 is DONE.

View File

@@ -0,0 +1,88 @@
# Sprint 038 — Command Palette Doctor Actions
## Topic & Scope
- Create DoctorQuickCheckService for running Doctor checks from the command palette.
- Add Doctor quick actions to DEFAULT_QUICK_ACTIONS.
- Wire actions into the command palette component.
- Working directory: `src/Web/StellaOps.Web/`
- Expected evidence: Ctrl+K > type ">doctor" shows Doctor actions, triggers runs with progress toast.
## Dependencies & Concurrency
- Depends on Sprint 037 (toast `update()` method for progress tracking).
- Safe to parallelize with Sprints 034036, 039.
## Documentation Prerequisites
- Command palette: `shared/components/command-palette/command-palette.component.ts`
- Quick actions: `core/api/search.models.ts`
## Delivery Tracker
### 038-T1 - Create DoctorQuickCheckService
Status: DONE
Dependency: Sprint 037 (toast update)
Owners: Developer (FE)
Task description:
- Create `features/doctor/services/doctor-quick-check.service.ts`, `providedIn: 'root'`.
- `runQuickCheck()`: calls `DoctorStore.startRun({ mode: 'quick' })`, shows progress toast (duration: 0), on completion shows result toast with "View Details" action.
- `runFullDiagnostics()`: calls `DoctorStore.startRun({ mode: 'full' })`, navigates to `/platform/ops/doctor`.
- `getQuickActions(): QuickAction[]`: returns Doctor-specific actions with bound callbacks.
Completion criteria:
- [x] Quick check triggers run and shows progress toast
- [x] Full diagnostics navigates to Doctor dashboard
- [x] Actions returned with correct keywords
### 038-T2 - Add Doctor actions to DEFAULT_QUICK_ACTIONS
Status: DONE
Dependency: none
Owners: Developer (FE)
Task description:
- Add 2 new entries to `DEFAULT_QUICK_ACTIONS` in `search.models.ts`:
- `id: 'doctor-quick'`, label: "Run Quick Health Check", keywords: `['doctor', 'health', 'check', 'quick', 'diagnostic']`.
- `id: 'doctor-full'`, label: "Run Full Diagnostics", keywords: `['doctor', 'diagnostics', 'full', 'comprehensive']`.
- Update existing `id: 'health'` action keywords to include `'doctor'` and `'system'`.
- Refactor `filterQuickActions(query, actions?)` to accept optional actions array parameter.
Completion criteria:
- [x] New actions appear in command mode
- [x] Existing health action includes doctor/system keywords
- [x] `filterQuickActions` accepts optional actions override
### 038-T3 - Wire into command palette
Status: DONE
Dependency: 038-T1, 038-T2
Owners: Developer (FE)
Task description:
- Modify `command-palette.component.ts`.
- Inject `DoctorQuickCheckService`.
- Merge `getQuickActions()` into the actions list during init.
- Pass merged list to `filterQuickActions()`.
Completion criteria:
- [x] Doctor actions appear when typing ">doctor" in command palette
- [x] Selecting "Run Quick Health Check" triggers quick check
- [x] Selecting "Run Full Diagnostics" navigates to Doctor dashboard
### 038-T4 - Tests
Status: DONE
Dependency: 038-T1
Owners: Developer (FE)
Task description:
- Create `tests/doctor/doctor-quick-check.service.spec.ts`.
- Test quick check flow, full diagnostics flow, action generation.
Completion criteria:
- [x] Tests pass with `npx ng test --watch=false`
## Execution Log
| Date (UTC) | Update | Owner |
| --- | --- | --- |
| 2026-02-20 | Sprint created. | Planning |
| 2026-02-21 | All tasks implemented and verified. Build passes, tests pass. | Developer (FE) |
## Decisions & Risks
- Progress toast uses `duration: 0` (stays until manually dismissed or updated).
- `filterQuickActions` refactored to accept optional array to support dynamic action merging.
## Next Checkpoints
- Functional test: Ctrl+K > ">doctor" > select action > verify toast/navigation.

View File

@@ -0,0 +1,120 @@
# Sprint 039 — Setup Wizard Doctor Re-check Integration
## Topic & Scope
- Create Doctor-to-Wizard mapping constants from the setup-wizard-doctor-contract.
- Add "Fix in Setup" button on Doctor check-result components for failed checks with wizard mappings.
- Create DoctorRecheckService for re-running checks after wizard step completion.
- Add deep-link query params to Setup Wizard for direct step navigation.
- Working directory: `src/Web/StellaOps.Web/`
- Expected evidence: "Fix in Setup" button navigates to wizard step, wizard re-check toast after step completion.
## Dependencies & Concurrency
- No upstream sprint dependencies.
- Safe to parallelize with Sprints 034038.
## Documentation Prerequisites
- `docs/setup/setup-wizard-doctor-contract.md`
- Setup wizard models: `features/setup-wizard/models/setup-wizard.models.ts`
- Doctor check-result component: `features/doctor/components/check-result/`
## Delivery Tracker
### 039-T1 - Create Doctor-Wizard mapping constant
Status: DONE
Dependency: none
Owners: Developer (FE)
Task description:
- Create `features/doctor/models/doctor-wizard-mapping.ts`.
- Define `DoctorWizardMapping` interface: `{ checkId: string; stepId: SetupStepId; label: string }`.
- Define `DOCTOR_WIZARD_MAPPINGS` constant array mapping check IDs to wizard steps.
- Helper functions:
- `getWizardStepForCheck(checkId): DoctorWizardMapping | undefined`
- `getCheckIdsForStep(stepId): string[]`
- `buildWizardDeepLink(stepId): string` — returns `/setup/wizard?step=<id>&mode=reconfigure`
Completion criteria:
- [x] Mappings cover all check IDs from setup-wizard-doctor-contract
- [x] Helper functions return correct results
### 039-T2 - Add "Fix in Setup" button to check-result
Status: DONE
Dependency: 039-T1
Owners: Developer (FE)
Task description:
- Modify `check-result.component.ts`: add computed `wizardLink` getter using `getWizardStepForCheck()`.
- Add `@Output() fixInSetup = new EventEmitter<string>()`.
- Modify `check-result.component.html`: add "Fix in Setup" button in `.result-actions` div.
- Only shown when `wizardLink` is non-null AND check is failed/warned.
Completion criteria:
- [x] Button visible for failed/warned checks with wizard mappings
- [x] Button hidden for passing checks and unmapped checks
- [x] Click emits fixInSetup event with deep-link URL
### 039-T3 - Wire fixInSetup handler in Doctor dashboard
Status: DONE
Dependency: 039-T2
Owners: Developer (FE)
Task description:
- Modify `doctor-dashboard.component.ts`.
- Inject `Router`.
- Add `onFixInSetup(url: string)` handler that calls `router.navigateByUrl(url)`.
- Bind handler to check-result `(fixInSetup)` output.
Completion criteria:
- [x] Clicking "Fix in Setup" navigates to correct wizard step
### 039-T4 - Create DoctorRecheckService
Status: DONE
Dependency: 039-T1
Owners: Developer (FE)
Task description:
- Create `features/doctor/services/doctor-recheck.service.ts`, `providedIn: 'root'`.
- `recheckForStep(stepId)`: gets check IDs for step, calls `DoctorStore.startRun({ mode: 'quick', checkIds })`, shows progress toast.
- `offerRecheck(stepId, stepName)`: shows success toast "X configured successfully" with "Run Re-check" action button.
Completion criteria:
- [x] Re-check runs only checks mapped to the wizard step
- [x] Success toast offers re-check action
### 039-T5 - Setup Wizard deep-link and re-check integration
Status: DONE
Dependency: 039-T4
Owners: Developer (FE)
Task description:
- Modify `setup-wizard.component.ts`.
- In `ngOnInit()`, read `step` and `mode` query params from `ActivatedRoute`.
- If `mode=reconfigure`, set wizard mode to reconfigure.
- If `step` param present, call `state.goToStep(stepId)`.
- Inject `DoctorRecheckService`.
- After successful step execution in reconfigure mode, call `doctorRecheck.offerRecheck(step.id, step.name)`.
Completion criteria:
- [x] `/setup/wizard?step=database&mode=reconfigure` opens wizard at database step in reconfigure mode
- [x] Successful step completion in reconfigure mode shows re-check toast
### 039-T6 - Tests
Status: DONE
Dependency: 039-T1, 039-T4
Owners: Developer (FE)
Task description:
- Create `tests/doctor/doctor-wizard-mapping.spec.ts`.
- Create `tests/doctor/doctor-recheck.service.spec.ts`.
- Test mapping lookups, deep-link generation, re-check flow.
Completion criteria:
- [x] Tests pass with `npx ng test --watch=false`
## Execution Log
| Date (UTC) | Update | Owner |
| --- | --- | --- |
| 2026-02-20 | Sprint created. | Planning |
| 2026-02-21 | All tasks implemented and verified. Build passes, tests pass. | Developer (FE) |
## Decisions & Risks
- Mappings derived from `docs/setup/setup-wizard-doctor-contract.md`; if contract changes, mappings must be updated.
- "Fix in Setup" button only appears for checks with known wizard step mappings.
- Deep-link `mode=reconfigure` reuses existing wizard reconfigure flow.
## Next Checkpoints
- Functional test: Doctor dashboard > failed check > "Fix in Setup" > wizard step > re-check.