Samples

A receipt lands in SAMPLE_QC with a hard 72h classification SLA started at counted_at · marketing decides POOL, STOCK, RTS or write-off · an SLA expiry escalates, it never classifies

2 samples past the 72h SLA. Oldest SMP-2026-0726-011 at 148h, that is +76h over · nothing auto-promotes · they stay in SAMPLE_QC, they are gate-blocking, and they are being chased Breach queue →
v2 auto-promoted a breached sample to STOCK. i3 does not. Letting a timer make an un-QC'd supplier unit sellable is the same class of error as letting a carrier status string credit stock (ruling L19). ck_phe_no_robot_writeoff makes it structurally impossible, not merely unimplemented.
72h SLA · week ending 29-07 86.7% ↑ 4.3 pts WoW Clock starts at grn_receipts.counted_at, not at webhook receipt, so a slow bridge does not buy a sample extra time
13
2
2
Within SLA · 13 At risk under 24h · 2 Breached · 2 target 90% · Asia/Dubai · first_breached_at is set once and never cleared

Breach queue

The only queue that blocks GATE 7 · each row is a decision somebody owes, not a number that will resolve itself

2 breached · 7 units · AED 3,340
SampleSupplierSKUQtyCountedAgeOver byEscalationOwnerSuggestedClassify
SMP-2026-0726-011ORO Leather ★LLW-NEW-099 523-07 10:30148h+76h escalated 26-07f.marketingSTOCK partial
SMP-2026-0725-009VJ JewelsFYN01-S 225-07 09:15101h+29h escalated 28-07f.marketingPOOL
Both rows are still SAMPLE_QC. Neither is sellable, neither has been promoted, and neither will be until a named human decides. sample_classifications.decided_by rejects system:*.

Sample receipts

14 of 17 · triage from the keyboard without opening a row: 1 POOL 2 STOCK 3 RTS 4 WASTE

2 breached2 at risk13 within
SampleSupplierSKUQtyOriginTeamPurpose CountedAgeSLACost basisStateClassify
SMP-2026-0726-011ORO LeatherLLW-NEW-0995 PI-2026-LC-044marketingshoot23-07 148h
+76h
invoice SAMPLE_QC
SMP-2026-0725-009VJ JewelsFYN01-S2 PO-2026-118marketingshoot25-07 101h
+29h
invoice SAMPLE_QC
SMP-2026-0727-013CICMSR31-094 RUN-2026-0712productmodel approval27-07 60h
11h 36m
similar_sku SAMPLE_QC
SMP-2026-0727-014ORO LeatherLBA031 PO-2026-121marketingtrade_show27-07 48h
23h 50m
invoice SAMPLE_QC
SMP-2026-0728-015VJ JewelsJRY056 PO-2026-118ecomecom28-07 36h
35h 15m
invoice SAMPLE_QC
SMP-2026-0729-016ORO LeatherLLW-NEW-1042 PI-2026-LC-048marketinginfluencer29-07 12h
59h 38m
invoice SAMPLE_QC
SMP-2026-0729-017Marble Co.MIN-NEW-0628 PO-2026-124productshowroom29-07 6h
66h 02m
unknown SAMPLE_QC
SMP-2026-0728-012CICCDW023 RUN-2026-0712productmodel approval28-07 30h
41h 44m
similar_sku SAMPLE_QC
SMP-2026-0724-008Linen HouseMIN-NEW-0194 PO-2026-112ecomecom24-07 124h
met 62h
invoice STOCK
SMP-2026-0722-006ORO LeatherLLW-NEW-0953 PI-2026-LC-041marketingshoot22-07 172h
met 28h
invoice SAMPLE_POOL
SMP-2026-0720-004VJ JewelsJAE192 PO-2026-109marketingpr20-07 220h
met 41h
invoice SAMPLE_POOL
SMP-2026-0718-002Linen HouseMIN-NEW-0174 PO-2026-104productshowroom18-07 268h
met 68h
invoice RTS
SMP-2026-0715-001Textile PartnersMIN-NEW-0091 PO-2026-098marketingshowroom15-07 340h
missed +16h
invoice WRITTEN_OFF
SMP-2026-0712-014CICMSR31-086 RUN-2026-0628productmodel approval12-07 412h
met 22h
invoice STOCK
Note row SMP-2026-0729-017: its STOCK button is disabled because cost_basis = 'unknown'. Promoting an uncosted unit into sellable stock is how i2 valued 503k ledger rows at zero. R-11.24 refuses it at the boundary rather than in a report afterwards.

