@sdd-method/author-cli 0.11.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/lib/catalogue/build.js +33 -2
  2. package/dist/lib/catalogue/builders/adr-governs.js +39 -0
  3. package/dist/lib/catalogue/builders/adrs.js +11 -0
  4. package/dist/lib/catalogue/builders/contract-revisions.js +126 -0
  5. package/dist/lib/catalogue/builders/data-model.js +316 -0
  6. package/dist/lib/catalogue/builders/entities-mermaid.js +18 -85
  7. package/dist/lib/catalogue/builders/integration-components.js +49 -5
  8. package/dist/lib/catalogue/builders/quality-scores.js +17 -0
  9. package/dist/lib/catalogue/builders/requirements.js +132 -23
  10. package/dist/lib/catalogue/builders/user-journeys.js +8 -13
  11. package/dist/lib/catalogue/canonical-schema.yaml +767 -17
  12. package/dist/lib/catalogue/retired-catalogues.js +25 -0
  13. package/dist/lib/catalogue/rubric-coverage-map.yaml +90 -2
  14. package/dist/lib/catalogue/schema-compat.js +1 -1
  15. package/dist/lib/catalogue/schema-loader.js +3 -0
  16. package/dist/lib/catalogue/staleness-verdicts.js +75 -6
  17. package/dist/lib/structure/catalogue.js +183 -0
  18. package/dist/lib/structure/compose.js +174 -0
  19. package/dist/lib/structure/effects.js +36 -0
  20. package/dist/lib/structure/model.js +212 -0
  21. package/dist/lib/structure/render.js +242 -0
  22. package/dist/lib/structure/view.js +301 -0
  23. package/dist/lib/validate/agreement-evidence.js +20 -8
  24. package/dist/lib/validate/behaviour-store.js +54 -13
  25. package/dist/lib/validate/dispatch.js +7 -0
  26. package/dist/lib/validate/journey-impact.js +17 -2
  27. package/dist/lib/validate/structural-model.js +265 -0
  28. package/dist/maintain-version.json +2 -2
  29. package/dist/verify-version.json +2 -2
  30. 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: "5.0.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:
@@ -637,15 +639,13 @@ enums:
637
639
  - value: RENAMED
638
640
  - value: REMOVED
639
641
  description: How a change's delta treated a requirement.
640
- requirement_status_value:
642
+ requirement_assertion_kind:
641
643
  values:
642
- - value: agreed
643
- description: In an agreed, open change.
644
644
  - value: declared-shipped
645
- 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.
646
646
  - value: observed
647
647
  description: Independent evidence from this repository's code matches (a baseline's characterization tests or a reverse snapshot).
648
- 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).
649
649
  change_status:
650
650
  values:
651
651
  - value: proposed
@@ -694,9 +694,85 @@ enums:
694
694
  - value: citation
695
695
  description: A citation in the journey feature's living spec (option B).
696
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).
697
772
  catalogues:
698
773
  domains:
699
774
  primary_key: id
775
+ source_of_truth: structure
700
776
  columns:
701
777
  - name: id
702
778
  type: string
@@ -713,6 +789,7 @@ catalogues:
713
789
  type: string
714
790
  nullable: false
715
791
  description: platform-profile | application-product | integration-product.
792
+ source_of_truth: declaration
716
793
  - name: reference_architecture_equivalent
717
794
  type: string
718
795
  nullable: true
@@ -723,19 +800,23 @@ catalogues:
723
800
  - name: repo_count
724
801
  type: int
725
802
  nullable: false
803
+ source_of_truth: derived
726
804
  - name: source_sdd_id
727
805
  type: string
728
806
  nullable: true
729
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
730
809
  - name: platform_sdd_id
731
810
  type: string
732
811
  nullable: true
733
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
734
814
  column_enums:
735
815
  method_profile: enums.sdd_profile
736
816
  status: enums.domain_status
737
817
  products:
738
818
  primary_key: id
819
+ source_of_truth: declaration
739
820
  columns:
740
821
  - name: id
741
822
  type: string
@@ -760,6 +841,7 @@ catalogues:
760
841
  type: string
761
842
  nullable: false
762
843
  description: Path to _product/ directory, relative to docs/.
844
+ source_of_truth: derived
763
845
  - name: lifecycle
764
846
  type: string
765
847
  nullable: true
@@ -796,28 +878,35 @@ catalogues:
796
878
  type: int
797
879
  nullable: true
798
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
799
882
  - name: synthesis_band
800
883
  type: string
801
884
  nullable: true
802
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
803
887
  - name: last_assessed
804
888
  type: date
805
889
  nullable: true
890
+ source_of_truth: evidence
806
891
  - name: highest_snapshot_impact
807
892
  type: string
808
893
  nullable: true
894
+ source_of_truth: evidence
809
895
  - name: repo_count
810
896
  type: int
811
897
  nullable: false
812
898
  description: Number of repos mapped to this product.
899
+ source_of_truth: derived
813
900
  - name: source_sdd_id
814
901
  type: string
815
902
  nullable: true
816
903
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
904
+ source_of_truth: execution
817
905
  - name: platform_sdd_id
818
906
  type: string
819
907
  nullable: true
820
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
821
910
  foreign_keys:
822
911
  - column: domain_id
823
912
  references: domains.id
@@ -830,6 +919,7 @@ catalogues:
830
919
  packaging: enums.product_packaging
831
920
  applications:
832
921
  primary_key: id
922
+ source_of_truth: derived
833
923
  columns:
834
924
  - name: id
835
925
  type: string
@@ -908,10 +998,12 @@ catalogues:
908
998
  type: string
909
999
  nullable: true
910
1000
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1001
+ source_of_truth: execution
911
1002
  - name: platform_sdd_id
912
1003
  type: string
913
1004
  nullable: true
914
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
915
1007
  description: Filtered view of products where profile = application-product.
916
1008
  foreign_keys:
917
1009
  - column: domain_id
@@ -925,6 +1017,7 @@ catalogues:
925
1017
  packaging: enums.product_packaging
926
1018
  integrations:
927
1019
  primary_key: id
1020
+ source_of_truth: declaration
928
1021
  columns:
929
1022
  - name: id
930
1023
  type: string
@@ -948,9 +1041,11 @@ catalogues:
948
1041
  - name: doc_path
949
1042
  type: string
950
1043
  nullable: false
1044
+ source_of_truth: derived
951
1045
  - name: repo_count
952
1046
  type: int
953
1047
  nullable: false
1048
+ source_of_truth: derived
954
1049
  - name: ingestion_pattern
955
1050
  type: string
956
1051
  nullable: true
@@ -975,10 +1070,12 @@ catalogues:
975
1070
  type: string
976
1071
  nullable: true
977
1072
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1073
+ source_of_truth: execution
978
1074
  - name: platform_sdd_id
979
1075
  type: string
980
1076
  nullable: true
