← INDEXCH 04 / 1005 RULES →

CHAPTER 04HI Entries

Req. prefix: HEv0.2 draft

4.1Semantics

HE-01An entry is an override volume: "this modification amounts to value_su over this scope." It is not a delta on, or a replacement of, the baseline forecast — how it combines with anything else is downstream and out of scope (OV-07).
HE-02value_su is a non-negative integer in SU. Zero is legal (it disaggregates to an empty LO row set and states an explicit "no volume").
HE-03Typical entry archetypes the scope model MUST express: (a) brand-level campaign, all locations, no customer, one quarter; (b) customer inventory strategy on a category, one month; (c) promotion on a single product with a single customer, one week.

4.2Scope validation

HE-04On create/update the system MUST validate: referenced hierarchy node, location, customer and period exist (DM-01…DM-06); period lies within the calendar horizon. Validation failures reject the request — they never produce an InError entry.
HE-05Overlapping entries are permitted without warning or restriction — including identical scopes. Reasonability assessment happens downstream, outside HiLo.FM.

4.3State machine

StateMeaningLO rows present?
DisaggregatedCurrent LO rows are consistent with the entry and current inputsyes (possibly empty set for value 0)
InErrorDisaggregation attempted and impossible under current rules; error_message setno
RequiresDisaggregationInputs changed since last disaggregation; LO rows stale or absentpossibly stale
            create / update ─────► [attempt disaggregation]
                                              │ success        │ failure
                                              ▼                ▼
                                        Disaggregated       InError ── error_message
                                              │                │
     input regeneration (reset / DE-08) ──────┴───────────────►│
                                              ▼                │
                                   RequiresDisaggregation ◄────┘ (regeneration also resets InError)
                                              │
                              batch or per-entry re-run ──► [attempt disaggregation] …
HE-06Create and update MUST synchronously attempt disaggregation (OV-02). The response carries the resulting state; the caller never observes RequiresDisaggregation as the outcome of its own edit.
HE-07Wholesale replacement of the inputs — forecast regeneration (DE-08) or seed-profile change short of a full reset — MUST set all entries (including InError) to RequiresDisaggregation, since any of them may now resolve differently. The subsequent batch (Ch. 06) moves each to Disaggregated or InError. (A full reset deletes all entries and recreates seeds, so HE-07 is moot there — DE-04.)
HE-08error_message MUST name the failing stage and rule, with the offending scope element — e.g. "Location split: no basis for P3/W1 — zero forecast, no split table, phase-in factor 0". Vague messages ("disaggregation failed") are non-conforming.
HE-09While an entry is InError or RequiresDisaggregation, its (absent or stale) LO rows MUST be excluded from reporting by default; interfaces MAY offer an explicit "include stale" toggle that labels affected rows.

4.4Lifecycle operations

OperationEffect
CreateValidate (HE-04) → persist → disaggregate → state per result
Update (scope, value, title)Validate → persist → atomically replace own LO rows (DM-12) → state per result
DeleteRemove entry and exactly its own LO rows. Nothing else moves. Hard delete (no audit trail).
Re-disaggregate (single)Manual per-entry re-run; same path as batch, one entry
HE-10All four operations MUST be available in UI, API and MCP alike (OV-04).