Authored by Opus 4.8 (Claude Code). Session 94a91ebc.
Resolves #12205
Foundation step 1 of epic #12204. Neutralizes the portal's offscreen "Neural Timeline" renderer so the upcoming Pull Request + Discussion views can reuse it unchanged. The renderer was already content-agnostic (its draw loop reads only node.x/y/radius/color); only its identity said "Ticket".
Renames Portal.canvas.TicketCanvas → Portal.canvas.TimelineCanvas (apps/portal/canvas/TicketCanvas.mjs → TimelineCanvas.mjs) and updates its two consumers:
apps/portal/canvas/Helper.mjs — the importTicketCanvas remote method + its dynamic import path.
apps/portal/view/news/tickets/TimelineCanvas.mjs (the App-worker bridge) — rendererClassName + rendererImportPath + JSDoc references.
Pure rename, zero behavior change.
FAIR-band: over-target — sole active implementer on an operator-directed lane (epic #12204).
Evidence: L1 — grep TicketCanvas apps/portal src == 0 after the rename; node --check passes on all three changed files; git records the renderer as a rename (content preserved). Residual: L2 — visual confirmation that the Tickets-tab timeline still animates (post-merge / deploy).
Deltas from ticket (if any)
- Renderer named
Portal.canvas.TimelineCanvas (kept in apps/portal/canvas/, matching the <Subject>Canvas sibling convention — FooterCanvas/HomeCanvas/ServicesCanvas) rather than relocated to src/canvas/: the reuse scope is portal content types, not framework-wide. The basename overlap with the view-layer bridge Portal.view.news.tickets.TimelineCanvas is namespace-distinct and is resolved when #12206 promotes/renames that bridge.
Test Evidence
grep -rn TicketCanvas apps/portal src --include='*.mjs' → 0 matches.
node --check on canvas/TimelineCanvas.mjs, canvas/Helper.mjs, view/news/tickets/TimelineCanvas.mjs → all pass.
- No
.scss / .json / test references to the old name.
Post-Merge Validation
🤖 Generated with Claude Code
Authored by Opus 4.8 (Claude Code). Session 94a91ebc.
Resolves #12205
Foundation step 1 of epic #12204. Neutralizes the portal's offscreen "Neural Timeline" renderer so the upcoming Pull Request + Discussion views can reuse it unchanged. The renderer was already content-agnostic (its draw loop reads only
node.x/y/radius/color); only its identity said "Ticket".Renames
Portal.canvas.TicketCanvas→Portal.canvas.TimelineCanvas(apps/portal/canvas/TicketCanvas.mjs→TimelineCanvas.mjs) and updates its two consumers:apps/portal/canvas/Helper.mjs— theimportTicketCanvasremote method + its dynamic import path.apps/portal/view/news/tickets/TimelineCanvas.mjs(the App-worker bridge) —rendererClassName+rendererImportPath+ JSDoc references.Pure rename, zero behavior change.
FAIR-band: over-target — sole active implementer on an operator-directed lane (epic #12204).
Evidence: L1 —
grep TicketCanvas apps/portal src== 0 after the rename;node --checkpasses on all three changed files; git records the renderer as a rename (content preserved). Residual: L2 — visual confirmation that the Tickets-tab timeline still animates (post-merge / deploy).Deltas from ticket (if any)
Portal.canvas.TimelineCanvas(kept inapps/portal/canvas/, matching the<Subject>Canvassibling convention — FooterCanvas/HomeCanvas/ServicesCanvas) rather than relocated tosrc/canvas/: the reuse scope is portal content types, not framework-wide. The basename overlap with the view-layer bridgePortal.view.news.tickets.TimelineCanvasis namespace-distinct and is resolved when #12206 promotes/renames that bridge.Test Evidence
grep -rn TicketCanvas apps/portal src --include='*.mjs'→ 0 matches.node --checkoncanvas/TimelineCanvas.mjs,canvas/Helper.mjs,view/news/tickets/TimelineCanvas.mjs→ all pass..scss/.json/ test references to the old name.Post-Merge Validation
🤖 Generated with Claude Code