carlos / platform Public

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>
Paul Campbell 71df9f8cddb25812f0e6e753258536d255e85ce7 parent f4523b6
5 files changed, +42 −5
  • docs/superpowers/specs/2026-08-01-carlos-platform-design.md +8 −2
  • infra/flagship/dns.tf +31 −0
  • infra/flagship/region-ie.tf +1 −1
  • infra/tito/region-ie.tf +1 −1
  • infra/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"