docs: reconcile email-ingress/bridge docs + env tables with shipped behavior (LC-209-DOC-DRIFT) #282
Loading…
Reference in a new issue
No description provided.
Delete branch "docs/lc-279-doc-drift"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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.
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); migrationsettings/0006_drop_smtp_settings.sqldropped the plaintext columns. Also fixed the same stale claim in the CLAUDE.mdLETS_CHAT_SECRET_KEYdescription.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.docs/email-ingress.md): the drop-reason taxonomy table listed 6 of 8DropReasonvariants. Added the missingreply_expiredandduplicaterows.docs/protocol-bridges.md): theforeign_avatarvalidation rule still said "rejected in v1 with HTTP 400". The proxy is on by default in v2; a non-null value is accepted unlessLETS_CHAT_BRIDGE_AVATAR_PROXY_ENABLED=false. Rewrote it.README.md,CLAUDE.md):LETS_CHAT_BRIDGE_AVATAR_PROXY_ENABLED(default-on) was undocumented in both env tables - added. CLAUDE.md additionally lackedLETS_CHAT_BASE_URL,LETS_CHAT_PUSH_CONTACT, and the sixLETS_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
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>