@sdd-method/maintain-cli 0.11.0 → 0.13.0

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.
Files changed (38) hide show
  1. package/dist/lib/behaviour-store/archive.js +13 -0
  2. package/dist/lib/catalogue/aggregate.js +64 -0
  3. package/dist/lib/catalogue/build.js +45 -2
  4. package/dist/lib/catalogue/builders/adr-governs.js +39 -0
  5. package/dist/lib/catalogue/builders/adrs.js +11 -0
  6. package/dist/lib/catalogue/builders/capability-spec.js +1 -0
  7. package/dist/lib/catalogue/builders/contract-revisions.js +126 -0
  8. package/dist/lib/catalogue/builders/data-model.js +316 -0
  9. package/dist/lib/catalogue/builders/entities-mermaid.js +18 -85
  10. package/dist/lib/catalogue/builders/feature-grounding.js +1 -0
  11. package/dist/lib/catalogue/builders/features.js +23 -2
  12. package/dist/lib/catalogue/builders/integration-components.js +49 -5
  13. package/dist/lib/catalogue/builders/journey-requirement.js +144 -0
  14. package/dist/lib/catalogue/builders/quality-scores.js +17 -0
  15. package/dist/lib/catalogue/builders/requirements.js +168 -32
  16. package/dist/lib/catalogue/canonical-schema.yaml +845 -28
  17. package/dist/lib/catalogue/manifest-loader.js +13 -0
  18. package/dist/lib/catalogue/retired-catalogues.js +25 -0
  19. package/dist/lib/catalogue/rubric-coverage-map.yaml +108 -2
  20. package/dist/lib/catalogue/schema-compat.js +1 -1
  21. package/dist/lib/catalogue/schema-loader.js +3 -0
  22. package/dist/lib/catalogue/staleness-verdicts.js +75 -6
  23. package/dist/lib/metamodel/tql-subset-parser.js +35 -2
  24. package/dist/lib/structure/catalogue.js +183 -0
  25. package/dist/lib/structure/compose.js +174 -0
  26. package/dist/lib/structure/effects.js +36 -0
  27. package/dist/lib/structure/model.js +212 -0
  28. package/dist/lib/structure/render.js +242 -0
  29. package/dist/lib/structure/view.js +301 -0
  30. package/dist/lib/validate/agreement-evidence.js +216 -0
  31. package/dist/lib/validate/behaviour-store.js +516 -28
  32. package/dist/lib/validate/dispatch.js +21 -0
  33. package/dist/lib/validate/feature-spec-pointers.js +175 -0
  34. package/dist/lib/validate/journey-impact.js +193 -0
  35. package/dist/lib/validate/structural-model.js +265 -0
  36. package/dist/maintain-version.json +2 -2
  37. package/dist/verify-version.json +2 -2
  38. package/package.json +2 -2
@@ -7,7 +7,7 @@
7
7
  # Emitted by sdd-cli's YAML emitter with no line folding; the three header scalars are quoted for the
8
8
  # textual readers downstream. The one deliberate difference from the authored form is schema_status:
9
9
  # the authored form says canonical; a projection never does.
10
- schema_version: "4.2.0"
10
+ schema_version: "6.0.0"
11
11
  schema_owner: "sdd-method"
12
12
  schema_status: "generated"
13
13
  enums:
@@ -338,6 +338,7 @@ enums:
338
338
  - value: capability-spec
339
339
  - value: capability-tree
340
340
  - value: product-map
341
+ - value: structural-model
341
342
  description: Which artefact a capabilities row was derived from. Bound at 3.13.0 from the column descriptions; measured against both reference estates before binding (M-ADR 0205 §4.4).
342
343
  feature_source:
343
344
  values:
@@ -346,6 +347,7 @@ enums:
346
347
  - value: feature-tree
347
348
  - value: feature-grounding
348
349
  - value: capability-spec
350
+ - value: structural-model
349
351
  description: Which artefact a features row was derived from (M-ADR 0145). Bound at 3.13.0 from the column descriptions; measured against both reference estates before binding (M-ADR 0205 §4.4).
350
352
  artefact_maturity:
351
353
  values:
@@ -620,6 +622,8 @@ enums:
620
622
  description: "In the living spec: shipped behaviour."
621
623
  - value: agreed
622
624
  description: Added by an open change whose agreement record is agreed; not yet shipped.
625
+ - value: retired
626
+ description: "Removed by an archived change's REMOVED delta: kept so its lineage shows the removal; no status."
623
627
  description: Where a catalogued requirement stands (M-ADR 0221 §4.4).
624
628
  requirement_change_kind:
625
629
  values:
@@ -633,16 +637,15 @@ enums:
633
637
  - value: ADDED
634
638
  - value: MODIFIED
635
639
  - value: RENAMED
636
- description: How a change's delta treated a requirement that is current now (a removed requirement has no row).
637
- requirement_status_value:
640
+ - value: REMOVED
641
+ description: How a change's delta treated a requirement.
642
+ requirement_assertion_kind:
638
643
  values:
639
- - value: agreed
640
- description: In an agreed, open change.
641
644
  - value: declared-shipped
642
- description: Its change archived on a passing judge, with this repository's task group complete.
645
+ description: Its change archived on a passing judge, with this repository's work order implementing it.
643
646
  - value: observed
644
647
  description: Independent evidence from this repository's code matches (a baseline's characterization tests or a reverse snapshot).
645
- description: A requirement's status in one implementing repository (M-ADR 0221 §4.5).
648
+ description: The kind of evidence an assertion is about one revision, in one repository (M-ADR 0230 §4.7, Proposed).
646
649
  change_status:
647
650
  values:
648
651
  - value: proposed
@@ -664,13 +667,112 @@ enums:
664
667
  work_order_status:
665
668
  values:
666
669
  - value: agreed
667
- description: Agreed; the repository's work is not yet judged.
670
+ description: Agreed; the change has not yet archived on a passing judge.
668
671
  - value: completed
669
- description: Marked completed by a passing judge.
672
+ description: "Completed: the change archived on a passing judge, after every repository merged its judged commit."
670
673
  description: A work order's status in its change's agreement record (M-ADR 0223 §4.2, §4.6).
674
+ feature_status:
675
+ values:
676
+ - value: active
677
+ description: The feature's behaviour is live or being built.
678
+ - value: retired
679
+ description: Its behaviour was retired by an archived change; kept so its retired requirements resolve.
680
+ description: A catalogued feature's status (M-ADR 0221 §4.5).
681
+ feature_kind:
682
+ values:
683
+ - value: feature
684
+ description: "A product or capability feature: the default."
685
+ - value: obligation
686
+ description: Behaviour every feature in a population depends on, owned as a feature of its own (M-ADR 0226, Proposed).
687
+ - value: journey
688
+ description: A user journey's joint behaviour, held in the behaviour store (M-ADR 0229 §4.2, option B; Proposed).
689
+ description: What a catalogued feature is (M-ADR 0226 and M-ADR 0229, both Proposed).
690
+ journey_requirement_basis:
691
+ values:
692
+ - value: tag
693
+ description: A @req tag in the journey's end-to-end test file (option A).
694
+ - value: citation
695
+ description: A citation in the journey feature's living spec (option B).
696
+ description: Where a journey's citation of a requirement was read (M-ADR 0229 §4.4, Proposed).
697
+ source_of_truth:
698
+ values:
699
+ - value: structure
700
+ description: The structural model in the behaviour store (openspec/structure/), changed by a change's structural deltas.
701
+ - value: behaviour
702
+ description: The behaviour store's living specs and changes.
703
+ - value: interface
704
+ description: The contract files.
705
+ - value: decision
706
+ description: The ADR files.
707
+ - value: declaration
708
+ description: A manifest or configuration file that is its own home, such as the SDD manifest.
709
+ - value: intent
710
+ description: Intent documents, edited in place.
711
+ - value: derived
712
+ description: "Nowhere: computed from other facts, per view; never authored."
713
+ - value: evidence
714
+ description: Observations, scores and findings, about a named revision.
715
+ - value: execution
716
+ description: "The change records and the build itself: changes, work orders, lineage, and the provenance the build or aggregation stamps."
717
+ description: Where a catalogue's facts, or a column's, are authored (M-ADR 0230 §4.1, Proposed). Each catalogue carries one; a column carries one only where it differs.
718
+ relationship_end_cardinality:
719
+ values:
720
+ - value: exactly-one
721
+ - value: zero-or-one
722
+ - value: one-or-more
723
+ - value: zero-or-more
724
+ description: "How many entities one end of a relationship holds for one entity at the other end (M-ADR 0230 §4.3, Proposed): a Mermaid ER end marker (|| exactly one, |o or o| zero or one, }| or |{ one or more, }o or o{ zero or more). A TypeQL relationship is zero-or-more at both ends, because the subset admits no participation cardinality; a role's @card is a cardinality invariant (domain_invariants). Replaced entity_relationship_cardinality in schema 6.0.0."
725
+ domain_invariant_kind:
726
+ values:
727
+ - value: unique
728
+ description: The named attributes together are unique across the entity's instances.
729
+ - value: required
730
+ description: The named attributes are always present.
731
+ - value: cardinality
732
+ description: A bound on how many entities the named relationship relates, stated in the statement.
733
+ - value: rule
734
+ description: Any other rule, stated in the statement.
735
+ description: The type of a domain invariant (M-ADR 0230 §4.3, Proposed).
736
+ revision_state:
737
+ values:
738
+ - value: current
739
+ description: "Published: the living spec states it."
740
+ - value: intended
741
+ description: An agreed open change states it.
742
+ - value: history
743
+ description: Once published or stated, and no longer current.
744
+ description: Which view a revision belongs to (M-ADR 0230 §4.7, Proposed).
745
+ change_effect_element_kind:
746
+ values:
747
+ - value: requirement
748
+ description: A requirement, written by a behaviour delta.
749
+ - value: structure
750
+ description: An element of the structural model, written by a structural delta.
751
+ description: What kind of element a change effect writes (M-ADR 0230 §4.7, Proposed).
752
+ adr_governs:
753
+ values:
754
+ - value: current
755
+ description: The system as published.
756
+ - value: intended
757
+ description: "The system as the agreed changes will leave it: the decision applies from its change's archive."
758
+ - value: none
759
+ description: "Neither: proposed, rejected, deprecated, superseded by a decision now in force, or its change withdrawn."
760
+ description: Which view a decision governs (M-ADR 0230 §4.2, Proposed).
761
+ contract_revision_state:
762
+ values:
763
+ - value: agreed
764
+ description: Introduced by an agreed open change.
765
+ - value: active
766
+ description: "Applicable in the published specification: the file's current content."
767
+ - value: deprecated
768
+ description: Applicable, with a sunset.
769
+ - value: retired
770
+ description: "No longer applicable: an archived change's revision the file no longer holds."
771
+ description: A contract revision's applicability in the published specification (M-ADR 0230 §4.2, Proposed).
671
772
  catalogues:
672
773
  domains:
673
774
  primary_key: id
775
+ source_of_truth: structure
674
776
  columns:
675
777
  - name: id
676
778
  type: string
@@ -687,6 +789,7 @@ catalogues:
687
789
  type: string
688
790
  nullable: false
689
791
  description: platform-profile | application-product | integration-product.
792
+ source_of_truth: declaration
690
793
  - name: reference_architecture_equivalent
691
794
  type: string
692
795
  nullable: true
@@ -697,19 +800,23 @@ catalogues:
697
800
  - name: repo_count
698
801
  type: int
699
802
  nullable: false
803
+ source_of_truth: derived
700
804
  - name: source_sdd_id
701
805
  type: string
702
806
  nullable: true
703
807
  description: Originating SDD slug. Populated by the aggregator at merge time per M-ADR 0134; left empty by per-SDD builders.
808
+ source_of_truth: execution
704
809
  - name: platform_sdd_id
705
810
  type: string
706
811
  nullable: true
707
812
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
813
+ source_of_truth: execution
708
814
  column_enums:
709
815
  method_profile: enums.sdd_profile
710
816
  status: enums.domain_status
711
817
  products:
712
818
  primary_key: id
819
+ source_of_truth: declaration
713
820
  columns:
714
821
  - name: id
715
822
  type: string
@@ -734,6 +841,7 @@ catalogues:
734
841
  type: string
735
842
  nullable: false
736
843
  description: Path to _product/ directory, relative to docs/.
844
+ source_of_truth: derived
737
845
  - name: lifecycle
738
846
  type: string
739
847
  nullable: true
@@ -770,28 +878,35 @@ catalogues:
770
878
  type: int
771
879
  nullable: true
772
880
  description: "DEPRECATED at 3.3.0, for removal at 4.0.0 — superseded by `quality_scores` (rubric_id `reverse-product-quality.product_synthesis_quality`). Score 0-10 from the product-synthesis rubric (reverse method only). WIRED in 2.47.0 from `orchestration/gate-registry/reverse-product-quality-scores.yaml` — the registry family at product granularity — via the SELF-PRODUCT rule: the unit whose `product_path` is '.' AND whose key equals the SDD's sdd_id. Both conditions are required; product_path alone admits synthetic gate fixtures, key-matching alone admits covered sub-products. Backfill only: it fills an empty cell and never overwrites an emitted value. Empty on a forward estate by design — a forward-authored product has no reverse rubric score, and residue-based authoring signals deliberately do NOT write here (see status)."
881
+ source_of_truth: evidence
773
882
  - name: synthesis_band
774
883
  type: string
775
884
  nullable: true
776
885
  description: "DEPRECATED at 3.3.0, for removal at 4.0.0 — superseded by `quality_scores.band`, which is UNBOUND because the vocabulary is per-rubric. This column's closed set accepts only three of the SEVEN band values the reverse estate actually authors (measured 3.3.0: strong, working, weak, moderate, easy, hard, very-hard), silently emptying the rest. developing | working | strong — a CLOSED vocabulary; a band outside it is reported as a convention finding and the cell left empty rather than emitting a value no consumer can interpret. Wired in 2.47.0 alongside synthesis_quality."
886
+ source_of_truth: evidence
777
887
  - name: last_assessed
778
888
  type: date
779
889
  nullable: true
890
+ source_of_truth: evidence
780
891
  - name: highest_snapshot_impact
781
892
  type: string
782
893
  nullable: true
894
+ source_of_truth: evidence
783
895
  - name: repo_count
784
896
  type: int
785
897
  nullable: false
786
898
  description: Number of repos mapped to this product.
899
+ source_of_truth: derived
787
900
  - name: source_sdd_id
788
901
  type: string
789
902
  nullable: true
790
903
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
904
+ source_of_truth: execution
791
905
  - name: platform_sdd_id
792
906
  type: string
793
907
  nullable: true
794
908
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
909
+ source_of_truth: execution
795
910
  foreign_keys:
796
911
  - column: domain_id
797
912
  references: domains.id
@@ -804,6 +919,7 @@ catalogues:
804
919
  packaging: enums.product_packaging
805
920
  applications:
806
921
  primary_key: id
922
+ source_of_truth: derived
807
923
  columns:
808
924
  - name: id
809
925
  type: string
@@ -882,10 +998,12 @@ catalogues:
882
998
  type: string
883
999
  nullable: true
884
1000
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1001
+ source_of_truth: execution
885
1002
  - name: platform_sdd_id
886
1003
  type: string
887
1004
  nullable: true
888
1005
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1006
+ source_of_truth: execution
889
1007
  description: Filtered view of products where profile = application-product.
890
1008
  foreign_keys:
891
1009
  - column: domain_id
@@ -899,6 +1017,7 @@ catalogues:
899
1017
  packaging: enums.product_packaging
900
1018
  integrations:
901
1019
  primary_key: id
1020
+ source_of_truth: declaration
902
1021
  columns:
903
1022
  - name: id
904
1023
  type: string
@@ -922,9 +1041,11 @@ catalogues:
922
1041
  - name: doc_path
923
1042
  type: string
924
1043
  nullable: false
1044
+ source_of_truth: derived
925
1045
  - name: repo_count
926
1046
  type: int
927
1047
  nullable: false
