A project's public overview can no longer be edited from any UI — the in-place editor was deleted with the page and AMENDMENT 3 moved editing to the application, where no surface calls the door
Found while drawing MOTIR-4113 and writing its ## ⚠️ Planning flags, 2026-09-02. Out of MOTIR-3877's scope — that story re-hosts the public page; it does not build an authoring screen on app.motir.co.
The gap, in three shipped facts
- The editor was deleted. MOTIR-3951 removed
app/(public)/p/, and with itoverview-actions.ts— the only caller ofpublicProjectsService.setPublicOverview. The service method andtests/publicProjects/publicOverviewEdit.test.tswere kept. - AMENDMENT 4 row 7 decided the affordance is ABSENT from
motir.co— a cross-origin page cannot know who is looking, and a long-form authoring act belongs where the author already signs in. Editing lives in the application. - MOTIR-4114 built the door —
PATCH /api/projects/{key}/public-overview, session-read,canManage-gated through the service, cloud-gated, tested. Nothing calls it.
✅ DECISION — recorded 2026-09-02 by the run that stopped on this card
The overview is edited in the application's project settings, as its own room: Settings › Project › Public page at /settings/project/public. Active-project-scoped like every other settings room; one entry in lib/settings/projectSettingsNav.ts; it saves through PATCH /api/projects/{key}/public-overview with the active project's key, so the one service path and the one gate are unchanged. Rung 1: a public portal served from another host (Canny, Productboard, a Notion publish-to-web page) is authored in the admin application's settings. Rung 2: every authoring surface in app/(authed)/ is an active-project settings room, and the settings area already owns the public concerns. Rejected: a project-keyed authoring route outside settings — no shipped precedent, a second navigation model for one screen. What a manager arriving from motir.co sees: no edit affordance; they sign in to app.motir.co, pick the project, open Settings › Public page — the design's Panel D.
⚠️ RE-SCOPED 2026-09-02 — after the design (MOTIR-4205) landed, this card is the ROOM and only the room
The design's GIVES / TAKES sweep found the card outgrown (5 SP / 90 min against a cloudOnly registry flag, a hero-field read no shipped method returns, a tag-chip control, a THIRD /p/<key> retarget with a host accessor, and the zh half of ~34 keys). Split at the architecture:
- The three Members-room retargets + the public-host accessor + the sweep test → the sibling bug (The Members room's three public-page links still point at the app host). Not this card's any more.
- The mount — the registry entry with
cloudOnly,page.tsxwith its guard and off-cloud 404, the widened read → the sibling task (Mount the Public page room). This card isblocked_byit. - This card: the room's client island and its save, built to
design/projects/public-page.mock.htmlPanels B and C.
What to build
The island the mount's page.tsx renders, per the notes' The room and States: one SettingsCard (Hero & README, Globe, the View public page link in the head while the project is public); the tagline Input with the cap as helper; the tags group — neutral Pill chips each with a remove button, the two-state Add tag control (rest: secondary sm button; on click: a small inline input, Enter adds, Esc cancels), an n / 8 count, No tags yet; the shipped MarkdownEditor at size="full" (WYSIWYG — no write/preview toggle); the AI-planning footer save bar. One PATCH with all three fields; the success response is the confirmation (no router.refresh()); the three service errors land on their fields (ProjectTaglineTooLongError → the tagline's box error, ProjectTagsInvalidError → the tags' line, ProjectOverviewTooLongError → the editor); any other failure is the toast, edits kept; the unsaved-changes guard from panel 1d. Caps come from lib/publicProjects/limits.ts, never retyped. The not-yet-public band (--el-tint-sky, Info) when accessLevel !== 'public'. The ~30 publicPage.* keys in en and zh from the notes' catalog.
Acceptance criteria
- A project admin can edit the public overview — tagline, tags and README body — from
Settings › Project › Public page, without a database console. - The room matches
design/projects/public-page.mock.htmlPanel B, and every state in Panel C (empty, unsaved changes, saving, per-field errors, saved, not yet public) renders as drawn; a component test drives each. - The surface reaches
publicProjectsService.setPublicOverviewthroughPATCH /api/projects/{key}/public-overview; no second service path, no second gate. - The public page's rendered output is asserted to change after an edit — the seam, not just the write:
GET /api/public/p/{identifier}returns the newpublicOverviewMd/ tagline / tags after the room saves. - A test drives the partial-author contract: a cleared tagline arrives as
null; the three fields save together. - The three service errors map to their fields with the notes' copy; a non-service failure shows the toast and keeps the edits.
- Navigating away with pending edits asks first (Discard unsaved changes? — Keep editing / Discard).
- Every rendered string comes from the catalog in
enandzh; no visible string reads "tracker", "issue" or "card" for a work item. - Its own tests ship with it; no full-suite and no
--coveragerun locally.
Context refs
motir-core/design/projects/public-page.mock.htmlPanels B + C,design/projects/design-notes.md§ Public page — the room in project settings — the design of record (evidencecmtksry1v000bhxphj58nzy4x)motir-core/app/api/projects/[key]/public-overview/route.ts— the door;lib/services/publicProjectsService.tssetPublicOverview(:493)motir-core/lib/publicProjects/limits.ts— the capsmotir-core/components/ui/MarkdownEditor.tsx·components/settings/SettingsCard.tsx·app/(authed)/settings/project/ai-planning/_components/AiPlanningSettingsEditor.tsx:449 (the footer grammar) ·app/(authed)/settings/project/_components/ProjectDetailsCard.tsx(SaveStatus)motir-core/design/public-projects/public-projects.mock.htmlpanels 1c / 1d — the editor elements, citedmotir-core/tests/api/public-overview-write-route.test.ts·tests/publicProjects/publicOverviewEdit.test.ts- MOTIR-4205 — the design; the sibling task (the mount) and sibling bug (the retargets) proposed on plan
cmtkstbl9000vhxphhlymiw9q