← INDEXDECISION LOGv0.12

APPENDIXDecisions & Open Questions

Living page — updated each review round

A.1Decisions taken

#DecisionWhere
D-01Two-world model: HI entry space, LO derived space at Product×Location×WeekCh. 02
D-02LO holds the modifications exploded per entry — it is not a merged forecast; consensus publishing out of scopeGL-01/02, OV-07
D-03Overlapping entries allowed without restriction; reconciliation downstreamHE-05
D-04Customer scopes entries and drives splits, but is consumed at disaggregation; LO has no customer columnGL-03
D-05Synchronous disaggregation on entry/edit + nightly/on-demand full batchOV-02/03, DF-06/07
D-06Time split from weekly forecast aggregated on the fly to entry level; no interim storageDR-02
D-07Missing/zero total basis ⇒ InError with message; never a guessed fallback. Zero-weight individual elements simply receive nothingGL-05, DR-03
D-08State machine: Disaggregated / InError / RequiresDisaggregation + optional error stringHE §4.3
D-09Single unit SU; entry values non-negative integers; largest-remainder rounding, lexicographic tie-breakHE-02, DF-02/03
D-10Split tables at product level, week-range form, optional customer; customer rows before null-customer rows before forecast basisDM-08/09, DR-09
D-11Pipeline Time → Product → Location Superseded by D-16 (v0.2)—
D-12Scale: ~100k products, tens of locations, millions of LO rows; quarter = coarsest entry periodOV-06, DF §6.5
D-13Auth: two fixed accounts, zero authorization; no audit trailDE-06/07
D-14Planning calendar (week→month→quarter) as master data; no civil-calendar arithmeticDM-05
D-15Product hierarchy is exactly two levels: UPC → Product ID. Brand, category, subcategory, sector, … are flat product attributes (non-nesting)DM-01/02
D-16Pipeline 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-17NPI/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 productsDM §3.6, DR-05/06
D-18Week ranges are the native form for split tables and phase profiles; expanded internally; overlap-free sum-to-1 keys are generator invariantsDM-08/14/16
D-19Attribute-scoped entry is valid if ≥ 1 UPC under it has forecast in the period; InError only when all aggregate to zeroDR-03
D-20Performance: 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 figuresDF §6.5
D-21NPI location mix: own split-table rows → sibling-aggregate location mix → InError (only when no UPC sibling has forecast in the period)DR-08
D-22Explicit 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-23No 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-07OV-04, DM intro, HE-07, UI §7.6/7.7, AP, MC, DE-01/04/08
D-24Renormalization 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 renormalizedDR-05, DR-07, DR §5.4
D-25Product 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-26Entry value 0 stays legal: explicit "no volume"; empty LO row set, state Disaggregated. HE-02 confirmedHE-02
D-27Preview is summary-only (weekly totals, top breakdowns, LO row count, or precise error) across UI, API and MCP. Full LO rows only after saveUI-05, AP catalogue, MC-05
D-28Concurrency: last-write-wins confirmed. No locking, no optimistic versioning/ETags. Per-entry atomic replace (DM-12) guarantees no torn reads. AP-11 confirmed as writtenAP-11, DF-09
D-29Implementation 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.mdDE-01/03, UI-12/18, prompt

A.2Open questions

None. All questions Q-01…Q-12 are resolved; the specification is complete for implementation.

Q-01Split-table granularity: base-product only or hierarchy-level? Ranges vs per-week rows? Resolved (v0.2) → D-15…D-19.
Q-02Commit to 200 ms p95 interactive / 60 s batch, and on what hardware? Resolved (v0.3) → D-20.
Q-03NPI location mix (DR-08): split-table rows required, or sibling fallback? Resolved (v0.4) → D-21.
Q-04Preview: full LO row set on demand, or only summaries? Resolved (v0.10) → D-27: summary only.
Q-05Entry value 0: keep or disallow? Resolved (v0.9) → D-26: zero stays legal.
Q-06Concurrency: last-write-wins, or optimistic versioning? Resolved (v0.11) → D-28: last-write-wins confirmed.
Q-07Ingestion file formats. Resolved — void (v0.6) → D-23.
Q-08Product-scoped entries vs phase profiles. Resolved (v0.5) → D-22.
Q-09Phase-profile ingestion surface. Resolved (v0.6) → D-23.
Q-10Renormalization of restricted profile fractions. Resolved (v0.7) → D-24.
Q-11Master data: seed-only or ingestible? Resolved (v0.6) → D-23.
Q-12Scope expressiveness. Resolved (v0.8) → D-25.

A.3Change log

VersionDateChanges
0.12026-08-03Initial full draft: chapters 01–10, decision log, shared example dataset
0.22026-08-04Q-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.32026-08-04Q-02 review: best-effort performance mandate (D-20).
0.42026-08-04Q-03 review: NPI location-mix sibling fallback (D-21).
0.52026-08-04Q-08 review: explicit low-level scope wins (D-22).
0.62026-08-04Q-09/Q-11/Q-07 review: no ingestion anywhere (D-23); master-data browser (S5); forecast-regeneration lever (DE-08).
0.72026-08-04Q-10 review: renormalization over the in-scope subset (D-24).
0.82026-08-04Q-12 review: product scope unified to one attribute=value pair (D-25).
0.92026-08-04Q-05 review: entry value 0 confirmed legal (D-26).
0.102026-08-04Q-04 review: preview summary-only everywhere (D-27).
0.112026-08-04Q-06 review: last-write-wins confirmed (D-28). All open questions resolved.
0.122026-08-04Implementation 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.