1048
+ source_of_truth: derived
928
1049
  - name: ingestion_pattern
929
1050
  type: string
930
1051
  nullable: true
@@ -949,10 +1070,12 @@ catalogues:
949
1070
  type: string
950
1071
  nullable: true
951
1072
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1073
+ source_of_truth: execution
952
1074
  - name: platform_sdd_id
953
1075
  type: string
954
1076
  nullable: true
955
1077
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1078
+ source_of_truth: execution
956
1079
  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`.
957
1080
  foreign_keys:
958
1081
  - column: domain_id
@@ -965,6 +1088,7 @@ catalogues:
965
1088
  invocation_pattern: enums.invocation_pattern
966
1089
  integration_component:
967
1090
  primary_key: id
1091
+ source_of_truth: declaration
968
1092
  columns:
969
1093
  - name: id
970
1094
  type: string
@@ -986,6 +1110,7 @@ catalogues:
986
1110
  type: string
987
1111
  nullable: false
988
1112
  description: undeclared | repository | service | unresolved. `undeclared` = no `componentRepo` given (normal, no finding). `repository`/`service` = the declared linkage resolved. `unresolved` = declared but matched no repositories.id or services.id of this SDD, which carries a coverage finding. Re-based on `component_repo` in 2.44.0 — it previously described resolution of `component_id` itself.
1113
+ source_of_truth: derived
989
1114
  - name: component_type
990
1115
  type: string
991
1116
  nullable: true
@@ -1030,14 +1155,17 @@ catalogues:
1030
1155
  type: string
1031
1156
  nullable: false
1032
1157
  description: "components-array | component-manifest — WHICH of M-ADR 0171 §9.1's two homes declared this component. Added in 2.49.0, when the second home became catalogued. Required because §10.1 states that any coverage reasoning MUST say which form it counts, and once one table holds both, a consumer cannot tell them apart: merging them without this recreates the reference-exemplar problem — well-formed rows that do not mean what a consumer assumes. Measured at the time of wiring: the array form was 15 components across 5 SDDs, the per-component form 86 across 21, and the two are DISJOINT (no id collision, no SDD using both). `resolution` also reads differently by form — for the array form `componentRepo` is an optional declaration (0 of 15 declared it); for the per-component form the containing `repos/<component>/` directory IS the repo, so linkage is structural rather than declared."
1158
+ source_of_truth: derived
1033
1159
  - name: source_sdd_id
1034
1160
  type: string
1035
1161
  nullable: true
1036
1162
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1163
+ source_of_truth: execution
1037
1164
  - name: platform_sdd_id
1038
1165
  type: string
1039
1166
  nullable: true
1040
1167
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1168
+ source_of_truth: execution
1041
1169
  description: |
1042
1170
  Integration-product edge (M-ADR 0171 §9, catalogued per §10.1): one row per component declared in the SDD's `integration-manifest.yaml` `components:` array. A component is one of the integration's component code repos (M-ADR 0106) — an integration SDD is a one-to-many spec→code unit — and the tier is the source of truth for the interaction pattern, with the SDD-level `ingestionPattern`/`invocationPattern` as its aggregate (§9.3).
1043
1171
  Built per-SDD, integration-product only (other profiles emit headers-only). A component id is unique within its manifest and names an **interaction surface** — commonly one provider feed — which is NOT necessarily a deployable (§10.2). The optional `component_repo` carries an explicit code linkage; when declared it MUST resolve to a `repositories.id` or `services.id` of the same SDD, and a declared-but-unresolvable linkage is a **coverage finding, not a load failure**. `resolution` records the outcome inline, including `undeclared` for the normal feed-level case, so a consumer filters on it rather than inferring from a join miss.
@@ -1052,6 +1180,7 @@ catalogues:
1052
1180
  declared_in: enums.integration_component_declared_in
1053
1181
  adrs:
1054
1182
  primary_key: id
1183
+ source_of_truth: decision
1055
1184
  columns:
1056
1185
  - name: id
1057
1186
  type: string
@@ -1074,25 +1203,39 @@ catalogues:
1074
1203
  - name: doc_path
1075
1204
  type: string
1076
1205
  nullable: false
1206
+ source_of_truth: derived
1077
1207
  - name: superseded_by_id
1078
1208
  type: string
1079
1209
  nullable: true
1210
+ source_of_truth: derived
1080
1211
  - name: inference_confidence
1081
1212
  type: string
1082
1213
  nullable: true
1083
1214
  description: high | medium | low (reverse-inferred ADRs only).
1215
+ source_of_truth: derived
1084
1216
  - name: supersedes_raw
1085
1217
  type: string
1086
1218
  nullable: true
1087
1219
  description: Raw text from Supersedes bullet for later parsing.
1220
+ - name: effective_change
1221
+ type: string
1222
+ nullable: true
1223
+ description: "From the ADR's **Effective:** line (M-ADR 0230 §4.2, Proposed): the change whose archive makes the decision apply, by its undated name; empty when it applies on acceptance. Added in schema 6.0.0."
1224
+ - name: governs
1225
+ type: string
1226
+ nullable: true
1227
+ description: "Bound to adr_governs: which view the decision governs. An Accepted ADR governs current on acceptance, or once its effective change archives; intended while that change is open; nothing once it is withdrawn or gone. A Superseded ADR governs current until a superseding ADR does. Added in schema 6.0.0."
1228
+ source_of_truth: derived
1088
1229
  - name: source_sdd_id
1089
1230
  type: string
1090
1231
  nullable: true
1091
1232
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1233
+ source_of_truth: execution
1092
1234
  - name: platform_sdd_id
1093
1235
  type: string
1094
1236
  nullable: true
1095
1237
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1238
+ source_of_truth: execution
1096
1239
  foreign_keys:
1097
1240
  - column: domain_id
1098
1241
  references: domains.id
@@ -1105,8 +1248,10 @@ catalogues:
1105
1248
  nullable: true
1106
1249
  column_enums:
1107
1250
  inference_confidence: enums.confidence_level
1251
+ governs: enums.adr_governs
1108
1252
  glossary_items:
1109
1253
  primary_key: id
1254
+ source_of_truth: structure
1110
1255
  columns:
1111
1256
  - name: id
1112
1257
  type: string
@@ -1126,13 +1271,16 @@ catalogues:
1126
1271
  type: string
1127
1272
  nullable: true
1128
1273
  description: Set when this term is an alias for another.
1274
+ source_of_truth: derived
1129
1275
  - name: aliases
1130
1276
  type: string
1131
1277
  nullable: true
1132
1278
  description: "';'-separated list."
1279
+ source_of_truth: derived
1133
1280
  - name: evidence
1134
1281
  type: string
1135
1282
  nullable: true
1283
+ source_of_truth: evidence
1136
1284
  - name: notes
1137
1285
  type: string
1138
1286
  nullable: true
@@ -1140,10 +1288,12 @@ catalogues:
1140
1288
  type: string
1141
1289
  nullable: true
1142
1290
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1291
+ source_of_truth: execution
1143
1292
  - name: platform_sdd_id
1144
1293
  type: string
1145
1294
  nullable: true
1146
1295
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1296
+ source_of_truth: execution
1147
1297
  foreign_keys:
1148
1298
  - column: owning_domain_id
1149
1299
  references: domains.id
@@ -1153,6 +1303,7 @@ catalogues:
1153
1303
  nullable: true
1154
1304
  glossary_xref:
1155
1305
  primary_key: id
1306
+ source_of_truth: structure
1156
1307
  columns:
1157
1308
  - name: id
1158
1309
  type: string
@@ -1169,6 +1320,10 @@ catalogues:
1169
1320
  nullable: false
1170
1321
  description: alias-of | conflicts-with | references | supersedes (extended in schema 2.12.0 per M-ADR 0158).
1171
1322
  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)."
1323
+ natural_key:
1324
+ - source_id
1325
+ - target_id
1326
+ - relation
1172
1327
  foreign_keys:
1173
1328
  - column: source_id
1174
1329
  references: glossary_items.id
@@ -1180,6 +1335,7 @@ catalogues:
1180
1335
  relation: enums.glossary_xref_relation
1181
1336
  entity_glossary:
1182
1337
  primary_key: id
1338
+ source_of_truth: structure
1183
1339
  columns:
1184
1340
  - name: id
1185
1341
  type: string
@@ -1198,14 +1354,17 @@ catalogues:
1198
1354
  type: string
1199
1355
  nullable: false
1200
1356
  description: aligned | matched_direct. Conflicting statuses within a domain resolve matched_direct > aligned with a divergence finding.
1357
+ source_of_truth: derived
1201
1358
  - name: source_sdd_id
1202
1359
  type: string
1203
1360
  nullable: true
1204
1361
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1362
+ source_of_truth: execution
1205
1363
  - name: platform_sdd_id
1206
1364
  type: string
1207
1365
  nullable: true
1208
1366
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1367
+ source_of_truth: execution
1209
1368
  - name: entity_id
1210
1369
  type: string
1211
1370
  nullable: true
@@ -1223,6 +1382,7 @@ catalogues:
1223
1382
  nullable: true
1224
1383
  services:
1225
1384
  primary_key: id
1385
+ source_of_truth: structure
1226
1386
  columns:
1227
1387
  - name: id
1228
1388
  type: string
@@ -1261,6 +1421,7 @@ catalogues:
1261
1421
  type: string
1262
1422
  nullable: true
1263
1423
  description: high | medium | low (reverse-method classification).
1424
+ source_of_truth: evidence
1264
1425
  - name: context
1265
1426
  type: string
1266
1427
  nullable: true
@@ -1272,10 +1433,12 @@ catalogues:
1272
1433
  type: string
1273
1434
  nullable: true
1274
1435
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1436
+ source_of_truth: execution
1275
1437
  - name: platform_sdd_id
1276
1438
  type: string
1277
1439
  nullable: true
1278
1440
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1441
+ source_of_truth: execution
1279
1442
  foreign_keys:
1280
1443
  - column: product_id
1281
1444
  references: products.id
@@ -1291,6 +1454,7 @@ catalogues:
1291
1454
  confidence: enums.confidence_level
1292
1455
  capabilities:
1293
1456
  primary_key: id
1457
+ source_of_truth: structure
1294
1458
  columns:
1295
1459
  - name: id
1296
1460
  type: string
@@ -1313,6 +1477,7 @@ catalogues:
1313
1477
  type: string
1314
1478
  nullable: true
1315
1479
  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.
1480
+ source_of_truth: evidence
1316
1481
  - name: context
1317
1482
  type: string
1318
1483
  nullable: true
@@ -1320,6 +1485,7 @@ catalogues:
1320
1485
  - name: description
1321
1486
  type: string
1322
1487
  nullable: true
1488
+ source_of_truth: intent
1323
1489
  - name: status
1324
1490
  type: string
1325
1491
  nullable: false
@@ -1328,14 +1494,17 @@ catalogues:
1328
1494
  type: string
1329
1495
  nullable: true
1330
1496
  description: Path to capability spec file when one exists.
1497
+ source_of_truth: derived
1331
1498
  - name: contract_provenance
1332
1499
  type: string
1333
1500
  nullable: true
1334
1501
  description: "How this capability's declared contract SET was produced, from `traceability.contracts.provenance`. hand-authored | reverse-extracted | generated — the vocabulary the method already ships for `authoring-mode`, reused deliberately so provenance has one vocabulary and not two. Empty means undeclared, and undeclared reads as `hand-authored` by convention. Added at 3.5.0. ⚠ STRICTLY ORTHOGONAL to the contract-set maturity ladder (`traceability.contracts.status`: planned | provisional | partial | complete | stable | none): provenance never constrains status and status never constrains provenance, and `reverse-extracted` + `complete` is the legitimate pair that motivated the field. Evidence: 2 reverse-estate manifests had written `reverse-extracted` INTO contracts.status, where it is invalid, because a complete reverse-derived contract surface had no way to say both true things at once and the author picked the provenance one. A rule here that constrained maturity would re-create exactly that defect. ⚠ Note the asymmetry this column exposes and does not fix: the maturity ladder it is orthogonal to has NO catalogue column at all — `traceability.contracts.status` is validator-enforced but uncatalogued, so it is queryable by no consumer. That is the authored-but-uncatalogued class (a block with no column has no automated reader, so nothing can notice when it is absent or wrong); this column is given one precisely so the provenance half does not join it. Giving the ladder a column is a candidate follow-on, not done here."
1502
+ source_of_truth: evidence
1335
1503
  - name: source
1336
1504
  type: string
1337
1505
  nullable: false
1338
- description: capability-tree | product-map | capability-spec.
1506
+ description: "capability-tree | product-map | capability-spec | structural-model. As of schema 6.0.0, source: structural-model is emitted for a capability only the structural model holds (M-ADR 0230 §4.3, Proposed)."
1507
+ source_of_truth: derived
1339
1508
  - name: runway_classification
1340
1509
  type: string
1341
1510
  nullable: true
@@ -1352,10 +1521,12 @@ catalogues:
1352
1521
  type: string
1353
1522
  nullable: true
1354
1523
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1524
+ source_of_truth: execution
1355
1525
  - name: platform_sdd_id
1356
1526
  type: string
1357
1527
  nullable: true
1358
1528
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1529
+ source_of_truth: execution
1359
1530
  foreign_keys:
1360
1531
  - column: domain_id
1361
1532
  references: domains.id
@@ -1370,6 +1541,7 @@ catalogues:
1370
1541
  source: enums.capability_source
1371
1542
  feature_groups:
1372
1543
  primary_key: id
1544
+ source_of_truth: structure
1373
1545
  columns:
1374
1546
  - name: id
1375
1547
  type: string
@@ -1395,18 +1567,22 @@ catalogues:
1395
1567
  type: string
1396
1568
  nullable: true
1397
1569
  description: Authored description (when group has explicit metadata) or null when derived from heading only.
1570
+ source_of_truth: intent
1398
1571
  - name: source
1399
1572
  type: string
1400
1573
  nullable: false
1401
1574
  description: feature-tree-h2 | feature-tree-h3 | feature-spec-explicit (when an authored feature spec declares group membership) | capability-spec-explicit.
1575
+ source_of_truth: derived
1402
1576
  - name: source_sdd_id
1403
1577
  type: string
1404
1578
  nullable: true
1405
1579
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1580
+ source_of_truth: execution
1406
1581
  - name: platform_sdd_id
1407
1582
  type: string
1408
1583
  nullable: true
1409
1584
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1585
+ source_of_truth: execution
1410
1586
  description: |
1411
1587
  Hierarchical grouping for features. First-class entity — replaces the previous reverse-only synthetic `feature-tree-group` rows in features.csv. Both forward and reverse can use feature_groups: forward application-product SDDs whose `feature-tree.md` has H2/H3 structure, reverse SDDs whose extracted feature trees are inherently hierarchical, and any SDD that promotes groups to first-class with authored metadata. Groups can nest via `parent_group_id`.
1412
1588
  foreign_keys:
@@ -1421,6 +1597,7 @@ catalogues:
1421
1597
  nullable: true
1422
1598
  features:
1423
1599
  primary_key: id
1600
+ source_of_truth: structure
1424
1601
  columns:
1425
1602
  - name: id
1426
1603
  type: string
@@ -1447,30 +1624,39 @@ catalogues:
1447
1624
  - name: description
1448
1625
  type: string
1449
1626
  nullable: true
1627
+ source_of_truth: intent
1450
1628
  - name: maturity
1451
1629
  type: string
1452
1630
  nullable: true
1453
1631
  description: "Standard: working | provisional | unknown | absent. Ecosystem-specific values may be added with parser awareness."
1632
+ source_of_truth: derived
1454
1633
  - name: status
1455
1634
  type: string
1456
1635
  nullable: false
1457
- description: Default 'active'.
1636
+ description: "Bound to feature_status: active, or retired when the feature spec says **Status:** retired (its behaviour retired by an archived change)."
1458
1637
  - name: source
1459
1638
  type: string
1460
1639
  nullable: false
1461
- 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."
1640
+ description: "feature-tree | feature-set | capability-spec | feature-spec | feature-grounding | structural-model. As of schema 6.0.0, source: structural-model is emitted for a feature only the structural model holds (M-ADR 0230 §4.3, Proposed). 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."
1641
+ source_of_truth: derived
1462
1642
  - name: runway
1463
1643
  type: string
1464
1644
  nullable: true
1465
1645
  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.
1646
+ - name: kind
1647
+ type: string
1648
+ nullable: false
1649
+ description: "Bound to feature_kind: feature (the default), obligation (M-ADR 0226, Proposed) or journey (M-ADR 0229 §4.2, Proposed), from the feature spec's **Kind:** line."
1466
1650
  - name: source_sdd_id
1467
1651
  type: string
1468
1652
  nullable: true
1469
1653
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1654
+ source_of_truth: execution
1470
1655
  - name: platform_sdd_id
1471
1656
  type: string
1472
1657
  nullable: true
1473
1658
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1659
+ source_of_truth: execution
1474
1660
  foreign_keys:
1475
1661
  - column: product_id
1476
1662
  references: products.id
@@ -1485,10 +1671,13 @@ catalogues:
1485
1671
  references: features.id
1486
1672
  nullable: true
1487
1673
  column_enums:
1674
+ status: enums.feature_status
1675
+ kind: enums.feature_kind
1488
1676
  source: enums.feature_source
1489
1677
  maturity: enums.artefact_maturity
1490
1678
  personas:
1491
1679
  primary_key: id
1680
+ source_of_truth: structure
1492
1681
  columns:
1493
1682
  - name: id
1494
1683
  type: string
@@ -1506,20 +1695,24 @@ catalogues:
1506
1695
  - name: description
1507
1696
  type: string
1508
1697
  nullable: true
1698
+ source_of_truth: intent
1509
1699
  - name: source_sdd_id
1510
1700
  type: string
1511
1701
  nullable: true
1512
1702
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1703
+ source_of_truth: execution
1513
1704
  - name: platform_sdd_id
1514
1705
  type: string
1515
1706
  nullable: true
1516
1707
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1708
+ source_of_truth: execution
1517
1709
  foreign_keys:
1518
1710
  - column: product_id
1519
1711
  references: products.id
1520
1712
  nullable: false
1521
1713
  user_journeys:
1522
1714
  primary_key: id
1715
+ source_of_truth: structure
1523
1716
  columns:
1524
1717
  - name: id
1525
1718
  type: string
@@ -1541,23 +1734,28 @@ catalogues:
1541
1734
  - name: trigger
1542
1735
  type: string
1543
1736
  nullable: true
1737
+ source_of_truth: intent
1544
1738
  - name: goal
1545
1739
  type: string
1546
1740
  nullable: true
1741
+ source_of_truth: intent
1547
1742
  - name: source_sdd_id
1548
1743
  type: string
1549
1744
  nullable: true
1550
1745
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1746
+ source_of_truth: execution
1551
1747
  - name: platform_sdd_id
1552
1748
  type: string
1553
1749
  nullable: true
1554
1750
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1751
+ source_of_truth: execution
1555
1752
  foreign_keys:
1556
1753
  - column: product_id
1557
1754
  references: products.id
1558
1755
  nullable: false
1559
1756
  contracts:
1560
1757
  primary_key: id
1758
+ source_of_truth: interface
1561
1759
  columns:
1562
1760
  - name: id
1563
1761
  type: string
@@ -1589,6 +1787,7 @@ catalogues:
1589
1787
  - name: spec_path
1590
1788
  type: string
1591
1789
  nullable: true
1790
+ source_of_truth: derived
1592
1791
  - name: visibility
1593
1792
  type: string
1594
1793
  nullable: true
@@ -1601,6 +1800,7 @@ catalogues:
1601
1800
  type: string
1602
1801
  nullable: true
1603
1802
  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.
1803
+ source_of_truth: evidence
1604
1804
  - name: description
1605
1805
  type: string
1606
1806
  nullable: true
@@ -1608,14 +1808,17 @@ catalogues:
1608
1808
  type: string
1609
1809
  nullable: true
1610
1810
  description: discovered | declared-external. `discovered` (default) means the builder walked the spec file and parsed it, so title/version/context/evidence_class are trustworthy. `declared-external` means the row exists ONLY because a capability traceability manifest declared it with an explicit external marker and the file was never read — so those columns are necessarily EMPTY and their emptiness carries no information. A consumer that cannot tell the two apart will treat a declaration as a validated contract. Added in schema 2.51.0 (D13).
1811
+ source_of_truth: derived
1611
1812
  - name: source_sdd_id
1612
1813
  type: string
1613
1814
  nullable: true
1614
1815
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1816
+ source_of_truth: execution
1615
1817
  - name: platform_sdd_id
1616
1818
  type: string
1617
1819
  nullable: true
1618
1820
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1821
+ source_of_truth: execution
1619
1822
  foreign_keys:
1620
1823
  - column: service_id
1621
1824
  references: services.id
@@ -1630,6 +1833,7 @@ catalogues:
1630
1833
  discovery: enums.contract_discovery
1631
1834
  events:
1632
1835
  primary_key: id
1836
+ source_of_truth: interface
1633
1837
  columns:
1634
1838
  - name: id
1635
1839
  type: string
@@ -1658,14 +1862,17 @@ catalogues:
1658
1862
  type: string
1659
1863
  nullable: true
1660
1864
  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.
1865
+ source_of_truth: evidence
1661
1866
  - name: source_sdd_id
1662
1867
  type: string
1663
1868
  nullable: true
1664
1869
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1870
+ source_of_truth: execution
1665
1871
  - name: platform_sdd_id
1666
1872
  type: string
1667
1873
  nullable: true
1668
1874
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1875
+ source_of_truth: execution
1669
1876
  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."
1670
1877
  foreign_keys:
1671
1878
  - column: publisher_service_id
@@ -1676,6 +1883,7 @@ catalogues:
1676
1883
  nullable: true
1677
1884
  c4_systems:
1678
1885
  primary_key: id
1886
+ source_of_truth: structure
1679
1887
  columns:
1680
1888
  - name: id
1681
1889
  type: string
@@ -1696,6 +1904,7 @@ catalogues:
1696
1904
  type: string
1697
1905
  nullable: true
1698
1906
  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).
1907
+ source_of_truth: derived
1699
1908
  - name: description
1700
1909
  type: string
1701
1910
  nullable: true
@@ -1703,10 +1912,12 @@ catalogues:
1703
1912
  type: string
1704
1913
  nullable: true
1705
1914
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1915
+ source_of_truth: execution
1706
1916
  - name: platform_sdd_id
1707
1917
  type: string
1708
1918
  nullable: true
1709
1919
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1920
+ source_of_truth: execution
1710
1921
  foreign_keys:
1711
1922
  - column: product_id
1712
1923
  references: products.id
@@ -1715,6 +1926,7 @@ catalogues:
1715
1926
  kind: enums.c4_system_kind
1716
1927
  c4_containers:
1717
1928
  primary_key: id
1929
+ source_of_truth: structure
1718
1930
  columns:
1719
1931
  - name: id
1720
1932
  type: string
@@ -1749,10 +1961,12 @@ catalogues:
1749
1961
  type: string
1750
1962
  nullable: true
1751
1963
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1964
+ source_of_truth: execution
1752
1965
  - name: platform_sdd_id
1753
1966
  type: string
1754
1967
  nullable: true
1755
1968
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
1969
+ source_of_truth: execution
1756
1970
  description: |
1757
1971
  C4 L2. Each container belongs to exactly one C4 system. `domain_id` is a denormalised organisational tag, not a C4-structural attribute — multi-domain ecosystems use it for filtering/reporting. `service_id` is the optional "may represent" link to a runtime service when the container is a deployable application.
1758
1972
  foreign_keys:
@@ -1769,6 +1983,7 @@ catalogues:
1769
1983
  type: enums.c4_container_type
1770
1984
  c4_components:
1771
1985
  primary_key: id
1986
+ source_of_truth: structure
1772
1987
  columns:
1773
1988
  - name: id
1774
1989
  type: string
@@ -1795,10 +2010,12 @@ catalogues:
1795
2010
  type: string
1796
2011
  nullable: true
1797
2012
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2013
+ source_of_truth: execution
1798
2014
  - name: platform_sdd_id
1799
2015
  type: string
1800
2016
  nullable: true
1801
2017
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
2018
+ source_of_truth: execution
1802
2019
  description: |
1803
2020
  C4 L3. Each component belongs to exactly one C4 container. `service_id` is denormalised from `c4_containers.service_id` for query convenience — populated when the parent container represents a runtime service.
1804
2021
  foreign_keys:
@@ -1810,6 +2027,7 @@ catalogues:
1810
2027
  nullable: true
1811
2028
  c4_external_systems:
1812
2029
  primary_key: id
2030
+ source_of_truth: structure
1813
2031
  columns:
1814
2032
  - name: id
1815
2033
  type: string
@@ -1835,18 +2053,22 @@ catalogues:
1835
2053
  type: string
1836
2054
  nullable: true
1837
2055
  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."
2056
+ source_of_truth: derived
1838
2057
  - name: source_sdd_id
1839
2058
  type: string
1840
2059
  nullable: true
1841
2060
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2061
+ source_of_truth: execution
1842
2062
  - name: platform_sdd_id
1843
2063
  type: string
1844
2064
  nullable: true
1845
2065
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
2066
+ source_of_truth: execution
1846
2067
  description: |
1847
2068
  C4 external software systems — peer systems at the L1 context level that the ecosystem integrates with but does not own (per M-ADR 0155). Rendered `System_Ext(...)` on L1/L2 diagrams. NOT a c4_container (external systems are not inside your system) and NOT a c4_system (they have no owning Product). External systems are inherently shared references: the same external system may be declared by multiple SDDs, so the aggregator dedups identical rows by PK rather than failing on duplicate (the one narrowly-scoped exception to M-ADR 0134's duplicate-PK rule); conflicting attributes on the same id surface as a `convention` finding.
1848
2069
  repositories:
1849
2070
  primary_key: id
2071
+ source_of_truth: structure
1850
2072
  columns:
1851
2073
  - name: id
1852
2074
  type: string
@@ -1882,33 +2104,42 @@ catalogues:
1882
2104
  - name: files
1883
2105
  type: int
1884
2106
  nullable: true
2107
+ source_of_truth: evidence
1885
2108
  - name: code
1886
2109
  type: int
1887
2110
  nullable: true
2111
+ source_of_truth: evidence
1888
2112
  - name: comment
1889
2113
  type: int
1890
2114
  nullable: true
2115
+ source_of_truth: evidence
1891
2116
  - name: blank
1892
2117
  type: int
1893
2118
  nullable: true
2119
+ source_of_truth: evidence
1894
2120
  - name: total_lines
1895
2121
  type: int
1896
2122
  nullable: true
2123
+ source_of_truth: evidence
1897
2124
  - name: languages
1898
2125
  type: string
1899
2126
  nullable: true
1900
2127
  description: "';'-separated."
2128
+ source_of_truth: evidence
1901
2129
  - name: doc_path
1902
2130
  type: string
1903
2131
  nullable: false
2132
+ source_of_truth: derived
1904
2133
  - name: source_sdd_id
1905
2134
  type: string
1906
2135
  nullable: true
1907
2136
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2137
+ source_of_truth: execution
1908
2138
  - name: platform_sdd_id
1909
2139
  type: string
1910
2140
  nullable: true
1911
2141
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
2142
+ source_of_truth: execution
1912
2143
  - name: repo_scope
1913
2144
  type: string
1914
2145
  nullable: true
@@ -1925,6 +2156,7 @@ catalogues:
1925
2156
  repo_scope: enums.repo_scope
1926
2157
  domain_models:
1927
2158
  primary_key: id
2159
+ source_of_truth: structure
1928
2160
  columns:
1929
2161
  - name: id
1930
2162
  type: string
@@ -1940,6 +2172,7 @@ catalogues:
1940
2172
  type: string
1941
2173
  nullable: false
1942
2174
  description: Path to data-model.mermaid.md.
2175
+ source_of_truth: derived
1943
2176
  - name: version
1944
2177
  type: string
1945
2178
  nullable: true
@@ -1948,18 +2181,22 @@ catalogues:
1948
2181
  type: string
1949
2182
  nullable: true
1950
2183
  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.
2184
+ source_of_truth: evidence
1951
2185
  - name: source_sdd_id
1952
2186
  type: string
1953
2187
  nullable: true
1954
2188
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2189
+ source_of_truth: execution
1955
2190
  - name: platform_sdd_id
1956
2191
  type: string
1957
2192
  nullable: true
1958
2193
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
2194
+ source_of_truth: execution
1959
2195
  - name: notation
1960
2196
  type: string
1961
2197
  nullable: true
1962
2198
  description: "The notation the model artefact is written in — one of enums.model_notation (mermaid-erd | typeql), DERIVED by the builder from the file (data-model.mermaid.md → mermaid-erd; data-model.tql → typeql), never authored. The compliance instrument of M-ADR 0210 §4.6 Decision 2 (as amended): a mermaid-erd row is advisory until the sunset 2027-03-31 and an error after it. Added in 3.11.0."
2199
+ source_of_truth: derived
1963
2200
  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."
1964
2201
  foreign_keys:
1965
2202
  - column: domain_id
@@ -1969,6 +2206,7 @@ catalogues:
1969
2206
  notation: enums.model_notation
1970
2207
  entities:
1971
2208
  primary_key: id
2209
+ source_of_truth: structure
1972
2210
  columns:
1973
2211
  - name: id
1974
2212
  type: string
@@ -2006,14 +2244,17 @@ catalogues:
2006
2244
  type: string
2007
2245
  nullable: true
2008
2246
  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.
2247
+ source_of_truth: evidence
2009
2248
  - name: source_sdd_id
2010
2249
  type: string
2011
2250
  nullable: true
2012
2251
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2252
+ source_of_truth: execution
2013
2253
  - name: platform_sdd_id
2014
2254
  type: string
2015
2255
  nullable: true
2016
2256
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
2257
+ source_of_truth: execution
2017
2258
  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."
2018
2259
  foreign_keys:
2019
2260
  - column: domain_id
@@ -2029,6 +2270,7 @@ catalogues:
2029
2270
  persistence_kind: enums.persistence_kind
2030
2271
  repo_capability:
2031
2272
  primary_key: id
2273
+ source_of_truth: derived
2032
2274
  columns:
2033
2275
  - name: id
2034
2276
  type: string
@@ -2049,6 +2291,7 @@ catalogues:
2049
2291
  nullable: false
2050
2292
  repo_capability_exemption:
2051
2293
  primary_key: id
2294
+ source_of_truth: declaration
2052
2295
  columns:
2053
2296
  - name: id
2054
2297
  type: string
@@ -2075,6 +2318,7 @@ catalogues:
2075
2318
  reason: enums.capability_exemption_reason
2076
2319
  service_capability_exemption:
2077
2320
  primary_key: id
2321
+ source_of_truth: declaration
2078
2322
  columns:
2079
2323
  - name: id
2080
2324
  type: string
@@ -2101,6 +2345,7 @@ catalogues:
2101
2345
  reason: enums.service_capability_exemption_reason
2102
2346
  external_system_exemption:
2103
2347
  primary_key: id
2348
+ source_of_truth: declaration
2104
2349
  columns:
2105
2350
  - name: id
2106
2351
  type: string
@@ -2127,6 +2372,7 @@ catalogues:
2127
2372
  reason: enums.external_system_exemption_reason
2128
2373
  repo_contract:
2129
2374
  primary_key: id
2375
+ source_of_truth: derived
2130
2376
  columns:
2131
2377
  - name: id
2132
2378
  type: string
@@ -2150,6 +2396,7 @@ catalogues:
2150
2396
  - integration-product
2151
2397
  product_capability:
2152
2398
  primary_key: id
2399
+ source_of_truth: structure
2153
2400
  columns:
2154
2401
  - name: id
2155
2402
  type: string
@@ -2168,6 +2415,9 @@ catalogues:
2168
2415
  type: string
2169
2416
  nullable: true
2170
2417
  description: "Edge: product depends on / consumes capability. Forward sources from app-platform-dependencies.yaml. capability_id is external because the consuming product (an application-product SDD) references a capability owned by the platform SDD."
2418
+ natural_key:
2419
+ - product_id
2420
+ - capability_id
2171
2421
  foreign_keys:
2172
2422
  - column: product_id
2173
2423
  references: products.id
@@ -2180,6 +2430,7 @@ catalogues:
2180
2430
  role: enums.consumption_role
2181
2431
  product_service:
2182
2432
  primary_key: id
2433
+ source_of_truth: structure
2183
2434
  columns:
2184
2435
  - name: id
2185
2436
  type: string
@@ -2199,6 +2450,9 @@ catalogues:
2199
2450
  nullable: true
2200
2451
  description: "provisional | stable | unknown. The consuming SDD's expectation of contract stability, carried verbatim from app-platform-dependencies.yaml. Not a bound enum: an out-of-vocabulary value is carried, not rejected, and is reported by validate-app-dependencies.sh."
2201
2452
  description: "Edge: product depends on / consumes service. Forward sources from app-platform-dependencies.yaml. service_id is external because the consuming product (an application-product SDD) references a service owned by the platform SDD."
2453
+ natural_key:
2454
+ - product_id
2455
+ - service_id
2202
2456
  foreign_keys:
2203
2457
  - column: product_id
2204
2458
  references: products.id
@@ -2212,6 +2466,7 @@ catalogues:
2212
2466
  required_stability: enums.required_stability
2213
2467
  service_contract:
2214
2468
  primary_key: id
2469
+ source_of_truth: structure
2215
2470
  columns:
2216
2471
  - name: id
2217
2472
  type: string
@@ -2228,6 +2483,10 @@ catalogues:
2228
2483
  nullable: false
2229
2484
  description: exposes | consumes.
2230
2485
  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 (a single-SDD platform) still optimistically validate locally. Schema 2.8.0."
2486
+ natural_key:
2487
+ - service_id
2488
+ - contract_id
2489
+ - role
2231
2490
  foreign_keys:
2232
2491
  - column: service_id
2233
2492
  references: services.id
@@ -2241,6 +2500,7 @@ catalogues:
2241
2500
  role: enums.contract_participation
2242
2501
  service_event:
2243
2502
  primary_key: id
2503
+ source_of_truth: structure
2244
2504
  columns:
2245
2505
  - name: id
2246
2506
  type: string
@@ -2257,6 +2517,10 @@ catalogues:
2257
2517
  nullable: false
2258
2518
  description: publishes | consumes.
2259
2519
  description: "Edge: service publishes or consumes event."
2520
+ natural_key:
2521
+ - service_id
2522
+ - event_id
2523
+ - role
2260
2524
  foreign_keys:
2261
2525
  - column: service_id
2262
2526
  references: services.id
@@ -2268,6 +2532,7 @@ catalogues:
2268
2532
  role: enums.event_participation
2269
2533
  service_entity:
2270
2534
  primary_key: id
2535
+ source_of_truth: structure
2271
2536
  columns:
2272
2537
  - name: id
2273
2538
  type: string
@@ -2287,15 +2552,22 @@ catalogues:
2287
2552
  type: string
2288
2553
  nullable: true
2289
2554
  description: Source markdown path or feature-grounding row that produced the edge. Audit aid.
2555
+ source_of_truth: derived
2290
2556
  - name: source_sdd_id
2291
2557
  type: string
2292
2558
  nullable: true
2293
2559
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2560
+ source_of_truth: execution
2294
2561
  - name: platform_sdd_id
2295
2562
  type: string
2296
2563
  nullable: true
2297
2564
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
2565
+ source_of_truth: execution
2298
2566
  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`."
