Maestro task f0cd9d50-9c11-41be-a945-7bae9f5f28a4. Wires notify.Emit at the plan-draft, list-generation and suggestion-batch call sites (replenish excluded), plus POST /shopping/{weekStart}/send-chat with idempotency/resend and the shopping screen button. See the task done-condition and the developer report on the PR.
Maestro task f0cd9d50-9c11-41be-a945-7bae9f5f28a4. Wires notify.Emit at the plan-draft, list-generation and suggestion-batch call sites (replenish excluded), plus POST /shopping/{weekStart}/send-chat with idempotency/resend and the shopping screen button. See the task done-condition and the developer report on the PR.
Connect the features to the notification outbox so real events notify,
each stored by the new notify.EmitTx in the transaction of the change it
is about (Wake after commit):
- plan_ready:{weekStart} (/plan) when a draft job stores the AI's draft;
a redraft shares the key and a manual swap never emits. The title reads
"Next week's plan is ready" for the coming week.
- list_ready:{weekStart} (/plan/shopping) when a week's Supply run is
first created, by generate or after Push to Calendar.
- new_suggestions:{batchId} (/discover) when a scheduled or manual batch
ends done with cards; replenish batches never notify.
- plan.Service.EmitDayOfReminder(date) emits day_of_reminder:{date} for
the Feature 20 scheduler.
Add POST /api/v1/shopping/{weekStart}/send-chat: shopping.SendToChat posts
the dinners with needed items and a link through chat.PostSupplyRun,
records sent_to_chat_at, and is idempotent per week unless
{"resend": true}. The Supply run's Send to Google Chat button calls it
("Send again" once sent) and shows failures in an ErrorBanner; the unused
Unavailable placeholder is removed.
Task: f0cd9d50-9c11-41be-a945-7bae9f5f28a4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MQ-167-01: a scheduled or manual batch now emits new_suggestions:{batchId}
in the transaction that first stores its Side quests, so the cards and
their notification commit together. A later round that fails, or a
failure recording the batch's end, no longer loses the event; a later
round's emit is a no-op by key; a notification that cannot be stored
fails that store, leaving no unannounced cards. Replenish batches still
never notify. finishBatch goes back to recording status only.
MQ-167-02: migration 0017 adds shopping_lists.chat_send_unconfirmed_at.
SendToChat records the send as begun before posting, clears it with
sent_to_chat_at once Google Chat accepts, and clears it alone when Chat
refuses. A post Chat does not answer, or one it accepts that cannot be
recorded, is ErrSendUnconfirmed (502 chat_unconfirmed, not retryable)
and leaves the marker, as does a crash mid-send; a repeat without resend
never reposts, and resend posts again. The Supply run screen re-reads
the list after a failed send, shows an unconfirmed send, offers no Retry
for it, and sends again only with resend.
Task: f0cd9d50-9c11-41be-a945-7bae9f5f28a4
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 f0cd9d50-9c11-41be-a945-7bae9f5f28a4. Wires notify.Emit at the plan-draft, list-generation and suggestion-batch call sites (replenish excluded), plus POST /shopping/{weekStart}/send-chat with idempotency/resend and the shopping screen button. See the task done-condition and the developer report on the PR.
Connect the features to the notification outbox so real events notify, each stored by the new notify.EmitTx in the transaction of the change it is about (Wake after commit): - plan_ready:{weekStart} (/plan) when a draft job stores the AI's draft; a redraft shares the key and a manual swap never emits. The title reads "Next week's plan is ready" for the coming week. - list_ready:{weekStart} (/plan/shopping) when a week's Supply run is first created, by generate or after Push to Calendar. - new_suggestions:{batchId} (/discover) when a scheduled or manual batch ends done with cards; replenish batches never notify. - plan.Service.EmitDayOfReminder(date) emits day_of_reminder:{date} for the Feature 20 scheduler. Add POST /api/v1/shopping/{weekStart}/send-chat: shopping.SendToChat posts the dinners with needed items and a link through chat.PostSupplyRun, records sent_to_chat_at, and is idempotent per week unless {"resend": true}. The Supply run's Send to Google Chat button calls it ("Send again" once sent) and shows failures in an ErrorBanner; the unused Unavailable placeholder is removed. Task: f0cd9d50-9c11-41be-a945-7bae9f5f28a4 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
MQ-167-01: a scheduled or manual batch now emits new_suggestions:{batchId} in the transaction that first stores its Side quests, so the cards and their notification commit together. A later round that fails, or a failure recording the batch's end, no longer loses the event; a later round's emit is a no-op by key; a notification that cannot be stored fails that store, leaving no unannounced cards. Replenish batches still never notify. finishBatch goes back to recording status only. MQ-167-02: migration 0017 adds shopping_lists.chat_send_unconfirmed_at. SendToChat records the send as begun before posting, clears it with sent_to_chat_at once Google Chat accepts, and clears it alone when Chat refuses. A post Chat does not answer, or one it accepts that cannot be recorded, is ErrSendUnconfirmed (502 chat_unconfirmed, not retryable) and leaves the marker, as does a crash mid-send; a repeat without resend never reposts, and resend posts again. The Supply run screen re-reads the list after a failed send, shows an unconfirmed send, offers no Retry for it, and sends again only with resend. Task: f0cd9d50-9c11-41be-a945-7bae9f5f28a4 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>Independent Codex gpt-6-sol review: APPROVED for this exact commit.