@sdd-method/sdd-cli 1.20.1 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/lib/catalogue/aggregate.d.ts +24 -0
  2. package/dist/lib/catalogue/aggregate.d.ts.map +1 -1
  3. package/dist/lib/catalogue/aggregate.js +100 -4
  4. package/dist/lib/catalogue/aggregate.js.map +1 -1
  5. package/dist/lib/catalogue/build.d.ts.map +1 -1
  6. package/dist/lib/catalogue/build.js +29 -0
  7. package/dist/lib/catalogue/build.js.map +1 -1
  8. package/dist/lib/catalogue/builders/capabilities.d.ts +12 -0
  9. package/dist/lib/catalogue/builders/capabilities.d.ts.map +1 -1
  10. package/dist/lib/catalogue/builders/capabilities.js +85 -6
  11. package/dist/lib/catalogue/builders/capabilities.js.map +1 -1
  12. package/dist/lib/catalogue/builders/capability-edges.d.ts.map +1 -1
  13. package/dist/lib/catalogue/builders/capability-edges.js +16 -1
  14. package/dist/lib/catalogue/builders/capability-edges.js.map +1 -1
  15. package/dist/lib/catalogue/builders/capability-spec.d.ts +14 -0
  16. package/dist/lib/catalogue/builders/capability-spec.d.ts.map +1 -1
  17. package/dist/lib/catalogue/builders/capability-spec.js +8 -5
  18. package/dist/lib/catalogue/builders/capability-spec.js.map +1 -1
  19. package/dist/lib/catalogue/builders/feature-grounding.d.ts +8 -0
  20. package/dist/lib/catalogue/builders/feature-grounding.d.ts.map +1 -1
  21. package/dist/lib/catalogue/builders/feature-grounding.js +6 -5
  22. package/dist/lib/catalogue/builders/feature-grounding.js.map +1 -1
  23. package/dist/lib/catalogue/canonical-schema.yaml +3084 -2324
  24. package/dist/lib/catalogue/ddl-generator.d.ts.map +1 -1
  25. package/dist/lib/catalogue/ddl-generator.js +22 -4
  26. package/dist/lib/catalogue/ddl-generator.js.map +1 -1
  27. package/dist/lib/catalogue/feature-repo-zero-resolution-summary.d.ts +20 -0
  28. package/dist/lib/catalogue/feature-repo-zero-resolution-summary.d.ts.map +1 -0
  29. package/dist/lib/catalogue/feature-repo-zero-resolution-summary.js +31 -0
  30. package/dist/lib/catalogue/feature-repo-zero-resolution-summary.js.map +1 -0
  31. package/dist/lib/catalogue/fk-validator.d.ts +20 -1
  32. package/dist/lib/catalogue/fk-validator.d.ts.map +1 -1
  33. package/dist/lib/catalogue/fk-validator.js +33 -3
  34. package/dist/lib/catalogue/fk-validator.js.map +1 -1
  35. package/dist/lib/catalogue/graph-projection.d.ts.map +1 -1
  36. package/dist/lib/catalogue/graph-projection.js +8 -1
  37. package/dist/lib/catalogue/graph-projection.js.map +1 -1
  38. package/dist/lib/catalogue/graph-run.d.ts.map +1 -1
  39. package/dist/lib/catalogue/graph-run.js +2 -1
  40. package/dist/lib/catalogue/graph-run.js.map +1 -1
  41. package/dist/lib/catalogue/population-checks.d.ts +45 -0
  42. package/dist/lib/catalogue/population-checks.d.ts.map +1 -0
  43. package/dist/lib/catalogue/population-checks.js +86 -0
  44. package/dist/lib/catalogue/population-checks.js.map +1 -0
  45. package/dist/lib/catalogue/rubric-coverage-map.yaml +507 -187
  46. package/dist/lib/catalogue/traceability-loader.d.ts +13 -0
  47. package/dist/lib/catalogue/traceability-loader.d.ts.map +1 -1
  48. package/dist/lib/catalogue/traceability-loader.js +12 -0
  49. package/dist/lib/catalogue/traceability-loader.js.map +1 -1
  50. package/package.json +1 -1