2567
+ natural_key:
2568
+ - service_id
2569
+ - entity_id
2570
+ - relation
2299
2571
  foreign_keys:
2300
2572
  - column: service_id
2301
2573
  references: services.id
@@ -2307,6 +2579,7 @@ catalogues:
2307
2579
  relation: enums.service_entity_relation
2308
2580
  capability_feature:
2309
2581
  primary_key: id
2582
+ source_of_truth: structure
2310
2583
  columns:
2311
2584
  - name: id
2312
2585
  type: string
@@ -2318,6 +2591,9 @@ catalogues:
2318
2591
  type: string
2319
2592
  nullable: false
2320
2593
  description: "Edge: capability decomposes into features. Forward: traceability.runway.enables. Reverse: parsed from spec Feature Grounding."
2594
+ natural_key:
2595
+ - capability_id
2596
+ - feature_id
2321
2597
  foreign_keys:
2322
2598
  - column: capability_id
2323
2599
  references: capabilities.id
@@ -2327,6 +2603,7 @@ catalogues:
2327
2603
  nullable: false
2328
2604
  capability_service:
2329
2605
  primary_key: id
2606
+ source_of_truth: structure
2330
2607
  columns:
2331
2608
  - name: id
2332
2609
  type: string
@@ -2357,8 +2634,13 @@ catalogues:
2357
2634
  type: string
