[ { "id": "T001", "description": "Plan decision recorded: canonical model selected (subset of service_catalog vs separate products table)", "implemented": true, "featureIds": ["F001"] }, { "id": "T002", "description": "Taxonomy decision recorded: item kinds and terminology finalized (product vs license)", "implemented": true, "featureIds": ["F002"] }, { "id": "T010", "description": "DB migration applies cleanly on empty database", "implemented": false, "featureIds": ["F010"] }, { "id": "T011", "description": "DB migration applies cleanly on existing tenant with service_catalog data", "implemented": false, "featureIds": ["F010", "F090"] }, { "id": "T012", "description": "SKU uniqueness enforced per tenant (duplicate insert/update fails)", "implemented": false, "featureIds": ["F011"] }, { "id": "T013", "description": "Inactive product cannot be selected in new contract/invoice flows (or shows warning depending on design)", "implemented": false, "featureIds": ["F012", "F033"] }, { "id": "T014", "description": "Multi-currency product prices persist and round-trip (create/update/read)", "implemented": false, "featureIds": ["F013"] }, { "id": "T015", "description": "Tax rate assignment persists (null => non-taxable; non-null => taxable)", "implemented": false, "featureIds": ["F014"] }, { "id": "T020", "description": "Product CRUD: create product with required fields succeeds", "implemented": false, "featureIds": ["F020", "F032"] }, { "id": "T021", "description": "Product CRUD: update product fields persists and updates updated_at/audit metadata", "implemented": false, "featureIds": ["F020", "F081"] }, { "id": "T022", "description": "Product CRUD: delete/archival behavior respects references (cannot delete referenced product)", "implemented": false, "featureIds": ["F023"] }, { "id": "T023", "description": "Product list API supports pagination", "implemented": false, "featureIds": ["F021", "F031"] }, { "id": "T024", "description": "Product list search finds by name and SKU", "implemented": false, "featureIds": ["F022"] }, { "id": "T025", "description": "Product filters by active status and category/type", "implemented": false, "featureIds": ["F022", "F015"] }, { "id": "T030", "description": "Products navigation entry renders and loads Products manager page", "implemented": false, "featureIds": ["F030"] }, { "id": "T031", "description": "Products manager table renders expected columns and values", "implemented": false, "featureIds": ["F031"] }, { "id": "T032", "description": "Product create/edit UI validates required fields (name, price, SKU if required)", "implemented": false, "featureIds": ["F032", "F003"] }, { "id": "T033", "description": "Product picker supports keyboard navigation and search", "implemented": false, "featureIds": ["F033"] }, { "id": "T034", "description": "Product picker excludes inactive products (or indicates inactive)", "implemented": false, "featureIds": ["F033", "F012"] }, { "id": "T035", "description": "Currency display in product UI uses correct currency symbol/code for context", "implemented": false, "featureIds": ["F034"] }, { "id": "T040", "description": "Contract template can include products with quantities and persists them", "implemented": false, "featureIds": ["F040"] }, { "id": "T041", "description": "Contract line can include products with quantities and persists them", "implemented": false, "featureIds": ["F041"] }, { "id": "T042", "description": "Client contract assignment snapshots included products and allows overrides", "implemented": false, "featureIds": ["F063"] }, { "id": "T043", "description": "Contract validation: missing price for contract currency triggers actionable error", "implemented": false, "featureIds": ["F064"] }, { "id": "T044", "description": "Contract billing behavior: recurring product billed each cycle as configured", "implemented": false, "featureIds": ["F070", "F071"] }, { "id": "T045", "description": "Contract billing behavior: one-time product billed once (if implemented in V1)", "implemented": false, "featureIds": ["F070", "F071"] }, { "id": "T050", "description": "Billing engine generates product charges for client contract line with products attached", "implemented": false, "featureIds": ["F071"] }, { "id": "T051", "description": "Billing engine product charges include quantity, rate, total and correct servicePeriod bounds", "implemented": false, "featureIds": ["F071"] }, { "id": "T052", "description": "Billing engine product charges include tax fields and are recalculated on invoice persistence", "implemented": false, "featureIds": ["F073"] }, { "id": "T053", "description": "Billing engine product charges respect billing_timing and proration rules", "implemented": false, "featureIds": ["F074"] }, { "id": "T054", "description": "License charges path works (either dedicated license logic or unified under products)", "implemented": false, "featureIds": ["F072"] }, { "id": "T060", "description": "Manual invoice UI can add a product line from the product picker", "implemented": false, "featureIds": ["F080"] }, { "id": "T061", "description": "Manual invoice product line persists (invoice_items + details) and reloads correctly", "implemented": false, "featureIds": ["F082"] }, { "id": "T062", "description": "Manual invoice product line tax behavior matches selected tax_rate_id and client exemption", "implemented": false, "featureIds": ["F083", "F014"] }, { "id": "T063", "description": "Manual invoice product line supports rate/quantity overrides and stores override values (if enabled)", "implemented": false, "featureIds": ["F081"] }, { "id": "T070", "description": "Invoice rendering displays product lines with correct descriptions, quantities, totals", "implemented": false, "featureIds": ["F084"] }, { "id": "T071", "description": "Invoice rendering displays currency correctly for product lines", "implemented": false, "featureIds": ["F084", "F034", "F037"] }, { "id": "T080", "description": "Accounting mapping resolution returns correct mapping for a product line", "implemented": false, "featureIds": ["F090"] }, { "id": "T081", "description": "Accounting export includes product lines with correct mapping id and amounts", "implemented": false, "featureIds": ["F091"] }, { "id": "T082", "description": "Accounting export includes product taxes consistent with internal/external tax mode", "implemented": false, "featureIds": ["F091", "F093", "F014"] }, { "id": "T090", "description": "RBAC: users without permission cannot create/update/delete products", "implemented": false, "featureIds": ["F100"] }, { "id": "T091", "description": "RBAC: users without permission cannot modify product pricing/tax fields", "implemented": false, "featureIds": ["F100"] }, { "id": "T100", "description": "Backfill sets default item kinds correctly for existing catalog items", "implemented": false, "featureIds": ["F102"] }, { "id": "T101", "description": "Docs updated and describe Products end-to-end behavior (contracts/invoices/taxes)", "implemented": false, "featureIds": ["F103"] }, { "id": "T102", "description": "Product pricing precedence documented and matches implementation behavior", "implemented": false, "featureIds": ["F004"] }, { "id": "T103", "description": "Tax precedence documented and matches implementation behavior", "implemented": false, "featureIds": ["F005"] }, { "id": "T104", "description": "Products list pagination is stable (no duplicate/missing rows across pages while sorting)", "implemented": false, "featureIds": ["F027"] }, { "id": "T105", "description": "Product CSV export returns expected columns and formats", "implemented": false, "featureIds": ["F028"] }, { "id": "T106", "description": "Product CSV import rejects invalid rows and reports errors with line numbers (if implemented)", "implemented": false, "featureIds": ["F029"] }, { "id": "T107", "description": "Products manager bulk archive/unarchive applies to selected rows", "implemented": false, "featureIds": ["F035"] }, { "id": "T108", "description": "Products manager inline validation shows SKU uniqueness errors before save", "implemented": false, "featureIds": ["F036", "F011"] }, { "id": "T109", "description": "Product picker can filter to only products priced in a target currency (if implemented)", "implemented": false, "featureIds": ["F041"] }, { "id": "T110", "description": "Contract line types accept product/license types in API schema (validation test)", "implemented": false, "featureIds": ["F052", "F050"] }, { "id": "T111", "description": "Contract wizard supports attaching products to a product line type and persists config", "implemented": false, "featureIds": ["F054", "F062"] }, { "id": "T112", "description": "Template cloning copies product attachments into client assignment snapshot", "implemented": false, "featureIds": ["F061"] }, { "id": "T113", "description": "Billing engine rejects/flags contract line that references a product without price in contract currency", "implemented": false, "featureIds": ["F075", "F064"] }, { "id": "T114", "description": "Invoice portal views show product lines and totals correctly", "implemented": false, "featureIds": ["F085"] }, { "id": "T115", "description": "Invoice totals are correct for product quantities and rounding behavior", "implemented": false, "featureIds": ["F086"] }, { "id": "T116", "description": "Accounting export uses correct external item id for product lines based on mapping", "implemented": false, "featureIds": ["F092", "F090", "F091"] }, { "id": "T117", "description": "DB indexes exist for product search fields (migration verification)", "implemented": false, "featureIds": ["F104"] }, { "id": "T118", "description": "Archiving a product hides it from default list/search results but preserves historical invoice references", "implemented": false, "featureIds": ["F105", "F023"] }, { "id": "T119", "description": "Tenant setting: SKU required blocks product creation/update without SKU when enabled", "implemented": false, "featureIds": ["F106"] }, { "id": "T120", "description": "Tenant setting: default tax behavior applied on new product creation (if configured)", "implemented": false, "featureIds": ["F107"] }, { "id": "T121", "description": "Invoice APIs include product kind/type metadata on invoice lines", "implemented": false, "featureIds": ["F110"] }, { "id": "T122", "description": "Invoice persistence keeps stable product reference for each invoice line (even after product update)", "implemented": false, "featureIds": ["F111"] }, { "id": "T123", "description": "Draft invoice editing can add/remove product lines and recalculates totals/taxes correctly", "implemented": false, "featureIds": ["F112"] }, { "id": "T124", "description": "Contract attach/detach products supports bulk operations and is idempotent", "implemented": false, "featureIds": ["F120"] }, { "id": "T125", "description": "Contract line details UI shows attached products and quantities", "implemented": false, "featureIds": ["F121"] }, { "id": "T126", "description": "Client contract UI shows attached products and any overrides", "implemented": false, "featureIds": ["F122"] }, { "id": "T127", "description": "Cannot attach inactive/archived product to a new contract line unless explicitly allowed", "implemented": false, "featureIds": ["F123", "F105"] }, { "id": "T128", "description": "Contract and invoice validations reject product quantity <= 0", "implemented": false, "featureIds": ["F124"] }, { "id": "T129", "description": "Contract wizard blocks activation when attached products lack pricing in contract currency", "implemented": false, "featureIds": ["F130"] }, { "id": "T130", "description": "Billing run fails with actionable error (or flags) instead of skipping products with missing currency pricing", "implemented": false, "featureIds": ["F131", "F132"] }, { "id": "T131", "description": "Invoice item details for product charges contain enough data for accounting export grouping and tax passthrough", "implemented": false, "featureIds": ["F133"] }, { "id": "T132", "description": "Accounting mapping UI supports mapping product category/type to external item codes (if implemented)", "implemented": false, "featureIds": ["F140"] }, { "id": "T133", "description": "Product revenue reporting/export returns consistent totals and supports category grouping (if implemented)", "implemented": false, "featureIds": ["F141"] }, { "id": "T134", "description": "Future inventory augmentation does not require changing invoice historical line references (SKU stability)", "implemented": false, "featureIds": ["F150"] } , { "id": "T135", "description": "License term metadata persists on a license-like product and is validated (term/cadence)", "implemented": false, "featureIds": ["F109", "F007"] }, { "id": "T135A", "description": "License period start/end dates and proration rules are explicitly deferred in V1 (no required fields, no billing behavior)", "implemented": false, "featureIds": ["F109A"] }, { "id": "T136", "description": "Ticket can record product/material usage and it appears in the billing/invoice pipeline with correct tax/currency (auto-bill)", "implemented": false, "featureIds": ["F162", "F164"] }, { "id": "T137", "description": "Project can record product/material usage and it appears in the billing/invoice pipeline with correct tax/currency (auto-bill)", "implemented": false, "featureIds": ["F163", "F164"] }, { "id": "T138", "description": "Time-entry product/material usage is deferred in V1 (no schema/UI for time-entry linkage)", "implemented": false, "featureIds": ["F165"] }, { "id": "T139", "description": "Materials model supports linking usage to either ticket or project and stores product id, quantity, rate overrides, and billable state", "implemented": false, "featureIds": ["F164"] }, { "id": "T140", "description": "Ticket/project materials auto-bill behavior is implemented (no approval gate) and can be invoiced", "implemented": false, "featureIds": ["F162", "F163"] }, { "id": "T141", "description": "Billing engine includes ticket materials as charges for the correct billing period and persists them to invoice items on invoice generation", "implemented": false, "featureIds": ["F166", "F168"] }, { "id": "T142", "description": "Billing engine includes project materials as charges for the correct billing period and persists them to invoice items on invoice generation", "implemented": false, "featureIds": ["F166", "F168"] }, { "id": "T143", "description": "Materials cannot be billed twice (billed state prevents re-selection in subsequent billing runs)", "implemented": false, "featureIds": ["F167"] } ]