@@ -1,300 +1,620 @@
1
- # Rubric coverage map — the scoring disposition of every key the canonical
2
- # catalogue schema declares (enums included, so the extraction is mechanical).
3
- #
4
- # This file IS the coverage claim of catalogue-rubric-coverage.md, held against
5
- # the schema by the entity-scoring-coverage correspondence instance: a catalogue
6
- # class added to the schema without an entry here fails that instance, so
7
- # "no rubric" can never again be indistinguishable from "nobody asked".
8
- #
9
- # kind: entity | edge | finding | enum — declared here because the schema does
10
- # not carry it (68 of 69 tables share primary_key: id; the 24/45 split was
11
- # hand classification until this file). Consumers needing node-vs-edge kind
12
- # (graph projection, per-class predicates) read it from here.
13
- #
14
- # scoring: rubric | rubric-pair | predicate | scored-at-source | re-targeted
15
- # | not-applicable | derived-edge | not-built
16
- #
17
- # Relationship semantics (M-ADR 0206) — a SECOND vocabulary, distinct from
18
- # scoring. `scoring: derived-edge` is a SCORING-ATTRIBUTION claim (where the
19
- # quality judgment lives); it is NOT a build-provenance or semantics claim —
20
- # conflating the two misdiagnosed the mirror families once already. The
21
- # semantics are:
22
- # class: membership | dependency | realisation | lineage | traceability
23
- # | xref | attribute — what the relationship MEANS (for
24
- # humans and review)
25
- # impact_flow: toward-source | toward-target | both | none
26
- # — which endpoint RECEIVES impact (the machine-read token):
27
- # toward-source = a change at the target propagates to the source;
28
- # toward-target = a change at the source propagates to the target.
29
- # Declared PER RELATIONSHIP, not per class: declaration orientation
30
- # is a per-builder historical accident (composition exists both as
31
- # member->owner features.product_id and owner->member
32
- # screen_component).
33
- # impact_flow_by: { column: <name>, values: {...} } — the role-conditional
34
- # form, mutually exclusive with impact_flow; admitted for measured
35
- # need (today exactly one relationship: service_event).
36
- # Edge catalogues carry class + impact_flow at the top level; entity
37
- # catalogues carry a relationships: block keyed by FK column. `applications`
38
- # inherits `products`' declarations through the schema's YAML merge and is
39
- # deliberately not declared separately. Every parsed FK column and edge
40
- # catalogue MUST carry a declaration — check-relationship-classes.sh holds
41
- # this closed in both directions, and sdd-cli's vendored-map test mirrors it.
42
-
1
+ # GENERATED — DO NOT EDIT. This file is a projection of the authored model (M-ADR 0210 §4.6, flip 2):
2
+ # docs/method/foundations/schemas/catalogue-schema-meta.tql — coverage-meta + relationship-meta rows carry
3
+ # every entry here; the relations themselves (roles, players) are in catalogue-schema.tql.
4
+ # Regenerate: python3 orchestration/scripts/check-catalogue-schema-roundtrip.py --write
5
+ # Guard: python3 orchestration/scripts/check-catalogue-schema-roundtrip.py (any difference fails the build)
6
+ # Vocabularies, rulings and the reading of each token live in the authored .tql header, as comments.
43
7
  coverage:
44
- c4_system_kind: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
45
- c4_container_type: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
46
- service_type: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
47
- capability_exemption_reason: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
48
- service_capability_exemption_reason: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
49
- external_system_exemption_reason: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
50
- capability_service_role: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
8
+ c4_system_kind:
9
+ kind: enum
10
+ scoring: not-applicable
11
+ reason: closed vocabulary, not an artefact
12
+ c4_container_type:
13
+ kind: enum
14
+ scoring: not-applicable
15
+ reason: closed vocabulary, not an artefact
16
+ service_type:
17
+ kind: enum
18
+ scoring: not-applicable
19
+ reason: closed vocabulary, not an artefact
20
+ capability_exemption_reason:
21
+ kind: enum
22
+ scoring: not-applicable
23
+ reason: closed vocabulary, not an artefact
24
+ service_capability_exemption_reason:
25
+ kind: enum
26
+ scoring: not-applicable
27
+ reason: closed vocabulary, not an artefact
28
+ external_system_exemption_reason:
29
+ kind: enum
30
+ scoring: not-applicable
31
+ reason: closed vocabulary, not an artefact
32
+ capability_service_role:
33
+ kind: enum
34
+ scoring: not-applicable
35
+ reason: closed vocabulary, not an artefact
51
36
  domains:
52
37
  kind: entity
53
38
  scoring: not-applicable
54
- instrument: "directory discovery; only the README first paragraph is authored — nothing to score"
39
+ instrument: directory discovery; only the README first paragraph is authored — nothing to score
55
40
  products:
56
41
  kind: entity
57
42
  scoring: rubric-pair
58
- instrument: "forward: rubrics/product-definition-rubric.md · reverse: reverse/rubrics/product-synthesis-quality.md"
43
+ instrument: 'forward: rubrics/product-definition-rubric.md · reverse: reverse/rubrics/product-synthesis-quality.md'
59
44
  relationships:
60
- domain_id: { class: membership, impact_flow: toward-target }
45
+ domain_id:
46
+ class: membership
47
+ impact_flow: toward-target
61
48
  applications:
62
49
  kind: entity
63
50
  scoring: not-applicable
64
- instrument: "YAML-anchor view of products; scored there"
51
+ instrument: YAML-anchor view of products; scored there
65
52
  integrations:
66
53
  kind: entity
67
54
  scoring: rubric
68
- instrument: "rubrics/integration-sdd-quality-rubric.md"
55
+ instrument: rubrics/integration-sdd-quality-rubric.md
69
56
  relationships:
70
- domain_id: { class: membership, impact_flow: toward-target }
71
- parent_product_id: { class: membership, impact_flow: toward-target }
57
+ domain_id:
58
+ class: membership
59
+ impact_flow: toward-target
60
+ parent_product_id:
61
+ class: membership
62
+ impact_flow: toward-target
72
63
  integration_component:
73
64
  kind: entity
74
65
  scoring: rubric
75
- instrument: "scored at the owning integration via rubrics/integration-sdd-quality-rubric.md (manifest block)"
66
+ instrument: scored at the owning integration via rubrics/integration-sdd-quality-rubric.md (manifest block)
76
67
  relationships:
77
- integration_id: { class: membership, impact_flow: toward-target }
68
+ integration_id:
69
+ class: membership
70
+ impact_flow: toward-target
78
71
  adrs:
