{
  "updated": "2026-06-20",
  "headline": "TroveSnap roadmap ties phases, milestone gates, sprints, provisional requirements, and evidence into one partner-visible view.",
  "statusLegend": {
    "done": "Gate has passed with linked evidence.",
    "in_progress": "Active work is underway.",
    "todo": "Planned but not started.",
    "deferred": "Intentionally delayed or moved out of scope."
  },
  "productMilestones": [
    {
      "id": "PM1",
      "title": "Tracking System Live",
      "theme": "Foundation",
      "description": "Partners can watch phases, milestones, sprints, requirements, HITL, and product progress in one generated tracker.",
      "gates": [
        "A1",
        "A2",
        "A3",
        "A4",
        "A5",
        "A6",
        "TH1",
        "TH2",
        "TH3",
        "TH4",
        "TH5"
      ]
    },
    {
      "id": "PM1B",
      "title": "Business Foundation",
      "theme": "Foundation",
      "description": "The legal/business base: partner contribution tracking, S-corp formed & signed, and trademark cleared.",
      "gates": [
        "A4",
        "A7",
        "A8"
      ]
    },
    {
      "id": "PM2",
      "title": "LLM Contract Layer Frozen",
      "theme": "Platform",
      "description": "The model-facing I/O contracts, provider-adapter boundary, validation pipeline, and cost/observability policy are stable enough to build features on.",
      "gates": [
        "P1",
        "P2",
        "P3",
        "P4",
        "P8"
      ]
    },
    {
      "id": "PM3",
      "title": "Ingestion Spine GA",
      "theme": "Platform",
      "description": "Canonical data-model layers, the candidate->promotion ingestion contract, and the item identity/status/QR spine work end to end.",
      "gates": [
        "P5",
        "P6",
        "B1",
        "B2",
        "B3",
        "B4",
        "B5"
      ]
    },
    {
      "id": "PM4",
      "title": "Operational Floor GA",
      "theme": "Operations",
      "description": "Rooms/zones, label batches, bulk operations, team roles, markdown phases, and client reports support real sale-floor crews.",
      "gates": [
        "C1",
        "C2",
        "C3",
        "C4",
        "C5",
        "C6"
      ]
    },
    {
      "id": "PM5",
      "title": "Capture & Enrich GA",
      "theme": "Ingestion",
      "description": "Capture, source-import pipeline, deterministic enrichment, and human review improve intake without silent mutation.",
      "gates": [
        "D1",
        "D2",
        "D3",
        "D4",
        "D5"
      ]
    },
    {
      "id": "PM6",
      "title": "Vision Discovery GA",
      "theme": "Vision",
      "description": "Progressive scanning (table/room/item/mark/condition), watchlists, overlays, and local inference are demoable on the frozen contracts.",
      "gates": [
        "E1",
        "E2",
        "E3",
        "E4",
        "E5",
        "E8",
        "E9"
      ]
    },
    {
      "id": "PM7",
      "title": "Appraisal Intelligence GA",
      "theme": "Vision",
      "description": "Appraisal readiness and comps-based valuation use TroveSnap's pricing baseline plus deterministic ranking.",
      "gates": [
        "E6",
        "E7",
        "P4"
      ]
    },
    {
      "id": "PM8",
      "title": "Demand & Recovery GA",
      "theme": "Lifecycle",
      "description": "QR demand signals, watch/offer hooks, disposition, and auction-outbound close the post-sale loop.",
      "gates": [
        "F1",
        "F2",
        "F3",
        "F4",
        "F5"
      ]
    },
    {
      "id": "PM9",
      "title": "Surfaces & Delivery GA",
      "theme": "Delivery",
      "description": "Web command center, mobile capture, connector harness, MCP surface, and deploy/infra are all production-ready.",
      "gates": [
        "S1",
        "S2",
        "S3",
        "S4",
        "P7"
      ]
    },
    {
      "id": "PM10",
      "title": "Freemium Launch",
      "theme": "Go-To-Market",
      "description": "The import/freemium wedge, POS-interop framing, monetization model, and funnel analytics are ready for sellers.",
      "gates": [
        "G1",
        "G2",
        "G3",
        "G4"
      ]
    },
    {
      "id": "PM11",
      "title": "Customer Research & Beta",
      "theme": "Research",
      "description": "Field data (garage/estate sale photos + item samples), estate-seller pain-point interviews, an early beta cohort, research-driven feature prototypes, and a local estate-seller/liquidator prospect list inform the build with real customer truth.",
      "gates": [
        "R1",
        "R2",
        "R3",
        "R4",
        "R5",
        "R6"
      ]
    }
  ],
  "phases": [
    {
      "id": "phase-a",
      "title": "Tracking Foundation",
      "lane": "foundation",
      "defaultVerify": "code",
      "status": "in_progress",
      "goal": "Make work visible, resumable, and evidence-backed before larger plan rewrites.",
      "exitAssertion": "The sprint tracker, deliberation process, roadmap overview, provisional requirements register, human task tracking, and product-milestone rollup are published through the docs flow.",
      "milestones": [
        {
          "id": "A1",
          "gate": "Session handoff, decision log, status JSON, and deliberation process are live.",
          "status": "done",
          "owningSprint": "Tracker Foundation",
          "requirements": [
            "REQ-TRACK-001"
          ],
          "evidence": "docs/tracking/session-handoff.md; docs/tracking/decision-log.md; docs/tracking/status.json"
        },
        {
          "id": "A2",
          "gate": "Partner-facing tracker is generated and publishable through the docs site.",
          "status": "done",
          "owningSprint": "Tracker Foundation",
          "requirements": [
            "REQ-TRACK-002"
          ],
          "evidence": "docs/tracking/index.html; apps/web/scripts/sync-docs.mjs"
        },
        {
          "id": "A3",
          "gate": "Phase/milestone overview and provisional requirements register are seeded from accepted deliberation.",
          "status": "done",
          "owningSprint": "Tracker Foundation",
          "requirements": [
            "REQ-TRACK-003"
          ],
          "evidence": "docs/tracking/roadmap.json; docs/tracking/requirements.md; docs/tracking/overview.html"
        },
        {
          "id": "A4",
          "gate": "Business formation, trademark research, and partner contribution tracking are visible as HITL tasks with evidence.",
          "status": "in_progress",
          "owningSprint": "Foundation HITL",
          "requirements": [
            "REQ-HITL-001",
            "REQ-HITL-002",
            "REQ-BIZ-001",
            "REQ-BIZ-002",
            "REQ-PARTNER-001"
          ],
          "evidence": "docs/tracking/hitl-tasks.json; docs/tracking/overview.html"
        },
        {
          "id": "A5",
          "gate": "Tracker UX is upgraded: overview landing, milestone dashboard, phase timeline, per-item detail pages, and kanban board are generated.",
          "status": "done",
          "owningSprint": "Tracker Foundation",
          "requirements": [
            "REQ-TRACK-004"
          ],
          "evidence": "docs/tracking/index.html; docs/tracking/sprint.html; docs/tracking/items/*.html; apps/web/scripts/build-sprint-tracker.mjs"
        },
        {
          "id": "A6",
          "gate": "Landscape tracker layout, overall product-milestone rollup track, and requirement-ID badges are live.",
          "status": "done",
          "owningSprint": "Tracker Foundation",
          "requirements": [
            "REQ-TRACK-005"
          ],
          "evidence": "docs/tracking/index.html; apps/web/scripts/build-sprint-tracker.mjs"
        },
        {
          "id": "A7",
          "gate": "S-corp formed and signed: filing plan reviewed (HITL-BIZ-001/002), entity filed, S-election made.",
          "status": "todo",
          "verify": "qa",
          "owningSprint": "Foundation HITL",
          "requirements": [
            "REQ-BIZ-001"
          ],
          "evidence": "HITL-BIZ-001, HITL-BIZ-002; uploaded filing docs"
        },
        {
          "id": "A8",
          "gate": "Trademark cleared: availability researched with proof (HITL-BIZ-003) and a file/variant decision made.",
          "status": "todo",
          "verify": "qa",
          "owningSprint": "Foundation HITL",
          "requirements": [
            "REQ-BIZ-002"
          ],
          "evidence": "HITL-BIZ-003; trademark research summary"
        }
      ]
    },
    {
      "id": "phase-p",
      "title": "Platform & Contracts",
      "lane": "foundation",
      "flag": "build-first",
      "defaultVerify": "code",
      "status": "in_progress",
      "goal": "Establish the load-bearing technical contracts and platform boundaries every feature depends on, before feature POCs build on shifting ground.",
      "exitAssertion": "LLM scan I/O contracts, the provider-adapter boundary, the validation/ranking pipeline, the ingestion+promotion contract, the data-model layers, the MCP tool surface, and cost/observability policy are defined, versioned, and demoable behind stable interfaces.",
      "milestones": [
        {
          "id": "P1",
          "gate": "Scan I/O contract schemas and versioning are frozen: request envelope, per-scan_type result schemas, scan_version/result_version, shared enums, and the normalized 0-1000 coordinate contract.",
          "status": "todo",
          "owningSprint": "P&C Wave 1: Foundations",
          "requirements": [
            "REQ-CONTRACT-001",
            "REQ-CONTRACT-005",
            "REQ-CONTRACT-006",
            "REQ-CONTRACT-007",
            "REQ-CONTRACT-009"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (sections 5-9, 28)",
          "verify": "code"
        },
        {
          "id": "P2",
          "gate": "Provider-adapter boundary normalizes OpenAI, Gemini, Claude, and local VLMs into one canonical result via strict structured output.",
          "status": "todo",
          "owningSprint": "P&C Wave 2: Core Contracts",
          "requirements": [
            "REQ-CONTRACT-002",
            "REQ-CONTRACT-008"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (section 18)",
          "verify": "both",
          "costFlag": {
            "type": "api",
            "note": "First real paid API spend: live multi-provider vision (OpenAI/Gemini/Claude). Bounded by P8 budgets."
          }
        },
        {
          "id": "P3",
          "gate": "Output pipeline (syntax -> schema -> enum -> coordinate -> business-rule validation) with retry/fallback policy is defined and tested.",
          "status": "todo",
          "owningSprint": "P&C Wave 2: Core Contracts",
          "requirements": [
            "REQ-CONTRACT-003"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (section 19)",
          "verify": "code"
        },
        {
          "id": "P4",
          "gate": "Deterministic candidate ranking: the model returns evidence/component scores; TroveSnap computes the final ranking.",
          "status": "todo",
          "owningSprint": "P&C Wave 2: Core Contracts",
          "requirements": [
            "REQ-CONTRACT-004"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (section 20)",
          "verify": "code"
        },
        {
          "id": "P5",
          "gate": "Ingestion + promotion contract is enforced: connectors/MCP/harness/buyer write candidates and events only; promoteInventoryCandidate is the single canonical writer with traceability.",
          "status": "todo",
          "owningSprint": "P&C Wave 1: Foundations",
          "requirements": [
            "REQ-PLAT-001",
            "REQ-SEC-001",
            "REQ-SEC-002"
          ],
          "evidence": "docs/ARCHITECTURE.md; src/lib/troveSnapIngestion.ts",
          "verify": "both"
        },
        {
          "id": "P6",
          "gate": "Data-model layers are consolidated (canonical, marketplace, seller-intelligence, tracking-identity, disposition, ingestion) with a documented RLS owner-scoped upgrade path.",
          "status": "todo",
          "owningSprint": "P&C Wave 4: Data & Surfaces",
          "requirements": [
            "REQ-PLAT-002",
            "REQ-PLAT-005",
            "REQ-PLAT-006",
            "REQ-PLAT-007",
            "REQ-PLAT-008",
            "REQ-SEC-003",
            "REQ-SEC-005"
          ],
          "evidence": "docs/technical/data-model.md; supabase/schema.sql",
          "verify": "both"
        },
        {
          "id": "P7",
          "gate": "MCP tool surface exposes read/search/candidate tools first, with approval gates on publish/bulk/delete tools, wrapping existing ingestion functions.",
          "status": "todo",
          "owningSprint": "P&C Wave 2: Core Contracts",
          "requirements": [
            "REQ-PLAT-003",
            "REQ-MCP-001",
            "REQ-MCP-002",
            "REQ-MCP-003"
          ],
          "evidence": "docs/ARCHITECTURE.md; docs/technical/mcp-tools.md",
          "verify": "both"
        },
        {
          "id": "P8",
          "gate": "Observability and cost-control policy: scan trace structure, per-scan-type token/tier budgets, and quality/cost metrics are defined.",
          "status": "todo",
          "owningSprint": "P&C Wave 3: Vision Pipeline & Cost",
          "requirements": [
            "REQ-PLAT-004",
            "REQ-SEC-004"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (sections 23, 25)",
          "verify": "code"
        },
        {
          "id": "P9",
          "gate": "Platform Foundations: app/edge API envelope + DTO boundary, ID/idempotency/correlation convention, cross-version compatibility registry, keyless CI floor, and the legacy-route quarantine registry that blocks P&C exit on any contract bypass.",
          "status": "todo",
          "owningSprint": "P&C Wave 1: Foundations",
          "requirements": [],
          "evidence": "docs/specs/P9-platform-foundations.md; spec gap analysis (closed-* rounds) + proposed-spec-gap-resolution.html (D26)",
          "verify": "code"
        },
        {
          "id": "P10",
          "gate": "Scan Session & Orchestration: scan_session_id + candidate lineage across scans, next-scan execution, P2/P3/P4/P5/P8 handoff, and the e2e happy-path proof (photo -> table_hunt -> item_scan -> validate -> rank -> review -> promote).",
          "status": "todo",
          "owningSprint": "P&C Wave 5: Integration & Exit",
          "requirements": [],
          "evidence": "docs/specs/P10-scan-session.md; resolves P1 scan-io-contract open question (cross-scan identity)",
          "verify": "both"
        }
      ],
      "serves": [
        "web",
        "app",
        "harness"
      ]
    },
    {
      "id": "phase-b",
      "title": "Spine POC",
      "lane": "active-build",
      "defaultVerify": "code",
      "status": "in_progress",
      "goal": "Prove the item identity, status, and QR backbone before adding heavier operational features.",
      "exitAssertion": "An item can be identified, statused, QR-bound, resolved opaquely, audited, and round-tripped through existing CSV/status primitives.",
      "milestones": [
        {
          "id": "B1",
          "gate": "Item identity and status event contract is documented and accepted for the POC.",
          "status": "todo",
          "owningSprint": "Sprint 1 - Spine POC",
          "requirements": [
            "REQ-SPINE-001",
            "REQ-SPINE-002",
            "REQ-SPINE-007"
          ],
          "evidence": "docs/product/capture-to-sale-tracking.md"
        },
        {
          "id": "B2",
          "gate": "QR resolver and item binding demo is proven without exposing mutable internal IDs.",
          "status": "todo",
          "owningSprint": "Sprint 1 - Spine POC",
          "requirements": [
            "REQ-SPINE-003"
          ],
          "evidence": "pending Sprint 1 demo"
        },
        {
          "id": "B3",
          "gate": "CSV sold/status roundtrip works using current primitives.",
          "status": "todo",
          "owningSprint": "Sprint 1 - Spine POC",
          "requirements": [
            "REQ-SPINE-004"
          ],
          "evidence": "pending Sprint 1 demo"
        },
        {
          "id": "B4",
          "gate": "QR/identity binding tables (qr_codes / item_identity_bindings) model opaque public codes, binding state, and binding history.",
          "status": "todo",
          "owningSprint": "Sprint 1 - Spine POC",
          "requirements": [
            "REQ-SPINE-005"
          ],
          "evidence": "docs/technical/data-model.md (Tracking identity)"
        },
        {
          "id": "B5",
          "gate": "Inventory status-event audit contract records transitions for reconciliation and recovery.",
          "status": "todo",
          "owningSprint": "Sprint 1 - Spine POC",
          "requirements": [
            "REQ-SPINE-006"
          ],
          "evidence": "docs/technical/data-model.md (inventory_status_events)"
        }
      ],
      "serves": [
        "web",
        "app",
        "harness"
      ]
    },
    {
      "id": "phase-c",
      "title": "Operational Floor POC",
      "lane": "active-build",
      "defaultVerify": "code",
      "status": "todo",
      "goal": "Support real estate-sale floor operations crews actually need.",
      "exitAssertion": "Rooms/zones, label batches, bulk operations, team roles, markdown phases, and report skeletons work together in a sale-floor flow.",
      "milestones": [
        {
          "id": "C1",
          "gate": "Rooms, zones, and pickup areas exist in the tracking model.",
          "status": "todo",
          "owningSprint": "Sprint 2 - Operational Floor POC",
          "requirements": [
            "REQ-OPS-001"
          ],
          "evidence": "docs/product/capture-to-sale-tracking.md"
        },
        {
          "id": "C2",
          "gate": "Label batch workflow is first-class and QR print/pack path is demoable.",
          "status": "todo",
          "owningSprint": "Sprint 2 - Operational Floor POC",
          "requirements": [
            "REQ-OPS-002"
          ],
          "evidence": "pending Sprint 2 demo"
        },
        {
          "id": "C3",
          "gate": "Bulk edit, mass label, and batch discount path is validated.",
          "status": "todo",
          "owningSprint": "Sprint 2 - Operational Floor POC",
          "requirements": [
            "REQ-OPS-003"
          ],
          "evidence": "pending Sprint 2 demo"
        },
        {
          "id": "C4",
          "gate": "Client report skeleton is generated from sale/reconciliation state.",
          "status": "todo",
          "owningSprint": "Sprint 2 - Operational Floor POC",
          "requirements": [
            "REQ-OPS-004"
          ],
          "evidence": "docs/product/post-sale-reconciliation.md"
        },
        {
          "id": "C5",
          "gate": "Team roles and permissions exist with an owner-scoped RLS upgrade path.",
          "status": "todo",
          "owningSprint": "Sprint 2 - Operational Floor POC",
          "requirements": [
            "REQ-OPS-005"
          ],
          "evidence": "docs/technical/data-model.md (RLS)"
        },
        {
          "id": "C6",
          "gate": "Discount phases / markdown-stage model supports timed sale pricing.",
          "status": "todo",
          "owningSprint": "Sprint 2 - Operational Floor POC",
          "requirements": [
            "REQ-OPS-006"
          ],
          "evidence": "docs/technical/data-model.md (discount_phases)"
        }
      ],
      "serves": [
        "web",
        "app"
      ]
    },
    {
      "id": "phase-d",
      "title": "Capture / Enrich POC",
      "lane": "active-build",
      "defaultVerify": "code",
      "status": "todo",
      "goal": "Improve ingestion speed without depending on fragile AI magic.",
      "exitAssertion": "Capture, source-import, deterministic enrichment, and human review improve intake without mutating operational state silently.",
      "milestones": [
        {
          "id": "D1",
          "gate": "Photo/note capture fields and review queue are demoable.",
          "status": "todo",
          "owningSprint": "Sprint 3 - Capture/Enrich POC",
          "requirements": [
            "REQ-CAPTURE-001"
          ],
          "evidence": "docs/CC-Analysis/codex-handoff-freemium-positioning.md"
        },
        {
          "id": "D2",
          "gate": "Deterministic enrichment and tags work where rules are clear.",
          "status": "todo",
          "owningSprint": "Sprint 3 - Capture/Enrich POC",
          "requirements": [
            "REQ-CAPTURE-002"
          ],
          "evidence": "pending Sprint 3 demo"
        },
        {
          "id": "D3",
          "gate": "Human-reviewed suggestions are required before operational mutation.",
          "status": "todo",
          "owningSprint": "Sprint 3 - Capture/Enrich POC",
          "requirements": [
            "REQ-CAPTURE-003"
          ],
          "evidence": "pending Sprint 3 demo"
        },
        {
          "id": "D4",
          "gate": "Source-import pipeline (source_import_runs/records -> inventory_candidates) is demoable end to end.",
          "status": "todo",
          "owningSprint": "Sprint 3 - Capture/Enrich POC",
          "requirements": [
            "REQ-CAPTURE-004"
          ],
          "evidence": "docs/ARCHITECTURE.md (ingestion contract)"
        },
        {
          "id": "D5",
          "gate": "Deterministic enrichment mocks (tags/enrichment/copy) have stable contracts and are gated behind review.",
          "status": "todo",
          "owningSprint": "Sprint 3 - Capture/Enrich POC",
          "requirements": [
            "REQ-CAPTURE-005"
          ],
          "evidence": "docs/technical/architecture.md (AI)"
        }
      ],
      "serves": [
        "web",
        "app",
        "harness"
      ]
    },
    {
      "id": "phase-e",
      "title": "Vision Contract POC",
      "lane": "active-build",
      "defaultVerify": "code",
      "status": "todo",
      "goal": "Prove the vision interface as a replaceable, progressive service built on the frozen contracts.",
      "exitAssertion": "All scan types, watchlists, overlays, corrections, appraisal routing, and local inference are demonstrable without locking TroveSnap to one provider.",
      "milestones": [
        {
          "id": "E1",
          "gate": "table_hunt and item_scan schemas are accepted and rendered as overlays.",
          "status": "todo",
          "owningSprint": "Sprint 4 - Vision Contract POC",
          "requirements": [
            "REQ-VISION-001"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (sections 11, 13)"
        },
        {
          "id": "E2",
          "gate": "Provider adapter scaffold is in place (consumes the P2 boundary).",
          "costFlag": {
            "type": "api",
            "note": "First hosted vision-provider calls turn on API spend; keep economy tier + per-scan caps (spec sections 25)."
          },
          "status": "todo",
          "owningSprint": "Sprint 4 - Vision Contract POC",
          "requirements": [
            "REQ-VISION-002"
          ],
          "evidence": "pending Sprint 4 demo"
        },
        {
          "id": "E3",
          "gate": "Overlay/review UX validates confidence and captures corrections.",
          "status": "todo",
          "owningSprint": "Sprint 4 - Vision Contract POC",
          "requirements": [
            "REQ-VISION-003"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (section 21)"
        },
        {
          "id": "E4",
          "gate": "room_scan: multi-image coverage, category counts, approximate dedup, and multiple sightings per candidate.",
          "status": "todo",
          "owningSprint": "Sprint 4 - Vision Contract POC",
          "requirements": [
            "REQ-VISION-004"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (section 12)"
        },
        {
          "id": "E5",
          "gate": "mark_scan and condition_scan: OCR + normalized maker/model/serial, visible-condition grading, and follow-up-photo guidance.",
          "status": "todo",
          "owningSprint": "Sprint 4 - Vision Contract POC",
          "requirements": [
            "REQ-VISION-005"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (sections 14-15)"
        },
        {
          "id": "E6",
          "gate": "appraisal_prepare: readiness state and search fingerprint without estimating value.",
          "status": "todo",
          "owningSprint": "Sprint 4 - Vision Contract POC",
          "requirements": [
            "REQ-VISION-006"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (section 16)"
        },
        {
          "id": "E7",
          "gate": "appraisal_value: comps-based ranges, adjustments, and strongest-comp selection from supplied comparables.",
          "verify": "both",
          "costFlag": {
            "type": "api",
            "note": "Strong provider + up to 3 external comp queries per appraisal — highest per-call API cost; gate behind tokens."
          },
          "status": "todo",
          "owningSprint": "Sprint 4 - Vision Contract POC",
          "requirements": [
            "REQ-VISION-007"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (section 17)"
        },
        {
          "id": "E8",
          "gate": "Watchlist contract: versioned, tenant-scoped inputs whose match IDs are restricted to those supplied.",
          "status": "todo",
          "owningSprint": "Sprint 4 - Vision Contract POC",
          "requirements": [
            "REQ-VISION-008"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (section 8)"
        },
        {
          "id": "E9",
          "gate": "Local VLM adapter with grammar-constrained output and provider routing/benchmarking.",
          "status": "todo",
          "owningSprint": "Sprint 4 - Vision Contract POC",
          "requirements": [
            "REQ-VISION-009"
          ],
          "evidence": "docs/CC-Analysis/trovesnap-vision-scanning-spec.md (section 27)"
        }
      ],
      "serves": [
        "web",
        "app"
      ]
    },
    {
      "id": "phase-f",
      "title": "Demand / Recovery POC",
      "lane": "active-build",
      "defaultVerify": "code",
      "status": "todo",
      "goal": "Use QR and buyer activity to improve sell-through and post-sale recovery.",
      "exitAssertion": "Demand signals, unsold routing, disposition, and auction-outbound inform reconciliation and recovery decisions.",
      "milestones": [
        {
          "id": "F1",
          "gate": "QR scan demand signal is captured.",
          "status": "todo",
          "owningSprint": "Sprint 5 - Demand/Recovery POC",
          "requirements": [
            "REQ-DEMAND-001"
          ],
          "evidence": "pending Sprint 5 demo"
        },
        {
          "id": "F2",
          "gate": "Watch/offer hooks are designed.",
          "status": "todo",
          "owningSprint": "Sprint 5 - Demand/Recovery POC",
          "requirements": [
            "REQ-DEMAND-002"
          ],
          "evidence": "pending Sprint 5 demo"
        },
        {
          "id": "F3",
          "gate": "Unsold routing and reconciliation outputs are connected.",
          "status": "todo",
          "owningSprint": "Sprint 5 - Demand/Recovery POC",
          "requirements": [
            "REQ-DEMAND-003"
          ],
          "evidence": "docs/product/post-sale-reconciliation.md"
        },
        {
          "id": "F4",
          "gate": "Disposition engine: buyer offers, disposition recommendations, and a responsible-disposal terminal route.",
          "status": "todo",
          "owningSprint": "Sprint 5 - Demand/Recovery POC",
          "requirements": [
            "REQ-DEMAND-004"
          ],
          "evidence": "docs/product/disposition-engine.md; docs/technical/data-model.md"
        },
        {
          "id": "F5",
          "gate": "Auction-outbound integration boundary exports unsold lots to external auction pipelines.",
          "status": "todo",
          "owningSprint": "Sprint 5 - Demand/Recovery POC",
          "requirements": [
            "REQ-DEMAND-005"
          ],
          "evidence": "docs/CC-Analysis/auction-outbound-integration-spec.md"
        }
      ],
      "serves": [
        "web"
      ]
    },
    {
      "id": "phase-s",
      "title": "Surfaces & Delivery",
      "lane": "active-build",
      "defaultVerify": "qa",
      "status": "in_progress",
      "goal": "Ship the three product surfaces and the deploy pipeline that all feature work flows through.",
      "exitAssertion": "Web command center, mobile capture app, connector harness, and deploy/infra are production-ready and write through the ingestion contract.",
      "milestones": [
        {
          "id": "S1",
          "gate": "Web command center (sales, photos, items, mock enrich, review queue, publish preview, import history) is live.",
          "verify": "both",
          "status": "done",
          "owningSprint": "Surfaces & Delivery",
          "requirements": [
            "REQ-SURF-001"
          ],
          "evidence": "apps/web; docs/ARCHITECTURE.md (build order phase 2)"
        },
        {
          "id": "S2",
          "gate": "Mobile capture app (Expo RN): create/select sale, photos, room labels, quick notes, sync, and simple review.",
          "status": "todo",
          "owningSprint": "Surfaces & Delivery",
          "requirements": [
            "REQ-SURF-002"
          ],
          "evidence": "docs/product/mobile-strategy.md; docs/ARCHITECTURE.md (build order phase 3)"
        },
        {
          "id": "S3",
          "gate": "Connector harness (TroveSnap Local): credential/session pointers, source connectors, normalized uploads, plugin manifests.",
          "status": "todo",
          "owningSprint": "Surfaces & Delivery",
          "requirements": [
            "REQ-SURF-003"
          ],
          "evidence": "docs/technical/harness-connectors.md; docs/ARCHITECTURE.md (build order phase 4)"
        },
        {
          "id": "S4",
          "gate": "Deploy/infra: Supabase schema -> Cloudflare Workers via OpenNext, with analytics wired.",
          "costFlag": {
            "type": "infra",
            "note": "Migration point to paid Cloudflare Workers + paid Supabase tier at production scale."
          },
          "status": "todo",
          "owningSprint": "Surfaces & Delivery",
          "requirements": [
            "REQ-INFRA-001"
          ],
          "evidence": "docs/technical/architecture.md (Deploy)"
        }
      ],
      "serves": [
        "web",
        "app"
      ]
    },
    {
      "id": "phase-g",
      "title": "Positioning / Go-To-Market",
      "lane": "parallel",
      "defaultVerify": "qa",
      "status": "todo",
      "goal": "Keep seller positioning and partner-facing proof moving in parallel with the POC build.",
      "exitAssertion": "The adoption wedge is clear: import/freemium gets teams started, POS is an interop bridge, monetization is defined, and analytics follow the spine proof.",
      "milestones": [
        {
          "id": "G1",
          "gate": "Freemium/import wedge copy is aligned.",
          "status": "todo",
          "owningSprint": "Parallel Positioning",
          "requirements": [
            "REQ-GTM-001"
          ],
          "evidence": "docs/CC-Analysis/freemium-ingestion-pain-analysis.md"
        },
        {
          "id": "G2",
          "gate": "POS interop is framed as adoption bridge, not core dependency.",
          "status": "todo",
          "owningSprint": "Parallel Positioning",
          "requirements": [
            "REQ-GTM-002"
          ],
          "evidence": "docs/tracking/decision-log.md#d1"
        },
        {
          "id": "G3",
          "gate": "Funnel analytics are added after Sprint 1 spine proof.",
          "costFlag": {
            "type": "infra",
            "note": "PostHog/analytics paid tier once event volume grows."
          },
          "status": "todo",
          "owningSprint": "Parallel Positioning",
          "requirements": [
            "REQ-GTM-003"
          ],
          "evidence": "pending post-Sprint 1 planning"
        },
        {
          "id": "G4",
          "gate": "Monetization/credits model (tokens, paid appraisal escalation) is defined (Codex-owned decision).",
          "status": "todo",
          "owningSprint": "Parallel Positioning",
          "requirements": [
            "REQ-GTM-004"
          ],
          "evidence": "docs/product/pricing-and-tokens.md; docs/strategy/MONETIZATION-AND-CREDITS-STRATEGY.md"
        }
      ]
    },
    {
      "id": "phase-r",
      "title": "Research & Discovery",
      "lane": "parallel",
      "defaultVerify": "qa",
      "status": "todo",
      "goal": "Ground the build in real customer truth: collect field data, talk to sellers about their pain, and pull a few in early to test enhancements — running in parallel with the POC build.",
      "exitAssertion": "Garage/estate sale field samples, estate-seller pain-point interviews, an onboarded beta cohort, and research-driven feature prototypes are captured, reviewed, and feeding the plan.",
      "milestones": [
        {
          "id": "R1",
          "gate": "Garage-sale field corpus: consistent sample photo sets + item samples collected for reference and future vision training.",
          "status": "todo",
          "owningSprint": "Research & Discovery",
          "requirements": [
            "REQ-RESEARCH-001"
          ],
          "evidence": "HITL-RESEARCH-001; uploaded sample sets"
        },
        {
          "id": "R2",
          "gate": "Estate-sale field corpus: consistent sample photo sets + item samples collected for reference and future vision training.",
          "status": "todo",
          "owningSprint": "Research & Discovery",
          "requirements": [
            "REQ-RESEARCH-002"
          ],
          "evidence": "HITL-RESEARCH-002; uploaded sample sets"
        },
        {
          "id": "R3",
          "gate": "Seller pain-point research: conversations/interviews with estate sellers captured and synthesized into themes.",
          "status": "todo",
          "owningSprint": "Research & Discovery",
          "requirements": [
            "REQ-RESEARCH-003"
          ],
          "evidence": "HITL-RESEARCH-003; interview notes + synthesis"
        },
        {
          "id": "R4",
          "gate": "Early beta cohort: a small set of real sellers recruited and onboarded to trial enhancements, with feedback captured.",
          "status": "todo",
          "owningSprint": "Research & Discovery",
          "requirements": [
            "REQ-RESEARCH-004"
          ],
          "evidence": "HITL-RESEARCH-004; beta feedback log"
        },
        {
          "id": "R5",
          "gate": "Research-driven feature prototypes: findings turned into specced/prototyped features (e.g., Gmail local-sales discovery).",
          "status": "todo",
          "owningSprint": "Research & Discovery",
          "requirements": [
            "REQ-RESEARCH-005"
          ],
          "evidence": "pending prototype"
        },
        {
          "id": "R6",
          "gate": "Local prospect list: estate sellers / liquidators in Sacramento + surrounding areas compiled with source + contact for outreach and beta recruiting.",
          "status": "todo",
          "owningSprint": "Research & Discovery",
          "requirements": [
            "REQ-RESEARCH-006"
          ],
          "evidence": "HITL-RESEARCH-005; compiled prospect list"
        }
      ]
    },
    {
      "id": "phase-th",
      "title": "Tracker Hardening",
      "lane": "foundation",
      "defaultVerify": "code",
      "status": "done",
      "goal": "Make the tracker trustworthy before sprint metrics matter: integrity check, honest point model, decoupled reseed, full coverage linkage, and doc hygiene — the Tracker Foundation retro actions.",
      "exitAssertion": "tracker:check gates the build; points count work once with one canonical complete rule; reseed is decoupled + the SQL seed preserves live HITL; gates↔requirements↔work-items are linked for Platform+Spine with owners; docs/links are consistent.",
      "milestones": [
        {
          "id": "TH1",
          "gate": "Plan-integrity script (tracker:check) gates the build (refs, codes, labels, paths, no point double-count).",
          "status": "done",
          "owningSprint": "Tracker Hardening",
          "requirements": [
            "REQ-TRACK-009"
          ],
          "evidence": "WI-039 done: tracker:check gates docs:tracker"
        },
        {
          "id": "TH2",
          "gate": "Story points count each work item once (summary rows zero-pointed) and one canonical sprint-complete rule across static + live.",
          "status": "done",
          "owningSprint": "Tracker Hardening",
          "requirements": [
            "REQ-TRACK-010"
          ],
          "evidence": "WI-040 done: summary rows zero-pointed + items-driven completion rule"
        },
        {
          "id": "TH3",
          "gate": "Supabase reseed decoupled from local builds; SQL seed preserves live HITL state.",
          "status": "done",
          "owningSprint": "Tracker Hardening",
          "requirements": [
            "REQ-TRACK-011"
          ],
          "evidence": "WI-041 done: local reseed decoupled + SQL seed preserves live HITL"
        },
        {
          "id": "TH4",
          "gate": "Gate↔requirement + requirement↔work-item coverage backfilled (Platform + Spine); owners assigned + validated.",
          "status": "done",
          "owningSprint": "Tracker Hardening",
          "requirements": [
            "REQ-TRACK-012"
          ],
          "evidence": "WI-042 done: Platform/Spine coverage + owners backfilled; tracker:check 0 errors"
        },
        {
          "id": "TH5",
          "gate": "Tracker docs/links consistent (no stale paths); plan-doc refresh tracked.",
          "status": "done",
          "owningSprint": "Tracker Hardening",
          "requirements": [
            "REQ-TRACK-013"
          ],
          "evidence": "WI-043 done: doc/link hygiene guarded by tracker:check"
        }
      ]
    }
  ]
}
