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 · Work items

MOTIR-324Done

5.7.12 Flip the `transitioned` matrix seam to settable + real copy (en/zh) — depends on both channels being real (5.7.10 + 5.7.11)

Estimate: 16m · Depends on: 5.7.10, 5.7.11

Why this exists + why BLOCKED. This is the surface symptom of the bug (/settings/account draws the "An item you're watching changes status" row disabled with a "Soon" tag + "Available once issue-watching ships (Story 5.4)" copy, though 5.4 shipped). 5.7.6 drew it "disabled until 5.4 lands" with no flip-subtask, and 5.4 had already landed — the static disable became permanent (notes.html mistake #40). The flip is one boolean + two strings, BUT it MUST land AFTER 5.7.10 (in-app delivery) and 5.7.11 (email gate) — otherwise enabling the toggles ships DECORATIVE controls (the "worse than disabled" defect). Hence dependsOn: [5.7.10, 5.7.11]; seeded blocked until both are done, then flip to planned in the same seed/* PR that lands the second blocker.

Fix.

  1. lib/notifications/preferences.ts — flip the transitioned row settable: falsetrue; rewrite the line-70 comment from the "drawn disabled until issue-watching ships" seam note to one that states: watcher transition events (Story 5.4 — shipped) are fanned in by 5.7.10 (in_app) + 5.4.5/5.7.11 (email), gated by the user’s transitioned·{channel} cell. (Defaults are already { email: true, in_app: true } — correct; the resolver does the right thing the moment the flag flips.)
  2. messages/en.json + messages/zh.json — replace settings.account.notifications.events.transitioned.desc (KEEP the label) with real present-tense copy mirroring the other three rows, e.g. en "Someone changes the status of an item you watch (including moves to done or back open)."; zh a translation of the same (replace the 即将推出 / Story-5.4 placeholder). Both locales flip together.
  3. No UI change — NotificationPreferencesCard.tsx already branches on row.settable (the "Soon" tag drops, the switches enable, the aria-label flips cellAriaSooncellAria automatically).

Acceptance criteria

  • The /settings/account matrix transitioned row is ENABLED: both switches clickable, no "Soon"/即将推出 tag, helper text is the new real copy (en + zh both updated); aria-label is cellAria not cellAriaSoon.
  • notificationPreferencesService.setPreference no longer throws NotificationEventTypeNotSettableError for eventType: "transitioned"; the matrix DTO from GET /api/notification-preferences reports settable: true for the row.
  • Toggling each cell persists and the cell trusts the response (the inline-edit no-tree-refresh contract holds); the three existing rows are unchanged (defaults, AA contrast).
  • Audit grep (grep -rn "Available once\|settable: false\|until.*ships\|ships (Story") across app components lib messages finds no remaining stale "coming once Story X ships" guard whose Story X is already done (the audit is the rule, not just this row).

Context refs

  • lib/notifications/preferences.ts (the transitioned settable flag + line-70 comment)
  • messages/en.json + messages/zh.jsonsettings.account.notifications.events.transitioned
  • app/(authed)/settings/account/_components/NotificationPreferencesCard.tsx (no change; branches on row.settable / cellAria vs cellAriaSoon already)
  • lib/services/notificationPreferencesService.ts (setPreference — the not-settable throw that stops gating once flipped) + the matrix DTO
  • The superseded bug bug-notification-pref-transitioned-still-disabled-after-5-4-shipped (tombstoned — its "minimal flip" premise was wrong) + notes.html mistake #40