FM-01 Production Engine — Validation

For: Dan · From: David · Date: April 23, 2026 · Season: Fall 2026 (32,909 units committed)
The engine is safe to keep running Fall 2026 production — but one-third of the forecast is exogenous growth-target uplift, not model mechanics, and five gaps need to close before Summer 2026 locks.

The Situation

FM-01 is the production engine driving Fall 2026 fragrance commits (32,909 units across Flannel + Leaves, Autumn Heirloom, Ginger Pumpkin). This is its first formal validation since moving to monitoring status on April 21. Summer 2026 production commits lock next — that's the reason this validation happened now, not later.

Bottom Line

⚠ CONDITIONALLY VALIDATED

Keep running the engine. Five gaps must close before Summer 2026's production lock. None are show-stoppers, but together they cover roughly $86K–$165K of resolvable exposure on the Summer 2026 season.

Why You Should Care

If we commit to the Fall 2026 forecast as-is and repeat the pattern on Summer 2026:

Figure 1. Dollar exposure by error scenario. Blended Cu and Co for Fall 2026 mix. Underforecast costs more than overforecast because lost margin on spray + candle exceeds carrying cost on held inventory.

What Needs to Happen Before Summer 2026 Commits

  1. Close Margin Data Gaps on 3-Wick + 2oz Packs — resolves up to $80K in unreported margin exposure. Owner: Nikita → ETL. Effort: Low.
  2. Quantify Stockout Contamination in Pooled Decay Curve — resolves ~$20K–$40K underforecast bias on recovered decay fragrances. Owner: David (analysis) → Dan (policy decision). Effort: Medium.
  3. Confirm Summer→Fall Cu/Co Carry-Forward with Nikita — resolves ~$8K–$15K exposure if Fall carrying cost differs. Owner: Nikita → David. Effort: Low.
  4. Re-attribute Summer 2025 Backtest Error (growth target vs mechanics vs allocation) — resolves ~$18K–$30K in mis-attributed error currently masking engine drift. Owner: David. Effort: Medium.
  5. Document Scaling Dominance in the Summer 2026 Config — one-line changelog entry noting ~33–45% of Summer's forecast is top-down uplift. Framing, no dollars — but it changes the tolerance band you read. Owner: David. Effort: Low.

What I'd Do Differently

  1. Ship the engine with per-SKU prediction intervals exposed in the JSON output. The engine already computes 70% and 90% CIs internally but only emits them at fragrance level. Nikita's production decision is per-SKU. Effort: Low.
  2. Re-open Cannibalization Exploration before Summer 2026. DuckDB now has 2023 data — the gate we were waiting on is satisfied. The Coconut Soleil × Cabana case is exactly the scenario Improvement #2 was drafted for. Effort: Medium-High.
  3. Stand up a forecast_run_log table. Every production-driving run should be audited (timestamp, config hash, grand_target, demand-signal verdict). JSON output files get overwritten; the audit trail vanishes. Effort: Low-Medium.

Red Flags

⚠ Growth-Target Dominance: 33% of Fall 2026 (45% of Summer 2026) is top-down uplift, not bottom-up mechanics. A 5pp growth-target miss translates directly to ~$12K–$20K in production cost exposure — larger than most mechanics errors. The engine's accuracy is more dependent on Dan's growth-target call than on its decay curves.
⚠ Stockout-Censored Decay: Sea Salt Neroli and Pomelo 2025 declines (retired fragrances, -76% and -79%) feed the category-age pooled curve as clean demand signal. If stockouts suppressed real demand, the curve is biased steep — every returning fragrance inherits a steeper decay prior than reality warrants.

Validation Status

⚠ CONDITIONALLY VALIDATED

Conditions to upgrade to VALIDATED: DO FIRST block (above) complete; Summer 2026 season actuals show fragrance-level MAPE ≤ 25% or mechanics-only MAPE ≤ 15% after error attribution; economic cost beats naive-model baseline; no hard decay trigger fires.

Monitoring requirement: track Fall 2026 projection vs. actuals as the season unfolds. Flag fragrance × format drift > 20% of point forecast immediately — don't wait for season end.

Next scheduled re-validation: 2026-10-31 (end of Summer 2026 season).