Integration fix 2: conditional recipe repairs and no pasted links in logs (Feature 12 review F1, F2) #96

Member

Maestro task: 8741cedb-1849-4e3f-8d05-f5648c77c7ee
Base: feature/2066f34b-5804-410a-859b-f87021a8ae6c-regular-dinners-onboarding

Fixes the independent Codex feature review of PR #94 at cc7875c (CHANGES_REQUIRED).
Commits authored by dev_agent (Claude Code, isolated worktree); this PR record was opened by
orchestrator-agent because the developer session has no non-owner Gitea identity.

F1 (HIGH), repair write race:

  • GroundDinner now writes only an unarchived dinner whose normalized_name,
    grounding_status, grounding_revision and recipe_id still match what the repair read
    before grounding.
  • A dinner renamed or grounded some other way meanwhile -> 409 ground_conflict.
  • A dinner archived, before or during the repair -> 409 dinner_archived. Manual repairs
    reject archived dinners too.
  • In each case the dinner is left unchanged.
  • Tests: TestFixInFlightWhenDinnerChanges (repair held at fetch while the dinner is renamed
    / archived / grounded by hand), TestFixArchivedDinner, TestPostGroundArchived.

F2 (MEDIUM), URL in logs:

  • Hand-grounding failures wrap dinners.ErrGroundFailed; the API logs these as
    reason=ground_failed with dinner_id only, never the pasted link or dependency error text.
  • GroundURL no longer formats the link into its error.
  • Test: TestPostGroundViaRecipeURLStorageFailure (storage failure on a link carrying
    ?access_token=...; the response and logs contain neither the token, the host nor the
    storage error).

Done-condition: both findings fixed with tests that fail at cc7875c and pass here.

Checks: gofmt clean, go vet, go test -race -count=1 ./..., CGO_ENABLED=0 go build ./...,
make sqlc-check, web typecheck/test (533)/build - all passing.

Maestro task: `8741cedb-1849-4e3f-8d05-f5648c77c7ee` Base: `feature/2066f34b-5804-410a-859b-f87021a8ae6c-regular-dinners-onboarding` Fixes the independent Codex feature review of PR #94 at `cc7875c` (CHANGES_REQUIRED). Commits authored by dev_agent (Claude Code, isolated worktree); this PR record was opened by orchestrator-agent because the developer session has no non-owner Gitea identity. F1 (HIGH), repair write race: - `GroundDinner` now writes only an unarchived dinner whose `normalized_name`, `grounding_status`, `grounding_revision` and `recipe_id` still match what the repair read before grounding. - A dinner renamed or grounded some other way meanwhile -> 409 `ground_conflict`. - A dinner archived, before or during the repair -> 409 `dinner_archived`. Manual repairs reject archived dinners too. - In each case the dinner is left unchanged. - Tests: `TestFixInFlightWhenDinnerChanges` (repair held at fetch while the dinner is renamed / archived / grounded by hand), `TestFixArchivedDinner`, `TestPostGroundArchived`. F2 (MEDIUM), URL in logs: - Hand-grounding failures wrap `dinners.ErrGroundFailed`; the API logs these as `reason=ground_failed` with `dinner_id` only, never the pasted link or dependency error text. - `GroundURL` no longer formats the link into its error. - Test: `TestPostGroundViaRecipeURLStorageFailure` (storage failure on a link carrying `?access_token=...`; the response and logs contain neither the token, the host nor the storage error). Done-condition: both findings fixed with tests that fail at `cc7875c` and pass here. Checks: gofmt clean, `go vet`, `go test -race -count=1 ./...`, `CGO_ENABLED=0 go build ./...`, `make sqlc-check`, web typecheck/test (533)/build - all passing.
orchestrator-agent added 1 commit 2026-10-06 20:04:10 -04:00
Make recipe repairs conditional and keep pasted links out of logs
CI / ci (push) Successful in 2m34s
CI / ci (pull_request) Successful in 2m30s
5c4c507ee6
F1: A candidate or link repair now writes the dinner only if it is still
unarchived and as observed before grounding (normalized_name,
grounding_status, grounding_revision and recipe_id). A dinner renamed or
grounded some other way meanwhile is ErrGroundConflict (409
ground_conflict); one archived, before or during the repair, is
ErrArchived (409 dinner_archived). Manual repairs reject archived dinners
too.

F2: Any failure grounding a candidate or link by hand wraps
ErrGroundFailed, which the API logs as reason=ground_failed with the
dinner id only, never the pasted link or dependency error text.
GroundURL no longer formats the link into its error.

Maestro task 8741cedb-1849-4e3f-8d05-f5648c77c7ee.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
review_agent requested changes 2026-10-06 20:08:14 -04:00
Dismissed
review_agent left a comment
Member

Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.

Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
overseer added 1 commit 2026-10-06 20:11:35 -04:00
Guard recipe repairs against same-normalized renames and member edits
CI / ci (push) Successful in 2m41s
CI / ci (pull_request) Successful in 2m31s
1dd53767f7
F1-1: GroundDinner also compares the observed raw name, so renaming
"Grandma's stew" to "Easy Grandma's stew" (same normalized_name) while a
link is grounding is ErrGroundConflict, not attached to the renamed
dinner.

F1-2: A method, minutes_total or difficulty no longer as observed before
grounding is kept over the recipe's value, as GroundPendingDinner keeps
values a member set while a dinner was pending.

F2-1: Failing to record a grounded candidate or link on the dinner (or to
read it back after a rejected write) wraps ErrGroundFailed, so the API
logs reason=ground_failed with the dinner id, never the database error.

Maestro task 8741cedb-1849-4e3f-8d05-f5648c77c7ee.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
review_agent requested changes 2026-10-06 20:17:19 -04:00
Dismissed
review_agent left a comment
Member

Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.

Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
overseer added 1 commit 2026-10-06 20:21:14 -04:00
Log every unexpected recipe grounding failure by fixed reason
CI / ci (push) Successful in 2m41s
CI / ci (pull_request) Successful in 2m23s
82f8f668bf
Wrap an initial dinner read failure on the candidate and link path, and
any manual-recipe read, store or write failure, in ErrGroundFailed so the
handler logs only reason=ground_failed and the dinner id, never database
text. Not-found, archived and conflict answers stay distinct.

Strengthen TestFixInFlightKeepsMemberEdits: start from populated method,
minutes and difficulty, edit each in flight in turn, and require the edit
kept and the untouched populated fields replaced by the recipe's values.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
review_agent left a comment
Member

Independent Codex gpt-6-sol review: APPROVED for this exact commit.

Independent Codex gpt-6-sol review: APPROVED for this exact commit.
approver_agent merged commit 5dff7825d8 into feature/2066f34b-5804-410a-859b-f87021a8ae6c-regular-dinners-onboarding 2026-10-06 20:26:57 -04:00
Sign in to join this conversation.
No Reviewers
No labels
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Maniacs_Mansion/MealQuest#96