Authored by Opus 4.8 (Claude Code). Session 94a91ebc.
Resolves #12207
Foundation step 3 of epic #12204 (independent of #12206). Renames the timeline-node model + store to neutral names so the PR + Discussion views reuse them unchanged — their fields (color/icon/image/sourceId) are already content-agnostic and the model extends the generic Portal.model.ContentSection (which stays specialized-free).
Portal.model.TicketTimelineSection → Portal.model.TimelineSection (model/TicketTimelineSection.mjs → TimelineSection.mjs)
Portal.store.TicketTimelineSections → Portal.store.TimelineSections (store/TicketTimelineSections.mjs → TimelineSections.mjs)
- updated the
sections-store reference + import in view/news/tickets/MainContainerStateProvider.mjs
Per-content-type TREE models/stores (Ticket/Tickets, +PR, +Discussion) stay specialized. Pure rename, zero behavior change.
FAIR-band: over-target — sole active implementer on an operator-directed lane (epic #12204).
Evidence: L1 — grep TicketTimelineSection apps/portal == 0 after the rename; node --check passes on the model, store, and StateProvider; git records both files as renames (content preserved). Residual: L2 — Tickets-tab timeline still renders (post-merge / deploy).
Deltas from ticket (if any)
None — straight rename per the ticket.
Test Evidence
grep -rn TicketTimelineSection apps/portal --include='*.mjs' → 0 matches.
node --check on model/TimelineSection.mjs, store/TimelineSections.mjs, tickets/MainContainerStateProvider.mjs → all pass.
Post-Merge Validation
🤖 Generated with Claude Code
Authored by Opus 4.8 (Claude Code). Session 94a91ebc.
Resolves #12207
Foundation step 3 of epic #12204 (independent of #12206). Renames the timeline-node model + store to neutral names so the PR + Discussion views reuse them unchanged — their fields (
color/icon/image/sourceId) are already content-agnostic and the model extends the genericPortal.model.ContentSection(which stays specialized-free).Portal.model.TicketTimelineSection→Portal.model.TimelineSection(model/TicketTimelineSection.mjs→TimelineSection.mjs)Portal.store.TicketTimelineSections→Portal.store.TimelineSections(store/TicketTimelineSections.mjs→TimelineSections.mjs)sections-store reference + import inview/news/tickets/MainContainerStateProvider.mjsPer-content-type TREE models/stores (Ticket/Tickets, +PR, +Discussion) stay specialized. Pure rename, zero behavior change.
FAIR-band: over-target — sole active implementer on an operator-directed lane (epic #12204).
Evidence: L1 —
grep TicketTimelineSection apps/portal== 0 after the rename;node --checkpasses on the model, store, and StateProvider; git records both files as renames (content preserved). Residual: L2 — Tickets-tab timeline still renders (post-merge / deploy).Deltas from ticket (if any)
None — straight rename per the ticket.
Test Evidence
grep -rn TicketTimelineSection apps/portal --include='*.mjs'→ 0 matches.node --checkonmodel/TimelineSection.mjs,store/TimelineSections.mjs,tickets/MainContainerStateProvider.mjs→ all pass.Post-Merge Validation
🤖 Generated with Claude Code