981
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
982
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`.
983
1080
  foreign_keys:
984
1081
  - column: domain_id
@@ -991,6 +1088,7 @@ catalogues:
991
1088
  invocation_pattern: enums.invocation_pattern
992
1089
  integration_component:
993
1090
  primary_key: id
1091
+ source_of_truth: declaration
994
1092
  columns:
995
1093
  - name: id
996
1094
  type: string
@@ -1012,6 +1110,7 @@ catalogues:
1012
1110
  type: string
1013
1111
  nullable: false
1014
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
1015
1114
  - name: component_type
1016
1115
  type: string
1017
1116
  nullable: true
@@ -1056,14 +1155,17 @@ catalogues:
1056
1155
  type: string
1057
1156
  nullable: false
1058
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
1059
1159
  - name: source_sdd_id
1060
1160
  type: string
1061
1161
  nullable: true
1062
1162
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1163
+ source_of_truth: execution
1063
1164
  - name: platform_sdd_id
1064
1165
  type: string
1065
1166
  nullable: true
1066
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
1067
1169
  description: |
1068
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).
1069
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.
@@ -1078,6 +1180,7 @@ catalogues:
1078
1180
  declared_in: enums.integration_component_declared_in
1079
1181
  adrs:
1080
1182
  primary_key: id
1183
+ source_of_truth: decision
1081
1184
  columns:
1082
1185
  - name: id
1083
1186
  type: string
@@ -1100,25 +1203,39 @@ catalogues:
1100
1203
  - name: doc_path
1101
1204
  type: string
1102
1205
  nullable: false
1206
+ source_of_truth: derived
1103
1207
  - name: superseded_by_id
1104
1208
  type: string
1105
1209
  nullable: true
1210
+ source_of_truth: derived
1106
1211
  - name: inference_confidence
1107
1212
  type: string
1108
1213
  nullable: true
1109
1214
  description: high | medium | low (reverse-inferred ADRs only).
1215
+ source_of_truth: derived
1110
1216
  - name: supersedes_raw
1111
1217
  type: string
1112
1218
  nullable: true
1113
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
1114
1229
  - name: source_sdd_id
1115
1230
  type: string
1116
1231
  nullable: true
1117
1232
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1233
+ source_of_truth: execution
1118
1234
  - name: platform_sdd_id
1119
1235
  type: string
1120
1236
  nullable: true
1121
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
1122
1239
  foreign_keys:
1123
1240
  - column: domain_id
1124
1241
  references: domains.id
@@ -1131,8 +1248,10 @@ catalogues:
1131
1248
  nullable: true
1132
1249
  column_enums:
1133
1250
  inference_confidence: enums.confidence_level
1251
+ governs: enums.adr_governs
1134
1252
  glossary_items:
1135
1253
  primary_key: id
1254
+ source_of_truth: structure
1136
1255
  columns:
1137
1256
  - name: id
1138
1257
  type: string
@@ -1152,13 +1271,16 @@ catalogues:
1152
1271
  type: string
1153
1272
  nullable: true
1154
1273
  description: Set when this term is an alias for another.
1274
+ source_of_truth: derived
1155
1275
  - name: aliases
1156
1276
  type: string
1157
1277
  nullable: true
1158
1278
  description: "';'-separated list."
1279
+ source_of_truth: derived
1159
1280
  - name: evidence
1160
1281
  type: string
1161
1282
  nullable: true
1283
+ source_of_truth: evidence
1162
1284
  - name: notes
1163
1285
  type: string
1164
1286
  nullable: true
@@ -1166,10 +1288,12 @@ catalogues:
1166
1288
  type: string
1167
1289
  nullable: true
1168
1290
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1291
+ source_of_truth: execution
1169
1292
  - name: platform_sdd_id
1170
1293
  type: string
1171
1294
  nullable: true
1172
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
1173
1297
  foreign_keys:
1174
1298
  - column: owning_domain_id
1175
1299
  references: domains.id
@@ -1179,6 +1303,7 @@ catalogues:
1179
1303
  nullable: true
1180
1304
  glossary_xref:
1181
1305
  primary_key: id
1306
+ source_of_truth: structure
1182
1307
  columns:
1183
1308
  - name: id
1184
1309
  type: string
@@ -1195,6 +1320,10 @@ catalogues:
1195
1320
  nullable: false
1196
1321
  description: alias-of | conflicts-with | references | supersedes (extended in schema 2.12.0 per M-ADR 0158).
1197
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
1198
1327
  foreign_keys:
1199
1328
  - column: source_id
1200
1329
  references: glossary_items.id
@@ -1206,6 +1335,7 @@ catalogues:
1206
1335
  relation: enums.glossary_xref_relation
1207
1336
  entity_glossary:
1208
1337
  primary_key: id
1338
+ source_of_truth: structure
1209
1339
  columns:
1210
1340
  - name: id
1211
1341
  type: string
@@ -1224,14 +1354,17 @@ catalogues:
1224
1354
  type: string
1225
1355
  nullable: false
1226
1356
  description: aligned | matched_direct. Conflicting statuses within a domain resolve matched_direct > aligned with a divergence finding.
1357
+ source_of_truth: derived
1227
1358
  - name: source_sdd_id
1228
1359
  type: string
1229
1360
  nullable: true
1230
1361
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1362
+ source_of_truth: execution
1231
1363
  - name: platform_sdd_id
1232
1364
  type: string
1233
1365
  nullable: true
1234
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
1235
1368
  - name: entity_id
1236
1369
  type: string
1237
1370
  nullable: true
@@ -1249,6 +1382,7 @@ catalogues:
1249
1382
  nullable: true
1250
1383
  services:
1251
1384
  primary_key: id
1385
+ source_of_truth: structure
1252
1386
  columns:
1253
1387
  - name: id
1254
1388
  type: string
@@ -1287,6 +1421,7 @@ catalogues:
1287
1421
  type: string
1288
1422
  nullable: true
1289
1423
  description: high | medium | low (reverse-method classification).
1424
+ source_of_truth: evidence
1290
1425
  - name: context
1291
1426
  type: string
1292
1427
  nullable: true
@@ -1298,10 +1433,12 @@ catalogues:
1298
1433
  type: string
1299
1434
  nullable: true
1300
1435
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1436
+ source_of_truth: execution
1301
1437
  - name: platform_sdd_id
1302
1438
  type: string
1303
1439
  nullable: true
1304
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
1305
1442
  foreign_keys:
1306
1443
  - column: product_id
1307
1444
  references: products.id
@@ -1317,6 +1454,7 @@ catalogues:
1317
1454
  confidence: enums.confidence_level
1318
1455
  capabilities:
1319
1456
  primary_key: id
1457
+ source_of_truth: structure
1320
1458
  columns:
1321
1459
  - name: id
1322
1460
  type: string
@@ -1339,6 +1477,7 @@ catalogues:
1339
1477
  type: string
1340
1478
  nullable: true
1341
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
1342
1481
  - name: context
1343
1482
  type: string
1344
1483
  nullable: true
@@ -1346,6 +1485,7 @@ catalogues:
1346
1485
  - name: description
1347
1486
  type: string
1348
1487
  nullable: true
1488
+ source_of_truth: intent
1349
1489
  - name: status
1350
1490
  type: string
1351
1491
  nullable: false
@@ -1354,14 +1494,17 @@ catalogues:
1354
1494
  type: string
1355
1495
  nullable: true
1356
1496
  description: Path to capability spec file when one exists.
1497
+ source_of_truth: derived
1357
1498
  - name: contract_provenance
1358
1499
  type: string
1359
1500
  nullable: true
1360
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
1361
1503
  - name: source
1362
1504
  type: string
1363
1505
  nullable: false
1364
- 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
1365
1508
  - name: runway_classification
1366
1509
  type: string
1367
1510
  nullable: true
@@ -1378,10 +1521,12 @@ catalogues:
1378
1521
  type: string
1379
1522
  nullable: true
1380
1523
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1524
+ source_of_truth: execution
1381
1525
  - name: platform_sdd_id
1382
1526
  type: string
1383
1527
  nullable: true
1384
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
1385
1530
  foreign_keys:
1386
1531
  - column: domain_id
1387
1532
  references: domains.id
@@ -1396,6 +1541,7 @@ catalogues:
1396
1541
  source: enums.capability_source
1397
1542
  feature_groups:
1398
1543
  primary_key: id
1544
+ source_of_truth: structure
1399
1545
  columns:
1400
1546
  - name: id
1401
1547
  type: string
@@ -1421,18 +1567,22 @@ catalogues:
1421
1567
  type: string
1422
1568
  nullable: true
1423
1569
  description: Authored description (when group has explicit metadata) or null when derived from heading only.
1570
+ source_of_truth: intent
1424
1571
  - name: source
1425
1572
  type: string
1426
1573
  nullable: false
1427
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
1428
1576
  - name: source_sdd_id
1429
1577
  type: string
1430
1578
  nullable: true
1431
1579
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1580
+ source_of_truth: execution
1432
1581
  - name: platform_sdd_id
1433
1582
  type: string
1434
1583
  nullable: true
1435
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
1436
1586
  description: |
1437
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`.
1438
1588
  foreign_keys:
@@ -1447,6 +1597,7 @@ catalogues:
1447
1597
  nullable: true
1448
1598
  features:
1449
1599
  primary_key: id
1600
+ source_of_truth: structure
1450
1601
  columns:
1451
1602
  - name: id
1452
1603
  type: string
@@ -1473,10 +1624,12 @@ catalogues:
1473
1624
  - name: description
1474
1625
  type: string
1475
1626
  nullable: true
1627
+ source_of_truth: intent
1476
1628
  - name: maturity
1477
1629
  type: string
1478
1630
  nullable: true
1479
1631
  description: "Standard: working | provisional | unknown | absent. Ecosystem-specific values may be added with parser awareness."
1632
+ source_of_truth: derived
1480
1633
  - name: status
1481
1634
  type: string
1482
1635
  nullable: false
@@ -1484,7 +1637,8 @@ catalogues:
1484
1637
  - name: source
1485
1638
  type: string
1486
1639
  nullable: false
1487
- 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
1488
1642
  - name: runway
1489
1643
  type: string
1490
1644
  nullable: true
@@ -1497,10 +1651,12 @@ catalogues:
1497
1651
  type: string
1498
1652
  nullable: true
1499
1653
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1654
+ source_of_truth: execution
1500
1655
  - name: platform_sdd_id
1501
1656
  type: string
1502
1657
  nullable: true
1503
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
1504
1660
  foreign_keys:
1505
1661
  - column: product_id
1506
1662
  references: products.id
@@ -1521,6 +1677,7 @@ catalogues:
1521
1677
  maturity: enums.artefact_maturity
1522
1678
  personas:
1523
1679
  primary_key: id
1680
+ source_of_truth: structure
1524
1681
  columns:
1525
1682
  - name: id
1526
1683
  type: string
@@ -1538,20 +1695,24 @@ catalogues:
1538
1695
  - name: description
1539
1696
  type: string
1540
1697
  nullable: true
