| @@ -15,6 +15,37 @@ Agents must use it as the primary planning artifact for implementation work: | |||||
| If implementation order changes to unblock work, update `docs/scrum-backlog.md` to reflect that decision and keep the reasoning brief and explicit. | If implementation order changes to unblock work, update `docs/scrum-backlog.md` to reflect that decision and keep the reasoning brief and explicit. | ||||
| Agents must also consult: | |||||
| - `docs/decision-log.md` for accepted product and delivery decisions | |||||
| - `docs/release-mvp-checklist.md` for the current MVP completion criteria | |||||
| ## 1B. Current MVP-Now Delivery Contract | |||||
| The full CartWise v1 vision in this file remains the long-term target architecture and product direction. | |||||
| However, the **current active delivery target** is a **local MVP by September 10, 2026** for a **solo founder + AI** workflow. | |||||
| For the current MVP, prioritize only the smallest launchable grocery-memory slice: | |||||
| 1. Register and sign in. | |||||
| 2. Create and use a household. | |||||
| 3. Maintain one active grocery list. | |||||
| 4. Add free-text grocery items without requiring product resolution. | |||||
| 5. Toggle, skip, edit, and delete list items as required by the backlog. | |||||
| 6. Record purchases manually. | |||||
| 7. View basic personal price history. | |||||
| 8. Show deterministic running-low suggestions. | |||||
| 9. Ensure core flows work on a phone-sized layout. | |||||
| For the current MVP, these are explicitly **not launch blockers** unless the user reprioritizes them: | |||||
| - barcode scanning | |||||
| - camera scan workflows | |||||
| - Open Food Facts or USDA integration | |||||
| - dedicated shopping mode screens beyond what the list page can cover | |||||
| - hosted deployment | |||||
| - production PostgreSQL setup | |||||
| When this file and `docs/scrum-backlog.md` differ on near-term execution priority, use `docs/scrum-backlog.md` as the active delivery plan and keep this file as the broader product specification. | |||||
| Build **CartWise v1**, a mobile-first grocery companion web application using **ASP.NET Core MVC**, **Razor Views**, **HTML5**, **CSS3**, **jQuery**, and **vanilla JavaScript**. | Build **CartWise v1**, a mobile-first grocery companion web application using **ASP.NET Core MVC**, **Razor Views**, **HTML5**, **CSS3**, **jQuery**, and **vanilla JavaScript**. | ||||
| CartWise v1 is not a grocery delivery platform and is not tied to any retailer. Its first job is to become the shopper's grocery memory: | CartWise v1 is not a grocery delivery platform and is not tied to any retailer. Its first job is to become the shopper's grocery memory: | ||||
| @@ -45,6 +76,10 @@ Do **not** expand v1 into meal planning, coupon clipping, universal retailer che | |||||
| - Entity Framework Core | - Entity Framework Core | ||||
| - PostgreSQL | - PostgreSQL | ||||
| ### MVP Development Note | |||||
| - SQLite is acceptable and preferred for the current local MVP timeline | |||||
| - keep the design compatible with a later PostgreSQL move | |||||
| ### Optional / Later | ### Optional / Later | ||||
| - PostgreSQL PostGIS when geographic querying becomes necessary | - PostgreSQL PostGIS when geographic querying becomes necessary | ||||
| - IndexedDB + Service Worker for advanced offline/PWA functionality | - IndexedDB + Service Worker for advanced offline/PWA functionality | ||||
| @@ -1243,6 +1278,18 @@ Suggested concepts: | |||||
| Agents must follow this order unless a blocking dependency requires a small adjustment. | Agents must follow this order unless a blocking dependency requires a small adjustment. | ||||
| ### 22A. Current MVP-Now Build Order | |||||
| For the current local MVP target, execute in this order unless the user explicitly reprioritizes: | |||||
| 1. Foundation: solution, SQLite wiring, Identity, baseline tests. | |||||
| 2. Household: household entities, authorization, create household flow. | |||||
| 3. Grocery List: list and list item workflows with mobile-first Razor UI. | |||||
| 4. Purchases and Price History: manual purchase entry and basic price history. | |||||
| 5. Running-Low: deterministic suggestions on home/list experiences. | |||||
| 6. MVP Hardening: authorization review, anti-forgery review, mobile usability pass, release checklist verification. | |||||
| Post-MVP resumes after that in the backlog-defined order, especially product catalog/barcode work and dedicated shopping mode. | |||||
| ### Phase 0 — Repository and Baseline | ### Phase 0 — Repository and Baseline | ||||
| 1. Create `CartWise.sln` and the four projects. | 1. Create `CartWise.sln` and the four projects. | ||||
| 2. Add project references with clean direction: | 2. Add project references with clean direction: | ||||
| @@ -1253,10 +1300,12 @@ Agents must follow this order unless a blocking dependency requires a small adju | |||||
| 3. Configure nullable reference types. | 3. Configure nullable reference types. | ||||
| 4. Configure formatting/analyzers. | 4. Configure formatting/analyzers. | ||||
| 5. Configure PostgreSQL connection through environment/user secrets. | 5. Configure PostgreSQL connection through environment/user secrets. | ||||
| - For the current MVP, SQLite may be used instead and is preferred for local delivery speed. | |||||
| 6. Add ASP.NET Core Identity. | 6. Add ASP.NET Core Identity. | ||||
| 7. Verify app starts and basic test project runs. | 7. Verify app starts and basic test project runs. | ||||
| **Exit condition:** authenticated MVC shell runs against PostgreSQL. | **Exit condition:** authenticated MVC shell runs against PostgreSQL. | ||||
| For the current MVP, an authenticated MVC shell running correctly against SQLite is sufficient. | |||||
| ### Phase 1 — Household Foundation | ### Phase 1 — Household Foundation | ||||
| 1. ApplicationUser. | 1. ApplicationUser. | ||||
| @@ -1354,6 +1403,21 @@ Agents must follow this order unless a blocking dependency requires a small adju | |||||
| ## 23. Definition of Done for v1 | ## 23. Definition of Done for v1 | ||||
| ### 23A. Definition of Done for the Current MVP | |||||
| The current MVP is done when an authenticated household user can: | |||||
| 1. Register and sign in. | |||||
| 2. Create and use a household. | |||||
| 3. Maintain a grocery list from a phone-sized layout. | |||||
| 4. Add free-text grocery concepts without requiring catalog resolution. | |||||
| 5. Toggle, skip, edit, or delete list items as required by the MVP backlog. | |||||
| 6. Record purchase prices manually. | |||||
| 7. See basic personal price history. | |||||
| 8. Receive deterministic running-low suggestions from purchase history. | |||||
| 9. Use the application locally with SQLite and without retailer integrations, barcode scanning, or external product providers. | |||||
| For the current MVP, use `docs/release-mvp-checklist.md` as the practical release gate. | |||||
| CartWise v1 is done when an authenticated household can: | CartWise v1 is done when an authenticated household can: | ||||
| 1. Create/use a household. | 1. Create/use a household. | ||||
| @@ -1401,20 +1465,21 @@ Architectural seams may be left for later, but do not build speculative systems. | |||||
| 1. Read this file before changing architecture. | 1. Read this file before changing architecture. | ||||
| 2. Review `docs/scrum-backlog.md` before starting implementation work. | 2. Review `docs/scrum-backlog.md` before starting implementation work. | ||||
| 3. Update `docs/scrum-backlog.md` as work starts, changes, and completes. | 3. Update `docs/scrum-backlog.md` as work starts, changes, and completes. | ||||
| 4. Inspect existing code before creating parallel abstractions. | |||||
| 5. Prefer extending existing patterns over inventing new ones. | |||||
| 6. Keep controllers thin. | |||||
| 7. Keep persistence code out of Razor views and controllers. | |||||
| 8. Keep external provider response types inside Infrastructure. | |||||
| 9. Add tests for business rules and bug fixes. | |||||
| 10. Run build/tests after meaningful changes. | |||||
| 11. Do not silently change database semantics. | |||||
| 12. Create migrations for schema changes; never hand-edit production schema. | |||||
| 13. Never fabricate retailer capabilities or data. | |||||
| 4. Review `docs/decision-log.md` before changing near-term MVP scope or delivery assumptions. | |||||
| 5. Inspect existing code before creating parallel abstractions. | |||||
| 6. Prefer extending existing patterns over inventing new ones. | |||||
| 7. Keep controllers thin. | |||||
| 8. Keep persistence code out of Razor views and controllers. | |||||
| 9. Keep external provider response types inside Infrastructure. | |||||
| 10. Add tests for business rules and bug fixes. | |||||
| 11. Run build/tests after meaningful changes. | |||||
| 12. Do not silently change database semantics. | |||||
| 13. Create migrations for schema changes; never hand-edit production schema. | |||||
| 14. Never fabricate retailer capabilities or data. | |||||
| 14. If external data is unavailable, represent it as unavailable/stale—not guessed. | 14. If external data is unavailable, represent it as unavailable/stale—not guessed. | ||||
| 15. Preserve backward-compatible URLs where practical once routes ship. | |||||
| 16. Use comments for why, not obvious what. | |||||
| 17. Prefer clear conventional C# over clever abstraction. | |||||
| 16. Preserve backward-compatible URLs where practical once routes ship. | |||||
| 17. Use comments for why, not obvious what. | |||||
| 18. Prefer clear conventional C# over clever abstraction. | |||||
| --- | --- | ||||
| @@ -1,33 +1,66 @@ | |||||
| # CLAUDE.md — CartWise v1 Development Guide | |||||
| # CLAUDE.md - CartWise MVP Development Guide | |||||
| ## Read First | ## Read First | ||||
| This repository builds **CartWise**, a mobile-first grocery companion implemented as a conventional **ASP.NET Core MVC** application. | This repository builds **CartWise**, a mobile-first grocery companion implemented as a conventional **ASP.NET Core MVC** application. | ||||
| The canonical architecture and scope are defined in `AGENTS.md`. Read `AGENTS.md` completely before making architectural changes. This file gives Claude-specific operating guidance and a compact execution map. | |||||
| Read these files before making substantial changes: | |||||
| - `AGENTS.md` for the canonical product and architecture rules | |||||
| - `docs/scrum-backlog.md` for the living backlog and current execution plan | |||||
| - `docs/decision-log.md` for accepted scope and delivery decisions | |||||
| - `docs/release-mvp-checklist.md` for MVP completion criteria | |||||
| The living Scrum backlog is `docs/scrum-backlog.md`. Review it before starting substantial implementation work, and update it as work is started, split, blocked, deferred, or completed so the repository backlog stays aligned with the actual codebase state. | |||||
| Use `docs/scrum-backlog.md` as the shared execution tracker. Do not keep meaningful implementation progress only in chat. | |||||
| Use `docs/scrum-backlog.md` as the shared execution tracker for epics, stories, and tasks rather than keeping implementation progress only in chat. | |||||
| --- | |||||
| ## Current Delivery Context | |||||
| The current target is a **local MVP by September 10, 2026**. | |||||
| This repository is optimized for a **solo founder + AI** delivery model: | |||||
| - the founder acts as product owner, reviewer, and primary QA | |||||
| - AI helps with scaffolding, implementation, refactoring, and documentation | |||||
| - scope control matters more than feature breadth | |||||
| When in doubt, choose the **smallest working vertical slice** that moves MVP forward. | |||||
| --- | --- | ||||
| ## Backlog Workflow | |||||
| ## MVP Scope | |||||
| The current MVP must allow a user to: | |||||
| 1. Register and sign in | |||||
| 2. Create a household | |||||
| 3. Maintain one active shared grocery list | |||||
| 4. Add free-text grocery items without requiring product resolution | |||||
| 5. Toggle, skip, edit, or delete list items as needed by the MVP backlog | |||||
| 6. Record purchases manually | |||||
| 7. View basic personal price history | |||||
| 8. See deterministic running-low suggestions | |||||
| 9. Use the main flows on a phone-sized layout | |||||
| For MVP, CartWise must still be useful with: | |||||
| - zero retailer API access | |||||
| - zero barcode scanning | |||||
| - zero external product providers | |||||
| - local-first development and verification | |||||
| Before implementation work begins: | |||||
| - review the relevant epic and story in `docs/scrum-backlog.md` | |||||
| - confirm the work still fits the current `AGENTS.md` phase and scope | |||||
| - add or refine implementation tasks if new concrete work is discovered | |||||
| --- | |||||
| ## Explicitly Post-MVP | |||||
| While work is in progress: | |||||
| - keep backlog task wording specific and implementation-oriented | |||||
| - note blockers or sequencing changes in `docs/scrum-backlog.md` when they affect delivery order | |||||
| - avoid treating the backlog as static documentation; it is a living delivery artifact | |||||
| Unless the user explicitly changes scope, these are not MVP blockers: | |||||
| - barcode scanning | |||||
| - camera scan flows | |||||
| - Open Food Facts integration | |||||
| - USDA integration | |||||
| - dedicated shopping mode page | |||||
| - hosted deployment | |||||
| - production PostgreSQL setup | |||||
| - advanced product preference workflows beyond what the backlog marks as MVP | |||||
| When work is completed: | |||||
| - update `docs/scrum-backlog.md` to reflect completed stories or tasks | |||||
| - ensure code, tests, and verification support the completion claim | |||||
| - keep backlog status consistent with the actual repository contents | |||||
| If a request touches one of these areas, check `docs/scrum-backlog.md` first and keep the work aligned with its `Release`, `Priority`, and `Decision Gate` notes. | |||||
| --- | --- | ||||
| @@ -42,463 +75,280 @@ Use: | |||||
| - jQuery | - jQuery | ||||
| - vanilla JavaScript | - vanilla JavaScript | ||||
| - EF Core | - EF Core | ||||
| - PostgreSQL | |||||
| - SQLite for MVP and local development | |||||
| - ASP.NET Core Identity | - ASP.NET Core Identity | ||||
| Do not introduce React, Vue, Angular, Blazor, MAUI, Flutter, SPA architecture, microservices, MediatR, or unnecessary repository/unit-of-work wrappers unless explicitly requested. | |||||
| --- | |||||
| ## Product Goal | |||||
| CartWise v1 must help a household: | |||||
| 1. Maintain a shared grocery list. | |||||
| 2. Add generic concepts such as “milk” without requiring exact product selection. | |||||
| 3. Resolve exact packaged products when useful. | |||||
| 4. Scan UPC/GTIN barcodes. | |||||
| 5. Record purchases and prices. | |||||
| 6. Build personal price history. | |||||
| 7. Show typical/low/latest/unit price intelligence. | |||||
| 8. Suggest repeat items that are likely running low. | |||||
| 9. Shop from a simple phone-friendly shopping mode. | |||||
| CartWise must still be useful with **zero retailer API access**. | |||||
| Plan for later, but do not optimize for now: | |||||
| - PostgreSQL for hosted production | |||||
| - external product providers | |||||
| - scan workflows | |||||
| Do not introduce without explicit approval: | |||||
| - React | |||||
| - Vue | |||||
| - Angular | |||||
| - Blazor | |||||
| - .NET MAUI | |||||
| - Flutter | |||||
| - SPA architecture | |||||
| - microservices | |||||
| - MediatR | |||||
| - generic repository abstractions added only for pattern compliance | |||||
| --- | --- | ||||
| ## Architectural Boundaries | |||||
| ## Architecture Boundaries | |||||
| ### Web | |||||
| `CartWise.Web` | |||||
| - Controllers | |||||
| ### `CartWise.Web` | |||||
| Owns: | |||||
| - MVC controllers | |||||
| - Razor Views | - Razor Views | ||||
| - ViewModels | - ViewModels | ||||
| - HTML/CSS/JS | - HTML/CSS/JS | ||||
| - ASP.NET-specific concerns | - ASP.NET-specific concerns | ||||
| ### Application | |||||
| `CartWise.Application` | |||||
| - use cases | |||||
| ### `CartWise.Application` | |||||
| Owns: | |||||
| - use-case orchestration | |||||
| - services | - services | ||||
| - interfaces | - interfaces | ||||
| - validation | - validation | ||||
| - DTOs/results | |||||
| - DTOs and results | |||||
| ### Domain | |||||
| `CartWise.Domain` | |||||
| ### `CartWise.Domain` | |||||
| Owns: | |||||
| - entities | - entities | ||||
| - enums | - enums | ||||
| - value objects | - value objects | ||||
| - business rules | |||||
| - business rules and invariants | |||||
| No EF Core, HTTP, Razor, or provider SDK dependencies here. | |||||
| Do not place EF Core, Razor, HTTP, or provider SDK concerns here. | |||||
| ### Infrastructure | |||||
| `CartWise.Infrastructure` | |||||
| ### `CartWise.Infrastructure` | |||||
| Owns: | |||||
| - DbContext | - DbContext | ||||
| - EF configurations/migrations | |||||
| - PostgreSQL | |||||
| - Open Food Facts/USDA integrations | |||||
| - future retailer adapters | |||||
| Dependency direction should remain clean. | |||||
| --- | |||||
| ## Critical Domain Distinction | |||||
| Never collapse these concepts: | |||||
| ```text | |||||
| GroceryConcept: Peanut Butter | |||||
| Product: Jif Creamy Peanut Butter 16 oz | |||||
| - EF configurations and migrations | |||||
| - SQLite persistence for MVP | |||||
| - future PostgreSQL migration path | |||||
| - external integrations when they are actually implemented | |||||
| ProductIdentifier: UPC/GTIN identifying that package | |||||
| ``` | |||||
| A shopping list item may exist with only free text / concept data. Product resolution must not be mandatory to make a useful list. | |||||
| UPC/GTIN is never the Product primary key. | |||||
| --- | |||||
| ## Core Entities | |||||
| Implement in the order given in `AGENTS.md`. | |||||
| ### Identity / Household | |||||
| - ApplicationUser | |||||
| - Household | |||||
| - HouseholdMember | |||||
| ### Product Catalog | |||||
| - GroceryConcept | |||||
| - ProductCategory | |||||
| - Brand | |||||
| - Product | |||||
| - ProductIdentifier | |||||
| - HouseholdProductPreference | |||||
| ### Shopping | |||||
| - ShoppingList | |||||
| - ShoppingListItem | |||||
| ### Retail / Location | |||||
| - Retailer | |||||
| - StoreLocation | |||||
| ### History | |||||
| - Purchase | |||||
| - PurchaseItem | |||||
| - PriceObservation | |||||
| See `AGENTS.md` for exact fields, indexes, enums, and relationships. | |||||
| Keep dependency direction clean. | |||||
| --- | --- | ||||
| ## Required Services | |||||
| Keep controllers thin and use: | |||||
| - `IHouseholdService` | |||||
| - `IShoppingListService` | |||||
| - `IProductService` | |||||
| - `IProductEnrichmentService` | |||||
| - `IPriceService` | |||||
| - `IPurchaseService` | |||||
| - `IReplenishmentService` | |||||
| - `IShoppingModeService` | |||||
| - `IStoreService` | |||||
| Do not create one giant `CartWiseService`. | |||||
| Do not add abstractions without a real responsibility or testability benefit. | |||||
| --- | |||||
| ## Product Provider Rule | |||||
| External provider models stay inside Infrastructure. | |||||
| Use a normalized contract similar to: | |||||
| ```csharp | |||||
| public interface IProductDataProvider | |||||
| { | |||||
| string Name { get; } | |||||
| Task<ProductLookupResult?> FindByBarcodeAsync( | |||||
| string barcode, | |||||
| CancellationToken cancellationToken = default); | |||||
| Task<IReadOnlyList<ProductSearchResult>> SearchAsync( | |||||
| string query, | |||||
| CancellationToken cancellationToken = default); | |||||
| } | |||||
| ``` | |||||
| ## Backlog Workflow | |||||
| Lookup is always **local first**, provider second, then normalize and cache. | |||||
| Before implementation work: | |||||
| 1. Read the relevant epic and story in `docs/scrum-backlog.md`. | |||||
| 2. Confirm the story is still in MVP scope if the work is intended for the current release. | |||||
| 3. Check `docs/decision-log.md` for any accepted constraints. | |||||
| 4. Refine or add concrete tasks in the backlog if new implementation work is discovered. | |||||
| Open Food Facts should be the first packaged-product provider. USDA can enrich generic/nutrition data later. | |||||
| While implementing: | |||||
| 1. Keep backlog task wording specific and implementation-oriented. | |||||
| 2. Update `docs/scrum-backlog.md` if work is split, deferred, blocked, or completed. | |||||
| 3. Keep repository state and backlog state aligned. | |||||
| 4. Do not silently expand scope beyond the current story. | |||||
| Never expose an external provider's API response object to a controller or Razor view. | |||||
| After implementing: | |||||
| 1. Mark completed tasks in `docs/scrum-backlog.md`. | |||||
| 2. Add a brief note if a story is effectively complete. | |||||
| 3. Update `docs/decision-log.md` if a meaningful product or architecture decision was made. | |||||
| 4. Check `docs/release-mvp-checklist.md` when the work affects launch readiness. | |||||
| --- | --- | ||||
| ## Retailer API Rule | |||||
| ## Solo-Founder Working Rules | |||||
| Retailer integrations are optional. | |||||
| Optimize for finishing, not for theoretical completeness. | |||||
| Do not build application logic around specific retailer names. Use capability-aware adapters. | |||||
| Prefer: | |||||
| - one active story at a time | |||||
| - thin vertical slices | |||||
| - explicit acceptance criteria | |||||
| - simple database and hosting assumptions during MVP | |||||
| - reusable services only when they solve a real current need | |||||
| Never assume that price, inventory, promotions, or aisle data are available. | |||||
| Avoid: | |||||
| - speculative abstractions | |||||
| - premature generalization | |||||
| - building post-MVP capabilities during MVP work | |||||
| - “while I’m here” feature expansion | |||||
| - large refactors unless they unblock current backlog work | |||||
| When data is stale or unavailable, show that state explicitly instead of guessing. | |||||
| If a story feels larger than a day or two, split it before implementing. | |||||
| --- | --- | ||||
| ## MVC Routes | |||||
| Preserve these route intentions unless existing code requires a compatible adjustment. | |||||
| ```text | |||||
| GET / Home | |||||
| GET /household Household | |||||
| GET /list Active grocery list | |||||
| POST /list/items Add list item | |||||
| POST /list/items/{id}/toggle Toggle purchased | |||||
| POST /list/items/{id}/skip | |||||
| POST /list/items/{id}/delete | |||||
| GET /products/{id} | |||||
| GET /products/search?q= | |||||
| GET /products/barcode/{barcode} | |||||
| GET /scan | |||||
| GET /shopping/start | |||||
| POST /shopping/items/{id}/purchase | |||||
| POST /shopping/items/{id}/skip | |||||
| POST /shopping/items/{id}/unavailable | |||||
| POST /shopping/items/{id}/substitute | |||||
| POST /shopping/complete | |||||
| GET /prices | |||||
| GET /prices/product/{productId} | |||||
| POST /prices/product/{productId}/observe | |||||
| GET /purchases | |||||
| GET /purchases/{id} | |||||
| ``` | |||||
| Use `/api/...` only where browser JavaScript genuinely benefits from JSON. | |||||
| ## Domain Priorities For MVP | |||||
| ### Household | |||||
| Keep household isolation correct from the start. | |||||
| - do not trust posted household ids alone | |||||
| - validate membership server-side | |||||
| - prevent IDOR on household-scoped resources | |||||
| ### Shopping List | |||||
| The list is the center of MVP value. | |||||
| - free-text entry must work well | |||||
| - product resolution must not be required | |||||
| - mobile usability matters | |||||
| - one active list is enough for MVP | |||||
| ### Purchases and Prices | |||||
| Manual capture is acceptable for MVP. | |||||
| - a purchase flow does not need scan support | |||||
| - price history must be trustworthy | |||||
| - `PriceObservation` remains append-only | |||||
| - show latest, average, and lowest where data supports it | |||||
| ### Running Low | |||||
| Keep suggestions deterministic and explainable. | |||||
| - use purchase dates | |||||
| - use interval calculations | |||||
| - prefer median when enough history exists | |||||
| - never auto-add predicted items to the list | |||||
| --- | --- | ||||
| ## Razor / JavaScript Rules | |||||
| Razor is primary rendering. jQuery and vanilla JavaScript are both approved. | |||||
| Prefer jQuery for: | |||||
| - DOM selection and manipulation | |||||
| - delegated event handlers | |||||
| - form serialization | |||||
| - AJAX requests | |||||
| - lightweight partial refreshes | |||||
| - shopping-mode UI interactions | |||||
| ## Data and Persistence Rules | |||||
| Prefer vanilla JavaScript for: | |||||
| - barcode camera/scanner browser APIs | |||||
| - `navigator.mediaDevices` | |||||
| - IndexedDB and Service Workers | |||||
| - focused browser-native functionality where jQuery adds no value | |||||
| For MVP: | |||||
| - use SQLite | |||||
| - create EF Core migrations for schema changes | |||||
| - use explicit entity configurations | |||||
| - avoid lazy loading | |||||
| - use `AsNoTracking()` for read-heavy paths where appropriate | |||||
| - protect historical data from accidental cascade deletion | |||||
| - treat `PriceObservation` as append-only history | |||||
| Organize JavaScript under: | |||||
| ```text | |||||
| wwwroot/js/pages/ | |||||
| wwwroot/js/services/ | |||||
| wwwroot/js/components/ | |||||
| wwwroot/js/utils/ | |||||
| ``` | |||||
| Do not create a global monolithic `app.js`. | |||||
| Do not reinvent client-side framework patterns by hand. | |||||
| Do not mix jQuery and native DOM approaches arbitrarily inside the same function. | |||||
| Use `$.ajax`/`$.get`/`$.post` where jQuery is the clearer choice and `fetch` where native code is more appropriate. | |||||
| Use anti-forgery tokens for every state-changing JavaScript request. | |||||
| If a future PostgreSQL move affects a current design choice, note it in `docs/decision-log.md` rather than overengineering now. | |||||
| --- | --- | ||||
| ## Database Rules | |||||
| ## Security Rules | |||||
| - PostgreSQL UUID domain keys. | |||||
| - Identity's normal user key can remain its native string unless deliberately changed project-wide. | |||||
| - UTC timestamps / timestamptz. | |||||
| - decimal/numeric for money and quantities. | |||||
| - no float/double for prices. | |||||
| - explicit EF entity configurations. | |||||
| - no lazy loading. | |||||
| - `AsNoTracking()` for read paths. | |||||
| - protect historical data from accidental cascade deletion. | |||||
| - `PriceObservation` is append-only. | |||||
| - add indexes described in `AGENTS.md`. | |||||
| Always enforce: | |||||
| - ASP.NET Core Identity for authentication | |||||
| - anti-forgery protection on state-changing MVC requests | |||||
| - server-side validation | |||||
| - household-scoped authorization checks | |||||
| - safe handling of secrets and local configuration | |||||
| Every schema change requires an EF Core migration. | |||||
| Never: | |||||
| - trust client-supplied household ownership | |||||
| - expose secrets to client-side JavaScript | |||||
| - skip authorization because the app is currently local-only | |||||
| --- | --- | ||||
| ## Price Intelligence | |||||
| Do not call a stale observation a current price. | |||||
| Every price observation includes: | |||||
| - Product | |||||
| - optional Store | |||||
| - Price/SalePrice | |||||
| - ObservedUtc | |||||
| - SourceType | |||||
| - ConfidenceScore | |||||
| Display source/freshness where material. | |||||
| ## UI Rules | |||||
| For a household's typical price, favor median as the robust statistic; average may also be shown. | |||||
| Keep UI: | |||||
| - server-rendered first | |||||
| - mobile-first | |||||
| - touch-friendly on phone-sized layouts | |||||
| - progressively enhanced with jQuery or small vanilla JS modules | |||||
| Only label a price “good” after enough history exists. | |||||
| Do not turn the app into a client-side SPA. | |||||
| Unit price comparisons must use compatible units. | |||||
| Use JavaScript to enhance workflows, not replace Razor as the primary application shell. | |||||
| --- | --- | ||||
| ## Replenishment Algorithm v1 | |||||
| ## Validation and Testing | |||||
| No ML or LLM required. | |||||
| Before claiming work complete, prefer to verify: | |||||
| - valid input succeeds | |||||
| - invalid input fails clearly | |||||
| - household isolation holds | |||||
| - state-changing actions require anti-forgery coverage | |||||
| - impacted tests pass | |||||
| Use purchase history: | |||||
| 1. get recent purchase dates | |||||
| 2. calculate intervals | |||||
| 3. use median interval when enough data exists | |||||
| 4. estimate next due date | |||||
| 5. return a suggestion with confidence and reason | |||||
| When implementing business rules or bug fixes, add or update tests. | |||||
| Never automatically add predicted groceries to the list. The user chooses. | |||||
| When data model changes, verify migrations are included. | |||||
| --- | |||||
| ## Authorization | |||||
| Household isolation is critical. | |||||
| For every household-scoped resource: | |||||
| - derive or validate household context server-side | |||||
| - verify current user membership | |||||
| - do not trust posted HouseholdId alone | |||||
| - prevent IDOR | |||||
| Use centralized household authorization/service logic. | |||||
| All state-changing MVC requests require anti-forgery protection. | |||||
| Do not claim a feature works if the relevant build or tests were not run when the environment makes them available. | |||||
| --- | --- | ||||
| ## Working Style for Claude | |||||
| Before modifying code: | |||||
| 1. Read `AGENTS.md`. | |||||
| 2. Inspect the relevant existing controller/service/entity/configuration/tests. | |||||
| 3. Identify the smallest vertical change that satisfies the request. | |||||
| 4. Preserve existing architecture unless it conflicts with the specification. | |||||
| While implementing: | |||||
| 1. Keep methods small and intention-revealing. | |||||
| 2. Prefer conventional C#. | |||||
| 3. Use async I/O. | |||||
| 4. Pass `CancellationToken` through external/database-heavy application paths where appropriate. | |||||
| 5. Add validation close to the boundary and invariants in the domain where appropriate. | |||||
| 6. Avoid duplicate normalization or authorization logic. | |||||
| After implementing: | |||||
| 1. Build the solution. | |||||
| 2. Run relevant tests. | |||||
| 3. Run the full test suite when practical. | |||||
| 4. Check migrations when data model changes. | |||||
| 5. Report files changed and any intentionally deferred work. | |||||
| ## Recommended MVP Build Order | |||||
| Do not claim a feature works without running the relevant build/tests when the environment permits it. | |||||
| Follow this order unless the user explicitly reprioritizes: | |||||
| --- | |||||
| ## Exact Build Order | |||||
| Follow this progression: | |||||
| ### 0. Baseline | |||||
| - solution/projects | |||||
| - dependencies | |||||
| - PostgreSQL | |||||
| ### 1. Foundation | |||||
| - solution and projects | |||||
| - SQLite wiring | |||||
| - Identity | - Identity | ||||
| - test harness | |||||
| - baseline test harness | |||||
| ### 1. Household | |||||
| ### 2. Household | |||||
| - household entities | - household entities | ||||
| - membership | |||||
| - authorization | |||||
| - create/select household | |||||
| ### 2. Grocery List | |||||
| - concepts/categories | |||||
| - list/list items | |||||
| - add/toggle/delete | |||||
| - mobile Razor view | |||||
| ### 3. Products and Scan | |||||
| - brand/product/identifiers | |||||
| - household product preferences | |||||
| - local product lookup | |||||
| - Open Food Facts provider | |||||
| - barcode scan page | |||||
| ### 4. Purchase and Price History | |||||
| - retailer/store | |||||
| - purchase/purchase item | |||||
| - price observations | |||||
| - price service and views | |||||
| - membership and authorization | |||||
| - create household flow | |||||
| ### 5. Shopping Mode | |||||
| - grouped mobile list | |||||
| - purchase/skip/unavailable | |||||
| - optional entered price | |||||
| - complete trip | |||||
| ### 3. Grocery List | |||||
| - grocery concepts and categories as needed for MVP | |||||
| - list and list items | |||||
| - add, edit, toggle, skip, delete | |||||
| - mobile list UI | |||||
| ### 6. Running Low | |||||
| ### 4. Purchases and Price History | |||||
| - purchase and purchase item flows | |||||
| - price observations | |||||
| - basic price history views | |||||
| ### 5. Running Low | |||||
| - deterministic replenishment service | - deterministic replenishment service | ||||
| - suggestions on Home/List | |||||
| - home and list suggestions | |||||
| ### 7. Polish | |||||
| - accessibility | |||||
| - mobile/responsive testing | |||||
| - performance | |||||
| - PWA/offline only when core workflows are stable | |||||
| ### 6. MVP Hardening | |||||
| - authorization review | |||||
| - anti-forgery review | |||||
| - mobile usability pass | |||||
| - local release checklist verification | |||||
| Do not jump to Phase 6 features while Phase 2 is incomplete unless the user explicitly requests it. | |||||
| Post-MVP resumes after that. | |||||
| --- | --- | ||||
| ## First End-to-End Slice | ## First End-to-End Slice | ||||
| When asked to begin implementation, build this before broad scaffolding: | |||||
| When starting implementation, prove the foundation with a small working path: | |||||
| ```text | ```text | ||||
| Register/Login | Register/Login | ||||
| -> Create Household | -> Create Household | ||||
| -> Open /list | -> Open /list | ||||
| -> Add “Milk” | |||||
| -> Add "Milk" | |||||
| -> Persist item | -> Persist item | ||||
| -> Toggle Purchased | -> Toggle Purchased | ||||
| -> Reload | -> Reload | ||||
| -> Verify correct household-scoped state | -> Verify correct household-scoped state | ||||
| ``` | ``` | ||||
| This proves authentication, household authorization, EF persistence, MVC routing, Razor rendering, and form/JS behavior. | |||||
| --- | |||||
| ## Out of Scope Unless Explicitly Added | |||||
| Do not implement proactively: | |||||
| - meal planning | |||||
| - recipes | |||||
| - AI chat | |||||
| - nutrition optimization | |||||
| - receipt OCR | |||||
| - coupon clipping | |||||
| - retailer loyalty accounts | |||||
| - delivery/checkout | |||||
| - live universal inventory | |||||
| - store aisle maps | |||||
| - indoor navigation | |||||
| - multi-store routing | |||||
| - shrinkflation analysis | |||||
| - push notifications | |||||
| Leave clean seams for future work; do not build speculative infrastructure. | |||||
| This gives an early proof of: | |||||
| - authentication | |||||
| - household authorization | |||||
| - EF persistence | |||||
| - MVC routing | |||||
| - Razor rendering | |||||
| - state changes on the core list workflow | |||||
| --- | --- | ||||
| ## Definition of a Good CartWise Change | |||||
| A good change: | |||||
| - improves the shopper's grocery memory | |||||
| - keeps MVC server-rendered | |||||
| - works on a phone | |||||
| - does not require a retailer API unless specifically implementing one | |||||
| - preserves price source/freshness | |||||
| - maintains household isolation | |||||
| - adds tests for meaningful rules | |||||
| - avoids unnecessary framework or architecture expansion | |||||
| ## Definition Of A Good Change | |||||
| A good CartWise change: | |||||
| - advances the current MVP backlog | |||||
| - improves the household grocery-memory workflow | |||||
| - keeps MVC server-rendered first | |||||
| - works on a phone-sized layout | |||||
| - preserves household isolation | |||||
| - keeps price history trustworthy | |||||
| - avoids unnecessary architecture expansion | |||||
| - updates backlog or decision docs when needed | |||||
| North star: | North star: | ||||
| @@ -48,7 +48,8 @@ The following are explicitly out of scope for v1 unless requirements change: | |||||
| - jQuery | - jQuery | ||||
| - Vanilla JavaScript | - Vanilla JavaScript | ||||
| - Entity Framework Core | - Entity Framework Core | ||||
| - PostgreSQL | |||||
| - SQLite for MVP and local development | |||||
| - PostgreSQL planned for later hosted production use | |||||
| - ASP.NET Core Identity | - ASP.NET Core Identity | ||||
| ### Architecture | ### Architecture | ||||
| @@ -141,13 +142,15 @@ tests/ | |||||
| ## Development Status | ## Development Status | ||||
| This repository is being initialized from the `AGENTS.md` build specification. The current focus is establishing the project foundation, backlog, and delivery workflow before implementing the application phases. | |||||
| This repository is being initialized from the `AGENTS.md` build specification. The current focus is a solo-founder MVP targeted for local completion by **September 10, 2026**. | |||||
| ## Project Planning | ## Project Planning | ||||
| - Delivery guidance and architectural rules live in `AGENTS.md` | - Delivery guidance and architectural rules live in `AGENTS.md` | ||||
| - Claude-specific working guidance lives in `CLAUDE.md` | - Claude-specific working guidance lives in `CLAUDE.md` | ||||
| - The living Scrum backlog lives in `docs/scrum-backlog.md` | - The living Scrum backlog lives in `docs/scrum-backlog.md` | ||||
| - Key product and scope decisions live in `docs/decision-log.md` | |||||
| - MVP completion criteria live in `docs/release-mvp-checklist.md` | |||||
| - Update `docs/scrum-backlog.md` as stories and tasks move into active work and when work is completed | - Update `docs/scrum-backlog.md` as stories and tasks move into active work and when work is completed | ||||
| ## Getting Started | ## Getting Started | ||||
| @@ -155,9 +158,9 @@ This repository is being initialized from the `AGENTS.md` build specification. T | |||||
| The solution scaffolding is planned but may not yet be present in this repository. Once the projects are created, the expected local development flow will be: | The solution scaffolding is planned but may not yet be present in this repository. Once the projects are created, the expected local development flow will be: | ||||
| 1. Install the .NET SDK | 1. Install the .NET SDK | ||||
| 2. Install PostgreSQL | |||||
| 3. Configure connection settings via environment variables or user secrets | |||||
| 4. Run EF Core migrations | |||||
| 2. Use SQLite for local MVP development | |||||
| 3. Configure connection settings via environment variables, app settings, or user secrets as needed | |||||
| 4. Run EF Core migrations or schema creation steps | |||||
| 5. Start the ASP.NET Core MVC app | 5. Start the ASP.NET Core MVC app | ||||
| Example commands that will be used once the solution exists: | Example commands that will be used once the solution exists: | ||||
| @@ -176,7 +179,7 @@ The team plans to manage this project using Scrum with: | |||||
| - Epics aligned to the implementation phases | - Epics aligned to the implementation phases | ||||
| - User stories for each feature slice | - User stories for each feature slice | ||||
| - Tasks under each story for development, testing, and UI work | - Tasks under each story for development, testing, and UI work | ||||
| - Two-week sprints | |||||
| - A solo weekly planning cadence with one active story at a time | |||||
| - A definition of done that includes tests, authorization, validation, and logging | - A definition of done that includes tests, authorization, validation, and logging | ||||
| ## Security and Data Principles | ## Security and Data Principles | ||||
| @@ -0,0 +1,90 @@ | |||||
| # CartWise Decision Log | |||||
| ## Purpose | |||||
| This file records product, scope, architecture, and delivery decisions for CartWise so a solo founder + AI workflow does not repeatedly revisit the same unresolved questions. | |||||
| ## How To Use | |||||
| - Add a new entry when a decision changes backlog scope, technical direction, or release timing | |||||
| - Keep entries short and explicit | |||||
| - Reference related backlog stories in `docs/scrum-backlog.md` when helpful | |||||
| - Update an existing entry only to add a superseding decision or revisit trigger | |||||
| ## Entry Template | |||||
| ```md | |||||
| ### DEC-XXX - Short title | |||||
| - Date: YYYY-MM-DD | |||||
| - Status: Proposed | Accepted | Superseded | |||||
| - Decision: One-sentence summary | |||||
| - Reason: Why this was chosen | |||||
| - Impact: What changes in the backlog, implementation, or release plan | |||||
| - Revisit Trigger: What would cause this to be reconsidered | |||||
| ``` | |||||
| ## Decisions | |||||
| ### DEC-001 - MVP target and launch window | |||||
| - Date: 2026-08-10 | |||||
| - Status: Accepted | |||||
| - Decision: Target a local MVP completion by September 10, 2026. | |||||
| - Reason: A one-month deadline forces scope discipline and creates a practical solo-founder release target. | |||||
| - Impact: Only `MVP` and `P0` backlog work should be treated as launch-critical. | |||||
| - Revisit Trigger: The MVP cut changes or the launch target date moves. | |||||
| ### DEC-002 - Delivery model | |||||
| - Date: 2026-08-10 | |||||
| - Status: Accepted | |||||
| - Decision: Use a solo founder + AI delivery model with the founder acting as product owner, reviewer, and primary QA. | |||||
| - Reason: AI can accelerate implementation, but final product judgment and local verification remain human responsibilities. | |||||
| - Impact: Backlog items must stay small, explicit, and easy to verify locally. | |||||
| - Revisit Trigger: Additional human contributors join active development. | |||||
| ### DEC-003 - Barcode scanning is out of MVP | |||||
| - Date: 2026-08-10 | |||||
| - Status: Accepted | |||||
| - Decision: Barcode scanning, camera workflows, and scan-page work are deferred until after MVP. | |||||
| - Reason: These features add complexity and are not required for the first launchable grocery-memory workflow. | |||||
| - Impact: `CW-EPIC-04` barcode and scan stories remain `Post-MVP` or `Deferred`. | |||||
| - Revisit Trigger: Core MVP is stable and there is time to add scan functionality. | |||||
| ### DEC-004 - External product providers are out of MVP | |||||
| - Date: 2026-08-10 | |||||
| - Status: Accepted | |||||
| - Decision: Open Food Facts, USDA, and other external provider integrations are deferred until after MVP. | |||||
| - Reason: Manual and local-only workflows are sufficient for MVP and reduce dependency risk. | |||||
| - Impact: Provider-related backlog stories remain `Deferred` or `Post-MVP`. | |||||
| - Revisit Trigger: MVP is complete and product resolution becomes the next highest-value feature. | |||||
| ### DEC-005 - SQLite for MVP development | |||||
| - Date: 2026-08-10 | |||||
| - Status: Accepted | |||||
| - Decision: Use SQLite for MVP and local development instead of PostgreSQL. | |||||
| - Reason: SQLite lowers setup friction and is better suited for a fast local-first development loop. | |||||
| - Impact: Foundation stories should wire SQLite first while keeping a future PostgreSQL path possible. | |||||
| - Revisit Trigger: Hosted or multi-user production deployment becomes the priority. | |||||
| ### DEC-006 - Local-first release strategy | |||||
| - Date: 2026-08-10 | |||||
| - Status: Accepted | |||||
| - Decision: Build and validate the app locally before any public deployment work. | |||||
| - Reason: Local-first release reduces operational complexity during MVP delivery. | |||||
| - Impact: Public hosting, infrastructure, and deployment work are not launch blockers for the current MVP. | |||||
| - Revisit Trigger: Local MVP is stable and ready for broader testing. | |||||
| ### DEC-007 - Shopping mode may be deferred | |||||
| - Date: 2026-08-10 | |||||
| - Status: Accepted | |||||
| - Decision: A dedicated shopping mode page is post-MVP unless the standard list page proves insufficient. | |||||
| - Reason: A mobile-friendly list can satisfy core purchase flow needs with less implementation overhead. | |||||
| - Impact: `CW-EPIC-06` is treated as post-MVP for now. | |||||
| - Revisit Trigger: MVP list flow cannot support practical in-store use. | |||||
| ### DEC-008 - Manual purchase flow is acceptable for MVP | |||||
| - Date: 2026-08-10 | |||||
| - Status: Accepted | |||||
| - Decision: Manual purchase entry is acceptable for MVP even if list-to-purchase linkage is simplified at first. | |||||
| - Reason: Price history and replenishment value can be delivered without sophisticated scan or shopping workflows. | |||||
| - Impact: Purchase and price stories stay in MVP while more advanced purchase linkage can evolve later. | |||||
| - Revisit Trigger: Manual purchase entry creates too much friction during testing. | |||||
| @@ -0,0 +1,62 @@ | |||||
| # CartWise MVP Release Checklist | |||||
| ## Target | |||||
| Local MVP ready by **September 10, 2026**. | |||||
| ## Scope Guardrail | |||||
| This checklist applies only to the MVP scope currently defined in `docs/scrum-backlog.md`. Post-MVP work such as barcode scanning, external product providers, and a dedicated shopping mode page should not block MVP completion. | |||||
| ## Product Outcomes | |||||
| - [ ] User can register and sign in | |||||
| - [ ] User can create a household | |||||
| - [ ] User can access only their own household-scoped data | |||||
| - [ ] User can create or access one active grocery list | |||||
| - [ ] User can add free-text grocery items | |||||
| - [ ] User can edit, toggle, skip, or delete grocery items as required by MVP | |||||
| - [ ] User can manually record a purchase | |||||
| - [ ] User can view basic price history for purchased items | |||||
| - [ ] User can see running-low suggestions from purchase history | |||||
| - [ ] Core list and purchase flows are usable on a phone-sized layout | |||||
| ## Technical Outcomes | |||||
| - [ ] Solution builds locally | |||||
| - [ ] Tests for implemented business rules pass locally | |||||
| - [ ] SQLite is wired and used for MVP development | |||||
| - [ ] Migrations or schema creation flow are documented and verified | |||||
| - [ ] Anti-forgery protection is enforced on state-changing requests | |||||
| - [ ] Household authorization is enforced on every household-scoped workflow | |||||
| - [ ] Validation messages are shown for key invalid inputs | |||||
| - [ ] Logging exists for meaningful failures and authorization issues | |||||
| ## Verification Steps | |||||
| - [ ] Start from a clean local setup | |||||
| - [ ] Create a new user account | |||||
| - [ ] Create a household | |||||
| - [ ] Add several grocery list items | |||||
| - [ ] Mark at least one item purchased | |||||
| - [ ] Record a manual purchase with price data | |||||
| - [ ] Confirm price history appears correctly | |||||
| - [ ] Confirm running-low logic works with seeded or test purchase history | |||||
| - [ ] Confirm unauthorized household access is blocked | |||||
| - [ ] Confirm layout is acceptable on a phone-sized viewport | |||||
| ## Non-Blocking Items For MVP | |||||
| These may remain unfinished without blocking MVP signoff: | |||||
| - [ ] Barcode scanning | |||||
| - [ ] Open Food Facts integration | |||||
| - [ ] USDA integration | |||||
| - [ ] Camera scan page | |||||
| - [ ] Dedicated shopping mode page | |||||
| - [ ] Hosted deployment | |||||
| - [ ] Production PostgreSQL setup | |||||
| ## Release Decision | |||||
| - [ ] MVP accepted for local release and continued post-MVP iteration | |||||
| @@ -4,26 +4,28 @@ | |||||
| This document translates the product and implementation guidance from `AGENTS.md` into a Scrum-friendly backlog for CartWise v1. It organizes work into epics, user stories, and implementation tasks that align with the required phased delivery order. | This document translates the product and implementation guidance from `AGENTS.md` into a Scrum-friendly backlog for CartWise v1. It organizes work into epics, user stories, and implementation tasks that align with the required phased delivery order. | ||||
| This backlog is optimized for a solo founder + AI delivery model targeting a local MVP by **September 10, 2026**. | |||||
| ## Product Vision | ## Product Vision | ||||
| CartWise is a mobile-first grocery companion web app that helps households remember what to buy, what they bought, what they paid, and what they may need again soon. | CartWise is a mobile-first grocery companion web app that helps households remember what to buy, what they bought, what they paid, and what they may need again soon. | ||||
| ## Scrum Workflow | ## Scrum Workflow | ||||
| ### Cadence | |||||
| ### Solo Cadence | |||||
| - Sprint length: 2 weeks | |||||
| - Planning: first day of sprint | |||||
| - Daily Scrum: 15 minutes | |||||
| - Backlog refinement: once per sprint | |||||
| - Review and demo: final day of sprint | |||||
| - Retrospective: immediately after review | |||||
| - Planning cadence: weekly | |||||
| - Delivery rhythm: one active story at a time | |||||
| - Daily check-in: review top 3 priorities and blockers | |||||
| - Backlog refinement: once per week | |||||
| - Review/demo: every Friday | |||||
| - Retrospective: every 2 weeks | |||||
| ### Roles | |||||
| ### Working Model | |||||
| - **Product Owner**: prioritizes scope, clarifies acceptance criteria, approves sprint outcomes | |||||
| - **Scrum Master**: facilitates ceremonies, removes blockers, protects sprint focus | |||||
| - **Development Team**: designs, builds, tests, documents, and verifies product increments | |||||
| - **Founder / Product Owner**: prioritizes scope, clarifies acceptance criteria, reviews AI output, and decides trade-offs | |||||
| - **AI Development Partner**: scaffolds, implements, documents, and proposes follow-up tasks within approved scope | |||||
| - **Primary QA**: founder validates behavior locally before marking stories done | |||||
| ### Board Columns | ### Board Columns | ||||
| @@ -37,9 +39,9 @@ CartWise is a mobile-first grocery companion web app that helps households remem | |||||
| ### Estimation | ### Estimation | ||||
| - Estimate stories in story points | |||||
| - Track tasks as checklist items or engineering subtasks | |||||
| - Keep stories small enough to complete within one sprint when possible | |||||
| - Use `XS`, `S`, `M`, and `L` sizing on stories | |||||
| - Split any story larger than `L` before implementation | |||||
| - Track tasks as checklist items and keep them aligned with the repository state | |||||
| ## Definitions | ## Definitions | ||||
| @@ -73,24 +75,42 @@ A story is done when: | |||||
| - Update story acceptance criteria or add a short status note when a story is fully delivered | - Update story acceptance criteria or add a short status note when a story is fully delivered | ||||
| - Keep task state aligned with the actual repository state | - Keep task state aligned with the actual repository state | ||||
| ## Release Strategy | |||||
| - `Release: MVP` means required for the local launch target by **September 10, 2026** | |||||
| - `Release: Post-MVP` means explicitly deferred until after MVP is stable | |||||
| - `Release: Deferred` means do not implement unless scope changes | |||||
| - `Priority: P0` means must ship for MVP | |||||
| - `Priority: P1` means valuable next but can slip | |||||
| - `Priority: P2` means later or exploratory | |||||
| - `Effort: XS` under 2 hours, `S` about half a day, `M` about a day, `L` 2 or more days | |||||
| - `Decision Gate` calls out places where the founder must make a product or architecture decision before implementation continues | |||||
| ## Epic Roadmap | ## Epic Roadmap | ||||
| ### MVP Release | |||||
| 1. `CW-EPIC-01` Platform Foundation | 1. `CW-EPIC-01` Platform Foundation | ||||
| 2. `CW-EPIC-02` Household and Access Control | 2. `CW-EPIC-02` Household and Access Control | ||||
| 3. `CW-EPIC-03` Smart Shopping List | 3. `CW-EPIC-03` Smart Shopping List | ||||
| 4. `CW-EPIC-04` Product Catalog and Barcode Resolution | |||||
| 5. `CW-EPIC-05` Stores, Purchases, and Price Intelligence | |||||
| 6. `CW-EPIC-06` Shopping Mode | |||||
| 7. `CW-EPIC-07` Running-Low Suggestions | |||||
| 8. `CW-EPIC-08` UX Polish, Security, and Release Readiness | |||||
| 4. `CW-EPIC-05` Stores, Purchases, and Price Intelligence | |||||
| 5. `CW-EPIC-07` Running-Low Suggestions | |||||
| 6. Selected hardening work from `CW-EPIC-08` | |||||
| ### Post-MVP Release | |||||
| 1. `CW-EPIC-04` Product Catalog and Barcode Resolution | |||||
| 2. `CW-EPIC-06` Shopping Mode | |||||
| 3. Remaining polish work from `CW-EPIC-08` | |||||
| --- | --- | ||||
| ## `CW-EPIC-01` Platform Foundation | ## `CW-EPIC-01` Platform Foundation | ||||
| **Goal:** establish the solution structure, authentication, PostgreSQL wiring, and baseline engineering standards. | |||||
| **Goal:** establish the solution structure, authentication, SQLite wiring for MVP, and baseline engineering standards. | |||||
| ### `CW-STORY-01.1` Create solution skeleton | ### `CW-STORY-01.1` Create solution skeleton | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** S | |||||
| **User story:** As a developer, I want the CartWise solution scaffolded so the app follows a clean modular architecture. | **User story:** As a developer, I want the CartWise solution scaffolded so the app follows a clean modular architecture. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -112,23 +132,31 @@ A story is done when: | |||||
| - [ ] Enable nullable reference types | - [ ] Enable nullable reference types | ||||
| ### `CW-STORY-01.2` Configure application startup | ### `CW-STORY-01.2` Configure application startup | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** M | |||||
| **User story:** As a developer, I want a runnable MVC shell so the team can build on a working baseline. | **User story:** As a developer, I want a runnable MVC shell so the team can build on a working baseline. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| - ASP.NET Core MVC app starts locally | - ASP.NET Core MVC app starts locally | ||||
| - Shared layout and static assets load correctly | - Shared layout and static assets load correctly | ||||
| - Environment-based configuration is wired | - Environment-based configuration is wired | ||||
| - PostgreSQL connection is configurable | |||||
| - SQLite connection is configurable for MVP | |||||
| - PostgreSQL migration path remains possible later | |||||
| **Tasks** | **Tasks** | ||||
| - [ ] Configure MVC services and middleware | - [ ] Configure MVC services and middleware | ||||
| - [ ] Add base layout and navigation shell | - [ ] Add base layout and navigation shell | ||||
| - [ ] Organize `wwwroot` structure | - [ ] Organize `wwwroot` structure | ||||
| - [ ] Add configuration bindings | - [ ] Add configuration bindings | ||||
| - [ ] Wire PostgreSQL connection string | |||||
| - [ ] Wire SQLite connection string for MVP | |||||
| - [ ] Note PostgreSQL transition path in docs | |||||
| - [ ] Verify local app startup | - [ ] Verify local app startup | ||||
| ### `CW-STORY-01.3` Add Identity authentication | ### `CW-STORY-01.3` Add Identity authentication | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** M | |||||
| **User story:** As a user, I want to sign in so my household data is protected. | **User story:** As a user, I want to sign in so my household data is protected. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -144,6 +172,9 @@ A story is done when: | |||||
| - [ ] Verify login and logout flow | - [ ] Verify login and logout flow | ||||
| ### `CW-STORY-01.4` Establish engineering baseline | ### `CW-STORY-01.4` Establish engineering baseline | ||||
| **Release:** MVP | |||||
| **Priority:** P1 | |||||
| **Effort:** S | |||||
| **User story:** As a team, we want build and test standards so changes remain stable over time. | **User story:** As a team, we want build and test standards so changes remain stable over time. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -164,6 +195,9 @@ A story is done when: | |||||
| **Goal:** enable household creation, membership, and household-scoped authorization. | **Goal:** enable household creation, membership, and household-scoped authorization. | ||||
| ### `CW-STORY-02.1` Model households and membership | ### `CW-STORY-02.1` Model households and membership | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** S | |||||
| **User story:** As a developer, I want household entities persisted so household features have a secure foundation. | **User story:** As a developer, I want household entities persisted so household features have a secure foundation. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -180,6 +214,9 @@ A story is done when: | |||||
| - [ ] Add domain tests | - [ ] Add domain tests | ||||
| ### `CW-STORY-02.2` Implement household service | ### `CW-STORY-02.2` Implement household service | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** M | |||||
| **User story:** As a developer, I want household operations centralized so controllers stay thin and rules stay testable. | **User story:** As a developer, I want household operations centralized so controllers stay thin and rules stay testable. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -196,6 +233,9 @@ A story is done when: | |||||
| - [ ] Add application tests | - [ ] Add application tests | ||||
| ### `CW-STORY-02.3` Build household UI | ### `CW-STORY-02.3` Build household UI | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** S | |||||
| **User story:** As a user, I want to create and view my household so I can begin using CartWise. | **User story:** As a user, I want to create and view my household so I can begin using CartWise. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -212,6 +252,9 @@ A story is done when: | |||||
| - [ ] Add redirect flow after creation | - [ ] Add redirect flow after creation | ||||
| ### `CW-STORY-02.4` Enforce household authorization | ### `CW-STORY-02.4` Enforce household authorization | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** S | |||||
| **User story:** As a user, I want household data isolated so other users cannot access it. | **User story:** As a user, I want household data isolated so other users cannot access it. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -232,6 +275,9 @@ A story is done when: | |||||
| **Goal:** allow household members to maintain a shared grocery list, including unresolved free-text items. | **Goal:** allow household members to maintain a shared grocery list, including unresolved free-text items. | ||||
| ### `CW-STORY-03.1` Model shopping list and grocery concepts | ### `CW-STORY-03.1` Model shopping list and grocery concepts | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** M | |||||
| **User story:** As a developer, I want shopping list entities defined so shared list workflows can be persisted. | **User story:** As a developer, I want shopping list entities defined so shared list workflows can be persisted. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -250,6 +296,9 @@ A story is done when: | |||||
| - [ ] Create migration | - [ ] Create migration | ||||
| ### `CW-STORY-03.2` Implement active shopping list service | ### `CW-STORY-03.2` Implement active shopping list service | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** S | |||||
| **User story:** As a user, I want my household to have an active grocery list so shared planning is easy. | **User story:** As a user, I want my household to have an active grocery list so shared planning is easy. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -265,6 +314,9 @@ A story is done when: | |||||
| - [ ] Add application tests | - [ ] Add application tests | ||||
| ### `CW-STORY-03.3` Add grocery items quickly | ### `CW-STORY-03.3` Add grocery items quickly | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** S | |||||
| **User story:** As a household member, I want to add free-text grocery items quickly so I do not lose shopping intent. | **User story:** As a household member, I want to add free-text grocery items quickly so I do not lose shopping intent. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -282,6 +334,9 @@ A story is done when: | |||||
| - [ ] Add tests | - [ ] Add tests | ||||
| ### `CW-STORY-03.4` Update shopping list items | ### `CW-STORY-03.4` Update shopping list items | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** M | |||||
| **User story:** As a household member, I want to toggle, skip, and delete items so the list stays accurate. | **User story:** As a household member, I want to toggle, skip, and delete items so the list stays accurate. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -300,6 +355,9 @@ A story is done when: | |||||
| - [ ] Add tests | - [ ] Add tests | ||||
| ### `CW-STORY-03.5` Deliver a mobile-first list UI | ### `CW-STORY-03.5` Deliver a mobile-first list UI | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** S | |||||
| **User story:** As a shopper, I want a touch-friendly grocery list so it works well on my phone. | **User story:** As a shopper, I want a touch-friendly grocery list so it works well on my phone. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -321,6 +379,10 @@ A story is done when: | |||||
| **Goal:** support product identity, household product preferences, and local-first barcode resolution with provider fallback. | **Goal:** support product identity, household product preferences, and local-first barcode resolution with provider fallback. | ||||
| ### `CW-STORY-04.1` Model product catalog entities | ### `CW-STORY-04.1` Model product catalog entities | ||||
| **Release:** Post-MVP | |||||
| **Priority:** P1 | |||||
| **Effort:** M | |||||
| **Decision Gate:** Confirm whether a product catalog is still needed before barcode work begins. | |||||
| **User story:** As a developer, I want product and identifier entities modeled so products can be resolved independently of UPC. | **User story:** As a developer, I want product and identifier entities modeled so products can be resolved independently of UPC. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -339,6 +401,9 @@ A story is done when: | |||||
| - [ ] Create migration | - [ ] Create migration | ||||
| ### `CW-STORY-04.2` Search and view products | ### `CW-STORY-04.2` Search and view products | ||||
| **Release:** Post-MVP | |||||
| **Priority:** P1 | |||||
| **Effort:** M | |||||
| **User story:** As a user, I want to search and view products so I can understand and choose preferred items. | **User story:** As a user, I want to search and view products so I can understand and choose preferred items. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -356,6 +421,10 @@ A story is done when: | |||||
| - [ ] Add tests | - [ ] Add tests | ||||
| ### `CW-STORY-04.3` Implement barcode lookup flow | ### `CW-STORY-04.3` Implement barcode lookup flow | ||||
| **Release:** Deferred | |||||
| **Priority:** P2 | |||||
| **Effort:** M | |||||
| **Decision Gate:** Barcode scanning is out of MVP scope. | |||||
| **User story:** As a shopper, I want a barcode lookup flow so known products can be resolved quickly. | **User story:** As a shopper, I want a barcode lookup flow so known products can be resolved quickly. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -372,6 +441,10 @@ A story is done when: | |||||
| - [ ] Add unit and application tests | - [ ] Add unit and application tests | ||||
| ### `CW-STORY-04.4` Integrate Open Food Facts | ### `CW-STORY-04.4` Integrate Open Food Facts | ||||
| **Release:** Deferred | |||||
| **Priority:** P2 | |||||
| **Effort:** M | |||||
| **Decision Gate:** External providers are out of MVP scope. | |||||
| **User story:** As a developer, I want a provider fallback for unknown products so barcode resolution remains useful. | **User story:** As a developer, I want a provider fallback for unknown products so barcode resolution remains useful. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -387,6 +460,10 @@ A story is done when: | |||||
| - [ ] Add tests with mocked provider behavior | - [ ] Add tests with mocked provider behavior | ||||
| ### `CW-STORY-04.5` Build scan page | ### `CW-STORY-04.5` Build scan page | ||||
| **Release:** Deferred | |||||
| **Priority:** P2 | |||||
| **Effort:** M | |||||
| **Decision Gate:** Camera scan flow is out of MVP scope. | |||||
| **User story:** As a shopper, I want a camera-based scan page so I can identify products with my phone. | **User story:** As a shopper, I want a camera-based scan page so I can identify products with my phone. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -408,6 +485,10 @@ A story is done when: | |||||
| **Goal:** record where purchases happened and build a trustworthy append-only price history. | **Goal:** record where purchases happened and build a trustworthy append-only price history. | ||||
| ### `CW-STORY-05.1` Model retailers and store locations | ### `CW-STORY-05.1` Model retailers and store locations | ||||
| **Release:** MVP | |||||
| **Priority:** P1 | |||||
| **Effort:** S | |||||
| **Decision Gate:** Decide whether store tracking in MVP is minimal or omitted from first purchase flow. | |||||
| **User story:** As a developer, I want retailer and store entities so purchases can be tied to real locations. | **User story:** As a developer, I want retailer and store entities so purchases can be tied to real locations. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -423,6 +504,9 @@ A story is done when: | |||||
| - [ ] Add tests for basic persistence rules | - [ ] Add tests for basic persistence rules | ||||
| ### `CW-STORY-05.2` Model purchases and purchase items | ### `CW-STORY-05.2` Model purchases and purchase items | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** M | |||||
| **User story:** As a developer, I want purchase history modeled so shopping outcomes can be stored. | **User story:** As a developer, I want purchase history modeled so shopping outcomes can be stored. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -439,6 +523,9 @@ A story is done when: | |||||
| - [ ] Add tests | - [ ] Add tests | ||||
| ### `CW-STORY-05.3` Model append-only price observations | ### `CW-STORY-05.3` Model append-only price observations | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** S | |||||
| **User story:** As a developer, I want append-only price observations so historical price facts are preserved. | **User story:** As a developer, I want append-only price observations so historical price facts are preserved. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -454,6 +541,10 @@ A story is done when: | |||||
| - [ ] Add tests for append-only behavior | - [ ] Add tests for append-only behavior | ||||
| ### `CW-STORY-05.4` Record household purchases | ### `CW-STORY-05.4` Record household purchases | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** M | |||||
| **Decision Gate:** Decide whether MVP purchase entry must link directly to shopping list items or can begin as a manual flow. | |||||
| **User story:** As a shopper, I want to record purchases so CartWise can remember what I bought and what I paid. | **User story:** As a shopper, I want to record purchases so CartWise can remember what I bought and what I paid. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -470,6 +561,9 @@ A story is done when: | |||||
| - [ ] Add tests | - [ ] Add tests | ||||
| ### `CW-STORY-05.5` Derive price intelligence | ### `CW-STORY-05.5` Derive price intelligence | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** M | |||||
| **User story:** As a user, I want price history and price insights so I can make better grocery decisions. | **User story:** As a user, I want price history and price insights so I can make better grocery decisions. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -487,6 +581,9 @@ A story is done when: | |||||
| - [ ] Add tests for price statistics | - [ ] Add tests for price statistics | ||||
| ### `CW-STORY-05.6` Build price views | ### `CW-STORY-05.6` Build price views | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** S | |||||
| **User story:** As a user, I want a price history screen so I can review what my household typically pays. | **User story:** As a user, I want a price history screen so I can review what my household typically pays. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -509,6 +606,10 @@ A story is done when: | |||||
| **Goal:** provide a simple, touch-friendly in-store workflow for marking progress and recording purchases. | **Goal:** provide a simple, touch-friendly in-store workflow for marking progress and recording purchases. | ||||
| ### `CW-STORY-06.1` Implement shopping mode service | ### `CW-STORY-06.1` Implement shopping mode service | ||||
| **Release:** Post-MVP | |||||
| **Priority:** P1 | |||||
| **Effort:** S | |||||
| **Decision Gate:** Decide whether a dedicated shopping mode is needed beyond the list page. | |||||
| **User story:** As a developer, I want shopping-mode orchestration so in-store behavior is consistent and testable. | **User story:** As a developer, I want shopping-mode orchestration so in-store behavior is consistent and testable. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -524,6 +625,9 @@ A story is done when: | |||||
| - [ ] Add tests | - [ ] Add tests | ||||
| ### `CW-STORY-06.2` Build shopping mode UI | ### `CW-STORY-06.2` Build shopping mode UI | ||||
| **Release:** Post-MVP | |||||
| **Priority:** P1 | |||||
| **Effort:** M | |||||
| **User story:** As a shopper, I want a low-noise mobile shopping view so I can use CartWise during a real trip. | **User story:** As a shopper, I want a low-noise mobile shopping view so I can use CartWise during a real trip. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -539,6 +643,9 @@ A story is done when: | |||||
| - [ ] Add `wwwroot/js/pages/shopping-mode.js` | - [ ] Add `wwwroot/js/pages/shopping-mode.js` | ||||
| ### `CW-STORY-06.3` Support in-store item actions | ### `CW-STORY-06.3` Support in-store item actions | ||||
| **Release:** Post-MVP | |||||
| **Priority:** P1 | |||||
| **Effort:** M | |||||
| **User story:** As a shopper, I want to mark items purchased, skipped, unavailable, or substituted so the trip stays accurate. | **User story:** As a shopper, I want to mark items purchased, skipped, unavailable, or substituted so the trip stays accurate. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -555,6 +662,9 @@ A story is done when: | |||||
| - [ ] Add tests | - [ ] Add tests | ||||
| ### `CW-STORY-06.4` Record prices while shopping | ### `CW-STORY-06.4` Record prices while shopping | ||||
| **Release:** Post-MVP | |||||
| **Priority:** P1 | |||||
| **Effort:** S | |||||
| **User story:** As a shopper, I want to optionally enter prices in shopping mode so price history stays current. | **User story:** As a shopper, I want to optionally enter prices in shopping mode so price history stays current. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -575,6 +685,9 @@ A story is done when: | |||||
| **Goal:** use deterministic purchase history to suggest what a household may need soon. | **Goal:** use deterministic purchase history to suggest what a household may need soon. | ||||
| ### `CW-STORY-07.1` Build replenishment engine | ### `CW-STORY-07.1` Build replenishment engine | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** M | |||||
| **User story:** As a developer, I want deterministic running-low logic so suggestions are explainable and testable. | **User story:** As a developer, I want deterministic running-low logic so suggestions are explainable and testable. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -593,6 +706,10 @@ A story is done when: | |||||
| - [ ] Add tests | - [ ] Add tests | ||||
| ### `CW-STORY-07.2` Show suggestions on home and list views | ### `CW-STORY-07.2` Show suggestions on home and list views | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** S | |||||
| **Decision Gate:** Confirm the minimum launch dashboard: active list count, recent prices, and running-low suggestions. | |||||
| **User story:** As a user, I want running-low suggestions surfaced in context so I can act on them quickly. | **User story:** As a user, I want running-low suggestions surfaced in context so I can act on them quickly. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -608,6 +725,9 @@ A story is done when: | |||||
| - [ ] Add tests | - [ ] Add tests | ||||
| ### `CW-STORY-07.3` Add suggestion-to-list workflow | ### `CW-STORY-07.3` Add suggestion-to-list workflow | ||||
| **Release:** MVP | |||||
| **Priority:** P1 | |||||
| **Effort:** S | |||||
| **User story:** As a user, I want to add a running-low suggestion to my list so I can convert insight into action quickly. | **User story:** As a user, I want to add a running-low suggestion to my list so I can convert insight into action quickly. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -628,6 +748,9 @@ A story is done when: | |||||
| **Goal:** harden the v1 experience for real-world use and release confidence. | **Goal:** harden the v1 experience for real-world use and release confidence. | ||||
| ### `CW-STORY-08.1` Improve mobile usability and accessibility | ### `CW-STORY-08.1` Improve mobile usability and accessibility | ||||
| **Release:** MVP | |||||
| **Priority:** P1 | |||||
| **Effort:** S | |||||
| **User story:** As a user, I want the app to be easy to use on my phone and accessible across core workflows. | **User story:** As a user, I want the app to be easy to use on my phone and accessible across core workflows. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -643,6 +766,9 @@ A story is done when: | |||||
| - [ ] Validate error summaries | - [ ] Validate error summaries | ||||
| ### `CW-STORY-08.2` Harden security coverage | ### `CW-STORY-08.2` Harden security coverage | ||||
| **Release:** MVP | |||||
| **Priority:** P0 | |||||
| **Effort:** S | |||||
| **User story:** As a team, we want security-sensitive paths reviewed so household data remains protected. | **User story:** As a team, we want security-sensitive paths reviewed so household data remains protected. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -658,6 +784,9 @@ A story is done when: | |||||
| - [ ] Add integration tests for protected routes | - [ ] Add integration tests for protected routes | ||||
| ### `CW-STORY-08.3` Add diagnostics and logging | ### `CW-STORY-08.3` Add diagnostics and logging | ||||
| **Release:** MVP | |||||
| **Priority:** P1 | |||||
| **Effort:** S | |||||
| **User story:** As a team, we want actionable diagnostics so failures can be understood and fixed quickly. | **User story:** As a team, we want actionable diagnostics so failures can be understood and fixed quickly. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -672,6 +801,9 @@ A story is done when: | |||||
| - [ ] Add basic health-check strategy if included | - [ ] Add basic health-check strategy if included | ||||
| ### `CW-STORY-08.4` Seed realistic development data | ### `CW-STORY-08.4` Seed realistic development data | ||||
| **Release:** Post-MVP | |||||
| **Priority:** P2 | |||||
| **Effort:** M | |||||
| **User story:** As a developer, I want realistic sample data so workflows can be tested quickly during development. | **User story:** As a developer, I want realistic sample data so workflows can be tested quickly during development. | ||||
| **Acceptance criteria** | **Acceptance criteria** | ||||
| @@ -690,34 +822,28 @@ A story is done when: | |||||
| --- | --- | ||||
| ## Suggested Sprint Sequence | |||||
| ## Suggested 30-Day Delivery Sequence | |||||
| ### Sprint 1 | |||||
| ### Week 1 - Foundation | |||||
| - `CW-EPIC-01` Platform Foundation | - `CW-EPIC-01` Platform Foundation | ||||
| - Start `CW-EPIC-02` Household and Access Control | - Start `CW-EPIC-02` Household and Access Control | ||||
| ### Sprint 2 | |||||
| ### Week 2 - Shared List | |||||
| - Finish `CW-EPIC-02` Household and Access Control | - Finish `CW-EPIC-02` Household and Access Control | ||||
| - Start `CW-EPIC-03` Smart Shopping List | |||||
| ### Sprint 3 | |||||
| - Finish `CW-EPIC-03` Smart Shopping List | |||||
| ### Sprint 4 | |||||
| - `CW-EPIC-04` Product Catalog and Barcode Resolution | |||||
| ### Sprint 5 | |||||
| - `CW-EPIC-05` Stores, Purchases, and Price Intelligence | |||||
| - Start and finish core stories in `CW-EPIC-03` Smart Shopping List | |||||
| ### Sprint 6 | |||||
| - `CW-EPIC-06` Shopping Mode | |||||
| ### Week 3 - Purchases and Price History | |||||
| - Deliver `CW-EPIC-05` MVP stories | |||||
| ### Sprint 7 | |||||
| - `CW-EPIC-07` Running-Low Suggestions | |||||
| ### Week 4 - Running Low and Hardening | |||||
| - Deliver `CW-EPIC-07` MVP stories | |||||
| - Deliver selected `CW-EPIC-08` hardening stories | |||||
| - Run local MVP release checklist | |||||
| ### Sprint 8 | |||||
| - `CW-EPIC-08` UX Polish, Security, and Release Readiness | |||||
| - Stabilization and release verification | |||||
| ### After MVP | |||||
| - Resume `CW-EPIC-04` Product Catalog and Barcode Resolution | |||||
| - Resume `CW-EPIC-06` Shopping Mode | |||||
| - Complete remaining polish work in `CW-EPIC-08` | |||||
| ## Story Template | ## Story Template | ||||
Powered by TurnKey Linux.