Repository navigation
fix(plugin-email): the Send test email refusals name what the admin does on the page, not a request body - #25453
Conversation
…p, not a REST body The three mail/test recipient refusals told the admin to pass "to" in the request body; the mail settings page has no recipient field. Each now says nothing was sent and what to do on the page. The `to` override is documented in resolveMailTestRecipient's TSDoc for API callers. Pins added per refusal. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016g7nYP9wdNx1GDa5XDr7Uy
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run. What this run could not see
Coarse fallback — 6 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin af714fb869449ace29788f1c83bb11355770d182 && git checkout af714fb869449ace29788f1c83bb11355770d182
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin b9c7a8f541a0af1ec82cabad8c9aaab65de895c1 7d5d64976d52e2ab85888d5bd42ca5abe49fb5ed && git checkout -B drift-repro b9c7a8f541a0af1ec82cabad8c9aaab65de895c1 && git merge --no-ff 7d5d64976d52e2ab85888d5bd42ca5abe49fb5ed
node scripts/docs-audit/affected-docs.mjs --json b9c7a8f541a0af1ec82cabad8c9aaab65de895c1 |
席位核对 · ACCEPT · 2026-10-23T14:55Z
Generated by Claude Code |
Requested by Sales · project thread
Fixes #25424
Clause-②: no
Metadata-protocol: none
What
Setup → Email → Send test email sends to the signed-in admin's own address. When it cannot, three refusals in
resolveMailTestRecipient(packages/plugins/plugin-email/src/email-plugin.ts) told the admin to pass "to" in the request body. The mail settings page has no recipient field, so the admin could not follow that advice from the page.Each refusal now keeps its opening and its "nothing was sent", and names what the admin does on the page. The wording follows the SMS twin in #25421 (
resolveSmsTestRecipient):No recipient — nothing was sent.Could not read your account's email address …Your account has no email address …A
toin the request body still wins, as before. The override is now documented only in the function's TSDoc, for API callers.No route, response shape, status or code changes. Only the message text changes.
Landing
email-plugin.ts. The live-status registration (open PR feat(settings,plugin-email): state the live mail transport on Setup → Email #25448) and theprovider === 'log'branch are untouched.pass "to",in the request body,to name a recipient,Add an email address to your account,carries no signed-in): the only hits were the three refusals themselves. No doc, pin or other package quoted them.content/docshas no copy of them.packages/*/CHANGELOG.mdis release-owned and was not searched for edits.Tests
describe('served mail/test — the recipient refusals are admin copy')inmail-test-recipient.pin.test.ts. It drives the servedPOST /api/settings/mail/testdoor (realSettingsService, real routes, real handler). Each case asserts the following:400+SETTINGS_ACTION_FAILEDenvelope;nothing was sentandSend test emailare present;/api/, norequest bodyand nopass "to";sendMailwas never called.pnpm --filter @objectstack/plugin-email test: Test Files 36 passed (36), Tests 675 passed (675).pnpm --filter @objectstack/plugin-email typecheck(tsc + check:test-typecheck): exit 0. Lock VERDICT command-exit 0 for both.scripts/ablation-replace.mjs). The failed-read remedy was put back to the oldPass "to" in the request body to name a recipient.text, and the mutation landed (anchor 1 -> 0). Result:a failed account readwent red with Tests 1 failed | 9 passed (10). The file was restored (blob == HEAD,git diff HEADempty).Acceptance notes
🤖 Generated with Claude Code
https://claude.ai/code/session_016g7nYP9wdNx1GDa5XDr7Uy