# Available stock: worked ledger and blank record Fictional example only. One SKU, `WOOD-DISC-30`, one location, whole wooden craft discs. No real inventory, orders, sales or account was accessed. The [worked CSV](stock-movement-example.csv) contains the same eight checkpoints. ## Name the quantities before calculating - O, on hand: physically present, including reserved and held pieces. - R, reserved: physically present and promised to orders; a pooled count here. - H, held: physically present but unavailable pending inspection. - A, available: `O − R − H`. Check `O = A + R + H` at every row. - I, incoming: expected but not received. It is outside O and A. All five counts are known, nonnegative whole numbers. Blank is unknown. The local aid limits each count to 1,000,000; this is an exercise limit, not a platform specification. Opening counts may be zero; movements must be positive whole numbers. A return request is not a physical return, and an inspection request does not release a hold. ## Worked answer key | Checkpoint | Movement | O | R | H | I | A | | --- | --- | ---: | ---: | ---: | ---: | ---: | | Opening | Known counts | 24 | 0 | 4 | 10 | 20 | | EV01 | Reserve 6 | 24 | 6 | 4 | 10 | 14 | | EV02 | Receive 10 usable incoming pieces | 34 | 6 | 4 | 0 | 24 | | EV03 | Dispatch 4 reserved pieces | 30 | 2 | 4 | 0 | 24 | | EV04 | Cancel reservation 2 | 30 | 0 | 4 | 0 | 26 | | EV05 | Accept physical return 3 into hold | 33 | 0 | 7 | 0 | 26 | | EV06 | Release 2 after inspection | 33 | 0 | 5 | 0 | 28 | | EV07 | Confirm loss of 1 available piece | 32 | 0 | 5 | 0 | 27 | Seven accepted movements. Final `32 = 27 + 0 + 5`; incoming is zero. Receipt adds ten physical usable pieces, dispatch removes four, return adds three, and loss removes one: `24 + 10 − 4 + 3 − 1 = 32`. Neither cancellation nor inspection release changes physical stock. There is no sales-value calculation. ## Rules to test in an app | Movement of q pieces | Required evidence or balance | Quantity change | | --- | --- | --- | | Reserve | At least q available | R +q; A −q | | Receive | At least q incoming; physical receipt accepted as usable | O +q; I −q; A +q | | Dispatch reserved | At least q reserved; physical departure | O −q; R −q; A unchanged | | Cancel reservation | At least q reserved; cancellation accepted | R −q; A +q | | Return into hold | Physical pieces accepted back; inspection still pending | O +q; H +q; A unchanged | | Release hold | At least q held; inspection accepted | H −q; A +q | | Loss from available | At least q available; loss confirmed | O −q; A −q | This policy cannot check order entitlement, return history, refunds, purchasing, valuation, multiple locations or concurrent changes. A real app needs the relevant records and permissions. Do not use a pooled reservation count to authorize a particular customer's dispatch. ## Counterexamples and retry key Append each case independently after EV07 unless stated otherwise. Rejected attempts leave quantities and accepted history unchanged; preserve their explanation. Continue the list using accepted movements only and mark the result for review if any attempt was rejected. | Attempt | Expected outcome | | --- | --- | | Repeat EV01, reserve 6 | Duplicate/no-op. Seven accepted events; A remains 27. | | Reuse EV01, reserve 7 | Conflicting replay rejected. EV01 still means reserve 6. | | New ID, reserve 28 | Rejected: only 27 available. | | New ID, receive 1 | Rejected: incoming is zero. A carrier notice cannot supply stock. | | New ID, release hold 6 | Rejected: only five are held. | | Change EV03 to dispatch 6; replay whole list | EV04 cancellation is rejected; final O30/R0/H5/I0/A25. | | Clear any required opening count or movement quantity | Incomplete; no numeric final result or export. | | Enter fractional, negative or over-limit text | Invalid input; correct it before relying on a result. | Each accepted event has a case-sensitive ID, movement type and quantity. The same accepted ID with exactly the same content counts once, even if the current balance has changed. Changed content under that ID is rejected. A rejected attempt does not reserve an ID; it may be corrected and tried again. Attempt order is the exercise's order; this is not a real-time event-feed or multiuser guarantee. Do not edit history to make a count fit. ## Blank operational record | Field | Your decision or explicit unknown | | --- | --- | | SKU, unit and location | | | Physical-count source, observer and time | | | Opening O / R / H / I, with evidence for each | | | What makes a reservation valid, and which order it belongs to | | | Who can accept physical receipts and returns | | | What evidence releases an inspection hold | | | Who can record a loss and why | | | Retry identity and correction policy | | | Missing quantity or unresolved source | | | Expected result and independently checked result | | | Staff read/edit/export permissions to test | | | Event ID | Movement / quantity | Evidence and responsible person | Before O/R/H/I/A | Expected after O/R/H/I/A | Actual result / unknown | | --- | --- | --- | --- | --- | --- | | | | | | | | | | | | | | | | | | | | | | Use sample records first. In the [Overskill brief builder](/learn#brief-builder), describe the rules and access requirements, review the generated brief and edit its input fields, then choose Start build. Supply the worksheet separately; the link imports no records. Account access and credits apply. Confirm actual saved behavior and permissions before using real stock.