feat(F-088): completed feature
This commit is contained in:
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user