/p/* 404s on BOTH hosts in production — the public pages were deleted ahead of their replacement, and motir.co/explore links into the hole
Measured on the live hosts, 2026-09-01, while planning MOTIR-3877:
| request | response |
|---|---|
GET https://app.motir.co/p/MOTIR | 404 |
GET https://motir.co/p/MOTIR | 404 |
GET https://motir.co/explore | 200, and its cards render href="/p/MOTIR" |
GET https://app.motir.co/api/public/p/MOTIR | 200 — the data is fine; only the pages are gone |
So the live public directory advertises at least one project and every card on it leads to a 404. Anyone holding a shared /p/<identifier> link, or subscribed to app.motir.co/p/<identifier>/changelog.xml, gets the same.
How it happened — no single card is wrong
MOTIR-3951 (under MOTIR-3932) deleted app/(public)/{_components,docs,explore,p} from motir-core. Its own commit message says /p/* "stays served here (asserted)" — but that sentence was written for MOTIR-3884's redirect scope, and the deletion in the same pull request removed the page it referred to. The fallout commit corrected it the other way: /p joined PUBLIC_REDIRECT_SEGMENTS so the path would 308 rather than 404 — but publicSiteRedirect() returns null while MOTIR_PUBLIC_SITE_URL is unset, and setting it is THE CUTOVER's, which is blocked. Meanwhile /explore shipped to motir.co (MOTIR-4045) with same-origin /p/ links, and the pages those links point at are MOTIR-3877's, which has not started.
Every card did what it said. The defect lives between them: a surface was retired before its replacement existed, and the surface that links to it went live in the gap.
What this card is NOT
It is not "finish MOTIR-3877". That story restores /p/* properly and is now highest; this card is the INTERIM disposition for the window before it lands, and it must be discharged by something far smaller than that story.
The dispositions, and none is pre-picked
The measurement above establishes the symptom, not the remedy. Weigh at least these, and record which was chosen and why:
- Suppress the dead links —
/explorerenders project cards without a/p/href (or without the card entirely) while the destination does not resolve. - Answer at
motir.co/p/*with an honest interim page — a stub that says the page is moving, with a link back, so a shared link is not a 404. - Hold
/exploreback — de-index or gate the directory until its destinations exist. - Accept the window — record the decision, its expected duration, and what is done about the feed subscribers, rather than leaving it undecided.
Whichever is chosen must survive MOTIR-3877 landing: an interim measure that has to be remembered and removed later is only acceptable if this card also names the card that removes it.
Acceptance criteria
- A visitor at
motir.co/explorecan no longer reach a 404 by following a link the page renders — verified by requesting every/p/href the live page emits. - The chosen disposition is recorded on this card with its reason, and the alternatives above are each marked chosen or rejected.
- If the disposition leaves anything to undo once MOTIR-3877 lands, this card names the work item that undoes it and that item exists.
- The disposition for the changelog feed subscribers (
app.motir.co/p/<id>/changelog.xml, whose builder has had no caller since the deletion) is stated — fixed here, or explicitly left to MOTIR-3877's crawl-surface card. - Whatever ships is asserted by a test in the repository it ships in, so the dead-link state cannot silently return.
- Re-measured against the LIVE hosts after the deploy, not against the merge — a change to
app/explore/is live only onceci.yml'sdeployjob has run.
Context refs
motir-marketing/app/explore/_components/Gallery.tsx:56—href={/p/${encodeURIComponent(card.identifier)}}, the link that leads nowheremotir-core/proxy.ts—PUBLIC_REDIRECT_SEGMENTS, andpublicSiteRedirect()returningnullwhile the public origin is unsetmotir-core/app/(public)/p/@95a2d4468^— the twelve deleted filesmotir-core/lib/publicProjects/atomFeed.ts— the feed builder with no callermotir-core/docs/decisions/public-surface-hosts.md§2, §8 — the arrangement this window sits inside