1698
+ source_of_truth: intent
1541
1699
  - name: source_sdd_id
1542
1700
  type: string
1543
1701
  nullable: true
1544
1702
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1703
+ source_of_truth: execution
1545
1704
  - name: platform_sdd_id
1546
1705
  type: string
1547
1706
  nullable: true
1548
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
1549
1709
  foreign_keys:
1550
1710
  - column: product_id
1551
1711
  references: products.id
1552
1712
  nullable: false
1553
1713
  user_journeys:
1554
1714
  primary_key: id
1715
+ source_of_truth: structure
1555
1716
  columns:
1556
1717
  - name: id
1557
1718
  type: string
@@ -1573,23 +1734,28 @@ catalogues:
1573
1734
  - name: trigger
1574
1735
  type: string
1575
1736
  nullable: true
1737
+ source_of_truth: intent
1576
1738
  - name: goal
1577
1739
  type: string
1578
1740
  nullable: true
1741
+ source_of_truth: intent
1579
1742
  - name: source_sdd_id
1580
1743
  type: string
1581
1744
  nullable: true
1582
1745
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1746
+ source_of_truth: execution
1583
1747
  - name: platform_sdd_id
1584
1748
  type: string
1585
1749
  nullable: true
1586
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
1587
1752
  foreign_keys:
1588
1753
  - column: product_id
1589
1754
  references: products.id
1590
1755
  nullable: false
1591
1756
  contracts:
1592
1757
  primary_key: id
1758
+ source_of_truth: interface
1593
1759
  columns:
1594
1760
  - name: id
1595
1761
  type: string
@@ -1621,6 +1787,7 @@ catalogues:
1621
1787
  - name: spec_path
1622
1788
  type: string
1623
1789
  nullable: true
1790
+ source_of_truth: derived
1624
1791
  - name: visibility
1625
1792
  type: string
1626
1793
  nullable: true
@@ -1633,6 +1800,7 @@ catalogues:
1633
1800
  type: string
1634
1801
  nullable: true
1635
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
1636
1804
  - name: description
1637
1805
  type: string
1638
1806
  nullable: true
@@ -1640,14 +1808,17 @@ catalogues:
1640
1808
  type: string
1641
1809
  nullable: true
1642
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
1643
1812
  - name: source_sdd_id
1644
1813
  type: string
1645
1814
  nullable: true
1646
1815
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1816
+ source_of_truth: execution
1647
1817
  - name: platform_sdd_id
1648
1818
  type: string
1649
1819
  nullable: true
1650
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
1651
1822
  foreign_keys:
1652
1823
  - column: service_id
1653
1824
  references: services.id
@@ -1662,6 +1833,7 @@ catalogues:
1662
1833
  discovery: enums.contract_discovery
1663
1834
  events:
1664
1835
  primary_key: id
1836
+ source_of_truth: interface
1665
1837
  columns:
1666
1838
  - name: id
1667
1839
  type: string
@@ -1690,14 +1862,17 @@ catalogues:
1690
1862
  type: string
1691
1863
  nullable: true
1692
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
1693
1866
  - name: source_sdd_id
1694
1867
  type: string
1695
1868
  nullable: true
1696
1869
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1870
+ source_of_truth: execution
1697
1871
  - name: platform_sdd_id
1698
1872
  type: string
1699
1873
  nullable: true
1700
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
1701
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."
1702
1877
  foreign_keys:
1703
1878
  - column: publisher_service_id
@@ -1708,6 +1883,7 @@ catalogues:
1708
1883
  nullable: true
1709
1884
  c4_systems:
1710
1885
  primary_key: id
1886
+ source_of_truth: structure
1711
1887
  columns:
1712
1888
  - name: id
1713
1889
  type: string
@@ -1728,6 +1904,7 @@ catalogues:
1728
1904
  type: string
1729
1905
  nullable: true
1730
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
1731
1908
  - name: description
1732
1909
  type: string
1733
1910
  nullable: true
@@ -1735,10 +1912,12 @@ catalogues:
1735
1912
  type: string
1736
1913
  nullable: true
1737
1914
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1915
+ source_of_truth: execution
1738
1916
  - name: platform_sdd_id
1739
1917
  type: string
1740
1918
  nullable: true
1741
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
1742
1921
  foreign_keys:
1743
1922
  - column: product_id
1744
1923
  references: products.id
@@ -1747,6 +1926,7 @@ catalogues:
1747
1926
  kind: enums.c4_system_kind
1748
1927
  c4_containers:
1749
1928
  primary_key: id
1929
+ source_of_truth: structure
1750
1930
  columns:
1751
1931
  - name: id
1752
1932
  type: string
@@ -1781,10 +1961,12 @@ catalogues:
1781
1961
  type: string
1782
1962
  nullable: true
1783
1963
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
1964
+ source_of_truth: execution
1784
1965
  - name: platform_sdd_id
1785
1966
  type: string
1786
1967
  nullable: true
1787
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
1788
1970
  description: |
1789
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.
1790
1972
  foreign_keys:
@@ -1801,6 +1983,7 @@ catalogues:
1801
1983
  type: enums.c4_container_type
1802
1984
  c4_components:
1803
1985
  primary_key: id
1986
+ source_of_truth: structure
1804
1987
  columns:
1805
1988
  - name: id
1806
1989
  type: string
@@ -1827,10 +2010,12 @@ catalogues:
1827
2010
  type: string
1828
2011
  nullable: true
1829
2012
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2013
+ source_of_truth: execution
1830
2014
  - name: platform_sdd_id
1831
2015
  type: string
1832
2016
  nullable: true
1833
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
1834
2019
  description: |
1835
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.
1836
2021
  foreign_keys:
@@ -1842,6 +2027,7 @@ catalogues:
1842
2027
  nullable: true
1843
2028
  c4_external_systems:
1844
2029
  primary_key: id
2030
+ source_of_truth: structure
1845
2031
  columns:
1846
2032
  - name: id
1847
2033
  type: string
@@ -1867,18 +2053,22 @@ catalogues:
1867
2053
  type: string
1868
2054
  nullable: true
1869
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
1870
2057
  - name: source_sdd_id
1871
2058
  type: string
1872
2059
  nullable: true
1873
2060
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2061
+ source_of_truth: execution
1874
2062
  - name: platform_sdd_id
1875
2063
  type: string
1876
2064
  nullable: true
1877
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
1878
2067
  description: |
1879
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.
1880
2069
  repositories:
1881
2070
  primary_key: id
2071
+ source_of_truth: structure
1882
2072
  columns:
1883
2073
  - name: id
1884
2074
  type: string
@@ -1914,33 +2104,42 @@ catalogues:
1914
2104
  - name: files
1915
2105
  type: int
1916
2106
  nullable: true
2107
+ source_of_truth: evidence
1917
2108
  - name: code
1918
2109
  type: int
1919
2110
  nullable: true
2111
+ source_of_truth: evidence
1920
2112
  - name: comment
1921
2113
  type: int
1922
2114
  nullable: true
2115
+ source_of_truth: evidence
1923
2116
  - name: blank
1924
2117
  type: int
1925
2118
  nullable: true
2119
+ source_of_truth: evidence
1926
2120
  - name: total_lines
1927
2121
  type: int
1928
2122
  nullable: true
2123
+ source_of_truth: evidence
1929
2124
  - name: languages
1930
2125
  type: string
1931
2126
  nullable: true
1932
2127
  description: "';'-separated."
2128
+ source_of_truth: evidence
1933
2129
  - name: doc_path
1934
2130
  type: string
1935
2131
  nullable: false
2132
+ source_of_truth: derived
1936
2133
  - name: source_sdd_id
1937
2134
  type: string
1938
2135
  nullable: true
1939
2136
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2137
+ source_of_truth: execution
1940
2138
  - name: platform_sdd_id
1941
2139
  type: string
1942
2140
  nullable: true
1943
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
1944
2143
  - name: repo_scope
1945
2144
  type: string
1946
2145
  nullable: true
@@ -1957,6 +2156,7 @@ catalogues:
1957
2156
  repo_scope: enums.repo_scope
1958
2157
  domain_models:
1959
2158
  primary_key: id
2159
+ source_of_truth: structure
1960
2160
  columns:
1961
2161
  - name: id
1962
2162
  type: string
@@ -1972,6 +2172,7 @@ catalogues:
1972
2172
  type: string
1973
2173
  nullable: false
1974
2174
  description: Path to data-model.mermaid.md.
2175
+ source_of_truth: derived
1975
2176
  - name: version
1976
2177
  type: string
1977
2178
  nullable: true
@@ -1980,18 +2181,22 @@ catalogues:
1980
2181
  type: string
1981
2182
  nullable: true
1982
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
1983
2185
  - name: source_sdd_id
1984
2186
  type: string
1985
2187
  nullable: true
1986
2188
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2189
+ source_of_truth: execution
1987
2190
  - name: platform_sdd_id
1988
2191
  type: string
1989
2192
  nullable: true
