@sdd-method/sdd-cli 1.23.1 → 1.25.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.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/catalogue/builders/domain-models.d.ts +7 -0
- package/dist/lib/catalogue/builders/domain-models.d.ts.map +1 -1
- package/dist/lib/catalogue/builders/domain-models.js +47 -13
- package/dist/lib/catalogue/builders/domain-models.js.map +1 -1
- package/dist/lib/catalogue/canonical-schema.yaml +274 -313
- package/dist/lib/catalogue/rubric-coverage-map.yaml +64 -60
- package/dist/lib/metamodel/roundtrip-gate.d.ts +52 -0
- package/dist/lib/metamodel/roundtrip-gate.d.ts.map +1 -0
- package/dist/lib/metamodel/roundtrip-gate.js +297 -0
- package/dist/lib/metamodel/roundtrip-gate.js.map +1 -0
- package/dist/lib/metamodel/schema-projection.d.ts +60 -0
- package/dist/lib/metamodel/schema-projection.d.ts.map +1 -0
- package/dist/lib/metamodel/schema-projection.js +254 -0
- package/dist/lib/metamodel/schema-projection.js.map +1 -0
- package/dist/lib/metamodel/tql-subset-parser.d.ts +38 -0
- package/dist/lib/metamodel/tql-subset-parser.d.ts.map +1 -0
- package/dist/lib/metamodel/tql-subset-parser.js +275 -0
- package/dist/lib/metamodel/tql-subset-parser.js.map +1 -0
- package/dist/verbs/metamodel.d.ts +3 -0
- package/dist/verbs/metamodel.d.ts.map +1 -0
- package/dist/verbs/metamodel.js +28 -0
- package/dist/verbs/metamodel.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,22 +1,17 @@
|
|
|
1
1
|
# GENERATED — DO NOT EDIT. This file is a projection of the authored model (M-ADR 0210 §4.6, flip 1):
|
|
2
2
|
# docs/method/foundations/schemas/catalogue-schema.tql (the type system; header carries the bump log)
|
|
3
3
|
# docs/method/foundations/schemas/catalogue-schema-meta.tql (what a type system cannot say)
|
|
4
|
-
# Regenerate:
|
|
5
|
-
# Guard:
|
|
4
|
+
# Regenerate: sdd-cli metamodel roundtrip --write
|
|
5
|
+
# Guard: sdd-cli metamodel roundtrip (any difference fails the build)
|
|
6
6
|
# Direction of truth: authored .tql -> this projection (round-trip gate) -> vendored copies (digest hook).
|
|
7
|
-
# Emitted with
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
schema_version: "3.
|
|
7
|
+
# Emitted by sdd-cli's YAML emitter with no line folding; the three header scalars are quoted for the
|
|
8
|
+
# textual readers downstream. The one deliberate difference from the authored form is schema_status:
|
|
9
|
+
# the authored form says canonical; a projection never does.
|
|
10
|
+
schema_version: "3.11.0"
|
|
11
11
|
schema_owner: "sdd-method"
|
|
12
12
|
schema_status: "generated"
|
|
13
13
|
enums:
|
|
14
14
|
quality_gate:
|
|
15
|
-
description: 'Gate verdict a rubric assessment records for a target, in `quality_scores.gate` (per M-ADR 0205 §4.5). The vocabulary all fifteen method-side gate registries declare.
|
|
16
|
-
|
|
17
|
-
DELIBERATELY NOT BOUND via `column_enums`, and the reason is measured rather than assumed — do not "fix" this by binding it. These values come from hand-authored score registries written by scoring runs, not from a method-mandated authoring surface, and one estate''s `domain-architecture-scores.yaml` declared `pass-with-waiver` before the method did, and uses it — the extension was RULED INTO this vocabulary (2026-08-07); the next estate extension would meet the same choice, and binding would hard-fail a build over a deliberate, self-documented row. This follows the `products.synthesis_band` precedent — the other column fed from a rubric registry — where an out-of-vocabulary value is reported as a convention finding and the cell left EMPTY, rather than emitting a value no consumer can interpret. The builder names the file, the entry, the value and the remedy, which is better diagnosis than a generic enum violation could give. Contrast `service_type`, which IS bound: it comes from repo-config, an authoring surface the method mandates.
|
|
18
|
-
|
|
19
|
-
'
|
|
20
15
|
values:
|
|
21
16
|
- value: pass
|
|
22
17
|
description: Meets the rubric's pass threshold with no hard gate triggered.
|
|
@@ -27,11 +22,11 @@ enums:
|
|
|
27
22
|
- value: fail
|
|
28
23
|
description: Below the fail threshold, or a hard gate triggered.
|
|
29
24
|
- value: unscored
|
|
30
|
-
description:
|
|
25
|
+
description: "The entry exists but carries no assessment. Distinct from absent: an unscored row asserts that nothing has been judged, which is exactly the silence M-ADR 0205 §4.5's coverage instrument exists to make loud."
|
|
26
|
+
description: |
|
|
27
|
+
Gate verdict a rubric assessment records for a target, in `quality_scores.gate` (per M-ADR 0205 §4.5). The vocabulary all fifteen method-side gate registries declare.
|
|
28
|
+
DELIBERATELY NOT BOUND via `column_enums`, and the reason is measured rather than assumed — do not "fix" this by binding it. These values come from hand-authored score registries written by scoring runs, not from a method-mandated authoring surface, and one estate's `domain-architecture-scores.yaml` declared `pass-with-waiver` before the method did, and uses it — the extension was RULED INTO this vocabulary (2026-08-07); the next estate extension would meet the same choice, and binding would hard-fail a build over a deliberate, self-documented row. This follows the `products.synthesis_band` precedent — the other column fed from a rubric registry — where an out-of-vocabulary value is reported as a convention finding and the cell left EMPTY, rather than emitting a value no consumer can interpret. The builder names the file, the entry, the value and the remedy, which is better diagnosis than a generic enum violation could give. Contrast `service_type`, which IS bound: it comes from repo-config, an authoring surface the method mandates.
|
|
31
29
|
score_selection_method:
|
|
32
|
-
description: 'How the effective review was chosen from a target''s review history, in `quality_scores.selection_method` — the `selection_policy.method` field every gate registry carries. The catalogue models only the EFFECTIVE score (one row per target/rubric); this column makes the row say WHICH review it is rather than implying there was only one. Not bound, for the same registry-authored reason as `quality_gate`.
|
|
33
|
-
|
|
34
|
-
'
|
|
35
30
|
values:
|
|
36
31
|
- value: latest
|
|
37
32
|
description: Most recent review by scored_at. The default and, at 2026-08-06, the only value in use across either estate.
|
|
@@ -41,10 +36,9 @@ enums:
|
|
|
41
36
|
description: Effective score reconciled across several reviews.
|
|
42
37
|
- value: highest-severity
|
|
43
38
|
description: The most severe review wins — the conservative policy for gate-blocking rubrics.
|
|
39
|
+
description: |
|
|
40
|
+
How the effective review was chosen from a target's review history, in `quality_scores.selection_method` — the `selection_policy.method` field every gate registry carries. The catalogue models only the EFFECTIVE score (one row per target/rubric); this column makes the row say WHICH review it is rather than implying there was only one. Not bound, for the same registry-authored reason as `quality_gate`.
|
|
44
41
|
staleness_basis:
|
|
45
|
-
description: 'Which anchor a `quality_scores` row''s staleness verdict can be computed from, in `quality_scores.staleness_basis`. This column exists because a staleness verdict whose basis is unstated is not a measurement — the basis-error class that produced six wrong figures in a single day of this method''s own arc. The coverage predicate MUST NOT be able to emit a staleness claim without naming which of these it used.
|
|
46
|
-
|
|
47
|
-
'
|
|
48
42
|
values:
|
|
49
43
|
- value: corpus_ref
|
|
50
44
|
description: The row carries the commit the assessment read — the precise anchor. Authored; introduced by the M-ADR 0205 §4.5 change-set, so absent from every score written before it.
|
|
@@ -52,23 +46,19 @@ enums:
|
|
|
52
46
|
description: No corpus_ref; staleness computed from the assessment date against the target's last content change, resolved through target_path. Correct but coarser — it cannot distinguish a re-commit that changed nothing from a real edit.
|
|
53
47
|
- value: none
|
|
54
48
|
description: Neither anchor available (no corpus_ref and no resolvable target_path). Staleness is UNKNOWN for this row and must be reported as unknown, never as fresh.
|
|
49
|
+
description: |
|
|
50
|
+
Which anchor a `quality_scores` row's staleness verdict can be computed from, in `quality_scores.staleness_basis`. This column exists because a staleness verdict whose basis is unstated is not a measurement — the basis-error class that produced six wrong figures in a single day of this method's own arc. The coverage predicate MUST NOT be able to emit a staleness claim without naming which of these it used.
|
|
55
51
|
scoring_form:
|
|
56
|
-
description: 'The scoring shape a rubric uses, in `quality_scores.scoring_form`. Reserved by M-ADR 0205 §4.5 so the banded reverse family can arrive additively without reshaping rows.
|
|
57
|
-
|
|
58
|
-
Both forms are now declared. `banded` was added in 3.3.0 once the reverse family was modelled; before that it was deliberately absent so a premature banded row would fail loudly rather than pass against an unemitted value.
|
|
59
|
-
|
|
60
|
-
The two forms are NOT interchangeable and must not be averaged together — which is why they never share a score column. A weighted row carries `weighted_score` (1-5) and leaves `band`/`band_total` empty; a banded row carries `band` + `band_total` and leaves `weighted_score` empty. Any aggregate over `weighted_score` is therefore correct by construction rather than by the caller remembering to filter.
|
|
61
|
-
|
|
62
|
-
'
|
|
63
52
|
values:
|
|
64
53
|
- value: weighted
|
|
65
54
|
description: Weighted 1-5 dimensions rolled into a weighted_score against a pass threshold, with flags and hard gates. The forward house form; all fifteen method-side registries use it.
|
|
66
55
|
- value: banded
|
|
67
56
|
description: Dimensions summed to an integer total and mapped to a named band. The reverse family's form. Added in 3.3.0. The band vocabulary is PER-RUBRIC and deliberately unbound — see the band column.
|
|
57
|
+
description: |
|
|
58
|
+
The scoring shape a rubric uses, in `quality_scores.scoring_form`. Reserved by M-ADR 0205 §4.5 so the banded reverse family can arrive additively without reshaping rows.
|
|
59
|
+
Both forms are now declared. `banded` was added in 3.3.0 once the reverse family was modelled; before that it was deliberately absent so a premature banded row would fail loudly rather than pass against an unemitted value.
|
|
60
|
+
The two forms are NOT interchangeable and must not be averaged together — which is why they never share a score column. A weighted row carries `weighted_score` (1-5) and leaves `band`/`band_total` empty; a banded row carries `band` + `band_total` and leaves `weighted_score` empty. Any aggregate over `weighted_score` is therefore correct by construction rather than by the caller remembering to filter.
|
|
68
61
|
capability_service_role:
|
|
69
|
-
description: 'The part a service plays in delivering ONE capability. A property of the capability↔service RELATIONSHIP, never of the service: the same service is legitimately `primary` for capabilities in its own domain and `backend-gateway` for capabilities elsewhere. Authored in the capability traceability manifest services[].role (see the capability-traceability-manifest-template). Bound in 3.8.0; the values and their meanings are the template''s, unchanged. Consumers deriving "which repos realise this capability" MUST read this column or use repo_capability, which excludes `dependency` (M-ADR 0157 §4.3 as amended) — a repo_capability row is a contribution claim.
|
|
70
|
-
|
|
71
|
-
'
|
|
72
62
|
values:
|
|
73
63
|
- value: primary
|
|
74
64
|
description: Realises this capability.
|
|
@@ -78,8 +68,9 @@ enums:
|
|
|
78
68
|
description: This capability DEPENDS ON the service — the inverse direction of contribution. The relationship is real and catalogued here; it does NOT produce a repo_capability row.
|
|
79
69
|
- value: backend-gateway
|
|
80
70
|
description: Owned by ANOTHER domain and the sanctioned entry point into that domain's data for this capability — not merely a dependency, the door in. Expect it on cross-domain rows only. Contributes; kept in repo_capability.
|
|
71
|
+
description: |
|
|
72
|
+
The part a service plays in delivering ONE capability. A property of the capability↔service RELATIONSHIP, never of the service: the same service is legitimately `primary` for capabilities in its own domain and `backend-gateway` for capabilities elsewhere. Authored in the capability traceability manifest services[].role (see the capability-traceability-manifest-template). Bound in 3.8.0; the values and their meanings are the template's, unchanged. Consumers deriving "which repos realise this capability" MUST read this column or use repo_capability, which excludes `dependency` (M-ADR 0157 §4.3 as amended) — a repo_capability row is a contribution claim.
|
|
81
73
|
c4_system_kind:
|
|
82
|
-
description: "Architectural kind of a C4 system. Derived 1:1 from the originating SDD manifest's category — every architectural product (the only ones that get a c4_systems row) maps to exactly one of these four kinds. Non-architectural categories (integration-umbrella, support-repo) emit no c4_systems row — and the builder MUST say so with a coverage finding, never silently (M-ADR 0133 §4.2c). Mapping table:\n platform-root → platform\n platform-subsystem → subsystem\n application-product → application\n integration-provider → integration\n"
|
|
83
74
|
values:
|
|
84
75
|
- value: platform
|
|
85
76
|
description: A platform-root system — the one system that identifies a platform (M-ADR 0208 §4.1; 'platform-ecosystem' is the long form, 1:1 with the root). Exactly one per PLATFORM; an organisation-tier aggregate legitimately carries one per constituent platform, keyed by platform_sdd_id (0208 §4.2). An invariant `subsystem` exists to protect — do not reuse `platform` for subsystem rows.
|
|
@@ -89,21 +80,22 @@ enums:
|
|
|
89
80
|
description: An application-product system, consumes platform services and contracts.
|
|
90
81
|
- value: integration
|
|
91
82
|
description: An integration-provider system, bridges an external provider into the platform.
|
|
83
|
+
description: |
|
|
84
|
+
Architectural kind of a C4 system. Derived 1:1 from the originating SDD manifest's category — every architectural product (the only ones that get a c4_systems row) maps to exactly one of these four kinds. Non-architectural categories (integration-umbrella, support-repo) emit no c4_systems row — and the builder MUST say so with a coverage finding, never silently (M-ADR 0133 §4.2c). Mapping table:
|
|
85
|
+
platform-root → platform
|
|
86
|
+
platform-subsystem → subsystem
|
|
87
|
+
application-product → application
|
|
88
|
+
integration-provider → integration
|
|
92
89
|
c4_container_type:
|
|
93
|
-
description: 'Canonical C4 container kind for `c4_containers.type`, aligned with c4model.com/abstractions (per M-ADR 0155). A C4 container is something that must be running for the system to work — an application or a data store.
|
|
94
|
-
|
|
95
|
-
BOUND via `c4_containers.column_enums` since 3.0.0 (M-ADR 0203 §4.1, completing 0155''s staged enforcement): a non-member value hard-fails build and validate. The 2.x-era legacy values are removed; their migration rule (0155''s own): `External System` boxes belong in `c4_external_systems` (C4 L1 peer systems, not L2 containers); running infrastructure (broker, gateway, cache) retypes to Application or Data Store; pure deployment infrastructure (load balancer, DNS) leaves the container catalogue (it belongs in a C4 deployment diagram, which is not catalogued).
|
|
96
|
-
|
|
97
|
-
'
|
|
98
90
|
values:
|
|
99
91
|
- value: Application
|
|
100
92
|
description: A separately deployable/runnable application — a service, BFF, UI, consumer, worker, etc.
|
|
101
93
|
- value: Data Store
|
|
102
94
|
description: A database or persistence layer (also covers running stores like a message broker when modelled as a container).
|
|
95
|
+
description: |
|
|
96
|
+
Canonical C4 container kind for `c4_containers.type`, aligned with c4model.com/abstractions (per M-ADR 0155). A C4 container is something that must be running for the system to work — an application or a data store.
|
|
97
|
+
BOUND via `c4_containers.column_enums` since 3.0.0 (M-ADR 0203 §4.1, completing 0155's staged enforcement): a non-member value hard-fails build and validate. The 2.x-era legacy values are removed; their migration rule (0155's own): `External System` boxes belong in `c4_external_systems` (C4 L1 peer systems, not L2 containers); running infrastructure (broker, gateway, cache) retypes to Application or Data Store; pure deployment infrastructure (load balancer, DNS) leaves the container catalogue (it belongs in a C4 deployment diagram, which is not catalogued).
|
|
103
98
|
service_type:
|
|
104
|
-
description: 'Type of repository, declared in `orchestration/repo-config/*.yaml` as `service_type` and surfaced in `repositories.component_type` and `services.component_type`. The canonical builder uses this to decide which repos are runtime services (api_service, worker, gateway, frontend, mobile) and which are non-runtime (library, infrastructure, documentation). Whether a repo is a vertical-domain application is conveyed by its SDD manifest''s `profile: application-product`, not by a service_type tag — this enum is strictly about runtime artefact shape (per resolution of adopt-canonical-catalogue-builder.md §7.1).
|
|
105
|
-
|
|
106
|
-
'
|
|
107
99
|
values:
|
|
108
100
|
- value: api_service
|
|
109
101
|
description: REST/GraphQL/RPC service exposing an API.
|
|
@@ -137,12 +129,9 @@ enums:
|
|
|
137
129
|
description: Docs-only repo.
|
|
138
130
|
runtime: false
|
|
139
131
|
emits_service_row: false
|
|
132
|
+
description: |
|
|
133
|
+
Type of repository, declared in `orchestration/repo-config/*.yaml` as `service_type` and surfaced in `repositories.component_type` and `services.component_type`. The canonical builder uses this to decide which repos are runtime services (api_service, worker, gateway, frontend, mobile) and which are non-runtime (library, infrastructure, documentation). Whether a repo is a vertical-domain application is conveyed by its SDD manifest's `profile: application-product`, not by a service_type tag — this enum is strictly about runtime artefact shape (per resolution of adopt-canonical-catalogue-builder.md §7.1).
|
|
140
134
|
capability_exemption_reason:
|
|
141
|
-
description: 'Why a catalogued repository deliberately bears no capability, per M-ADR 0188 §4.2. Closed vocabulary: reason codes make exemptions countable and trendable (a growing `prototype` or `archived` population is itself an estate signal), where free text would bury them. Extensions are method-owned and proceed by ADR amendment, so that adopters cannot locally widen the exemption surface to silence findings.
|
|
142
|
-
|
|
143
|
-
ENFORCED, not advisory. The builder drops a `repo_capability_exemption` row whose reason is outside this vocabulary and emits a `convention` finding. The repository then resolves to nothing and is reported as an orphan — which is the point. If an unrecognised reason still exempted the repo, `reason: whatever` would be a universal silencer.
|
|
144
|
-
|
|
145
|
-
'
|
|
146
135
|
values:
|
|
147
136
|
- value: infrastructure
|
|
148
137
|
description: Provisions or operates the estate; realises no product capability.
|
|
@@ -156,23 +145,19 @@ enums:
|
|
|
156
145
|
description: Exploratory; not part of the product model.
|
|
157
146
|
- value: archived
|
|
158
147
|
description: Retained for reference; no longer live.
|
|
148
|
+
description: |
|
|
149
|
+
Why a catalogued repository deliberately bears no capability, per M-ADR 0188 §4.2. Closed vocabulary: reason codes make exemptions countable and trendable (a growing `prototype` or `archived` population is itself an estate signal), where free text would bury them. Extensions are method-owned and proceed by ADR amendment, so that adopters cannot locally widen the exemption surface to silence findings.
|
|
150
|
+
ENFORCED, not advisory. The builder drops a `repo_capability_exemption` row whose reason is outside this vocabulary and emits a `convention` finding. The repository then resolves to nothing and is reported as an orphan — which is the point. If an unrecognised reason still exempted the repo, `reason: whatever` would be a universal silencer.
|
|
159
151
|
service_capability_exemption_reason:
|
|
160
|
-
description: 'Why a catalogued service deliberately bears no capability, per M-ADR 0133 §4.2b. Closed vocabulary — narrower than `capability_exemption_reason` by design: a repository can be exempt for six reasons (packaging, tooling, provenance), but a SERVICE, by definition, already runs something — the repository-tier distinctions that don''t reproduce at the service tier (pure IaC, build tooling, test scaffolding, vendored code) fold into `platform-internal`, since a service that exists at all is doing platform-internal work if it isn''t product-facing.
|
|
161
|
-
|
|
162
|
-
ENFORCED, not advisory. The builder drops a `service_capability_exemption` row whose reason is outside this vocabulary and emits a `convention` finding. The service then resolves to nothing and is reported per the coverage predicate''s tier-scoped verdict set — which is the point.
|
|
163
|
-
|
|
164
|
-
'
|
|
165
152
|
values:
|
|
166
153
|
- value: platform-internal
|
|
167
154
|
description: Runs, but serves the platform's own operation rather than a product capability (e.g. an internal control-plane or ops service).
|
|
168
155
|
- value: deprecated
|
|
169
156
|
description: No longer live; retained for reference or wind-down.
|
|
157
|
+
description: |
|
|
158
|
+
Why a catalogued service deliberately bears no capability, per M-ADR 0133 §4.2b. Closed vocabulary — narrower than `capability_exemption_reason` by design: a repository can be exempt for six reasons (packaging, tooling, provenance), but a SERVICE, by definition, already runs something — the repository-tier distinctions that don't reproduce at the service tier (pure IaC, build tooling, test scaffolding, vendored code) fold into `platform-internal`, since a service that exists at all is doing platform-internal work if it isn't product-facing.
|
|
159
|
+
ENFORCED, not advisory. The builder drops a `service_capability_exemption` row whose reason is outside this vocabulary and emits a `convention` finding. The service then resolves to nothing and is reported per the coverage predicate's tier-scoped verdict set — which is the point.
|
|
170
160
|
external_system_exemption_reason:
|
|
171
|
-
description: 'Why an external-system candidate is ACCOUNTED FOR at the estate boundary, per M-ADR 0189 §4.6 (WS15; wording corrected by F16, 2.32.0): five values assert another party owns the system, and two assert the estate/organisation owns it but it has no model home yet — forcing the latter through the former would demand a false reason, and a false reason is worse than silence. The adjudicator can prove a candidate internal; it cannot prove one accounted-for — that is an assertion the author is accountable for, in the shape M-ADR 0188 ratified for repositories. Closed vocabulary, method-owned, extended only by ADR amendment, so adopters cannot locally widen the exemption surface to silence the unverified-candidate coverage finding.
|
|
172
|
-
|
|
173
|
-
ENFORCED, not advisory: the builder drops a row whose reason is outside this vocabulary (convention finding) and the candidate stays unverified — which is the point. An unrecognised reason must not succeed at the one thing an exemption does.
|
|
174
|
-
|
|
175
|
-
'
|
|
176
161
|
values:
|
|
177
162
|
- value: third-party-saas
|
|
178
163
|
description: An operated vendor service the estate consumes (billing, auth, maps, email…).
|
|
@@ -185,22 +170,21 @@ enums:
|
|
|
185
170
|
- value: public-infrastructure
|
|
186
171
|
description: Public networks, registries, or services no party in the estate operates.
|
|
187
172
|
- value: estate-owned-unmodelled
|
|
188
|
-
description:
|
|
173
|
+
description: "Operated by this estate but with no SDD or container home yet — the row is an accounted-for stand-in, and this population is the estate's modelling backlog, countable (F16, 2.32.0). Not an assertion of externality: an assertion of accountability for a boundary row."
|
|
189
174
|
- value: organisation-internal
|
|
190
175
|
description: Owned elsewhere in the same organisation, outside this estate's modelling boundary (F16, 2.32.0).
|
|
176
|
+
description: |
|
|
177
|
+
Why an external-system candidate is ACCOUNTED FOR at the estate boundary, per M-ADR 0189 §4.6 (WS15; wording corrected by F16, 2.32.0): five values assert another party owns the system, and two assert the estate/organisation owns it but it has no model home yet — forcing the latter through the former would demand a false reason, and a false reason is worse than silence. The adjudicator can prove a candidate internal; it cannot prove one accounted-for — that is an assertion the author is accountable for, in the shape M-ADR 0188 ratified for repositories. Closed vocabulary, method-owned, extended only by ADR amendment, so adopters cannot locally widen the exemption surface to silence the unverified-candidate coverage finding.
|
|
178
|
+
ENFORCED, not advisory: the builder drops a row whose reason is outside this vocabulary (convention finding) and the candidate stays unverified — which is the point. An unrecognised reason must not succeed at the one thing an exemption does.
|
|
191
179
|
scaffold_status:
|
|
192
|
-
description: 'Lifecycle of a scaffold declaration, in `scaffolds.status`. AUTHORED in the manifest, copied by the builder: closing a scaffold is a recorded act of the unit of work finishing (M-ADR 0207 §4.3), not a computed consequence — the delta instrument reports a closed scaffold whose delta is not zero as a finding, it never closes one itself.
|
|
193
|
-
|
|
194
|
-
'
|
|
195
180
|
values:
|
|
196
181
|
- value: open
|
|
197
182
|
description: The unit of work is in flight. `declared` items are a state, not a defect (M-ADR 0207 §4.2).
|
|
198
183
|
- value: closed
|
|
199
184
|
description: The author has recorded the unit of work as done. A `declared` item under a closed scaffold presumes the scaffold right — the work is incomplete — and is reported (M-ADR 0207 §4.3).
|
|
185
|
+
description: |
|
|
186
|
+
Lifecycle of a scaffold declaration, in `scaffolds.status`. AUTHORED in the manifest, copied by the builder: closing a scaffold is a recorded act of the unit of work finishing (M-ADR 0207 §4.3), not a computed consequence — the delta instrument reports a closed scaffold whose delta is not zero as a finding, it never closes one itself.
|
|
200
187
|
scaffold_item_kind:
|
|
201
|
-
description: 'The grain of a scaffold declaration item, in `scaffold_items.item_kind`. Declares which family of catalogue surface the item promises; `target_kind` names the specific catalogue.
|
|
202
|
-
|
|
203
|
-
'
|
|
204
188
|
values:
|
|
205
189
|
- value: entity
|
|
206
190
|
description: A node catalogue row the work will add (a service, capability, feature, screen, …). target_ref is the declared id in that catalogue's vocabulary.
|
|
@@ -208,17 +192,17 @@ enums:
|
|
|
208
192
|
description: An edge catalogue row the work will add. Endpoints are declared in edge_source_ref/edge_target_ref, mapped to the edge catalogue's FK columns in schema declaration order.
|
|
209
193
|
- value: contract
|
|
210
194
|
description: A contract artefact the work will introduce or amend. target_ref is the repo-relative spec path, matching `contracts.spec_path`.
|
|
195
|
+
description: |
|
|
196
|
+
The grain of a scaffold declaration item, in `scaffold_items.item_kind`. Declares which family of catalogue surface the item promises; `target_kind` names the specific catalogue.
|
|
211
197
|
scaffold_item_state:
|
|
212
|
-
description: 'Realisation state of a scaffold item, in `scaffold_items.state`. DERIVED by the builder''s resolution pass against the same build''s catalogue rows — never authored. The manifest declares intent; this column records whether the intent is realised in the corpus the build read. Staleness is deliberately NOT a value here: it is a coverage-time verdict against `scaffolds.corpus_ref` (M-ADR 0207 §4.6), because a git-derived value in a derived row would break rebuild determinism against unchanged authored inputs.
|
|
213
|
-
|
|
214
|
-
'
|
|
215
198
|
values:
|
|
216
199
|
- value: declared
|
|
217
200
|
description: The target does not (yet) resolve in the built catalogues. Under an open scaffold this is the computable backlog; under a closed one it is a reported finding (M-ADR 0207 §4.2/§4.3).
|
|
218
201
|
- value: realised
|
|
219
202
|
description: The target resolves in the built catalogues. The declaration is met for this item.
|
|
203
|
+
description: |
|
|
204
|
+
Realisation state of a scaffold item, in `scaffold_items.state`. DERIVED by the builder's resolution pass against the same build's catalogue rows — never authored. The manifest declares intent; this column records whether the intent is realised in the corpus the build read. Staleness is deliberately NOT a value here: it is a coverage-time verdict against `scaffolds.corpus_ref` (M-ADR 0207 §4.6), because a git-derived value in a derived row would break rebuild determinism against unchanged authored inputs.
|
|
220
205
|
interaction_pattern:
|
|
221
|
-
description: 'How a capability''s declared dependency on a service is coupled at RUNTIME — M-ADR 0171''s closed interaction-pattern vocabulary (the union of its ingestion and invocation sets), reused on `capability_service.interaction_pattern` per M-ADR 0211 §4.1 and not widened. BOUND because the value comes from the traceability manifest, a method-mandated authoring surface (M-ADR 0210 §4.5). A NON-RUNTIME coupling — build-time code generation, a load-time singleton, packaging, an authoring sequence — leaves the column EMPTY and states its kind in the manifest''s dependency_notes; that is T4''s excluded-by-class case and reaches no band 5. An entry declares ONE coupling: two tokens in one entry is two entries. Measured at two estates before binding: 17 of 18 runtime couplings mapped onto exactly one token; none needed a token the vocabulary lacks.'
|
|
222
206
|
values:
|
|
223
207
|
- value: event-stream-consume
|
|
224
208
|
description: Subscribe to and drain a broker / stream / feed the provider produces; the consumer drains a durable, ordered channel (Event-Driven / Polling Consumer over a Message Channel).
|
|
@@ -234,27 +218,27 @@ enums:
|
|
|
234
218
|
description: Submit a request; the result returns later via a separate channel, correlated by identifier (Request-Reply, asynchronous + Correlation Identifier).
|
|
235
219
|
- value: publish
|
|
236
220
|
description: Fire-and-forget write to a broker / queue / endpoint with no awaited response (Publish-Subscribe / fire-and-forget Message).
|
|
221
|
+
description: "How a capability's declared dependency on a service is coupled at RUNTIME — M-ADR 0171's closed interaction-pattern vocabulary (the union of its ingestion and invocation sets), reused on `capability_service.interaction_pattern` per M-ADR 0211 §4.1 and not widened. BOUND because the value comes from the traceability manifest, a method-mandated authoring surface (M-ADR 0210 §4.5). A NON-RUNTIME coupling — build-time code generation, a load-time singleton, packaging, an authoring sequence — leaves the column EMPTY and states its kind in the manifest's dependency_notes; that is T4's excluded-by-class case and reaches no band 5. An entry declares ONE coupling: two tokens in one entry is two entries. Measured at two estates before binding: 17 of 18 runtime couplings mapped onto exactly one token; none needed a token the vocabulary lacks."
|
|
237
222
|
event_participation:
|
|
238
|
-
description: 'The part a service, capability or feature plays toward an event, in `service_event.role`, `capability_event.role` and `feature_event.role`. `service_event.role` is also M-ADR 0206 §4.2''s role-conditional impact flow (publishes → toward-target, consumes → toward-source). Bound at 3.9.0 (M-ADR 0210 §4.5): the values come from repo-config and derived edges, method-mandated surfaces; every row at both adopter estates'' committed aggregates was in-vocabulary when bound.'
|
|
239
223
|
values:
|
|
240
224
|
- value: publishes
|
|
241
225
|
description: The participant emits the event.
|
|
242
226
|
- value: consumes
|
|
243
227
|
description: The participant receives the event.
|
|
228
|
+
description: "The part a service, capability or feature plays toward an event, in `service_event.role`, `capability_event.role` and `feature_event.role`. `service_event.role` is also M-ADR 0206 §4.2's role-conditional impact flow (publishes → toward-target, consumes → toward-source). Bound at 3.9.0 (M-ADR 0210 §4.5): the values come from repo-config and derived edges, method-mandated surfaces; every row at both adopter estates' committed aggregates was in-vocabulary when bound."
|
|
244
229
|
contract_participation:
|
|
245
|
-
description: The part a service plays toward a contract, in `service_contract.role`. Bound at 3.9.0 (M-ADR 0210 §4.5); one estate's rows were all `exposes`, the other's all `consumes` — the union is the vocabulary, and each estate's usage was in it.
|
|
246
230
|
values:
|
|
247
231
|
- value: exposes
|
|
248
232
|
description: The service publishes the contract as its own surface.
|
|
249
233
|
- value: consumes
|
|
250
234
|
description: The service depends on a contract another service exposes.
|
|
235
|
+
description: The part a service plays toward a contract, in `service_contract.role`. Bound at 3.9.0 (M-ADR 0210 §4.5); one estate's rows were all `exposes`, the other's all `consumes` — the union is the vocabulary, and each estate's usage was in it.
|
|
251
236
|
consumption_role:
|
|
252
|
-
description: 'The part a product plays toward a capability or service it depends on, in `product_capability.role` and `product_service.role`. EXACTLY ONE VALUE, deliberately: every row at both estates carries `consumes`, and a column with one value is a population of one (M-ADR 0200 §4.10). Bound so the constant is DECLARED rather than accidental — a second value arriving is then a vocabulary decision with a finding, not a silent widening.'
|
|
253
237
|
values:
|
|
254
238
|
- value: consumes
|
|
255
239
|
description: The product depends on / consumes the target.
|
|
240
|
+
description: "The part a product plays toward a capability or service it depends on, in `product_capability.role` and `product_service.role`. EXACTLY ONE VALUE, deliberately: every row at both estates carries `consumes`, and a column with one value is a population of one (M-ADR 0200 §4.10). Bound so the constant is DECLARED rather than accidental — a second value arriving is then a vocabulary decision with a finding, not a silent widening."
|
|
256
241
|
journey_participation:
|
|
257
|
-
description: 'The kind of participation a persona has in a user journey, in `persona_journey.role` — the ADR 0210 worked example''s `participation`. Bound at 3.9.0 (M-ADR 0210 §4.5): parsed from the persona spec''s declared `Roles:` line, a method template surface; every row at both estates was in-vocabulary when bound.'
|
|
258
242
|
values:
|
|
259
243
|
- value: primary
|
|
260
244
|
description: The persona the journey is designed around.
|
|
@@ -262,6 +246,14 @@ enums:
|
|
|
262
246
|
description: A persona the journey passes to or from.
|
|
263
247
|
- value: supporting
|
|
264
248
|
description: A persona present in the journey without owning it.
|
|
249
|
+
description: "The kind of participation a persona has in a user journey, in `persona_journey.role` — the ADR 0210 worked example's `participation`. Bound at 3.9.0 (M-ADR 0210 §4.5): parsed from the persona spec's declared `Roles:` line, a method template surface; every row at both estates was in-vocabulary when bound."
|
|
250
|
+
model_notation:
|
|
251
|
+
values:
|
|
252
|
+
- value: mermaid-erd
|
|
253
|
+
description: M-ADR 0042's diagram grammar (data-model.mermaid.md) — the pre-Decision-1 form; migrates at the model's next requirements pass.
|
|
254
|
+
- value: typeql
|
|
255
|
+
description: The documented TypeQL subset of M-ADR 0210 §4.2 (data-model.tql) — the canonical form of every model authored from 2026-09-17 and of every migrated model.
|
|
256
|
+
description: "The notation a domain-model artefact is written in. Bound at 3.11.0 as the instrument of M-ADR 0210 §4.6 Decision 2: the builder derives it from the file, the metric line counts it, and a mermaid-erd row becomes an error at the first rebuild after the sunset 2027-03-31."
|
|
265
257
|
catalogues:
|
|
266
258
|
domains:
|
|
267
259
|
primary_key: id
|
|
@@ -320,7 +312,7 @@ catalogues:
|
|
|
320
312
|
- name: category
|
|
321
313
|
type: string
|
|
322
314
|
nullable: true
|
|
323
|
-
description:
|
|
315
|
+
description: "Architectural classification per docs/method/methods/standards/product-category-taxonomy.md. Values: platform-root | platform-subsystem | application-product | integration-provider | integration-umbrella | support-repo. Determines whether the Product gets a c4_systems row."
|
|
324
316
|
- name: doc_path
|
|
325
317
|
type: string
|
|
326
318
|
nullable: false
|
|
@@ -328,7 +320,7 @@ catalogues:
|
|
|
328
320
|
- name: lifecycle
|
|
329
321
|
type: string
|
|
330
322
|
nullable: true
|
|
331
|
-
description:
|
|
323
|
+
description: "planned | active | deprecated (default active when empty). Owner-declared product lifecycle from the SDD manifest's lifecycle: field (sdd-manifest-schema 1.1.0; `planned` added 1.9.0 / catalogue 2.47.0). `planned` = the product is real and intended but does not exist yet, which is the normal opening state of a forward-authored product — so a forward estate that has generated nothing should read `planned`, not the `active` the empty default implies. Distinct from status (documentation maturity): lifecycle is a fact about the PRODUCT, status about the DOCUMENT, and both can hold at once — a product can be reviewed AND deprecated, or planned AND thinly documented. Added in 2.22.0."
|
|
332
324
|
- name: deprecated_date
|
|
333
325
|
type: date
|
|
334
326
|
nullable: true
|
|
@@ -336,31 +328,31 @@ catalogues:
|
|
|
336
328
|
- name: successor_sdd_id
|
|
337
329
|
type: string
|
|
338
330
|
nullable: true
|
|
339
|
-
description:
|
|
331
|
+
description: "For deprecated products: sdd_id of the superseding SDD. Same vocabulary as sdd_id/source_sdd_id (NOT products.id). Soft reference — the aggregator orphan-checks it against contributing sdd_ids ([finding] orphan when unresolved), never a hard FK: the successor may live outside the aggregation scope. Added in 2.22.0."
|
|
340
332
|
- name: exemplar
|
|
341
333
|
type: string
|
|
342
334
|
nullable: true
|
|
343
|
-
description:
|
|
335
|
+
description: "`true` when this SDD is a reference exemplar — it demonstrates a profile shape rather than modelling a real product or provider relationship. Empty otherwise, which is the unmarked norm (absent in the manifest = a real SDD, no finding). From the manifest's `exemplar:` field (sdd-manifest-schema 1.8.0). PROFILE-AGNOSTIC, unlike surface/packaging/application_archetype which are application-product-only — the first exemplar cohort found was integration-products. DERIVED, not authorable: this column and `integrations.exemplar` both come from the one manifest field, so they cannot disagree; two independently authored copies could, which is the failure mode the trait exists to remove. No builder branches on it — it is emitted to be filterable and nothing consumes it, because an implicit exclusion inside a rollup is much harder to remove than to add. Added in 2.46.0."
|
|
344
336
|
- name: surface
|
|
345
337
|
type: string
|
|
346
338
|
nullable: true
|
|
347
|
-
description:
|
|
339
|
+
description: "ui | api (empty for non-application-product). Application-product surface trait from the manifest's surface: field (M-ADR 0167, sdd-manifest-schema 1.2.0). Empty on non-application products. Added in 2.35.0."
|
|
348
340
|
- name: packaging
|
|
349
341
|
type: string
|
|
350
342
|
nullable: true
|
|
351
|
-
description:
|
|
343
|
+
description: "vendor-saas | self-operated (empty for non-application-product). Application-product packaging trait from the manifest's packaging: field (M-ADR 0175, sdd-manifest-schema 1.7.0). `vendor-saas` marks a packaged-SaaS product — vendor-operated runtime (no own deployment evidence) and a vendor-versioned base capability set. Absent in the manifest resolves to `self-operated`, the unmarked norm. Per M-ADR 0175 §4 no builder may branch on this trait beyond evidence/deployment handling. Column position follows the M-ADR 0194 §3.1 canonical axis order (surface, packaging, application_archetype). Added in 2.41.0."
|
|
352
344
|
- name: application_archetype
|
|
353
345
|
type: string
|
|
354
346
|
nullable: true
|
|
355
|
-
description:
|
|
347
|
+
description: "Application-product shape classification from the manifest's application_archetype: field (M-ADR 0191, sdd-manifest-schema 1.2.0). Resolved-enum over a tiered vocabulary (method: unclassified; reference-architecture bundle; adopter). Defaults to 'unclassified' for application-product (with a coverage finding), empty for other profiles. Distinct from the M-ADR 0173 domain archetype and M-ADR 0169 openui archetype. Added in 2.35.0."
|
|
356
348
|
- name: synthesis_quality
|
|
357
349
|
type: int
|
|
358
350
|
nullable: true
|
|
359
|
-
description:
|
|
351
|
+
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)."
|
|
360
352
|
- name: synthesis_band
|
|
361
353
|
type: string
|
|
362
354
|
nullable: true
|
|
363
|
-
description:
|
|
355
|
+
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."
|
|
364
356
|
- name: last_assessed
|
|
365
357
|
type: date
|
|
366
358
|
nullable: true
|
|
@@ -385,7 +377,6 @@ catalogues:
|
|
|
385
377
|
nullable: true
|
|
386
378
|
applications:
|
|
387
379
|
primary_key: id
|
|
388
|
-
description: Filtered view of products where profile = application-product.
|
|
389
380
|
columns:
|
|
390
381
|
- name: id
|
|
391
382
|
type: string
|
|
@@ -405,7 +396,7 @@ catalogues:
|
|
|
405
396
|
- name: category
|
|
406
397
|
type: string
|
|
407
398
|
nullable: true
|
|
408
|
-
description:
|
|
399
|
+
description: "Architectural classification per docs/method/methods/standards/product-category-taxonomy.md. Values: platform-root | platform-subsystem | application-product | integration-provider | integration-umbrella | support-repo. Determines whether the Product gets a c4_systems row."
|
|
409
400
|
- name: doc_path
|
|
410
401
|
type: string
|
|
411
402
|
nullable: false
|
|
@@ -413,7 +404,7 @@ catalogues:
|
|
|
413
404
|
- name: lifecycle
|
|
414
405
|
type: string
|
|
415
406
|
nullable: true
|
|
416
|
-
description:
|
|
407
|
+
description: "planned | active | deprecated (default active when empty). Owner-declared product lifecycle from the SDD manifest's lifecycle: field (sdd-manifest-schema 1.1.0; `planned` added 1.9.0 / catalogue 2.47.0). `planned` = the product is real and intended but does not exist yet, which is the normal opening state of a forward-authored product — so a forward estate that has generated nothing should read `planned`, not the `active` the empty default implies. Distinct from status (documentation maturity): lifecycle is a fact about the PRODUCT, status about the DOCUMENT, and both can hold at once — a product can be reviewed AND deprecated, or planned AND thinly documented. Added in 2.22.0."
|
|
417
408
|
- name: deprecated_date
|
|
418
409
|
type: date
|
|
419
410
|
nullable: true
|
|
@@ -421,31 +412,31 @@ catalogues:
|
|
|
421
412
|
- name: successor_sdd_id
|
|
422
413
|
type: string
|
|
423
414
|
nullable: true
|
|
424
|
-
description:
|
|
415
|
+
description: "For deprecated products: sdd_id of the superseding SDD. Same vocabulary as sdd_id/source_sdd_id (NOT products.id). Soft reference — the aggregator orphan-checks it against contributing sdd_ids ([finding] orphan when unresolved), never a hard FK: the successor may live outside the aggregation scope. Added in 2.22.0."
|
|
425
416
|
- name: exemplar
|
|
426
417
|
type: string
|
|
427
418
|
nullable: true
|
|
428
|
-
description:
|
|
419
|
+
description: "`true` when this SDD is a reference exemplar — it demonstrates a profile shape rather than modelling a real product or provider relationship. Empty otherwise, which is the unmarked norm (absent in the manifest = a real SDD, no finding). From the manifest's `exemplar:` field (sdd-manifest-schema 1.8.0). PROFILE-AGNOSTIC, unlike surface/packaging/application_archetype which are application-product-only — the first exemplar cohort found was integration-products. DERIVED, not authorable: this column and `integrations.exemplar` both come from the one manifest field, so they cannot disagree; two independently authored copies could, which is the failure mode the trait exists to remove. No builder branches on it — it is emitted to be filterable and nothing consumes it, because an implicit exclusion inside a rollup is much harder to remove than to add. Added in 2.46.0."
|
|
429
420
|
- name: surface
|
|
430
421
|
type: string
|
|
431
422
|
nullable: true
|
|
432
|
-
description:
|
|
423
|
+
description: "ui | api (empty for non-application-product). Application-product surface trait from the manifest's surface: field (M-ADR 0167, sdd-manifest-schema 1.2.0). Empty on non-application products. Added in 2.35.0."
|
|
433
424
|
- name: packaging
|
|
434
425
|
type: string
|
|
435
426
|
nullable: true
|
|
436
|
-
description:
|
|
427
|
+
description: "vendor-saas | self-operated (empty for non-application-product). Application-product packaging trait from the manifest's packaging: field (M-ADR 0175, sdd-manifest-schema 1.7.0). `vendor-saas` marks a packaged-SaaS product — vendor-operated runtime (no own deployment evidence) and a vendor-versioned base capability set. Absent in the manifest resolves to `self-operated`, the unmarked norm. Per M-ADR 0175 §4 no builder may branch on this trait beyond evidence/deployment handling. Column position follows the M-ADR 0194 §3.1 canonical axis order (surface, packaging, application_archetype). Added in 2.41.0."
|
|
437
428
|
- name: application_archetype
|
|
438
429
|
type: string
|
|
439
430
|
nullable: true
|
|
440
|
-
description:
|
|
431
|
+
description: "Application-product shape classification from the manifest's application_archetype: field (M-ADR 0191, sdd-manifest-schema 1.2.0). Resolved-enum over a tiered vocabulary (method: unclassified; reference-architecture bundle; adopter). Defaults to 'unclassified' for application-product (with a coverage finding), empty for other profiles. Distinct from the M-ADR 0173 domain archetype and M-ADR 0169 openui archetype. Added in 2.35.0."
|
|
441
432
|
- name: synthesis_quality
|
|
442
433
|
type: int
|
|
443
434
|
nullable: true
|
|
444
|
-
description:
|
|
435
|
+
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)."
|
|
445
436
|
- name: synthesis_band
|
|
446
437
|
type: string
|
|
447
438
|
nullable: true
|
|
448
|
-
description:
|
|
439
|
+
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."
|
|
449
440
|
- name: last_assessed
|
|
450
441
|
type: date
|
|
451
442
|
nullable: true
|
|
@@ -464,13 +455,13 @@ catalogues:
|
|
|
464
455
|
type: string
|
|
465
456
|
nullable: true
|
|
466
457
|
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.
|
|
458
|
+
description: Filtered view of products where profile = application-product.
|
|
467
459
|
foreign_keys:
|
|
468
460
|
- column: domain_id
|
|
469
461
|
references: domains.id
|
|
470
462
|
nullable: true
|
|
471
463
|
integrations:
|
|
472
464
|
primary_key: id
|
|
473
|
-
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`.
|
|
474
465
|
columns:
|
|
475
466
|
- name: id
|
|
476
467
|
type: string
|
|
@@ -500,7 +491,7 @@ catalogues:
|
|
|
500
491
|
- name: ingestion_pattern
|
|
501
492
|
type: string
|
|
502
493
|
nullable: true
|
|
503
|
-
description:
|
|
494
|
+
description: "Closed method-tier enum (event-stream-consume | webhook | socket-listen | poll) from the manifest's SDD-level `ingestionPattern` — HOW the integration acquires data (M-ADR 0171 §4.2). SCALAR: §9.3's multi-valued allowance was withdrawn in §10.5. Empty when undeclared or on an outbound-only integration. Empty on `sub_integrations` rows — the patterns are declared once at SDD level and are not per-provider. Added in 2.45.0."
|
|
504
495
|
- name: invocation_pattern
|
|
505
496
|
type: string
|
|
506
497
|
nullable: true
|
|
@@ -512,7 +503,7 @@ catalogues:
|
|
|
512
503
|
- name: exemplar
|
|
513
504
|
type: string
|
|
514
505
|
nullable: true
|
|
515
|
-
description:
|
|
506
|
+
description: "`true` when the emitting SDD is a reference exemplar (demonstrates a profile shape rather than modelling a real provider relationship); empty otherwise. Derived from the SDD manifest's `exemplar:` field (sdd-manifest-schema 1.8.0), same source as `products.exemplar` — neither column is independently authorable. Carried on `sub_integrations` rows too, INHERITED from the emitting SDD. That deliberately differs from `ingestion_pattern`/`invocation_pattern`, which are empty on sub rows, and the difference is the point: a pattern is a MECHANISM (how this integration acquires data), genuinely one per SDD, whereas `exemplar` is a REALITY STATUS that propagates to everything the SDD emits — if the SDD is a demonstration then every provider relationship it declares is a demonstration. Leaving sub rows empty would flag the umbrella and count its demonstration sub-providers as real, reproducing the rollup overcount this column exists to fix one level down. Do not normalise it to match the pattern columns. The trade accepted: a real SDD with one demonstration sub-provider is unexpressible — a state that should not exist. Added in 2.46.0."
|
|
516
507
|
- name: source_sdd_id
|
|
517
508
|
type: string
|
|
518
509
|
nullable: true
|
|
@@ -521,6 +512,7 @@ catalogues:
|
|
|
521
512
|
type: string
|
|
522
513
|
nullable: true
|
|
523
514
|
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.
|
|
515
|
+
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`.
|
|
524
516
|
foreign_keys:
|
|
525
517
|
- column: domain_id
|
|
526
518
|
references: domains.id
|
|
@@ -530,18 +522,11 @@ catalogues:
|
|
|
530
522
|
nullable: true
|
|
531
523
|
integration_component:
|
|
532
524
|
primary_key: id
|
|
533
|
-
description: '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).
|
|
534
|
-
|
|
535
|
-
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.
|
|
536
|
-
|
|
537
|
-
The method deliberately does NOT enumerate `component_type` — that is the adopter''s own framework-role label (§9.1/§9.5), carried so an adopter''s role→pattern mapping stays machine-traceable. `transport`/`format`/`auth` are open strings for the same reason: they describe the wire, and the portable semantic is the pattern. Added in schema 2.43.0.
|
|
538
|
-
|
|
539
|
-
'
|
|
540
525
|
columns:
|
|
541
526
|
- name: id
|
|
542
527
|
type: string
|
|
543
528
|
nullable: false
|
|
544
|
-
description:
|
|
529
|
+
description: "{integration_id}__{component_id}. A duplicate emits a divergence finding and is dropped — two components of one integration cannot share an id."
|
|
545
530
|
- name: integration_id
|
|
546
531
|
type: string
|
|
547
532
|
nullable: false
|
|
@@ -553,7 +538,7 @@ catalogues:
|
|
|
553
538
|
- name: component_repo
|
|
554
539
|
type: string
|
|
555
540
|
nullable: true
|
|
556
|
-
description:
|
|
541
|
+
description: "OPTIONAL explicit code linkage from `components[].componentRepo` — the deployable (repositories.id / services.id) that realises this component. Empty is the normal case for a feed-level component: the tier is at interaction-surface granularity, not deployable granularity, and the method does not require a component to name a deployable (M-ADR 0171 §10.2). When declared it MUST resolve, since a declared link is a positive assertion the method can check. Added in 2.44.0."
|
|
557
542
|
- name: resolution
|
|
558
543
|
type: string
|
|
559
544
|
nullable: false
|
|
@@ -565,7 +550,7 @@ catalogues:
|
|
|
565
550
|
- name: direction
|
|
566
551
|
type: string
|
|
567
552
|
nullable: true
|
|
568
|
-
description:
|
|
553
|
+
description: "inbound | outbound | bidirectional, from `dataFlow.direction`. Determines which pattern field is meaningful: inbound → ingestion_pattern, outbound → invocation_pattern, internal components declare neither (M-ADR 0171 §9.1)."
|
|
569
554
|
- name: frequency
|
|
570
555
|
type: string
|
|
571
556
|
nullable: true
|
|
@@ -601,7 +586,7 @@ catalogues:
|
|
|
601
586
|
- name: declared_in
|
|
602
587
|
type: string
|
|
603
588
|
nullable: false
|
|
604
|
-
description:
|
|
589
|
+
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."
|
|
605
590
|
- name: source_sdd_id
|
|
606
591
|
type: string
|
|
607
592
|
nullable: true
|
|
@@ -610,6 +595,10 @@ catalogues:
|
|
|
610
595
|
type: string
|
|
611
596
|
nullable: true
|
|
612
597
|
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.
|
|
598
|
+
description: |
|
|
599
|
+
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).
|
|
600
|
+
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.
|
|
601
|
+
The method deliberately does NOT enumerate `component_type` — that is the adopter's own framework-role label (§9.1/§9.5), carried so an adopter's role→pattern mapping stays machine-traceable. `transport`/`format`/`auth` are open strings for the same reason: they describe the wire, and the portable semantic is the pattern. Added in schema 2.43.0.
|
|
613
602
|
foreign_keys:
|
|
614
603
|
- column: integration_id
|
|
615
604
|
references: integrations.id
|
|
@@ -631,7 +620,7 @@ catalogues:
|
|
|
631
620
|
- name: domain_id
|
|
632
621
|
type: string
|
|
633
622
|
nullable: true
|
|
634
|
-
description:
|
|
623
|
+
description: "Domain slug for a domain-scoped ADR (docs/domains/<slug>/…); 'platform' for a platform-scoped ADR (docs/platform/adr/), whose owner has that domain by construction; EMPTY for a method-scoped ADR (docs/method/adr/, docs/method/platform-adr/) — method ADRs are cross-cutting governance and belong to no domain. Nullable since 3.10.0 (M-ADR 0136 §4.3 amendment): before it, method ADRs were pinned to 'platform' and dangled in every platform-root without a domain of that name."
|
|
635
624
|
- name: decision_date
|
|
636
625
|
type: date
|
|
637
626
|
nullable: true
|
|
@@ -670,7 +659,7 @@ catalogues:
|
|
|
670
659
|
- name: id
|
|
671
660
|
type: string
|
|
672
661
|
nullable: false
|
|
673
|
-
description:
|
|
662
|
+
description: "Slug: {domain}-{term-slug} for uniqueness."
|
|
674
663
|
- name: term
|
|
675
664
|
type: string
|
|
676
665
|
nullable: false
|
|
@@ -688,7 +677,7 @@ catalogues:
|
|
|
688
677
|
- name: aliases
|
|
689
678
|
type: string
|
|
690
679
|
nullable: true
|
|
691
|
-
description: '
|
|
680
|
+
description: "';'-separated list."
|
|
692
681
|
- name: evidence
|
|
693
682
|
type: string
|
|
694
683
|
nullable: true
|
|
@@ -712,12 +701,11 @@ catalogues:
|
|
|
712
701
|
nullable: true
|
|
713
702
|
glossary_xref:
|
|
714
703
|
primary_key: id
|
|
715
|
-
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).'
|
|
716
704
|
columns:
|
|
717
705
|
- name: id
|
|
718
706
|
type: string
|
|
719
707
|
nullable: false
|
|
720
|
-
description:
|
|
708
|
+
description: "Composite: {source_id}__{relation}__{target_id}."
|
|
721
709
|
- name: source_id
|
|
722
710
|
type: string
|
|
723
711
|
nullable: false
|
|
@@ -728,6 +716,7 @@ catalogues:
|
|
|
728
716
|
type: string
|
|
729
717
|
nullable: false
|
|
730
718
|
description: alias-of | conflicts-with | references | supersedes (extended in schema 2.12.0 per M-ADR 0158).
|
|
719
|
+
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)."
|
|
731
720
|
foreign_keys:
|
|
732
721
|
- column: source_id
|
|
733
722
|
references: glossary_items.id
|
|
@@ -737,12 +726,11 @@ catalogues:
|
|
|
737
726
|
nullable: false
|
|
738
727
|
entity_glossary:
|
|
739
728
|
primary_key: id
|
|
740
|
-
description: 'Edge: data-model entity → canonical glossary term. Added in schema 2.12.0 per M-ADR 0158. Source: glossary-alignment-manifest.yaml `models[].entities[]` with status ∈ {aligned, matched_direct} and non-empty glossary_term. PK derives from (domain, entity_name, glossary_item) so same-domain multi-diagram entries collapse to one row; cross-domain entries (e.g. platform-wide conceptual model + domain-specific model) emit one row per domain — legitimate cross-level cataloguing.'
|
|
741
729
|
columns:
|
|
742
730
|
- name: id
|
|
743
731
|
type: string
|
|
744
732
|
nullable: false
|
|
745
|
-
description:
|
|
733
|
+
description: "Composite: {domain_id}__{entity_name_slug}__{glossary_item_id}."
|
|
746
734
|
- name: domain_id
|
|
747
735
|
type: string
|
|
748
736
|
nullable: false
|
|
@@ -768,6 +756,7 @@ catalogues:
|
|
|
768
756
|
type: string
|
|
769
757
|
nullable: true
|
|
770
758
|
description: The data-model entity this glossary mapping is about — an entities.id. The edge was always emitted per (domain, entity, glossary_term) and this end was missing from its keys (found at M-ADR 0210 flip 2; added at 3.9.0). Nullable until every builder populates it.
|
|
759
|
+
description: "Edge: data-model entity → canonical glossary term. Added in schema 2.12.0 per M-ADR 0158. Source: glossary-alignment-manifest.yaml `models[].entities[]` with status ∈ {aligned, matched_direct} and non-empty glossary_term. PK derives from (domain, entity_name, glossary_item) so same-domain multi-diagram entries collapse to one row; cross-domain entries (e.g. platform-wide conceptual model + domain-specific model) emit one row per domain — legitimate cross-level cataloguing."
|
|
771
760
|
foreign_keys:
|
|
772
761
|
- column: domain_id
|
|
773
762
|
references: domains.id
|
|
@@ -879,7 +868,7 @@ catalogues:
|
|
|
879
868
|
- name: status
|
|
880
869
|
type: string
|
|
881
870
|
nullable: false
|
|
882
|
-
description:
|
|
871
|
+
description: "Capability LIFECYCLE phase — this column carries ONE axis and the reader may rely on that. active | planned | exploration | deprecated. Default 'active'. History, because the shape of the mistake is the useful part: the prior three-member set (active|planned|deprecated) could not express what estates authored, so 3.5.0 widened it to six on measured evidence — 44 of one estate's 78 manifests were outside it (exploration 26, placeholder 11, detailed-pre-lock 6, first-draft 1), each recurring value varying WITHIN a domain, which is the ruled discriminator for a genuine phase over an authoring convention. But 3.6.0 RETRACTED `placeholder` and `detailed-pre-lock`: per M-ADR 0201 §1 those are rungs on the SPEC-AUTHORING ladder (`placeholder | first-draft | detailed-pre-lock`, plus §4.1's `reverse-derived`), declared in each spec's own `**Status:**` header and gated there by the spec-lifecycle gate. Admitting them here made one column carry two orthogonal axes, so a reader could not tell whether `placeholder` described the capability or its document. **Where the other axis lives: the spec header. Do not re-import it here.** `exploration` stays and is NOT authoring vocabulary — it is absent from 0201's ladder, has M-ADR 0089's workflow and named gates behind it, and describes the capability rather than its spec; a capability declaring it must carry a populated `traceability.exploration` block, and one that does not is a loud contradiction (validate-traceability enforces this; measured 0 of 26 violations). ⚠ A rule this column deliberately does NOT carry: `placeholder`'s. The obvious one (no authored features) was MEASURED FALSE — 4 of 11 carried features, one of them 9 — and the deeper reason no rule fit is that `placeholder` was never making a claim about the capability at all. That unwritable rule was the first symptom of the axis error, before anyone had named it. ⚠ DELIBERATELY NOT BOUND via column_enums, and this is staged rather than permanent: binding carries hard-fail teeth, and at 3.5.0 one out-of-vocabulary row remains (forward estate, `first-draft`, n=1, referred to that estate; the reverse estate measures ZERO across 180 manifests). An out-of-vocabulary value is CARRIED, not emptied and not rejected, and is reported as a convention finding by validate-traceability — nullable stays false and no cell is ever emptied, so the empty-means-unauthored-or-rejected ambiguity of the products.synthesis_band / quality_scores.gate precedents does not arise here. Bind only once that count is ZERO at both estates; binding a set not proven to cover what estates author is how synthesis_band earned its deprecation. On drift and enforcement, stated with its confound rather than as a slogan: the enforced sibling `contracts.status` drifted 1.2% (2 of 172) while this unenforced field drifted 56% (44 of 78) at the SAME estate — but the other estate's copy of this same unenforced field drifted 0% of 180, so enforcement is not the only variable. The difference is authoring shape: the forward estate hand-authors per capability across 13 domains and explores vocabulary doing it, while the reverse estate's manifests come from one largely uniform extraction process. That uniformity is itself the phase-vs-convention discriminator firing — a value uniform across a whole estate is tracking the process that wrote it."
|
|
883
872
|
- name: spec_path
|
|
884
873
|
type: string
|
|
885
874
|
nullable: true
|
|
@@ -887,7 +876,7 @@ catalogues:
|
|
|
887
876
|
- name: contract_provenance
|
|
888
877
|
type: string
|
|
889
878
|
nullable: true
|
|
890
|
-
description:
|
|
879
|
+
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 | locked | 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."
|
|
891
880
|
- name: source
|
|
892
881
|
type: string
|
|
893
882
|
nullable: false
|
|
@@ -903,7 +892,7 @@ catalogues:
|
|
|
903
892
|
- name: slice_scope
|
|
904
893
|
type: string
|
|
905
894
|
nullable: true
|
|
906
|
-
description:
|
|
895
|
+
description: "Per-slice marker when one capability legitimately covers multiple app groups or data subsets (e.g. a compliance capability spanning several regulated-fleet sub-groups). Same capability_id may appear across multiple rows when sliced; row identity is then `(id, slice_scope)`. Empty when the capability is not sliced. Per-slice AC numbering convention: AC1-ACN unsuffixed for the first slice; subsequent slices use AC numbering suffixed by slice. See `docs/method/methods/reverse/rubrics/reverse-platform-evidence-quality.md` §`slice_scope:` and `docs/method/methods/capability-spec-template.md` Guideline 9. Added in schema 2.9.0."
|
|
907
896
|
- name: source_sdd_id
|
|
908
897
|
type: string
|
|
909
898
|
nullable: true
|
|
@@ -924,14 +913,11 @@ catalogues:
|
|
|
924
913
|
nullable: true
|
|
925
914
|
feature_groups:
|
|
926
915
|
primary_key: id
|
|
927
|
-
description: 'Hierarchical grouping for features. First-class entity per resolution of adopt-canonical-catalogue-builder.md §7.2 — 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`.
|
|
928
|
-
|
|
929
|
-
'
|
|
930
916
|
columns:
|
|
931
917
|
- name: id
|
|
932
918
|
type: string
|
|
933
919
|
nullable: false
|
|
934
|
-
description:
|
|
920
|
+
description: "{product_id|capability_id}-group-{slug}[-{nested-slug}]."
|
|
935
921
|
- name: name
|
|
936
922
|
type: string
|
|
937
923
|
nullable: false
|
|
@@ -964,6 +950,8 @@ catalogues:
|
|
|
964
950
|
type: string
|
|
965
951
|
nullable: true
|
|
966
952
|
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.
|
|
953
|
+
description: |
|
|
954
|
+
Hierarchical grouping for features. First-class entity per resolution of adopt-canonical-catalogue-builder.md §7.2 — 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`.
|
|
967
955
|
foreign_keys:
|
|
968
956
|
- column: product_id
|
|
969
957
|
references: products.id
|
|
@@ -980,7 +968,7 @@ catalogues:
|
|
|
980
968
|
- name: id
|
|
981
969
|
type: string
|
|
982
970
|
nullable: false
|
|
983
|
-
description:
|
|
971
|
+
description: "{product_id|capability_id}-{feature-slug}."
|
|
984
972
|
- name: name
|
|
985
973
|
type: string
|
|
986
974
|
nullable: false
|
|
@@ -1005,7 +993,7 @@ catalogues:
|
|
|
1005
993
|
- name: maturity
|
|
1006
994
|
type: string
|
|
1007
995
|
nullable: true
|
|
1008
|
-
description:
|
|
996
|
+
description: "Standard: working | provisional | unknown | absent. Ecosystem-specific values may be added with parser awareness."
|
|
1009
997
|
- name: status
|
|
1010
998
|
type: string
|
|
1011
999
|
nullable: false
|
|
@@ -1013,7 +1001,7 @@ catalogues:
|
|
|
1013
1001
|
- name: source
|
|
1014
1002
|
type: string
|
|
1015
1003
|
nullable: false
|
|
1016
|
-
description:
|
|
1004
|
+
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."
|
|
1017
1005
|
- name: runway
|
|
1018
1006
|
type: string
|
|
1019
1007
|
nullable: true
|
|
@@ -1045,7 +1033,7 @@ catalogues:
|
|
|
1045
1033
|
- name: id
|
|
1046
1034
|
type: string
|
|
1047
1035
|
nullable: false
|
|
1048
|
-
description:
|
|
1036
|
+
description: "{product_id}-{persona-slug}."
|
|
1049
1037
|
- name: name
|
|
1050
1038
|
type: string
|
|
1051
1039
|
nullable: false
|
|
@@ -1076,7 +1064,7 @@ catalogues:
|
|
|
1076
1064
|
- name: id
|
|
1077
1065
|
type: string
|
|
1078
1066
|
nullable: false
|
|
1079
|
-
description:
|
|
1067
|
+
description: "{product_id}-{journey-slug}."
|
|
1080
1068
|
- name: name
|
|
1081
1069
|
type: string
|
|
1082
1070
|
nullable: false
|
|
@@ -1114,7 +1102,7 @@ catalogues:
|
|
|
1114
1102
|
- name: id
|
|
1115
1103
|
type: string
|
|
1116
1104
|
nullable: false
|
|
1117
|
-
description:
|
|
1105
|
+
description: "{domain}-{stem}-{kind} — the kind component joined the id at schema 3.0.0 (M-ADR 0203 §4.4), ending the kindless collision class where one service published as two contract families (openapi + proto) minted one id (measured cost: 1 row + 2 edges permanently unrepresentable, plus legitimate shared-contract citation flagged as divergence). Mechanical migration: new id = old id + '-' + kind; `sdd-cli catalogue migration-map` emits the pairs, and authored alias targets (M-ADR 0147) re-key automatically during the cut window."
|
|
1118
1106
|
- name: name
|
|
1119
1107
|
type: string
|
|
1120
1108
|
nullable: false
|
|
@@ -1177,7 +1165,6 @@ catalogues:
|
|
|
1177
1165
|
nullable: true
|
|
1178
1166
|
events:
|
|
1179
1167
|
primary_key: id
|
|
1180
|
-
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.'
|
|
1181
1168
|
columns:
|
|
1182
1169
|
- name: id
|
|
1183
1170
|
type: string
|
|
@@ -1194,11 +1181,11 @@ catalogues:
|
|
|
1194
1181
|
- name: transport
|
|
1195
1182
|
type: string
|
|
1196
1183
|
nullable: true
|
|
1197
|
-
description:
|
|
1184
|
+
description: "Open string per M-ADR 0156. Recommended values: kafka | sns | sqs | kinesis | eventbridge | mongodb-change-stream | nats | activemq | rabbitmq | jms | other. Values outside the recommended set emit [finding] convention."
|
|
1198
1185
|
- name: schema_path
|
|
1199
1186
|
type: string
|
|
1200
1187
|
nullable: true
|
|
1201
|
-
description:
|
|
1188
|
+
description: "Path to event schema (Avro .avsc or JSON-Schema .json/.schema.json). Nullable — leave empty for loosely-typed events (e.g. ActiveMQ JMS, NATS with payload_schema: {type: object}). Per M-ADR 0156."
|
|
1202
1189
|
- name: version
|
|
1203
1190
|
type: string
|
|
1204
1191
|
nullable: true
|
|
@@ -1214,6 +1201,7 @@ catalogues:
|
|
|
1214
1201
|
type: string
|
|
1215
1202
|
nullable: true
|
|
1216
1203
|
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.
|
|
1204
|
+
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."
|
|
1217
1205
|
foreign_keys:
|
|
1218
1206
|
- column: publisher_service_id
|
|
1219
1207
|
references: services.id
|
|
@@ -1234,7 +1222,7 @@ catalogues:
|
|
|
1234
1222
|
- name: product_id
|
|
1235
1223
|
type: string
|
|
1236
1224
|
nullable: true
|
|
1237
|
-
description:
|
|
1225
|
+
description: "Owning product, when the system corresponds to one. Nullable: every product is a system, but not every system is a product (external/SaaS systems have no owning product). Architectural products only (per category taxonomy). Relaxed to nullable in schema 2.11.0."
|
|
1238
1226
|
- name: kind
|
|
1239
1227
|
type: string
|
|
1240
1228
|
nullable: false
|
|
@@ -1262,14 +1250,11 @@ catalogues:
|
|
|
1262
1250
|
kind: enums.c4_system_kind
|
|
1263
1251
|
c4_containers:
|
|
1264
1252
|
primary_key: id
|
|
1265
|
-
description: '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.
|
|
1266
|
-
|
|
1267
|
-
'
|
|
1268
1253
|
columns:
|
|
1269
1254
|
- name: id
|
|
1270
1255
|
type: string
|
|
1271
1256
|
nullable: false
|
|
1272
|
-
description:
|
|
1257
|
+
description: "{system_id}-{container-slug}."
|
|
1273
1258
|
- name: name
|
|
1274
1259
|
type: string
|
|
1275
1260
|
nullable: false
|
|
@@ -1288,7 +1273,7 @@ catalogues:
|
|
|
1288
1273
|
- name: type
|
|
1289
1274
|
type: string
|
|
1290
1275
|
nullable: true
|
|
1291
|
-
description:
|
|
1276
|
+
description: "Canonical C4 container kind — bound to enums.c4_container_type (Application | Data Store) since 3.0.0, hard-fail (M-ADR 0203 §4.1 completing M-ADR 0155). The 2.x legacy values are removed: External System boxes belong in c4_external_systems; running infrastructure retypes; deployment infrastructure leaves the catalogue."
|
|
1292
1277
|
- name: technology
|
|
1293
1278
|
type: string
|
|
1294
1279
|
nullable: true
|
|
@@ -1303,6 +1288,8 @@ catalogues:
|
|
|
1303
1288
|
type: string
|
|
1304
1289
|
nullable: true
|
|
1305
1290
|
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.
|
|
1291
|
+
description: |
|
|
1292
|
+
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.
|
|
1306
1293
|
foreign_keys:
|
|
1307
1294
|
- column: system_id
|
|
1308
1295
|
references: c4_systems.id
|
|
@@ -1317,14 +1304,11 @@ catalogues:
|
|
|
1317
1304
|
type: enums.c4_container_type
|
|
1318
1305
|
c4_components:
|
|
1319
1306
|
primary_key: id
|
|
1320
|
-
description: '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.
|
|
1321
|
-
|
|
1322
|
-
'
|
|
1323
1307
|
columns:
|
|
1324
1308
|
- name: id
|
|
1325
1309
|
type: string
|
|
1326
1310
|
nullable: false
|
|
1327
|
-
description:
|
|
1311
|
+
description: "{container_id}-{component-slug}."
|
|
1328
1312
|
- name: name
|
|
1329
1313
|
type: string
|
|
1330
1314
|
nullable: false
|
|
@@ -1335,7 +1319,7 @@ catalogues:
|
|
|
1335
1319
|
- name: service_id
|
|
1336
1320
|
type: string
|
|
1337
1321
|
nullable: true
|
|
1338
|
-
description:
|
|
1322
|
+
description: "Denormalised: the service the parent container represents, when applicable."
|
|
1339
1323
|
- name: path
|
|
1340
1324
|
type: string
|
|
1341
1325
|
nullable: true
|
|
@@ -1350,6 +1334,8 @@ catalogues:
|
|
|
1350
1334
|
type: string
|
|
1351
1335
|
nullable: true
|
|
1352
1336
|
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.
|
|
1337
|
+
description: |
|
|
1338
|
+
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.
|
|
1353
1339
|
foreign_keys:
|
|
1354
1340
|
- column: container_id
|
|
1355
1341
|
references: c4_containers.id
|
|
@@ -1359,9 +1345,6 @@ catalogues:
|
|
|
1359
1345
|
nullable: true
|
|
1360
1346
|
c4_external_systems:
|
|
1361
1347
|
primary_key: id
|
|
1362
|
-
description: '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.
|
|
1363
|
-
|
|
1364
|
-
'
|
|
1365
1348
|
columns:
|
|
1366
1349
|
- name: id
|
|
1367
1350
|
type: string
|
|
@@ -1386,7 +1369,7 @@ catalogues:
|
|
|
1386
1369
|
- name: source_scope
|
|
1387
1370
|
type: string
|
|
1388
1371
|
nullable: true
|
|
1389
|
-
description:
|
|
1372
|
+
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."
|
|
1390
1373
|
- name: source_sdd_id
|
|
1391
1374
|
type: string
|
|
1392
1375
|
nullable: true
|
|
@@ -1395,6 +1378,8 @@ catalogues:
|
|
|
1395
1378
|
type: string
|
|
1396
1379
|
nullable: true
|
|
1397
1380
|
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.
|
|
1381
|
+
description: |
|
|
1382
|
+
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.
|
|
1398
1383
|
repositories:
|
|
1399
1384
|
primary_key: id
|
|
1400
1385
|
columns:
|
|
@@ -1446,7 +1431,7 @@ catalogues:
|
|
|
1446
1431
|
- name: languages
|
|
1447
1432
|
type: string
|
|
1448
1433
|
nullable: true
|
|
1449
|
-
description: '
|
|
1434
|
+
description: "';'-separated."
|
|
1450
1435
|
- name: doc_path
|
|
1451
1436
|
type: string
|
|
1452
1437
|
nullable: false
|
|
@@ -1469,12 +1454,11 @@ catalogues:
|
|
|
1469
1454
|
component_type: enums.service_type
|
|
1470
1455
|
domain_models:
|
|
1471
1456
|
primary_key: id
|
|
1472
|
-
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.'
|
|
1473
1457
|
columns:
|
|
1474
1458
|
- name: id
|
|
1475
1459
|
type: string
|
|
1476
1460
|
nullable: false
|
|
1477
|
-
description:
|
|
1461
|
+
description: "{domain_id}-data-model."
|
|
1478
1462
|
- name: name
|
|
1479
1463
|
type: string
|
|
1480
1464
|
nullable: false
|
|
@@ -1501,18 +1485,24 @@ catalogues:
|
|
|
1501
1485
|
type: string
|
|
1502
1486
|
nullable: true
|
|
1503
1487
|
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.
|
|
1488
|
+
- name: notation
|
|
1489
|
+
type: string
|
|
1490
|
+
nullable: true
|
|
1491
|
+
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."
|
|
1492
|
+
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."
|
|
1504
1493
|
foreign_keys:
|
|
1505
1494
|
- column: domain_id
|
|
1506
1495
|
references: domains.id
|
|
1507
1496
|
nullable: false
|
|
1497
|
+
column_enums:
|
|
1498
|
+
notation: enums.model_notation
|
|
1508
1499
|
entities:
|
|
1509
1500
|
primary_key: id
|
|
1510
|
-
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.'
|
|
1511
1501
|
columns:
|
|
1512
1502
|
- name: id
|
|
1513
1503
|
type: string
|
|
1514
1504
|
nullable: false
|
|
1515
|
-
description:
|
|
1505
|
+
description: "Slugged PK: {domain_id}-{entitySlug(name)}. For manifest-sourced rows with domain=platform-wide, the leading domain segment is empty (`-{entitySlug(name)}`) and the row carries a [finding] convention."
|
|
1516
1506
|
- name: name
|
|
1517
1507
|
type: string
|
|
1518
1508
|
nullable: false
|
|
@@ -1528,7 +1518,7 @@ catalogues:
|
|
|
1528
1518
|
- name: persistence_kind
|
|
1529
1519
|
type: string
|
|
1530
1520
|
nullable: true
|
|
1531
|
-
description:
|
|
1521
|
+
description: "Open string; recommended values: relational-table | document-collection | event-payload | dto | view | other. Values outside the recommended set fire `[finding] convention`."
|
|
1532
1522
|
- name: context
|
|
1533
1523
|
type: string
|
|
1534
1524
|
nullable: true
|
|
@@ -1553,6 +1543,7 @@ catalogues:
|
|
|
1553
1543
|
type: string
|
|
1554
1544
|
nullable: true
|
|
1555
1545
|
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.
|
|
1546
|
+
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."
|
|
1556
1547
|
foreign_keys:
|
|
1557
1548
|
- column: domain_id
|
|
1558
1549
|
references: domains.id
|
|
@@ -1565,7 +1556,6 @@ catalogues:
|
|
|
1565
1556
|
nullable: true
|
|
1566
1557
|
repo_capability:
|
|
1567
1558
|
primary_key: id
|
|
1568
|
-
description: 'Edge: repo contributes to capability. Forward-declared via repo-config `capabilities[]` (M-ADR 0188 §6.1) or the legacy multi-purpose `additional_context[]`; reverse-derived via capability_service ⋈ services.primary_repo_id and capability_feature ⋈ feature_repo.'
|
|
1569
1559
|
columns:
|
|
1570
1560
|
- name: id
|
|
1571
1561
|
type: string
|
|
@@ -1576,6 +1566,7 @@ catalogues:
|
|
|
1576
1566
|
- name: capability_id
|
|
1577
1567
|
type: string
|
|
1578
1568
|
nullable: false
|
|
1569
|
+
description: "Edge: repo contributes to capability. Forward-declared via repo-config `capabilities[]` (M-ADR 0188 §6.1) or the legacy multi-purpose `additional_context[]`; reverse-derived via capability_service ⋈ services.primary_repo_id and capability_feature ⋈ feature_repo."
|
|
1579
1570
|
foreign_keys:
|
|
1580
1571
|
- column: repo_id
|
|
1581
1572
|
references: repositories.id
|
|
@@ -1585,13 +1576,6 @@ catalogues:
|
|
|
1585
1576
|
nullable: false
|
|
1586
1577
|
repo_capability_exemption:
|
|
1587
1578
|
primary_key: id
|
|
1588
|
-
description: 'A repository''s declared, reasoned statement that it bears no product capability (M-ADR 0188 §4.3). Emitted from the repo-config `capability_exemption:` block.
|
|
1589
|
-
|
|
1590
|
-
This is deliberately a catalogue row rather than an inert YAML aside. An exemption is a modelling assertion and belongs in the model: it is then queryable at the aggregate tier, reviewable in the same surface as the capabilities it stands in for, and countable — so that a reviewer watching the exemption population grow can see it happen. Never net exemptions off against orphans in a metric.
|
|
1591
|
-
|
|
1592
|
-
The invariant it participates in (M-ADR 0188 §4.1): every `repositories` row must resolve, either by carrying a `repo_capability` edge or by declaring an exemption here. A row satisfying both is a declaration conflict, reported as a `divergence` finding.
|
|
1593
|
-
|
|
1594
|
-
'
|
|
1595
1579
|
columns:
|
|
1596
1580
|
- name: id
|
|
1597
1581
|
type: string
|
|
@@ -1606,6 +1590,10 @@ catalogues:
|
|
|
1606
1590
|
type: string
|
|
1607
1591
|
nullable: false
|
|
1608
1592
|
description: Mandatory, non-empty. The reason code makes exemptions countable; the note makes them reviewable. A row with an empty note is dropped with a `convention` finding.
|
|
1593
|
+
description: |
|
|
1594
|
+
A repository's declared, reasoned statement that it bears no product capability (M-ADR 0188 §4.3). Emitted from the repo-config `capability_exemption:` block.
|
|
1595
|
+
This is deliberately a catalogue row rather than an inert YAML aside. An exemption is a modelling assertion and belongs in the model: it is then queryable at the aggregate tier, reviewable in the same surface as the capabilities it stands in for, and countable — so that a reviewer watching the exemption population grow can see it happen. Never net exemptions off against orphans in a metric.
|
|
1596
|
+
The invariant it participates in (M-ADR 0188 §4.1): every `repositories` row must resolve, either by carrying a `repo_capability` edge or by declaring an exemption here. A row satisfying both is a declaration conflict, reported as a `divergence` finding.
|
|
1609
1597
|
foreign_keys:
|
|
1610
1598
|
- column: repo_id
|
|
1611
1599
|
references: repositories.id
|
|
@@ -1614,13 +1602,6 @@ catalogues:
|
|
|
1614
1602
|
reason: enums.capability_exemption_reason
|
|
1615
1603
|
service_capability_exemption:
|
|
1616
1604
|
primary_key: id
|
|
1617
|
-
description: 'A service''s declared, reasoned statement that it bears no product capability (M-ADR 0133 §4.2b). The services-tier equivalent of `repo_capability_exemption`, one tier down: `repo_capability_exemption` exists because M-ADR 0197 gave a repository a `services:` block, so a repository resolving under M-ADR 0188 no longer implies its services do. Emitted from the repo-config `service_capability_exemption:` block, keyed to the repo''s own default/primary service id — a declared, non-primary `services:` entry has no per-entry authoring surface yet (M-ADR 0197 §4.7, design-only) and cannot be exempted through this block.
|
|
1618
|
-
|
|
1619
|
-
Two reasons only (`enums.service_capability_exemption_reason`): `platform-internal` and `deprecated`. Narrower than the repository vocabulary by design — a service, by definition, already runs something, so the repository-tier packaging/tooling/provenance distinctions don''t reproduce here.
|
|
1620
|
-
|
|
1621
|
-
The invariant it participates in: every catalogued `services` row must resolve, either by carrying a `capability_service` edge or by declaring an exemption here — checked by a coverage predicate whose verdict set is tier-scoped (member tier cannot assert an unclaimed service is genuinely orphaned, only that it is unresolved locally; a cross-SDD claim on the service may exist in a sibling SDD''s own capability_service.csv, invisible to this SDD''s own build).
|
|
1622
|
-
|
|
1623
|
-
'
|
|
1624
1605
|
columns:
|
|
1625
1606
|
- name: id
|
|
1626
1607
|
type: string
|
|
@@ -1635,6 +1616,10 @@ catalogues:
|
|
|
1635
1616
|
type: string
|
|
1636
1617
|
nullable: false
|
|
1637
1618
|
description: Mandatory, non-empty. The reason code makes exemptions countable; the note makes them reviewable. A row with an empty note is dropped with a `convention` finding.
|
|
1619
|
+
description: |
|
|
1620
|
+
A service's declared, reasoned statement that it bears no product capability (M-ADR 0133 §4.2b). The services-tier equivalent of `repo_capability_exemption`, one tier down: `repo_capability_exemption` exists because M-ADR 0197 gave a repository a `services:` block, so a repository resolving under M-ADR 0188 no longer implies its services do. Emitted from the repo-config `service_capability_exemption:` block, keyed to the repo's own default/primary service id — a declared, non-primary `services:` entry has no per-entry authoring surface yet (M-ADR 0197 §4.7, design-only) and cannot be exempted through this block.
|
|
1621
|
+
Two reasons only (`enums.service_capability_exemption_reason`): `platform-internal` and `deprecated`. Narrower than the repository vocabulary by design — a service, by definition, already runs something, so the repository-tier packaging/tooling/provenance distinctions don't reproduce here.
|
|
1622
|
+
The invariant it participates in: every catalogued `services` row must resolve, either by carrying a `capability_service` edge or by declaring an exemption here — checked by a coverage predicate whose verdict set is tier-scoped (member tier cannot assert an unclaimed service is genuinely orphaned, only that it is unresolved locally; a cross-SDD claim on the service may exist in a sibling SDD's own capability_service.csv, invisible to this SDD's own build).
|
|
1638
1623
|
foreign_keys:
|
|
1639
1624
|
- column: service_id
|
|
1640
1625
|
references: services.id
|
|
@@ -1643,11 +1628,6 @@ catalogues:
|
|
|
1643
1628
|
reason: enums.service_capability_exemption_reason
|
|
1644
1629
|
external_system_exemption:
|
|
1645
1630
|
primary_key: id
|
|
1646
|
-
description: 'A declared, reasoned assertion that an external-system candidate is GENUINELY external (M-ADR 0189 §4.6 / WS15). Annotation catalogue (M-ADR 0133 §4.2b): one FK, declared never derived, closed reason enum. Sourced from `orchestration/external-system-exemptions.yaml`.
|
|
1647
|
-
|
|
1648
|
-
The invariant it completes: c4_external_systems was the one catalogue family with no coverage predicate — a candidate producing no adjudication outcome was silent, and that silence hid a 28% dependency -graph distortion (ledger L4). Every candidate now either resolves at adjudication, or carries an exemption here, or is reported unverified. An exemption retires only the unverified finding — never an adjudication outcome (a converted candidate''s exemption is a contradiction, reported and dropped). Shared entities may be exempted by multiple SDDs: identical rows dedup at aggregation (same exception class as c4_external_systems); conflicting rows keep first-seen with a convention finding.
|
|
1649
|
-
|
|
1650
|
-
'
|
|
1651
1631
|
columns:
|
|
1652
1632
|
- name: id
|
|
1653
1633
|
type: string
|
|
@@ -1663,6 +1643,9 @@ catalogues:
|
|
|
1663
1643
|
type: string
|
|
1664
1644
|
nullable: false
|
|
1665
1645
|
description: Mandatory, non-empty. The reason makes exemptions countable; the note makes them reviewable (M-ADR 0188 §4.2 pattern).
|
|
1646
|
+
description: |
|
|
1647
|
+
A declared, reasoned assertion that an external-system candidate is GENUINELY external (M-ADR 0189 §4.6 / WS15). Annotation catalogue (M-ADR 0133 §4.2b): one FK, declared never derived, closed reason enum. Sourced from `orchestration/external-system-exemptions.yaml`.
|
|
1648
|
+
The invariant it completes: c4_external_systems was the one catalogue family with no coverage predicate — a candidate producing no adjudication outcome was silent, and that silence hid a 28% dependency -graph distortion (ledger L4). Every candidate now either resolves at adjudication, or carries an exemption here, or is reported unverified. An exemption retires only the unverified finding — never an adjudication outcome (a converted candidate's exemption is a contradiction, reported and dropped). Shared entities may be exempted by multiple SDDs: identical rows dedup at aggregation (same exception class as c4_external_systems); conflicting rows keep first-seen with a convention finding.
|
|
1666
1649
|
foreign_keys:
|
|
1667
1650
|
- column: external_system_id
|
|
1668
1651
|
references: c4_external_systems.id
|
|
@@ -1671,7 +1654,6 @@ catalogues:
|
|
|
1671
1654
|
reason: enums.external_system_exemption_reason
|
|
1672
1655
|
repo_contract:
|
|
1673
1656
|
primary_key: id
|
|
1674
|
-
description: 'Edge: repo is bound to a contract — implements or consumes; the source (contributes_to.artifact_type=contract-surface) does not distinguish, so this description asserts no direction (M-ADR 0211 §1). From contributes_to.artifact_type=contract-surface. Per M-ADR 0147 service-architecture external interfaces are a contract-consumes source; contract_id is external_for_profiles app/integration because their repos reference platform-resident (or platform-held BFF) contracts — resolved at aggregation, staying internal for platform-profile.'
|
|
1675
1657
|
columns:
|
|
1676
1658
|
- name: id
|
|
1677
1659
|
type: string
|
|
@@ -1682,6 +1664,7 @@ catalogues:
|
|
|
1682
1664
|
- name: contract_id
|
|
1683
1665
|
type: string
|
|
1684
1666
|
nullable: false
|
|
1667
|
+
description: "Edge: repo is bound to a contract — implements or consumes; the source (contributes_to.artifact_type=contract-surface) does not distinguish, so this description asserts no direction (M-ADR 0211 §1). From contributes_to.artifact_type=contract-surface. Per M-ADR 0147 service-architecture external interfaces are a contract-consumes source; contract_id is external_for_profiles app/integration because their repos reference platform-resident (or platform-held BFF) contracts — resolved at aggregation, staying internal for platform-profile."
|
|
1685
1668
|
foreign_keys:
|
|
1686
1669
|
- column: repo_id
|
|
1687
1670
|
references: repositories.id
|
|
@@ -1694,7 +1677,6 @@ catalogues:
|
|
|
1694
1677
|
- integration-product
|
|
1695
1678
|
product_capability:
|
|
1696
1679
|
primary_key: id
|
|
1697
|
-
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.'
|
|
1698
1680
|
columns:
|
|
1699
1681
|
- name: id
|
|
1700
1682
|
type: string
|
|
@@ -1712,6 +1694,7 @@ catalogues:
|
|
|
1712
1694
|
- name: notes
|
|
1713
1695
|
type: string
|
|
1714
1696
|
nullable: true
|
|
1697
|
+
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."
|
|
1715
1698
|
foreign_keys:
|
|
1716
1699
|
- column: product_id
|
|
1717
1700
|
references: products.id
|
|
@@ -1724,7 +1707,6 @@ catalogues:
|
|
|
1724
1707
|
role: enums.consumption_role
|
|
1725
1708
|
product_service:
|
|
1726
1709
|
primary_key: id
|
|
1727
|
-
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.'
|
|
1728
1710
|
columns:
|
|
1729
1711
|
- name: id
|
|
1730
1712
|
type: string
|
|
@@ -1742,7 +1724,8 @@ catalogues:
|
|
|
1742
1724
|
- name: required_stability
|
|
1743
1725
|
type: string
|
|
1744
1726
|
nullable: true
|
|
1745
|
-
description:
|
|
1727
|
+
description: "provisional | locked | 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."
|
|
1728
|
+
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."
|
|
1746
1729
|
foreign_keys:
|
|
1747
1730
|
- column: product_id
|
|
1748
1731
|
references: products.id
|
|
@@ -1755,12 +1738,11 @@ catalogues:
|
|
|
1755
1738
|
role: enums.consumption_role
|
|
1756
1739
|
service_contract:
|
|
1757
1740
|
primary_key: id
|
|
1758
|
-
description: 'Edge: service exposes or consumes contract. Both FKs are external (per M-ADR 0147): federated SDDs that walk per-repo service-architecture tables emit consumes rows where service_id resolves to the platform-root catalogue''s services.csv (post-aggregation) and contract_id resolves to the platform-root contracts.csv. Internal builds (e.g. connect-mono) still optimistically validate locally. Schema 2.8.0.'
|
|
1759
1741
|
columns:
|
|
1760
1742
|
- name: id
|
|
1761
1743
|
type: string
|
|
1762
1744
|
nullable: false
|
|
1763
|
-
description:
|
|
1745
|
+
description: "{service_id}__{contract_id}__{role}."
|
|
1764
1746
|
- name: service_id
|
|
1765
1747
|
type: string
|
|
1766
1748
|
nullable: false
|
|
@@ -1771,6 +1753,7 @@ catalogues:
|
|
|
1771
1753
|
type: string
|
|
1772
1754
|
nullable: false
|
|
1773
1755
|
description: exposes | consumes.
|
|
1756
|
+
description: "Edge: service exposes or consumes contract. Both FKs are external (per M-ADR 0147): federated SDDs that walk per-repo service-architecture tables emit consumes rows where service_id resolves to the platform-root catalogue's services.csv (post-aggregation) and contract_id resolves to the platform-root contracts.csv. Internal builds (e.g. connect-mono) still optimistically validate locally. Schema 2.8.0."
|
|
1774
1757
|
foreign_keys:
|
|
1775
1758
|
- column: service_id
|
|
1776
1759
|
references: services.id
|
|
@@ -1784,12 +1767,11 @@ catalogues:
|
|
|
1784
1767
|
role: enums.contract_participation
|
|
1785
1768
|
service_event:
|
|
1786
1769
|
primary_key: id
|
|
1787
|
-
description: 'Edge: service publishes or consumes event.'
|
|
1788
1770
|
columns:
|
|
1789
1771
|
- name: id
|
|
1790
1772
|
type: string
|
|
1791
1773
|
nullable: false
|
|
1792
|
-
description:
|
|
1774
|
+
description: "{service_id}__{event_id}__{role}."
|
|
1793
1775
|
- name: service_id
|
|
1794
1776
|
type: string
|
|
1795
1777
|
nullable: false
|
|
@@ -1800,6 +1782,7 @@ catalogues:
|
|
|
1800
1782
|
type: string
|
|
1801
1783
|
nullable: false
|
|
1802
1784
|
description: publishes | consumes.
|
|
1785
|
+
description: "Edge: service publishes or consumes event."
|
|
1803
1786
|
foreign_keys:
|
|
1804
1787
|
- column: service_id
|
|
1805
1788
|
references: services.id
|
|
@@ -1811,12 +1794,11 @@ catalogues:
|
|
|
1811
1794
|
role: enums.event_participation
|
|
1812
1795
|
service_entity:
|
|
1813
1796
|
primary_key: id
|
|
1814
|
-
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`.'
|
|
1815
1797
|
columns:
|
|
1816
1798
|
- name: id
|
|
1817
1799
|
type: string
|
|
1818
1800
|
nullable: false
|
|
1819
|
-
description:
|
|
1801
|
+
description: "Composite PK: {service_id}__{entity_id}__{relation}."
|
|
1820
1802
|
- name: service_id
|
|
1821
1803
|
type: string
|
|
1822
1804
|
nullable: false
|
|
@@ -1826,7 +1808,7 @@ catalogues:
|
|
|
1826
1808
|
- name: relation
|
|
1827
1809
|
type: string
|
|
1828
1810
|
nullable: false
|
|
1829
|
-
description:
|
|
1811
|
+
description: "Open string; recommended values: owns | reads | writes | references. Data Store Mapping table source emits `owns`. Values outside the recommended set fire `[finding] convention`."
|
|
1830
1812
|
- name: evidence_path
|
|
1831
1813
|
type: string
|
|
1832
1814
|
nullable: true
|
|
@@ -1839,6 +1821,7 @@ catalogues:
|
|
|
1839
1821
|
type: string
|
|
1840
1822
|
nullable: true
|
|
1841
1823
|
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.
|
|
1824
|
+
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`."
|
|
1842
1825
|
foreign_keys:
|
|
1843
1826
|
- column: service_id
|
|
1844
1827
|
references: services.id
|
|
@@ -1848,7 +1831,6 @@ catalogues:
|
|
|
1848
1831
|
nullable: false
|
|
1849
1832
|
capability_feature:
|
|
1850
1833
|
primary_key: id
|
|
1851
|
-
description: 'Edge: capability decomposes into features. Forward: traceability.runway.enables. Reverse: parsed from spec Feature Grounding.'
|
|
1852
1834
|
columns:
|
|
1853
1835
|
- name: id
|
|
1854
1836
|
type: string
|
|
@@ -1859,6 +1841,7 @@ catalogues:
|
|
|
1859
1841
|
- name: feature_id
|
|
1860
1842
|
type: string
|
|
1861
1843
|
nullable: false
|
|
1844
|
+
description: "Edge: capability decomposes into features. Forward: traceability.runway.enables. Reverse: parsed from spec Feature Grounding."
|
|
1862
1845
|
foreign_keys:
|
|
1863
1846
|
- column: capability_id
|
|
1864
1847
|
references: capabilities.id
|
|
@@ -1868,9 +1851,6 @@ catalogues:
|
|
|
1868
1851
|
nullable: false
|
|
1869
1852
|
capability_service:
|
|
1870
1853
|
primary_key: id
|
|
1871
|
-
description: 'Edge: capability is realised by services. Sourced from the capability traceability manifest services[] block. service_id is an external FK (schema 2.29.0, F4): 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).
|
|
1872
|
-
|
|
1873
|
-
'
|
|
1874
1854
|
columns:
|
|
1875
1855
|
- name: id
|
|
1876
1856
|
type: string
|
|
@@ -1884,11 +1864,11 @@ catalogues:
|
|
|
1884
1864
|
- name: role
|
|
1885
1865
|
type: string
|
|
1886
1866
|
nullable: true
|
|
1887
|
-
description:
|
|
1867
|
+
description: "The part the service plays in delivering THIS capability — a property of the relationship, not of the service (capability-traceability-manifest-template). Closed enum, see enums.capability_service_role. Nullable: legacy rows may carry no role; the enum validator checks values, not presence. `dependency` rows are excluded from repo_capability Path X (M-ADR 0157 §4.3 as amended). Enum bound in 3.8.0."
|
|
1888
1868
|
- name: contract_id
|
|
1889
1869
|
type: string
|
|
1890
1870
|
nullable: true
|
|
1891
|
-
description:
|
|
1871
|
+
description: "The contract this dependency is against — a contracts.id declared as `contract:` on the services[] entry (M-ADR 0211 §4.1). External FK on the pattern of feature_contract: resolved at aggregation. Empty when the entry declares none; a `dependency`-role entry that reaches T4 band 5 carries it."
|
|
1892
1872
|
- name: interaction_pattern
|
|
1893
1873
|
type: string
|
|
1894
1874
|
nullable: true
|
|
@@ -1901,6 +1881,8 @@ catalogues:
|
|
|
1901
1881
|
type: string
|
|
1902
1882
|
nullable: true
|
|
1903
1883
|
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.
|
|
1884
|
+
description: |
|
|
1885
|
+
Edge: capability is realised by services. Sourced from the capability traceability manifest services[] block. service_id is an external FK (schema 2.29.0, F4): 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).
|
|
1904
1886
|
foreign_keys:
|
|
1905
1887
|
- column: capability_id
|
|
1906
1888
|
references: capabilities.id
|
|
@@ -1918,7 +1900,6 @@ catalogues:
|
|
|
1918
1900
|
interaction_pattern: enums.interaction_pattern
|
|
1919
1901
|
capability_event:
|
|
1920
1902
|
primary_key: id
|
|
1921
|
-
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).'
|
|
1922
1903
|
columns:
|
|
1923
1904
|
- name: id
|
|
1924
1905
|
type: string
|
|
@@ -1937,6 +1918,7 @@ catalogues:
|
|
|
1937
1918
|
type: string
|
|
1938
1919
|
nullable: false
|
|
1939
1920
|
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.
|
|
1921
|
+
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)."
|
|
1940
1922
|
foreign_keys:
|
|
1941
1923
|
- column: capability_id
|
|
1942
1924
|
references: capabilities.id
|
|
@@ -1948,7 +1930,6 @@ catalogues:
|
|
|
1948
1930
|
role: enums.event_participation
|
|
1949
1931
|
capability_contract:
|
|
1950
1932
|
primary_key: id
|
|
1951
|
-
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 / F2, gap class absent-derivation per M-ADR 0196 §4.1). The edge is forward-one-directional until a decision builds a reverse source.'
|
|
1952
1933
|
columns:
|
|
1953
1934
|
- name: id
|
|
1954
1935
|
type: string
|
|
@@ -1962,7 +1943,8 @@ catalogues:
|
|
|
1962
1943
|
- name: source
|
|
1963
1944
|
type: string
|
|
1964
1945
|
nullable: false
|
|
1965
|
-
description:
|
|
1946
|
+
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 / F2); the value re-enters if a decision builds a reverse source."
|
|
1947
|
+
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 / F2, gap class absent-derivation per M-ADR 0196 §4.1). The edge is forward-one-directional until a decision builds a reverse source."
|
|
1966
1948
|
foreign_keys:
|
|
1967
1949
|
- column: capability_id
|
|
1968
1950
|
references: capabilities.id
|
|
@@ -1972,7 +1954,6 @@ catalogues:
|
|
|
1972
1954
|
nullable: false
|
|
1973
1955
|
journey_feature:
|
|
1974
1956
|
primary_key: id
|
|
1975
|
-
description: 'Edge: journey touches features. Parsed from Related features bullet.'
|
|
1976
1957
|
columns:
|
|
1977
1958
|
- name: id
|
|
1978
1959
|
type: string
|
|
@@ -1983,6 +1964,7 @@ catalogues:
|
|
|
1983
1964
|
- name: feature_id
|
|
1984
1965
|
type: string
|
|
1985
1966
|
nullable: false
|
|
1967
|
+
description: "Edge: journey touches features. Parsed from Related features bullet."
|
|
1986
1968
|
foreign_keys:
|
|
1987
1969
|
- column: journey_id
|
|
1988
1970
|
references: user_journeys.id
|
|
@@ -1992,7 +1974,6 @@ catalogues:
|
|
|
1992
1974
|
nullable: false
|
|
1993
1975
|
persona_feature:
|
|
1994
1976
|
primary_key: id
|
|
1995
|
-
description: 'Edge: persona uses features. Parsed from Related features bullet.'
|
|
1996
1977
|
columns:
|
|
1997
1978
|
- name: id
|
|
1998
1979
|
type: string
|
|
@@ -2003,6 +1984,7 @@ catalogues:
|
|
|
2003
1984
|
- name: feature_id
|
|
2004
1985
|
type: string
|
|
2005
1986
|
nullable: false
|
|
1987
|
+
description: "Edge: persona uses features. Parsed from Related features bullet."
|
|
2006
1988
|
foreign_keys:
|
|
2007
1989
|
- column: persona_id
|
|
2008
1990
|
references: personas.id
|
|
@@ -2012,7 +1994,6 @@ catalogues:
|
|
|
2012
1994
|
nullable: false
|
|
2013
1995
|
feature_service:
|
|
2014
1996
|
primary_key: id
|
|
2015
|
-
description: 'Edge: feature is implemented by service. Parsed from Feature Services table in feature-tree.md.'
|
|
2016
1997
|
columns:
|
|
2017
1998
|
- name: id
|
|
2018
1999
|
type: string
|
|
@@ -2023,6 +2004,7 @@ catalogues:
|
|
|
2023
2004
|
- name: service_id
|
|
2024
2005
|
type: string
|
|
2025
2006
|
nullable: false
|
|
2007
|
+
description: "Edge: feature is implemented by service. Parsed from Feature Services table in feature-tree.md."
|
|
2026
2008
|
foreign_keys:
|
|
2027
2009
|
- column: feature_id
|
|
2028
2010
|
references: features.id
|
|
@@ -2032,7 +2014,6 @@ catalogues:
|
|
|
2032
2014
|
nullable: false
|
|
2033
2015
|
feature_event:
|
|
2034
2016
|
primary_key: id
|
|
2035
|
-
description: 'Edge: feature publishes or consumes event. Derived only — emitted from the `feature_service ⋈ service_event` join, mirroring M-ADR 0160''s capability_event derived path one rung lower in the capability/feature/service hierarchy. Every row carries `source=derived`; there is no authored shape (the authored signal lives at the service level via `service_event`, which the feature inherits through `feature_service`). PK is `{feature_id}__{event_id}__{role}` so the same feature can carry both publishes + consumes rows for the same event without collision. Schema 2.15.0 per M-ADR 0161.'
|
|
2036
2017
|
columns:
|
|
2037
2018
|
- name: id
|
|
2038
2019
|
type: string
|
|
@@ -2051,6 +2032,7 @@ catalogues:
|
|
|
2051
2032
|
type: string
|
|
2052
2033
|
nullable: false
|
|
2053
2034
|
description: Always `derived` (schema 2.15.0). The column is retained for symmetry with `capability_event.source` and to keep the door open for an authored shape if one surfaces; today every row is derived.
|
|
2035
|
+
description: "Edge: feature publishes or consumes event. Derived only — emitted from the `feature_service ⋈ service_event` join, mirroring M-ADR 0160's capability_event derived path one rung lower in the capability/feature/service hierarchy. Every row carries `source=derived`; there is no authored shape (the authored signal lives at the service level via `service_event`, which the feature inherits through `feature_service`). PK is `{feature_id}__{event_id}__{role}` so the same feature can carry both publishes + consumes rows for the same event without collision. Schema 2.15.0 per M-ADR 0161."
|
|
2054
2036
|
foreign_keys:
|
|
2055
2037
|
- column: feature_id
|
|
2056
2038
|
references: features.id
|
|
@@ -2062,7 +2044,6 @@ catalogues:
|
|
|
2062
2044
|
role: enums.event_participation
|
|
2063
2045
|
feature_repo:
|
|
2064
2046
|
primary_key: id
|
|
2065
|
-
description: 'Edge: feature is implemented in repo. From contributes_to.artifact_type=feature-set.'
|
|
2066
2047
|
columns:
|
|
2067
2048
|
- name: id
|
|
2068
2049
|
type: string
|
|
@@ -2073,6 +2054,7 @@ catalogues:
|
|
|
2073
2054
|
- name: repo_id
|
|
2074
2055
|
type: string
|
|
2075
2056
|
nullable: false
|
|
2057
|
+
description: "Edge: feature is implemented in repo. From contributes_to.artifact_type=feature-set."
|
|
2076
2058
|
foreign_keys:
|
|
2077
2059
|
- column: feature_id
|
|
2078
2060
|
references: features.id
|
|
@@ -2082,12 +2064,11 @@ catalogues:
|
|
|
2082
2064
|
nullable: false
|
|
2083
2065
|
feature_contract:
|
|
2084
2066
|
primary_key: id
|
|
2085
|
-
description: 'Edge: feature is exposed via contract. Derived — forward: capability_feature ⋈ capability_contract (on capability_id); reverse: feature_service ⋈ service_contract (on service_id). Both join paths are run and merged; duplicate (feature_id, contract_id) pairs are deduplicated. contract_id is external for app/integration profiles where contracts live in the platform SDD. Added in schema 2.3.0.'
|
|
2086
2067
|
columns:
|
|
2087
2068
|
- name: id
|
|
2088
2069
|
type: string
|
|
2089
2070
|
nullable: false
|
|
2090
|
-
description:
|
|
2071
|
+
description: "{feature_id}__{contract_id}."
|
|
2091
2072
|
- name: feature_id
|
|
2092
2073
|
type: string
|
|
2093
2074
|
nullable: false
|
|
@@ -2098,6 +2079,7 @@ catalogues:
|
|
|
2098
2079
|
type: string
|
|
2099
2080
|
nullable: true
|
|
2100
2081
|
description: cap-feature-cap-contract | feature-service-service-contract. Diagnostic only — records which join path produced the row.
|
|
2082
|
+
description: "Edge: feature is exposed via contract. Derived — forward: capability_feature ⋈ capability_contract (on capability_id); reverse: feature_service ⋈ service_contract (on service_id). Both join paths are run and merged; duplicate (feature_id, contract_id) pairs are deduplicated. contract_id is external for app/integration profiles where contracts live in the platform SDD. Added in schema 2.3.0."
|
|
2101
2083
|
foreign_keys:
|
|
2102
2084
|
- column: feature_id
|
|
2103
2085
|
references: features.id
|
|
@@ -2108,12 +2090,11 @@ catalogues:
|
|
|
2108
2090
|
external: true
|
|
2109
2091
|
feature_subscription_channels:
|
|
2110
2092
|
primary_key: id
|
|
2111
|
-
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). Per resolved decision §1 of `content/plans/v0-9-0-cohort-sweep-derived-bundle.md`: 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.'
|
|
2112
2093
|
columns:
|
|
2113
2094
|
- name: id
|
|
2114
2095
|
type: string
|
|
2115
2096
|
nullable: false
|
|
2116
|
-
description:
|
|
2097
|
+
description: "{feature_id}__{channel_name}."
|
|
2117
2098
|
- name: feature_id
|
|
2118
2099
|
type: string
|
|
2119
2100
|
nullable: false
|
|
@@ -2124,7 +2105,7 @@ catalogues:
|
|
|
2124
2105
|
- name: transport
|
|
2125
2106
|
type: string
|
|
2126
2107
|
nullable: false
|
|
2127
|
-
description:
|
|
2108
|
+
description: "Delivery protocol: `appsync-websocket | pekko-ws | mqtt | sse | webhook-push | other`. The `other` value is escape-valve; adopters using it SHOULD record the actual transport in evidence."
|
|
2128
2109
|
- name: evidence
|
|
2129
2110
|
type: string
|
|
2130
2111
|
nullable: true
|
|
@@ -2141,18 +2122,18 @@ catalogues:
|
|
|
2141
2122
|
type: string
|
|
2142
2123
|
nullable: true
|
|
2143
2124
|
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.
|
|
2125
|
+
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). Per resolved decision §1 of `content/plans/v0-9-0-cohort-sweep-derived-bundle.md`: 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."
|
|
2144
2126
|
foreign_keys:
|
|
2145
2127
|
- column: feature_id
|
|
2146
2128
|
references: features.id
|
|
2147
2129
|
nullable: false
|
|
2148
2130
|
capability_domain_model:
|
|
2149
2131
|
primary_key: id
|
|
2150
|
-
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.'
|
|
2151
2132
|
columns:
|
|
2152
2133
|
- name: id
|
|
2153
2134
|
type: string
|
|
2154
2135
|
nullable: false
|
|
2155
|
-
description:
|
|
2136
|
+
description: "{capability_id}__{domain_model_id}."
|
|
2156
2137
|
- name: capability_id
|
|
2157
2138
|
type: string
|
|
2158
2139
|
nullable: false
|
|
@@ -2163,6 +2144,7 @@ catalogues:
|
|
|
2163
2144
|
type: string
|
|
2164
2145
|
nullable: false
|
|
2165
2146
|
description: traceability-manifest | inferred.
|
|
2147
|
+
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."
|
|
2166
2148
|
foreign_keys:
|
|
2167
2149
|
- column: capability_id
|
|
2168
2150
|
references: capabilities.id
|
|
@@ -2172,12 +2154,11 @@ catalogues:
|
|
|
2172
2154
|
nullable: false
|
|
2173
2155
|
feature_domain_model:
|
|
2174
2156
|
primary_key: id
|
|
2175
|
-
description: 'Edge: feature operates on a domain model. Derived from capability_feature ⋈ capability_domain_model (on capability_id). Platform-profile only. Orphan features (no capability link) get no row. Added in schema 2.4.0; see M-ADR 0142.'
|
|
2176
2157
|
columns:
|
|
2177
2158
|
- name: id
|
|
2178
2159
|
type: string
|
|
2179
2160
|
nullable: false
|
|
2180
|
-
description:
|
|
2161
|
+
description: "{feature_id}__{domain_model_id}."
|
|
2181
2162
|
- name: feature_id
|
|
2182
2163
|
type: string
|
|
2183
2164
|
nullable: false
|
|
@@ -2188,6 +2169,7 @@ catalogues:
|
|
|
2188
2169
|
type: string
|
|
2189
2170
|
nullable: true
|
|
2190
2171
|
description: cap-feature-cap-domain-model. Diagnostic only.
|
|
2172
|
+
description: "Edge: feature operates on a domain model. Derived from capability_feature ⋈ capability_domain_model (on capability_id). Platform-profile only. Orphan features (no capability link) get no row. Added in schema 2.4.0; see M-ADR 0142."
|
|
2191
2173
|
foreign_keys:
|
|
2192
2174
|
- column: feature_id
|
|
2193
2175
|
references: features.id
|
|
@@ -2197,7 +2179,6 @@ catalogues:
|
|
|
2197
2179
|
nullable: false
|
|
2198
2180
|
persona_journey:
|
|
2199
2181
|
primary_key: id
|
|
2200
|
-
description: 'Edge: persona participates in journey. Roles: primary | handoff | supporting.'
|
|
2201
2182
|
columns:
|
|
2202
2183
|
- name: id
|
|
2203
2184
|
type: string
|
|
@@ -2212,6 +2193,7 @@ catalogues:
|
|
|
2212
2193
|
type: string
|
|
2213
2194
|
nullable: false
|
|
2214
2195
|
description: primary | handoff | supporting.
|
|
2196
|
+
description: "Edge: persona participates in journey. Roles: primary | handoff | supporting."
|
|
2215
2197
|
foreign_keys:
|
|
2216
2198
|
- column: persona_id
|
|
2217
2199
|
references: personas.id
|
|
@@ -2223,12 +2205,11 @@ catalogues:
|
|
|
2223
2205
|
role: enums.journey_participation
|
|
2224
2206
|
persona_c4system:
|
|
2225
2207
|
primary_key: id
|
|
2226
|
-
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.'
|
|
2227
2208
|
columns:
|
|
2228
2209
|
- name: id
|
|
2229
2210
|
type: string
|
|
2230
2211
|
nullable: false
|
|
2231
|
-
description:
|
|
2212
|
+
description: "{persona_id}__{c4_system_id}."
|
|
2232
2213
|
- name: persona_id
|
|
2233
2214
|
type: string
|
|
2234
2215
|
nullable: false
|
|
@@ -2239,6 +2220,7 @@ catalogues:
|
|
|
2239
2220
|
type: string
|
|
2240
2221
|
nullable: true
|
|
2241
2222
|
description: Optional interaction label from the Rel(...) line, e.g. 'Web browser' / 'Mobile app'.
|
|
2223
|
+
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."
|
|
2242
2224
|
foreign_keys:
|
|
2243
2225
|
- column: persona_id
|
|
2244
2226
|
references: personas.id
|
|
@@ -2248,14 +2230,11 @@ catalogues:
|
|
|
2248
2230
|
nullable: false
|
|
2249
2231
|
persona_container:
|
|
2250
2232
|
primary_key: id
|
|
2251
|
-
description: 'Edge: a persona uses a C4 container — the L2-granularity companion to persona_c4system (M-ADR 0189 F26 §3, 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, until F26, 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.
|
|
2252
|
-
|
|
2253
|
-
'
|
|
2254
2233
|
columns:
|
|
2255
2234
|
- name: id
|
|
2256
2235
|
type: string
|
|
2257
2236
|
nullable: false
|
|
2258
|
-
description:
|
|
2237
|
+
description: "{persona_id}__{container_id}."
|
|
2259
2238
|
- name: persona_id
|
|
2260
2239
|
type: string
|
|
2261
2240
|
nullable: false
|
|
@@ -2266,6 +2245,8 @@ catalogues:
|
|
|
2266
2245
|
type: string
|
|
2267
2246
|
nullable: true
|
|
2268
2247
|
description: Optional interaction label from the Rel(...) line. May hold multiple '; '-joined labels (F25).
|
|
2248
|
+
description: |
|
|
2249
|
+
Edge: a persona uses a C4 container — the L2-granularity companion to persona_c4system (M-ADR 0189 F26 §3, 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, until F26, 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.
|
|
2269
2250
|
foreign_keys:
|
|
2270
2251
|
- column: persona_id
|
|
2271
2252
|
references: personas.id
|
|
@@ -2275,12 +2256,11 @@ catalogues:
|
|
|
2275
2256
|
nullable: false
|
|
2276
2257
|
system_external_dependency:
|
|
2277
2258
|
primary_key: id
|
|
2278
|
-
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.'
|
|
2279
2259
|
columns:
|
|
2280
2260
|
- name: id
|
|
2281
2261
|
type: string
|
|
2282
2262
|
nullable: false
|
|
2283
|
-
description:
|
|
2263
|
+
description: "{c4_system_id}__{external_system_id}."
|
|
2284
2264
|
- name: c4_system_id
|
|
2285
2265
|
type: string
|
|
2286
2266
|
nullable: false
|
|
@@ -2295,6 +2275,7 @@ catalogues:
|
|
|
2295
2275
|
type: string
|
|
2296
2276
|
nullable: true
|
|
2297
2277
|
description: The Rel's non-external endpoint resolved to a local container at member tier, when it is one (F17, 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.
|
|
2278
|
+
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."
|
|
2298
2279
|
foreign_keys:
|
|
2299
2280
|
- column: c4_system_id
|
|
2300
2281
|
references: c4_systems.id
|
|
@@ -2307,14 +2288,11 @@ catalogues:
|
|
|
2307
2288
|
nullable: true
|
|
2308
2289
|
container_dependency:
|
|
2309
2290
|
primary_key: id
|
|
2310
|
-
description: 'Edge: a C4 container depends on another INTERNAL container (adopter finding F17 — F6 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 (F19, 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.
|
|
2311
|
-
|
|
2312
|
-
'
|
|
2313
2291
|
columns:
|
|
2314
2292
|
- name: id
|
|
2315
2293
|
type: string
|
|
2316
2294
|
nullable: false
|
|
2317
|
-
description:
|
|
2295
|
+
description: "{from_container_id}__{to_container_id}."
|
|
2318
2296
|
- name: from_container_id
|
|
2319
2297
|
type: string
|
|
2320
2298
|
nullable: false
|
|
@@ -2333,6 +2311,8 @@ catalogues:
|
|
|
2333
2311
|
type: string
|
|
2334
2312
|
nullable: true
|
|
2335
2313
|
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.
|
|
2314
|
+
description: |
|
|
2315
|
+
Edge: a C4 container depends on another INTERNAL container (adopter finding F17 — F6 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 (F19, 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.
|
|
2336
2316
|
foreign_keys:
|
|
2337
2317
|
- column: from_container_id
|
|
2338
2318
|
references: c4_containers.id
|
|
@@ -2342,14 +2322,11 @@ catalogues:
|
|
|
2342
2322
|
nullable: false
|
|
2343
2323
|
system_system_dependency:
|
|
2344
2324
|
primary_key: id
|
|
2345
|
-
description: '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.
|
|
2346
|
-
|
|
2347
|
-
'
|
|
2348
2325
|
columns:
|
|
2349
2326
|
- name: id
|
|
2350
2327
|
type: string
|
|
2351
2328
|
nullable: false
|
|
2352
|
-
description:
|
|
2329
|
+
description: "{from_system_id}__{to_system_id}."
|
|
2353
2330
|
- name: from_system_id
|
|
2354
2331
|
type: string
|
|
2355
2332
|
nullable: false
|
|
@@ -2368,6 +2345,8 @@ catalogues:
|
|
|
2368
2345
|
type: string
|
|
2369
2346
|
nullable: true
|
|
2370
2347
|
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.
|
|
2348
|
+
description: |
|
|
2349
|
+
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.
|
|
2371
2350
|
foreign_keys:
|
|
2372
2351
|
- column: from_system_id
|
|
2373
2352
|
references: c4_systems.id
|
|
@@ -2377,12 +2356,11 @@ catalogues:
|
|
|
2377
2356
|
nullable: false
|
|
2378
2357
|
c4_container_entity:
|
|
2379
2358
|
primary_key: id
|
|
2380
|
-
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).'
|
|
2381
2359
|
columns:
|
|
2382
2360
|
- name: id
|
|
2383
2361
|
type: string
|
|
2384
2362
|
nullable: false
|
|
2385
|
-
description:
|
|
2363
|
+
description: "Composite PK: {container_id}__{entity_id}."
|
|
2386
2364
|
- name: container_id
|
|
2387
2365
|
type: string
|
|
2388
2366
|
nullable: false
|
|
@@ -2400,6 +2378,7 @@ catalogues:
|
|
|
2400
2378
|
type: string
|
|
2401
2379
|
nullable: true
|
|
2402
2380
|
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.
|
|
2381
|
+
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)."
|
|
2403
2382
|
foreign_keys:
|
|
2404
2383
|
- column: container_id
|
|
2405
2384
|
references: c4_containers.id
|
|
@@ -2409,12 +2388,11 @@ catalogues:
|
|
|
2409
2388
|
nullable: false
|
|
2410
2389
|
c4_system_entity:
|
|
2411
2390
|
primary_key: id
|
|
2412
|
-
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).'
|
|
2413
2391
|
columns:
|
|
2414
2392
|
- name: id
|
|
2415
2393
|
type: string
|
|
2416
2394
|
nullable: false
|
|
2417
|
-
description:
|
|
2395
|
+
description: "Composite PK: {system_id}__{entity_id}."
|
|
2418
2396
|
- name: system_id
|
|
2419
2397
|
type: string
|
|
2420
2398
|
nullable: false
|
|
@@ -2432,6 +2410,7 @@ catalogues:
|
|
|
2432
2410
|
type: string
|
|
2433
2411
|
nullable: true
|
|
2434
2412
|
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.
|
|
2413
|
+
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)."
|
|
2435
2414
|
foreign_keys:
|
|
2436
2415
|
- column: system_id
|
|
2437
2416
|
references: c4_systems.id
|
|
@@ -2441,7 +2420,6 @@ catalogues:
|
|
|
2441
2420
|
nullable: false
|
|
2442
2421
|
capability_adr:
|
|
2443
2422
|
primary_key: id
|
|
2444
|
-
description: 'Edge: ADR informs capability. Forward: declared in capability spec Architecture Decisions. Reverse: same plus heuristic match supplements with confidence.'
|
|
2445
2423
|
columns:
|
|
2446
2424
|
- name: id
|
|
2447
2425
|
type: string
|
|
@@ -2456,6 +2434,7 @@ catalogues:
|
|
|
2456
2434
|
type: string
|
|
2457
2435
|
nullable: false
|
|
2458
2436
|
description: spec | high | medium.
|
|
2437
|
+
description: "Edge: ADR informs capability. Forward: declared in capability spec Architecture Decisions. Reverse: same plus heuristic match supplements with confidence."
|
|
2459
2438
|
foreign_keys:
|
|
2460
2439
|
- column: capability_id
|
|
2461
2440
|
references: capabilities.id
|
|
@@ -2465,7 +2444,6 @@ catalogues:
|
|
|
2465
2444
|
nullable: false
|
|
2466
2445
|
adr_supersedes:
|
|
2467
2446
|
primary_key: id
|
|
2468
|
-
description: 'Edge: superseding ADR → superseded ADR. Parsed from Supersedes bullets where prose references a known ADR id.'
|
|
2469
2447
|
columns:
|
|
2470
2448
|
- name: id
|
|
2471
2449
|
type: string
|
|
@@ -2476,6 +2454,7 @@ catalogues:
|
|
|
2476
2454
|
- name: superseded_adr_id
|
|
2477
2455
|
type: string
|
|
2478
2456
|
nullable: false
|
|
2457
|
+
description: "Edge: superseding ADR → superseded ADR. Parsed from Supersedes bullets where prose references a known ADR id."
|
|
2479
2458
|
foreign_keys:
|
|
2480
2459
|
- column: superseding_adr_id
|
|
2481
2460
|
references: adrs.id
|
|
@@ -2485,14 +2464,11 @@ catalogues:
|
|
|
2485
2464
|
nullable: false
|
|
2486
2465
|
product_platform_dependencies:
|
|
2487
2466
|
primary_key: id
|
|
2488
|
-
description: '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; see `content/plans/v0-9-0-cohort-sweep-derived-bundle.md` §"Cross-SDD platform-capability-edge".
|
|
2489
|
-
|
|
2490
|
-
'
|
|
2491
2467
|
columns:
|
|
2492
2468
|
- name: id
|
|
2493
2469
|
type: string
|
|
2494
2470
|
nullable: false
|
|
2495
|
-
description:
|
|
2471
|
+
description: "{product_id}__{target_capability_id}__{target_service_id}, EXCEPT for async shared-stream rows (M-ADR 0192) where there is no realiser service: the third component falls back to the stream contract_path, i.e. {product_id}__{target_capability_id}__{contract_path}. For OFF-PLATFORM rows (M-ADR 0204, target_locus external|legacy) there is no platform capability either: id = {product_id}__{target_locus}__{target_external_system_id}, falling back to contract_path as the third component when no external-system id is named. This keeps the PK stable and collision-free when a product depends on the same capability via two distinct streams."
|
|
2496
2472
|
- name: product_id
|
|
2497
2473
|
type: string
|
|
2498
2474
|
nullable: false
|
|
@@ -2500,7 +2476,7 @@ catalogues:
|
|
|
2500
2476
|
- name: target_capability_id
|
|
2501
2477
|
type: string
|
|
2502
2478
|
nullable: true
|
|
2503
|
-
description:
|
|
2479
|
+
description: "Capability the consuming product depends on. Resolves at aggregation against a sibling SDD's capabilities.id; external by definition. Conditionally nullable (M-ADR 0204 §4.3): EMPTY when target_locus is external|legacy — there is no platform capability to name on an off-platform row, and demanding a value is what put a product's own feature slug in this column. A platform-locus row still requires it."
|
|
2504
2480
|
- name: target_locus
|
|
2505
2481
|
type: string
|
|
2506
2482
|
nullable: true
|
|
@@ -2508,11 +2484,11 @@ catalogues:
|
|
|
2508
2484
|
- name: target_external_system_id
|
|
2509
2485
|
type: string
|
|
2510
2486
|
nullable: true
|
|
2511
|
-
description:
|
|
2487
|
+
description: "For target_locus external|legacy rows only: the M-ADR 0189 external-system entry id the dependency targets (authored in the source file's service_id slot; the builder routes it here so the FK columns stay clean). Deliberately NOT a declared FK: corroboration against c4_external_systems is WARNING-severity at aggregation (M-ADR 0204 §4.2), because the C4 surface may legitimately lag discovery, and a declared FK can only fail."
|
|
2512
2488
|
- name: target_service_id
|
|
2513
2489
|
type: string
|
|
2514
2490
|
nullable: true
|
|
2515
|
-
description:
|
|
2491
|
+
description: "Service identifier the consuming product depends on. Resolves at aggregation against a sibling SDD's services.id; external by definition. The join key the aggregator uses to derive cross_sdd_platform_capability for SYNCHRONOUS dependencies. Conditionally nullable (M-ADR 0192): for an async shared-stream dependency (contract_type in the async set — `event`/`event-stream`/`stream`) there is no single realiser service, so this is empty and the dependency binds to the stream contract_path + target_capability_id instead. A synchronous contract_type still requires it. Made nullable in schema 2.36.0."
|
|
2516
2492
|
- name: target_domain
|
|
2517
2493
|
type: string
|
|
2518
2494
|
nullable: true
|
|
@@ -2524,7 +2500,7 @@ catalogues:
|
|
|
2524
2500
|
- name: required_stability
|
|
2525
2501
|
type: string
|
|
2526
2502
|
nullable: true
|
|
2527
|
-
description:
|
|
2503
|
+
description: "provisional | locked | unknown. Optional; the consuming SDD's expectation of contract stability — and only that: where the target lives and what lifecycle its implementation is in are separate concerns that do not belong in this field. Not a bound enum: an out-of-vocabulary value is carried, not rejected, and is reported by validate-app-dependencies.sh."
|
|
2528
2504
|
- name: contract_path
|
|
2529
2505
|
type: string
|
|
2530
2506
|
nullable: true
|
|
@@ -2541,6 +2517,8 @@ catalogues:
|
|
|
2541
2517
|
type: string
|
|
2542
2518
|
nullable: true
|
|
2543
2519
|
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.
|
|
2520
|
+
description: |
|
|
2521
|
+
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; see `content/plans/v0-9-0-cohort-sweep-derived-bundle.md` §"Cross-SDD platform-capability-edge".
|
|
2544
2522
|
foreign_keys:
|
|
2545
2523
|
- column: product_id
|
|
2546
2524
|
references: products.id
|
|
@@ -2555,14 +2533,11 @@ catalogues:
|
|
|
2555
2533
|
external: true
|
|
2556
2534
|
cross_sdd_platform_capability:
|
|
2557
2535
|
primary_key: id
|
|
2558
|
-
description: 'Federated edge: an application-side or integration-side SDD''s `product_platform_dependencies` reference resolves against a platform-side SDD''s capability spec via the platform capability''s `capability_service` roster. Surfaces ecosystem-wide platform- consumer relationships at product → capability granularity. Built **only at aggregation time** — `sdd-cli catalogue aggregate` joins each consuming SDD''s `product_platform_dependencies` rows against every other SDD''s `capability_service` rows on `target_service_id == service_id`, emitting one row per resolved (consuming-product, platform-capability) pair. Per-SDD builders emit nothing for this catalogue; the aggregator owns it entirely. A platform-dependency whose target_service_id doesn''t resolve to any platform-side capability_service row is logged as an `orphan` finding and produces no row. Cross-SDD references are external by definition. Added in schema 2.9.0; see `content/plans/v0-9-0-cohort-sweep-derived-bundle.md` §"Cross-SDD platform-capability-edge" and M-ADR 0134.
|
|
2559
|
-
|
|
2560
|
-
'
|
|
2561
2536
|
columns:
|
|
2562
2537
|
- name: id
|
|
2563
2538
|
type: string
|
|
2564
2539
|
nullable: false
|
|
2565
|
-
description:
|
|
2540
|
+
description: "{consuming_sdd_id}__{consuming_product_id}__{platform_sdd_id}__{platform_capability_id}__{service_id}. Composite encoding so the same (consuming product, platform capability) pair can appear once per resolving service when a product depends on multiple services owned by the same capability."
|
|
2566
2541
|
- name: consuming_sdd_id
|
|
2567
2542
|
type: string
|
|
2568
2543
|
nullable: false
|
|
@@ -2583,6 +2558,8 @@ catalogues:
|
|
|
2583
2558
|
type: string
|
|
2584
2559
|
nullable: false
|
|
2585
2560
|
description: Service identifier the consuming SDD references and the platform SDD owns. The join key.
|
|
2561
|
+
description: |
|
|
2562
|
+
Federated edge: an application-side or integration-side SDD's `product_platform_dependencies` reference resolves against a platform-side SDD's capability spec via the platform capability's `capability_service` roster. Surfaces ecosystem-wide platform- consumer relationships at product → capability granularity. Built **only at aggregation time** — `sdd-cli catalogue aggregate` joins each consuming SDD's `product_platform_dependencies` rows against every other SDD's `capability_service` rows on `target_service_id == service_id`, emitting one row per resolved (consuming-product, platform-capability) pair. Per-SDD builders emit nothing for this catalogue; the aggregator owns it entirely. A platform-dependency whose target_service_id doesn't resolve to any platform-side capability_service row is logged as an `orphan` finding and produces no row. Cross-SDD references are external by definition. Added in schema 2.9.0; see `content/plans/v0-9-0-cohort-sweep-derived-bundle.md` §"Cross-SDD platform-capability-edge" and M-ADR 0134.
|
|
2586
2563
|
foreign_keys:
|
|
2587
2564
|
- column: consuming_product_id
|
|
2588
2565
|
references: products.id
|
|
@@ -2598,14 +2575,11 @@ catalogues:
|
|
|
2598
2575
|
external: true
|
|
2599
2576
|
application_data_plane_bindings:
|
|
2600
2577
|
primary_key: id
|
|
2601
|
-
description: '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.
|
|
2602
|
-
|
|
2603
|
-
'
|
|
2604
2578
|
columns:
|
|
2605
2579
|
- name: id
|
|
2606
2580
|
type: string
|
|
2607
2581
|
nullable: false
|
|
2608
|
-
description:
|
|
2582
|
+
description: "{product_id}__{pattern}__{locality}__{target} (empty components collapse to blanks). A duplicate emits a divergence finding and is dropped. `direction` is NOT a component — it is derived from `pattern`, so it adds nothing to identity."
|
|
2609
2583
|
- name: product_id
|
|
2610
2584
|
type: string
|
|
2611
2585
|
nullable: false
|
|
@@ -2613,15 +2587,15 @@ catalogues:
|
|
|
2613
2587
|
- name: pattern
|
|
2614
2588
|
type: string
|
|
2615
2589
|
nullable: false
|
|
2616
|
-
description:
|
|
2590
|
+
description: "Closed method-tier enum: retrieve | own-store | stream-ingest | project (inbound, data-sourcing) | generate | publish (output-side, per M-ADR 0193 §4.7). How the data relates to the service (§4.1)."
|
|
2617
2591
|
- name: direction
|
|
2618
2592
|
type: string
|
|
2619
2593
|
nullable: false
|
|
2620
|
-
description:
|
|
2594
|
+
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."
|
|
2621
2595
|
- name: locality
|
|
2622
2596
|
type: string
|
|
2623
2597
|
nullable: true
|
|
2624
|
-
description:
|
|
2598
|
+
description: "Closed enum: internal-platform | internal-domain | external-vendor. Where the other end sits. REQUIRED on the inbound data-sourcing patterns (retrieve/stream-ingest/project); may be empty for own-store (a self-binding with no other end) and for the output-side patterns (generate/publish), which may carry one but do not require it (M-ADR 0193 §4.7)."
|
|
2625
2599
|
- name: transport
|
|
2626
2600
|
type: string
|
|
2627
2601
|
nullable: true
|
|
@@ -2646,20 +2620,19 @@ catalogues:
|
|
|
2646
2620
|
type: string
|
|
2647
2621
|
nullable: true
|
|
2648
2622
|
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.
|
|
2623
|
+
description: |
|
|
2624
|
+
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.
|
|
2649
2625
|
foreign_keys:
|
|
2650
2626
|
- column: product_id
|
|
2651
2627
|
references: products.id
|
|
2652
2628
|
nullable: false
|
|
2653
2629
|
application_data_plane_deviations:
|
|
2654
2630
|
primary_key: id
|
|
2655
|
-
description: '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.
|
|
2656
|
-
|
|
2657
|
-
'
|
|
2658
2631
|
columns:
|
|
2659
2632
|
- name: id
|
|
2660
2633
|
type: string
|
|
2661
2634
|
nullable: false
|
|
2662
|
-
description:
|
|
2635
|
+
description: "{product_id}__{expectation}. A duplicate emits a divergence finding and is dropped."
|
|
2663
2636
|
- name: product_id
|
|
2664
2637
|
type: string
|
|
2665
2638
|
nullable: false
|
|
@@ -2680,20 +2653,19 @@ catalogues:
|
|
|
2680
2653
|
type: string
|
|
2681
2654
|
nullable: true
|
|
2682
2655
|
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.
|
|
2656
|
+
description: |
|
|
2657
|
+
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.
|
|
2683
2658
|
foreign_keys:
|
|
2684
2659
|
- column: product_id
|
|
2685
2660
|
references: products.id
|
|
2686
2661
|
nullable: false
|
|
2687
2662
|
application_conformance_coverage:
|
|
2688
2663
|
primary_key: id
|
|
2689
|
-
description: 'Application-product annotation (M-ADR 0191 §4.3 overlay, second element — WS4): 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.
|
|
2690
|
-
|
|
2691
|
-
'
|
|
2692
2664
|
columns:
|
|
2693
2665
|
- name: id
|
|
2694
2666
|
type: string
|
|
2695
2667
|
nullable: false
|
|
2696
|
-
description:
|
|
2668
|
+
description: "{product_id}__{tag}. A duplicate emits a divergence finding and is dropped."
|
|
2697
2669
|
- name: product_id
|
|
2698
2670
|
type: string
|
|
2699
2671
|
nullable: false
|
|
@@ -2718,18 +2690,19 @@ catalogues:
|
|
|
2718
2690
|
type: string
|
|
2719
2691
|
nullable: true
|
|
2720
2692
|
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.
|
|
2693
|
+
description: |
|
|
2694
|
+
Application-product annotation (M-ADR 0191 §4.3 overlay, second element — WS4): 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.
|
|
2721
2695
|
foreign_keys:
|
|
2722
2696
|
- column: product_id
|
|
2723
2697
|
references: products.id
|
|
2724
2698
|
nullable: false
|
|
2725
2699
|
screens:
|
|
2726
2700
|
primary_key: id
|
|
2727
|
-
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.'
|
|
2728
2701
|
columns:
|
|
2729
2702
|
- name: id
|
|
2730
2703
|
type: string
|
|
2731
2704
|
nullable: false
|
|
2732
|
-
description:
|
|
2705
|
+
description: "Slugged PK: {product_id}-{screen-slug}."
|
|
2733
2706
|
- name: name
|
|
2734
2707
|
type: string
|
|
2735
2708
|
nullable: false
|
|
@@ -2765,7 +2738,7 @@ catalogues:
|
|
|
2765
2738
|
- name: evidence_class
|
|
2766
2739
|
type: string
|
|
2767
2740
|
nullable: true
|
|
2768
|
-
description:
|
|
2741
|
+
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."
|
|
2769
2742
|
- name: source_sdd_id
|
|
2770
2743
|
type: string
|
|
2771
2744
|
nullable: true
|
|
@@ -2774,18 +2747,18 @@ catalogues:
|
|
|
2774
2747
|
type: string
|
|
2775
2748
|
nullable: true
|
|
2776
2749
|
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.
|
|
2750
|
+
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."
|
|
2777
2751
|
foreign_keys:
|
|
2778
2752
|
- column: product_id
|
|
2779
2753
|
references: products.id
|
|
2780
2754
|
nullable: false
|
|
2781
2755
|
ui_components:
|
|
2782
2756
|
primary_key: id
|
|
2783
|
-
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.'
|
|
2784
2757
|
columns:
|
|
2785
2758
|
- name: id
|
|
2786
2759
|
type: string
|
|
2787
2760
|
nullable: false
|
|
2788
|
-
description:
|
|
2761
|
+
description: "Slugged PK: {product_id}-{component-slug}."
|
|
2789
2762
|
- name: name
|
|
2790
2763
|
type: string
|
|
2791
2764
|
nullable: false
|
|
@@ -2797,7 +2770,7 @@ catalogues:
|
|
|
2797
2770
|
- name: kind
|
|
2798
2771
|
type: string
|
|
2799
2772
|
nullable: true
|
|
2800
|
-
description:
|
|
2773
|
+
description: "Optional classification: layout | display | input | chart | element | composite | remote | remote-iframe | remote-webcomponent. A `remote*` kind marks a micro-frontend federation seam (M-ADR 0166 §4.7)."
|
|
2801
2774
|
- name: source
|
|
2802
2775
|
type: string
|
|
2803
2776
|
nullable: false
|
|
@@ -2810,18 +2783,18 @@ catalogues:
|
|
|
2810
2783
|
type: string
|
|
2811
2784
|
nullable: true
|
|
2812
2785
|
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.
|
|
2786
|
+
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."
|
|
2813
2787
|
foreign_keys:
|
|
2814
2788
|
- column: product_id
|
|
2815
2789
|
references: products.id
|
|
2816
2790
|
nullable: false
|
|
2817
2791
|
screen_component:
|
|
2818
2792
|
primary_key: id
|
|
2819
|
-
description: 'Edge: screen composes a UI component. Parsed from the screen-spec ```openui-lang block''s component references (per M-ADR 0166).'
|
|
2820
2793
|
columns:
|
|
2821
2794
|
- name: id
|
|
2822
2795
|
type: string
|
|
2823
2796
|
nullable: false
|
|
2824
|
-
description:
|
|
2797
|
+
description: "Composite PK: {screen_id}__{component_id}."
|
|
2825
2798
|
- name: screen_id
|
|
2826
2799
|
type: string
|
|
2827
2800
|
nullable: false
|
|
@@ -2836,6 +2809,7 @@ catalogues:
|
|
|
2836
2809
|
type: string
|
|
2837
2810
|
nullable: true
|
|
2838
2811
|
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.
|
|
2812
|
+
description: "Edge: screen composes a UI component. Parsed from the screen-spec ```openui-lang block's component references (per M-ADR 0166)."
|
|
2839
2813
|
foreign_keys:
|
|
2840
2814
|
- column: screen_id
|
|
2841
2815
|
references: screens.id
|
|
@@ -2845,12 +2819,11 @@ catalogues:
|
|
|
2845
2819
|
nullable: false
|
|
2846
2820
|
screen_feature:
|
|
2847
2821
|
primary_key: id
|
|
2848
|
-
description: 'Edge: screen realises a feature (traceability). Forward: `realises:` frontmatter on the screen-spec. Reverse: route → feature mapping. Per M-ADR 0166.'
|
|
2849
2822
|
columns:
|
|
2850
2823
|
- name: id
|
|
2851
2824
|
type: string
|
|
2852
2825
|
nullable: false
|
|
2853
|
-
description:
|
|
2826
|
+
description: "Composite PK: {screen_id}__{feature_id}. For app/integration builds the feature_id may be a bare realises slug until the aggregator resolves it to the platform feature id (then the PK is regenerated)."
|
|
2854
2827
|
- name: screen_id
|
|
2855
2828
|
type: string
|
|
2856
2829
|
nullable: false
|
|
@@ -2865,6 +2838,7 @@ catalogues:
|
|
|
2865
2838
|
type: string
|
|
2866
2839
|
nullable: true
|
|
2867
2840
|
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.
|
|
2841
|
+
description: "Edge: screen realises a feature (traceability). Forward: `realises:` frontmatter on the screen-spec. Reverse: route → feature mapping. Per M-ADR 0166."
|
|
2868
2842
|
foreign_keys:
|
|
2869
2843
|
- column: screen_id
|
|
2870
2844
|
references: screens.id
|
|
@@ -2877,12 +2851,11 @@ catalogues:
|
|
|
2877
2851
|
- integration-product
|
|
2878
2852
|
persona_screen:
|
|
2879
2853
|
primary_key: id
|
|
2880
|
-
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.'
|
|
2881
2854
|
columns:
|
|
2882
2855
|
- name: id
|
|
2883
2856
|
type: string
|
|
2884
2857
|
nullable: false
|
|
2885
|
-
description:
|
|
2858
|
+
description: "Composite PK: {persona_id}__{screen_id}."
|
|
2886
2859
|
- name: persona_id
|
|
2887
2860
|
type: string
|
|
2888
2861
|
nullable: false
|
|
@@ -2897,6 +2870,7 @@ catalogues:
|
|
|
2897
2870
|
type: string
|
|
2898
2871
|
nullable: true
|
|
2899
2872
|
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.
|
|
2873
|
+
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."
|
|
2900
2874
|
foreign_keys:
|
|
2901
2875
|
- column: persona_id
|
|
2902
2876
|
references: personas.id
|
|
@@ -2906,12 +2880,11 @@ catalogues:
|
|
|
2906
2880
|
nullable: false
|
|
2907
2881
|
screen_action:
|
|
2908
2882
|
primary_key: id
|
|
2909
|
-
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.'
|
|
2910
2883
|
columns:
|
|
2911
2884
|
- name: id
|
|
2912
2885
|
type: string
|
|
2913
2886
|
nullable: false
|
|
2914
|
-
description:
|
|
2887
|
+
description: "Composite PK: {screen_id}__{action-slug}."
|
|
2915
2888
|
- name: screen_id
|
|
2916
2889
|
type: string
|
|
2917
2890
|
nullable: false
|
|
@@ -2931,6 +2904,7 @@ catalogues:
|
|
|
2931
2904
|
type: string
|
|
2932
2905
|
nullable: true
|
|
2933
2906
|
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.
|
|
2907
|
+
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."
|
|
2934
2908
|
foreign_keys:
|
|
2935
2909
|
- column: screen_id
|
|
2936
2910
|
references: screens.id
|
|
@@ -2941,7 +2915,6 @@ catalogues:
|
|
|
2941
2915
|
external: true
|
|
2942
2916
|
conformance_finding:
|
|
2943
2917
|
primary_key: id
|
|
2944
|
-
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.'
|
|
2945
2918
|
columns:
|
|
2946
2919
|
- name: id
|
|
2947
2920
|
type: string
|
|
@@ -2984,11 +2957,11 @@ catalogues:
|
|
|
2984
2957
|
- name: declared_not_observed
|
|
2985
2958
|
type: number
|
|
2986
2959
|
nullable: false
|
|
2987
|
-
description:
|
|
2960
|
+
description: "Count declared but not observed (candidate: spec-stale / unimplemented / dangling)."
|
|
2988
2961
|
- name: observed_not_declared
|
|
2989
2962
|
type: number
|
|
2990
2963
|
nullable: false
|
|
2991
|
-
description:
|
|
2964
|
+
description: "Count observed but not declared (candidate: binding-stale / code-defect)."
|
|
2992
2965
|
- name: needs_triage
|
|
2993
2966
|
type: boolean
|
|
2994
2967
|
nullable: false
|
|
@@ -3005,24 +2978,14 @@ catalogues:
|
|
|
3005
2978
|
type: string
|
|
3006
2979
|
nullable: true
|
|
3007
2980
|
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.
|
|
2981
|
+
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."
|
|
3008
2982
|
quality_scores:
|
|
3009
2983
|
primary_key: id
|
|
3010
|
-
description: '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.
|
|
3011
|
-
|
|
3012
|
-
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.
|
|
3013
|
-
|
|
3014
|
-
THE BUILDER MUST READ TWO AUTHORED DIALECTS. All fifteen method-side templates specify a nested shape (`selection_policy` / `current` / `reviews`), but the live forward-estate data is overwhelmingly FLAT — `gate`/`weighted_score`/`scored_at`/`scored_by`/`scores`/`flags` directly on the entry. Measured 2026-08-06: reading only the template shape would catalogue 6 entries out of 204. The templates were modernised; the data was not migrated, and both are legitimate.
|
|
3015
|
-
|
|
3016
|
-
`rubric_id` comes from the file''s `registry_type` when declared, else the filename stem minus `-scores` — NEVER the container key, which is unreliable (4 of 10 forward registries drift from the method template) and non-unique (`domains` names both domain-architecture and intent-quality; `capabilities` names both feature-grounding and traceability-manifest).
|
|
3017
|
-
|
|
3018
|
-
Scope: the weighted house form only. The banded reverse family is additive later via `scoring_form` (see that enum).
|
|
3019
|
-
|
|
3020
|
-
'
|
|
3021
2984
|
columns:
|
|
3022
2985
|
- name: id
|
|
3023
2986
|
type: string
|
|
3024
2987
|
nullable: false
|
|
3025
|
-
description:
|
|
2988
|
+
description: "PK: {rubric_id}__{target_kind}__{target_ref}. Composite in one slug because the natural key is a triple and the rest of this schema keys on a single `id`."
|
|
3026
2989
|
- name: rubric_id
|
|
3027
2990
|
type: string
|
|
3028
2991
|
nullable: false
|
|
@@ -3034,7 +2997,7 @@ catalogues:
|
|
|
3034
2997
|
- name: target_kind
|
|
3035
2998
|
type: string
|
|
3036
2999
|
nullable: false
|
|
3037
|
-
description:
|
|
3000
|
+
description: "What kind of thing was scored: adr | contract | c4_diagram | capability | domain | feature | product | repository | persona | screen | glossary | integration | user_story | work_order | strategic_doc. Polymorphic because scored units span catalogue entities and non-catalogued artefacts (M-ADR 0205 §4.5)."
|
|
3038
3001
|
- name: target_ref
|
|
3039
3002
|
type: string
|
|
3040
3003
|
nullable: false
|
|
@@ -3058,19 +3021,19 @@ catalogues:
|
|
|
3058
3021
|
- name: band
|
|
3059
3022
|
type: string
|
|
3060
3023
|
nullable: true
|
|
3061
|
-
description:
|
|
3024
|
+
description: "Named band for a `banded` row; empty for a weighted one. DELIBERATELY UNBOUND, and for the same reason `dimension_key` is not normalised: the vocabulary belongs to the rubric, not to the method. Measured across the reverse estate at 3.3.0 — `reverseability` uses easy | moderate | hard | very-hard (a DIFFICULTY scale, where a higher band is worse), while `repo_doc_quality`, `product_synthesis_quality`, `reverse_platform_evidence_quality` and `artifact_quality` use strong | working (a QUALITY scale). One closed enum over both would assert that `hard` and `working` are comparable, which they are not. A consumer comparing bands must therefore group by rubric_id first."
|
|
3062
3025
|
- name: band_total
|
|
3063
3026
|
type: int
|
|
3064
3027
|
nullable: true
|
|
3065
|
-
description:
|
|
3028
|
+
description: "Integer total a `banded` rubric summed its dimensions to, before mapping to `band`; empty for a weighted row. Kept SEPARATE from weighted_score rather than sharing it: the scales are incompatible (a banded total ranges 0-13 against a weighted 1-5), and a single column holding both would make any average over it silently wrong. Separation makes an aggregate over weighted_score correct by construction rather than by the caller remembering to filter on scoring_form."
|
|
3066
3029
|
- name: scored_at
|
|
3067
3030
|
type: date
|
|
3068
3031
|
nullable: true
|
|
3069
|
-
description:
|
|
3032
|
+
description: "Date of the effective assessment, from `scored_at` (the forward house form's field name — NOT `assessed_at`, which is the reverse family's file-level field). Date-typed: per the M-ADR 0205 §4.1 engine's TRY_CAST semantics, a prose value here is reported as a type nonconformance rather than aborting the load or being smoothed away — the `adrs.decision_date` case, which reverse practice already exercises."
|
|
3070
3033
|
- name: corpus_ref
|
|
3071
3034
|
type: string
|
|
3072
3035
|
nullable: true
|
|
3073
|
-
description:
|
|
3036
|
+
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`)."
|
|
3074
3037
|
- name: staleness_basis
|
|
3075
3038
|
type: string
|
|
3076
3039
|
nullable: false
|
|
@@ -3082,7 +3045,7 @@ catalogues:
|
|
|
3082
3045
|
- name: selection_method
|
|
3083
3046
|
type: string
|
|
3084
3047
|
nullable: true
|
|
3085
|
-
description:
|
|
3048
|
+
description: "How the effective review was chosen — see the score_selection_method enum. Empty in the flat dialect, which carries no selection_policy: absence means 'the only review', not 'policy unknown'."
|
|
3086
3049
|
- name: scorer_provider
|
|
3087
3050
|
type: string
|
|
3088
3051
|
nullable: true
|
|
@@ -3106,11 +3069,11 @@ catalogues:
|
|
|
3106
3069
|
- name: flag_count
|
|
3107
3070
|
type: int
|
|
3108
3071
|
nullable: false
|
|
3109
|
-
description:
|
|
3072
|
+
description: "Number of heuristic flags raised. Normalises two authored dialects: `flags: {name: bool}` (count the true ones) and `flags_raised: [names]` (count the list). A per-flag child catalogue is deliberately NOT built — it arrives when a named query needs to filter by flag name, not by accretion."
|
|
3110
3073
|
- name: hard_gate_triggered
|
|
3111
3074
|
type: boolean
|
|
3112
3075
|
nullable: false
|
|
3113
|
-
description:
|
|
3076
|
+
description: "Whether any hard gate fired. Normalises `hard_gates: {triggered, reasons}` and `hard_gates_triggered: [reasons]`."
|
|
3114
3077
|
- name: required_actions_count
|
|
3115
3078
|
type: int
|
|
3116
3079
|
nullable: false
|
|
@@ -3127,22 +3090,23 @@ catalogues:
|
|
|
3127
3090
|
type: string
|
|
3128
3091
|
nullable: true
|
|
3129
3092
|
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.
|
|
3093
|
+
description: |
|
|
3094
|
+
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.
|
|
3095
|
+
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.
|
|
3096
|
+
THE BUILDER MUST READ TWO AUTHORED DIALECTS. All fifteen method-side templates specify a nested shape (`selection_policy` / `current` / `reviews`), but the live forward-estate data is overwhelmingly FLAT — `gate`/`weighted_score`/`scored_at`/`scored_by`/`scores`/`flags` directly on the entry. Measured 2026-08-06: reading only the template shape would catalogue 6 entries out of 204. The templates were modernised; the data was not migrated, and both are legitimate.
|
|
3097
|
+
`rubric_id` comes from the file's `registry_type` when declared, else the filename stem minus `-scores` — NEVER the container key, which is unreliable (4 of 10 forward registries drift from the method template) and non-unique (`domains` names both domain-architecture and intent-quality; `capabilities` names both feature-grounding and traceability-manifest).
|
|
3098
|
+
Scope: the weighted house form only. The banded reverse family is additive later via `scoring_form` (see that enum).
|
|
3130
3099
|
foreign_keys:
|
|
3131
3100
|
- column: sdd_id
|
|
3132
3101
|
references: products.id
|
|
3133
3102
|
nullable: true
|
|
3134
3103
|
quality_score_dimensions:
|
|
3135
3104
|
primary_key: id
|
|
3136
|
-
description: 'One row per (target, rubric, dimension) — the per-dimension detail behind a `quality_scores` row, per M-ADR 0205 §4.5.
|
|
3137
|
-
|
|
3138
|
-
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.
|
|
3139
|
-
|
|
3140
|
-
'
|
|
3141
3105
|
columns:
|
|
3142
3106
|
- name: id
|
|
3143
3107
|
type: string
|
|
3144
3108
|
nullable: false
|
|
3145
|
-
description:
|
|
3109
|
+
description: "PK: {quality_score_id}__{dimension_key}."
|
|
3146
3110
|
- name: quality_score_id
|
|
3147
3111
|
type: string
|
|
3148
3112
|
nullable: false
|
|
@@ -3162,7 +3126,7 @@ catalogues:
|
|
|
3162
3126
|
- name: dimension_key
|
|
3163
3127
|
type: string
|
|
3164
3128
|
nullable: false
|
|
3165
|
-
description:
|
|
3129
|
+
description: "The rubric's own dimension identifier, verbatim — `A1` where the rubric uses codes, `definition_precision` where it uses names. NOT normalised into a method-wide vocabulary: the key is how the rubric and its registry refer to the dimension, and rewriting it here would make the row untraceable to the rubric that produced it."
|
|
3166
3130
|
- name: dimension_score
|
|
3167
3131
|
type: number
|
|
3168
3132
|
nullable: true
|
|
@@ -3170,7 +3134,7 @@ catalogues:
|
|
|
3170
3134
|
- name: dimension_weight
|
|
3171
3135
|
type: number
|
|
3172
3136
|
nullable: true
|
|
3173
|
-
description:
|
|
3137
|
+
description: "Weight the rubric assigns the dimension, where discoverable. Usually EMPTY: weights live in the rubric document and the registry header comment, not per entry — so this column is honest about the fact that a weighted_score cannot currently be recomputed from these rows alone."
|
|
3174
3138
|
- name: source_sdd_id
|
|
3175
3139
|
type: string
|
|
3176
3140
|
nullable: true
|
|
@@ -3179,24 +3143,20 @@ catalogues:
|
|
|
3179
3143
|
type: string
|
|
3180
3144
|
nullable: true
|
|
3181
3145
|
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.
|
|
3146
|
+
description: |
|
|
3147
|
+
One row per (target, rubric, dimension) — the per-dimension detail behind a `quality_scores` row, per M-ADR 0205 §4.5.
|
|
3148
|
+
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.
|
|
3182
3149
|
foreign_keys:
|
|
3183
3150
|
- column: quality_score_id
|
|
3184
3151
|
references: quality_scores.id
|
|
3185
3152
|
nullable: false
|
|
3186
3153
|
scaffolds:
|
|
3187
3154
|
primary_key: id
|
|
3188
|
-
description: '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).
|
|
3189
|
-
|
|
3190
|
-
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.
|
|
3191
|
-
|
|
3192
|
-
`corpus_ref` is REQUIRED — a scaffold without an anchor cannot carry a staleness verdict, and M-ADR 0207 §4.6 makes the anchor part of the declaration, not an optional refinement. Staleness itself is computed at coverage time (the scores idiom), never stored here.
|
|
3193
|
-
|
|
3194
|
-
'
|
|
3195
3155
|
columns:
|
|
3196
3156
|
- name: id
|
|
3197
3157
|
type: string
|
|
3198
3158
|
nullable: false
|
|
3199
|
-
description:
|
|
3159
|
+
description: "PK: the manifest's declared unit id (kebab-case slug). Unique per SDD; the aggregator namespaces cross-SDD ids exactly as for every other catalogue."
|
|
3200
3160
|
- name: name
|
|
3201
3161
|
type: string
|
|
3202
3162
|
nullable: false
|
|
@@ -3212,7 +3172,7 @@ catalogues:
|
|
|
3212
3172
|
- name: corpus_ref
|
|
3213
3173
|
type: string
|
|
3214
3174
|
nullable: false
|
|
3215
|
-
description:
|
|
3175
|
+
description: "The commit the scaffold was declared against — the staleness anchor, mirroring quality_scores.corpus_ref (M-ADR 0207 §4.6: one staleness idiom, not two). Required: a manifest without one fails validation rather than emitting an unanchorable row."
|
|
3216
3176
|
- name: manifest_schema
|
|
3217
3177
|
type: string
|
|
3218
3178
|
nullable: false
|
|
@@ -3229,6 +3189,10 @@ catalogues:
|
|
|
3229
3189
|
type: string
|
|
3230
3190
|
nullable: true
|
|
3231
3191
|
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.
|
|
3192
|
+
description: |
|
|
3193
|
+
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).
|
|
3194
|
+
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.
|
|
3195
|
+
`corpus_ref` is REQUIRED — a scaffold without an anchor cannot carry a staleness verdict, and M-ADR 0207 §4.6 makes the anchor part of the declaration, not an optional refinement. Staleness itself is computed at coverage time (the scores idiom), never stored here.
|
|
3232
3196
|
foreign_keys:
|
|
3233
3197
|
- column: sdd_id
|
|
3234
3198
|
references: products.id
|
|
@@ -3237,18 +3201,11 @@ catalogues:
|
|
|
3237
3201
|
status: enums.scaffold_status
|
|
3238
3202
|
scaffold_items:
|
|
3239
3203
|
primary_key: id
|
|
3240
|
-
description: '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.
|
|
3241
|
-
|
|
3242
|
-
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.
|
|
3243
|
-
|
|
3244
|
-
`target_kind` is the CATALOGUE NAME the target should appear in (services, capabilities, repo_contract, contracts, …) — bound to the schema''s own catalogue list by the builder: an unknown target_kind is a loud convention finding, never a silently-dropped item (M-ADR 0207 §4.1). For `edge` items the endpoints are declared in edge_source_ref/edge_target_ref, mapped to the edge catalogue''s FK columns in schema declaration order; target_ref then carries the builder-computed endpoint slug so the PK stays single-column.
|
|
3245
|
-
|
|
3246
|
-
'
|
|
3247
3204
|
columns:
|
|
3248
3205
|
- name: id
|
|
3249
3206
|
type: string
|
|
3250
3207
|
nullable: false
|
|
3251
|
-
description:
|
|
3208
|
+
description: "PK: {scaffold_id}__{item_kind}__{target_kind}__{target_ref}. Composite in one slug because the natural key is a quadruple and the rest of this schema keys on a single `id`."
|
|
3252
3209
|
- name: scaffold_id
|
|
3253
3210
|
type: string
|
|
3254
3211
|
nullable: false
|
|
@@ -3264,15 +3221,15 @@ catalogues:
|
|
|
3264
3221
|
- name: target_ref
|
|
3265
3222
|
type: string
|
|
3266
3223
|
nullable: false
|
|
3267
|
-
description:
|
|
3224
|
+
description: "Identifier of the declared target in the vocabulary of its catalogue: the declared id for entity items, the repo-relative spec path for contract items (matching contracts.spec_path), the builder-computed {source}__{target} endpoint slug for edge items."
|
|
3268
3225
|
- name: edge_source_ref
|
|
3269
3226
|
type: string
|
|
3270
3227
|
nullable: true
|
|
3271
|
-
description:
|
|
3228
|
+
description: "For edge items: the declared source endpoint, in the vocabulary of the edge catalogue's first FK column (schema declaration order). Empty for entity and contract items."
|
|
3272
3229
|
- name: edge_target_ref
|
|
3273
3230
|
type: string
|
|
3274
3231
|
nullable: true
|
|
3275
|
-
description:
|
|
3232
|
+
description: "For edge items: the declared target endpoint, second FK column. Empty for entity and contract items."
|
|
3276
3233
|
- name: state
|
|
3277
3234
|
type: string
|
|
3278
3235
|
nullable: false
|
|
@@ -3285,6 +3242,10 @@ catalogues:
|
|
|
3285
3242
|
type: string
|
|
3286
3243
|
nullable: true
|
|
3287
3244
|
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.
|
|
3245
|
+
description: |
|
|
3246
|
+
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.
|
|
3247
|
+
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.
|
|
3248
|
+
`target_kind` is the CATALOGUE NAME the target should appear in (services, capabilities, repo_contract, contracts, …) — bound to the schema's own catalogue list by the builder: an unknown target_kind is a loud convention finding, never a silently-dropped item (M-ADR 0207 §4.1). For `edge` items the endpoints are declared in edge_source_ref/edge_target_ref, mapped to the edge catalogue's FK columns in schema declaration order; target_ref then carries the builder-computed endpoint slug so the PK stays single-column.
|
|
3288
3249
|
foreign_keys:
|
|
3289
3250
|
- column: scaffold_id
|
|
3290
3251
|
references: scaffolds.id
|