LearnNewsExamplesServices
Frontmatter
id12204
titleEpic: Portal news — PR + Discussion views & chunked lazy-load tree
stateClosed
labels
epicaiarchitectureperformancebuild
assignees[]
createdAtMay 30, 2026, 7:24 PM
updatedAtJun 7, 2026, 7:17 PM
githubUrlhttps://github.com/neomjs/neo/issues/12204
authorneo-opus-ada
commentsCount2
parentIssuenull
subIssues
12205 Neutralize the portal offscreen renderer into a shared TimelineCanvas
12206 Promote portal canvas view-glue (bridge + CanvasWrapper) to shared
12207 Rename timeline-node model/store TicketTimelineSection(s) → TimelineSection(s)
12208 Extract the shared timeline contract into Neo.app.content.Component
12209 Make portal content cross-link URLs per-content-type config
12210 Portal index generators for Pull Requests + Discussions (chunked output)
12211 Portal Discussion view — Portal.view.news.discussions (thin subclass)
12213 Portal Pull Request view — Portal.view.news.pulls (two-section parser)
12214 Document the canonical PR + Discussion markdown grammar by the syncers
12215 DiscussionSyncer: accepted-answer support (GraphQL query + emit marker)
12216 DiscussionSyncer: structured threaded replies (depth-aware emit)
12217 Refactor tickets index emitter → chunked-by-folder + path de-duplication
12218 Opt-in load-on-folder-expand for the shared portal TreeList
12219 Make tickets controller deep-link + default-route lazy-aware
12220 Correct tickets.mjs module JSDoc to the chunked-index reality
12265 Fix portal timeline import paths after shared move
12304 Switch portal tickets store to chunked lazy index
12309 Portal chunked trees: chunk folders display out of sequence (sortDate sort vs positional labels)
12317 Use bot avatar glyphs in Portal news summary views
subIssuesCompleted19
subIssuesTotal19
blockedBy[]
blocking[]
closedAtJun 2, 2026, 12:17 AM

Epic: Portal news — PR + Discussion views & chunked lazy-load tree

Closed v13.0.0/archive-v13-0-0-chunk-14 epicaiarchitectureperformancebuild
neo-opus-ada
neo-opus-ada commented on May 30, 2026, 7:24 PM

Context

The portal "news" section surfaces four content types (Medium, Blog, Tickets, Release Notes) but not Pull Requests or Discussions — both are synced to resources/content/{pulls,discussions}/ (+ archives) yet invisible to human visitors and SEO crawlers (originating ticket #10056). Separately, the tickets tree-index JSON (apps/portal/resources/data/tickets.json) has grown to ~1.5 MB / ~8,772 leaf rows, eager-loaded up front (autoLoad:true) — a portal-news performance problem.

A 6-agent analysis workflow produced a unified design tying both tracks together; this epic is its execution home. The two tracks share one emitted JSON shape, so they reinforce each other.

The Problem

  • Track A (views): add PR + Discussion views, reusing the existing ticket timeline + offscreen "Neural Timeline" canvas. The view stack is ~80% already generalized; the only irreducible specialization is the per-type markdown→timeline parser.
  • Track B (perf): the per-issue markdown is already lazy (fetched on leaf-select) and already split into chunk-N/ folders (ADR 0004). What is not chunked is the tree-index JSON — one monolith loaded whole. Map it to per-chunk-folder index files, lazy-loaded on tree-node expand.

The Architectural Reality

  • View shell is framework-level + content-agnostic: src/canvas/Base.mjs, src/app/SharedCanvas.mjs (already multi-renderer via rendererClassName/rendererImportPath), src/app/content/{Container,PageContainer,Component}, and the sections store bridge (a load-bearing producer/consumer contract — must stay stable). The offscreen renderer apps/portal/canvas/TicketCanvas.mjs is purely geometric (only its name says "Ticket"). The Releases tab already proves the shell generalizes to a non-issue type.
  • Per-type parser differences are real (verified against the synced corpus): Issue `