Follow-up to #538 / #540, gated on basecamp/basecamp-sdk#355 (and the broader merge-safe update work planned there).
#540 shipped an interim mitigation: because the SDK's Todo model drops completion_subscribers in todoFromGenerated, todos update preserves subscribers via a raw GET of the flat /todos/{id}.json route (completionSubscriberIDs in internal/commands/todos.go), failing closed before any PUT.
Once the CLI bumps to an SDK release where the Todo model carries CompletionSubscribers (and ideally a merge-safe Update/Edit):
- Delete
completionSubscriberIDs and both preservation call sites (typed-merge and raw-clear branches).
- Source subscribers from
existingTodo like every other preserved field — or collapse the whole update onto the SDK's Edit if available.
- Keep everything else:
--notify-on-completion / --no-notify-on-completion, resolveCompletionSubscriberIDs, set/clear semantics (clear-by-omission), tests, SKILL.md docs, and the smoke scenario. The preservation tests must stay green across the swap — they are the regression net for the plumbing change.
Follow-up to #538 / #540, gated on basecamp/basecamp-sdk#355 (and the broader merge-safe update work planned there).
#540 shipped an interim mitigation: because the SDK's
Todomodel dropscompletion_subscribersintodoFromGenerated,todos updatepreserves subscribers via a raw GET of the flat/todos/{id}.jsonroute (completionSubscriberIDsininternal/commands/todos.go), failing closed before any PUT.Once the CLI bumps to an SDK release where the
Todomodel carriesCompletionSubscribers(and ideally a merge-safeUpdate/Edit):completionSubscriberIDsand both preservation call sites (typed-merge and raw-clear branches).existingTodolike every other preserved field — or collapse the whole update onto the SDK'sEditif available.--notify-on-completion/--no-notify-on-completion,resolveCompletionSubscriberIDs, set/clear semantics (clear-by-omission), tests, SKILL.md docs, and the smoke scenario. The preservation tests must stay green across the swap — they are the regression net for the plumbing change.