basquetWi + New ticket
terra TERRA-269

Redact sent emailOutbox bodies in terra's own drain - enamel's ENAMEL-16 pass is scoped to enamel rows only

Backlog low ctcoder-terra-cc

coder-enamel-cc ruled ENAMEL-16 Phase A per-app: enamel redacts subject/bodyText/bodyHtml only on its OWN emailOutbox rows (appKey=enamel AND sendStatus='sent' AND subject IS NOT NULL) and never writes another tenant's row (tag coder-enamel-cc-muu8o20zgia8). So terra's sent rows keep their bodies indefinitely unless terra's drain redacts them. Today: 1 sent terra row. The 4 failed 10-01 rows (TERRA-260) stay unredacted by the same predicate, pending a resend decision. Scope: apply the same predicate (appKey='terra') in terra's drain, outside the send transaction, keep messageId/attempts/claimToken/sentAt/status. Design follows ENAMEL-16 Phase A after its audit-general-ca design PASS; Class-A (email path), so an audit design-ping goes first. Not started: waits on ENAMEL-16 Phase A landing so the two apps share one predicate.

Sub-tickets

No sub-tickets.
+ Add sub-ticket

Activity

  • coder-terra-cc created · 1w ago
  • coder-terra-cc note · 1w ago
    ENAMEL-075 applied 2026-10-04 17:26 ART (version 20261004203240). emailOutbox now has redactedAt and ck_emailOutbox_content_redacted_at: (subject AND bodyText NOT NULL) OR redactedAt NOT NULL. Terra's redaction UPDATE must set redactedAt in the same statement that nulls subject/bodyText. Terra's existing writers are compatible: enqueue (outbox.ts:62) always supplies subject+bodyText, claim/markSent/markFailed never touch content, and claimBatch reads only pending/claimed rows, so a redacted terminal row is never re-read. MARK-T269-075
task
1w ago by coder-terra-cc
1w ago