Restaurant Supplier Price-Change Review Sprint
Original fictional Cedar Lantern Pantry specimen, AI-assisted, October 23, 2026.

Buyer: independent restaurant owner/purchasing manager receiving two dated lists.
Pain/workaround: manually comparing supplier sheets or asking a representative.
Consequence hypothesis: missed changes or misleading comparisons after pack/ID changes.
Measurable outcome: all 12 seeded cases correctly identified with exact source rows and no comparable calculation on unresolved inputs. No measured customer savings.

Run: python local_checks.py --fixtures
Then: python compare.py before.csv after.csv .
Tests: python local_checks.py
Use the same interpreter for parent/child execution. Standard library only.

Input eligibility: two UTF-8 CSV lists, one supplier, at most 40 rows each; exact headers in before.csv. Dates and supplier identity are supplied context, not inferred or validated. Unique alphanumeric/hyphen row_id values. supplier_item_id strings are compared exactly. No fuzzy or description-only matching. No spreadsheets, PDFs, OCR, invoices, credits, tax or ordering automation in this implementation. XLSX service intake is not yet exercised.

Original strings are preserved in before.csv/after.csv and *_original fields. Derived comparisons never overwrite originals. Stable ID is necessary but not proof of stable product identity; operator must confirm. Duplicate IDs on either side hold the entire ID group. Missing IDs hold individually. Changed-ID pairs remain added/removed and require review, even with identical descriptions. Pack quantity, unit size, unit and currency must match exactly; conservative false holds are preferred to false equivalence. No unit conversions. Only USD comparisons exercised. Prices must be finite and nonnegative; pack and size finite and positive. Invalid or missing numbers hold. Zero baseline: absolute change valid, percentage blank/undefined.

Price is per pack. Unit price = pack price / (pack_quantity * unit_size), displayed per the given unit only when compatible. Decimal arithmetic, round-half-up: absolute/percentage changes 2 decimals; normalized unit prices 4 decimals. Rounded values are not summed into a savings claim. No price forecast or purchasing recommendation.

exceptions.csv includes exact source filenames/row IDs, original descriptions/packs/prices, match basis, comparability, derived changes and reviewer questions. Structured original rows use JSON inside CSV cells. Formula-like exported cells are apostrophe-prefixed for safer spreadsheet viewing; source CSV remains unmodified. Treat arbitrary raw CSV as untrusted; this is not a complete spreadsheet security sandbox. HTML escapes source text and uses no network resources or scripts.

Dry-run capacity: one synthetic comparison of 12 before rows / 10 after rows only. Limit is 40 rows per input, not a claim of exercised real-client capacity. Human/operator review of identity and questions remains necessary. No customer data used, no client-system access or account opened. No external code or creative assets adopted; system fonts only. No human authorship, physical print testing or independent professional certification claimed.

Commercial hypothesis: $49 USD for one bounded comparison; no orders, attachments, payment or turnaround promises accepted. Enquiry asks only role, size, frequency and usefulness/price interest. Safe intake, real seller terms and exact payment/fulfillment readiness must be verified before a real order.

This folder is private QA output, not a release. Proposed owned-site path is /restaurant-supplier-price-review/ with a catalogue entry, after acceptance. Review at 14 days after actual publication or 10 observed qualified views, whichever first. No measurable exposure = acquisition-inconclusive, not disproved demand. No followup campaign. No cash purchase made; compute/hosting costs unknown. Synthetic testing is not customer exposure, demand, revenue or measured savings.
