@sdd-method/sdd-cli 0.100.0 → 0.101.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,7 +12,7 @@
12
12
  # app-baseline, integration-baseline) via the seed-file lists at
13
13
  # docs/method/foundations/*-method-seed-files.txt. Consumers receive it
14
14
  # through `sdd-cli sync`. Drift detection comes for free from the
15
- # refuse-or-overwrite model in ADR 0114 — the schema is in
15
+ # refuse-or-overwrite model in M-ADR 0114 — the schema is in
16
16
  # MANAGED_PATHS.txt; consumer-side modification fails the next sync.
17
17
  #
18
18
  # Schema versioning: every structural change increments schema_version.
@@ -20,7 +20,7 @@
20
20
  # versions independently of sdd-manifest-schema.yaml and
21
21
  # aggregation-manifest-schema.yaml. The CLI declares per-schema compat
22
22
  # ranges in `src/lib/catalogue/schema-compat.ts` and fails fast on
23
- # out-of-range versions. Per ADR 0133 the canonical builder + aggregator
23
+ # out-of-range versions. Per M-ADR 0133 the canonical builder + aggregator
24
24
  # update in lockstep with this schema; with the canonical builder shipped
25
25
  # from sdd-method, "lockstep" collapses to a single CLI version bump.
26
26
  #
@@ -34,7 +34,7 @@
34
34
  # MUST release in lockstep with `supports` updated; migration tooling
35
35
  # required.
36
36
  #
37
- # Federation: per ADR 0134 catalogues are built per SDD and aggregated at
37
+ # Federation: per M-ADR 0134 catalogues are built per SDD and aggregated at
38
38
  # the ecosystem root. Every node catalogue carries a `source_sdd_id`
39
39
  # column populated by the aggregator. Foreign keys may declare
40
40
  # `external: true` — these are skipped by the per-SDD builder (logged as
@@ -45,9 +45,51 @@
45
45
  # Builder contract: see docs/method/methods/catalogue-builder-specification.md.
46
46
  # Category taxonomy: see docs/method/methods/product-category-taxonomy.md.
47
47
 
48
- schema_version: "2.39.0"
48
+ schema_version: "2.40.1"
49
49
  schema_owner: "sdd-method"
50
50
  schema_status: "canonical"
51
+ # Bump rationale (2.40.1 — description patch, 2026-07-24): prefixes the 75
52
+ # remaining bare `ADR NNNN` references in this file as `M-ADR NNNN` (M-ADR 0186
53
+ # §4.6 canonical origin prefixes). All 25 distinct numbers were verified to
54
+ # resolve to method ADRs; the hyphen form `ADR-NNNN` is left untouched, since it
55
+ # is the deliberately prefix-stripped catalogue identity token (M-ADR 0140 §4.1).
56
+ # validate-no-bare-adr.sh now PASSES repo-wide (579 files) — it had been red on
57
+ # this one file. Prose only: no column, enum, key or nullability changed. Patched
58
+ # rather than folded into 2.40.0 because 2.40.0 had already been published (in
59
+ # @sdd-method/sdd-cli 0.101.0), and two different byte-contents under one version
60
+ # string is the same silent divergence the digest hook exists to prevent.
61
+ # Bump rationale (2.40.0 — additive minor, per M-ADR 0193 §4.7, 2026-07-24):
62
+ # adds a derived `direction` column (inbound | output) to
63
+ # application_data_plane_bindings. §4.7 models the output side as a
64
+ # DISTINGUISHED SUB-SET of the `pattern` vocabulary, and names three rules that
65
+ # branch on direction — reconciliation with product_platform_dependencies is
66
+ # inbound-only, the archetype-default WARN must compare like with like, and the
67
+ # M-ADR 0187 convergence reasoning differs by direction. The catalogue could not
68
+ # express that distinction: consumers had to re-derive it by hardcoding the
69
+ # pattern→direction mapping, and any that forgot would silently reconcile an
70
+ # output-side binding as though it consumed something. `direction` materialises
71
+ # the sub-set the ADR already declares. Derived from `pattern` by a single
72
+ # method-tier mapping (not authored — it is not a manifest field), so it adds no
73
+ # authoring burden and cannot disagree with `pattern`. Deliberately NOT part of
74
+ # the primary key: identity is unchanged ({product_id}__{pattern}__{locality}__
75
+ # {target}), and a derived value adds nothing to it. Also corrects four
76
+ # descriptions left stale by 2.37.0/2.38.0: `pattern` and the deviations
77
+ # `expectation` token list both omitted generate/publish, `runtime` omitted
78
+ # generate from the compute-bearing set, and `locality` claimed only own-store
79
+ # may be empty. Backward-compatible; SCHEMA_COMPAT "^2.0.0".
80
+ # Bump rationale (2.35.0–2.39.0 — RESTORED to canonical 2026-07-24): these five
81
+ # versions were authored directly into sdd-cli's VENDORED copy and never landed
82
+ # here, leaving the canonical five versions behind while builders shipped
83
+ # against the newer shape — the exact silent divergence M-ADR 0133 §4.2's
84
+ # direction-of-truth rule (canonical -> vendored, never the reverse) exists to
85
+ # prevent. check-canonical-schema-digest.sh detects it when pointed at a
86
+ # consumer checkout. Restored content: 2.35.0 `surface` +
87
+ # `application_archetype` columns on products (M-ADR 0167 / 0191); 2.36.0
88
+ # conditionally-nullable target_service_id on product_platform_dependencies
89
+ # (M-ADR 0192 async shared-stream); 2.37.0 application_data_plane_bindings
90
+ # (M-ADR 0193); 2.38.0 application_data_plane_deviations (M-ADR 0191 §4.3
91
+ # overlay); 2.39.0 application_conformance_coverage (§4.3 WS4). No content is
92
+ # newly decided here — this records where it came from.
51
93
  # Bump rationale (2.34.0 — additive minor, per M-ADR 0189 F26 §3, ratified
52
94
  # 2026-07-10): adds the `persona_container` edge — the L2-granularity
53
95
  # companion to persona_c4system. Person→Container Rels are drawn routinely
@@ -148,7 +190,7 @@ schema_status: "canonical"
148
190
  # have broken it silently. Backward-compatible; SCHEMA_COMPAT stays "^2.0.0".
149
191
  # Bump rationale (2.26.0 — additive minor, per the repo-registry federation,
150
192
  # 2026-06-18): marks `repo_contract.contract_id` external_for_profiles
151
- # [application-product, integration-product]. Per ADR 0147 a repo's
193
+ # [application-product, integration-product]. Per M-ADR 0147 a repo's
152
194
  # service-architecture external interfaces are a contract-CONSUMES source; an
153
195
  # app/integration repo legitimately consumes a platform-resident contract (and,
154
196
  # transitionally, its own BFF contract still held by the platform SDD before
@@ -165,7 +207,7 @@ schema_status: "canonical"
165
207
  # 14 app SDDs hold screens but zero local feature specs). The per-SDD app build emits
166
208
  # the edge carrying the bare realises slug and logs it [finding] external; the
167
209
  # aggregator resolves the slug to the platform feature id (one slug vocabulary
168
- # per capability — ADR 0177; ambiguous estate-wide matches are refused with a
210
+ # per capability — M-ADR 0177; ambiguous estate-wide matches are refused with a
169
211
  # divergence finding, never guessed). Forward/app-owned estates are unaffected
170
212
  # (the feature resolves locally → internal pass). Additive minor — the FK
171
213
  # field is optional and SCHEMA_COMPAT stays "^2.0.0".
@@ -173,7 +215,7 @@ schema_status: "canonical"
173
215
  # coordination item R5, 2026-06-13): adds an optional `external_for_profiles`
174
216
  # array to FK rules and applies it to `capabilities.domain_id`. An app- or
175
217
  # integration-product SDD legitimately names a platform-resident domain
176
- # (ADR 0136: app/integration SDDs own no domains.csv rows), so the per-SDD
218
+ # (M-ADR 0136: app/integration SDDs own no domains.csv rows), so the per-SDD
177
219
  # build cannot resolve that FK locally — yet the platform SDD genuinely owns
178
220
  # its domains and SHOULD keep the local check. `external_for_profiles:
179
221
  # [application-product, integration-product]` makes the FK behave external
@@ -193,7 +235,7 @@ schema_status: "canonical"
193
235
  # separate column from `status` (documentation maturity) — a product can be
194
236
  # reviewed AND deprecated. Backward-compatible — older readers ignore them;
195
237
  # SCHEMA_COMPAT stays at "^2.0.0".
196
- # Bump rationale (2.20.0 — additive minor, per ADR 0175): adds a nullable,
238
+ # Bump rationale (2.20.0 — additive minor, per M-ADR 0175): adds a nullable,
197
239
  # free-form `evidence_class` column to `capabilities`, `contracts`,
198
240
  # `domain_models`, `entities`, `events` — an evidence-class marker for the
199
241
  # documentation-reverse method (packaged-SaaS / vendor-base packs). Free-form
@@ -206,7 +248,7 @@ schema_status: "canonical"
206
248
  # entities, inherited file-level), and per-event `evidence_class` with a
207
249
  # file-level fallback in event-catalog.yaml (events). Backward-compatible —
208
250
  # older readers ignore it; SCHEMA_COMPAT stays at "^2.0.0".
209
- # Bump rationale (2.19.0 — additive minor, per ADR 0170 §4.6): adds a nullable,
251
+ # Bump rationale (2.19.0 — additive minor, per M-ADR 0170 §4.6): adds a nullable,
210
252
  # free-form `context` column to `screens`, `contracts`, `services`, `entities` —
211
253
  # a bounded-context membership marker (adopter-defined values; not an FK, the
212
254
  # `group`/`source` free-form pattern). Lets a consumer that spans multiple
@@ -215,9 +257,9 @@ schema_status: "canonical"
215
257
  # contracts `info.x-context`); `services`/`entities` carry the column but await a
216
258
  # derivation source. Backward-compatible — older readers ignore it; SCHEMA_COMPAT
217
259
  # stays at "^2.0.0".
218
- # Bump rationale (2.15.0 — additive minor, per ADR 0161): adds a new edge
260
+ # Bump rationale (2.15.0 — additive minor, per M-ADR 0161): adds a new edge
219
261
  # catalogue `feature_event` materialising the (feature, event, role) edge
220
- # via the derived join `feature_service ⋈ service_event`. Mirrors ADR 0160's
262
+ # via the derived join `feature_service ⋈ service_event`. Mirrors M-ADR 0160's
221
263
  # capability_event derived-source pattern at the feature level, completing
222
264
  # the capability/feature/service trio of materialised event edges. No
223
265
  # authored shape — every row carries `source=derived`. Backward-compatible —
@@ -226,7 +268,7 @@ schema_status: "canonical"
226
268
  # ─── Canonical enums ────────────────────────────────────────────────────────
227
269
  #
228
270
  # Enums constrain the values certain string columns may take. The canonical
229
- # builder (sdd-cli catalogue build, per ADR 0134 §4.6) reads these from the
271
+ # builder (sdd-cli catalogue build, per M-ADR 0134 §4.6) reads these from the
230
272
  # schema rather than hardcoding them, so adopters can update the canonical
