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
Opened by Zhu Yue ·
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
Discussion
No comments yet.
Adding to this discussion signs you in on app.motir.co and brings you back to this request.