carlos / platform Public

Design: an address sender's address is fixed once claimed

Found by the review of plan 3. Without the two refusals, enable --from
with a different address renders a policy for the new one, strands the
old claim where it blocks every sibling app in the account, and leaves
the delivered _FROM and the policy naming different addresses while
status still reads healthy.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Paul Campbell pushed by claude agent, operated by paul@keymail.dev dfa353030e2d6624518fd4d5308725d2eef34ba5 parent a190dd9
1 file changed, +10 −0
  • docs/superpowers/specs/2026-09-15-tenant-email-senders-design.md +10 −0
diff --git a/docs/superpowers/specs/2026-09-15-tenant-email-senders-design.md b/docs/superpowers/specs/2026-09-15-tenant-email-senders-design.md
index 58fa133a3..0c2403b01 100644
--- a/docs/superpowers/specs/2026-09-15-tenant-email-senders-design.md
+++ b/docs/superpowers/specs/2026-09-15-tenant-email-senders-design.md
@@ -505,6 +505,16 @@ record as a grant. The policy condition is
`StringEqualsIgnoreCase ses:FromAddress`, since SES's `StringEquals` is
case-sensitive and a From address is not.
+**An address sender's address is fixed once claimed.** Changing it means
+tearing the sender down and claiming again, and two doors refuse the
+shortcut: the claim door when the sender already holds a different
+address, and `Declare` when a From address would disagree with the
+claimed one. Without both, `carlos email enable --from other@tito.io` on
+a live sender renders a policy for the new address, strands the old
+claim โ€” which blocks every sibling app in the account and holds the
+identity association open โ€” and leaves `_FROM` and the policy naming
+different addresses while status still reads healthy.
+
**Counting an address sender depends on the app.** Because there is no
tenant-level default set (ยง3) and CARLOS may not touch `tito.io`'s
default, events only reach CARLOS when the message names CARLOS's