BoltToCart · roadmap
Product roadmap
Every REQ-ID in the BoltToCart spec, grouped by area, classified by whether it has code behind it yet. Generated at build time from REQUIREMENTS.md and a full scan of apps/ and packages/.
Total requirements
1524
Shipped
61841%
In progress
191%
Not started
88758%
apps/ or packages/, or explicitly verified by the roadmap audit ledger for shipped audit-only requirementsThis is a heuristic, not a proof of completeness. A REQ-ID can be cited by a TODO comment and still be unfinished; conversely, a REQ can be implemented without a citation. Project convention (see AGENTS.md) is that every change references the REQ-ID it serves, so citation density tracks implementation fairly well in practice.
Recently shipped
Latest production-cited REQ-IDs, newest commit first.
Import jobs must emit typed domain events through the outbox and product events through the telemetry wrapper per REQ-ANL-001, REQ-ANL-002, REQ-ANL-010, and REQ-JOB-506. Events must include batch-level counts and status, but must not inclu…
feat(web): add storefront theme customization (REQ-ECO-545 REQ-ADM-576) (#378)
When remaining yardage falls at or below a configurable threshold (default 1 yard), the bolt must automatically flag as a remnant and optionally reprice per the markdown rule.
feat(web): add storefront theme customization (REQ-ECO-545 REQ-ADM-576) (#378)
Each store gets a storefront on a branded subdomain and optionally a custom domain with SSL provisioned automatically (see �29). The apex bolttocart.com hosts only platform marketing / sign-up surfaces ??? storefront paths (/shop, /cart, /…
feat(web): add storefront theme customization (REQ-ECO-545 REQ-ADM-576) (#378)
Support yardage-based purchasing with minimum cut (default � yard) and increment (default � yard) configurable per product.
feat(web): add storefront theme customization (REQ-ECO-545 REQ-ADM-576) (#378)
Product detail pages must show real-time availability, remnant availability, related kits/patterns, and substitutions when out of stock.
feat(web): add storefront theme customization (REQ-ECO-545 REQ-ADM-576) (#378)
The /shop index "Browse by???" nav must list every facet-index sibling (/shop/designers, /shop/collections, /shop/colors, /shop/fibers, /shop/widths ??? see REQ-SRC-500 / REQ-SRC-501) in a single alphabetized data-driven list so new facet…
feat(web): add storefront theme customization (REQ-ECO-545 REQ-ADM-576) (#378)
The /shop PLP header gains a "New arrivals" link pointing to /shop?new=1 alongside the RSS autodiscovery link (REQ-ECO-518).
feat(web): add storefront theme customization (REQ-ECO-545 REQ-ADM-576) (#378)
Tenant storefronts must render /shop through a schema-driven theme/template engine backed by the store's persisted storefront_theme_config. The engine must support six fabric-retail templates (boutique, modern, designer, discount, workshop…
feat(web): add storefront theme customization (REQ-ECO-545 REQ-ADM-576) (#378)
In flight
Actively receiving commits but not yet cited in production code.
- In progressREQ-POS-023
The app must sync background transactions to the server as connectivity permits, with conflict resolution per �17.
- In progressREQ-DRP-004
The system must apply per-customer rate limits and bot mitigation (device/session signals plus a challenge when risk is high).
- In progressREQ-DRP-005
Drop analytics must report queue-entry rate, sell-through time, conversion, abandonment, and attribution.
- In progressREQ-SYN-001
Inventory changes from any channel (POS, web, drops, events) must propagate to other active channels within 2 seconds at p95 under normal load.
- In progressREQ-SYN-011
Offline sales of items with limited inventory (drops, last-bolt items) must be either disallowed offline or reserved via a server hold taken while online and redeemed offline.
- In progressREQ-CRM-005
Data subject requests (export and deletion) must be self-service per �26.
- In progressREQ-API-003
Webhooks for all significant events (order.created, cut.completed, drop.opened, ticket.checked_in, payout.paid), with signing, retries, and a dead-letter queue.
- In progressREQ-ANL-004
Tenant isolation applies to analytics as strictly as to data: every query against event data is scoped to a tenant or explicitly marked "platform-wide" and gated behind operator-only auth.
Up next
Open architectural decisions
§32.2 — each gates work on the REQ-IDs it references. Needs an RFC before the downstream code can move.
- DEC-003Realtime provider
Options: Ably, Pusher, Upstash + Server-Sent Events on Vercel, Soketi (self-host)
- DEC-005Search engine
Options: Typesense, Meilisearch, Algolia, Postgres FTS + pgvector only
- DEC-010CMS approach
Options: External headless CMS (Sanity/Payload/Contentful) vs. in-app page builder backed by Postgres
- DEC-011i18n / multi-currency timing
Options: v1, v1.5, v2
- DEC-012CAPTCHA provider
Options: Cloudflare Turnstile (recommended), hCaptcha, reCAPTCHA v3
- DEC-019Analytics warehouse
Options: ClickHouse Cloud or BigQuery; Snowflake as enterprise alternative
Follow-up actions
§32.3 — concrete pieces of work unlocked by the resolved decisions above.
Swap the repo scaffold from Vite + React to Next.js (App Router)
The current package.json and README.md describe a Vite app; DEC-002 commits the project to Next.js. This should be done before any non-trivial feature work starts to avoid wasted code.
Set up the monorepo
: pnpm + Turborepo with apps/web (Next.js), apps/pos (Expo), packages/core (shared domain logic per REQ-POS-026), packages/db (Drizzle schema + migrations), packages/ui (Tailwind + Radix + shadcn primitives).
Wire the Clerk ??? Neon RLS pattern
(REQ-ARC-012.1) as the first piece of infrastructure ??? every schema decision downstream depends on tenant isolation being in place.
Stand up Stripe Connect onboarding
for influencer payouts early, since KYC lead times are long.
Wire Runpod serverless endpoints
behind the background-jobs tier (REQ-ARC-017) for content pre-processing, enforcing the "never on the user-blocking path" scope boundary in REQ-ARC-028.1.
Implement the proprietary POS sync foundation (DEC-004) next
??? it is the single highest-risk engineering area and directly shapes the POS and API data model.
Long-horizon themes
§31 — prose directions the product is aimed at but which haven't yet been broken down into individual REQ-IDs.
- AI fabric recommendations (personalization based on purchase/project history).
- Demand forecasting and automated reordering into the PO workflow.
- Marketplace (cross-store shopping, platform-wide influencer campaigns).
- Advanced quilt builders (user-authored patterns, community sharing).
- International expansion (multi-currency, VAT/GST, multi-language storefronts).
By area
0 requirements
REQ-VISCore Vision0 shipped0 wip3 todo0%
- Not startedREQ-VIS-001
BoltToCart is a purpose-built SaaS platform for fabric retailers that unifies yard-based inventory, cut-counter POS, e-commerce, limited drops, events & ticketing, influencer commerce, quilt design, and guided project shopping into one rea…
- Not startedREQ-VIS-002
The platform must let stores "sell fabric the way customers actually buy it ??? by project, pattern, class, and creator ??? not just by the yard."
- Not startedREQ-VIS-003
Every channel (POS, online, drops, events) reads from and writes to a single inventory source of truth.
REQ-PERPersonas0 shipped0 wip8 todo0%
- Not startedREQ-PER-001
Store Owner ??? configures the store, plans drops and classes, reviews analytics, manages billing.
- Not startedREQ-PER-002
Manager ??? supervises staff, approves adjustments, runs cycle counts, manages purchase orders.
- Not startedREQ-PER-006
Customer ??? browses, shops, registers for events, follows drops, uses the guided project wizard.
- Not startedREQ-PER-007
Influencer / Affiliate ??? earns commission via referral links, discount codes, and attributed sessions.
- Not startedREQ-PER-008
Platform Operator (BoltToCart staff) ??? onboards stores, handles support, manages platform-wide configuration.
REQ-GLOGlossary & Domain Model1 shipped0 wip12 todo8%
- Not startedREQ-GLO-001
Yard / WOF ??? the primary cut unit. "Width of Fabric" is the usable bolt width, typically 42???44" for quilting cotton.
- Not startedREQ-GLO-002
Bolt ??? a physical roll of fabric with a unique ID, linked to a SKU, with a tracked remaining yardage.
- Not startedREQ-GLO-003
Cut ??? an action that removes yardage from a bolt and creates an order line item or adjustment record.
- Not startedREQ-GLO-004
Remnant ??? the residual length on a bolt below a configurable threshold (e.g., ??? 1 yd), typically marked down.
- ShippedREQ-GLO-005
Precut ??? a pre-packaged piece sold by unit rather than by yardage: fat quarter (~18"??22"), fat eighth (~9"??22"), charm pack (5" squares), jelly roll (2.5" strips), layer cake (10" squares), mini charm, honey bun.
10h agopackages/db/src/schema/skus.ts - Not startedREQ-GLO-006
Bundle / Kit ??? a curated grouping of fabrics and/or notions sold together, optionally tied to a pattern or class.
- Not startedREQ-GLO-008
Collection ??? a named group of fabrics released together by a designer/manufacturer.
- Not startedREQ-GLO-009
Repeat ??? the distance over which a pattern repeats, relevant to yardage calculation for large prints.
- Not startedREQ-GLO-011
Cut-to-order ??? the workflow by which online orders are fulfilled by cutting from a bolt at the store.
- Not startedREQ-GLO-012
A SKU represents an idealized product (a specific colorway + collection + unit-of-sale). A Bolt is a physical instance of a cut-by-the-yard SKU; a Precut is a physical instance of a unit-of-sale SKU.
- Not startedREQ-GLO-013
The system must preserve referential integrity from Cut ??? Bolt ??? SKU ??? Collection ??? Designer so reporting and attribution can roll up at any level.
REQ-ONBStore Onboarding34 shipped0 wip12 todo74%
- Not startedREQ-ONB-001
Offer three setup modes on first launch: Start Fresh, Import Inventory, Full Inventory Setup.
- Not startedREQ-ONB-002
Configure store profile (name, timezone, currency, tax jurisdictions, fulfillment regions, default units).
- Not startedREQ-ONB-005
Go live immediately once minimum profile and at least one payout destination are configured.
- Not startedREQ-ONB-011
Bulk Import + Progressive Accuracy ??? CSV/XLSX import of SKUs and estimated yardage; accuracy improves as bolts are scanned, cut, and reconciled.
- Not startedREQ-ONB-012
Full Inventory Scan ??? guided physical count that creates bolt records as each is scanned and measured.
- Not startedREQ-ONB-020
Inventory accuracy must improve over time via sales, adjustments, and cycle counts.
- Not startedREQ-ONB-022
The system must surface inventory confidence (e.g., "last reconciled N days ago, drift �X%") at bolt, SKU, and store level.
- ShippedREQ-ONB-040
BoltToCart must provide a guided incumbent-POS migration path for fabric retailers moving from systems such as Rain POS, covering catalog/products, inventory quantities and history, customers, sales history, loyalty/reward balances, gift c…
10h agopackages/demo-data/src/packs/0012_rain_migration_admin.ts×2apps/web/src/app/admin/migration/page.tsx - ShippedREQ-ONB-041
The migration path must support four intake modes: self-service upload of CSV/XLSX files, self-service upload of a ZIP containing multiple exports, concierge/operator upload on behalf of a tenant, and credentialed source-system API pull wh…
10h agoapps/web/src/app/admin/migration/page.tsx×3apps/jobs/src/workers/migrationImportJob.ts×2packages/demo-data/src/packs/0012_rain_migration_admin.ts - ShippedREQ-ONB-042
Rain POS must be supported as a named migration profile. The profile must include documented mappings for Rain product bulk export files, customer list exports, sales/transaction report exports, inventory history exports, and loyalty/rewar…
10h agopackages/core/src/migration/rain.ts×2apps/web/src/app/admin/migration/_lib/templateReport.tsapps/web/src/app/admin/migration/page.tsx+1 more - ShippedREQ-ONB-043
Every migration run must create an import batch with: tenantId, source system, source account/store identifier when available, source export timestamp, uploaded file manifest, file checksums, requested-by actor, run mode (dry_run, trial, f…
10h agoapps/jobs/src/workers/migrationImportJob.ts×2apps/web/src/app/admin/migration/page.tsx×2packages/db/src/migrations/0035_import_foundation.sql+2 more - ShippedREQ-ONB-044
Imports must be idempotent and re-runnable. Re-uploading the same source file or re-running an API extraction must not create duplicate SKUs, bolts, customers, orders, loyalty ledger entries, gift cards, or store-credit balances. Source id…
10h agoapps/jobs/src/workers/migrationImportJob.ts×2apps/web/src/app/admin/migration/page.tsx×2packages/db/src/migrations/0035_import_foundation.sql+1 more - ShippedREQ-ONB-045
Before mutating production tenant data, the migration workflow must run a preflight analyzer that reports row counts, unmapped columns, duplicate SKUs, duplicate customers, malformed emails/phones, invalid prices, unsupported tax/tender/st…
10h agoapps/jobs/src/workers/migrationImportJob.ts×2apps/web/src/app/admin/migration/page.tsx×2packages/db/src/migrations/0035_import_foundation.sql+2 more - ShippedREQ-ONB-046
The preflight analyzer must classify findings as blocking, warning, or informational. Blocking findings prevent final import; warnings may be explicitly accepted by an authorized manager; informational findings remain visible in the import…
10h agoapps/web/src/app/admin/migration/page.tsx×3apps/jobs/src/workers/migrationImportJob.ts×2packages/db/src/migrations/0035_import_foundation.sql+2 more - ShippedREQ-ONB-047
The importer must provide a field-mapping UI for unknown or tenant-specific columns, including reusable mapping presets by source system and tenant. Mappings must be versioned with the import batch so a future rerun uses the same interpret…
10h agoapps/jobs/src/workers/migrationImportJob.ts×2apps/web/src/app/admin/migration/page.tsx×2apps/web/src/app/admin/migration/_lib/templateReport.test.ts+1 more - ShippedREQ-ONB-048
The migration workflow must support a trial import into a sandbox/demo tenant, allowing the merchant and BoltToCart operator to inspect catalog, customers, rewards, sales reports, and inventory confidence before approving a production impo…
10h agoapps/jobs/src/workers/migrationImportJob.ts×2apps/web/src/app/admin/migration/page.tsx×2 - ShippedREQ-ONB-049
The final production cutover must support a delta import window. After the merchant performs a final incumbent-system export, BoltToCart must import only new or changed source records since the trial baseline where source identifiers or ti…
10h agoapps/jobs/src/workers/migrationImportJob.ts×2apps/web/src/app/admin/migration/page.tsx×2 - ShippedREQ-ONB-050
Product imports must map source product records into BoltToCart SKUs and product types per REQ-CAT-001 through REQ-CAT-011, including SKU code, barcode/UPC, name, description, vendor/supplier, designer, collection, department/category, col…
10h agopackages/core/src/migration/rain.ts×14 - ShippedREQ-ONB-051
Product import must never use floating-point math for money or yardage. Prices and costs are converted to integer minor units; yardage is converted to fixed-point 1/16-yard units per REQ-INV-001, with original source values retained for au…
10h agopackages/core/src/migration/rain.ts×8 - ShippedREQ-ONB-052
When a source system provides only SKU-level on-hand quantity instead of physical bolt-level inventory, BoltToCart must create legacy opening-stock bolt records or equivalent receiving records with lower inventory-confidence metadata. Thes…
10h agopackages/core/src/migration/rain.ts×4 - ShippedREQ-ONB-053
Inventory history imports must map source adjustments, receiving events, shrinkage, transfers, and manual corrections into auditable inventory events where source detail supports it. If historical detail is insufficient to reconstruct exac…
10h agopackages/core/src/migration/rain.ts×4 - ShippedREQ-ONB-054
After product/inventory import, BoltToCart must generate a migration label run for newly created or legacy bolt records, including printable bolt labels per REQ-INV-050 and a reconciliation worksheet grouped by location/category for store-…
10h agopackages/core/src/migration/rain.ts×9packages/core/src/migration/rain.test.ts×4apps/web/src/app/admin/migration/page.tsx - ShippedREQ-ONB-055
Customer imports must create unified customer profiles per REQ-CRM-001, keyed by email and/or phone where present, with merge-review tooling for duplicate or near-duplicate records. The importer must preserve source customer IDs and must n…
10h agopackages/core/src/migration/rain.ts×4 - ShippedREQ-ONB-056
Customer imports must support source fields commonly needed for quilt/fabric retail: name, email, phone, mailing address, marketing opt-in state, tax-exempt flag, customer group, notes, birthday/month where legally usable, created date, la…
10h agopackages/core/src/migration/rain.ts×8 - ShippedREQ-ONB-057
Sales-history imports must create legacy orders and order line items where source transaction detail is available, preserving source transaction ID, receipt/order number, channel/register, cashier/staff identifier where available, timestam…
10h agopackages/core/src/migration/rain.ts×11 - ShippedREQ-ONB-058
If line-level sales history is unavailable or incomplete, BoltToCart must support importing customer-level purchase summaries and monthly store totals so CRM segmentation, retention cohorts, and onboarding reconciliation can still function…
10h agopackages/core/src/migration/rain.ts×9 - ShippedREQ-ONB-059
Imported historical orders must be marked as legacy/imported and must not trigger fulfillment, inventory deduction, loyalty accrual, gift-card issuance, email receipts, webhooks, or customer notifications unless the import mode explicitly…
10h agopackages/core/src/migration/rain.ts×4 - ShippedREQ-ONB-060
Loyalty/reward migration must import the current customer balance as an opening-balance ledger entry per REQ-CRM-003, not as a recalculated earn stream by default. Recalculation from historical transactions may be offered only as a separat…
10h agopackages/core/src/migration/rain.ts×4 - ShippedREQ-ONB-061
Loyalty imports must support mapping source reward programs into BoltToCart earn/redemption settings, tiers, customer balance, lifetime points/spend where available, pending rewards, expiration dates where legally applicable, and manual ad…
10h agopackages/core/src/migration/rain.ts×6 - ShippedREQ-ONB-062
Gift card and store-credit imports must require explicit merchant attestation or reconciliation approval before activation. Imported balances must preserve source identifiers, original balance, remaining balance, issue date where available…
10h agopackages/core/src/migration/rain.ts×6packages/core/src/migration/rain.test.ts - ShippedREQ-ONB-063
No stored payment-card data, PAN, CVV, magstripe/chip data, or raw payment tokens may be imported from an incumbent POS. Customers must re-enter payment methods through Stripe-hosted or otherwise PCI-compliant flows per REQ-SEC-010.
10h agopackages/core/src/migration/rain.ts×10apps/web/src/app/admin/migration/_lib/checklistReport.test.tsapps/web/src/app/admin/migration/_lib/checklistReport.ts+3 more - ShippedREQ-ONB-064
The migration workflow must provide reconciliation reports comparing source exports to imported BoltToCart data by entity and period: SKU count, active/inactive product count, on-hand quantity, inventory value, customer count, loyalty bala…
10h agoapps/web/src/app/admin/migration/page.tsx×2packages/db/src/migrations/0035_import_foundation.sqlpackages/demo-data/src/packs/0012_rain_migration_admin.ts+1 more - ShippedREQ-ONB-065
Reconciliation reports must be exportable as CSV and retained with the import batch. The merchant must explicitly approve final reconciliation before production cutover is marked complete.
10h agoapps/web/src/app/admin/migration/page.tsx×2packages/db/src/migrations/0035_import_foundation.sqlpackages/demo-data/src/packs/0012_rain_migration_admin.ts+1 more - ShippedREQ-ONB-066
All imported PII must follow REQ-ANL-003, REQ-SEC-021, and REQ-CRM-005: no unnecessary PII in analytics events, retention policies apply by data class, and customer export/deletion requests must include imported source data and source-refe…
10h agoapps/web/src/app/admin/migration/page.tsx×2 - ShippedREQ-ONB-067
Import jobs must emit typed domain events through the outbox and product events through the telemetry wrapper per REQ-ANL-001, REQ-ANL-002, REQ-ANL-010, and REQ-JOB-506. Events must include batch-level counts and status, but must not inclu…
2m agopackages/events/src/domain/migrationImports.ts×10apps/jobs/src/workers/migrationImportJob.ts×2apps/web/src/app/admin/migration/page.tsx×2+2 more - ShippedREQ-ONB-068
The store-owner dashboard must include a migration status tile during onboarding and for at least 30 days after cutover, showing current phase, last batch status, unresolved blocking findings, reconciliation approval state, inventory-confi…
10h agoapps/web/src/app/admin/migration/page.tsx×2packages/demo-data/src/packs/0012_rain_migration_admin.ts×2 - ShippedREQ-ONB-069
Platform operators must have an operator-only migration console for monitoring tenant migration batches, retrying failed jobs, downloading sanitized error reports, and recording concierge notes. The console must not allow cross-tenant data…
10h agoapps/web/src/app/admin/migration/page.tsx×2 - ShippedREQ-ONB-070
The migration system must provide a rollback preview before production finalization, listing which imported entities could be deleted, disabled, or left as historical records. Rollback behavior must preserve audit history and must never si…
10h agoapps/web/src/app/admin/migration/page.tsx×2packages/db/src/migrations/0035_import_foundation.sqlpackages/demo-data/src/packs/0012_rain_migration_admin.ts+1 more - ShippedREQ-ONB-071
The migration checklist for Rain POS must be visible to merchants and operators and must list the expected source exports, recommended date ranges, export timing for trial and final cutover, known limitations, and the exact BoltToCart dest…
10h agoapps/web/src/app/admin/migration/page.tsx×2packages/demo-data/src/packs/0012_rain_migration_admin.ts×2apps/web/src/app/admin/migration/_lib/checklistReport.test.ts+1 more - apps/pos/src/hw/types.ts
- ShippedREQ-ONB-031
Recommended: Bluetooth barcode scanner, thermal label printer, cash drawer.
10h agoapps/pos/src/hw/types.ts
REQ-CATCatalog & Product Data6 shipped0 wip3 todo67%
- ShippedREQ-CAT-001
Every fabric SKU must capture: name, SKU code, designer, collection, colorway, fiber content (composition %), width (inches), weight (GSM or oz/yd�), pattern type (solid, print, batik, etc.), print scale, repeat (inches), care instructions…
10h agopackages/db/src/migrations/0010_sku_catalog.sql×2packages/db/src/schema/skus.ts×2packages/demo-data/src/packs/0006_storefront_catalog.ts×2+6 more - ShippedREQ-CAT-002
Every SKU must capture one or more dominant colors (hex values) and color tags (e.g., "sage", "navy") for faceted and color search.
10h agopackages/testing/src/catalog.test.ts×2packages/db/src/migrations/0010_sku_catalog.sqlpackages/db/src/schema/skus.ts+1 more - ShippedREQ-CAT-003
Every SKU must support multiple images with roles: hero, swatch, bolt-end, lifestyle, repeat preview.
10h agopackages/db/src/migrations/0017_sku_images.sql×5packages/demo-data/src/packs/0011_storefront_images.ts×4apps/web/src/app/(storefront)/cart/page.tsx×2+11 more - ShippedREQ-CAT-004
Every SKU must declare its unit of sale: by_yard, by_precut, by_unit, or by_kit.
10h agopackages/db/src/migrations/0010_sku_catalog.sql×4packages/db/src/schema/skus.ts×2packages/testing/src/catalog.test.ts×2+1 more - Not startedREQ-CAT-005
Variants are permitted for differences in colorway, size (for precuts), or packaging.
- Not startedREQ-CAT-010
The catalog must support notions (thread, batting, needles, tools), patterns (physical + digital), books, and gift cards with appropriate attribute schemas.
- Not startedREQ-CAT-011
Digital goods (pattern PDFs) must support license-bound downloads with per-order expiry and rate-limited access.
- ShippedREQ-CAT-020
Images must be processed through a media pipeline that generates standard derivatives (thumbnail, card, swatch, zoom) and extracts dominant colors on upload (see �27).
10h agopackages/demo-data/src/packs/0011_storefront_images.ts×2apps/web/src/components/ProductImage.tsxpackages/db/src/migrations/0017_sku_images.sql+2 more - packages/testing/src/skuImages.test.ts×4packages/db/src/migrations/0017_sku_images.sql×3packages/demo-data/src/packs/0011_storefront_images.ts×3+5 more
REQ-INVInventory Management8 shipped0 wip10 todo44%
- ShippedREQ-INV-001
Yardage must be tracked as fractional values with minimum granularity of ??? yard (0.125) and stored with sufficient precision to avoid cumulative rounding error (recommended: store in millimeters or fixed-point 1/16 yard).
10h agopackages/events/src/domain/pos.ts×4packages/db/src/schema/cycleCounts.ts×3apps/pos/src/cart/cartTotals.ts×2+30 more - ShippedREQ-INV-002
Each physical bolt has a unique ID, associated SKU, initial yardage, current remaining yardage, location (store + shelf), and status (receiving, on_shelf, cut_in_progress, remnant, sold_out, damaged, transferred).
10h agopackages/db/src/migrations/0005_bolt_status.sql×3apps/web/src/lib/roadmap.test.ts×2packages/core/src/bolts/status.ts×2+14 more - ShippedREQ-INV-003
The system must enforce non-negative remaining yardage and prevent concurrent over-cutting via row-level locking or equivalent serialization.
10h agoapps/web/src/lib/roadmap.test.tspackages/db/src/migrations/0004_cuts.sqlpackages/db/src/migrations/0005_bolt_status.sql+6 more - Not startedREQ-INV-004
Adjustments, shrinkage, transfers between locations, and damage events must all be auditable with actor, reason, quantity delta, and timestamp.
- ShippedREQ-INV-010
When remaining yardage falls at or below a configurable threshold (default 1 yard), the bolt must automatically flag as a remnant and optionally reprice per the markdown rule.
2m agopackages/db/src/migrations/0005_bolt_status.sql×3packages/testing/src/bolt-status.test.ts×3packages/db/src/repositories/bolts.ts×2+7 more - ShippedREQ-INV-011
A bolt may be split (e.g., to create precuts from the bolt-end) or two identical-SKU bolts merged administratively. Both operations must preserve audit history.
10h agopackages/db/src/repositories/bolts.ts×3apps/web/src/app/admin/bolts/[boltId]/actions.ts×2packages/db/src/migrations/0009_bolt_lineage.sql×2+6 more - ShippedREQ-INV-020
Supplier records must capture contact info, lead times, payment terms, minimum order quantity, and preferred shipping methods.
10h agopackages/demo-data/src/packs/0004_admin_damaged_bolt.ts×2packages/db/src/migrations/0003_receiving.sqlpackages/db/src/schema/purchaseOrders.ts+4 more - Not startedREQ-INV-021
Purchase orders (POs) must support draft, submitted, partially received, received, and closed states, with line items mapped to SKUs and expected quantities.
- Not startedREQ-INV-022
The receiving workflow is the primary entry point for creating bolts: scan PO ??? confirm SKU ??? enter actual yardage ??? generate bolt ID and printable label.
- Not startedREQ-INV-023
Landed cost (unit cost + freight + duty allocation) must be captured per receiving line to drive margin reporting.
- Not startedREQ-INV-024
Advance Ship Notices (ASNs) should be importable where suppliers support them.
- Not startedREQ-INV-030
The system must support partial and full cycle counts with variance reporting and bulk adjustment approval.
- Not startedREQ-INV-031
Discrepancies must produce audit records and feed into the inventory-confidence score per �4.3.
- Not startedREQ-INV-040
When fulfilling a cut-to-order line with multiple candidate bolts, the system must choose the bolt according to a configurable rule. Default: largest-remnant-first (cut from the smallest bolt that satisfies the order) to consolidate invent…
- Not startedREQ-INV-041
Alternative rules must include FIFO (oldest first), LIFO, and manual selection.
- ShippedREQ-INV-042
If no single bolt can satisfy the request, the system must either split the order across bolts (with customer opt-in for quilting-grade continuity) or decline and suggest substitutes.
10h agopackages/core/src/bolts/selection.ts×2 - ShippedREQ-INV-050
Each bolt label must carry a scannable 1D or 2D barcode encoding the bolt ID, plus a human-readable SKU, designer, collection, width, and initial yardage.
10h agoapps/pos/src/scan/parser.ts×2apps/pos/src/hw/nfcReader.tsapps/pos/src/hw/nfcWriter.ts - Not startedREQ-INV-051
Labels must be reprintable on demand and support at least two standard thermal label sizes.
REQ-PRIPricing & Promotions4 shipped0 wip46 todo8%
- Not startedREQ-PRI-001
Support per-yard pricing, per-unit pricing (precuts, notions), and per-kit pricing.
- ShippedREQ-PRI-002
Support volume breaks (e.g., 10% off at ??? 5 yards), customer-group pricing (retail, trade/wholesale, guild), and tax-exempt customer flags.
10h agoapps/web/src/lib/storefront.tspackages/db/src/repositories/skus.ts - Not startedREQ-PRI-003
Support markdowns, automatic remnant discounts, BOGO, percentage/fixed coupons, free-shipping promotions, and stackable/exclusive rules with a deterministic resolution order. Detailed mechanics for coupons and promotions are specified in �…
- Not startedREQ-PRI-004
Support gift cards and store credit with balance tracking, expiry policies per jurisdiction, and redemption across all channels. Gift cards are a stored-value instrument, not a coupon, and are governed by separate tender rules (see �8.1) a…
- Not startedREQ-PRI-005
Every price applied to a cart must be traceable to the rule(s) that produced it for audit and dispute resolution. The trace must enumerate each applied discount, its couponId/promotionId, eligibility match reason, stacking decision, and pe…
- Not startedREQ-PRI-011
Distinguish automatic promotions (no code required; applied whenever eligibility matches) from coupons (require a code or a customer-attached entitlement). Both share the same eligibility, stacking, and reporting model.
- Not startedREQ-PRI-012
Support pricing lists that override base price for a customer group, location, or channel; pricing-list prices are applied before any promotion and count as the "original price" for subsequent discount math.
- Not startedREQ-PRI-020
Support the following coupon code archetypes, each with the same underlying discount mechanic (�7.2) but different issuance and redemption semantics:
- Not startedREQ-PRI-022
Bulk operations ??? campaigns must support bulk create, bulk pause, bulk revoke, and bulk extend with a dry-run preview of affected codes and an undo window (5 minutes) before changes are committed to the redemption ledger.
- ShippedREQ-PRI-023
Support scannable coupon artifacts ??? QR and 1D barcodes encoding the code plus an HMAC so scanned codes at POS can be validated offline against a cached active-campaign set (see �7.7).
10h agoapps/pos/src/flow/discountScanHandler.ts×2apps/pos/src/scan/parser.ts×2apps/pos/src/flow/couponFlow.ts - Not startedREQ-PRI-030
Every coupon/promotion must support the following eligibility dimensions, combinable with AND/OR logic:
- Not startedREQ-PRI-031
Support exclusions with clear precedence over inclusions: clearance/sale flag, gift cards, specific SKUs or collections, already-discounted lines, shipping, tax, specific channels (e.g., exclude from drops). Exclusions must be evaluated be…
- Not startedREQ-PRI-033
Eligibility evaluation must be deterministic and side-effect-free: the same cart + coupon + context always yields the same decision and the same rationale string, which is persisted on the order for audit.
- Not startedREQ-PRI-040
Every coupon and automatic promotion carries a stackability flag: exclusive (default), stackable-with-auto, stackable-with-any. Two exclusive instruments cannot apply to the same order.
- Not startedREQ-PRI-042
Support a maximum discount cap per order, per line, and per campaign (absolute or percentage) to prevent runaway stacking.
- Not startedREQ-PRI-043
Every resolution decision ??? including rejected codes and the reason for rejection ??? must be written to the order's pricing trace per REQ-PRI-005 and to the coupon redemption ledger per REQ-PRI-055.
- ShippedREQ-PRI-050
Coupon validation must happen at three points: on code entry in the cart, on checkout submission, and on payment authorization. The canonical decision is the checkout-time evaluation; cart-time previews are advisory and must be re-checked…
10h agoapps/web/src/app/(storefront)/cart/actions.ts×2apps/web/src/app/(storefront)/cart/couponCookie.tsapps/web/src/components/CartCouponSection.tsx - Not startedREQ-PRI-051
Code application must be idempotent: submitting the same code twice in the same cart session is a no-op, not an error. Reapplying after removal is permitted subject to usage limits.
- Not startedREQ-PRI-052
Validation responses must not leak information that aids enumeration: a single opaque invalid_or_ineligible response for unknown, expired, exhausted, paused, and not-yet-active codes. Internally, the specific reason is logged with the stan…
- Not startedREQ-PRI-053
Use constant-time string comparison for code matching to eliminate timing oracles.
- Not startedREQ-PRI-055
Redemption ledger ??? every successful redemption creates an immutable record of: couponId, campaignId, orderId, customerId, channel, storeId/deviceId if POS, discount mechanic, amount applied, per-line allocation, attributed influencer if…
- Not startedREQ-PRI-056
Reversal on refund/return ??? partial and full refunds must reverse the proportional discount per REQ-PRI-080 and decrement the redemption count only if the return fully voids the order and the campaign's policy permits (default: yes). Rev…
- Not startedREQ-PRI-057
Self-referral / self-redemption guards ??? a customer cannot redeem their own referral or influencer code on their primary account; flagged attempts are rejected with the generic response and logged for review.
- Not startedREQ-PRI-058
Kill switch ??? a campaign can be paused or revoked by an authorized operator in under 30 seconds via the admin UI without a deploy; in-flight redemptions committed before the pause timestamp remain valid, and a reason code is required and…
- Not startedREQ-PRI-060
Web storefront ??? code entry at the cart and checkout; auto-apply via signed URL parameter with a short TTL; customer-attached entitlements appear as one-tap apply on the cart for authenticated customers.
- ShippedREQ-PRI-061
POS ??? the POS must support (a) manual keypad code entry, (b) barcode/QR scan of a coupon artifact (REQ-PRI-023), and (c) selecting a customer-attached entitlement from the looked-up customer profile. Manager PIN (REQ-POS-031) is required…
10h agoapps/pos/src/components/CouponStatus.test.tsapps/pos/src/components/CouponStatus.tsapps/pos/src/components/DiscountScanStatus.ts+1 more - Not startedREQ-PRI-062
Offline POS ??? only codes from the cached active-campaign set (shared public codes with no per-customer limits and no cross-channel cap) may be honored offline. Single-use unique codes, influencer codes, first-time-customer codes, and any…
- Not startedREQ-PRI-063
Drops ??? by default, drops are coupon-excluded (REQ-PRI-031). A drop may opt in to accept specific campaigns, but codes MUST NOT influence queue position, waitlist order, or inventory holds (REQ-DRP-002/REQ-DRP-003).
- Not startedREQ-PRI-064
Events & ticketing ??? promo codes apply to tickets per REQ-EVT-013; bundled kits attached to a ticket follow the kit's eligibility, not the ticket's.
- Not startedREQ-PRI-065
Guided project wizard ??? codes may be applied at the review step; the wizard must show the pre- and post-discount totals and make the applied code removable.
- Not startedREQ-PRI-070
Every coupon has a lifecycle state: draft ??? scheduled ??? active ??? (paused ??? active) ??? exhausted | expired | revoked ??? archived. State transitions are recorded with actor, timestamp, and reason.
- Not startedREQ-PRI-071
Automatic transitions ??? scheduled ??? active at startAt, active ??? expired at endAt, active ??? exhausted on cap reached. Transitions are driven by background jobs (�29 "Background jobs") with guaranteed-once emission of the correspondi…
- Not startedREQ-PRI-072
Manual admin actions ??? pause, resume, revoke (terminal), clone (new draft pre-filled), extend (moves endAt), adjust cap (only upward without a re-approval workflow).
- Not startedREQ-PRI-073
Approvals ??? configurable approval workflow for high-impact campaigns (discount > N%, cap > M redemptions, site-wide scope); required approvers, dual-control for irreversible revokes.
- Not startedREQ-PRI-074
Retention & archival ??? archived campaigns remain queryable for reporting and dispute resolution per the data retention policy in �25.3; the redemption ledger is retained for the full financial-records retention period regardless of campa…
- Not startedREQ-PRI-080
Per-line allocation ??? order-level and cart-level discounts must be pro-rated across eligible lines by that line's eligible base price, using banker's rounding with residuals distributed to the highest-priced line. Per-line allocation is…
- Not startedREQ-PRI-081
Tax treatment ??? support both pre-tax (default, US) and post-tax (some international regimes) discount application, selected per jurisdiction by the tax engine (REQ-ARC-026). Free-shipping discounts interact with shipping tax per the dest…
- Not startedREQ-PRI-082
Refunds ??? when a line is refunded, the proportional discount allocated to that line is reversed and tax is recomputed on the reduced taxable base per REQ-FUL-006. Reversals never produce negative discount totals.
- Not startedREQ-PRI-083
Merchant cost-of-promotion ledger ??? every redemption records GMV foregone (list price ??? sold price), margin impact (using landed cost from REQ-INV-023), and attribution to campaign and, if applicable, influencer. This feeds the coupon…
- Not startedREQ-PRI-090
Coupon performance report (per-tenant, scoped per �22) must surface: redemptions, redemption rate, GMV lifted, revenue after discount, average discount per order, new-customer share, top SKUs redeemed against, and ROI vs. cost-of-promotion…
- Not startedREQ-PRI-091
Funnel events per REQ-ANL-011 ??? code-entered, code-rejected (with opaque reason class), code-applied, checkout-completed-with-code. These feed the product-analytics sink, not the domain warehouse.
- Not startedREQ-PRI-092
Influencer reports consume the same redemption ledger and are specified in REQ-RPT-004.
- Not startedREQ-PRI-100
Emit typed domain events conforming to �26.1: coupon.created, coupon.activated, coupon.paused, coupon.revoked, coupon.redeemed, coupon.redemption_reversed, coupon.exhausted, coupon.expired. Payloads are declared in packages/events per REQ-…
- Not startedREQ-PRI-101
Influencer-attributed codes share the coupon machinery; attribution and payout are governed by �14, and commission is settled through the commission ledger (REQ-INF-030) rather than by double-discounting the order.
- Not startedREQ-PRI-102
Event-ticket promo codes are governed by �12.2 (REQ-EVT-013) and use the same engine described here.
REQ-POSPoint of Sale142 shipped6 wip97 todo58%
- apps/pos/src/runtime/registerWorkbench.test.ts×2apps/pos/src/flow/criticalPath.tsapps/pos/src/flow/types.ts+3 more
- ShippedREQ-POS-002
Must support fractional yardage entry (�6.1) with both decimal and fractional keypads (e.g., 2 ???).
10h agoapps/pos/src/components/YardageKeypad.tsxapps/pos/src/flow/criticalPath.tsapps/pos/src/flow/types.ts+1 more - ShippedREQ-POS-003
Must support fast text and visual search across SKUs, collections, and designers, with keyboard and barcode input.
10h agoapps/pos/src/index.ts×2apps/pos/src/components/SkuSearchResults.test.tsapps/pos/src/components/SkuSearchResults.ts+1 more - apps/pos/src/components/HeldCartList.test.tsapps/pos/src/components/HeldCartList.tsapps/pos/src/flow/heldCarts.test.ts+3 more
- ShippedREQ-POS-005
Must support split tender (card + cash + store credit + gift card) and partial refunds.
10h agoapps/jobs/src/workers/giftCardIssuanceJob.tsapps/pos/src/components/GiftCardTenderStatus.tsapps/pos/src/components/RefundLineSelector.test.ts+8 more - apps/pos/src/components/ReceiptDeliveryOptions.test.tsapps/pos/src/components/ReceiptDeliveryOptions.tsapps/pos/src/index.ts
- ShippedREQ-POS-007
End-of-day reconciliation must produce a cash-drawer report and a shift summary.
10h agoapps/jobs/src/workers/shiftSummaryJob.tsapps/pos/src/receipt/shiftSummaryLines.test.tsapps/pos/src/receipt/shiftSummaryLines.ts - ShippedREQ-POS-020
A dedicated iPad POS application is required ??? browser-only is insufficient. Chosen platform: React Native + Expo with Expo Modules for native integrations and EAS Build for distribution. Rationale: single TypeScript stack shared with th…
10h agoapps/web/src/app/api/pos/runtime/route.ts×2packages/api-contracts/src/posSaleSync.test.ts×2apps/pos/src/index.ts+2 more - Not startedREQ-POS-021
The app must achieve sub-second response for the critical path: scan ??? add line ??? total ??? tender ??? receipt.
- ShippedREQ-POS-022
The app must operate fully offline for at least 8 continuous hours of normal register activity, with local transaction durability across app restarts and device reboots.
10h agoapps/pos/src/flow/heldCarts.ts×3apps/pos/src/runtime/registerWorkbench.test.ts - In progressREQ-POS-023
The app must sync background transactions to the server as connectivity permits, with conflict resolution per �17.
apps/pos/src/runtime/registerWorkbench.test.ts - ShippedREQ-POS-024
The app must integrate with Bluetooth barcode scanners (HID mode), ESC/POS thermal receipt printers, and electronic cash drawers (RJ-11 kick via receipt printer).
10h agopackages/events/src/domain/pos.ts×4apps/pos/src/components/NoSaleDrawerStatus.test.tsapps/pos/src/components/NoSaleDrawerStatus.ts+6 more - ShippedREQ-POS-025
The app must support tap-to-pay card acceptance via a certified payments SDK (Stripe Terminal, including Tap to Pay on iPhone/iPad), with PIN and signature flows where required.
10h agoapps/pos/src/hw/types.tspackages/events/src/domain/pos.ts - Not startedREQ-POS-026
A shared core library (pricing, validation, tax calc preview, API client, typed domain models) must be published as a package consumable by both the Next.js web app and the Expo POS app to prevent rule drift between channels.
- ShippedREQ-POS-572
POS label-printer status projection (apps/pos/src/components/LabelPrinterStatus.ts). Pure UI-runtime-free helper for the existing LabelPrintResult and bolt-label print context that maps ready, not-ready, printing, printed, and failed label…
10h agoapps/pos/src/components/LabelPrinterStatus.test.tsapps/pos/src/components/LabelPrinterStatus.ts - ShippedREQ-POS-700
The overnight POS register path must be guarded by the pos.register-session feature flag and must expose a disabled state that blocks sale completion without mutating the cart, tender state, hardware, or sync queue.
10h agoapps/pos/src/flow/registerSession.test.ts×4apps/pos/src/flow/registerSession.ts×4apps/pos/src/components/RegisterSessionStatus.test.ts×3+2 more - ShippedREQ-POS-701
The register path must derive its cashier-facing phase from the existing critical-path reducer and tender reducer: ready to scan, enter yardage, review cart, take payment, finalize sale, or blocked.
10h agoapps/pos/src/flow/registerSession.ts×2apps/pos/src/flow/registerSession.test.ts - ShippedREQ-POS-702
The register path must surface deterministic blockers before finalization, including empty cart, non-complete tender, disabled feature flag, and offline queue failure, without relying on native UI alerts.
10h agoapps/pos/src/flow/registerSession.ts×6apps/pos/src/flow/registerSession.test.ts - ShippedREQ-POS-703
Sale completion must enqueue a restart-durable offline mutation before printing a receipt or opening the cash drawer, so a completed tender is never lost because of hardware failure.
10h agoapps/pos/src/flow/registerSession.ts×3apps/pos/src/flow/registerSession.test.ts×2 - ShippedREQ-POS-704
Queued POS sale mutations must be JSON-serializable without bigint loss by storing minor-unit money and yardage sixteenths as base-10 strings.
10h agoapps/pos/src/flow/registerSession.ts×2apps/pos/src/flow/registerSession.test.ts - ShippedREQ-POS-705
Each queued sale mutation must carry an idempotency key scoped by tenant, device, sale id, and occurrence timestamp so reconnect sync can safely retry.
10h agoapps/pos/src/flow/registerSession.ts×2apps/pos/src/flow/registerSession.test.tsapps/pos/src/flow/saleSync.test.ts - ShippedREQ-POS-706
The queued sale mutation must include only the minimum non-PII register payload: tenant id, device id, optional cashier user id, cart line snapshots, totals, tender method, tender amounts, receipt intent, and source requirement ids.
10h agoapps/pos/src/flow/registerSession.ts×2apps/pos/src/flow/registerSession.test.ts - ShippedREQ-POS-707
Receipt printing must use the POS hardware adapter only, must produce a deterministic ESC/POS-ready print request, and must not block sale durability once the queue write succeeds.
10h agoapps/pos/src/flow/registerSession.test.ts×2apps/pos/src/flow/registerSession.ts×2 - ShippedREQ-POS-708
Cash-drawer opens after cash tender must use the sale-open reason with the queued sale id; card and store-credit tenders must not open the drawer.
10h agoapps/pos/src/flow/registerSession.ts×2apps/pos/src/flow/registerSession.test.ts - ShippedREQ-POS-709
Hardware failures during receipt print or cash-drawer open must return a cashier-safe warning while preserving the queued sale mutation for sync.
10h agoapps/pos/src/flow/registerSession.ts×2apps/pos/src/flow/registerSession.test.ts - ShippedREQ-POS-710
The register path must emit typed span-intent metadata for pos.tender and pos.receipt so the Expo runtime can bridge it to the telemetry wrapper without importing vendor SDKs.
10h agoapps/pos/src/flow/registerSession.ts×2apps/pos/src/flow/registerSession.test.ts - ShippedREQ-POS-711
The register readiness model must include sync queue status, pending mutation count, connectivity state, and a cashier-safe sync label for offline operation.
10h agoapps/pos/src/flow/registerSession.ts×2apps/pos/src/flow/registerSession.test.ts - ShippedREQ-POS-712
The register readiness model must include hardware status for scanner, receipt printer, cash drawer, and payment terminal without assuming any specific vendor model is present.
10h agoapps/pos/src/flow/registerSession.ts×2apps/pos/src/flow/registerSession.test.ts - ShippedREQ-POS-713
The register path must expose a compact dashboard-tile model showing register phase, pending offline sales, and blocking status for REQ-ANL-042.
10h agoapps/pos/src/flow/registerSession.ts×6apps/pos/src/flow/registerSession.test.ts×2 - ShippedREQ-POS-714
The POS package root must export the register-session contract so future Expo screens consume a stable public API instead of private flow files.
10h agoapps/pos/src/flow/registerSession.ts×3apps/pos/src/flow/registerSession.test.ts×2apps/pos/src/components/RegisterSessionStatus.test.ts+2 more - ShippedREQ-POS-715
Completed POS sales must sync through an authenticated server API that validates a JSON-safe sale payload, derives tenant identity from the Clerk organization, uses the POS sale UUID as the idempotent order id, and returns accepted or dupl…
10h agopackages/api-contracts/src/posSaleSync.test.ts×3apps/pos/src/runtime/apiClient.test.ts×2apps/web/src/app/api/pos/runtime/route.ts×2+9 more - ShippedREQ-POS-716
POS sale sync must apply inventory authoritatively on the server by requiring a physical boltId for every fabric line, validating the bolt/SKU relationship under RLS, and decrementing remaining yardage through the atomic cut primitive in t…
10h agoapps/pos/src/flow/saleSync.test.tsapps/pos/src/runtime/registerWorkbench.test.tsapps/web/src/app/api/pos/sales/sync/route.ts+4 more - ShippedREQ-POS-717
The Expo POS web workbench must expose an offline sync-recovery panel that classifies queued, syncing, and failed sale mutations, shows pending value, age, retry state, and cashier-safe recovery guidance, and enables flush/retry actions on…
10h agoapps/pos/src/components/SyncRecoveryStatus.test.tsapps/pos/src/components/SyncRecoveryStatus.ts - ShippedREQ-POS-718
The Expo POS web workbench must expose a unified sales journal that combines durable queued sales and synced receipt previews into one audit surface with tender labels, total labels, receipt/refund affordance state, and failed-sale review…
10h agoapps/pos/src/components/SalesJournalStatus.test.tsapps/pos/src/components/SalesJournalStatus.ts - ShippedREQ-POS-719
The Expo POS web workbench must expose an inventory exception panel derived from local bolt reservations and queued sales, flagging low remaining yardage, unknown bolts, and over-reserved bolts before tender so cashiers do not unknowingly…
10h agoapps/pos/src/components/InventoryExceptionStatus.test.tsapps/pos/src/components/InventoryExceptionStatus.ts - ShippedREQ-POS-720
The Expo POS web workbench must expose a tender closeout audit panel that summarizes current staged tender legs, shift expected cash, and closeout variance without using floating-point money math.
10h agoapps/pos/src/components/TenderCloseoutAuditStatus.test.tsapps/pos/src/components/TenderCloseoutAuditStatus.ts - ShippedREQ-POS-721
The Expo POS web workbench must expose a staff handoff summary that combines register readiness, offline queue state, held carts, receipts, and completed refunds into a concise transfer checklist for the next cashier.
10h agoapps/pos/src/components/StaffHandoffStatus.test.tsapps/pos/src/components/StaffHandoffStatus.ts - ShippedREQ-POS-722
The Expo POS web workbench must expose a register command center that combines cart state, tender readiness, release readiness, offline queue state, and idle lock state into ranked cashier actions for scan, tender, queue, sync, and recover…
10h agoapps/pos/src/components/RegisterCommandCenterStatus.test.tsapps/pos/src/components/RegisterCommandCenterStatus.ts - ShippedREQ-POS-723
The Expo POS web workbench must expose an offline session durability panel that scores authenticated session continuity, network mode, offline queue health, held carts, and latest local snapshot freshness before the cashier continues offli…
10h agoapps/pos/src/components/OfflineSessionDurabilityStatus.test.tsapps/pos/src/components/OfflineSessionDurabilityStatus.ts - ShippedREQ-POS-724
The Expo POS web workbench must expose a receipt issue queue that combines receipt print state, staged digital delivery jobs, and receipt reprint audit upload state so staff can recover customer receipt failures before closeout.
10h agoapps/pos/src/components/ReceiptIssueQueueStatus.test.tsapps/pos/src/components/ReceiptIssueQueueStatus.ts - ShippedREQ-POS-725
The Expo POS web workbench must expose customer checkout readiness that summarizes attached customer state, store-credit availability, loyalty projection, and receipt-contact readiness before tender completion.
10h agoapps/pos/src/components/CustomerCheckoutReadinessStatus.test.tsapps/pos/src/components/CustomerCheckoutReadinessStatus.ts - ShippedREQ-POS-726
The Expo POS web workbench must expose a manager exception board that summarizes refunds, price overrides, line-void targets, no-sale drawer opens, and held carts so exception-heavy shifts can be reviewed before closeout or handoff.
10h agoapps/pos/src/components/ManagerExceptionBoardStatus.test.tsapps/pos/src/components/ManagerExceptionBoardStatus.ts - ShippedREQ-POS-727
The Expo POS web workbench must expose a shift launch checklist that combines cashier auth, device registration, timeclock, opening float, hardware readiness, and offline queue state before a cashier starts selling.
10h agoapps/pos/src/components/ReleaseOperationsStatus.test.tsapps/pos/src/components/ReleaseOperationsStatus.ts - Not startedREQ-POS-728
The Expo POS web workbench must expose scan reliability status that combines scanner adapter readiness, active/cancelled read state, timeout outcome, last scan result, and dispatch diagnostics so staff can recover barcode entry issues quic…
- Not startedREQ-POS-729
The Expo POS web workbench must expose tender settlement readiness that combines staged tender lines, remaining/change due, card terminal readiness, and offline queue blockers before a sale is queued.
- Not startedREQ-POS-730
The Expo POS web workbench must expose customer display handoff readiness that combines customer-display adapter state, display payload totals, preview push count, attached customer context, and receipt contact state before checkout comple…
- Not startedREQ-POS-731
The Expo POS web workbench must expose a closeout risk board that rolls up tender closeout, offline durability, receipt issue queue, and manager exception state into a final closeout decision.
- Not startedREQ-POS-732
The Expo POS web workbench must expose a lane throughput board that combines active cart lines, held carts, offline queue pressure, synced receipts, busy state, and idle lock state into a cashier lane-capacity decision.
- Not startedREQ-POS-733
The Expo POS web workbench must expose a cash control board that combines opening float, expected drawer cash, counted cash, closeout variance, no-sale drawer opens, and queued-sale blockers before shift close.
- Not startedREQ-POS-734
The Expo POS web workbench must expose a customer recovery board that combines transaction lookup, refund flow, receipt issue queue, selected customer state, and completed refund count for post-sale service recovery.
- Not startedREQ-POS-735
The Expo POS web workbench must expose an inventory service board that combines inventory reservation exceptions, cycle-count state, label-printer state, scale state, and offline queue pressure before cutting or printing labels.
- Not startedREQ-POS-736
The Expo POS web workbench must expose a loyalty and stored-value board that combines selected customer, loyalty projection, store-credit suggestion, gift-card lookup, coupon state, and remaining tender amount before payment.
- Not startedREQ-POS-737
The Expo POS web workbench must expose a peripheral operations board that combines required hardware health, optional peripheral readiness, printer adapter state, label-printer state, NFC readiness, scale readiness, and display readiness.
- Not startedREQ-POS-738
The Expo POS web workbench must expose a training and demo readiness board that combines training-sale draft availability, demo catalog coverage, cashier authentication, device registration, and offline queue cleanliness before staff pract…
- Not startedREQ-POS-739
The Expo POS web workbench must expose a receipt fulfillment board that combines receipt print state, receipt QR state, receipt delivery readiness, receipt issue queue state, reprint audit queue state, latest synced receipts, and printer r…
- Not startedREQ-POS-740
The Expo POS web workbench must expose an offline recovery command board that combines connectivity state, offline queue pressure, active flush state, sync recovery state, offline durability state, and held-cart count before staff attempt…
- Not startedREQ-POS-741
The Expo POS web workbench must expose a device operations board that combines device registration state, API runtime configuration, authenticated org context, Stripe reader mapping, hardware health, and connectivity state before a lane op…
- Not startedREQ-POS-742
The Expo POS web workbench must expose a security controls board that combines cashier authentication, idle-lock state, manager exception state, price override state, drawer open audit count, and line-void target state before sensitive act…
- Not startedREQ-POS-743
The Expo POS web workbench must expose a promotion and pricing board that combines coupon state, discount scan state, active price override state, applied discount amount, manager exception state, and remaining tender amount before checkou…
- Not startedREQ-POS-744
The Expo POS web workbench must expose a post-sale audit board that combines sales journal state, synced receipt count, completed refund count, receipt reprint audit state, no-sale drawer open count, and failed queue count before closeout.
- Not startedREQ-POS-745
The Expo POS web workbench must expose a continuity snapshot board that combines saved snapshot state, held-cart count, active cart line count, offline queue pressure, local event bus state, and completed receipt count for register restart…
- Not startedREQ-POS-746
The Expo POS web workbench must expose a cart integrity board that combines checkout readiness, cart total audit state, cart conflict state, inventory exception state, active cart line count, and remaining tender amount before checkout han…
- Not startedREQ-POS-747
The Expo POS web workbench must expose a tender method coverage board that combines available tender methods, selected tender method, card terminal readiness, drawer readiness, store-credit suggestion, gift-card lookup state, and staged ti…
- Not startedREQ-POS-748
The Expo POS web workbench must expose a queue performance board that combines offline queue summary, sync recovery state, flush state, sales journal state, connectivity, and local event backlog before staff start queue recovery.
- Not startedREQ-POS-749
The Expo POS web workbench must expose a cashier productivity board that combines cashier identity, timeclock state, active cart lines, synced receipts, completed refunds, held carts, and lane busy state for shift coaching.
- Not startedREQ-POS-750
The Expo POS web workbench must expose a customer engagement board that combines selected customer, customer checkout readiness, loyalty projection, receipt delivery readiness, customer display state, and coupon state before customer hando…
- Not startedREQ-POS-751
The Expo POS web workbench must expose an inventory cut readiness board that combines yardage rounding state, physical scale state, cycle-count state, inventory exception state, label printer readiness, and NFC readiness before fabric cutt…
- Not startedREQ-POS-752
The Expo POS web workbench must expose an end-of-day command board that combines end-of-day flow state, shift summary state, cash control state, tender closeout state, post-sale audit state, and closeout risk state before shift close.
- Not startedREQ-POS-753
The Expo POS web workbench must expose a checkout completion command board that combines cart integrity, tender settlement, tender method coverage, queue performance, receipt fulfillment, and hardware/peripheral readiness before the cashie…
- Not startedREQ-POS-754
The Expo POS web workbench must expose a sync command health board that combines connectivity, queue performance, offline recovery, device operations, continuity snapshot, and local event backlog before staff flush or retry offline sale wo…
- Not startedREQ-POS-755
The Expo POS web workbench must expose a register launch decision board that combines shift launch, device operations, security controls, peripheral operations, scan reliability, and training/demo readiness before a lane opens.
- Not startedREQ-POS-756
The Expo POS web workbench must expose a payment assurance board that combines promotion/pricing state, loyalty and stored value state, customer checkout state, tender settlement state, tender method coverage, and queue health before payme…
- Not startedREQ-POS-757
The Expo POS web workbench must expose a receipt recovery command board that combines receipt fulfillment, receipt issue queue, customer recovery, post-sale audit, printer readiness, and audit queue state before staff close a customer rece…
- Not startedREQ-POS-758
The Expo POS web workbench must expose an inventory assurance board that combines inventory service, inventory cut readiness, cart integrity, scan reliability, queue performance, and label/NFC readiness before inventory-affecting checkout…
- Not startedREQ-POS-759
The Expo POS web workbench must expose a customer service desk board that combines customer engagement, customer recovery, loyalty/stored value state, receipt fulfillment, transaction lookup state, and refund count for post-sale support.
- Not startedREQ-POS-760
The Expo POS web workbench must expose a manager closeout command board that combines end-of-day command, closeout risk, cash control, security controls, manager exception state, and queue performance before managers close the register.
- Not startedREQ-POS-761
The Expo POS web workbench must expose a critical path assurance board that combines scan reliability, cart integrity, checkout completion, payment assurance, lane throughput, and cashier productivity before staff decide the lane can proce…
- Not startedREQ-POS-762
The Expo POS web workbench must expose an offline selling decision board that combines sync command health, offline recovery, offline durability, queue performance, cart integrity, and inventory assurance before staff continue selling with…
- Not startedREQ-POS-763
The Expo POS web workbench must expose a hardware serviceability board that combines peripheral operations, device operations, receipt recovery, inventory assurance, scan reliability, and printer/terminal readiness before hardware-dependen…
- Not startedREQ-POS-764
The Expo POS web workbench must expose a staff accountability board that combines cashier productivity, security controls, manager exception state, register launch decision, customer service desk, and manager closeout before shift handoff…
- Not startedREQ-POS-765
The Expo POS web workbench must expose a closeout audit packet board that combines manager closeout, end-of-day command, receipt recovery, post-sale audit, cash control, and tender closeout before closeout records are treated as review-rea…
- Not startedREQ-POS-766
The Expo POS web workbench must expose a customer handoff command board that combines customer engagement, payment assurance, receipt recovery, customer display handoff, customer service desk, and receipt fulfillment before the customer le…
- Not startedREQ-POS-767
The Expo POS web workbench must expose a training mode control board that combines register launch decision, training/demo readiness, security controls, device operations, queue performance, and cashier productivity before staff practice t…
- Not startedREQ-POS-768
The Expo POS web workbench must expose a release blocker matrix board that combines critical path assurance, offline selling decision, hardware serviceability, staff accountability, closeout audit packet, customer handoff, training mode co…
- Not startedREQ-POS-769
The Expo POS web workbench must expose a sale floor go/no-go board that combines critical path assurance, offline selling decision, hardware serviceability, customer handoff, staff accountability, and release blocker matrix before floor le…
- Not startedREQ-POS-770
The Expo POS web workbench must expose a network outage playbook board that combines offline selling decision, sync command health, offline recovery command, queue performance, continuity snapshot, and cart integrity before staff operate t…
- Not startedREQ-POS-771
The Expo POS web workbench must expose a receipt counter recovery board that combines customer handoff, receipt recovery command, receipt fulfillment, customer service desk, post-sale audit, and printer readiness before staff dismiss recei…
- Not startedREQ-POS-772
The Expo POS web workbench must expose an inventory risk command board that combines inventory assurance, inventory service, inventory cut readiness, cart integrity, offline selling decision, and scan reliability before inventory-affecting…
- Not startedREQ-POS-773
The Expo POS web workbench must expose a cash room audit board that combines closeout audit packet, manager closeout, cash control, end-of-day command, tender closeout, and post-sale audit before cash records leave the register.
- Not startedREQ-POS-774
The Expo POS web workbench must expose a device fleet launch board that combines hardware serviceability, device operations, peripheral operations, register launch decision, training mode control, and sync command health before a POS devic…
- Not startedREQ-POS-775
The Expo POS web workbench must expose an associate coaching board that combines staff accountability, cashier productivity, security controls, customer engagement, training mode control, and customer service desk before manager coaching o…
- Not startedREQ-POS-776
The Expo POS web workbench must expose a customer experience assurance board that combines customer handoff, customer engagement, payment assurance, receipt recovery, customer display handoff, and customer service desk before staff treat c…
- Not startedREQ-POS-777
The Expo POS web workbench must expose a release war room board that combines release blocker matrix, sale floor go/no-go, network outage playbook, inventory risk command, cash room audit, and device fleet launch for a single launch-readin…
- Not startedREQ-POS-778
The Expo POS web workbench must expose an incident escalation board that combines release blocker matrix, network outage playbook, hardware serviceability, receipt counter recovery, security controls, and manager closeout before support es…
- Not startedREQ-POS-779
The Expo POS web workbench must expose a store opening readiness board that combines register launch decision, shift launch checklist, device operations, hardware serviceability, cash control, and training mode control before opening the l…
- Not startedREQ-POS-780
The Expo POS web workbench must expose a store closing readiness board that combines closeout audit packet, manager closeout, cash room audit, receipt counter recovery, offline selling decision, and staff accountability before closing the…
- Not startedREQ-POS-781
The Expo POS web workbench must expose a live lane supervisor board that combines sale floor go/no-go, lane throughput, critical path assurance, associate coaching, customer experience assurance, and incident escalation while a customer-fa…
- Not startedREQ-POS-782
The Expo POS web workbench must expose an offline queue triage board that combines network outage playbook, sync command health, queue performance, receipt counter recovery, cash room audit, and failed queue count before staff retry offlin…
- Not startedREQ-POS-783
The Expo POS web workbench must expose a payment recovery board that combines payment assurance, tender settlement, tender method coverage, receipt counter recovery, customer service desk, and manager exceptions before staff recover paymen…
- Not startedREQ-POS-784
The Expo POS web workbench must expose a fabric counter assurance board that combines inventory risk command, inventory cut readiness, scan reliability, cart integrity, hardware serviceability, and queue performance before cutting fabric a…
- Not startedREQ-POS-785
The Expo POS web workbench must expose a hardware pairing readiness board that combines device fleet launch, hardware serviceability, peripheral operations, device operations, scan reliability, and receipt counter recovery before pairing o…
- Not startedREQ-POS-786
The Expo POS web workbench must expose a shift handoff packet board that combines staff accountability, associate coaching, store closing readiness, customer service desk, offline queue triage, and closeout audit packet before a cashier ha…
- Not startedREQ-POS-787
The Expo POS web workbench must expose a refund authorization board that combines customer service desk, customer recovery, manager closeout, security controls, post-sale audit, and receipt counter recovery before refund work continues.
- Not startedREQ-POS-788
The Expo POS web workbench must expose a training certification board that combines training mode control, associate coaching, store opening readiness, device fleet launch, sale floor go/no-go, and release war room before staff sign off tr…
- Not startedREQ-POS-789
The Expo POS web workbench must expose a customer issue prevention board that combines customer experience assurance, customer handoff command, customer engagement, receipt counter recovery, payment recovery, and inventory risk command bef…
- Not startedREQ-POS-790
The Expo POS web workbench must expose a launch rehearsal board that combines store opening readiness, release war room, device fleet launch, network outage playbook, cash room audit, and training certification before rehearsal is marked c…
- Not startedREQ-POS-791
The Expo POS web workbench must expose a compliance evidence board that combines cash room audit, closeout audit packet, post-sale audit, security controls, incident escalation, and store closing readiness before audit evidence is consider…
- Not startedREQ-POS-792
The Expo POS web workbench must expose an operator release cockpit board that combines release war room, live lane supervisor, offline queue triage, payment recovery, fabric counter assurance, hardware pairing readiness, shift handoff pack…
- Not startedREQ-POS-793
The Expo POS web workbench must expose a register resilience board that combines operator release cockpit, sync command health, continuity snapshot, offline queue triage, network outage playbook, and device fleet launch before the register…
- Not startedREQ-POS-794
The Expo POS web workbench must expose a tender risk board that combines payment recovery, payment assurance, tender settlement, tender method coverage, cash room audit, and manager exceptions before tender anomalies are dismissed.
- Not startedREQ-POS-795
The Expo POS web workbench must expose an inventory reconciliation board that combines fabric counter assurance, inventory risk command, inventory assurance, post-sale audit, queue performance, and compliance evidence before inventory disc…
- Not startedREQ-POS-796
The Expo POS web workbench must expose a customer recovery command board that combines customer issue prevention, refund authorization, receipt counter recovery, customer service desk, customer experience assurance, and incident escalation…
- Not startedREQ-POS-797
The Expo POS web workbench must expose a hardware incident board that combines hardware pairing readiness, hardware serviceability, device fleet launch, receipt counter recovery, incident escalation, and peripheral operations before hardwa…
- Not startedREQ-POS-798
The Expo POS web workbench must expose a shift leader dashboard board that combines live lane supervisor, shift handoff packet, associate coaching, store opening readiness, store closing readiness, and operator release cockpit for lane-lea…
- Not startedREQ-POS-799
The Expo POS web workbench must expose a training floor board that combines training certification, training mode control, associate coaching, customer issue prevention, hardware pairing readiness, and launch rehearsal before floor trainin…
- Not startedREQ-POS-800
The Expo POS web workbench must expose a closeout compliance board that combines compliance evidence, store closing readiness, cash room audit, closeout audit packet, offline queue triage, and refund authorization before closeout complianc…
- Not startedREQ-POS-801
The Expo POS web workbench must expose a disaster recovery drill board that combines network outage playbook, offline queue triage, continuity snapshot, device fleet launch, incident escalation, and operator release cockpit before recovery…
- Not startedREQ-POS-802
The Expo POS web workbench must expose a release signoff packet board that combines operator release cockpit, launch rehearsal, compliance evidence, sale floor go/no-go, store opening readiness, and store closing readiness before go-live s…
- Not startedREQ-POS-803
The Expo POS web workbench must expose a daily health pulse board that combines live lane supervisor, payment recovery, fabric counter assurance, hardware pairing readiness, customer issue prevention, and compliance evidence into a daily l…
- Not startedREQ-POS-804
The Expo POS web workbench must expose an executive go-live command board that combines release signoff packet, daily health pulse, disaster recovery drill, shift leader dashboard, tender risk, and register resilience into the final execut…
- Not startedREQ-POS-805
The Expo POS web workbench must expose a regional rollout readiness board that combines executive go-live command, store opening readiness, device fleet launch, training floor, disaster recovery drill, and closeout compliance before a stor…
- Not startedREQ-POS-806
The Expo POS web workbench must expose a pilot store command board that combines regional rollout readiness, live lane supervisor, daily health pulse, hardware incident, tender risk, and inventory reconciliation before pilot expansion cont…
- Not startedREQ-POS-807
The Expo POS web workbench must expose a multi-lane coordination board that combines register resilience, lane throughput, shift leader dashboard, cashier productivity, device operations, and hardware pairing readiness before multiple regi…
- Not startedREQ-POS-808
The Expo POS web workbench must expose a support escalation closure board that combines hardware incident, customer recovery command, disaster recovery drill, incident escalation, compliance evidence, and tender risk before support escalat…
- Not startedREQ-POS-809
The Expo POS web workbench must expose a revenue protection board that combines tender risk, payment recovery, refund authorization, cash room audit, security controls, and post-sale audit before cash or tender exposure is accepted.
- Not startedREQ-POS-810
The Expo POS web workbench must expose an inventory protection board that combines inventory reconciliation, fabric counter assurance, inventory risk command, inventory service, compliance evidence, and offline queue triage before inventor…
- Not startedREQ-POS-811
The Expo POS web workbench must expose an experience protection board that combines customer recovery command, customer issue prevention, customer experience assurance, customer handoff command, receipt recovery command, and daily health p…
- Not startedREQ-POS-812
The Expo POS web workbench must expose a store operations readiness board that combines shift leader dashboard, closeout compliance, register resilience, hardware incident, staff accountability, and manager closeout command before store op…
- Not startedREQ-POS-813
The Expo POS web workbench must expose a release communications board that combines release signoff packet, executive go-live command, daily health pulse, incident escalation, training floor, and store opening readiness before launch commu…
- Not startedREQ-POS-814
The Expo POS web workbench must expose a launch day command board that combines regional rollout readiness, pilot store command, multi-lane coordination, support escalation closure, revenue protection, and inventory protection into a same-…
- Not startedREQ-POS-815
The Expo POS web workbench must expose a stabilization command board that combines launch day command, experience protection, store operations readiness, disaster recovery drill, closeout compliance, and executive go-live command before st…
- ShippedREQ-POS-816
The Expo POS web workbench must expose a release retrospective board that combines stabilization command, compliance evidence, post-sale audit, daily health pulse, inventory reconciliation, and customer recovery command before release lear…
10h agoapps/pos/src/components/ReleaseOperationsStatus.test.tsapps/pos/src/components/ReleaseOperationsStatus.ts - Not startedREQ-POS-817
The Expo POS web workbench must expose a deterministic end-to-end purchase test action that uses local sample catalog data and a cash test tender to exercise cart creation, tender staging, offline queueing, simulated accepted sync, and rec…
- Not startedREQ-POS-818
The Expo POS web workbench must expose purchase-test evidence that shows the order ID, receipt total, post-sync queue state, and each completed step so an operator can verify the app is ready for a manual purchase test before using live au…
- Not startedREQ-POS-819
The Expo POS web workbench must expose a live API purchase-test readiness gate that blocks live sale-sync testing until the API origin, Clerk staff session, selected organization, device ID, registered device state, online connectivity, an…
- Not startedREQ-POS-820
The Expo POS web workbench must expose a live API purchase-test flow that stages a local sample-catalog cash sale into the offline queue, syncs that exact sale through /api/pos/sales/sync, and records receipt/order evidence from the API re…
- Not startedREQ-POS-821
The Expo POS web workbench must expose an E2E test command center that rolls up local purchase-test evidence, live API purchase-test readiness, queued-sale state, receipt/recovery evidence, customer context, and cash-lane hardware readines…
- Not startedREQ-POS-822
The Expo POS web workbench must provide a local test-lane preparation action that seeds safe workbench-only customer, cashier, timeclock, connectivity, opening-float, and cash-lane hardware state without faking Clerk authentication, select…
- Not startedREQ-POS-823
The Expo POS web workbench must expose manual E2E verification checks after live sale sync, including API order acceptance, receipt-history presence, offline queue clearance, receipt recovery readiness, and closeout safety, so a tester can…
- ShippedREQ-POS-030
Devices must be enrollable to a store with per-device credentials and revocable tokens.
10h agoapps/pos/src/runtime/apiClient.test.ts×2apps/pos/src/session/types.ts×2apps/web/src/app/api/pos/runtime/route.ts×2+7 more - ShippedREQ-POS-031
Sensitive actions (refunds, price overrides, drawer opens outside a sale) must require a manager PIN or biometric step-up.
10h agoapps/pos/src/session/types.ts×3packages/events/src/domain/pos.ts×3apps/pos/src/runtime/registerWorkbench.test.ts×2+15 more - ShippedREQ-POS-501
Scaffold apps/pos as a TypeScript-first package for the React Native + Expo app (DEC-001 / REQ-POS-020). Strict TS via tsconfig.base.json, ESLint + Prettier wired to the root flat config, @bolttocart/core imported with types end-to-end, pn…
10h agoapps/pos/src/flow/criticalPath.test.tsapps/pos/src/index.tsapps/pos/src/screens/cart.ts+3 more - ShippedREQ-POS-503
Device-session abstraction (apps/pos/src/session/deviceSession.ts) and manager-PIN gate stub (apps/pos/src/session/managerGate.ts) per REQ-POS-030 / REQ-POS-031. DeviceSession wraps an injected DeviceSessionReader that the forthcoming Cler…
10h agoapps/pos/src/flow/noSaleDrawerOpen.tsapps/pos/src/hw/noopHardware.tsapps/pos/src/index.ts+5 more - ShippedREQ-POS-511
In-memory held-cart store (apps/pos/src/flow/heldCarts.ts) per REQ-POS-004 / REQ-POS-022. HeldCartStore (plain class, no framework dep) provides: park(state, label?) ??? serialises CriticalPathState via serializeCartSnapshot (REQ-POS-504),…
10h agoapps/pos/src/flow/heldCarts.test.tsapps/pos/src/flow/heldCarts.ts - ShippedREQ-POS-512
End-of-day report builder + state machine (apps/pos/src/flow/endOfDayReport.ts). Pure reducer driving EndOfDayReportState union: idle | counting | confirming | complete | error. StartEndOfDayOptions: currency, openingFloatMinor, netCashSal…
10h agoapps/pos/src/components/EndOfDayStatus.test.tsapps/pos/src/components/EndOfDayStatus.tsapps/pos/src/flow/endOfDayReport.test.ts+1 more - ShippedREQ-POS-513
Refund flow state machine (apps/pos/src/flow/refundFlow.ts). Steps: idle | selecting-lines | selecting-tender | processing | complete | error. startRefund(state, cart, authorization, currency) ??? accepts ManagerAuthorization from the PIN…
10h agoapps/pos/src/flow/refundFlow.test.tsapps/pos/src/flow/refundFlow.tsapps/pos/src/flow/transactionLookup.ts - ShippedREQ-POS-514
Customer lookup module (apps/pos/src/flow/customerLookup.ts). PosApiClient interface: lookupCustomers(query: string): Promise<readonly PosCustomer[]> ??? injected; no direct fetch. PosCustomer: { customerId, displayName, email | null, phon…
10h agoapps/pos/src/components/CustomerLookupResults.test.tsapps/pos/src/components/CustomerLookupResults.tsapps/pos/src/flow/customerLookup.test.ts+1 more - ShippedREQ-POS-515
Offline queue (apps/pos/src/flow/offlineQueue.ts). OfflineQueueStorage interface: getItem/setItem/removeItem ??? injected (real: expo-secure-store; test: createInMemoryStorage()). OfflineQueueItem<T>: { id, payload, enqueuedAt: string, att…
10h agoapps/pos/src/components/OfflineQueueStatus.test.tsapps/pos/src/components/OfflineQueueStatus.tsapps/pos/src/flow/offlineQueue.test.ts+2 more - ShippedREQ-POS-516
Split-tender keypad render model (apps/pos/src/components/SplitTenderKeypad.ts). SplitTenderKeypadModel: { remainingMinor, canFinalize, paidMinor, cartTotalMinor, currency, isComplete } (all amounts bigint). buildSplitTenderKeypad(state: T…
10h agoapps/pos/src/components/SplitTenderKeypad.test.tsapps/pos/src/components/SplitTenderKeypad.ts - ShippedREQ-POS-517
Receipt delivery module (apps/pos/src/flow/receiptDelivery.ts). ReceiptDeliveryMethod = "email" | "sms". ReceiptDeliveryOptions: method, address, transactionAt, totalMinor: bigint, currency, tenantId, storeName. ReceiptDeliveryJobPayload:…
10h agoapps/pos/src/flow/receiptDelivery.test.tsapps/pos/src/flow/receiptDelivery.tspackages/events/src/domain/pos.ts+1 more - ShippedREQ-POS-518
Discount scan handler (apps/pos/src/flow/discountScanHandler.ts). handleDiscountScan(rawPayload, isOnline) ??? parses COUPON:<code> prefix (case-insensitive, trims CR/LF); rejects with { kind: "offline-rejected", code } when isOnline=false…
10h agoapps/pos/src/cart/cartTotals.tsapps/pos/src/components/DiscountScanStatus.tsapps/pos/src/flow/discountScanHandler.test.ts+1 more - ShippedREQ-POS-523
Store-credit balance lookup module (apps/pos/src/flow/storeCreditBalance.ts). StoreCreditBalance: { customerId, balanceMinor: bigint, currency, asOf (ISO) }. StoreCreditClient interface injected. STORE_CREDIT_TTL_MS = 300_000. States: idle…
10h agoapps/pos/src/components/StoreCreditStatus.test.tsapps/pos/src/components/StoreCreditStatus.tsapps/pos/src/flow/storeCreditBalance.test.ts+1 more - ShippedREQ-POS-522
POS device registration state machine (apps/pos/src/flow/posDeviceRegistration.ts). Client-side state machine for registering a POS terminal against the pos_devices schema (REQ-ARC-513). PosDeviceProfile: { deviceId, stripeReaderId, displa…
10h agoapps/pos/src/components/DeviceRegistrationStatus.test.tsapps/pos/src/components/DeviceRegistrationStatus.tsapps/pos/src/flow/posDeviceRegistration.test.ts+1 more - ShippedREQ-POS-521
Cycle-count session flow module (apps/pos/src/flow/cycleCountSession.ts). Pure client-side state machine for the POS cycle-count workflow over the cycle_count_sessions / cycle_count_lines schema (REQ-ARC-512). States: idle | open | confirm…
10h agoapps/pos/src/components/CycleCountStatus.test.tsapps/pos/src/components/CycleCountStatus.tsapps/pos/src/flow/cycleCountSession.test.ts+1 more - ShippedREQ-POS-520
Transaction lookup module (apps/pos/src/flow/transactionLookup.ts). Retrieves a past POS transaction by receipt reference for refund initiation (REQ-POS-513). TransactionClient interface: lookupTransaction(ref: string): Promise<PastTransac…
10h agoapps/pos/src/components/TransactionLookupResult.test.tsapps/pos/src/components/TransactionLookupResult.tsapps/pos/src/flow/transactionLookup.test.ts+1 more - ShippedREQ-POS-519
Price-override flow state machine (apps/pos/src/flow/priceOverrideFlow.ts). Sensitive action per REQ-POS-031 / REQ-PRI-061 — caller must obtain a ManagerAuthorization from ManagerGate.requirePin("price-override", …) before invoking. Pure r…
10h agoapps/pos/src/cart/cartTotals.tsapps/pos/src/components/PriceOverrideStatus.test.tsapps/pos/src/components/PriceOverrideStatus.ts+3 more - ShippedREQ-POS-510
ScanDispatch module (apps/pos/src/flow/scanDispatch.ts) bridging parseScan() (REQ-POS-505) and CriticalPathState (REQ-POS-502). dispatchScan(state, rawPayload, resolver): Promise<ScanDispatchResult> returns a discriminated union: { kind: "…
10h agoapps/pos/src/flow/criticalPath.tsapps/pos/src/flow/scanDispatch.test.tsapps/pos/src/flow/scanDispatch.ts+2 more - ShippedREQ-POS-509
Tender state machine (apps/pos/src/flow/tender.ts). Pure reducer driving TenderState union: idle | selecting-method | awaiting-card-read | awaiting-cash-entry | completing | complete | error. TenderMethod = "card" | "cash" | "store-credit"…
10h agoapps/pos/src/flow/storeCreditBalance.tsapps/pos/src/flow/tender.test.tsapps/pos/src/flow/tender.ts - ShippedREQ-POS-508
Receipt line builder + 40-column ESC/POS renderer (apps/pos/src/receipt/receiptBuilder.ts). buildReceipt(cart, tenderResult, options): ReceiptModel — pure function composing: header (storeName, terminalId, transactionAt); ReceiptLine[] per…
10h agoapps/pos/src/hw/receiptPrinterExt.test.tsapps/pos/src/receipt/receiptBuilder.test.tsapps/pos/src/receipt/receiptBuilder.ts - ShippedREQ-POS-507
YardageKeypad state machine (apps/pos/src/components/YardageKeypad.tsx). Pure-TypeScript keypad for fractional yardage entry per REQ-POS-002. Reducer functions: pressDigit(state, d) appends a decimal digit to the bigint-sixteenths accumula…
10h agoapps/pos/src/components/YardageKeypad.test.tsapps/pos/src/components/YardageKeypad.tsxpackages/events/src/domain/pos.ts - ShippedREQ-POS-506
CartLineList render-model builder (apps/pos/src/components/CartLineList.tsx). Pure function buildCartLineList(cart: CartValue): CartLineListModel projects each CartItem into a CartLineModel exposing: skuId (bolt scan identifier), displayNa…
10h agopackages/events/src/domain/pos.ts×2apps/pos/src/components/CartLineList.test.tsapps/pos/src/components/CartLineList.tsx+1 more - ShippedREQ-POS-505
Scanner-payload parser for the POS (apps/pos/src/scan/parser.ts) supporting REQ-POS-001 / REQ-POS-003 / REQ-POS-024 / REQ-INV-050. Decodes BOLT:<uuid> and BOLT:<uuid>:<yardage-sixteenths> bolt-label payloads from a Bluetooth HID scanner in…
10h agoapps/pos/src/hw/nfcWriter.ts×2apps/pos/src/flow/scanDispatch.tsapps/pos/src/index.ts+3 more - ShippedREQ-POS-504
Cart snapshot for the POS critical path (apps/pos/src/flow/snapshot.ts). serializeCartSnapshot(state) renders a CriticalPathState to a JSON string where every bigint (yardage sixteenths, per-yard minor price) is a decimal string and every…
10h agoapps/pos/src/flow/heldCarts.ts×2apps/pos/src/flow/snapshot.test.tsapps/pos/src/flow/snapshot.ts - ShippedREQ-POS-544
Cart-line display-string builder (apps/pos/src/cart/buildLineItem.ts). Pure buildLineItemDisplay({ designerName, collectionName }): string derives the short subtitle shown under each cart line: both populated → "Designer · Collection" (mid…
10h agoapps/pos/src/components/LineItemDisplayStatus.test.ts×2apps/pos/src/cart/buildLineItem.test.tsapps/pos/src/cart/buildLineItem.ts+1 more - ShippedREQ-POS-545
Cart totals breakdown for the POS (apps/pos/src/cart/cartTotals.ts). Pure computeCartTotals({ lines, discountMinor }): { subtotalMinor, discountMinor, taxMinor, totalMinor } collapses cart lines into the four-number breakdown the UI / rece…
10h agoapps/pos/src/receipt/buildReceiptLines.ts×2apps/pos/src/cart/cartTotals.test.tsapps/pos/src/cart/cartTotals.ts+2 more - ShippedREQ-POS-547
Yardage string → nearest-1/16-yard rounding helper (apps/pos/src/cut/roundToSixteenth.ts). Pure roundToSixteenth(input: string): bigint snaps cashier-entered yardage to the canonical 1/16-yard grid defined by REQ-INV-001. Accepts three sha…
10h agoapps/pos/src/components/YardageRoundingStatus.test.tsapps/pos/src/components/YardageRoundingStatus.tsapps/pos/src/cut/roundToSixteenth.test.ts+1 more - ShippedREQ-POS-548
BoltToCart NFC URI-record parser (apps/pos/src/scan/parseBoltTag.ts). Pure parseBoltTag(input: string): BoltTagParseResult classifies NDEF URI payloads carrying the canonical btc://bolt/<uuid> form that the mobile NFC reader emits directly…
10h agoapps/pos/src/nfc/buildBoltTagPayload.ts×3apps/pos/src/nfc/buildBoltTagPayload.test.ts×2apps/pos/src/scan/parseBoltTag.test.ts+1 more - ShippedREQ-POS-549
TenderKind enum + cashier-facing label map (apps/pos/src/tender/tenderKindLabel.ts). Defines the internal discriminator TenderKind = "card_present" | "cash" | "gift_card" | "house_credit" | "split" used by the POS tender state machine, rec…
10h agoapps/pos/src/tender/tenderKindLabel.test.tsapps/pos/src/tender/tenderKindLabel.ts - ShippedREQ-POS-502
POS critical-path skeleton (scan → yardage → cart → tender) per REQ-POS-001 / REQ-POS-002. Pure reducer (apps/pos/src/flow/criticalPath.ts) drives an immutable CriticalPathState; placeholder screen modules (apps/pos/src/screens/*.ts) are U…
2m agoapps/pos/src/index.ts×3packages/events/src/domain/pos.ts×2packages/events/src/registry.test.ts×2+6 more - ShippedREQ-POS-524
Loyalty-points earn projection (apps/pos/src/flow/loyaltyEarnProjection.ts). Pure buildLoyaltyEarnProjection(cartTotalMinor, rateNumerator, rateDenominator) bigint floor division. Guard: rateDenominator > 0n; 0n when cartTotalMinor=0n. 7 u…
10h agoapps/pos/src/components/LoyaltyEarnProjectionStatus.test.tsapps/pos/src/components/LoyaltyEarnProjectionStatus.tsapps/pos/src/flow/loyaltyEarnProjection.test.ts+1 more - ShippedREQ-POS-525
Gift-card tender leg (apps/pos/src/flow/giftCardTender.ts). Injected GiftCardClient.lookupBalance. State machine idle|entering-code|looking-up|found|insufficient|applied|error. appliedMinor = min(balance, remaining) bigint. 14 unit tests.
10h agoapps/pos/src/components/GiftCardTenderStatus.tsapps/pos/src/flow/giftCardTender.test.tsapps/pos/src/flow/giftCardTender.ts - ShippedREQ-POS-526
Coupon application flow (apps/pos/src/flow/couponFlow.ts). Injected CouponClient.validateCoupon. State machine idle|entering|validating|applied|rejected|error. 13 unit tests.
10h agoapps/pos/src/components/CouponStatus.test.tsapps/pos/src/components/CouponStatus.tsapps/pos/src/flow/couponFlow.test.ts+1 more - ShippedREQ-POS-527
No-sale drawer-open flow (apps/pos/src/flow/noSaleDrawerOpen.ts). buildNoSaleOpenCommand(opts) validates non-empty authorizedByUserId. 8 unit tests.
10h agoapps/pos/src/flow/noSaleDrawerOpen.test.tsapps/pos/src/flow/noSaleDrawerOpen.ts - ShippedREQ-POS-528
Custom manual-entry product line (apps/pos/src/flow/customLine.ts). buildCustomLine(opts) builds CustomCartLine with skuId=CUSTOM-<uuid> and lineTotalMinor=floor(price*yardage/16n). 10 unit tests.
10h agoapps/pos/src/components/CustomLineStatus.test.ts×2apps/pos/src/index.ts×2apps/pos/src/components/CustomLineStatus.ts+3 more - ShippedREQ-POS-529
Cash-denomination change suggestion (apps/pos/src/flow/changeSuggestion.ts). computeChangeDenominations greedy bigint algorithm. US_DENOMINATIONS (8 denominations). 9 unit tests.
10h agoapps/pos/src/components/ChangeSuggestionStatus.test.tsapps/pos/src/components/ChangeSuggestionStatus.tsapps/pos/src/flow/changeSuggestion.test.ts+1 more - ShippedREQ-POS-530
Cart-line void flow (apps/pos/src/flow/lineVoidFlow.ts). applyLineVoid(cart, opts) pure function. Guards: non-empty auth token, lineIndex in range. 11 unit tests.
10h agoapps/pos/src/components/LineVoidStatus.test.tsapps/pos/src/components/LineVoidStatus.tsapps/pos/src/flow/lineVoidFlow.test.ts+2 more - ShippedREQ-POS-531
POS connectivity-status monitor (apps/pos/src/flow/connectivityMonitor.ts). Injected Fetcher. States: online/offline/degraded. onStateChange unsubscribe. 10 unit tests.
10h agoapps/pos/src/components/ConnectivityStatus.test.ts×2apps/pos/src/components/ConnectivityStatus.tsapps/pos/src/flow/connectivityMonitor.test.ts+3 more - ShippedREQ-POS-532
Offline-queue flush state machine (apps/pos/src/flow/offlineQueueFlush.ts). idle|flushing|complete|error. Pure transitions. 10 unit tests.
10h agoapps/pos/src/components/OfflineFlushStatus.test.tsapps/pos/src/components/OfflineFlushStatus.tsapps/pos/src/flow/offlineQueueFlush.test.ts+1 more - ShippedREQ-POS-533
Session idle-lock module (apps/pos/src/session/idleLock.ts). Injected clock+timer factory. recordActivity/lock/onLock/destroy. 9 unit tests.
10h agoapps/pos/src/components/IdleLockStatus.test.tsapps/pos/src/components/IdleLockStatus.tsapps/pos/src/session/idleLock.test.ts+1 more - ShippedREQ-POS-534
Staff clock-in/clock-out stub (apps/pos/src/flow/staffTimeclock.ts). clocked-out|clocked-in|error. getElapsedMs bigint ms. 10 unit tests.
10h agoapps/pos/src/components/StaffTimeclockStatus.tsapps/pos/src/flow/staffTimeclock.test.tsapps/pos/src/flow/staffTimeclock.ts+1 more - ShippedREQ-POS-535
POS OTel span emitter (apps/pos/src/telemetry/posTelemetry.ts). Injected SpanEmitter. pos.scan/pos.add_line/pos.tender/pos.receipt. 11 unit tests.
10h agoapps/pos/src/telemetry/posTelemetry.test.tsapps/pos/src/telemetry/posTelemetry.ts - ShippedREQ-POS-536
SKU low-stock badge (apps/pos/src/components/LowStockBadge.ts). computeStockBadge right-arrow ok|low|out. remainingYards via formatYardageMixed. 8 unit tests.
10h agoapps/pos/src/components/LowStockBadge.test.tsapps/pos/src/components/LowStockBadge.ts - ShippedREQ-POS-537
Hardware error remediation registry (apps/pos/src/hw/errorRemediation.ts). HardwareErrorCode closed union (8 codes). getRemediation(code). 6 tests covering all codes.
10h agoapps/pos/src/flow/criticalPath.test.tsapps/pos/src/hw/errorRemediation.test.tsapps/pos/src/hw/errorRemediation.ts - ShippedREQ-POS-538
Tip prompt render model (apps/pos/src/flow/tipPrompt.ts). buildTipPrompt bigint floor division. DEFAULT_TIP_PRESETS (0/15/18/20%). applyCustomTip validates >= 0n. 9 unit tests.
10h agoapps/pos/src/components/TipPromptStatus.test.tsapps/pos/src/components/TipPromptStatus.tsapps/pos/src/flow/tipPrompt.test.ts+1 more - ShippedREQ-POS-539
Float denomination entry (apps/pos/src/flow/floatEntry.ts). floatEntryInit/setDenominationCount/clearFloat pure reducers. bigint totalMinor. 10 unit tests.
10h agoapps/pos/src/components/FloatEntryStatus.test.tsapps/pos/src/components/FloatEntryStatus.tsapps/pos/src/flow/floatEntry.test.ts+2 more - ShippedREQ-POS-540
POS search-result ranker (apps/pos/src/flow/skuRanker.ts). scoreSkuResult 100/80/60/40/20/0. rankSkuResults stable descending sort. 13 unit tests.
10h agoapps/pos/src/flow/skuRanker.test.ts×2apps/pos/src/components/LoyaltyPointsDisplay.test.tsapps/pos/src/flow/skuRanker.ts - ShippedREQ-POS-541
No-sale drawer-open flow (apps/pos/src/flow/noSaleFlow.ts) with states idle | selecting-reason | confirming | opened | error, manager-authorization guard on startNoSale, reason selection + confirmation transitions, cancelNoSale from non-op…
10h agoapps/pos/src/components/NoSaleFlowStatus.test.tsapps/pos/src/components/NoSaleFlowStatus.tsapps/pos/src/flow/noSaleFlow.test.ts - ShippedREQ-POS-542
Coupon-application render model (apps/pos/src/flow/couponApplication.ts) wraps handleDiscountScan + computeDiscountMinor into a pure state machine (idle | scanning | decoded | verifying | applied | rejected | error) and includes CartWithCo…
10h agoapps/pos/src/cart/cartTotals.tsapps/pos/src/components/CouponApplicationStatus.test.tsapps/pos/src/components/CouponApplicationStatus.ts+1 more - ShippedREQ-POS-543
Entitlement-selection render model (apps/pos/src/flow/entitlementSelector.ts) with states idle | loaded | selected | applied, expiry-aware selection (nowIso guard), bigint discount projection via computeDiscountMinor, and backward-compatib…
10h agoapps/pos/src/components/EntitlementSelectorStatus.test.tsapps/pos/src/components/EntitlementSelectorStatus.tsapps/pos/src/flow/entitlementSelector.test.ts - ShippedREQ-POS-550
Printed-receipt line-array builder (apps/pos/src/receipt/buildReceiptLines.ts). Pure buildReceiptLines(input) returns a readonly string[] of 40-column rows (RECEIPT_WIDTH = 40) ready to feed directly to a thermal-printer adapter's printLin…
10h agoapps/pos/src/components/ReceiptLinesStatus.test.tsapps/pos/src/components/ReceiptLinesStatus.tsapps/pos/src/receipt/buildReceiptLines.test.ts+1 more - ShippedREQ-POS-551
POS idle-timeout timer (apps/pos/src/session/idleTimeout.ts). Pure dependency-injected timer: createIdleTimer({ host, timeoutMs?, onIdle }) returns an IdleTimer controller with start() / recordActivity() / stop() and observable status ("ar…
10h agoapps/pos/src/session/idleTimeout.ts×2apps/pos/src/components/IdleTimeoutStatus.test.tsapps/pos/src/components/IdleTimeoutStatus.ts+1 more - ShippedREQ-POS-552
Persisted held carts must be supported by a POS storage wrapper around the existing held-cart state, using an injected string key-value storage interface with no Expo/runtime imports. The wrapper stores serialized cart snapshots, lists hol…
10h agoapps/pos/src/components/PersistedHeldCartStatus.test.tsapps/pos/src/components/PersistedHeldCartStatus.tsapps/pos/src/index.ts - ShippedREQ-POS-553
The POS must include a pure receipt-reprint flow for completed transactions. The flow accepts a looked-up completed transaction and an injected receipt printer, exposes states for idle, ready, printing, complete, and error, guards against…
10h agoapps/pos/src/components/ReceiptReprintStatus.test.tsapps/pos/src/components/ReceiptReprintStatus.tsapps/pos/src/flow/receiptReprint.test.ts+2 more - ShippedREQ-POS-556
POS scan-dispatch status projection (apps/pos/src/components/ScanDispatchStatus.ts). Pure UI-runtime-free helper for the existing scanDispatch result union that maps added, yardage-hint-updated, parse-error, and resolve-error outcomes to c…
10h agoapps/pos/src/components/ScanDispatchStatus.test.tsapps/pos/src/components/ScanDispatchStatus.ts - ShippedREQ-POS-565
POS receipt-delivery queue status projection (apps/pos/src/components/ReceiptDeliveryStatus.ts). Pure UI-runtime-free helper for the existing prepareReceiptDelivery flow that maps print, email, and SMS receipt choices into cashier-facing q…
10h agoapps/pos/src/components/ReceiptDeliveryStatus.test.ts×2apps/pos/src/components/ReceiptDeliveryStatus.ts - ShippedREQ-POS-569
POS manager-gate attempt status projection (apps/pos/src/components/ManagerGateStatus.ts). Pure UI-runtime-free helper for the existing ManagerGateResult and ManagerGateDenialReason types that maps granted, mismatch, locked-out, and no-ver…
10h agoapps/pos/src/components/ManagerGateStatus.test.ts×2apps/pos/src/components/ManagerGateStatus.ts - ShippedREQ-POS-555
POS gift-card balance lookup status projection (apps/pos/src/components/GiftCardBalanceStatus.ts). Pure UI-runtime-free helper for the existing giftCardBalance flow that renders idle, looking-up, found, not-found, and error states into cas…
10h agoapps/pos/src/components/GiftCardBalanceStatus.ts - ShippedREQ-POS-554
POS NFC write flow status projection (apps/pos/src/components/NfcWriteStatus.ts). Pure UI-runtime-free helper for the existing nfcWriteFlow state machine that maps each step (idle, confirming, writing, complete, error) to cashier-facing la…
10h agoapps/pos/src/components/NfcWriteStatus.test.tsapps/pos/src/components/NfcWriteStatus.ts - ShippedREQ-POS-557
POS shift-summary receipt-line status projection (apps/pos/src/components/ShiftSummaryLinesStatus.ts). Pure UI-runtime-free helper for the existing shiftSummaryLines receipt builder that exposes line count, 40-column width health, cash/car…
10h agoapps/pos/src/components/ShiftSummaryLinesStatus.test.tsapps/pos/src/components/ShiftSummaryLinesStatus.ts - ShippedREQ-POS-558
POS critical-path status projection (apps/pos/src/components/CriticalPathStatus.ts). Pure UI-runtime-free helper for the existing CriticalPathState reducer that maps scan, yardage, cart, and tender steps to cashier-facing labels, primary n…
10h agoapps/pos/src/components/CriticalPathStatus.test.tsapps/pos/src/components/CriticalPathStatus.ts - ShippedREQ-POS-559
POS cart-snapshot restore status projection (apps/pos/src/components/CartSnapshotStatus.ts). Pure UI-runtime-free helper around the existing cart snapshot serializer/deserializer that maps save-ready, restored, empty, incompatible, and inv…
10h agoapps/pos/src/components/CartSnapshotStatus.test.tsapps/pos/src/components/CartSnapshotStatus.ts - ShippedREQ-POS-560
POS SKU-ranker explanation status projection (apps/pos/src/components/SkuRankerStatus.ts). Pure UI-runtime-free helper for the existing SKU search ranker that maps a query and result list to ranked display rows with integer score, match re…
10h agoapps/pos/src/components/SkuRankerStatus.test.ts×2apps/pos/src/components/SkuRankerStatus.ts - ShippedREQ-POS-561
POS customer-display payload status projection (apps/pos/src/components/CustomerDisplayStatus.ts). Pure UI-runtime-free helper for the existing buildPosDisplayPayload customer-facing display payload that maps cart total, item count, curren…
10h agoapps/pos/src/components/CustomerDisplayStatus.test.ts×2apps/pos/src/components/CustomerDisplayStatus.ts - ShippedREQ-POS-562
POS physical-scale yardage suggestion status projection (apps/pos/src/components/PhysicalScaleStatus.ts). Pure UI-runtime-free helper for the existing physical-scale reading and buildYardageSuggestionFromWeight function that maps ready, no…
10h agoapps/pos/src/components/PhysicalScaleStatus.test.ts×2apps/pos/src/components/PhysicalScaleStatus.ts - ShippedREQ-POS-563
POS hardware runbook status projection (apps/pos/src/components/HardwareRunbookStatus.ts). Pure UI-runtime-free helper for the existing hardware remediation registry and runbook URL builder that maps a HardwareErrorCode to cashier-facing r…
10h agoapps/pos/src/components/HardwareRunbookStatus.test.ts×2apps/pos/src/components/HardwareRunbookStatus.ts - ShippedREQ-POS-564
POS scanner-timeout outcome status projection (apps/pos/src/components/ScannerTimeoutStatus.ts). Pure UI-runtime-free helper for the existing scanner-timeout flow that maps a scan result string, timeout/null result, timeout window, and opt…
10h agoapps/pos/src/components/ScannerTimeoutStatus.test.ts×2apps/pos/src/components/ScannerTimeoutStatus.ts - ShippedREQ-POS-566
POS refund-flow status projection (apps/pos/src/components/RefundFlowStatus.ts). Pure UI-runtime-free helper for the existing RefundFlowState reducer that maps idle, selecting-lines, selecting-tender, processing, complete, and error states…
10h agoapps/pos/src/components/RefundFlowStatus.test.ts×2apps/pos/src/components/RefundFlowStatus.ts - ShippedREQ-POS-567
POS tender-flow status projection (apps/pos/src/components/TenderFlowStatus.ts). Pure UI-runtime-free helper for the existing TenderState reducer that maps idle, selecting-method, awaiting-card-read, awaiting-cash-entry, completing, comple…
10h agoapps/pos/src/components/TenderFlowStatus.test.ts×2apps/pos/src/components/TenderFlowStatus.ts - ShippedREQ-POS-568
POS device-session status projection (apps/pos/src/components/DeviceSessionStatus.ts). Pure UI-runtime-free helper for the existing DeviceSessionSnapshot and DeviceSessionInfo types that maps valid, not-enrolled, revoked, expired, and offl…
10h agoapps/pos/src/components/DeviceSessionStatus.test.ts×2apps/pos/src/components/DeviceSessionStatus.ts - ShippedREQ-POS-570
POS local-event-bus snapshot status projection (apps/pos/src/components/LocalEventBusStatus.ts). Pure UI-runtime-free helper for the existing LocalPosEvent snapshot shape that maps an immutable event snapshot into cashier/developer-facing…
10h agoapps/pos/src/components/LocalEventBusStatus.test.ts×2apps/pos/src/components/LocalEventBusStatus.ts - ShippedREQ-POS-571
POS connectivity-monitor status projection (apps/pos/src/components/ConnectivityMonitorStatus.ts). Pure UI-runtime-free helper for the existing ConnectivityState monitor shape that maps online, degraded, and offline states plus poll-window…
10h agoapps/pos/src/components/ConnectivityMonitorStatus.test.ts×2apps/pos/src/components/ConnectivityMonitorStatus.ts - ShippedREQ-POS-573
POS receipt-print job status projection (apps/pos/src/components/ReceiptPrintJobStatus.ts). Pure UI-runtime-free helper for the existing PrintRequest and HardwareResult receipt-printer contract that maps queued, printing, printed, failed,…
10h agoapps/pos/src/components/ReceiptPrintJobStatus.test.tsapps/pos/src/components/ReceiptPrintJobStatus.ts - ShippedREQ-POS-574
POS receipt QR-code print status projection (apps/pos/src/components/ReceiptQrCodeStatus.ts). Pure UI-runtime-free helper for the existing ReceiptPrinter.printQrCode(data, size) contract that maps idle, queued, printing, printed, and faile…
10h agoapps/pos/src/components/ReceiptQrCodeStatus.test.tsapps/pos/src/components/ReceiptQrCodeStatus.ts - ShippedREQ-POS-575
POS receipt text-print status projection (apps/pos/src/components/ReceiptTextPrintStatus.ts). Pure UI-runtime-free helper for the existing ReceiptPrinter.printText(lines) contract that maps idle, queued, printing, printed, and failed prefo…
10h agoapps/pos/src/components/ReceiptTextPrintStatus.test.tsapps/pos/src/components/ReceiptTextPrintStatus.ts - ShippedREQ-POS-576
POS cash-drawer open-reason status projection (apps/pos/src/components/CashDrawerOpenReasonStatus.ts). Pure UI-runtime-free helper for the existing CashDrawerOpenReason contract that maps sale, no-sale, and manager-override drawer-open rea…
10h agoapps/pos/src/components/CashDrawerOpenReasonStatus.ts - ShippedREQ-POS-577
POS scanner-cancellation status projection (apps/pos/src/components/ScannerCancellationStatus.ts). Pure UI-runtime-free helper for the existing ScannerCancellationToken contract that maps idle, active, cancelled, completed, and failed scan…
10h agoapps/pos/src/components/ScannerCancellationStatus.ts - ShippedREQ-POS-578
POS cash-drawer last-opened status projection (apps/pos/src/components/CashDrawerLastOpenedStatus.ts). Pure UI-runtime-free helper for the existing CashDrawer.lastOpenedAt() result that maps never-opened, recent, stale, future-clock, and i…
10h agoapps/pos/src/components/CashDrawerLastOpenedStatus.ts - ShippedREQ-POS-579
POS cash-drawer open-result status projection (apps/pos/src/components/CashDrawerOpenResultStatus.ts). Pure UI-runtime-free helper for the existing HardwareResult returned by CashDrawer.open(reason) that maps idle/no-result, opening, opene…
10h agoapps/pos/src/components/CashDrawerOpenResultStatus.ts - ShippedREQ-POS-580
POS cash-drawer shift-close checklist status projection (apps/pos/src/components/CashDrawerShiftCloseStatus.ts). Pure UI-runtime-free helper for caller-provided drawer shift-close state that maps closeout step, physical drawer status, last…
10h agoapps/pos/src/components/CashDrawerShiftCloseStatus.ts - ShippedREQ-POS-581
POS cash-drawer variance-review status projection (apps/pos/src/components/CashDrawerVarianceReviewStatus.ts). Pure UI-runtime-free helper for caller-provided drawer expected/count cash amounts and reviewer state that maps balanced, under,…
10h agoapps/pos/src/components/CashDrawerVarianceReviewStatus.ts - ShippedREQ-POS-582
POS cash-drawer safe-drop status projection (apps/pos/src/components/CashDrawerSafeDropStatus.ts). Pure UI-runtime-free helper for caller-provided safe-drop recommendation and register drawer-cash amounts that maps not-needed, recommended,…
10h agoapps/pos/src/components/CashDrawerSafeDropStatus.ts - ShippedREQ-POS-583
POS cash-drawer safe-drop receipt status projection (apps/pos/src/components/CashDrawerSafeDropReceiptStatus.ts). Pure UI-runtime-free helper for caller-provided safe-drop receipt metadata and print-result state that maps idle, preparing,…
10h agoapps/pos/src/components/CashDrawerSafeDropReceiptStatus.ts - ShippedREQ-POS-584
POS cash-drawer safe-drop custody status projection (apps/pos/src/components/CashDrawerSafeDropCustodyStatus.ts). Pure UI-runtime-free helper for caller-provided safe-drop custody metadata that maps unrecorded, needs-envelope, needs-witnes…
10h agoapps/pos/src/components/CashDrawerSafeDropCustodyStatus.ts - ShippedREQ-POS-585
POS cash-drawer safe-drop audit status projection (apps/pos/src/components/CashDrawerSafeDropAuditStatus.ts). Pure UI-runtime-free helper for caller-provided safe-drop audit metadata that maps missing-record, draft, pending-manager-review,…
10h agoapps/pos/src/components/CashDrawerSafeDropAuditStatus.ts - ShippedREQ-POS-586
POS cash-drawer safe-drop deposit-batch status projection (apps/pos/src/components/CashDrawerSafeDropDepositBatchStatus.ts). Pure UI-runtime-free helper for caller-provided safe-drop deposit-batch metadata that maps unqueued, queued, ready…
10h agoapps/pos/src/components/CashDrawerSafeDropDepositBatchStatus.ts - ShippedREQ-POS-587
POS cash-drawer safe-drop bank-deposit handoff status projection (apps/pos/src/components/CashDrawerSafeDropBankDepositStatus.ts). Pure UI-runtime-free helper for caller-provided safe-drop bank-deposit handoff metadata that maps not-starte…
10h agoapps/pos/src/components/CashDrawerSafeDropBankDepositStatus.ts - ShippedREQ-POS-588
POS cash-drawer safe-drop exception-resolution status projection (apps/pos/src/components/CashDrawerSafeDropExceptionResolutionStatus.ts). Pure UI-runtime-free helper for caller-provided safe-drop exception metadata that maps none, open, i…
10h agoapps/pos/src/components/CashDrawerSafeDropExceptionResolutionStatus.ts - ShippedREQ-POS-589
POS cash-drawer safe-drop reconciliation status projection (apps/pos/src/components/CashDrawerSafeDropReconciliationStatus.ts). Pure UI-runtime-free helper for caller-provided safe-drop reconciliation metadata that maps not-started, matchi…
10h agoapps/pos/src/components/CashDrawerSafeDropReconciliationStatus.ts - ShippedREQ-POS-590
POS cash-drawer safe-drop compliance-report status projection (apps/pos/src/components/CashDrawerSafeDropComplianceReportStatus.ts). Pure UI-runtime-free helper for caller-provided safe-drop compliance-report metadata that maps not-started…
10h agoapps/pos/src/components/CashDrawerSafeDropComplianceReportStatus.ts - In progressREQ-POS-591
POS receipt-reprint audit record builder (apps/pos/src/flow/receiptReprintAudit.ts). Pure helper for completed receipt-reprint flow states that returns audit-safe metadata for pos.receipt.reprinted, including transaction ID, receipt refere…
apps/pos/src/flow/receiptReprintAudit.test.ts - ShippedREQ-POS-592
POS receipt-reprint audit status projection (apps/pos/src/components/ReceiptReprintAuditStatus.ts). Pure UI-runtime-free helper for receipt-reprint audit outcomes that maps idle, recording, recorded, and error states into cashier/manager-f…
10h agoapps/pos/src/components/ReceiptReprintAuditStatus.test.tsapps/pos/src/components/ReceiptReprintAuditStatus.ts - ShippedREQ-POS-593
POS receipt-reprint audit queue status projection (apps/pos/src/components/ReceiptReprintAuditQueueStatus.ts). Pure UI-runtime-free helper for caller-provided receipt-reprint audit queue metadata that maps empty, queued, uploading, uploade…
10h agoapps/pos/src/components/ReceiptReprintAuditQueueStatus.test.tsapps/pos/src/components/ReceiptReprintAuditQueueStatus.ts - In progressREQ-POS-594
POS receipt-reprint audit public exports (apps/pos/src/index.ts). The @bolttocart/pos package root must export the receipt-reprint audit status and audit queue status projection builders plus their public model/input/action types so Expo s…
apps/pos/src/index.test.ts - ShippedREQ-POS-595
(AI-proposed; parent REQ-POS-006, REQ-POS-022, REQ-POS-023, REQ-POS-591) POS receipt-reprint audit queue reducer (apps/pos/src/flow/receiptReprintAuditQueue.ts). Pure helper for staging completed receipt-reprint audit records locally befor…
10h agoapps/pos/src/flow/receiptReprintAuditQueue.test.tsapps/pos/src/index.test.tsapps/pos/src/index.ts - ShippedREQ-POS-596
POS cart-edit public exports (apps/pos/src/index.ts). AI-proposed clarification of REQ-POS-004 and REQ-POS-502: the @bolttocart/pos package root must export the existing pure cart-edit reducers removeCartLine and updateCartLineYardage so E…
10h agoapps/pos/src/components/CartEditStatus.tsapps/pos/src/index.test.tsapps/pos/src/index.ts - In progressREQ-POS-597
POS line-item display public exports (apps/pos/src/index.ts). AI-proposed clarification of REQ-POS-004, REQ-POS-502, and REQ-POS-544: the @bolttocart/pos package root must export the existing pure line-item display status builder plus its…
apps/pos/src/index.test.ts - ShippedREQ-POS-598
POS cart-edit status projection (apps/pos/src/components/CartEditStatus.ts). AI-proposed clarification of REQ-POS-004, REQ-POS-502, and REQ-POS-596: the POS must expose a pure UI-runtime-free projection for the mid-transaction line edit su…
10h agoapps/pos/src/components/CartEditStatus.test.tsapps/pos/src/components/CartEditStatus.tsapps/pos/src/index.test.ts - In progressREQ-POS-599
POS receipt-reprint audit queue status adapter (apps/pos/src/components/ReceiptReprintAuditQueueStatus.ts). AI-proposed clarification of REQ-POS-006, REQ-POS-022, REQ-POS-023, REQ-POS-593, and REQ-POS-595: the POS package must provide a pu…
apps/pos/src/components/ReceiptReprintAuditQueueStatus.test.tsapps/pos/src/index.test.ts - ShippedREQ-POS-600
POS checkout-readiness status projection (apps/pos/src/components/CheckoutReadinessStatus.ts). AI-proposed clarification of REQ-POS-001, REQ-POS-005, and REQ-POS-021: before a cashier can leave cart review for tender selection, the POS mus…
10h agoapps/pos/src/components/CheckoutReadinessStatus.test.tsapps/pos/src/components/CheckoutReadinessStatus.tsapps/pos/src/index.test.ts+1 more - ShippedREQ-POS-601
POS cart-line list public exports (apps/pos/src/index.ts). AI-proposed clarification of REQ-POS-004, REQ-POS-506, and REQ-POS-544: the @bolttocart/pos package root must export the existing pure cart-line list projection and designer/collec…
10h agoapps/pos/src/index.test.tsapps/pos/src/index.ts - In progressREQ-POS-602
POS cash-drawer open status public exports (apps/pos/src/index.ts). AI-proposed clarification of REQ-POS-024, REQ-POS-031, REQ-POS-576, REQ-POS-578, and REQ-POS-579: the @bolttocart/pos package root must export the existing pure cash-drawe…
apps/pos/src/index.test.ts - ShippedREQ-POS-603
POS SKU-search public exports (apps/pos/src/index.ts). AI-proposed clarification of REQ-POS-003 and REQ-POS-026: the @bolttocart/pos package root must export the existing pure SKU-search state machine and SKU-search result projection so Ex…
10h agoapps/pos/src/index.ts×2apps/pos/src/index.test.ts - ShippedREQ-POS-604
POS cart totals public exports (apps/pos/src/index.ts). AI-proposed clarification of REQ-POS-004, REQ-POS-502, REQ-POS-545, and REQ-POS-550: the @bolttocart/pos package root must export the existing pure cart totals helper, stub tax consta…
10h agoapps/pos/src/index.test.tsapps/pos/src/index.ts - ShippedREQ-POS-605
(AI-proposed; parent REQ-POS-001, REQ-POS-004, REQ-POS-022, REQ-POS-023, REQ-SYN-011, REQ-SYN-020) POS cart conflict status projection (apps/pos/src/components/CartConflictStatus.ts). Pure UI-runtime-free helper for the reconciliation bann…
10h agoapps/pos/src/components/CartConflictStatus.test.ts×2apps/pos/src/components/CartConflictStatus.tsapps/pos/src/index.test.ts+1 more - ShippedREQ-POS-606
POS scan-dispatch public exports (apps/pos/src/index.ts). AI-proposed clarification of REQ-POS-001, REQ-POS-003, REQ-POS-020, REQ-POS-502, REQ-POS-510, and REQ-POS-556: the @bolttocart/pos package root must export the existing pure scan-di…
10h agoapps/pos/src/index.ts×2apps/pos/src/index.test.ts
REQ-ECOE-commerce Storefront37 shipped0 wip17 todo69%
- ShippedREQ-ECO-001
Each store gets a storefront on a branded subdomain and optionally a custom domain with SSL provisioned automatically (see �29). The apex bolttocart.com hosts only platform marketing / sign-up surfaces ??? storefront paths (/shop, /cart, /…
2m agopackages/testing/src/catalog.test.ts×2apps/web/src/app/(storefront)/shop/page.tsxapps/web/src/lib/auth.ts+5 more - Not startedREQ-ECO-002
Storefronts must share the same inventory, pricing, and promotion engines as the POS (�3.1, �7).
- ShippedREQ-ECO-003
Support yardage-based purchasing with minimum cut (default � yard) and increment (default � yard) configurable per product.
2m agoapps/web/src/components/AddToCartForm.tsx×4apps/web/src/app/(storefront)/cart/actions.ts×2apps/web/src/app/globals.css×2+8 more - ShippedREQ-ECO-004
Product detail pages must show real-time availability, remnant availability, related kits/patterns, and substitutions when out of stock.
2m agoapps/web/src/app/(storefront)/shop/[slug]/page.tsx×3apps/web/src/lib/storefront.ts×2packages/db/src/repositories/skus.ts×2+8 more - ShippedREQ-ECO-005
Checkout must support guest and authenticated purchase, address validation, shipping method selection, tax computation, payment, and order confirmation within the UX latency targets in �28.
10h agoapps/web/src/app/(storefront)/cart/actions.ts×2apps/web/src/app/(storefront)/cart/page.tsxapps/web/src/app/(storefront)/events/[slug]/actions.ts+6 more - ShippedREQ-ECO-006
Order workflow: Received ??? Cut ??? Pack ??? Ship ??? Delivered, with partial fulfillment permitted.
10h agoapps/web/src/app/(storefront)/cart/confirmation/page.tsx - ShippedREQ-ECO-007
Storefront pages must be server-rendered or statically pre-rendered for SEO, with structured data (Product, Offer, Breadcrumb, Event) and auto-generated sitemaps.
10h agoapps/web/src/app/(storefront)/shop/[slug]/page.tsx×3apps/web/src/lib/dropStructuredData.ts×2apps/web/src/app/(storefront)/shop/[slug]/opengraph-image.tsx+5 more - Not startedREQ-ECO-008
Optional one-way integrations with external storefronts (Shopify, WooCommerce) must be available as add-ons; BoltToCart remains the inventory source of truth.
- ShippedREQ-ECO-500
The /shop/[slug] product detail page's Offer JSON-LD must carry a UnitPriceSpecification declaring unitCode: "YRD" (UN/CEFACT yard) with a referenceQuantity of 1 yard for unitOfSale === "by_yard" SKUs, so Google Shopping / Merchant / Bing…
10h agoapps/web/src/lib/productStructuredData.test.tsapps/web/src/lib/productStructuredData.ts - ShippedREQ-ECO-501
The /shop index "Browse by???" nav must list every facet-index sibling (/shop/designers, /shop/collections, /shop/colors, /shop/fibers, /shop/widths ??? see REQ-SRC-500 / REQ-SRC-501) in a single alphabetized data-driven list so new facet…
2m agoapps/web/src/app/(storefront)/shop/page.tsx×2 - ShippedREQ-ECO-502
The /shop/[slug] PDP must render a RelatedItemsStrip below the soft-match "Related fabrics" shelf, returning up to 6 SKUs matching the seed on both designer AND fiberContent. Lives in a dedicated loadRelatedByDesignerAndFiber loader so the…
10h agoapps/web/src/app/(storefront)/shop/[slug]/page.tsxapps/web/src/components/RelatedItemsStrip.tsxapps/web/src/lib/productStructuredData.ts+1 more - ShippedREQ-ECO-503
The /shop PLP must render a ShopEmptyState block when the filter-and-sort combination lands on zero SKUs. The block surfaces (1) the current active filter chips as one-tap "remove this facet" links (reusing ActiveFilterChips so single-chip…
10h agoapps/web/src/components/ShopEmptyState.tsx - ShippedREQ-ECO-504
The /shop/[slug] PDP JSON-LD must include Product.isRelatedTo as an array of up to 6 @id references pointing at the same roster rendered in the RelatedItemsStrip (REQ-ECO-502) ??? keeping the structured-data claim in lockstep with the visi…
10h agoapps/web/src/lib/productStructuredData.ts×2apps/web/src/lib/productStructuredData.test.ts - ShippedREQ-ECO-505
The /shop/[slug] route must serve a per-slug OpenGraph card at /shop/{slug}/opengraph-image (Next.js metadata-convention colocated asset) that renders the product name, per-yard price, designer, and fiber content inside the platform OgBolt…
10h agoapps/web/src/lib/productStructuredData.test.ts×4apps/web/src/app/(storefront)/shop/[slug]/opengraph-image.tsx×2apps/web/src/lib/productStructuredData.ts×2+1 more - ShippedREQ-ECO-506
The /shop/[slug] PDP BreadcrumbList JSON-LD must be extended from "Home ??? Shop ??? [Product]" to include the SKU's collection (when non-null) as an intermediate crumb pointing at /shop?collection=<value> and the designer (when non-null)…
10h agoapps/web/src/app/(storefront)/shop/[slug]/page.tsx×3 - ShippedREQ-ECO-507
The /shop/collections route exposes a facet-index page listing every fabric collection name (with current cuttable-SKU counts) as a bookmarkable discovery surface, deep-linking to /shop?collection=<value> for the filtered catalog view. Mir…
10h agoapps/web/src/app/(storefront)/shop/collections/page.tsx - ShippedREQ-ECO-509
The /shop/colors route exposes a color facet-index page listing every color tag in the catalog (with current cuttable-SKU counts and visual swatch dots) as a bookmarkable discovery surface, deep-linking to /shop?color=<value> for the filte…
10h agoapps/web/src/app/(storefront)/shop/colors/page.tsx - ShippedREQ-ECO-510
The tenant sitemap (sitemap.ts tenant branch) must include /shop/fibers, /shop/widths, and /events/instructors as static entries so these discovery surfaces (REQ-SRC-500, REQ-SRC-501, REQ-EVT-505) are visible to crawlers. Each gets priorit…
10h agoapps/web/src/app/sitemap.ts - ShippedREQ-ECO-511
The /visualizer route must serve a colocated opengraph-image.tsx (Edge runtime, no DB call) rendering "Quilt Designer" / "Design. Preview. Add to cart." inside the platform OgBoltCard frame. Page metadata.openGraph.images references this r…
10h agoapps/web/src/app/(storefront)/shop/collections/opengraph-image.tsxapps/web/src/app/(storefront)/shop/colors/opengraph-image.tsxapps/web/src/app/(storefront)/shop/designers/opengraph-image.tsx+4 more - ShippedREQ-ECO-512
The /visualizer page must emit a JSON-LD @graph with a WebPage node and BreadcrumbList (Home ??? Quilt Designer) to match the structured-data posture of /drops and /events. ItemList is intentionally omitted ??? the fabric palette is client…
10h agoapps/web/src/app/(storefront)/visualizer/page.tsx - ShippedREQ-ECO-518
The /shop PLP header gains a "New arrivals" link pointing to /shop?new=1 alongside the RSS autodiscovery link (REQ-ECO-518).
2m agoapps/web/src/app/(storefront)/shop/page.tsx - ShippedREQ-ECO-545
Tenant storefronts must render /shop through a schema-driven theme/template engine backed by the store's persisted storefront_theme_config. The engine must support six fabric-retail templates (boutique, modern, designer, discount, workshop…
2m agoapps/web/src/lib/storefrontThemeConfig.test.tspackages/db/src/migrations/0037_storefront_theme_config.sqlpackages/db/src/schema/stores.ts+1 more - ShippedREQ-ECO-521
The /shop/[slug] PDP SpecList Width row links to /shop/widths when bolt.widthInches is non-null, doubling it as a discovery path. Value displays as N" (WOF). Same href + aria-label as Designer and Collection rows. No DB change.
10h agoapps/web/src/app/(storefront)/shop/[slug]/page.tsx - ShippedREQ-ECO-523
Cart summary Shipping row gains a truck icon for visual distinction from the yardage/items rows (REQ-ECO-523).
10h agoapps/web/src/app/(storefront)/cart/page.tsx - ShippedREQ-ECO-524
The /cart order-summary shows a full breakdown when a coupon is applied: Subtotal row, coupon-discount line (code + negative emerald amount), and a Total row (subtotal minus discountMinor, bigint). No extra rows when no coupon is active.
10h agoapps/web/src/app/(storefront)/cart/page.tsx×2apps/web/src/app/globals.css - ShippedREQ-ECO-525
The /shop/[slug] PDP SpecList emits a Fiber row when fiberContent is non-null. The row label ("Fiber") links to /shop/fibers and the value links to /shop?fiber=<value>, matching the Collection row pattern (REQ-ECO-506). No DB change.
10h agoapps/web/src/app/(storefront)/shop/[slug]/page.tsx - ShippedREQ-ECO-526
The /shop/[slug] PDP JSON-LD Product.additionalProperty array carries each non-null spec field as a schema.org/PropertyValue entry (fiberContent, widthInches). weightGsm and originCountry are deferred pending schema migration. Enables Goog…
10h agoapps/web/src/lib/productStructuredData.ts×2 - ShippedREQ-ECO-529
The /shop/[slug] PDP "Recently viewed" strip limit raised from 4 to 6 (REQ-ECO-529). Strip is already last in render order (after RelatedFabrics and RelatedItemsStrip) and already hides when the cookie list is empty. Uses the RelatedCardSt…
10h agoapps/web/src/app/(storefront)/shop/[slug]/page.tsx - Not startedREQ-ECO-534
DEFERRED-AUDIT: Neither shippingEstimator (packages/core) nor a preferred fulfillmentMode field on the cart state currently exists. Both are prerequisites for the "Estimated delivery window" line. This requirement is deferred until: (1) a…
- ShippedREQ-ECO-535
The /shop page quick-filter strip must include a third shortcut, "Remnants & last cuts", linking to /shop?low-yardage=1 alongside "New arrivals" and "Back in stock". The link must live in the existing <ul aria-label="Quick filters">, prese…
2m agoapps/web/src/app/(storefront)/shop/page.tsx - ShippedREQ-ECO-536
The /shop/[slug] PDP Specs "Width" row must mirror the Fiber row's two-intent discovery model. When widthInches is non-null, the row label links to /shop/widths with an accessible label for browsing all widths, while the row value links to…
10h agoapps/web/src/app/(storefront)/shop/[slug]/page.tsx - ShippedREQ-ECO-537
The /shop/[slug] PDP Care block must provide fiber discovery links whenever fiberContent is present. If keyword-based care tips render, append links to /shop?fiber=<fiberContent> and /shop/fibers. If no known care keyword matches, render a…
10h agoapps/web/src/app/(storefront)/shop/[slug]/page.tsx - ShippedREQ-ECO-533
The /cart line-item row "Save for later" button is now hidden when the SKU is already on the customer's wishlist. heartedIds are loaded from loadHeartedSkuIds(cartSkuIds) and checked per item. The saveCartItemForLaterFormAction (already pr…
10h agoapps/web/src/app/(storefront)/cart/page.tsx×2 - ShippedREQ-ECO-532
The /shop filter rail gains a "Remnants & last cuts" toggle (Yardage section) that filters to SKUs with availableSixteenths between 1 and MIN_YARDAGE_SIXTEENTHS * 2n (1 yd). Parsed as ?low-yardage=1; the web loader translates it to minAvai…
10h agoapps/web/src/lib/storefront.ts×2apps/web/src/components/StorefrontFilters.tsxpackages/db/src/repositories/skus.ts+1 more - ShippedREQ-ECO-531
The /shop sort dropdown gains price-per-yard-asc (label: "Per yard???") and price-per-yard-desc (label: "Per yard???") sort keys. Both order by pricePerYardMinor (same predicate as price-low/price-high); the separate keys surface the unit…
10h agoapps/web/src/lib/storefront.ts×2 - ShippedREQ-ECO-530
The /shop PLP adds a FilterSummaryPill server component that renders "N fabrics ? M filters ? remove all" above the ActiveFilterChips when at least one predicate is active. "Remove all" links to /shop. No new props; uses the already-presen…
2m agoapps/web/src/app/(storefront)/shop/page.tsx×2 - ShippedREQ-ECO-528
The /shop PLP header gains "New arrivals" and "Back in stock" quick-filter links pointing at /shop?new=only and /shop?restocked=1. restockedOnly is parsed in parseStorefrontFilters, included in hasActiveFilters, serialised by buildShopHref…
2m agoapps/web/src/lib/storefront.ts×3apps/web/src/app/(storefront)/shop/page.tsxpackages/db/src/repositories/skus.ts+1 more - Not startedREQ-ECO-527
DEFERRED AUDIT ? /shop/themes facet-index page: the catalog schema has no themeTag column as of 2026-04-23. No migration added. Revisit when the merchandising schema gains a theme/style tag (reserved REQ-ID: REQ-ECO-527). Pattern would mir…
- ShippedREQ-ECO-508
The /cart page must render a coupon-code entry field (REQ-ECO-508, REQ-PRI-050 cart-time validation). A client component CartCouponSection renders either the code-entry form or the applied-coupon chip. The applyCouponCodeAction server acti…
10h agoapps/web/src/app/(storefront)/cart/actions.ts×3apps/web/src/app/(storefront)/cart/couponCookie.tsapps/web/src/components/CartCouponSection.tsx - Not startedREQ-ECO-538
The /cart page must run a live tenant-scoped availability recheck for every cart line before rendering checkout actions. Lines whose requested yardage exceeds currently cuttable inventory must show an inline correction state with the reque…
- ShippedREQ-ECO-539
The /cart page must expose a print-friendly quote view for in-store handoff. The printed quote includes store name, generated timestamp, cart line names, yardage, unit prices, subtotal, applied coupon preview if present, and a scannable or…
10h agoapps/web/src/app/(storefront)/cart/actions.ts - Not startedREQ-ECO-540
The /shop/[slug] PDP yardage selector must render a deterministic line-total preview and remaining-yardage warning as the shopper changes yardage. The preview uses bigint minor-unit math, honors the existing minimum/increment rules, and su…
- Not startedREQ-ECO-541
The /shop listing must provide a URL-driven "available today" filter that returns only SKUs with at least one cuttable bolt above the configured minimum cut. The filter composes with existing designer, collection, color, fiber, width, sear…
- Not startedREQ-ECO-542
The storefront shell cart indicator must display the current cart item count and subtotal from the existing cart cookie model on storefront pages where cookies are available. The indicator links to /cart, degrades to count-only when subtot…
- Not startedREQ-ECO-543
The /cart/confirmation page must render a next-step panel for overnight MVP orders that distinguishes pickup, shipping, and class/event follow-up paths where that metadata exists, and otherwise shows a generic "order received" state. The p…
- ShippedREQ-ECO-544
The storefront /shop and /cart pages must emit product analytics funnel intents through apps/web/src/lib/telemetry.ts for cart-viewed, checkout-blocked-by-inventory, quote-printed, and checkout-started. Payloads include tenant id, cart lin…
10h agoapps/web/src/app/(storefront)/cart/actions.ts - Not startedREQ-ECO-558
The /cart print quote must include a generated timestamp and the resolved tenant storefront label so an in-store handoff can be reconciled to the right shop and print moment without creating an order.
- Not startedREQ-ECO-559
Cart availability correction alerts must deep-link to the affected cart line so a shopper with a long cart can jump from the warning to the exact item that needs adjustment.
- Not startedREQ-ECO-560
The disabled checkout state on /cart must disclose the number of blocking availability corrections, not only a generic disabled reason.
- Not startedREQ-ECO-561
The cart quote print button must expose a pending state via visible text and an ARIA live announcement while the telemetry action records the print intent.
- Not startedREQ-ECO-562
The /cart/confirmation next-step panel must include an admin handoff link for demo operators without implying real payment or fulfillment occurred.
- Not startedREQ-ECO-563
The /shop quick-filter strip must include a "Clear quick filters" escape when any quick-filter style predicate is active.
- Not startedREQ-ECO-564
The /shop/[slug] availability panel must show the minimum cut rule alongside current availability so stock state and purchasing constraint are visible before the yardage form.
- Not startedREQ-ECO-565
The storefront shell cart link must expose the subtotal as visible text on tablet/desktop and as a screen-reader-only subtotal on smaller viewports.
REQ-FULFulfillment, Shipping & Returns8 shipped0 wip470 todo2%
- Not startedREQ-FUL-001
Provide a pick-and-pack UI that batches cuts across orders by bolt for efficiency.
- Not startedREQ-FUL-002
Integrate with shipping-rate and label providers to quote rates at checkout, purchase labels, and capture tracking numbers.
- Not startedREQ-FUL-005
Returns: configurable policy per product class. Default: cut fabric is non-returnable; precuts, notions, and unopened kits are returnable within a configurable window.
- Not startedREQ-FUL-006
Refunds must support original-tender, store credit, and gift card, with tax correctly reversed.
- Not startedREQ-FUL-007
RMA workflow must generate a prepaid label when the store policy allows, and reconcile inventory on receipt.
- ShippedREQ-FUL-503
Creates /admin/fulfillment/[orderId]/page.tsx (fulfillment detail page) with an inline "Send shipping notification" form. The Server Action emits an email.queued@1 event into the transactional outbox with templateKey: "order_shipped" — reu…
10h agoapps/web/src/app/admin/fulfillment/[orderId]/actions.ts×2apps/web/src/app/admin/fulfillment/[orderId]/page.tsx×2apps/web/src/app/admin/fulfillment/[orderId]/SendShippingNotificationForm.tsx+1 more - ShippedREQ-FUL-504
/admin/fulfillment grid adds a URL-driven status filter chip row (pending / processing / ready_for_pickup / fulfilled / cancelled) via buildFulfillmentHref(status) helper. The default view (?status= absent) still shows the active pick queu…
10h agoapps/web/src/app/admin/fulfillment/page.tsx×5apps/web/src/app/admin/fulfillment/[orderId]/return/RmaForm.tsxapps/web/src/app/admin/fulfillment/[orderId]/return/actions.ts+1 more - ShippedREQ-FUL-505
STOP — rma.reasonText column does not exist in the orders schema. Adding a reason field requires a schema migration — coordination-lane work.
10h agoapps/web/src/app/admin/fulfillment/[orderId]/ship/page.tsx×2packages/db/src/migrations/0034_return_authorizations.sql×2apps/web/src/app/admin/fulfillment/[orderId]/ship/actions.ts+3 more - ShippedREQ-FUL-502
/admin/fulfillment/[orderId]/return RMA initiation page. Captures return reason (dropdown), refund amount (max = order total), and internal notes. Execution (Stripe refund, refunded status, order.refunded@1 event) deferred to carrier-API +…
10h agoapps/web/src/app/admin/orders/[id]/page.tsx - ShippedREQ-FUL-501
/admin/fulfillment/[orderId]/ship shipping rate capture page. Carrier dropdown, tracking number, and shipping cost fields. Label purchase and order-status advancement deferred to carrier-API integration outside this lane's path fence.
10h agoapps/web/src/app/admin/fulfillment/[orderId]/ship/page.tsxapps/web/src/app/admin/orders/[id]/page.tsx - ShippedREQ-FUL-500
/admin/fulfillment pick-and-pack queue. Lists pending/processing/ready_for_pickup orders oldest-first with status badges, channel, total, and Ship/View action buttons. Inline Drizzle SELECT (no ordersRepo.list yet). Bolt grouping placehold…
10h agoapps/web/src/app/admin/fulfillment/page.tsx - ShippedREQ-FUL-506
The /admin/fulfillment queue must add URL-driven channel filter chips for all, storefront, POS, API, imported, and unknown-source orders, preserving the active status filter and showing per-channel counts from the loaded order window.
10h agoapps/web/src/app/admin/fulfillment/BulkFulfillmentActions.tsx - ShippedREQ-FUL-507
The /admin/fulfillment/fulfillment.csv export must honor the same ?status= and ?channel= filters as the on-screen fulfillment queue so downloaded pick lists match the visible cohort.
10h agoapps/web/src/app/admin/fulfillment/fulfillment.csv/route.ts - Not startedREQ-FUL-508
The /admin/fulfillment table must render human-readable source labels instead of raw source strings while preserving the raw value in a title for debugging.
- Not startedREQ-FUL-509
The /admin/fulfillment summary strip must include an oldest-visible-order age tile so staff can spot stale pick queues without scanning every row.
- Not startedREQ-FUL-510
The /admin/fulfillment table must include a per-row copy-order-id affordance for warehouse/support handoffs.
- Not startedREQ-FUL-511
The /admin/fulfillment/[orderId] detail page must include a copy-order-id affordance in the header/action area.
- Not startedREQ-FUL-512
The /admin/fulfillment/[orderId] detail page must render a read-only fulfillment checklist for placed, picking, ready, shipped/fulfilled, and notification-eligible states, derived only from the persisted order status.
- Not startedREQ-FUL-513
/admin/fulfillment must render an active-filter summary whenever status or channel filters are active, including a clear-all link back to the default active queue.
- Not startedREQ-FUL-514
/admin/fulfillment must include a visible total value tile summing the currently filtered queue's order totals in minor-unit-safe integer math.
- Not startedREQ-FUL-515
/admin/fulfillment/[orderId] must expose a print-pick-sheet action in the header action strip, hidden from print output.
- Not startedREQ-FUL-516
/admin/fulfillment/[orderId] must expose a copy-payment-reference affordance when the order carries a Stripe PaymentIntent id.
- Not startedREQ-FUL-517
/admin/fulfillment/[orderId] must render human-readable source labels while preserving the raw source value in a title attribute.
- Not startedREQ-FUL-518
/admin/fulfillment/fulfillment.csv must include total_minor alongside the human-readable USD amount for reconciliation-safe imports.
- Not startedREQ-FUL-519
/admin/fulfillment/fulfillment.csv must include customer_id as a separate column so staff can join exports back to customer records without parsing email.
- Not startedREQ-FUL-520
/admin/fulfillment/fulfillment.csv must include placed_at as a full ISO-8601 timestamp in addition to the date-only placed field.
- Not startedREQ-FUL-521
/admin/fulfillment must expose a copy-visible-order-ids action when the filtered queue has rows, copying one UUID per line for warehouse and support handoffs.
- Not startedREQ-FUL-522
/admin/fulfillment must expose a print-current-view action for the currently visible fulfillment queue, hidden from print output.
- Not startedREQ-FUL-523
/admin/fulfillment status filter chips must show per-status counts computed from the channel-filtered loaded order window, plus an active-queue count for the default view.
- Not startedREQ-FUL-524
/admin/fulfillment empty states must name the active status/channel filters and include a clear-all link whenever filters are hiding all rows.
- Not startedREQ-FUL-525
/admin/fulfillment placed-date cells must expose the full placed timestamp in a title while keeping the compact date text visible.
- Not startedREQ-FUL-526
/admin/fulfillment/[orderId]/ship must expose a copy-order-id affordance in the header/action area for shipping desk handoffs.
- Not startedREQ-FUL-527
/admin/fulfillment/[orderId]/ship must expose a print-shipping-worksheet action, hidden from print output.
- Not startedREQ-FUL-528
/admin/fulfillment/[orderId]/ship must expose a copy-payment-reference affordance when the order carries a Stripe PaymentIntent id.
- Not startedREQ-FUL-529
/admin/fulfillment/[orderId]/ship must render a human-readable source label while preserving the raw source value in a title attribute.
- Not startedREQ-FUL-530
/admin/fulfillment/[orderId]/ship must render a read-only shipping checklist for ready status, manual label purchase, tracking capture, and notification follow-up, derived only from persisted order fields and the existing workflow.
- Not startedREQ-FUL-531
/admin/fulfillment/[orderId]/return must expose a copy-order-id affordance in the header/action area for RMA handoffs.
- Not startedREQ-FUL-532
/admin/fulfillment/[orderId]/return must expose a print-RMA-worksheet action, hidden from print output.
- Not startedREQ-FUL-533
/admin/fulfillment/[orderId]/return must expose a copy-payment-reference affordance when the order carries a Stripe PaymentIntent id.
- Not startedREQ-FUL-534
/admin/fulfillment/[orderId]/return must render a human-readable source label while preserving the raw source value in a title attribute.
- Not startedREQ-FUL-535
/admin/fulfillment/[orderId]/return must render a read-only RMA eligibility checklist for fulfilled status, manual refund processing, reason capture, and inventory review follow-up, derived only from persisted order fields and the existing…
- Not startedREQ-FUL-536
/admin/fulfillment row actions must include a direct pick-sheet link to /admin/fulfillment/[orderId] so warehouse staff do not have to detour through the full order detail page.
- Not startedREQ-FUL-537
/admin/fulfillment truncated order identifiers must preserve the full order id in a title attribute for visual verification during support calls.
- Not startedREQ-FUL-538
/admin/fulfillment placed-date cells must include a compact relative age beside the date so stale rows are visible without scanning the summary strip.
- Not startedREQ-FUL-539
/admin/fulfillment summary strip must include a pending-order count for the currently filtered queue.
- Not startedREQ-FUL-540
/admin/fulfillment summary strip must include a processing-order count for the currently filtered queue.
- Not startedREQ-FUL-541
/admin/fulfillment summary strip must include a ready-for-pickup count for the currently filtered queue.
- Not startedREQ-FUL-542
/admin/fulfillment/[orderId] placed-date summary must preserve the full placed timestamp in a title attribute while keeping the compact date visible.
- Not startedREQ-FUL-543
/admin/fulfillment/[orderId] must expose a copy-fulfillment-handoff-summary action containing order id, status, source, total, and placed timestamp.
- Not startedREQ-FUL-544
/admin/fulfillment/[orderId] status badges must preserve the raw persisted status in a title attribute.
- Not startedREQ-FUL-545
/admin/fulfillment/[orderId] action navigation must expose a Return/RMA link for fulfilled orders, using the existing RMA flow.
- Not startedREQ-FUL-546
/admin/fulfillment/[orderId]/ship must expose a copy-shipping-handoff-summary action containing order id, status, source, total, and placed timestamp.
- Not startedREQ-FUL-547
/admin/fulfillment/[orderId]/ship must render a status badge in the header with the raw persisted status preserved in a title attribute.
- Not startedREQ-FUL-548
/admin/fulfillment/[orderId]/ship navigation must include a link back to the fulfillment pick sheet for the same order.
- Not startedREQ-FUL-549
/admin/fulfillment/[orderId]/return must expose a copy-RMA-handoff-summary action containing order id, status, source, total, and eligibility.
- Not startedREQ-FUL-550
/admin/fulfillment/[orderId]/return navigation must include a link back to the fulfillment pick sheet for the same order.
- Not startedREQ-FUL-551
/admin/fulfillment/[orderId] page headings that render truncated order ids must preserve the full order id in a title attribute for support verification.
- Not startedREQ-FUL-552
/admin/fulfillment/[orderId] breadcrumb current-page crumbs that render truncated order ids must preserve the full order id in a title attribute.
- Not startedREQ-FUL-553
/admin/fulfillment/[orderId] must show the associated customer_id with a copy affordance when present, and an honest guest-order fallback when absent.
- Not startedREQ-FUL-554
/admin/fulfillment/[orderId] must show total_minor beside the formatted currency total for reconciliation-safe support handoffs.
- Not startedREQ-FUL-555
/admin/fulfillment/[orderId] must show a relative placed-age tile derived from created_at so stale pick sheets are obvious at detail depth.
- Not startedREQ-FUL-556
/admin/fulfillment/[orderId]/ship headings that render truncated order ids must preserve the full order id in a title attribute.
- Not startedREQ-FUL-557
/admin/fulfillment/[orderId]/ship must show the associated customer_id with a copy affordance when present, and an honest guest-order fallback when absent.
- Not startedREQ-FUL-558
/admin/fulfillment/[orderId]/ship must show total_minor beside the formatted currency total for reconciliation-safe shipping handoffs.
- Not startedREQ-FUL-559
/admin/fulfillment/[orderId]/ship must show a relative placed-age tile derived from created_at.
- Not startedREQ-FUL-560
/admin/fulfillment/[orderId]/ship shipping checklist rows must preserve the persisted order status in each row's title attribute so staff can debug why a row reads ready/pending.
- Not startedREQ-FUL-561
/admin/fulfillment/[orderId]/return headings that render truncated order ids must preserve the full order id in a title attribute.
- Not startedREQ-FUL-562
/admin/fulfillment/[orderId]/return must render the current status as a badge with the raw persisted status preserved in a title attribute.
- Not startedREQ-FUL-563
/admin/fulfillment/[orderId]/return must show the associated customer_id with a copy affordance when present, and an honest guest-order fallback when absent.
- Not startedREQ-FUL-564
/admin/fulfillment/[orderId]/return must show total_minor beside the formatted currency total for reconciliation-safe RMA handoffs.
- Not startedREQ-FUL-565
/admin/fulfillment/[orderId]/return RMA checklist rows must preserve the persisted order status in each row's title attribute so staff can debug eligibility without inspecting raw data elsewhere.
- Not startedREQ-FUL-566
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include total_minor, source code, and customer id/guest status for audit-safe support escalation.
- Not startedREQ-FUL-567
/admin/fulfillment/[orderId] source summary tiles must show the raw persisted source code visibly beside the friendly source label.
- Not startedREQ-FUL-568
/admin/fulfillment/[orderId] placed timestamp tiles must preserve the exact ISO timestamp in a title attribute.
- Not startedREQ-FUL-569
/admin/fulfillment/[orderId] payment reference tiles must render an explicit "Not recorded" fallback instead of disappearing when no payment reference exists.
- Not startedREQ-FUL-570
/admin/fulfillment/[orderId] placed timestamp tiles must expose a copy affordance for the exact ISO timestamp.
- Not startedREQ-FUL-571
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include total_minor, source code, customer id/guest status, payment reference/fallback, and exact placed timestamp.
- Not startedREQ-FUL-572
/admin/fulfillment/[orderId]/ship placed timestamp tiles must preserve and copy the exact ISO timestamp.
- Not startedREQ-FUL-573
/admin/fulfillment/[orderId]/ship source summary tiles must show the raw persisted source code visibly beside the friendly source label.
- Not startedREQ-FUL-574
/admin/fulfillment/[orderId]/ship payment reference tiles must preserve the raw payment reference in a title attribute when present.
- Not startedREQ-FUL-575
/admin/fulfillment/[orderId]/ship manual-label notes must include the short order id so printed worksheets remain identifiable when separated from the page header.
- Not startedREQ-FUL-576
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include total_minor, source code, customer id/guest status, payment reference/fallback, and exact placed timestamp.
- Not startedREQ-FUL-577
/admin/fulfillment/[orderId]/return placed timestamp tiles must preserve and copy the exact ISO timestamp.
- Not startedREQ-FUL-578
/admin/fulfillment/[orderId]/return source summary tiles must show the raw persisted source code visibly beside the friendly source label.
- Not startedREQ-FUL-579
/admin/fulfillment/[orderId]/return RMA eligibility tiles must preserve the raw persisted order status in a title attribute.
- Not startedREQ-FUL-580
/admin/fulfillment/[orderId]/return blocked-return alerts must preserve the raw persisted order status in a title attribute.
- Not startedREQ-FUL-581
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include the admin route path for support pastebacks.
- Not startedREQ-FUL-582
/admin/fulfillment/[orderId] summary tiles must include the full order id with a copy affordance.
- Not startedREQ-FUL-583
/admin/fulfillment/[orderId] summary tiles must include the raw persisted status with a copy affordance.
- Not startedREQ-FUL-584
/admin/fulfillment/[orderId] source summary tiles must expose a copy affordance for the raw source code.
- Not startedREQ-FUL-585
/admin/fulfillment/[orderId] blocked shipping-notification notices must preserve the raw persisted status in a title attribute.
- Not startedREQ-FUL-586
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include the admin route path and shippable eligibility.
- Not startedREQ-FUL-587
/admin/fulfillment/[orderId]/ship summary tiles must include the full order id with a copy affordance.
- Not startedREQ-FUL-588
/admin/fulfillment/[orderId]/ship summary tiles must include the raw persisted status with a copy affordance.
- Not startedREQ-FUL-589
/admin/fulfillment/[orderId]/ship source summary tiles must expose a copy affordance for the raw source code.
- Not startedREQ-FUL-590
/admin/fulfillment/[orderId]/ship blocked-shipping alerts must preserve the raw persisted status in a title attribute.
- Not startedREQ-FUL-591
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include the admin route path and RMA route path.
- Not startedREQ-FUL-592
/admin/fulfillment/[orderId]/return summary tiles must include the full order id with a copy affordance.
- Not startedREQ-FUL-593
/admin/fulfillment/[orderId]/return summary tiles must include the raw persisted status with a copy affordance.
- Not startedREQ-FUL-594
/admin/fulfillment/[orderId]/return source summary tiles must expose a copy affordance for the raw source code.
- Not startedREQ-FUL-595
/admin/fulfillment/[orderId]/return payment reference tiles must preserve the raw payment reference in a title attribute when present.
- Not startedREQ-FUL-596
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include shipping-notification eligibility.
- Not startedREQ-FUL-597
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include the next recommended fulfillment action.
- Not startedREQ-FUL-598
/admin/fulfillment/[orderId] summary tiles must include the admin route path with a copy affordance.
- Not startedREQ-FUL-599
/admin/fulfillment/[orderId] summary tiles must include shipping-notification eligibility with raw status preserved in a title attribute.
- Not startedREQ-FUL-600
/admin/fulfillment/[orderId] order-action navigation links must preserve each destination path in a title attribute for support verification.
- Not startedREQ-FUL-601
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include the next recommended shipping action.
- Not startedREQ-FUL-602
/admin/fulfillment/[orderId]/ship summary tiles must include the ship route path with a copy affordance.
- Not startedREQ-FUL-603
/admin/fulfillment/[orderId]/ship summary tiles must include shippable eligibility with raw status preserved in a title attribute.
- Not startedREQ-FUL-604
/admin/fulfillment/[orderId]/ship manual-label worksheet notes must preserve the full order id in a title attribute.
- Not startedREQ-FUL-605
/admin/fulfillment/[orderId]/ship confirm-shipment submit buttons must preserve the ready-to-fulfilled status transition in a title attribute.
- Not startedREQ-FUL-606
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include the next recommended RMA action.
- Not startedREQ-FUL-607
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include the intended order status after RMA confirmation.
- Not startedREQ-FUL-608
/admin/fulfillment/[orderId]/return summary tiles must include the RMA route path with a copy affordance.
- Not startedREQ-FUL-609
/admin/fulfillment/[orderId]/return RMA eligibility tiles must expose a copy affordance for the visible eligibility value.
- Not startedREQ-FUL-610
/admin/fulfillment/[orderId]/return navigation links must preserve each destination path in a title attribute for support verification.
- Not startedREQ-FUL-611
/admin/fulfillment/[orderId] formatted total tiles must preserve raw total_minor in a title attribute for reconciliation.
- Not startedREQ-FUL-612
/admin/fulfillment/[orderId] total-minor tiles must expose a copy affordance for support reconciliation.
- Not startedREQ-FUL-613
/admin/fulfillment/[orderId] guest customer fallbacks must preserve guest_order in a title attribute.
- Not startedREQ-FUL-614
/admin/fulfillment/[orderId] missing payment-reference fallbacks must preserve not_recorded in a title attribute.
- Not startedREQ-FUL-615
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a reconciliation key combining order id and total_minor.
- Not startedREQ-FUL-616
/admin/fulfillment/[orderId]/ship formatted total tiles must preserve raw total_minor in a title attribute for reconciliation.
- Not startedREQ-FUL-617
/admin/fulfillment/[orderId]/ship total-minor tiles must expose a copy affordance for support reconciliation.
- Not startedREQ-FUL-618
/admin/fulfillment/[orderId]/ship guest customer fallbacks must preserve guest_order in a title attribute.
- Not startedREQ-FUL-619
/admin/fulfillment/[orderId]/ship missing payment-reference fallbacks must preserve not_recorded in a title attribute.
- Not startedREQ-FUL-620
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a reconciliation key combining order id and total_minor.
- Not startedREQ-FUL-621
/admin/fulfillment/[orderId]/return formatted total context must preserve raw total_minor in a title attribute for reconciliation.
- Not startedREQ-FUL-622
/admin/fulfillment/[orderId]/return total-minor tiles must expose a copy affordance for support reconciliation.
- Not startedREQ-FUL-623
/admin/fulfillment/[orderId]/return guest customer fallbacks must preserve guest_order in a title attribute.
- Not startedREQ-FUL-624
/admin/fulfillment/[orderId]/return missing payment-reference fallbacks must preserve not_recorded in a title attribute.
- Not startedREQ-FUL-625
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a reconciliation key combining order id and total_minor.
- Not startedREQ-FUL-626
/admin/fulfillment/[orderId] summary tiles must include the reconciliation key with a copy affordance.
- Not startedREQ-FUL-627
/admin/fulfillment/[orderId] summary tiles must include the next recommended fulfillment action with a copy affordance.
- Not startedREQ-FUL-628
/admin/fulfillment/[orderId] customer-id tiles must preserve the raw customer id in a title attribute when present.
- Not startedREQ-FUL-629
/admin/fulfillment/[orderId] payment-reference tiles must preserve the raw payment reference in a title attribute when present.
- Not startedREQ-FUL-630
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include full-order, shipping, and RMA route paths.
- Not startedREQ-FUL-631
/admin/fulfillment/[orderId]/ship summary tiles must include the reconciliation key with a copy affordance.
- Not startedREQ-FUL-632
/admin/fulfillment/[orderId]/ship shippable eligibility tiles must expose a copy affordance for the visible eligibility value.
- Not startedREQ-FUL-633
/admin/fulfillment/[orderId]/ship summary tiles must include the next recommended shipping action with a copy affordance.
- Not startedREQ-FUL-634
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include the target status after shipment confirmation.
- Not startedREQ-FUL-635
/admin/fulfillment/[orderId]/ship navigation links must preserve each destination path in a title attribute for support verification.
- Not startedREQ-FUL-636
/admin/fulfillment/[orderId]/return summary tiles must include the reconciliation key with a copy affordance.
- Not startedREQ-FUL-637
/admin/fulfillment/[orderId]/return summary tiles must include the next recommended RMA action with a copy affordance.
- Not startedREQ-FUL-638
/admin/fulfillment/[orderId]/return summary tiles must include the RMA target status with a copy affordance.
- Not startedREQ-FUL-639
/admin/fulfillment/[orderId]/return customer-id tiles must preserve the raw customer id in a title attribute when present.
- Not startedREQ-FUL-640
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include the full order detail route path.
- Not startedREQ-FUL-641
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include customer and payment proof tokens for guest/not-recorded cases.
- Not startedREQ-FUL-642
/admin/fulfillment/[orderId] summary tiles must include a status/source proof key with a copy affordance.
- Not startedREQ-FUL-643
/admin/fulfillment/[orderId] shipping-notification eligibility tiles must expose a copy affordance for the visible eligibility value.
- Not startedREQ-FUL-644
/admin/fulfillment/[orderId] placed-age tiles must preserve the exact placed timestamp in a title attribute.
- Not startedREQ-FUL-645
/admin/fulfillment/[orderId] total-minor tile values must preserve the raw minor-unit value in a title attribute.
- Not startedREQ-FUL-646
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include full-order and pick-sheet route paths.
- Not startedREQ-FUL-647
/admin/fulfillment/[orderId]/ship summary tiles must include the shipment target status with a copy affordance.
- Not startedREQ-FUL-648
/admin/fulfillment/[orderId]/ship customer-id tiles must preserve the raw customer id in a title attribute when present.
- Not startedREQ-FUL-649
/admin/fulfillment/[orderId]/ship placed-age tiles must preserve the exact placed timestamp in a title attribute.
- Not startedREQ-FUL-650
/admin/fulfillment/[orderId]/ship total-minor tile values must preserve the raw minor-unit value in a title attribute.
- Not startedREQ-FUL-651
/admin/fulfillment/[orderId]/return summary tiles must include the full order detail route path with a copy affordance.
- Not startedREQ-FUL-652
/admin/fulfillment/[orderId]/return total-minor tile values must preserve the raw minor-unit value in a title attribute.
- Not startedREQ-FUL-653
/admin/fulfillment/[orderId]/return placed-age tiles must preserve the exact placed timestamp in a title attribute.
- Not startedREQ-FUL-654
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include customer and payment proof tokens for guest/not-recorded cases.
- Not startedREQ-FUL-655
/admin/fulfillment/[orderId]/return summary tiles must include a status/source proof key with a copy affordance.
- Not startedREQ-FUL-656
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a route bundle containing fulfillment, full-order, shipping, and RMA paths.
- Not startedREQ-FUL-657
/admin/fulfillment/[orderId] summary tiles must include the route bundle with a copy affordance.
- Not startedREQ-FUL-658
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a readiness bundle combining order status, notification eligibility, and next action.
- Not startedREQ-FUL-659
/admin/fulfillment/[orderId] summary tiles must include the readiness bundle with a copy affordance.
- Not startedREQ-FUL-660
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the full route bundle.
- Not startedREQ-FUL-661
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a route bundle containing ship, full-order, and pick-sheet paths.
- Not startedREQ-FUL-662
/admin/fulfillment/[orderId]/ship summary tiles must include the route bundle with a copy affordance.
- Not startedREQ-FUL-663
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a readiness bundle combining status, shippable eligibility, next action, and target status.
- Not startedREQ-FUL-664
/admin/fulfillment/[orderId]/ship summary tiles must include the readiness bundle with a copy affordance.
- Not startedREQ-FUL-665
/admin/fulfillment/[orderId]/ship manual-label notes must preserve the shipment target status in machine-readable hover context.
- Not startedREQ-FUL-666
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a route bundle containing RMA, fulfillment, and full-order paths.
- Not startedREQ-FUL-667
/admin/fulfillment/[orderId]/return summary tiles must include the route bundle with a copy affordance.
- Not startedREQ-FUL-668
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a readiness bundle combining status, RMA eligibility, next action, and target status.
- Not startedREQ-FUL-669
/admin/fulfillment/[orderId]/return summary tiles must include the readiness bundle with a copy affordance.
- Not startedREQ-FUL-670
/admin/fulfillment/[orderId]/return blocked-return alerts must preserve the RMA target status in machine-readable hover context.
- Not startedREQ-FUL-671
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include the fulfillment queue path.
- Not startedREQ-FUL-672
/admin/fulfillment/[orderId] summary tiles must include the fulfillment queue path with a copy affordance.
- Not startedREQ-FUL-673
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include an operator bundle combining order id, status, source, and reconciliation key.
- Not startedREQ-FUL-674
/admin/fulfillment/[orderId] summary tiles must include the operator bundle with a copy affordance.
- Not startedREQ-FUL-675
/admin/fulfillment/[orderId] checklist rows must preserve the fulfillment readiness bundle in machine-readable hover context.
- Not startedREQ-FUL-676
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include the fulfillment queue path.
- Not startedREQ-FUL-677
/admin/fulfillment/[orderId]/ship summary tiles must include the fulfillment queue path with a copy affordance.
- Not startedREQ-FUL-678
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include an operator bundle combining order id, status, source, and reconciliation key.
- Not startedREQ-FUL-679
/admin/fulfillment/[orderId]/ship summary tiles must include the operator bundle with a copy affordance.
- Not startedREQ-FUL-680
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the shipping route bundle.
- Not startedREQ-FUL-681
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include the fulfillment queue path.
- Not startedREQ-FUL-682
/admin/fulfillment/[orderId]/return summary tiles must include the fulfillment queue path with a copy affordance.
- Not startedREQ-FUL-683
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include an operator bundle combining order id, status, source, and reconciliation key.
- Not startedREQ-FUL-684
/admin/fulfillment/[orderId]/return summary tiles must include the operator bundle with a copy affordance.
- Not startedREQ-FUL-685
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the RMA route bundle.
- Not startedREQ-FUL-686
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a control bundle combining queue path, operator bundle, and readiness bundle.
- Not startedREQ-FUL-687
/admin/fulfillment/[orderId] summary tiles must include the control bundle with a copy affordance.
- Not startedREQ-FUL-688
/admin/fulfillment/[orderId] blocked shipping-notification notes must preserve the readiness bundle in machine-readable hover context.
- Not startedREQ-FUL-689
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the operator bundle.
- Not startedREQ-FUL-690
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the control bundle.
- Not startedREQ-FUL-691
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a control bundle combining queue path, operator bundle, and readiness bundle.
- Not startedREQ-FUL-692
/admin/fulfillment/[orderId]/ship summary tiles must include the control bundle with a copy affordance.
- Not startedREQ-FUL-693
/admin/fulfillment/[orderId]/ship blocked-shipping alerts must preserve the shipping readiness bundle in machine-readable hover context.
- Not startedREQ-FUL-694
/admin/fulfillment/[orderId]/ship checklist rows must preserve the shipping readiness bundle in machine-readable hover context.
- Not startedREQ-FUL-695
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the operator bundle.
- Not startedREQ-FUL-696
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a control bundle combining queue path, operator bundle, and readiness bundle.
- Not startedREQ-FUL-697
/admin/fulfillment/[orderId]/return summary tiles must include the control bundle with a copy affordance.
- Not startedREQ-FUL-698
/admin/fulfillment/[orderId]/return blocked-return alerts must preserve the RMA readiness bundle in machine-readable hover context.
- Not startedREQ-FUL-699
/admin/fulfillment/[orderId]/return checklist rows must preserve the RMA readiness bundle in machine-readable hover context.
- Not startedREQ-FUL-700
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the operator bundle.
- Not startedREQ-FUL-701
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include an audit bundle combining control bundle, status/source key, placed timestamp, and payment proof token.
- Not startedREQ-FUL-702
/admin/fulfillment/[orderId] summary tiles must include the audit bundle with a copy affordance.
- Not startedREQ-FUL-703
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a support bundle combining customer proof token, payment proof token, and placed timestamp.
- Not startedREQ-FUL-704
/admin/fulfillment/[orderId] summary tiles must include the support bundle with a copy affordance.
- Not startedREQ-FUL-705
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the audit bundle.
- Not startedREQ-FUL-706
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include an audit bundle combining control bundle, route bundle, placed timestamp, and payment proof token.
- Not startedREQ-FUL-707
/admin/fulfillment/[orderId]/ship summary tiles must include the audit bundle with a copy affordance.
- Not startedREQ-FUL-708
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a support bundle combining customer proof token, payment proof token, and placed timestamp.
- Not startedREQ-FUL-709
/admin/fulfillment/[orderId]/ship summary tiles must include the support bundle with a copy affordance.
- Not startedREQ-FUL-710
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the control bundle.
- Not startedREQ-FUL-711
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include an audit bundle combining control bundle, status/source key, placed timestamp, and payment proof token.
- Not startedREQ-FUL-712
/admin/fulfillment/[orderId]/return summary tiles must include the audit bundle with a copy affordance.
- Not startedREQ-FUL-713
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a support bundle combining customer proof token, payment proof token, and placed timestamp.
- Not startedREQ-FUL-714
/admin/fulfillment/[orderId]/return summary tiles must include the support bundle with a copy affordance.
- Not startedREQ-FUL-715
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the control bundle.
- Not startedREQ-FUL-716
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a timeline bundle combining placed timestamp, next action, and shipping-notification eligibility.
- Not startedREQ-FUL-717
/admin/fulfillment/[orderId] summary tiles must include the timeline bundle with a copy affordance.
- Not startedREQ-FUL-718
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include an exception bundle combining status/source key, control bundle, and support bundle.
- Not startedREQ-FUL-719
/admin/fulfillment/[orderId] summary tiles must include the exception bundle with a copy affordance.
- Not startedREQ-FUL-720
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the support bundle.
- Not startedREQ-FUL-721
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a timeline bundle combining placed timestamp, next shipping action, and shipment target status.
- Not startedREQ-FUL-722
/admin/fulfillment/[orderId]/ship summary tiles must include the timeline bundle with a copy affordance.
- Not startedREQ-FUL-723
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include an exception bundle combining shippable eligibility, control bundle, and support bundle.
- Not startedREQ-FUL-724
/admin/fulfillment/[orderId]/ship summary tiles must include the exception bundle with a copy affordance.
- Not startedREQ-FUL-725
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the audit bundle.
- Not startedREQ-FUL-726
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a timeline bundle combining placed timestamp, next RMA action, and RMA target status.
- Not startedREQ-FUL-727
/admin/fulfillment/[orderId]/return summary tiles must include the timeline bundle with a copy affordance.
- Not startedREQ-FUL-728
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include an exception bundle combining RMA eligibility, control bundle, and support bundle.
- Not startedREQ-FUL-729
/admin/fulfillment/[orderId]/return summary tiles must include the exception bundle with a copy affordance.
- Not startedREQ-FUL-730
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the audit bundle.
- Not startedREQ-FUL-731
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include an operations bundle combining route bundle, timeline bundle, and exception bundle.
- Not startedREQ-FUL-732
/admin/fulfillment/[orderId] summary tiles must include the operations bundle with a copy affordance.
- Not startedREQ-FUL-733
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a print bundle combining short order id, placed timestamp, and next action.
- Not startedREQ-FUL-734
/admin/fulfillment/[orderId] summary tiles must include the print bundle with a copy affordance.
- Not startedREQ-FUL-735
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the exception bundle.
- Not startedREQ-FUL-736
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include an operations bundle combining route bundle, timeline bundle, and exception bundle.
- Not startedREQ-FUL-737
/admin/fulfillment/[orderId]/ship summary tiles must include the operations bundle with a copy affordance.
- Not startedREQ-FUL-738
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a print bundle combining short order id, placed timestamp, and next shipping action.
- Not startedREQ-FUL-739
/admin/fulfillment/[orderId]/ship summary tiles must include the print bundle with a copy affordance.
- Not startedREQ-FUL-740
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the support bundle.
- Not startedREQ-FUL-741
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include an operations bundle combining route bundle, timeline bundle, and exception bundle.
- Not startedREQ-FUL-742
/admin/fulfillment/[orderId]/return summary tiles must include the operations bundle with a copy affordance.
- Not startedREQ-FUL-743
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a print bundle combining short order id, placed timestamp, and next RMA action.
- Not startedREQ-FUL-744
/admin/fulfillment/[orderId]/return summary tiles must include the print bundle with a copy affordance.
- Not startedREQ-FUL-745
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the support bundle.
- Not startedREQ-FUL-746
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a command bundle combining control, operations, and print bundles.
- Not startedREQ-FUL-747
/admin/fulfillment/[orderId] summary tiles must include the command bundle with a copy affordance.
- Not startedREQ-FUL-748
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include an escalation bundle combining support, exception, and audit bundles.
- Not startedREQ-FUL-749
/admin/fulfillment/[orderId] summary tiles must include the escalation bundle with a copy affordance.
- Not startedREQ-FUL-750
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the command bundle.
- Not startedREQ-FUL-751
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a command bundle combining control, operations, and print bundles.
- Not startedREQ-FUL-752
/admin/fulfillment/[orderId]/ship summary tiles must include the command bundle with a copy affordance.
- Not startedREQ-FUL-753
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include an escalation bundle combining support, exception, and audit bundles.
- Not startedREQ-FUL-754
/admin/fulfillment/[orderId]/ship summary tiles must include the escalation bundle with a copy affordance.
- Not startedREQ-FUL-755
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the command bundle.
- Not startedREQ-FUL-756
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a command bundle combining control, operations, and print bundles.
- Not startedREQ-FUL-757
/admin/fulfillment/[orderId]/return summary tiles must include the command bundle with a copy affordance.
- Not startedREQ-FUL-758
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include an escalation bundle combining support, exception, and audit bundles.
- Not startedREQ-FUL-759
/admin/fulfillment/[orderId]/return summary tiles must include the escalation bundle with a copy affordance.
- Not startedREQ-FUL-760
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the command bundle.
- Not startedREQ-FUL-761
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a runbook bundle combining route, readiness, and command bundles.
- Not startedREQ-FUL-762
/admin/fulfillment/[orderId] summary tiles must include the runbook bundle with a copy affordance.
- Not startedREQ-FUL-763
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a recovery bundle combining escalation, support, and timeline bundles.
- Not startedREQ-FUL-764
/admin/fulfillment/[orderId] summary tiles must include the recovery bundle with a copy affordance.
- Not startedREQ-FUL-765
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the recovery bundle.
- Not startedREQ-FUL-766
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a runbook bundle combining route, readiness, and command bundles.
- Not startedREQ-FUL-767
/admin/fulfillment/[orderId]/ship summary tiles must include the runbook bundle with a copy affordance.
- Not startedREQ-FUL-768
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a recovery bundle combining escalation, support, and timeline bundles.
- Not startedREQ-FUL-769
/admin/fulfillment/[orderId]/ship summary tiles must include the recovery bundle with a copy affordance.
- Not startedREQ-FUL-770
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the recovery bundle.
- Not startedREQ-FUL-771
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a runbook bundle combining route, readiness, and command bundles.
- Not startedREQ-FUL-772
/admin/fulfillment/[orderId]/return summary tiles must include the runbook bundle with a copy affordance.
- Not startedREQ-FUL-773
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a recovery bundle combining escalation, support, and timeline bundles.
- Not startedREQ-FUL-774
/admin/fulfillment/[orderId]/return summary tiles must include the recovery bundle with a copy affordance.
- Not startedREQ-FUL-775
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the recovery bundle.
- Not startedREQ-FUL-776
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a dispatch bundle combining route, command, and recovery bundles.
- Not startedREQ-FUL-777
/admin/fulfillment/[orderId] summary tiles must include the dispatch bundle with a copy affordance.
- Not startedREQ-FUL-778
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include an archive bundle combining audit, runbook, and print bundles.
- Not startedREQ-FUL-779
/admin/fulfillment/[orderId] summary tiles must include the archive bundle with a copy affordance.
- Not startedREQ-FUL-780
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the dispatch bundle.
- Not startedREQ-FUL-781
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a dispatch bundle combining route, command, and recovery bundles.
- Not startedREQ-FUL-782
/admin/fulfillment/[orderId]/ship summary tiles must include the dispatch bundle with a copy affordance.
- Not startedREQ-FUL-783
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include an archive bundle combining audit, runbook, and print bundles.
- Not startedREQ-FUL-784
/admin/fulfillment/[orderId]/ship summary tiles must include the archive bundle with a copy affordance.
- Not startedREQ-FUL-785
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the dispatch bundle.
- Not startedREQ-FUL-786
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a dispatch bundle combining route, command, and recovery bundles.
- Not startedREQ-FUL-787
/admin/fulfillment/[orderId]/return summary tiles must include the dispatch bundle with a copy affordance.
- Not startedREQ-FUL-788
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include an archive bundle combining audit, runbook, and print bundles.
- Not startedREQ-FUL-789
/admin/fulfillment/[orderId]/return summary tiles must include the archive bundle with a copy affordance.
- Not startedREQ-FUL-790
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the dispatch bundle.
- Not startedREQ-FUL-791
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a verification bundle combining dispatch bundle, archive bundle, and reconciliation key.
- Not startedREQ-FUL-792
/admin/fulfillment/[orderId] summary tiles must include the verification bundle with a copy affordance.
- Not startedREQ-FUL-793
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a closeout bundle combining verification bundle, placed timestamp, and total minor units.
- Not startedREQ-FUL-794
/admin/fulfillment/[orderId] summary tiles must include the closeout bundle with a copy affordance.
- Not startedREQ-FUL-795
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the verification bundle.
- Not startedREQ-FUL-796
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a verification bundle combining dispatch bundle, archive bundle, and reconciliation key.
- Not startedREQ-FUL-797
/admin/fulfillment/[orderId]/ship summary tiles must include the verification bundle with a copy affordance.
- Not startedREQ-FUL-798
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a closeout bundle combining verification bundle, placed timestamp, and total minor units.
- Not startedREQ-FUL-799
/admin/fulfillment/[orderId]/ship summary tiles must include the closeout bundle with a copy affordance.
- Not startedREQ-FUL-800
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the verification bundle.
- Not startedREQ-FUL-801
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a verification bundle combining dispatch bundle, archive bundle, and reconciliation key.
- Not startedREQ-FUL-802
/admin/fulfillment/[orderId]/return summary tiles must include the verification bundle with a copy affordance.
- Not startedREQ-FUL-803
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a closeout bundle combining verification bundle, placed timestamp, and total minor units.
- Not startedREQ-FUL-804
/admin/fulfillment/[orderId]/return summary tiles must include the closeout bundle with a copy affordance.
- Not startedREQ-FUL-805
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the verification bundle.
- Not startedREQ-FUL-806
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a signoff bundle combining closeout bundle, readiness bundle, and next action.
- Not startedREQ-FUL-807
/admin/fulfillment/[orderId] summary tiles must include the signoff bundle with a copy affordance.
- Not startedREQ-FUL-808
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a retention bundle combining signoff bundle, archive bundle, and placed timestamp.
- Not startedREQ-FUL-809
/admin/fulfillment/[orderId] summary tiles must include the retention bundle with a copy affordance.
- Not startedREQ-FUL-810
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the signoff bundle.
- Not startedREQ-FUL-811
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a signoff bundle combining closeout bundle, readiness bundle, and shipment target status.
- Not startedREQ-FUL-812
/admin/fulfillment/[orderId]/ship summary tiles must include the signoff bundle with a copy affordance.
- Not startedREQ-FUL-813
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a retention bundle combining signoff bundle, archive bundle, and placed timestamp.
- Not startedREQ-FUL-814
/admin/fulfillment/[orderId]/ship summary tiles must include the retention bundle with a copy affordance.
- Not startedREQ-FUL-815
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the signoff bundle.
- Not startedREQ-FUL-816
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a signoff bundle combining closeout bundle, readiness bundle, and RMA target status.
- Not startedREQ-FUL-817
/admin/fulfillment/[orderId]/return summary tiles must include the signoff bundle with a copy affordance.
- Not startedREQ-FUL-818
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a retention bundle combining signoff bundle, archive bundle, and placed timestamp.
- Not startedREQ-FUL-819
/admin/fulfillment/[orderId]/return summary tiles must include the retention bundle with a copy affordance.
- Not startedREQ-FUL-820
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the signoff bundle.
- Not startedREQ-FUL-821
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a compliance bundle combining retention bundle, verification bundle, and status/source key.
- Not startedREQ-FUL-822
/admin/fulfillment/[orderId] summary tiles must include the compliance bundle with a copy affordance.
- Not startedREQ-FUL-823
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include an evidence bundle combining compliance bundle, support bundle, and placed timestamp.
- Not startedREQ-FUL-824
/admin/fulfillment/[orderId] summary tiles must include the evidence bundle with a copy affordance.
- Not startedREQ-FUL-825
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the compliance bundle.
- Not startedREQ-FUL-826
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a compliance bundle combining retention bundle, verification bundle, and shipment target status.
- Not startedREQ-FUL-827
/admin/fulfillment/[orderId]/ship summary tiles must include the compliance bundle with a copy affordance.
- Not startedREQ-FUL-828
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include an evidence bundle combining compliance bundle, support bundle, and placed timestamp.
- Not startedREQ-FUL-829
/admin/fulfillment/[orderId]/ship summary tiles must include the evidence bundle with a copy affordance.
- Not startedREQ-FUL-830
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the compliance bundle.
- Not startedREQ-FUL-831
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a compliance bundle combining retention bundle, verification bundle, and RMA target status.
- Not startedREQ-FUL-832
/admin/fulfillment/[orderId]/return summary tiles must include the compliance bundle with a copy affordance.
- Not startedREQ-FUL-833
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include an evidence bundle combining compliance bundle, support bundle, and placed timestamp.
- Not startedREQ-FUL-834
/admin/fulfillment/[orderId]/return summary tiles must include the evidence bundle with a copy affordance.
- Not startedREQ-FUL-835
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the compliance bundle.
- Not startedREQ-FUL-836
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a custody bundle combining evidence bundle, control bundle, and operator bundle.
- Not startedREQ-FUL-837
/admin/fulfillment/[orderId] summary tiles must include the custody bundle with a copy affordance.
- Not startedREQ-FUL-838
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include an attestation bundle combining custody bundle, compliance bundle, and placed timestamp.
- Not startedREQ-FUL-839
/admin/fulfillment/[orderId] summary tiles must include the attestation bundle with a copy affordance.
- Not startedREQ-FUL-840
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the custody bundle.
- Not startedREQ-FUL-841
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a custody bundle combining evidence bundle, control bundle, and operator bundle.
- Not startedREQ-FUL-842
/admin/fulfillment/[orderId]/ship summary tiles must include the custody bundle with a copy affordance.
- Not startedREQ-FUL-843
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include an attestation bundle combining custody bundle, compliance bundle, and placed timestamp.
- Not startedREQ-FUL-844
/admin/fulfillment/[orderId]/ship summary tiles must include the attestation bundle with a copy affordance.
- Not startedREQ-FUL-845
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the custody bundle.
- Not startedREQ-FUL-846
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a custody bundle combining evidence bundle, control bundle, and operator bundle.
- Not startedREQ-FUL-847
/admin/fulfillment/[orderId]/return summary tiles must include the custody bundle with a copy affordance.
- Not startedREQ-FUL-848
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include an attestation bundle combining custody bundle, compliance bundle, and placed timestamp.
- Not startedREQ-FUL-849
/admin/fulfillment/[orderId]/return summary tiles must include the attestation bundle with a copy affordance.
- Not startedREQ-FUL-850
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the custody bundle.
- Not startedREQ-FUL-851
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a resolution bundle combining attestation bundle, closeout bundle, and reconciliation key.
- Not startedREQ-FUL-852
/admin/fulfillment/[orderId] summary tiles must include the resolution bundle with a copy affordance.
- Not startedREQ-FUL-853
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a ledger bundle combining resolution bundle, custody bundle, and total minor units.
- Not startedREQ-FUL-854
/admin/fulfillment/[orderId] summary tiles must include the ledger bundle with a copy affordance.
- Not startedREQ-FUL-855
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the resolution bundle.
- Not startedREQ-FUL-856
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a resolution bundle combining attestation bundle, closeout bundle, and reconciliation key.
- Not startedREQ-FUL-857
/admin/fulfillment/[orderId]/ship summary tiles must include the resolution bundle with a copy affordance.
- Not startedREQ-FUL-858
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a ledger bundle combining resolution bundle, custody bundle, and total minor units.
- Not startedREQ-FUL-859
/admin/fulfillment/[orderId]/ship summary tiles must include the ledger bundle with a copy affordance.
- Not startedREQ-FUL-860
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the resolution bundle.
- Not startedREQ-FUL-861
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a resolution bundle combining attestation bundle, closeout bundle, and reconciliation key.
- Not startedREQ-FUL-862
/admin/fulfillment/[orderId]/return summary tiles must include the resolution bundle with a copy affordance.
- Not startedREQ-FUL-863
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a ledger bundle combining resolution bundle, custody bundle, and total minor units.
- Not startedREQ-FUL-864
/admin/fulfillment/[orderId]/return summary tiles must include the ledger bundle with a copy affordance.
- Not startedREQ-FUL-865
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the resolution bundle.
- Not startedREQ-FUL-866
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a settlement bundle combining ledger bundle, retention bundle, and status/source key.
- Not startedREQ-FUL-867
/admin/fulfillment/[orderId] summary tiles must include the settlement bundle with a copy affordance.
- Not startedREQ-FUL-868
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a docket bundle combining settlement bundle, resolution bundle, and placed timestamp.
- Not startedREQ-FUL-869
/admin/fulfillment/[orderId] summary tiles must include the docket bundle with a copy affordance.
- Not startedREQ-FUL-870
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the settlement bundle.
- Not startedREQ-FUL-871
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a settlement bundle combining ledger bundle, retention bundle, and shipment target status.
- Not startedREQ-FUL-872
/admin/fulfillment/[orderId]/ship summary tiles must include the settlement bundle with a copy affordance.
- Not startedREQ-FUL-873
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a docket bundle combining settlement bundle, resolution bundle, and placed timestamp.
- Not startedREQ-FUL-874
/admin/fulfillment/[orderId]/ship summary tiles must include the docket bundle with a copy affordance.
- Not startedREQ-FUL-875
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the settlement bundle.
- Not startedREQ-FUL-876
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a settlement bundle combining ledger bundle, retention bundle, and RMA target status.
- Not startedREQ-FUL-877
/admin/fulfillment/[orderId]/return summary tiles must include the settlement bundle with a copy affordance.
- Not startedREQ-FUL-878
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a docket bundle combining settlement bundle, resolution bundle, and placed timestamp.
- Not startedREQ-FUL-879
/admin/fulfillment/[orderId]/return summary tiles must include the docket bundle with a copy affordance.
- Not startedREQ-FUL-880
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the settlement bundle.
- Not startedREQ-FUL-881
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a manifest bundle combining docket bundle, dispatch bundle, and route bundle.
- Not startedREQ-FUL-882
/admin/fulfillment/[orderId] summary tiles must include the manifest bundle with a copy affordance.
- Not startedREQ-FUL-883
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a release bundle combining manifest bundle, settlement bundle, and next action.
- Not startedREQ-FUL-884
/admin/fulfillment/[orderId] summary tiles must include the release bundle with a copy affordance.
- Not startedREQ-FUL-885
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the manifest bundle.
- Not startedREQ-FUL-886
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a manifest bundle combining docket bundle, dispatch bundle, and route bundle.
- Not startedREQ-FUL-887
/admin/fulfillment/[orderId]/ship summary tiles must include the manifest bundle with a copy affordance.
- Not startedREQ-FUL-888
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a release bundle combining manifest bundle, settlement bundle, and shipment target status.
- Not startedREQ-FUL-889
/admin/fulfillment/[orderId]/ship summary tiles must include the release bundle with a copy affordance.
- Not startedREQ-FUL-890
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the manifest bundle.
- Not startedREQ-FUL-891
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a manifest bundle combining docket bundle, dispatch bundle, and route bundle.
- Not startedREQ-FUL-892
/admin/fulfillment/[orderId]/return summary tiles must include the manifest bundle with a copy affordance.
- Not startedREQ-FUL-893
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a release bundle combining manifest bundle, settlement bundle, and RMA target status.
- Not startedREQ-FUL-894
/admin/fulfillment/[orderId]/return summary tiles must include the release bundle with a copy affordance.
- Not startedREQ-FUL-895
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the manifest bundle.
- Not startedREQ-FUL-896
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a certification bundle combining release bundle, manifest bundle, and readiness bundle.
- Not startedREQ-FUL-897
/admin/fulfillment/[orderId] summary tiles must include the certification bundle with a copy affordance.
- Not startedREQ-FUL-898
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include an export bundle combining certification bundle, docket bundle, and placed timestamp.
- Not startedREQ-FUL-899
/admin/fulfillment/[orderId] summary tiles must include the export bundle with a copy affordance.
- Not startedREQ-FUL-900
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the certification bundle.
- Not startedREQ-FUL-901
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a certification bundle combining release bundle, manifest bundle, and readiness bundle.
- Not startedREQ-FUL-902
/admin/fulfillment/[orderId]/ship summary tiles must include the certification bundle with a copy affordance.
- Not startedREQ-FUL-903
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include an export bundle combining certification bundle, docket bundle, and placed timestamp.
- Not startedREQ-FUL-904
/admin/fulfillment/[orderId]/ship summary tiles must include the export bundle with a copy affordance.
- Not startedREQ-FUL-905
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the certification bundle.
- Not startedREQ-FUL-906
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a certification bundle combining release bundle, manifest bundle, and readiness bundle.
- Not startedREQ-FUL-907
/admin/fulfillment/[orderId]/return summary tiles must include the certification bundle with a copy affordance.
- Not startedREQ-FUL-908
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include an export bundle combining certification bundle, docket bundle, and placed timestamp.
- Not startedREQ-FUL-909
/admin/fulfillment/[orderId]/return summary tiles must include the export bundle with a copy affordance.
- Not startedREQ-FUL-910
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the certification bundle.
- Not startedREQ-FUL-911
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a handoff bundle combining export bundle, certification bundle, and route bundle.
- Not startedREQ-FUL-912
/admin/fulfillment/[orderId] summary tiles must include the handoff bundle with a copy affordance.
- Not startedREQ-FUL-913
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a clearance bundle combining handoff bundle, release bundle, and next action.
- Not startedREQ-FUL-914
/admin/fulfillment/[orderId] summary tiles must include the clearance bundle with a copy affordance.
- Not startedREQ-FUL-915
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the handoff bundle.
- Not startedREQ-FUL-916
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a handoff bundle combining export bundle, certification bundle, and route bundle.
- Not startedREQ-FUL-917
/admin/fulfillment/[orderId]/ship summary tiles must include the handoff bundle with a copy affordance.
- Not startedREQ-FUL-918
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a clearance bundle combining handoff bundle, release bundle, and shipment target status.
- Not startedREQ-FUL-919
/admin/fulfillment/[orderId]/ship summary tiles must include the clearance bundle with a copy affordance.
- Not startedREQ-FUL-920
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the handoff bundle.
- Not startedREQ-FUL-921
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a handoff bundle combining export bundle, certification bundle, and route bundle.
- Not startedREQ-FUL-922
/admin/fulfillment/[orderId]/return summary tiles must include the handoff bundle with a copy affordance.
- Not startedREQ-FUL-923
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a clearance bundle combining handoff bundle, release bundle, and RMA target status.
- Not startedREQ-FUL-924
/admin/fulfillment/[orderId]/return summary tiles must include the clearance bundle with a copy affordance.
- Not startedREQ-FUL-925
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the handoff bundle.
- Not startedREQ-FUL-926
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include an authorization bundle combining clearance bundle, handoff bundle, and readiness bundle.
- Not startedREQ-FUL-927
/admin/fulfillment/[orderId] summary tiles must include the authorization bundle with a copy affordance.
- Not startedREQ-FUL-928
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a finalization bundle combining authorization bundle, export bundle, and next action.
- Not startedREQ-FUL-929
/admin/fulfillment/[orderId] summary tiles must include the finalization bundle with a copy affordance.
- Not startedREQ-FUL-930
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the authorization bundle.
- Not startedREQ-FUL-931
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include an authorization bundle combining clearance bundle, handoff bundle, and readiness bundle.
- Not startedREQ-FUL-932
/admin/fulfillment/[orderId]/ship summary tiles must include the authorization bundle with a copy affordance.
- Not startedREQ-FUL-933
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a finalization bundle combining authorization bundle, export bundle, and shipment target status.
- Not startedREQ-FUL-934
/admin/fulfillment/[orderId]/ship summary tiles must include the finalization bundle with a copy affordance.
- Not startedREQ-FUL-935
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the authorization bundle.
- Not startedREQ-FUL-936
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include an authorization bundle combining clearance bundle, handoff bundle, and readiness bundle.
- Not startedREQ-FUL-937
/admin/fulfillment/[orderId]/return summary tiles must include the authorization bundle with a copy affordance.
- Not startedREQ-FUL-938
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a finalization bundle combining authorization bundle, export bundle, and RMA target status.
- Not startedREQ-FUL-939
/admin/fulfillment/[orderId]/return summary tiles must include the finalization bundle with a copy affordance.
- Not startedREQ-FUL-940
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the authorization bundle.
- Not startedREQ-FUL-941
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include an approval bundle combining finalization bundle, authorization bundle, and readiness bundle.
- Not startedREQ-FUL-942
/admin/fulfillment/[orderId] summary tiles must include the approval bundle with a copy affordance.
- Not startedREQ-FUL-943
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a completion bundle combining approval bundle, clearance bundle, and next action.
- Not startedREQ-FUL-944
/admin/fulfillment/[orderId] summary tiles must include the completion bundle with a copy affordance.
- Not startedREQ-FUL-945
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the approval bundle.
- Not startedREQ-FUL-946
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include an approval bundle combining finalization bundle, authorization bundle, and readiness bundle.
- Not startedREQ-FUL-947
/admin/fulfillment/[orderId]/ship summary tiles must include the approval bundle with a copy affordance.
- Not startedREQ-FUL-948
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a completion bundle combining approval bundle, clearance bundle, and shipment target status.
- Not startedREQ-FUL-949
/admin/fulfillment/[orderId]/ship summary tiles must include the completion bundle with a copy affordance.
- Not startedREQ-FUL-950
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the approval bundle.
- Not startedREQ-FUL-951
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include an approval bundle combining finalization bundle, authorization bundle, and readiness bundle.
- Not startedREQ-FUL-952
/admin/fulfillment/[orderId]/return summary tiles must include the approval bundle with a copy affordance.
- Not startedREQ-FUL-953
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a completion bundle combining approval bundle, clearance bundle, and RMA target status.
- Not startedREQ-FUL-954
/admin/fulfillment/[orderId]/return summary tiles must include the completion bundle with a copy affordance.
- Not startedREQ-FUL-955
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the approval bundle.
- Not startedREQ-FUL-956
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a closure bundle combining completion bundle, finalization bundle, and next action.
- Not startedREQ-FUL-957
/admin/fulfillment/[orderId] summary tiles must include the closure bundle with a copy affordance.
- Not startedREQ-FUL-958
/admin/fulfillment/[orderId] copy-fulfillment-handoff summaries must include a confirmation bundle combining closure bundle, route bundle, and placed timestamp.
- Not startedREQ-FUL-959
/admin/fulfillment/[orderId] summary tiles must include the confirmation bundle with a copy affordance.
- Not startedREQ-FUL-960
/admin/fulfillment/[orderId] order-action navigation must expose a copy affordance for the closure bundle.
- Not startedREQ-FUL-961
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a closure bundle combining completion bundle, finalization bundle, and shipment target status.
- Not startedREQ-FUL-962
/admin/fulfillment/[orderId]/ship summary tiles must include the closure bundle with a copy affordance.
- Not startedREQ-FUL-963
/admin/fulfillment/[orderId]/ship copy-shipping-handoff summaries must include a confirmation bundle combining closure bundle, route bundle, and placed timestamp.
- Not startedREQ-FUL-964
/admin/fulfillment/[orderId]/ship summary tiles must include the confirmation bundle with a copy affordance.
- Not startedREQ-FUL-965
/admin/fulfillment/[orderId]/ship navigation must expose a copy affordance for the closure bundle.
- Not startedREQ-FUL-966
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a closure bundle combining completion bundle, finalization bundle, and RMA target status.
- Not startedREQ-FUL-967
/admin/fulfillment/[orderId]/return summary tiles must include the closure bundle with a copy affordance.
- Not startedREQ-FUL-968
/admin/fulfillment/[orderId]/return copy-RMA-handoff summaries must include a confirmation bundle combining closure bundle, route bundle, and placed timestamp.
- Not startedREQ-FUL-969
/admin/fulfillment/[orderId]/return summary tiles must include the confirmation bundle with a copy affordance.
- Not startedREQ-FUL-970
/admin/fulfillment/[orderId]/return navigation must expose a copy affordance for the closure bundle.
REQ-DRPProduct Drops24 shipped2 wip0 todo92%
- ShippedREQ-DRP-524
The /drops/[slug]/opengraph-image badge now uses relative time for scheduled drops: "Opens in Nd/Nh/Nm" rather than a wall-clock timestamp. Live drops show "Live now"; ended shows "Ended". The full date range remains in the subtitle. Runti…
10h agoapps/web/src/app/(storefront)/drops/[slug]/opengraph-image.tsx - ShippedREQ-DRP-525
The /drops index must render an active-filter summary when any status, category, or when filter is active. The summary shows the filtered result count, the number of active filters, individual one-tap remove links for each active filter, a…
10h agoapps/web/src/app/(storefront)/drops/page.tsx - ShippedREQ-DRP-526
The /drops index card must show a non-JavaScript schedule line in addition to the live countdown. Scheduled cards show Opens <date>, live cards show Closes <date>, and ended cards show Ended <date>, each using a <time dateTime=...> element…
10h agoapps/web/src/app/(storefront)/drops/page.tsx - ShippedREQ-DRP-527
The /drops/[slug] SKU grid must visibly mark fabrics whose remainingSixteenths is 0n as sold out. Sold-out cards keep their PDP link for reference, render a "Sold out" badge, use muted card styling, and include "sold out" in the link's acc…
10h agoapps/web/src/app/(storefront)/drops/[slug]/page.tsx - ShippedREQ-DRP-523
The /drops/[slug] share row (ProductShareButton) is now always visible (including for ended drops) and passes the canonical drop URL explicitly. Previously gated on status !== "ended" and used window.location.href as fallback. Same a11y po…
10h agoapps/web/src/app/(storefront)/drops/[slug]/page.tsx - ShippedREQ-DRP-522
The /drops/rss.xml channel <image> element now points at /drops/opengraph-image (via the imagePath param added to renderChannelImage) so feed readers render the branded drop OG card alongside items. renderChannelImage defaults to the brand…
10h agoapps/web/src/app/(storefront)/drops/rss.xml/route.tsapps/web/src/lib/rssChannelImage.ts - ShippedREQ-DRP-521
The /drops/[slug] Event JSON-LD node gains a keywords field joining drop.categories with ", " (comma-space). Omitted when categories is empty to avoid a malformed empty-string claim (REQ-DRP-521).
10h agoapps/web/src/lib/dropStructuredData.ts - ShippedREQ-DRP-520
The /drops/[slug]/calendar.ics VEVENT DESCRIPTION now includes "Includes N fabrics" and the first three SKU names (as a bullet list) when drop.skus.length > 0. Additional SKUs are summarised as "... and N more". DTSTART/DTEND/STATUS unchan…
10h agoapps/web/src/app/(storefront)/drops/[slug]/calendar.ics/route.ts - ShippedREQ-DRP-519
The /drops/[slug]/opengraph-image card stamps eyebrow="LIVE" when drop.status === "live", replacing the default "Drop" eyebrow. All other statuses keep "Drop". The change makes unfurled share links in chat / social communicate live status…
10h agoapps/web/src/app/(storefront)/drops/[slug]/opengraph-image.tsx - ShippedREQ-DRP-001
Drops are scheduled, time-bounded releases with per-product inventory caps, per-customer purchase limits, optional waitlists, and countdown timers.
10h agopackages/db/src/migrations/0011_drops.sql×2packages/demo-data/src/packs/0007_drops.ts×2packages/testing/src/drops.test.ts×2+11 more - ShippedREQ-DRP-002
At drop-open, the system must place high-demand items behind a fair queue that assigns a deterministic position per customer/session and admits traffic at a rate the checkout path can absorb.
10h agoapps/web/src/app/(storefront)/drops/[slug]/page.tsxpackages/db/src/migrations/0011_drops.sql - ShippedREQ-DRP-003
Inventory must be held against a cart with a time-to-live (default 5 minutes) and released automatically on expiry; holds must be atomic and immune to double-booking even under thundering-herd load.
10h agoapps/web/src/app/(storefront)/drops/[slug]/page.tsxpackages/db/src/migrations/0011_drops.sql - In progressREQ-DRP-004
The system must apply per-customer rate limits and bot mitigation (device/session signals plus a challenge when risk is high).
packages/db/src/migrations/0011_drops.sql - In progressREQ-DRP-005
Drop analytics must report queue-entry rate, sell-through time, conversion, abandonment, and attribution.
packages/db/src/migrations/0011_drops.sql - ShippedREQ-DRP-500
The /drops/[slug] JSON-LD must include an Event node (alongside the existing WebPage / BreadcrumbList / ItemList) with startDate, endDate, eventAttendanceMode: OnlineEventAttendanceMode, VirtualLocation, organizer, and an eventStatus mappe…
10h agoapps/web/src/lib/dropStructuredData.test.ts×3apps/web/src/lib/dropStructuredData.ts×2apps/web/src/lib/eventStructuredData.ts - ShippedREQ-DRP-501
The /drops/[slug] Event node must carry an offers AggregateOffer child summarizing the drop's SKU lineup: lowPrice / highPrice derived from the min/max pricePerYardMinor across drop.skus, priceCurrency pinned to the lineup's currency, offe…
10h agoapps/web/src/lib/dropStructuredData.ts×5apps/web/src/lib/dropStructuredData.test.ts×3apps/web/src/lib/eventStructuredData.ts - ShippedREQ-DRP-502
The /drops landing page must render a URL-driven filter rail with facet groups status (live | scheduled | ended), category, and when (week | month | past). Every chip is a server-rendered <Link> resolved through buildDropsFilterHref; no cl…
10h agoapps/web/src/app/(storefront)/drops/categories/page.tsx×2apps/web/src/lib/drops.ts×2apps/web/src/components/DropsFilterRail.tsx+1 more - ShippedREQ-DRP-503
The /drops/[slug] page must render a "Related drops" strip below the SKU grid, server-rendered in the initial SSR payload. Queries up to 6 other scheduled or live drops that share at least one category (trimmed, case-insensitive) with the…
10h agoapps/web/src/components/RelatedCardStrip.tsx×3apps/web/src/lib/drops.ts×3apps/web/src/app/(storefront)/drops/[slug]/page.tsx - ShippedREQ-DRP-504
The /drops/[slug] page must render an UrgencyBadge next to DropCountdown, surfacing a single loss-averse nudge based on a fixed priority table: (1) ending-soon when the drop is live and endAt - now ??? 60min ("Ending in under 1h"); (2) low…
10h agoapps/web/src/components/UrgencyBadge.logic.tsapps/web/src/components/UrgencyBadge.tsx - ShippedREQ-DRP-505
The /drops listing page must carry a real metadata export and a colocated opengraph-image.tsx tuned to "Upcoming fabric drops" search intent.
10h agoapps/web/src/app/(storefront)/drops/page.tsx×2apps/web/src/app/(storefront)/drops/opengraph-image.tsx - ShippedREQ-DRP-506
A Route Handler at /drops/[slug]/calendar.ics must serve a valid RFC 5545 VCALENDAR containing a single VEVENT for the drop. Fields: SUMMARY (<drop name> opens), DTSTART / DTEND (UTC), DESCRIPTION (drop description + "The drop opens at..."…
10h agoapps/web/src/components/DropCalendarLinks.tsx×2apps/web/src/app/(storefront)/drops/[slug]/calendar.ics/route.tsapps/web/src/app/admin/drops/[slug]/edit/page.tsx+1 more - ShippedREQ-DRP-507
The /drops/[slug] route must serve a per-slug OpenGraph card at /drops/{slug}/opengraph-image that renders the drop name, a status pill ("Live now" / "Opens {date}" / "Ended"), and formatted date range inside the platform OgBoltCard frame.…
10h agoapps/web/src/app/(storefront)/drops/[slug]/opengraph-image.tsx×3apps/web/src/app/(storefront)/drops/[slug]/page.tsxapps/web/src/lib/dropStructuredData.ts - ShippedREQ-DRP-508
DropCountdown must apply the same boundary-based aria-live="polite" debounce that EventCountdown uses (REQ-EVT-503): a sibling role="status" aria-live="polite" aria-atomic="true" region announces remaining time only at day / hour / 10-min…
10h agoapps/web/src/components/DropCountdown.tsx×2 - ShippedREQ-DRP-509
The /drops/[slug] Event JSON-LD must carry an image field pointing at the per-slug OG card route (/drops/{slug}/opengraph-image, REQ-DRP-507). Mirrors the REQ-EVT-507 pattern. The OG route degrades to a branded generic card rather than 404…
10h agoapps/web/src/lib/dropStructuredData.test.tsapps/web/src/lib/dropStructuredData.ts - ShippedREQ-DRP-511
The /drops/categories page has a colocated opengraph-image.tsx (static, Edge, no DB call) rendering "Shop by Category" inside OgBoltCard. Page metadata.openGraph.images wired for legacy crawlers. Tenant sitemap entry updated to priority: 0…
10h agoapps/web/src/app/(storefront)/drops/categories/opengraph-image.tsxapps/web/src/app/(storefront)/drops/categories/page.tsx - ShippedREQ-DRP-514
Route Handler at /drops/opml.xml: OPML 2.0 document listing /drops/rss.xml as a subscribable outline entry. Cache-Control: public, s-maxage=86400. /drops listing page alternates.types["text/x-opml"] wired (REQ-DRP-514).
10h agoapps/web/src/app/(storefront)/drops/opml.xml/route.tsapps/web/src/app/(storefront)/drops/page.tsx
REQ-EVTEvents & Ticketing33 shipped0 wip4 todo89%
- ShippedREQ-EVT-522
The /events/[slug] Event JSON-LD node carries maximumAttendeeCapacity (from event.capacity) and remainingAttendeeCapacity (from event.remainingCapacity = capacity - activeTicketCount) when capacity is non-null. Google Events card surfaces…
REQUIREMENTS.md verified audit ledger - ShippedREQ-EVT-521
The /events/[slug] iCal VEVENT ORGANIZER CN is now derived from the event's instructor name when present, falling back to "BoltToCart". mailto: stays noreply@<host>. Preserves RFC 5545 ORGANIZER shape (REQ-EVT-521).
10h agoapps/web/src/app/(storefront)/events/[slug]/calendar.ics/route.ts - ShippedREQ-EVT-525
The /events/instructors facet-index instructor cards show a "Next class: May 15 at 2:30 PM" line computed as the instructor's earliest future scheduled event. Uses the new dateRangeLabel helper in formattingLocale.ts. Omitted when there is…
10h agoapps/web/src/lib/events.ts×3apps/web/src/app/(storefront)/events/instructors/page.tsxapps/web/src/lib/formattingLocale.ts - ShippedREQ-EVT-526
The /events index must render an active-filter summary when any instructor, when, or price filter is active. The summary shows the filtered class count, the number of active filters, individual one-tap remove links for each active filter,…
10h agoapps/web/src/app/(storefront)/events/eventsIndexViewModel.test.tsapps/web/src/app/(storefront)/events/eventsIndexViewModel.ts - ShippedREQ-EVT-527
The /events index event cards must include an explicit CTA line at the bottom of each card. Scheduled, not-full classes render "Reserve a seat"; full, live, ended, or otherwise unavailable classes render "View details". This is display-onl…
10h agoapps/web/src/app/(storefront)/events/eventsIndexViewModel.test.tsapps/web/src/app/(storefront)/events/eventsIndexViewModel.ts - ShippedREQ-EVT-528
The /events/[slug] unavailable-registration notice must provide context-specific recovery links. Full scheduled classes link to /events?instructor=<instructorName> as "More from this instructor" and to /events?when=month as "Browse upcomin…
10h agoapps/web/src/app/(storefront)/events/[slug]/unavailableRegistrationViewModel.test.tsapps/web/src/app/(storefront)/events/[slug]/unavailableRegistrationViewModel.ts - ShippedREQ-EVT-524
The /events/[slug] page renders a WishlistHeart when the event is registerable (future-dated, not full, status===scheduled). Uses event.id as the wishlist identifier. Hidden for ended/cancelled/full events. Same a11y posture as the PDP hea…
10h agoapps/web/src/app/(storefront)/events/[slug]/page.tsx×2 - ShippedREQ-EVT-500
The /events/[slug] Event JSON-LD must carry a performer Person node (instructor name + url, per REQ-EVT-002) and an organizer Organization node (name + url) matching the Organization shape /drops/[slug] emits per REQ-DRP-500, so event- and…
10h agoapps/web/src/lib/eventStructuredData.ts×3apps/web/src/lib/eventStructuredData.test.ts×2 - ShippedREQ-EVT-501
The /events/[slug] Event node's offers child must be shaped as an AggregateOffer (parity with REQ-DRP-501) with lowPrice / highPrice / priceCurrency / availability / offerCount / validThrough. Today the v0 single-ticket model collapses low…
10h agoapps/web/src/lib/eventStructuredData.ts×2apps/web/src/lib/eventStructuredData.test.ts - ShippedREQ-EVT-502
The /events/[slug] Event JSON-LD must complete the set of Google-required Event fields by carrying a structured location, an absolute image URL, and a bounded description. location is emitted only when events.location is present: a value s…
10h agoapps/web/src/lib/eventStructuredData.test.ts×6apps/web/src/lib/eventStructuredData.ts×5apps/web/src/app/(storefront)/events/[slug]/opengraph-image.tsx+1 more - ShippedREQ-EVT-503
The /events/[slug] page must render an EventCountdown component above the fold, ticking down to startsAt in the shopper's timezone and mirroring DropCountdown's public prop shape so the two countdowns stay interchangeable at the surface le…
10h agoapps/web/src/components/EventCountdown.logic.test.ts×2apps/web/src/components/EventCountdown.logic.ts×2apps/web/src/components/DropCountdown.tsx+1 more - ShippedREQ-EVT-504
The /events/[slug] page must render a "More from this instructor" related-events strip below the main content, server-rendered in the initial SSR payload. Queries up to 6 nearest-upcoming events (status scheduled or live, excluding the cur…
10h agoapps/web/src/components/RelatedCardStrip.tsx×3apps/web/src/lib/events.ts×2apps/web/src/app/(storefront)/drops/[slug]/page.tsx+2 more - ShippedREQ-EVT-505
A facet-index surface at /events/instructors must list every instructor with at least one upcoming class (scheduled or live), each row carrying a deterministic initials-avatar tile, display name, bio excerpt (??? 160 chars, word-boundary e…
10h agoapps/web/src/app/(storefront)/events/instructors/page.tsx×2apps/web/src/lib/events.ts×2apps/web/src/app/(storefront)/events/instructors/loading.tsx+1 more - ShippedREQ-EVT-506
The /events landing page must render a URL-driven filter rail with facet groups instructor, when (week | month | past), and price (free | paid). Every chip is a server-rendered <Link> that updates / clears a single facet via buildEventsFil…
10h agoapps/web/src/components/EventsFilterRail.tsx×2apps/web/src/lib/dropsFilters.ts×2apps/web/src/lib/eventsFilters.ts - ShippedREQ-EVT-507
The /events/[slug] route must serve a per-slug OpenGraph card at /events/{slug}/opengraph-image (Next.js metadata-convention colocated asset) that renders the class title, instructor, and formatted start date (Weekday, Mon D, H:MM AM) insi…
10h agoapps/web/src/app/(storefront)/events/[slug]/opengraph-image.tsx×2apps/web/src/app/(storefront)/drops/[slug]/page.tsxapps/web/src/lib/dropStructuredData.ts+2 more - ShippedREQ-EVT-508
A Route Handler at /events/[slug]/calendar.ics must serve a valid RFC 5545 VCALENDAR containing a single VEVENT with the full set of fields:
10h agoapps/web/src/components/EventCalendarLinks.tsx×4apps/web/src/app/(storefront)/drops/[slug]/calendar.ics/route.tsapps/web/src/app/(storefront)/events/[slug]/calendar.ics/route.ts+1 more - ShippedREQ-EVT-509
The /events listing page must export a metadata object with title: "Quilting Classes & Workshops ??? BoltToCart" and a description that enumerates the three filter axes the page surfaces (instructor, date window, price) so SERP snippets ma…
10h agoapps/web/src/app/(storefront)/events/opengraph-image.tsxapps/web/src/app/(storefront)/events/page.tsx - ShippedREQ-EVT-511
The /events/instructors page metadata must include alternates.types["application/rss+xml"]: "/events/rss.xml" so feed readers find the events feed from the instructors index. No route or DB change.
10h agoapps/web/src/app/(storefront)/events/instructors/page.tsx - ShippedREQ-EVT-512
/events/instructors/[key] generateMetadata must add RSS autodiscovery (alternates.types["application/rss+xml"]: "/events/rss.xml") and openGraph.images: ["/events/opengraph-image"].
10h agoapps/web/src/app/(storefront)/events/instructors/[key]/page.tsx - ShippedREQ-EVT-513
/events/instructors must serve a colocated opengraph-image.tsx (static, Edge, no DB call) rendering "Instructors" / "Every instructor teaching upcoming classes at the reference store." inside OgBoltCard. Page metadata.openGraph.images wire…
10h agoapps/web/src/app/(storefront)/events/instructors/opengraph-image.tsxapps/web/src/app/(storefront)/events/page.tsx - ShippedREQ-EVT-514
/events/instructors/[key] has a colocated per-instructor opengraph-image.tsx (Node runtime). generateMetadata wires per-key openGraph.images (REQ-EVT-514).
10h agoapps/web/src/app/(storefront)/events/instructors/[key]/opengraph-image.tsxapps/web/src/app/(storefront)/events/instructors/[key]/page.tsxapps/web/src/app/(storefront)/events/instructors/page.tsx - ShippedREQ-EVT-515
Route Handler at /events/opml.xml: OPML 2.0 document listing /events/rss.xml as a subscribable outline entry. Cache-Control: public, s-maxage=86400. /events listing page alternates.types["text/x-opml"] wired (REQ-EVT-515).
10h agoapps/web/src/app/(storefront)/events/opml.xml/route.tsapps/web/src/app/(storefront)/events/page.tsx - ShippedREQ-EVT-517
/events/[slug]/registered adds "Browse fabrics ???" CTA alongside the existing calendar/class/share affordances (REQ-EVT-517).
10h agoapps/web/src/app/(storefront)/events/[slug]/registered/page.tsx - ShippedREQ-EVT-518
/events/[slug] generateMetadata gains alternates.types["application/ld+json"] pointing at the per-slug ld.json endpoint (REQ-EVT-518).
10h agoapps/web/src/app/(storefront)/drops/[slug]/page.tsxapps/web/src/app/(storefront)/events/[slug]/page.tsx - ShippedREQ-EVT-510
/events/instructors/[key] individual instructor detail page. key is URL-encoded normalizeInstructorKey value. Renders: initials avatar + gradient, display name, full bio (not truncated, from loadPublicEventDetail), upcoming-class count, Se…
10h agoapps/web/src/app/(storefront)/events/instructors/[key]/page.tsx×2apps/web/src/app/(storefront)/events/instructors/page.tsx - ShippedREQ-EVT-001
Support one-off events, recurring classes, and multi-session series with per-session attendance.
10h agopackages/demo-data/src/packs/0008_events.ts×2packages/testing/src/events.test.ts×2apps/web/src/app/(storefront)/events/[slug]/actions.ts+12 more - ShippedREQ-EVT-002
Instructors must have profiles, bios, and the ability to manage their own class rosters.
10h agoapps/web/src/lib/eventStructuredData.ts×3packages/db/src/migrations/0012_events.sql×2apps/web/src/app/(storefront)/events/[slug]/page.tsx+1 more - ShippedREQ-EVT-003
Classes must support per-session capacity, optional seat maps, waitlists, and materials fees billed separately from the ticket.
10h agopackages/testing/src/events.test.ts×2packages/db/src/migrations/0012_events.sqlpackages/db/src/repositories/events.ts+1 more - Not startedREQ-EVT-004
Cancellation and reschedule rules must be configurable per event with automated refunds or transfers.
- ShippedREQ-EVT-010
Ticket types (General, VIP, member, etc.) with capacity and pricing per type.
10h agoapps/web/src/app/(storefront)/events/[slug]/actions.tsapps/web/src/lib/eventStructuredData.ts - ShippedREQ-EVT-011
Each ticket issues a unique QR code usable for check-in; check-in must be possible offline and reconcile on sync.
10h agoapps/web/src/app/(storefront)/events/[slug]/page.tsxapps/web/src/app/(storefront)/events/[slug]/registered/layout.tsxapps/web/src/app/(storefront)/events/[slug]/registered/page.tsx+4 more - apps/web/src/app/(storefront)/events/[slug]/actions.ts
- Not startedREQ-EVT-020
Events may bundle a required kit of fabrics and notions; purchasing the ticket can optionally auto-add the kit.
- ShippedREQ-EVT-022
Instructors see a dashboard of registered students, supply lists, and kit fulfillment status.
10h agoapps/web/src/app/admin/events/[id]/page.tsxpackages/db/src/migrations/0012_events.sql - ShippedREQ-EVT-030
Send registration confirmation, reminder, and change notifications via email and SMS per �18.
10h agoapps/web/src/app/(storefront)/events/[slug]/actions.tsapps/web/src/app/(storefront)/events/[slug]/registered/page.tsx
REQ-KITKits, Bundles & Project Shopping1 shipped0 wip3 todo25%
- ShippedREQ-KIT-001
A kit is a composite product with a fixed or curated list of components (fabrics by yardage, precuts, notions, patterns).
10h agopackages/db/src/schema/skus.ts - Not startedREQ-KIT-002
Kits must reserve inventory across all components at purchase; if any component is unavailable, the kit is unavailable (configurable alternative: back-order permitted).
- Not startedREQ-KIT-003
Kits may be tied to patterns and classes so a ticket purchase offers the corresponding kit.
- Not startedREQ-KIT-004
Kits priced as a bundle must still report component-level inventory and attribution.
REQ-INFInfluencer & Affiliate System1 shipped0 wip12 todo8%
- Not startedREQ-INF-001
Influencer accounts with profile, agreed commission terms, and payout destination.
- Not startedREQ-INF-004
Commission tracking visible to both the store and the influencer in real time.
- Not startedREQ-INF-010
Support percentage, fixed, tiered, and product/event-specific commission schedules.
- Not startedREQ-INF-011
Commission rules must support start/end dates, exclusions (e.g., sale items), and per-customer caps.
- Not startedREQ-INF-020
Attribution must use first-touch and last-touch models with a configurable window (default 30 days) and deterministic tie-breaking.
- Not startedREQ-INF-021
Attribution sources include referral link clicks, discount code redemption, and customer-linked sessions.
- Not startedREQ-INF-022
Multi-channel attribution must work across POS, web, and event ticketing (e.g., an in-store QR for an influencer).
- ShippedREQ-INF-030
The system must persist: Influencers, ReferralLinks, DiscountCodes, AttributionSessions, Orders, OrderAttribution, OrderItems, CommissionRules, CommissionLedger, Payouts.
10h agoapps/jobs/src/workers/payoutJob.ts×2packages/events/src/domain/jobs.ts - Not startedREQ-INF-040
Payouts must be produced on a configurable schedule (weekly, monthly) with a minimum threshold.
- Not startedREQ-INF-041
The payout pipeline must reconcile against the commission ledger and produce per-payout statements.
- Not startedREQ-INF-042
Payouts must integrate with a marketplace-payments provider that supports KYC, 1099 reporting, and cross-border payouts where applicable.
REQ-QLTQuilt Pattern Visualization7 shipped0 wip0 todo100%
- ShippedREQ-QLT-001
Customers and store staff must be able to design and preview a quilt pattern with arbitrary fabric assignments and swap fabrics dynamically.
10h agopackages/core/src/quilt/patterns.ts×3apps/web/src/components/QuiltVisualizer.tsx×2apps/web/src/app/(storefront)/visualizer/page.tsx+4 more - ShippedREQ-QLT-002
The Quilt Designer must support comparison of two or more fabric variations side-by-side.
10h agoapps/web/src/app/(storefront)/visualizer/page.tsxapps/web/src/components/QuiltVisualizer.tsx - ShippedREQ-QLT-003
The Quilt Designer must suggest fabrics from in-stock inventory and flag out-of-stock selections.
10h agoapps/web/src/components/QuiltVisualizer.tsx - ShippedREQ-QLT-004
The Quilt Designer must compute yardage requirements per fabric role (top, backing, binding) based on pattern and size.
10h agopackages/core/src/quilt/patterns.test.ts×2packages/core/src/quilt/patterns.ts×2apps/web/src/components/QuiltVisualizer.tsx - ShippedREQ-QLT-005
Outputs must include a shareable preview (image and/or link), a shopping list, and an option to add all required fabrics to cart as a kit.
6h agoapps/web/src/components/QuiltVisualizer.tsx×2apps/web/src/app/(storefront)/visualizer/actions.tsapps/web/src/app/(storefront)/visualizer/page.tsx+2 more - ShippedREQ-QLT-006
The interactive Quilt Designer preview is a client-rendered experience (see section 29 Rendering). Server-side high-quality renders are produced on demand for shareable images and may use GPU compute.
6h agoapps/web/src/app/(storefront)/visualizer/page.tsx×2apps/web/src/components/QuiltVisualizer.tsxapps/web/src/env.ts+1 more - ShippedREQ-QLT-007
Human-facing product copy must refer to the feature as Quilt Designer, not Quilt Visualizer, across storefront navigation, metadata, breadcrumbs, share previews, admin copy, generated preview labels, and documentation. Existing /visualizer…
10h agoapps/web/src/app/(storefront)/visualizer/opengraph-image.tsx
REQ-GSWGuided Shopping Wizard4 shipped0 wip1 todo80%
- ShippedREQ-GSW-001
Entry prompt: "What are you shopping for?" ??? options: Start a new project, Buy fabric, Buy thread, Shop events, Browse.
10h agoapps/web/src/app/(storefront)/wizard/page.tsx×3apps/web/src/app/(storefront)/wizard/opengraph-image.tsx×2apps/web/src/app/(storefront)/wizard/project/page.tsx+1 more - ShippedREQ-GSW-002
Project flow: pick pattern ??? choose size ??? pick fabrics (top, backing, binding) ??? pick batting ??? pick thread ??? tools & extras ??? review ??? add to cart.
10h agoapps/web/src/app/(storefront)/wizard/project/actions.tsapps/web/src/lib/kitCart.ts - ShippedREQ-GSW-004
The wizard must compute and display total yardage, estimated subtotal, and substitution options.
10h agoapps/web/src/app/(storefront)/wizard/project/actions.ts - apps/web/src/app/(storefront)/wizard/project/page.tsx×2packages/db/src/migrations/0014_customer_projects.sql×2apps/web/src/app/(storefront)/wizard/project/actions.ts+8 more
REQ-SYNMulti-Channel Sync & Offline0 shipped2 wip6 todo0%
- In progressREQ-SYN-001
Inventory changes from any channel (POS, web, drops, events) must propagate to other active channels within 2 seconds at p95 under normal load.
apps/web/src/lib/roadmap.test.ts×2 - Not startedREQ-SYN-002
Drop countdowns, class check-ins, and POS cart updates must use a realtime transport capable of ordered per-channel delivery (see �29).
- Not startedREQ-SYN-010
The iPad POS must remain fully functional offline for sales of items whose inventory is non-contested locally.
- In progressREQ-SYN-011
Offline sales of items with limited inventory (drops, last-bolt items) must be either disallowed offline or reserved via a server hold taken while online and redeemed offline.
apps/pos/src/runtime/registerWorkbench.test.ts - Not startedREQ-SYN-012
On reconnection, transactions sync in order of occurrence with idempotent, server-authoritative application.
- Not startedREQ-SYN-013
Local-first replication is a scoped capability, not the default application data path. BoltToCart will use a proprietary local-first sync layer only where offline operation, restart durability, or sub-second register latency requires it (i…
- Not startedREQ-SYN-020
The system must define a documented conflict resolution model for each mutable entity. Default model:
- Not startedREQ-SYN-021
The server must never oversell a bolt even under concurrent offline sync. If an offline sale cannot be honored on sync, the system must generate an exception for staff remediation (refund, substitute, or split).
REQ-NOTNotifications0 shipped0 wip5 todo0%
- Not startedREQ-NOT-001
Support transactional email (order, ticket, shipping, password), marketing email (drops, classes, abandoned cart), SMS (order, ticket, event reminder, drop alert), and web/mobile push.
- Not startedREQ-NOT-002
Each store must have a verified sender identity with SPF/DKIM/DMARC alignment and a per-store unsubscribe center.
- Not startedREQ-NOT-003
Marketing messaging must honor CAN-SPAM and TCPA: explicit consent capture, list hygiene, opt-out within one business day.
- Not startedREQ-NOT-004
Critical notifications must have a delivery-retry policy and an observable delivery-success metric; deliverability dashboards per store are required.
REQ-SRCSearch & Discovery17 shipped0 wip1 todo94%
- ShippedREQ-SRC-514
The /opensearch.xml URL template was expanded from ?q={searchTerms} to ?q={searchTerms}&sort=relevance (REQ-SRC-514). JSON suggestions template omitted: no /shop/suggest.json (or similar) endpoint exists today. AUDIT-DEFERRED: Add <Url typ…
9h agoapps/web/src/app/(storefront)/opensearch.xml/route.ts - ShippedREQ-SRC-515
The /shop page metadata must reflect text-search intent when ?q=<query> is present. For search URLs, generateMetadata uses title Search results for "<query>" — BoltToCart and a description that says the catalog is showing fabric matching t…
2m agoapps/web/src/app/(storefront)/shop/page.tsx - ShippedREQ-SRC-516
The tenant /opensearch.xml response body must include a <Language> element using DEFAULT_LOCALE, placed near the existing <Description> / <InputEncoding> fields. The HTTP Content-Language header remains unchanged. This gives OpenSearch cli…
9h agoapps/web/src/app/(storefront)/opensearch.xml/route.ts - ShippedREQ-SRC-517
The /shop/widths facet-index page must render an empty-state card instead of calling notFound() when a tenant has zero width-tagged SKUs. The empty state explains that widths will appear as SKUs are attributed and links to /shop. When widt…
10h agoapps/web/src/app/(storefront)/shop/widths/page.tsx - ShippedREQ-SRC-513
Added sort key "newest-by-collection" to the shop PLP dropdown (label: "Newest (by collection)"). Sorts by collection name ascending (SKUs without a collection sort last), then by createdAt descending within each group. Pure loader/sort ch…
10h agoapps/web/src/lib/storefront.ts×2 - ShippedREQ-SRC-001
Provide faceted search across SKU, collection, designer, color, width, fiber, weight, pattern type, price, and availability, with sub-200ms p95 response time for the storefront.
10h agopackages/testing/src/search.test.ts×3apps/web/src/lib/storefront.ts×2packages/demo-data/src/packs/0006_storefront_catalog.ts×2+10 more - Not startedREQ-SRC-002
Provide color search (pick a color or upload an image) using dominant colors extracted during media ingest.
- ShippedREQ-SRC-003
Provide semantic search for free-text queries ("blue floral for a baby quilt") using vector embeddings stored with SKUs.
10h agoapps/web/src/lib/storefront.tspackages/db/src/repositories/skus.ts - ShippedREQ-SRC-004
Storefront listings must expose canonical URLs, sitemap entries, and structured data for SEO. Sitemaps and robots.txt are served per-origin: the platform apex advertises only platform URLs; each tenant subdomain advertises only that tenant…
2m agoapps/web/src/app/(storefront)/events/instructors/page.tsx×2apps/web/src/app/(storefront)/shop/[slug]/page.tsx×2apps/web/src/app/(storefront)/shop/page.tsx×2+28 more - ShippedREQ-SRC-500
Expose a /shop/fibers facet-index page listing every fiber-content tag (with current cuttable-SKU counts) as a bookmarkable discovery surface, deep-linking to /shop?fiber=<value> for the filtered catalog view. Mirrors the structure of /sho…
2m agoapps/web/src/app/(storefront)/shop/fibers/page.tsxapps/web/src/app/(storefront)/shop/page.tsx - ShippedREQ-SRC-501
Expose a /shop/widths facet-index page listing every distinct bolt-width value (with current cuttable-SKU counts) as a bookmarkable discovery surface, deep-linking to /shop?width=<value> for the filtered catalog view. Mirrors the structure…
2m agoapps/web/src/app/(storefront)/shop/page.tsxapps/web/src/app/(storefront)/shop/widths/page.tsx - ShippedREQ-SRC-502
The /shop/rss.xml RSS channel emits <itunes:keywords> and the /opensearch.xml
9h agoapps/web/src/app/(storefront)/opensearch.xml/route.tsapps/web/src/app/(storefront)/shop/rss.xml/route.tsapps/web/src/lib/channelKeywords.test.ts+1 more - ShippedREQ-SRC-503
/shop/widths facet-index page lists all unique fabric-width values present in published SKUs, each with a bolt count. Mirrors the /shop/fibers and /shop/collections pages (REQ-SRC-500/501). BreadcrumbList JSON-LD: "Home ??? Shop ??? Browse…
10h agoapps/web/src/app/(storefront)/shop/widths/page.tsx - ShippedREQ-SRC-504
/drops/rss.xml and /events/rss.xml must emit <itunes:keywords> (via xmlns:itunes namespace) derived from drop categories and instructor names respectively, matching the pattern REQ-SRC-502 established for /shop/rss.xml. Greedy 255-char fit…
10h agoapps/web/src/app/(storefront)/drops/rss.xml/route.tsapps/web/src/app/(storefront)/events/rss.xml/route.ts - ShippedREQ-SRC-505
/drops/rss.xml must emit a per-item <dc:creator> element (Dublin Core) when the drop has at least one SKU with a non-null designer field ??? using the first designer alphabetically as the attribution. Omitted when no SKU has a designer (ho…
10h agoapps/web/src/lib/drops.ts×2apps/web/src/app/(storefront)/drops/rss.xml/route.ts - ShippedREQ-SRC-507
Route Handler at /shop/opml.xml: OPML 2.0 document listing /shop/rss.xml as a subscribable outline entry. Cache-Control: public, s-maxage=86400. /shop listing page alternates.types["text/x-opml"] wired (REQ-SRC-507).
2m agoapps/web/src/app/(storefront)/shop/opml.xml/route.tsapps/web/src/app/(storefront)/shop/page.tsx - ShippedREQ-SRC-508
Tenant sitemap promotes live drops (startAt <= now < endAt) to changeFrequency: hourly during the sale window (REQ-SRC-508).
10h agoapps/web/src/app/sitemap.ts - ShippedREQ-SRC-509
/shop PLP metadata adds alternates.types["application/opensearchdescription+xml"]: "/opensearch.xml" so browsers offer fabric search in URL-bar autocomplete (REQ-SRC-509).
2m agoapps/web/src/app/(storefront)/shop/page.tsx
REQ-CRMCustomer Management & Loyalty8 shipped1 wip9 todo44%
- ShippedREQ-CRM-001
Unified customer profile across POS, web, events, and drops, keyed by email or phone with merge support.
6h agopackages/db/src/migrations/0013_customers.sql×3packages/demo-data/src/packs/0009_customers.ts×2packages/testing/src/customers.test.ts×2+6 more - ShippedREQ-CRM-002
Purchase history, event history, saved projects, wishlists, and preferences. Customer account surfaces are served on the tenant storefront origin (<subdomain>.<root>/account) and are noindex. See also: REQ-ARC-036.
10h agoapps/web/src/app/account/wishlist/actions.ts×2packages/db/src/migrations/0013_customers.sql×2packages/db/src/migrations/0015_customer_wishlist.sql×2+21 more - ShippedREQ-CRM-003
Loyalty program with configurable earn rules (per dollar, per yard, per event), tier ladder, and redemption against orders and tickets.
10h agopackages/db/src/migrations/0016_loyalty.sql×3packages/events/src/domain/loyalty.ts×3packages/db/src/migrations/0028_customer_segments.sql×2+12 more - ShippedREQ-CRM-004
Marketing segment builder with exportable lists and one-click audience handoff to the email/SMS provider.
10h agopackages/db/src/migrations/0028_customer_segments.sql×2packages/testing/src/customerSegments.test.ts×2packages/db/src/migrations/0013_customers.sql+2 more - packages/db/src/migrations/0013_customers.sqlpackages/db/src/migrations/0014_customer_projects.sqlpackages/db/src/migrations/0015_customer_wishlist.sql
- ShippedREQ-CRM-502
/admin/crm/segments renders persisted customer segment definitions through segmentsRepo.list, displays evaluated membership counts from segmentsRepo.countMembers, labels supported structured rules, and links to the segment creation surface…
10h agopackages/db/src/migrations/0032_customer_segments_rule_json.sql×2apps/web/src/app/admin/crm/segments/page.tsxpackages/testing/src/customerSegmentsMembership.test.ts - ShippedREQ-CRM-546
/admin/crm/contacts renders a tenant-scoped CRM contacts grid backed by contactsRepo.list, with source filter chips for all / website / POS / import / manual, per-source counts, accessible table semantics, and empty states for both no cont…
10h agoapps/web/src/app/admin/crm/contacts/page.tsx - ShippedREQ-CRM-501
/admin/loyalty/settings loyalty-program configuration page. Reads earn rates (pts/$1, pts/yd, event bonus, discount/100pts) and tier thresholds (Silver/Gold lifetime pts) from customerLoyaltyRepo.getSettingsRow. Read-only display; edit for…
10h agoapps/web/src/app/admin/loyalty/settings/page.tsx - ShippedREQ-CRM-500
/admin/crm/segments customer segment list. Honest placeholder with four example segment rows (greyed out) and a 'New segment (coming soon)' CTA. Data lands when customer_segments schema ships.
10h agopackages/db/src/migrations/0018_customer_purchase_fields.sql×3packages/db/src/migrations/0028_customer_segments.sql×2packages/testing/src/customerPurchaseFields.test.ts×2+3 more - Not startedREQ-CRM-547
/admin/customers must render an active-filter summary whenever search, tier, spend, or sort deviates from the default, including a one-click clear-all link back to the unfiltered customer list.
- Not startedREQ-CRM-548
/admin/customers tier chips, sort links, search form, clear-search link, and pagination must preserve the active lifetime-spend filter so admins do not lose a segment while paging or refining.
- Not startedREQ-CRM-549
/admin/customers/customers.csv must honor the same search, loyalty-tier, lifetime-spend, and sort params as the customer grid so exported CSVs match the visible cohort.
- Not startedREQ-CRM-550
/admin/customers CSV export links and suggested download filenames must include active filter suffixes for search, tier, spend, and sort where present.
- Not startedREQ-CRM-551
/admin/customers must expose order count and lifetime spend columns in the customer table to make high-value accounts visible without opening each detail page.
- Not startedREQ-CRM-552
/admin/customers must include a visible cohort summary for the current loaded window: visible page count, matching cohort count, loaded-window count, and tenant total.
- Not startedREQ-CRM-553
/admin/customers/[id] must expose a copy-Clerk-user-id affordance beside the stored Clerk user id for staff support handoffs.
- Not startedREQ-CRM-554
/admin/customers/[id] must compute and display average order value from lifetime spend divided by order count, rendering zero for customers with no orders.
- Not startedREQ-CRM-555
/admin/customers/[id] must expose a print-summary control in the detail header for staff account reviews.
REQ-STFStaff & Multi-Store1 shipped0 wip3 todo25%
- ShippedREQ-STF-001
Role-based access control with at least these built-in roles: Owner, Manager, Cashier, Fulfillment, Instructor, Accountant, Read-only. Custom roles with per-capability permissions must be supported.
10h agoapps/web/src/app/admin/coupons/new/actions.tsapps/web/src/app/admin/drops/new/actions.tsapps/web/src/app/admin/events/new/actions.ts+1 more - Not startedREQ-STF-002
Every state-changing action must be recorded in an immutable audit log with actor, before/after, and reason where applicable.
- Not startedREQ-STF-003
Multi-location support with per-location inventory, staff assignments, and transfer workflow.
- Not startedREQ-STF-004
Session and device management: list active sessions, revoke any session, enforce idle timeout, require step-up auth for sensitive actions.
REQ-RPTReporting & Analytics0 shipped0 wip7 todo0%
- Not startedREQ-RPT-001
Sales reports by yardage, SKU, collection, designer, channel, staff, day/hour, and customer segment.
- Not startedREQ-RPT-002
Inventory reports: stock levels, turnover, sell-through, remnant ratio, shrinkage, landed cost vs. margin.
- Not startedREQ-RPT-003
Event/drop reports: registrations, attendance, waitlist conversion, sell-through time, queue health.
- Not startedREQ-RPT-004
Influencer reports: revenue attribution, commission accrued, payout status, ROI by campaign.
- Not startedREQ-RPT-006
Dashboards must render top-of-funnel KPIs (today's sales, open orders, active carts, drop status) with ??? 10s staleness.
- Not startedREQ-RPT-007
Tenant cost-of-service (Runpod GPU-seconds, Neon compute, bandwidth, Stripe fees, email/SMS volume) must be visible to platform operators per REQ-ANL-032 and surface-able to store owners where relevant to their plan.
REQ-HDWHardware Ecosystem1 shipped0 wip4 todo20%
- Not startedREQ-HDW-001
Primary POS station: iPad (14" recommended), stand, receipt printer, cash drawer, Bluetooth scanner.
- ShippedREQ-HDW-002
Optional: customer-facing display, thermal label printer, scale (for by-weight items), payment terminal.
10h agoapps/pos/src/hw/customerDisplay.tsapps/pos/src/hw/physicalScale.ts - Not startedREQ-HDW-003
Supported protocols: ESC/POS for receipt printers (USB/LAN/Bluetooth), HID for scanners, RJ-11 kick for cash drawers, ZPL/EPL for label printers, certified payments SDKs for card terminals including Tap-to-Pay on iPad/iPhone where availabl…
- Not startedREQ-HDW-004
Hardware pairing must be self-service via the POS app with diagnostics and firmware/driver update prompts.
- Not startedREQ-HDW-005
The platform must publish a certified-hardware compatibility matrix and test new devices before listing.
REQ-APIPublic API & Extensibility0 shipped1 wip4 todo0%
- Not startedREQ-API-001
Publish a versioned public API covering inventory, orders, customers, events, tickets, drops, and influencer data with OpenAPI schemas.
- In progressREQ-API-003
Webhooks for all significant events (order.created, cut.completed, drop.opened, ticket.checked_in, payout.paid), with signing, retries, and a dead-letter queue.
packages/db/src/migrations/0008_webhook_delivery.sql - Not startedREQ-API-004
Rate limiting, quotas, and a developer portal with docs, sandbox, and usage analytics.
- Not startedREQ-API-005
A plugin/app model for third-party extensions with permission scopes and review.
REQ-SECSecurity, Privacy & Compliance6 shipped0 wip11 todo35%
- Not startedREQ-SEC-001
Authentication via a managed identity provider with MFA support; device-bound sessions for POS.
- ShippedREQ-SEC-002
Role-based access control with tenant isolation enforced at both application and database (RLS) layers.
10h agoapps/web/src/lib/safeEventSlug.ts×2apps/web/src/lib/wizard.test.ts×2apps/web/src/app/(storefront)/cart/actions.ts+41 more - Not startedREQ-SEC-003
Secrets must be stored in a managed secrets system; no secrets in code or environment dumps.
- ShippedREQ-SEC-004
All traffic must be TLS 1.2+; HSTS enforced; HTTPS-only cookies; SameSite=Lax default.
10h agoapps/web/next.config.mjs - Not startedREQ-SEC-006
Vulnerability management: dependency scanning in CI, periodic third-party penetration tests, bug-bounty contact.
- Not startedREQ-SEC-007
Bot prevention: public and high-risk surfaces must be protected by a CAPTCHA-class challenge layered on top of per-IP and per-session rate limits. Required surfaces include account signup, password reset, checkout, drop queue entry, event…
- Not startedREQ-SEC-010
Card data handling must qualify for PCI DSS SAQ-A by using hosted iframes or tokenization; card PAN must never touch BoltToCart servers.
- Not startedREQ-SEC-011
3-D Secure 2 must be supported; Stripe Radar-class fraud scoring (or equivalent) must be enabled for card-not-present.
- Not startedREQ-SEC-012
Chargebacks must have a workflow that ties disputes to orders, evidence, and a response SLA.
- ShippedREQ-SEC-020
Privacy posture must cover GDPR and CCPA/CPRA: lawful-basis tracking, data subject access/export/deletion, consent for marketing, minor handling, data map. Admin, account, cart, and auth surfaces must be noindex and excluded from sitemaps…
8h agoapps/web/src/app/(platform)/(auth)/layout.tsxapps/web/src/app/(platform)/privacy/page.tsxapps/web/src/app/(platform)/terms/page.tsx+11 more - ShippedREQ-SEC-021
Personal data retention must have configurable policies per data class; PII purges must be auditable. Analytics events are subject to the same retention policy and the PII minimization rule in REQ-ANL-003; session replays are redacted and…
10h agopackages/events/src/domain/customers.ts×2apps/web/src/app/admin/audit/page.tsx - ShippedREQ-SEC-022
A cookie/consent banner and preference center must be available for all storefronts. Analytics, session replay, and marketing pixels must respect the preference state on every event emission.
10h agoapps/web/src/components/CookieBanner.tsx×2apps/web/src/app/(platform)/cookies/CookieSettingsForm.tsxapps/web/src/components/CookieBannerGate.tsx+3 more - Not startedREQ-SEC-030
Sales tax must be computed per U.S. state economic-nexus rules and per destination locality, with support for tax-exempt customers (resale certificates stored).
- Not startedREQ-SEC-031
For international expansion, the system must integrate a tax engine capable of VAT/GST (deferred to v1+).
- ShippedREQ-SEC-040
All customer-facing surfaces must meet WCAG 2.2 AA; automated checks in CI and periodic manual audits.
10h agoapps/web/src/app/(platform)/accessibility/page.tsxapps/web/src/components/LegalFooterLinks.tsxapps/web/src/components/StorefrontShell.tsx - Not startedREQ-SEC-041
POS must be usable with VoiceOver on iPad and include large-text and high-contrast modes.
REQ-ANLAnalytics & Telemetry5 shipped1 wip17 todo22%
- ShippedREQ-ANL-001
Every business/domain event type is defined in the shared packages/events catalog (AsyncAPI-style), typed end-to-end, emitted exactly once per business occurrence via a transactional outbox, and versioned. Ad-hoc event names or untyped pay…
10h agopackages/demo-data/src/packs/0010_loyalty.ts×2packages/db/src/migrations/0002_event_outbox.sqlpackages/db/src/migrations/0003_receiving.sql+21 more - ShippedREQ-ANL-002
Every event ??? of any class ??? carries a standard context object: eventId, occurredAt, tenantId, userId (nullable), sessionId, requestId, traceId, releaseVersion, source (web|pos|server|job). Context is injected by framework middleware;…
10h agopackages/core/src/telemetry/types.ts - ShippedREQ-ANL-003
PII minimization: events never carry raw PAN, full addresses, or PII beyond the identifying tenantId/userId, except where an event is specifically a PII event (KYC, profile update) which is marked as such and subject to �25.3 retention pol…
10h agoapps/pos/src/flow/receiptDelivery.tsapps/web/src/app/admin/audit/page.tsxpackages/events/src/defineEvent.ts+2 more - In progressREQ-ANL-004
Tenant isolation applies to analytics as strictly as to data: every query against event data is scoped to a tenant or explicitly marked "platform-wide" and gated behind operator-only auth.
packages/db/src/migrations/0002_event_outbox.sql - ShippedREQ-ANL-020
Outbox delivery. Business events in the transactional outbox are delivered to per-tenant HTTPS webhook endpoints with an HMAC-SHA256 signature over <timestampMs>.<rawBody>, exponential-backoff retries on transient failures, and a dead-lett…
10h agoapps/jobs/src/workers/outbox-relay.ts×3apps/web/src/lib/roadmap.test.ts×2packages/db/src/migrations/0008_webhook_delivery.sql×2+12 more - Not startedREQ-ANL-010
All product/UX events emit through a single SDK wrapper in packages/core/telemetry. Feature code never calls the analytics vendor directly ??? this indirection lets us swap vendors without touching feature code.
- Not startedREQ-ANL-011
Funnels instrumented from day one for: onboarding (REQ-ONB-*), ecom checkout, POS cut-to-paid, drop queue-to-won, guided project wizard, influencer link-to-sale, event registration.
- Not startedREQ-ANL-012
Retention cohorts computable by store activation month (tenants) and by end-customer first-purchase month.
- Not startedREQ-ANL-013
Session replay available for storefront and admin surfaces, with automatic redaction of all input fields marked PII/payment; default retention 30 days, configurable per-tenant per �25.3.
- Not startedREQ-ANL-014
Feature-flag exposure (REQ-ARC-031) automatically emits an exposure event correlated with downstream outcome metrics so every flag rollout produces a measurable effect size.
- ShippedREQ-ANL-021
POS app performance telemetry: scan-to-add latency (REQ-NFR-002), tender-to-receipt latency, offline-session duration, sync catch-up duration, crash-free-session rate, hardware pairing success rate, bundle install/update success.
10h agopackages/events/src/domain/pos.ts×2 - Not startedREQ-ANL-022
Runtime errors ??? JS errors and native crashes ??? aggregated per release with source maps, release tagging, and per-tenant slicing. Alerts on new or regressed errors.
- Not startedREQ-ANL-023
RUM data is sliceable by tenant, route, release, device class, connection class, A/B experiment variant.
- Not startedREQ-ANL-030
Domain events, operational metrics, and a curated subset of transactional tables replicate to an analytics warehouse with freshness SLO of ??? 15 minutes for operational metrics and ??? 24 hours for full historical sync.
- Not startedREQ-ANL-031
A semantic layer (dbt or equivalent) translates raw event tables into governed business metrics: GMV, take rate, active stores, retention, LTV, CAC-equivalent, margin-per-store. All dashboards consume this layer, not raw tables, to prevent…
- Not startedREQ-ANL-032
Per-tenant cost attribution: capture Runpod GPU-seconds, Neon compute-minutes, Vercel bandwidth, Stripe fees, email/SMS volume, and storage consumption per tenant. Drives margin-per-store reporting and is a precondition for pricing-plan de…
- Not startedREQ-ANL-040
Store-owner dashboard (scoped to their tenant): today's sales, active carts, open orders, drop status, cut queue, staff activity, inventory-confidence score, Core Web Vitals for their storefront, top POS errors.
- Not startedREQ-ANL-041
Platform-operator dashboard (all tenants, operator-only auth): MRR/ARR, net revenue retention, active stores, churn risk cohort, top cost-contributor tenants, platform error rate, drop queue depth, SLO burn-rates.
- Not startedREQ-ANL-042
Every major feature ships with at least one dashboard tile ??? this is a Definition-of-Done checklist item.
- Not startedREQ-ANL-043
Dashboards render exclusively from the semantic layer (REQ-ANL-031); bespoke queries against raw event tables are rejected in review.
- Not startedREQ-ANL-051
Burn-rate alerts (multi-window, multi-burn-rate) route to on-call per REQ-OBS-008 when an SLO budget is at risk. Alerts link to a runbook.
- Not startedREQ-ANL-052
Alert hygiene: every alert must be actionable, linked to a runbook, and have a named owner. Alerts and their false-positive rate are reviewed quarterly; chronically noisy alerts are fixed or retired.
REQ-OBSObservability & Disaster Recovery0 shipped0 wip8 todo0%
- Not startedREQ-OBS-001
Centralized structured logging with per-tenant tagging and the standard context object from REQ-ANL-002; logs retained ??? 30 days hot, ??? 1 year cold.
- Not startedREQ-OBS-002
Error tracking with per-release and per-tenant slicing; alerting on new/regressed errors.
- Not startedREQ-OBS-003
APM with OpenTelemetry distributed tracing end-to-end (Next.js ??? Postgres ??? jobs ??? Runpod ??? Stripe), database query insights, and a synthetic probe hitting POS and checkout paths every minute.
- Not startedREQ-OBS-005
RPO (recovery point objective) ??? 5 minutes for transactional data via point-in-time recovery.
- Not startedREQ-OBS-006
RTO (recovery time objective) ??? 1 hour for the primary region; ??? 4 hours for full regional failover.
- Not startedREQ-OBS-008
Incident runbooks and on-call rotation; customer-impacting incidents must produce a public postmortem within 5 business days.
REQ-UXUX Principles24 shipped0 wip12 todo67%
- Not startedREQ-UX-001
Fast checkout ??? p95 cart-to-paid ??? 10 seconds on reference iPad hardware for a typical 3-line fabric sale.
- Not startedREQ-UX-002
Minimal-click design: core POS actions reachable within 2 taps from the register home.
- ShippedREQ-UX-003
Tablet-first and visual-first design for the POS; responsive, mobile-first for storefronts.
2m agoapps/web/src/app/(storefront)/cart/loading.tsxapps/web/src/app/(storefront)/drops/loading.tsxapps/web/src/app/(storefront)/events/instructors/loading.tsx+8 more - apps/web/src/app/(platform)/accessibility/page.tsx
- Not startedREQ-UX-005
Storefront performance budget: LCP ??? 2.0s, INP ??? 200ms, CLS ??? 0.1 at p75 on 4G reference devices (matching Core Web Vitals "Good").
- ShippedREQ-UX-006
Internationalization: v1 US/English-only; i18n scaffolding must be present so locales and currencies can be added without a re-architecture.
10h agoapps/web/src/lib/formattingLocale.ts×10apps/web/src/i18n/config.test.ts×2apps/web/src/i18n/config.ts+3 more - ShippedREQ-UX-510
scroll-margin-top: 5rem extended to h4[id] anchor destinations in globals.css. Extends REQ-UX-501 (h2[id], h3[id]) to h4. The admin audit FAQ and drop/event detail pages use <h4 id="..."> deep-link targets that hide under the sticky header…
10h agoapps/web/src/app/globals.css - Not startedREQ-UX-511
text-wrap: balance extended to th in globals.css. Admin table column headers (Bolt, Designer, Status, Cuttable yardage, Last updated) are short label-tier strings that benefit from balanced wrapping, exactly as <caption>, <dt>, and <summar…
- Not startedREQ-UX-513
@media print ??? table { table-layout: auto !important } + td, th { width: auto !important; white-space: normal !important } in globals.css. Resets Tailwind's fixed-width column utilities (w-*) on print so date, yardage, and ID values don'…
- ShippedREQ-UX-515
.animate-pulse { animation: none !important } inside the @media (prefers-reduced-motion: reduce) block in globals.css. Tailwind's .animate-pulse class uses animation: pulse 2s cubic-bezier(...) infinite which has higher specificity than th…
REQUIREMENTS.md verified audit ledger - Not startedREQ-UX-516
text-wrap: pretty extended to td in globals.css. Admin table cells with multi-word content (event names, customer names, SKU descriptions) can orphan a single word on wrap. pretty is cheaper than balance for flowing prose and appropriate f…
- Not startedREQ-UX-517
data-print-hidden attribute on the five bolt-action <section> elements in apps/web/src/app/admin/bolts/[boltId]/page.tsx (Cut yardage, Split, Merge, Override status, Restock). The global [data-print-hidden] { display: none !important } pri…
- Not startedREQ-UX-512
scrollbar-gutter: stable on #admin-main-content and #storefront-main in globals.css. Reserves a fixed gutter for the OS scrollbar even when no overflow is present, preventing the ~16px layout shift that occurs when a tall page replaces a s…
- ShippedREQ-UX-539
scroll-margin-top: 5rem extended to h6[id] anchors in globals.css. Completes the h2..h6 sweep started by REQ-UX-501 (h2[id], h3[id]), REQ-UX-510 (h4[id]), and REQ-UX-538 (h5[id]). The admin audit FAQ and a handful of legal-page deep-TOC su…
10h agoapps/web/src/app/globals.css - Not startedREQ-UX-540
text-wrap: balance extended to <legend> in globals.css. Completes the short-label-tier sweep started by REQ-UX-503 (<caption>, <dt>, <summary>). Admin fieldsets (/admin/receiving/new, /admin/settings, /admin/events/new, /admin/drops/new) u…
- ShippedREQ-UX-541
@media (forced-colors: active) { .truncate-cell { forced-color-adjust: auto } } override in globals.css. The REQ-UX-530 .truncate-cell utility is purely structural (ellipsis overflow) ??? the cell carries no author color that needs preserv…
10h agoapps/web/src/app/globals.css - ShippedREQ-UX-542
@media print { nav { display: none !important } } rule added to globals.css so every <nav> landmark ??? the storefront shell header/footer nav rails, the mobile drawer <nav>, the admin nav rail, and any future primary/secondary nav ??? is…
10h agoapps/web/src/app/globals.css - Not startedREQ-UX-543
touch-action: manipulation extended to [role="button"] in globals.css ??? extends the REQ-UX-506 base-layer rule from button, a to synthetic-button ARIA surfaces. Radix Primitives, shadcn/ui, and a handful of hand-rolled interactive elemen…
- ShippedREQ-UX-549
accent-color fallback chain on input[type="checkbox"] and input[type="radio"] in globals.css. The existing base-layer rule (accent-color: #171717) is upgraded to var(--bolt-accent, #171717) so a tenant that publishes --bolt-accent on the t…
10h agoapps/web/src/app/globals.css - Not startedREQ-UX-550
Quilt Designer photo-preview button copy shortened from "Generate quick photo render" to "Generate Preview" in QuiltVisualizer.tsx. Pure copy change that keeps the action label concise while preserving the same behavior.
- ShippedREQ-UX-548
@media print { table thead { background: transparent !important } } rule added to globals.css. Admin tables use bg-neutral-100 / bg-neutral-800 on <thead> to separate the header band from body rows on screen; on paper that fill prints as a…
10h agoapps/web/src/app/globals.css - Not startedREQ-UX-547
prefers-reduced-motion: reduce override of the UrgencyBadge pulse (REQ-DRP-504). Audit entry ??? confirmed already compliant. apps/web/src/components/UrgencyBadge.tsx reads prefers-reduced-motion via the usePrefersReducedMotion() hook and…
- ShippedREQ-UX-546
text-wrap: pretty extended to <small> in globals.css. Extends the REQ-UX-500 selector group (li, dd, blockquote, figcaption) to cover fine-print <small> content ??? legal disclaimers, ratings footnotes, pricing asterisks, and microcopy cap…
10h agoapps/web/src/app/globals.css - ShippedREQ-UX-545
overscroll-behavior: contain on #visualizer-canvas in globals.css. The /visualizer design-surface wrapper (components/QuiltVisualizer.tsx) gains a stable id="visualizer-canvas" so the CSS rule can target it. When the generated SVG is talle…
10h agoapps/web/src/app/globals.cssapps/web/src/components/QuiltVisualizer.tsx - ShippedREQ-UX-544
scrollbar-gutter: stable on #cart-summary in globals.css. The cart sticky-summary <section> (apps/web/src/app/(storefront)/cart/page.tsx) gains a stable id="cart-summary" so the CSS rule can target it. Swapping between "subtotal only" and…
10h agoapps/web/src/app/(storefront)/cart/page.tsxapps/web/src/app/globals.css - ShippedREQ-UX-500
text-wrap: pretty extended to <li>, <dd>, <blockquote>, <figcaption> in globals.css so long-prose bullets on the platform legal / info pages (/privacy, /terms, /accessibility, /cookies, /security) stop orphaning a single short word on the…
10h agoapps/web/src/app/globals.css×2 - ShippedREQ-UX-501
scroll-margin-top: 5rem on h2[id] / h3[id] anchor-destination headings in globals.css as a per-target backstop for the global html { scroll-padding-top: 5rem } rule. Covers programmatic scrollIntoView({ block: "start" }) calls and anchors…
10h agoapps/web/src/app/globals.css - ShippedREQ-UX-502
@media (prefers-contrast: more) block in globals.css bumps Tailwind border-neutral-100/200 to neutral-400 (light) and border-neutral-800/900 to neutral-500 (dark), and promotes non-active link underlines from hover-only to always-on. Honor…
10h agoapps/web/src/app/globals.css - ShippedREQ-UX-503
text-wrap: balance extended to <caption>, <dt>, <summary> in globals.css. Short label-tier text containers (table captions, definition-list terms, disclosure summaries) share the same "multi-line label that orphans its last word" failure m…
10h agoapps/web/src/app/globals.css - ShippedREQ-UX-509
@media print rules for the storefront PDP in globals.css. Collapses the two-column article > .grid hero-gallery / detail-text layout to a single column (grid-template-columns: 1fr !important) and caps the first child (gallery column) at 40…
10h agoapps/web/src/app/globals.css - ShippedREQ-UX-508
aspect-ratio: 1/1 on the PDP hero-image container. The ProductGallery component in apps/web/src/components/ProductGallery.tsx already uses Tailwind's aspect-square utility (aspect-ratio: 1/1) on the hero image container (<div className="as…
REQUIREMENTS.md verified audit ledger - ShippedREQ-UX-507
@media (forced-colors: active) { .focus-ring:focus-visible { outline: 2px solid ButtonText; outline-offset: 2px; } } added to globals.css. Windows High Contrast Mode replaces the author color palette, which silently erases box-shadow-based…
10h agoapps/web/src/app/globals.css×2 - ShippedREQ-UX-506
touch-action: manipulation on button, a in apps/web/src/app/globals.css (the equivalent base stylesheet since packages/ui has no CSS file of its own). Removes the 300 ms tap delay on iOS Safari 15 and older Android WebView builds by opting…
10h agoapps/web/src/app/globals.css - ShippedREQ-UX-505
@media print CSS rule [data-print-hidden] { display: none !important } added to globals.css, and data-print-hidden attribute added to: AdminNavRail outermost <nav> element, FilterChipRow outermost <nav> element, and the action-bar wrapper…
10h agoapps/web/src/app/globals.css×3 - ShippedREQ-UX-504
overscroll-behavior: contain (Tailwind overscroll-contain) on the storefront filter sidebar (StorefrontFilterRail outer <aside> in apps/web/src/components/StorefrontFilters.tsx). Prevents touch/wheel scroll events from bubbling to the page…
10h agoapps/web/src/components/StorefrontFilters.tsx - ShippedREQ-UX-514
[data-status-badge] { forced-color-adjust: none } inside the @media (forced-colors: active) block in globals.css, plus data-status-badge attribute on every status-badge <span> in StatusBadge.tsx (shared bolt/receiving component) and the lo…
10h agoapps/web/src/app/globals.css
REQ-NFRNon-functional Requirements2 shipped0 wip7 todo22%
- Not startedREQ-NFR-001
Availability: 99.9% monthly for customer-facing APIs and storefronts; 99.95% for POS sales path.
- Not startedREQ-NFR-002
POS latency: p95 ??? 400ms end-to-end for scan ??? add line and tender ??? receipt operations on LAN; app remains fully functional offline per �17.
- ShippedREQ-NFR-003
Storefront latency: p95 TTFB ??? 300ms for cached product pages at edge; p95 ??? 800ms for dynamic pages.
10h agoapps/web/src/components/ProductImage.tsx - ShippedREQ-NFR-004
Inventory consistency: no oversells under concurrent access; serializable isolation for bolt cuts.
10h agopackages/db/src/migrations/0004_cuts.sqlpackages/db/src/repositories/events.tspackages/testing/src/bolt-status.test.ts+3 more - Not startedREQ-NFR-005
Drop throughput: sustain ??? 200 orders/minute per store at launch with a design path to 2,000 orders/minute per store.
- Not startedREQ-NFR-006
Scale targets (v1): 1,000 stores, 10M SKUs across the platform, 100k concurrent storefront users, 10k concurrent POS devices.
- Not startedREQ-NFR-007
Data consistency model: strong consistency for inventory and payments; eventual consistency (??? 2s p95) acceptable for analytics and non-transactional reads.
- Not startedREQ-NFR-500
Parallel agent execution must use a live lane registry, route-scoped sublanes, ready-to-run launch prompt packets, hard write fences, and a rebase-merge protocol that preserves one commit per implemented REQ-ID on main. Coordination-lane w…
- Not startedREQ-NFR-501
The lane registry must exist at docs/playbooks/lane-registry.md and define the current active-lane capacity, lane ownership/fences, and the protocol for selecting the next smallest safe REQ-ID slice when no merge blocker is active.
REQ-ARCSystem Architecture & Infrastructure18 shipped4 wip28 todo36%
- Not startedREQ-ARC-001
Capability-first: requirements describe capabilities and constraints; vendors are chosen to satisfy them and recorded in the RFC log (�32).
- Not startedREQ-ARC-002
Single inventory source of truth: all channels read/write through one inventory service with server-authoritative cuts.
- Not startedREQ-ARC-003
Edge-first reads, region-anchored writes: storefront reads can be served from the edge; writes (cuts, payments, bookings) anchor to the primary region.
- In progressREQ-ARC-004
Multi-tenant by default: shared-schema with tenant_id on every row and Postgres Row-Level Security; per-tenant custom domains with auto-provisioned SSL.
packages/db/src/migrations/0001_init.sqlpackages/db/src/migrations/0004_cuts.sqlpackages/db/src/migrations/0006_demo_data_packs.sql+22 more - Not startedREQ-ARC-005
Open standards: prefer OpenAPI, AsyncAPI, OpenTelemetry, and portable storage formats so the vendor surface area stays replaceable.
- Not startedREQ-ARC-010
Must support server-side rendering for SEO, streaming for perceived performance, typed server actions, edge runtime for cacheable reads, and a stable plugin story for custom storefronts.
- Not startedREQ-ARC-011
Must provide accessible primitives (WCAG 2.2 AA), a tokenized theming system for per-store branding, and tablet-optimized inputs.
- Not startedREQ-ARC-012
Must support end-user auth, organization/tenant primitives, staff RBAC, MFA, session management, SAML/SCIM for enterprise stores, and device-bound sessions for POS.
- Not startedREQ-ARC-013
Must host a Node/edge web runtime, background jobs or a gateway to them, per-tenant wildcard and custom domains with SSL, DDoS protection, and preview environments.
- In progressREQ-ARC-014
Must be Postgres-compatible with RLS, JSONB, full-text, pgvector, logical replication, and ideally database branching for preview environments. Must support per-tenant connection scoping.
packages/db/src/migrations/0001_init.sqlpackages/db/src/migrations/0007_grant_app_role_membership.sql - Not startedREQ-ARC-015
Must provide compile-time-typed queries, a migration tool, and an escape hatch to raw SQL.
- Not startedREQ-ARC-016
Must provide sub-ms reads, atomic counters, sorted sets, pub/sub, and rate-limit primitives usable from edge and node runtimes.
- Not startedREQ-ARC-017
Must provide scheduled jobs, event-driven jobs, durable workflows (multi-step with retries), fan-out, and per-tenant quotas. Used for drops, payouts, image processing, sync recovery, email blasts.
- In progressREQ-ARC-018
Must deliver ordered per-channel messages to ??? 100k concurrent clients per region with < 500ms p95 fan-out, authenticated per-tenant channels, and presence.
apps/web/src/lib/roadmap.test.ts×2 - Not startedREQ-ARC-019
Must provide a Postgres-compatible local replica on device, conflict resolution hooks matching �17, and replay on reconnect. Must survive cold restarts without data loss.
- Not startedREQ-ARC-020
Must reach certified payments SDKs, Bluetooth HID, ESC/POS printing, and offline SQLite.
- In progressREQ-ARC-021
Must provide faceted search, typo-tolerance, synonyms, per-tenant index isolation, and vector search fused with keyword search. Sub-200ms p95 for storefront queries.
apps/web/src/lib/roadmap.test.ts - Not startedREQ-ARC-022
Must store originals, produce derivatives on demand (thumbnail/card/swatch/zoom), extract dominant colors, serve via CDN, and support signed URLs for private assets.
- ShippedREQ-ARC-023
Must support per-tenant sender identities, DKIM/SPF/DMARC, templated messages (React Email-class), deliverability analytics, suppression lists, and webhooks.
10h agoapps/web/src/app/(storefront)/events/[slug]/actions.ts - Not startedREQ-ARC-024
Must support toll-free or 10DLC US sending with consent capture and unsubscribe, plus APNs/FCM push.
- Not startedREQ-ARC-025
Must handle ecom card-present and card-not-present, subscriptions (platform billing), marketplace payouts (influencers), and a certified POS terminal SDK (including Tap-to-Pay on iPhone/iPad).
- Not startedREQ-ARC-026
Must handle U.S. destination-based sales tax with nexus rules, exemption certificates, and per-line taxability; VAT/GST for international later.
- Not startedREQ-ARC-027
Must return carrier-rated rates at checkout, purchase labels, and emit tracking events.
- Not startedREQ-ARC-028
Asynchronous LLM content pre-processing (titles, summaries, taxonomy generation, alt text, embeddings) ??? batch, not user-blocking, tolerant of seconds-to-minutes latency.
- ShippedREQ-ARC-028.2
Interactive quilt pattern preview (�15) ??? user-facing, sub-frame updates as fabrics swap.
10h agoapps/web/src/app/(storefront)/visualizer/page.tsx - ShippedREQ-ARC-028.3
High-quality shareable renders / generative imagery ??? for marketing images, shareable "my quilt" social cards, and future AI features on the roadmap.
10h agopackages/core/src/quilt/patterns.ts - Not startedREQ-ARC-029
Must capture typed events from web, POS, and server per the telemetry taxonomy in �26.1, with per-tenant isolation, funnels, retention, feature-flag exposure correlation, session replay, and a bulk-export path to the warehouse. See �26 for…
- ShippedREQ-ARC-029.1
Emission pattern (non-negotiable): all telemetry is emitted through packages/core/telemetry, a thin wrapper that routes to three sinks ??? (a) business/domain events ??? Postgres transactional outbox ??? warehouse + webhooks, (b) product/U…
10h agoapps/web/src/lib/productAnalyticsConsent.tspackages/core/src/telemetry/types.tspackages/db/src/migrations/0002_event_outbox.sql+2 more - Not startedREQ-ARC-029.2
Event catalog: every domain and product event type is declared in packages/events with a versioned AsyncAPI-style schema. Emitting an event type not in the catalog is a lint error.
- Not startedREQ-ARC-030
Must cover structured logs, error aggregation with release and per-tenant tagging, distributed tracing (OpenTelemetry, end-to-end from Next.js ??? Postgres ??? jobs ??? Runpod ??? Stripe), and real-user monitoring. All ingress goes through…
- Not startedREQ-ARC-031
Must support per-tenant flag overrides, gradual rollouts, targeted experiments, and SDKs for web, server, and iPad.
- Not startedREQ-ARC-031.1
Satisfies REQ-SEC-007. Must provide a challenge that (a) works without visible friction for most users, (b) produces a verifiable server-side token, (c) supports both web and React Native clients, and (d) can be invoked conditionally from…
- Not startedREQ-ARC-032
Must support a page builder or headless content model per tenant, preview workflow, and CDN-friendly delivery.
- ShippedREQ-ARC-033
Must provision SSL for customer-owned domains with automated verification and renewal. The host ??? tenant resolver (REQ-ARC-036) treats a custom apex domain as an alias for the tenant's canonical subdomain; the routing mechanism does not…
6h agoapps/web/src/env.ts - ShippedREQ-ARC-036
The platform marketing surface at the apex domain and tenant storefront/admin surfaces at <subdomain>.<root> must be served by a single web app (apps/web) with host-based routing. A tenant resolver keyed off the Host header (with a dev-onl…
5h agoapps/web/src/lib/db.ts×5apps/web/src/lib/publicSite.ts×3apps/web/src/app/sitemap.ts×2+17 more - ShippedREQ-ARC-037
The platform apex home (/ on bolttocart.com) must not show marketing chrome to a signed-in staff user who already has an active Clerk Organization. When Clerk provides a valid organization slug, the page redirects to the tenant origin deri…
6h agoapps/web/src/lib/auth.ts - ShippedREQ-ARC-038
The host resolver must accept every valid Clerk Organization slug as a tenant subdomain when that Organization has privateMetadata.tenantId set to a BoltToCart tenant UUID. Middleware may cache slug lookups briefly, but the tenant id must…
5h agoapps/web/src/lib/tenantHost.ts×2 - Not startedREQ-ARC-039
The host resolver must accept customer-owned custom hostnames that have been verified at the SSL/DNS layer and registered on a Clerk Organization with a valid slug and privateMetadata.tenantId. A custom hostname resolves to the same tenant…
- Not startedREQ-ARC-034
Every PR must produce a deployable preview with an isolated database branch; secrets must be centrally managed and rotated.
- ShippedREQ-ARC-500
Drizzle migration 0021: add support_email text (nullable, no default) to the stores table. Expand-only; no column dropped or renamed. CHECK constraint enforces @ presence when non-null. storesRepo.updateIdentity extended to accept supportE…
2m agopackages/db/src/migrations/0021_support_email.sql×2packages/db/src/schema/stores.ts - ShippedREQ-ARC-501
Drizzle migration 0022: add default_cut_increment_sixteenths bigint NOT NULL DEFAULT 4 and minimum_cut_sixteenths bigint NOT NULL DEFAULT 8 to the stores table (1/16-yard units per REQ-INV-001). Expand-only. CHECK constraints enforce posit…
2m agopackages/db/src/migrations/0022_cut_increment_columns.sql×2packages/db/src/schema/stores.ts×2packages/core/src/yardage/index.ts+1 more - ShippedREQ-ARC-502
Event catalog: add bolt.shelved@1 to packages/events/src/domain/bolts.ts with payload { tenantId: string; boltId: string; shelvedAt: string }. Registered in packages/events/src/registry.ts. No app-layer emission yet ??? catalog entry and T…
10h agopackages/events/src/domain/bolts.tspackages/events/src/registry.test.ts - ShippedREQ-ARC-503
Drizzle migration 0023: add customer_notification_prefs table (id uuid PK, tenant_id uuid FK???stores, customer_id uuid FK???customers, order_updates boolean NOT NULL DEFAULT true, drop_alerts boolean NOT NULL DEFAULT true, class_reminders…
10h agopackages/testing/src/customerNotificationPrefs.test.ts×3packages/db/src/migrations/0023_customer_notification_prefs.sql×2packages/db/src/repositories/customerNotificationPrefs.ts+3 more - Not startedREQ-ARC-504
AccountSubnav "Orders" nav link: unconditional Orders item added to apps/web/src/components/AccountSubnav.tsx pointing to /account/orders, active when pathname.startsWith("/account/orders"). No prop-signature change.
- ShippedREQ-ARC-510
Event catalog: add csvImportCompleted to packages/events/src/domain/jobs.ts.
2m agopackages/events/src/registry.ts×2apps/jobs/src/workers/csvImportJob.tspackages/events/src/domain/jobs.ts+1 more - ShippedREQ-ARC-515
Event catalog additions (REQ-ARC-515): four new event types, catalog and TypeScript types only ??? no app-layer emit in this PR (call-sites are stubs in Lanes B and C). (a) refund.completed@1 in packages/events/src/domain/orders.ts (new fi…
2m agopackages/events/src/domain/bolts.ts×2packages/events/src/domain/orders.ts×2packages/events/src/registry.ts×2+3 more - ShippedREQ-ARC-514
Drizzle migration 0027: add phone text (nullable, no CHECK ??? format validated at app layer) and marketing_opt_in boolean NOT NULL DEFAULT false to the customers table. Expand-only. customersRepo.patch(db, tenantId, customerId, { phone?,…
10h agopackages/db/src/migrations/0027_customer_phone_marketing.sql×3apps/jobs/src/workers/customerReactivationJob.ts×2packages/db/src/schema/customers.ts×2+2 more - ShippedREQ-ARC-513
Drizzle migration 0026: add pos_devices table. Columns: id uuid PK, tenant_id uuid FK???stores, stripe_reader_id text NOT NULL (Stripe Terminal reader ID, e.g. tmr_???), display_name text NOT NULL, location_id text (nullable, Stripe Termin…
10h agopackages/testing/src/posDevices.test.ts×3apps/pos/src/flow/posDeviceRegistration.ts×2packages/db/src/migrations/0026_pos_devices.sql×2+2 more - ShippedREQ-ARC-512
Drizzle migration 0025: add cycle_count_sessions and cycle_count_lines tables. cycle_count_sessions: id uuid PK, tenant_id uuid FK???stores, started_at timestamptz NOT NULL DEFAULT now(), completed_at timestamptz, started_by_user_id text N…
10h agopackages/testing/src/cycleCounts.test.ts×3packages/db/src/migrations/0025_cycle_counts.sql×2packages/db/src/repositories/cycleCounts.ts×2+2 more - ShippedREQ-ARC-511
Drizzle migration 0024: add coupon_campaigns and coupon_codes tables. coupon_campaigns: id uuid PK, tenant_id uuid FK???stores, name text NOT NULL, code_prefix text, discount_type coupon_discount_type enum ('percent','fixed_minor') NOT NUL…
10h agopackages/db/src/schema/coupons.ts×3packages/testing/src/coupons.test.ts×3packages/db/src/migrations/0024_coupons.sql×2+1 more
REQ-MONMonetization0 shipped1 wip3 todo0%
- In progressREQ-MON-001
Subscription plans: Starter, Growth, Pro; differentiated by transaction volume, locations, staff seats, drops, and analytics features.
apps/web/src/lib/roadmap.test.ts - Not startedREQ-MON-002
Add-ons: marketing tools (advanced segmentation, automations), advanced analytics, additional locations, priority support.
- Not startedREQ-MON-003
Optional transaction-fee component on card processing, disclosed transparently.
- Not startedREQ-MON-004
Free trial and self-service upgrade/downgrade with proration; dunning for failed payments.
REQ-DMOReference Store & Demo3 shipped0 wip2 todo60%
- ShippedREQ-DMO-001
A single reserved tenant (stores.kind = 'demo') must exist in every non-ephemeral environment (production, staging). Its UUID is held in the DEMO_STORE_ID environment variable, not hard-coded, so different environments can use different ID…
2m agoapps/web/src/lib/roadmap.test.ts×3packages/demo-data/src/apply.test.ts×2packages/demo-data/src/packs/0011_storefront_images.ts×2+11 more - ShippedREQ-DMO-002
The reference store is entered via an unauthenticated trampoline at bolttocart.com/demo on the platform apex. The trampoline never exposes storefront UI itself; it only explains the shared-admin model and links to two tenant-scoped destina…
5h agoapps/web/src/middleware.ts×2apps/web/src/app/(platform)/demo/page.tsxapps/web/src/app/(platform)/page.tsx+6 more - ShippedREQ-DMO-003
Reference-store data evolves via idempotent demo-data packs. Each feature PR adds a pack under packages/demo-data/src/packs/NNNN_snake_slug.ts. Packs are applied in catalog order on every deploy; the demo_data_packs_applied tenant-scoped l…
2m agoapps/jobs/src/workers/demo-seed.ts×2packages/demo-data/src/packs/0010_loyalty.ts×2packages/demo-data/src/packs/0012_rain_migration_admin.ts×2+16 more - Not startedREQ-DMO-004
The pnpm demo:coverage CI check verifies every REQ-ID cited by a pack exists in REQUIREMENTS.md (hard failure) and warns when a user-visible feature area has no covering pack (soft warning; the PR template's reviewer checkbox is the human…
- Not startedREQ-DMO-005
The reference store must resolve on every configured reference-store host label, including NEXT_PUBLIC_DEMO_STORE_SUBDOMAIN and the Clerk Organization slug (DEMO_ORG_SLUG, default bolttocart-reference-store). All accepted labels map to the…
REQ-WIZGuided Shopping Wizard21 shipped0 wip0 todo100%
- ShippedREQ-WIZ-518
Created /wizard/projects/[id]/opengraph-image.tsx (nodejs runtime). Loads the saved project by ID via customerProjectsRepo.findById under withPublicTenant. Renders project name + fabric count + yardageHint inside OgBoltCard. Falls back to…
10h agoapps/web/src/app/(storefront)/wizard/projects/[id]/opengraph-image.tsx - ShippedREQ-WIZ-519
The /wizard landing page metadata and structured data must stay in lockstep with the five visible entry tiles: start a project, buy fabric, design it first, shop events, and tour the reference store. Update the landing description so it na…
10h agoapps/web/src/app/(storefront)/wizard/opengraph-image.tsxapps/web/src/app/(storefront)/wizard/page.tsx - ShippedREQ-WIZ-520
The /wizard/project flow must render a visible "Start over" control on every step after pattern. It links to /wizard/project?step=pattern with no project-state params, is hidden from print, and does not attempt to clear the signed cookie f…
10h agoapps/web/src/app/(storefront)/wizard/project/page.tsxapps/web/src/app/(storefront)/wizard/project/projectFlow.test.ts - ShippedREQ-WIZ-521
The /wizard/project?step=fabric step must show a completion summary above the slot grids: N of M fabric slots selected. The count is derived from the selected pattern's required fabric slots and current URL assignments. The continue-to-bat…
10h agoapps/web/src/app/(storefront)/wizard/project/page.tsxapps/web/src/app/(storefront)/wizard/project/projectFlow.test.ts - ShippedREQ-WIZ-517
The /wizard landing page now emits a HowTo JSON-LD node with two steps ("Pick a pattern" / "Pick fabrics") so Google can render the How-to rich result on SERP. No interactive change (REQ-WIZ-517).
10h agoapps/web/src/app/(storefront)/wizard/page.tsx - ShippedREQ-WIZ-500
The /wizard landing page metadata block must carry a real title, description, and openGraph.{title, description, images} tuned to REQ-GSW-001's "What are you shopping for?" entry prompt so the SERP / social unfurl matches the first questio…
10h agoapps/web/src/app/(storefront)/wizard/page.tsx×2apps/web/src/app/(storefront)/wizard/opengraph-image.tsxapps/web/src/app/(storefront)/wizard/projects/[id]/opengraph-image.tsx - ShippedREQ-WIZ-501
The /wizard/project/ step-progress breadcrumb must be a discrete <nav aria-label="Wizard steps"> landmark (distinct from the sitewide breadcrumb) with aria-current="step" on the active item, so AT announces the current step as "current ste…
10h agoapps/web/src/app/(storefront)/wizard/project/page.tsx - ShippedREQ-WIZ-502
The /wizard/project state (pattern, size, per-slot fabric assignments including batting and thread) must persist in URL search params so every step URL is bookmarkable and shareable, with a signed, tenant-scoped cookie fallback when the se…
6h agoapps/web/src/lib/wizard.ts×3apps/web/src/app/(storefront)/wizard/project/page.tsx×2apps/web/src/lib/wizard.test.ts×2+4 more - ShippedREQ-WIZ-503
A root wizard page-group layout.tsx at app/(storefront)/wizard/layout.tsx must export a metadata object with alternates.canonical: "/wizard" as a group-level fallback, so any future /wizard/ route that omits its own canonical inherits the…
10h agoapps/web/src/app/(storefront)/wizard/layout.tsxapps/web/src/app/robots.ts - ShippedREQ-WIZ-504
Wizard /wizard/project?step=pattern content step. The pattern-selection step renders a grid of 10 named quilt-pattern tiles (Grandmother's Flower Garden, Nine Patch, Half-Square Triangle, Log Cabin, Flying Geese, Rail Fence, Pinwheel, Doub…
10h agoapps/web/src/app/(storefront)/wizard/project/page.tsx×3packages/core/src/quilt/patterns.ts×3apps/web/src/app/(storefront)/wizard/_lib/patterns.ts×2 - ShippedREQ-WIZ-505
Wizard /wizard/project?step=size content step. Renders a size-selection grid for the pattern chosen in the URL's pattern param using that pattern's sizes array from the REQ-WIZ-504 manifest. Each size entry shows the label, display dimensi…
10h agoapps/web/src/app/(storefront)/wizard/project/page.tsx×3apps/web/src/app/(storefront)/wizard/_lib/patterns.ts×2 - ShippedREQ-WIZ-506
Wizard /wizard/project?step=fabric content step. For each fabric slot defined in the chosen pattern, renders a grid of in-stock product cards (up to 12 per slot, live from loadStorefrontCatalog) with a dominant-color swatch and fabric name…
10h agoapps/web/src/app/(storefront)/wizard/project/page.tsx - ShippedREQ-WIZ-507
Wizard /wizard/project?step=batting content step. Renders three batting-type option cards defined in a static BATTING_OPTIONS constant in apps/web/src/app/(storefront)/wizard/_lib/patterns.ts: Cotton (light, natural, easy-care / Everyday q…
10h agoapps/web/src/app/(storefront)/wizard/project/page.tsxapps/web/src/lib/wizard.test.ts - ShippedREQ-WIZ-508
Wizard /wizard/project?step=thread content step. Renders a two-axis grid: thread weight (50wt / 40wt / 28wt) x color preference (neutral / match-main / contrast). Each combination renders a color swatch from a static THREAD_SWATCH lookup d…
10h agoapps/web/src/app/(storefront)/wizard/project/page.tsxapps/web/src/lib/wizard.test.ts - ShippedREQ-WIZ-509
Wizard /wizard/project?step=review content step. Renders the full project summary: the chosen pattern SVG re-rendered with the assigned fabric dominant colors as the palette, a per-slot shopping list showing fabric name, slot label, yardag…
10h agoapps/web/src/app/(storefront)/wizard/project/page.tsx - ShippedREQ-WIZ-510
The /wizard landing page must add a "Shop events" tile (href: /events, indigo accent) to complete the REQ-GSW-001 five-option "What are you shopping for?" spec. The tile is a launchpad to the already-shipped /events surface.
10h agoapps/web/src/app/(storefront)/wizard/page.tsx - ShippedREQ-WIZ-511
/wizard/project?step=fabric fabric grid must support a ?q=<search> URL param that filters the visible products by name, designer, or colorway (case-insensitive, server-side via loadStorefrontCatalog's existing searchQuery filter). A plain…
10h agoapps/web/src/app/(storefront)/wizard/project/page.tsx×4 - ShippedREQ-WIZ-512
The /wizard/project?step=review page has a colocated print.module.css that hides the StorefrontShell header/footer and interactive elements at @media print (REQ-WIZ-512).
10h agoapps/web/src/app/(storefront)/wizard/project/print.module.css - ShippedREQ-WIZ-513
The /wizard landing renders WizardRecentPatterns client component below the tiles; reads localStorage['bc_wz_recent'] for up to 3 in-progress project cards; hidden server-side (REQ-WIZ-513).
10h agoapps/web/src/app/(storefront)/wizard/page.tsx×3apps/web/src/app/(storefront)/wizard/_components/WizardRecentPatternsClient.tsx - ShippedREQ-WIZ-514
The /projects/shared/[slug] page has a colocated opengraph-image.tsx (Edge, no DB call) rendering 'My Quilt Project' with pattern/size from the slug. metadata.openGraph.images wired (REQ-WIZ-514).
10h agoapps/web/src/app/(storefront)/projects/shared/[slug]/opengraph-image.tsxapps/web/src/app/(storefront)/projects/shared/[slug]/page.tsx - ShippedREQ-WIZ-515
The /wizard/project?step=review renders a WizardShareSection (URL + CopyTextButton) below the Save card; print:hidden (REQ-WIZ-515).
10h agoapps/web/src/app/(storefront)/wizard/project/page.tsx
REQ-ADMAdmin Operations40 shipped0 wip27 todo60%
- ShippedREQ-ADM-500
/admin/audit date-range quick-filter chips ("Today / 7d / 30d / All") that compose with the existing type= and delivery= filters. URL-persisted (?range=today|7d|30d), server-rendered against the capped outbox window, preserves other query…
10h agoapps/web/src/app/admin/_lib/dateRange.ts×3apps/web/src/app/admin/audit/page.tsx×2apps/web/src/app/admin/_components/FilterChipRow.tsx+2 more - ShippedREQ-ADM-502
/admin/audit/[id] event-detail page. Each row on /admin/audit gains a "Details" per-row link that routes to a dedicated apps/web/src/app/admin/audit/[id]/page.tsx surface showing: the fully pretty-printed JSON payload (with a "Copy JSON" a…
10h agoapps/web/src/app/admin/audit/[id]/page.tsxapps/web/src/app/admin/audit/page.tsx - ShippedREQ-ADM-501
/admin/audit filter-state presets. A "Save view" disclosure lets an admin name the current filter URL (?range=???&type=???&delivery=???&from=???&to=???) and park it for later recall; a "Presets ???" dropdown lists saved entries and routes…
10h agoapps/web/src/app/admin/audit/page.tsx×3apps/web/src/app/admin/audit/_actions/presets.tsapps/web/src/app/admin/audit/_components/PresetsToolbar.tsx+2 more - ShippedREQ-ADM-503
/admin/audit gains a "Custom???" date-range picker alongside the REQ-ADM-500 quick-filter chips. The chip expands into a native <details> popover with two <input type="date"> controls (from / to); on submit the form GETs /admin/audit?from=…
10h agoapps/web/src/app/admin/_lib/dateRange.ts×3apps/web/src/app/admin/audit/page.tsx×3apps/web/src/app/admin/audit/_lib/presets.ts+1 more - ShippedREQ-ADM-506
/admin/receiving list gains a date-range chip rail against the receivedAt column ("Today / 7d / 30d / All", same rolling-window semantics as REQ-ADM-500/504/505). URL-driven (?range=7d), server-rendered. Unlike drops/events, no status chip…
10h agoapps/web/src/app/admin/receiving/page.tsx×2 - ShippedREQ-ADM-505
/admin/events list gains the same two-axis chip row as REQ-ADM-504: date-range chips ("Today / 7d / 30d / All") keyed off createdAt and a status rail over the canonical lifecycle states (draft | scheduled | live | ended | cancelled). Reuse…
10h agoapps/web/src/app/admin/events/page.tsx - ShippedREQ-ADM-504
/admin/drops list gains a two-axis filter chip row: date-range chips ("Today / 7d / 30d / All") keyed off createdAt with identical rolling-window semantics to REQ-ADM-500, plus a status chip row over the canonical lifecycle states (draft |…
10h agoapps/web/src/app/admin/_components/FilterChipRow.tsxapps/web/src/app/admin/_lib/dateRange.tsapps/web/src/app/admin/audit/page.tsx+2 more - ShippedREQ-ADM-509
/admin/bolts root listing. The index of /admin/bolts/ previously 404'd ??? only [boltId]/ and lookup/ existed. This surface adds a server-rendered bolt roster with columns bolt-id (truncated, links to detail), SKU + supplier, designer, sta…
10h agoapps/web/src/app/admin/bolts/page.tsx - ShippedREQ-ADM-510
/admin/webhooks dead-letter "Retry now" per-row action. Each row in the dead-letter table gains a "Retry now" button that re-enqueues the dead-lettered delivery through the existing relay pipeline ??? no new pipeline is written. The underl…
10h agoapps/web/src/app/admin/webhooks/actions.ts×2apps/web/src/app/admin/audit/[id]/page.tsxapps/web/src/app/admin/webhooks/RetryDeadLetterButton.tsx+2 more - ShippedREQ-ADM-538
/admin/receiving/new expected-bolts preview. Now that purchase_orders / expected_bolts exist via REQ-DB-560, the receive-bolt page shows a tenant-scoped side panel of open and partially received PO lines fetched through withAuthenticatedTe…
10h agopackages/db/src/migrations/0029_purchase_orders.sql×2packages/db/src/repositories/purchaseOrders.ts×2packages/db/src/schema/purchaseOrders.ts - ShippedREQ-ADM-539
AUDIT — /admin/coupons list already shows a "Redemptions" column backed by the stored redemption_count column on coupon_campaigns (incremented in-transaction by couponsRepo.incrementRedemptionCount). No change required.
10h agoapps/web/src/app/admin/inventory/cycle-counts/page.tsx×2apps/web/src/app/admin/inventory/cycle-counts/[id]/page.tsx - ShippedREQ-ADM-545
/admin/store-notes pinned notes. Now that store_notes.pinned exists via REQ-DB-564, the store-notes page orders notes with pinned rows first, shows a pinned count in the header, renders a pinned badge/state treatment, and exposes tenant-sc…
10h agopackages/db/src/migrations/0033_store_notes_pinned.sql×2packages/db/src/repositories/storeNotes.tspackages/testing/src/storeNotesPinned.test.ts - ShippedREQ-ADM-543
AUDIT — /admin/pos-devices already renders a "Last seen" column backed by lastSeenAt (populated from lastHeartbeatAt in the schema). The column header exists and relative-time formatting is applied. No change required.
REQUIREMENTS.md verified audit ledger - ShippedREQ-ADM-544
AUDIT — /admin/settings GeneralInfoForm already includes a "Storefront tagline" input that writes into tenants.tagline. The storefront layout falls back to the default tagline when the field is blank. No change required.
10h agoapps/web/src/app/admin/orders/[id]/actions.ts - ShippedREQ-ADM-542
Creates /admin/inventory/page.tsx — a per-SKU inventory grid aggregating cuttable-bolt yardage via Drizzle query builder. Adds a URL-driven ?filter=low-stock chip that narrows the grid to SKUs with availableSixteenths < 2 × MIN_YARDAGE_SIX…
10h agoapps/web/src/app/admin/inventory/page.tsx×4 - ShippedREQ-ADM-541
/admin/loyalty/settings gains a "Program overview" summary card above the earn-rate panel. The loader runs three Drizzle query-builder aggregates in parallel: total member count, total points outstanding (SUM of pointsBalance), and tier di…
10h agoapps/web/src/app/admin/loyalty/settings/page.tsx×2apps/web/src/app/admin/settings/CutSettingsForm.tsx - ShippedREQ-ADM-540
/admin/coupons/[id] detail page created with a per-row "Copy code" button (CopyTextButton) for each coupon_codes row. Also shows campaign discount, redemption count, and validity window. Uses Drizzle query-builder to load campaign + codes;…
10h agoapps/web/src/app/admin/coupons/[id]/page.tsx×2apps/web/src/app/admin/pos-devices/[id]/page.tsx - ShippedREQ-ADM-537
/admin/events/[id] detail page adds a "Copy iCal URL" button immediately after the existing "Copy link" button. The iCal URL points at /events/[slug]/calendar.ics. Uses the existing CopyTextButton component and getPublicSiteUrl() helper. N…
10h agoapps/web/src/app/admin/events/[id]/edit/actions.tsapps/web/src/app/admin/events/[id]/edit/page.tsxapps/web/src/app/admin/events/[id]/page.tsx - ShippedREQ-ADM-536
/admin/drops/[slug]/edit detail page adds a "Copy iCal URL" button and a "Copy permalink" button in a "Share links" card. The iCal URL points at the public /drops/[slug]/calendar.ics endpoint (REQ-DRP-506). Uses the existing CopyTextButton…
10h agoapps/web/src/app/admin/drops/[slug]/edit/page.tsx×3 - ShippedREQ-ADM-535
/admin/bolts grid gains a "Last cut" column showing the relative time of the most-recent cut for each bolt. The loader adds a Drizzle query-builder aggregate (SELECT boltId, MAX(cutAt) FROM cuts GROUP BY boltId) — no raw SQL — and joins th…
10h agoapps/web/src/app/admin/bolts/page.tsx×3apps/web/src/app/admin/store-notes/actions.tsapps/web/src/app/admin/store-notes/page.tsx - ShippedREQ-ADM-534
/admin/customers/[id] detail page gains a "Recent orders (last 5)" card using a new OrdersMiniTable primitive (apps/web/src/app/admin/customers/_components/OrdersMiniTable.tsx). The mini-table shows order ID (linked to /admin/orders/[id]),…
10h agoapps/web/src/app/admin/customers/[id]/page.tsx×2apps/web/src/app/admin/customers/_components/OrdersMiniTable.tsx - ShippedREQ-ADM-533
/admin/orders/orders.csv export route updated to honor the REQ-ADM-532 multi-select ?state= params and the ?channel= filter so the CSV download always matches the on-screen view. Columns renamed to machine-readable snake_case: order_id, sh…
10h agoapps/web/src/app/admin/orders/orders.csv/route.ts×3apps/web/src/app/admin/orders/page.tsx - ShippedREQ-ADM-532
/admin/orders filter rail adds a state multi-select chip group. Chips use ?state=pending&state=fulfilled (repeating param); toggling a chip adds/removes it from the array. "All" clears the selection. URL-driven server filter replaces the p…
10h agoapps/web/src/app/admin/orders/page.tsx×3apps/web/src/app/admin/orders/orders.csv/route.ts×2packages/db/src/repositories/coupons.ts×2+2 more - ShippedREQ-ADM-531
/admin/webhooks dead-letter table adds a "Last attempt" relative-time column. The event_outbox schema has no lastAttemptAt field; nextAttemptAt is used as a proxy (set by the relay during retry scheduling), falling back to deadLetteredAt w…
2m agoapps/web/src/app/admin/page.tsxapps/web/src/app/admin/webhooks/page.tsx - ShippedREQ-ADM-530
/admin/audit table <thead> gains sticky top-0 z-10 so the header row remains visible while scrolling long audit lists. The default sort column ("Occurred", descending) receives aria-sort="descending", mirroring the REQ-A11Y-543 pattern alr…
10h agoapps/web/src/app/admin/audit/page.tsx - ShippedREQ-ADM-526
/admin/customers/[id]/merge intent-capture form showing source customer (red card) and target-customer email/UUID input. Merge execution deferred to a customersRepo.merge packages/db addition; action button disabled with explicit note.
10h agopackages/db/src/repositories/customers.ts×2packages/testing/src/customerMerge.test.ts×2apps/web/src/app/admin/customers/[id]/merge/page.tsx+1 more - Not startedREQ-ADM-525
/admin/coupons/new three-step create-campaign wizard shell (Details -> Code generation -> Review & launch). Honest placeholder pending schema.
- ShippedREQ-ADM-524
/admin/coupons coupon campaign list. Honest placeholder table shell with campaign/discount/codes/redemptions/expires/status columns.
10h agoapps/web/src/app/admin/coupons/page.tsxapps/web/src/app/admin/orders/[id]/page.tsx - Not startedREQ-ADM-523
/admin/pos-devices device management table shell. Pending pos_devices schema + Stripe Terminal Reader API integration.
- ShippedREQ-ADM-522
/admin/inventory/cycle-counts/new three-step wizard shell. Honest placeholder pending packages/db cycle-count schema.
10h agoapps/web/src/app/admin/inventory/cycle-counts/new/page.tsx - ShippedREQ-ADM-521
/admin/inventory/cycle-counts cycle-count session list. Honest placeholder with '+ New count' CTA and empty state.
10h agoapps/web/src/app/admin/inventory/cycle-counts/page.tsx - ShippedREQ-ADM-520
/admin/orders/[id] order detail page. Shows order header with status badge + channel + timestamp; four totals tiles (subtotal, total, yardage, discount); Tender section with Stripe PaymentIntent ID; Line items placeholder (landing with pay…
10h agoapps/web/src/app/admin/orders/[id]/page.tsx - ShippedREQ-ADM-519
/admin/orders orders list with status filter chips (All/Pending/Processing/Ready/Fulfilled/Cancelled/Refunded), channel chips (All/Web/POS/API), and date-range chips (Today/7d/30d/All). Fetches up to 500 most-recent orders in-memory; statu…
10h agoapps/web/src/app/admin/orders/page.tsx - ShippedREQ-ADM-518
/admin/customers/[id] customer detail page. Shows: customer identity card (name, email, tier badge, Clerk user ID, customer-since, last-active, last-order); four lifetime stats tiles (orders, lifetime spend, total yardage, open orders); re…
10h agoapps/web/src/app/admin/customers/[id]/page.tsx - ShippedREQ-ADM-517
/admin/customers paginated list with search + loyalty-tier filter chips (All???Bronze???Silver???Gold???VIP keyed on customers.loyalty_tier) + sort rail + 50-row page navigation over a 200-row server window. Tier chip counts computed in-me…
2m agoapps/web/src/app/admin/customers/page.tsxpackages/core/src/yardage/index.tspackages/db/src/migrations/0022_cut_increment_columns.sql+2 more - ShippedREQ-ADM-516
/admin/settings General tab form (REQ-ADM-516). The "Store information" section in the General tab gains a <GeneralInfoForm> client component backed by updateStoreGeneralAction (server action). Fields: store name (required, max 100 chars),…
2m agopackages/db/src/schema/stores.ts×5packages/db/src/migrations/0020_tenant_identity_fields.sql×3apps/web/src/app/admin/settings/page.tsx×2+5 more - ShippedREQ-ADM-515
/admin/settings/page.tsx restructured into URL-driven tabbed panels: General | Inventory | Tax | Shipping | Loyalty | Notifications, with ?tab=<id> controlling the active panel (defaulting to General). Tab rendering uses a new <TabNav> / <…
2m agoapps/web/src/app/admin/settings/page.tsxpackages/db/src/migrations/0020_tenant_identity_fields.sqlpackages/ui/src/Tabs.tsx - Not startedREQ-ADM-547
/admin/orders/[id] replaces the stale order_line_items placeholder with a persisted line-item table behind the same orders.line-items flag. Staff still load through withAuthenticatedTenant; unknown or cross-tenant order ids collapse to 404…
- ShippedREQ-ADM-548
The /admin/orders/[id] page must make customer support follow-up faster by rendering a Copy customer email control next to the displayed customer email when one exists. Use the existing CopyTextButton, leave the order loader/customer looku…
10h agoapps/web/src/app/admin/orders/[id]/page.tsx - ShippedREQ-ADM-549
The /admin/pos-devices list must make hardware support handoffs faster by rendering a Copy reader ID control for each device that has a Stripe reader ID. Use the existing CopyTextButton, leave the device loader and registration/revoke acti…
10h agoapps/web/src/app/admin/pos-devices/page.tsx×2 - ShippedREQ-ADM-574
/admin/settings?tab=domains custom-domain visibility panel. Tenant admins must be able to see (a) the store's canonical BoltToCart subdomain and tenant admin/storefront URLs, (b) every customer-owned hostname currently registered on the ac…
2m agoapps/web/src/app/admin/settings/page.tsx - ShippedREQ-ADM-575
/admin/settings?tab=domains custom-domain self-service automation. Tenant admins must be able to submit a customer-owned hostname, have BoltToCart attach it to the configured Vercel project through the Vercel Domains REST API, view the req…
2m agoapps/web/src/app/admin/settings/actions.tsapps/web/src/env.ts - ShippedREQ-ADM-576
/admin/settings?tab=theme storefront theme customization. Tenant admins must be able to choose one of the six storefront templates, edit constrained theme tokens (colors, font pair, radii, density), choose the homepage strategy, and enable…
2m agoapps/web/src/app/admin/settings/actions.tsapps/web/src/lib/storefrontThemeConfig.test.tspackages/db/src/migrations/0037_storefront_theme_config.sql+2 more - Not startedREQ-ADM-550
The /admin dashboard must include an overnight POS readiness tile summarizing active POS devices, revoked/not-ready devices, pending offline sale count when available from the POS sync/runtime surface, and the most urgent blocker. The tile…
- Not startedREQ-ADM-551
The /admin/pos-devices/[id] detail page must render a launch checklist for the selected device: enrollment status, Stripe reader id presence, last seen timestamp, revocation state, receipt printer readiness placeholder, and cash-drawer rea…
- Not startedREQ-ADM-552
The /admin/bolts surface must add a compact bolt lookup form that accepts a bolt id or barcode value, resolves under withAuthenticatedTenant, and redirects to /admin/bolts/[boltId] on an exact match. Unknown or cross-tenant values must ren…
- Not startedREQ-ADM-553
The /admin/inventory dashboard must surface a "Needs attention" section with sold-out SKUs, remnant-threshold bolts, damaged bolts, and negative/invalid inventory guards if any exist. Each row links to the existing bolt or SKU/admin surfac…
- Not startedREQ-ADM-554
The /admin/receiving list and detail flows must expose a printable receiving worksheet for open purchase orders and recent bolt receipts. The worksheet groups expected/received bolts by supplier and SKU, includes yardage in human-readable…
- Not startedREQ-ADM-555
The /admin/orders list must add a POS/source filter chip row that separates storefront orders, POS-synced orders, imported legacy orders, and unknown-source orders when the data model exposes source metadata. If source metadata is absent,…
- Not startedREQ-ADM-556
The /admin/orders/[id] page must render a staff-facing fulfillment action summary for overnight MVP: cut status, pack status, shipment/pickup status, return/RMA status, and any missing line-item data. The summary is read-only unless existi…
- Not startedREQ-ADM-557
The /admin/settings page must include a POS launch settings summary covering remnant threshold, default cut increment, store pickup posture, receipt footer/contact copy, and enabled tender methods where those values exist. Missing values m…
- Not startedREQ-ADM-558
The /admin/pos-devices list summary must surface stale active devices as a launch-readiness risk using last-seen timestamps, without mutating device state.
- Not startedREQ-ADM-559
The /admin/pos-devices/[id] detail page must include a copy-reader-id affordance in the identity card for hardware support handoffs.
- Not startedREQ-ADM-560
The /admin/orders source filter chips must show per-source counts computed from the loaded order window.
- Not startedREQ-ADM-561
The /admin/orders table must render human-readable source labels instead of raw source enum strings while preserving the raw value in a title for debugging.
- Not startedREQ-ADM-562
The /admin/orders/[id] page must include a copy-order-id affordance next to the order id for support handoffs.
- Not startedREQ-ADM-563
The /admin/receiving printable worksheet must group rows by supplier and SKU where possible, rather than rendering only a flat recent-bolt list.
- Not startedREQ-ADM-564
The /admin/settings POS launch settings summary must render missing values as setup-task links to the relevant existing settings tab/section.
- Not startedREQ-ADM-565
/admin/orders must render an active-filter summary whenever state, channel, or date filters are active, including chips for each active axis and a clear-all link back to /admin/orders.
- Not startedREQ-ADM-566
/admin/orders must include a visible total-value summary tile for the currently filtered order cohort, computed with integer minor-unit math.
- Not startedREQ-ADM-567
/admin/orders must expose a copy-visible-order-ids action when the filtered page has rows, copying one UUID per line for support handoffs.
- Not startedREQ-ADM-568
/admin/orders must expose a print-current-view action for the currently visible order table, hidden from print output.
- Not startedREQ-ADM-569
/admin/orders/orders.csv must honor channel=import / legacy-source aliases and channel=unknown using the same channel matching semantics as the on-screen order grid.
- Not startedREQ-ADM-570
/admin/orders/orders.csv must include customer_id and customer_name columns when the order is associated to a customer, leaving both blank for guest orders.
- Not startedREQ-ADM-571
/admin/orders/[id] must expose a print-order action in the header action strip for staff handoffs.
- Not startedREQ-ADM-572
/admin/orders/[id] must expose a copy-payment-intent affordance beside the Stripe PaymentIntent id when present.
- Not startedREQ-ADM-573
/admin/orders/[id] must render a human-readable source label while preserving the raw source value in a title attribute for debugging imported/API data.
REQ-ACTCustomer Account13 shipped0 wip15 todo46%
- ShippedREQ-ACT-509
STOP — No order_line_items table exists in the schema. The "Reorder all" functionality requires per-line SKU + yardage data which is not yet persisted. Adding order line items requires a schema migration — coordination-lane work.
10h agopackages/db/src/migrations/0031_order_line_items.sql×2apps/web/src/app/account/orders/[id]/page.tsxapps/web/src/app/account/profile/ProfileForm.tsx+5 more - ShippedREQ-ACT-510
AUDIT — /account/loyalty already renders a next-tier progress bar (TierProgress component). No change required.
10h agoapps/web/src/app/account/notifications/NotificationPrefsForm.tsxapps/web/src/app/account/notifications/actions.tsapps/web/src/app/account/notifications/page.tsx+1 more - apps/web/src/app/account/orders/[id]/actions.tsapps/web/src/app/account/orders/[id]/page.tsxapps/web/src/app/account/wishlist/page.tsx
- apps/web/src/app/account/profile/page.tsx×2apps/web/src/app/account/tickets/page.tsx
- ShippedREQ-ACT-513
Creates /account/tickets/[id]/page.tsx — an event-ticket detail page. The "Add to calendar" section links to /events/[slug]/calendar.ics (same ICS endpoint used by the storefront). Customer-scoped load via email join prevents cross-custome…
10h agoapps/web/src/app/account/tickets/[id]/page.tsx×2 - Not startedREQ-ACT-508
/account/notifications notification preference toggles. Displays orderUpdates / dropAlerts / classReminders toggles read from customer_notification_prefs (RLS-scoped SELECT, JS filter by customerId). Toggle persistence deferred to a custom…
- Not startedREQ-ACT-507
/account/profile edit form. Displays Clerk-managed identity (displayName, email, staff badge) as read-only with a link to Clerk account settings. Phone and marketing prefs shown as disabled inputs with 'coming soon' note ??? schema columns…
- ShippedREQ-ACT-506
/account/orders/[id] order detail. Shows status badge + placed timestamp, three summary tiles (total, yardage, savings), line-items placeholder, fulfillment timeline stub with order-placed event, and Stripe PI tender. Customer-scoped: acce…
10h agopackages/db/src/migrations/0023_customer_notification_prefs.sql×2packages/events/src/domain/customers.ts×2apps/web/src/app/account/orders/[id]/page.tsx+3 more - ShippedREQ-ACT-505
/account/orders listing grouped by status (Open: pending/processing/ready_for_pickup; Past: fulfilled/cancelled/refunded). Each row links to /account/orders/[id] with status badge and total.
10h agoapps/web/src/app/account/_components/DashboardWidgets.tsxapps/web/src/app/account/orders/page.tsx - ShippedREQ-ACT-504
/account dashboard widget grid. A four-tile at-a-glance grid anchors the account home above the richer per-domain sections that already lived on this page ??? surfacing Upcoming events, Open orders, Reward balance, and Recent projects so a…
10h agopackages/db/src/migrations/0019_orders.sql×2packages/db/src/repositories/orders.ts×2apps/web/src/app/account/_components/DashboardWidgets.tsx+3 more - ShippedREQ-ACT-503
/account/loyalty build-out. The account loyalty page already rendered a tier-progress bar (REQ-LOYALTY-\*) keyed off lifetime points ??? the REQ-ADM-500-lane spec called for a yardage-keyed variant, but the underlying customer_loyalty sche…
10h agoapps/web/src/app/account/loyalty/page.tsx×2packages/db/src/migrations/0018_customer_purchase_fields.sql×2 - ShippedREQ-ACT-502
/account/projects read-only share URL. A "Share" button on each valid saved-project card generates a copy-to-clipboard URL of the form <origin>/projects/shared/<projectId>.<token> where token = HMAC-SHA256(STOREFRONT_PROJECT_SHARE_SECRET,…
6h agoapps/web/src/app/account/projects/page.tsx×3apps/web/src/app/(storefront)/projects/shared/[slug]/page.tsxapps/web/src/app/account/_lib/projectShare.test.ts+3 more - ShippedREQ-ACT-501
/account/wishlist bulk actions. A per-card selection checkbox overlay, a "Select all" tri-state header checkbox (indeterminate when a strict subset is selected), and a sticky bottom action bar that appears once any row is selected and disa…
10h agoapps/web/src/app/account/wishlist/actions.ts×3apps/web/src/app/account/wishlist/_components/WishlistBulkList.tsx×2apps/web/src/app/account/wishlist/_components/WishlistCard.tsx+1 more - ShippedREQ-ACT-500
/account/projects saved-project cards carry a "Duplicate" action that writes a new customer_projects row owned by the same signed-in customer, copying the source's pattern/size/slot payload and naming it <original> (copy) ??? or (copy) 2,…
10h agoapps/web/src/app/account/projects/actions.tsapps/web/src/app/account/projects/duplicateName.tsapps/web/src/app/account/projects/page.tsx - ShippedREQ-ACT-514
/account/orders/[id] renders persisted order_line_items when the orders.line-items flag is enabled (default on, env-overridable via FLAG_ORDERS_LINE_ITEMS). The page still enforces customer scoping through withCustomer; after the order/cus…
10h agoapps/web/src/app/account/loyalty/page.tsx - Not startedREQ-ACT-515
The /account/orders/[id] page must expose a print-friendly receipt action for customers. The page renders a visible Print receipt control after the order header, hides that control from print, and marks the order-line/detail section with a…
- Not startedREQ-ACT-516
The /account/orders/[id] page must expose a copy-order-id affordance in the customer-facing order header so shoppers can paste the exact UUID into support chats without relying on the shortened visible reference.
- Not startedREQ-ACT-517
The /account/orders/[id] page must include a support email handoff link that pre-fills the order id in the message body while avoiding any customer address, payment, or PAN data in the URL.
- Not startedREQ-ACT-518
The /account/orders page must add URL-driven source filter chips for storefront, in-store POS, API, and unknown-source orders, with counts computed from the loaded customer order window and a default all-sources view.
- Not startedREQ-ACT-519
The /account/orders page must render a compact order-status summary strip for open, delivered, and cancelled orders above the grouped order list.
- Not startedREQ-ACT-520
The /account/orders page must expose a copy-visible-order-ids control when one or more orders are visible after filtering, copying one UUID per line for support handoff.
- Not startedREQ-ACT-521
The /account/orders page must expose a print-history control for the currently visible order list, with the control hidden from browser print output.
- Not startedREQ-ACT-522
The /account/orders page must render an active-filter summary when a source filter is active, including a clear link back to the unfiltered order history.
- Not startedREQ-ACT-523
Customer-facing order cards must render human-readable source labels and preserve the raw source value in a title for debugging stale imported/API data without leaking implementation vocabulary into the main label.
- Not startedREQ-ACT-524
/account must expose a copy-account-email affordance beside the shopper email in the profile card.
- Not startedREQ-ACT-525
/account must include a compact quick-action rail linking to orders, wishlist, saved projects, and loyalty so returning shoppers can jump to core account tasks without scrolling.
- Not startedREQ-ACT-526
/account/orders/[id] must expose a copy-payment-reference affordance for the Stripe PaymentIntent id when an order has one.
- Not startedREQ-ACT-527
/account/orders must include a visible total-spend summary tile for the currently filtered order history.
REQ-JOBBackground Jobs37 shipped0 wip1 todo97%
- ShippedREQ-JOB-502
Outbox-relay delivery-semantics tests (apps/jobs/src/workers/outbox-relay.test.ts). Seven new tests covering: (a) at-least-once ??? a seeded row re-delivers across a simulated transaction rollback because markPublished is scoped to the out…
10h agoapps/jobs/src/registry/retryPolicy.ts×2apps/jobs/src/registry/retryPolicy.test.tsapps/jobs/src/workers/outbox-relay.test.ts - ShippedREQ-JOB-501
Typed job registry for apps/jobs: defineJob<TOptions, TResult>(???) produces a frozen JobDefinition; runJob(job, options, { logger, tags? }) is the single dispatch entry that emits structured starting / finished / failed log records (with…
10h agoapps/jobs/src/workers/emailJob.ts×2apps/jobs/src/workers/payoutJob.ts×2apps/jobs/src/registry/defineJob.test.ts+7 more - ShippedREQ-JOB-505
Payout relay job stub (apps/jobs/src/workers/payoutJob.ts). schedulePayoutJob registered via the typed registry (REQ-JOB-501). PayoutJobOptions: influencerId: string, periodStart: string, periodEnd: string, tenantId: string, amountMinorUni…
2m agoapps/jobs/src/workers/payoutJob.ts×2packages/events/src/registry.ts×2apps/jobs/src/workers/payoutJob.test.ts+2 more - ShippedREQ-JOB-504
Email notification job stub (apps/jobs/src/workers/emailJob.ts). sendEmailJob registered via the typed registry (REQ-JOB-501). EmailJobOptions: templateKey: string, recipientEmail: string, tenantId: string, mergeData: Record<string, unknow…
2m agoapps/jobs/src/workers/emailJob.ts×2apps/pos/src/flow/receiptDelivery.ts×2packages/events/src/registry.ts×2+5 more - ShippedREQ-JOB-503
Pure retry-policy module for the outbox relay (apps/jobs/src/registry/retryPolicy.ts). decideRetry takes the event's attemptCount, the per-sink outcomes, the caps, the clock and the jitter as explicit inputs and returns a tagged RetryDecis…
10h agoapps/jobs/src/registry/retryPolicy.test.tsapps/jobs/src/registry/retryPolicy.ts - ShippedREQ-JOB-506
CSV import job stub (apps/jobs/src/workers/csvImportJob.ts) via the typed registry (REQ-JOB-501). CsvImportJobOptions: csvS3Key: string, importType: "skus" | "bolts" | "suppliers", tenantId: string, requestedByUserId: string, db: Db, logge…
10h agoapps/jobs/src/workers/csvImportJob.ts×2apps/jobs/src/workers/csvImportJob.test.tspackages/events/src/domain/jobs.ts - ShippedREQ-JOB-507
SKU alt-text generation job stub (apps/jobs/src/workers/altTextJob.ts). generateAltTextJob via typed registry (REQ-JOB-501). Stub callRunpodAltText(skuId, imageUrl) returns hardcoded alt-text string (real Runpod SDK wires in coordination l…
10h agoapps/jobs/src/workers/altTextJob.ts×2apps/jobs/src/workers/altTextJob.test.ts - ShippedREQ-JOB-508
Abandoned-cart recovery job stub (apps/jobs/src/workers/abandonedCartJob.ts). abandonedCartRecoveryJob via typed registry. Stub cartsRepo.isAbandoned(tenantId, cartId, windowMs) returns true unconditionally. Logs abandoned_cart.recovery.st…
10h agoapps/jobs/src/workers/abandonedCartJob.ts×2apps/jobs/src/workers/abandonedCartJob.test.ts - ShippedREQ-JOB-509
Inventory drift-detection job (apps/jobs/src/workers/inventoryDriftJob.ts). Stub boltRepo.listBolts(tenantId) returns two records (one with deltaYardageSixteenths=-4n). Computes deltaYardageSixteenths = local - server for each bolt (bigint…
10h agoapps/jobs/src/workers/inventoryDriftJob.ts×2apps/jobs/src/workers/inventoryDriftJob.test.ts - ShippedREQ-JOB-514
Gift card issuance job stub (apps/jobs/src/workers/giftCardIssuanceJob.ts). giftCardIssuanceJob via typed registry. initialBalanceMinor: bigint (guard > 0n). buildGiftCardCode(orderId): string -- pure+deterministic: strips UUID hyphens, fi…
10h agoapps/jobs/src/workers/giftCardIssuanceJob.ts×2apps/jobs/src/workers/giftCardIssuanceJob.test.ts - ShippedREQ-JOB-515
Stripe payout confirmation poller job stub (apps/jobs/src/workers/payoutConfirmJob.ts). Stub returns status 'paid'. Outbox: 'payout.confirmed@1'. 5 unit tests.
2m agopackages/events/src/registry.ts×2apps/jobs/src/workers/payoutConfirmJob.test.tsapps/jobs/src/workers/payoutConfirmJob.ts+2 more - ShippedREQ-JOB-516
Low-stock alert job stub (apps/jobs/src/workers/lowStockAlertJob.ts). thresholdSixteenths: bigint. Stub returns 2 bolts. Outbox per bolt. 6 unit tests.
10h agoapps/jobs/src/workers/lowStockAlertJob.test.tsapps/jobs/src/workers/lowStockAlertJob.tspackages/events/src/domain/inventory.ts - ShippedREQ-JOB-517
Drop launch notification fan-out job stub (apps/jobs/src/workers/dropLaunchJob.ts). Stub returns 3 customers. Outbox 'drop.launch_notified@1' per customer. 6 unit tests.
2m agopackages/events/src/registry.ts×2apps/jobs/src/workers/dropLaunchJob.test.tsapps/jobs/src/workers/dropLaunchJob.ts+2 more - ShippedREQ-JOB-518
Gift-card expiry warning job stub (apps/jobs/src/workers/giftCardExpiryJob.ts). balanceMinorStr decimal string. Stub returns 2 cards. 6 unit tests.
10h agoapps/jobs/src/workers/giftCardExpiryReminderJob.ts×2apps/jobs/src/workers/giftCardExpiryJob.test.tsapps/jobs/src/workers/giftCardExpiryJob.ts+1 more - ShippedREQ-JOB-519
Coupon expiry cleanup job stub (apps/jobs/src/workers/couponExpiryJob.ts). Stub deactivates 2 campaigns. 5 unit tests.
10h agoapps/jobs/src/workers/couponExpiryJob.test.tsapps/jobs/src/workers/couponExpiryJob.ts - ShippedREQ-JOB-520
Nightly POS reconciliation job stub (apps/jobs/src/workers/posReconciliationJob.ts). netMinor = totalSales - totalRefunds bigint. netMinorStr decimal. 6 unit tests.
10h agoapps/jobs/src/workers/posReconciliationJob.test.tsapps/jobs/src/workers/posReconciliationJob.tspackages/events/src/domain/pos.ts - ShippedREQ-JOB-521
Loyalty tier promotion job stub (apps/jobs/src/workers/loyaltyTierJob.ts). Pure evaluateTier(lifetimeSpendMinor): LoyaltyTier with bronze/silver/gold/platinum bigint boundaries. 11 unit tests.
10h agoapps/jobs/src/workers/loyaltyTierJob.test.ts×2apps/jobs/src/workers/loyaltyTierJob.ts - ShippedREQ-JOB-522
Order confirmation email job stub (apps/jobs/src/workers/orderConfirmationEmailJob.ts). orderTotalStr decimal. templateKey 'order_confirmation'. Reuses emailQueued event. 5 unit tests.
10h agoapps/jobs/src/workers/orderConfirmationEmailJob.test.tsapps/jobs/src/workers/orderConfirmationEmailJob.ts - ShippedREQ-JOB-523
Stale held-cart cleanup job stub (apps/jobs/src/workers/heldCartCleanupJob.ts). Stub purges 2 stale hold IDs. 5 unit tests.
10h agoapps/jobs/src/workers/heldCartCleanupJob.test.tsapps/jobs/src/workers/heldCartCleanupJob.ts - ShippedREQ-JOB-524
Webhook retry delivery job stub (apps/jobs/src/workers/webhookRetryJob.ts). Stub httpClient.post (real HTTP requires RFC). Logs started/dispatched/completed. 6 unit tests.
10h agoapps/jobs/src/workers/webhookRetryJob.test.tsapps/jobs/src/workers/webhookRetryJob.ts - Not startedREQ-JOB-525
Lane-C job stubs emit outbox rows using @bolttocart/events catalog values. customer.merged@1 registered end-to-end. bolt.nfc_written@1 includes optional yardageSixteenthsStr for bulk NFC.
- ShippedREQ-JOB-526
Drop-waitlist notification worker stub (apps/jobs/src/workers/dropWaitlistNotifyJob.ts). claimWaitlistSlots clamped to min(n, 2), lifecycle logs, outbox 'drop.waitlist_notified@1'.
10h agoapps/jobs/src/workers/dropReminderJob.tsapps/jobs/src/workers/dropWaitlistNotifyJob.test.tsapps/jobs/src/workers/dropWaitlistNotifyJob.ts - ShippedREQ-JOB-527
Loyalty points statement worker stub (apps/jobs/src/workers/loyaltyStatementJob.ts). Validates periodMonth (YYYY-MM), logs lifecycle with memberCount, re-throws on total failure.
10h agoapps/jobs/src/workers/loyaltyStatementJob.test.tsapps/jobs/src/workers/loyaltyStatementJob.tsapps/jobs/src/workers/loyaltyWeeklyRecapJob.ts - ShippedREQ-JOB-513
Customer reactivation email job stub (apps/jobs/src/workers/customerReactivationJob.ts). customerReactivationJob via typed registry. Stub returns 2 synthetic customers (real: marketing_opt_in=true per REQ-ARC-514). Stub queueReactivationEm…
10h agoapps/jobs/src/workers/customerReactivationJob.ts×2apps/jobs/src/workers/customerReactivationJob.test.ts - ShippedREQ-JOB-512
Shift summary report job stub (apps/jobs/src/workers/shiftSummaryJob.ts). shiftSummaryJob via typed registry. Server-side half of REQ-POS-007. All financial fields bigint. Outbox: "pos.shift_summary_generated@1". 5 unit tests. pnpm --filte…
10h agoapps/jobs/src/workers/shiftSummaryJob.ts×2apps/jobs/src/workers/shiftSummaryJob.test.ts - ShippedREQ-JOB-511
Loyalty points accrual job stub (apps/jobs/src/workers/loyaltyAccrualJob.ts). loyaltyAccrualJob via typed registry. pointsEarned = (orderTotalMinor x rateNumerator) / rateDenominator -- bigint integer division; no floats. Skip paths: alrea…
10h agoapps/jobs/src/workers/loyaltyAccrualJob.ts×2apps/jobs/src/workers/loyaltyAccrualJob.test.ts - ShippedREQ-JOB-510
Drop-queue admission worker stub (apps/jobs/src/workers/dropQueueJob.ts). dropQueueAdmissionJob via typed registry. Stub claimNextQueueBatch(tenantId, dropId, batchSize) returns min(batchSize, 2) synthetic QueueSlot records (real uses SELE…
10h agoapps/jobs/src/workers/dropQueueJob.ts×2apps/jobs/src/workers/dropQueueJob.test.ts - ShippedREQ-JOB-528
Order-refund email worker (apps/jobs/src/workers/orderRefundEmailJob.ts). runOrderRefundEmail consumes the existing refund.completed@1 domain event (REQ-ARC-515a ? catalog entry pre-exists; no packages/events edits) and queues a email.queu…
10h agoapps/jobs/src/workers/orderRefundEmailJob.test.ts×2apps/jobs/src/workers/orderRefundEmailJob.ts×2 - ShippedREQ-JOB-529
14-day gift-card expiry reminder worker (apps/jobs/src/workers/giftCardExpiryReminderJob.ts). runGiftCardExpiryReminder buckets each GiftCardForReminder against a frozen now into "expired" (delta ? 0), "expiring-soon" (0 < delta ? windowDa…
10h agoapps/jobs/src/workers/giftCardExpiryReminderJob.test.ts×2apps/jobs/src/workers/giftCardExpiryReminderJob.ts×2 - ShippedREQ-JOB-530
Loyalty weekly-recap worker (apps/jobs/src/workers/loyaltyWeeklyRecapJob.ts). Sibling to the monthly statement (REQ-JOB-527 loyaltyStatementJob) ? reuses listActiveLoyaltyMembers and the email.queued@1 outbox sink, but runs on a weekly cad…
10h agoapps/jobs/src/workers/loyaltyWeeklyRecapJob.ts×2apps/jobs/src/workers/loyaltyWeeklyRecapJob.test.ts - ShippedREQ-JOB-531
24h drop-opening reminder worker (apps/jobs/src/workers/dropReminderJob.ts). runDropReminder queues "Tomorrow: <drop name> opens" emails for every waitlisted shopper when the drop's startAt falls within [now, now + DROP_REMINDER_WINDOW_MS]…
10h agoapps/jobs/src/workers/dropReminderJob.test.ts×2apps/jobs/src/workers/dropReminderJob.ts×2 - ShippedREQ-JOB-532
Post-fulfillment review-request email worker (apps/jobs/src/workers/reviewRequestEmailJob.ts). runReviewRequestEmail buckets each FulfilledOrderForReview against a frozen now into "too-early" (age < delayDays), "eligible" (age == delayDays…
10h agoapps/jobs/src/workers/reviewRequestEmailJob.test.ts×2apps/jobs/src/workers/reviewRequestEmailJob.ts×2 - ShippedREQ-JOB-533
Abandoned-wishlist nudge worker (apps/jobs/src/workers/abandonedWishlistJob.ts). runAbandonedWishlist classifies each WishlistCandidate via pure classifyWishlistCandidate into "has-active-cart" (short-circuit -- never nudge a mid-session s…
10h agoapps/jobs/src/workers/abandonedWishlistJob.test.ts×3apps/jobs/src/workers/abandonedWishlistJob.ts×2 - ShippedREQ-JOB-534
Class reminder worker (apps/jobs/src/workers/classReminderJob.ts). runClassReminder classifies each ClassEventForReminder via pure classifyClassEvent into "already-started" (startAt < now), "too-early" (startAt > now + windowMs), or "eligi…
10h agoapps/jobs/src/workers/classReminderJob.test.ts×4apps/jobs/src/workers/classReminderJob.ts×2 - ShippedREQ-JOB-535
Inventory-zero alert worker (apps/jobs/src/workers/inventoryZeroAlertJob.ts). runInventoryZeroAlert compares each SkuInventorySnapshot via pure classifyInventoryTransition into "crossed-to-zero" (previousYardage16ths > 0n AND currentYardag…
10h agoapps/jobs/src/workers/inventoryZeroAlertJob.test.ts×3apps/jobs/src/workers/inventoryZeroAlertJob.ts×2 - ShippedREQ-JOB-536
POS shift-close email worker (apps/jobs/src/workers/posShiftCloseEmailJob.ts). runPosShiftCloseEmail emails the PDF shift-summary digest to the tenant-configured shift-close distribution list when a shift closes. Per recipient it queues on…
10h agoapps/jobs/src/workers/posShiftCloseEmailJob.test.ts×2apps/jobs/src/workers/posShiftCloseEmailJob.ts×2 - ShippedREQ-JOB-537
Dev-only structured JSON-lines webhook sink (apps/jobs/src/sinks/structuredWebhookSink.ts). structuredWebhookSink appends one JSON record per DeliverableEvent so local runs and golden-file integration tests can snapshot webhook payloads de…
10h agoapps/jobs/src/sinks/structuredWebhookSink.test.ts×3apps/jobs/src/sinks/structuredWebhookSink.ts - ShippedREQ-JOB-538
Jobs must include a pure dead-letter digest builder for outbox relay failures. Given dead-lettered event rows, it groups by event type and sink, counts permanent versus retry-exhausted failures, includes bounded sample event IDs and last-a…
10h agoapps/jobs/src/registry/deadLetterDigest.test.tsapps/jobs/src/registry/deadLetterDigest.tsapps/jobs/src/workers/deadLetterDigest.test.ts+1 more
REQ-HWHardware Adapters12 shipped0 wip0 todo100%
- ShippedREQ-HW-500
POS hardware capability contracts + no-op/fake stubs (apps/pos/src/hw/) supporting REQ-POS-024 / REQ-ONB-030 / REQ-ONB-031. Feature code programs against three injectable interfaces ??? CashDrawer, ReceiptPrinter, BarcodeScanner ??? aggreg…
10h agoapps/pos/src/hw/barcodeScanner.tsapps/pos/src/hw/cashDrawer.tsapps/pos/src/hw/hardware.test.ts+5 more - ShippedREQ-HW-501
ESC/POS receipt printer adapter extension (apps/pos/src/hw/types.ts, apps/pos/src/hw/receiptPrinter.ts). Extends the ReceiptPrinter interface (REQ-HW-500) with printText(lines: string): Promise<void> (sends a pre-formatted multi-line strin…
10h agoapps/pos/src/hw/receiptPrinter.ts×2apps/pos/src/hw/receiptPrinterExt.test.ts×2apps/pos/src/hw/types.ts×2+1 more - ShippedREQ-HW-502
CashDrawer.lastOpenedAt() extension (apps/pos/src/hw/types.ts, apps/pos/src/hw/cashDrawer.ts). Adds lastOpenedAt(): Date | null to the CashDrawer interface. createNoopCashDrawer() returns null. createFakeCashDrawer() records new Date() of…
10h agoapps/pos/src/hw/cashDrawerExt.test.ts×3apps/pos/src/hw/cashDrawer.ts×2apps/pos/src/hw/types.ts - ShippedREQ-HW-503
ZPL label-printer adapter + buildBoltLabel ZPL template (apps/pos/src/hw/labelPrinter.ts). LabelPrinter interface: printZpl(zpl: string): Promise<LabelPrintResult>. buildBoltLabel pure ZPL-II builder: Code128 barcode + yardage via bigint a…
10h agoapps/pos/src/hw/labelPrinter.test.tsapps/pos/src/hw/labelPrinter.ts - ShippedREQ-HW-505
Physical scale adapter + buildYardageSuggestionFromWeight (apps/pos/src/hw/physicalScale.ts). REQ-HDW-002 optional peripheral. ScaleReading: { weightOunces: bigint; stable: boolean }. buildYardageSuggestionFromWeight(weightOunces, weightPe…
10h agoapps/pos/src/hw/physicalScale.test.tsapps/pos/src/hw/physicalScale.ts - ShippedREQ-HW-506
Scanner read-with-timeout policy (apps/pos/src/hw/scannerTimeout.ts) exports SCANNER_DEFAULT_TIMEOUT_MS = 30_000, withScannerTimeout(scanner, timeoutMs) returning string | null without throwing on timeout via a cancellation token race, and…
10h agoapps/pos/src/hw/hardwareTelemetry.test.tsapps/pos/src/hw/hardwareTelemetry.tsapps/pos/src/hw/scannerTimeout.test.ts - ShippedREQ-HW-507
Hardware health-check module (apps/pos/src/hw/hardwareHealthCheck.ts). runHardwareHealthCheck returns readonly PeripheralStatus[] (printer+scanner+drawer+nfc+scale). NFC: healthy when both reader.isReady() AND writer.isReady(). 9 unit test…
10h agoapps/pos/src/components/HardwareHealthStatus.test.ts×2apps/pos/src/components/HardwareHealthStatus.tsapps/pos/src/hw/hardwareHealthCheck.test.ts+1 more - ShippedREQ-HW-504
Customer-facing display adapter + buildPosDisplayPayload helper (apps/pos/src/hw/customerDisplay.ts). REQ-HDW-002 optional peripheral. CustomerDisplayPayload: { cartTotalMinor: bigint; itemCount: number; currency: string; loyaltyPointsEarn…
10h agoapps/pos/src/hw/customerDisplay.test.tsapps/pos/src/hw/customerDisplay.ts - ShippedREQ-HW-509
Barcode-scanner adapter scaffold (apps/pos/src/hardware/scanner/ScannerAdapter.ts). Typed ScannerAdapter interface the POS critical-path programs against — scan(): Promise<Code>, onScan(listener): unsubscribe, isReady(). Code carries value…
10h agoapps/pos/src/components/ScannerAdapterStatus.test.ts×2apps/pos/src/hardware/scanner/ScannerAdapter.ts×2apps/pos/src/components/ScannerAdapterStatus.ts+1 more - ShippedREQ-HW-510
Receipt-printer adapter scaffold (apps/pos/src/hardware/printer/PrinterAdapter.ts). Typed PrinterAdapter interface with printLines(lines: readonly string[]): Promise<void> (feeds output of REQ-POS-550's buildReceiptLines), openDrawer(): Pr…
10h agoapps/pos/src/components/PrinterAdapterStatus.test.tsapps/pos/src/components/PrinterAdapterStatus.tsapps/pos/src/hardware/drawer/DrawerAdapter.ts+2 more - ShippedREQ-HW-511
Cash-drawer adapter scaffold (apps/pos/src/hardware/drawer/DrawerAdapter.ts). Typed DrawerAdapter with open(): Promise<void> (fires the drawer-kick solenoid — resolves on pulse-ack, not on re-close), status(): Promise<DrawerStatus> ("open"…
10h agoapps/pos/src/components/DrawerAdapterStatus.test.ts×2apps/pos/src/components/DrawerAdapterStatus.tsapps/pos/src/hardware/drawer/DrawerAdapter.test.ts+1 more - ShippedREQ-HW-512
NFC-reader adapter scaffold (apps/pos/src/hardware/nfcReader/NfcReaderAdapter.ts). Typed NfcReaderAdapter interface with read(): Promise<NfcTagPayload> (waits for a tag and resolves its NDEF payload), write(payload): Promise<void> (writes…
10h agoapps/pos/src/components/NfcReaderAdapterStatus.test.tsapps/pos/src/components/NfcReaderAdapterStatus.tsapps/pos/src/hardware/nfcReader/NfcReaderAdapter.ts
REQ-NFCNFC Workflows7 shipped1 wip0 todo88%
- ShippedREQ-NFC-500
NFC tag-reader contract + stub (apps/pos/src/hw/nfcReader.ts). NfcReader interface: read(): Promise<NfcPayload>, isReady(): boolean. NfcPayload = { rawText: string; type: "ndef-text" | "ndef-uri" | "unknown" }. NfcReadError extends Error,…
10h agoapps/pos/src/hw/nfcWriter.ts×3apps/pos/src/hardware/nfcReader/NfcReaderAdapter.tsapps/pos/src/hw/nfcReader.test.ts+2 more - ShippedREQ-NFC-501
NFC tag-writer contract + buildBoltNfcPayload helper + fake writer (apps/pos/src/hw/nfcWriter.ts). NfcTagWriter interface: write(payload: NfcWritePayload): Promise<NfcWriteResult>, isReady(): boolean. NfcWritePayload: { text: string; tagId…
10h agoapps/pos/src/hw/nfcWriter.test.tsapps/pos/src/hw/nfcWriter.ts - ShippedREQ-NFC-502
NFC batch-scan collector (apps/pos/src/scan/nfcBatchCollector.ts). Pure state machine for accumulating NFC bolt scans during inventory receiving. CollectedScan: { boltId: BoltId, yardageSixteenths: bigint | null, scannedAt: string }. NfcBa…
10h agoapps/pos/src/scan/nfcBatchCollector.test.tsapps/pos/src/scan/nfcBatchCollector.ts - ShippedREQ-NFC-503
NFC tag validation module (apps/pos/src/scan/nfcTagValidator.ts). validateNfcTag(payload, opts) returns NfcTagValidationResult ok|wrong-type|empty-text|not-a-bolt|malformed. Delegates to parseNfcTagAsBoltScan. 9 unit tests.
10h agoapps/pos/src/scan/nfcBatchWriteSession.test.tsapps/pos/src/scan/nfcTagValidator.test.tsapps/pos/src/scan/nfcTagValidator.ts - In progressREQ-NFC-504
NFC write-on-receive flow (apps/pos/src/flow/nfcWriteFlow.ts). States: idle|confirming|writing|complete|error. beginNfcWrite (non-empty boltId guard), confirmWrite, receivedWriteResult, cancelWrite to idle, retryWrite error to confirming.…
apps/pos/src/flow/nfcWriteFlow.test.ts - ShippedREQ-NFC-506
NFC bolt-tag URI payload builder (apps/pos/src/nfc/buildBoltTagPayload.ts). buildBoltTagPayload(boltId: BoltId): string emits the canonical NDEF URI btc://bolt/<lowercased-uuid> that the REQ-HW-512 NFC-reader writes onto fabric-bolt sticke…
10h agoapps/pos/src/components/BoltTagPayloadStatus.tsapps/pos/src/hardware/nfcReader/NfcReaderAdapter.tsapps/pos/src/nfc/buildBoltTagPayload.ts+1 more - ShippedREQ-NFC-507
NFC drop-tag URI payload builder (apps/pos/src/nfc/buildDropTagPayload.ts). buildDropTagPayload(slug: string): string emits btc://drop/<slug> for shelf-edge / hangtag / event-signage NFC stickers that shoppers tap to land on a drop page. S…
10h agoapps/pos/src/components/DropTagPayloadStatus.test.tsapps/pos/src/components/DropTagPayloadStatus.tsapps/pos/src/hardware/nfcReader/NfcReaderAdapter.ts+1 more - ShippedREQ-NFC-508
NFC bulk-write diff (apps/pos/src/nfc/bulkWriteDiff.ts). bulkWriteDiff(expected, current, options?): readonly BulkWriteOp[] computes the minimal set of writes to reconcile a set of physical tags (current, what the reader just observed) wit…
10h agoapps/pos/src/components/BulkWriteDiffStatus.test.ts×2apps/pos/src/components/BulkWriteDiffStatus.tsapps/pos/src/nfc/buildDropTagPayload.ts+1 more
REQ-DBDatabase Migrations6 shipped0 wip0 todo100%
- ShippedREQ-DB-565
Drizzle migration 0034: create return_authorizations + rma_line_items tables (unblocks REQ-FUL-505). The RMA path had no persistent row at all before this migration — rg return_authorization|rma_line_item|\brma\b across packages/ found not…
10h agopackages/db/src/schema/returnAuthorizations.ts×3packages/testing/src/returnAuthorizations.test.ts×3packages/db/src/migrations/0034_return_authorizations.sql×2+1 more - ShippedREQ-DB-564
Drizzle migration 0033: add pinned boolean NOT NULL DEFAULT false to store_notes (unblocks REQ-ADM-545). Legacy rows take the default; no data migration needed. Partial index (tenant_id, pinned) WHERE pinned = true so the dashboard's "pinn…
10h agopackages/testing/src/storeNotesPinned.test.ts×3packages/db/src/migrations/0033_store_notes_pinned.sql×2packages/db/src/repositories/storeNotes.ts+1 more - ShippedREQ-DB-562
Drizzle migration 0031: add order_line_items table + one-shot legacy backfill helper (unblocks REQ-ACT-509). Columns: id uuid PK, tenant_id uuid FK�??stores, order_id uuid FK�??orders ON DELETE CASCADE, sku_id uuid FK�??skus (nullable �??…
10h agopackages/testing/src/orderLineItems.test.ts×3packages/db/src/migrations/0031_order_line_items.sql×2packages/db/src/repositories/orderLineItems.ts×2+3 more - ShippedREQ-DB-561
Drizzle migration 0030: add contacts table + contact_source enum (unblocks REQ-CRM-546). Columns: id uuid PK, tenant_id uuid FK�??stores, display_name text NOT NULL, email text (nullable), phone text (nullable), source contact_source enum…
10h agopackages/testing/src/contacts.test.ts×3packages/db/src/migrations/0030_contacts.sql×2packages/db/src/schema/contacts.ts×2+1 more - ShippedREQ-DB-560
Drizzle migration 0029: add purchase_orders and expected_bolts tables (unblocks REQ-ADM-538). purchase_orders: id uuid PK, tenant_id uuid FK�??stores, supplier_id uuid FK�??suppliers, po_number text NOT NULL, status purchase_order_status e…
10h agopackages/db/src/schema/purchaseOrders.ts×3packages/testing/src/purchaseOrders.test.ts×3packages/db/src/migrations/0029_purchase_orders.sql×2+1 more - ShippedREQ-DB-563
Drizzle migration 0032: expand customer_segments from placeholder to real persistence + evaluation model (unblocks REQ-CRM-502). ADDITIVE per non-negotiable §2 �?? existing rules column stays in place, with a future contract migration slat…
10h agopackages/db/src/migrations/0032_customer_segments_rule_json.sql×4packages/db/src/schema/customerSegments.ts×3packages/testing/src/customerSegmentsMembership.test.ts×3+1 more
REQ-PWAPWA & Installability12 shipped0 wip1 todo92%
- ShippedREQ-PWA-504
id: "/" field on apps/web/src/app/manifest.ts. Locks the installed PWA identity so future start_url changes don't cause browsers to treat the app as a new install. ManifestExtended already accommodates the field via the existing MetadataRo…
REQUIREMENTS.md verified audit ledger - ShippedREQ-PWA-506
categories: ["shopping","lifestyle"] on apps/web/src/app/manifest.ts. Replaces the previous ["shopping","retail","business"] triple. "shopping" is the W3C-registered canonical e-commerce token; "lifestyle" best captures the crafting / quil…
10h agoapps/web/src/app/manifest.ts - ShippedREQ-PWA-505
display_override: ["window-controls-overlay","standalone","browser"] on apps/web/src/app/manifest.ts ??? extends the previous ["minimal-ui","browser"] pair with "window-controls-overlay" (first preference, paints the app's title-bar area w…
10h agoapps/web/src/app/manifest.ts - ShippedREQ-PWA-507
iarc_rating_id: "e84b072d-71b3-4d3e-86ae-31a8ce4e53b7" on apps/web/src/app/manifest.ts. IARC (International Age Rating Coalition) certificate ID issued for the BoltToCart storefront ??? fabric retail, no UGC, no violence, no mature themes;…
10h agoapps/web/src/app/manifest.ts×2 - ShippedREQ-PWA-500
handle_links: "preferred" on apps/web/src/app/manifest.ts so browsers prefer the installed PWA over a normal browser tab when an in-scope link is activated from outside the PWA. Pairs with the existing launch_handler: { client_mode: "navig…
10h agoapps/web/src/app/manifest.ts - ShippedREQ-PWA-501
edge_side_panel: { preferred_width: 400 } on apps/web/src/app/manifest.ts so Microsoft Edge surfaces the installed storefront in its "Apps in sidebar" picker. Lets a shopper pin the catalog as a side-panel app (alongside a primary tab with…
10h agoapps/web/src/app/manifest.ts×2 - ShippedREQ-PWA-502
launch_handler.client_mode expressed as an ordered fallback array (["navigate-existing", "focus-existing", "auto"]) on apps/web/src/app/manifest.ts instead of the single-value form previously shipped. The W3C Web App Manifest spec permits…
10h agoapps/web/src/app/manifest.ts - ShippedREQ-PWA-503
screenshots array on apps/web/src/app/manifest.ts with two entries ??? { src: "/screenshots/wide.png", sizes: "1280x720", type: "image/png", form_factor: "wide" } and { src: "/screenshots/narrow.png", sizes: "390x844", type: "image/png", f…
10h agoapps/web/src/app/manifest.ts×2 - ShippedREQ-PWA-508
share_target: { action: "/shop", method: "GET", params: { title: "q", text: "q", url: "url" } } in apps/web/src/app/manifest.ts. Declares the installed PWA as an OS-level share-sheet target so a user sharing a product URL from Safari/Chrom…
10h agoapps/web/src/app/manifest.ts×2 - ShippedREQ-PWA-509
protocol_handlers: [{ protocol: "web+btc", url: "/?uri=%s" }] in apps/web/src/app/manifest.ts. Claims the web+btc:// custom URL scheme so links activated from other apps open the installed PWA instead of the default browser. Forward-lookin…
10h agoapps/web/src/app/manifest.ts×2 - ShippedREQ-PWA-510
orientation: "any" explicit declaration in apps/web/src/app/manifest.ts. The W3C Web App Manifest spec default is "any" but engines that act only on explicitly declared fields may lock rotation in its absence. Declaring it explicitly futur…
10h agoapps/web/src/app/manifest.ts - ShippedREQ-PWA-511
Audit of prefer_related_applications: false and related_applications: [] in apps/web/src/app/manifest.ts. Both fields are present (set in a prior session). This entry documents the completed audit so the reserved range stays traceable. No…
REQUIREMENTS.md verified audit ledger - Not startedREQ-PWA-512
Audit of scope_extensions field (Chrome 125+ feature allowing the PWA to claim cross-origin paths for custom-domain tenant subdomains). Not yet applicable ??? all tenants share the same origin today. When custom-domain tenants land, scope_…
REQ-SEOSEO & Feeds23 shipped0 wip0 todo100%
- ShippedREQ-SEO-508
<link rel="alternate" type="application/rss+xml"> autodiscovery tags on the shop PLP (/shop), drops listing (/drops), and events listing (/events) pages via metadata.alternates.types in each page's metadata / generateMetadata export. All t…
REQUIREMENTS.md verified audit ledgerapps/web/src/lib/roadmap.test.ts - ShippedREQ-SEO-509
X-Robots-Tag: noindex, nofollow HTTP response header on every /account/:path* route. Added as a new headers() rule in apps/web/next.config.mjs alongside the existing /admin/:path* rule. Belt-and-braces alongside the existing robots: accoun…
10h agoapps/web/next.config.mjs - ShippedREQ-SEO-512
max-snippet:-1 and max-image-preview:large robots meta directives on storefront pages. Audit result: the root apps/web/src/app/layout.tsx already emits robots: { googleBot: { "max-image-preview": "large", "max-snippet": -1, "max-video-prev…
REQUIREMENTS.md verified audit ledger - ShippedREQ-SEO-514
Colocated /ld.json endpoints for /shop/[slug], /drops/[slug], and /events/[slug] (REQ-SEO-514). Three route handlers added at apps/web/src/app/(storefront)/{area}/[slug]/ld.json/route.ts. Each handler loads the same entity the correspondin…
10h agoapps/web/src/app/(storefront)/drops/[slug]/ld.json/route.tsapps/web/src/app/(storefront)/events/[slug]/ld.json/route.tsapps/web/src/app/(storefront)/shop/[slug]/ld.json/route.ts - ShippedREQ-SEO-513
og:locale: "en_US" on all public storefront pages. Audit result: two sources already cover this. (1) The root layout.tsx emits openGraph: { locale: "en_US" } as the site-wide default; (2) shareMetadataFragment in socialMetadata.ts emits op…
REQUIREMENTS.md verified audit ledger - ShippedREQ-SEO-511
hreflang="en" + hreflang="x-default" on all public storefront pages. shareMetadataFragment in apps/web/src/lib/socialMetadata.ts previously emitted hreflang="en-US" (the DEFAULT_LOCALE key). Changing the key from [DEFAULT_LOCALE] to the li…
10h agoapps/web/src/lib/socialMetadata.ts - ShippedREQ-SEO-510
metadata.alternates.canonical on every storefront listing page currently missing one. Audit result: all affected pages already emit a canonical via shareMetadataFragment({ canonicalPath: "..." }): /shop (dynamic based on filters/sort/page)…
REQUIREMENTS.md verified audit ledger - ShippedREQ-SEO-500
metadata.authors + metadata.creator + metadata.publisher on the root apps/web/src/app/layout.tsx. Emits <meta name="author">, <meta name="creator">, <meta name="publisher"> ??? the attribution surface Google's "About this result", Bing Web…
10h agoapps/web/src/app/layout.tsx - ShippedREQ-SEO-501
Content-Language: en-US HTTP header on all three RSS feed routes (/shop/rss.xml, /events/rss.xml, /drops/rss.xml). Sourced from DEFAULT_LOCALE in @/i18n/config so the header tracks the app locale scaffold when i18n expands past v1's en-US.…
10h agoapps/web/src/app/(storefront)/drops/rss.xml/route.tsapps/web/src/app/(storefront)/events/rss.xml/route.tsapps/web/src/app/(storefront)/shop/rss.xml/route.ts - ShippedREQ-SEO-502
Content-Language: en-US HTTP header on both tenant iCalendar feed routes (/events/calendar.ics, /drops/calendar.ics). RFC 5545 has no channel-level language field ??? a VCALENDAR document carries per-event LANGUAGE parameters at most ??? s…
9h agoapps/web/src/app/(storefront)/drops/calendar.ics/route.tsapps/web/src/app/(storefront)/events/calendar.ics/route.ts - ShippedREQ-SEO-503
Content-Language: en-US HTTP header on the three plaintext public endpoints served across every surface: /humans.txt (humanstxt.org credits), /llms.txt (llmstxt.org agent index), and /.well-known/security.txt (RFC 9116 disclosure contact).…
10h agoapps/web/src/app/humans.txt/route.tsapps/web/src/app/llms.txt/route.ts - ShippedREQ-SEO-504
Content-Language: en-US HTTP header on the three structured-metadata endpoints that round out the feed / discovery surface: /feeds.opml (OPML 2.0 feed-subscription bundle), /opensearch.xml (OpenSearch 1.1 description document), and /roadma…
9h agoapps/web/src/app/(storefront)/opensearch.xml/route.tsapps/web/src/app/feeds.opml/route.ts - ShippedREQ-SEO-505
<copyright> RSS channel element on all three tenant RSS feeds (/shop/rss.xml, /events/rss.xml, /drops/rss.xml), emitted via a shared renderChannelMeta() helper (apps/web/src/lib/rssChannelImage.ts). Format mirrors the storefront-footer cop…
10h agoapps/web/src/lib/rssChannelImage.ts - ShippedREQ-SEO-506
<managingEditor> channel element on all three tenant RSS feeds (/shop/rss.xml, /events/rss.xml, /drops/rss.xml) via the shared renderChannelMeta() helper. Format: hello@{subdomain}.{rootDomain} ({subdomain}) per RSS 2.0 spec, derived from…
10h agoapps/web/src/lib/rssChannelImage.ts×2apps/web/src/app/(storefront)/drops/rss.xml/route.tsapps/web/src/app/(storefront)/events/rss.xml/route.ts+1 more - ShippedREQ-SEO-507
<lastBuildDate> channel element on all three tenant RSS feeds consolidated into the shared renderChannelMeta() helper via the lastBuildDate option on RssChannelMetaOptions. RFC 1123 timestamp of the most-recent item's pubDate, computed ser…
10h agoapps/web/src/lib/rssChannelImage.ts×2 - ShippedREQ-SEO-515
X-Robots-Tag: noindex, nofollow on the three colocated ld.json route handlers (/shop/[slug]/ld.json, /drops/[slug]/ld.json, /events/[slug]/ld.json). These endpoints serve machine-readable structured data for Googlebot's structured-data fet…
10h agoapps/web/src/app/robots.ts - ShippedREQ-SEO-517
"application-name": "BoltToCart" in the other metadata field in apps/web/src/app/layout.tsx. Next.js does not model <meta name="application-name"> in its top-level Metadata type; adding it via the other escape hatch emits the tag for Windo…
10h agoapps/web/src/app/layout.tsx - ShippedREQ-SEO-522
Audit of <link rel="author"> references in apps/web/src/app/layout.tsx. Audit result: two <link rel="author"> elements are emitted ??? (1) from metadata.authors: [{ name: "BoltToCart", url: getPublicSiteUrl() }] which generates a link poin…
REQUIREMENTS.md verified audit ledger - ShippedREQ-SEO-518
Cache-Control: no-store on all /admin/:path* and /account/:path* routes via the headers() rule in apps/web/next.config.mjs. Prevents ISP and corporate proxy caches from storing private session-gated responses (admin pages, order history, w…
10h agoapps/web/next.config.mjs×2 - ShippedREQ-SEO-519
<itunes:category text="Shopping" /> channel element in all three RSS feeds via the shared renderChannelMeta() helper. RssChannelMetaOptions extended with itunesCategory?: string; renderChannelMeta emits <itunes:category text="???" /> when…
10h agoapps/web/src/lib/rssChannelImage.ts - ShippedREQ-SEO-521
Vary: Accept-Encoding header on both the validator-headers bundle and the 200 response in all three RSS feed routes (/shop/rss.xml, /drops/rss.xml, /events/rss.xml). Tells CDN and intermediate caches to store compressed and uncompressed va…
10h agoapps/web/src/app/(storefront)/drops/rss.xml/route.ts×2apps/web/src/app/(storefront)/events/rss.xml/route.ts×2 - ShippedREQ-SEO-516
og:image:alt on storefront pages. Audit result: all storefront opengraph-image convention files (opengraph-image.tsx) already export alt ??? Next.js App Router uses this export to populate the og:image:alt meta property automatically. Cove…
REQUIREMENTS.md verified audit ledger - ShippedREQ-SEO-520
BreadcrumbList JSON-LD on /drops/[slug] and /events/[slug] detail pages. Audit result: apps/web/src/lib/dropStructuredData.ts already emits BreadcrumbList (Home ??? Drops ??? {drop name}) and apps/web/src/lib/eventStructuredData.ts already…
REQUIREMENTS.md verified audit ledger
REQ-A11YAccessibility20 shipped0 wip18 todo53%
- ShippedREQ-A11Y-513
aria-hidden="true" + focusable="false" on decorative SVG icons in apps/web/src/components/. Audit scope: BackToTopButton.tsx, MobileNavDrawer.tsx, ProductShareButton.tsx, SvgSwatch.tsx, QuiltVisualizer.tsx. All three icon-only SVGs (BackTo…
REQUIREMENTS.md verified audit ledger - ShippedREQ-A11Y-512
aria-disabled="true" (not disabled) on the "Add to cart" submit button in AddToCartForm.tsx when the product is out of stock (maxYardageSixteenths < MIN_YARDAGE_SIXTEENTHS). An HTML disabled attribute silently removes the button from the f…
10h agoapps/web/src/components/AddToCartForm.tsx - ShippedREQ-A11Y-511
role="progressbar" + aria-valuenow / aria-valuemin / aria-valuemax on the /account/loyalty tier progress bar. The TierProgress component in apps/web/src/app/account/loyalty/page.tsx already renders <div role="progressbar" aria-valuemin={0}…
REQUIREMENTS.md verified audit ledger - ShippedREQ-A11Y-510
aria-busy="true" on the outermost skeleton container in the loading.tsx files for the storefront route segments /shop, /drops, /events, /events/instructors, and /account/. All five files already carry aria-busy="true" aria-live="polite" on…
REQUIREMENTS.md verified audit ledger - ShippedREQ-A11Y-509
<caption> elements on every data <table> in apps/web/src/app/admin/ that uses a visually-separate heading above the table. The webhooks dead-letter table previously used a <h2>Recent dead-letters</h2> section heading plus a separate sr-onl…
10h agoapps/web/src/lib/roadmap.test.ts×4apps/web/src/app/admin/webhooks/page.tsx - Not startedREQ-A11Y-508
aria-label on every <form> in apps/web/src/app/admin/ that previously lacked one. Affected forms: audit custom-date-range popover form (aria-label="Custom date range filter"), presets save form (aria-label="Save current view as a preset"),…
- ShippedREQ-A11Y-500
aria-current="page" on the StorefrontShell primary header nav links (/drops, /events, /visualizer, /wizard) so screen-reader users hear "current page" when the shell's active section matches the URL, matching the AdminNavRail pattern.
10h agoapps/web/src/components/StorefrontNavLink.tsxapps/web/src/components/StorefrontShell.tsx - ShippedREQ-A11Y-501
aria-current="page" on the StorefrontShell footer "Browse" nav links (Shop all, Designers, Collections, Colors, New arrivals, Drops, Classes, Shop by project, Quilt Designer). Uses the exact-match strategy so /shop and /shop?new=1 don't bo…
10h agoapps/web/src/components/StorefrontNavLink.tsxapps/web/src/components/StorefrontShell.tsx - ShippedREQ-A11Y-502
aria-live="polite" + aria-atomic="true" sr-only sibling region inside the StorefrontShell Cart link so Server-Action revalidatePath("/cart") updates are announced to AT users even when the visual line-count badge is hidden (cart is empty)…
10h agoapps/web/src/components/StorefrontShell.tsx×3 - ShippedREQ-A11Y-503
aria-live="polite" + aria-atomic="true" sr-only sibling region inside the StorefrontShell wishlist "Saved" link so add / remove heart-button Server-Action updates are announced to AT users. Same pattern as REQ-A11Y-502.
10h agoapps/web/src/app/account/wishlist/_components/WishlistBulkList.tsx×2apps/web/src/components/StorefrontShell.tsx×2apps/web/src/app/account/wishlist/actions.ts - ShippedREQ-A11Y-504
Single role="search" ARIA landmark on the StorefrontFilterRail outer <aside> (apps/web/src/components/StorefrontFilters.tsx) with aria-label="Filter catalog", paired with dropping the redundant role="search" from the nested SearchInput <fo…
10h agoapps/web/src/components/StorefrontFilters.tsx×2apps/web/src/components/DropsFilterRail.tsxapps/web/src/components/EventsFilterRail.tsx - ShippedREQ-A11Y-505
aria-describedby wiring between the PDP AddToCartForm yardage <output id="yardage-${skuId}"> and its REQ-ECO-003 policy paragraph ("Minimum 1/2 yard � 1/4-yard steps � N available"). The policy text gains a stable SKU-scoped id (yardage-ru…
10h agoapps/web/src/components/AddToCartForm.tsx - Not startedREQ-A11Y-506
scope="col" on every <th> in the admin table headers for the receiving ledger (/admin/receiving), the bolt listing (/admin/bolts), and the audit-event grid (/admin/audit). Removes the "table header has no scope" WCAG 1.3.1 failure flagged…
- ShippedREQ-A11Y-507
Audit of every icon-only interactive element in packages/ui/ and apps/web/src/components/ for missing aria-label. Audit result: all icon-only <button> elements already carry aria-label attributes (added incrementally across REQ-A11Y-502, R…
REQUIREMENTS.md verified audit ledger - Not startedREQ-A11Y-514
scope="col" on every <th> in the admin events table header (/admin/events). Without scope, AT tools infer column/row association heuristically and can misread "Status" or "Roster" as a row header when VoiceOver's table-navigation mode (rot…
- Not startedREQ-A11Y-515
scope="col" on every <th> in the admin drops table header (/admin/drops). Extends REQ-A11Y-506 and REQ-A11Y-514 to the drops admin grid (Drop, Status, Opens, Closes, Actions). Same WCAG 1.3.1 fix for VoiceOver table-navigation. Pure a11y a…
- Not startedREQ-A11Y-518
aria-label="Split bolt" on the <form> in apps/web/src/app/admin/bolts/[boltId]/SplitForm.tsx. Same form-landmark fix as REQ-A11Y-517 (CutForm) for the bolt-split flow. Pure a11y attribute ??? no visual change.
- Not startedREQ-A11Y-519
aria-label="Merge bolts" on the <form> in apps/web/src/app/admin/bolts/[boltId]/MergeForm.tsx. Pure a11y attribute ??? no visual change.
- Not startedREQ-A11Y-520
aria-label="Override bolt status" on the <form> in apps/web/src/app/admin/bolts/[boltId]/StatusOverrideControls.tsx. Two submit buttons (mark damaged, mark transferred) share one form; the form-level label names the shared action scope. Pu…
- ShippedREQ-A11Y-535
role="status" on the success <p> in CutForm.tsx ("Cut recorded. Remaining updated."), SplitForm.tsx ("Bolt split."), and MergeForm.tsx ("Bolts merged."). The error paragraphs already carry role="alert" (assertive); success outcomes use rol…
REQUIREMENTS.md verified audit ledger - Not startedREQ-A11Y-521
aria-label="Webhook endpoint settings" on the save <form action={saveAction}> in apps/web/src/app/admin/webhooks/WebhookManager.tsx (line 86). Pure a11y attribute ??? no visual change.
- Not startedREQ-A11Y-522
aria-label="Rotate webhook signing secret" on the rotate <form action={rotateAction}> in WebhookManager.tsx (line 173). Pure a11y attribute ??? no visual change.
- Not startedREQ-A11Y-523
aria-label="Delete webhook endpoint" on the delete <form action={deleteAction}> in WebhookManager.tsx (line 200). Pure a11y attribute ??? no visual change.
- Not startedREQ-A11Y-524
aria-label="Retry dead-letter event" on the <form> in apps/web/src/app/admin/webhooks/RetryDeadLetterButton.tsx (line 51). Pure a11y attribute ??? no visual change.
- Not startedREQ-A11Y-525
aria-label="Bolt ID lookup" on the GET <form> in apps/web/src/app/admin/page.tsx (line 287). The containing <section> already has aria-labelledby="admin-bolt-lookup-heading"; the form-level aria-label adds a named form landmark for AT form…
- Not startedREQ-A11Y-526
aria-label="Create drop" on the <form> in apps/web/src/app/admin/drops/new/page.tsx (line 82). Pure a11y attribute ??? no visual change.
- Not startedREQ-A11Y-527
aria-label="Create class" on the <form> in apps/web/src/app/admin/events/new/page.tsx (line 96). Pure a11y attribute ??? no visual change.
- Not startedREQ-A11Y-531
aria-label="Receive bolt" on the <form> in apps/web/src/app/admin/receiving/new/ReceiveBoltForm.tsx (line 43). Pure a11y attribute ??? no visual change.
- Not startedREQ-A11Y-533
aria-label="Rename POS device" on the inline rename <form action={renameDeviceAction}> in apps/web/src/app/admin/pos-devices/page.tsx (line 107). Pure a11y attribute ??? no visual change.
- ShippedREQ-A11Y-534
aria-label on the three inline order-state-machine action forms in apps/web/src/app/admin/fulfillment/page.tsx: "Advance order to processing", "Mark order ready for pickup", "Mark order as fulfilled". Per-button aria-label already exists o…
REQUIREMENTS.md verified audit ledger - ShippedREQ-A11Y-528
Audit: apps/web/src/app/admin/fulfillment/[orderId]/return/RmaForm.tsx already carries aria-label="RMA / return details" on its <form> element (line 30). No code changes required; this entry documents the completed audit. REQ-A11Y-528.
REQUIREMENTS.md verified audit ledger - ShippedREQ-A11Y-529
Audit: apps/web/src/app/admin/fulfillment/[orderId]/ship/page.tsx already carries aria-label="Shipping details" on its <form> element (line 56). No code changes required; this entry documents the completed audit. REQ-A11Y-529.
REQUIREMENTS.md verified audit ledger - ShippedREQ-A11Y-530
Audit: apps/web/src/app/admin/customers/[id]/merge/page.tsx uses aria-labelledby on both candidate-selection forms (targeting visible <h2> headings "Merge source" and "Merge target"). aria-labelledby is preferred over aria-label when a vis…
REQUIREMENTS.md verified audit ledger - Not startedREQ-A11Y-532
aria-label="Loyalty program settings" on the <form> in apps/web/src/app/admin/loyalty/settings/LoyaltySettingsForm.tsx. This form is introduced by REQ-ADM-529 (loyalty earn-rate editor) and is not yet merged to main. The aria-label will be…
- ShippedREQ-A11Y-536
role="status" + aria-live="polite" + aria-atomic="true" on the success <p> in apps/web/src/app/admin/settings/RemnantThresholdForm.tsx ("Threshold saved."). GeneralInfoForm.tsx already carries role="status" on its success paragraph; this c…
REQUIREMENTS.md verified audit ledger - ShippedREQ-A11Y-537
Audit of icon-only <a> and <button> elements in apps/web/src/app/admin/. Audit result: all icon-only interactive elements carry either an aria-label prop or an <span className="sr-only"> child. Notable cases: the CopyPageLinkButton has ari…
REQUIREMENTS.md verified audit ledger - ShippedREQ-A11Y-538
Audit of aria-describedby on the yardage input in apps/web/src/app/admin/receiving/new/ReceiveBoltForm.tsx. Audit result: the Field component used for the "Initial yardage" input already renders an ${id}-hint <p> and wires aria-describedby…
REQUIREMENTS.md verified audit ledger - Not startedREQ-A11Y-539
aria-label + aria-controls wiring for the mobile-nav drawer menu in apps/web/src/components/MobileNavDrawer.tsx. The <div role="menu"> gains aria-label="Storefront navigation" so AT users hear an explicit name when jumping by landmarks/rol…
REQ-QDCREQ-QDC32 shipped0 wip0 todo100%
- ShippedREQ-QDC-001
Tenant store admins must be able to create, draft, publish, pause, close, and archive Design Contests from the tenant admin surface. Every contest is tenant-scoped, has a stable contest ID and slug, and resolves tenant identity from authen…
10h agopackages/demo-data/src/packs/0013_design_contests.ts×2packages/db/src/migrations/0036_design_contests.sqlpackages/db/src/schema/designContests.ts+1 more - ShippedREQ-QDC-002
A Design Contest must include a title, rich-text description, public status, optional cover image, submission start date/time, submission end date/time, judging start date/time, and optional judging end date/time. Date/time fields are stor…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-003
During contest setup, the admin must be able to launch the Quilt Designer and save required preset design values for the contest. Required values may be empty or may include pattern, size, fabric roles, colors, selected SKUs, quilting moti…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-004
Contest-required Quilt Designer values must be persisted as a locked, versioned preset. When a shopper starts an entry from the contest URL, locked values are preloaded and cannot be removed or contradicted, while all remaining Quilt Desig…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-005
The admin contest detail page must expose a one-click copy action for the canonical public contest URL. The copied URL must target the tenant storefront host and must not contain a tenant override parameter in production.
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-006
Shoppers opening the public contest URL must land in a contest-aware Quilt Designer flow that displays the contest title, active dates, submission rules, locked requirements, remaining editable design choices, and the current shopper's sub…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-007
Store admins must configure how many submissions are allowed per participant for each contest. Enforcement must apply to authenticated customer accounts and to anonymous participants using a tenant-scoped anonymous participation token, wit…
10h agoapps/web/src/lib/db.tspackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-008
Store admins must configure whether participants may name their submitted design. When naming is disabled, the public UI must omit custom design-name input and display a system-generated neutral title instead.
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-009
Participants must be able to choose the public designer name and city/state displayed with a submission, and must also be able to submit as anonymous. Anonymous submissions must hide designer name and location from public cards, social met…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-010
Submitting to a contest must validate the contest window, required Quilt Designer preset values, required fabric usage, participant submission limit, and design completeness before accepting the submission. The participant must receive a c…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-011
Store admins must be able to configure a required fabric rule stating that at least X yards of fabric SKU X, or a set of SKUs, must be used in the submitted design. Yardage is stored and validated in sixteenth-yard fixed-point units per RE…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-012
Every contest submission must generate and save an AI preview image using the same prompt-construction path and rendering method as the Quilt Designer Generate Preview action. Contest submission renders must be attempted whenever Design Co…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-013
New submissions must default to a pending moderation state. Store admins must be able to review each submission, inspect the design, product list, participant display information, and generated preview image, then approve, reject, or reque…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-014
Only approved submissions may appear in public contest browsing, voting, social share cards, product-list purchase flows, or winner selection. Rejected and pending submissions remain visible only to authorized tenant staff and the submitti…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-015
The tenant storefront navigation must expose a Design Contest link that opens a public contest index. The index must list active, upcoming, judging, and completed contests with status, dates, entry/voting eligibility, and a link to browse…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-016
The public contest detail page must let shoppers browse approved design submissions, filter or sort entries, open an entry detail page, see the participant-facing designer attribution, view the AI-generated preview, and start their own con…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-017
Store admins must configure voting mode per contest: simple likes only, one favorite vote, a configurable number of favorite votes, or ranked top-X favorites. The configuration must define whether likes are separate from official votes, ho…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-018
Authenticated shoppers must default to one official vote per contest unless the contest voting configuration grants more. Storefront shoppers must also be able to like approved quilt designs during the contest voting window, with likes tra…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-019
Non-registered shoppers must be allowed to like and vote during the contest voting window when the contest permits anonymous participation. Anonymous likes and anonymous votes must be tracked and totaled separately from authenticated likes…
10h agoapps/web/src/lib/db.tspackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-020
If a shopper with an existing favorite vote or ranked top-X ballot attempts to vote again in a way that would replace their prior ballot, the site must prompt for confirmation before changing the stored vote. Confirmed changes must retain…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-021
When a shopper has liked, favorited, or ranked contest entries, those entries must appear at the top of the contest submission list for that shopper in every public sort/filter view, preserving their selected order for ranked top-X ballots…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-022
Store admins must be able to see vote counts at any time, including authenticated likes, anonymous likes, authenticated official votes, anonymous official votes, ranked-position totals, and computed score under the contest's current voting…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-023
Store admins must be able to select one or more winning submissions after judging starts. Winner selection must support placement labels such as winner, runner-up, honorable mention, or custom labels, and must be auditable and reversible u…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-024
Store admins must configure the prize for each contest. Prize components may include store credit, all fabric and supplies needed for the winning design, a quantity of a specific product, paid tickets to a specific class/event, cash, a cou…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-025
Prize values involving money must use integer minor units, percentage awards must use basis points, and any recurring percentage-of-kit-sales award must record the eligible kit, recipient, calculation basis, start date, optional end date,…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-026
Store admins must be able to configure whether the winning design remains on the storefront after the contest as a purchasable quilt kit. When enabled, the public winner page must link to the kit after the admin publishes it.
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-027
Any shopper viewing an approved design submission must be able to see every product needed to make that design, including fabric yardage, notions, supplies, substitutions, unavailable items, and estimated price. The entry page must preserv…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-028
Store admins must be able to create a quilt kit from any approved design submission at any time, not only from winners. The kit creation flow must let the admin choose whether the kit references the designer, the contest, both, or neither…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-029
Shoppers and participants must be able to share approved design submissions on social media using canonical tenant storefront URLs, saved AI preview images, and attribution metadata that respects anonymous-submission settings.
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-030
Contest data must emit typed domain events through the outbox for contest creation/publication, submission received, submission approved/rejected, vote cast, vote changed, winner selected, winner selection reversal, prize awarded, and kit…
2m agopackages/events/src/registry.ts×2packages/demo-data/src/packs/0013_design_contests.tspackages/events/src/registry.test.ts - ShippedREQ-QDC-031
The tenant admin dashboard must include a Design Contest tile or named SLI (REQ-ANL-042) showing active contest status, pending submissions, approved submissions, vote totals, anonymous participation totals, judging window state, winner pu…
10h agopackages/demo-data/src/packs/0013_design_contests.ts - ShippedREQ-QDC-032
The Design Contest feature must ship behind a feature flag from packages/flags; demo data for at least one active contest, one completed contest, approved submissions, anonymous participation, and a winner-created kit must live under packa…
10h agopackages/demo-data/src/packs/0013_design_contests.ts
Last refreshed at build: . Redeploy to regenerate. Also available as JSON → Edit REQUIREMENTS.md on GitHub →
