| # | Decision | Where |
| D-01 | Two-world model: HI entry space, LO derived space at Product×Location×Week | Ch. 02 |
| D-02 | LO holds the modifications exploded per entry — it is not a merged forecast; consensus publishing out of scope | GL-01/02, OV-07 |
| D-03 | Overlapping entries allowed without restriction; reconciliation downstream | HE-05 |
| D-04 | Customer scopes entries and drives splits, but is consumed at disaggregation; LO has no customer column | GL-03 |
| D-05 | Synchronous disaggregation on entry/edit + nightly/on-demand full batch | OV-02/03, DF-06/07 |
| D-06 | Time split from weekly forecast aggregated on the fly to entry level; no interim storage | DR-02 |
| D-07 | Missing/zero total basis ⇒ InError with message; never a guessed fallback. Zero-weight individual elements simply receive nothing | GL-05, DR-03 |
| D-08 | State machine: Disaggregated / InError / RequiresDisaggregation + optional error string | HE §4.3 |
| D-09 | Single unit SU; entry values non-negative integers; largest-remainder rounding, lexicographic tie-break | HE-02, DF-02/03 |
| D-10 | Split tables at product level, week-range form, optional customer; customer rows before null-customer rows before forecast basis | DM-08/09, DR-09 |
| D-11 | Pipeline Time → Product → Location Superseded by D-16 (v0.2) | — |
| D-12 | Scale: ~100k products, tens of locations, millions of LO rows; quarter = coarsest entry period | OV-06, DF §6.5 |
| D-13 | Auth: two fixed accounts, zero authorization; no audit trail | DE-06/07 |
| D-14 | Planning calendar (week→month→quarter) as master data; no civil-calendar arithmetic | DM-05 |
| D-15 | Product hierarchy is exactly two levels: UPC → Product ID. Brand, category, subcategory, sector, … are flat product attributes (non-nesting) | DM-01/02 |
| D-16 | Pipeline is four stages: Time → Attribute→UPC (forecast rolled up to UPC) → UPC→Product (phase profile, else forecast) → Location (split table, else forecast) | DF-01, DR §5.4 |
| D-17 | NPI/EOL = phase profiles: week-range fractions dividing a UPC's volume among its products, optionally per customer. No like-product surrogates. No profile ⇒ forecast fallback — no fake profiles for stable products | DM §3.6, DR-05/06 |
| D-18 | Week ranges are the native form for split tables and phase profiles; expanded internally; overlap-free sum-to-1 keys are generator invariants | DM-08/14/16 |
| D-19 | Attribute-scoped entry is valid if ≥ 1 UPC under it has forecast in the period; InError only when all aggregate to zero | DR-03 |
| D-20 | Performance: best-effort mandate on a defined small reference VM (2–4 cores, few GB RAM). No fixed ceilings — avoidably slow design is non-compliant regardless of any figure. Demonstrator measures and exposes actual timings; 200 ms p95 interactive / 60 s batch / 2 s queries kept as directional, non-contractual figures | DF §6.5 |
| D-21 | NPI location mix: own split-table rows → sibling-aggregate location mix → InError (only when no UPC sibling has forecast in the period) | DR-08 |
| D-22 | Explicit low-level scope wins. Entries at or below a stage's grain pass that stage through (DF-01) and are never checked against that stage's rules: a product-scoped entry never consults phase profiles; a single-location entry places all volume on that location even at split weight 0. InError only from genuinely zero total bases at stages that actually split (DR-03) | DR-10, DF-01, Ch. 10 §10.4 |
| D-23 | No ingestion; UI/API/MCP manage FM entries only. All inputs are synthetically generated master data; read-only UI browser (S5, sole OV-04 exception); API/MCP keep reference reads only. Change levers: seed selection / reset (DE-04) and forecast regeneration (DE-08), both triggering HE-07 | OV-04, DM intro, HE-07, UI §7.6/7.7, AP, MC, DE-01/04/08 |
| D-24 | Renormalization over in-scope subset. Restricted phase-profile fractions summing to 0 < s < 1 are divided by s (DF-04 upheld); surviving sum 0 ⇒ standard zero-total InError. Forecast bases are raw weights, never renormalized | DR-05, DR-07, DR §5.4 |
| D-25 | Product scope = one attribute=value pair, uniformly. No AND/OR/lists — multiple entries instead. Built-ins upc and product_id addressable as attributes; scopes on them skip the stages they are at or below. Payload: {"attribute": …, "value": …} | DM-01/02, §3.7, UI-04, AP-03, AP §8.4 |
| D-26 | Entry value 0 stays legal: explicit "no volume"; empty LO row set, state Disaggregated. HE-02 confirmed | HE-02 |
| D-27 | Preview is summary-only (weekly totals, top breakdowns, LO row count, or precise error) across UI, API and MCP. Full LO rows only after save | UI-05, AP catalogue, MC-05 |
| D-28 | Concurrency: last-write-wins confirmed. No locking, no optimistic versioning/ETags. Per-entry atomic replace (DM-12) guarantees no torn reads. AP-11 confirmed as written | AP-11, DF-09 |
| D-29 | Implementation round-off. (a) Seed profiles gain a CUSTOM profile with user-specified sizing (products, locations, customers, weeks, entries), deterministic per parameters + seed. (b) Forecast synthesis model fixed: per (product, location) series, random oscillation around a base level with a slow trend — q(w) = max(0, base·(1+trend·w)·season(w)·(1+noise(w))), seeded RNG. (c) The app must be self-documenting: in-app Documentation section (per-screen user help + design documentation incl. the implementation decision log, UI-18); implementation decisions recorded in a repo DECISIONS.md. (d) Tech stack fixed for implementation: Rust backend, in-memory state with optimized SQLite persistence (WAL, batched transactions, interned integer IDs, write-behind), React/TS frontend, embedded MCP server, single Docker container. Implementation prompt published at implementation-prompt.md | DE-01/03, UI-12/18, prompt |
| Version | Date | Changes |
| 0.1 | 2026-08-03 | Initial full draft: chapters 01–10, decision log, shared example dataset |
| 0.2 | 2026-08-04 | Q-01 review: two-level UPC→Product hierarchy with flat attributes (D-15); four-stage pipeline (D-16); NPI/EOL as phase profiles (D-17); week-range input (D-18); attribute zero-basis rule (D-19). |
| 0.3 | 2026-08-04 | Q-02 review: best-effort performance mandate (D-20). |
| 0.4 | 2026-08-04 | Q-03 review: NPI location-mix sibling fallback (D-21). |
| 0.5 | 2026-08-04 | Q-08 review: explicit low-level scope wins (D-22). |
| 0.6 | 2026-08-04 | Q-09/Q-11/Q-07 review: no ingestion anywhere (D-23); master-data browser (S5); forecast-regeneration lever (DE-08). |
| 0.7 | 2026-08-04 | Q-10 review: renormalization over the in-scope subset (D-24). |
| 0.8 | 2026-08-04 | Q-12 review: product scope unified to one attribute=value pair (D-25). |
| 0.9 | 2026-08-04 | Q-05 review: entry value 0 confirmed legal (D-26). |
| 0.10 | 2026-08-04 | Q-04 review: preview summary-only everywhere (D-27). |
| 0.11 | 2026-08-04 | Q-06 review: last-write-wins confirmed (D-28). All open questions resolved. |
| 0.12 | 2026-08-04 | Implementation round-off (D-29): CUSTOM seed sizing (DE-01), forecast synthesis model (DE-03), self-documentation obligation (UI-18), tech stack fixed; overnight implementation prompt published as implementation-prompt.md. Ch. 07/08/10 updated. |