THE CUTOVER — the redirects and the external registrations (the apex does NOT move)
Opened by Zhu Yue ·
⚠️ RE-SCOPED 2026-08-29 — there is NO apex repoint, and that is most of this story gone
This story was written for a cutover that moved motir.co from one Fly application to another. In the decided arrangement it does not move: motir.co's A / AAAA records already point at the motir-marketing Fly app, which is the application that will serve the whole public surface. Nothing about the zone changes.
So the DNS edit, the certificate, and every warning about the apex's crowded record set are OUT OF SCOPE — with them go the SPF permerror hazard and the Search Console verification-token hazard, which were the two expensive risks this story carried. What remains is real but ordinary:
- the 301s from
app.motir.co/{explore,docs,legal,p}/*tomotir.co, once the replacements are live; - the external registrations that name an origin — Google OAuth redirect URIs, Better-Auth
trustedOrigins, any baked-in origin in the CLI or MCP defaults; - the Search Console sitemap submission for the surfaces that newly appear on
motir.co; - a smoke of the whole journey against the live hosts.
The sections below were written for the apex move and are superseded; the story needs re-planning to the list above before any child is run.
The out-of-band half, and the only part of this epic no pull request can carry. Every other story ends merged and deployed with nothing a visitor can see having changed. This story is where the change becomes real: the apex records, the certificate, the deployed origin values, and the external registrations that break a live journey if they lag.
Why it is a story of its own — the DEPLOY BOUNDARY
A container is completed by merging the pull request that carries its children's work, and completing a container closes its children. So every card whose acceptance criteria read a deployed environment — dig, fly certs show, curl -sI https://motir.co/, a console — has no legal position inside a container whose own merge produces that deployment: its pull request will not open while such a child is un-landed, and the child cannot be done until it merges. That is what went wrong in the first version of this epic, and it is why the post-deploy work is a container of its own that the code stories blocks.
Scope
- The apex. Repoint
motir.coat whichever origin the ADR chose, read from the platform at the time. Change only the address records — the zone also carries the mail exchangers, a singlev=spf1, the DKIM key, the shared DMARC policy and Search Console's verification token, all published by other cards for other reasons. Twov=spf1at one name is a permanentpermerrorthat fails CLOSED and takes human and transactional mail down together; deleting the verification record un-verifies the Domain property for every subdomain. - The certificate, confirmed from the platform's own output rather than from a repository file.
- The deployed origin values — the public-site origin and
MOTIR_BASE_URLas they are actually set on the running application, read back after setting. - The external registrations, in the same sitting: Google OAuth authorised redirect URIs, Better-Auth
trustedOriginsas deployed, any baked-in origin in the CLI or MCP defaults, and the Search Console sitemap submission.
⚠️ Every state claim in this story's cards is a HYPOTHESIS with a verified-no-change exit
These cards act on systems no agent can read. Each step re-reads before it writes, and where a reading differs from what the card records, it STOPS and the deviation is written up before anything changes. A DNS zone is exactly the shape where a stale premise is destructive.
Boundary
motir-marketingis NOT retired. The first version of this epic ended by emptying and archiving that repository, because it assumed the landing was moving intomotir-core. That direction is reversed:motir-marketingkeeps the landing and gains/legal, so it is a live repository with a live deployment. Nothing here retires anything.- It ships no diff. Every child is
manual/human; there is no pull request and no repository to pin. - It decides nothing. The ADR is MOTIR-3876's; this story performs what that record chose.
Verification recipe
https://motir.co— the landing renders, with its doors.- Explore, Docs, a public project and a legal document each render on
motir.co, under one chrome. https://motir.co/robots.txtand/sitemap.xml— one of each, listing the surfaces this host serves.https://app.motir.co/explore— a permanent redirect tohttps://motir.co/explore, query preserved.- Sign in from the landing — the visitor arrives in the application on
app.motir.co, and the session cookie is still host-only. - Mail to and from the moooon mailbox still delivers, after the DNS edit.
Acceptance criteria
- Every child is
done; the story ships no pull request in any repository. - Every platform reading is pasted into a close-out comment with its timestamp — the platform's own words, not a summary, and no step is accepted on a repository file or a dashboard screenshot alone.
- The zone's
MXandTXTrecords are byte-identical before and after; the diff is the address records only. - A test mail is sent and received both ways after the DNS edit, proving the mail records survived it.
- The journey above holds end to end against the live hosts.
- If any reading differs from what a card records, the card STOPS and the deviation is written up before anything is changed.
Context refs
- MOTIR-3876 — the ADR that chose the arrangement this story performs; this story is
blocked_byit - MOTIR-2596 — the apex record table and the SPF / DMARC warnings this story obeys
- MOTIR-1155 — the Search Console Domain property and its apex verification record
- MOTIR-1455 — provisioned the records this story repoints
- 8.10 — the launch smoke reads the addresses this story publishes
Advisory dispositions
reference→ 8.10 (severityadvisory): not consumed; the dependency runs the other way. The launch story's smoke reads the addresses this story publishes, so if either edge is owed it is 8.10blocked_bythis story — a story-level edge between two siblings under this epic, which is 8.10's to carry when it is next planned. This story consumes nothing 8.10 produces.
Discussion
No comments yet.
Adding to this discussion signs you in on app.motir.co and brings you back to this request.