Context
Part of epic #12204, syncer step 11. Discussion replies are already fetched but currently flattened into opaque > blockquote prose, losing parent to child structure and per-reply identity.
The Fix
Emit replies as identifiable sub-units with depth instead of flattened blockquote prose, enabling the Discussion view to render faithful nesting while preserving the existing top-level comment grammar. Replies are already fetched by DiscussionSyncer.mjs; this is an emit-shape and consumer-parser contract change, not a new GitHub fetch lane.
Contract Ledger
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback / Edge Case |
Docs |
Evidence |
DiscussionSyncer discussion reply emitter |
#12216 + #12204 syncer step 11 |
Preserve top-level ### comment headers; emit each reply immediately after its parent comment with a parseable depth marker, e.g. #### Reply depth=1 by @user on <ISO_Z>, followed by optional [!ANSWER] and the raw reply markdown body |
Current GitHub query exposes one reply level; use depth=1 now and keep the marker future-proof if deeper API data arrives |
JSDoc near the emitter + CONTENT_GRAMMAR.md Discussions section |
Focused DiscussionSyncer.spec.mjs assertion for parent comment + reply marker + accepted-answer reply |
CONTENT_GRAMMAR.md discussion grammar |
#12216 + current grammar doc |
Replace the flattened blockquote reply rule with the structured reply marker rule; specify parent association is lexical: replies belong to the preceding top-level comment until the next ### comment header |
Existing flattened reply blocks remain legacy-readable as parent-body markdown; do not split on bare --- |
CONTENT_GRAMMAR.md |
Grammar diff plus parser fixture |
| Portal discussion consumer |
#12216 + #12204 shared timeline contract |
Parse structured reply markers into child reply records under the parent comment; render nested-in-bubble for MVP while preserving .neo-timeline-item[data-record-id] and sections store stability |
Legacy flattened blockquotes remain rendered inside the parent comment body; per-reply canvas nodes stay v2 unless this ticket explicitly expands |
Portal.view.news.discussions.Component parser summary/update if parser changes |
Focused component/parser test or L3 portal discussion sample with nested reply |
Acceptance Criteria
Related
- Epic #12204.
- Corrects the earlier #12207 reference; #12207 is the timeline-section rename sub, not the parent epic.
- Unblocks the v2 per-reply-canvas-node enhancement; the Discussion view ships v1 nested-in-bubble unless a later ticket explicitly promotes per-reply canvas nodes.
Context
Part of epic #12204, syncer step 11. Discussion replies are already fetched but currently flattened into opaque
>blockquote prose, losing parent to child structure and per-reply identity.The Fix
Emit replies as identifiable sub-units with depth instead of flattened blockquote prose, enabling the Discussion view to render faithful nesting while preserving the existing top-level comment grammar. Replies are already fetched by
DiscussionSyncer.mjs; this is an emit-shape and consumer-parser contract change, not a new GitHub fetch lane.Contract Ledger
DiscussionSyncerdiscussion reply emitter###comment headers; emit each reply immediately after its parent comment with a parseable depth marker, e.g.#### Reply depth=1 by @user on <ISO_Z>, followed by optional[!ANSWER]and the raw reply markdown bodydepth=1now and keep the marker future-proof if deeper API data arrivesCONTENT_GRAMMAR.mdDiscussions sectionDiscussionSyncer.spec.mjsassertion for parent comment + reply marker + accepted-answer replyCONTENT_GRAMMAR.mddiscussion grammar###comment header---CONTENT_GRAMMAR.md.neo-timeline-item[data-record-id]andsectionsstore stabilityPortal.view.news.discussions.Componentparser summary/update if parser changesAcceptance Criteria
CONTENT_GRAMMAR.mddocuments the structured reply marker and the legacy flattened fallback.Related