motir.co becomes the address of Motir's public reading surface, and motir-core is what answers for /explore, /docs and the crawl directives there. app.motir.co keeps the authenticated application and redirects the paths it is losing.
It was authored as "the landing comes home": port motir-marketing's landing into motir-core so one origin serves everything. That is rejected — motir-core is GPL-3.0 and may not carry Motir's marketing material. The landing stays where it is; what moves is the ADDRESS of the surfaces motir-core already owns. Three children are superseded by the reversal and archived with this re-plan; the rest survive and are re-scoped by this story's own planning pass.
motir.co must now be composed from TWO origins (motir-marketing for the landing and /legal, motir-core for /explore, /docs and /p/*), and two Fly applications cannot both answer an apex. The record chooses the arrangement, states what the session cookie does under it, and says what a self-hosted build serves at each path. Its inputs are on the card.robots.txt and one sitemap.xml per host, host-aware — including creating app/robots.ts, which does not exist at all today (MOTIR-3726).MOTIR_BASE_URL, so one variable stops answering two different questions.motir-marketing serves. It is one chrome across two repositories, which is what makes it a design card rather than a component.app.motir.co, plus the in-code sweep of every reader of the old address.The apex does not move until the cutover story runs, and the gap between this story's deploy and that cutover is unbounded. So everything here ships inert: the public-site origin falls back to the APPLICATION origin while it is unconfigured — not to the dev origin, which would publish localhost canonicals in production for the whole window — and every 301 is a no-op while the two origins are equal, which is otherwise a self-redirect loop on /explore and /docs the moment this deploys. Both are acceptance criteria on the cards that own the switch, tested as their own arms.
/p/*. Public project pages are MOTIR-3877's, which is blocked_by this story./explore at all is the cloud-gate story's; this one is about the address./legal — that content leaves motir-core entirely in its own story.motir-marketing.motir-marketing when this story is done; the cutover story does that, and is blocked_by this one.app/(authed)/ is unchanged and app.motir.co remains the session's host./explore and /docs rendering under the shared public chrome with both hosts simulated, robots.txt and sitemap.xml per host, the moved application paths redirecting, and /p/* still answering 200 on the application host.grep for the old address, with a disposition per hit.app.motir.co/explore still returns 200, and motir.co is still served by motir-marketing.The live walk on motir.co belongs to the cutover story's recipe, not this one's.
done; the repository set is motir-core alone — one code pull request plus the design child's own approval pull request.robots.txt and one sitemap.xml per host, each listing only what that host serves.tests/hosting/appUrlSeam.test.ts already uses.motir-core — app/(public)/, lib/baseUrl.ts, lib/publicProjects/urls.ts, proxy.ts, tests/navigation/proxy-matcher.test.ts, tests/hosting/appUrlSeam.test.tsmotir-marketing — the landing that STAYS, and the chrome this story's design must matchmotir-core/docs/decisions/marketing-site-hosting.md — the record the ADR amends; it decided WHERE the site runs and never asked which repository owns whatapp/robots.ts