Requirements register

Full-vision: every implementable requirement drawn from the vision/plan/spec docs, mapped to a phase gate + sprint, with honest status. Source: requirements.json.

120 requirements
12 proposed · 81 accepted · 20 implemented · 6 verified · 1 deferred
Updated: 2026-06-19

Expanded from the provisional POC-scoped requirements.md (now superseded). Existing REQ IDs are preserved verbatim because roadmap.json gates and status.json work items reference them. Source docs are cited rather than copied. Status reflects real implementation state, which can differ from a gate's status (a requirement's code can exist before its phase gate is formally frozen/verified).

Tracking & Tooling — Tracking Foundation · 13 reqs · 8 built

REQ-TRACK-009 accepted P1 TH1 · Tracker Hardening
Plan integrity must be machine-checked before build/deploy (tracker:check).
Accept: A script fails on duplicate WI codes, unresolved gate/requirement refs, invalid sprint names, owner/reviewer labels not in PEOPLE, broken doc paths, and overlapping pointed summary/slice rows.
Tracker Hardening · Sources: docs/tracking/decision-log.md#d23 · docs/tracking/retrospectives/proposed-retro-tracker-foundation.html · Work: WI-039 · Evidence: pending
REQ-TRACK-010 accepted P1 TH2 · Tracker Hardening
Story points must count each work item once, with one canonical sprint-complete rule.
Accept: Per-sprint summary rows are zero-pointed; granular slices carry the points; static + live use the same items-done complete rule (gates a separate axis).
Tracker Hardening · Sources: docs/tracking/decision-log.md#d23 · docs/tracking/retrospectives/proposed-retro-tracker-foundation.html · Work: WI-040 · Evidence: pending
REQ-TRACK-011 accepted P1 TH3 · Tracker Hardening
The Supabase reseed must be decoupled from local builds and the SQL seed must preserve live HITL state.
Accept: Local docs:tracker does not write the prod DB; the deploy path does; tracker-seed.mjs no longer overwrites HITL status/waiting_on/notes on conflict (or is marked bootstrap-only).
Tracker Hardening · Sources: docs/tracking/decision-log.md#d23 · docs/tracking/retrospectives/proposed-retro-tracker-foundation.html · Work: WI-041 · Evidence: pending
REQ-TRACK-012 accepted P1 TH4 · Tracker Hardening
Every gate must enumerate its requirements and every accepted requirement must map to a work item; owners assigned + validated.
Accept: Platform + Spine gates list their sub-requirements; accepted reqs in a sprint have a work item; owners are set and resolve to PEOPLE.
Tracker Hardening · Sources: docs/tracking/decision-log.md#d23 · docs/tracking/retrospectives/proposed-retro-tracker-foundation.html · Work: WI-042 · Evidence: pending
REQ-TRACK-013 accepted P1 TH5 · Tracker Hardening
Tracker docs/links must be consistent and plan docs refreshed.
Accept: No stale paths in status.json/docs; plan-doc refresh (WI-022-025) tracked.
Tracker Hardening · Sources: docs/tracking/decision-log.md#d23 · docs/tracking/retrospectives/proposed-retro-tracker-foundation.html · Work: WI-043 · Evidence: pending
REQ-TRACK-006 implemented P1 A5 · Tracker Foundation
The tracker must be a live edit surface backed by Supabase with who/when/why audit, behind Cloudflare Access, with no redeploy to see changes.
Accept: app.html reads/writes via the Access-gated Function; each change records actor, time, and reason; canonical identity maps logins to one person.
Tracking Foundation · Sources: docs/tracking/app-design.md · docs/tracking/decision-log.md#d15 · Evidence: docs/tracking/app.html; docs/tracking/worker/tracker-write.mjs
REQ-TRACK-007 implemented P2 A5 · Tracker Foundation
The tracker must be versioned with a What's-new changelog and surface gate-to-work-item/HITL linkage and per-sprint detail.
Accept: tracker-version.json + changelog page render; sprint pages show gates with their satisfying work items/HITL tickets.
Tracking Foundation · Sources: docs/tracking/decision-log.md#d16 · docs/tracking/CHANGELOG.md · Evidence: docs/tracking/CHANGELOG.md; docs/tracking/sprint-meta.json
REQ-TRACK-008 implemented P2 A3 · Tracker Foundation
The requirements register itself must be a structured, full-vision artifact rendered in the tracker (grouped/filterable, linked to gates and work items).
Accept: requirements.json drives a generated requirements view; every gate's requirements resolve to register entries.
Tracking Foundation · Sources: Human direction 2026-06-18 (this expansion) · docs/tracking/decision-log.md#d21 · Evidence: docs/tracking/requirements.json
REQ-TRACK-001 verified P0 A1 · Tracker Foundation
Agents must resume from handoff, status, latest deliberation, decision log, and source docs.
Accept: Handoff names the required read order and current deliberation state.
Tracking Foundation · Sources: docs/tracking/session-handoff.md · Work: WI-001 WI-025 · Evidence: docs/tracking/session-handoff.md
REQ-TRACK-002 verified P0 A2 · Tracker Foundation
Partners must have a generated sprint tracker that can publish through the docs site.
Accept: index.html is generated from JSON and published via Cloudflare Pages.
Tracking Foundation · Sources: docs/tracking/status.json · apps/web/scripts/build-sprint-tracker.mjs · Work: WI-002 WI-003 WI-004 · Evidence: docs/tracking/index.html
REQ-TRACK-003 verified P0 A3 · Tracker Foundation
Partners must see how phases, milestones, sprints, requirements, and evidence relate.
Accept: roadmap.json, requirements register, and the generated overview exist and cross-link.
Tracking Foundation · Sources: docs/tracking/deliberations/closed-codex-2026-06-18-phases-milestones-requirements.md · Work: WI-005 · Evidence: docs/tracking/index.html
REQ-TRACK-004 verified P0 A5 · Tracker Foundation
Partners need an overview landing, milestone dashboard, phase timeline, per-item detail pages, and a kanban board.
Accept: index.html, sprint.html, and items/*.html are generated with those sections.
Tracking Foundation · Sources: docs/tracking/deliberations/closed-claude-2026-06-18-tracker-ux.md · Work: WI-007 · Evidence: docs/tracking/index.html; docs/tracking/sprint.html
REQ-TRACK-005 verified P1 A6 · Tracker Foundation
The tracker needs a landscape layout, a product-milestone rollup track with percent-complete, and requirement IDs as individual badges.
Accept: Overview renders the product-milestone strip with rollup %; layout is landscape; requirement IDs render as badges.
Tracking Foundation · Sources: Human direction 2026-06-19 · docs/tracking/deliberations/closed-claude-2026-06-18-tracker-ux.md · docs/tracking/decision-log.md#d12 · Work: WI-008 · Evidence: docs/tracking/index.html

Human-in-the-loop & Business — Tracking Foundation · 6 reqs · 3 built

REQ-BIZ-001 proposed P0 A7 · Foundation HITL
S-corp filing work must start with a written initial plan and Paul review before any filing decision, ending in a formed & signed entity.
Accept: Mark drafts the plan (HITL-BIZ-001); Paul reviews rules/direction (HITL-BIZ-002); entity is filed and S-election made (gate A7).
Tracking Foundation · Sources: Human direction 2026-06-18 · docs/tracking/decision-log.md#d18 · Work: WI-006 · Evidence: HITL-BIZ-001, HITL-BIZ-002; uploaded filing docs
REQ-BIZ-002 proposed P0 A8 · Foundation HITL
Trademark research must be summarized with proof before any filing decision, ending in a cleared mark or variant decision.
Accept: Mark uploads research with screenshots/links (HITL-BIZ-003); a file/variant decision is recorded (gate A8).
Tracking Foundation · Sources: Human direction 2026-06-18 · docs/tracking/decision-log.md#d18 · docs/tracking/hitl-tasks.json · Work: WI-006 · Evidence: HITL-BIZ-003; trademark research summary
REQ-PARTNER-001 proposed P1 A4 · Foundation HITL
Justin's partner work must be tracked by accepted contribution evidence and business value, separate from claimed effort.
Accept: Justin's contributions are logged with evidence and marked accepted before any partnership-percentage decision; sprint work items reference HITL-PARTNER-001.
Tracking Foundation · Sources: Human direction 2026-06-18 · docs/tracking/decision-log.md#d8 · docs/tracking/hitl-tasks.json · Work: WI-006 · Evidence: pending accepted work log
REQ-HITL-001 implemented P0 A4 · Foundation HITL
Human-owned tasks must be tracked by owner, reviewer, waiting state, milestone, evidence, and notes.
Accept: hitl-tasks.json exists and the tracker renders waiting-on tasks with owner/reviewer/evidence.
Tracking Foundation · Sources: Human direction 2026-06-18 · docs/tracking/decision-log.md#d8 · docs/tracking/hitl-tasks.json · Work: WI-006 · Evidence: docs/tracking/hitl-tasks.json
REQ-HITL-002 implemented P0 A4 · Foundation HITL
Partner contribution work must be tracked separately from product/code tasks (accepted evidence vs claimed effort).
Accept: Partner tasks show owner, reviewer, evidence, and status in a contribution ledger.
Tracking Foundation · Sources: Human direction 2026-06-18 · docs/tracking/decision-log.md#d8 · Work: WI-006 · Evidence: docs/tracking/index.html
REQ-HITL-003 implemented P1 A4 · Foundation HITL
HITL tasks must support uploaded evidence with an in-app review/approve flow and per-task ticket pages.
Accept: An owner uploads a doc (signed URL to private Storage) which sets evidence + flips to review; a reviewer approves/returns; upload/download/decision are audited; each task has a detail page.
Tracking Foundation · Sources: docs/tracking/hitl-upload-design.md · docs/tracking/decision-log.md#d18 · Work: WI-009 · Evidence: docs/tracking/hitl/*.html; docs/tracking/worker/tracker-write.mjs

LLM I/O Contracts — Platform & Contracts · 9 reqs · 0 built

REQ-CONTRACT-001 accepted P0 P1 · Platform & Contracts
Scan I/O contract schemas and versioning must be frozen before vision features build on them.
Accept: Request envelope, per-scan_type result schemas, scan_version/result_version, shared enums, and the normalized 0-1000 coordinate contract are specified and frozen.
Platform & Contracts · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (5-9, 28) · Work: WI-010 · Evidence: pending contract freeze
REQ-CONTRACT-002 accepted P0 P2 · Platform & Contracts
A provider-adapter boundary must normalize all vision providers into one canonical result.
Accept: OpenAI, Gemini, Claude, and local VLMs return one canonical result via strict structured output.
Platform & Contracts · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (18) · Work: WI-011 · Evidence: pending adapter scaffold
REQ-CONTRACT-003 accepted P0 P3 · Platform & Contracts
Model output must pass a validation pipeline with retry/fallback before use.
Accept: Syntax -> schema -> enum -> coordinate -> business-rule validation with the documented 2-attempt retry/fallback policy (same model simplified, then fallback provider).
Platform & Contracts · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (19) · Work: WI-012 · Evidence: pending pipeline spec
REQ-CONTRACT-004 accepted P0 P4 · Platform & Contracts
Candidate ranking must be deterministic, computed by TroveSnap from model evidence (not by the model).
Accept: The model returns component scores; TroveSnap computes the final ranking with documented per-profile weights (personal_hunt vs estate_organizer).
Platform & Contracts · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (20) · Work: WI-013 · Evidence: pending ranking impl
REQ-CONTRACT-005 accepted P0 P1 · Platform & Contracts
All seven scan types must be defined as versioned, UI-triggered contracts.
Accept: table_hunt, room_scan, item_scan, mark_scan, condition_scan, appraisal_prepare, appraisal_value each have input/output schemas, rules, and acceptance criteria; UI actions resolve to scan_type + version.
Platform & Contracts · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (4, 11-17) · Work: WI-010 · Evidence: spec sections 11-17
REQ-CONTRACT-006 accepted P1 P1 · Platform & Contracts
Watchlists must be a separate, versioned, tenant-scoped input whose match IDs are restricted to those supplied in the request.
Accept: Watchlist entries (query/aliases/makers/clues/priority), the allowed match types, and the restriction that result watch_id values must be supplied IDs are enforced.
Platform & Contracts · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (8) · Work: WI-010 · Evidence: spec section 8
REQ-CONTRACT-007 accepted P1 P1 · Platform & Contracts
Shared enums and the category taxonomy must be canonical, versioned inputs the model is constrained to.
Accept: identity_certainty, visibility, condition, priority, appraisal_state/readiness, reason codes, next_action, overlay_state, and the category roots/hierarchy are defined; the profile compiler can send relevant subsets.
Platform & Contracts · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (9-10) · Work: WI-010 · Evidence: spec sections 9-10
REQ-CONTRACT-008 accepted P1 P2 · Platform & Contracts
Scan configuration must be authored as YAML and compiled into provider-specific JSON Schema / grammar (separate config from output).
Accept: Human-authored YAML compiles to strict schemas/grammars; models return schema-constrained JSON while YAML stays the config/doc format.
Platform & Contracts · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (3, 28.1) · Work: WI-011 · Evidence: spec sections 3, 28
REQ-CONTRACT-009 accepted P1 P1 · Platform & Contracts
Scans must store both raw and normalized results with full provenance.
Accept: scan_record persists scan/version, input image ids, watchlist/taxonomy versions, provider+model, prompt/schema hashes, result refs, and metrics; raw + normalized results both stored.
Platform & Contracts · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (5, 22) · Work: WI-010 · Evidence: spec sections 5, 22

Platform & Data Model — Platform & Contracts · 7 reqs · 0 built

REQ-PLAT-001 accepted P0 P5 · Platform & Contracts
The ingestion + promotion contract must be the only path into canonical inventory.
Accept: Connectors/MCP/harness/buyer write candidates and events only; promoteInventoryCandidate() is the single canonical writer with traceability (source_import_records.promoted_record_id).
Platform & Contracts · Sources: docs/ARCHITECTURE.md · src/lib/troveSnapIngestion.ts · Work: WI-014 · Evidence: src/lib/troveSnapIngestion.ts
REQ-PLAT-002 accepted P0 P6 · Platform & Contracts
Data-model layers must be consolidated with a documented RLS upgrade path.
Accept: Canonical, marketplace, seller-intelligence, tracking-identity, disposition, and ingestion layers are documented with an owner-scoped RLS path.
Platform & Contracts · Sources: docs/technical/data-model.md · supabase/schema.sql · Work: WI-015 · Evidence: supabase/schema.sql
REQ-PLAT-004 accepted P1 P8 · Platform & Contracts
Observability and cost controls must bound scan spend and surface quality.
Accept: Scan trace structure, per-scan_type token/tier budgets, and quality/cost metrics (precision/recall, retake rate, cost per scan type) are defined.
Platform & Contracts · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (23, 25) · Work: WI-017 · Evidence: spec sections 23, 25
REQ-PLAT-005 accepted P0 P6 · Platform & Contracts
The canonical seller data layer must model sales, items (with lifecycle/appraisal/demand fields), photos, AI runs, exports, seller profiles, and discount phases.
Accept: estate_sales, estate_sale_items, estate_sale_item_photos, estate_sale_ai_runs, estate_sale_exports, seller_profiles, discount_phases exist in schema.sql with the documented fields.
Platform & Contracts · Sources: docs/technical/data-model.md (Canonical) · Work: WI-015 · Evidence: supabase/schema.sql
REQ-PLAT-006 accepted P1 P6 · Platform & Contracts
The marketplace/buyer data layer must model taxonomy/tags, buyer profiles, saved searches, watches, saves, wanted items, match alerts, followers, notifications, tokens, submissions, discount codes, and appraisals.
Accept: The listed buyer tables exist with buyer_id scoping ready for Auth.
Platform & Contracts · Sources: docs/technical/data-model.md (Marketplace/buyer) · Work: WI-015 · Evidence: supabase/schema.sql
REQ-PLAT-007 accepted P1 P6 · Platform & Contracts
The seller-intelligence layer must model alerts, demand signals, wishlist matches, appraisal recommendations, and status events.
Accept: seller_alerts, item_demand_signals, wishlist_matches, appraisal_recommendations, inventory_status_events exist.
Platform & Contracts · Sources: docs/technical/data-model.md (Seller intelligence) · Work: WI-015 · Evidence: supabase/schema.sql
REQ-PLAT-008 accepted P2 P6 · Platform & Contracts
Documented upgrade paths must exist for pgvector (semantic search) and PostGIS (geo).
Accept: Search/geo helpers (troveSearch haversine; FTS/RPC/Meilisearch later) have a documented path to pgvector/PostGIS without contract changes.
Platform & Contracts · Sources: docs/technical/architecture.md (Data) · Work: WI-015 · Evidence: docs/technical/domain-helpers.md

Security & Privacy — Platform & Contracts · 5 reqs · 0 built

REQ-SEC-001 accepted P0 P5 · Platform & Contracts
Third-party credentials must never be stored in app tables; credential_refs holds pointers only, with three documented levels (OAuth server-side, local harness, manual fallback).
Accept: credential_refs.storage_location is oauth_server | local_harness | vault; no raw secrets in any app table; no server-side scraping with stored passwords.
Platform & Contracts · Sources: docs/ARCHITECTURE.md (Credential handling) · docs/product/source-ingestion.md · Work: WI-014 · Evidence: docs/ARCHITECTURE.md
REQ-SEC-002 accepted P0 P5 · Platform & Contracts
Supabase key boundaries must be enforced: browser/mobile use anon key + user JWT + RLS; server/edge use the service role; the harness uses a scoped device token, never the global service role.
Accept: The service role never ships to the browser; OAuth tokens (oauth_tokens) are RLS service-role-only; the harness validates a scoped token.
Platform & Contracts · Sources: docs/ARCHITECTURE.md (Supabase key boundaries) · docs/technical/harness-connectors.md · Work: WI-014 · Evidence: docs/ARCHITECTURE.md
REQ-SEC-003 accepted P0 P6 · Platform & Contracts
Public QR/buyer pages must never expose private notes, internal pricing guidance, margin, consignor details, or seller PII.
Accept: Public QR payloads use opaque IDs and resolve to buyer-safe pages; staff/binding views are auth-gated; internal pricing is hidden from buyers.
Platform & Contracts · Sources: docs/product/capture-to-sale-tracking.md (QR rules) · docs/product/appraisal-workflows.md · Work: WI-015 · Evidence: docs/product/capture-to-sale-tracking.md
REQ-SEC-004 accepted P1 P8 · Platform & Contracts
Vision image access must be scoped and minimized: scoped to sale/user/org, accessed via expiring signed URLs, sending providers only required images/context, with configurable provider retention.
Accept: Signed URLs expire; watchlists stay tenant-scoped; raw model output is treated as untrusted until validated; external appraisal queries cannot leak private client info.
Platform & Contracts · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (24) · Work: WI-017 · Evidence: spec section 24
REQ-SEC-005 accepted P1 P6 · Platform & Contracts
RLS must move from MVP-permissive to owner-scoped on a documented path, and buyer tables scope by buyer_id once Auth lands.
Accept: owner_id = auth.uid() policies are the documented upgrade for seller tables; buyer_id scoping activates with Auth.
Platform & Contracts · Sources: docs/technical/data-model.md (RLS) · Work: WI-015 WI-049 · Evidence: supabase/schema.sql

MCP Tool Surface — Platform & Contracts · 4 reqs · 2 built

REQ-MCP-003 accepted P1 P7 · Platform & Contracts
Approval-gated MCP tools (promote_candidate, publish_sale, update_item_status, notify_matched_buyers) must require explicit seller approval or an auditable, revocable automation policy.
Accept: No tool bypasses promoteInventoryCandidate(); none touch credential_refs contents; live publishing/paid/destructive actions are never auto-approved by default.
Platform & Contracts · Sources: docs/technical/mcp-tools.md (Approval-gated; Hard rules) · Work: WI-016 · Evidence: pending approval flow
REQ-PLAT-003 accepted P1 P7 · Platform & Contracts
The MCP tool surface must expose safe tools first and gate dangerous ones.
Accept: Read/search/candidate tools land first; publish/bulk/delete tools require explicit approval or an auditable, revocable automation policy.
Platform & Contracts · Sources: docs/ARCHITECTURE.md · docs/technical/mcp-tools.md · Work: WI-016 · Evidence: packages/mcp-server
REQ-MCP-001 implemented P1 P7 · Platform & Contracts
A read-only MCP tool tier must be available (list/get sales, list items, search marketplace, demand signals, import runs).
Accept: A stdio MCP server exposes the read tools; without env it serves mock data; with env it reads live.
Platform & Contracts · Sources: docs/technical/mcp-tools.md · docs/technical/harness-connectors.md (#2) · Work: WI-016 · Evidence: packages/mcp-server
REQ-MCP-002 implemented P1 P7 · Platform & Contracts
A candidate-writing MCP tier must create candidates/imports/events only (create_candidate, run_manual_import, map_csv_columns, draft_listing_copy, stage_export).
Accept: These tools write source_import_records / inventory_candidates / plugin_events; nothing canonical; every call logs plugin_events.
Platform & Contracts · Sources: docs/technical/mcp-tools.md · Work: WI-016 · Evidence: packages/mcp-server

Item Identity & Status Spine — Spine POC · 7 reqs · 0 built

REQ-SPINE-001 accepted P0 B1 · Sprint 1 - Spine POC
Items need stable identity suitable for sale operations and later recovery.
Accept: A POC item keeps a stable identity across status updates and CSV roundtrip.
Spine POC · Sources: docs/product/capture-to-sale-tracking.md · docs/technical/data-model.md (Tracking identity) · Work: WI-026 WI-044 · Evidence: pending Sprint 1 demo
REQ-SPINE-002 accepted P0 B1 · Sprint 1 - Spine POC
Status changes need an event contract that can support audit and reconciliation.
Accept: Status event fields (previous/new status, source, final price) are documented and used by the POC path.
Spine POC · Sources: docs/product/capture-to-sale-tracking.md · docs/technical/data-model.md (inventory_status_events) · Work: WI-026 WI-044 · Evidence: pending Sprint 1 demo
REQ-SPINE-003 accepted P0 B2 · Sprint 1 - Spine POC
QR codes need opaque resolver bindings rather than exposed mutable internal IDs.
Accept: A QR demo resolves item state through an opaque binding; a code can start unbound, bind on first scan, be released, and be rebound.
Spine POC · Sources: docs/product/capture-to-sale-tracking.md · docs/CC-Analysis/qr-closed-loop-and-sticker-packs.md · Work: WI-026 WI-045 · Evidence: pending Sprint 1 demo
REQ-SPINE-004 accepted P1 B3 · Sprint 1 - Spine POC
Sold/status CSV roundtrip needs to work with existing primitives before richer workflows.
Accept: CSV export/import can update sold/status state in demo fixtures.
Spine POC · Sources: docs/product/capture-to-sale-tracking.md · docs/product/post-sale-reconciliation.md · Work: WI-026 WI-046 · Evidence: src/lib/troveInventoryStatus.ts
REQ-SPINE-005 accepted P1 B4 · Sprint 1 - Spine POC
QR/identity binding needs durable tables with opaque public codes.
Accept: qr_codes / item_identity_bindings model opaque codes, binding state, bound/released timestamps, and binding history.
Spine POC · Sources: docs/technical/data-model.md (Tracking identity) · Work: WI-026 WI-047 · Evidence: pending Sprint 1 demo
REQ-SPINE-006 accepted P1 B5 · Sprint 1 - Spine POC
Status transitions need an audit trail for reconciliation and recovery.
Accept: inventory_status_events records transitions (with source: manual|csv_import|platform_sync|barcode|harness) that reconciliation and recovery read.
Spine POC · Sources: docs/technical/data-model.md (inventory_status_events) · Work: WI-026 WI-048 · Evidence: pending Sprint 1 demo
REQ-SPINE-007 accepted P1 B1 · Sprint 1 - Spine POC
The canonical item lifecycle and its events must be defined, including disposition branches and an event stream safe to replay into analytics.
Accept: Lifecycle draft->reviewed->published->active_sale->pending->sold->picked_up plus not_sold->disposition branches; the ~21 named events are emitted without implying every event mutates canonical inventory.
Spine POC · Sources: docs/product/capture-to-sale-tracking.md (Status Contract, Events) · docs/product/disposition-engine.md · Work: WI-026 WI-044 · Evidence: docs/product/capture-to-sale-tracking.md

Operational Floor — Operational Floor POC · 7 reqs · 0 built

REQ-OPS-001 accepted P0 C1 · Sprint 2 - Operational Floor POC
Rooms, zones, and pickup areas need to be first-class tracking fields across setup, capture, labels, checkout, pickup, and reports.
Accept: Items can be grouped and filtered by room/zone/pickup area, and those carry through to labels and client reports.
Operational Floor POC · Sources: docs/product/capture-to-sale-tracking.md (Operational Primitives) · docs/strategy/ESTATE-SELLER-WORKFLOWS.md · Work: WI-023 WI-024 WI-027 WI-032 · Evidence: pending Sprint 2 demo
REQ-OPS-002 accepted P0 C2 · Sprint 2 - Operational Floor POC
Label batches need a first-class print/pack workflow synchronized through the binding model.
Accept: Mass label printing, reprints, skipped labels, room/zone grouping, preprinted sticker-pack codes, and a list of unlabelled high-value items all bind through the same model.
Operational Floor POC · Sources: docs/product/capture-to-sale-tracking.md (QR And Label Rules) · docs/CC-Analysis/qr-closed-loop-and-sticker-packs.md · Work: WI-023 WI-024 WI-027 WI-033 · Evidence: pending Sprint 2 demo
REQ-OPS-003 accepted P1 C3 · Sprint 2 - Operational Floor POC
Bulk operations need early operational support with a conflict preview before applying.
Accept: Bulk price/category/room edits, mass label generation, batch discount changes, and duplicate-room setup between sales all show a reviewable conflict preview before applying.
Operational Floor POC · Sources: docs/product/capture-to-sale-tracking.md (Bulk operations) · docs/strategy/ESTATE-SELLER-WORKFLOWS.md · Work: WI-023 WI-024 WI-027 WI-034 · Evidence: pending Sprint 2 demo
REQ-OPS-004 accepted P1 C4 · Sprint 2 - Operational Floor POC
Client reports need to summarize sale/reconciliation outcomes with audit links.
Accept: A report package generates sold/pending/unsold/donated/removed lines, totals by room/zone/consignor/category/day, gross/fees/net/recovered, and an exception list, each linked to status events.
Operational Floor POC · Sources: docs/product/post-sale-reconciliation.md (Client Reports) · Work: WI-023 WI-024 WI-027 WI-035 · Evidence: pending Sprint 2 demo
REQ-OPS-005 accepted P1 C5 · Sprint 2 - Operational Floor POC
Team roles and permissions need first-class support with an RLS path.
Accept: Roles owner/admin, cataloger, pricer, label/runner, checkout, and client-report viewer exist with an owner-scoped RLS upgrade path.
Operational Floor POC · Sources: docs/product/capture-to-sale-tracking.md (Team roles) · docs/technical/data-model.md (RLS) · Work: WI-027 · Evidence: pending Sprint 2 demo
REQ-OPS-006 accepted P1 C6 · Sprint 2 - Operational Floor POC
Markdown/discount phases need a timed pricing model.
Accept: discount_phases supports timed sale pricing stages; calculateSaleDiscountState returns current/next/urgency/percent.
Operational Floor POC · Sources: docs/technical/data-model.md (discount_phases) · docs/technical/domain-helpers.md (troveDiscounts) · Work: WI-027 · Evidence: src/lib/troveDiscounts.ts
REQ-OPS-007 accepted P1 C4 · Sprint 2 - Operational Floor POC
POS imports must reconcile item identity without TroveSnap becoming a POS (interop-first).
Accept: Square quick-amount, EstateSail/PROSALE itemized exports, and Shopify/Whatnot online-channel exports import and reconcile by QR/labels/lot IDs/room/manual; payments, refunds, receipts, tax, and cash drawers stay out of scope.
Operational Floor POC · Sources: docs/product/post-sale-reconciliation.md (POS Interop) · docs/product/capture-to-sale-tracking.md · Evidence: docs/product/post-sale-reconciliation.md

Capture & Enrichment — Capture / Enrich POC · 5 reqs · 1 built

REQ-CAPTURE-001 accepted P0 D1 · Sprint 3 - Capture/Enrich POC
Photo and note capture needs a review queue before enrichment becomes operational state, capturing room/zone/pickup context on site.
Accept: Demo captures media/notes + room context and queues them for review; output stays an inventory_candidate, not canonical inventory.
Capture / Enrich POC · Sources: docs/CC-Analysis/codex-handoff-freemium-positioning.md · docs/product/capture-to-sale-tracking.md (Stage 1) · Work: WI-028 · Evidence: pending Sprint 3 demo
REQ-CAPTURE-002 accepted P1 D2 · Sprint 3 - Capture/Enrich POC
Deterministic enrichment should be used where rules are clear (on-device/low-cost before paid AI).
Accept: Rule-based tags/enrichment are distinguishable from guesses; deriveTreasureTags + buildSearchVectorText power search without paid calls.
Capture / Enrich POC · Sources: docs/CC-Analysis/codex-handoff-freemium-positioning.md · docs/technical/domain-helpers.md (troveTags, troveSnapEnrichment) · Work: WI-028 · Evidence: src/lib/troveTags.ts
REQ-CAPTURE-003 accepted P0 D3 · Sprint 3 - Capture/Enrich POC
Suggested enrichment must be human-reviewed before operational mutation.
Accept: Seller approves/edits/rejects/merges/sends-back-for-better-photos before any state change; promoteInventoryCandidate() remains the only canonical path.
Capture / Enrich POC · Sources: docs/CC-Analysis/codex-handoff-freemium-positioning.md · docs/product/capture-to-sale-tracking.md (Stage 4) · Work: WI-028 · Evidence: pending Sprint 3 demo
REQ-CAPTURE-004 accepted P1 D4 · Sprint 3 - Capture/Enrich POC
The source-import pipeline must run end to end into candidates.
Accept: source_import_runs/source_import_records -> inventory_candidates is demoable end to end with plugin_events audit.
Capture / Enrich POC · Sources: docs/ARCHITECTURE.md (ingestion contract) · docs/product/source-ingestion.md · Work: WI-028 · Evidence: src/lib/troveSnapIngestion.ts
REQ-CAPTURE-005 implemented P1 D5 · Sprint 3 - Capture/Enrich POC
Deterministic enrichment mocks must have stable contracts gated behind review.
Accept: Tags/enrichment/copy/anti-cheat mocks (troveTags, troveSnapEnrichment, troveCopyGen, troveAntiCheat) have stable contracts and never mutate canonical state without review; LLMs swap in behind the same contract.
Capture / Enrich POC · Sources: docs/technical/architecture.md (AI) · docs/technical/domain-helpers.md · Work: WI-028 · Evidence: src/lib/troveSnapEnrichment.ts

Connectors & Harness — Capture / Enrich POC · 5 reqs · 3 built

REQ-CONNECT-004 accepted P2 D4 · Sprint 3 - Capture/Enrich POC
Additional source types must follow the one-door rule (manual paste, marketplace/auction CSVs, Gmail alerts, custom links, browser extension, buyer submissions).
Accept: Every source writes source_import_records -> inventory_candidates -> review; buyer submissions (garage_sale_submissions) follow the same review-then-canonical pattern.
Capture / Enrich POC · Sources: docs/product/source-ingestion.md (Source types) · docs/technical/harness-connectors.md · Evidence: src/lib/troveHarness.ts
REQ-CONNECT-005 accepted P2 D4 · Sprint 3 - Capture/Enrich POC
External channel links must be captured per sale with click-through attribution.
Accept: Sellers add EstateSales.net/Facebook/HiBid links (external_listing_urls); /api/out logs click-throughs for cross-channel attribution.
Capture / Enrich POC · Sources: docs/product/source-ingestion.md (External channels) · docs/strategy/ANALYTICS-AND-SYNC-INTEGRATIONS.md · Evidence: estate_sales.external_listing_urls
REQ-CONNECT-001 implemented P0 D4 · Sprint 3 - Capture/Enrich POC
A CSV/Excel import wizard must normalize any platform sold-report into status events with a confirmable column mapping and conflict preview.
Accept: Upload -> suggestCsvMapping guesses columns -> seller confirms -> statuses normalize via synonyms -> preview rows + conflicts -> apply writes inventory_status_events + an import run.
Capture / Enrich POC · Sources: docs/technical/harness-connectors.md (#1) · docs/product/post-sale-reconciliation.md · Evidence: /trovesnap/harness/csv-import; src/lib/troveInventoryStatus.ts
REQ-CONNECT-002 implemented P1 D4 · Sprint 3 - Capture/Enrich POC
OAuth folder connectors (Google Drive, OneDrive, Google Photos) must pull images into import records + photo candidates, deduped, with server-side-only tokens.
Accept: start->consent->callback (tokens server-side in oauth_tokens, RLS service-role-only)->sync pulls new media deduped by file/media id into candidates.
Capture / Enrich POC · Sources: docs/technical/harness-connectors.md (#3, #5, #6) · docs/product/source-ingestion.md · Evidence: /api/connect/google|onedrive|google-photos/*
REQ-CONNECT-003 implemented P1 D4 · Sprint 3 - Capture/Enrich POC
A zero-dependency desktop harness must watch a local folder and upload normalized records via a scoped token, with files/credentials never leaving the machine.
Accept: apps/harness/harness.mjs posts to /api/harness/ingest validating x-harness-token, deduped by device+path, creating an import run + photo candidates; only filename/size/mtime metadata is sent in this version.
Capture / Enrich POC · Sources: docs/technical/harness-connectors.md (#4) · docs/ARCHITECTURE.md (Credential handling level 2) · Evidence: apps/harness/harness.mjs

Vision Scanning — Vision Contract POC · 10 reqs · 0 built

REQ-VISION-001 accepted P0 E1 · Sprint 4 - Vision Contract POC
Table hunt and item scan schemas need accepted contracts rendered as overlays.
Accept: table_hunt + item_scan schema examples validate; candidates render as tappable overlays.
Vision Contract POC · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (11, 13) · Work: WI-024 WI-029 WI-036 · Evidence: pending Sprint 4 demo
REQ-VISION-002 accepted P1 💲 API COST E2 · Sprint 4 - Vision Contract POC
Vision providers need an adapter boundary (consuming the P2 boundary).
Accept: Provider-specific code is behind an adapter scaffold returning the canonical result.
Vision Contract POC · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (18) · Work: WI-029 WI-036 · Evidence: pending adapter
REQ-VISION-003 accepted P1 E3 · Sprint 4 - Vision Contract POC
Vision confidence and corrections need a visible review UX.
Accept: Overlay/review demo shows confidence and captures bounding-box and identity corrections.
Vision Contract POC · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (21) · Work: WI-024 WI-029 WI-036 · Evidence: spec section 21
REQ-VISION-004 accepted P1 E4 · Sprint 4 - Vision Contract POC
room_scan must handle multi-image coverage, counts, dedup, and sightings.
Accept: Multi-image coverage, category counts, approximate dedup, multiple sightings per candidate, and a missing-coverage checklist validate.
Vision Contract POC · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (12) · Work: WI-029 · Evidence: spec section 12
REQ-VISION-005 accepted P1 E5 · Sprint 4 - Vision Contract POC
mark_scan/condition_scan must extract marks and grade visible condition.
Accept: Literal OCR preserved + normalized maker/model/serial; visible-condition grading links each observation to an image; functionality is never inferred.
Vision Contract POC · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (14-15) · Work: WI-029 · Evidence: spec sections 14-15
REQ-VISION-006 accepted P1 E6 · Sprint 4 - Vision Contract POC
appraisal_prepare must report readiness and a search fingerprint without pricing.
Accept: Returns readiness state + missing evidence + a normalized search fingerprint and never estimates value.
Vision Contract POC · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (16) · Work: WI-029 · Evidence: spec section 16
REQ-VISION-007 accepted P1 💲 API COST E7 · Sprint 4 - Vision Contract POC
appraisal_value must produce comps-based ranges and adjustments from supplied comparables.
Accept: Returns multiple sale-context ranges, adjustments, and strongest comps; TroveSnap computes the quantitative baseline; unsupported model memory is never treated as a comparable.
Vision Contract POC · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (17) · Work: WI-029 · Evidence: spec section 17
REQ-VISION-008 accepted P1 E8 · Sprint 4 - Vision Contract POC
Watchlists must be versioned, tenant-scoped, and restricted to supplied IDs (POC enforcement).
Accept: Result watch_id values are restricted to those supplied; watchlists are tenant-scoped and versioned.
Vision Contract POC · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (8) · Work: WI-029 · Evidence: spec section 8
REQ-VISION-009 accepted P2 E9 · Sprint 4 - Vision Contract POC
A local VLM adapter must support grammar-constrained output and routing.
Accept: Local VLM adapter produces grammar-constrained output and participates in provider routing/benchmarking (local-vs-hosted quality delta tracked).
Vision Contract POC · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (18, 27) · Work: WI-029 · Evidence: spec section 27
REQ-VISION-010 accepted P1 E3 · Sprint 4 - Vision Contract POC
Per-scan UI/UX requirements must be met for each scan type (overlays, ordinal labels, semantic icons, tap selection, why-flagged, next-scan launch, retake guidance).
Accept: Table-hunt/room-scan/item-scan/appraisal UIs meet the listed UX requirements; the UI owns colors/icons/animation while the contract owns overlay_state.
Vision Contract POC · Sources: docs/CC-Analysis/trovesnap-vision-scanning-spec.md (21) · Evidence: spec section 21

Appraisal Workflows — Vision Contract POC · 5 reqs · 3 built

REQ-APPR-003 accepted P2 E6 · Sprint 4 - Vision Contract POC
Appraisal sharing must support privacy modes and toggles that never expose private addresses or buyer identity.
Accept: share_status private|link|public|seller_inventory with toggles (photo/range/sale-link/city-only/hide-profile); sellers see only aggregates for linked sales.
Vision Contract POC · Sources: docs/product/appraisal-workflows.md (Sharing privacy) · Evidence: appraisals.share_status
REQ-APPR-005 accepted P0 E6 · Sprint 4 - Vision Contract POC
Appraisal language must avoid certified-appraisal / guaranteed-value claims everywhere.
Accept: Every appraisal surface shows 'AI estimates are not certified appraisals'; uses 'suggested range/estimate/research recommended'; never 'certified appraisal/guaranteed value/auto-publish'.
Vision Contract POC · Sources: docs/product/appraisal-workflows.md · docs/product/pricing-and-tokens.md (Language rules) · docs/product/capture-to-sale-tracking.md (Guardrails) · Evidence: docs/product/appraisal-workflows.md
REQ-APPR-001 implemented P1 💲 API COST E6 · Sprint 4 - Vision Contract POC
A buyer Quick Appraise surface must identify an item from a photo and return range, confidence, condition, market context, tags, and photo coaching.
Accept: /trovesnap/appraise takes a photo (+ optional hints + where-found context) and returns identification/range/confidence/condition/tags with photo coaching; token-metered behind /api/appraise.
Vision Contract POC · Sources: docs/product/appraisal-workflows.md (Buyer Quick Appraise) · docs/CC-Analysis/trovesnap-vision-scanning-spec.md (16-17) · Evidence: /trovesnap/appraise; src/lib/troveAppraise.ts
REQ-APPR-002 implemented P1 E6 · Sprint 4 - Vision Contract POC
Quick Appraise must compute a value signal comparing observed price to the range (bargain/fair/overpriced/research-needed) and offer routing actions.
Accept: deriveValueSignal returns the signal; actions include save (with found context), share, find similar nearby, add to Hunt, add to inventory, create saved search.
Vision Contract POC · Sources: docs/product/appraisal-workflows.md · docs/technical/domain-helpers.md (troveAppraise) · Evidence: src/lib/troveAppraise.ts
REQ-APPR-004 implemented P1 E6 · Sprint 4 - Vision Contract POC
A seller Review Queue must turn bulk photos into flags, editable AI copy, hidden internal pricing guidance, and publish readiness.
Accept: /trovesnap/review-queue surfaces appraisal-recommended / better-photos / demand / wishlist flags, editable copy, internal pricing (hidden from buyers), and feature/hold/door-code controls.
Vision Contract POC · Sources: docs/product/appraisal-workflows.md (Seller Review Queue) · Evidence: /trovesnap/review-queue

Demand & Recovery — Demand / Recovery POC · 3 reqs · 0 built

REQ-DEMAND-001 accepted P1 F1 · Sprint 5 - Demand/Recovery POC
QR scans should produce anonymous demand signals.
Accept: Buyer QR scans create anonymous item interest signals (item_demand_signals) without exposing buyer identity.
Demand / Recovery POC · Sources: docs/product/post-sale-reconciliation.md · docs/product/capture-to-sale-tracking.md · Work: WI-030 · Evidence: pending Sprint 5 demo
REQ-DEMAND-002 accepted P1 F2 · Sprint 5 - Demand/Recovery POC
Watch/offer hooks should be designed after scan demand is available.
Accept: Watch and make-offer hooks are documented and connectable to item demand state; buyer_offers exists; live workflow activates with Auth (no payments).
Demand / Recovery POC · Sources: docs/product/disposition-engine.md (Make Offer) · Work: WI-030 · Evidence: buyer_offers
REQ-DEMAND-003 accepted P1 F3 · Sprint 5 - Demand/Recovery POC
Unsold routing and reconciliation outputs need to connect to tracked state.
Accept: Demo routes unsold items and reflects them in reconciliation outputs (sold report, unsold/donation manifests, clearance/leftover plan).
Demand / Recovery POC · Sources: docs/product/post-sale-reconciliation.md (Outputs) · Work: WI-030 · Evidence: src/lib/troveInventoryStatus.ts

Disposition / What's Next — Demand / Recovery POC · 5 reqs · 2 built

REQ-DEMAND-005 accepted P1 F5 · Sprint 5 - Demand/Recovery POC
Unsold lots must export to external auction pipelines as seller-reviewed packages (never auto-published).
Accept: buildAuctionExportCsv produces a reviewed CSV (title/description/category/condition/suggested starting bid ~40% high est/reserve/tags/notes); auctions are channels, not competitors; nothing auto-publishes.
Demand / Recovery POC · Sources: docs/CC-Analysis/auction-outbound-integration-spec.md · docs/product/disposition-engine.md (AuctionNinja/HiBid) · Work: WI-030 · Evidence: src/lib/troveDisposition.ts
REQ-DISP-001 accepted P1 F3 · Sprint 5 - Demand/Recovery POC
Wishlist recovery must re-match unsold items against the cross-sale buyer demand graph and offer one-click buyer notification.
Accept: After a sale closes, unsold items match against wanted_items/saved_searches/item_demand_signals; the dashboard + What's Next banner offer 'notify interested buyers' / enable offers to anonymous buyers.
Demand / Recovery POC · Sources: docs/product/disposition-engine.md (Wishlist Recovery) · docs/product/seller-alerts.md (#7) · Evidence: docs/product/disposition-engine.md
REQ-DISP-003 accepted P2 F3 · Sprint 5 - Demand/Recovery POC
Post-sale analytics must derive recovery metrics from status events + offers.
Accept: Unsold value, recovered revenue, recovery success rate, auction conversion, and disposition outcome breakdown derive from inventory_status_events + buyer_offers.
Demand / Recovery POC · Sources: docs/product/disposition-engine.md (Data model) · docs/product/capture-to-sale-tracking.md (Metrics) · Evidence: inventory_status_events
REQ-DEMAND-004 implemented P1 F4 · Sprint 5 - Demand/Recovery POC
A disposition engine must route post-sale outcomes with explainable recommendations including responsible disposal.
Accept: recommendDisposition() applies the documented priority ladder (wishlist->auction->republish->offers->consignment->clearance/donation) with shown reasons; responsible_disposal is a terminal route; buyer_offers + disposition_recommendations model the flow.
Demand / Recovery POC · Sources: docs/product/disposition-engine.md · docs/technical/data-model.md (Disposition) · Work: WI-030 · Evidence: src/lib/troveDisposition.ts
REQ-DISP-002 implemented P1 F4 · Sprint 5 - Demand/Recovery POC
A Workflow Center (Kanban) must make dragging the status transition across two boards with bottleneck counts.
Accept: /trovesnap/workflow shows Inventory Workflow (Imported->Needs Review->Needs Appraisal->Needs Photos->Ready->Published) and What's Next (Unsold->Review->Auction->Offers->Donation->Archived) with demand/wishlist/appraisal chips + recommended next step.
Demand / Recovery POC · Sources: docs/product/disposition-engine.md (Workflow Center) · docs/product/post-sale-reconciliation.md (What's Next) · Evidence: /trovesnap/workflow

Seller Alerts & Intelligence — Demand / Recovery POC · 3 reqs · 0 built

REQ-NOTIF-001 accepted P1 F3 · Sprint 5 - Demand/Recovery POC
Seller alerts must cover the full set of alert types driven by item/demand/sale state.
Accept: seller_alerts.alert_type spans appraisal_recommended, better_photos_needed, buyer_demand, exact_wishlist_match, publish_readiness, discount_opportunity, unsold_demand_recovery, buyer_offer_received, disposition_review, post_sale_reconciliation, and source_harness, each with its documented actions.
Demand / Recovery POC · Sources: docs/product/seller-alerts.md (Categories) · docs/technical/data-model.md (Seller intelligence) · Evidence: seller_alerts
REQ-NOTIF-002 accepted P1 F3 · Sprint 5 - Demand/Recovery POC
The primary appraisal-recommended alert must trigger on high-value categories with clear seller actions.
Accept: Jewelry/watches/coins/sterling/art/antique furniture/vintage audio/cameras/designer/rare collectibles/instruments/etc. trigger 'appraisal may need to be run' with run/request-photos/mark-reviewed/dismiss actions.
Demand / Recovery POC · Sources: docs/product/seller-alerts.md (#1) · docs/technical/domain-helpers.md (appraisal_recommendations) · Evidence: appraisal_recommendations
REQ-NOTIF-003 accepted P2 F3 · Sprint 5 - Demand/Recovery POC
Alert surfaces must include a dashboard Action-Needed panel, a sidebar Alerts badge, review-queue flags, and demand-page actions, delivered via in-app notifications with per-audience settings.
Accept: The four surfaces render; troveNotifications manages in-app notifications + notification_settings per audience.
Demand / Recovery POC · Sources: docs/product/seller-alerts.md (Surfaces) · docs/technical/domain-helpers.md (troveNotifications) · Evidence: src/lib/troveNotifications.ts

Trove Go (Buyer) — Surfaces & Delivery · 4 reqs · 1 built

REQ-BUYER-002 accepted P1 S1 · Surfaces & Delivery
Buyers must save searches, watch sales, save items, and maintain a Hunt/wishlist that drives match alerts.
Accept: saved_searches, watched_sales, item_saves, wanted_items, match_alerts work; Hunt list feeds wishlist matches.
Surfaces & Delivery · Sources: docs/product/ecosystem.md · docs/technical/data-model.md (Marketplace/buyer) · docs/technical/domain-helpers.md (troveMarketplaceApi) · Evidence: src/lib/troveMarketplaceApi.ts
REQ-BUYER-003 accepted P2 S1 · Surfaces & Delivery
Buyers must be able to submit missing sales with confirmation photos through an anti-cheat-scored review flow.
Accept: garage_sale_submissions(+photos) follow review-then-canonical; scoreGarageSaleSubmission + analyzeGarageSalePhoto gate submissions.
Surfaces & Delivery · Sources: docs/product/mobile-strategy.md (Buyer Mode) · docs/technical/domain-helpers.md (troveAntiCheat) · Evidence: src/lib/troveAntiCheat.ts
REQ-BUYER-004 accepted P2 S1 · Surfaces & Delivery
Buyer tokens must be earned (not bought) and unlock badges, early alerts, and boosted saved searches.
Accept: Tokens earned via submissions/confirmations/check-ins; spendable only on optional perks; token_ledger pending->approved/rejected with balances.
Surfaces & Delivery · Sources: docs/product/pricing-and-tokens.md (Buyer tokens) · docs/technical/domain-helpers.md (troveTokens) · Evidence: src/lib/troveTokens.ts
REQ-BUYER-001 implemented P1 S1 · Surfaces & Delivery
Trove Go (buyer) must provide discovery: home, marketplace, map, and item/sale search by item/tag/distance/discount.
Accept: Buyer pages Home/Marketplace/Map render; searchMarketplaceSales + featured sidebar + haversine distance power discovery.
Surfaces & Delivery · Sources: docs/product/ecosystem.md (Trove Go) · docs/product/mobile-strategy.md (Buyer Mode) · docs/technical/domain-helpers.md (troveSearch) · Evidence: apps/web (buyer zone); src/lib/troveSearch.ts

Surfaces (Web / Mobile) — Surfaces & Delivery · 4 reqs · 2 built

REQ-SURF-002 accepted P1 S2 · Surfaces & Delivery
A mobile capture app must support fast sale-floor capture and sync (one app, two modes).
Accept: The Expo RN 'Trove Go' app (Buyer Mode + TroveSnap Capture) supports create/select sale, photos, room labels, notes, sync, and simple review; no keys on device.
Surfaces & Delivery · Sources: docs/product/mobile-strategy.md · docs/ARCHITECTURE.md (phase 3) · Work: WI-019 · Evidence: apps/mobile
REQ-SURF-004 accepted P2 S2 · Surfaces & Delivery
Mobile is capture-first/action-first and web is management-first/analytics-first, with shared domain logic lifted to a shared package.
Accept: Mobile owns photos/check-ins/on-site appraisals/alerts; web owns review/harness/analytics/publishing; shared trove*.ts helpers/types move to packages/core when mobile work starts.
Surfaces & Delivery · Sources: docs/product/mobile-strategy.md (Division of labor, Implementation) · Evidence: docs/product/mobile-strategy.md
REQ-SURF-003 implemented P1 S3 · Surfaces & Delivery
A connector harness must collect and normalize outside data without exporting secrets.
Accept: TroveSnap Local stores credential/session pointers, runs source connectors, and uploads normalized records; plugin manifests supported; none write canonical inventory.
Surfaces & Delivery · Sources: docs/technical/harness-connectors.md · docs/ARCHITECTURE.md (phase 4) · Work: WI-020 · Evidence: apps/harness; docs/technical/harness-connectors.md
REQ-SURF-001 verified P0 S1 · Surfaces & Delivery
The web command center must support sales, photos, items, enrich, review, publish, and import history.
Accept: The Next.js web command center is live in apps/web (buyer zone + seller zone chosen by route).
Surfaces & Delivery · Sources: docs/ARCHITECTURE.md (build order phase 2) · docs/technical/architecture.md (Surfaces) · Work: WI-018 · Evidence: apps/web

Infrastructure & Deploy — Surfaces & Delivery · 3 reqs · 1 built

REQ-INFRA-001 accepted P1 💲 PAID INFRA S4 · Surfaces & Delivery
Deploy/infra must take Supabase schema to Cloudflare Workers with analytics.
Accept: Supabase schema deploys first, then Cloudflare Workers via OpenNext, with analytics wired.
Surfaces & Delivery · Sources: docs/technical/architecture.md (Deploy) · DEPLOY.md · Work: WI-021 · Evidence: DEPLOY.md
REQ-INFRA-002 accepted P2 💲 PAID INFRA S4 · Surfaces & Delivery
Analytics must combine Cloudflare Web Analytics, PostHog, and Supabase aggregates, following the spine proof.
Accept: Funnel analytics are wired after Sprint 1 spine proof; event volume has a documented paid-tier migration point.
Surfaces & Delivery · Sources: docs/technical/architecture.md (Deploy) · docs/strategy/ANALYTICS-AND-SYNC-INTEGRATIONS.md · Evidence: docs/strategy/ANALYTICS-AND-SYNC-INTEGRATIONS.md
REQ-INFRA-003 implemented P2 S1 · Surfaces & Delivery
A demo mode must serve fixtures with writes as no-ops so every surface is demoable keyless.
Accept: NEXT_PUBLIC_TROVESNAP_DEMO=1 serves src/lib/*DemoData.ts fixtures; writes are no-ops; Storage buckets (estate-sale-photos, garage-sale-submission-photos) defined.
Surfaces & Delivery · Sources: docs/technical/architecture.md (Data) · Evidence: src/lib/troveSnapDemoData.ts

Pricing, Tokens & Monetization — Positioning / Go-To-Market · 3 reqs · 0 built

REQ-MON-002 proposed P2 G4 · Parallel Positioning
Seller plans and token packs must be defined (prototype direction; Codex-owned final pricing).
Accept: Free/Garage, Estate ($12), Estate Pro/Agency ($29) tiers + token packs are specified; payment/POS processing stays out of the early plan; physical SKU pricing stays internal until validated.
Positioning / Go-To-Market · Sources: docs/product/pricing-and-tokens.md (Plans) · docs/strategy/MONETIZATION-AND-CREDITS-STRATEGY.md · Evidence: docs/product/pricing-and-tokens.md
REQ-MON-001 accepted P1 G4 · Parallel Positioning
A hybrid model must include routine automation in subscriptions and meter expensive AI with tokens; the QR/identity layer is operational, not premium.
Accept: Included: photo intake, item cards, tag detection, basic copy, sale page, discount phases, CSV import/export, review queue, demand counts, wishlist alerts, basic QR + sold/not-sold tracking. Token-metered: deep appraisal, comp research, batch pricing, image enhancement, marketplace copy, card gen, advanced targeting.
Positioning / Go-To-Market · Sources: docs/product/pricing-and-tokens.md · docs/strategy/MONETIZATION-AND-CREDITS-STRATEGY.md · Evidence: docs/product/pricing-and-tokens.md
REQ-MON-003 accepted P2 💲 API COST G4 · Parallel Positioning
AI routing must minimize cost: deterministic mocks first, Workers AI / economy pass, Gemini escalation, deep comps only via tokens.
Accept: No paid APIs required for MVP; live Gemini behind /api/appraise (key optional, simulated fallback, retry on 429/5xx); per-scan_type token/tier budgets enforce cost ceilings.
Positioning / Go-To-Market · Sources: docs/technical/architecture.md (AI) · docs/CC-Analysis/trovesnap-vision-scanning-spec.md (25) · Evidence: /api/appraise

Positioning / Go-To-Market — Positioning / Go-To-Market · 4 reqs · 0 built

REQ-GTM-001 proposed P1 G1 · Parallel Positioning
Freemium/import wedge copy should align with operational pain.
Accept: Partner-facing copy names the import/start-fast wedge clearly.
Positioning / Go-To-Market · Sources: docs/CC-Analysis/freemium-ingestion-pain-analysis.md · Work: WI-022 WI-031 · Evidence: pending copy refresh
REQ-GTM-003 proposed P2 💲 PAID INFRA G3 · Parallel Positioning
Funnel analytics should follow the spine proof.
Accept: Analytics work is scheduled after Sprint 1 identity/status/QR proof.
Positioning / Go-To-Market · Sources: docs/CC-Analysis/codex-handoff-freemium-positioning.md · Work: WI-031 · Evidence: pending post-Sprint 1 planning
REQ-GTM-004 proposed P1 G4 · Parallel Positioning
Monetization/credits model must be defined before launch (Codex-owned).
Accept: Token credits and paid appraisal escalation are specified and approved by Codex.
Positioning / Go-To-Market · Sources: docs/product/pricing-and-tokens.md · docs/strategy/MONETIZATION-AND-CREDITS-STRATEGY.md · Work: WI-031 · Evidence: pending Codex monetization decision
REQ-GTM-002 accepted P1 G2 · Parallel Positioning
POS is interop-first and replacement-later.
Accept: Plan + product copy describe POS as an adoption bridge; TroveSnap reconciles around Square/EstateSail/PROSALE/Shopify rather than replacing them.
Positioning / Go-To-Market · Sources: docs/tracking/decision-log.md#d1 · docs/product/capture-to-sale-tracking.md · Work: WI-022 WI-023 WI-031 · Evidence: docs/tracking/decision-log.md

Customer Research & Beta — Research & Discovery · 6 reqs · 0 built

REQ-RESEARCH-001 proposed P1 R1 · Research & Discovery
Collect a garage-sale field corpus: consistent sample photo sets + item samples for reference and future vision training.
Accept: Sample sets uploaded with consistent capture (scene + item shots), reviewed and accepted by Paul; usable as vision reference/training seed.
Research & Discovery · Sources: Human direction 2026-06-19 · docs/CC-Analysis/trovesnap-vision-scanning-spec.md (28.10 internal corpus) · Work: WI-038 · Evidence: HITL-RESEARCH-001
REQ-RESEARCH-002 proposed P1 R2 · Research & Discovery
Collect an estate-sale field corpus: consistent sample photo sets + item samples for reference and future vision training.
Accept: Sample sets uploaded with consistent capture, reviewed and accepted by Paul; usable as vision reference/training seed.
Research & Discovery · Sources: Human direction 2026-06-19 · docs/tracking/decision-log.md#d22 · docs/product/capture-to-sale-tracking.md · Work: WI-038 · Evidence: HITL-RESEARCH-002
REQ-RESEARCH-003 proposed P0 R3 · Research & Discovery
Capture estate-seller pain-point research: conversations/interviews synthesized into themes that inform the build.
Accept: Interview notes uploaded and synthesized into a themed summary; findings feed status.json/roadmap decisions; reviewed by Paul.
Research & Discovery · Sources: Human direction 2026-06-19 · docs/product/capture-to-sale-tracking.md (Lessons From EstateSail) · Evidence: HITL-RESEARCH-003
REQ-RESEARCH-004 proposed P1 R4 · Research & Discovery
Recruit and onboard an early beta cohort of real sellers to trial enhancements, with feedback captured.
Accept: A small beta-seller cohort is onboarded; feedback is logged and reviewed; consent/privacy respected (no public PII).
Research & Discovery · Sources: Human direction 2026-06-19 · docs/tracking/decision-log.md#d22 · docs/strategy/ESTATE-SELLER-WORKFLOWS.md · Evidence: HITL-RESEARCH-004
REQ-RESEARCH-006 proposed P1 R6 · Research & Discovery
Compile a list of estate sellers / liquidators in Sacramento and surrounding areas (source + contact) for outreach and beta recruiting.
Accept: A deduped prospect list (name, area, source, contact/handle where available) is compiled and reviewed/accepted by Paul; feeds pain-point interviews (R3) and the beta cohort (R4); no scraped private data.
Research & Discovery · Sources: Human direction 2026-06-19 · docs/tracking/decision-log.md#d4 (local-density first: Sacramento-El Dorado) · Evidence: HITL-RESEARCH-005
REQ-RESEARCH-005 accepted P2 R5 · Research & Discovery
Prototype the Gmail local-sales discovery module: with seller Gmail consent, surface recent garage/estate sales from subscribed email lists, cross-reference new addresses, and nudge promotion in exchange for free tokens.
Accept: OAuth Gmail consent (tokens server-side only); parses subscribed sale emails into normalized candidate addresses with dedupe; a clean visual list cross-references new vs known addresses; promotion nudge grants tokens; assigned to a contributor and reviewed/accepted by Paul before merge.
Research & Discovery · Sources: Human direction 2026-06-19 · docs/product/source-ingestion.md (Gmail alerts) · docs/ARCHITECTURE.md (Credential handling) · docs/product/pricing-and-tokens.md (Buyer tokens) · Work: WI-037 · Evidence: WI (assigned)

Ecosystem — Positioning / Go-To-Market · 2 reqs · 0 built

REQ-ECO-001 accepted P2 G1 · Parallel Positioning
The three product areas (Trove Go buyer, TroveSnap seller, TroveSnap Harness) must keep clear boundaries and a single canonical platform.
Accept: Trove Go = discovery/gamification/alerts; TroveSnap = seller operations; Harness = ingestion/normalization inside TroveSnap; none mutate published inventory without explicit seller approval; naming is consistent.
Positioning / Go-To-Market · Sources: docs/product/ecosystem.md · docs/product/mobile-strategy.md (Naming) · Evidence: docs/product/ecosystem.md
REQ-ECO-002 deferred P2 G1 · Parallel Positioning
TroveSnap must remain an amplification layer over external channels, never requiring sellers to abandon them, with downstream products deferred.
Accept: External channels are amplified, not replaced; treasure cards (GCMD/CardForge), AtlasIQ routing, and the full gamified Trove Go are explicitly later-phase, not current scope.
Positioning / Go-To-Market · Sources: docs/product/ecosystem.md (Positioning rules) · docs/ARCHITECTURE.md (What flows out) · Evidence: docs/product/ecosystem.md