1990
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
1991
2195
  - name: notation
1992
2196
  type: string
1993
2197
  nullable: true
1994
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
1995
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."
1996
2201
  foreign_keys:
1997
2202
  - column: domain_id
@@ -2001,6 +2206,7 @@ catalogues:
2001
2206
  notation: enums.model_notation
2002
2207
  entities:
2003
2208
  primary_key: id
2209
+ source_of_truth: structure
2004
2210
  columns:
2005
2211
  - name: id
2006
2212
  type: string
@@ -2038,14 +2244,17 @@ catalogues:
2038
2244
  type: string
2039
2245
  nullable: true
2040
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
2041
2248
  - name: source_sdd_id
2042
2249
  type: string
2043
2250
  nullable: true
2044
2251
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2252
+ source_of_truth: execution
2045
2253
  - name: platform_sdd_id
2046
2254
  type: string
2047
2255
  nullable: true
2048
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
2049
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."
2050
2259
  foreign_keys:
2051
2260
  - column: domain_id
@@ -2061,6 +2270,7 @@ catalogues:
2061
2270
  persistence_kind: enums.persistence_kind
2062
2271
  repo_capability:
2063
2272
  primary_key: id
2273
+ source_of_truth: derived
2064
2274
  columns:
2065
2275
  - name: id
2066
2276
  type: string
@@ -2081,6 +2291,7 @@ catalogues:
2081
2291
  nullable: false
2082
2292
  repo_capability_exemption:
2083
2293
  primary_key: id
2294
+ source_of_truth: declaration
2084
2295
  columns:
2085
2296
  - name: id
2086
2297
  type: string
@@ -2107,6 +2318,7 @@ catalogues:
2107
2318
  reason: enums.capability_exemption_reason
2108
2319
  service_capability_exemption:
2109
2320
  primary_key: id
2321
+ source_of_truth: declaration
2110
2322
  columns:
2111
2323
  - name: id
2112
2324
  type: string
@@ -2133,6 +2345,7 @@ catalogues:
2133
2345
  reason: enums.service_capability_exemption_reason
2134
2346
  external_system_exemption:
2135
2347
  primary_key: id
2348
+ source_of_truth: declaration
2136
2349
  columns:
2137
2350
  - name: id
2138
2351
  type: string
@@ -2159,6 +2372,7 @@ catalogues:
2159
2372
  reason: enums.external_system_exemption_reason
2160
2373
  repo_contract:
2161
2374
  primary_key: id
2375
+ source_of_truth: derived
2162
2376
  columns:
2163
2377
  - name: id
2164
2378
  type: string
@@ -2182,6 +2396,7 @@ catalogues:
2182
2396
  - integration-product
2183
2397
  product_capability:
2184
2398
  primary_key: id
2399
+ source_of_truth: structure
2185
2400
  columns:
2186
2401
  - name: id
2187
2402
  type: string
@@ -2200,6 +2415,9 @@ catalogues:
2200
2415
  type: string
2201
2416
  nullable: true
2202
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
2203
2421
  foreign_keys:
2204
2422
  - column: product_id
2205
2423
  references: products.id
@@ -2212,6 +2430,7 @@ catalogues:
2212
2430
  role: enums.consumption_role
2213
2431
  product_service:
2214
2432
  primary_key: id
2433
+ source_of_truth: structure
2215
2434
  columns:
2216
2435
  - name: id
2217
2436
  type: string
@@ -2231,6 +2450,9 @@ catalogues:
2231
2450
  nullable: true
2232
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."
2233
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
2234
2456
  foreign_keys:
2235
2457
  - column: product_id
2236
2458
  references: products.id
@@ -2244,6 +2466,7 @@ catalogues:
2244
2466
  required_stability: enums.required_stability
2245
2467
  service_contract:
2246
2468
  primary_key: id
2469
+ source_of_truth: structure
2247
2470
  columns:
2248
2471
  - name: id
2249
2472
  type: string
@@ -2260,6 +2483,10 @@ catalogues:
2260
2483
  nullable: false
2261
2484
  description: exposes | consumes.
2262
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
2263
2490
  foreign_keys:
2264
2491
  - column: service_id
2265
2492
  references: services.id
@@ -2273,6 +2500,7 @@ catalogues:
2273
2500
  role: enums.contract_participation
2274
2501
  service_event:
2275
2502
  primary_key: id
2503
+ source_of_truth: structure
2276
2504
  columns:
2277
2505
  - name: id
2278
2506
  type: string
@@ -2289,6 +2517,10 @@ catalogues:
2289
2517
  nullable: false
2290
2518
  description: publishes | consumes.
2291
2519
  description: "Edge: service publishes or consumes event."
2520
+ natural_key:
2521
+ - service_id
2522
+ - event_id
2523
+ - role
2292
2524
  foreign_keys:
2293
2525
  - column: service_id
2294
2526
  references: services.id
@@ -2300,6 +2532,7 @@ catalogues:
2300
2532
  role: enums.event_participation
2301
2533
  service_entity:
2302
2534
  primary_key: id
2535
+ source_of_truth: structure
2303
2536
  columns:
2304
2537
  - name: id
2305
2538
  type: string
@@ -2319,15 +2552,22 @@ catalogues:
2319
2552
  type: string
2320
2553
  nullable: true
2321
2554
  description: Source markdown path or feature-grounding row that produced the edge. Audit aid.
2555
+ source_of_truth: derived
2322
2556
  - name: source_sdd_id
2323
2557
  type: string
2324
2558
  nullable: true
2325
2559
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2560
+ source_of_truth: execution
2326
2561
  - name: platform_sdd_id
2327
2562
  type: string
2328
2563
  nullable: true
2329
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
2330
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
2331
2571
  foreign_keys:
2332
2572
  - column: service_id
2333
2573
  references: services.id
@@ -2339,6 +2579,7 @@ catalogues:
2339
2579
  relation: enums.service_entity_relation
2340
2580
  capability_feature:
2341
2581
  primary_key: id
2582
+ source_of_truth: structure
2342
2583
  columns:
2343
2584
  - name: id
2344
2585
  type: string
@@ -2350,6 +2591,9 @@ catalogues:
2350
2591
  type: string
2351
2592
  nullable: false
2352
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
2353
2597
  foreign_keys:
2354
2598
  - column: capability_id
2355
2599
  references: capabilities.id
@@ -2359,6 +2603,7 @@ catalogues:
2359
2603
  nullable: false
2360
2604
  capability_service:
2361
2605
  primary_key: id
2606
+ source_of_truth: structure
2362
2607
  columns:
2363
2608
  - name: id
2364
2609
  type: string
@@ -2389,8 +2634,13 @@ catalogues:
2389
2634
  type: string
2390
2635
  nullable: true
2391
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
2392
2638
  description: |
2393
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
2394
2644
  foreign_keys:
2395
2645
  - column: capability_id
2396
2646
  references: capabilities.id
@@ -2408,6 +2658,7 @@ catalogues:
2408
2658
  interaction_pattern: enums.interaction_pattern
2409
2659
  capability_event:
2410
2660
  primary_key: id
2661
+ source_of_truth: structure
2411
2662
  columns:
2412
2663
  - name: id
2413
2664
  type: string
@@ -2426,6 +2677,7 @@ catalogues:
2426
2677
  type: string
2427
2678
  nullable: false
2428
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
2429
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)."
2430
2682
  foreign_keys:
2431
2683
  - column: capability_id
@@ -2439,6 +2691,7 @@ catalogues:
2439
2691
  source: enums.edge_source
2440
2692
  capability_contract:
2441
2693
  primary_key: id
2694
+ source_of_truth: structure
2442
2695
  columns:
2443
2696
  - name: id
2444
2697
  type: string
@@ -2453,7 +2706,11 @@ catalogues:
2453
2706
  type: string
2454
2707
  nullable: false
2455
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
2456
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
2457
2714
  foreign_keys:
2458
2715
  - column: capability_id
2459
2716
  references: capabilities.id
@@ -2463,6 +2720,7 @@ catalogues:
2463
2720
  nullable: false
2464
2721
  journey_feature:
2465
2722
  primary_key: id
2723
+ source_of_truth: structure
2466
2724
  columns:
2467
2725
  - name: id
2468
2726
  type: string
@@ -2474,6 +2732,9 @@ catalogues:
2474
2732
  type: string
2475
2733
  nullable: false
2476
2734
  description: "Edge: journey touches features. Parsed from Related features bullet."
2735
+ natural_key:
2736
+ - journey_id
2737
+ - feature_id
2477
2738
  foreign_keys:
2478
2739
  - column: journey_id
2479
2740
  references: user_journeys.id
@@ -2483,6 +2744,7 @@ catalogues:
2483
2744
  nullable: false
2484
2745
  persona_feature:
2485
2746
  primary_key: id
2747
+ source_of_truth: structure
2486
2748
  columns:
2487
2749
  - name: id
2488
2750
  type: string
