{ "feature_id": "F-102", "agent": "reviewer", "stage": "review_gate", "verdict": "APPROVED", "reviewed_at": "2026-08-21", "summary": "Unit weight, min purchase qty and per-method weight limits implemented coherently across migration 038, domain, repositories, routes, admin and storefront.", "checks": [ { "item": "Migration 038 adds nullable/defaulted columns with up/down, idempotent IF NOT EXISTS", "ok": true }, { "item": "Zod validation on catalog create/patch (unitWeightKg 0..1000, minPurchaseQty 1..999) and shipping methods (weight caps 0..100000)", "ok": true }, { "item": "ShippingService excludes methods over maxWeightKg and restricts free-shipping to the free weight range; empty candidates raise ShippingZoneNotFoundError as before", "ok": true }, { "item": "Checkout degrades gracefully: getCartWeightKg is optional and its failure falls back to 0 (no checkout blockage)", "ok": true }, { "item": "numeric columns cast with Number() on read; no float truncation risk for 8,3 values", "ok": true }, { "item": "Admin api-client signatures extended without breaking existing callers (F-085/F-088 regression avoided)", "ok": true }, { "item": "Cart enforces minPurchaseQty on add/merge/changeQuantity; removal still possible at qty<=0", "ok": true }, { "item": "Tests cover weight exclusion and free-shipping weight cap; fixtures updated", "ok": true } ], "issues": [], "notes": "Scope redefinition from intake (min purchase instead of variant packs, shipping weight limits) is reflected in work/current.md and implementer.md." }