Maestro task: 28d3cb4b-83d1-40e8-991f-d88f0f64d270 (Feature 12 - Regular Dinners and Onboarding).
Done-condition
POST /api/v1/dinners accepts {name} or {recipe_url} and creates a dinner with status regular, origin regular and grounding_status pending, rejecting duplicates by harness-normalized name with 409; GET /dinners?status=regular|quest_log lists dinners with photo URLs and grounding status; PATCH /dinners/{id} edits name/method/minutes/difficulty; DELETE archives (status archived) rather than deleting rows; POST /dinners/{id}/favorite toggles is_favorite. Every write records updated_by from the session. API tests cover create by name, create by URL, duplicate 409, list filtering, patch validation, archive, favorite and CSRF enforcement. Go quality floor passes.
Evidence
New internal/dinners service + HTTP routes wired into NewRouter/cmd-server; duplicate detection uses the harness Normalize/Similar; normalized_name set on create/edit; archived dinners are skipped by the duplicate check; writes record updated_by from the session.
gofmt/vet/go test -race/build pass; sqlc no drift if touched; endpoints exercised through the real router against real SQLite (no live sign-in available).
Changed a shared error string in internal/server/settings.go from "invalid settings: ..." to "invalid request body: ..." (no tests depended on it).
Maestro task: 28d3cb4b-83d1-40e8-991f-d88f0f64d270 (Feature 12 - Regular Dinners and Onboarding).
## Done-condition
POST /api/v1/dinners accepts {name} or {recipe_url} and creates a dinner with status regular, origin regular and grounding_status pending, rejecting duplicates by harness-normalized name with 409; GET /dinners?status=regular|quest_log lists dinners with photo URLs and grounding status; PATCH /dinners/{id} edits name/method/minutes/difficulty; DELETE archives (status archived) rather than deleting rows; POST /dinners/{id}/favorite toggles is_favorite. Every write records updated_by from the session. API tests cover create by name, create by URL, duplicate 409, list filtering, patch validation, archive, favorite and CSRF enforcement. Go quality floor passes.
## Evidence
- New internal/dinners service + HTTP routes wired into NewRouter/cmd-server; duplicate detection uses the harness Normalize/Similar; normalized_name set on create/edit; archived dinners are skipped by the duplicate check; writes record updated_by from the session.
- gofmt/vet/go test -race/build pass; sqlc no drift if touched; endpoints exercised through the real router against real SQLite (no live sign-in available).
Changed a shared error string in internal/server/settings.go from "invalid settings: ..." to "invalid request body: ..." (no tests depended on it).
POST /api/v1/dinners adds a Regular from a name or a recipe link
(status and origin regular, grounding_status pending), refusing a name
harness.Similar to an unarchived dinner, or a known link, with 409.
GET /dinners?status=regular|quest_log lists dinners with photo URLs and
grounding status; PATCH /dinners/{id} edits name, method, minutes and
difficulty; DELETE archives the row; POST /dinners/{id}/favorite toggles
is_favorite. Every write records the session subject as updated_by.
Migration 0008 adds dinners.recipe_url so a pasted link is kept until
grounding resolves it.
Maestro task 28d3cb4b-83d1-40e8-991f-d88f0f64d270.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
POST /api/v1/dinners adds a Regular from a name or a recipe link
(status and origin regular, grounding_status pending), refusing a name
harness.Similar to an unarchived dinner, or a known link, with 409.
GET /dinners?status=regular|quest_log lists dinners with photo URLs and
grounding status; PATCH /dinners/{id} edits name, method, minutes and
difficulty; DELETE archives the row; POST /dinners/{id}/favorite toggles
is_favorite. Every write records the session subject as updated_by.
Migration 0008 adds dinners.recipe_url so a pasted link is kept until
grounding resolves it.
Maestro task 28d3cb4b-83d1-40e8-991f-d88f0f64d270.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Maestro task: 28d3cb4b-83d1-40e8-991f-d88f0f64d270 (Feature 12 - Regular Dinners and Onboarding).
Done-condition
POST /api/v1/dinners accepts {name} or {recipe_url} and creates a dinner with status regular, origin regular and grounding_status pending, rejecting duplicates by harness-normalized name with 409; GET /dinners?status=regular|quest_log lists dinners with photo URLs and grounding status; PATCH /dinners/{id} edits name/method/minutes/difficulty; DELETE archives (status archived) rather than deleting rows; POST /dinners/{id}/favorite toggles is_favorite. Every write records updated_by from the session. API tests cover create by name, create by URL, duplicate 409, list filtering, patch validation, archive, favorite and CSRF enforcement. Go quality floor passes.
Evidence
Changed a shared error string in internal/server/settings.go from "invalid settings: ..." to "invalid request body: ..." (no tests depended on it).
POST /api/v1/dinners adds a Regular from a name or a recipe link (status and origin regular, grounding_status pending), refusing a name harness.Similar to an unarchived dinner, or a known link, with 409. GET /dinners?status=regular|quest_log lists dinners with photo URLs and grounding status; PATCH /dinners/{id} edits name, method, minutes and difficulty; DELETE archives the row; POST /dinners/{id}/favorite toggles is_favorite. Every write records the session subject as updated_by. Migration 0008 adds dinners.recipe_url so a pasted link is kept until grounding resolves it. Maestro task 28d3cb4b-83d1-40e8-991f-d88f0f64d270. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>POST /api/v1/dinners adds a Regular from a name or a recipe link (status and origin regular, grounding_status pending), refusing a name harness.Similar to an unarchived dinner, or a known link, with 409. GET /dinners?status=regular|quest_log lists dinners with photo URLs and grounding status; PATCH /dinners/{id} edits name, method, minutes and difficulty; DELETE archives the row; POST /dinners/{id}/favorite toggles is_favorite. Every write records the session subject as updated_by. Migration 0008 adds dinners.recipe_url so a pasted link is kept until grounding resolves it. Maestro task 28d3cb4b-83d1-40e8-991f-d88f0f64d270. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>Independent Codex gpt-6-sol review: APPROVED for this exact commit.