Consignment

Stock held at a partner site · owned by Minimalist until the partner reports a sale · positions reconciled against monthly statements, aged, settled and disputed · a partner site is a location because the partner is accountable for loss there

1 statement overdue. CONS_BOKSHA July statement was due 05-08 and has not arrived · 9 days late · 63 units and AED 24.6K unreconciled since 30-06 · a partner who stops reporting is detected by the absence of a document, not by noticing a stale number months later
CONS_NAMSHI shrinkage dispute open. 4 units, AED 3,120, above the 0.50% tolerance · DSP-2026-0007 at negotiating · liability sits with the partner under the agreement, so this is a commercial argument before it is an inventory adjustment Open dispute →
CONS_FLOWARD
Floward · 12% commission
186
AED 92.1Kreconciled
stmt 01-08Δ 0
CONS_NAMSHI
Namshi · 18% commission
142
AED 71.4Kdispute
stmt 01-08Δ -4
CONS_ETHER
Ether · 15% commission
98
AED 48.6Kreconciled
stmt 02-08Δ 0
CONS_THINGS
Things · 20% commission
84
AED 47.3Ktiming Δ
stmt 01-08Δ -2
CONS_BOKSHA
Boksha · 22% commission
63
AED 24.6Kno statement
due 05-089d late

Partner positions

Position is the ledger balance at the CONS_* location · there is no second table holding a parallel quantity

573 units · AED 284K1 dispute
PartnerLocationUnitsValue AED OldestAged 90d+Last statementStatement state Δ unitsDisputesSettlementCount policy
FlowardCONS_FLOWARD18692,140 112d3101-08 · Jul matched00 settled 08-08statement + spot Q3
NamshiCONS_NAMSHI14271,420 96d2201-08 · Jul disputed-41 heldstatement + spot Q3
EtherCONS_ETHER9848,610 74d002-08 · Jul matched00 settled 09-08statement + spot Q3
ThingsCONS_THINGS8447,290 88d1201-08 · Jul matching-20 draftstatement + spot Q3
BokshaCONS_BOKSHA6324,610 141d2101-07 · Jun overdue 9d-0 blockedstatement + spot Q3
Every one of these positions is STOCK at a CONS_* location with custody_owner = 'partner'. INV1 had a consignment_stock table for the same fact with zero writers and zero readers; i3 has one representation and everything else is a projection.

Statement match · July 2026

A statement is the partner's claim, not truth. It becomes a posting only through a classified variance line, and every classification names a human.

9 agree2 timing1 unreported1 shrinkage1 our error
PartnerLine refSKU Decl. soldDecl. retDecl. close Ledger closeΔClassResolutionBy
FlowardFLW-JUL-0114MSR31-0714242420agrees-auto
FlowardFLW-JUL-0115LBA018031310agrees-auto
FlowardFLW-JUL-0116JRY0112128280agrees-auto
FlowardFLW-JUL-0117FYN018585850agrees-auto
NamshiNMS-2026-07-0022CDW016144440agrees-auto
NamshiNMS-2026-07-0023MST-CRM-42-BLK903438-4shrinkageDSP-2026-0007 negotiatinga.yousuf
NamshiNMS-2026-07-0024TNS017233330agrees-auto
NamshiNMS-2026-07-0025PP029131310agrees-auto
EtherETH-07-A118FYB0111152520agrees-auto
EtherETH-07-A119JAE177146460agrees-auto
ThingsTHG/07/0041MIN-CNL-019532830-2timing3 returns in transit, posted 02-08a.yousuf
ThingsTHG/07/0042MIN-VAS-0224026260agrees-auto
ThingsTHG/07/0043MIN-MRR-0030030300unreported_sale2 POS receipts seen, not on statementa.yousuf
FlowardFLW-JUL-0118LLW-BAG-047301411+3our_error3 units dispatched 28-06, posted 02-07a.yousuf
14 lines, 14 classified, zero left unclassified. At settlement, variance_class = 'unclassified' must be zero: an unexplained difference is never allowed to become a rounding line on an invoice.

Unsold stock aging

Days since the dispatch that put the unit there, not since the last statement

86 over 90d
Floward 0-30d · 70 units Floward 31-60d · 53 units Floward 61-90d · 32 units Floward 90d+ · 31 units · recall candidates AED 15.3K Namshi 0-30d · 56 units Namshi 31-60d · 42 units Namshi 61-90d · 22 units Namshi 90d+ · 22 units · AED 11.1K Ether 0-30d · 46 units Ether 31-60d · 33 units Ether 61-90d · 19 units Ether 90d+ · 0 units · cleanest partner Things 0-30d · 33 units Things 31-60d · 29 units Things 61-90d · 10 units Things 90d+ · 12 units · AED 6.8K Boksha 0-30d · 20 units Boksha 31-60d · 16 units Boksha 61-90d · 6 units Boksha 90d+ · 21 units · AED 8.0K · no statement since Jun
FlowardNamshiEtherThingsBoksha
0-30d31-60d61-90d90d+ recall candidateRecall threshold is per agreement: aging_recall_days

