Meta Museum now has a reusable partition planner for the hard case where a
valid Linked Art graph needs to be emitted as discrete Linked Art API endpoint
documents.
The implementation lives in `src/utils/linked-art-partitioner.ts` and is covered
by `tests/utils/linked-art-partitioner.test.ts`.
Policy
`Type`, `Set`, `Activity`, `Event`, `ProvenanceActivity`, textual/visual works,
and related Linked Art endpoint classes) become their own documents.
`_label`, rather than recursively embedding a whole graph.
as names, dimensions, timespans, provenance `part[]` activities, and lifecycle
activity summaries.
`_complete: false` through the existing completeness projection policy.
`member_of`, concept `broader`, and provenance activity `part[]` are bounded
with depth and visited-node checks.
graph node, the planner keeps the richer occurrence for the partition document.
- First-class endpoint nodes (`HumanMadeObject`, `Person`, `Group`, `Place`,
- Cross-document relationships become compact references with `id`, `type`, and
- Owned embedded structures remain embedded where Linked Art expects them, such
- Dereferenceable embedded activity/shared-structure nodes receive
- Recursive relationships such as object `part`/`part_of`, set `member`/
- When the same URI appears as both a compact nested reference and a richer
Evidence Fixtures
The regression suite covers:
event/activity documents.
referenced participants.
partition documents.
- Recursive physical-object parts.
- Reused activity nodes that are embedded as summaries and also emitted as full
- Archival set hierarchy and concept `broader`/`member_of` recursion.
- Provenance wrapper activities with embedded acquisition/payment parts and
- Optional official Linked Art endpoint JSON Schema validation on generated
Current Boundary
The first production adoption paths are:
subclasses such as `Production` are routed through the Event/Activity endpoint
family, and relationships such as `used_specific_object`, `carried_out_by`,
and `produced` are bounded as compact references when they cross into other
endpoint documents.
recursion is bounded as compact Set references when the Set is available as a
stored record. Nested-only referenced sets still fall back to the entity-index
profile so relation discovery remains available.
`member_of` recursion is bounded as compact concept/set references while
preserving the concept endpoint family shape.
`part_of` recursion is bounded as compact `HumanMadeObject` references, while
owned lifecycle summaries such as `produced_by` stay embedded and their
cross-document actor/place/object relationships stay compact.
planner only after it rewrites the stored id to the canonical MetaMuseum detail
URL and rebuilds `equivalent[]`, then adopts the planner output only for
sensitive recursive/root-activity fields such as `part`, `part_of`,
`member_of`, `broader`, and `produced_by`. The broader record-detail envelope
keeps local metadata such as `_source`, `schemaVersion`, and `_links.self` so
existing consumers still receive a rich detail record rather than a thin
endpoint partition.
- `/api/events/{id}` for ActivityStreams `linkedArt.id` dereferences. Activity
- `/api/sets/{id}` for stored Set hierarchy records. `member` and `member_of`
- `/api/concepts/{id}` for stored Concept hierarchy records. `broader` and
- `/api/objects/{id}` for stored physical object records. Object `part` and
- `/api/records/{id}` for canonical record detail responses. This route runs the
This is not yet the universal serialization path for every public route.
Existing endpoint serializers can adopt it incrementally. The next implementation
step is to route additional provider-specific/entity-detail serializers through
the same helper style only where planner output reduces duplicate case-by-case
recursion logic without weakening their public response contracts.