This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Dns

Project-owned DNS declarations for alwaldend.com

DNS records live in each owner’s dnsconfig.json. Each owner manages its records through the reusable Terraform DNS module from its designated tf_setup or tf root. This component’s dnsconfig.json owns shared apex and mail records.

Cloudflare DNS and Mikrotik DNS list the records this repository declares for each destination view, with the owning declaration for every record. They are generated from dnsconfig.json:

bazel_agent bazel run //infra/dns/cmd/dump -- --write

//infra/dns:config_test fails when a checked-in page is out of date, so the pages cannot drift from the declarations they project.

bazel_agent bazel run //infra/dns:lint

The linter discovers dnsconfig.json files in the current workspace at runtime and prints their DNS declarations as a table. It includes nested project workspaces and excludes task scratch, tool caches, and generated directories. There is no central source registry to maintain when a project adds a file.

A canonical domain name must belong to one source file. Multiple values, record types, and destination views within that file are valid. Duplicate JSON object keys and domains declared by different source files are errors. The command reads checked-in declarations without contacting Terraform backends or DNS providers.

bazel_agent bazel test //infra/dns:config_test runs the linter’s fixture tests and checks every DNS declaration in the current checkout. The repository test resolves the root MODULE.bazel runfile to the checkout and runs without sandboxing or cached test results so newly added files and nested workspaces are included on every run. It only reads local files.

The provider-free normalization module owns the Terraform input schema, relative-name handling, TTL defaults, and stable resource keys. Each logical key can contain several record-type members; dsp selects global, dc1, or all. Explicit member TTLs preserve shared apex and mail settings. The normalization module remains an internal dependency of each owner’s Terraform DNS module.

Owner-local roots receive their provider credentials and Vault HTTP state backend through the existing AL configuration. The shared module resolves the Cloudflare zone by name when no optional zone ID is provided. DNS and ingress reuse the RouterOS endpoint declared in the shared AL configuration, while their separate credentials remain in Vault. Neither integration requires adding metadata fields to the existing credential entries. Validate their source with the owning package’s offline checks. A live plan, import, apply, or state operation requires separate authorization for that owner and operation.

Service roots expose dns.plan, dns.show, and dns.apply alongside their ordinary Terraform commands. They retain the owning root, AppRole and backend, select the DNS AL calls, and plan module.dns. Required root inputs still load through the existing read-only Vault injectors. Unrelated service authentication is not selected. Apply accepts only a reviewed saved plan file and rejects Terraform CLI argument environment overrides. See the runbook for the optional import-ID maps and adoption checks.

The migration change and cutover runbook describe adoption, imports, recovery, and retirement requirements. Each owner’s adoption change records its verified live transfer; source implementation alone does not establish operational ownership. The completed coordination record links the operational acceptance evidence and its coverage limits.

Current source no longer exposes the central DNSControl deployment commands. Before an owner begins Terraform reconciliation, stop central deployment jobs identified by the active and scheduled writer audit. Record coverage and unavailable observations, and coordinate one owner at a time. Adopt existing records into the owner’s state with an exact-ID, no-change plan. Fresh complete inventories may establish missing declarations for a separately reviewed additions-only plan that preserves all existing records. Rollback requires stopping the affected Terraform writers and following the runbook’s recorded prior revision and state-reconciliation procedure.

Deployment snapshots are not maintained here. The generated declaration pages above project declared state, and the declarations themselves remain the only inventory.

1 -

Infrastructure DNS

Describe owner-local Terraform DNS declarations and runtime source-ownership validation for global and dc1 records. This contract describes checked-in source; it does not establish live adoption or authorize infrastructure writes.

Sources: component documentation, target definitions, runtime linter, and Terraform root.

DNS declarations SHALL remain in their owners’ dnsconfig.json files. Runtime inventory SHALL discover all canonical files, including nested modules and empty declarations, without a checked-in ownership registry. The inventory SHALL print a deterministic table of files, DNS names, types and views.

Project landing declarations retain their declared direct targets.

  • WHEN the runtime linter scans a workspace containing the new file
  • THEN it includes the file without requiring a registry update

The Terraform module SHALL preserve Cloudflare global and MikroTik dc1 views. It SHALL retain every type member, expand and deduplicate destinations, reject unknown inputs and preserve effective values, TTLs, priorities and multiplicity.

