Skip to content

Specification: Operations Wiring (Phase 3)

Specification: Operations Wiring (Phase 3)

Section titled “Specification: Operations Wiring (Phase 3)”

Driving document for the operations worktree at projects/invitation-mail-server-worktrees/operations (branch jmpicnic/invitation-mail-server). Satisfies requirements.md; verified per verification.md; construct blueprint in Design §12 — operations wiring.

Entry gate: common-module 13.2.0 published (Phase 1 merged).

Skills to load: kotlin-coding, unit-tests-backend, unit-tests-infra, build-core-modules.

Single worktree, single agent — no task worktrees needed.

Bump arda-common-version to 13.2.0; replace local copies of the lifted classes with library imports; delete the originals (REQ-OPS-001). Adapt service/EmailSender.kt to delegate to PostmarkEmailSender via token supplier + hooks (REQ-OPS-002). No behavior change — the existing email suites are the regression net.

Verify: full make build; BV-4-05 (entire email module suite green unchanged); BV-3-03.

Guard: composite-build check before every commit (git diff --cached | grep -iE 'includeBuild|/Users/|-worktrees').

SystemEmailServerToken ExternalSecret entry + email.serverToken line in both template branches (ESO + local fallback) per REQ-OPS-003; email.from values (domain = system. + existing mail-zone value) in values.yaml / per-env values (REQ-OPS-004).

Verify: BV-2-03 golden helm template assertions; make lint (helm).

T3.3 — Config block and composition root

Section titled “T3.3 — Config block and composition root”

Top-level email {} block in src/main/resources/application.conf (REQ-OPS-004); conditional systemEmailSender construction + in-process exposure in runtime/Main.kt (REQ-OPS-005/006).

Verify: BV-5-01/02/03 via ComponentStartupTest / ConfigurationEndpointTest variants (dataSource-less block — no db plumbing in the test config maps).

Tagged smoke spec sending one real message via the dev system server, following the existing DevSmoke* pattern (REQ-OPS-007). Excluded from default builds; executed at the Phase 4 dev gate.

  • Full gate: make build, make clqLint, helm lint.
  • kotlin-coding review pass over all new/changed lines.
  • CHANGELOG (direct-edit): Added — internal system email sender wired from the partition secret; Fixed — email send internals now sourced from common-module (no behavior change).

Present diff summary, gates, CHANGELOG. No push/PR until approved; then push, PR, /pr-steward. PR merges after 13.2.0 is on GitHub Packages.

  • REQ-OPS-001..008 satisfied; verification rows green (BV-4-06 authored, execution deferred to Phase 4).
  • Zero behavior change on the per-tenant path (full suite green unchanged).
  • Local dev mode boots with the dummy token line.
  • No webhook / persistence additions for system sends.
  • kotlin-coding review pass done; no composite-build strays.
  • CHANGELOG entries present; PR merged after 13.2.0.
#QuestionOptionsRecommendationDecision
1In-process exposure surface for systemEmailSender(a) extend the EmailServices aggregate (b) separate top-level value passed from Main.kt(b) — the system sender is a component capability, not part of the ShopAccess/Email module’s tenant service graph; keeps DQ-005’s separation visibleOpen — decide at T3.3 with the code in front of us; either is additive


Copyright: (c) Arda Systems 2025-2026, All rights reserved