Migration Guide: 0.3 → 0.5.0
Overview
Section titled “Overview”SCS 0.5.0 replaces the 0.3 concern model with the Domain Ontology: a domain-defined set of concepts, with an optional shallow taxonomy, a small fixed set of typed relationships, and a mapping from each concept to the standards it satisfies. This is 0.5.0’s anchor change — everything else in the release sequences behind it.
This is a breaking change, expected pre-1.0 per semver.
What’s new in 0.5.0
Section titled “What’s new in 0.5.0””Concern” is gone; “concept” takes its place
Section titled “”Concern” is gone; “concept” takes its place”0.3 and earlier:
- A domain manifest listed its concerns as a flat array of bundle references.
- Bundles of functional areas (Architecture, Security, etc.) had
type: concern. - Hierarchy:
Project → Domain → Concern → SCD.
0.5.0:
- A domain manifest defines its Domain Ontology: an
ontology.concepts[]array, each concept with anid,name,description, optionalparent(shallow taxonomy), optionalrelationships[](depends-on,relates-to, or thesatisfies[]shorthand), and an optionalbundlepointing at the concept bundle that carries its SCDs. - Concept bundles carry
type: concept(wastype: concern). - Hierarchy is the same depth, renamed:
Project → Domain → Concept → SCD.
The change is not just a rename. A 0.3 domain manifest’s concerns: list was flat — bundle
references with no relationships between them. A 0.5.0 ontology.concepts[] block is
structured: concepts can depend on each other, relate to each other, and each maps to the
specific standards it satisfies. Getting real value out of 0.5.0 means adding that
structure, not just renaming the field — see Domain Ontology
for the full model.
version_approved_by / version_approved_at are now required to version a bundle
Section titled “version_approved_by / version_approved_at are now required to version a bundle”A bundle’s provenance block must carry version_approved_by and version_approved_at
before it can carry a real semver version. A bundle still in progress should stay at
version: DRAFT, which is exempt from this requirement — the two fields are required only
once a bundle is actually versioned and released.
SCDs may declare which concept they belong to
Section titled “SCDs may declare which concept they belong to”The SCD schemas gained an optional concept: field, so an SCD inside a concept bundle can
declare concept: concept:<id>, resolving to an entry in the domain manifest’s ontology.
Optional in 0.5.0.
An SCD’s own relationships[] still must target another SCD (scd:meta:...,
scd:standards:..., scd:project:...) — never a concept: id. Concept-to-concept
relationships belong only in the domain manifest’s ontology.concepts[]. Pointing an SCD
relationship at a concept: id is a validation error.
Migration steps
Section titled “Migration steps”Step 1: Rename directories
Section titled “Step 1: Rename directories”# Per project, wherever concern bundles live:git mv bundles/concerns bundles/conceptsTemplates and tooling follow the same pattern (templates/bundles/concerns/ →
templates/bundles/concepts/) if you maintain your own scaffold templates.
Step 2: Rename the bundle type
Section titled “Step 2: Rename the bundle type”In every bundle file that was type: concern:
type: concerntype: conceptMechanical, safe to script across a tree of bundle files:
grep -rl '^type: concern$' bundles/ | xargs sed -i '' 's/^type: concern$/type: concept/'This is offered as a convenience for the purely mechanical part, not a supported
scs migrate command — check the diff before committing.
Step 3: Convert the domain manifest’s concerns: list to ontology.concepts[]
Section titled “Step 3: Convert the domain manifest’s concerns: list to ontology.concepts[]”Before (0.3):
domain: id: "domain:medical-device-cdmo" concerns: - "bundle:compliance-governance:0.1.0" - "bundle:risk-management:0.1.0" - "bundle:verification-validation:0.1.0"After (0.5.0):
domain: id: "domain:medical-device-cdmo" ontology: concepts: - id: concept:compliance-governance name: Compliance & Governance description: > Which regulations bind the work, AI deployment-tier and autonomy rules, and the overall QMS governance framework. satisfies: - scd:standards:iso-13485 bundle: bundle:compliance-governance:0.1.0
- id: concept:risk-management name: Risk Management description: The risk register and risk-acceptability criteria. relationships: - type: depends-on target: concept:compliance-governance bundle: bundle:risk-management:0.1.0
- id: concept:verification-validation name: Verification & Validation description: Test protocols and traceability to requirements. relationships: - type: depends-on target: concept:risk-management bundle: bundle:verification-validation:0.1.0Each old concerns: entry becomes a concepts[] entry with:
id—concept:<slug>(was the bundle’s own name; the pattern is^concept:[a-z][a-z0-9-]*$)name,description— human-readable, new in 0.5.0bundle— the same bundle reference the old list carried, now a named field instead of the array element itselfrelationships[](optional) —depends-onorrelates-toedges to other concepts in this domain, or thesatisfies[]shorthand for edges to standards-tier SCDsparent(optional) — a shallow taxonomy, if one concept is a specialization of another
A full worked example, with 12 real concepts and real relationships, is
schema/domain/examples/medical-device-cdmo-domain.yaml in the spec repo — reading it end
to end is the fastest way to see the shape.
Step 4: Add approval fields, or stay DRAFT
Section titled “Step 4: Add approval fields, or stay DRAFT”For any bundle you’re versioning as part of this migration:
provenance: created_by: "..." created_at: "..." version_approved_by: "..." version_approved_at: "2026-09-27T00:00:00Z"If a bundle isn’t ready to be approved yet, leave version: DRAFT and skip this — the
schema does not require these fields on a DRAFT bundle.
Step 5: Rename the unrelated topics: field, if present
Section titled “Step 5: Rename the unrelated topics: field, if present”If any SCD content template has a free-text concerns: list (see “Watch for” above):
concerns:topics: - authentication - session-managementStep 6: Validate
Section titled “Step 6: Validate”scs validate --domain path/to/domain-manifest.yamlscs-validate --bundle path/to/each-migrated-bundle.yamlThe validator enforces all of this directly — stale concern terminology (a bundle still
type: concern, or a domain manifest still carrying a concerns: field) is a hard error
pointing back at this guide, not a silent pass.
Do I have to add relationships and satisfies to every concept?
No. Both are optional per concept. A migrated concept with just id/name/bundle is
valid. You get more value from the ontology the more of this you fill in, but nothing
blocks on it.
What happens to bundle versions during migration?
Nothing changes about how bundles are versioned — 0.5.0 didn’t change the version field
itself, only what provenance requires before a non-DRAFT version is accepted (Step 4).
Is there a tool that does Steps 1–2 for me?
The two sed/git mv commands above cover the purely mechanical rename. There is no
supported scs migrate command in 0.5.0 — Step 3, the actual ontology structure, can’t be
mechanically derived from a flat list regardless.
My domain has concepts the software-development reference set doesn’t.
Expected — the medical-device-cdmo and merchant-cash-advance ontologies both add
domain-specific concepts (e.g. qms-records, supplier-qualification for CDMO) beyond the
11-concept software-development baseline. The reference set is a starting point per domain,
not a fixed list.