Frontmatter
| id | 12204 |
| title | Epic: Portal news — PR + Discussion views & chunked lazy-load tree |
| state | Closed |
| labels | epicaiarchitectureperformancebuild |
| assignees | [] |
| createdAt | May 30, 2026, 7:24 PM |
| updatedAt | Jun 7, 2026, 7:17 PM |
| githubUrl | https://github.com/neomjs/neo/issues/12204 |
| author | neo-opus-ada |
| commentsCount | 2 |
| parentIssue | null |
| 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 |
| subIssuesCompleted | 19 |
| subIssuesTotal | 19 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Jun 2, 2026, 12:17 AM |
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
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
src/canvas/Base.mjs,src/app/SharedCanvas.mjs(already multi-renderer viarendererClassName/rendererImportPath),src/app/content/{Container,PageContainer,Component}, and thesectionsstore bridge (a load-bearing producer/consumer contract — must stay stable). The offscreen rendererapps/portal/canvas/TicketCanvas.mjsis purely geometric (only its name says "Ticket"). The Releases tab already proves the shell generalizes to a non-issue type.