feat(F-088): completed feature

This commit is contained in:
chattie
2026-08-20 21:29:14 +02:00
parent 63fdc775d9
commit 699c01ade5
40 changed files with 996 additions and 381 deletions

View File

@@ -2,18 +2,49 @@
"feature_id": "F-087",
"verdict": "APPROVED",
"checks": [
{ "name": "Backend cart validates stock before add/change", "result": "PASS", "notes": "CartService.addItem and changeQuantity call assertStockAvailable which uses inventory.checkAvailability." },
{ "name": "409 mapping on insufficient stock", "result": "PASS", "notes": "mapCartError returns AppError(409, 'INSUFFICIENT_STOCK', ...) when InsufficientCartStockError is thrown." },
{ "name": "Frontend product page qty capped to stock", "result": "PASS", "notes": "AddToCart component: input max=stock, button disabled when stock=0, error on over-stock." },
{ "name": "Cart page qty inputs capped per variant", "result": "PASS", "notes": "/carrito fetches stock per item and renders max on the input; updateQty rejects over-stock." },
{ "name": "Storefront API proxies for cart and inventory", "result": "PASS", "notes": "Three new proxy routes: /api/cart, /api/cart/items/[variantId], /api/inventory/[variantId]/availability." },
{ "name": "Header cart counter", "result": "PASS", "notes": "CartButton listens to mdv:cart-updated and shows count from localStorage." },
{ "name": "Tests pass", "result": "PASS", "notes": "Cart service tests still green (3/3)." }
{
"name": "Backend cart validates stock before add/change",
"result": "PASS",
"notes": "CartService.addItem and changeQuantity call assertStockAvailable which uses inventory.checkAvailability."
},
{
"name": "409 mapping on insufficient stock",
"result": "PASS",
"notes": "mapCartError returns AppError(409, 'INSUFFICIENT_STOCK', ...) when InsufficientCartStockError is thrown."
},
{
"name": "Frontend product page qty capped to stock",
"result": "PASS",
"notes": "AddToCart component: input max=stock, button disabled when stock=0, error on over-stock."
},
{
"name": "Cart page qty inputs capped per variant",
"result": "PASS",
"notes": "/carrito fetches stock per item and renders max on the input; updateQty rejects over-stock."
},
{
"name": "Storefront API proxies for cart and inventory",
"result": "PASS",
"notes": "Three new proxy routes: /api/cart, /api/cart/items/[variantId], /api/inventory/[variantId]/availability."
},
{
"name": "Header cart counter",
"result": "PASS",
"notes": "CartButton listens to mdv:cart-updated and shows count from localStorage."
},
{
"name": "Tests pass",
"result": "PASS",
"notes": "Cart service tests still green (3/3)."
}
],
"lint": { "errors_introduced": 0 },
"lint": {
"errors_introduced": 0
},
"typecheck": "PASS",
"tests": "3/3 passed",
"verdict_reason": "Backend enforced, frontend capped. Acceptance criteria trace to PASS.",
"reviewer": "reviewer",
"reviewed_at": "2026-08-20T04:17:00Z"
}
"reviewed_at": "2026-08-20T04:17:00Z",
"agent": "reviewer"
}