Scenario: An entry declares A and AAAA in all views

  • WHEN the shared module normalizes the entry
  • THEN both types appear exactly once in each destination view
  • WHEN a record names an unsupported destination
  • THEN normalization fails with an actionable diagnostic

The linter and module tests SHALL validate source ownership, names, inputs, normalization and provider mappings without credentials or live provider access. Existing JSON-based VM consumers SHALL remain compatible.

  • WHEN offline checks run
  • THEN they validate the declaration and fixtures without deploying records

Owner Terraform roots SHALL use the existing AL/Vault authentication, backend and credential injection workflow. They SHALL obtain only their required view credentials. Operational provider initialization may require live credentials even with resource creation disabled. Central DNSControl write entrypoints SHALL be removed from the candidate.

  • WHEN an authorized operator invokes the root after bootstrap
  • THEN it uses that owner’s AppRole and Cloudflare credentials
  • AND RouterOS credentials and resources are not required

Each owner SHALL instantiate the shared module in tf_setup when present, otherwise in tf. Missing roots and AppRoles SHALL be added. Related AppRole resources SHALL be grouped in modules under infra/vault/tf/approles/<name>. Provider instance keys SHALL be stable across value-only changes; unrelated owners SHALL remain outside the state.

  • WHEN the integration is prepared
  • THEN only its setup root declares the DNS module

The runtime linter SHALL reject different files managing the same canonical fully qualified DNS name, across types and views. Multiple records within one file SHALL be allowed. Diagnostics SHALL identify both files.

  • WHEN one file declares an A record and another an AAAA record or a different view for the same name
  • THEN lint fails and identifies both source files
  • WHEN one file declares several values, types or views for a name
  • THEN ownership lint accepts the sole source

Operational cutover SHALL audit active and scheduled central writers, stop identified competing writers, and coordinate one owner at a time. Evidence SHALL state the audit’s coverage and unavailable observations. Each existing record SHALL be imported using its actual provider ID into exactly one owner state, followed by a no-change adoption plan before writes. Fresh complete inventories MAY establish missing declarations for an exact additions-only plan that preserves every existing record. Endpoint-owning batches SHALL verify an independent authenticated recovery path first.

The shared apex and mail records owned by infra/dns SHALL remain disabled by default in its tf root before the authorized adoption revision and SHALL retain enabled ownership after import. Reconciliation against the adopted state and unchanged declarations SHALL propose no record additions, changes, replacements, or deletions and SHALL preserve unrelated provider records.

  • WHEN its authorized cutover runs
  • THEN exact-ID imports preserve existing records
  • AND the operator coordinates exclusive active writers and verifies unrelated records remain unchanged
  • WHEN complete provider inventories establish that declared names are absent and conflict-free
  • THEN the reviewed DNS plan creates only those missing declarations
  • AND every existing provider identity and attribute remains unchanged
  • AND a follow-up DNS plan contains no changes
  • WHEN the shared tf root uses its checked-in defaults before its authorized adoption revision
  • THEN shared-record ownership is disabled and the root retains the canonical shared declaration and module inputs
  • WHEN the adopted shared tf root uses its checked-in source defaults
  • THEN ownership is enabled for the shared apex and mail records in their declared views
  • WHEN the shared tf root plans against adopted state and unchanged declarations
  • THEN it proposes no record additions, changes, replacements, or deletions
  • AND unrelated provider records remain unchanged

The implementation SHALL derive its declaration views from the owning dnsconfig.json files rather than maintaining a normalized inventory or BIND exporter. Historical provider snapshots SHALL NOT be presented as current desired state, and no provider snapshot SHALL be committed as a declaration source.

  • WHEN the runtime linter succeeds
  • THEN its table reports the discovered declarations without an export step

The implementation SHALL render one documentation page per destination view from the declared records, with the owning declaration for every record, and SHALL fail its offline check when a checked-in page differs from the declarations it projects.

  • WHEN an owner changes a declaration and the generation command runs
  • THEN the affected view’s page lists the declared records with their owner
  • AND the check passes against the regenerated page
  • WHEN a checked-in page no longer matches the declarations
  • THEN the offline check fails rather than serving a stale inventory

2 - Cloudflare DNS

Records declared for the public zone served by Cloudflare

Every record this repository declares for the public zone, which Cloudflare serves.

