The supply half — allocation, materials, capacity, the industry tail — and why write-back defaults to never.
Once demand is agreed, you turn it into a served plan. Your spine is the allocation waterfall (/app/allocation): supply is poured tier by tier, with Tier-1 carrying a contract-penalty floor so committed orders are protected before anything discretionary is filled. Which engine runs is a policy — optimizer.solver is either the greedy heuristic or the MILP (the bundled highs/WASM solver). The rule you must trust: on ANY solver failure the run falls back to the heuristic and says so — the fallback is flagged, never faked. Per-run weights (optimizer.weights) beat the policy for a single what-if.
Watch the upstream half on material supply (/app/materials). APIs, excipients and long-lead components are exploded from finished-goods demand through the BOM onto dependent daily demand. A material must-commits when its cover falls below lead time plus safety, and the headline risk is source concentration — an unsourced or single-source material is called out by name. SangamIQ prices the exposure (shortfall × cost) but never places the order for you.
When the constraint is short, capacity (/app/capacity) answers the question RCCP refuses to touch: not "in what sequence", but "who gets the scarce minutes". It fills the ceiling highest-priority-first by priority.basis (margin per bottleneck-minute, service, or a manual rank), splits the straddling SKU, and defers the rest — each line carries its status and reason. RCCP stays rough-cut and still refuses to sequence; capacity prioritisation is a ceiling decision, not a schedule.
Your industry tail lives on dedicated surfaces and each keeps a safety rule. Cut-stock (/app/cutting) does first-fit-decreasing with a tolerance rescue and drops offcuts above the floor into a remnant pool; DRP (/app/drp) projects the roll to an order-up-to level and offers satellite-to-satellite transshipments as maker-checker offers, never auto-executed; cold chain (/app/coldchain) auto-quarantines on a real-time breach (blocking is safe to automate) but release is ALWAYS human — an empty actor is refused.
The posture that surprises new supply planners: write-back defaults to NEVER. integration.writeBack is immediate, task-trigger, or never, and out of the box it is never — SangamIQ proposes and waits, refusing the transport before it is even attempted, with the read-first reason stated. Nothing reaches your ERP until an admin deliberately flips it to task-trigger (queued and flushed on the nightly run) or immediate. You approve; the system does not push behind you.