@@ -2494,6 +2756,9 @@ catalogues:
2494
2756
  type: string
2495
2757
  nullable: false
2496
2758
  description: "Edge: persona uses features. Parsed from Related features bullet."
2759
+ natural_key:
2760
+ - persona_id
2761
+ - feature_id
2497
2762
  foreign_keys:
2498
2763
  - column: persona_id
2499
2764
  references: personas.id
@@ -2503,6 +2768,7 @@ catalogues:
2503
2768
  nullable: false
2504
2769
  feature_service:
2505
2770
  primary_key: id
2771
+ source_of_truth: structure
2506
2772
  columns:
2507
2773
  - name: id
2508
2774
  type: string
@@ -2514,6 +2780,9 @@ catalogues:
2514
2780
  type: string
2515
2781
  nullable: false
2516
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
2517
2786
  foreign_keys:
2518
2787
  - column: feature_id
2519
2788
  references: features.id
@@ -2523,6 +2792,7 @@ catalogues:
2523
2792
  nullable: false
2524
2793
  feature_event:
2525
2794
  primary_key: id
2795
+ source_of_truth: derived
2526
2796
  columns:
2527
2797
  - name: id
2528
2798
  type: string
@@ -2553,6 +2823,7 @@ catalogues:
2553
2823
  role: enums.event_participation
2554
2824
  feature_repo:
2555
2825
  primary_key: id
2826
+ source_of_truth: derived
2556
2827
  columns:
2557
2828
  - name: id
2558
2829
  type: string
@@ -2573,6 +2844,7 @@ catalogues:
2573
2844
  nullable: false
2574
2845
  feature_contract:
2575
2846
  primary_key: id
2847
+ source_of_truth: derived
2576
2848
  columns:
2577
2849
  - name: id
2578
2850
  type: string
@@ -2601,6 +2873,7 @@ catalogues:
2601
2873
  derivation_path: enums.feature_contract_derivation_path
2602
2874
  feature_subscription_channels:
2603
2875
  primary_key: id
2876
+ source_of_truth: structure
2604
2877
  columns:
2605
2878
  - name: id
2606
2879
  type: string
@@ -2621,6 +2894,7 @@ catalogues:
2621
2894
  type: string
2622
2895
  nullable: true
2623
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
2624
2898
  - name: payload_ref
2625
2899
  type: string
2626
2900
  nullable: true
@@ -2629,10 +2903,12 @@ catalogues:
2629
2903
  type: string
2630
2904
  nullable: true
2631
2905
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
2906
+ source_of_truth: execution
2632
2907
  - name: platform_sdd_id
2633
2908
  type: string
2634
2909
  nullable: true
2635
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
2636
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."
2637
2913
  foreign_keys:
2638
2914
  - column: feature_id
@@ -2642,6 +2918,7 @@ catalogues:
2642
2918
  transport: enums.subscription_channel_transport
2643
2919
  capability_domain_model:
2644
2920
  primary_key: id
2921
+ source_of_truth: structure
2645
2922
  columns:
2646
2923
  - name: id
2647
2924
  type: string
@@ -2657,7 +2934,11 @@ catalogues:
2657
2934
  type: string
2658
2935
  nullable: false
2659
2936
  description: traceability-manifest | inferred.
2937
+ source_of_truth: derived
2660
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
2661
2942
  foreign_keys:
2662
2943
  - column: capability_id
2663
2944
  references: capabilities.id
@@ -2669,6 +2950,7 @@ catalogues:
2669
2950
  source: enums.capability_domain_model_source
2670
2951
  feature_domain_model:
2671
2952
  primary_key: id
2953
+ source_of_truth: derived
2672
2954
  columns:
2673
2955
  - name: id
2674
2956
  type: string
@@ -2694,6 +2976,7 @@ catalogues:
2694
2976
  nullable: false
2695
2977
  persona_journey:
2696
2978
  primary_key: id
2979
+ source_of_truth: structure
2697
2980
  columns:
2698
2981
  - name: id
2699
2982
  type: string
@@ -2709,6 +2992,10 @@ catalogues:
2709
2992
  nullable: false
2710
2993
  description: primary | handoff | supporting.
2711
2994
  description: "Edge: persona participates in journey. Roles: primary | handoff | supporting."
2995
+ natural_key:
2996
+ - persona_id
2997
+ - journey_id
2998
+ - role
2712
2999
  foreign_keys:
2713
3000
  - column: persona_id
2714
3001
  references: personas.id
@@ -2720,6 +3007,7 @@ catalogues:
2720
3007
  role: enums.journey_participation
2721
3008
  persona_c4system:
2722
3009
  primary_key: id
3010
+ source_of_truth: structure
2723
3011
  columns:
2724
3012
  - name: id
2725
3013
  type: string
@@ -2736,6 +3024,9 @@ catalogues:
2736
3024
  nullable: true
2737
3025
  description: Optional interaction label from the Rel(...) line, e.g. 'Web browser' / 'Mobile app'.
2738
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
2739
3030
  foreign_keys:
2740
3031
  - column: persona_id
2741
3032
  references: personas.id
@@ -2745,6 +3036,7 @@ catalogues:
2745
3036
  nullable: false
2746
3037
  persona_container:
2747
3038
  primary_key: id
3039
+ source_of_truth: structure
2748
3040
  columns:
2749
3041
  - name: id
2750
3042
  type: string
@@ -2762,6 +3054,9 @@ catalogues:
2762
3054
  description: Optional interaction label from the Rel(...) line. May hold multiple '; '-joined labels.
2763
3055
  description: |
2764
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
2765
3060
  foreign_keys:
2766
3061
  - column: persona_id
2767
3062
  references: personas.id
@@ -2771,6 +3066,7 @@ catalogues:
2771
3066
  nullable: false
2772
3067
  system_external_dependency:
2773
3068
  primary_key: id
3069
+ source_of_truth: structure
2774
3070
  columns:
2775
3071
  - name: id
2776
3072
  type: string
@@ -2791,6 +3087,9 @@ catalogues:
2791
3087
  nullable: true
2792
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.
2793
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
2794
3093
  foreign_keys:
2795
3094
  - column: c4_system_id
2796
3095
  references: c4_systems.id
@@ -2803,6 +3102,7 @@ catalogues:
2803
3102
  nullable: true
2804
3103
  container_dependency:
2805
3104
  primary_key: id
3105
+ source_of_truth: structure
2806
3106
  columns:
2807
3107
  - name: id
2808
3108
  type: string
@@ -2822,12 +3122,17 @@ catalogues:
2822
3122
  type: string
2823
3123
  nullable: true
2824
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
2825
3126
  - name: platform_sdd_id
2826
3127
  type: string
2827
3128
  nullable: true
2828
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
2829
3131
  description: |
2830
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
2831
3136
  foreign_keys:
2832
3137
  - column: from_container_id
2833
3138
  references: c4_containers.id
@@ -2837,6 +3142,7 @@ catalogues:
2837
3142
  nullable: false
2838
3143
  system_system_dependency:
2839
3144
  primary_key: id
3145
+ source_of_truth: derived
2840
3146
  columns:
2841
3147
  - name: id
2842
3148
  type: string
@@ -2856,10 +3162,12 @@ catalogues:
2856
3162
  type: string
2857
3163
  nullable: true
2858
3164
  description: SDD whose diagram declared the originating reference. Populated by the aggregator.
3165
+ source_of_truth: execution
2859
3166
  - name: platform_sdd_id
2860
3167
  type: string
2861
3168
  nullable: true
2862
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
2863
3171
  description: |
2864
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.
2865
3173
  foreign_keys:
@@ -2871,6 +3179,7 @@ catalogues:
2871
3179
  nullable: false
2872
3180
  c4_container_entity:
2873
3181
  primary_key: id
3182
+ source_of_truth: derived
2874
3183
  columns:
2875
3184
  - name: id
2876
3185
  type: string
@@ -2889,10 +3198,12 @@ catalogues:
2889
3198
  - name: source_sdd_id
2890
3199
  type: string
2891
3200
  nullable: true
3201
+ source_of_truth: execution
2892
3202
  - name: platform_sdd_id
2893
3203
  type: string
2894
3204
  nullable: true
2895
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
2896
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)."
2897
3208
  foreign_keys:
2898
3209
  - column: container_id
@@ -2903,6 +3214,7 @@ catalogues:
2903
3214
  nullable: false
2904
3215
  c4_system_entity:
2905
3216
  primary_key: id
3217
+ source_of_truth: derived
2906
3218
  columns:
2907
3219
  - name: id
2908
3220
  type: string
@@ -2921,10 +3233,12 @@ catalogues:
2921
3233
  - name: source_sdd_id
2922
3234
  type: string
2923
3235
  nullable: true
3236
+ source_of_truth: execution
2924
3237
  - name: platform_sdd_id
2925
3238
  type: string
2926
3239
  nullable: true
2927
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
2928
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)."
2929
3243
  foreign_keys:
2930
3244
  - column: system_id
