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,15 +2,43 @@
"feature_id": "F-084",
"verdict": "APPROVED",
"trace": [
{ "acceptance": "Every parent category row in /categories list shows its emoji immediately before the name", "result": "PASS", "evidence": "Removed cat.children.length > 0 gate." },
{ "acceptance": "Editing the emoji from the UI reflects on the list on next refresh", "result": "PASS", "evidence": "handleSave calls load() after PUT." },
{ "acceptance": "Child categories keep their current rendering (no regression)", "result": "PASS", "evidence": "Children now also render emoji + placeholder, consistent." },
{ "acceptance": "Categories without an emoji show a neutral placeholder", "result": "PASS", "evidence": "Grey `·` shown when cat.emoji is empty/falsy." },
{ "acceptance": "Emoji is stored and returned correctly by the categories API", "result": "PASS", "evidence": "No backend change; column existed." },
{ "acceptance": "verify.sh is green", "result": "PASS", "evidence": "tsc exit 0." }
{
"acceptance": "Every parent category row in /categories list shows its emoji immediately before the name",
"result": "PASS",
"evidence": "Removed cat.children.length > 0 gate."
},
{
"acceptance": "Editing the emoji from the UI reflects on the list on next refresh",
"result": "PASS",
"evidence": "handleSave calls load() after PUT."
},
{
"acceptance": "Child categories keep their current rendering (no regression)",
"result": "PASS",
"evidence": "Children now also render emoji + placeholder, consistent."
},
{
"acceptance": "Categories without an emoji show a neutral placeholder",
"result": "PASS",
"evidence": "Grey `·` shown when cat.emoji is empty/falsy."
},
{
"acceptance": "Emoji is stored and returned correctly by the categories API",
"result": "PASS",
"evidence": "No backend change; column existed."
},
{
"acceptance": "verify.sh is green",
"result": "PASS",
"evidence": "tsc exit 0."
}
],
"regression_checks": [
"Save flow",
"Delete flow"
],
"regression_checks": ["Save flow", "Delete flow"],
"verdict_reason": "All acceptance criteria trace to PASS.",
"reviewer": "qa",
"reviewed_at": "2026-08-20T04:12:00Z"
}
"reviewed_at": "2026-08-20T04:12:00Z",
"agent": "qa"
}

View File

@@ -2,14 +2,34 @@
"feature_id": "F-084",
"verdict": "APPROVED",
"checks": [
{ "name": "Emoji render is no longer gated on children", "result": "PASS", "notes": "Condition removed; render uses cat.emoji directly." },
{ "name": "Empty emoji gets a neutral placeholder", "result": "PASS", "notes": "Grey `·` placeholder with aria-hidden prevents layout shift and keeps semantics." },
{ "name": "Save -> refresh path still works", "result": "PASS", "notes": "handleSave unchanged; still calls load() to re-fetch the tree." },
{ "name": "No backend change", "result": "PASS", "notes": "categories API untouched." }
{
"name": "Emoji render is no longer gated on children",
"result": "PASS",
"notes": "Condition removed; render uses cat.emoji directly."
},
{
"name": "Empty emoji gets a neutral placeholder",
"result": "PASS",
"notes": "Grey `·` placeholder with aria-hidden prevents layout shift and keeps semantics."
},
{
"name": "Save -> refresh path still works",
"result": "PASS",
"notes": "handleSave unchanged; still calls load() to re-fetch the tree."
},
{
"name": "No backend change",
"result": "PASS",
"notes": "categories API untouched."
}
],
"lint": { "errors_introduced": 0, "pre_existing_any_in_seo_form": true },
"lint": {
"errors_introduced": 0,
"pre_existing_any_in_seo_form": true
},
"typecheck": "PASS",
"verdict_reason": "Minimal, surgical render fix.",
"reviewer": "reviewer",
"reviewed_at": "2026-08-20T04:11:00Z"
}
"reviewed_at": "2026-08-20T04:11:00Z",
"agent": "reviewer"
}

View File

@@ -2,13 +2,22 @@
"feature_id": "F-084",
"verdict": "APPROVED",
"checks": [
{ "name": "XSS surface", "result": "PASS", "notes": "Emoji is rendered as text via React; emojis are valid UTF-8 and React escapes." },
{ "name": "Auth unchanged", "result": "PASS", "notes": "Same admin-gated routes." }
{
"name": "XSS surface",
"result": "PASS",
"notes": "Emoji is rendered as text via React; emojis are valid UTF-8 and React escapes."
},
{
"name": "Auth unchanged",
"result": "PASS",
"notes": "Same admin-gated routes."
}
],
"sast": "PASS",
"dependency_review": "PASS",
"secret_scan": "PASS",
"verdict_reason": "Render-only change.",
"reviewer": "security",
"reviewed_at": "2026-08-20T04:11:30Z"
}
"reviewed_at": "2026-08-20T04:11:30Z",
"agent": "security"
}