231
273
  # enum here without forking builder code.
232
274
 
@@ -254,7 +296,7 @@ enums:
254
296
  c4_container_type:
255
297
  description: >
256
298
  Canonical C4 container kind for `c4_containers.type`, aligned with
257
- c4model.com/abstractions (per ADR 0155). A C4 container is something
299
+ c4model.com/abstractions (per M-ADR 0155). A C4 container is something
258
300
  that must be running for the system to work — an application or a
259
301
  data store.
260
302
 
@@ -358,7 +400,7 @@ catalogues:
358
400
  - { name: reference_architecture_equivalent, type: string, nullable: true }
359
401
  - { name: status, type: string, nullable: false, description: "active | deferred | absent. The builder emits 'active' for every discovered domain directory — a domain that exists on disk is active by definition; deferred/absent rows have no authoring source yet (would come from roadmap/archetype declarations, not discovery)." }
360
402
  - { name: repo_count, type: int, nullable: false }
361
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator at merge time per ADR 0134; left empty by per-SDD builders." }
403
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator at merge time per M-ADR 0134; left empty by per-SDD builders." }
362
404
 
363
405
  products: &products_def
364
406
  primary_key: id
@@ -367,7 +409,7 @@ catalogues:
367
409
  columns:
368
410
  - { name: id, type: string, nullable: false, description: "product_id slug." }
369
411
  - { name: name, type: string, nullable: false }
370
- - { name: domain_id, type: string, nullable: true, description: "Owning capability domain. Populated for platform-profile products (platform-root, platform-subsystem). App and integration products do not have a primary domain — see ADR 0136." }
412
+ - { name: domain_id, type: string, nullable: true, description: "Owning capability domain. Populated for platform-profile products (platform-root, platform-subsystem). App and integration products do not have a primary domain — see M-ADR 0136." }
371
413
  - { name: profile, type: string, nullable: false, description: "platform-profile | application-product | integration-product | support-repo." }
372
414
  - { name: category, type: string, nullable: true, description: "Architectural classification per docs/method/methods/product-category-taxonomy.md. Values: platform-root | platform-subsystem | application-product | integration-provider | integration-umbrella | support-repo. Determines whether the Product gets a c4_systems row." }
373
415
  - { name: doc_path, type: string, nullable: false, description: "Path to _product/ directory, relative to docs/." }
@@ -376,13 +418,13 @@ catalogues:
376
418
  - { name: deprecated_date, type: date, nullable: true, description: "Date the deprecation decision took effect. Only meaningful when lifecycle=deprecated. From the manifest's deprecated_date:. Added in 2.22.0." }
377
419
  - { name: successor_sdd_id, type: string, nullable: true, description: "For deprecated products: sdd_id of the superseding SDD. Same vocabulary as sdd_id/source_sdd_id (NOT products.id). Soft reference — the aggregator orphan-checks it against contributing sdd_ids ([finding] orphan when unresolved), never a hard FK: the successor may live outside the aggregation scope. Added in 2.22.0." }
378
420
  - { name: surface, type: string, nullable: true, description: "ui | api (empty for non-application-product). Application-product surface trait from the manifest's surface: field (M-ADR 0167, sdd-manifest-schema 1.2.0). Empty on non-application products. Added in 2.35.0." }
379
- - { name: application_archetype, type: string, nullable: true, description: "Application-product shape classification from the manifest's application_archetype: field (M-ADR 0191, sdd-manifest-schema 1.2.0). Resolved-enum over a tiered vocabulary (method: unclassified; reference-architecture bundle; adopter). Defaults to 'unclassified' for application-product (with a coverage finding), empty for other profiles. Distinct from the ADR 0173 domain archetype and ADR 0169 openui archetype. Added in 2.35.0." }
421
+ - { name: application_archetype, type: string, nullable: true, description: "Application-product shape classification from the manifest's application_archetype: field (M-ADR 0191, sdd-manifest-schema 1.2.0). Resolved-enum over a tiered vocabulary (method: unclassified; reference-architecture bundle; adopter). Defaults to 'unclassified' for application-product (with a coverage finding), empty for other profiles. Distinct from the M-ADR 0173 domain archetype and M-ADR 0169 openui archetype. Added in 2.35.0." }
380
422
  - { name: synthesis_quality, type: int, nullable: true, description: "Score 0-10 from assessment block (reverse method only)." }
381
423
  - { name: synthesis_band, type: string, nullable: true, description: "developing | working | strong." }
382
424
  - { name: last_assessed, type: date, nullable: true }
383
425
  - { name: highest_snapshot_impact, type: string, nullable: true }
384
426
  - { name: repo_count, type: int, nullable: false, description: "Number of repos mapped to this product." }
385
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
427
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
386
428
 
387
429
  applications:
388
430
  <<: *products_def
@@ -390,19 +432,19 @@ catalogues:
390
432
 
391
433
  integrations:
392
434
  primary_key: id
393
- description: "Granular provider adapters. Each row is either (a) an integration-product SDD's own row (one per SDD; parent_product_id empty), or (b) a manifest-declared sub-integration of a multi-provider monolith (parent_product_id = umbrella SDD's id). Per ADR 0144 (schema 2.6.0), sub-integrations are declared via the optional `sub_integrations:` array in `integration-manifest.yaml`."
435
+ description: "Granular provider adapters. Each row is either (a) an integration-product SDD's own row (one per SDD; parent_product_id empty), or (b) a manifest-declared sub-integration of a multi-provider monolith (parent_product_id = umbrella SDD's id). Per M-ADR 0144 (schema 2.6.0), sub-integrations are declared via the optional `sub_integrations:` array in `integration-manifest.yaml`."
394
436
  foreign_keys:
395
437
  - { column: domain_id, references: domains.id, nullable: true }
396
438
  - { column: parent_product_id, references: products.id, nullable: true }
397
439
  columns:
398
440
  - { name: id, type: string, nullable: false, description: "Provider slug." }
399
441
  - { name: name, type: string, nullable: false }
400
- - { name: domain_id, type: string, nullable: true, description: "Provider adapters are federation nodes, not capability-domain members. Left empty per ADR 0136." }
401
- - { name: parent_product_id, type: string, nullable: true, description: "Umbrella integration-product. Empty for an SDD's own row; set to the SDD's integrationId for sub-integration rows declared via integration-manifest.yaml `sub_integrations:` (per ADR 0144, schema 2.6.0)." }
442
+ - { name: domain_id, type: string, nullable: true, description: "Provider adapters are federation nodes, not capability-domain members. Left empty per M-ADR 0136." }
443
+ - { name: parent_product_id, type: string, nullable: true, description: "Umbrella integration-product. Empty for an SDD's own row; set to the SDD's integrationId for sub-integration rows declared via integration-manifest.yaml `sub_integrations:` (per M-ADR 0144, schema 2.6.0)." }
402
444
  - { name: category, type: string, nullable: false, description: "oem | device | fleet | camera | legacy | data-sharing | gateway-framework (extensible per ecosystem)." }
403
445
  - { name: doc_path, type: string, nullable: false }
404
446
  - { name: repo_count, type: int, nullable: false }
405
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
447
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
406
448
 
407
449
  adrs:
408
450
  primary_key: id
@@ -419,7 +461,7 @@ catalogues:
419
461
  - { name: superseded_by_id, type: string, nullable: true }
420
462
  - { name: inference_confidence, type: string, nullable: true, description: "high | medium | low (reverse-inferred ADRs only)." }
421
463
  - { name: supersedes_raw, type: string, nullable: true, description: "Raw text from Supersedes bullet for later parsing." }
422
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
464
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
423
465
 
424
466
  glossary_items:
425
467
  primary_key: id
@@ -435,11 +477,11 @@ catalogues:
435
477
  - { name: aliases, type: string, nullable: true, description: "';'-separated list." }
436
478
  - { name: evidence, type: string, nullable: true }
437
479
  - { name: notes, type: string, nullable: true }
438
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
480
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
439
481
 
440
482
  glossary_xref:
441
483
  primary_key: id
442
- description: "Edge: cross-domain glossary relationships from glossary-alignment-manifest.yaml. Per ADR 0158, four walkers ingest into this catalogue: (a) forward declared pair-form {source, target} entries under aliases/conflicts, (b) reverse-method cross_domain_terms (emits references edges per referencer→owner), (c) reverse-method multi-domain conflicts (pair-wise expansion across domains[]), (d) forward-method supersedes (status: superseded entries with superseded_by back-link)."
484
+ description: "Edge: cross-domain glossary relationships from glossary-alignment-manifest.yaml. Per M-ADR 0158, four walkers ingest into this catalogue: (a) forward declared pair-form {source, target} entries under aliases/conflicts, (b) reverse-method cross_domain_terms (emits references edges per referencer→owner), (c) reverse-method multi-domain conflicts (pair-wise expansion across domains[]), (d) forward-method supersedes (status: superseded entries with superseded_by back-link)."
443
485
  foreign_keys:
444
486
  - { column: source_id, references: glossary_items.id, nullable: false }
445
487
  - { column: target_id, references: glossary_items.id, nullable: false }
@@ -447,11 +489,11 @@ catalogues:
447
489
  - { name: id, type: string, nullable: false, description: "Composite: {source_id}__{relation}__{target_id}." }
448
490
  - { name: source_id, type: string, nullable: false }
449
491
  - { name: target_id, type: string, nullable: false }
450
- - { name: relation, type: string, nullable: false, description: "alias-of | conflicts-with | references | supersedes (extended in schema 2.12.0 per ADR 0158)." }
492
+ - { name: relation, type: string, nullable: false, description: "alias-of | conflicts-with | references | supersedes (extended in schema 2.12.0 per M-ADR 0158)." }
451
493
 
452
494
  entity_glossary:
453
495
  primary_key: id
454
- description: "Edge: data-model entity → canonical glossary term. Added in schema 2.12.0 per ADR 0158. Source: glossary-alignment-manifest.yaml `models[].entities[]` with status ∈ {aligned, matched_direct} and non-empty glossary_term. PK derives from (domain, entity_name, glossary_item) so same-domain multi-diagram entries collapse to one row; cross-domain entries (e.g. platform-wide conceptual model + domain-specific model) emit one row per domain — legitimate cross-level cataloguing."
496
+ description: "Edge: data-model entity → canonical glossary term. Added in schema 2.12.0 per M-ADR 0158. Source: glossary-alignment-manifest.yaml `models[].entities[]` with status ∈ {aligned, matched_direct} and non-empty glossary_term. PK derives from (domain, entity_name, glossary_item) so same-domain multi-diagram entries collapse to one row; cross-domain entries (e.g. platform-wide conceptual model + domain-specific model) emit one row per domain — legitimate cross-level cataloguing."
455
497
  foreign_keys:
456
498
  - { column: domain_id, references: domains.id, nullable: false }
457
499
  - { column: glossary_item_id, references: glossary_items.id, nullable: false }
@@ -461,7 +503,7 @@ catalogues:
461
503
  - { name: entity_name, type: string, nullable: false }
462
504
  - { name: glossary_item_id, type: string, nullable: false }
463
505
  - { name: status, type: string, nullable: false, description: "aligned | matched_direct. Conflicting statuses within a domain resolve matched_direct > aligned with a divergence finding." }
