A visual walkthrough of the programme · current at 2026-09-30, Run #4 · Top Lids, Shipping
REPORT - Bulk Inventory Projection.md is the wording authority and
Workpapers\ holds the arithmetic. Where this guide and the Report disagree, the
Report is right and this guide has a bug. The plain Markdown twin of this page is
Guide - Bulk Inventory Projection.md.
Every figure here regenerates: python "Workpapers\stock_threshold.py" for the
quantities, node "Workpapers\seasonality.mjs" for the Seasonal Baseline, and
python "Workpapers\order_export_forensics.py" for the claims about the Order
export.
Top Lids makes aquarium screen top lids to order. Every Lid is cut for a specific tank and configured by the Client, which today means every Lid is made from scratch after the Order lands and flown from Shanghai. The programme holds a small number of the most-ordered Lids in stock in a Miami warehouse, shipped by sea in bulk, so that those Orders ship from a shelf instead of a factory.
Two things make that possible on a product with several hundred configurations per tank: a Stock Threshold that picks which tanks are worth stocking at all, and Postponement, which stocks one physical Lid with its Cutouts still open and resolves the Client's actual choice at Kitting time from Add-On Product stock.
The Stock Threshold replaced 4 ranked Stock Tier bands in Run #4, because a rank band is relative and a threshold is absolute — an item can fall out of a band because something else grew, without its own demand changing at all. The separate retirement rule, a Captured Velocity below 0.15 per week, was retired with the bands: it was a second, differently scaled test of the same question, and two tests of one question disagree sooner or later.
Order-Up-To Level = Captured Velocity x (Lead Time Weeks + Review Weeks)
+ Service Factor x sqrt( Captured Velocity x (Lead Time Weeks + Review Weeks)
+ Captured Velocity² x Lead Time Variability Weeks² )
Reorder Point = the same, at Lead Time Weeks alone
Inventory Position = ( On Hand - Allocated ) + On Order
Order Quantity = MAX( 0, Order-Up-To Level - Inventory Position )
Nothing was replaced when Lead Time Variability was added: the old formula is the exact special case at variability 0.
The second term under the square root is proportional to velocity SQUARED. So Lead Time risk is negligible on a slow mover and dominant on a fast one — 5% of total risk at 0.21 units a week, 83% at 20.42. That is why the correction was worth +9 Lids across the Stock Lids but +339 units, 24%, across the Add-On Products: the Add-Ons are the fast movers.
Allocated is SUBTRACTED. Counting Allocated units as available under-orders by the size of the open Order book, every cycle, permanently. A single “On Hand” column let the Organization be vague about this; a real Inventory Management System forces the choice.
The programme ran on a flat 1.000 index until 2026-09-30. It is now measured from the all-time Order export — 20,286 rows, 2021 to 2026.
Deseasonalised Velocity = 0.6 x ( trailing 6 week units / 6 / Seasonal Baseline of those 6 weeks )
+ 0.4 x ( trailing 12 week units / 12 / Seasonal Baseline of those 12 weeks )
Captured Velocity = Deseasonalised Velocity
x Seasonal Baseline of the coming Lead Time plus Review window
x Capture Rate
De-seasonalise the history, blend, then re-seasonalise forward onto the window the Order covers. The index multiplies a velocity and is never added to one. An Order placed on a Review Date is bought for the weeks 9 to 11 ahead, so the months that matter are the ones the Freight Pallet lands in and sells through.
Buying December's stock on October's index is how a seasonal business runs out in its best month.
| Figure | Seasonally flat | Re-seasonalised |
|---|---|---|
| Captured Velocity | 15.57 / wk | 17.62 / wk |
| Reorder Point | 273 | 297 |
| Order-Up-To Level | 310 Lids | 339 Lids |
| Add-On Product loose units | 1,280 | 1,499 |
| Total Freight Pallets | 7 | 8 |
Had arrival landed in June or October the index would have released capital instead. Either way it is a real number and it changes the Order that is about to be placed.
The Warehouse owns exactly two numbers: On Hand and Allocated. On Order can never come from the Warehouse — the Warehouse has no idea what is on the water.
The Cycle Count is kept, and its job has changed: it is now the only independent check on the feed. Replacing manual entry with the Inventory Feed removes the error signal along with the typing, and the Cycle Count is what puts one back.
| Figure | Value |
|---|---|
| Tank Identifiers stocked | 30 of 484 |
| Order-Up-To Level | 339 Lids |
| Reorder Point | 297 |
| Add-On Product units | 1,499 in 43 Stock Packages |
| Freight Pallets | 8 |
| Arrives | week 9 — 2026-12-02 |
| Marketing push notice needed | 11 weeks |
At launch On Hand is 0 and On Order is 0, so the formula asks for the full Order-Up-To Level. Shipment #1 is therefore an initiation, not a cover estimate. The old “top 25 at 8 week cover” plan is retired: at a 9 week Lead Time an 8 week cover is gone before the first Freight Pallet lands. The Air Seed Batch must carry Inserts, or it buys 5 weeks of unfulfillable stock.
The buy-up rule needs no cost data. Component discounts are per component, and
buying up to tier T is worth it when T x (1 - new discount) < order quantity x (1 - old
discount). The unit cost cancels. For Shipment #1: Screened Inserts at 1,692
units clear the 1,000 tier and fall short of 1,864, so do not buy up; Lid Frames at 269 clear 200
and fall short of 474, so do not buy up either.
| Flag | The question | Default if you say nothing |
|---|---|---|
| F21 | 8 Freight Pallets against a 2 to 4 capital envelope | Order the full Order-Up-To Level anyway — anything less is a planned Stockout |
| F24 | Is the current Feed Door part of the Standard Stock Configuration? | Keep it, 1 per Stock Lid. The Flag worth answering first — worth 284 units, and a design decision rather than a data gap |
| F36 | The Evaporation Cover attaches to 48.0% of configured Lids and is in no stocking plan | Do not stock it in Shipment #1 — it would add 198 panels and take 8 Freight Pallets to 12 |
| F22 | Lead Time Variability of 1.6 is constructed from 5 judgements | Keep 1.6; replace with measured Purchase Order dates after 4 Shipments |
| F26, F27 | 6 Add-On Attach Rates and the Light Type mix are assumed | Keep. Run #4 established these cannot be measured from the Order record at all — they must be instrumented where the Client chooses |
Run #3 left the seasonality computation “finished and tested against synthetic input”, needing “only its input file”. Both claims were true, and the result would still have been wrong.
A configured Lid in the Order export is two rows, not one — a parent Lineitem and an upcharge Lineitem carrying the Options — and the second was rolled out in 2025-09. Counting every row doubles recent demand and leaves 2023 alone, putting a step change in the middle of the series that the de-trending cannot see through. Separately, the Organization is called “Top Lids”, so matching the word “Lid” catches its own service lines, and unevenly: 20.6% of 2021's Lid units against 0.0% of 2026's. The corrected series is 8,224 Lid units where a naive count returns 23,627. Roughly two thirds of the rows in that file are not Lids.
A synthetic test validates the arithmetic and says nothing about what the rows mean. A tested computation and a trustworthy number are different things, and the gap between them is entirely in the input. Budget for reading the file, not for running the script.