{ "feature": "Greeting Generator: pick category & tone, click Generate to fill output panel, Clear to empty it", "workflow_type": "feature", "services_involved": ["web"], "phases": [ { "phase": 1, "name": "Generate produces non-empty text", "type": "implementation", "subtasks": [ { "id": "generate-produces-non-empty-text", "description": "Verify clicking Generate fills [data-testid=\"output\"] with non-empty text", "status": "pending", "lane": "browser", "language": "typescript", "framework": "playwright", "target_name": "web", "intent": "create", "target": "src/App.tsx::App", "rationale": "AC#1: When the user clicks the Generate button, the output panel ([data-testid=\"output\"]) must contain non-empty text.", "files_to_create": ["tests/e2e/generate-produces-non-empty-text.spec.ts"], "verification": { "type": "command", "command": "npx playwright test tests/e2e/generate-produces-non-empty-text.spec.ts", "expected": "exit 0" } } ], "parallel_safe": false }, { "phase": 2, "name": "Greeting category vocabulary", "type": "implementation", "subtasks": [ { "id": "greeting-category-vocabulary", "description": "Verify output contains a greeting-vocabulary word when category-select is set to greeting", "status": "pending", "lane": "browser", "language": "typescript", "framework": "playwright", "target_name": "web", "intent": "create", "target": "src/App.tsx::App", "rationale": "AC#2: When category = \"greeting\", the generated text must contain at least one of: hello, hi, greetings, or welcome (case-insensitive).", "files_to_create": ["tests/e2e/greeting-category-vocabulary.spec.ts"], "verification": { "type": "command", "command": "npx playwright test tests/e2e/greeting-category-vocabulary.spec.ts", "expected": "exit 0" } } ], "parallel_safe": false }, { "phase": 3, "name": "Snarky tone vocabulary", "type": "implementation", "subtasks": [ { "id": "snarky-tone-vocabulary", "description": "Verify output contains a snarky-vocabulary word when tone-select is set to snarky", "status": "pending", "lane": "browser", "language": "typescript", "framework": "playwright", "target_name": "web", "intent": "create", "target": "src/App.tsx::App", "rationale": "AC#3: When tone = \"snarky\", the generated text must contain at least one of: obviously, whatever, sure, or fine (case-insensitive).", "files_to_create": ["tests/e2e/snarky-tone-vocabulary.spec.ts"], "verification": { "type": "command", "command": "npx playwright test tests/e2e/snarky-tone-vocabulary.spec.ts", "expected": "exit 0" } } ], "parallel_safe": false }, { "phase": 4, "name": "Clear empties the output panel", "type": "implementation", "subtasks": [ { "id": "clear-empties-output", "description": "Verify clicking Clear empties [data-testid=\"output\"] after a Generate has filled it", "status": "pending", "lane": "browser", "language": "typescript", "framework": "playwright", "target_name": "web", "intent": "create", "target": "src/App.tsx::App", "rationale": "AC#4: When the user clicks the Clear button, the output panel ([data-testid=\"output\"]) must become empty.", "files_to_create": ["tests/e2e/clear-empties-output.spec.ts"], "verification": { "type": "command", "command": "npx playwright test tests/e2e/clear-empties-output.spec.ts", "expected": "exit 0" } } ], "parallel_safe": false }, { "phase": 5, "name": "Consecutive Generate clicks yield different text", "type": "implementation", "subtasks": [ { "id": "different-text-on-consecutive-generates", "description": "Verify two consecutive Generate clicks with identical dropdown selections produce different text each time", "status": "pending", "lane": "browser", "language": "typescript", "framework": "playwright", "target_name": "web", "intent": "create", "target": "src/generate.ts::generate", "rationale": "AC#5: Two consecutive Generate clicks with same dropdowns must produce DIFFERENT text — catches stale state/caching bugs in generate().", "files_to_create": ["tests/e2e/different-text-on-consecutive-generates.spec.ts"], "verification": { "type": "command", "command": "npx playwright test tests/e2e/different-text-on-consecutive-generates.spec.ts", "expected": "exit 0" } } ], "parallel_safe": false } ], "final_acceptance": [ "Clicking Generate fills [data-testid=\"output\"] with non-empty text", "Output with category=greeting contains hello, hi, greetings, or welcome (case-insensitive)", "Output with tone=snarky contains obviously, whatever, sure, or fine (case-insensitive)", "Clicking Clear empties [data-testid=\"output\"]", "Two consecutive Generate clicks with identical selections produce different text (no stale cache)" ], "created_at": "2026-05-29T10:30:00Z", "updated_at": "2026-05-29T10:30:00Z", "status": "in_progress", "planStatus": "pending" }