@@ -2935,6 +3249,7 @@ catalogues:
2935
3249
  nullable: false
2936
3250
  capability_adr:
2937
3251
  primary_key: id
3252
+ source_of_truth: structure
2938
3253
  columns:
2939
3254
  - name: id
2940
3255
  type: string
@@ -2949,7 +3264,11 @@ catalogues:
2949
3264
  type: string
2950
3265
  nullable: false
2951
3266
  description: spec | high | medium.
3267
+ source_of_truth: derived
2952
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
2953
3272
  foreign_keys:
2954
3273
  - column: capability_id
2955
3274
  references: capabilities.id
@@ -2961,6 +3280,7 @@ catalogues:
2961
3280
  confidence: enums.capability_adr_confidence
2962
3281
  adr_supersedes:
2963
3282
  primary_key: id
3283
+ source_of_truth: decision
2964
3284
  columns:
2965
3285
  - name: id
2966
3286
  type: string
@@ -2981,6 +3301,7 @@ catalogues:
2981
3301
  nullable: false
2982
3302
  product_platform_dependencies:
2983
3303
  primary_key: id
3304
+ source_of_truth: structure
2984
3305
  columns:
2985
3306
  - name: id
2986
3307
  type: string
@@ -3026,14 +3347,17 @@ catalogues:
3026
3347
  type: string
3027
3348
  nullable: true
3028
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
3029
3351
  - name: source_sdd_id
3030
3352
  type: string
3031
3353
  nullable: true
3032
3354
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3355
+ source_of_truth: execution
3033
3356
  - name: platform_sdd_id
3034
3357
  type: string
3035
3358
  nullable: true
3036
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
3037
3361
  description: |
3038
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.
3039
3363
  foreign_keys:
@@ -3054,6 +3378,7 @@ catalogues:
3054
3378
  contract_type: enums.dependency_contract_type
3055
3379
  cross_sdd_platform_capability:
3056
3380
  primary_key: id
3381
+ source_of_truth: derived
3057
3382
  columns:
3058
3383
  - name: id
3059
3384
  type: string
@@ -3071,6 +3396,7 @@ catalogues:
3071
3396
  type: string
3072
3397
  nullable: false
3073
3398
  description: SDD slug of the platform side that owns the resolved capability.
3399
+ source_of_truth: execution
3074
3400
  - name: platform_capability_id
3075
3401
  type: string
3076
3402
  nullable: false
@@ -3096,6 +3422,7 @@ catalogues:
3096
3422
  external: true
3097
3423
  application_data_plane_bindings:
3098
3424
  primary_key: id
3425
+ source_of_truth: declaration
3099
3426
  columns:
3100
3427
  - name: id
3101
3428
  type: string
@@ -3113,6 +3440,7 @@ catalogues:
3113
3440
  type: string
3114
3441
  nullable: false
3115
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
3116
3444
  - name: locality
3117
3445
  type: string
3118
3446
  nullable: true
@@ -3137,10 +3465,12 @@ catalogues:
3137
3465
  type: string
3138
3466
  nullable: true
3139
3467
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3468
+ source_of_truth: execution
3140
3469
  - name: platform_sdd_id
3141
3470
  type: string
3142
3471
  nullable: true
3143
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
3144
3474
  description: |
3145
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.
3146
3476
  foreign_keys:
@@ -3153,6 +3483,7 @@ catalogues:
3153
3483
  locality: enums.data_plane_locality
3154
3484
  application_data_plane_deviations:
3155
3485
  primary_key: id
3486
+ source_of_truth: declaration
3156
3487
  columns:
3157
3488
  - name: id
3158
3489
  type: string
@@ -3174,10 +3505,12 @@ catalogues:
3174
3505
  type: string
3175
3506
  nullable: true
3176
3507
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3508
+ source_of_truth: execution
3177
3509
  - name: platform_sdd_id
3178
3510
  type: string
3179
3511
  nullable: true
3180
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
3181
3514
  description: |
3182
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.
3183
3516
  foreign_keys:
@@ -3188,6 +3521,7 @@ catalogues:
3188
3521
  expectation: enums.data_plane_pattern
3189
3522
  application_conformance_coverage:
3190
3523
  primary_key: id
3524
+ source_of_truth: declaration
3191
3525
  columns:
3192
3526
  - name: id
3193
3527
  type: string
@@ -3205,6 +3539,7 @@ catalogues:
3205
3539
  type: string
3206
3540
  nullable: false
3207
3541
  description: covered (the product's suite exercises it) | deviated (deliberately not covered, with a rationale).
3542
+ source_of_truth: derived
3208
3543
  - name: rationale
3209
3544
  type: string
3210
3545
  nullable: true
@@ -3213,10 +3548,12 @@ catalogues:
3213
3548
  type: string
3214
3549
  nullable: true
3215
3550
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3551
+ source_of_truth: execution
3216
3552
  - name: platform_sdd_id
3217
3553
  type: string
3218
3554
  nullable: true
3219
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
3220
3557
  description: |
3221
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.
3222
3559
  foreign_keys:
@@ -3225,6 +3562,7 @@ catalogues:
3225
3562
  nullable: false
3226
3563
  screens:
3227
3564
  primary_key: id
3565
+ source_of_truth: declaration
3228
3566
  columns:
3229
3567
  - name: id
3230
3568
  type: string
@@ -3250,6 +3588,7 @@ catalogues:
3250
3588
  type: string
3251
3589
  nullable: false
3252
3590
  description: screen-spec (forward) | screen-extraction (reverse).
3591
+ source_of_truth: derived
3253
3592
  - name: domain
3254
3593
  type: string
3255
3594
  nullable: true
@@ -3266,14 +3605,17 @@ catalogues:
3266
3605
  type: string
3267
3606
  nullable: true
3268
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
3269
3609
  - name: source_sdd_id
3270
3610
  type: string
3271
3611
  nullable: true
3272
3612
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3613
+ source_of_truth: execution
3273
3614
  - name: platform_sdd_id
3274
3615
  type: string
3275
3616
  nullable: true
3276
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
3277
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."
3278
3620
  foreign_keys:
3279
3621
  - column: product_id
@@ -3283,6 +3625,7 @@ catalogues:
3283
3625
  status: enums.artefact_maturity
3284
3626
  ui_components:
3285
3627
  primary_key: id
3628
+ source_of_truth: derived
3286
3629
  columns:
3287
3630
  - name: id
3288
3631
  type: string
@@ -3308,10 +3651,12 @@ catalogues:
3308
3651
  type: string
3309
3652
  nullable: true
3310
3653
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3654
+ source_of_truth: execution
3311
3655
  - name: platform_sdd_id
3312
3656
  type: string
3313
3657
  nullable: true
3314
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
3315
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."
3316
3661
  foreign_keys:
3317
3662
  - column: product_id
@@ -3321,6 +3666,7 @@ catalogues:
3321
3666
  kind: enums.ui_component_kind
3322
3667
  screen_component:
3323
3668
  primary_key: id
3669
+ source_of_truth: derived
3324
3670
  columns:
3325
3671
  - name: id
3326
3672
  type: string
@@ -3336,10 +3682,12 @@ catalogues:
3336
3682
  type: string
3337
3683
  nullable: true
3338
3684
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3685
+ source_of_truth: execution
3339
3686
  - name: platform_sdd_id
3340
3687
  type: string
3341
3688
  nullable: true
3342
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
3343
3691
  description: "Edge: screen composes a UI component. Parsed from the screen-spec ```openui-lang block's component references (per M-ADR 0166)."
3344
3692
  foreign_keys:
3345
3693
  - column: screen_id
@@ -3350,6 +3698,7 @@ catalogues:
3350
3698
  nullable: false
3351
3699
  screen_feature:
3352
3700
  primary_key: id
3701
+ source_of_truth: declaration
3353
3702
  columns:
3354
3703
  - name: id
3355
3704
  type: string
@@ -3365,10 +3714,12 @@ catalogues:
3365
3714
  type: string
3366
3715
  nullable: true
3367
3716
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3717
+ source_of_truth: execution
3368
3718
  - name: platform_sdd_id
3369
3719
  type: string
3370
3720
  nullable: true
3371
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
3372
3723
  description: "Edge: screen realises a feature (traceability). Forward: `realises:` frontmatter on the screen-spec. Reverse: route → feature mapping. Per M-ADR 0166."
3373
3724
  foreign_keys:
3374
3725
  - column: screen_id
@@ -3382,6 +3733,7 @@ catalogues:
3382
3733
  - integration-product
3383
3734
  persona_screen:
3384
3735
  primary_key: id
3736
+ source_of_truth: declaration
3385
3737
  columns:
3386
3738
  - name: id
3387
3739
  type: string
@@ -3397,10 +3749,12 @@ catalogues:
3397
3749
  type: string
3398
3750
  nullable: true
3399
3751
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3752
+ source_of_truth: execution
3400
3753
  - name: platform_sdd_id
3401
3754
  type: string
3402
3755
  nullable: true
3403
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
3404
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."
3405
3759
  foreign_keys:
3406
3760
  - column: persona_id
@@ -3411,6 +3765,7 @@ catalogues:
3411
3765
  nullable: false
3412
3766
  screen_action:
3413
3767
  primary_key: id
3768
+ source_of_truth: derived
3414
3769
  columns:
3415
3770
  - name: id
3416
3771
  type: string
@@ -3431,10 +3786,12 @@ catalogues:
3431
3786
  type: string
3432
3787
  nullable: true
3433
3788
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3789
+ source_of_truth: execution
3434
3790
  - name: platform_sdd_id
3435
3791
  type: string
3436
3792
  nullable: true
3437
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
3438
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."
3439
3796
  foreign_keys:
3440
3797
  - column: screen_id
@@ -3446,6 +3803,7 @@ catalogues:
3446
3803
  external: true
3447
3804
  conformance_finding:
3448
3805
  primary_key: id
3806
+ source_of_truth: evidence
3449
3807
  columns:
3450
3808
  - name: id
3451
3809
  type: string
@@ -3505,10 +3863,12 @@ catalogues:
3505
3863
  type: string
3506
3864
  nullable: true
3507
3865
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
3866
+ source_of_truth: execution
3508
3867
  - name: platform_sdd_id
3509
3868
  type: string
3510
3869
  nullable: true
3511
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
3512
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."
3513
3873
  column_enums:
3514
3874
  target: enums.conformance_target
@@ -3516,6 +3876,7 @@ catalogues:
3516
3876
  lifecycle: enums.implementation_lifecycle
3517
3877
  quality_scores:
3518
3878
  primary_key: id
3879
+ source_of_truth: evidence
3519
3880
  columns:
3520
3881
  - name: id
3521
3882
  type: string
@@ -3569,6 +3930,10 @@ catalogues:
3569
3930
  type: string
3570
3931
  nullable: true
3571
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."
3572
3937
  - name: staleness_basis
3573
3938
  type: string
3574
3939
  nullable: false
@@ -3621,10 +3986,12 @@ catalogues:
3621
3986
  type: string
3622
3987
  nullable: true
3623
3988
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134; left empty by per-SDD builders.
3989
+ source_of_truth: execution
3624
3990
  - name: platform_sdd_id
3625
3991
  type: string
3626
3992
  nullable: true
3627
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
3628
3995
  description: |
3629
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.
3630
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.
@@ -3637,6 +4004,7 @@ catalogues:
3637
4004
  nullable: true
3638
4005
  quality_score_dimensions:
3639
4006
  primary_key: id
4007
+ source_of_truth: evidence
3640
4008
  columns:
3641
4009
  - name: id
3642
4010
  type: string
@@ -3674,10 +4042,12 @@ catalogues:
3674
4042
  type: string
3675
4043
  nullable: true
3676
4044
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4045
+ source_of_truth: execution
3677
4046
  - name: platform_sdd_id
3678
4047
  type: string
3679
4048
  nullable: true
3680
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
3681
4051
  description: |
3682
4052
  One row per (target, rubric, dimension) — the per-dimension detail behind a `quality_scores` row, per M-ADR 0205 §4.5.
3683
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.
@@ -3687,6 +4057,7 @@ catalogues:
3687
4057
  nullable: false
3688
4058
  scaffolds:
3689
4059
  primary_key: id
4060
+ source_of_truth: declaration
3690
4061
  columns:
3691
4062
  - name: id
3692
4063
  type: string
@@ -3704,6 +4075,7 @@ catalogues:
3704
4075
  type: string
3705
4076
  nullable: false
3706
4077
  description: Repo-relative path of the manifest this row derives from, e.g. orchestration/scaffolds/payments-settlement.yaml.
4078
+ source_of_truth: derived
3707
4079
  - name: corpus_ref
3708
4080
  type: string
3709
4081
  nullable: false
@@ -3720,10 +4092,12 @@ catalogues:
3720
4092
  type: string
3721
4093
  nullable: true
3722
4094
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134; left empty by per-SDD builders.
4095
+ source_of_truth: execution
3723
4096
  - name: platform_sdd_id
3724
4097
  type: string
3725
4098
  nullable: true
3726
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
3727
4101
  description: |
3728
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).
3729
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.
@@ -3736,6 +4110,7 @@ catalogues:
3736
4110
  status: enums.scaffold_status
