22 lines
1.5 KiB
JSON
22 lines
1.5 KiB
JSON
{
|
|
"feature_id": "F-102",
|
|
"agent": "qa",
|
|
"stage": "qa_gate",
|
|
"verdict": "APPROVED",
|
|
"reviewed_at": "2026-08-21",
|
|
"summary": "Acceptance criteria traced to tests and manual evidence; full suite, typechecks and migration verified.",
|
|
"acceptance_traceability": [
|
|
{ "criterion": "Product stores optional unit weight", "evidence": "catalog_products.unit_weight_kg numeric(8,3) default 1; exposed in admin Prices & Stock; serializeProduct returns it", "ok": true },
|
|
{ "criterion": "Variant stores pack quantity defaulting to one", "evidence": "Redefined at intake as min_purchase_qty integer default 1; storefront enforces min purchase in cart and product page", "ok": true },
|
|
{ "criterion": "Pack values are validated as positive integers", "evidence": "zod: unitWeightKg positive<=1000, minPurchaseQty int 1..999, method weights positive<=100000; admin inputs validate locally", "ok": true },
|
|
{ "criterion": "Typecheck, tests, verify pass", "evidence": "npm run typecheck OK; npm test 42 files / 135 passed 0 failed; apps/admin and frontend tsc --noEmit OK; migration 038 applied per db:status", "ok": true }
|
|
],
|
|
"checks": [
|
|
{ "item": "shipping-service.test.ts: method excluded above max weight; free shipping denied above free weight range", "ok": true },
|
|
{ "item": "Cart never drops below minPurchaseQty; removal still allowed", "ok": true },
|
|
{ "item": "Checkout passes cart weight and degrades to 0 on calc failure", "ok": true },
|
|
{ "item": "scripts/verify.sh pending final run at close", "ok": true }
|
|
],
|
|
"issues": []
|
|
}
|