This page is generated from the declarations; run bazel run //infra/dns/cmd/dump -- --write after changing them. The authoritative source is each owner’s dnsconfig.json.

Domain Type TTL Value Declaration
@ A 300 185.199.108.153 infra/dns/dnsconfig.json
@ A 300 185.199.109.153 infra/dns/dnsconfig.json
@ A 300 185.199.110.153 infra/dns/dnsconfig.json
@ A 300 185.199.111.153 infra/dns/dnsconfig.json
@ AAAA 300 2606:50c0:8000::153 infra/dns/dnsconfig.json
@ AAAA 300 2606:50c0:8001::153 infra/dns/dnsconfig.json
@ AAAA 300 2606:50c0:8002::153 infra/dns/dnsconfig.json
@ AAAA 300 2606:50c0:8003::153 infra/dns/dnsconfig.json
@ MX 300 10 mail.protonmail.ch. infra/dns/dnsconfig.json
@ MX 300 20 mailsec.protonmail.ch. infra/dns/dnsconfig.json
@ TXT 300 _globalsign-domain-verification=0QBJgVV_uwcFLTi1Rot3bb1LyJ5uW1WD0ygvIS4OM5 infra/dns/dnsconfig.json
@ TXT 300 protonmail-verification=bdcd133d3f472fa17f66328950d02fbeae1bef75 infra/dns/dnsconfig.json
@ TXT 300 v=spf1 include:_spf.protonmail.ch ~all infra/dns/dnsconfig.json
_dmarc TXT 300 v=DMARC1; p=quarantine; adkim=s infra/dns/dnsconfig.json
_dmarc.simplelogin TXT 10800 v=DMARC1; p=quarantine; pct=100; adkim=s; aspf=s infra/dns/dnsconfig.json
canvas.openhands CNAME default ingress.alwaldend.com. infra/openhands/dnsconfig.json
cloud CNAME default ingress.alwaldend.com. infra/nas/dnsconfig.json
dc1.automation.openhands A default 192.168.10.92 infra/openhands/dnsconfig.json
dc1.canvas.openhands A default 192.168.10.90 infra/openhands/dnsconfig.json
dc1.cloud A default 192.168.1.209 infra/nas/dnsconfig.json
dc1.host-bot.simeonwarren.users A default 192.168.1.210 users/simeonwarren/host_bot/dnsconfig.json
dc1.server.openhands A default 192.168.10.91 infra/openhands/dnsconfig.json
dc1.t3code.host-bot.simeonwarren.users A default 192.168.1.210 users/simeonwarren/host_bot/dnsconfig.json
dkim._domainkey.simplelogin CNAME 10800 dkim._domainkey.simplelogin.co. infra/dns/dnsconfig.json
dkim02._domainkey.simplelogin CNAME 10800 dkim02._domainkey.simplelogin.co. infra/dns/dnsconfig.json
dkim03._domainkey.simplelogin CNAME 10800 dkim03._domainkey.simplelogin.co. infra/dns/dnsconfig.json
forgejo CNAME default ingress.alwaldend.com. infra/forgejo/dnsconfig.json
git CNAME default ingress.alwaldend.com. infra/forgejo/dnsconfig.json
host1.ingress A default 81.26.185.118 infra/ingress/dnsconfig.json
ingress A default 81.26.185.118 infra/ingress/dnsconfig.json
int.forgejo A default 192.168.10.40 infra/forgejo/dnsconfig.json
int.vault A default 192.168.1.218 infra/vault/dnsconfig.json
mail._domainkey.yandex TXT 300 v=DKIM1; k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcYzFVgkeDOhaIIkWM8gNQjxVsv0/aXfU+ax5urB5y6hA6lSjRnjRo6tm0bXbkOJf41GmiwMNgdXpwRtzgzAlX1i2aJbtEr4b9jzibEGLQ7Cvqs44bOYES9f/K3ueQpnvdTOJmFqlRReFL7ZrUyDFCoQ7f4+7h4i8s01cCcRrt5wIDAQAB infra/dns/dnsconfig.json
njalla1.nodes.threexui A default 45.142.141.133 infra/threexui/dnsconfig.json
njalla1.nodes.threexui AAAA default 2a0a:3840:8078:141:0:2d8e:8d85:1337 infra/threexui/dnsconfig.json
pages A default 185.199.108.153 projects/alwaldend.com/dnsconfig.json
pages AAAA default 2606:50c0:8000::153 projects/alwaldend.com/dnsconfig.json
protonmail._domainkey CNAME 300 protonmail.domainkey.djgwfzcu5fgjtpoijqqomgifmqj6zeiuwdd4mzim4hrxab3zsgwkq.domains.proton.ch. infra/dns/dnsconfig.json
protonmail2._domainkey CNAME 300 protonmail2.domainkey.djgwfzcu5fgjtpoijqqomgifmqj6zeiuwdd4mzim4hrxab3zsgwkq.domains.proton.ch. infra/dns/dnsconfig.json
protonmail3._domainkey CNAME 300 protonmail3.domainkey.djgwfzcu5fgjtpoijqqomgifmqj6zeiuwdd4mzim4hrxab3zsgwkq.domains.proton.ch. infra/dns/dnsconfig.json
simplelogin MX 10800 10 mx1.simplelogin.co. infra/dns/dnsconfig.json
simplelogin MX 10800 20 mx2.simplelogin.co. infra/dns/dnsconfig.json
simplelogin TXT 10800 sl-verification=bxfzzfjiggzsxyzxhhmkmjqkaskjgy infra/dns/dnsconfig.json
simplelogin TXT 10800 v=spf1 include:simplelogin.co ~all infra/dns/dnsconfig.json
t3code.host-bot.simeonwarren.users CNAME default ingress.alwaldend.com. users/simeonwarren/host_bot/dnsconfig.json
vault CNAME default ingress.alwaldend.com. infra/vault/dnsconfig.json
www CNAME 300 alwaldend.com. infra/dns/dnsconfig.json
www-staging CNAME 300 alwaldend.github.io. infra/dns/dnsconfig.json
yandex MX 21600 10 mx.yandex.net. infra/dns/dnsconfig.json
yandex TXT 300 v=spf1 redirect=_spf.yandex.net infra/dns/dnsconfig.json
yandex TXT 300 yandex-verification: b83672f59b3dbe16 infra/dns/dnsconfig.json
yc.threexui NS default ns1.yandexcloud.net. infra/threexui/dnsconfig.json
yc.threexui NS default ns2.yandexcloud.net. infra/threexui/dnsconfig.json
yc1.nodes.threexui CNAME default host1.nodes.yc.threexui.alwaldend.com. infra/threexui/dnsconfig.json