3737
4111
  scaffold_items:
3738
4112
  primary_key: id
4113
+ source_of_truth: declaration
3739
4114
  columns:
3740
4115
  - name: id
3741
4116
  type: string
@@ -3769,14 +4144,17 @@ catalogues:
3769
4144
  type: string
3770
4145
  nullable: false
3771
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
3772
4148
  - name: source_sdd_id
3773
4149
  type: string
3774
4150
  nullable: true
3775
4151
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4152
+ source_of_truth: execution
3776
4153
  - name: platform_sdd_id
3777
4154
  type: string
3778
4155
  nullable: true
3779
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
3780
4158
  description: |
3781
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.
3782
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.
@@ -3790,6 +4168,7 @@ catalogues:
3790
4168
  state: enums.scaffold_item_state
3791
4169
  implementations:
3792
4170
  primary_key: id
4171
+ source_of_truth: declaration
3793
4172
  columns:
3794
4173
  - name: id
3795
4174
  type: string
@@ -3811,17 +4190,21 @@ catalogues:
3811
4190
  type: string
3812
4191
  nullable: false
3813
4192
  description: Path of the binding file, relative to the SDD root.
4193
+ source_of_truth: derived
3814
4194
  - name: source_sdd_id
3815
4195
  type: string
3816
4196
  nullable: true
3817
4197
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4198
+ source_of_truth: execution
3818
4199
  - name: platform_sdd_id
3819
4200
  type: string
3820
4201
  nullable: true
3821
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
3822
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."
3823
4205
  implementation_members:
3824
4206
  primary_key: id
4207
+ source_of_truth: declaration
3825
4208
  columns:
3826
4209
  - name: id
3827
4210
  type: string
@@ -3852,10 +4235,12 @@ catalogues:
3852
4235
  type: string
3853
4236
  nullable: true
3854
4237
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4238
+ source_of_truth: execution
3855
4239
  - name: platform_sdd_id
3856
4240
  type: string
3857
4241
  nullable: true
3858
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
3859
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."
3860
4245
  foreign_keys:
3861
4246
  - column: implementation_id
@@ -3870,6 +4255,7 @@ catalogues:
3870
4255
  evidence_direction: enums.evidence_direction
3871
4256
  snapshots:
3872
4257
  primary_key: id
4258
+ source_of_truth: evidence
3873
4259
  columns:
3874
4260
  - name: id
3875
4261
  type: string
@@ -3894,10 +4280,12 @@ catalogues:
3894
4280
  type: string
3895
4281
  nullable: true
3896
4282
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4283
+ source_of_truth: execution
3897
4284
  - name: platform_sdd_id
3898
4285
  type: string
3899
4286
  nullable: true
3900
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
3901
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.
3902
4290
  foreign_keys:
3903
4291
  - column: implementation_id
@@ -3908,6 +4296,7 @@ catalogues:
3908
4296
  nullable: true
3909
4297
  snapshot_members:
3910
4298
  primary_key: id
4299
+ source_of_truth: evidence
3911
4300
  columns:
3912
4301
  - name: id
3913
4302
  type: string
@@ -3939,10 +4328,12 @@ catalogues:
3939
4328
  type: string
3940
4329
  nullable: true
3941
4330
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4331
+ source_of_truth: execution
3942
4332
  - name: platform_sdd_id
3943
4333
  type: string
3944
4334
  nullable: true
3945
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
3946
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)."
3947
4338
  foreign_keys:
3948
4339
  - column: snapshot_id
@@ -3955,6 +4346,7 @@ catalogues:
3955
4346
  presence: enums.member_presence
3956
4347
  data_items:
3957
4348
  primary_key: id
4349
+ source_of_truth: structure
3958
4350
  columns:
3959
4351
  - name: id
3960
4352
  type: string
@@ -3978,13 +4370,16 @@ catalogues:
3978
4370
  type: string
3979
4371
  nullable: true
3980
4372
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4373
+ source_of_truth: execution
3981
4374
  - name: platform_sdd_id
3982
4375
  type: string
3983
4376
  nullable: true
3984
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
3985
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."
3986
4380
  integration_data_item:
3987
4381
  primary_key: id
4382
+ source_of_truth: evidence
3988
4383
  columns:
3989
4384
  - name: id
3990
4385
  type: string
@@ -4016,10 +4411,12 @@ catalogues:
4016
4411
  type: string
4017
4412
  nullable: true
4018
4413
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4414
+ source_of_truth: execution
4019
4415
  - name: platform_sdd_id
4020
4416
  type: string
4021
4417
  nullable: true
4022
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
4023
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."
4024
4421
  foreign_keys:
4025
4422
  - column: integration_id
