diff --git a/dashboards/tracker-web/docs/roadmaps/BACKEND_ENABLERS.md b/dashboards/tracker-web/docs/roadmaps/BACKEND_ENABLERS.md new file mode 100644 index 00000000..6c01f8d4 --- /dev/null +++ b/dashboards/tracker-web/docs/roadmaps/BACKEND_ENABLERS.md @@ -0,0 +1,87 @@ +# tracker-web โ€” Backend Enablers + +> Follow-ups that **cannot ship from `dashboards/tracker-web` alone** because they require a change +> to the shared `services/platform-service`. They are the only remaining items on the +> [UX integration roadmap](UX_INTEGRATION_BYTELYST.md) and are **excluded from its โœ… count** until +> the backend enabler lands. +> +> **Hard constraint for every item below:** `platform-service` is **shared by 9 products** +> (LysnrAI, MindLyst, ChronoMind, JarvisJr, NomGap, PeakPulse, FlowMonk, NoteLett, ActionTrail, +> EffoRise, LocalMemGPT โ€” see `AGENTS.md`). Every change here **must be additive and +> backward-compatible**: no behavioural change for products that do not opt in, existing rows/reads +> keep working, and every persisted document keeps its `productId`. + +| ID | Title | Blocks | Target module | Status | +| ---- | ----------------------------------------------------- | ------------------------------ | ------------------------------------------------------------------------- | -------------- | +| BE-1 | Server-side HTML sanitization for item/comment bodies | UX-12.3 (rich-text) | `services/platform-service` โ€” items + comments write paths | ๐Ÿ”’ Not started | +| BE-2 | Tracker-event notifications feed | UX-13.1 (`NotificationCenter`) | `services/platform-service` โ€” notifications module + `/api/tracker` proxy | ๐Ÿ”’ Not started | + +--- + +## BE-1 โ€” Server-side HTML sanitization for `items.description` + `comments.body` + +- **Title:** Sanitize rich HTML on the item-description and comment-body write paths. +- **Blocking roadmap item:** [UX-12.3](UX_INTEGRATION_BYTELYST.md#ux-12--detail--board-richness-tabs--tooltip--drawer--timeline--rich-text) + โ€” adopt `@bytelyst/rich-text` `RichTextEditor` / `RichTextViewer` in tracker-web. +- **Target module:** `services/platform-service` โ€” the **items** module (`items.description`) and the + **comments** module (`comments.body`), applied **server-side before persist** (create + update). +- **Why it's blocked:** Today `TrackerItem.description` and `Comment.body` are plain `string`s + rendered with `whitespace-pre-wrap`; the `/api/tracker/*` proxy neither stores nor sanitizes rich + HTML. Adopting a rich-text editor client-side would persist attacker-controlled HTML with no + server-side sanitization (stored-XSS), so it must not be done until the backend guarantees safety. + +### Acceptance criteria + +- HTML is sanitized **on the server** (never trust the client) on every write to `items.description` + and `comments.body` (create and update). +- **Allowlist** of formatting tags only โ€” e.g. `p`, `br`, `strong`, `em`, `u`, `s`, `a`, + `ul`/`ol`/`li`, `blockquote`, `code`, `pre`, `h1`โ€“`h3`. Everything else is stripped/escaped. +- **Attribute allowlist:** only safe attributes survive; `a[href]` is restricted to + `http:` / `https:` / `mailto:` schemes (and gets `rel="noopener noreferrer"`). +- **Stripped unconditionally:** `