464
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
506
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
465
507
 
466
508
  services:
467
509
  primary_key: id
@@ -473,16 +515,16 @@ catalogues:
473
515
  - { name: id, type: string, nullable: false, description: "Service id, derived from artifact_id where artifact_type=service." }
474
516
  - { name: name, type: string, nullable: false }
475
517
  - { name: product_id, type: string, nullable: false }
476
- - { name: domain_id, type: string, nullable: true, description: "Owning capability domain. Populated when the repo-config declared domain resolves to a docs/domains/<slug>/ in the local SDD; left empty otherwise per ADR 0136." }
518
+ - { name: domain_id, type: string, nullable: true, description: "Owning capability domain. Populated when the repo-config declared domain resolves to a docs/domains/<slug>/ in the local SDD; left empty otherwise per M-ADR 0136." }
477
519
  - { name: primary_repo_id, type: string, nullable: true, description: "Main contributing repo. Nullable when service spans repos." }
478
520
  - { name: runtime_type, type: string, nullable: true, description: "serverless-framework | jvm-service | lambda | k8s | ..." }
479
521
  - { name: language, type: string, nullable: true }
480
522
  - { name: component_type, type: string, nullable: true, description: "bff | api | consumer | ui | collector | processor | ..." }
481
523
  - { name: status, type: string, nullable: true, description: "production-wired | non-production | library." }
482
524
  - { name: confidence, type: string, nullable: true, description: "high | medium | low (reverse-method classification)." }
483
- - { name: context, type: string, nullable: true, description: "Bounded-context membership (per ADR 0170 §4.6). Free-form adopter label, orthogonal to domain_id. Not an FK. Carried for forward-parity; awaits a derivation source (e.g. from the service's contracts' x-context). Added in schema 2.19.0." }
525
+ - { name: context, type: string, nullable: true, description: "Bounded-context membership (per M-ADR 0170 §4.6). Free-form adopter label, orthogonal to domain_id. Not an FK. Carried for forward-parity; awaits a derivation source (e.g. from the service's contracts' x-context). Added in schema 2.19.0." }
484
526
  - { name: description, type: string, nullable: true }
485
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
527
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
486
528
  column_enums:
487
529
  component_type: enums.service_type # canonical builder validates against the service_type enum above
488
530
 
@@ -490,7 +532,7 @@ catalogues:
490
532
  primary_key: id
491
533
  foreign_keys:
492
534
  # external_for_profiles (2.23.0): app/integration capabilities name a
493
- # platform-resident domain (ADR 0136) — resolve at aggregation for those
535
+ # platform-resident domain (M-ADR 0136) — resolve at aggregation for those
494
536
  # profiles, keep the local check for platform-profile. Required-ness is
495
537
  # unchanged: a capability must still name a domain (nullable: false).
496
538
  - { column: domain_id, references: domains.id, nullable: false, external_for_profiles: [application-product, integration-product] }
@@ -501,8 +543,8 @@ catalogues:
501
543
  - { name: domain_id, type: string, nullable: false }
502
544
  - { name: tree_category, type: string, nullable: true, description: "Top-level grouping when capability comes from a capability tree (reverse)." }
503
545
  - { name: parent_capability_id, type: string, nullable: true }
504
- - { name: evidence_class, type: string, nullable: true, description: "Evidence class of the capability's claims, from `capability.evidence_class` in the traceability manifest. Free-form; conventional values code-reverse | vendor-doc | operational (ADR 0175). Empty when undeclared. Added in schema 2.20.0." }
505
- - { name: context, type: string, nullable: true, description: "Bounded-context membership from `capability.context` in the traceability manifest (per ADR 0170 §4.6) — completes the context dimension across screens/contracts/services/entities (2.19.0). Free-form adopter label, orthogonal to domain_id. Not an FK. Enables the screen↔capability context cross-check (convention finding, not FK). Empty when undeclared. Added in schema 2.21.0." }
546
+ - { name: evidence_class, type: string, nullable: true, description: "Evidence class of the capability's claims, from `capability.evidence_class` in the traceability manifest. Free-form; conventional values code-reverse | vendor-doc | operational (M-ADR 0175). Empty when undeclared. Added in schema 2.20.0." }
547
+ - { name: context, type: string, nullable: true, description: "Bounded-context membership from `capability.context` in the traceability manifest (per M-ADR 0170 §4.6) — completes the context dimension across screens/contracts/services/entities (2.19.0). Free-form adopter label, orthogonal to domain_id. Not an FK. Enables the screen↔capability context cross-check (convention finding, not FK). Empty when undeclared. Added in schema 2.21.0." }
506
548
  - { name: description, type: string, nullable: true }
507
549
  - { name: status, type: string, nullable: false, description: "active | planned | deprecated. Default 'active'." }
508
550
  - { name: spec_path, type: string, nullable: true, description: "Path to capability spec file when one exists." }
@@ -510,7 +552,7 @@ catalogues:
510
552
  - { name: runway_classification, type: string, nullable: true, description: "Business | Enabler-Runway | Hybrid (forward declares; reverse nullable until backfilled)." }
511
553
  - { name: data_subset, type: string, nullable: true, description: "Keying-axis marker for foundational-tier / synthesis-tier capabilities whose evidence is keyed by ownership boundary or data subset rather than app group. Populated from `capability.data_subset` in the traceability manifest. Empty for implementing-tier capabilities (those use app_group on per-evidence rows). See `docs/method/methods/reverse/rubrics/reverse-platform-evidence-quality.md` §`app_group:` → `data_subset:` rename. Added in schema 2.9.0." }
512
554
  - { name: slice_scope, type: string, nullable: true, description: "Per-slice marker when one capability legitimately covers multiple app groups or data subsets (e.g. a compliance capability spanning several regulated-fleet sub-groups). Same capability_id may appear across multiple rows when sliced; row identity is then `(id, slice_scope)`. Empty when the capability is not sliced. Per-slice AC numbering convention: AC1-ACN unsuffixed for the first slice; subsequent slices use AC numbering suffixed by slice. See `docs/method/methods/reverse/rubrics/reverse-platform-evidence-quality.md` §`slice_scope:` and `docs/method/methods/capability-spec-template.md` Guideline 9. Added in schema 2.9.0." }
513
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
555
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
514
556
 
515
557
  feature_groups:
516
558
  primary_key: id
@@ -535,7 +577,7 @@ catalogues:
535
577
  - { name: parent_group_id, type: string, nullable: true, description: "Self-reference for nested groups (H3 within H2)." }
536
578
  - { name: description, type: string, nullable: true, description: "Authored description (when group has explicit metadata) or null when derived from heading only." }
537
579
  - { name: source, type: string, nullable: false, description: "feature-tree-h2 | feature-tree-h3 | feature-spec-explicit (when an authored feature spec declares group membership) | capability-spec-explicit." }
538
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
580
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
539
581
 
540
582
  features:
541
583
  primary_key: id
@@ -554,9 +596,9 @@ catalogues:
554
596
  - { name: description, type: string, nullable: true }
555
597
  - { name: maturity, type: string, nullable: true, description: "Standard: working | provisional | unknown | absent. Ecosystem-specific values may be added with parser awareness." }
556
598
  - { name: status, type: string, nullable: false, description: "Default 'active'." }
557
- - { name: source, type: string, nullable: false, description: "feature-tree | feature-set | capability-spec | feature-spec | feature-grounding. NOTE: feature-tree-group source removed in 1.3.0 — groups are now first-class in feature_groups.csv. As of schema 2.2.0, source: feature-tree is emitted by the canonical builder for rows derived from feature-tree.md bullets. As of schema 2.5.0, source: feature-grounding is emitted for rows derived from `docs/domains/<dom>/design/<capability>/feature-grounding.md` markdown tables (per ADR 0143). As of schema 2.7.0, source: capability-spec is emitted by the canonical builder for rows derived from `## Feature Grounding (code-path trace)` tables in `docs/domains/<dom>/product/<capability>.md` capability spec markdown (per ADR 0145). Feature-grounding and capability-spec rows are both capability-owned: product_id is empty; capability_id resolves from the file path." }
599
+ - { name: source, type: string, nullable: false, description: "feature-tree | feature-set | capability-spec | feature-spec | feature-grounding. NOTE: feature-tree-group source removed in 1.3.0 — groups are now first-class in feature_groups.csv. As of schema 2.2.0, source: feature-tree is emitted by the canonical builder for rows derived from feature-tree.md bullets. As of schema 2.5.0, source: feature-grounding is emitted for rows derived from `docs/domains/<dom>/design/<capability>/feature-grounding.md` markdown tables (per M-ADR 0143). As of schema 2.7.0, source: capability-spec is emitted by the canonical builder for rows derived from `## Feature Grounding (code-path trace)` tables in `docs/domains/<dom>/product/<capability>.md` capability spec markdown (per M-ADR 0145). Feature-grounding and capability-spec rows are both capability-owned: product_id is empty; capability_id resolves from the file path." }
558
600
  - { name: runway, type: string, nullable: true, description: "Optional adopter-owned lifecycle / migration marker. Free string at method level — the schema declares no enum and ships no controlled vocabulary. Adopters MAY declare a per-SDD `feature-runway-vocabulary.yaml` at their SDD root; when present, the canonical builder validates captured values against it and emits a `convention` finding for unknown values. Empty when the adopter does not track migration state. Comparability across SDDs requires ecosystem-level vocabulary alignment as an explicit pre-step. Added in schema 2.2.0." }
559
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
601
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
560
602
 
561
603
  personas:
562
604
  primary_key: id
@@ -568,7 +610,7 @@ catalogues:
568
610
  - { name: product_id, type: string, nullable: false }
569
611
  - { name: role, type: string, nullable: true }
570
612
  - { name: description, type: string, nullable: true }
571
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
613
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
572
614
 
573
615
  user_journeys:
574
616
  primary_key: id
@@ -582,7 +624,7 @@ catalogues:
582
624
  - { name: supporting_personas, type: string, nullable: true }
583
625
  - { name: trigger, type: string, nullable: true }
584
626
  - { name: goal, type: string, nullable: true }
585
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
627
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
586
628
 
587
629
  contracts:
588
630
  primary_key: id
@@ -593,20 +635,20 @@ catalogues:
593
635
  - { name: id, type: string, nullable: false }
594
636
  - { name: name, type: string, nullable: false, description: "Display name from info.title or artifact_id." }
595
637
  - { name: service_id, type: string, nullable: true, description: "Exposing service; resolved via primary_repo_id ↔ OpenAPI x-source-repo." }
596
- - { name: source_repo_id, type: string, nullable: true, description: "Repo owning the contract source. Distinct from exposing service's repo per ADR 0110 (sibling-repo pattern)." }
638
+ - { name: source_repo_id, type: string, nullable: true, description: "Repo owning the contract source. Distinct from exposing service's repo per M-ADR 0110 (sibling-repo pattern)." }
597
639
  - { name: kind, type: string, nullable: false, description: "rest | graphql | rpc | event. rpc covers Proto/gRPC; event covers Avro schemas." }
598
640
  - { name: version, type: string, nullable: true }