2358
2635
  nullable: true
2359
2636
  description: Where the coupling is evidenced — a path or anchor in the SDD, from `evidence:` on the services[] entry. Prose about the coupling stays in dependency_notes; this is the pointer a reviewer follows.
2637
+ source_of_truth: evidence
2360
2638
  description: |
2361
2639
  Edge: capability is realised by services. Sourced from the capability traceability manifest services[] block. service_id is an external FK (schema 2.29.0): a traceability entry marked `owner_sdd:` declares a cross-SDD reference (e.g. the service moved to a sibling SDD at an M-ADR 0170 §4.2 carve) — the per-SDD builder emits the edge, logs it `[finding] external`, and aggregation validates it hard against the owning sibling's rows. An UNMARKED id that does not resolve locally is NOT emitted — it stays a member-tier orphan finding (or convention, when it names a known external system).
2640
+ natural_key:
2641
+ - capability_id
2642
+ - service_id
2643
+ - role
2362
2644
  foreign_keys:
2363
2645
  - column: capability_id
2364
2646
  references: capabilities.id
@@ -2376,6 +2658,7 @@ catalogues:
2376
2658
  interaction_pattern: enums.interaction_pattern
2377
2659
  capability_event:
2378
2660
  primary_key: id
2661
+ source_of_truth: structure
2379
2662
  columns:
2380
2663
  - name: id
2381
2664
  type: string
@@ -2394,6 +2677,7 @@ catalogues:
2394
2677
  type: string
2395
2678
  nullable: false
2396
2679
  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.
2680
+ source_of_truth: derived
2397
2681
  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)."
2398
2682
  foreign_keys:
2399
2683
  - column: capability_id
@@ -2407,6 +2691,7 @@ catalogues:
2407
2691
  source: enums.edge_source
2408
2692
  capability_contract:
2409
2693
  primary_key: id
2694
+ source_of_truth: structure
2410
2695
  columns:
2411
2696
  - name: id
2412
2697
  type: string
@@ -2421,7 +2706,11 @@ catalogues:
2421
2706
  type: string
2422
2707
  nullable: false
2423
2708
  description: "declared — the only emitted value. `derived` is reserved vocabulary: the reverse derivation it anticipated was never built (0 rows across 105 measured units) and the claim was corrected at 3.0.0 (M-ADR 0203 §4.5); the value re-enters if a decision builds a reverse source."
2709
+ source_of_truth: derived
2424
2710
  description: "Edge: capability is bound to a contract. Whether the capability exposes or depends on it is not stated by the source (traceability.contracts), so this description asserts no direction (M-ADR 0211 §1). Forward-declared only. Forward-declared only (traceability.contracts). The reverse derivation this description long claimed (service_contract ⋈ capability_service) was measured nonexistent — 0 `source: derived` rows across 105 units, builder references neither catalogue — and the CLAIM was corrected at 3.0.0 (M-ADR 0203 §4.5, gap class absent-derivation per M-ADR 0196 §4.1). The edge is forward-one-directional until a decision builds a reverse source."
2711
+ natural_key:
2712
+ - capability_id
2713
+ - contract_id
2425
2714
  foreign_keys:
2426
2715
  - column: capability_id
2427
2716
  references: capabilities.id
@@ -2431,6 +2720,7 @@ catalogues:
2431
2720
  nullable: false
2432
2721
  journey_feature:
2433
2722
  primary_key: id
2723
+ source_of_truth: structure
2434
2724
  columns:
2435
2725
  - name: id
2436
2726
  type: string
@@ -2442,6 +2732,9 @@ catalogues:
2442
2732
  type: string
2443
2733
  nullable: false
2444
2734
  description: "Edge: journey touches features. Parsed from Related features bullet."
2735
+ natural_key:
2736
+ - journey_id
2737
+ - feature_id
2445
2738
  foreign_keys:
2446
2739
  - column: journey_id
2447
2740
  references: user_journeys.id
@@ -2451,6 +2744,7 @@ catalogues:
2451
2744
  nullable: false
2452
2745
  persona_feature:
2453
2746
  primary_key: id
2747
+ source_of_truth: structure
2454
2748
  columns:
2455
2749
  - name: id
2456
2750
  type: string
@@ -2462,6 +2756,9 @@ catalogues:
2462
2756
  type: string
2463
2757
  nullable: false
2464
2758
  description: "Edge: persona uses features. Parsed from Related features bullet."
2759
+ natural_key:
2760
+ - persona_id
2761
+ - feature_id
2465
2762
  foreign_keys:
2466
2763
  - column: persona_id
2467
2764
  references: personas.id
@@ -2471,6 +2768,7 @@ catalogues:
2471
2768
  nullable: false
2472
2769
  feature_service:
2473
2770
  primary_key: id
2771
+ source_of_truth: structure
2474
2772
  columns:
2475
2773
  - name: id
2476
2774
  type: string
@@ -2482,6 +2780,9 @@ catalogues:
2482
2780
  type: string
2483
2781
  nullable: false
2484
2782
  description: "Edge: feature is implemented by service. Parsed from Feature Services table in feature-tree.md."
2783
+ natural_key:
2784
+ - feature_id
2785
+ - service_id
2485
2786
  foreign_keys:
2486
2787
  - column: feature_id
2487
2788
  references: features.id
@@ -2491,6 +2792,7 @@ catalogues:
2491
2792
  nullable: false
2492
2793
  feature_event:
2493
2794
  primary_key: id
2795
+ source_of_truth: derived
2494
2796
  columns:
2495
2797
  - name: id
2496
2798
  type: string
@@ -2521,6 +2823,7 @@ catalogues:
2521
2823
  role: enums.event_participation
2522
2824
  feature_repo:
2523
2825
  primary_key: id
2826
+ source_of_truth: derived
2524
2827
  columns:
2525
2828
  - name: id
2526
2829
  type: string
@@ -2541,6 +2844,7 @@ catalogues:
2541
2844
  nullable: false
2542
2845
  feature_contract:
2543
2846
  primary_key: id
2847
+ source_of_truth: derived
2544
2848
  columns:
2545
2849
  - name: id
2546
2850
  type: string
@@ -2569,6 +2873,7 @@ catalogues:
2569
2873
  derivation_path: enums.feature_contract_derivation_path
2570
2874
  feature_subscription_channels:
2571
2875
  primary_key: id
2876
+ source_of_truth: structure
2572
2877
  columns:
2573
2878
  - name: id
2574
2879
  type: string
@@ -2589,6 +2894,7 @@ catalogues:
2589
2894
  type: string
2590
2895
  nullable: true
2591
2896
  description: Evidence-file citation (`<sub-repo>/<path>:<line>`) anchoring the channel declaration. Mirrors the citation pattern used elsewhere in evidence yamls.
2897
+ source_of_truth: evidence
2592
2898
  - name: payload_ref
2593
2899
  type: string
2594
2900
  nullable: true
@@ -2597,10 +2903,12 @@ catalogues:
2597
2903
  type: string
2598
2904
  nullable: true
2599
2905
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2906
+ source_of_truth: execution
2600
2907
  - name: platform_sdd_id
2601
2908
  type: string
2602
2909
  nullable: true
2603
2910
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
2911
+ source_of_truth: execution
2604
2912
  description: "Edge: feature delivers async push via a named channel/topic. Peer of `graphql_operations:` in the per-feature evidence shape — `graphql_operations:` carries the GraphQL operation names declared in the schema (Queries / Mutations / Subscriptions); `feature_subscription_channels` rows carry the channel/topic layer that physically delivers the push events (AppSync WebSocket endpoints, Pekko WS channels, MQTT topics, server-sent-event streams). A single GraphQL Subscription operation may listen on multiple channels; one channel may be consumed by multiple operations — modelling as a separate edge catalogue (not as a feature column) accommodates the many-to-many. Built per-SDD from `reverse-evidence/feature-grounding-evidence.yaml` `subscription_channels:` entries on each feature. Added in schema 2.9.0."
2605
2913
  foreign_keys:
2606
2914
  - column: feature_id
@@ -2610,6 +2918,7 @@ catalogues:
2610
2918
  transport: enums.subscription_channel_transport
2611
2919
  capability_domain_model:
2612
2920
  primary_key: id
2921
+ source_of_truth: structure
2613
2922
  columns:
2614
2923
  - name: id
2615
2924
  type: string
@@ -2625,7 +2934,11 @@ catalogues:
2625
2934
  type: string
2626
2935
  nullable: false
2627
2936
  description: traceability-manifest | inferred.
2937
+ source_of_truth: derived
2628
2938
  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."
2939
+ natural_key:
2940
+ - capability_id
2941
+ - domain_model_id
2629
2942
  foreign_keys:
2630
2943
  - column: capability_id
2631
2944
  references: capabilities.id
@@ -2637,6 +2950,7 @@ catalogues:
2637
2950
  source: enums.capability_domain_model_source
2638
2951
  feature_domain_model:
2639
2952
  primary_key: id
2953
+ source_of_truth: derived
2640
2954
  columns:
2641
2955
  - name: id
2642
2956
  type: string
@@ -2662,6 +2976,7 @@ catalogues:
2662
2976
  nullable: false
2663
2977
  persona_journey:
2664
2978
  primary_key: id
2979
+ source_of_truth: structure
2665
2980
  columns:
2666
2981
  - name: id
2667
2982
  type: string
@@ -2677,6 +2992,10 @@ catalogues:
2677
2992
  nullable: false
2678
2993
  description: primary | handoff | supporting.
2679
2994
  description: "Edge: persona participates in journey. Roles: primary | handoff | supporting."
2995
+ natural_key:
2996
+ - persona_id
2997
+ - journey_id
2998
+ - role
2680
2999
  foreign_keys:
2681
3000
  - column: persona_id
2682
3001
  references: personas.id
@@ -2688,6 +3007,7 @@ catalogues:
2688
3007
  role: enums.journey_participation
2689
3008
  persona_c4system:
2690
3009
  primary_key: id
3010
+ source_of_truth: structure
2691
3011
  columns:
2692
3012
  - name: id
2693
3013
  type: string
@@ -2704,6 +3024,9 @@ catalogues:
2704
3024
  nullable: true
2705
3025
  description: Optional interaction label from the Rel(...) line, e.g. 'Web browser' / 'Mobile app'.
2706
3026
  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."
3027
+ natural_key:
3028
+ - persona_id
3029
+ - c4_system_id
2707
3030
  foreign_keys:
2708
3031
  - column: persona_id
2709
3032
  references: personas.id
@@ -2713,6 +3036,7 @@ catalogues:
2713
3036
  nullable: false
2714
3037
  persona_container:
2715
3038
  primary_key: id
3039
+ source_of_truth: structure
2716
3040
  columns:
2717
3041
  - name: id
2718
3042
  type: string
@@ -2730,6 +3054,9 @@ catalogues:
2730
3054
  description: Optional interaction label from the Rel(...) line. May hold multiple '; '-joined labels.
2731
3055
  description: |