Reported sales versus expected

Expected is derived from the position and the partner's own trailing sell-through

Boksha flat 2 months
Expected, all partners Floward reported Namshi reported Ether reported Things reported Boksha reported · flat since May, no statement since June
DecJanFebMarAprMayJunJul
FlowardNamshiEtherThingsBokshaExpected

Settlements

July period · AED 156.2K gross
SettlementPartnerGross AEDCommissionShrinkageNet dueDirectionNetSuiteState
CST-FLW-2026-07Floward62,4007,488054,912receivableNS-INV-88214paid
CST-ETH-2026-07Ether31,8004,770027,030receivableNS-INV-88219paid
CST-THG-2026-07Things18,9003,780015,120receivableNS-INV-88231issued
CST-NMS-2026-07Namshi43,1007,7583,12038,462receivable-disputed
CST-BKS-2026-07Boksha------blocked · no statement
CST-FLW-2026-06Floward58,2006,984051,216receivableNS-INV-87104paid
CST-NMS-2026-06Namshi39,6007,12864031,832receivableNS-INV-87118paid
CST-BKS-2026-06Boksha11,4002,50808,892receivableNS-INV-87126paid
Ruling L16: NetSuite is the accounting system of record. Every settlement carries a netsuite_ref and every figure here is a management number that must reconcile to it, not replace it.

DSP-2026-0007 · Namshi shrinkage

4 units · MST-CRM-42-BLK · AED 3,120

negotiating
01-08Statement received. Declared closing 34, ledger closing 38. 01-08Matcher classed the line shrinkage. 0.94% of the position, above the 0.50% tolerance. 02-08Dispute opened by a.yousuf. Liability sits with the partner under the agreement. 04-08Evidence requested: partner floor count for the SKU, plus POS extract for the period. 07-08Partner supplied a count showing 34. No POS extract yet. 11-08Negotiating. Partner proposes 2 units credited, 2 written off jointly. -Unresolved. Settlement CST-NMS-2026-07 is held until this closes.
Write off ours
Writing off the disputed units goes through program_writeoffs like any other write-off: a finance approver who is not the proposer, a quantity row and a cost_ledger row. ck_cd_writeoff refuses a resolution of written_off_minimalist without one.

Ownership, and what it excludes

Consigned stock is owned by Minimalist until the partner reports a sale. It sits in owned_qty, it is in the valuation, and revenue is recognised at the sale report, never at dispatch.

It must also never appear in a channel-sellable total. Per location the projection is correct, but a cross-location roll-up that filters only on the stock-type flag would count all 573 units as sellable to our own customers, and Phase 9 write-back would publish them to Shopify.

i3 asserts this nightly: the naive total minus the location-filtered total must equal the partner position exactly. Today that is 573, and it is checked, not assumed.

Three live defects this page replaces

The credit leg landed nowhere. INV1 spells the partner codes three ways: models.py seeds FLOWARD, while import_outflows.py and migration_v2.py look up CONS_FLOWARD. The importer's guard only skips a row when both ends fail to resolve, so a consignment-out deducted HQ_319 and credited nobody.

The sale leg was skipped on purpose. SKIP_TYPES = {'discontinued', 'consignee sales'}. The row where a partner reports a sale, the only event that legitimately removes a unit from the position, was filtered out before any ledger entry was built.

Idempotency keyed on a spreadsheet row. f"consignment:{r}:{sku}:from", where r is the openpyxl row index of a 5,000-row tab. Re-sort the sheet and every key below the change shifts by one. i3 keys on cons:<partner>:<period>:<line_ref>, which survives a re-sort.

Why a partner site is a location and an influencer is not

Module 04's test has three parts, and all three must hold for a concept to earn a location:

(a) A party outside i3 is accountable for loss. Namshi is, which is what the dispute above is about. For an influencer loan, we eat the loss.
(b) A physical count at a site we operate cannot find it. True for both.
(c) No single one of our locations can be held accountable for chasing it. True for a partner. False for an influencer: HQ_319 chases.

So consignment is STOCK at CONS_NAMSHI, and an influencer holding is INFLUENCER_POOL at HQ_319 with the person recorded as a custodian. i2 modelled both as virtual locations and as stock types, giving four encodings of one fact and no way to answer how many units were out.

Connected to Locations Location detail Influencer Samples Live inventory Stock count Drift Write-off approvals Reports Cash + valuation Transfers Shopify events Audit log SKU detail