ContractSpec docs

OSS-first docs

These docs teach the open system first: contracts, generated surfaces, runtimes, governance, and incremental adoption. Studio shows up as the operating layer on top, not as the source of truth.

LayoutSpec — M3 layout discriminated union

Six-variant discriminated union replacing M2 GraphLayoutKind. Variants: force, dag, radial, tree, swimlane, time-axis.

field.key.label
LayoutSpec — M3 layout discriminated union
field.version.label
field.type.label
field.title.label
LayoutSpec — M3 layout discriminated union
field.description.label

Six-variant discriminated union replacing M2 GraphLayoutKind. Variants: force, dag, radial, tree, swimlane, time-axis.

field.tags.label
graph,layout,spec,m3,elkjs,d3,discriminated-union
field.owners.label
field.stability.label
public

Discriminated union replacing `GraphLayoutKind` from M2.

| kind | Key config | Engine (web / native) | Async chunk | | --- | --- | --- | --- | | `force` | strength, alphaDecay, collisionRadius | d3-force | d3-force.chunk ≤20 KB gz | | `dag` | rankSep, nodeSep, direction | elkjs LAYERED / dagre | elkjs-layout-engine.chunk ≤250 KB gz | | `radial` | innerRadius, outerRadius, angularRange | d3-hierarchy | d3-hierarchy.chunk ≤15 KB gz | | `tree` | nodeSep, levelSep, orientation | d3-hierarchy tidy | d3-hierarchy.chunk ≤15 KB gz | | `swimlane` | laneBy (req), lanes | elkjs BOX / dag fallback | elkjs-layout-engine.chunk ≤250 KB gz | | `time-axis` | xField (req), scale | pure TS | base bundle (sync) |

Migration from M2

import { layoutKindToSpec } from '@lssm-tech/lib.contracts-spec/data-views/layout-spec';
layoutKindToSpec('dag') // → { kind: 'dag' }

Remove `layoutKindToSpec` shim in P10 alongside `GraphLayoutKind` removal.