2732
3056
  Edge: a persona uses a C4 container — the L2-granularity companion to persona_c4system (M-ADR 0189, ratified 2026-07-10). Eleven of one estate's L2 diagrams and the bulk of another's 81 unroutable Rels drew Person→Container relationships that had no catalogue and raised no finding. Harvested at member tier from Rel(...) lines whose endpoints resolve to a file-local Person and a local container (either direction; the row is normalised persona→container). A Person that matches no persona row is a coverage finding, never a silent skip. Both authoring directions feed from the same diagram surface (M-ADR 0157 parity). Added in schema 2.34.0.
3057
+ natural_key:
3058
+ - persona_id
3059
+ - container_id
2733
3060
  foreign_keys:
2734
3061
  - column: persona_id
2735
3062
  references: personas.id
@@ -2739,6 +3066,7 @@ catalogues:
2739
3066
  nullable: false
2740
3067
  system_external_dependency:
2741
3068
  primary_key: id
3069
+ source_of_truth: structure
2742
3070
  columns:
2743
3071
  - name: id
2744
3072
  type: string
@@ -2759,6 +3087,9 @@ catalogues:
2759
3087
  nullable: true
2760
3088
  description: The Rel's non-external endpoint resolved to a local container at member tier, when it is one (2.33.0) — the datum that lets adjudication rewrite this edge onto container_dependency instead of destroying it. Empty when the endpoint is the system itself or unresolvable.
2761
3089
  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."
3090
+ natural_key:
3091
+ - c4_system_id
3092
+ - external_system_id
2762
3093
  foreign_keys:
2763
3094
  - column: c4_system_id
2764
3095
  references: c4_systems.id
@@ -2771,6 +3102,7 @@ catalogues:
2771
3102
  nullable: true
2772
3103
  container_dependency:
2773
3104
  primary_key: id
3105
+ source_of_truth: structure
2774
3106
  columns:
2775
3107
  - name: id
2776
3108
  type: string
@@ -2790,12 +3122,17 @@ catalogues:
2790
3122
  type: string
2791
3123
  nullable: true
2792
3124
  description: SDD whose diagram declared the originating reference. Member-emitted rows set it directly; adjudication-derived rows are stamped by the aggregator.
3125
+ source_of_truth: execution
2793
3126
  - name: platform_sdd_id
2794
3127
  type: string
2795
3128
  nullable: true
2796
3129
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3130
+ source_of_truth: execution
2797
3131
  description: |
2798
3132
  Edge: a C4 container depends on another INTERNAL container (the system-tier gap exactly one tier down: "no edge for internal" at L2). Derived by the aggregator at adjudication: an external-system candidate that resolves to an internal container was never external — each of its dependency edges whose member-resolved `from_container_id` is known is rewritten here, and a candidate with no remaining edges is dropped (it was a phantom duplicate of the container). A candidate with unconvertible edges is kept with the tier-contradiction finding, so no edge is ever destroyed to make a build quieter — the measured cost that stopped an adopter remediating 22 contradictions was eight real edges. ALSO emitted at member tier (2.33.1): the C4-correct authoring — Rel(container_a, container_b) between two Container(...) nodes — emits its edge directly; adjudication merges into a catalogue that already has content rather than being its only source, so the metamodel no longer rewards mis-declaration over correct authoring. Added in schema 2.33.0.
3133
+ natural_key:
3134
+ - from_container_id
3135
+ - to_container_id
2799
3136
  foreign_keys:
2800
3137
  - column: from_container_id
2801
3138
  references: c4_containers.id
@@ -2805,6 +3142,7 @@ catalogues:
2805
3142
  nullable: false
2806
3143
  system_system_dependency:
2807
3144
  primary_key: id
3145
+ source_of_truth: derived
2808
3146
  columns:
2809
3147
  - name: id
2810
3148
  type: string
@@ -2824,10 +3162,12 @@ catalogues:
2824
3162
  type: string
2825
3163
  nullable: true
2826
3164
  description: SDD whose diagram declared the originating reference. Populated by the aggregator.
3165
+ source_of_truth: execution
2827
3166
  - name: platform_sdd_id
2828
3167
  type: string
2829
3168
  nullable: true
2830
3169
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3170
+ source_of_truth: execution
2831
3171
  description: |
2832
3172
  Edge: a C4 system depends on another INTERNAL system (M-ADR 0189 §4.3). Derived by the aggregator at adjudication (§4.4): an external-system candidate whose declared identity resolves to an internal system was never external — its Rel(...) dependency edges are rewritten onto this catalogue and the candidate row is dropped. Not emitted at member tier (a member cannot see sibling systems); headers-only there, like cross_sdd_platform_capability. Both authoring directions feed it from the same diagram surface (M-ADR 0157 parity). Added in schema 2.30.0.
2833
3173
  foreign_keys:
@@ -2839,6 +3179,7 @@ catalogues:
2839
3179
  nullable: false
2840
3180
  c4_container_entity:
2841
3181
  primary_key: id
3182
+ source_of_truth: derived
2842
3183
  columns:
2843
3184
  - name: id
2844
3185
  type: string
@@ -2857,10 +3198,12 @@ catalogues:
2857
3198
  - name: source_sdd_id
2858
3199
  type: string
2859
3200
  nullable: true
3201
+ source_of_truth: execution
2860
3202
  - name: platform_sdd_id
2861
3203
  type: string
2862
3204
  nullable: true
2863
3205
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3206
+ source_of_truth: execution
2864
3207
  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)."
2865
3208
  foreign_keys:
2866
3209
  - column: container_id
@@ -2871,6 +3214,7 @@ catalogues:
2871
3214
  nullable: false
2872
3215
  c4_system_entity:
2873
3216
  primary_key: id
3217
+ source_of_truth: derived
2874
3218
  columns:
2875
3219
  - name: id
2876
3220
  type: string
@@ -2889,10 +3233,12 @@ catalogues:
2889
3233
  - name: source_sdd_id
2890
3234
  type: string
2891
3235
  nullable: true
3236
+ source_of_truth: execution
2892
3237
  - name: platform_sdd_id
2893
3238
  type: string
2894
3239
  nullable: true
2895
3240
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3241
+ source_of_truth: execution
2896
3242
  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)."
2897
3243
  foreign_keys:
2898
3244
  - column: system_id
@@ -2903,6 +3249,7 @@ catalogues:
2903
3249
  nullable: false
2904
3250
  capability_adr:
2905
3251
  primary_key: id
3252
+ source_of_truth: structure
2906
3253
  columns:
2907
3254
  - name: id
2908
3255
  type: string
@@ -2917,7 +3264,11 @@ catalogues:
2917
3264
  type: string
2918
3265
  nullable: false
2919
3266
  description: spec | high | medium.
3267
+ source_of_truth: derived
2920
3268
  description: "Edge: ADR informs capability. Forward: declared in capability spec Architecture Decisions. Reverse: same plus heuristic match supplements with confidence."
3269
+ natural_key:
3270
+ - capability_id
3271
+ - adr_id
2921
3272
  foreign_keys:
2922
3273
  - column: capability_id
2923
3274
  references: capabilities.id
@@ -2929,6 +3280,7 @@ catalogues:
2929
3280
  confidence: enums.capability_adr_confidence
2930
3281
  adr_supersedes:
2931
3282
  primary_key: id
3283
+ source_of_truth: decision
2932
3284
  columns:
2933
3285
  - name: id
2934
3286
  type: string
@@ -2949,6 +3301,7 @@ catalogues:
2949
3301
  nullable: false
2950
3302
  product_platform_dependencies:
2951
3303
  primary_key: id
3304
+ source_of_truth: structure
2952
3305
  columns:
2953
3306
  - name: id
2954
3307
  type: string
@@ -2994,14 +3347,17 @@ catalogues:
2994
3347
  type: string
2995
3348
  nullable: true
2996
3349
  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).
3350
+ source_of_truth: derived
2997
3351
  - name: source_sdd_id
2998
3352
  type: string
2999
3353
  nullable: true
3000
3354
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3355
+ source_of_truth: execution
3001
3356
  - name: platform_sdd_id
3002
3357
  type: string
3003
3358
  nullable: true
3004
3359
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3360
+ source_of_truth: execution
3005
3361
  description: |
3006
3362
  Per-SDD edge: an application-side or integration-side SDD declares that its product depends on a platform-side capability + service pair. Built from `reverse-evidence/feature-grounding-evidence.yaml` `platform_dependencies:` block (product-level — the cohort source shape carries product-scoped dependency rows with a `consumed_by:` list naming which services within the consuming product depend on the target). Each row records one (consuming product, target capability, target service) triple. The aggregator then joins these rows against platform-side `capability_service` to emit `cross_sdd_platform_capability` edges at aggregation time. Cross- SDD references (target_capability_id, target_service_id) are external — they're not expected to resolve in the per-SDD build, only at aggregation. Added in schema 2.9.0.
3007
3363
  foreign_keys:
@@ -3022,6 +3378,7 @@ catalogues:
3022
3378
  contract_type: enums.dependency_contract_type
3023
3379
  cross_sdd_platform_capability:
3024
3380
  primary_key: id
3381
+ source_of_truth: derived
3025
3382
  columns:
3026
3383
  - name: id
3027
3384
  type: string
@@ -3039,6 +3396,7 @@ catalogues:
3039
3396
  type: string
3040
3397
  nullable: false
3041
3398
  description: SDD slug of the platform side that owns the resolved capability.
3399
+ source_of_truth: execution
3042
3400
  - name: platform_capability_id
3043
3401
  type: string
3044
3402
  nullable: false
@@ -3064,6 +3422,7 @@ catalogues:
3064
3422
  external: true
3065
3423
  application_data_plane_bindings:
3066
3424
  primary_key: id
3425
+ source_of_truth: declaration
3067
3426
  columns:
3068
3427
  - name: id
3069
3428
  type: string
@@ -3081,6 +3440,7 @@ catalogues:
3081
3440
  type: string
3082
3441
  nullable: false
3083
3442
  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."
3443
+ source_of_truth: derived
3084
3444
  - name: locality
3085
3445
  type: string
3086
3446
  nullable: true
@@ -3105,10 +3465,12 @@ catalogues:
3105
3465
  type: string
3106
3466
  nullable: true
3107
3467
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3468
+ source_of_truth: execution
3108
3469
  - name: platform_sdd_id
3109
3470
  type: string
3110
3471
  nullable: true
3111
3472
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3473
+ source_of_truth: execution
3112
3474
  description: |
3113
3475
  Application-product edge (M-ADR 0193): one row per declared data-plane binding — a typed way the service sources, holds, produces or exposes data. The data-plane is a COMPOSITION of these bindings, a second axis orthogonal to `application_archetype` (0191). Built per-SDD from the manifest's `data_plane.bindings` block (application-product only; other profiles emit headers-only). The `pattern` vocabulary splits by DIRECTION (§4.7): an INBOUND data-sourcing sub-set (retrieve | own-store | stream-ingest | project) and an OUTPUT-side sub-set (generate | publish), materialised as the derived `direction` column. An INBOUND binding whose `target` is a platform capability/service reconciles with `product_platform_dependencies` — a `retrieve@internal` binding is a synchronous platform dependency and a `stream-ingest@internal` binding is the M-ADR 0192 `contract_type: event` async dependency; the genuinely new inbound rows are `own-store` (a self-binding) and any `external-vendor` binding. OUTPUT-side rows do NOT participate in that reconciliation (§4.7 rule 1): `publish` is a contract the service PROVIDES, not one it consumes, so it has no inbound counterpart to cross-check — consumers must filter on `direction` before reconciling, which is what the column is for. The archetype-default-vs-declared WARN keys on the bare `pattern` token and so spans both directions (§4.7 rule 2). Added in schema 2.37.0; `direction` added in 2.40.0.
3114
3476
  foreign_keys:
@@ -3121,6 +3483,7 @@ catalogues:
3121
3483
  locality: enums.data_plane_locality
3122
3484
  application_data_plane_deviations:
3123
3485
  primary_key: id
3486
+ source_of_truth: declaration
3124
3487
  columns:
3125
3488
  - name: id
3126
3489
  type: string
@@ -3142,10 +3505,12 @@ catalogues:
3142
3505
  type: string
3143
3506
  nullable: true
3144
3507
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3508
+ source_of_truth: execution
3145
3509
  - name: platform_sdd_id
3146
3510
  type: string
3147
3511
  nullable: true
3148
3512
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3513
+ source_of_truth: execution
3149
3514
  description: |
3150
3515
  Application-product annotation (M-ADR 0191 §4.3 overlay): one row per declared departure from the archetype's default data-plane composition. Built per-SDD from the manifest's `data_plane.deviations` block so the overlay WARN — which runs at AGGREGATION tier, where the reference- architecture bundle (and its `expected_bindings`) resolves — can suppress a mismatch it is told is sanctioned variance. The `expectation` value is the **bare pattern token** (`retrieve` | `own-store` | `stream-ingest` | `project` | `generate` | `publish`) that the product knowingly diverges from; it must match the pattern the WARN keys on. The token set spans both directions — the WARN keys on the bare pattern, so an output-side expectation is deviated exactly like an inbound one (M-ADR 0193 §4.7 rule 2). Added in schema 2.38.0; output-side tokens documented in 2.40.0.
3151
3516
  foreign_keys:
@@ -3156,6 +3521,7 @@ catalogues:
3156
3521
  expectation: enums.data_plane_pattern
3157
3522
  application_conformance_coverage:
3158
3523
  primary_key: id
3524
+ source_of_truth: declaration
3159
3525
  columns:
3160
3526
  - name: id
3161
3527
  type: string
@@ -3173,6 +3539,7 @@ catalogues:
3173
3539
  type: string
3174
3540
  nullable: false
