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 chasedBreach 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-0786.7%↑ 4.3 pts WoWClock 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 · 13At risk under 24h · 2Breached · 2target 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
Sample
Supplier
SKU
Qty
Counted
Age
Over by
Escalation
Owner
Suggested
Classify
SMP-2026-0726-011
ORO Leather ★
LLW-NEW-099
5
23-07 10:30
148h
+76h
escalated 26-07
f.marketing
STOCK partial
SMP-2026-0725-009
VJ Jewels
FYN01-S
2
25-07 09:15
101h
+29h
escalated 28-07
f.marketing
POOL
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
Sample
Supplier
SKU
Qty
Origin
Team
Purpose
Counted
Age
SLA
Cost basis
State
Classify
SMP-2026-0726-011
ORO Leather
LLW-NEW-099
5
PI-2026-LC-044
marketing
shoot
23-07
148h
+76h
invoice
SAMPLE_QC
SMP-2026-0725-009
VJ Jewels
FYN01-S
2
PO-2026-118
marketing
shoot
25-07
101h
+29h
invoice
SAMPLE_QC
SMP-2026-0727-013
CIC
MSR31-09
4
RUN-2026-0712
product
model approval
27-07
60h
11h 36m
similar_sku
SAMPLE_QC
SMP-2026-0727-014
ORO Leather
LBA03
1
PO-2026-121
marketing
trade_show
27-07
48h
23h 50m
invoice
SAMPLE_QC
SMP-2026-0728-015
VJ Jewels
JRY05
6
PO-2026-118
ecom
ecom
28-07
36h
35h 15m
invoice
SAMPLE_QC
SMP-2026-0729-016
ORO Leather
LLW-NEW-104
2
PI-2026-LC-048
marketing
influencer
29-07
12h
59h 38m
invoice
SAMPLE_QC
SMP-2026-0729-017
Marble Co.
MIN-NEW-062
8
PO-2026-124
product
showroom
29-07
6h
66h 02m
unknown
SAMPLE_QC
SMP-2026-0728-012
CIC
CDW02
3
RUN-2026-0712
product
model approval
28-07
30h
41h 44m
similar_sku
SAMPLE_QC
SMP-2026-0724-008
Linen House
MIN-NEW-019
4
PO-2026-112
ecom
ecom
24-07
124h
met 62h
invoice
STOCK
SMP-2026-0722-006
ORO Leather
LLW-NEW-095
3
PI-2026-LC-041
marketing
shoot
22-07
172h
met 28h
invoice
SAMPLE_POOL
SMP-2026-0720-004
VJ Jewels
JAE19
2
PO-2026-109
marketing
pr
20-07
220h
met 41h
invoice
SAMPLE_POOL
SMP-2026-0718-002
Linen House
MIN-NEW-017
4
PO-2026-104
product
showroom
18-07
268h
met 68h
invoice
RTS
SMP-2026-0715-001
Textile Partners
MIN-NEW-009
1
PO-2026-098
marketing
showroom
15-07
340h
missed +16h
invoice
WRITTEN_OFF
SMP-2026-0712-014
CIC
MSR31-08
6
RUN-2026-0628
product
model approval
12-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
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%
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
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
Sample
From
To
By
Reason
SMP-2026-0727-013
72h
96h
f.marketing
Awaiting factory colour reference
SMP-2026-0722-006
72h
96h
a.yousuf
Photographer unavailable until Sunday
SMP-2026-0718-002
72h
120h
a.yousuf
Supplier 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 triageJK row1 POOL2 STOCK3 RTS4 WASTEX selectE extend SLAEnter open detail⌘K paletteTriage happens from the keyboard without opening a row. Every keystroke still writes decided_by.