Sample sub-pools

v2 had one flat SAMPLE_POOL · photography rotates and returns, PR is consumptive and its units are expected never to come back

62 units · AED 24.8K
PHOTOGRAPHY
HQ_319 · marketing
24
target 25 · consumption 2/mo · returns 91%
PR
HQ_319 · marketing
18
consumptive · consumption 9/mo · returns 0%
SHOWROOM
HQ_325 · product
12
target 15 · consumption 1/mo · returns 96%
TRADE_SHOW
HQ_319 · marketing
6
consumptive in event months · 3 out now
ECOM
HQ_319 · ecom
2
target 8 · below target · shoot backlog

Time to classify by supplier

90 days · the 72h line is drawn · lower is better

median 31h
ORO Leather ★28h
VJ Jewels41h
CIC52h
Marble Co.58h
Linen House66h
Textile Partners88h
72h SLA 72h SLA
Textile Partners is the only supplier whose median exceeds the SLA. Its single sample this year is also the only write-off on the page.

Sample to sellable rate

Share of received sample units that ended as STOCK · higher is better

fleet 61%
ORO Leather ★92%
Marble Co.80%
CIC66%
VJ Jewels48%
Linen House20%
Textile Partners0%
Received 90d
62 units · 8 suppliers
Ended STOCK
38 · 61%
Ended POOL
18 · 29%
Ended RTS
4 · 6%
Written off
2 · 3%
This is the number that decides whether to keep buying samples from a supplier at all, and it is only computable because hours_to_decide and the outcome are frozen on the classification row.

Pool consumption

Units entering the pool against units consumed, per month · a consumptive pool that never shrinks is a pool nobody is using

in 74consumed 51net +23
Feb · 7 into pool Feb · 4 consumed Mar · 9 into pool Mar · 6 consumed Apr · 10 into pool Apr · 7 consumed May · 6 into pool May · 5 consumed Jun · 11 into pool Jun · 8 consumed Jul · 13 into pool Jul · 9 consumed · PR heavy month Aug · 9 into pool Aug · 6 consumed Sep · 8 into pool (partial) Sep · 5 consumed (partial)
FebMarAprMayJunJulAugSep
Into pool (classified POOL)Consumed (written off with photo)Net pool change

An SLA expiry escalates. It does not classify.

v2 shipped two contradictory automatic destinations for the same expiry. samples.html and samples-detail.html both say a breached sample auto-falls-back to STOCK, and the detail page's own warning row admits it "will bypass manual QC". i2's schema disagrees: samples.state allows auto_pool, not auto-stock. Two specifications, two destinations, one clock.

i3 does neither. A breached sample stays in SAMPLE_QC, writes a sample_sla_events row, raises an alert, and becomes gate-blocking. It is not sellable, it is not written off, and it is not forgotten.

The general rule is ruling L19 with the subject swapped: L19 makes a carrier status string structurally incapable of crediting sellable stock; here a timer is made structurally incapable of it. ck_phe_no_robot_writeoff forbids a system actor from the ownership-changing verbs, so this is a constraint, not a convention.

SLA extensions

3 in 30d · each with a reason
SampleFromToByReason
SMP-2026-0727-01372h96hf.marketingAwaiting factory colour reference
SMP-2026-0722-00672h96ha.yousufPhotographer unavailable until Sunday
SMP-2026-0718-00272h120ha.yousufSupplier disputing the defect finding
v2 had a bare "Extend SLA 24h" button. ck_sr_ext refuses an extension without both an extender and a reason, so an extension is a decision on the record rather than a way to make a breach disappear.

Where a sample comes from

Module 06 posts it. A GRN line of kind='sample' posts +qty SAMPLE_QC, not RECEIVED_NOT_INVOICED and not STOCK, and the clock starts at counted_at. This module owns everything after that instant and nothing before it.

Origin is either a PO line, a PI, or a production run with no PO at all, which is why sample_receipts carries production_run_ref as well as po_id. Ruling L15: a PO line does not always carry a SKU, and a sample often arrives before the SKU is named.

Keyboard triage J K row 1 POOL 2 STOCK 3 RTS 4 WASTE X select E extend SLA Enter open detail ⌘K palette Triage happens from the keyboard without opening a row. Every keystroke still writes decided_by.
Connected to Sample detail GRN + QC GRN events Suppliers Supplier detail Return to supplier POs + PI Production Influencer Consignment Write-off approvals Live inventory Reports Notifications