3175
3541
  description: covered (the product's suite exercises it) | deviated (deliberately not covered, with a rationale).
3542
+ source_of_truth: derived
3176
3543
  - name: rationale
3177
3544
  type: string
3178
3545
  nullable: true
@@ -3181,10 +3548,12 @@ catalogues:
3181
3548
  type: string
3182
3549
  nullable: true
3183
3550
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3551
+ source_of_truth: execution
3184
3552
  - name: platform_sdd_id
3185
3553
  type: string
3186
3554
  nullable: true
3187
3555
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3556
+ source_of_truth: execution
3188
3557
  description: |
3189
3558
  Application-product annotation (M-ADR 0191 §4.3 overlay, second element): one row per conformance tag the product asserts about its archetype's conformance expectations. Built per-SDD from the manifest's `conformance` block so the AGGREGATION-tier conformance GATE can read it. `status=covered` means the product's own conformance suite exercises the tag; `status=deviated` means the product declares (with a rationale) that it deliberately does not. At aggregation, an archetype-expected conformance tag that is neither covered nor deviated raises a deviation-visible WARN. The method gates the DECLARATION — it does not run the adopter's conformance suite. Added in schema 2.39.0.
3190
3559
  foreign_keys:
@@ -3193,6 +3562,7 @@ catalogues:
3193
3562
  nullable: false
3194
3563
  screens:
3195
3564
  primary_key: id
3565
+ source_of_truth: declaration
3196
3566
  columns:
3197
3567
  - name: id
3198
3568
  type: string
@@ -3218,6 +3588,7 @@ catalogues:
3218
3588
  type: string
3219
3589
  nullable: false
3220
3590
  description: screen-spec (forward) | screen-extraction (reverse).
3591
+ source_of_truth: derived
3221
3592
  - name: domain
3222
3593
  type: string
3223
3594
  nullable: true
@@ -3234,14 +3605,17 @@ catalogues:
3234
3605
  type: string
3235
3606
  nullable: true
3236
3607
  description: "Evidence class of the screen's claims, from frontmatter `evidence_class:` (alias `evidence-class:`). Free-form; conventional values code-reverse | vendor-doc | operational (M-ADR 0175). Empty when undeclared. Completes the evidence-class dimension for the packaged-SaaS case: a packaged-SaaS SDD catalogues the vendor's STANDARD screens (documentation-reversed from vendor publications, `vendor-doc`) alongside the organisation's CUSTOMISED screens (code-reversed, `code-reverse`) per M-ADR 0175 §3.1 — without this column the two are indistinguishable, and doc-derived UI claims masquerade as code-verified. Orthogonal to `source` (`screen-spec` | `screen-extraction`), which records the authoring DIRECTION, not the evidence's strength: a `screen-extraction` screen can be either class, since a vendor's documented UI is extracted-but-not-code-verified. Added in schema 2.42.0."
3608
+ source_of_truth: evidence
3237
3609
  - name: source_sdd_id
3238
3610
  type: string
3239
3611
  nullable: true
3240
3612
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3613
+ source_of_truth: execution
3241
3614
  - name: platform_sdd_id
3242
3615
  type: string
3243
3616
  nullable: true
3244
3617
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3618
+ source_of_truth: execution
3245
3619
  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."
3246
3620
  foreign_keys:
3247
3621
  - column: product_id
@@ -3251,6 +3625,7 @@ catalogues:
3251
3625
  status: enums.artefact_maturity
3252
3626
  ui_components:
3253
3627
  primary_key: id
3628
+ source_of_truth: derived
3254
3629
  columns:
3255
3630
  - name: id
3256
3631
  type: string
@@ -3276,10 +3651,12 @@ catalogues:
3276
3651
  type: string
3277
3652
  nullable: true
3278
3653
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3654
+ source_of_truth: execution
3279
3655
  - name: platform_sdd_id
3280
3656
  type: string
3281
3657
  nullable: true
3282
3658
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3659
+ source_of_truth: execution
3283
3660
  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."
3284
3661
  foreign_keys:
3285
3662
  - column: product_id
@@ -3289,6 +3666,7 @@ catalogues:
3289
3666
  kind: enums.ui_component_kind
3290
3667
  screen_component:
3291
3668
  primary_key: id
3669
+ source_of_truth: derived
3292
3670
  columns:
3293
3671
  - name: id
3294
3672
  type: string
@@ -3304,10 +3682,12 @@ catalogues:
3304
3682
  type: string
3305
3683
  nullable: true
3306
3684
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3685
+ source_of_truth: execution
3307
3686
  - name: platform_sdd_id
3308
3687
  type: string
3309
3688
  nullable: true
3310
3689
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3690
+ source_of_truth: execution
3311
3691
  description: "Edge: screen composes a UI component. Parsed from the screen-spec ```openui-lang block's component references (per M-ADR 0166)."
3312
3692
  foreign_keys:
3313
3693
  - column: screen_id
@@ -3318,6 +3698,7 @@ catalogues:
3318
3698
  nullable: false
3319
3699
  screen_feature:
3320
3700
  primary_key: id
3701
+ source_of_truth: declaration
3321
3702
  columns:
3322
3703
  - name: id
3323
3704
  type: string
@@ -3333,10 +3714,12 @@ catalogues:
3333
3714
  type: string
3334
3715
  nullable: true
3335
3716
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3717
+ source_of_truth: execution
3336
3718
  - name: platform_sdd_id
3337
3719
  type: string
3338
3720
  nullable: true
3339
3721
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3722
+ source_of_truth: execution
3340
3723
  description: "Edge: screen realises a feature (traceability). Forward: `realises:` frontmatter on the screen-spec. Reverse: route → feature mapping. Per M-ADR 0166."
3341
3724
  foreign_keys:
3342
3725
  - column: screen_id
@@ -3350,6 +3733,7 @@ catalogues:
3350
3733
  - integration-product
3351
3734
  persona_screen:
3352
3735
  primary_key: id
3736
+ source_of_truth: declaration
3353
3737
  columns:
3354
3738
  - name: id
3355
3739
  type: string
@@ -3365,10 +3749,12 @@ catalogues:
3365
3749
  type: string
3366
3750
  nullable: true
3367
3751
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3752
+ source_of_truth: execution
3368
3753
  - name: platform_sdd_id
3369
3754
  type: string
3370
3755
  nullable: true
3371
3756
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3757
+ source_of_truth: execution
3372
3758
  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."
3373
3759
  foreign_keys:
3374
3760
  - column: persona_id
@@ -3379,6 +3765,7 @@ catalogues:
3379
3765
  nullable: false
3380
3766
  screen_action:
3381
3767
  primary_key: id
3768
+ source_of_truth: derived
3382
3769
  columns:
3383
3770
  - name: id
3384
3771
  type: string
@@ -3399,10 +3786,12 @@ catalogues:
3399
3786
  type: string
3400
3787
  nullable: true
3401
3788
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3789
+ source_of_truth: execution
3402
3790
  - name: platform_sdd_id
3403
3791
  type: string
3404
3792
  nullable: true
3405
3793
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3794
+ source_of_truth: execution
3406
3795
  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."
3407
3796
  foreign_keys:
3408
3797
  - column: screen_id
@@ -3414,6 +3803,7 @@ catalogues:
3414
3803
  external: true
3415
3804
  conformance_finding:
3416
3805
  primary_key: id
3806
+ source_of_truth: evidence
3417
3807
  columns:
3418
3808
  - name: id
3419
3809
  type: string
@@ -3473,10 +3863,12 @@ catalogues:
3473
3863
  type: string
3474
3864
  nullable: true
3475
3865
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3866
+ source_of_truth: execution
3476
3867
  - name: platform_sdd_id
3477
3868
  type: string
3478
3869
  nullable: true
3479
3870
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3871
+ source_of_truth: execution
3480
3872
  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."
3481
3873
  column_enums:
3482
3874
  target: enums.conformance_target
@@ -3484,6 +3876,7 @@ catalogues:
3484
3876
  lifecycle: enums.implementation_lifecycle
3485
3877
  quality_scores:
3486
3878
  primary_key: id
3879
+ source_of_truth: evidence
3487
3880
  columns:
3488
3881
  - name: id
3489
3882
  type: string
@@ -3537,6 +3930,10 @@ catalogues:
3537
3930
  type: string
3538
3931
  nullable: true
3539
3932
  description: "The commit the assessment read — the precise staleness anchor. NEW AUTHORING introduced by this change-set: no score written before it carries one, so this column is empty across both estates at introduction and fills forward as registries are rewritten. The reverse family already has the idea under a different name (`snapshot.source_revision`)."
3933
+ - name: input_paths
3934
+ type: string
3935
+ nullable: true
3936
+ description: "';'-separated paths of the review's other assessed inputs (its `inputs:` list, M-ADR 0230 §4.9, Proposed), beside target_path: a feature's UX evidence, say. Each is read at corpus_ref, so a later edit to any of them makes the score stale, as an edit to the target does. Added in schema 6.0.0."
3540
3937
  - name: staleness_basis
3541
3938
  type: string
3542
3939
  nullable: false
@@ -3589,10 +3986,12 @@ catalogues:
3589
3986
  type: string
3590
3987
  nullable: true
3591
3988
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134; left empty by per-SDD builders.
3989
+ source_of_truth: execution
3592
3990
  - name: platform_sdd_id
3593
3991
  type: string
3594
3992
  nullable: true
3595
3993
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
3994
+ source_of_truth: execution
3596
3995
  description: |
3597
3996
  Rubric assessment of a target artefact, one row per (target, rubric), per M-ADR 0205 §4.5. Source: `orchestration/gate-registry/<rubric>-scores.yaml` — the authored surface stays YAML because a score is a judgment, authored where it asserts intent; these rows are DERIVED and never edited.
3598
3997
  Models the EFFECTIVE score only — `current`, as chosen by the registry's `selection_policy`. The authored `reviews[]` history is deliberately not catalogued: variable-length history in a fixed-grain catalogue would give two answers to "what is the score". `review_run_id` and `selection_method` make each row name which review it is.
@@ -3605,6 +4004,7 @@ catalogues:
3605
4004
  nullable: true
3606
4005
  quality_score_dimensions:
3607
4006
  primary_key: id
4007
+ source_of_truth: evidence
3608
4008
  columns:
3609
4009
  - name: id
3610
4010
  type: string
@@ -3642,10 +4042,12 @@ catalogues:
3642
4042
  type: string
3643
4043
  nullable: true
3644
4044
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4045
+ source_of_truth: execution
3645
4046
  - name: platform_sdd_id
3646
4047
  type: string
3647
4048
  nullable: true
3648
4049
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
4050
+ source_of_truth: execution
3649
4051
  description: |
3650
4052
  One row per (target, rubric, dimension) — the per-dimension detail behind a `quality_scores` row, per M-ADR 0205 §4.5.
3651
4053
  A child catalogue rather than columns, and this is forced rather than stylistic: the fifteen rubrics carry FIFTEEN DISJOINT dimension vocabularies (`A1`-`A8`, `C1`-`C8`, `G1`-`G7`, `T1`-`T7`, `D1`-`D6`, `S1`-`S6`, `I1`-`I6`, plus five fully-named sets such as `definition_precision` and `intent_fidelity`) — 45 distinct keys measured in one estate alone. No fixed column set can hold them; serialised JSON in a cell would be unjoinable and break the relational metamodel; generic `d1..d8` columns would be lossy and re-create the positional-index failure class. A child table is what this metamodel already does for every one-to-many, and it joins natively on the M-ADR 0205 §4.1 engine.
@@ -3655,6 +4057,7 @@ catalogues:
3655
4057
  nullable: false
3656
4058
  scaffolds:
3657
4059
  primary_key: id
4060
+ source_of_truth: declaration
3658
4061
  columns:
3659
4062
  - name: id
3660
4063
  type: string
@@ -3672,6 +4075,7 @@ catalogues:
3672
4075
  type: string
3673
4076
  nullable: false
3674
4077
  description: Repo-relative path of the manifest this row derives from, e.g. orchestration/scaffolds/payments-settlement.yaml.
4078
+ source_of_truth: derived
3675
4079
  - name: corpus_ref
3676
4080
  type: string
3677
4081
  nullable: false
@@ -3688,10 +4092,12 @@ catalogues:
3688
4092
  type: string
3689
4093
  nullable: true
3690
4094
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134; left empty by per-SDD builders.
4095
+ source_of_truth: execution
3691
4096
  - name: platform_sdd_id
3692
4097
  type: string
3693
4098
  nullable: true
3694
4099
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
4100
+ source_of_truth: execution
3695
4101
  description: |
3696
4102
  Forward scaffold declaration, one row per unit of work, per M-ADR 0207 §4.1. Source: `orchestration/scaffolds/*.yaml` — the authored surface stays YAML because a scaffold is a declaration of intent, authored where the work is scoped; these rows are DERIVED and never edited (M-ADR 0205 §4.0 governs unchanged).
3697
4103
  The scaffold states the catalogue shape a unit of work will comprise — its items are `scaffold_items` rows — and the declared-vs-derived delta against the built catalogues is the unit's definition of done: delta zero (structural) AND every realised artefact score-current (content, via `quality_scores`), per M-ADR 0207 §4.5. The unit is the change-set's declared delta; estate-level scaffold totality is an explicit non-goal (M-ADR 0207 §4.4), so an estate region no scaffold covers produces no finding.
@@ -3704,6 +4110,7 @@ catalogues:
3704
4110
  status: enums.scaffold_status
3705
4111
  scaffold_items:
3706
4112
  primary_key: id
4113
+ source_of_truth: declaration
3707
4114
  columns:
3708
4115
  - name: id
3709
4116
  type: string
@@ -3737,14 +4144,17 @@ catalogues:
3737
4144
  type: string
3738
4145
  nullable: false
3739
4146
  description: Resolution verdict — see the scaffold_item_state enum. Derived, never authored; recomputed on every build, so realisation flips rows exactly when the target lands.
4147
+ source_of_truth: derived
3740
4148
  - name: source_sdd_id
3741
4149
  type: string
3742
4150
  nullable: true
3743
4151
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4152
+ source_of_truth: execution
3744
4153
  - name: platform_sdd_id
3745
4154
  type: string
3746
4155
  nullable: true
3747
4156
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4 (preserve-if-set, fill rule by pull path); left empty by per-SDD builders. Added in 3.7.0.
4157
+ source_of_truth: execution
3748
4158
  description: |
3749
4159
  One declared item of a scaffold — an entity, edge, or contract the unit of work promises — per M-ADR 0207 §4.1. Derived from the manifest's item list; `state` is the builder's resolution verdict against the same build's catalogue rows.
3750
4160
  THE POLYMORPHIC TARGET DECLARES NO FOREIGN KEY, by design (the quality_scores.target_ref precedent, taken further): a scaffold exists to reference targets BEFORE they exist. FK truth here is CONDITIONAL ON STATE — a `declared` item's (target_kind, target_ref) MUST NOT resolve in the built catalogues, a `realised` item's MUST — and the builder's resolution pass is what enforces it: it computes `state` FROM resolution, so a disagreement between state and resolution cannot be emitted by a conforming builder. The M-ADR 0207 §4.8 delta instrument re-derives the same verdict on the engine as its self-check.
@@ -3758,6 +4168,7 @@ catalogues:
3758
4168
  state: enums.scaffold_item_state
3759
4169
  implementations:
3760
4170
  primary_key: id
4171
+ source_of_truth: declaration
3761
4172
  columns:
3762
4173
  - name: id
3763
4174
  type: string
@@ -3779,17 +4190,21 @@ catalogues:
3779
4190
  type: string
3780
4191
  nullable: false
3781
4192
  description: Path of the binding file, relative to the SDD root.
4193
+ source_of_truth: derived
3782
4194
  - name: source_sdd_id
3783
4195
  type: string
3784
4196
  nullable: true
3785
4197
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4198
+ source_of_truth: execution
3786
4199
  - name: platform_sdd_id
3787
4200
  type: string
3788
4201
  nullable: true
3789
4202
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4.
4203
+ source_of_truth: execution
3790
4204
  description: "An implementation of this SDD's spec: the durable system identity whose snapshots are its versions (M-ADR 0181 §2.5, M-ADR 0214 §4.1). One row per .sdd/implementation-binding.yaml that names its implementation; a binding without an implementation key emits nothing and a finding, because there is no identity to key on."
3791
4205
  implementation_members:
3792
4206
  primary_key: id
4207
+ source_of_truth: declaration
3793
4208
  columns:
3794
4209
  - name: id
3795
4210
  type: string
@@ -3820,10 +4235,12 @@ catalogues:
3820
4235
  type: string
3821
4236
  nullable: true
3822
4237
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4238
+ source_of_truth: execution
3823
4239
  - name: platform_sdd_id
3824
4240
  type: string
3825
4241
  nullable: true
3826
4242
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4.
4243
+ source_of_truth: execution
3827
4244
  description: "Edge: a repository is a member of an implementation, with the member's role, lifecycle and evidence direction (M-ADR 0181 §2.1, M-ADR 0214 §4.2). Role and lifecycle live here once: repo_capability, repo_contract and feature_repo resolve their repository to this row rather than copying them (M-ADR 0214 §4.3). Membership is independent of the repository's repo_scope (M-ADR 0213): a shared library under conformance checks is a support member."
3828
4245
  foreign_keys:
3829
4246
  - column: implementation_id
@@ -3838,6 +4255,7 @@ catalogues:
3838
4255
  evidence_direction: enums.evidence_direction
3839
4256
  snapshots:
3840
4257
  primary_key: id
4258
+ source_of_truth: evidence
3841
4259
  columns:
3842
4260
  - name: id
3843
4261
  type: string
@@ -3862,10 +4280,12 @@ catalogues:
3862
4280
  type: string
3863
4281
  nullable: true
3864
4282
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4283
+ source_of_truth: execution
3865
4284
  - name: platform_sdd_id
3866
4285
  type: string
3867
4286
  nullable: true
3868
4287
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4.
4288
+ source_of_truth: execution
3869
4289
  description: One implementation's member set pinned at one observation (M-ADR 0181 §2.5, M-ADR 0214 §4.4). One row per dated baseline in the implementation's snapshot area whose snapshot.yaml names the same implementation. Needs the snapshot store root (build --snapshot-store or SDD_SNAPSHOT_STORE); without it the catalogue is empty and the build says so.
3870
4290
  foreign_keys:
3871
4291
  - column: implementation_id
@@ -3876,6 +4296,7 @@ catalogues:
3876
4296
  nullable: true
3877
4297
  snapshot_members:
3878
4298
  primary_key: id
4299
+ source_of_truth: evidence
3879
4300
  columns:
3880
4301
  - name: id
3881
4302
  type: string
@@ -3907,10 +4328,12 @@ catalogues:
3907
4328
  type: string
3908
4329
  nullable: true
3909
4330
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4331
+ source_of_truth: execution
3910
4332
  - name: platform_sdd_id
3911
4333
  type: string
3912
4334
  nullable: true
3913
4335
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator per M-ADR 0208 §4.4.
4336
+ source_of_truth: execution
3914
4337
  description: "Edge: a repository at one revision in one snapshot, with its presence — observed in this baseline, carried from an earlier one, or removed since the prior (M-ADR 0214 §4.4)."
3915
4338
  foreign_keys:
3916
4339
  - column: snapshot_id
@@ -3923,6 +4346,7 @@ catalogues:
3923
4346
  presence: enums.member_presence
3924
4347
  data_items:
3925
4348
  primary_key: id
4349
+ source_of_truth: structure
3926
4350
  columns:
3927
4351
  - name: id
3928
4352
  type: string
@@ -3946,13 +4370,16 @@ catalogues:
3946
4370
  type: string
3947
4371
  nullable: true
3948
4372
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4373
+ source_of_truth: execution
3949
4374
  - name: platform_sdd_id
3950
4375
  type: string
3951
4376
  nullable: true
3952
4377
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator (M-ADR 0208 §4.4).
4378
+ source_of_truth: execution
3953
4379
  description: "A unit of data an integration may supply and a feature may need, at the canonical boundary (M-ADR 0216 §4.1). Platform-owned, like events. Not a wire signal: payload grammar stays adopter territory."
3954
4380
  integration_data_item:
3955
4381
  primary_key: id
4382
+ source_of_truth: evidence
3956
4383
  columns:
3957
4384
  - name: id
3958
4385
  type: string
@@ -3984,10 +4411,12 @@ catalogues:
3984
4411
  type: string
3985
4412
  nullable: true
3986
4413
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4414
+ source_of_truth: execution
3987
4415
  - name: platform_sdd_id
3988
4416
  type: string
3989
4417
  nullable: true
3990
4418
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator (M-ADR 0208 §4.4).
4419
+ source_of_truth: execution
3991
4420
  description: "Supply: what one integration states about one data item, from its feature-grounding (M-ADR 0216 §4.2). Several rows per item are normal (one per evidence_ref); coverage reads the best. No row reads unknown, and unknown is never written."
3992
4421
  foreign_keys:
3993
4422
  - column: integration_id
@@ -4004,6 +4433,7 @@ catalogues:
4004
4433
  basis: enums.supply_basis
4005
4434
  feature_data_requirement:
4006
4435
  primary_key: id
4436
+ source_of_truth: structure
4007
4437
  columns:
4008
4438
  - name: id
4009
4439
  type: string
@@ -4027,15 +4457,21 @@ catalogues:
4027
4457
  type: string
4028
4458
  nullable: true
4029
4459
  description: Where the need is stated (path and line).
4460
+ source_of_truth: evidence
4030
4461
  - name: source_sdd_id
4031
4462
  type: string
4032
4463
  nullable: true
4033
4464
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4465
+ source_of_truth: execution
4034
4466
  - name: platform_sdd_id
4035
4467
  type: string
4036
4468
  nullable: true
4037
4469
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator (M-ADR 0208 §4.4).
4470
+ source_of_truth: execution
4038
4471
  description: "Demand: a data item one feature needs, from the feature spec's Data Requirements table (M-ADR 0216 §4.3). Feature grain only: a capability's need is the union of its features'."
4472
+ natural_key:
4473
+ - feature_id
4474
+ - data_item_id
4039
4475
  foreign_keys:
4040
4476
  - column: feature_id
4041
4477
  references: features.id
@@ -4050,6 +4486,7 @@ catalogues:
4050
4486
  necessity: enums.data_necessity
4051
4487
  feature_integration_support:
4052
4488
  primary_key: id
4489
+ source_of_truth: derived
4053
4490
  columns:
4054
4491
  - name: id
4055
4492
  type: string
@@ -4077,10 +4514,12 @@ catalogues:
4077
4514
  type: string
4078
4515
  nullable: true
4079
4516
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4517
+ source_of_truth: execution
4080
4518
  - name: platform_sdd_id
4081
4519
  type: string
4082
4520
  nullable: true
4083
4521
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator (M-ADR 0208 §4.4).
4522
+ source_of_truth: execution
4084
4523
  description: "Coverage: whether one integration can support one feature, DERIVED at aggregation from supply and demand (M-ADR 0216 §4.4); empty in a member build. SUPPORTED MEANS THE ITEMS REACH THE CANONICAL BOUNDARY, NOT THAT THE FEATURE WORKS END TO END: routing past that boundary is not checked."
4085
4524
  foreign_keys:
4086
4525
  - column: feature_id
@@ -4097,6 +4536,7 @@ catalogues:
4097
4536
  limiting_reason: enums.limiting_reason
4098
4537
  evidence_target_repo:
4099
4538
  primary_key: id
4539
+ source_of_truth: evidence
4100
4540
  columns:
4101
4541
  - name: id
4102
4542
  type: string
@@ -4114,10 +4554,12 @@ catalogues:
4114
4554
  type: string
4115
4555
  nullable: true
4116
4556
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4557
+ source_of_truth: execution
4117
4558
  - name: platform_sdd_id
4118
4559
  type: string
4119
4560
  nullable: true
4120
4561
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator (M-ADR 0208 §4.4).
4562
+ source_of_truth: execution
4121
4563
  description: "A reverse evidence file names a repository another SDD owns, through its top-level target_repo (M-ADR 0214 §4.10). A reference, never a claim: the repository is described by exactly one SDD, elsewhere."
4122
4564
  foreign_keys:
4123
4565
  - column: repo_id
@@ -4126,6 +4568,7 @@ catalogues:
4126
4568
  external: true
4127
4569
  repo_dependency:
4128
4570
  primary_key: id
4571
+ source_of_truth: structure
4129
4572
  columns:
4130
4573
  - name: id
4131
4574
  type: string
@@ -4151,15 +4594,21 @@ catalogues:
4151
4594
  type: string
4152
4595
  nullable: false
4153
4596
  description: The file the row came from, relative to the SDD root; the declared source when both name the dependency.
4597
+ source_of_truth: derived
4154
4598
  - name: source_sdd_id
4155
4599
  type: string
4156
4600
  nullable: true
4157
4601
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4602
+ source_of_truth: execution
4158
4603
  - name: platform_sdd_id
4159
4604
  type: string
4160
4605
  nullable: true
4161
4606
  description: The platform this row belongs to — sdd_id of its platform-root. Stamped by the aggregator (M-ADR 0208 §4.4).
4607
+ source_of_truth: execution
4162
4608
  description: "Edge: a repository depends on another repository's code without either being a running service — a library linked at build time, or a template family it was generated from (M-ADR 0217). The depended-on repository may belong to another SDD, which describes it; this row only references it."
4609
+ natural_key:
4610
+ - from_repo_id
4611
+ - to_repo_id
4163
4612
  foreign_keys:
4164
4613
  - column: from_repo_id
4165
4614
  references: repositories.id
@@ -4172,6 +4621,7 @@ catalogues:
4172
4621
  kind: enums.repo_dependency_kind
4173
4622
  requirements:
4174
4623
  primary_key: id
4624
+ source_of_truth: behaviour
4175
4625
  columns:
4176
4626
  - name: id
4177
4627
  type: string
@@ -4188,23 +4638,28 @@ catalogues:
4188
4638
  - name: stage
4189
4639
  type: string
4190
4640
  nullable: false
4191
- description: "Bound to requirement_stage: living (in the living spec) or agreed (added by an open change whose agreement record is agreed)."
4641
+ description: "Bound to requirement_stage: living (in the living spec), agreed (added by an open change whose agreement record is agreed) or retired (removed by an archived change)."
4642
+ source_of_truth: derived
4192
4643
  - name: spec_path
4193
4644
  type: string
4194
4645
  nullable: false
4195
4646
  description: "The file that holds the requirement: the living spec, or the open change's delta."
4647
+ source_of_truth: derived
4196
4648
  - name: scenario_count
4197
4649
  type: integer
4198
4650
  nullable: false
4199
4651
  description: Scenarios under the requirement in that file.
4652
+ source_of_truth: derived
4200
4653
  - name: source_sdd_id
4201
4654
  type: string
4202
4655
  nullable: true
4203
4656
  description: Originating SDD (stamped at aggregation; empty in a per-SDD build).
4657
+ source_of_truth: execution
4204
4658
  - name: platform_sdd_id
4205
4659
  type: string
4206
4660
  nullable: true
4207
4661
  description: The platform SDD the row belongs to (stamped at aggregation).
4662
+ source_of_truth: execution
4208
4663
  description: "A requirement in the SDD's behaviour store (M-ADR 0221): one row per requirement of a living spec, keyed by the catalogue feature the spec describes, and per requirement an open agreed change adds. Projected from openspec/ at the SDD's commit; never authored here."
4209
4664
  foreign_keys:
4210
4665
  - column: feature_id
@@ -4214,6 +4669,7 @@ catalogues:
4214
4669
  stage: enums.requirement_stage
4215
4670
  requirement_lineage:
4216
4671
  primary_key: id
4672
+ source_of_truth: execution
4217
4673
  columns:
4218
4674
  - name: id
4219
4675
  type: string
@@ -4225,7 +4681,7 @@ catalogues:
4225
4681
  - name: change_id
4226
4682
  type: string
4227
4683
  nullable: false
4228
- description: The archived change's directory name (its archive date prefix included); a changes.id.
4684
+ description: "The archived change's id: <sdd_id>::<archive directory> (its archive date prefix included); a changes.id."
4229
4685
  - name: change_kind
4230
4686
  type: string
4231
4687
  nullable: false
@@ -4233,7 +4689,7 @@ catalogues:
4233
4689
  - name: operation
4234
4690
  type: string
4235
4691
  nullable: false
4236
- description: "Bound to requirement_operation: how the change's delta treated the requirement."
4692
+ description: "Bound to requirement_operation: how the change's delta treated the requirement; REMOVED retires it."
4237
4693
  - name: archived_on
4238
4694
  type: string
4239
4695
  nullable: false
@@ -4257,53 +4713,66 @@ catalogues:
4257
4713
  column_enums:
4258
4714
  change_kind: enums.requirement_change_kind
4259
4715
  operation: enums.requirement_operation
4260
- requirement_status:
4716
+ requirement_assertions:
4261
4717
  primary_key: id
4718
+ source_of_truth: evidence
4262
4719
  columns:
4263
4720
  - name: id
4264
4721
  type: string
4265
4722
  nullable: false
4266
- description: <requirement_id>__<repo_id>.
4723
+ description: <revision_id>__<repo_id>.
4724
+ - name: revision_id
4725
+ type: string
4726
+ nullable: false
4727
+ description: The revision the evidence is about.
4267
4728
  - name: requirement_id
4268
4729
  type: string
4269
4730
  nullable: false
4731
+ description: The revision's requirement, copied for joining without the revision; the revision's foreign key is the reference.
4732
+ source_of_truth: derived
4270
4733
  - name: repo_id
4271
4734
  type: string
4272
4735
  nullable: false
4273
4736
  description: "The implementing repository: a work order's repository, or a repository a baseline was observed in."
4274
- - name: status
4737
+ - name: kind
4275
4738
  type: string
4276
4739
  nullable: false
4277
- description: Bound to requirement_status_value.
4740
+ description: Bound to requirement_assertion_kind.
4278
4741
  - name: basis
4279
4742
  type: string
4280
4743
  nullable: false
4281
- description: "The change that produced the status: the open change's or the archived change's directory name."
4744
+ description: "The change that produced the evidence: its changes.id, <sdd_id>::<directory>."
4282
4745
  - name: source_sdd_id
4283
4746
  type: string
4284
4747
  nullable: true
4285
4748
  description: Originating SDD (stamped at aggregation; empty in a per-SDD build).
4749
+ source_of_truth: execution
4286
4750
  - name: platform_sdd_id
4287
4751
  type: string
4288
4752
  nullable: true
4289
4753
  description: The platform SDD the row belongs to (stamped at aggregation).
4290
- description: "Edge: a requirement's status in a repository that implements it (M-ADR 0221 §4.5; M-ADR 0223 §4.7). Derived, never authored: agreed from an open agreed change's work orders, declared-shipped from an archived change's PASS verdict and its work orders, observed from a baseline's evidence. The latest event in archive order wins."
4754
+ source_of_truth: execution
4755
+ description: "Edge: evidence about one revision of a requirement, in one repository that implements it (M-ADR 0230 §4.7, Proposed; replaces requirement_status in schema 6.0.0). Derived, never authored: observed from a baseline's **Observed in:** line, declared-shipped from an archived change's PASS verdict through its work orders' implements lists, each about the revision that change's delta states. An assertion is current while its revision is, and history once a later change moves the requirement, so evidence about one revision is never read as proof of another. An agreed change is not an assertion: it is an intended revision (requirement_revisions) and a change effect (change_effects). Per (revision, repository), the latest assertion wins."
4756
+ natural_key:
4757
+ - revision_id
4758
+ - repo_id
4291
4759
  foreign_keys:
4292
- - column: requirement_id
4293
- references: requirements.id
4760
+ - column: revision_id
4761
+ references: requirement_revisions.id
4294
4762
  nullable: false
4295
4763
  - column: repo_id
4296
4764
  references: repositories.id
4297
4765
  nullable: false
4298
4766
  column_enums:
4299
- status: enums.requirement_status_value
4767
+ kind: enums.requirement_assertion_kind
4300
4768
  changes:
4301
4769
  primary_key: id
4770
+ source_of_truth: execution
4302
4771
  columns:
4303
4772
  - name: id
4304
4773
  type: string
4305
4774
  nullable: false
4306
- description: "The change's directory name: the open change's name, or the archived change's directory (its archive date prefix included). requirement_lineage.change_id references it."
4775
+ description: "<sdd_id>::<directory>: the SDD the store belongs to and the change's directory name there, the open change's name or the archived change's directory (its archive date prefix included). A change name is its store's own, so the SDD is part of its identity: two SDDs' changes of one name are two changes. requirement_lineage.change_id references it."
4307
4776
  - name: name
4308
4777
  type: string
4309
4778
  nullable: false
@@ -4339,6 +4808,7 @@ catalogues:
4339
4808
  verdict: enums.judge_verdict
4340
4809
  change_work_order:
4341
4810
  primary_key: id
4811
+ source_of_truth: execution
4342
4812
  columns:
4343
4813
  - name: id
4344
4814
  type: string
@@ -4354,7 +4824,7 @@ catalogues:
4354
4824
  - name: status
4355
4825
  type: string
4356
4826
  nullable: false
4357
- description: "Bound to work_order_status: the record's status for the work order; a judge PASS marks it completed (M-ADR 0223 §4.6)."
4827
+ description: "Bound to work_order_status: the record's status for the work order; the change archiving on a judge PASS marks it completed (M-ADR 0223 §4.6)."
4358
4828
  - name: source_sdd_id
4359
4829
  type: string
4360
4830
  nullable: true
@@ -4375,15 +4845,16 @@ catalogues:
4375
4845
  status: enums.work_order_status
4376
4846
  change_work_item:
4377
4847
  primary_key: id
4848
+ source_of_truth: execution
4378
4849
  columns:
4379
4850
  - name: id
4380
4851
  type: string
4381
4852
  nullable: false
4382
- description: "<change_name>__<work_item_id>: keyed by the change's undated name, so the row is the same before and after archive."
4853
+ description: "<sdd_id>::<change_name>__<work_item_id>: keyed by the SDD and the change's undated name, so the row is the same before and after archive."
4383
4854
  - name: change_id
4384
4855
  type: string
4385
4856
  nullable: false
4386
- description: "The change as it stands now: its open name, or its archive directory."
4857
+ description: "The change as it stands now (a changes.id): <sdd_id>:: with its open name or its archive directory."
4387
4858
  - name: change_name
4388
4859
  type: string
4389
4860
  nullable: false
@@ -4405,3 +4876,349 @@ catalogues:
4405
4876
  - column: change_id
4406
4877
  references: changes.id
4407
4878
  nullable: false
4879
+ journey_requirement:
4880
+ primary_key: id
4881
+ source_of_truth: derived
4882
+ columns:
4883
+ - name: id
4884
+ type: string
4885
+ nullable: false
4886
+ description: <journey_id>__<requirement_id>.
4887
+ - name: journey_id
4888
+ type: string
4889
+ nullable: false
4890
+ - name: requirement_id
4891
+ type: string
4892
+ nullable: false
4893
+ - name: basis
4894
+ type: string
4895
+ nullable: false
4896
+ description: "Bound to journey_requirement_basis: where the citation was read."
4897
+ - name: source_sdd_id
4898
+ type: string
4899
+ nullable: true
4900
+ description: Originating SDD (stamped at aggregation; empty in a per-SDD build).
4901
+ source_of_truth: execution
4902
+ - name: platform_sdd_id
4903
+ type: string
4904
+ nullable: true
4905
+ description: The platform SDD the row belongs to (stamped at aggregation).
4906
+ source_of_truth: execution
4907
+ description: "Edge: a requirement a user journey cites for one of its steps (M-ADR 0229 §4.4, Proposed). Derived, never authored: from the @req tags in the journey's end-to-end test file, or from the citations in its journey feature's living spec. A journey with no row is untraced."
4908
+ foreign_keys:
4909
+ - column: journey_id
4910
+ references: user_journeys.id
4911
+ nullable: false
4912
+ - column: requirement_id
4913
+ references: requirements.id
4914
+ nullable: false
4915
+ column_enums:
4916
+ basis: enums.journey_requirement_basis
4917
+ entity_attributes:
4918
+ primary_key: id
4919
+ source_of_truth: structure
4920
+ columns:
4921
+ - name: id
4922
+ type: string
4923
+ nullable: false
4924
+ description: "Immutable id: <entity_id>__<attribute name slug> when first written; never re-keyed."
4925
+ - name: entity_id
4926
+ type: string
4927
+ nullable: false
4928
+ description: The entity the attribute belongs to.
4929
+ - name: name
4930
+ type: string
4931
+ nullable: false
4932
+ description: The attribute's name, unique within its entity.
4933
+ - name: type
4934
+ type: string
4935
+ nullable: false
4936
+ description: The attribute's type as the domain model states it (a primitive, a value object, or another entity's id); open by decision.
4937
+ - name: nullable
4938
+ type: boolean
4939
+ nullable: true
4940
+ description: 'True when the attribute may be absent: false for a primary key or a TypeQL @key or @card(1..1); true for @card(0..1), an unannotated TypeQL ownership (whose default is @card(0..1)) or a Mermaid comment that opens with "nullable"; empty where the model does not say.'
4941
+ - name: foreign_key
4942
+ type: boolean
4943
+ nullable: true
4944
+ description: "True when the domain model marks the attribute as a foreign key (a Mermaid FK or PK_FK marker). TypeQL has none: a reference is a role. Added in schema 6.0.0."
4945
+ - name: description
4946
+ type: string
4947
+ nullable: true
4948
+ - name: source_sdd_id
4949
+ type: string
4950
+ nullable: true
4951
+ description: Originating SDD (stamped at aggregation; empty in a per-SDD build).
4952
+ source_of_truth: execution
4953
+ - name: platform_sdd_id
4954
+ type: string
4955
+ nullable: true
4956
+ description: The platform SDD the row belongs to (stamped at aggregation).
4957
+ source_of_truth: execution
4958
+ description: "An attribute of a domain-model entity, an element of its own (M-ADR 0230 §4.3, Proposed): adding a field to an entity adds an attribute and does not modify the entity. Built from the domain model: a Mermaid ER diagram's attribute lines, or a TypeQL entity's owned attributes. Authored in the structural model (openspec/structure/) where an SDD has one. Added in schema 5.1.0; built from domain models since 6.0.0."
4959
+ natural_key:
4960
+ - entity_id
4961
+ - name
4962
+ foreign_keys:
4963
+ - column: entity_id
4964
+ references: entities.id
4965
+ nullable: false
4966
+ entity_relationships:
4967
+ primary_key: id
4968
+ source_of_truth: structure
4969
+ columns:
4970
+ - name: id
4971
+ type: string
4972
+ nullable: false
4973
+ description: "Immutable id: <from_entity_id>__<relationship name slug>__<to_entity_id> when first written; never re-keyed."
4974
+ - name: from_entity_id
4975
+ type: string
4976
+ nullable: false
4977
+ description: The entity the relationship is stated on.
4978
+ - name: to_entity_id
4979
+ type: string
4980
+ nullable: false
4981
+ description: The entity it relates to.
4982
+ - name: name
4983
+ type: string
4984
+ nullable: false
4985
+ description: "The relationship's name, unique among the relationships between its two entities: a Mermaid relationship's label, or a TypeQL relation's label."
4986
+ - name: from_cardinality
4987
+ type: string
4988
+ nullable: false
4989
+ description: How many from-entities relate to one to-entity. Bound to relationship_end_cardinality.
4990
+ - name: to_cardinality
4991
+ type: string
4992
+ nullable: false
4993
+ description: How many to-entities relate to one from-entity. Bound to relationship_end_cardinality.
4994
+ - name: from_role
4995
+ type: string
4996
+ nullable: true
4997
+ description: The role the from-entity plays, where the domain model names one (a TypeQL role).
4998
+ - name: to_role
4999
+ type: string
5000
+ nullable: true
5001
+ description: The role the to-entity plays, where the domain model names one (a TypeQL role).
5002
+ - name: description
5003
+ type: string
5004
+ nullable: true
5005
+ - name: source_sdd_id
5006
+ type: string
5007
+ nullable: true
5008
+ description: Originating SDD (stamped at aggregation; empty in a per-SDD build).
5009
+ source_of_truth: execution
5010
+ - name: platform_sdd_id
5011
+ type: string
5012
+ nullable: true
5013
+ description: The platform SDD the row belongs to (stamped at aggregation).
5014
+ source_of_truth: execution
5015
+ description: "A named relationship from one domain-model entity to another, an element of its own (M-ADR 0230 §4.3, Proposed). Built from the domain model: a Mermaid ER diagram's relationship lines, or a TypeQL binary relation, with each end's cardinality and role. Authored in the structural model (openspec/structure/) where an SDD has one. Added in schema 5.1.0; built from domain models since 6.0.0, when one cardinality became two, one per end."
5016
+ natural_key:
5017
+ - from_entity_id
5018
+ - to_entity_id
5019
+ - name
5020
+ foreign_keys:
5021
+ - column: from_entity_id
5022
+ references: entities.id
5023
+ nullable: false
5024
+ - column: to_entity_id
5025
+ references: entities.id
5026
+ nullable: false
5027
+ column_enums:
5028
+ from_cardinality: enums.relationship_end_cardinality
5029
+ to_cardinality: enums.relationship_end_cardinality
5030
+ domain_invariants:
5031
+ primary_key: id
5032
+ source_of_truth: structure
5033
+ columns:
5034
+ - name: id
5035
+ type: string
5036
+ nullable: false
5037
+ description: Immutable id, never re-keyed.
5038
+ - name: entity_id
5039
+ type: string
5040
+ nullable: false
5041
+ description: The entity the invariant constrains.
5042
+ - name: kind
5043
+ type: string
5044
+ nullable: false
5045
+ description: Bound to domain_invariant_kind.
5046
+ - name: attribute_ids
5047
+ type: string
5048
+ nullable: true
5049
+ description: "';'-separated list of entity_attributes ids, each the entity's own. Required for unique and required."
5050
+ - name: relationship_id
5051
+ type: string
5052
+ nullable: true
5053
+ description: The entity's own relationship the invariant constrains. Required for cardinality.
5054
+ - name: statement
5055
+ type: string
5056
+ nullable: false
5057
+ description: The invariant as the domain model states it.
5058
+ - name: source_sdd_id
5059
+ type: string
5060
+ nullable: true
5061
+ description: Originating SDD (stamped at aggregation; empty in a per-SDD build).
5062
+ source_of_truth: execution
5063
+ - name: platform_sdd_id
5064
+ type: string
5065
+ nullable: true
5066
+ description: The platform SDD the row belongs to (stamped at aggregation).
5067
+ source_of_truth: execution
5068
+ description: "A domain invariant, a typed element of the domain model (M-ADR 0230 §4.3, Proposed): a rule the entity's data always satisfies. It is structure, not intent, wherever it is first written. Built from the domain model's keys: a primary key (PK, or a TypeQL @key) or a unique key (UK) is a unique invariant over its attributes, and a TypeQL role's @card is a cardinality invariant on its relationship. Authored in the structural model (openspec/structure/) where an SDD has one, which can state every kind. Added in schema 5.1.0; built from domain models since 6.0.0."
5069
+ foreign_keys:
5070
+ - column: entity_id
5071
+ references: entities.id
5072
+ nullable: false
5073
+ - column: relationship_id
5074
+ references: entity_relationships.id
5075
+ nullable: true
5076
+ column_enums:
5077
+ kind: enums.domain_invariant_kind
5078
+ requirement_revisions:
5079
+ primary_key: id
5080
+ source_of_truth: behaviour
5081
+ columns:
5082
+ - name: id
5083
+ type: string
5084
+ nullable: false
5085
+ description: <requirement_id>@<the digest's first 12 hex digits>.
5086
+ - name: requirement_id
5087
+ type: string
5088
+ nullable: false
5089
+ - name: digest
5090
+ type: string
5091
+ nullable: false
5092
+ description: sha256:<hex> of the requirement block, its lines trimmed and blank lines dropped.
5093
+ source_of_truth: derived
5094
+ - name: state
5095
+ type: string
5096
+ nullable: false
5097
+ description: Bound to revision_state.
5098
+ source_of_truth: derived
5099
+ - name: change_id
5100
+ type: string
5101
+ nullable: true
5102
+ description: The change whose delta states this text (changes.id), the latest where several do; empty where none does.
5103
+ source_of_truth: execution
5104
+ - name: source_sdd_id
5105
+ type: string
5106
+ nullable: true
5107
+ description: Originating SDD (stamped at aggregation; empty in a per-SDD build).
5108
+ source_of_truth: execution
5109
+ - name: platform_sdd_id
5110
+ type: string
5111
+ nullable: true
5112
+ description: The platform SDD the row belongs to (stamped at aggregation).
5113
+ source_of_truth: execution
5114
+ description: "One row per distinct text of a requirement (M-ADR 0230 §4.7, Proposed; schema 6.0.0). Derived from the behaviour store: the living spec's text is current; an agreed open change's ADDED or MODIFIED block is intended; an archived change's block the living spec no longer holds is history. A revision is identified by its digest, so the same text is one revision wherever it appears."
5115
+ foreign_keys:
5116
+ - column: requirement_id
5117
+ references: requirements.id
5118
+ nullable: false
5119
+ - column: change_id
5120
+ references: changes.id
5121
+ nullable: true
5122
+ column_enums:
5123
+ state: enums.revision_state
5124
+ change_effects:
5125
+ primary_key: id
5126
+ source_of_truth: execution
5127
+ columns:
5128
+ - name: id
5129
+ type: string
5130
+ nullable: false
5131
+ description: <change_id>__<element_kind>__<element_id>.
5132
+ - name: change_id
5133
+ type: string
5134
+ nullable: false
5135
+ - name: element_kind
5136
+ type: string
5137
+ nullable: false
5138
+ description: Bound to change_effect_element_kind.
5139
+ - name: element_id
5140
+ type: string
5141
+ nullable: false
5142
+ description: A requirements.id (for a requirement a change not yet agreed adds, the id it will have), or a structural element as <catalogue>/<id>.
5143
+ - name: operation
5144
+ type: string
5145
+ nullable: false
5146
+ description: Bound to requirement_operation.
5147
+ - name: base_revision
5148
+ type: string
5149
+ nullable: true
5150
+ description: The revision the change was written against; empty for an addition.
5151
+ - name: target_revision
5152
+ type: string
5153
+ nullable: true
5154
+ description: The revision the change leaves; empty for a removal.
5155
+ - name: source_sdd_id
5156
+ type: string
5157
+ nullable: true
5158
+ description: Originating SDD (stamped at aggregation; empty in a per-SDD build).
5159
+ - name: platform_sdd_id
5160
+ type: string
5161
+ nullable: true
5162
+ description: The platform SDD the row belongs to (stamped at aggregation).
5163
+ description: "One row per element a change writes (M-ADR 0230 §4.7, Proposed; schema 6.0.0): a requirement from its behaviour deltas, a structural element from its structural deltas (an archived change's from its effect record, structure/applied.yaml). Base and target are the revisions it moves the element between; a requirement's are revision ids (<requirement>@<12 hex digits of its digest>), catalogued in requirement_revisions except the target of a change not yet agreed; a structural element's are sha256 digests."
5164
+ natural_key:
5165
+ - change_id
5166
+ - element_kind
5167
+ - element_id
5168
+ foreign_keys:
5169
+ - column: change_id
5170
+ references: changes.id
5171
+ nullable: false
5172
+ column_enums:
5173
+ element_kind: enums.change_effect_element_kind
5174
+ operation: enums.requirement_operation
5175
+ contract_revisions:
5176
+ primary_key: id
5177
+ source_of_truth: interface
5178
+ columns:
5179
+ - name: id
5180
+ type: string
5181
+ nullable: false
5182
+ description: <contract_id>@<the digest's first 12 hex digits>.
5183
+ - name: contract_id
5184
+ type: string
5185
+ nullable: false
5186
+ - name: digest
5187
+ type: string
5188
+ nullable: false
5189
+ description: sha256:<hex> of the contract file's bytes.
5190
+ source_of_truth: derived
5191
+ - name: state
5192
+ type: string
5193
+ nullable: false
5194
+ description: Bound to contract_revision_state.
5195
+ source_of_truth: derived
5196
+ - name: sunset_date
5197
+ type: string
5198
+ nullable: true
5199
+ description: "For a deprecated revision, the date it is retired. Not yet populated: the builder does not yet read a version's sunset date (BASELINE.md's optional sunset_date)."
5200
+ - name: change_id
5201
+ type: string
5202
+ nullable: true
5203
+ description: "The change that moved the revision to its state (changes.id): the change whose agreement record agrees it (for an agreed or a retired revision), or, for the active one, the archived change that agreed the current content; empty where none is recorded."
5204
+ source_of_truth: execution
5205
+ - name: source_sdd_id
5206
+ type: string
5207
+ nullable: true
5208
+ description: Originating SDD (stamped at aggregation; empty in a per-SDD build).
5209
+ source_of_truth: execution
5210
+ - name: platform_sdd_id
5211
+ type: string
5212
+ nullable: true
5213
+ description: The platform SDD the row belongs to (stamped at aggregation).
5214
+ source_of_truth: execution
5215
+ description: A contract version's content revisions, each identified by its content digest (M-ADR 0230 §4.2, Proposed; schema 6.0.0). The contract file's current content is active (deprecated where the contract is); a revision an agreed open change pins as the one it agrees (agreement record 1.2.0, contracts[].agrees) is agreed; one an archived change agreed that the file no longer holds is retired. A compatible amendment is a new revision at the same path, so an agreed revision and the active one coexist, both checked. Active is a claim about the published specification, not about deployment.
5216
+ foreign_keys:
5217
+ - column: contract_id
5218
+ references: contracts.id
5219
+ nullable: false
5220
+ - column: change_id
5221
+ references: changes.id
5222
+ nullable: true
5223
+ column_enums:
5224
+ state: enums.contract_revision_state