v2.7.0
v2.7.0 — Bundles: sell the pack, stock the parts
v2.7.0 — Bundles: sell the pack, stock the parts - KIT-01: Bundle engine (ecommerce v1) — a kit is a catalog/sales entity that is NEVER stocked.
v2.7.0 — Bundles: sell the pack, stock the parts
- KIT-01: Bundle engine (ecommerce v1) — a kit is a catalog/sales entity that is NEVER stocked. Its availability is derived from components: min(floor(component ATP / qty per kit)), published to mapped listings so a channel can only sell what the warehouse can actually assemble. Orders explode into components at allocation; the floor picks, packs and ships the parts (#96)
- Three hardening fixes found by the sprint’s own smoke: station fits now evaluates components instead of the (stockless) kit (#97); ship consumes exploded component quantities — a kit that allocated 4 no longer ships 1 (#99); floor screens display component pieces with their origin, e.g. “8 Pcs · 2 × KIT-AA8” (#100); and a scan resolves to the next PENDING line, so a kit component plus a loose line of the same SKU both get picked (#101)
- S3-HF2: “Also cancel in Shopify” actually works — the mutation was rejected at GraphQL validation and had never run. No refund, no channel restock, and a channel failure never rolls back the local cancellation (#103)
- B2B is untouched: kit lines are rejected on B2B orders by design; ship-confirm, wave and ship carry zero diff across all four PRs.
New lessons in the canon: L18–L22 — a non-stocked entity must be swept across writers AND screens, snapshots must precede shared deletes, duplicate SKUs across lines are a scan-resolver identity, and optional paths need at least one smoke each.
Rollback: re-deploy v2.6.0 (migrations in range are additive — safe). Release smoke: PASS 5/5 (ledger witness included — L17).