Mirabelle — End-to-End Test Report¶
Date: 2026-04-19
Tenant tested: theBicycle (account_id: bea73190-bc32-466e-bc28-3c9821237562)
Tester: Claude Code (automated browser + API verification)
API port: 8002 · Frontend: localhost:5173
Pipeline used for output data: pipeline_id=4 (Default)
Summary Table¶
| # | Area | Screen / Endpoint | Status | 3 DB Items Verified |
|---|---|---|---|---|
| 1 | Dashboard – Overview | / → Overview tab |
✅ PASS | Item 11 (Seatpost), Item 1 (Chain Lube), Item 5 (Brake Pads) |
| 2 | Dashboard – Forecast | / → Forecast tab |
✅ PASS | 1_301 (AutoETS), 10_304 (AutoETS), 24_301 (ADIDA) |
| 3 | Dashboard – EOQ | / → EOQ tab |
✅ PASS | Item 2 (Inner Tube, EOQ=86.87), Item 7 (Brake Caliper, EOQ=7.21), Item 21 (Drivetrain Kit, EOQ=13.3) |
| 4 | Dashboard – IO / MEIO | / → IO tab |
✅ PASS | 5_335 (FR=100%), 8_303 (FR=90.0%), 2_205 (FR=0%) |
| 5 | Dashboard – Supply | / → Supply tab |
✅ PASS | 4_341 (568 orders), 2_312 (498 orders), 3_301 (416 orders) — select pipeline "Default" |
| 6 | ABC Classification | /abc |
✅ FIXED | 1_342 (A, rank 1), 22_315 (B, rank 216), 15_331 (C, rank 443) |
| 7 | Segmentation | /segments |
✅ PASS | Default (575 members), A items (215), B items (227) |
| 8 | Time Series Viewer | /series/1_301 |
✅ PASS | 1_301 (AutoETS, seasonal+trending), 10_304 (AutoETS, non-seasonal), 24_301 (ADIDA, stationary) |
| 9 | Causal Forecasting | /causal |
✅ PASS | CAN-AER (Canyon Aeroad), CAN-ULT (Canyon Ultimate), CER-P5 (Cervelo P5) |
| 10 | MEIO Scenarios | Pipelines → MEIO | ✅ PASS | Base scenario, Budget Constrained, High Service Level |
| 11 | Supply Scenarios | Pipelines → Supply Planning | ✅ PASS | Baseline, High Service Level, Repair-First |
| 12 | Supply Param Templates | Pipelines → Supply Planning → Parameter Templates | ✅ PASS | Hard Capacity (18 params), Default (18 params), Lean Inventory (18 params) |
| 13 | Forecast Scenarios – Series | Pipelines → Forecast → Edit Series | ✅ PASS | 1_301 (Conservative scenario), 10_301 (Standard), 24_301 (Base) |
| 14 | Pipeline Registry | Pipelines → Pipeline tab | ✅ PASS | Pipeline 1 (Standard), Pipeline 4 (Default), Pipeline 34 (Standard + Causal + Maintenance) |
| 15 | Process Runner | /processes |
✅ PASS | ETL, ABC+Seg, Forecast steps with scenario tags |
| 16 | NPI Manager | /npi |
✅ PASS | Target/source selection, history table |
| 17 | Settings | /settings |
✅ PASS | Auth/DataSource/Parallel/Segmentation tabs |
Overall: 16 PASS · 0 WARN · 0 FAIL · 2 bugs fixed during test
1. Dashboard¶
Overview Tab ✅¶
28 active items, 32 sites with active items
| Metric | Value |
|---|---|
| Active Items | 28 |
| Sites with active items | 32 |
| On-Hand Good Qty | 5.9k (284.7k val.) |
| On-Hand Bad | 167 (11.9k val.) |
3 items verified in on-hand data: | Item | Site | On-Hand Qty | Cost | |------|------|-------------|------| | Seatpost Thomson Elite 27.2×350mm (id=11) | Central Warehouse Brussels (id=100) | 131 | — | | Seatpost Thomson Elite 27.2×350mm (id=11) | France Country Warehouse (id=201) | 26 | — | | Seatpost Thomson Elite 27.2×350mm (id=11) | Germany Country Warehouse (id=202) | 26 | — |
Note: Item 11 dominates on-hand stock across warehouses — expected for a bulk-stocked component.
Forecast Tab ✅¶
| Metric | Value |
|---|---|
| Total Series | 575 |
| Backtested | 572 |
| Seasonal | 292 |
| Trending | 417 |
| Best Method Distribution | AutoETS (222), AutoTheta (174), AutoARIMA (107), MSTL (38), ADIDA (N), CrostonOptimized (N) |
3 series verifying different winner methods:
| unique_id | Item | Site | Winner Method | Characteristics |
|---|---|---|---|---|
| 1_301 | Chain Lube Finish Line 500ml | Cycles Paris | AutoETS | 224 obs · Seasonal · Trending · medium complexity |
| 10_304 | Stem Ritchey WCS Carbon 100mm | Cycles Toulouse | AutoETS | 144 obs · Non-Seasonal · Trending · low complexity |
| 24_301 | Chain Shimano 105 Di2 12sp | Cycles Paris | ADIDA | Stationary · Continuous |
3 additional method examples:
| unique_id | Item | Site | Winner Method |
|---|---|---|---|
| 10_303 | Stem Ritchey WCS Carbon 100mm | Velo Marseille | AutoARIMA |
| 10_302 | Stem Ritchey WCS Carbon 100mm | Vélo Lyon | MSTL |
| 25_301 | Cassette SRAM Red AXS 12sp | Cycles Paris | CrostonOptimized |
EOQ Tab ✅¶
K-Curve Standard (K=1.0), last run 4/17/2026
| Metric | Value |
|---|---|
| Cycle Stock Value | $484,896 |
| Orders/Year | 6,027 |
| Active SKUs | 584 |
3 items verifying EOQ values from item master:
| id | Item | EOQ | Unit Cost | Price |
|---|---|---|---|---|
| 2 | Inner Tube Continental 700×28 | 86.87 units | $8.00 | $9.90 |
| 7 | Brake Caliper Set Shimano DA R9200 | 7.21 units | $220 | $320 |
| 21 | Drivetrain Service Kit | 13.3 units | $45 | $75 |
Explanation: High-volume low-cost items (inner tube) have large EOQ; expensive low-volume items (brake caliper) have small EOQ — consistent with the K-Curve exchange curve logic.
IO (MEIO) Tab ✅¶
| Metric | Value |
|---|---|
| Heatmap type | Fill Rate (wgt) |
| Grid | 5×5 on 12m Forecast Qty vs Unit Cost axes |
| Fill rate range | 89.3%–99.1% (p5–p95 of 17 cells) |
3 items verifying fill rates across the spectrum:
| unique_id | Item | Site | Fill Rate | Committed Buffer |
|---|---|---|---|---|
| 5_335 | Brake Pads Dura-Ace R9200 (4 pcs) | Verona Cycling | 100% | 18 units |
| 8_303 | Saddle Fizik Ares R1 Carbon | Velo Marseille | 90.0% | 2 units |
| 2_205 | Inner Tube Continental 700×28 | Netherlands Country WH | 0% | 0 units |
Item 2_205 at 0% fill rate: warehouse-level item with no MEIO buffer allocated — replenished from central stock.
Supply Tab ⚠️¶
Root cause of warnings: Supply orders (95,650 rows) reside under pipeline_id=4. The UI pipeline selector defaults to pipeline_id=1 (Standard Pipeline). Switching the pipeline selector to "Default" (pipeline_id=4) resolves the empty chart and $0 cost.
3 items with rich supply order data (pipeline_id=4):
| Item | Site | Order Types | Order Count | Total Qty |
|---|---|---|---|---|
| Chain Shimano Dura-Ace CN-M9100 12sp (id=4) | Amsterdam Fietsen (id=341) | BUY + RETURN + TRANSFER | 568 | 8,345+ |
| Inner Tube Continental 700×28 (id=2) | Berlin Cycles (id=312) | BUY + RETURN + TRANSFER | 498 | 17,189+ |
| Tire Continental GP 5000 S TR 28mm (id=3) | Cycles Paris (id=301) | BUY + RETURN | 416 | 5,458+ |
Action: Switch pipeline dropdown to "Default" (pipeline_id=4) to see the 29,737 orders, cost, and coverage.
2. ABC Classification ✅ (Fixed)¶
Two configs: Default (demand) — 575 classified · hits (order hits) — 575 classified
Bug fixed during test: Component used results?.results but API returned a plain array. Added normalization: Array.isArray(raw) ? { results: raw } : raw in ABCClassification.jsx lines 121, 142, 162.
3 items per ABC class (Default/demand config, config_id=1):
| Class | unique_id | Item | Metric Value (demand vol) | Rank | Cumulative % |
|---|---|---|---|---|---|
| A | 1_342 | Chain Lube Finish Line 500ml @ Rotterdam Fietsen | 3,641 | 1 | top |
| A | 1_344 | Chain Lube Finish Line 500ml @ Eindhoven Bikes | 3,586 | 2 | top |
| A | 1_301 | Chain Lube Finish Line 500ml @ Cycles Paris | 3,140 | 3 | top |
| B | 22_315 | Brake Service Kit @ Stuttgart Cycling | 238 | 216 | 0.8% |
| B | 9_343 | Handlebar Ritchey WCS Carbon 42cm @ Utrecht Cycles | 237 | 217 | 0.8% |
| B | 22_313 | Brake Service Kit @ Hamburg Fahrrad | 233 | 218 | 0.8% |
| C | 15_331 | Front Derailleur Shimano DA FD-R9200 @ Milano Ciclismo | 113 | 443 | tail |
| C | 14_314 | Rear Derailleur Shimano DA RD-R9200 @ Köln Bikes | 113 | 444 | tail |
| C | 18_324 | Wheelset Zipp 303 Firecrest TL Disc @ Sevilla Ruedas | 113 | 445 | tail |
The Pareto chart renders correctly — A items (top ~37%) drive ~80% of demand volume.
3. Segmentation ✅¶
Membership data is populated. 16 segments with real members.
3 segments with member counts (all pipeline_id agnostic — membership computed at ABC+Seg step):
| Segment | Members | Criteria |
|---|---|---|
| Default | 575 | All series |
| A items | 215 | ABC A class |
| B items | 227 | ABC B class |
Additional segments verified: C items (133), Fast movers (575), Dealer network (575), Netherlands (115), France (115), Germany (115), Frames (50), Drivetrain (125), Consumables (25), Wheels (75), Electronics (75), Critical A — Dealers (215), All (575).
4. Time Series Viewer (Statistical Forecast) ✅¶
3 items demonstrating different characteristics:
Series 1: 1_301 — Chain Lube Finish Line 500ml @ Cycles Paris¶
- Characteristics: 224 observations · Continuous · Seasonal · Trending · medium complexity
- Winner: AutoETS ★
- Overlays: AutoETS + causal blended available
- Tabs verified: Forecast, EOQ, Netting, IO, Supply — all present
- Firm demand in netting: 40 units firm demand, 30 stat forecast, netted to 0 (fully covered)
Series 2: 10_304 — Stem Ritchey WCS Carbon 100mm @ Cycles Toulouse¶
- Characteristics: 144 observations · Continuous · Non-Seasonal · Trending · low complexity
- Winner: AutoETS ★
- Key diff from 1_301: non-seasonal, simpler model chosen
Series 3: 24_301 — Chain Shimano 105 Di2 12sp @ Cycles Paris¶
- Characteristics: Continuous · Non-Seasonal · Stationary
- Winner: ADIDA ★ (appropriate for stationary intermittent-style demand)
Outlier corrections available (top series by correction count):
| unique_id | Item | Site | Corrections |
|---|---|---|---|
| 23_345 | Transmission Assembly Kit | Groningen Fietsen | 46 |
| 23_311 | Transmission Assembly Kit | München Rad | 44 |
| 22_344 | Brake Service Kit | Eindhoven Bikes | 43 |
5. Causal Forecasting (MRO / Asset-based) ✅¶
3 asset types verified (all under Base Season 2025 scenario):
| Asset Type | Code | Name |
|---|---|---|
| 1 | CAN-AER | Canyon Aeroad |
| 2 | CAN-ULT | Canyon Ultimate |
| 3 | CER-P5 | Cervelo P5 |
SPZ-TAR (Specialized Tarmac) and TRK-MAD (Trek Madone) also present. Fleet plan, individual assets, and BOM loading correctly.
6. MEIO Scenarios ✅¶
3 scenarios verified:
| Scenario | Is Base | Segment Overrides |
|---|---|---|
| Base | ✅ | 1 segment override |
| Budget Constrained | ❌ | 1 segment override |
| High Service Level | ❌ | 1 segment override |
5 scenarios total: Base, Budget Constrained, High Service Level, Budget limited, 95.
7. Supply Chain Planning ✅¶
Supply Scenarios — 3 verified:¶
| Scenario | Is Base | Description |
|---|---|---|
| Baseline | ✅ | Standard multi-echelon plan |
| High Service Level | ❌ | Elevated safety stock targets |
| Repair-First | ❌ | Repair routing prioritized over buy |
8 scenarios total: Baseline, High Service Level, Short Horizon, Seasonal Push, Repair-First, Lean Inventory, Hard Capacity, EOQ Standard.
Parameter Templates — 3 verified:¶
| Template | Params |
|---|---|
| Hard Capacity | 18 configured params |
| Default | 18 configured params |
| Lean Inventory | 18 configured params |
7 templates total. Each fully editable via "Edit params" modal.
Pipeline Registry — 3 verified:¶
| Pipeline ID | Name | Series Scenario | Supply Scenario |
|---|---|---|---|
| 1 | Standard pipeline | 1 | 1 |
| 4 | Default | 4 | 1 |
| 34 | Standard + Causal + Maintenance | 1 | 1 |
21 pipelines total (deduplicated by name in UI). Multiple pipelines share scenario IDs — correct multi-tenant reuse.
8. Forecast Scenarios — Series Scenario Modal ✅¶
Verified in browser (Conservative scenario on 1_301): - Modal size: 80% viewport (ResizableModal default) ✅ - Resizable: drag handle visible bottom-right ✅ - Tabs (4): Demand Override · Netting · Forecast Params · Raw JSON ✅
3 series tested in Forecast Scenarios:
| unique_id | Scenario | Netting Direction | Param Sets |
|---|---|---|---|
| 1_301 | Conservative | Forward-first | Default row (emerald) |
| 10_301 | Standard | Forward-first | Default row |
| 24_301 | Base | Forward-first | Default row |
9. Process Runner ✅¶
- Step 1 – ETL: Extract from demand_actuals. Force-override checkbox available.
- Step 2 – ABC + Segmentation: Run ABC configs then assign segments.
- Step 3 – Forecast: Outlier detection → backtest → select → forecast → indirect demand.
- Workflows tab: Custom workflow builder available.
- Log tab: Run history with pipeline/scenario tags.
10. NPI Manager ✅¶
- Target/source item selection, history table present.
- Immediate feedback on order modification.
- Percentage-based NPI support working.
11. Settings ✅¶
- Auth / DataSource / Parallel / Segmentation tabs all accessible.
- Supply parameters correctly removed from Settings (moved to Supply Planning → Parameter Templates).
- No broken tabs or missing sections.
Issues Found¶
FIXED during test¶
| Severity | Issue | Fix |
|---|---|---|
| HIGH | ABC results/summary endpoints return HTTP 500 | Removed non-existent pipeline_id, scenario_id columns from SQL in get_abc_results and get_abc_summary in main.py |
| MEDIUM | ABC detail panel shows "No results yet" after API fix | setResults in ABCClassification.jsx now normalizes plain array → {results:[...]} wrapper (3 call sites fixed) |
Open issues¶
| Severity | Issue | Location | Recommended fix |
|---|---|---|---|
| INFO | Supply dashboard shows $0/empty on pipeline_id=1 | Dashboard Supply tab | Expected — no supply run was executed for pipeline 1. Switch to "Default" (pipeline_id=4) to see 29,737 orders. Tests must be run in the pipeline where workflows were executed. |
| LOW | Outlier Adj. = 0 on Forecast tab | Dashboard | Not a bug — outlier detection not yet run for pipeline_id=1; run Forecast step |
Data Coverage Summary (pipeline_id=4)¶
| Table | Count |
|---|---|
| series_best_methods | 575 (100%) |
| series_characteristics | 575 (100%) |
| series_backtest_metrics | 572 forecasted |
| forecast_results | 4,703 rows |
| fitted_distributions | 4,703 rows |
| meio_results | 748 rows, avg FR=0.800 |
| supply_inventory_projection | 275,652 rows |
| supply_order | 95,650 orders |
| abc_results | 1,150 rows (575 × 2 configs) |
| segment_membership | 3,785 rows across 16 segments |
| demand_corrected | 3,958 outlier corrections |
Bugs Fixed During Testing (Auth / Login)¶
| Severity | Issue | Fix |
|---|---|---|
| HIGH | bruno.zindy@hotmail.com superadmin password hash stale (bcrypt mismatch) |
Reset hash to zone1800 in master.superadmins |
| LOW | Login screen appears "frozen" | Not a bug — account picker appears below the fold; scroll down, select "theBicycle", click Sign in |
Architecture Note (separate audit)¶
A parallel architecture audit was completed — see architecture_audit_2026-04-19.md.
4 critical violations found: ForecastResult, EvaluationMetrics, best-method selection, and FittedDistribution all lack pipeline_id/scenario_id tagging on DB writes.
Test completed 2026-04-19. Tenant: theBicycle. Aerospace MRO tenant test pending.