599
- - { name: status, type: string, nullable: false, description: "active | deprecated. Default 'active'. As of 2.22.0 the builder wires 'deprecated' from BASELINE.md deprecation-runway entries (contracts.{openapi|proto|avro}[].status, matched on path == spec_path; per ADR 0073 §4.8) when a BASELINE.md exists at the SDD root." }
641
+ - { name: status, type: string, nullable: false, description: "active | deprecated. Default 'active'. As of 2.22.0 the builder wires 'deprecated' from BASELINE.md deprecation-runway entries (contracts.{openapi|proto|avro}[].status, matched on path == spec_path; per M-ADR 0073 §4.8) when a BASELINE.md exists at the SDD root." }
600
642
  - { name: spec_path, type: string, nullable: true }
601
643
  - { name: visibility, type: string, nullable: true, description: "public | private | internal." }
602
- - { name: context, type: string, nullable: true, description: "Bounded-context membership from OpenAPI `info.x-context` (per ADR 0170 §4.6). Free-form adopter label, orthogonal to the contract's domain folder. Not an FK. Empty when untagged. Added in schema 2.19.0." }
603
- - { name: evidence_class, type: string, nullable: true, description: "Evidence class of the contract surface, from OpenAPI `info.x-evidence-class` (document root accepted as fallback, exactly like x-context). Free-form; conventional values code-reverse | vendor-doc | operational (ADR 0175). Empty when untagged. Added in schema 2.20.0." }
644
+ - { name: context, type: string, nullable: true, description: "Bounded-context membership from OpenAPI `info.x-context` (per M-ADR 0170 §4.6). Free-form adopter label, orthogonal to the contract's domain folder. Not an FK. Empty when untagged. Added in schema 2.19.0." }
645
+ - { name: evidence_class, type: string, nullable: true, description: "Evidence class of the contract surface, from OpenAPI `info.x-evidence-class` (document root accepted as fallback, exactly like x-context). Free-form; conventional values code-reverse | vendor-doc | operational (M-ADR 0175). Empty when untagged. Added in schema 2.20.0." }
604
646
  - { name: description, type: string, nullable: true }
605
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
647
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
606
648
 
607
649
  events:
608
650
  primary_key: id
609
- description: "Asynchronous messages. Cross-domain events (e.g. shared envelopes) leave domain_id empty. Per ADR 0156 (multi-source ingestion, schema 2.12.0): forward-method canonical source is `contracts/avro/*.avsc` files; reverse-method canonical source is `docs/domains/{domain}/contracts/events/event-catalog.yaml`. YAML wins on name/domain/publisher/transport/consumers; avsc augments schema_path/version. Both paths run and merge by id slug."
651
+ description: "Asynchronous messages. Cross-domain events (e.g. shared envelopes) leave domain_id empty. Per M-ADR 0156 (multi-source ingestion, schema 2.12.0): forward-method canonical source is `contracts/avro/*.avsc` files; reverse-method canonical source is `docs/domains/{domain}/contracts/events/event-catalog.yaml`. YAML wins on name/domain/publisher/transport/consumers; avsc augments schema_path/version. Both paths run and merge by id slug."
610
652
  foreign_keys:
611
653
  - { column: publisher_service_id, references: services.id, nullable: true }
612
654
  - { column: domain_id, references: domains.id, nullable: true }
@@ -615,11 +657,11 @@ catalogues:
615
657
  - { name: name, type: string, nullable: false }
616
658
  - { name: publisher_service_id, type: string, nullable: true }
617
659
  - { name: domain_id, type: string, nullable: true }
618
- - { name: transport, type: string, nullable: true, description: "Open string per ADR 0156. Recommended values: kafka | sns | sqs | kinesis | eventbridge | mongodb-change-stream | nats | activemq | rabbitmq | jms | other. Values outside the recommended set emit [finding] convention." }
619
- - { name: schema_path, type: string, nullable: true, description: "Path to event schema (Avro .avsc or JSON-Schema .json/.schema.json). Nullable — leave empty for loosely-typed events (e.g. ActiveMQ JMS, NATS with payload_schema: {type: object}). Per ADR 0156." }
660
+ - { name: transport, type: string, nullable: true, description: "Open string per M-ADR 0156. Recommended values: kafka | sns | sqs | kinesis | eventbridge | mongodb-change-stream | nats | activemq | rabbitmq | jms | other. Values outside the recommended set emit [finding] convention." }
661
+ - { name: schema_path, type: string, nullable: true, description: "Path to event schema (Avro .avsc or JSON-Schema .json/.schema.json). Nullable — leave empty for loosely-typed events (e.g. ActiveMQ JMS, NATS with payload_schema: {type: object}). Per M-ADR 0156." }
620
662
  - { name: version, type: string, nullable: true }
621
- - { name: evidence_class, type: string, nullable: true, description: "Evidence class of the event claim, from the per-event `evidence_class` key (alias `evidence-class`) in event-catalog.yaml, falling back to a file-level `evidence_class`/`evidence-class` top-level key in the same catalog YAML. Free-form; conventional values code-reverse | vendor-doc | operational (ADR 0175). Empty for avsc-only events and when undeclared. Added in schema 2.20.0." }
622
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
663
+ - { name: evidence_class, type: string, nullable: true, description: "Evidence class of the event claim, from the per-event `evidence_class` key (alias `evidence-class`) in event-catalog.yaml, falling back to a file-level `evidence_class`/`evidence-class` top-level key in the same catalog YAML. Free-form; conventional values code-reverse | vendor-doc | operational (M-ADR 0175). Empty for avsc-only events and when undeclared. Added in schema 2.20.0." }
664
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
623
665
 
624
666
  c4_systems:
625
667
  primary_key: id
@@ -632,7 +674,7 @@ catalogues:
632
674
  - { name: kind, type: string, nullable: false, description: "platform | subsystem | application | integration. Derived 1:1 from manifest.category — see enums.c4_system_kind." }
633
675
  - { name: diagram_path, type: string, nullable: true, description: "Path to L1 mermaid/markdown. Nullable — row exists for any architectural Product even if no L1 diagram has been authored yet (visible coverage gap)." }
634
676
  - { name: description, type: string, nullable: true }
635
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
677
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
636
678
  column_enums:
637
679
  kind: enums.c4_system_kind
638
680
 
@@ -654,10 +696,10 @@ catalogues:
654
696
  - { name: system_id, type: string, nullable: false, description: "Owning C4 system (every container is in exactly one system)." }
655
697
  - { name: domain_id, type: string, nullable: true, description: "Optional organisational domain tag (denormalised; not C4-structural)." }
656
698
  - { name: service_id, type: string, nullable: true, description: "Matched by container name ↔ service name/repo where possible." }
657
- - { name: type, type: string, nullable: true, description: "Canonical C4 container kind — see enums.c4_container_type (Application | Data Store). Legacy values Infrastructure | External System are recognised-but-deprecated during 2.x (WARN); External System boxes belong in c4_external_systems. Per ADR 0155. Enum binding is advisory until 3.0.0." }
699
+ - { name: type, type: string, nullable: true, description: "Canonical C4 container kind — see enums.c4_container_type (Application | Data Store). Legacy values Infrastructure | External System are recognised-but-deprecated during 2.x (WARN); External System boxes belong in c4_external_systems. Per M-ADR 0155. Enum binding is advisory until 3.0.0." }
658
700
  - { name: technology, type: string, nullable: true }
659
701
  - { name: description, type: string, nullable: true }
660
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
702
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
661
703
 
662
704
  c4_components:
663
705
  primary_key: id
@@ -676,19 +718,19 @@ catalogues:
676
718
  - { name: service_id, type: string, nullable: true, description: "Denormalised: the service the parent container represents, when applicable." }
677
719
  - { name: path, type: string, nullable: true }
678
720
  - { name: responsibility, type: string, nullable: true }
679
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
721
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
680
722
 
681
723
  c4_external_systems:
682
724
  primary_key: id
683
725
  description: >
684
726
  C4 external software systems — peer systems at the L1 context level
685
- that the ecosystem integrates with but does not own (per ADR 0155).
727
+ that the ecosystem integrates with but does not own (per M-ADR 0155).
686
728
  Rendered `System_Ext(...)` on L1/L2 diagrams. NOT a c4_container
687
729
  (external systems are not inside your system) and NOT a c4_system
688
730
  (they have no owning Product). External systems are inherently shared
689
731
  references: the same external system may be declared by multiple SDDs,
690
732
  so the aggregator dedups identical rows by PK rather than failing on
