docs: reconcile email-ingress/bridge docs + env tables with shipped behavior (LC-209-DOC-DRIFT) #282

Merged
longjacksonle merged 1 commit from docs/lc-279-doc-drift into main 2026-05-31 04:35:49 +02:00

Closes #279 (LC-209-DOC-DRIFT). The LC-77 / LC-78 / LC-77-SMTP-SEAL arc shipped behavior that invalidated several operator-facing doc claims. Each fix is confirmed against current code. Docs-only - no code, no migrations.

  • D1 (docs/email-ingress.md): removed the wrong "SMTP password is currently stored plaintext" security claim. SMTP is env-var-only now (LETS_CHAT_SMTP_*, Mailer::from_env); migration settings/0006_drop_smtp_settings.sql dropped the plaintext columns. Also fixed the same stale claim in the CLAUDE.md LETS_CHAT_SECRET_KEY description.
  • D2 (docs/email-ingress.md): reply-by-email was described as "deferred / stage 2" in two places while the rest of the doc says it shipped (#201). Both corrected to point at the shipped "Reply-by-email" section.
  • D3 (docs/email-ingress.md): the drop-reason taxonomy table listed 6 of 8 DropReason variants. Added the missing reply_expired and duplicate rows.
  • D4 (docs/protocol-bridges.md): the foreign_avatar validation rule still said "rejected in v1 with HTTP 400". The proxy is on by default in v2; a non-null value is accepted unless LETS_CHAT_BRIDGE_AVATAR_PROXY_ENABLED=false. Rewrote it.
  • D5 (README.md, CLAUDE.md): LETS_CHAT_BRIDGE_AVATAR_PROXY_ENABLED (default-on) was undocumented in both env tables - added. CLAUDE.md additionally lacked LETS_CHAT_BASE_URL, LETS_CHAT_PUSH_CONTACT, and the six LETS_CHAT_SMTP_* vars (README had them) - backfilled.

Migration files untouched (LC-212 immutability rule); D1's corrected posture lives in the doc + env-table prose, not the historic migration. No [operator-action] marker: this corrects documentation, it does not change behavior.

🤖 Generated with Claude Code

Closes #279 (LC-209-DOC-DRIFT). The LC-77 / LC-78 / LC-77-SMTP-SEAL arc shipped behavior that invalidated several operator-facing doc claims. Each fix is confirmed against current code. Docs-only - no code, no migrations. - **D1** (`docs/email-ingress.md`): removed the wrong "SMTP password is currently stored plaintext" security claim. SMTP is env-var-only now (`LETS_CHAT_SMTP_*`, `Mailer::from_env`); migration `settings/0006_drop_smtp_settings.sql` dropped the plaintext columns. Also fixed the same stale claim in the CLAUDE.md `LETS_CHAT_SECRET_KEY` description. - **D2** (`docs/email-ingress.md`): reply-by-email was described as "deferred / stage 2" in two places while the rest of the doc says it shipped (#201). Both corrected to point at the shipped "Reply-by-email" section. - **D3** (`docs/email-ingress.md`): the drop-reason taxonomy table listed 6 of 8 `DropReason` variants. Added the missing `reply_expired` and `duplicate` rows. - **D4** (`docs/protocol-bridges.md`): the `foreign_avatar` validation rule still said "rejected in v1 with HTTP 400". The proxy is on by default in v2; a non-null value is accepted unless `LETS_CHAT_BRIDGE_AVATAR_PROXY_ENABLED=false`. Rewrote it. - **D5** (`README.md`, `CLAUDE.md`): `LETS_CHAT_BRIDGE_AVATAR_PROXY_ENABLED` (default-on) was undocumented in both env tables - added. CLAUDE.md additionally lacked `LETS_CHAT_BASE_URL`, `LETS_CHAT_PUSH_CONTACT`, and the six `LETS_CHAT_SMTP_*` vars (README had them) - backfilled. Migration files untouched (LC-212 immutability rule); D1's corrected posture lives in the doc + env-table prose, not the historic migration. No `[operator-action]` marker: this corrects documentation, it does not change behavior. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
docs: reconcile email-ingress/bridge docs + env tables with shipped behavior (LC-209-DOC-DRIFT, #279)
All checks were successful
check-secrets / Nosey parker (push) Successful in 3s
check-secrets / TruffleHog (push) Successful in 5s
check-secrets / Kingfisher (push) Successful in 7s
check-secrets / Nosey parker (pull_request) Successful in 6s
check-secrets / Kingfisher (pull_request) Successful in 8s
check-secrets / TruffleHog (pull_request) Successful in 8s
Create release / Create release from merged PR (pull_request) Has been skipped
Check / clippy + fmt + tests (pull_request) Successful in 3m56s
9a0e1e4de6
The LC-77 / LC-78 / LC-77-SMTP-SEAL arc shipped behavior that invalidated several operator-facing doc claims. Each fix below is confirmed against current code; docs-only, no code change.

D1: docs/email-ingress.md said the SMTP password "is currently stored plaintext" (tracked as LC-77-SMTP-SEAL). That ticket shipped: SMTP is env-var-only (`LETS_CHAT_SMTP_*`, `Mailer::from_env`) and migration `settings/0006_drop_smtp_settings.sql` dropped the plaintext columns. Rewrote the bullet to the env-only posture; also fixed the same stale claim in the CLAUDE.md `LETS_CHAT_SECRET_KEY` description ("encrypting SMTP password in settings").

D2: docs/email-ingress.md contradicted itself on reply-by-email - lines 13 and 108 called it "deferred / stage 2" while the header and the Reply-by-email section say it shipped (#201). Corrected both stale sentences to point at the shipped section.

D3: the drop-reason taxonomy table listed 6 of the 8 `DropReason` variants. Added the missing `reply_expired` and `duplicate` rows (the latter was described in prose but not the table).

D4: docs/protocol-bridges.md said `foreign_avatar` "must be absent or null in v1; any non-null value is rejected with HTTP 400". The avatar proxy is on by default in v2 (`routes::api`, `bridge_avatar::proxy_enabled`): a non-null value is accepted unless `LETS_CHAT_BRIDGE_AVATAR_PROXY_ENABLED=false`. Rewrote the validation rule for the v2 default-on behavior.

D5: `LETS_CHAT_BRIDGE_AVATAR_PROXY_ENABLED` (default-on, read by `bridge_avatar::proxy_enabled`) was undocumented in both env tables - added it to README and CLAUDE.md. CLAUDE.md was additionally missing `LETS_CHAT_BASE_URL`, `LETS_CHAT_PUSH_CONTACT`, and the six `LETS_CHAT_SMTP_*` vars (README already had those); backfilled them.

Migration files are untouched (LC-212 immutability); D1's posture note lives in the doc and the env-table prose, not the historic migration.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
longjacksonle deleted branch docs/lc-279-doc-drift 2026-05-31 04:35:49 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
psa-systems/lets-chat!282
No description provided.