theBicycle — Feature Showcase & Test Guide¶
Tenant DB:
thebicycle| Schema:scenario| Default Pipeline: pipeline_id=4, scenario_id=4
All test steps below use the Default pipeline unless stated otherwise.
Living document — add examples as new features are validated.
Table of Contents¶
- Expiry Dates (Perishable Inventory)
- Shortage Exceptions (Supply Exceptions)
- Outlier Detection (Demand Corrections)
- Overstock Detection (OH >> Safety Stock)
- Lot-Sizing & EOQ on Route Arrows
- MEIO Results — Fill Rate Extremes
- Forecast Exceptions (MAPE > 60%)
- ABC Classification
- Netting (Forecast vs Firm Orders)
- Multi-Echelon Route Network
- Aggregate Views (Multi-SKU Selection)
1. Expiry Dates (Perishable Inventory)¶
What it shows: OH stock with a hard shelf-life limit. The system tracks expiry per on-hand lot. Planning must consume or write off stock before expiry.
| Item | Site | Qty | Expiry |
|---|---|---|---|
| Brake Pads Shimano GRX RX810 4 pcs (item 26) | Central Warehouse Brussels (site 100) | 90.8 | 2026-05-29 |
| Inner Tube Continental 700×28 (item 2) | Berlin Cycles (site 312) | 60 | 2026-06-12 |
Test Steps:
- Ensure pipeline is set to Default (top-left pipeline dropdown).
- Navigate to
/series/26_100(Brake Pads Shimano GRX × Brussels). - Click the Supply tab.
- In the Planning Grid, expand the Inventory section.
- Check the OH Good (usable) row — week 0 should show 90.8 units.
- Note that the quantity drops at the expiry week (2026-05-29 → roughly week 4–5 from today).
- Verify OH Bad row increases at the same week as OH Good drops — expired stock transferred to bad.
- Repeat with
/series/2_312(Inner Tube × Berlin Cycles) — OH Good = 60, expiry = 2026-06-12.
Where to look:
/series/26_100 → Supply tab → Planning Grid → Inventory section → OH Good row.
2. Shortage Exceptions (Supply Exceptions)¶
What it shows: Weeks where projected inventory goes negative — demand exceeds available supply + stock. Central Warehouse Brussels (site 100) is the main shortage hotspot because it is the source node for all European retail replenishment.
| Item | Site | Week | Shortage Qty |
|---|---|---|---|
| Inner Tube Continental 700×28 (item 2) | Central Warehouse Brussels (site 100) | W0 | 384.7 units |
| Inner Tube Continental 700×28 (item 2) | Central Warehouse Brussels (site 100) | W8 | 382.2 units |
| Tire Continental Grand Prix 5000 S TR 28mm (item 3) | Central Warehouse Brussels (site 100) | W0 | 331.1 units |
| Chain Lube Finish Line 500ml (item 1) | Central Warehouse Brussels (site 100) | W0 | 216.2 units |
Why it happens: Brussels is the central warehouse feeding ~30 retail shops. If a BUY order is delayed or SS is too low, the shortage cascades immediately to all downstream shops via replenishment orders that cannot be filled.
Test Steps:
- Navigate to
/series/2_100(Inner Tube × Brussels). - Click the Supply tab.
- In the inventory projection chart, look for red bars below the zero line at week 0 and week 8.
- Scroll down to the Supply Exceptions panel — shortage rows should be listed with severity and qty.
- Click the W0 shortage row to highlight it on the chart.
- Navigate to
/series/3_100— same procedure, expect shortage at W0 = 331.1 units. - From the Dashboard → Exceptions filter → select "supply" type → confirm items 2, 3, 1 appear at site 100.
Where to look:
/series/2_100 → Supply tab → chart (red bars below zero) + Exceptions panel.
3. Outlier Detection (Demand Corrections)¶
What it shows: Demand values that were statistically unusual (IQR or z-score method) and corrected before forecasting. The original value is kept for audit; the corrected value is used in the forecast.
| Item | Site | # Corrections | Max Δ |
|---|---|---|---|
| Transmission Assembly Kit (item 23) | Groningen Fietsen (site 345) | 46 corrections | 1.0 unit |
| Transmission Assembly Kit (item 23) | München Rad (site 311) | 44 corrections | 0.30 unit |
| Brake Service Kit (item 22) | Eindhoven Bikes (site 344) | 43 corrections | 2.75 units |
Test Steps:
- Navigate to
/series/23_345(Transmission Assembly Kit × Groningen). - On the main Forecast chart, look for the amber shaded polygon (outlier bounds: upper/lower).
- Look for red dot markers above the bounds — these are the original outlier values before correction.
- Hover over a red marker — the tooltip shows the z-score for that point.
- Scroll down to the Outlier Analysis panel (draggable, below the chart).
- Verify the table shows ~46 rows with columns: Date, Original Value, Corrected Value, Δ cut (abs + %), Lower Bound, Upper Bound, Z-Score.
- Sort by "Δ cut %" descending — confirm the max Δ is ~1.0 unit.
- Navigate to
/series/22_344(Brake Service Kit × Eindhoven) — expect 43 corrections, max Δ ~2.75 units.
Where to look:
/series/23_345 → Forecast tab → amber shaded area + red markers on chart; scroll to Outlier Analysis panel.
4. Overstock Detection (OH >> Safety Stock)¶
What it shows: Projected OH rising far above the safety stock target. The red fill on the chart flags the "excess zone" (OH > SS × (1 + excess_pct)).
| Item | Site | Max SS | Max OH | Ratio |
|---|---|---|---|---|
| Front Derailleur Shimano DA FD-R9200 (item 15) | Utrecht Cycles (site 343) | 1 | 17,218 | 17,218× |
| Brake Caliper Set Shimano DA R9200 (item 7) | Rotterdam Fietsen (site 342) | 2 | 30,770 | 15,385× |
| GPS Garmin Edge 1040 Solar (item 12) | Hamburg Fahrrad (site 313) | 1 | 16,331 | 16,331× |
| Rear Derailleur Shimano DA RD-R9200 (item 14) | Bordeaux Bikes (site 305) | 1 | 11,558 | 11,558× |
Root cause: SS=1 unit was computed for very slow movers at retail sites (almost no demand). The supply plan still receives replenishment transfers from the country warehouse triggered by EOQ logic. Since lot sizes are large relative to near-zero demand, OH accumulates far above the SS floor.
Test Steps:
- Navigate to
/series/7_342(Brake Caliper Set × Rotterdam). - Click the Supply tab.
- In the inventory projection chart, observe the large red filled area towering above the amber safety stock line.
- Read the KPI cards at the top — note the committed buffer vs actual OH.
- In the Planning Grid → Inventory section → "OH Good (usable)" row — scroll right to see OH rising week by week.
- Navigate to
/series/15_343(Front Derailleur × Utrecht) for the most extreme case (17,218×). - Check the IO tab → MEIO section → committed_buffer will be ~1 unit vs actual OH in thousands.
Where to look:
/series/7_342 → Supply tab → chart with large red overstock zone above the amber safety stock line.
5. Lot-Sizing & EOQ on Route Arrows¶
What it shows: The route network arrows display min:N lot:M when minimum order quantity or lot-size multiplier is non-trivial. This explains discrete jumps in the supply plan.
| Item | Site | Route type | Lead time | min_qty | mult_qty | EOQ |
|---|---|---|---|---|---|---|
| Tire Continental Grand Prix (item 3) | Brussels warehouse (site 100) | External Purchase | 2 wks | 20 | 10 | 30.45 |
| Chain Shimano Dura-Ace (item 4) | Brussels warehouse (site 100) | External Purchase | 14 wks | 10 | 10 | 24.12 |
| Rear Derailleur (item 14) | Brussels warehouse (site 100) | External Purchase | 21 wks | 10 | 10 | 6.26 |
Key insight — Tire Grand Prix (item 3): min_qty=20 means even if you only need 5 tires, you must buy 20. mult_qty=10 means the order is rounded up to the next multiple of 10. EOQ of 30.45 confirms the economic optimum is between the first and second lot.
Test Steps:
- Navigate to
/series/3_100(Tire Grand Prix × Brussels). - Click the Supply tab → scroll to the Route Network panel.
- Hover over the arrow from Supplier → Brussels — the pill label should show
External Purchase / min:20 lot:10. - In the Planning Grid → Incoming section → BUY row — confirm order quantities jump in 20/30 unit blocks (not smooth).
- Navigate to
/series/4_100(Chain Shimano × Brussels) — hover the BUY arrow — expectmin:10 lot:10and lead time = 14 weeks. - Navigate to
/series/14_100(Rear Derailleur × Brussels) — hover the BUY arrow — expect lead time = 21 weeks. - Go to the EOQ tab for
/series/3_100— confirm EOQ calculation = 30.45 based on order cost / holding rate.
Where to look:
/series/3_100 → Supply tab → Route Network panel → hover BUY arrow for lot-sizing pill.
6. MEIO Results — Fill Rate Extremes¶
What it shows: Multi-Echelon Inventory Optimisation computed buffer stock levels and resulting fill rates per SKU×site.
Worst fill rate (0% — no buffer assigned):
| Item | Site | Fill Rate | Buffer | Wait Time |
|---|---|---|---|---|
| Rear Derailleur DA RD-R9200 (item 14) | Spain Country Warehouse (site 203) | 0% | 0 | 0 |
| Di2 Battery (item 17) | Germany Country Warehouse (site 202) | 0% | 0 | 0 |
| Brake Service Kit (item 22) | Central Warehouse Brussels (site 100) | 0% | 0 | 0 |
Best fill rate (≥ 98%):
| Item | Site | Fill Rate | Buffer |
|---|---|---|---|
| Brake Pads Dura-Ace R9200 (item 5) | Verona Cycling (site 335) | 100% | 18 units |
| Brake Pads Dura-Ace R9200 (item 5) | Bordeaux Bikes (site 305) | 100% | 16 units |
| Chain Lube Finish Line 500ml (item 1) | France Country Warehouse (site 201) | 98% | 53 units |
Why 0% at country warehouses? The MEIO optimizer allocated budget to higher-demand nodes first. Country warehouses with low demand and long lead times from Brussels received zero buffer in the budget-constrained run.
Test Steps:
- Navigate to
/meio→ MEIO Scenarios tab. - Filter or sort by fill_rate ascending → confirm items 14 (site 203), 17 (site 202), 22 (site 100) appear at 0%.
- Click the row for item 14 / site 203 — committed_buffer = 0, wait_time = 0.
- Navigate to
/series/14_203→ IO tab → KPI cards should show Fill Rate = 0%, Safety Stock = 0. - Now back on
/meio, sort fill_rate descending — item 5 at site 335 and site 305 should be at 100%. - Click
/series/5_335→ IO tab → KPI shows Fill Rate = 100%, Buffer = 18 units. - Compare the IO tab for
/series/5_335vs/series/14_203side-by-side to understand the contrast.
Where to look:
/meio → MEIO Scenarios tab → sort by fill_rate. /series/14_203 → IO tab for the 0% case.
7. Forecast Exceptions (MAPE > 60%)¶
What it shows: Series where the best method still achieves poor forecast accuracy. All flagged as severity=medium, exc_type=forecast, threshold=0.6 (60% MAPE).
| Series | Item | Site | Method | MAPE | Bias |
|---|---|---|---|---|---|
| 4_343 | Chain Shimano Dura-Ace (item 4) | Utrecht Cycles (site 343) | AutoETS | 377% | -7.58 |
| 1_322 | Chain Lube 500ml (item 1) | Barcelona Bici (site 322) | MSTL | 294% | -5.43 |
| 2_322 | Inner Tube (item 2) | Barcelona Bici (site 322) | MSTL | 286% | -2.79 |
Why MAPE > 100%? These are highly intermittent series (many zero weeks). A single non-zero week where forecast=0 → MAPE contribution = ∞ → average MAPE explodes. Negative bias means systematic under-forecasting.
Test Steps:
- Navigate to
/series/4_343(Chain Shimano × Utrecht). - Click the Forecast tab.
- Scroll to the Method Comparison panel — AutoETS row should be highlighted green (best method).
- Check the MAPE column for AutoETS — should show ~377% in red.
- Note the Bias value (~-7.58) — indicates systematic under-forecasting.
- Scroll up to the main chart — notice many zero weeks with sporadic spikes; AutoETS misses them.
- Go to the Dashboard (main
/), click the Exceptions tab → filter by type "forecast". - Confirm series 4_343, 1_322, 2_322 appear in the exceptions list with severity = medium.
Where to look:
/series/4_343 → Forecast tab → Method Comparison panel (green AutoETS row, MAPE=377%).
8. ABC Classification¶
Distribution across 1,150 classified series:
| Class | Count | Revenue range |
|---|---|---|
| A | 215 | €239.70 – €3,641.30 |
| B | 227 | €113.20 – €238.00 |
| C | 133 | €71.50 – €113.20 |
| X (intermittent) | 460 | — |
| Y (moderate) | 87 | — |
| Z (rare) | 28 | — |
X/Y/Z = second classification axis (intermittency/variability). Most series fall in X (460) — consistent with a bicycle parts catalogue where many SKUs are slow movers at retail level.
Test Steps:
- Navigate to
/abc(ABC Classification page). - Confirm the distribution chart shows ~215 A-class, ~227 B-class, ~133 C-class series.
- Check the X/Y/Z axis — X count should be ~460 (intermittent), Y ~87, Z ~28.
- Click on a row in the A class (highest revenue) — should navigate to its Time Series Viewer page.
- Verify the Pareto curve: A class captures the top revenue band.
- Go back to ABC, filter by C class + X intermittency → these are slow, low-revenue movers (prime candidates for min-stock or write-off policy).
- Click "Run ABC" to re-run classification and verify counts remain stable.
Where to look:
/abc → distribution chart + Pareto curve. Click any series row to navigate to its detail page.
9. Netting (Forecast vs Firm Orders)¶
What it shows: The supply plan nets firm customer orders against the statistical forecast to avoid double-counting demand.
Example — Di2 Battery (item 17) at Berlin Cycles (site 312): - stat_forecast_qty = 1.1957 units/week - firm_demand_qty = 0 (no firm orders yet for this SKU at this site) - total_netted_qty = 1.1957 (= stat forecast, no netting needed)
When firm orders exist: total_netted_qty = MAX(0, stat_forecast − firm_orders) — avoids planning for demand already covered by confirmed orders.
Test Steps:
- Navigate to
/series/17_312(Di2 Battery × Berlin Cycles). - Click the Netting tab.
- Look at the KPI cards: Total Forecast, Open/Netted, Firm Demand, Supply Plan.
- For this series, Firm Demand should be 0 → Open/Netted ≈ Total Forecast.
- Check the chart — stacked bars show "Consumed" (dark blue) vs "Open Fcst" (light blue) vs "Firm Demand" (orange).
- Switch to a series that does have firm orders (check Dashboard exceptions → "netting" type) to see non-zero firm demand.
- Navigate to the Supply tab → Planning Grid → Outgoing section → "Demand (forecast)" row = netted demand used for planning.
Where to look:
/series/17_312 → Netting tab → KPI cards + stacked bar chart.
10. Multi-Echelon Route Network¶
What it shows: The supply chain graph from supplier → central warehouse → country warehouse → retail shops. Click any arrow to filter the Orders panel to that specific route.
Key structure for Inner Tube (item 2):
Supplier
→ Central Warehouse Brussels (site 100) [BUY, lead=2 wks, min=10, lot=10]
→ France Country Warehouse (site 201) [TRANSFER, lead=1 wk]
→ Germany Country Warehouse (site 202) [TRANSFER, lead=1 wk]
→ Spain Country Warehouse (site 203) [TRANSFER, lead=1 wk]
→ ~10 Spanish retail shops [TRANSFER, lead=1 wk]
Test Steps:
- Navigate to
/series/2_100(Inner Tube × Brussels). - Click the Supply tab → scroll to the Route Network panel.
- Verify the DAG shows 3 depth levels: Supplier → Brussels → Country WHs → Retail shops.
- Click the arrow from Brussels → Spain Country Warehouse → confirm the Orders panel below filters to only TRANSFER orders on that route.
- Click the arrow from Supplier → Brussels → Orders panel shows only BUY orders.
- Hover any arrow to read the pill: route type, lead time, min qty, lot qty.
- Navigate to
/series/2_201(Inner Tube × France Country Warehouse) — the BOM tree should show Brussels as the source node and France as the current site.
Where to look:
/series/2_100 → Supply tab → Route Network panel (DAG with clickable arrows).
11. Aggregate Views (Multi-SKU Selection)¶
What it shows: When multiple items or all items in a segment are selected via the top-bar dropdowns, every detail tab switches to an aggregated view. This gives a portfolio-level read across a selection of SKUs without loading each series individually.
Selection modes:
| Selection | What you see |
|---|---|
| 1 item (default) | Single-series detail view on all tabs |
| 2+ items selected | Aggregate view on Netting, EOQ, IO, Supply tabs; aggregate forecast chart on Forecast tab |
| All items in segment | Same aggregate view, covering every series in the segment |
Aggregate content per tab:
| Tab | Aggregate content |
|---|---|
| Forecast | Summed historical + locked best-method forecast across all selected series; editable with proportional write-back |
| Netting | KPI row (Total Forecast, Open/Netted, Firm Demand, Supply Plan) + stacked bar chart summed by week |
| EOQ / IO | Averaged fill rate, summed safety stock qty, averaged lead time and wait time, summed marginal value; averaged unit/order cost, averaged holding rate |
| Supply | Combined inventory projection chart (summed) + all supply orders for selected item×site pairs with type filter |
Test Steps:
- Navigate to any series detail page (e.g.
/series/1_301). - In the top-bar Item dropdown, click to open it and select a second item (e.g. Carbon Road Frame).
- Verify the badge below the tabs now reads "N series · aggregate" (where N > 1).
- Click the Netting tab — should show aggregate KPI cards and a stacked bar chart (not a single-series table).
- Click the EOQ tab — should show MEIO / INVENTORY OPTIMIZATION section with Avg Fill Rate, Total Safety Stock, etc.
- Click the IO tab — same aggregate IO view.
- Click the Supply tab — should show the combined inventory projection chart (line chart + bars) and a table of all supply orders from all selected item×site pairs.
- Click the Forecast tab — should show the aggregated historical chart and forecast table with summed values.
- Now open the Site dropdown and select all sites (or use "All" button) — the series count badge should jump to 50 (2 items × 25 sites).
- Open the Segment dropdown (left toolbar), select a segment (e.g. "Default") — selecting a segment with no item/site selection should aggregate all series in that segment.
- Return to single-item selection by clicking "Clear" in the Item dropdown and selecting just one item — verify all tabs revert to single-series detail view.
Where to look:
Any series detail page → Item dropdown (top bar) → select 2+ items → tabs switch to aggregate mode automatically.
Last updated: 2026-04-25