Review: DNS: SPF/DKIM/DMARC records for landscaping-assistant.app
Verdict: READY
Re-review of board item #1737 after refinement. All three issues from the previous review (review-1737-2026-07-03) are resolved.
Template Completeness
- [x] Type (Feature)
- [x] Lineage
- [x] Repo (ldraney/pal-e-platform)
- [x] User Story
- [x] Context
- [x] File Targets (terraform/dns.tf)
- [x] Feature Flag (none)
- [x] Acceptance Criteria
- [x] Test Expectations
- [x] Constraints
- [x] Checklist
- [x] Related
All sections present. Template structurally complete.
Traceability
- [x] story:custom-domain label — "As platform admin, I want each app to send from its own domain so emails look professional and build domain reputation"
- [x] story note verified — found in project-stalwart-email user-stories section (key: custom-domain, role: Platform Admin)
- [x] arch:dns label — DNS component
- [x] arch note verified — arch-dns note exists in pal-e-docs (created 2026-07-04, project: stalwart-email)
- [x] Forgejo issue — ldraney/pal-e-services#165, open
File Targets
- [x]
terraform/dns.tf— verified: file exists in pal-e-platform, currently contains A records for landscaping-assistant.app (lines 12-18, resource "godaddy_dns_record" "landscaping_assistant_a"). SPF/DKIM/DMARC resources will be appended here using the same resource type pattern.
Repo Placement
OK. Issue filed on pal-e-services for project tracking. Body explicitly states
### Repo: ldraney/pal-e-platform and includes note: "Issue filed on pal-e-services for project tracking; implementation work is in pal-e-platform." The GoDaddy provider and existing DNS records live in pal-e-platform/terraform/. Cross-repo tracking is intentional and documented.Dependencies
- Documented: "Depends on: Stalwart domain/account setup (needs DKIM public key)" = pal-e-services#164 (board item #1736)
- Transitive: #1736 depends on pal-e-platform#498 (Stalwart install, board item #1733)
- Chain: #1733 (Stalwart install) → #1736 (domain/account setup, generates DKIM key) → #1737 (this item)
- Both upstream items in backlog — this item is correctly blocked until DKIM public key is generated. Dependency is explicitly documented in Lineage section.
Acceptance Criteria
5 criteria, all verifiable programmatically:
- [x] A record: verifiable via
dig A mail.landscaping-assistant.app - [x] SPF: verifiable via
dig TXT landscaping-assistant.app +short - [x] DKIM: verifiable via
dig TXT default._domainkey.landscaping-assistant.app +short - [x] DMARC: verifiable via
dig TXT _dmarc.landscaping-assistant.app +short - [x] mxtoolbox validation: verifiable via web check (24-48h propagation caveat noted in Constraints)
All criteria are clear, testable, and within agent capability. DKIM criterion naturally gated by Stalwart dependency.
Blast Radius
- Sibling domain: Issue #166 (board item #1738) is the identical pattern for westsidekingsandqueens.com — no conflict, independent work
- Third domain: palinks.app has an A record in dns.tf (lines 4-10) but no SPF/DKIM/DMARC — may need similar treatment in the future but out of scope for this ticket
- Single SPF constraint: Issue correctly notes "Only ONE SPF record per domain" — no existing SPF record for landscaping-assistant.app in dns.tf, so no conflict risk
- Provider pattern: Uses
godaddy_dns_recordresource type consistent with existing resources in the file
Decomposition Assessment
1 file target (terraform/dns.tf), 4 DNS resources to add (A for mail subdomain, SPF TXT, DKIM TXT, DMARC TXT), 5 acceptance criteria. Estimated agent work: under 5 minutes once DKIM key is available. No decomposition needed.
Previous Review Issues — Resolution Status
- [x] Wrong repo — FIXED:
### Reponow correctly statesldraney/pal-e-platform - [x] Vague file targets — FIXED: File Targets now specifies
terraform/dns.tf - [x] Missing arch-dns note — FIXED:
arch-dnsnote created (Architecture: DNS Management)
Recommendation
No action needed. Scope is solid, all file targets verified, traceability complete, fits in a single agent pass.
Minor Observation (non-blocking)
The DKIM selector in the issue body uses
default._domainkey while the arch-dns note references mail._domainkey. The actual selector will be determined by Stalwart's configuration during dependency #1736. The implementing agent should use whatever selector Stalwart generates rather than hardcoding either assumption. This is inherent to the dependency relationship and does not require ticket changes.