Skip to content

surface linked FableLoom branching narratives inside series management - #4810

Merged
atomantic merged 1 commit into
mainfrom
claim/issue-4785
Aug 22, 2026
Merged

surface linked FableLoom branching narratives inside series management#4810
atomantic merged 1 commit into
mainfrom
claim/issue-4785

Conversation

@atomantic

Copy link
Copy Markdown
Owner

Summary

Surfaces FableLoom looms inside series management at the presentation/cross-linking layer. Per the issue's decision, a loom stays its own record — no seriesType: 'branching' enum on pipeline_series, no pipeline_series schema change, no schema-version bump.

  • GET /api/fableloom?seriesId= scopes the index to one series' looms (loomListQuerySchema in server/lib/fableLoomValidation.js, filtering in listLoomSummaries). A blank value is a no-op filter rather than a 400, so a caller can build the query from a possibly-unset id; a dangling id matches nothing instead of throwing.
  • Series detail page gains a "Branching narratives" card (SeriesLoomsPanel) listing linked looms with their episode/scene/ending counts and a link into /fableloom/:loomId — mirroring how CatalogCastPanel surfaces linked catalog records.
  • "New branching narrative" action mints a loom pre-linked to the series and its universe, then lands in the editor.
  • Series index badges each row with its linked-loom count. A failed loom fetch degrades to "no badges", never a broken list.
  • Loom editor header gains a series backlink. The ref is soft in both directions: deleting a series is never blocked, and an unresolvable seriesId renders no chip rather than a dead link.

Test plan

  • cd server && npm test — full suite green (32,759 passed). New coverage: listLoomSummaries series scoping + dangling-id case (services/fableLoom/records.test.js), and the route's filter / blank-value / over-long-id cases (routes/fableLoom.test.js).
  • cd client && npm test — full suite green apart from two known load-related flakes (a11yConventions timeout, Catalog.test.jsx act warning) that pass in isolation and are untouched by this branch. New suites: SeriesLoomsPanel.test.jsx, Pipeline.loomBadge.test.jsx, FableLoomStory.test.jsx (backlink present / deleted-series graceful / unnamed-series fallback / standalone), plus apiFableLoom.test.js query-encoding cases.
  • cd client && npm run lint — clean.

Closes #4785

#4785)

A loom stays its own record — no `seriesType: 'branching'` enum on
`pipeline_series`, no schema-version bump — so the integration lands at the
presentation/cross-linking layer instead, the same posture as Games and
Creative Director:

- `GET /api/fableloom?seriesId=` scopes the index to one series' looms. A blank
  value is a no-op filter rather than a 400, so a caller can build the query
  from a possibly-unset id.
- The series detail page gains a "Branching narratives" card listing those
  looms with their episode/scene/ending counts, plus a "New branching
  narrative" action that mints one pre-linked to the series and its universe
  and lands in the editor.
- The series index badges each row with its loom count.
- The loom editor header gains a series backlink. Both directions stay soft
  refs: deleting a series is never blocked, and a dangling `seriesId` renders
  no chip rather than a dead link.
@atomantic
atomantic merged commit 452f40e into main Aug 22, 2026
7 checks passed
@atomantic
atomantic deleted the claim/issue-4785 branch August 22, 2026 03:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

surface linked FableLoom branching narratives inside series management

1 participant