@@ -4036,6 +4433,7 @@ catalogues:
4036
4433
  basis: enums.supply_basis
4037
4434
  feature_data_requirement:
4038
4435
  primary_key: id
4436
+ source_of_truth: structure
4039
4437
  columns:
4040
4438
  - name: id
4041
4439
  type: string
@@ -4059,15 +4457,21 @@ catalogues:
4059
4457
  type: string
4060
4458
  nullable: true
4061
4459
  description: Where the need is stated (path and line).
4460
+ source_of_truth: evidence
4062
4461
  - name: source_sdd_id
4063
4462
  type: string
4064
4463
  nullable: true
4065
4464
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4465
+ source_of_truth: execution
4066
4466
  - name: platform_sdd_id
4067
4467
  type: string
4068
4468
  nullable: true
4069
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
4070
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
4071
4475
  foreign_keys:
4072
4476
  - column: feature_id
4073
4477
  references: features.id
@@ -4082,6 +4486,7 @@ catalogues:
4082
4486
  necessity: enums.data_necessity
4083
4487
  feature_integration_support:
4084
4488
  primary_key: id
4489
+ source_of_truth: derived
4085
4490
  columns:
4086
4491
  - name: id
4087
4492
  type: string
@@ -4109,10 +4514,12 @@ catalogues:
4109
4514
  type: string
4110
4515
  nullable: true
4111
4516
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4517
+ source_of_truth: execution
4112
4518
  - name: platform_sdd_id
4113
4519
  type: string
4114
4520
  nullable: true
4115
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
4116
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."
4117
4524
  foreign_keys:
4118
4525
  - column: feature_id
@@ -4129,6 +4536,7 @@ catalogues:
4129
4536
  limiting_reason: enums.limiting_reason
4130
4537
  evidence_target_repo:
4131
4538
  primary_key: id
4539
+ source_of_truth: evidence
4132
4540
  columns:
4133
4541
  - name: id
4134
4542
  type: string
@@ -4146,10 +4554,12 @@ catalogues:
4146
4554
  type: string
4147
4555
  nullable: true
4148
4556
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4557
+ source_of_truth: execution
4149
4558
  - name: platform_sdd_id
4150
4559
  type: string
4151
4560
  nullable: true
4152
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
4153
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."
4154
4564
  foreign_keys:
4155
4565
  - column: repo_id
@@ -4158,6 +4568,7 @@ catalogues:
4158
4568
  external: true
4159
4569
  repo_dependency:
4160
4570
  primary_key: id
4571
+ source_of_truth: structure
4161
4572
  columns:
4162
4573
  - name: id
4163
4574
  type: string
@@ -4183,15 +4594,21 @@ catalogues:
4183
4594
  type: string
4184
4595
  nullable: false
4185
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
4186
4598
  - name: source_sdd_id
4187
4599
  type: string
4188
4600
  nullable: true
4189
4601
  description: Originating SDD slug. Populated by the aggregator per M-ADR 0134.
4602
+ source_of_truth: execution
4190
4603
  - name: platform_sdd_id
4191
4604
  type: string
4192
4605
  nullable: true
4193
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
4194
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
4195
4612
  foreign_keys:
4196
4613
  - column: from_repo_id
4197
4614
  references: repositories.id
@@ -4204,6 +4621,7 @@ catalogues:
4204
4621
  kind: enums.repo_dependency_kind
4205
4622
  requirements:
4206
4623
  primary_key: id
4624
+ source_of_truth: behaviour
4207
4625
  columns:
4208
4626
  - name: id
4209
4627
  type: string
@@ -4221,22 +4639,27 @@ catalogues:
4221
4639
  type: string
4222
4640
  nullable: false
4223
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
4224
4643
  - name: spec_path
4225
4644
  type: string
4226
4645
  nullable: false
4227
4646
  description: "The file that holds the requirement: the living spec, or the open change's delta."
4647
+ source_of_truth: derived
4228
4648
  - name: scenario_count
4229
4649
  type: integer
4230
4650
  nullable: false
4231
4651
  description: Scenarios under the requirement in that file.
4652
+ source_of_truth: derived
4232
4653
  - name: source_sdd_id
4233
4654
  type: string
4234
4655
  nullable: true
4235
4656
  description: Originating SDD (stamped at aggregation; empty in a per-SDD build).
4657
+ source_of_truth: execution
4236
4658
  - name: platform_sdd_id
4237
4659
  type: string
4238
4660
  nullable: true
4239
4661
  description: The platform SDD the row belongs to (stamped at aggregation).
4662
+ source_of_truth: execution
4240
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."
4241
4664
  foreign_keys:
4242
4665
  - column: feature_id
@@ -4246,6 +4669,7 @@ catalogues:
4246
4669
  stage: enums.requirement_stage
4247
4670
  requirement_lineage:
4248
4671
  primary_key: id
4672
+ source_of_truth: execution
4249
4673
  columns:
4250
4674
  - name: id
4251
4675
  type: string
@@ -4289,48 +4713,61 @@ catalogues:
4289
4713
  column_enums:
4290
4714
  change_kind: enums.requirement_change_kind
4291
4715
  operation: enums.requirement_operation
4292
- requirement_status:
4716
+ requirement_assertions:
4293
4717
  primary_key: id
4718
+ source_of_truth: evidence
4294
4719
  columns:
4295
4720
  - name: id
4296
4721
  type: string
4297
4722
  nullable: false
4298
- 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.
4299
4728
  - name: requirement_id
4300
4729
  type: string
4301
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
4302
4733
  - name: repo_id
4303
4734
  type: string
4304
4735
  nullable: false
4305
4736
  description: "The implementing repository: a work order's repository, or a repository a baseline was observed in."
4306
- - name: status
4737
+ - name: kind
4307
4738
  type: string
4308
4739
  nullable: false
4309
- description: Bound to requirement_status_value.
4740
+ description: Bound to requirement_assertion_kind.
4310
4741
  - name: basis
4311
4742
  type: string
4312
4743
  nullable: false
4313
- description: "The change that produced the status: its changes.id, <sdd_id>::<directory>."
4744
+ description: "The change that produced the evidence: its changes.id, <sdd_id>::<directory>."
4314
4745
  - name: source_sdd_id
4315
4746
  type: string
4316
4747
  nullable: true
4317
4748
  description: Originating SDD (stamped at aggregation; empty in a per-SDD build).
4749
+ source_of_truth: execution
4318
4750
  - name: platform_sdd_id
4319
4751
  type: string
4320
4752
  nullable: true
4321
4753
  description: The platform SDD the row belongs to (stamped at aggregation).
4322
- 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. Limitation: a requirement and repository hold one status. An agreed open change's status replaces the evidence about the revision that is live until the change archives, and evidence is not bound to the requirement revision it concerns."
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
4323
4759
  foreign_keys:
4324
- - column: requirement_id
4325
- references: requirements.id
4760
+ - column: revision_id
4761
+ references: requirement_revisions.id
4326
4762
  nullable: false
4327
4763
  - column: repo_id
4328
4764
  references: repositories.id
4329
4765
  nullable: false
4330
4766
  column_enums:
4331
- status: enums.requirement_status_value
4767
+ kind: enums.requirement_assertion_kind
4332
4768
  changes:
4333
4769
  primary_key: id
4770
+ source_of_truth: execution
4334
4771
  columns:
4335
4772
  - name: id
4336
4773
  type: string
@@ -4371,6 +4808,7 @@ catalogues:
4371
4808
  verdict: enums.judge_verdict
4372
4809
  change_work_order:
4373
4810
  primary_key: id
4811
+ source_of_truth: execution
4374
4812
  columns:
4375
4813
  - name: id
4376
4814
  type: string
@@ -4407,6 +4845,7 @@ catalogues:
4407
4845
  status: enums.work_order_status
4408
4846
  change_work_item:
4409
4847
  primary_key: id
4848
+ source_of_truth: execution
4410
4849
  columns:
4411
4850
  - name: id
4412
4851
  type: string
@@ -4439,6 +4878,7 @@ catalogues:
4439
4878
  nullable: false
4440
4879
  journey_requirement:
4441
4880
  primary_key: id
4881
+ source_of_truth: derived
4442
4882
  columns:
4443
4883
  - name: id
4444
4884
  type: string
@@ -4458,10 +4898,12 @@ catalogues:
4458
4898
  type: string
4459
4899
  nullable: true
4460
4900
  description: Originating SDD (stamped at aggregation; empty in a per-SDD build).
4901
+ source_of_truth: execution
4461
4902
  - name: platform_sdd_id
4462
4903
  type: string
4463
4904
  nullable: true
4464
4905
  description: The platform SDD the row belongs to (stamped at aggregation).
4906
+ source_of_truth: execution
4465
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."
4466
4908
  foreign_keys:
4467
4909
  - column: journey_id
@@ -4472,3 +4914,311 @@ catalogues:
4472
4914
  nullable: false
4473
4915
  column_enums:
4474
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