Surfaces
Every hostname the fleet owns or references, each with an explicit class of LIVE, RETIRED-BY-DECISION or BROKEN. A status code by itself does not tell you the state.
Updated
Learn why a status code is not a state
Reads this page, explains the three classes and why a status code is evidence rather than a state, then quizzes you. Writes only its checklist.
PROMPT 1 of 2 — learn what the Surfaces page teaches: the three classes, why a status code is evidence rather than a state, and the three rules that keep a hostname table honest. You read and explain. You write one checklist file and nothing else.
I run my own agents and public surfaces. Skip basics.
FIRST — WRITE YOUR CHECKLIST TO A FILE
Write ~/SURFACES-LEARN-CHECKLIST.md and work from it:
# Surfaces — learn
- [ ] 1. Fetch the page
- [ ] 2. The three classes, and NEVER-EXISTED
- [ ] 3. The rows where a bare code lies
- [ ] 4. The three rules
- [ ] 5. Quiz me, then tell me to paste prompt 2
## Rules
- Read only. The checklist is the one file I write.
- Every claim quotes the page sentence it came from.
1 — FETCH
curl -s https://docs.utopiamodels.ai/docs/structure/surfaces.md
If that fails, say what came back and stop.
2 — THE CLASSES
Define LIVE, RETIRED-BY-DECISION and BROKEN, and why BROKEN is the only one that is a bug. Then tell the story the RETIRED-BY-DECISION class was born from: an auto-loaded doc still described a retired host as live, a master was dispatched to "restore" it, and the P0 was self-inflicted. Explain why "unclassified is broken" — the row with a plausible explanation and no decision record.
Add NEVER-EXISTED: a name cited in docs that never resolved. A citation is not a surface.
3 — WHERE A BARE CODE LIES
Walk through the rows the page uses to prove a status code is not a state:
- the docs host that read 307, then 301, then 200 while its class changed twice — a check reading only the first code calls it healthy, broken and healthy again
- the object-storage host: `/` is 404, a real object is 200, and there is no index — not a fault
- the admin UI that answers `200` with `redirects=0` and is completely gated, because it renders its login in page
4 — THE THREE RULES
1. No registry row means no check, and no check means nobody notices the day it breaks.
2. Neither a 200 nor redirects=0 proves a page is public. Report redirects and the final URL, and read the body.
3. Which edge served it matters: `cf-ray` = Cloudflare, `x-vercel-id` = Vercel, both = Cloudflare in front of a Vercel origin.
5 — QUIZ AND FINISH
Ask me three questions with the `AskUserQuestion` tool, one at a time, four options each, exactly one correct. At least one must present a status line and ask what class it supports. Quote the settling sentence after each.
If `AskUserQuestion` is unavailable in this session, ask the same questions as plain numbered text in one message instead.
Then say exactly this:
"Surfaces learned. Paste prompt 2 and I will classify every hostname you own."
Then stop.Classify every hostname I own, with evidence
Probes every hostname you own or cite with GET and HEAD only, and classifies each with dated evidence. Writes the table only after you confirm.
PROMPT 2 of 2 — build a classified surfaces table for MY hostnames: every name I own or cite, each with a class (LIVE · RETIRED-BY-DECISION · BROKEN · NEVER-EXISTED) and the evidence behind it. Probing is read-only; the table file is written only after I confirm where it goes.
HOW LONG THIS TAKES: a multi-step audit (5 steps, about 6 questions, one probe per hostname, writes only what you approve) — expect roughly 10–25 minutes across several turns. Running headless with a timeout? Budget for that, or start with a shorter prompt first. Cut off partway? Paste this prompt again — it resumes from its checklist rather than starting over.
curl -s https://docs.utopiamodels.ai/docs/structure/surfaces.md
Read it first if prompt 1 did not run in this session.
ASK EVERY QUESTION WITH the `AskUserQuestion` tool, with a RECOMMENDED option first and one line of why.
FIRST — WRITE YOUR CHECKLIST TO A FILE
RESUMING? Before you write anything, check whether ~/SURFACES-INTEGRATE-CHECKLIST.md already exists. If it does, this prompt was interrupted: read it, tell me which steps are already ticked, and continue from the first unchecked step. Do not overwrite it, do not redo a ticked step, and do not re-ask a question whose answer it already records — the scope answer under ## Rules included, if it's there. If ## Rules has no Scope field, this checklist predates the scope question: say so plainly in your first output line and ask it now, before anything else. Only if the file does not exist, write it fresh as below.
Write ~/SURFACES-INTEGRATE-CHECKLIST.md and work from it:
# Surfaces — integrate
- [ ] 1. Collect every hostname I own or cite
- [ ] 2. Probe each one properly
- [ ] 3. Classify, and find the decisions that are missing
- [ ] 4. Write the table where I choose
- [ ] 5. Propose the re-measure
## Rules
- Only GET/HEAD requests. No logins, no form posts, no changes to DNS or deploy config.
- Every row carries the date it was measured.
- A host I cannot reach from here is UNREACHABLE-FROM-HERE, never BROKEN.
SCOPE — ASK ME BEFORE YOU SURVEY ANYTHING OF MINE
Before step 1, ask me this with the `AskUserQuestion` tool, with both options exactly as written:
"Should I treat any path as off-limits, or do you want me to have full access to survey and propose changes anywhere in this environment?"
A — Exclude .env*, credentials and CI/deploy config (.github/workflows/, deploy keys) from anything I read or propose touching. [RECOMMENDED for most readers]
B — No exclusions. Full access to survey and propose anywhere, including secrets and CI files.
This is my preference, not a policy: some people want their agent to reach everything, some do not, and neither answer is the correct one. Never assume it and never pick for me. My answer governs every read and every proposal for the rest of this prompt. Write my answer under ## Rules in the checklist as "Scope: A" or "Scope: B", so it survives compaction. It governs the SURVEY and PROPOSE steps only — nothing gets written until step 4 (the table, where I choose) and step 5 (the script, if I choose it).
Before you ask, decide whether an answer can reach me at all. It cannot in a one-shot non-interactive run — `claude -p`, `codex exec`, `gemini -p`, a scripted or CI invocation — and you can tell without guessing: the `AskUserQuestion` tool is missing from your tool list there, while an interactive session has it. It also cannot if the question comes back immediately with no real answer. In either case do not ask, do not wait and do not re-ask: a question asked as plain text in a one-shot run ends the run with nothing done. This is the one case where you pick for me: treat A as my answer, record and hold it exactly as above, and make the first line of your output exactly: "No interactive scope answer available — defaulted to A (excluded .env*, credentials and CI/deploy config). To choose B, re-run this prompt in an interactive session and answer the scope question."
Only if the `AskUserQuestion` tool is in your tool list but fails when you call it, ask the same question as plain numbered text in one message instead.
1 — COLLECT
Hostnames come from three places, and the third is where NEVER-EXISTED rows come from:
- what I own: ask me for my domains with the `AskUserQuestion` tool (RECOMMENDED option: "read them from my DNS/registrar config if it is in a repo here"), or read them from deploy configs (vercel.json, wrangler.toml, cloudflared config, Caddyfile, nginx)
- what my infrastructure publishes: tunnel ingress rules, reverse-proxy configs
- what my own docs and agent instructions CITE:
grep -rhoE '[a-z0-9.-]+\.(com|ai|io|dev|app|shop|net|org)' --include='*.md' . | sort -u
2 — PROBE, PROPERLY
For each name, record all of this, not just a code:
dig +short <host>
curl -sS -o /dev/null -m 15 -L -w '%{http_code} redirects=%{num_redirects} final=%{url_effective}\n' https://<host>/
curl -sSI -m 15 https://<host>/ | grep -iE '^(server|cf-ray|x-vercel-id|location):'
And for any 200, read the first part of the body: is it the real page, or a login form rendered in page? A 200 with redirects=0 that renders a sign-in is GATED, not public.
For object storage, a 404 at `/` is not evidence of anything — probe one real object path if one is cited anywhere.
3 — CLASSIFY
LIVE intended to serve, and serving
RETIRED-BY-DECISION not serving, AND a decision says so — name where that decision is written
BROKEN not serving, and nothing says it was intended
NEVER-EXISTED cited somewhere, never resolved (NXDOMAIN, or delegated with no record)
The rule that does the work: if a host is not serving and you cannot point to a written decision, it is BROKEN, however plausible the explanation. List every row that would be RETIRED if someone wrote the decision down — that list is the finding.
Also list every LIVE host that nothing monitors. No row means no check.
4 — WRITE THE TABLE
Ask with the `AskUserQuestion` tool where it goes (RECOMMENDED: beside my other infrastructure docs, as SURFACES.md). Columns: hostname · class · what it is · evidence with date · edge (Cloudflare / Vercel / both / origin). Do not publish internal addresses in it if the file is public — use placeholders for anything that identifies private infrastructure.
5 — PROPOSE THE RE-MEASURE
A dated table decays. Propose ONE way to re-measure it — a script that re-runs step 2 and diffs the classes, run by hand or on a schedule I already have. Ask with the `AskUserQuestion` tool: write the script (RECOMMENDED) / just the table. Write only what I choose, then run it once and paste the real output.
When the writes are done, tell me in one line, filled in with the real paths:
"To undo, delete `~/SURFACES-INTEGRATE-CHECKLIST.md`, `<the folder I chose>/SURFACES.md` and <the re-measure script, if you wrote one> — nothing else on your system was touched."
Finish with: counts per class, every BROKEN row, every would-be-RETIRED row missing its decision, and every unmonitored LIVE host.A status code is not a state. Two hostnames can return the same 404 for completely different reasons.
One was switched off on purpose and is behaving correctly. The other broke by accident and nobody has
noticed. We once recorded both cases as a single "404" cell, and it cost the fleet a P0 incident. A master
was dispatched to "restore" a surface that someone had retired on purpose ten days earlier, and the
master did exactly what it was told.
So every row below has a class, and the class is the fact that lasts. The status code is evidence for the class. It does not replace the class.
| Class | Meaning |
|---|---|
| LIVE | Meant to serve, and serving. |
| RETIRED-BY-DECISION | Not serving, and that is correct. A human decided to switch it off, and we can point to where that decision is written. Do not "fix" one of these. |
| BROKEN | Not serving, and nothing says anyone meant that. This is the only class that is a bug. |
The bottom of the page uses a fourth label, NEVER-EXISTED, for names that appear in the fleet's own documents but have never resolved in DNS. These are not surfaces. They are references to surfaces that nobody ever built.
Some hostnames, addresses and object paths identify private infrastructure, such as the secret-store UI,
tunnel origins and the object-storage bucket. We show those as placeholders in angle brackets
(<tunnel-host>). Each row keeps its class, its evidence and its lesson. We withhold only the
identifying value.
The run that wrote this page measured every code below on 2026-08-16, from the fleet's own box. They are
dated evidence, not a live reading. For a current code, run curl -sI against the host yourself.
A dated table goes out of date, so treat each row as a claim to measure again, not a reading to trust.
Two rows have gone stale this way. We recorded creatives.utopiamodels.ai
as 200 until the 5am domain went live and the migration redirect started. That row went stale because
the world changed, not because anyone measured it wrong. A second measurement catches that kind of change,
and a careful first one cannot. The other row is docs.utopiamodels.ai, this host. Its root has changed
shape twice. It returned a 307 to /docs when this page was written, then a 301 off the host entirely
while it was retired, and today it returns a plain 200 (see its row below).
LIVE
| Hostname | Class | What it is | Basis (measured 2026-08-16) |
|---|---|---|---|
utopiamodels.ai | LIVE | The Org Command Center. This is the fleet's main dashboard, and the surface the founder actually watches | 200. It is the only host in the fleet that has Cloudflare in front and a Vercel origin behind, so the response carries both cf-ray and x-vercel-id |
www.utopiamodels.ai | LIVE | Alias for the apex | 200 |
docs.utopiamodels.ai | LIVE | This wiki | 200 at /, with no redirect in the chain (re-measured 2026-09-04). It has not always looked like that, and the history is why the row is here. When this page was written on 2026-08-16, / returned 307 and /docs returned 200. From 2026-08-30 the host was retired by decision and returned 301 to school.utopiamodels.ai on every path. On 2026-09-04 we brought it back and rewrote the root instead of redirecting it, so / now serves the docs index itself. A check that reads only the first code would have called this surface healthy, then broken, then healthy again, while its class never changed |
dmvresearch.shop | LIVE | The DMV Research storefront, with a real catalog, real prices and real revenue | 200 |
www.dmvresearch.shop | LIVE | Alias for the storefront | 301 to the apex |
dev.dmvresearch.shop | LIVE | The storefront's preview host | 200 |
dmvclothes.shop | LIVE | DMV ad-bridge site | 200 |
dmvresearch.io | LIVE | DMV ad-bridge site | 200 |
rawphones.com | LIVE | The RAW brand site, the public front of the phone brand | 200. A shared Vercel project serves it through a path rewrite (x-matched-path: /raw/index.html) |
www.rawphones.com | LIVE | Alias for the brand site | 308 to the apex |
nothing.utopiamodels.ai | LIVE | The RAW design "rip", a full reconstruction of a competitor's site that we use as a design reference | 200. It is by far the heaviest page the fleet serves |
raw1.utopiamodels.ai | LIVE | RAW design variant | 200 |
raw2.utopiamodels.ai | LIVE | RAW design variant | 200 |
raw3.utopiamodels.ai | LIVE | RAW design variant | 200 |
os.utopiamodels.ai | LIVE | The RTOS concept page | 200 |
hack.utopiamodels.ai | LIVE | The RAW investor deck | 200 |
community.utopiamodels.ai | LIVE | Community site, served by Cloudflare rather than Vercel | 200 |
creatives.utopiamodels.ai | GONE | The 5am agency's gallery of creative work. The name is plural. The singular name is a different host, and that one is dead | No DNS record, re-measured 2026-10-30. The agency domain it used to 301 to resolves to nothing either, since we froze 5am. We keep the row so that a reader who finds the name somewhere else learns it is gone instead of guessing |
<secret-store-ui-host> | LIVE | An admin UI for the secret store. The Cloudflare tunnel publishes it from a local port on the fleet's box | 200 and redirects=0, and still gated. Instead of redirecting to a login page, it renders a server-side Google SSO allow-list of exactly three accounts on the page itself. The usual reading, that "redirects=0 means ungated", is exactly wrong here. See rule 2 at the foot of this page |
<data-replica-host> | LIVE | A data-replica host, paired with the two always-on services on one master's box | 200. It has no registry row and no doc. It is a live public host on the company domain, and nothing would notice if it went down |
org.utopiamodels.ai | LIVE | A legacy name that redirects on purpose | 301 to https://utopiamodels.ai/, redirects=1. This matches the occ-redirect responder on the fleet's box |
<object-storage-host> | LIVE | Object storage for gallery media | Here a bare code is misleading. / returns 404, and so does a directory path, but a real object returns 200. We checked this against a real object path (<object-storage-host>/<prefix>/<object>.png). The host has no index, and that is not a fault |
RETIRED-BY-DECISION
| Hostname | Class | Basis |
|---|---|---|
raw.utopiamodels.ai | RETIRED-BY-DECISION | 404 DEPLOYMENT_NOT_FOUND, measured 2026-08-16. The founder retired it on 2026-08-06. This row is the reason the class exists. A doctrine file that loads automatically kept describing the host as live. A master read that file and was dispatched to restore the host, and we caused the resulting P0 ourselves. Do not fix this. It is off on purpose. |
BROKEN
| Hostname | Class | Basis |
|---|---|---|
<tunnel-host> | BROKEN | 530, which is Cloudflare error 1033 (the tunnel origin is unreachable). The edge never returns a 530 on purpose. One govcon spec names a cost teardown that could explain it, but there is no decision record and no registry row. By this page's own rules we cannot call it retired, and a host nobody has classified counts as broken |
creative.utopiamodels.ai | BROKEN | 404 DEPLOYMENT_NOT_FOUND. This is the singular form of the live plural creatives.. Either someone retired it without recording it, or nobody ever claimed the name. No registry says which, and that gap is the finding |
booking.tyleryouk.com | BROKEN | 404 DEPLOYMENT_NOT_FOUND. Meanwhile, an agent's durable memory still has a whole entry describing a working partnership flow at this address |
NEVER-EXISTED
The fleet's own documents mention these names, but they have never resolved. A reference is not a surface. Each of these exists only as text in a markdown file.
| Hostname | Class | Basis (measured 2026-08-16) |
|---|---|---|
rawnothing.utopiamodels.ai | NEVER-EXISTED | NXDOMAIN |
hack-creatives.utopiamodels.ai | NEVER-EXISTED | NXDOMAIN |
research.dmvresearch.shop | NEVER-EXISTED | NXDOMAIN |
bridge.dmvresearch.shop | NEVER-EXISTED | NXDOMAIN |
health.tyleryouk.com | NEVER-EXISTED | NXDOMAIN |
send.tyleryouk.com | NEVER-EXISTED | NOERROR, but there is no A record. The name is delegated and answers nothing |
How this table is kept honest
We learned three rules from costly mistakes:
- No registry row means no monitoring. Nothing can monitor a hostname that has no registry row, so nobody notices when it breaks. Several of the LIVE rows above have no entry in the fleet's component registry, and one of them serves on the company's own domain. Without a row there is no check, and without a check the breakage surfaces only when someone happens to look.
- Neither a 200 nor
redirects=0proves a page is public. An SSO gate redirects to a login page, and that login page itself returns200. So a check has to reportredirects=and the final URL, not only the status code. The opposite case is the mistake this page first shipped with. An app that renders its login on the page itself answers200withredirects=0and is still fully gated. The secret-store admin UI, two tables up, works exactly that way. A stranger's agent applied this rule correctly, saw200 redirects=0, and concluded that our secret store was open to the world. A status line only ever tells you that something answered. Read the body. - Which edge served it matters.
cf-raymeans Cloudflare andx-vercel-idmeans Vercel. Both together mean Cloudflare in front of a Vercel origin. If a doc says a hostname "does not touch the tunnel", that is a claim about routing, and onecurl -sIcan check it.
The skills layer
A skill is reusable agent behaviour stored as a directory with one markdown file. It reaches exactly one machine. The fleet has three delivery layers, and each one reaches a different set of machines.
Decisions
What the fleet built and killed, and why, with a source for each. Read this before you propose rebuilding any of it, because arguing again over a decision it already paid for is this fleet's most expensive recurring failure.