Phase 1 ops core: base blocks, feedback, canary fixes

- Add app/ekonomi/anvandare/prenumerationer/butik/feedback blocks to computeOpsSummary.
- New feedback table, POST /api/feedback, GDPR erasure wiring.
- Canary: only count unverified/rejected published recipes; treat verified/editorial as safe.
- Add 'rejected' recipe verification status enum value.
- Fix food-safety lint baseline: remove egg/cured fish from raw-protein list, relax
  genomstekt regex, add safe-cooking phrases to seed recipes.
- Seed recipes now get verificationStatus=editorial.
- Tests: ops summary blocks, feedback route, me.residual cleanup.
This commit is contained in:
Sven (AAMOS AI)
2026-08-10 06:35:51 +07:00
parent 8f20b2ef1b
commit 4687f46384
16 changed files with 606 additions and 44 deletions
+3
View File
@@ -240,6 +240,7 @@ describe("DELETE /v1/me — GDPR residual completeness", () => {
creatorUserId: userId,
creatorDisplayName: "Test",
status: "published",
verificationStatus: "editorial",
nutritionPerPortion: { kcal: 0, proteinG: 0, carbsG: 0, fatG: 0, saturatedFatG: 0, fiberG: 0, sugarG: 0, saltG: 0 },
dna: {
cuisine: "swedish",
@@ -337,6 +338,7 @@ describe("DELETE /v1/me — GDPR residual completeness", () => {
user_preferences: ["user_id"],
user_health_profiles: ["user_id"],
user_locale_preferences: ["user_id"],
feedback: ["user_id"],
idempotency_keys: ["user_id"],
push_tokens: ["user_id"],
notifications: ["user_id"],
@@ -422,6 +424,7 @@ describe("DELETE /v1/me — GDPR residual completeness", () => {
["inventory_transactions", "actor_user_id"],
["meal_boxes", "reserved_for_user_id"],
["shopping_list_items", "added_by_user_id"],
["feedback", "user_id"],
];
for (const [table, column] of checks) {