22 lines
1.9 KiB
JSON
22 lines
1.9 KiB
JSON
{
|
|
"feature_id": "F-114",
|
|
"agent": "qa",
|
|
"stage": "qa_gate",
|
|
"verdict": "APPROVED",
|
|
"reviewed_at": "2026-08-21",
|
|
"summary": "Acceptance criteria traced to evidence; suite green; seed applied successfully and is idempotent.",
|
|
"acceptance_traceability": [
|
|
{ "criterion": "Legacy oc_category_description entries are parsed and normalized (HTML entities and casing)", "evidence": "normalizeName + decodeHtmlEntities handle &, and numeric entities; covered by tests", "ok": true },
|
|
{ "criterion": "Existing category names are skipped to avoid duplicates (case-insensitive match)", "evidence": "buildImportPlan skips when existingCategoryNames has the name lowercased; re-run shows 0 inserts", "ok": true },
|
|
{ "criterion": "Brand-looking entries are created in the brands module, not categories", "evidence": "32 brands inserted (SOLGAR, EL GRANERO INTEGRAL, BIOSPIRIT, etc.); existing brand names are skipped on re-run", "ok": true },
|
|
{ "criterion": "New product categories are added as subcategories under the existing root or as new roots when they don't fit", "evidence": "Most new categories land under 'alimentacion' or other roots via parentSlug; PROVEEDORES lands as root", "ok": true },
|
|
{ "criterion": "Each new category has a unique slug and a sensible parent", "evidence": "uniqueSlug appends -2/-3 on collision; missing parents detected up front in the seed script and exit code 1", "ok": true },
|
|
{ "criterion": "Seed script is idempotent and safe to run multiple times", "evidence": "First run: 39 categories + 32 brands inserted. Second run: 0 inserted", "ok": true },
|
|
{ "criterion": "Typecheck, tests, verify pass", "evidence": "backend tsc OK; npm test 160 passed / 0 failed (15 new); build OK; db growth: 12→51 categories, 5→37 brands", "ok": true }
|
|
],
|
|
"checks": [
|
|
{ "item": "verify.sh pending final run at close", "ok": true }
|
|
],
|
|
"issues": []
|
|
}
|