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,10 +2,26 @@
"feature_id": "F-079",
"verdict": "APPROVED",
"trace": [
{ "acceptance": "Each row in /products listing shows the brand name (or \"-\" when not assigned)", "result": "PASS", "evidence": "toProduct now hydrates brand from brands_brands; frontend placeholder p.brand?.name ?? '—' remains as fallback." },
{ "acceptance": "Brand column header is present and aligned with other columns", "result": "PASS", "evidence": "Existing <th>Marca</th> in products/page.tsx unchanged." },
{ "acceptance": "Empty brand renders as a placeholder, not raw null/undefined", "result": "PASS", "evidence": "brand is undefined when brand_id is null; placeholder kicks in." },
{ "acceptance": "verify.sh is green", "result": "PASS", "evidence": "npx tsc --noEmit exit 0; npx eslint exit 0; vitest 9/9 passed." }
{
"acceptance": "Each row in /products listing shows the brand name (or \"-\" when not assigned)",
"result": "PASS",
"evidence": "toProduct now hydrates brand from brands_brands; frontend placeholder p.brand?.name ?? '—' remains as fallback."
},
{
"acceptance": "Brand column header is present and aligned with other columns",
"result": "PASS",
"evidence": "Existing <th>Marca</th> in products/page.tsx unchanged."
},
{
"acceptance": "Empty brand renders as a placeholder, not raw null/undefined",
"result": "PASS",
"evidence": "brand is undefined when brand_id is null; placeholder kicks in."
},
{
"acceptance": "verify.sh is green",
"result": "PASS",
"evidence": "npx tsc --noEmit exit 0; npx eslint exit 0; vitest 9/9 passed."
}
],
"regression_checks": [
"findById still returns product with category_ids",
@@ -14,5 +30,6 @@
],
"verdict_reason": "All acceptance criteria trace to PASS. No regressions detected.",
"reviewer": "qa",
"reviewed_at": "2026-08-20T03:59:00Z"
}
"reviewed_at": "2026-08-20T03:59:00Z",
"agent": "qa"
}

View File

@@ -28,9 +28,12 @@
"notes": "Pure read-side change. No migration, no new endpoint, no new payload field beyond an optional brand object."
}
],
"lint": { "errors_introduced": 0 },
"lint": {
"errors_introduced": 0
},
"typecheck": "PASS",
"verdict_reason": "Minimal, surgical fix. Brand column now populated server-side; all tests green.",
"reviewer": "reviewer",
"reviewed_at": "2026-08-20T03:58:00Z"
}
"reviewed_at": "2026-08-20T03:58:00Z",
"agent": "reviewer"
}

View File

@@ -28,5 +28,6 @@
"secret_scan": "PASS",
"verdict_reason": "Read-side join only; no new attack surface.",
"reviewer": "security",
"reviewed_at": "2026-08-20T03:58:30Z"
}
"reviewed_at": "2026-08-20T03:58:30Z",
"agent": "security"
}