Kass cut over to the flagship; oncarlos.com registered and wildcarded
home.kass.training -> 99.81.104.219, serving production data through channels (canary/rehearsal until stable's bake completes 2026-08-05). Spec: naming resolved — platform.carlosframework.com + <sqid>.oncarlos.com. Infra: user_data changes no longer replace instances (learned the hard way: an apply mid-session replaced the flagship box; recovery took minutes because everything durable is in buckets, but the surprise violated 'apply is always safe').
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5 files changed,
+42
−5
docs/superpowers/specs/2026-08-01-carlos-platform-design.md+8 −2infra/flagship/dns.tf+31 −0infra/flagship/region-ie.tf+1 −1infra/tito/region-ie.tf+1 −1infra/tito/svc-pdf.tf+1 −1
diff --git a/docs/superpowers/specs/2026-08-01-carlos-platform-design.md b/docs/superpowers/specs/2026-08-01-carlos-platform-design.md| index 4d348ffd6..bb2da93c0 100644 |
| --- a/docs/superpowers/specs/2026-08-01-carlos-platform-design.md |
| +++ b/docs/superpowers/specs/2026-08-01-carlos-platform-design.md |
| @@ -425,8 +425,14 @@ Assertions that fail builds, not paragraphs: |
| 2. **Graduation reversibility.** Is `carlos graduate` one-way in v1, or is |
| de-graduation (attached → embedded, for a tenant that shrank) worth its |
| complexity? |
| -3. **Naming.** The flagship deployment, the `carlos` binary's role names, |
| - and whether `svc/*` services get their own brand. |
| +3. **Naming.** ~~The flagship deployment~~ — resolved 2026-08-01: the |
| + flagship's control-plane surface lives at |
| + **`platform.carlosframework.com`**, and tenant apps get |
| + region-neutral addresses at **`<sqid>.oncarlos.com`** (Eleven's |
| + `<sqid>.11ch.at` pattern, platform-wide: the address never encodes |
| + region or host, so relocation and placement stay invisible to it; |
| + custom domains ride on top as aliases). Still open: the `carlos` |
| + binary's role names and whether `svc/*` services get their own brand. |
| ## 12. Deployment topology and rollout (added 2026-08-01) |
diff --git a/infra/flagship/dns.tf b/infra/flagship/dns.tf| new file mode 100644 |
| index 000000000..590260f5a |
| --- /dev/null |
| +++ b/infra/flagship/dns.tf |
| @@ -0,0 +1,31 @@ |
| +# Flagship addressing (spec §11 naming, resolved 2026-08-01): |
| +# platform.carlosframework.com -> the flagship edge (control-plane surface) |
| +# <sqid>.oncarlos.com -> tenant apps, region-neutral addresses |
| +# |
| +# carlosframework.com stays on GitHub Pages at the apex (the website repo) |
| +# until it migrates onto the platform's static class; only the `platform` |
| +# subdomain points here. oncarlos.com is NOT yet registered — the wildcard |
| +# block below activates once it exists in DNSimple (operator queue). |
| + |
| +# platform.carlosframework.com: the carlosframework.com zone lives in a |
| +# DIFFERENT DNSimple account than the Team Tito token can reach — the |
| +# operator adds that A record (-> the flagship EIP) by hand, or moves the |
| +# zone. Recorded in the operator queue. |
| + |
| +# oncarlos.com registered 2026-08-01 in account 74881 (registration |
| +# id 557301, auto-renew, whois privacy). |
| +resource "dnsimple_zone_record" "oncarlos_wildcard" { |
| + zone_name = "oncarlos.com" |
| + name = "*" |
| + type = "A" |
| + value = aws_eip.host_ie.public_ip |
| + ttl = 300 |
| +} |
| + |
| +resource "dnsimple_zone_record" "oncarlos_apex" { |
| + zone_name = "oncarlos.com" |
| + name = "" |
| + type = "A" |
| + value = aws_eip.host_ie.public_ip |
| + ttl = 300 |
| +} |
diff --git a/infra/flagship/region-ie.tf b/infra/flagship/region-ie.tf| index 49a741d91..3b8a43d1c 100644 |
| --- a/infra/flagship/region-ie.tf |
| +++ b/infra/flagship/region-ie.tf |
| @@ -99,7 +99,7 @@ resource "aws_instance" "host_ie" { |
| vpc_security_group_ids = [aws_security_group.host_ie.id] |
| iam_instance_profile = aws_iam_instance_profile.host.name |
| user_data = file("${path.module}/host-init.sh") |
| - user_data_replace_on_change = true |
| + user_data_replace_on_change = false |
| root_block_device { |
| volume_size = 20 |
| volume_type = "gp3" |
diff --git a/infra/tito/region-ie.tf b/infra/tito/region-ie.tf| index 587c0af61..cee70c7cd 100644 |
| --- a/infra/tito/region-ie.tf |
| +++ b/infra/tito/region-ie.tf |
| @@ -100,7 +100,7 @@ resource "aws_instance" "host_ie" { |
| vpc_security_group_ids = [aws_security_group.host_ie.id] |
| iam_instance_profile = aws_iam_instance_profile.host_ie.name |
| user_data = file("${path.module}/host-init.sh") |
| - user_data_replace_on_change = true |
| + user_data_replace_on_change = false |
| root_block_device { |
| volume_size = 40 |
| volume_type = "gp3" |
diff --git a/infra/tito/svc-pdf.tf b/infra/tito/svc-pdf.tf| index 7018001ed..a93f44cd1 100644 |
| --- a/infra/tito/svc-pdf.tf |
| +++ b/infra/tito/svc-pdf.tf |
| @@ -50,7 +50,7 @@ resource "aws_instance" "svc_pdf" { |
| vpc_security_group_ids = [aws_security_group.svc_pdf.id] |
| iam_instance_profile = aws_iam_instance_profile.svc_pdf.name |
| user_data = file("${path.module}/svc-pdf-init.sh") |
| - user_data_replace_on_change = true |
| + user_data_replace_on_change = false |
| root_block_device { |
| volume_size = 20 |
| volume_type = "gp3" |