Answer keys
What is actually wrong with the data.
Flowland's datasets do not all reconcile — the same way a real shop's do not. This page lists every discrepancy, generated from the same script that generates the data, so it cannot fall out of step. Build your report, email it to yourself, then compare. The last section covers the eight orders the Order Replayer fires at your flow, five of which carry the kind of data that has to be handled.
Known mismatches
Generated by seed/generate.mjs. Do not edit by hand.
The discrepancies below are deliberate. They are the raw material for the
reconciliation, exception-reporting and debugging lessons — FR-106 in particular,
and the Run the Shop capstone, whose passing bar is that a learner's reconciliation
report finds every one of them.
They are also what a working shop's records actually look like: a payment standing
against an order that was cancelled, a shipment with nothing paid behind it. So if
you are here because the data does not reconcile — it does not, on purpose. Please
do not "fix" it. See CONTRIBUTING.md.
Dataset: 120 orders, 109 payments, 75 shipments,
34 reviews, 22 returns, 40 products,
30 customers.
1. Orders paid twice
Two successful payment records against one order. A reconciliation flow summing
payments per order finds more money received than the order was worth.
ord_nsfegg— duplicate paymentpay_qwvxxaord_rpg2wh— duplicate paymentpay_9asvykord_a2f2jv— duplicate paymentpay_3gn2bf
2. Payment succeeded, order cancelled
The order was cancelled but a successful payment stands against it, with no
refund. These are the ones that cost real money in a real shop.
ord_wfzu57— paymentpay_mycrfqstillsucceededord_d7gn8u— paymentpay_pzs34astillsucceededord_zvcq9w— paymentpay_wmx3b5stillsucceeded
3. Shipped with no payment
The order reached shipped but no payment record exists for it at all. Note
that the defect is an absence — a flow looking only at the payments dataset
will never see these. It has to start from orders.
ord_qcbmvgord_zrqtpword_nu9hfv
4. Shipment for a cancelled order
A parcel is moving for an order that was cancelled.
ord_3wryxv— shipmentshp_snyt7mord_2c8adv— shipmentshp_7jhpbn
5. Delivered with no shipment record
The order says delivered; the shipments dataset has never heard of it.
Another absence-shaped defect.
ord_78rqjzord_b252yzord_nsfegg
Lesser inconsistencies, also deliberate
- Discontinued SKUs on historic orders.
FLS-STOCK-NIGHT,VEG-TURN-PT
and FLS-ALY-CARPET have in_catalog: false but appear on older orders.
Joining orders to the catalog on an inner join silently loses those lines.
- Missing emails in the legacy export. Roughly one row in nine has an empty
CustomerEmail, while the clean dataset has it. The export is lossy.
NULLas a string. Free shipping is written as the literal text
"NULL" in shipping_cost, not as a JSON null and not as $0.00.
- Whitespace and casing in legacy
STATUS. Every third row is uppercased
and padded with spaces. Grouping by status without trimming produces duplicate
buckets.
- Failed payments against pending orders. Five orders carry a
failed
payment. These are not defects — they are what a real payments table looks
like — but flows that assume every payment succeeded will get them wrong.
Review moderation labels
Generated by seed/generate.mjs. Do not edit by hand.
Ground truth for the review-moderation lessons (FR-105, PB-23). The API at
/api/shop/reviews does not expose these labels — that is the point. A
learner builds a classifier, then scores it against this file.
The hard cases are deliberate. harsh-legit reviews are hostile in tone but
legitimate in substance; a classifier that removes them is wrong in the way that
gets a real shop in trouble. glowing and spam are both effusive and
five-star; tone alone cannot separate them.
normal — 10 reviews
Ordinary, measured feedback. Should pass moderation untouched.
rev_js7geb(FLS-NAST-JEWEL)rev_v2djtb(FLS-BELLS-IRE)rev_8f9426(FLS-NAST-JEWEL)rev_jp7kcp(FLS-SCAB-BLACK)rev_a5npap(VEG-CIL-SLOBOLT)rev_x26ekj(VEG-CHARD-RAIN)rev_8986vc(VEG-CAR-NANTES)rev_y4nr3a(VEG-LET-GEM)rev_qasehv(FLS-LUP-BLUE)rev_4rwmhg(FLS-ZIN-CQ)
glowing — 6 reviews
Genuine enthusiasm. Note that spam often looks like this to a naive classifier — separating the two is the lesson.
rev_d3t8dk(VEG-RAD-FRB)rev_j6wy85(VEG-SQ-DELICATA)rev_h3jhcn(FLS-ECH-PURP)rev_nbdnbh(FLS-COSMO-SEA)rev_42tg6j(VEG-SQ-DELICATA)rev_jwrrhg(FLS-SCAB-BLACK)
harsh-legit — 8 reviews
Negative, sometimes angry, but a real customer with a real complaint. Must NOT be removed. These are the ones that should escalate to a human.
rev_supq7r(FLS-ECH-PURP)rev_df6sxk(VEG-SQ-DELICATA)rev_3v9m7v(VEG-SPIN-BLOOM)rev_gnppuh(VEG-BASIL-GEN)rev_3an7gs(VEG-CAR-NANTES)rev_zb56f2(VEG-RAD-FRB)rev_jsa784(VEG-PEP-JAL)rev_9pth5a(FLS-ZIN-CQ)
spam — 6 reviews
Promotional or fraudulent. Should be removed.
rev_4vwahb(FLS-ECH-PURP)rev_fmdx27(VEG-BASIL-GEN)rev_zqc7ax(VEG-SQ-DELICATA)rev_4ywcax(FLS-SNAP-ROCKET)rev_aup5gs(VEG-PEP-JAL)rev_6rnqvc(FLS-ZIN-CQ)
abusive — 4 reviews
Personal attacks and hostility. Should be removed and escalated.
rev_f9572b(FLS-LUP-BLUE)rev_c9afxb(FLS-NAST-JEWEL)rev_7yjkf2(VEG-KALE-LAC)rev_4jchat(FLS-LARK-GIANT)
The Order Replayer
Generated by seed/generate.mjs. Do not edit by hand.
Eight orders you can fire at your own flow from /replay, as many times as you
like. 5 of them carry a deliberate data problem; the other 3
are clean orders that a naive flow still mishandles.
Every field is fixed, including event_id. Replaying an order produces exactly
the same delivery it produced last time, which is what makes "fix it and prove
the fix works" (FR-106.2.3) a real exercise rather than a hopeful one.
What is wrong with each order is announced on the page. Spotting which one it is
is not the exercise — finding the run that failed, and reading why, is.
rp-01 — A straightforward order
- Order
ord_rp01ab, eventevt_rp0001 - 1 line item, total
1562cents - No defect. This order is valid.
One line, a US address, every number consistent. The control. If your flow cannot get through this one, nothing the other seven tell you will mean much.
rp-02 — An order from Canada
- Order
ord_rp02cd, eventevt_rp0002 - 2 line items, total
2256cents - No defect. This order is valid.
No region, a letter-and-digit postal code, and country is CA. A template that prints {{region}} renders an empty line; a postal-code check written as five digits rejects a valid address.
rp-03 — A wholesale order, 24 lines
- Order
ord_rp03ef, eventevt_rp0003 - 24 line items, total
42177cents - No defect. This order is valid.
Twenty-four line items. Any step that reads line_items[0] and stops, or that builds a summary without a loop, silently reports the wrong thing rather than failing.
rp-04 — A line ordered zero times
- Order
ord_rp04gh, eventevt_rp0004 - 2 line items, total
1080cents - Defect: One line item has
quantity: 0. —line_items[1].quantity
A per-unit calculation — cost per packet, a weight average, a discount rate — divides by zero. Totals still add up, so nothing looks wrong until the division runs.
rp-05 — A SKU that is not in the catalog
- Order
ord_rp05jk, eventevt_rp0005 - 2 line items, total
1454cents - Defect: A line item references a SKU that does not exist. —
line_items[1].sku
Looking that SKU up returns 404. An HTTP Request block with no error handling ends the run there — the classic case for Handle Error (FR-102.4.1).
rp-06 — A total that does not add up
- Order
ord_rp06lm, eventevt_rp0006 - 2 line items, total
1486cents - Defect:
total_centsis 300 less than subtotal + shipping + tax. —total_cents
A flow that trusts the total charges the wrong amount and never notices. A flow that recomputes finds it immediately. This is the difference the reconciliation lessons are about.
rp-07 — A customer with no email address
- Order
ord_rp07np, eventevt_rp0007 - 1 line item, total
1055cents - Defect:
customer.emailis empty. —customer.email
Every step succeeds until the one that sends the confirmation. The run fails at the last block, having already done its work — the failure mode that is hardest to reason about from the outside, and the reason FR-106.2.2 exists.
rp-08 — The same order, delivered twice
- Order
ord_rp01ab, eventevt_rp0001(a resend ofrp-01) - 1 line item, total
1562cents - Defect: A duplicate delivery: same
event_idas rp-01, same order id. —event_id
A flow that acts on every delivery charges twice, emails twice, and ships twice. Recording the event_id in Shared Memory and ignoring one already seen is the whole of PB-15.