chore: complete v1.2 milestone — archive roadmap, requirements, update retrospective
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -90,6 +90,50 @@
|
||||
|
||||
---
|
||||
|
||||
## Milestone: v1.2 — Polish & Task Management
|
||||
|
||||
**Shipped:** 2026-04-03
|
||||
**Phases:** 4 | **Plans:** 6
|
||||
|
||||
### What Was Built
|
||||
- Smart task delete: hard-delete for unused tasks, soft-delete (isActive flag) for tasks with history
|
||||
- Reworked frequency picker: 4 shortcut chips + freeform "Every N unit" interface
|
||||
- Dead code cleanup: 3 orphaned v1.0 files removed, zero regressions
|
||||
- Anytime task completion: checkboxes always enabled, nextDueDate recalculated from today
|
||||
- Recurring task pre-population: virtual instances on all interval days with 0.55 opacity muted styling
|
||||
- "Demnächst" (upcoming) section in calendar day view for pre-populated tasks
|
||||
|
||||
### What Worked
|
||||
- Drift schema migration pattern (v2→v3 with BoolColumn.withDefault) was clean — existing rows auto-migrated
|
||||
- Query-time virtual instances for pre-population avoided a schema migration entirely — provider-layer only
|
||||
- Phase 10 cleanup was surgical: 3 files deleted, DailyPlanDao preserved, all 144 tests passed
|
||||
- TDD continued to work well — 9 new DAO tests for pre-population queries caught edge cases
|
||||
- Plan 11-01 was small and focused (remove restrictions + fix recalculation) — executed quickly
|
||||
|
||||
### What Was Inefficient
|
||||
- Phase 11 split across two sessions due to scope — could have been planned as a single phase with tighter scope
|
||||
- Flutter/dart not available in CI-less environment — verification gate always needs human testing for visual/runtime items
|
||||
- _subtractMonths year-boundary bug was caught during execution — the plan's formula used Dart truncation division which fails for negative month values
|
||||
|
||||
### Patterns Established
|
||||
- isActive BoolColumn.withDefault(true) for soft-delete with auto-migration
|
||||
- _ShortcutFrequency enum with bidirectional toPickerValues()/fromPickerValues() for picker ↔ shortcut sync
|
||||
- Interval-window pre-population: query all recurring tasks, filter by `_isInCurrentIntervalWindow`, exclude completed-in-period
|
||||
- Total-month arithmetic for _subtractMonths: `totalMonths = year*12 + month - N` avoids Dart truncation division pitfall
|
||||
|
||||
### Key Lessons
|
||||
1. Provider-layer virtual instances are a powerful pattern for showing derived data without schema changes
|
||||
2. Dart's integer truncation division (`~/`) behaves differently from floor division for negative values — always test boundary cases
|
||||
3. Soft-delete with BoolColumn.withDefault is the cleanest Drift migration pattern — no backfill needed
|
||||
4. Small focused plans (11-01: 2 tasks, 4 files) execute faster and more reliably than large plans
|
||||
|
||||
### Cost Observations
|
||||
- Model mix: orchestrator on opus, executors/verifiers on sonnet
|
||||
- Sessions: 2 (plan 01 in prior session, plan 02 + verification in this session)
|
||||
- Notable: Plan 11-02 was the most complex single plan in v1.2 — 6 files, 3 new DAO methods, provider rewrite, UI changes
|
||||
|
||||
---
|
||||
|
||||
## Cross-Milestone Trends
|
||||
|
||||
### Process Evolution
|
||||
@@ -98,16 +142,19 @@
|
||||
|-----------|--------|-------|------------|
|
||||
| v1.0 | 4 | 13 | Initial project — established all patterns |
|
||||
| v1.1 | 3 | 5 | Reused v1.0 patterns — faster execution, auto-advance mode |
|
||||
| v1.2 | 4 | 6 | Schema migration, provider-layer virtual instances, soft-delete pattern |
|
||||
|
||||
### Cumulative Quality
|
||||
|
||||
| Milestone | Tests | LOC (lib) | Key Metric |
|
||||
|-----------|-------|-----------|------------|
|
||||
| v1.0 | 89 | 7,773 | dart analyze clean, 0 issues |
|
||||
| v1.1 | 108 | 9,051 | dart analyze clean, 0 issues |
|
||||
| Milestone | Tests | LOC (total) | Key Metric |
|
||||
|-----------|-------|-------------|------------|
|
||||
| v1.0 | 89 | 7,773 (lib) | dart analyze clean, 0 issues |
|
||||
| v1.1 | 108 | 9,051 (lib) | dart analyze clean, 0 issues |
|
||||
| v1.2 | 117+ | 13,232 (lib+test) | Drift schema v3, 14 requirements |
|
||||
|
||||
### Top Lessons (Verified Across Milestones)
|
||||
|
||||
1. **Research must verify current package API signatures** — v1.0 hit riverpod_generator type incompatibility, v1.1 hit StateProvider removal. Same root cause: outdated API assumptions in plans.
|
||||
2. **Established patterns compound** — v1.1 plans averaged ~5 min vs v1.0's ~6 min. Reusing DAO, provider, and test patterns eliminated design decisions.
|
||||
3. **Verification gates are cheap insurance** — Consistently ~2 min per phase, caught regressions in both milestones.
|
||||
2. **Established patterns compound** — v1.1 plans averaged ~5 min vs v1.0's ~6 min. v1.2 reused all established patterns seamlessly.
|
||||
3. **Verification gates are cheap insurance** — Consistently ~2 min per phase, caught regressions in all milestones.
|
||||
4. **Provider-layer transformations avoid schema migrations** — v1.2's pre-population used query-time virtual instances, proving complex derived views can live entirely in the provider layer.
|
||||
|
||||
Reference in New Issue
Block a user