Skip to content

fix(migrate-email): collect before-cutover plan notes in Step 9 - #525

Open
Silthus wants to merge 9 commits into
mainfrom
fix/migrate-email-before-cutover-notes
Open

Silthus wants to merge 9 commits into
mainfrom
fix/migrate-email-before-cutover-notes

Conversation

@Silthus

@Silthus Silthus commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Problem

Step 9's "Before cutover" list collects "each item a rewrite file says to note for this list". A provider's mapping.md or account.md can ask for such an item too, such as a check that must happen before the deploy, but nothing told the agent to keep it until Step 9. Such an item could slip out of the report.

Note

🔵 Merge risk: low, 🟡 at full use · two-way door until the next context-mill release ships the skill; one-way once agents run it, since a run's report and plan stay with each app

  • A run where a provider file or a rewrite file asks for a "Before cutover" item: on the base, the agent kept it only from a rewrite file and in no fixed form; at HEAD it writes the item as a plan note that starts with before cutover:, and Step 9 lists every such note in "Before cutover" and leaves it out of the sites-table notes. Today this covers PHP's ext-curl note; the provider lanes not yet on main, such as Postmark, use the same prefix. A note whose install Step 7 undoes is deleted, so the report never lists it.
  • A run where no site is left in a language during Step 7's "Set up the SDK": on the base the agent undid only that SDK's install or upgrade; at HEAD it also undoes the other changes that SDK's "Install" made, such as the ext-curl line in composer.json, and deletes the before cutover: notes it wrote. A later per-site undo keeps the SDK, as on the base. Uncovered until a live run: an agent that misreads which lines its install added could remove a line the app had before, such as its own ext-curl requirement, so a deploy where the extension is missing no longer fails at install.
  • A run where PostHog's import tool is missing: on the base, Step 5 and the report told the person to add the provider's addresses by hand on PostHog's Suppression list page, which adds only a manual entry that blocks marketing email, so moved sends still reached bounced addresses. At HEAD they say so, and Step 5 asks which moving sites rely on the provider's list to skip bounced addresses and keeps them on the provider; no answer keeps every moving site. Uncovered until a live run: a wrong answer moves a site that relied on the list.
  • Every other skill is unchanged: the shadow diff shows only five migrate-email-resend reference files and manifest.json change. Uncovered until a live run: an agent that skips the note loses the item, as on the base.
  • Tier: critical: the migrate-email skill changes how apps send transactional email, the critical path of email delivery; this diff changes only which items its report lists before cutover.
  • Switch-off: none: text-only skill change, live for agents once released; fix forward.

Rollout

Changes

  • 3-inventory.md, under "Write the plan file": in any step, when the provider's mapping.md or account.md, or a rewrite file, says to note something for "Before cutover", write it under the sites table as a note that starts with before cutover:.
  • 9-report.md: "Before cutover" lists each plan note that starts with before cutover:, in place of each item a rewrite file says to note. The sites-table notes section leaves those notes out, so each item shows once.
  • rewrite-php.md: the ext-curl item is written in that form.
  • 5-suppressions.md and 9-report.md, when the import tool is missing: they no longer tell the person to add the addresses by hand on PostHog's Suppression list page. That page adds only a manual entry (add_manual_suppression), which blocks marketing email but not a transactional send. Step 5 asks which moving sites rely on the provider's list to skip bounced addresses and keeps them, with Step 3's reason relies on <provider name>'s suppression list and a note that the import, once available, lets them move. It asks only outside a re-import, and only when the provider's list has entries; an empty list ticks as empty list: no import tool; the report says the addresses can't reach PostHog until the import tool is available.
  • 7-rewrite.md: when no site is left in a language, Step 7 undoes the SDK install with the other changes its rewrite file's "Install" made, such as ext-curl in composer.json, and deletes the before cutover: notes it wrote. A later per-site undo keeps the SDK installed, as on the base, since the email client already imports it; its note stays true.

How it was tested

  • The lane gate on a14b591: vitest run scripts, 342 tests, and node scripts/build.js pass, with a clean tree after the build. The existing test that every "Step N says under" pointer names a real section still passes.
  • Shadow diff from main (8cd7381) to a14b591: only migrate-email-resend/references/3-inventory.md, 5-suppressions.md, 7-rewrite.md, 9-report.md, rewrite-php.md and manifest.json change; every other bundle is byte-identical. Saved in proof storage.
Agent context
Question Answer Who Where
Marker for a provider's before-cutover item The before cutover: plan-note prefix the Postmark lane already uses 🤖 Agent conductor relay, 2026-11-13
Where it goes A follow-up PR off main after #472 merged, in place of a change on #472 👤 Human conductor relay, 2026-11-13

Involvement: no grilling rounds, no prototypes. Review round 1 and final reads 1 to 8 (two lenses, two families each), every finding fixed or declined with a reason; ReviewHog on every head, all clean. Michael accepted the live-run gap and, when it fails only on that gap, the quality-judge gap on 2026-11-14. Proof captured: shadow diff; live run owed with the migrate-email skill's planned trial.

🤖 Generated with Claude Code