691
- duplicate (the one narrowly-scoped exception to ADR 0134's
733
+ duplicate (the one narrowly-scoped exception to M-ADR 0134's
692
734
  duplicate-PK rule); conflicting attributes on the same id surface as a
693
735
  `convention` finding.
694
736
  columns:
@@ -698,7 +740,7 @@ catalogues:
698
740
  - { name: description, type: string, nullable: true, description: "What the external system provides." }
699
741
  - { name: declared_id, type: string, nullable: true, description: "The diagram entry id of the first-seen declaration (M-ADR 0189 §4.2) — the declared identity the aggregator resolves against estate identifiers at adjudication. Added 2.30.0." }
700
742
  - { name: source_scope, type: string, nullable: true, description: "Scope of the first-seen declaration: l1 (context diagram) or l2 (container diagram — scope-relative per M-ADR 0189 §4.1). Added 2.30.0." }
701
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
743
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
702
744
 
703
745
  repositories:
704
746
  primary_key: id
@@ -708,7 +750,7 @@ catalogues:
708
750
  columns:
709
751
  - { name: id, type: string, nullable: false, description: "canonical_repo_key." }
710
752
  - { name: name, type: string, nullable: false }
711
- - { name: domain_id, type: string, nullable: true, description: "Owning capability domain. Populated when the repo-config declared domain resolves to a docs/domains/<slug>/ in the local SDD; left empty otherwise per ADR 0136." }
753
+ - { name: domain_id, type: string, nullable: true, description: "Owning capability domain. Populated when the repo-config declared domain resolves to a docs/domains/<slug>/ in the local SDD; left empty otherwise per M-ADR 0136." }
712
754
  - { name: product_id, type: string, nullable: true }
713
755
  - { name: profile, type: string, nullable: false }
714
756
  - { name: group, type: string, nullable: true }
@@ -722,13 +764,13 @@ catalogues:
722
764
  - { name: total_lines, type: int, nullable: true }
723
765
  - { name: languages, type: string, nullable: true, description: "';'-separated." }
724
766
  - { name: doc_path, type: string, nullable: false }
725
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
767
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
726
768
  column_enums:
727
769
  service_type: enums.service_type # canonical builder validates against the service_type enum above
728
770
 
729
771
  domain_models:
730
772
  primary_key: id
731
- description: "Per-domain ER diagram modelling the domain's aggregates, entities, and domain events. Platform-profile only — application and integration profiles emit headers-only. Forward source: `traceability.domain_model.path` in capability traceability manifests. Reverse source: file-system scan of `docs/domains/*/architecture/data-model.mermaid.md`. Added in schema 2.4.0; see ADR 0142."
773
+ description: "Per-domain ER diagram modelling the domain's aggregates, entities, and domain events. Platform-profile only — application and integration profiles emit headers-only. Forward source: `traceability.domain_model.path` in capability traceability manifests. Reverse source: file-system scan of `docs/domains/*/architecture/data-model.mermaid.md`. Added in schema 2.4.0; see M-ADR 0142."
732
774
  foreign_keys:
733
775
  - { column: domain_id, references: domains.id, nullable: false }
734
776
  columns:
@@ -737,12 +779,12 @@ catalogues:
737
779
  - { name: domain_id, type: string, nullable: false }
738
780
  - { name: doc_path, type: string, nullable: false, description: "Path to data-model.mermaid.md." }
739
781
  - { name: version, type: string, nullable: true, description: "Optional explicit version; null until the domain model is formally versioned (typically at first contract lock-in)." }
740
- - { name: evidence_class, type: string, nullable: true, description: "Evidence class of the domain model, from a leading ```yaml fence in the data-model markdown carrying `evidence-class:` (documentation-reverse anchor convention). Free-form; conventional values code-reverse | vendor-doc | operational (ADR 0175). Empty when undeclared. Added in schema 2.20.0." }
741
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
782
+ - { name: evidence_class, type: string, nullable: true, description: "Evidence class of the domain model, from a leading ```yaml fence in the data-model markdown carrying `evidence-class:` (documentation-reverse anchor convention). Free-form; conventional values code-reverse | vendor-doc | operational (M-ADR 0175). Empty when undeclared. Added in schema 2.20.0." }
783
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
742
784
 
743
785
  entities:
744
786
  primary_key: id
745
- description: "Data-model entity (a structural realisation of a concept inside a domain's data model). Distinct from glossary_items (vocabulary-level) and from domain_models (file-level). Added in schema 2.13.0 per ADR 0159. Forward source: `models[].entities[]` in glossary-alignment-manifest.yaml. Reverse source: `EntityName { ... }` declarations inside `erDiagram` fences in `docs/domains/{domain}/architecture/data-model.mermaid.md`. PK uses an entity-aware slug that normalises across UPPER_SNAKE and PascalCase authoring styles."
787
+ description: "Data-model entity (a structural realisation of a concept inside a domain's data model). Distinct from glossary_items (vocabulary-level) and from domain_models (file-level). Added in schema 2.13.0 per M-ADR 0159. Forward source: `models[].entities[]` in glossary-alignment-manifest.yaml. Reverse source: `EntityName { ... }` declarations inside `erDiagram` fences in `docs/domains/{domain}/architecture/data-model.mermaid.md`. PK uses an entity-aware slug that normalises across UPPER_SNAKE and PascalCase authoring styles."
746
788
  foreign_keys:
747
789
  - { column: domain_id, references: domains.id, nullable: true }
748
790
  - { column: source_domain_model_id, references: domain_models.id, nullable: true }
@@ -753,15 +795,15 @@ catalogues:
753
795
  - { name: domain_id, type: string, nullable: true, description: "Owning domain. Nullable when the source is a non-canonical domain hint such as `platform-wide`; the walker emits a finding in that case." }
754
796
  - { name: source_domain_model_id, type: string, nullable: true, description: "FK to domain_models.csv — the file the entity was extracted from. Populated by the reverse-method walker (Mermaid parse); empty when authored only via the forward-method manifest." }
755
797
  - { name: persistence_kind, type: string, nullable: true, description: "Open string; recommended values: relational-table | document-collection | event-payload | dto | view | other. Values outside the recommended set fire `[finding] convention`." }
756
- - { name: context, type: string, nullable: true, description: "Bounded-context membership (per ADR 0170 §4.6). Free-form adopter label, orthogonal to domain_id. Not an FK. Carried for forward-parity; awaits a derivation source (Mermaid ER has no per-entity slot — populate via a sidecar classification or owning-service derivation). Added in schema 2.19.0." }
798
+ - { name: context, type: string, nullable: true, description: "Bounded-context membership (per M-ADR 0170 §4.6). Free-form adopter label, orthogonal to domain_id. Not an FK. Carried for forward-parity; awaits a derivation source (Mermaid ER has no per-entity slot — populate via a sidecar classification or owning-service derivation). Added in schema 2.19.0." }
757
799
  - { name: glossary_term, type: string, nullable: true, description: "FK to glossary_items.id when the entity name resolves to a canonical glossary term (by entity-aware slug). Drives entity_glossary edge emission." }
758
800
  - { name: notes, type: string, nullable: true, description: "Free-form notes preserved from the authoring source. Carries `status=...`, `superseded_by=...`, and column count for diagnostic value." }
759
- - { name: evidence_class, type: string, nullable: true, description: "Evidence class inherited from the owning domain model's file-level declaration (the leading ```yaml fence's `evidence-class:` in data-model markdown). Free-form; conventional values code-reverse | vendor-doc | operational (ADR 0175). Empty when the source file declares none, and for manifest-sourced rows (the glossary-alignment manifest has no evidence slot). Added in schema 2.20.0." }
760
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
801
+ - { name: evidence_class, type: string, nullable: true, description: "Evidence class inherited from the owning domain model's file-level declaration (the leading ```yaml fence's `evidence-class:` in data-model markdown). Free-form; conventional values code-reverse | vendor-doc | operational (M-ADR 0175). Empty when the source file declares none, and for manifest-sourced rows (the glossary-alignment manifest has no evidence slot). Added in schema 2.20.0." }
802
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
761
803
 
762
804
  # ---- Edge catalogues ----
763
805
  # Edge catalogues do not carry source_sdd_id — provenance is recoverable
764
- # from either endpoint's row per ADR 0134.
806
+ # from either endpoint's row per M-ADR 0134.
765
807
 
766
808
  repo_capability:
767
809
  primary_key: id
@@ -833,7 +875,7 @@ catalogues:
833
875
 
834
876
  repo_contract:
835
877
  primary_key: id
836
- description: "Edge: repo implements/consumes contract. From contributes_to.artifact_type=contract-surface. Per ADR 0147 service-architecture external interfaces are a contract-consumes source; contract_id is external_for_profiles app/integration because their repos reference platform-resident (or platform-held BFF) contracts — resolved at aggregation, staying internal for platform-profile."
878
+ description: "Edge: repo implements/consumes contract. From contributes_to.artifact_type=contract-surface. Per M-ADR 0147 service-architecture external interfaces are a contract-consumes source; contract_id is external_for_profiles app/integration because their repos reference platform-resident (or platform-held BFF) contracts — resolved at aggregation, staying internal for platform-profile."
837
879
  foreign_keys:
838
880
  - { column: repo_id, references: repositories.id, nullable: false }
839
881
  - { column: contract_id, references: contracts.id, nullable: false, external_for_profiles: [application-product, integration-product] }
@@ -870,7 +912,7 @@ catalogues:
870
912
 
871
913
  service_contract:
872
914
  primary_key: id
873
- description: "Edge: service exposes or consumes contract. Both FKs are external (per ADR 0147): federated SDDs that walk per-repo service-architecture tables emit consumes rows where service_id resolves to the platform-root catalogue's services.csv (post-aggregation) and contract_id resolves to the platform-root contracts.csv. Internal builds (e.g. connect-mono) still optimistically validate locally. Schema 2.8.0."
915
+ description: "Edge: service exposes or consumes contract. Both FKs are external (per M-ADR 0147): federated SDDs that walk per-repo service-architecture tables emit consumes rows where service_id resolves to the platform-root catalogue's services.csv (post-aggregation) and contract_id resolves to the platform-root contracts.csv. Internal builds (e.g. connect-mono) still optimistically validate locally. Schema 2.8.0."
874
916
  foreign_keys:
875
917
  - { column: service_id, references: services.id, nullable: false, external: true }
876
918
  - { column: contract_id, references: contracts.id, nullable: false, external: true }
@@ -894,7 +936,7 @@ catalogues:
894
936
 
895
937
  service_entity:
896
938
  primary_key: id
897
- description: "Edge: service touches data-model entity. Added in schema 2.13.0 per ADR 0159. Primary source: per-domain `## Data Store Mapping` markdown table in `docs/domains/{domain}/architecture/data-model.mermaid.md` (relation=owns). Optional forward source (Phase 5 deferred): `entities:` block in `orchestration/repo-config/<repo>.yaml`. Service names resolve via heuristic (slug-of-name; trailing-id-segment) with optional adopter-authored alias map at `docs/platform/reference/service-name-aliases.yaml`."
939
+ description: "Edge: service touches data-model entity. Added in schema 2.13.0 per M-ADR 0159. Primary source: per-domain `## Data Store Mapping` markdown table in `docs/domains/{domain}/architecture/data-model.mermaid.md` (relation=owns). Optional forward source (Phase 5 deferred): `entities:` block in `orchestration/repo-config/<repo>.yaml`. Service names resolve via heuristic (slug-of-name; trailing-id-segment) with optional adopter-authored alias map at `docs/platform/reference/service-name-aliases.yaml`."
898
940
  foreign_keys:
899
941
  - { column: service_id, references: services.id, nullable: false }
900
942
  - { column: entity_id, references: entities.id, nullable: false }
@@ -904,7 +946,7 @@ catalogues:
904
946
  - { name: entity_id, type: string, nullable: false }
905
947
  - { name: relation, type: string, nullable: false, description: "Open string; recommended values: owns | reads | writes | references. Data Store Mapping table source emits `owns`. Values outside the recommended set fire `[finding] convention`." }
906
948
  - { name: evidence_path, type: string, nullable: true, description: "Source markdown path or feature-grounding row that produced the edge. Audit aid." }
907
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
949
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
908
950
 
909
951
  capability_feature:
910
952
  primary_key: id
@@ -940,7 +982,7 @@ catalogues:
940
982
 
941
983
  capability_event:
942
984
  primary_key: id
943
- description: "Edge: capability publishes or consumes event. Schema 2.14.0 (per ADR 0160) multi-source ingestion: (1) forward shape A — `traceability.events[{id, role}]` (legacy aspirational shape, unauthored across observed adopters); (2) forward shape B — `traceability.contracts.published_events[]` / `consumed_events[]` with `{event, status, notes}` (the observed forward-method shape; event name slug-resolves against events.csv); (3) derived — `capability_service ⋈ service_event` join (zero authoring; associative not authoritative). Authored rows win on PK conflict with derived. The `source` column distinguishes the two so governance queries can filter to authoritative ownership. The earlier `## Related Events` capability-spec heading is retired (no adopter authored it; the template never carried the section)."
985
+ description: "Edge: capability publishes or consumes event. Schema 2.14.0 (per M-ADR 0160) multi-source ingestion: (1) forward shape A — `traceability.events[{id, role}]` (legacy aspirational shape, unauthored across observed adopters); (2) forward shape B — `traceability.contracts.published_events[]` / `consumed_events[]` with `{event, status, notes}` (the observed forward-method shape; event name slug-resolves against events.csv); (3) derived — `capability_service ⋈ service_event` join (zero authoring; associative not authoritative). Authored rows win on PK conflict with derived. The `source` column distinguishes the two so governance queries can filter to authoritative ownership. The earlier `## Related Events` capability-spec heading is retired (no adopter authored it; the template never carried the section)."
944
986
  foreign_keys:
945
987
  - { column: capability_id, references: capabilities.id, nullable: false }
946
988
  - { column: event_id, references: events.id, nullable: false }
@@ -949,7 +991,7 @@ catalogues:
949
991
  - { name: capability_id, type: string, nullable: false }
950
992
  - { name: event_id, type: string, nullable: false }
951
993
  - { name: role, type: string, nullable: false, description: "publishes | consumes." }
952
- - { name: source, type: string, nullable: false, description: "authored | derived. `authored` rows come from a traceability declaration (shape A or shape B); `derived` rows come from `capability_service ⋈ service_event` and represent associative coupling, not ownership. Schema 2.14.0 per ADR 0160." }
994
+ - { name: source, type: string, nullable: false, description: "authored | derived. `authored` rows come from a traceability declaration (shape A or shape B); `derived` rows come from `capability_service ⋈ service_event` and represent associative coupling, not ownership. Schema 2.14.0 per M-ADR 0160." }
953
995
 
954
996
  capability_contract:
955
997
  primary_key: id
@@ -998,7 +1040,7 @@ catalogues:
998
1040
 
999
1041
  feature_event:
1000
1042
  primary_key: id
1001
- description: "Edge: feature publishes or consumes event. Derived only — emitted from the `feature_service ⋈ service_event` join, mirroring ADR 0160's capability_event derived path one rung lower in the capability/feature/service hierarchy. Every row carries `source=derived`; there is no authored shape (the authored signal lives at the service level via `service_event`, which the feature inherits through `feature_service`). PK is `{feature_id}__{event_id}__{role}` so the same feature can carry both publishes + consumes rows for the same event without collision. Schema 2.15.0 per ADR 0161."
1043
+ description: "Edge: feature publishes or consumes event. Derived only — emitted from the `feature_service ⋈ service_event` join, mirroring M-ADR 0160's capability_event derived path one rung lower in the capability/feature/service hierarchy. Every row carries `source=derived`; there is no authored shape (the authored signal lives at the service level via `service_event`, which the feature inherits through `feature_service`). PK is `{feature_id}__{event_id}__{role}` so the same feature can carry both publishes + consumes rows for the same event without collision. Schema 2.15.0 per M-ADR 0161."
1002
1044
  foreign_keys:
1003
1045
  - { column: feature_id, references: features.id, nullable: false }
1004
1046
  - { column: event_id, references: events.id, nullable: false }
@@ -1044,11 +1086,11 @@ catalogues:
1044
1086
  - { name: transport, type: string, nullable: false, description: "Delivery protocol: `appsync-websocket | pekko-ws | mqtt | sse | webhook-push | other`. The `other` value is escape-valve; adopters using it SHOULD record the actual transport in evidence." }
1045
1087
  - { name: evidence, type: string, nullable: true, description: "Evidence-file citation (`<sub-repo>/<path>:<line>`) anchoring the channel declaration. Mirrors the citation pattern used elsewhere in evidence yamls." }
1046
1088
  - { name: payload_ref, type: string, nullable: true, description: "Optional reference to a payload-contract event (`{event-name}` in the `events` catalogue) when the channel carries a contract-shaped payload. Empty when the payload is channel-private." }
1047
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
1089
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
1048
1090
 
1049
1091
  capability_domain_model:
1050
1092
  primary_key: id
1051
- description: "Edge: capability references a domain model. Forward: declared in `traceability.domain_model` field of the capability traceability manifest. Reverse: inferred via capability → domain → domain_model. Platform-profile only. Added in schema 2.4.0; see ADR 0142."
1093
+ description: "Edge: capability references a domain model. Forward: declared in `traceability.domain_model` field of the capability traceability manifest. Reverse: inferred via capability → domain → domain_model. Platform-profile only. Added in schema 2.4.0; see M-ADR 0142."
1052
1094
  foreign_keys:
1053
1095
  - { column: capability_id, references: capabilities.id, nullable: false }
1054
1096
  - { column: domain_model_id, references: domain_models.id, nullable: false }
@@ -1060,7 +1102,7 @@ catalogues:
1060
1102
 
1061
1103
  feature_domain_model:
1062
1104
  primary_key: id
1063
- description: "Edge: feature operates on a domain model. Derived from capability_feature ⋈ capability_domain_model (on capability_id). Platform-profile only. Orphan features (no capability link) get no row. Added in schema 2.4.0; see ADR 0142."
1105
+ description: "Edge: feature operates on a domain model. Derived from capability_feature ⋈ capability_domain_model (on capability_id). Platform-profile only. Orphan features (no capability link) get no row. Added in schema 2.4.0; see M-ADR 0142."
1064
1106
  foreign_keys:
1065
1107
  - { column: feature_id, references: features.id, nullable: false }
1066
1108
  - { column: domain_model_id, references: domain_models.id, nullable: false }
@@ -1084,7 +1126,7 @@ catalogues:
1084
1126
 
1085
1127
  persona_c4system:
1086
1128
  primary_key: id
1087
- description: "Edge: persona (C4 Person) uses a C4 system. Captures the L1 context 'Person uses System' relationship, extracted from Person(...) macros on the L1 context diagram and matched to personas rows. Per ADR 0155. Added in schema 2.10.0."
1129
+ description: "Edge: persona (C4 Person) uses a C4 system. Captures the L1 context 'Person uses System' relationship, extracted from Person(...) macros on the L1 context diagram and matched to personas rows. Per M-ADR 0155. Added in schema 2.10.0."
1088
1130
  foreign_keys:
1089
1131
  - { column: persona_id, references: personas.id, nullable: false }
1090
1132
  - { column: c4_system_id, references: c4_systems.id, nullable: false }
@@ -1118,7 +1160,7 @@ catalogues:
1118
1160
 
1119
1161
  system_external_dependency:
1120
1162
  primary_key: id
1121
- description: "Edge: a C4 system integrates with an external software system. Captures the L1 context 'System integrates with External System' relationship, extracted from System_Ext(...) + Rel(...) on L1/L2 diagrams. Per ADR 0155. Container-level external dependencies are out of scope (system-level only). Added in schema 2.10.0. From 2.30.0 (M-ADR 0189 §4.4): edges whose external endpoint the aggregator adjudicates as an INTERNAL system are rewritten onto system_system_dependency and removed from this catalogue."
1163
+ description: "Edge: a C4 system integrates with an external software system. Captures the L1 context 'System integrates with External System' relationship, extracted from System_Ext(...) + Rel(...) on L1/L2 diagrams. Per M-ADR 0155. Container-level external dependencies are out of scope (system-level only). Added in schema 2.10.0. From 2.30.0 (M-ADR 0189 §4.4): edges whose external endpoint the aggregator adjudicates as an INTERNAL system are rewritten onto system_system_dependency and removed from this catalogue."
1122
1164
  foreign_keys:
1123
1165
  - { column: c4_system_id, references: c4_systems.id, nullable: false }
1124
1166
  - { column: external_system_id, references: c4_external_systems.id, nullable: false }
@@ -1183,7 +1225,7 @@ catalogues:
1183
1225
 
1184
1226
  c4_container_entity:
1185
1227
  primary_key: id
1186
- description: "Derived edge: C4 container is responsible for data-model entity. Added in schema 2.13.0 per ADR 0159 §4.8. Pure transitive derivation: `service_entity ⋈ c4_containers.service_id`. Only the subset of containers with `service_id` populated contribute edges (per ADR 0155 the container ↔ service cardinality is o-or-1; data-store containers and infra-umbrella containers without a service mapping legitimately emit no rows)."
1228
+ description: "Derived edge: C4 container is responsible for data-model entity. Added in schema 2.13.0 per M-ADR 0159 §4.8. Pure transitive derivation: `service_entity ⋈ c4_containers.service_id`. Only the subset of containers with `service_id` populated contribute edges (per M-ADR 0155 the container ↔ service cardinality is o-or-1; data-store containers and infra-umbrella containers without a service mapping legitimately emit no rows)."
1187
1229
  foreign_keys:
1188
1230
  - { column: container_id, references: c4_containers.id, nullable: false }
1189
1231
  - { column: entity_id, references: entities.id, nullable: false }
@@ -1196,7 +1238,7 @@ catalogues:
1196
1238
 
1197
1239
  c4_system_entity:
1198
1240
  primary_key: id
1199
- description: "Derived edge: C4 system is responsible for data-model entity. Added in schema 2.13.0 per ADR 0159 §4.8. Pure aggregation roll-up: `c4_container_entity ⋈ c4_containers.system_id`, with container_count recording how many of the system's containers touch the entity (governance signal for cross-container concerns)."
1241
+ description: "Derived edge: C4 system is responsible for data-model entity. Added in schema 2.13.0 per M-ADR 0159 §4.8. Pure aggregation roll-up: `c4_container_entity ⋈ c4_containers.system_id`, with container_count recording how many of the system's containers touch the entity (governance signal for cross-container concerns)."
1200
1242
  foreign_keys:
1201
1243
  - { column: system_id, references: c4_systems.id, nullable: false }
1202
1244
  - { column: entity_id, references: entities.id, nullable: false }
@@ -1262,7 +1304,7 @@ catalogues:
1262
1304
  - { name: required_stability, type: string, nullable: true, description: "locked | provisional | unknown. Optional; the consuming SDD's expectation of contract stability." }
1263
1305
  - { name: contract_path, type: string, nullable: true, description: "Path to the contract file the dependency is against, as declared in the consuming SDD's evidence. External — resolution happens at aggregation if it happens at all." }
1264
1306
  - { name: consumed_by_services, type: string, nullable: true, description: "Comma-separated list of service names within the consuming product that consume the dependency. Free-text; not FK-validated (services are within-product and resolution is owner-side concern)." }
1265
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
1307
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
1266
1308
 
1267
1309
  cross_sdd_platform_capability:
1268
1310
  primary_key: id
@@ -1283,7 +1325,7 @@ catalogues:
1283
1325
  finding and produces no row. Cross-SDD references are external
1284
1326
  by definition. Added in schema 2.9.0; see
1285
1327
  `content/plans/v0-9-0-cohort-sweep-derived-bundle.md`
1286
- §"Cross-SDD platform-capability-edge" and ADR 0134.
1328
+ §"Cross-SDD platform-capability-edge" and M-ADR 0134.
1287
1329
  foreign_keys:
1288
1330
  - { column: consuming_product_id, references: products.id, nullable: false, external: true }
1289
1331
  - { column: platform_capability_id, references: capabilities.id, nullable: false, external: true }
@@ -1300,30 +1342,39 @@ catalogues:
1300
1342
  primary_key: id
1301
1343
  description: >
1302
1344
  Application-product edge (M-ADR 0193): one row per declared data-plane
1303
- binding — a typed way the service sources or holds data. The data-plane is
1304
- a COMPOSITION of these bindings, a second axis orthogonal to
1305
- `application_archetype` (0191). Built per-SDD from the manifest's
1345
+ binding — a typed way the service sources, holds, produces or exposes data.
1346
+ The data-plane is a COMPOSITION of these bindings, a second axis orthogonal
1347
+ to `application_archetype` (0191). Built per-SDD from the manifest's
1306
1348
  `data_plane.bindings` block (application-product only; other profiles emit
1307
- headers-only). A binding whose `target` is a platform capability/service
1308
- reconciles with `product_platform_dependencies` a `retrieve@internal`
1309
- binding is a synchronous platform dependency and a `stream-ingest@internal`
1310
- binding is the M-ADR 0192 `contract_type: event` async dependency; the
1311
- genuinely new rows are `own-store` (a self-binding) and any
1312
- `external-vendor` binding. The archetype-default-vs-declared WARN is a
1313
- fast-follow that lands with the M-ADR 0191 §4.3 expectations overlay.
1314
- Added in schema 2.37.0.
1349
+ headers-only). The `pattern` vocabulary splits by DIRECTION (§4.7): an
1350
+ INBOUND data-sourcing sub-set (retrieve | own-store | stream-ingest |
1351
+ project) and an OUTPUT-side sub-set (generate | publish), materialised as
1352
+ the derived `direction` column. An INBOUND binding whose `target` is a
1353
+ platform capability/service reconciles with
1354
+ `product_platform_dependencies` a `retrieve@internal` binding is a
1355
+ synchronous platform dependency and a `stream-ingest@internal` binding is
1356
+ the M-ADR 0192 `contract_type: event` async dependency; the genuinely new
1357
+ inbound rows are `own-store` (a self-binding) and any `external-vendor`
1358
+ binding. OUTPUT-side rows do NOT participate in that reconciliation
1359
+ (§4.7 rule 1): `publish` is a contract the service PROVIDES, not one it
1360
+ consumes, so it has no inbound counterpart to cross-check — consumers must
1361
+ filter on `direction` before reconciling, which is what the column is for.
1362
+ The archetype-default-vs-declared WARN keys on the bare `pattern` token and
1363
+ so spans both directions (§4.7 rule 2). Added in schema 2.37.0;
1364
+ `direction` added in 2.40.0.
1315
1365
  foreign_keys:
