chore: archive v1.1 milestone — 3 phases, 11 plans, 11/11 requirements shipped

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-31 15:11:28 +02:00
co-authored by Claude Opus 4.6
parent 1aae501ddf
commit d8822e0e0b
7 changed files with 248 additions and 312 deletions
+20
View File
@@ -23,3 +23,23 @@
---
## v1.1 Backlog & Tech Debt (Shipped: 2026-03-31)
**Phases completed:** 3 phases, 11 plans
**Timeline:** 2026-03-30 → 2026-03-31 (2 days)
**Stats:** 47 files changed, +7,311 / -210 lines
**Key accomplishments:**
1. Registry-driven architecture — BACKEND_REGISTRY enriched with `displayName`, `description`, `fields`; BackendSelectionStep fully data-driven via `Object.entries()`
2. 4 new cloud backends — OneDrive, SFTP (password + key auth), GCS, and Backblaze B2 added end-to-end through registry, schema, and UI
3. SftpAuthToggle component — CSS-hidden toggle for SFTP auth method (password vs SSH key), following AzureAuthToggle pattern
4. RemoteConfigStep extended for all 7 backends — registry-loop renders all fields; SFTP has dedicated branch
5. Inline field validation — `FieldDef.validate` regex rules on 3 fields; wired via `buildZodSchema().regex()`
6. Contextual tooltips (UX-01) — `FieldDef.tooltipText` rendered via ⓘ button across all field types
**Tech debt carried forward:**
- 7 browser UI verifications pending (confirmatory, not discovery)
- FieldRenderer aria inconsistency between text-branch and select-branch (cosmetic)
- Phase 7 Nyquist compliance partial
---
+38 -60
View File
@@ -2,44 +2,31 @@
## What This Is
Ready2Blob is a pure-frontend web app that helps IT professionals deploy rclone onto end-user Windows PCs. A step-by-step wizard collects backend credentials (Azure Blob, S3, S3-compatible) and deployment preferences, then generates rclone config files and PowerShell scripts ready to push via Intune or any RMM tool — all client-side, no server required.
Ready2Blob is a pure-frontend web app that helps IT professionals deploy rclone onto end-user Windows PCs. A step-by-step wizard collects backend credentials (Azure Blob, S3, S3-compatible, OneDrive, SFTP, Google Cloud Storage, Backblaze B2) and deployment preferences, then generates rclone config files and PowerShell scripts ready to push via Intune or any RMM tool — all client-side, no server required.
## Core Value
An IT pro can go from zero to a deployable rclone setup in minutes — without needing to know rclone's config syntax or PowerShell deployment conventions.
## Requirements
## Current State
### Validated
**Shipped:** v1.1 — 2026-03-31
**Backends:** 7 (Azure Blob, S3, S3-compatible, OneDrive, SFTP, GCS, Backblaze B2)
**Tech stack:** Vite 6, React 18, TypeScript 5, Tailwind v4, react-hook-form 7, Zod 4, Vitest 4, JSZip
**Test coverage:** 159 tests across all test files — all GREEN
**Total milestones:** 2 shipped (v1.0 + v1.1), 7 phases, 29 plans
- ✓ Multi-step wizard guides user through rclone backend selection and configuration — v1.0
- ✓ Supports Azure Blob, S3, and S3-compatible backends — v1.0
- ✓ Generates a valid rclone.conf file with live preview — v1.0
- ✓ Generates PowerShell deployment script for MS Intune (Intune install + detection scripts) — v1.0
- ✓ Generates PowerShell deployment script for RMM tools (generic SYSTEM-context) — v1.0
- ✓ User can download each output file individually or as a ZIP bundle — v1.0
- ✓ Includes rclone installation step in scripts (toggleable) — v1.0
- ✓ All config generation runs client-side (no backend, static site) — v1.0
- ✓ Security warning gate before any download — v1.0
- ✓ Wizard state never written to localStorage or sessionStorage — v1.0
## Next Milestone Goals
### Active
*(Not yet defined — run `/gsd:new-milestone` to start next milestone)*
**Milestone: v1.1 — Backlog & Tech Debt**
## Constraints
*Tech debt:*
- [ ] `scriptTargets` filtering: only render output blocks for selected Intune/RMM targets (TD-1)
- [ ] ReviewStep Back button (UX consistency with other steps — TD-2)
- [ ] Backend list in BackendSelectionStep driven by BACKEND_REGISTRY keys (maintainability — TD-4)
- [ ] `BackendFormValues<T>` dead export removal from src/schemas/index.ts
- [ ] `act()` warnings fixed in BackendSelectionStep tests
- **Architecture**: Pure static frontend — no backend, no server required
- **Target OS**: Windows endpoints only (scripts are PowerShell)
- **Secrets**: Plain text in generated files — UI must display a clear security warning before download
*Backlog features:*
- [ ] Additional backends: OneDrive, SFTP, Google Cloud Storage, Backblaze B2
- [ ] Field-level format validation per backend (Azure account name format, S3 region codes)
- [ ] Explanatory tooltips on sensitive fields (SAS token vs access key, region codes)
### Out of Scope
## Out of Scope
- User accounts / saved templates — no backend, no persistence
- Server-side generation — everything runs in the browser
@@ -48,24 +35,8 @@ An IT pro can go from zero to a deployable rclone setup in minutes — without n
- Non-Windows targets — scripts target Windows endpoints only
- Auto-push to Intune via Graph API — requires Azure AD app registration, massive scope increase
- Config credential encryption — rclone encrypted configs require interactive unlock, incompatible with unattended deployment
## Context
**Shipped:** v1.0 — 2026-03-26/27, 2 days, 4 phases, 18 plans, ~2,746 LOC TypeScript/TSX
**Tech stack:** Vite 6, React 18, TypeScript 5, Tailwind v4, react-hook-form 7, Zod 4, Vitest 4, JSZip
**Test coverage:** 98 tests across 12 test files — all GREEN
**Known issues / tech debt:**
- `scriptTargets` disconnect: user can deselect Intune or RMM in DeploymentStep but all blocks still appear in ReviewStep
- ReviewStep lacks a Back button; users navigate back via StepIndicator breadcrumb only
- BackendSelectionStep BACKENDS constant is hardcoded — adding to BACKEND_REGISTRY does not auto-surface in UI
- 6 browser verifications still pending (live preview reactivity, real file writes, ZIP content, clipboard, DevTools storage check)
## Constraints
- **Architecture**: Pure static frontend — no backend, no server required
- **Target OS**: Windows endpoints only (scripts are PowerShell)
- **Secrets**: Plain text in generated files — UI must display a clear security warning before download
- Multiple remotes in one config — significant wizard UX complexity, defer to v2
- OAuth flow in browser (OneDrive) — requires backend proxy; paste pre-obtained token instead
## Key Decisions
@@ -75,26 +46,33 @@ An IT pro can go from zero to a deployable rclone setup in minutes — without n
| BACKEND_REGISTRY as single source of truth | Drives form rendering, Zod schemas, and config generation from one definition | ✓ Good — zero duplication across phases |
| useReducer + Context API (no external state lib) | Zero dependencies, sufficient for 4-step wizard | ✓ Good — kept bundle lean |
| Wave 0 TDD (stubs RED before implementation) | Forces API contract before code, catches integration mismatches early | ✓ Good — caught several issues upfront |
| Support all rclone backends (not Azure-only) | Broader utility despite "Blob" in project name | ✓ Good — S3-compatible covers Wasabi/MinIO/R2 |
| Support all rclone backends (not Azure-only) | Broader utility despite "Blob" in project name | ✓ Good — 7 backends and growing |
| Optional rclone install in scripts | Different orgs have different baseline images | ✓ Good — no friction for orgs that pre-install |
| Tailwind v4 via @tailwindcss/vite plugin | No postcss.config.js, no tailwind.config.js needed | ✓ Good — cleaner config |
| Zod v4 + @hookform/resolvers v5 together | v5 resolvers required for Zod v4 compatibility | ✓ Good — noted for future upgrades |
| AzureAuthToggle uses CSS hidden (not conditional render) | Preserves both sas_url and key in react-hook-form state when toggling | ✓ Good — avoids field reset on toggle |
| scriptTargets defaults to both ['intune','rmm'] | Users deselect rather than discover — less friction | — Pending (deferred filtering to v1.1) |
| BACKEND_REGISTRY keys not wired to UI list | Hardcoded BACKENDS constant in BackendSelectionStep | ⚠️ Revisit — maintainability gap for v1.1 |
| AzureAuthToggle / SftpAuthToggle CSS hidden pattern | Preserves both auth fields in react-hook-form state when toggling | ✓ Good — avoids field reset on toggle |
| FieldDef.validate + tooltipText extension | Additive interface change, non-breaking to existing backends | ✓ Good — clean composition |
| Registry-loop rendering in RemoteConfigStep | Three-branch ternary (azureblob/sftp/else) — custom logic minimal | ✓ Good — scales with new backends |
## Current Milestone: v1.1 Backlog & Tech Debt
<details>
<summary>Previous milestone context (v1.0 → v1.1)</summary>
**Goal:** Ship all deferred tech debt and backlog features from v1.0 — no new functionality.
**v1.0 shipped:** 2026-03-27, 4 phases, 18 plans, ~2,746 LOC
**v1.1 shipped:** 2026-03-31, 3 phases, 11 plans, +7,311 lines
**Target features:**
- scriptTargets filtering in ReviewStep
- ReviewStep Back button
- BackendSelectionStep driven by BACKEND_REGISTRY
- Dead export + test warning cleanup
- 4 additional backends (OneDrive, SFTP, GCS, Backblaze B2)
- Field-level format validation per backend
- Explanatory tooltips on sensitive fields
**v1.0 tech debt resolved in v1.1:**
- scriptTargets filtering in ReviewStep (TECH-01)
- ReviewStep Back button (TECH-02)
- Registry-driven BackendSelectionStep (TECH-03)
- Dead export removal (TECH-04)
- act() warnings fix (TECH-05)
**v1.1 remaining tech debt:**
- 7 browser UI verifications pending (confirmatory)
- FieldRenderer aria inconsistency (cosmetic)
- Phase 7 Nyquist compliance partial
</details>
---
*Last updated: 2026-03-27 after v1.1 milestone started*
*Last updated: 2026-03-31 after v1.1 milestone completed*
-68
View File
@@ -1,68 +0,0 @@
# Requirements: Ready2Blob
**Defined:** 2026-03-30
**Core Value:** An IT pro can go from zero to a deployable rclone setup in minutes — without needing to know rclone's config syntax or PowerShell deployment conventions.
## v1.1 Requirements
### Tech Debt
- [x] **TECH-01**: User sees only the script output blocks matching their selected deployment targets (Intune and/or RMM) in ReviewStep
- [x] **TECH-02**: User can navigate back from ReviewStep using an explicit Back button
- [x] **TECH-03**: Backend list in BackendSelectionStep is automatically derived from BACKEND_REGISTRY keys (no hardcoded list)
- [x] **TECH-04**: Dead `BackendFormValues<T>` export is removed from `src/schemas/index.ts`
- [x] **TECH-05**: BackendSelectionStep test suite runs without `act()` warnings
### Backends
- [x] **BACK-01**: User can configure an OneDrive remote (with OAuth token paste input and guidance)
- [x] **BACK-02**: User can configure an SFTP remote (host, user, password or key-based auth)
- [x] **BACK-03**: User can configure a Google Cloud Storage remote
- [x] **BACK-04**: User can configure a Backblaze B2 remote
### Validation
- [x] **VALID-01**: User sees inline validation error when a field value violates backend-specific format rules (Azure account name: 324 lowercase alphanumeric; S3 region: valid format; etc.)
### UX
- [x] **UX-01**: User can view a contextual tooltip on sensitive or complex fields (SAS token vs. access key, region codes, SFTP auth method, OneDrive token)
## Future Requirements
*(None identified — all backlog items are in scope for v1.1)*
## Out of Scope
| Feature | Reason |
|---------|--------|
| Multiple remotes in one config | Significant wizard UX complexity — defer to v2 |
| OAuth flow in browser (OneDrive) | Requires backend proxy; paste pre-obtained token instead |
| Test connection / credential validation | Requires backend proxy (CORS blocks direct cloud API calls) |
| RMM-named script variants | Generic SYSTEM-context script covers all RMM platforms |
| Save/load configurations | localStorage = credentials in browser storage = security risk |
## Traceability
| Requirement | Phase | Status |
|-------------|-------|--------|
| TECH-01 | Phase 5 | Complete |
| TECH-02 | Phase 5 | Complete |
| TECH-03 | Phase 5 | Complete |
| TECH-04 | Phase 5 | Complete |
| TECH-05 | Phase 5 | Complete |
| BACK-01 | Phase 6 | Complete |
| BACK-02 | Phase 6 | Complete |
| BACK-03 | Phase 6 | Complete |
| BACK-04 | Phase 6 | Complete |
| VALID-01 | Phase 7 | Complete |
| UX-01 | Phase 7 | Complete |
**Coverage:**
- v1.1 requirements: 11 total
- Mapped to phases: 11
- Unmapped: 0 ✓
---
*Requirements defined: 2026-03-30*
*Last updated: 2026-03-27 after roadmap creation — all 11 requirements mapped*
+11 -62
View File
@@ -3,7 +3,7 @@
## Milestones
-**v1.0 MVP** — Phases 14 (shipped 2026-03-27)
- 🚧 **v1.1 Backlog & Tech Debt** — Phases 57 (in progress)
- **v1.1 Backlog & Tech Debt** — Phases 57 (shipped 2026-03-31)
## Phases
@@ -19,67 +19,16 @@ Full phase details: [.planning/milestones/v1.0-ROADMAP.md](milestones/v1.0-ROADM
</details>
### 🚧 v1.1 Backlog & Tech Debt (In Progress)
<details>
<summary>✅ v1.1 Backlog & Tech Debt (Phases 57) — SHIPPED 2026-03-31</summary>
**Milestone Goal:** Ship all deferred tech debt and backlog features from v1.0 — scriptTargets filtering, UX consistency fixes, registry-driven backend list, 4 new backends, field validation, and contextual tooltips.
- [x] Phase 5: Tech Debt (4/4 plans) — completed 2026-03-30
- [x] Phase 6: New Backends (4/4 plans) — completed 2026-03-31
- [x] Phase 7: Validation & UX Polish (3/3 plans) — completed 2026-03-31
- [x] **Phase 5: Tech Debt** - Fix all deferred v1.0 issues (scriptTargets filtering, Back button, registry-driven UI, dead export, test warnings) (completed 2026-03-30)
- [x] **Phase 6: New Backends** - Add OneDrive, SFTP, Google Cloud Storage, and Backblaze B2 to the backend registry and wizard (completed 2026-03-31)
- [x] **Phase 7: Validation & UX Polish** - Add field-level format validation and contextual tooltips across all backends (completed 2026-03-31)
Full phase details: [.planning/milestones/v1.1-ROADMAP.md](milestones/v1.1-ROADMAP.md)
## Phase Details
### Phase 5: Tech Debt
**Goal**: The wizard behaves consistently and the codebase is clean — no visual noise from deselected script targets, ReviewStep has a Back button, BackendSelectionStep is driven by the registry, and dead code is removed
**Depends on**: Phase 4 (v1.0 complete)
**Requirements**: TECH-01, TECH-02, TECH-03, TECH-04, TECH-05
**Success Criteria** (what must be TRUE):
1. User who deselected RMM in DeploymentStep sees only the Intune output block in ReviewStep (and vice versa)
2. User can click a Back button on ReviewStep to return to DeploymentStep without losing any form data
3. Adding a new entry to BACKEND_REGISTRY automatically surfaces that backend in the BackendSelectionStep UI with no other code changes
4. BackendSelectionStep test suite runs with zero `act()` warnings in the Vitest output
5. `BackendFormValues<T>` export is absent from `src/schemas/index.ts` and no TypeScript errors arise
**Plans**: 4 plans
Plans:
- [ ] 05-00-PLAN.md — Wave 0 TDD stubs: ReviewStep filtering + Back button failing tests, registry.test.ts .fields prep
- [ ] 05-01-PLAN.md — Registry enrichment (TECH-03) + consumers update + dead export removal (TECH-04)
- [ ] 05-02-PLAN.md — ReviewStep scriptTargets filtering + Back button (TECH-01, TECH-02)
- [ ] 05-03-PLAN.md — act() warnings fix: userEvent migration + vi.useFakeTimers (TECH-05)
### Phase 6: New Backends
**Goal**: IT pros can configure OneDrive, SFTP, Google Cloud Storage, and Backblaze B2 remotes through the same wizard flow, with appropriate guidance for OAuth-based and key-based auth methods
**Depends on**: Phase 5
**Requirements**: BACK-01, BACK-02, BACK-03, BACK-04
**Success Criteria** (what must be TRUE):
1. User can select OneDrive as a backend, paste a pre-obtained rclone OAuth token, and generate a valid rclone.conf containing `[type = onedrive]` with the token field
2. User can select SFTP as a backend, choose between password and private-key authentication, fill the appropriate fields, and generate a valid rclone.conf
3. User can select Google Cloud Storage as a backend, fill in the required fields, and generate a valid rclone.conf containing `[type = google cloud storage]`
4. User can select Backblaze B2 as a backend, enter their application key credentials, and generate a valid rclone.conf containing `[type = b2]`
5. All four new backends appear in the BackendSelectionStep list and each produces a downloadable config+scripts bundle
**Plans**: 4 plans
Plans:
- [ ] 06-00-PLAN.md — Wave 0 TDD stubs: failing tests for all four new backends across registry, rclone-conf, and RemoteConfigStep
- [ ] 06-01-PLAN.md — Registry + schema + RCLONE_TYPE_MAP for OneDrive, GCS, Backblaze B2
- [ ] 06-02-PLAN.md — Registry + schema + RCLONE_TYPE_MAP for SFTP + SftpAuthToggle component
- [ ] 06-03-PLAN.md — Wire all four backends into RemoteConfigStep + human verification
### Phase 7: Validation & UX Polish
**Goal**: Users receive immediate inline feedback when they enter incorrectly formatted values, and can access plain-language explanations on confusing credential fields without leaving the wizard
**Depends on**: Phase 6
**Requirements**: VALID-01, UX-01
**Success Criteria** (what must be TRUE):
1. User who enters an Azure storage account name shorter than 3 characters or containing uppercase letters sees an inline error message before they can advance
2. User who enters an S3 region in an invalid format (e.g., spaces or uppercase) sees an inline error message
3. User can hover or click a tooltip icon on sensitive fields (SAS token, access key, SFTP auth method, OneDrive token) and read a plain-language explanation without navigating away
4. Tooltip content accurately distinguishes SAS token from storage account key in the Azure backend form
**Plans**: 3 plans
Plans:
- [ ] 07-00-PLAN.md — Wave 0 TDD stubs: failing tests for VALID-01 regex rejection/acceptance and UX-01 tooltip toggle
- [ ] 07-01-PLAN.md — VALID-01: FieldDef validate extension + buildZodSchema regex chaining for 3 fields
- [ ] 07-02-PLAN.md — UX-01: tooltipText in registry + FieldRenderer/PasswordField ⓘ toggle + AzureAuthToggle/SftpAuthToggle wiring + human verification
</details>
## Progress
@@ -89,6 +38,6 @@ Plans:
| 2. Generators | v1.0 | 4/4 | Complete | 2026-03-26 |
| 3. Wizard UI | v1.0 | 5/5 | Complete | 2026-03-27 |
| 4. Review, Download & Security | v1.0 | 5/5 | Complete | 2026-03-27 |
| 5. Tech Debt | 4/4 | Complete | 2026-03-30 | - |
| 6. New Backends | 4/4 | Complete | 2026-03-31 | - |
| 7. Validation & UX Polish | 3/3 | Complete | 2026-03-31 | - |
| 5. Tech Debt | v1.1 | 4/4 | Complete | 2026-03-30 |
| 6. New Backends | v1.1 | 4/4 | Complete | 2026-03-31 |
| 7. Validation & UX Polish | v1.1 | 3/3 | Complete | 2026-03-31 |
+13 -122
View File
@@ -2,10 +2,10 @@
gsd_state_version: 1.0
milestone: v1.1
milestone_name: Backlog & Tech Debt
status: planning
stopped_at: Completed 07-validation-ux-polish 07-02-PLAN.md
last_updated: "2026-03-31T11:53:18.993Z"
last_activity: 2026-03-27 — v1.1 roadmap created, 11 requirements mapped across 3 phases
status: completed
stopped_at: Milestone v1.1 archived
last_updated: "2026-03-31T15:00:00Z"
last_activity: 2026-03-31 — v1.1 milestone completed and archived
progress:
total_phases: 3
completed_phases: 3
@@ -14,135 +14,26 @@ progress:
percent: 100
---
---
gsd_state_version: 1.0
milestone: v1.1
milestone_name: Backlog & Tech Debt
status: planning
stopped_at: Completed 06-new-backends 06-02-PLAN.md
last_updated: "2026-03-30T16:15:00Z"
last_activity: 2026-03-27 — v1.1 roadmap created, 11 requirements mapped across 3 phases
progress:
[██████████] 100%
completed_phases: 1
total_plans: 8
completed_plans: 7
percent: 88
---
---
gsd_state_version: 1.0
milestone: v1.1
milestone_name: Backlog & Tech Debt
status: planning
stopped_at: Completed 05-tech-debt 05-03-PLAN.md
last_updated: "2026-03-30T07:44:48.651Z"
last_activity: 2026-03-27 — v1.1 roadmap created, 11 requirements mapped across 3 phases
progress:
[█████████░] 88%
completed_phases: 1
total_plans: 4
completed_plans: 4
percent: 0
---
# Project State
## Project Reference
See: .planning/PROJECT.md (updated 2026-03-27)
See: .planning/PROJECT.md (updated 2026-03-31)
**Core value:** An IT pro can go from zero to a deployable rclone setup in minutes — without needing to know rclone's config syntax or PowerShell deployment conventions.
**Current focus:** Phase 5 — Tech Debt (ready to plan)
**Current focus:** v1.1 shipped — ready for next milestone
## Current Position
Phase: 5 of 7 (Tech Debt)
Plan: — (not yet planned)
Status: Ready to plan
Last activity: 2026-03-27 — v1.1 roadmap created, 11 requirements mapped across 3 phases
Milestone: v1.1 (SHIPPED)
Phase: All complete (57)
Status: Archived
Last activity: 2026-03-31 — v1.1 milestone completed and archived
Progress: [░░░░░░░░░░] 0% (v1.1)
## Performance Metrics
**Velocity (v1.0 reference):**
- Total plans completed: 18
- Average duration: ~3 min
- Total execution time: ~54 min
**v1.1 By Phase:**
| Phase | Plans | Total | Avg/Plan |
|-------|-------|-------|----------|
| 5. Tech Debt | TBD | - | - |
| 6. New Backends | TBD | - | - |
| 7. Validation & UX Polish | TBD | - | - |
*Updated after each plan completion*
| Phase 05-tech-debt P00 | 3 | 2 tasks | 2 files |
| Phase 05-tech-debt P02 | 4min | 1 tasks | 1 files |
| Phase 05-tech-debt P01 | 5 | 2 tasks | 4 files |
| Phase 05-tech-debt P03 | 3 | 2 tasks | 2 files |
| Phase 06-new-backends P00 | 5min | 3 tasks | 3 files |
| Phase 06-new-backends P01 | 5min | 2 tasks | 3 files |
| Phase 06-new-backends P02 | 4min | 2 tasks | 4 files |
| Phase 06-new-backends P03 | 10min | 2 tasks | 1 files |
| Phase 07-validation-ux-polish P00 | 10min | 1 tasks | 1 files |
| Phase 07-validation-ux-polish P01 | 5min | 2 tasks | 2 files |
| Phase 07-validation-ux-polish P02 | 2min | 2 tasks | 5 files |
| Phase 07-validation-ux-polish P02 | 15min | 3 tasks | 5 files |
## Accumulated Context
### Decisions
Decisions are logged in PROJECT.md Key Decisions table.
Recent decisions affecting v1.1 work:
- [v1.0] BACKEND_REGISTRY as single source of truth — Phase 5 wires BackendSelectionStep to it
- [v1.0] scriptTargets defaults to both ['intune','rmm'] — Phase 5 adds filtering in ReviewStep
- [v1.0] AzureAuthToggle uses CSS hidden (not conditional render) — Phase 6 SFTP auth toggle should follow same pattern
- [v1.0] Wave 0 TDD stubs written before implementation — continue this pattern in v1.1
- [Phase 05-tech-debt]: Use label text not filename text for OutputBlock assertions — filename is a prop, not rendered DOM text
- [Phase 05-tech-debt]: WizardConsumerSetup pattern: in-test React component dispatches SET_DEPLOYMENT via useEffect for state injection without changing production code
- [Phase 05-tech-debt]: Unmount OutputBlocks entirely (conditional render with &&) not CSS hidden — avoids stale component state when toggling scriptTargets
- [Phase 05-tech-debt]: Keep useMemo calls for all scripts even when OutputBlocks hidden — ZIP handler always needs the content for dynamic bundle building
- [Phase 05-tech-debt]: BACKEND_REGISTRY shape enriched to { displayName, description, fields } — registry is single source of truth for display AND field data; BackendSelectionStep wired via Object.entries(BACKEND_REGISTRY)
- [Phase 05-tech-debt]: userEvent.setup() per test body pattern established — replaces fireEvent for async React state interactions
- [Phase 05-tech-debt]: vi.useFakeTimers() in beforeEach + vi.useRealTimers() in afterEach pattern established for suppressing setTimeout act() warnings
- [Phase 06-new-backends]: Wave 0 RED stubs: as BackendType cast allows test files to parse before BackendType union is extended
- [Phase 06-new-backends]: GCS rclone type = 'google cloud storage' (with spaces) not 'gcs' — verified against rclone docs, test asserts not.toContain('type = gcs')
- [Phase 06-new-backends]: SFTP CSS-hide tab toggle pattern follows AzureAuthToggle convention (div.hidden/div.block)
- [Phase 06-new-backends]: GCS rclone type = 'google cloud storage' (with spaces) not 'gcs' — critical for correct rclone.conf output, test asserts not.toContain('type = gcs')
- [Phase 06-new-backends]: OneDrive uses paste-based OAuth token (JSON token field), GCS uses service_account_credentials (paste JSON), B2 uses account + key — all follow stateless browser-paste pattern
- [Phase 06-new-backends]: SftpAuthToggle follows AzureAuthToggle CSS-hidden pattern: both pass and key_pem always registered with react-hook-form, tab visibility via div.block/div.hidden
- [Phase 06-new-backends]: RCLONE_TYPE_MAP and BACKEND_SCHEMAS extended for all 7 backends in plan 02 (not just sftp) to fix failing onedrive/gcs/b2 test assertions
- [Phase 06-new-backends]: Three-branch ternary in RemoteConfigStep (azureblob/sftp/else) keeps custom logic minimal; OneDrive/GCS/B2 render entirely via registry loop
- [Phase 07-validation-ux-polish]: Do not use vi.useFakeTimers() in form-submit tests — fake timers + userEvent.setup() deadlock waitFor when testing React async form submissions
- [Phase 07-validation-ux-polish]: RED acceptance tests (accepts valid X) are inherently green before implementation — they serve as regression guards, not RED indicators
- [Phase 07-validation-ux-polish]: Cast (schema as z.ZodString).regex() — ZodTypeAny does not expose .regex() at type level in Zod v4
- [Phase 07-validation-ux-polish]: tooltipText added to FieldDef in Plan 07-01 (interface-only) to avoid second interface-only edit in Plan 07-02
- [Phase 07-validation-ux-polish]: ⓘ button placed as sibling outside label element in flex container to avoid label text contamination
- [Phase 07-validation-ux-polish]: AzureAuthToggle reads tooltipText from BACKEND_REGISTRY at runtime — ensures tooltip stays in sync with registry as single source of truth
- [Phase 07-validation-ux-polish]: SFTP auth-method tooltip is section-level (above segmented control), not field-level — correctly scoped to the auth method choice
- [Phase 07-validation-ux-polish]: ⓘ button placed as sibling outside label element in flex container to avoid label text contamination
- [Phase 07-validation-ux-polish]: AzureAuthToggle reads tooltipText from BACKEND_REGISTRY at runtime — registry is single source of truth, tooltip stays in sync automatically
- [Phase 07-validation-ux-polish]: SFTP auth-method tooltip is section-level (above segmented control), not field-level — correctly scoped to the auth method choice
### Pending Todos
None yet.
### Blockers/Concerns
- [Phase 6] OneDrive: confirm current `rclone authorize` token JSON structure before designing token input field — token format may differ from v1.0 research
- [Phase 6] SFTP: verify exact rclone SFTP field names (key_file vs key_pem, etc.) against live rclone.org docs before writing registry entry
- [Phase 6] GCS: rclone GCS backend uses `service_account_file` or `token` — confirm auth approach before implementation
- [Phase 7] VALID-01: S3 region validation regex must match AWS region format exactly — verify against current AWS region list
Progress: [██████████] 100% (v1.1)
## Session Continuity
Last session: 2026-03-31T11:48:24.339Z
Stopped at: Completed 07-validation-ux-polish 07-02-PLAN.md
Last session: 2026-03-31T15:00:00Z
Stopped at: Milestone v1.1 archived — ready for /gsd:new-milestone
Resume file: None
+61
View File
@@ -0,0 +1,61 @@
# Requirements Archive: v1.1 Backlog & Tech Debt
**Defined:** 2026-03-30
**Completed:** 2026-03-31
**Core Value:** An IT pro can go from zero to a deployable rclone setup in minutes — without needing to know rclone's config syntax or PowerShell deployment conventions.
## v1.1 Requirements — All Complete
### Tech Debt
- [x] **TECH-01**: User sees only the script output blocks matching their selected deployment targets (Intune and/or RMM) in ReviewStep — **validated** (Phase 5, Plan 05-02)
- [x] **TECH-02**: User can navigate back from ReviewStep using an explicit Back button — **validated** (Phase 5, Plan 05-02)
- [x] **TECH-03**: Backend list in BackendSelectionStep is automatically derived from BACKEND_REGISTRY keys (no hardcoded list) — **validated** (Phase 5, Plan 05-01)
- [x] **TECH-04**: Dead `BackendFormValues<T>` export is removed from `src/schemas/index.ts`**validated** (Phase 5, Plan 05-01)
- [x] **TECH-05**: BackendSelectionStep test suite runs without `act()` warnings — **validated** (Phase 5, Plan 05-03)
### Backends
- [x] **BACK-01**: User can configure an OneDrive remote (with OAuth token paste input and guidance) — **validated** (Phase 6, Plan 06-01/06-03)
- [x] **BACK-02**: User can configure an SFTP remote (host, user, password or key-based auth) — **validated** (Phase 6, Plan 06-02/06-03)
- [x] **BACK-03**: User can configure a Google Cloud Storage remote — **validated** (Phase 6, Plan 06-01/06-03)
- [x] **BACK-04**: User can configure a Backblaze B2 remote — **validated** (Phase 6, Plan 06-01/06-03)
### Validation
- [x] **VALID-01**: User sees inline validation error when a field value violates backend-specific format rules — **validated** (Phase 7, Plan 07-01)
### UX
- [x] **UX-01**: User can view a contextual tooltip on sensitive or complex fields — **validated** (Phase 7, Plan 07-02)
## Out of Scope (carried forward)
| Feature | Reason |
|---------|--------|
| Multiple remotes in one config | Significant wizard UX complexity — defer to v2 |
| OAuth flow in browser (OneDrive) | Requires backend proxy; paste pre-obtained token instead |
| Test connection / credential validation | Requires backend proxy (CORS blocks direct cloud API calls) |
| RMM-named script variants | Generic SYSTEM-context script covers all RMM platforms |
| Save/load configurations | localStorage = credentials in browser storage = security risk |
## Final Traceability
| Requirement | Phase | Plan(s) | Outcome |
|-------------|-------|---------|---------|
| TECH-01 | Phase 5 | 05-00, 05-02 | validated |
| TECH-02 | Phase 5 | 05-00, 05-02 | validated |
| TECH-03 | Phase 5 | 05-00, 05-01 | validated |
| TECH-04 | Phase 5 | 05-01 | validated |
| TECH-05 | Phase 5 | 05-03 | validated |
| BACK-01 | Phase 6 | 06-00, 06-01, 06-03 | validated |
| BACK-02 | Phase 6 | 06-00, 06-02, 06-03 | validated |
| BACK-03 | Phase 6 | 06-00, 06-01, 06-03 | validated |
| BACK-04 | Phase 6 | 06-00, 06-01, 06-03 | validated |
| VALID-01 | Phase 7 | 07-00, 07-01 | validated |
| UX-01 | Phase 7 | 07-00, 07-02 | validated |
**Coverage:** 11/11 requirements validated
---
_Archived: 2026-03-31_
+105
View File
@@ -0,0 +1,105 @@
# Milestone v1.1: Backlog & Tech Debt
**Status:** ✅ SHIPPED 2026-03-31
**Phases:** 57
**Total Plans:** 11
## Overview
Ship all deferred tech debt and backlog features from v1.0 — scriptTargets filtering, UX consistency fixes, registry-driven backend list, 4 new backends, field validation, and contextual tooltips.
## Phases
### Phase 5: Tech Debt
**Goal**: The wizard behaves consistently and the codebase is clean — no visual noise from deselected script targets, ReviewStep has a Back button, BackendSelectionStep is driven by the registry, and dead code is removed
**Depends on**: Phase 4 (v1.0 complete)
**Requirements**: TECH-01, TECH-02, TECH-03, TECH-04, TECH-05
**Plans**: 4 plans
Plans:
- [x] 05-00: Wave 0 TDD stubs — ReviewStep filtering + Back button failing tests, registry.test.ts .fields prep
- [x] 05-01: Registry enrichment (TECH-03) + consumers update + dead export removal (TECH-04)
- [x] 05-02: ReviewStep scriptTargets filtering + Back button (TECH-01, TECH-02)
- [x] 05-03: act() warnings fix — userEvent migration + vi.useFakeTimers (TECH-05)
**Success Criteria** (what must be TRUE):
1. User who deselected RMM in DeploymentStep sees only the Intune output block in ReviewStep (and vice versa)
2. User can click a Back button on ReviewStep to return to DeploymentStep without losing any form data
3. Adding a new entry to BACKEND_REGISTRY automatically surfaces that backend in the BackendSelectionStep UI with no other code changes
4. BackendSelectionStep test suite runs with zero `act()` warnings in the Vitest output
5. `BackendFormValues<T>` export is absent from `src/schemas/index.ts` and no TypeScript errors arise
### Phase 6: New Backends
**Goal**: IT pros can configure OneDrive, SFTP, Google Cloud Storage, and Backblaze B2 remotes through the same wizard flow, with appropriate guidance for OAuth-based and key-based auth methods
**Depends on**: Phase 5
**Requirements**: BACK-01, BACK-02, BACK-03, BACK-04
**Plans**: 4 plans
Plans:
- [x] 06-00: Wave 0 TDD stubs — failing tests for all four new backends across registry, rclone-conf, and RemoteConfigStep
- [x] 06-01: Registry + schema + RCLONE_TYPE_MAP for OneDrive, GCS, Backblaze B2
- [x] 06-02: Registry + schema + RCLONE_TYPE_MAP for SFTP + SftpAuthToggle component
- [x] 06-03: Wire all four backends into RemoteConfigStep + human verification
**Success Criteria** (what must be TRUE):
1. User can select OneDrive as a backend, paste a pre-obtained rclone OAuth token, and generate a valid rclone.conf containing `[type = onedrive]` with the token field
2. User can select SFTP as a backend, choose between password and private-key authentication, fill the appropriate fields, and generate a valid rclone.conf
3. User can select Google Cloud Storage as a backend, fill in the required fields, and generate a valid rclone.conf containing `[type = google cloud storage]`
4. User can select Backblaze B2 as a backend, enter their application key credentials, and generate a valid rclone.conf containing `[type = b2]`
5. All four new backends appear in the BackendSelectionStep list and each produces a downloadable config+scripts bundle
### Phase 7: Validation & UX Polish
**Goal**: Users receive immediate inline feedback when they enter incorrectly formatted values, and can access plain-language explanations on confusing credential fields without leaving the wizard
**Depends on**: Phase 6
**Requirements**: VALID-01, UX-01
**Plans**: 3 plans
Plans:
- [x] 07-00: Wave 0 TDD stubs — failing tests for VALID-01 regex rejection/acceptance and UX-01 tooltip toggle
- [x] 07-01: VALID-01 — FieldDef validate extension + buildZodSchema regex chaining for 3 fields
- [x] 07-02: UX-01 — tooltipText in registry + FieldRenderer/PasswordField ⓘ toggle + AzureAuthToggle/SftpAuthToggle wiring + human verification
**Success Criteria** (what must be TRUE):
1. User who enters an Azure storage account name shorter than 3 characters or containing uppercase letters sees an inline error message before they can advance
2. User who enters an S3 region in an invalid format (e.g., spaces or uppercase) sees an inline error message
3. User can hover or click a tooltip icon on sensitive fields (SAS token, access key, SFTP auth method, OneDrive token) and read a plain-language explanation without navigating away
4. Tooltip content accurately distinguishes SAS token from storage account key in the Azure backend form
---
## Milestone Summary
**Key Decisions:**
- BACKEND_REGISTRY shape enriched to `{ displayName, description, fields }` — single source of truth for display AND field data
- WizardConsumerSetup pattern: in-test React component dispatches SET_DEPLOYMENT via useEffect (no production code changes)
- Unmount OutputBlocks entirely (conditional render) not CSS hidden — avoids stale component state
- GCS rclone type = 'google cloud storage' (with spaces) not 'gcs'
- SftpAuthToggle follows AzureAuthToggle CSS-hidden pattern for auth method switching
- OneDrive/GCS use paste-based token input (stateless browser-paste pattern)
- Three-branch ternary in RemoteConfigStep (azureblob/sftp/else) — custom logic minimal; most backends render via registry loop
- FieldDef extended with `validate` and `tooltipText` — additive, non-breaking to existing backends
- ⓘ button placed as sibling outside label element (avoids label text contamination)
- SFTP auth-method tooltip is section-level (above segmented control), not field-level
**Issues Resolved:**
- scriptTargets disconnect in ReviewStep (TECH-01)
- Missing Back button on ReviewStep (TECH-02)
- Hardcoded backend list in BackendSelectionStep (TECH-03)
- Dead `BackendFormValues<T>` export (TECH-04)
- `act()` warnings in tests (TECH-05)
**Issues Deferred:**
- 7 browser UI verifications still pending (inline validation error placement, tooltip toggle UX) — confirmatory, not discovery
- FieldRenderer aria inconsistency between text-branch (sr-only span) and select-branch (direct aria-label) — cosmetic
**Technical Debt Incurred:**
- Phase 7 VALIDATION.md has `nyquist_compliant: false` (phases 5 and 6 are compliant)
- 07-01-SUMMARY.md missing `requirements-completed` field for VALID-01 (doc gap only — code verified)
- Stale RED-state comments in RemoteConfigStep.test.tsx (features now implemented)
---
_For current project status, see .planning/ROADMAP.md_