R1-A: Migration 0010 is back to its round-2 content, the ALTER TABLE only,
since a database that already applied 0010 never runs it again. The
repair that writes revision 0 into ground_dinner job payloads without one
is now migration 0011, applied by the same boot Migrate call, so before
the job runner starts and before FailInterruptedGroundings.
TestUpgradeKeepsLegacyQueuedGrounding now upgrades from 0009 and from a
database with 0010 already recorded, each with a pending Regular and a
queued legacy job; both keep the dinner pending through the boot cleanup
and then ground it.
R2-A: The boot cleanup no longer fails archived dinners. Archiving stops a
running job and leaves the dinner pending, which the cleanup relabelled
failed with interrupted. TestRestartKeepsArchivedPendingDinner archives a
pending Regular while its job runs and checks the cleanup leaves it
pending with no error.
Maestro task 5037ff86-181d-448e-927b-c2fd2258a25d.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Grounding (F2–F5):
- Each ground_dinner job carries the dinner's new grounding_revision
(migration 0010). Renaming a pending Regular raises the revision, and a
job only grounds and writes a dinner still at its revision, so a queued
original job no longer grounds the new name or decides the outcome.
- Background grounding keeps a method, minutes or difficulty a member saved
while the Regular was pending, and fills only those left empty.
- Grounding by hand clears the pasted recipe_url, and link deduplication
uses the source_url of the attached recipe, else the pending link.
- Archived dinners are not grounded: the job checks before any search,
fetch or model call, and its final update requires an unarchived row.
Onboarding (F6, F7):
- Step 3 shows "Add Regulars" back to step 2 when the server refuses to
finish with fewer than three Regulars.
- Common picks are hidden by a copy of harness Normalize/Similar, checked
against the same shared cases as the Go code.
Docs (F8): ARCHITECTURE.md covers the three-Regular minimum, step-3
recovery, the grounding revision and the dedupe rules.
F1 was fixed in 1304487; its test now also asserts the old link is never
grounded and recipe_url stays cleared.
Maestro task 5037ff86-181d-448e-927b-c2fd2258a25d.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Regular added from a recipe link stores recipe_url, and its grounding job
grounds that link. Renaming the dinner while still pending kept the link, so
the job queued for the new name still attached the old link's recipe and
photo. UpdateDinner now sets recipe_url, and renaming a pending dinner
clears it: the fresh job grounds the new name by search, and the household
can give a link by hand to fix up the recipe if they want a specific one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A background grounding result now applies only while the dinner is still
pending under the normalized name the job searched: GroundPendingDinner and
FailPendingDinnerGrounding match normalized_name, so a rename makes the old
job's success or failure a no-op. Renaming a dinner still pending enqueues
a fresh grounding job for the new name; if that cannot be enqueued, the
dinner's grounding is failed so it is not left pending with no job.
Completing onboarding (PATCH /api/v1/settings/household with
onboarding_completed true) is refused with 400 invalid_settings until the
household has at least three Regulars (status regular; archived and Quest
log dinners do not count), and onboarding_completed_at is set only then.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>