1316
1366
  - { column: product_id, references: products.id, nullable: false }
1317
1367
  columns:
1318
- - { name: id, type: string, nullable: false, description: "{product_id}__{pattern}__{locality}__{target} (empty components collapse to blanks). A duplicate emits a divergence finding and is dropped." }
1368
+ - { name: id, type: string, nullable: false, description: "{product_id}__{pattern}__{locality}__{target} (empty components collapse to blanks). A duplicate emits a divergence finding and is dropped. `direction` is NOT a component — it is derived from `pattern`, so it adds nothing to identity." }
1319
1369
  - { name: product_id, type: string, nullable: false, description: "The application-product declaring this binding (this SDD's product id)." }
1320
- - { name: pattern, type: string, nullable: false, description: "Closed method-tier enum: retrieve | own-store | stream-ingest | project. How the data relates to the service (M-ADR 0193 §4.1)." }
1321
- - { name: locality, type: string, nullable: true, description: "Closed enum: internal-platform | internal-domain | external-vendor. Where the other end sits. Empty for own-store (a self-binding with no other end)." }
1370
+ - { name: pattern, type: string, nullable: false, description: "Closed method-tier enum: retrieve | own-store | stream-ingest | project (inbound, data-sourcing) | generate | publish (output-side, per M-ADR 0193 §4.7). How the data relates to the service (§4.1)." }
1371
+ - { name: direction, type: string, nullable: false, description: "inbound | output. DERIVED from `pattern` by a single method-tier mapping — not authored, and not a manifest field, so it cannot disagree with `pattern`. Materialises the output-side sub-set §4.7 declares (generate/publish => output; everything else => inbound). Exists because three §4.7 rules branch on direction: platform-dep reconciliation is inbound-only, the archetype WARN must compare like with like, and the M-ADR 0187 convergence reasoning differs by direction. Added in 2.40.0." }
1372
+ - { name: locality, type: string, nullable: true, description: "Closed enum: internal-platform | internal-domain | external-vendor. Where the other end sits. REQUIRED on the inbound data-sourcing patterns (retrieve/stream-ingest/project); may be empty for own-store (a self-binding with no other end) and for the output-side patterns (generate/publish), which may carry one but do not require it (M-ADR 0193 §4.7)." }
1322
1373
  - { name: transport, type: string, nullable: true, description: "Open string — the wire (rest | graphql | grpc | appsync | kinesis | kafka | eventhub | cdc | ...). Values outside the recommended set emit a convention finding." }