79
72
  kind: entity
80
73
  scoring: rubric-pair
81
- instrument: "forward: rubrics/adr-quality-rubric.md · reverse: reverse/rubrics/reverse-adr-quality.md"
74
+ instrument: 'forward: rubrics/adr-quality-rubric.md · reverse: reverse/rubrics/reverse-adr-quality.md'
82
75
  relationships:
83
- domain_id: { class: membership, impact_flow: toward-target }
84
- superseded_by_id: { class: lineage, impact_flow: none }
76
+ domain_id:
77
+ class: membership
78
+ impact_flow: toward-target
79
+ superseded_by_id:
80
+ class: lineage
81
+ impact_flow: none
85
82
  glossary_items:
86
83
  kind: entity
87
84
  scoring: rubric-pair
88
- instrument: "forward: rubrics/glossary-rubric.md · reverse: reverse/rubrics/reverse-glossary-quality.md"
85
+ instrument: 'forward: rubrics/glossary-rubric.md · reverse: reverse/rubrics/reverse-glossary-quality.md'
89
86
  relationships:
90
- owning_domain_id: { class: membership, impact_flow: toward-target }
91
- canonical_term_id: { class: xref, impact_flow: toward-source }
92
- glossary_xref: { kind: edge, class: xref, impact_flow: none, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
93
- entity_glossary: { kind: edge, class: xref, impact_flow: none, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
87
+ owning_domain_id:
88
+ class: membership
89
+ impact_flow: toward-target
90
+ canonical_term_id:
91
+ class: xref
92
+ impact_flow: toward-source
93
+ glossary_xref:
94
+ kind: edge
95
+ class: xref
96
+ impact_flow: none
97
+ scoring: derived-edge
98
+ reason: derived from entity rows or manifest blocks scored at the owning entity
99
+ entity_glossary:
100
+ kind: edge
101
+ class: xref
102
+ impact_flow: none
103
+ scoring: derived-edge
104
+ reason: derived from entity rows or manifest blocks scored at the owning entity
94
105
  services:
95
106
  kind: entity
96
107
  scoring: re-targeted
97
- instrument: "deliberately no dedicated rubric: boundary scored by rubrics/domain-architecture-rubric.md B5/B9 against the declared set (repo-config, input 3); source absence by scripts/check-repo-config-coverage.sh; reverse doc form by reverse/rubrics/repo-doc-quality.md"
108
+ instrument: 'deliberately no dedicated rubric: boundary scored by rubrics/domain-architecture-rubric.md B5/B9 against the declared set (repo-config, input 3); source absence by scripts/check-repo-config-coverage.sh; reverse doc form by reverse/rubrics/repo-doc-quality.md'
98
109
  relationships:
99
- product_id: { class: membership, impact_flow: toward-target }
100
- domain_id: { class: membership, impact_flow: toward-target }
101
- primary_repo_id: { class: realisation, impact_flow: both }
110
+ product_id:
111
+ class: membership
112
+ impact_flow: toward-target
113
+ domain_id:
114
+ class: membership
115
+ impact_flow: toward-target
116
+ primary_repo_id:
117
+ class: realisation
118
+ impact_flow: both
102
119
  capabilities:
103
120
  kind: entity
104
121
  scoring: rubric-pair
105
- instrument: "forward: rubrics/intent-quality-rubric.md · reverse: reverse/rubrics/reverse-capability-spec-quality.md"
122
+ instrument: 'forward: rubrics/intent-quality-rubric.md · reverse: reverse/rubrics/reverse-capability-spec-quality.md'
106
123
  relationships:
107
- domain_id: { class: membership, impact_flow: toward-target }
108
- parent_capability_id: { class: membership, impact_flow: toward-target }
124
+ domain_id:
125
+ class: membership
126
+ impact_flow: toward-target
127
+ parent_capability_id:
128
+ class: membership
129
+ impact_flow: toward-target
109
130
  feature_groups:
110
131
  kind: entity
111
132
  scoring: scored-at-source
112
- instrument: "grouping is authored inside capability/feature specs; scored there by rubrics/intent-quality-rubric.md"
133
+ instrument: grouping is authored inside capability/feature specs; scored there by rubrics/intent-quality-rubric.md
113
134
  relationships:
114
- product_id: { class: membership, impact_flow: toward-target }
115
- capability_id: { class: membership, impact_flow: toward-target }
116
- parent_group_id: { class: membership, impact_flow: toward-target }
135
+ product_id:
136
+ class: membership
137
+ impact_flow: toward-target
138
+ capability_id:
139
+ class: membership
140
+ impact_flow: toward-target
141
+ parent_group_id:
142
+ class: membership
143
+ impact_flow: toward-target
117
144
  features:
118
145
  kind: entity
119
146
  scoring: rubric-pair
120
- instrument: "forward: rubrics/intent-quality-rubric.md (feature tier) + rubrics/feature-grounding-rubric.md · reverse: reverse/rubrics/reverse-feature-grounding-quality.md"
147
+ instrument: 'forward: rubrics/intent-quality-rubric.md (feature tier) + rubrics/feature-grounding-rubric.md · reverse: reverse/rubrics/reverse-feature-grounding-quality.md'
121
148
  relationships:
122
- product_id: { class: membership, impact_flow: toward-target }
123
- capability_id: { class: membership, impact_flow: toward-target }
124
- parent_group_id: { class: membership, impact_flow: toward-target }
125
- parent_feature_id: { class: membership, impact_flow: toward-target }
149
+ product_id:
150
+ class: membership
151
+ impact_flow: toward-target
152
+ capability_id:
153
+ class: membership
154
+ impact_flow: toward-target
155
+ parent_group_id:
156
+ class: membership
157
+ impact_flow: toward-target
158
+ parent_feature_id:
159
+ class: membership
160
+ impact_flow: toward-target
126
161
  personas:
127
162
  kind: entity
128
163
  scoring: rubric-pair
129
- instrument: "forward: rubrics/persona-rubric.md · reverse: reverse/rubrics/reverse-persona-quality.md"
164
+ instrument: 'forward: rubrics/persona-rubric.md · reverse: reverse/rubrics/reverse-persona-quality.md'
130
165
  relationships:
131
- product_id: { class: membership, impact_flow: toward-target }
166
+ product_id:
167
+ class: membership
168
+ impact_flow: toward-target
132
169
  user_journeys:
133
170
  kind: entity
134
171
  scoring: rubric
135
- instrument: "rubrics/user-journey-rubric.md"
172
+ instrument: rubrics/user-journey-rubric.md
136
173
  relationships:
137
- product_id: { class: membership, impact_flow: toward-target }
174
+ product_id:
175
+ class: membership
176
+ impact_flow: toward-target
138
177
  contracts:
139
178
  kind: entity
140
179
  scoring: rubric-pair
141
- instrument: "forward: rubrics/contract-quality-rubric.md · reverse: reverse/rubrics/reverse-contract-quality.md"
180
+ instrument: 'forward: rubrics/contract-quality-rubric.md · reverse: reverse/rubrics/reverse-contract-quality.md'
142
181
  relationships:
143
- service_id: { class: membership, impact_flow: toward-target }
144
- source_repo_id: { class: lineage, impact_flow: toward-source }
182
+ service_id:
183
+ class: membership
184
+ impact_flow: toward-target
185
+ source_repo_id:
186
+ class: lineage
187
+ impact_flow: toward-source
145
188
  events:
146
189
  kind: entity
147
190
  scoring: predicate
148
- instrument: "event-catalogue + event coverage checks (sdd-cli catalogue validate --coverage) — absence class; content rides the contract rubrics where events have contracts"
191
+ instrument: event-catalogue + event coverage checks (sdd-cli catalogue validate --coverage) — absence class; content rides the contract rubrics where events have contracts
149
192
  relationships:
150
- publisher_service_id: { class: dependency, impact_flow: toward-source }
151
- domain_id: { class: membership, impact_flow: toward-target }
193
+ publisher_service_id:
194
+ class: dependency
195
+ impact_flow: toward-source
196
+ domain_id:
197
+ class: membership
198
+ impact_flow: toward-target
152
199
  c4_systems:
153
200
  kind: entity
154
201
  scoring: rubric-pair
155
- instrument: "rubrics/c4-diagram-rubric.md (L1 per the level table) · reverse/rubrics/reverse-c4-quality.md"
202
+ instrument: rubrics/c4-diagram-rubric.md (L1 per the level table) · reverse/rubrics/reverse-c4-quality.md
156
203
  relationships:
157
- product_id: { class: realisation, impact_flow: both }
204
+ product_id:
205
+ class: realisation
206
+ impact_flow: both
158
207
  c4_containers:
159
208
  kind: entity
160
209
  scoring: rubric-pair
161
- instrument: "rubrics/c4-diagram-rubric.md (L2) · reverse/rubrics/reverse-c4-quality.md"
210
+ instrument: rubrics/c4-diagram-rubric.md (L2) · reverse/rubrics/reverse-c4-quality.md
162
211
  relationships:
163
- system_id: { class: membership, impact_flow: toward-target }
164
- domain_id: { class: membership, impact_flow: toward-target }
165
- service_id: { class: realisation, impact_flow: both }
212
+ system_id:
213
+ class: membership
214
+ impact_flow: toward-target
215
+ domain_id:
216
+ class: membership
217
+ impact_flow: toward-target
218
+ service_id:
219
+ class: realisation
220
+ impact_flow: both
166
221
  c4_components:
167
222
  kind: entity
168
223
  scoring: rubric-pair
169
- instrument: "rubrics/c4-diagram-rubric.md (L3 per the level table) · reverse/rubrics/reverse-c4-quality.md (L3 section)"
224
+ instrument: rubrics/c4-diagram-rubric.md (L3 per the level table) · reverse/rubrics/reverse-c4-quality.md (L3 section)
170
225
  relationships:
171
- container_id: { class: membership, impact_flow: toward-target }
172
- service_id: { class: realisation, impact_flow: both }
226
+ container_id:
227
+ class: membership
228
+ impact_flow: toward-target
229
+ service_id:
230
+ class: realisation
231
+ impact_flow: both
173
232
  c4_external_systems:
174
233
  kind: entity
175
234
  scoring: scored-at-source
176
- instrument: "externality is scored inside the c4 rubrics (D4 / dimension 6); rows derive from System_Ext elements"
235
+ instrument: externality is scored inside the c4 rubrics (D4 / dimension 6); rows derive from System_Ext elements
177
236
  repositories:
178
237
  kind: entity
179
238
  scoring: predicate
180
- instrument: "deliberately no rubric: repo-config is four structural fields; scripts/check-repo-config-coverage.sh covers the silent absences, builder findings own enum/orphan/divergence"
239
+ instrument: 'deliberately no rubric: repo-config is four structural fields; scripts/check-repo-config-coverage.sh covers the silent absences, builder findings own enum/orphan/divergence'
181
240
  relationships:
182
- domain_id: { class: membership, impact_flow: toward-target }
183
- product_id: { class: membership, impact_flow: toward-target }
241
+ domain_id:
242
+ class: membership
243
+ impact_flow: toward-target
244
+ product_id:
245
+ class: membership
246
+ impact_flow: toward-target
184
247
  domain_models:
185
248
  kind: entity
186
249
  scoring: rubric-pair
187
- instrument: "forward: rubrics/domain-architecture-rubric.md · reverse: reverse/rubrics/reverse-data-model-quality.md"
250
+ instrument: 'forward: rubrics/domain-architecture-rubric.md · reverse: reverse/rubrics/reverse-data-model-quality.md'
188
251
  relationships:
189
- domain_id: { class: membership, impact_flow: toward-target }
252
+ domain_id:
253
+ class: membership
254
+ impact_flow: toward-target
190
255
  entities:
191
256
  kind: entity
192
257
  scoring: predicate
193
- instrument: "verified covered: builder reads glossary-alignment-manifest (entities-manifest builder); absence fires the glossary-xref + data-model-entities coverage checks (sdd-cli catalogue validate --coverage); authored population is 1 forward + 1 reverse — a rubric would be ceremony"
258
+ instrument: 'verified covered: builder reads glossary-alignment-manifest (entities-manifest builder); absence fires the glossary-xref + data-model-entities coverage checks (sdd-cli catalogue validate --coverage); authored population is 1 forward + 1 reverse — a rubric would be ceremony'
194
259
  relationships:
195
- domain_id: { class: membership, impact_flow: toward-target }
196
- source_domain_model_id: { class: lineage, impact_flow: toward-source }
197
- glossary_term: { class: xref, impact_flow: none }
198
- repo_capability: { kind: edge, class: realisation, impact_flow: both, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
199
- repo_capability_exemption: { kind: edge, class: attribute, impact_flow: none, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
200
- service_capability_exemption: { kind: edge, class: attribute, impact_flow: none, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
201
- external_system_exemption: { kind: edge, class: attribute, impact_flow: none, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
202
- repo_contract: { kind: edge, class: realisation, impact_flow: both, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
203
- product_capability: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
204
- product_service: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
205
- service_contract: { kind: edge, class: realisation, impact_flow: both, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
260
+ domain_id:
261
+ class: membership
262
+ impact_flow: toward-target
263
+ source_domain_model_id:
264
+ class: lineage
265
+ impact_flow: toward-source
266
+ glossary_term:
267
+ class: xref
268
+ impact_flow: none
269
+ repo_capability:
270
+ kind: edge
271
+ class: realisation
272
+ impact_flow: both
273
+ scoring: derived-edge
274
+ reason: derived from entity rows or manifest blocks scored at the owning entity
275
+ repo_capability_exemption:
276
+ kind: annotation
277
+ class: attribute
278
+ impact_flow: none
279
+ scoring: derived-edge
280
+ reason: derived from entity rows or manifest blocks scored at the owning entity
281
+ service_capability_exemption:
282
+ kind: annotation
283
+ class: attribute
284
+ impact_flow: none
285
+ scoring: derived-edge
286
+ reason: derived from entity rows or manifest blocks scored at the owning entity
287
+ external_system_exemption:
288
+ kind: annotation
289
+ class: attribute
290
+ impact_flow: none
291
+ scoring: derived-edge
292
+ reason: derived from entity rows or manifest blocks scored at the owning entity
293
+ repo_contract:
294
+ kind: edge
295
+ class: realisation
296
+ impact_flow: both
297
+ scoring: derived-edge
298
+ reason: derived from entity rows or manifest blocks scored at the owning entity
299
+ product_capability:
300
+ kind: edge
301
+ class: dependency
302
+ impact_flow: toward-source
303
+ scoring: derived-edge
304
+ reason: derived from entity rows or manifest blocks scored at the owning entity
305
+ product_service:
306
+ kind: edge
307
+ class: dependency
308
+ impact_flow: toward-source
309
+ scoring: derived-edge
310
+ reason: derived from entity rows or manifest blocks scored at the owning entity
311
+ service_contract:
312
+ kind: edge
313
+ class: realisation
314
+ impact_flow: both
315
+ scoring: derived-edge
316
+ reason: derived from entity rows or manifest blocks scored at the owning entity
206
317
  service_event:
207
318
  kind: edge
208
319
  class: dependency
209
- # role-conditional (M-ADR 0206 §4.2): the two roles flow in opposite directions
210
- impact_flow_by: { column: role, values: { publishes: toward-target, consumes: toward-source } }
211
- scoring: derived-edge
212
- reason: "derived from entity rows or manifest blocks scored at the owning entity"
213
- service_entity: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
214
- capability_feature: { kind: edge, class: traceability, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
215
- capability_service: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
216
- capability_event: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
217
- capability_contract: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
218
- journey_feature: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
219
- persona_feature: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
220
- feature_service: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
221
- feature_event: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
222
- feature_repo: { kind: edge, class: realisation, impact_flow: both, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
223
- feature_contract: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
224
- feature_subscription_channels: { kind: edge, class: attribute, impact_flow: none, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
225
- capability_domain_model: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
226
- feature_domain_model: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
227
- persona_journey: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
228
- persona_screen: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
229
- persona_c4system: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
230
- persona_container: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
231
- system_external_dependency: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
232
- container_dependency: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
233
- system_system_dependency: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
234
- c4_container_entity: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
235
- c4_system_entity: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
236
- capability_adr: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
237
- adr_supersedes: { kind: edge, class: lineage, impact_flow: none, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
238
- product_platform_dependencies: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
239
- cross_sdd_platform_capability: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
240
- application_data_plane_bindings: { kind: edge, class: attribute, impact_flow: none, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
241
- application_data_plane_deviations: { kind: edge, class: attribute, impact_flow: none, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
242
- application_conformance_coverage: { kind: edge, class: attribute, impact_flow: none, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
320
+ impact_flow_by:
321
+ column: role
322
+ values:
323
+ publishes: toward-target
324
+ consumes: toward-source
325
+ scoring: derived-edge
326
+ reason: derived from entity rows or manifest blocks scored at the owning entity
327
+ service_entity:
328
+ kind: edge
329
+ class: dependency
330
+ impact_flow: toward-source
331
+ scoring: derived-edge
332
+ reason: derived from entity rows or manifest blocks scored at the owning entity
333
+ capability_feature:
334
+ kind: edge
335
+ class: traceability
336
+ impact_flow: toward-source
337
+ scoring: derived-edge
338
+ reason: derived from entity rows or manifest blocks scored at the owning entity
339
+ capability_service:
340
+ kind: edge
341
+ class: dependency
342
+ impact_flow: toward-source
343
+ scoring: derived-edge
344
+ reason: derived from entity rows or manifest blocks scored at the owning entity
345
+ capability_event:
346
+ kind: edge
347
+ class: dependency
348
+ impact_flow: toward-source
349
+ scoring: derived-edge
350
+ reason: derived from entity rows or manifest blocks scored at the owning entity
351
+ capability_contract:
352
+ kind: edge
353
+ class: dependency
354
+ impact_flow: toward-source
355
+ scoring: derived-edge
356
+ reason: derived from entity rows or manifest blocks scored at the owning entity
357
+ journey_feature:
358
+ kind: edge
359
+ class: dependency
360
+ impact_flow: toward-source
361
+ scoring: derived-edge
362
+ reason: derived from entity rows or manifest blocks scored at the owning entity
363
+ persona_feature:
364
+ kind: edge
365
+ class: dependency
366
+ impact_flow: toward-source
367
+ scoring: derived-edge
368
+ reason: derived from entity rows or manifest blocks scored at the owning entity
369
+ feature_service:
370
+ kind: edge
371
+ class: dependency
372
+ impact_flow: toward-source
373
+ scoring: derived-edge
374
+ reason: derived from entity rows or manifest blocks scored at the owning entity
375
+ feature_event:
376
+ kind: edge
377
+ class: dependency
378
+ impact_flow: toward-source
379
+ scoring: derived-edge
380
+ reason: derived from entity rows or manifest blocks scored at the owning entity
381
+ feature_repo:
382
+ kind: edge
383
+ class: realisation
384
+ impact_flow: both
385
+ scoring: derived-edge
386
+ reason: derived from entity rows or manifest blocks scored at the owning entity
387
+ feature_contract:
388
+ kind: edge
389
+ class: dependency
390
+ impact_flow: toward-source
391
+ scoring: derived-edge
392
+ reason: derived from entity rows or manifest blocks scored at the owning entity
393
+ feature_subscription_channels:
394
+ kind: annotation
395
+ class: attribute
396
+ impact_flow: none
397
+ scoring: derived-edge
398
+ reason: derived from entity rows or manifest blocks scored at the owning entity
399
+ capability_domain_model:
400
+ kind: edge
401
+ class: dependency
402
+ impact_flow: toward-source
403
+ scoring: derived-edge
404
+ reason: derived from entity rows or manifest blocks scored at the owning entity
405
+ feature_domain_model:
406
+ kind: edge
407
+ class: dependency
408
+ impact_flow: toward-source
409
+ scoring: derived-edge
410
+ reason: derived from entity rows or manifest blocks scored at the owning entity
411
+ persona_journey:
412
+ kind: edge
413
+ class: dependency
414
+ impact_flow: toward-source
415
+ scoring: derived-edge
416
+ reason: derived from entity rows or manifest blocks scored at the owning entity
417
+ persona_screen:
418
+ kind: edge
419
+ class: dependency
420
+ impact_flow: toward-source
421
+ scoring: derived-edge
422
+ reason: derived from entity rows or manifest blocks scored at the owning entity
423
+ persona_c4system:
424
+ kind: edge
425
+ class: dependency
426
+ impact_flow: toward-source
427
+ scoring: derived-edge
428
+ reason: derived from entity rows or manifest blocks scored at the owning entity
429
+ persona_container:
430
+ kind: edge
431
+ class: dependency
432
+ impact_flow: toward-source
433
+ scoring: derived-edge
434
+ reason: derived from entity rows or manifest blocks scored at the owning entity
435
+ system_external_dependency:
436
+ kind: edge
437
+ class: dependency
438
+ impact_flow: toward-source
439
+ scoring: derived-edge
440
+ reason: derived from entity rows or manifest blocks scored at the owning entity
441
+ container_dependency:
442
+ kind: edge
443
+ class: dependency
444
+ impact_flow: toward-source
445
+ scoring: derived-edge
446
+ reason: derived from entity rows or manifest blocks scored at the owning entity
447
+ system_system_dependency:
448
+ kind: edge
449
+ class: dependency
450
+ impact_flow: toward-source
451
+ scoring: derived-edge
452
+ reason: derived from entity rows or manifest blocks scored at the owning entity
453
+ c4_container_entity:
454
+ kind: edge
455
+ class: dependency
456
+ impact_flow: toward-source
457
+ scoring: derived-edge
458
+ reason: derived from entity rows or manifest blocks scored at the owning entity
459
+ c4_system_entity:
460
+ kind: edge
461
+ class: dependency
462
+ impact_flow: toward-source
463
+ scoring: derived-edge
464
+ reason: derived from entity rows or manifest blocks scored at the owning entity
465
+ capability_adr:
466
+ kind: edge
467
+ class: dependency
468
+ impact_flow: toward-source
469
+ scoring: derived-edge
470
+ reason: derived from entity rows or manifest blocks scored at the owning entity
471
+ adr_supersedes:
472
+ kind: edge
473
+ class: lineage
474
+ impact_flow: none
475
+ scoring: derived-edge
476
+ reason: derived from entity rows or manifest blocks scored at the owning entity
477
+ product_platform_dependencies:
478
+ kind: edge
479
+ class: dependency
480
+ impact_flow: toward-source
481
+ scoring: derived-edge
482
+ reason: derived from entity rows or manifest blocks scored at the owning entity
483
+ cross_sdd_platform_capability:
484
+ kind: edge
485
+ class: dependency
486
+ impact_flow: toward-source
487
+ scoring: derived-edge
488
+ reason: derived from entity rows or manifest blocks scored at the owning entity
489
+ application_data_plane_bindings:
490
+ kind: annotation
491
+ class: attribute
492
+ impact_flow: none
493
+ scoring: derived-edge
494
+ reason: derived from entity rows or manifest blocks scored at the owning entity
495
+ application_data_plane_deviations:
496
+ kind: annotation
497
+ class: attribute
498
+ impact_flow: none
499
+ scoring: derived-edge
500
+ reason: derived from entity rows or manifest blocks scored at the owning entity
501
+ application_conformance_coverage:
502
+ kind: annotation
503
+ class: attribute
504
+ impact_flow: none
505
+ scoring: derived-edge
506
+ reason: derived from entity rows or manifest blocks scored at the owning entity
243
507
  screens:
244
508
  kind: entity
245
509
  scoring: rubric-pair
246
- instrument: "forward: rubrics/screen-spec-rubric.md above the mechanical floor (guides/screen-spec-depth-rubric.md) · reverse: reverse/rubrics/reverse-screen-spec-quality.md"
510
+ instrument: 'forward: rubrics/screen-spec-rubric.md above the mechanical floor (guides/screen-spec-depth-rubric.md) · reverse: reverse/rubrics/reverse-screen-spec-quality.md'
247
511
  relationships:
248
- product_id: { class: membership, impact_flow: toward-target }
512
+ product_id:
513
+ class: membership
514
+ impact_flow: toward-target
249
515
  ui_components:
250
516
  kind: entity
251
517
  scoring: not-applicable
252
- instrument: "projected from component call-heads inside the screens builder; no authoring surface"
518
+ instrument: projected from component call-heads inside the screens builder; no authoring surface
253
519
  relationships:
254
- product_id: { class: membership, impact_flow: toward-target }
255
- screen_component: { kind: edge, class: membership, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
256
- screen_feature: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
257
- screen_action: { kind: edge, class: dependency, impact_flow: toward-source, scoring: derived-edge, reason: "derived from entity rows or manifest blocks scored at the owning entity" }
258
- conformance_finding: { kind: finding, scoring: not-built, reason: "not produced by catalogue build; populated by conformance tooling" }
520
+ product_id:
521
+ class: membership
522
+ impact_flow: toward-target
523
+ screen_component:
524
+ kind: edge
525
+ class: membership
526
+ impact_flow: toward-source
527
+ scoring: derived-edge
528
+ reason: derived from entity rows or manifest blocks scored at the owning entity
529
+ screen_feature:
530
+ kind: edge
531
+ class: dependency
532
+ impact_flow: toward-source
533
+ scoring: derived-edge
534
+ reason: derived from entity rows or manifest blocks scored at the owning entity
535
+ screen_action:
536
+ kind: edge
537
+ class: dependency
538
+ impact_flow: toward-source
539
+ scoring: derived-edge
540
+ reason: derived from entity rows or manifest blocks scored at the owning entity
541
+ conformance_finding:
542
+ kind: finding
543
+ scoring: not-built
544
+ reason: not produced by catalogue build; populated by conformance tooling
259
545
  quality_scores:
260
546
  kind: entity
261
547
  scoring: predicate
262
- instrument: "the score record itself — scoring it with a rubric would be circular. Its COVERAGE is what needs governing (every eligible artefact carries a current, non-stale score), and that is the scores-coverage predicate of M-ADR 0205 §4.5, run by sdd-cli catalogue validate --coverage. The quality of each individual assessment is the rubric named in its own rubric_id."
548
+ instrument: the score record itself — scoring it with a rubric would be circular. Its COVERAGE is what needs governing (every eligible artefact carries a current, non-stale score), and that is the scores-coverage predicate of M-ADR 0205 §4.5, run by sdd-cli catalogue validate --coverage. The quality of each individual assessment is the rubric named in its own rubric_id.
263
549
  relationships:
264
- # flow none, RULED (0206 flagged-row resolution): diagnostics do not
265
- # ride change closures. A score is a record ABOUT an artefact; "is this
266
- # score still current after the change" is owned, precisely, by the
267
- # scores instruments (staleness_basis/corpus_ref + the coverage check),
268
- # and answering it through reachability answers it worse. Measured
269
- # before ruling: scores were 27-30% of both estates' contract closures.
270
- sdd_id: { class: dependency, impact_flow: none }
550
+ sdd_id:
551
+ class: dependency
552
+ impact_flow: none
271
553
  quality_score_dimensions:
272
- kind: edge
554
+ kind: annotation
273
555
  class: attribute
274
556
  impact_flow: none
275
557
  scoring: derived-edge
276
- reason: "derived from the parent quality_scores row; the dimension keys are the rubric's own vocabulary, governed by the rubric that declares them"
277
- quality_gate: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
278
- score_selection_method: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
279
- staleness_basis: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
280
- scoring_form: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
558
+ reason: derived from the parent quality_scores row; the dimension keys are the rubric's own vocabulary, governed by the rubric that declares them
559
+ quality_gate:
560
+ kind: enum
561
+ scoring: not-applicable
562
+ reason: closed vocabulary, not an artefact
563
+ score_selection_method:
564
+ kind: enum
565
+ scoring: not-applicable
566
+ reason: closed vocabulary, not an artefact
567
+ staleness_basis:
568
+ kind: enum
569
+ scoring: not-applicable
570
+ reason: closed vocabulary, not an artefact
571
+ scoring_form:
572
+ kind: enum
573
+ scoring: not-applicable
574
+ reason: closed vocabulary, not an artefact
281
575
  scaffolds:
282
576
  kind: entity
283
577
  scoring: predicate
284
- instrument: "the declaration record itself — scoring it with a rubric would be circular. Its GOVERNANCE is the M-ADR 0207 §4.8 delta instrument plus the scaffold-coverage predicate (every non-closed scaffold carries a current anchor and a computable delta; a closed scaffold sits at delta zero), run by sdd-cli catalogue validate --coverage."
578
+ instrument: the declaration record itself — scoring it with a rubric would be circular. Its GOVERNANCE is the M-ADR 0207 §4.8 delta instrument plus the scaffold-coverage predicate (every non-closed scaffold carries a current anchor and a computable delta; a closed scaffold sits at delta zero), run by sdd-cli catalogue validate --coverage.
285
579
  relationships:
286
- # flow none, same ruling shape as quality_scores.sdd_id: a scaffold is a
287
- # governance record ABOUT work, not a structural path of the estate —
288
- # "is this declaration still current after the change" is owned by the
289
- # scaffold instruments (corpus_ref staleness + the delta), and answering
290
- # it through reachability answers it worse.
291
- sdd_id: { class: membership, impact_flow: none }
580
+ sdd_id:
581
+ class: membership
582
+ impact_flow: none
292
583
  scaffold_items:
293
- kind: edge
584
+ kind: annotation
294
585
  class: traceability
295
586
  impact_flow: none
296
587
  scoring: derived-edge
297
- reason: "derived from the authored scaffold manifest (M-ADR 0207 §4.1); the polymorphic target deliberately declares no FK — resolution is conditional on state — so the row is a governance trace, not an impact path"
298
- scaffold_status: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
299
- scaffold_item_kind: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
300
- scaffold_item_state: { kind: enum, scoring: not-applicable, reason: "closed vocabulary, not an artefact" }
588
+ reason: derived from the authored scaffold manifest (M-ADR 0207 §4.1); the polymorphic target deliberately declares no FK — resolution is conditional on state — so the row is a governance trace, not an impact path
589
+ scaffold_status:
590
+ kind: enum
591
+ scoring: not-applicable
592
+ reason: closed vocabulary, not an artefact
593
+ scaffold_item_kind:
594
+ kind: enum
595
+ scoring: not-applicable
596
+ reason: closed vocabulary, not an artefact
597
+ scaffold_item_state:
598
+ kind: enum
599
+ scoring: not-applicable
600
+ reason: closed vocabulary, not an artefact
601
+ interaction_pattern:
602
+ kind: enum
603
+ scoring: not-applicable
604
+ reason: closed vocabulary, not an artefact
605
+ event_participation:
606
+ kind: enum
607
+ scoring: not-applicable
608
+ reason: closed vocabulary, not an artefact
609
+ contract_participation:
610
+ kind: enum
611
+ scoring: not-applicable
612
+ reason: closed vocabulary, not an artefact
613
+ consumption_role:
614
+ kind: enum
615
+ scoring: not-applicable
616
+ reason: closed vocabulary, not an artefact
617
+ journey_participation:
618
+ kind: enum
619
+ scoring: not-applicable
620
+ reason: closed vocabulary, not an artefact