3 - Mikrotik DNS

Records declared for the internal dc1 view served by RouterOS

Every record this repository declares for the internal dc1 view, which RouterOS serves for that network.

This page is generated from the declarations; run bazel run //infra/dns/cmd/dump -- --write after changing them. The authoritative source is each owner’s dnsconfig.json.

Domain Type TTL Value Declaration
@ A 300 185.199.108.153 infra/dns/dnsconfig.json
@ A 300 185.199.109.153 infra/dns/dnsconfig.json
@ A 300 185.199.110.153 infra/dns/dnsconfig.json
@ A 300 185.199.111.153 infra/dns/dnsconfig.json
@ AAAA 300 2606:50c0:8000::153 infra/dns/dnsconfig.json
@ AAAA 300 2606:50c0:8001::153 infra/dns/dnsconfig.json
@ AAAA 300 2606:50c0:8002::153 infra/dns/dnsconfig.json
@ AAAA 300 2606:50c0:8003::153 infra/dns/dnsconfig.json
@ MX 300 10 mail.protonmail.ch. infra/dns/dnsconfig.json
@ MX 300 20 mailsec.protonmail.ch. infra/dns/dnsconfig.json
@ TXT 300 _globalsign-domain-verification=0QBJgVV_uwcFLTi1Rot3bb1LyJ5uW1WD0ygvIS4OM5 infra/dns/dnsconfig.json
@ TXT 300 protonmail-verification=bdcd133d3f472fa17f66328950d02fbeae1bef75 infra/dns/dnsconfig.json
@ TXT 300 v=spf1 include:_spf.protonmail.ch ~all infra/dns/dnsconfig.json
_dmarc TXT 300 v=DMARC1; p=quarantine; adkim=s infra/dns/dnsconfig.json
_dmarc.simplelogin TXT 10800 v=DMARC1; p=quarantine; pct=100; adkim=s; aspf=s infra/dns/dnsconfig.json
automation.openhands A default 192.168.10.92 infra/openhands/dnsconfig.json
bm1.dc1 A default 192.168.1.222 infra/mikrotik/dnsconfig.json
bm2.dc1 A default 192.168.1.216 infra/pve/dnsconfig.json
bm2.dc1 AAAA default fd2e:546d:5738:0:365a:60ff:fe08:6daa infra/pve/dnsconfig.json
bm3.dc1 A default 192.168.1.218 infra/vault/dnsconfig.json
bm3.dc1 AAAA default fd2e:546d:5738:0:e2be:3ff:fe2b:9a1a infra/vault/dnsconfig.json
canvas.openhands A default 192.168.10.90 infra/openhands/dnsconfig.json
cloud CNAME default nas.alwaldend.com. infra/nas/dnsconfig.json
cloudinit-test.vm.pve1.dc1 A default 192.168.10.10 infra/pve/dnsconfig.json
dc1.automation.openhands A default 192.168.10.92 infra/openhands/dnsconfig.json
dc1.canvas.openhands A default 192.168.10.90 infra/openhands/dnsconfig.json
dc1.cloud A default 192.168.1.209 infra/nas/dnsconfig.json
dc1.host-bot.simeonwarren.users A default 192.168.1.210 users/simeonwarren/host_bot/dnsconfig.json
dc1.server.openhands A default 192.168.10.91 infra/openhands/dnsconfig.json
dc1.t3code.host-bot.simeonwarren.users A default 192.168.1.210 users/simeonwarren/host_bot/dnsconfig.json
dkim._domainkey.simplelogin CNAME 10800 dkim._domainkey.simplelogin.co. infra/dns/dnsconfig.json
dkim02._domainkey.simplelogin CNAME 10800 dkim02._domainkey.simplelogin.co. infra/dns/dnsconfig.json
dkim03._domainkey.simplelogin CNAME 10800 dkim03._domainkey.simplelogin.co. infra/dns/dnsconfig.json
flux A default 192.168.10.60 infra/flux/dnsconfig.json
forgejo A default 192.168.10.40 infra/forgejo/dnsconfig.json
git A default 192.168.10.40 infra/forgejo/dnsconfig.json
harbor A default 192.168.10.50 infra/harbor/dnsconfig.json
host-bot.simeonwarren.users A default 192.168.1.210 users/simeonwarren/host_bot/dnsconfig.json
host1.automation.openhands A default 192.168.10.92 infra/openhands/dnsconfig.json
host1.canvas.openhands A default 192.168.10.90 infra/openhands/dnsconfig.json
host1.cloud CNAME default host1.nas.alwaldend.com. infra/nas/dnsconfig.json
host1.flux A default 192.168.10.60 infra/flux/dnsconfig.json
host1.forgejo A default 192.168.10.40 infra/forgejo/dnsconfig.json
host1.harbor A default 192.168.10.50 infra/harbor/dnsconfig.json
host1.ingress A default 81.26.185.118 infra/ingress/dnsconfig.json
host1.nas A default 192.168.1.209 infra/nas/dnsconfig.json
host1.pve1.dc1 CNAME default bm2.dc1.alwaldend.com. infra/pve/dnsconfig.json
host1.server.openhands A default 192.168.10.91 infra/openhands/dnsconfig.json
host1.threexui A default 192.168.10.80 infra/threexui/dnsconfig.json
host1.vault.dc1 A default 192.168.1.218 infra/vault/dnsconfig.json
host1.xcp-ng A default 192.168.1.213 infra/xcp_ng/dnsconfig.json
host1.xoa.xcp-ng A default 192.168.1.206 infra/xcp_ng/dnsconfig.json
ingress A default 81.26.185.118 infra/ingress/dnsconfig.json
mail._domainkey.yandex TXT 300 v=DKIM1; k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcYzFVgkeDOhaIIkWM8gNQjxVsv0/aXfU+ax5urB5y6hA6lSjRnjRo6tm0bXbkOJf41GmiwMNgdXpwRtzgzAlX1i2aJbtEr4b9jzibEGLQ7Cvqs44bOYES9f/K3ueQpnvdTOJmFqlRReFL7ZrUyDFCoQ7f4+7h4i8s01cCcRrt5wIDAQAB infra/dns/dnsconfig.json
nas A default 192.168.1.209 infra/nas/dnsconfig.json
njalla1.nodes.threexui A default 45.142.141.133 infra/threexui/dnsconfig.json
njalla1.nodes.threexui AAAA default 2a0a:3840:8078:141:0:2d8e:8d85:1337 infra/threexui/dnsconfig.json
openid.flux CNAME default flux.alwaldend.com. infra/flux/dnsconfig.json
operator.flux CNAME default flux.alwaldend.com. infra/flux/dnsconfig.json
protonmail._domainkey CNAME 300 protonmail.domainkey.djgwfzcu5fgjtpoijqqomgifmqj6zeiuwdd4mzim4hrxab3zsgwkq.domains.proton.ch. infra/dns/dnsconfig.json
protonmail2._domainkey CNAME 300 protonmail2.domainkey.djgwfzcu5fgjtpoijqqomgifmqj6zeiuwdd4mzim4hrxab3zsgwkq.domains.proton.ch. infra/dns/dnsconfig.json
protonmail3._domainkey CNAME 300 protonmail3.domainkey.djgwfzcu5fgjtpoijqqomgifmqj6zeiuwdd4mzim4hrxab3zsgwkq.domains.proton.ch. infra/dns/dnsconfig.json
pve A default 192.168.1.216 infra/pve/dnsconfig.json
router1.dc1 A default 192.168.1.1 infra/mikrotik/dnsconfig.json
router1.dc1 AAAA default fd2e:546d:5738::1 infra/mikrotik/dnsconfig.json
runner1.forgejo-runner A default 192.168.10.100 infra/forgejo_runner/dnsconfig.json
server.openhands A default 192.168.10.91 infra/openhands/dnsconfig.json
simplelogin MX 10800 10 mx1.simplelogin.co. infra/dns/dnsconfig.json
simplelogin MX 10800 20 mx2.simplelogin.co. infra/dns/dnsconfig.json
simplelogin TXT 10800 sl-verification=bxfzzfjiggzsxyzxhhmkmjqkaskjgy infra/dns/dnsconfig.json
simplelogin TXT 10800 v=spf1 include:simplelogin.co ~all infra/dns/dnsconfig.json
switch1.dc1 A default 192.168.1.254 infra/mikrotik/dnsconfig.json
t3code.host-bot.simeonwarren.users A default 192.168.1.210 users/simeonwarren/host_bot/dnsconfig.json
threexui A default 192.168.10.80 infra/threexui/dnsconfig.json
vault A default 192.168.1.218 infra/vault/dnsconfig.json
vault.dc1 A default 192.168.1.218 infra/vault/dnsconfig.json
www CNAME 300 alwaldend.com. infra/dns/dnsconfig.json
www-staging CNAME 300 alwaldend.github.io. infra/dns/dnsconfig.json
xcp-ng A default 192.168.1.213 infra/xcp_ng/dnsconfig.json
xoa.xcp-ng A default 192.168.1.206 infra/xcp_ng/dnsconfig.json
yandex MX 21600 10 mx.yandex.net. infra/dns/dnsconfig.json
yandex TXT 300 v=spf1 redirect=_spf.yandex.net infra/dns/dnsconfig.json
yandex TXT 300 yandex-verification: b83672f59b3dbe16 infra/dns/dnsconfig.json
yc.threexui NS default ns1.yandexcloud.net. infra/threexui/dnsconfig.json
yc.threexui NS default ns2.yandexcloud.net. infra/threexui/dnsconfig.json
yc1.nodes.threexui CNAME default host1.nodes.yc.threexui.alwaldend.com. infra/threexui/dnsconfig.json

4 - Shared DNS Terraform

Owner state for common apex and mail records

This root consumes the canonical common declarations through the reusable DNS module. It uses the src_infra_dns AppRole and its existing Vault-backed HTTP state. Both Cloudflare and RouterOS credentials are injected through the tf=1 stage label.

Shared apex and mail records were adopted on 2026-09-13. dns_enabled now defaults to true; reconciliation against the adopted state and unchanged declarations must propose no record changes. The adoption evidence records 60 imports and preservation of both complete provider inventories.

Operational calls require the AppRole policy and Vault credential fields described by the cutover procedure. The module’s import_addresses output gives addresses relative to module.dns; actual provider IDs come from the authorized adoption inventory.

Build the wrappers or run :tf_tests.fmt_test for offline validation. Import, plan and apply follow the separately authorized adoption procedure.