1323
- - { name: runtime, type: string, nullable: true, description: "Free adopter-tier field — backend-compute runtime (e.g. java | node). Only on compute-bearing patterns (stream-ingest/project); empty otherwise." }
1374
+ - { name: runtime, type: string, nullable: true, description: "Free adopter-tier field — backend-compute runtime (e.g. java | node). Only on compute-bearing patterns (stream-ingest | project | generate — `generate` is compute-bearing per M-ADR 0193 §4.7); empty otherwise. A runtime on retrieve/own-store/publish is malformed and FAILs at manifest load." }
1324
1375
  - { name: target, type: string, nullable: true, description: "Free adopter-tier field — the specific counterpart (a platform service id, an upstream domain service, a named vendor). Instance identity; keeps locality a small class enum." }
1325
1376
  - { name: notes, type: string, nullable: true, description: "Optional free-text annotation." }
1326
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
1377
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
1327
1378
 
1328
1379
  application_data_plane_deviations:
1329
1380
  primary_key: id
@@ -1335,16 +1386,19 @@ catalogues:
1335
1386
  architecture bundle (and its `expected_bindings`) resolves — can suppress a
1336
1387
  mismatch it is told is sanctioned variance. The `expectation` value is the
1337
1388
  **bare pattern token** (`retrieve` | `own-store` | `stream-ingest` |
1338
- `project`) that the product knowingly diverges from; it must match the
1339
- pattern the WARN keys on. Added in schema 2.38.0.
1389
+ `project` | `generate` | `publish`) that the product knowingly diverges
1390
+ from; it must match the pattern the WARN keys on. The token set spans both
1391
+ directions — the WARN keys on the bare pattern, so an output-side
1392
+ expectation is deviated exactly like an inbound one (M-ADR 0193 §4.7 rule
1393
+ 2). Added in schema 2.38.0; output-side tokens documented in 2.40.0.
1340
1394
  foreign_keys:
1341
1395
  - { column: product_id, references: products.id, nullable: false }
1342
1396
  columns:
1343
1397
  - { name: id, type: string, nullable: false, description: "{product_id}__{expectation}. A duplicate emits a divergence finding and is dropped." }
1344
1398
  - { name: product_id, type: string, nullable: false, description: "The application-product declaring this deviation (this SDD's product id)." }
1345
- - { name: expectation, type: string, nullable: false, description: "The bare data-plane pattern token the product diverges from (retrieve | own-store | stream-ingest | project). Must match the WARN's pattern key." }
1399
+ - { name: expectation, type: string, nullable: false, description: "The bare data-plane pattern token the product diverges from (retrieve | own-store | stream-ingest | project | generate | publish). Must match the WARN's pattern key. Spans both directions per M-ADR 0193 §4.7 rule 2." }
1346
1400
  - { name: rationale, type: string, nullable: false, description: "Why the deviation is correct. Non-empty (enforced at manifest load)." }
1347
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
1401
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
1348
1402
 
1349
1403
  application_conformance_coverage:
1350
1404
  primary_key: id
@@ -1367,9 +1421,9 @@ catalogues:
1367
1421
  - { name: tag, type: string, nullable: false, description: "The conformance-expectation tag (opaque; matches an archetype's `conformance` tag in the reference-architecture vocabulary)." }
1368
1422
  - { name: status, type: string, nullable: false, description: "covered (the product's suite exercises it) | deviated (deliberately not covered, with a rationale)." }
1369
1423
  - { name: rationale, type: string, nullable: true, description: "Why the tag is deviated. Present (non-empty) only when status=deviated." }
1370
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
1424
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
1371
1425
 
1372
- # ---- UI screens family (schema 2.16.0, per ADR 0166) ----
1426
+ # ---- UI screens family (schema 2.16.0, per M-ADR 0166) ----
1373
1427
  # Application-product profile. Builder reads authored screen-spec artefacts
1374
1428
  # (`screens/*.md`: frontmatter + a normative ```openui-lang fenced block).
1375
1429
  # Forward: agent-authored. Reverse: the extraction toolkit projects an app's
@@ -1377,7 +1431,7 @@ catalogues:
1377
1431
  # these artefacts; see research/adr-0166-prototypes/ for the Phase Pre validation).
1378
1432
  screens:
1379
1433
  primary_key: id
1380
- description: "UI screen specified in the OpenUI Lang grammar (per ADR 0166). One row per screen / coherent screen group. Application-product profile (other profiles emit headers-only). Source: authored `screens/*.md` (frontmatter + ```openui-lang block); the reverse toolkit produces these from a router + component-tree projection."
1434
+ description: "UI screen specified in the OpenUI Lang grammar (per M-ADR 0166). One row per screen / coherent screen group. Application-product profile (other profiles emit headers-only). Source: authored `screens/*.md` (frontmatter + ```openui-lang block); the reverse toolkit produces these from a router + component-tree projection."
1381
1435
  foreign_keys:
1382
1436
  - { column: product_id, references: products.id, nullable: false }
1383
1437
  columns:
@@ -1385,29 +1439,29 @@ catalogues:
1385
1439
  - { name: name, type: string, nullable: false, description: "Screen slug / display name." }
1386
1440
  - { name: product_id, type: string, nullable: false, description: "Owning application-product." }
1387
1441
  - { name: route, type: string, nullable: true, description: "Route path the screen is mounted at, when applicable." }
1388
- - { name: status, type: string, nullable: true, description: "Maturity marker; uses the standard working | provisional | unknown | absent vocabulary (per ADR 0165) where applicable." }
1442
+ - { name: status, type: string, nullable: true, description: "Maturity marker; uses the standard working | provisional | unknown | absent vocabulary (per M-ADR 0165) where applicable." }
1389
1443
  - { name: source, type: string, nullable: false, description: "screen-spec (forward) | screen-extraction (reverse)." }
1390
1444
  - { name: domain, type: string, nullable: true, description: "Authored owning-domain hint from frontmatter `domain:` (a docs/domains/<domain>/ slug). Organisational grouping for multi-domain (platform-profile) SDDs; the authoritative screen->domain relationship is still derived via realises -> feature -> capability.domain_id (screen_feature). Empty when unauthored." }
1391
1445
  - { name: group, type: string, nullable: true, description: "Authored sub-grouping hint from frontmatter `group:` — a finer organisational axis within (or orthogonal to) domain, e.g. shell | shell-embed | identity. Free-form adopter label; not an FK. Empty when unauthored." }
1392
- - { name: context, type: string, nullable: true, description: "Bounded-context membership from frontmatter `context:` (per ADR 0170 §4.6). Free-form adopter label, orthogonal to domain/group — the consumed bounded context for a surface that spans several. Not an FK. Empty when unauthored. Added in schema 2.19.0." }
1393
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
1446
+ - { name: context, type: string, nullable: true, description: "Bounded-context membership from frontmatter `context:` (per M-ADR 0170 §4.6). Free-form adopter label, orthogonal to domain/group — the consumed bounded context for a surface that spans several. Not an FK. Empty when unauthored. Added in schema 2.19.0." }
1447
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
1394
1448
 
1395
1449
  ui_components:
1396
1450
  primary_key: id
