Skip to content

moooon

Motir

Vibe your whole project. Bring an idea — Motir's three AI layers plan it, track it, and ship it, end to end. You're looking at Motir, built in Motir.

  • Vibe Project
  • Open Source
  • AI Agent
  • AI Loop
1
requests
0
upvotes
145
planned
1,361
shipped

Motir · Roadmap

MOTIR-4123Blocked

/p/* 404s on BOTH hosts in production — the public pages were deleted ahead of their replacement, and motir.co/explore links into the hole

Opened by Zhu Yue ·

Measured on the live hosts, 2026-09-01, while planning MOTIR-3877:

requestresponse
GET https://app.motir.co/p/MOTIR404
GET https://motir.co/p/MOTIR404
GET https://motir.co/explore200, and its cards render href="/p/MOTIR"
GET https://app.motir.co/api/public/p/MOTIR200 — 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/explore renders 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 /explore back — 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/explore can 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 once ci.yml's deploy job has run.

Context refs

  • motir-marketing/app/explore/_components/Gallery.tsx:56href={/p/${encodeURIComponent(card.identifier)}}, the link that leads nowhere
  • motir-core/proxy.tsPUBLIC_REDIRECT_SEGMENTS, and publicSiteRedirect() returning null while the public origin is unset
  • motir-core/app/(public)/p/ @ 95a2d4468^ — the twelve deleted files
  • motir-core/lib/publicProjects/atomFeed.ts — the feed builder with no caller
  • motir-core/docs/decisions/public-surface-hosts.md §2, §8 — the arrangement this window sits inside

Discussion

No comments yet.

Adding to this discussion signs you in on app.motir.co and brings you back to this request.

Add a comment