Restore reliable signup, local activation-email delivery and recovery after local service restarts, with actionable diagnostics that exclude credentials and signup data.
Approach
Correct Sendico registration receipt handling (HTTP 201; Facts intake remains HTTP 200), preserve non-idempotent registration protection, and recover the original pending signup against its verified existing subject. Keep the activation-email subscription alive beyond bounded startup provisioning.
Use an owned SMTP adapter for the selected Sendico mailbox no-reply@sendico.io at mail.sendico.io:465, verified implicit TLS and bounded timeout. Store only the password in SXCHNGE Vault services/notifications/email/smtp; retain endpoint/sender settings in YAML. Log bounded redacted provider status/type/message diagnostics once at the worker boundary.
Reap orphaned frontend HTTPS probe children with Compose init. Recover the Sendico session when a BFF restart leaves it in the old network namespace: three consecutive bounded DNS failures restart the session container into the current namespace, with clear secret-free recovery logging. Pair BFF/session recreation in bootstrap and rotation tooling, declare Compose dependency restart, and clean up child processes on exit.
Acceptance criteria
HTTP 201 registration receipts succeed; malformed/upstream failures remain safe and no duplicate individual registration is introduced.
Original pending signup is bound to its verified existing subject and persisted Facts receipt; confirmation remains the user's action.
Activation-email subscriptions survive startup provisioning and follow service shutdown.
Provider diagnostics redact credentials, addresses, content and verification codes; public failures remain generic.
SMTP configuration and password-only Vault storage are deployed; verified TLS authentication/NOOP succeeds without sending customer email.
SMTP requires final DATA 250 acceptance; 4xx retries, 5xx fails and uncertain transport outcomes remain UNKNOWN without immediate resend.
Frontend HTTPS probes leave zero zombie processes after repeated probes.
A live BFF-only restart automatically recovers the session, matching network namespaces and API HTTP 200.
Paired BFF/session recreation and real credential rotation succeed.
Final local verification confirms seven healthy services, verified HTTPS, Vault/database checks and authenticated Sendico currency/ledger reads.
Changes are committed/pushed and PR #59 is updated; no merge performed.
Notes
Owner tech; SXCHNGE project (16); backend label; branch identity-facts-57. Primary module identity-facts; secondary auth, notifications and local infrastructure.
PR: #59. Latest recovery delivery: 13cc9c3. Source, recovery audit and operator guidance are in docs/signup-facts.md, docs/local-sendico.md, docs/local-development.md and backend/notifications/README.md.
Earlier full GOFLAGS=-p=2 make test (backend race tests and Flutter suites), make lint-backend and SMTP adapter tests passed for the product contribution. The October 19 follow-up changes shell/Compose/documentation only; it does not claim a fresh full Go/Flutter run. Current validation passes: make test-dev-tooling, Compose config --quiet, git diff --check, live BFF-only restart, paired recreation, make test-dev-rotation (three real rotations, unchanged BFF process, 534 transaction-backed requests, zero failures) and sh infra/local/tools.sh verify.
The October 19 failure was directly reproduced as HTTP 502 with different BFF/session network namespaces and failed Vault DNS in the session. Session-only restart restored HTTP 200, then the automatic recovery fix reproduced that recovery without a manual sidecar restart. An initial broader check also found Sendico's ledger unavailable after closed discovery/announcement connections; restoring its existing services in documented dependency order recovered authenticated reads. No Sendico source/financial data, provider binding or customer record was changed by this recovery follow-up.
The earlier Resend unverified-domain error is historical; SMTP is the selected local path. Existing failed Resend jobs are not replayed. Current validation submitted no email or payment, and browser account creation was not submitted on the user's behalf. No optional security scans were requested/run. Historical signup recovery identifiers and conditional-write audit remain in docs/signup-facts.md.
October 19 browser follow-up: the user still sees the generic unavailable message; this is not resolved. During this follow-up, API health was 200 and signup counters showed only the operator's invalid probes. Added privacy-filtered Caddy signup status/duration access logging (request object, response headers and user ID deleted; other routes skipped). Rebuilt/recreated frontend using freshly resolved stable image pins. Caddy validation, Compose validation, invalid-signup HTTP 400 with sentinel-query/header/cookie exclusion, health HTTP 200 and git diff --check pass. No real signup or email submitted. Commit 4c4b639. Awaiting one observed browser attempt to distinguish HTTP rejection from browser transport/cache failure; health checks alone do not prove signup works.
### Goal
Restore reliable signup, local activation-email delivery and recovery after local service restarts, with actionable diagnostics that exclude credentials and signup data.
### Approach
Correct Sendico registration receipt handling (HTTP 201; Facts intake remains HTTP 200), preserve non-idempotent registration protection, and recover the original pending signup against its verified existing subject. Keep the activation-email subscription alive beyond bounded startup provisioning.
Use an owned SMTP adapter for the selected Sendico mailbox no-reply@sendico.io at mail.sendico.io:465, verified implicit TLS and bounded timeout. Store only the password in SXCHNGE Vault services/notifications/email/smtp; retain endpoint/sender settings in YAML. Log bounded redacted provider status/type/message diagnostics once at the worker boundary.
Reap orphaned frontend HTTPS probe children with Compose init. Recover the Sendico session when a BFF restart leaves it in the old network namespace: three consecutive bounded DNS failures restart the session container into the current namespace, with clear secret-free recovery logging. Pair BFF/session recreation in bootstrap and rotation tooling, declare Compose dependency restart, and clean up child processes on exit.
### Acceptance criteria
- [x] HTTP 201 registration receipts succeed; malformed/upstream failures remain safe and no duplicate individual registration is introduced.
- [x] Original pending signup is bound to its verified existing subject and persisted Facts receipt; confirmation remains the user's action.
- [x] Activation-email subscriptions survive startup provisioning and follow service shutdown.
- [x] Provider diagnostics redact credentials, addresses, content and verification codes; public failures remain generic.
- [x] SMTP configuration and password-only Vault storage are deployed; verified TLS authentication/NOOP succeeds without sending customer email.
- [x] SMTP requires final DATA 250 acceptance; 4xx retries, 5xx fails and uncertain transport outcomes remain UNKNOWN without immediate resend.
- [x] Frontend HTTPS probes leave zero zombie processes after repeated probes.
- [x] A live BFF-only restart automatically recovers the session, matching network namespaces and API HTTP 200.
- [x] Paired BFF/session recreation and real credential rotation succeed.
- [x] Final local verification confirms seven healthy services, verified HTTPS, Vault/database checks and authenticated Sendico currency/ledger reads.
- [x] Changes are committed/pushed and PR #59 is updated; no merge performed.
### Notes
Owner tech; SXCHNGE project (16); backend label; branch identity-facts-57. Primary module identity-facts; secondary auth, notifications and local infrastructure.
PR: https://git.sendico.io/tech/sxchnge/pulls/59. Latest recovery delivery: 13cc9c3. Source, recovery audit and operator guidance are in docs/signup-facts.md, docs/local-sendico.md, docs/local-development.md and backend/notifications/README.md.
Earlier full GOFLAGS=-p=2 make test (backend race tests and Flutter suites), make lint-backend and SMTP adapter tests passed for the product contribution. The October 19 follow-up changes shell/Compose/documentation only; it does not claim a fresh full Go/Flutter run. Current validation passes: make test-dev-tooling, Compose config --quiet, git diff --check, live BFF-only restart, paired recreation, make test-dev-rotation (three real rotations, unchanged BFF process, 534 transaction-backed requests, zero failures) and sh infra/local/tools.sh verify.
The October 19 failure was directly reproduced as HTTP 502 with different BFF/session network namespaces and failed Vault DNS in the session. Session-only restart restored HTTP 200, then the automatic recovery fix reproduced that recovery without a manual sidecar restart. An initial broader check also found Sendico's ledger unavailable after closed discovery/announcement connections; restoring its existing services in documented dependency order recovered authenticated reads. No Sendico source/financial data, provider binding or customer record was changed by this recovery follow-up.
The earlier Resend unverified-domain error is historical; SMTP is the selected local path. Existing failed Resend jobs are not replayed. Current validation submitted no email or payment, and browser account creation was not submitted on the user's behalf. No optional security scans were requested/run. Historical signup recovery identifiers and conditional-write audit remain in docs/signup-facts.md.
October 19 browser follow-up: the user still sees the generic unavailable message; this is not resolved. During this follow-up, API health was 200 and signup counters showed only the operator's invalid probes. Added privacy-filtered Caddy signup status/duration access logging (request object, response headers and user ID deleted; other routes skipped). Rebuilt/recreated frontend using freshly resolved stable image pins. Caddy validation, Compose validation, invalid-signup HTTP 400 with sentinel-query/header/cookie exclusion, health HTTP 200 and git diff --check pass. No real signup or email submitted. Commit 4c4b639. Awaiting one observed browser attempt to distinguish HTTP rejection from browser transport/cache failure; health checks alone do not prove signup works.
tech
added the backend label 2026-10-17 05:18:02 +00:00
tech
self-assigned this 2026-10-17 05:18:02 +00:00
tech
added this to the SXCHNGE project 2026-10-17 05:18:02 +00:00
Recovery confirmed the original individual through the public GET API and conditionally bound it locally. Facts intake persisted its receipt; activation resend returned 202. A second completion blocker was found: notifications passes its 20-second startup context into the NATS subscription, and the NATS SDK unsubscribes when that context expires. Scope now includes notifications startup/subscription lifetime separation, regression coverage, and local notification service rebuild so the queued activation can be processed. Primary module remains identity-facts; secondary modules auth, notifications and local runtime. No change to NATS authentication or unrelated notifications runtime settings.
Recovery confirmed the original individual through the public GET API and conditionally bound it locally. Facts intake persisted its receipt; activation resend returned 202. A second completion blocker was found: notifications passes its 20-second startup context into the NATS subscription, and the NATS SDK unsubscribes when that context expires. Scope now includes notifications startup/subscription lifetime separation, regression coverage, and local notification service rebuild so the queued activation can be processed. Primary module remains identity-facts; secondary modules auth, notifications and local runtime. No change to NATS authentication or unrelated notifications runtime settings.
tech
changed title from Complete signup after Sendico individual creation to Complete signup and activation email delivery2026-10-17 05:25:59 +00:00
Both fixes are deployed locally. The rebuilt notification worker consumed and acknowledged the pending activation job and remains subscribed beyond its former 20-second startup deadline (JetStream num_waiting=1, num_pending=0). Resend returned HTTP 401/403, recorded safely as provider_authentication_failed with one attempt; the message is terminally failed, so no inbox delivery is claimed. The user was asked to check API key/sender authorization and rotate a replacement securely through make email if necessary. This external provider configuration is the remaining blocker to email verification. Do not mark the account active or repeat individual registration.
Both fixes are deployed locally. The rebuilt notification worker consumed and acknowledged the pending activation job and remains subscribed beyond its former 20-second startup deadline (JetStream num_waiting=1, num_pending=0). Resend returned HTTP 401/403, recorded safely as provider_authentication_failed with one attempt; the message is terminally failed, so no inbox delivery is claimed. The user was asked to check API key/sender authorization and rotate a replacement securely through make email if necessary. This external provider configuration is the remaining blocker to email verification. Do not mark the account active or repeat individual registration.
Follow-up requested: retain intelligible provider error diagnostics in structured operational logs and inspect whether Resend is configured. Extending the existing incident fix on identity-facts-57 / PR #59. Parse bounded provider error fields, redact credentials/message content/addresses, and log status/type/message once at the notification worker boundary without persisting raw provider text or exposing it over gRPC. Cover malformed/oversized responses and redaction. Check runtime driver, Vault credential presence and sender authorization without exposing secrets; preserve the unrelated runtime.yml edit.
Follow-up requested: retain intelligible provider error diagnostics in structured operational logs and inspect whether Resend is configured. Extending the existing incident fix on identity-facts-57 / PR #59. Parse bounded provider error fields, redact credentials/message content/addresses, and log status/type/message once at the notification worker boundary without persisting raw provider text or exposing it over gRPC. Cover malformed/oversized responses and redaction. Check runtime driver, Vault credential presence and sender authorization without exposing secrets; preserve the unrelated runtime.yml edit.
Live configuration diagnosis is now verified through the rebuilt worker's new structured diagnostics. Runtime selects Resend, Vault contains an API key, and sender is noreply@sxchnge.com. A diagnostic notification to Resend's documented delivered+sxchnge-config@resend.dev test mailbox (no customer email retry) logged provider_status=403, provider_error=validation_error, provider_message='The sxchnge.com domain is not verified. Please, add and verify your domain on [redacted-url]'. Notification 6ad34197e890b054f74b098a is failed after one attempt; gRPC still exposes only its generic documented failure. Exact remaining blocker: sender-domain verification in Resend/DNS, rather than absent local configuration. The API credential is recognized; its sending-only restriction is suitable. No credential, sender setting, Resend domain or DNS changes were made. Focused email/service race tests and backend lint pass; full make test is running.
Live configuration diagnosis is now verified through the rebuilt worker's new structured diagnostics. Runtime selects Resend, Vault contains an API key, and sender is noreply@sxchnge.com. A diagnostic notification to Resend's documented delivered+sxchnge-config@resend.dev test mailbox (no customer email retry) logged provider_status=403, provider_error=validation_error, provider_message='The sxchnge.com domain is not verified. Please, add and verify your domain on [redacted-url]'. Notification 6ad34197e890b054f74b098a is failed after one attempt; gRPC still exposes only its generic documented failure. Exact remaining blocker: sender-domain verification in Resend/DNS, rather than absent local configuration. The API credential is recognized; its sending-only restriction is suitable. No credential, sender setting, Resend domain or DNS changes were made. Focused email/service race tests and backend lint pass; full make test is running.
tech
changed title from Restore signup and activation email processing to Restore signup and actionable email provider diagnostics2026-10-17 09:39:34 +00:00
User requested switching local notifications to Sendico's authenticated mail client, reusing its noreply mailbox credentials, then rebuilding/restarting. Authoritative Sendico configuration uses mail.sendico.io:465 with implicit TLS and driver client. SXCHNGE currently supports only HTTP providers, so this follow-up adds an owned SMTP adapter behind the existing Sender contract, preserving shared queue/storage boundaries and existing delivery safety. Copy only the mailbox password securely from the running Sendico notification environment to SXCHNGE Vault services/notifications/email/smtp; keep username, sender, host and port in runtime YAML. Extend local Agent provisioning/bootstrap verification for the selected driver, add SMTP failure/TLS/MIME tests, then validate, rebuild, restart and verify authenticated connectivity. Sender runtime edit is now explicitly within user-authorized scope.
User requested switching local notifications to Sendico's authenticated mail client, reusing its noreply mailbox credentials, then rebuilding/restarting. Authoritative Sendico configuration uses mail.sendico.io:465 with implicit TLS and driver client. SXCHNGE currently supports only HTTP providers, so this follow-up adds an owned SMTP adapter behind the existing Sender contract, preserving shared queue/storage boundaries and existing delivery safety. Copy only the mailbox password securely from the running Sendico notification environment to SXCHNGE Vault services/notifications/email/smtp; keep username, sender, host and port in runtime YAML. Extend local Agent provisioning/bootstrap verification for the selected driver, add SMTP failure/TLS/MIME tests, then validate, rebuild, restart and verify authenticated connectivity. Sender runtime edit is now explicitly within user-authorized scope.
tech
changed title from Restore signup and actionable email provider diagnostics to Restore signup and local SMTP email delivery2026-10-17 18:57:49 +00:00
tech
changed reference from identity-facts-57 to identity-facts-572026-10-17 18:57:49 +00:00
Deployment complete after the authorized Docker Desktop restart. Notifications rebuilt using the normal Compose --pull path, recreated healthy and verified on email_driver: smtp; image matches sha256:d4cbc0cb9005e9cef9381abdf2a13f672104d160536ee6d77ac73a909c0a8638. Sendico mailbox no-reply@sendico.io authenticates over verified TLS at mail.sendico.io:465 using the password in SXCHNGE Vault; authenticated NOOP returns 250 without submitting email. Sanitized error diagnostics remain enabled.
Final GOFLAGS=-p=2 make test, make lint-backend, make test-dev-infra and sh infra/local/tools.sh verify pass; the last verifies seven healthy services, frontend/BFF HTTPS and authenticated Sendico currency/ledger reads. Earlier Docker timeouts/build stalls are resolved. Sendico Vault was unsealed using its existing key, then exited services were restored in dependency order and the local shared-network session bridge restarted after its BFF. No Sendico repository files changed, no customer email sent and no failed Resend jobs replayed.
Delivery documentation commits 3aeea9a and 4844fb5 are pushed to identity-facts-57, PR #59. No merge performed; worktree clean.
Deployment complete after the authorized Docker Desktop restart. Notifications rebuilt using the normal Compose --pull path, recreated healthy and verified on email_driver: smtp; image matches sha256:d4cbc0cb9005e9cef9381abdf2a13f672104d160536ee6d77ac73a909c0a8638. Sendico mailbox no-reply@sendico.io authenticates over verified TLS at mail.sendico.io:465 using the password in SXCHNGE Vault; authenticated NOOP returns 250 without submitting email. Sanitized error diagnostics remain enabled.
Final GOFLAGS=-p=2 make test, make lint-backend, make test-dev-infra and sh infra/local/tools.sh verify pass; the last verifies seven healthy services, frontend/BFF HTTPS and authenticated Sendico currency/ledger reads. Earlier Docker timeouts/build stalls are resolved. Sendico Vault was unsealed using its existing key, then exited services were restored in dependency order and the local shared-network session bridge restarted after its BFF. No Sendico repository files changed, no customer email sent and no failed Resend jobs replayed.
Delivery documentation commits 3aeea9a and 4844fb5 are pushed to identity-facts-57, PR https://git.sendico.io/tech/sxchnge/pulls/59. No merge performed; worktree clean.
Deployed and pushed 021bd04: frontend Compose init reaps orphaned HTTPS health-check children. Verified docker-init as PID 1, 40 successful HTTPS probes, zero zombie processes and process count near 15 (previously 15,897, including 15,888 ssl_client zombies). Compose validation and make test-dev-tooling pass. The current full local verification remains blocked by MongoDB health probes exceeding five seconds; restarting only local MongoDB did not remove those timeouts. No global Docker restart, Sendico changes, customer email, credential change or account creation was performed in this follow-up. The user's exact Safari failure remains unconfirmed pending a fresh retry; it is not represented as solved solely from container health. PR #59 includes source and durable notes.
Deployed and pushed 021bd04: frontend Compose init reaps orphaned HTTPS health-check children. Verified docker-init as PID 1, 40 successful HTTPS probes, zero zombie processes and process count near 15 (previously 15,897, including 15,888 ssl_client zombies). Compose validation and make test-dev-tooling pass. The current full local verification remains blocked by MongoDB health probes exceeding five seconds; restarting only local MongoDB did not remove those timeouts. No global Docker restart, Sendico changes, customer email, credential change or account creation was performed in this follow-up. The user's exact Safari failure remains unconfirmed pending a fresh retry; it is not represented as solved solely from container health. PR #59 includes source and durable notes.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Goal
Restore reliable signup, local activation-email delivery and recovery after local service restarts, with actionable diagnostics that exclude credentials and signup data.
Approach
Correct Sendico registration receipt handling (HTTP 201; Facts intake remains HTTP 200), preserve non-idempotent registration protection, and recover the original pending signup against its verified existing subject. Keep the activation-email subscription alive beyond bounded startup provisioning.
Use an owned SMTP adapter for the selected Sendico mailbox no-reply@sendico.io at mail.sendico.io:465, verified implicit TLS and bounded timeout. Store only the password in SXCHNGE Vault services/notifications/email/smtp; retain endpoint/sender settings in YAML. Log bounded redacted provider status/type/message diagnostics once at the worker boundary.
Reap orphaned frontend HTTPS probe children with Compose init. Recover the Sendico session when a BFF restart leaves it in the old network namespace: three consecutive bounded DNS failures restart the session container into the current namespace, with clear secret-free recovery logging. Pair BFF/session recreation in bootstrap and rotation tooling, declare Compose dependency restart, and clean up child processes on exit.
Acceptance criteria
Notes
Owner tech; SXCHNGE project (16); backend label; branch identity-facts-57. Primary module identity-facts; secondary auth, notifications and local infrastructure.
PR: #59. Latest recovery delivery:
13cc9c3. Source, recovery audit and operator guidance are in docs/signup-facts.md, docs/local-sendico.md, docs/local-development.md and backend/notifications/README.md.Earlier full GOFLAGS=-p=2 make test (backend race tests and Flutter suites), make lint-backend and SMTP adapter tests passed for the product contribution. The October 19 follow-up changes shell/Compose/documentation only; it does not claim a fresh full Go/Flutter run. Current validation passes: make test-dev-tooling, Compose config --quiet, git diff --check, live BFF-only restart, paired recreation, make test-dev-rotation (three real rotations, unchanged BFF process, 534 transaction-backed requests, zero failures) and sh infra/local/tools.sh verify.
The October 19 failure was directly reproduced as HTTP 502 with different BFF/session network namespaces and failed Vault DNS in the session. Session-only restart restored HTTP 200, then the automatic recovery fix reproduced that recovery without a manual sidecar restart. An initial broader check also found Sendico's ledger unavailable after closed discovery/announcement connections; restoring its existing services in documented dependency order recovered authenticated reads. No Sendico source/financial data, provider binding or customer record was changed by this recovery follow-up.
The earlier Resend unverified-domain error is historical; SMTP is the selected local path. Existing failed Resend jobs are not replayed. Current validation submitted no email or payment, and browser account creation was not submitted on the user's behalf. No optional security scans were requested/run. Historical signup recovery identifiers and conditional-write audit remain in docs/signup-facts.md.
October 19 browser follow-up: the user still sees the generic unavailable message; this is not resolved. During this follow-up, API health was 200 and signup counters showed only the operator's invalid probes. Added privacy-filtered Caddy signup status/duration access logging (request object, response headers and user ID deleted; other routes skipped). Rebuilt/recreated frontend using freshly resolved stable image pins. Caddy validation, Compose validation, invalid-signup HTTP 400 with sentinel-query/header/cookie exclusion, health HTTP 200 and git diff --check pass. No real signup or email submitted. Commit
4c4b639. Awaiting one observed browser attempt to distinguish HTTP rejection from browser transport/cache failure; health checks alone do not prove signup works.Recovery confirmed the original individual through the public GET API and conditionally bound it locally. Facts intake persisted its receipt; activation resend returned 202. A second completion blocker was found: notifications passes its 20-second startup context into the NATS subscription, and the NATS SDK unsubscribes when that context expires. Scope now includes notifications startup/subscription lifetime separation, regression coverage, and local notification service rebuild so the queued activation can be processed. Primary module remains identity-facts; secondary modules auth, notifications and local runtime. No change to NATS authentication or unrelated notifications runtime settings.
Complete signup after Sendico individual creationto Complete signup and activation email deliveryBoth fixes are deployed locally. The rebuilt notification worker consumed and acknowledged the pending activation job and remains subscribed beyond its former 20-second startup deadline (JetStream num_waiting=1, num_pending=0). Resend returned HTTP 401/403, recorded safely as provider_authentication_failed with one attempt; the message is terminally failed, so no inbox delivery is claimed. The user was asked to check API key/sender authorization and rotate a replacement securely through make email if necessary. This external provider configuration is the remaining blocker to email verification. Do not mark the account active or repeat individual registration.
Complete signup and activation email deliveryto Restore signup and activation email processingFollow-up requested: retain intelligible provider error diagnostics in structured operational logs and inspect whether Resend is configured. Extending the existing incident fix on identity-facts-57 / PR #59. Parse bounded provider error fields, redact credentials/message content/addresses, and log status/type/message once at the notification worker boundary without persisting raw provider text or exposing it over gRPC. Cover malformed/oversized responses and redaction. Check runtime driver, Vault credential presence and sender authorization without exposing secrets; preserve the unrelated runtime.yml edit.
Live configuration diagnosis is now verified through the rebuilt worker's new structured diagnostics. Runtime selects Resend, Vault contains an API key, and sender is noreply@sxchnge.com. A diagnostic notification to Resend's documented delivered+sxchnge-config@resend.dev test mailbox (no customer email retry) logged provider_status=403, provider_error=validation_error, provider_message='The sxchnge.com domain is not verified. Please, add and verify your domain on [redacted-url]'. Notification 6ad34197e890b054f74b098a is failed after one attempt; gRPC still exposes only its generic documented failure. Exact remaining blocker: sender-domain verification in Resend/DNS, rather than absent local configuration. The API credential is recognized; its sending-only restriction is suitable. No credential, sender setting, Resend domain or DNS changes were made. Focused email/service race tests and backend lint pass; full make test is running.
Restore signup and activation email processingto Restore signup and actionable email provider diagnosticsUser requested switching local notifications to Sendico's authenticated mail client, reusing its noreply mailbox credentials, then rebuilding/restarting. Authoritative Sendico configuration uses mail.sendico.io:465 with implicit TLS and driver client. SXCHNGE currently supports only HTTP providers, so this follow-up adds an owned SMTP adapter behind the existing Sender contract, preserving shared queue/storage boundaries and existing delivery safety. Copy only the mailbox password securely from the running Sendico notification environment to SXCHNGE Vault services/notifications/email/smtp; keep username, sender, host and port in runtime YAML. Extend local Agent provisioning/bootstrap verification for the selected driver, add SMTP failure/TLS/MIME tests, then validate, rebuild, restart and verify authenticated connectivity. Sender runtime edit is now explicitly within user-authorized scope.
Restore signup and actionable email provider diagnosticsto Restore signup and local SMTP email deliveryidentity-facts-57to identity-facts-57Deployment complete after the authorized Docker Desktop restart. Notifications rebuilt using the normal Compose --pull path, recreated healthy and verified on email_driver: smtp; image matches sha256:d4cbc0cb9005e9cef9381abdf2a13f672104d160536ee6d77ac73a909c0a8638. Sendico mailbox no-reply@sendico.io authenticates over verified TLS at mail.sendico.io:465 using the password in SXCHNGE Vault; authenticated NOOP returns 250 without submitting email. Sanitized error diagnostics remain enabled.
Final GOFLAGS=-p=2 make test, make lint-backend, make test-dev-infra and sh infra/local/tools.sh verify pass; the last verifies seven healthy services, frontend/BFF HTTPS and authenticated Sendico currency/ledger reads. Earlier Docker timeouts/build stalls are resolved. Sendico Vault was unsealed using its existing key, then exited services were restored in dependency order and the local shared-network session bridge restarted after its BFF. No Sendico repository files changed, no customer email sent and no failed Resend jobs replayed.
Delivery documentation commits
3aeea9aand4844fb5are pushed to identity-facts-57, PR #59. No merge performed; worktree clean.Deployed and pushed
021bd04: frontend Compose init reaps orphaned HTTPS health-check children. Verified docker-init as PID 1, 40 successful HTTPS probes, zero zombie processes and process count near 15 (previously 15,897, including 15,888 ssl_client zombies). Compose validation and make test-dev-tooling pass. The current full local verification remains blocked by MongoDB health probes exceeding five seconds; restarting only local MongoDB did not remove those timeouts. No global Docker restart, Sendico changes, customer email, credential change or account creation was performed in this follow-up. The user's exact Safari failure remains unconfirmed pending a fresh retry; it is not represented as solved solely from container health. PR #59 includes source and durable notes.Restore signup and local SMTP email deliveryto Restore reliable signup and local email delivery