1397
- description: "An entry in the adopter-owned component registry that screens compose against (per ADR 0166) — the UI-structure contract. A screen composes registry components but never defines one. Application-product profile. Source: components referenced across the SDD's screen-spec ```openui-lang blocks (registry projection); the reverse toolkit discovers the authoritative registry from the design-system import surface."
1451
+ description: "An entry in the adopter-owned component registry that screens compose against (per M-ADR 0166) — the UI-structure contract. A screen composes registry components but never defines one. Application-product profile. Source: components referenced across the SDD's screen-spec ```openui-lang blocks (registry projection); the reverse toolkit discovers the authoritative registry from the design-system import surface."
1398
1452
  foreign_keys:
1399
1453
  - { column: product_id, references: products.id, nullable: false }
1400
1454
  columns:
1401
1455
  - { name: id, type: string, nullable: false, description: "Slugged PK: {product_id}-{component-slug}." }
1402
1456
  - { name: name, type: string, nullable: false, description: "Component identifier as used in the grammar." }
1403
1457
  - { name: product_id, type: string, nullable: false, description: "Owning application-product." }
1404
- - { name: kind, type: string, nullable: true, description: "Optional classification: layout | display | input | chart | element | composite | remote | remote-iframe | remote-webcomponent. A `remote*` kind marks a micro-frontend federation seam (ADR 0166 §4.7)." }
1458
+ - { name: kind, type: string, nullable: true, description: "Optional classification: layout | display | input | chart | element | composite | remote | remote-iframe | remote-webcomponent. A `remote*` kind marks a micro-frontend federation seam (M-ADR 0166 §4.7)." }
1405
1459
  - { name: source, type: string, nullable: false, description: "screen-spec (forward) | design-system-import (reverse)." }
1406
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
1460
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
1407
1461
 
1408
1462
  screen_component:
1409
1463
  primary_key: id
1410
- description: "Edge: screen composes a UI component. Parsed from the screen-spec ```openui-lang block's component references (per ADR 0166)."
1464
+ description: "Edge: screen composes a UI component. Parsed from the screen-spec ```openui-lang block's component references (per M-ADR 0166)."
1411
1465
  foreign_keys:
1412
1466
  - { column: screen_id, references: screens.id, nullable: false }
1413
1467
  - { column: component_id, references: ui_components.id, nullable: false }
@@ -1415,27 +1469,27 @@ catalogues:
1415
1469
  - { name: id, type: string, nullable: false, description: "Composite PK: {screen_id}__{component_id}." }
1416
1470
  - { name: screen_id, type: string, nullable: false }
1417
1471
  - { name: component_id, type: string, nullable: false }
1418
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
1472
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
1419
1473
 
1420
1474
  screen_feature:
1421
1475
  primary_key: id
1422
- description: "Edge: screen realises a feature (traceability). Forward: `realises:` frontmatter on the screen-spec. Reverse: route → feature mapping. Per ADR 0166."
1476
+ description: "Edge: screen realises a feature (traceability). Forward: `realises:` frontmatter on the screen-spec. Reverse: route → feature mapping. Per M-ADR 0166."
1423
1477
  foreign_keys:
1424
1478
  - { column: screen_id, references: screens.id, nullable: false }
1425
1479
  # feature_id is profile-conditional external (2.23.0 mechanism, applied
1426
1480
  # 2.24.0): an app/integration screen may realise a platform-resident
1427
- # feature (ADR 0177 single-slug vocabulary). Internal for platform-profile
1481
+ # feature (M-ADR 0177 single-slug vocabulary). Internal for platform-profile
1428
1482
  # (owns its features); resolved at aggregation for app/integration.
1429
1483
  - { column: feature_id, references: features.id, nullable: false, external_for_profiles: [application-product, integration-product] }
1430
1484
  columns:
1431
1485
  - { name: id, type: string, nullable: false, description: "Composite PK: {screen_id}__{feature_id}. For app/integration builds the feature_id may be a bare realises slug until the aggregator resolves it to the platform feature id (then the PK is regenerated)." }
1432
1486
  - { name: screen_id, type: string, nullable: false }
1433
1487
  - { name: feature_id, type: string, nullable: false }
1434
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
1488
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
1435
1489
 
1436
1490
  persona_screen:
1437
1491
  primary_key: id
1438
- description: "Edge: persona can access a screen. Forward: `persona_access:` frontmatter. Reverse: route persona-access guards, permission/feature-flag config, or a host shell's per-persona menu (where the backend pre-filters visible screens). Per ADR 0166."
1492
+ description: "Edge: persona can access a screen. Forward: `persona_access:` frontmatter. Reverse: route persona-access guards, permission/feature-flag config, or a host shell's per-persona menu (where the backend pre-filters visible screens). Per M-ADR 0166."
1439
1493
  foreign_keys:
1440
1494
  - { column: persona_id, references: personas.id, nullable: false }
1441
1495
  - { column: screen_id, references: screens.id, nullable: false }
@@ -1443,11 +1497,11 @@ catalogues:
1443
1497
  - { name: id, type: string, nullable: false, description: "Composite PK: {persona_id}__{screen_id}." }
1444
1498
  - { name: persona_id, type: string, nullable: false }
1445
1499
  - { name: screen_id, type: string, nullable: false }
1446
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
1500
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
1447
1501
 
1448
1502
  screen_action:
1449
1503
  primary_key: id
1450
- description: "Edge: screen emits an action, optionally resolved to a catalogued event. The behavioural MFE seam — inter-bundle communication as a catalogued contract, not an ad-hoc string. Forward: `action=` declarations in the ```openui-lang block. Reverse: emitted custom-event / event-bus wiring. event_id is external-capable (the event may live in the platform SDD). Per ADR 0166 + ADR 0156."
1504
+ description: "Edge: screen emits an action, optionally resolved to a catalogued event. The behavioural MFE seam — inter-bundle communication as a catalogued contract, not an ad-hoc string. Forward: `action=` declarations in the ```openui-lang block. Reverse: emitted custom-event / event-bus wiring. event_id is external-capable (the event may live in the platform SDD). Per M-ADR 0166 + M-ADR 0156."
1451
1505
  foreign_keys:
1452
1506
  - { column: screen_id, references: screens.id, nullable: false }
1453
1507
  - { column: event_id, references: events.id, nullable: true, external: true }
@@ -1455,25 +1509,25 @@ catalogues:
1455
1509
  - { name: id, type: string, nullable: false, description: "Composite PK: {screen_id}__{action-slug}." }
1456
1510
  - { name: screen_id, type: string, nullable: false }
1457
1511
  - { name: action, type: string, nullable: false, description: "Declared action label emitted by the screen." }
1458
- - { name: event_id, type: string, nullable: true, description: "Catalogued event the action maps to (per ADR 0156). External-capable; empty when the action does not resolve to a domain event." }
1459
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
1512
+ - { name: event_id, type: string, nullable: true, description: "Catalogued event the action maps to (per M-ADR 0156). External-capable; empty when the action does not resolve to a domain event." }
1513
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }
1460
1514
 
1461
1515
  conformance_finding:
1462
1516
  primary_key: id
1463
- description: "Conformance-reverse drift summary, one row per check (method ADR 0180). NOT produced by `catalogue build` (it reads the spec repo) — produced by `sdd-cli conformance --emit-finding` (which has the code repo) and federated here by the aggregator. Each row is a run-dated snapshot of declared-vs-observed drift for an implementation member (ADR 0181 role/lifecycle), so estate-wide conformance is queryable (aggregate union) and trendable (snapshot diff across runs/commits). Verdicts are PROVISIONAL — disposition (code-defect | spec-stale | divergence) is triage, recorded elsewhere. No enforced FK on implementation_repo: the code repo is frequently cross-repo and not in this SDD's repositories.csv. Added in schema 2.25.0."
1517
+ description: "Conformance-reverse drift summary, one row per check (method M-ADR 0180). NOT produced by `catalogue build` (it reads the spec repo) — produced by `sdd-cli conformance --emit-finding` (which has the code repo) and federated here by the aggregator. Each row is a run-dated snapshot of declared-vs-observed drift for an implementation member (M-ADR 0181 role/lifecycle), so estate-wide conformance is queryable (aggregate union) and trendable (snapshot diff across runs/commits). Verdicts are PROVISIONAL — disposition (code-defect | spec-stale | divergence) is triage, recorded elsewhere. No enforced FK on implementation_repo: the code repo is frequently cross-repo and not in this SDD's repositories.csv. Added in schema 2.25.0."
1464
1518
  columns:
1465
1519
  - { name: id, type: string, nullable: false, description: "Check id (unique within the SDD; source_sdd_id disambiguates across the federation)." }
1466
1520
  - { name: check_id, type: string, nullable: false }
1467
- - { name: target, type: string, nullable: false, description: "code-vs-contract | binding-vs-reality (ADR 0180 §2.5)." }
1468
- - { name: implementation_repo, type: string, nullable: true, description: "The implementation member the check is about (ADR 0181). Empty when checks were not binding-derived." }
1469
- - { name: role, type: string, nullable: true, description: "as-is | to-be (ADR 0181). Empty when not binding-derived." }
1470
- - { name: lifecycle, type: string, nullable: true, description: "planned | migrating | active | legacy-active | deprecated | decommissioned (ADR 0181)." }
1521
+ - { name: target, type: string, nullable: false, description: "code-vs-contract | binding-vs-reality (M-ADR 0180 §2.5)." }
1522
+ - { name: implementation_repo, type: string, nullable: true, description: "The implementation member the check is about (M-ADR 0181). Empty when checks were not binding-derived." }
1523
+ - { name: role, type: string, nullable: true, description: "as-is | to-be (M-ADR 0181). Empty when not binding-derived." }
1524
+ - { name: lifecycle, type: string, nullable: true, description: "planned | migrating | active | legacy-active | deprecated | decommissioned (M-ADR 0181)." }
1471
1525
  - { name: declared, type: number, nullable: false, description: "Count of the declared surface (spec/binding/contract)." }
1472
1526
  - { name: observed, type: number, nullable: false, description: "Count of the observed surface (code)." }
1473
1527
  - { name: matched, type: number, nullable: false }
1474
1528
  - { name: conformance_pct, type: number, nullable: false, description: "matched / denom * 100 (denom per the check)." }
1475
1529
  - { name: declared_not_observed, type: number, nullable: false, description: "Count declared but not observed (candidate: spec-stale / unimplemented / dangling)." }
1476
1530
  - { name: observed_not_declared, type: number, nullable: false, description: "Count observed but not declared (candidate: binding-stale / code-defect)." }
1477
- - { name: needs_triage, type: boolean, nullable: false, description: "True when any asymmetry exists. Triage, not auto-fail (ADR 0180 §2.3)." }
1531
+ - { name: needs_triage, type: boolean, nullable: false, description: "True when any asymmetry exists. Triage, not auto-fail (M-ADR 0180 §2.3)." }
1478
1532
  - { name: run_date, type: string, nullable: false, description: "ISO date of the conformance run — the snapshot stamp enabling trend over time." }
1479
- - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per ADR 0134." }
1533
+ - { name: source_sdd_id, type: string, nullable: true, description: "Originating SDD slug. Populated by the aggregator per M-ADR 0134." }