A provider's mapping.md or account.md, or a rewrite file, can ask for an item
on the report's "Before cutover" list. Such items now go into the plan as
notes that start with `before cutover:`, and Step 9 lists each one there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

🧙 Wizard CI

Run the Wizard CI and test your changes against wizard-workbench example apps by replying with a GitHub comment using one of the following commands:

Test all apps:

  • /wizard-ci all

Test all apps in a directory:

  • /wizard-ci ai-observability
  • /wizard-ci basic-integration
  • /wizard-ci feature-flags
  • /wizard-ci mcp-analytics
  • /wizard-ci replay-vision
  • /wizard-ci revenue
  • /wizard-ci self-driving
  • /wizard-ci warehouse
  • /wizard-ci warehouse-seeded

Test an individual app:

  • /wizard-ci ai-observability/anthropic
  • /wizard-ci ai-observability/google-adk
  • /wizard-ci ai-observability/groq
Show more apps
  • /wizard-ci ai-observability/manual-capture
  • /wizard-ci ai-observability/openai
  • /wizard-ci ai-observability/openai-agents
  • /wizard-ci ai-observability/opentelemetry
  • /wizard-ci ai-observability/vercel-ai
  • /wizard-ci basic-integration/android
  • /wizard-ci basic-integration/angular
  • /wizard-ci basic-integration/astro
  • /wizard-ci basic-integration/django
  • /wizard-ci basic-integration/fastapi
  • /wizard-ci basic-integration/flask
  • /wizard-ci basic-integration/flutter
  • /wizard-ci basic-integration/javascript-node
  • /wizard-ci basic-integration/javascript-web
  • /wizard-ci basic-integration/laravel
  • /wizard-ci basic-integration/next-js
  • /wizard-ci basic-integration/nuxt
  • /wizard-ci basic-integration/python
  • /wizard-ci basic-integration/rails
  • /wizard-ci basic-integration/react-native
  • /wizard-ci basic-integration/react-router
  • /wizard-ci basic-integration/sveltekit
  • /wizard-ci basic-integration/swift
  • /wizard-ci basic-integration/tanstack-router
  • /wizard-ci basic-integration/tanstack-start
  • /wizard-ci basic-integration/vue
  • /wizard-ci feature-flags/django
  • /wizard-ci feature-flags/next-js
  • /wizard-ci mcp-analytics/custom-dispatcher
  • /wizard-ci mcp-analytics/go-sdk
  • /wizard-ci mcp-analytics/python-sdk
  • /wizard-ci mcp-analytics/ruby-sdk
  • /wizard-ci mcp-analytics/rust-sdk
  • /wizard-ci mcp-analytics/typescript-sdk
  • /wizard-ci replay-vision/javascript-node
  • /wizard-ci replay-vision/next-js
  • /wizard-ci replay-vision/react-vite
  • /wizard-ci revenue/stripe
  • /wizard-ci self-driving/astro
  • /wizard-ci self-driving/fastapi
  • /wizard-ci self-driving/nuxt
  • /wizard-ci self-driving/react-router
  • /wizard-ci self-driving/sveltekit
  • /wizard-ci warehouse/monorepo-env
  • /wizard-ci warehouse/multi-source-next
  • /wizard-ci warehouse/stripe-node
  • /wizard-ci warehouse/zero-source
  • /wizard-ci warehouse-seeded/next-stripe
  • /wizard-ci warehouse-seeded/next-stripe-declined

Test against a wizard branch:

  • /wizard-ci all wizard:my-branch

Add wizard:<branch> to any command above to pin the wizard branch. It defaults to main.

Results will be posted here when complete.

@posthog posthog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PostHog Review · Standard · reviewed 826f0f6: no findings.

…undone

When no site is left in a language, Step 7 undoes the SDK install with the
other changes its rewrite file's Install made, and deletes the notes it wrote,
so Step 9 never lists a stale item.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@posthog posthog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PostHog Review · Standard · reviewed 10e86b6: no findings.

A site's undo runs after the email client module exists, so removing the SDK
there would break the build. That path keeps the install, and its
before-cutover note stays true.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@posthog posthog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PostHog Review · Standard · reviewed ee9437e: no findings.

…note

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@posthog posthog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PostHog Review · Standard · reviewed 463e9dd: no findings.

…d sends

PostHog's Suppression list page adds an address only as a manual entry,
which blocks marketing email but not a transactional send. When the import
tool is missing, Step 5 and the report now say so, and Step 5 keeps the
sites that rely on the provider's list to skip bounced addresses, with
Step 3's reason.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@posthog posthog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PostHog Review · Standard · reviewed 3a08ccd: no findings.

The question that keeps sites comes before "continue to the next step", its
note names the import as the way to move, and the inventory count follows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@posthog posthog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PostHog Review · Standard · reviewed ea0e892: no findings.

Silthus and others added 3 commits November 14, 2026 19:24
… re-import

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s missing

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@posthog posthog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PostHog Review · Standard · reviewed a14b591: no findings.

@Silthus
Silthus marked this pull request as ready for review November 14, 2026 19:43
@Silthus
Silthus requested a review from a team as a code owner November 14, 2026 19:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant