@sdd-method/sdd-cli 0.85.0 → 0.87.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/lib/catalogue/aggregate.d.ts.map +1 -1
  2. package/dist/lib/catalogue/aggregate.js +28 -3
  3. package/dist/lib/catalogue/aggregate.js.map +1 -1
  4. package/dist/lib/catalogue/build.d.ts.map +1 -1
  5. package/dist/lib/catalogue/build.js +12 -1
  6. package/dist/lib/catalogue/build.js.map +1 -1
  7. package/dist/lib/catalogue/builders/container-dependency.d.ts +2 -0
  8. package/dist/lib/catalogue/builders/container-dependency.d.ts.map +1 -1
  9. package/dist/lib/catalogue/builders/container-dependency.js +49 -5
  10. package/dist/lib/catalogue/builders/container-dependency.js.map +1 -1
  11. package/dist/lib/catalogue/builders/edge-label-merge.d.ts +4 -0
  12. package/dist/lib/catalogue/builders/edge-label-merge.d.ts.map +1 -0
  13. package/dist/lib/catalogue/builders/edge-label-merge.js +19 -0
  14. package/dist/lib/catalogue/builders/edge-label-merge.js.map +1 -0
  15. package/dist/lib/catalogue/builders/index.d.ts +1 -0
  16. package/dist/lib/catalogue/builders/index.d.ts.map +1 -1
  17. package/dist/lib/catalogue/builders/index.js +1 -0
  18. package/dist/lib/catalogue/builders/index.js.map +1 -1
  19. package/dist/lib/catalogue/builders/persona-container.d.ts +13 -0
  20. package/dist/lib/catalogue/builders/persona-container.d.ts.map +1 -0
  21. package/dist/lib/catalogue/builders/persona-container.js +95 -0
  22. package/dist/lib/catalogue/builders/persona-container.js.map +1 -0
  23. package/dist/lib/catalogue/builders/system-external-dependency.d.ts.map +1 -1
  24. package/dist/lib/catalogue/builders/system-external-dependency.js +8 -2
  25. package/dist/lib/catalogue/builders/system-external-dependency.js.map +1 -1
  26. package/dist/lib/catalogue/canonical-schema.yaml +37 -2
  27. package/package.json +1 -1
@@ -18,6 +18,7 @@
18
18
  // source; dedup is by id, member rows first.
19
19
  import { readFile } from "node:fs/promises";
20
20
  import { collectC4DiagramFiles } from "./c4-external-systems.js";
21
+ import { mergeEdgeLabel } from "./edge-label-merge.js";
21
22
  import { techContradicts } from "./c4-containers.js";
22
23
  const REL_RE = /^(?:Bi)?Rel(?:_[A-Za-z]+)?\s*\(\s*(\w+)\s*,\s*(\w+)\s*(?:,\s*"([^"]*)")?/;
23
24
  export async function buildContainerDependency(inputs) {
@@ -27,10 +28,20 @@ export async function buildContainerDependency(inputs) {
27
28
  const files = await collectC4DiagramFiles(inputs.sddPath);
28
29
  const rows = [];
29
30
  const seen = new Set();
31
+ const rowsById = new Map();
32
+ const PERSON_DECL_RE = /Person(?:_Ext)?\s*\(\s*(\w+)\s*,/;
30
33
  for (const { abs, syndicated } of files) {
31
34
  if (syndicated && !isRoot)
32
35
  continue;
33
36
  const content = await readFile(abs, "utf-8");
37
+ // F26: per-file Person entries — the endpoint class that has no edge
38
+ // catalogue to a container.
39
+ const personEntries = new Set();
40
+ for (const raw of content.split(/\r?\n/)) {
41
+ const pm = PERSON_DECL_RE.exec(raw.trim());
42
+ if (pm)
43
+ personEntries.add(pm[1] ?? "");
44
+ }
34
45
  for (const raw of content.split(/\r?\n/)) {
35
46
  const m = REL_RE.exec(raw.trim());
36
47
  if (!m)
@@ -48,21 +59,51 @@ export async function buildContainerDependency(inputs) {
48
59
  // by id, so nothing is double-represented.
49
60
  const from = inputs.containerIdByEntryId.get(fromEntry ?? "");
50
61
  const to = inputs.containerIdByEntryId.get(toEntry ?? "");
51
- if (from === undefined || to === undefined)
52
- continue; // an endpoint is not a local container
62
+ if (from === undefined || to === undefined) {
63
+ // F26: a Rel the builder RESOLVES but cannot catalogue must say so
64
+ // — following F23's rename prescription turned exactly this
65
+ // silence into a two-edge delete. Classification is
66
+ // container-first (F20), then external, then Person (file-local);
67
+ // anything unknown stays silent (no confident classification, no
68
+ // guess). Pairs with a home elsewhere (one-external →
69
+ // system_external_dependency; person→system → persona_c4system)
70
+ // are not reported here.
71
+ const classify = (entry, resolved) => resolved !== undefined
72
+ ? "container"
73
+ : inputs.externalIdByEntryId?.has(entry)
74
+ ? "external"
75
+ : personEntries.has(entry)
76
+ ? "person"
77
+ : "unknown";
78
+ const fromKind = classify(fromEntry ?? "", from);
79
+ const toKind = classify(toEntry ?? "", to);
80
+ const pair = `${fromKind}→${toKind}`;
81
+ // person↔container pairs are catalogued by persona_container as of
82
+ // schema 2.34.0 (or reported there when the persona doesn't
83
+ // resolve) — only the pairs with NO home remain findings here.
84
+ if (pair === "external→external") {
85
+ inputs.findings.add("convention", `container_dependency: Rel(${fromEntry}, ${toEntry}${label ? `, "${label}"` : ""}) resolves as ` +
86
+ `${pair} — no catalogue holds that pair; the relationship is recorded nowhere (F26)`);
87
+ }
88
+ continue;
89
+ }
53
90
  if (from === to)
54
91
  continue;
55
92
  const id = `${from}__${to}`;
56
- if (seen.has(id))
93
+ const existing = rowsById.get(id);
94
+ if (existing !== undefined) {
95
+ mergeEdgeLabel(existing, label ?? "", "container_dependency", inputs.findings);
57
96
  continue;
97
+ }
58
98
  seen.add(id);
59
- rows.push({
99
+ rowsById.set(id, {
60
100
  id,
61
101
  from_container_id: from,
62
102
  to_container_id: to,
63
103
  interaction: label ?? "",
64
104
  source_sdd_id: inputs.manifest.sddId,
65
105
  });
106
+ rows.push(rowsById.get(id));
66
107
  }
67
108
  }
68
109
  rows.sort((a, b) => String(a["id"]).localeCompare(String(b["id"])));
@@ -133,7 +174,10 @@ export function reportEntryIdReferentCollisions(inputs) {
133
174
  inputs.findings.add("convention", `c4 diagrams: entry-id "${entryId}" is declared Container ("${containerName}") and System_Ext ` +
134
175
  `("${externalName}") with no independent evidence to adjudicate referent identity — System_Ext ` +
135
176
  `carries no technology field; cannot corroborate, cannot contradict. Rename one entry-id to split ` +
136
- `the namespaces (F23)`);
177
+ `the namespaces — but check first whether the dual use is load-bearing: if Rel edges exist only via ` +
178
+ `the Container reading, a rename orphans them (they will surface as F26 findings); in that case ` +
179
+ `annotate the System_Ext description with the technology instead, so weak corroboration can silence ` +
180
+ `this honestly (F23/F26)`);
137
181
  }
138
182
  }
139
183
  //# sourceMappingURL=container-dependency.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"container-dependency.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/container-dependency.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"container-dependency.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/container-dependency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CatalogueRow } from "../csv-writer.js";
2
+ import type { FindingsLog } from "../findings.js";
3
+ export declare function mergeEdgeLabel(row: CatalogueRow, label: string, catalogue: string, findings: FindingsLog): void;
4
+ //# sourceMappingURL=edge-label-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-label-merge.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/edge-label-merge.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,GACpB,IAAI,CAYN"}
@@ -0,0 +1,19 @@
1
+ // F25 — one edge per node pair is the metamodel's rule (schema-stated since
2
+ // 2.30.0) and it stands. The defect was the SILENCE: distinct parallel
3
+ // labels merged first-seen-wins at member and aggregate tier, discarding
4
+ // authored facts without a word (measured: 20 labels already lost before
5
+ // the mechanism that exposed it existed). The merge now concatenates every
6
+ // distinct label — nothing dropped — and says so.
7
+ export function mergeEdgeLabel(row, label, catalogue, findings) {
8
+ if (label === "")
9
+ return;
10
+ const existing = String(row["interaction"] ?? "");
11
+ const parts = existing === "" ? [] : existing.split("; ");
12
+ if (parts.includes(label))
13
+ return;
14
+ row["interaction"] =
15
+ existing === "" ? label : `${existing}; ${label}`;
16
+ findings.add("convention", `${catalogue}: edge "${String(row["id"])}" is declared with multiple distinct labels — ` +
17
+ `one edge per node pair (schema rule); labels concatenated, nothing dropped (F25)`);
18
+ }
19
+ //# sourceMappingURL=edge-label-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-label-merge.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/edge-label-merge.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,uEAAuE;AACvE,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,kDAAkD;AAKlD,MAAM,UAAU,cAAc,CAC5B,GAAiB,EACjB,KAAa,EACb,SAAiB,EACjB,QAAqB;IAErB,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO;IACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO;IACjC,GAA+B,CAAC,aAAa,CAAC;QAC7C,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,KAAK,EAAE,CAAC;IACpD,QAAQ,CAAC,GAAG,CACV,YAAY,EACZ,GAAG,SAAS,WAAW,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,gDAAgD;QACtF,kFAAkF,CACrF,CAAC;AACJ,CAAC"}
@@ -32,6 +32,7 @@ export { buildRepoEdges } from "./repo-edges.js";
32
32
  export { buildRepoCapabilityExemption } from "./repo-capability-exemption.js";
33
33
  export { buildExternalSystemExemption } from "./external-system-exemption.js";
34
34
  export { buildContainerDependency, reportEntryIdReferentCollisions } from "./container-dependency.js";
35
+ export { buildPersonaContainer } from "./persona-container.js";
35
36
  export type { RepoCapabilityExemptionInputs } from "./repo-capability-exemption.js";
36
37
  export type { RepoEdgesInputs, RepoEdgesResult, } from "./repo-edges.js";
37
38
  export { buildEvents } from "./events.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EACV,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EACV,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,YAAY,EACV,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AACtG,YAAY,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AACpF,YAAY,EACV,eAAe,EACf,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,YAAY,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EACV,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EACV,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EACV,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EACV,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EACV,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,YAAY,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,YAAY,EAAE,sCAAsC,EAAE,MAAM,oCAAoC,CAAC;AACjG,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,YAAY,EAAE,sCAAsC,EAAE,MAAM,oCAAoC,CAAC;AACjG,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,YAAY,EACV,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,YAAY,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EACV,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,YAAY,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EACL,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,7 @@ export { buildRepoEdges } from "./repo-edges.js";
21
21
  export { buildRepoCapabilityExemption } from "./repo-capability-exemption.js";
22
22
  export { buildExternalSystemExemption } from "./external-system-exemption.js";
23
23
  export { buildContainerDependency, reportEntryIdReferentCollisions } from "./container-dependency.js";
24
+ export { buildPersonaContainer } from "./persona-container.js";
24
25
  export { buildEvents } from "./events.js";
25
26
  export { buildServiceEvent, buildCapabilityEvent, buildFeatureEvent, } from "./event-edges.js";
26
27
  export { buildServiceContract } from "./service-contract.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { CatalogueRow } from "../csv-writer.js";
2
+ import type { FindingsLog } from "../findings.js";
3
+ import type { SddManifest } from "../manifest-loader.js";
4
+ export interface PersonaContainerInputs {
5
+ readonly sddPath: string;
6
+ readonly manifest: SddManifest;
7
+ readonly findings: FindingsLog;
8
+ readonly containerIdByEntryId: ReadonlyMap<string, string>;
9
+ readonly personaIdByName: ReadonlyMap<string, string>;
10
+ readonly personaIdBySlug: ReadonlyMap<string, string>;
11
+ }
12
+ export declare function buildPersonaContainer(inputs: PersonaContainerInputs): Promise<CatalogueRow[]>;
13
+ //# sourceMappingURL=persona-container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona-container.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/persona-container.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMzD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3D,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvD;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CAqEzB"}
@@ -0,0 +1,95 @@
1
+ // persona_container edge builder — M-ADR 0189 F26 §3 (schema 2.34.0).
2
+ //
3
+ // The L2-granularity companion to persona_c4system: a Rel(...) between a
4
+ // Person and a container had no catalogue and, until F26, no finding —
5
+ // eleven of one estate's L2s and the bulk of another's 81 unroutable Rels
6
+ // were exactly this class. F26 made the silence loud; this gives the
7
+ // loudness a destination.
8
+ //
9
+ // Person entries are file-local (a Person declared in the same diagram as
10
+ // the Rel); containers resolve SDD-wide (F20's rule). Either Rel direction
11
+ // normalises to persona→container. A Person that matches no persona row is
12
+ // a coverage finding, never a silent skip (the persona_c4system precedent).
13
+ // The syndicated platform L1 is skipped for non-root SDDs (F14); parallel
14
+ // labels concatenate loudly (F25).
15
+ import { readFile } from "node:fs/promises";
16
+ import { collectC4DiagramFiles } from "./c4-external-systems.js";
17
+ import { mergeEdgeLabel } from "./edge-label-merge.js";
18
+ const REL_RE = /^(?:Bi)?Rel(?:_[A-Za-z]+)?\s*\(\s*(\w+)\s*,\s*(\w+)\s*(?:,\s*"([^"]*)")?/;
19
+ const PERSON_DECL_RE = /Person(?:_Ext)?\s*\(\s*(\w+)\s*,\s*"([^"]+)"/;
20
+ export async function buildPersonaContainer(inputs) {
21
+ if (inputs.containerIdByEntryId.size === 0)
22
+ return [];
23
+ const isRoot = inputs.manifest.category === "platform-root";
24
+ const files = await collectC4DiagramFiles(inputs.sddPath);
25
+ const rows = [];
26
+ const rowsById = new Map();
27
+ for (const { abs, syndicated } of files) {
28
+ if (syndicated && !isRoot)
29
+ continue;
30
+ const content = await readFile(abs, "utf-8");
31
+ const personNameByEntry = new Map();
32
+ for (const raw of content.split(/\r?\n/)) {
33
+ const pm = PERSON_DECL_RE.exec(raw.trim());
34
+ if (pm && !personNameByEntry.has(pm[1] ?? "")) {
35
+ personNameByEntry.set(pm[1] ?? "", pm[2] ?? "");
36
+ }
37
+ }
38
+ if (personNameByEntry.size === 0)
39
+ continue;
40
+ for (const raw of content.split(/\r?\n/)) {
41
+ const m = REL_RE.exec(raw.trim());
42
+ if (!m)
43
+ continue;
44
+ const [, fromEntry, toEntry, label] = m;
45
+ // Either direction: normalise to persona→container. Container
46
+ // resolution wins over the person map on a dual-use id (F20).
47
+ let personEntry;
48
+ let containerId;
49
+ const fromContainer = inputs.containerIdByEntryId.get(fromEntry ?? "");
50
+ const toContainer = inputs.containerIdByEntryId.get(toEntry ?? "");
51
+ if (fromContainer === undefined && personNameByEntry.has(fromEntry ?? "") && toContainer !== undefined) {
52
+ personEntry = fromEntry;
53
+ containerId = toContainer;
54
+ }
55
+ else if (toContainer === undefined && personNameByEntry.has(toEntry ?? "") && fromContainer !== undefined) {
56
+ personEntry = toEntry;
57
+ containerId = fromContainer;
58
+ }
59
+ else {
60
+ continue;
61
+ }
62
+ const personName = personNameByEntry.get(personEntry ?? "") ?? "";
63
+ const personaId = inputs.personaIdByName.get(personName.toLowerCase()) ??
64
+ inputs.personaIdBySlug.get(slugify(personName));
65
+ if (personaId === undefined) {
66
+ inputs.findings.add("coverage", `persona_container: Person "${personName}" on an L2 diagram has no matching persona row — edge skipped`);
67
+ continue;
68
+ }
69
+ const id = `${personaId}__${containerId}`;
70
+ const existing = rowsById.get(id);
71
+ if (existing !== undefined) {
72
+ mergeEdgeLabel(existing, label ?? "", "persona_container", inputs.findings);
73
+ continue;
74
+ }
75
+ const row = {
76
+ id,
77
+ persona_id: personaId,
78
+ container_id: containerId,
79
+ interaction: label ?? "",
80
+ };
81
+ rowsById.set(id, row);
82
+ rows.push(row);
83
+ }
84
+ }
85
+ rows.sort((a, b) => String(a["id"]).localeCompare(String(b["id"])));
86
+ return rows;
87
+ }
88
+ function slugify(s) {
89
+ return s
90
+ .toLowerCase()
91
+ .replace(/\s*\([^)]+\)/g, "")
92
+ .replace(/[^a-z0-9]+/g, "-")
93
+ .replace(/^-+|-+$/g, "");
94
+ }
95
+ //# sourceMappingURL=persona-container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona-container.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/persona-container.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"system-external-dependency.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/system-external-dependency.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,mFAAmF;IACnF,QAAQ,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,sEAAsE;IACtE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7D;AAYD,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,8BAA8B,GACrC,OAAO,CAAC,YAAY,EAAE,CAAC,CAqDzB"}
1
+ {"version":3,"file":"system-external-dependency.d.ts","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/system-external-dependency.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,mFAAmF;IACnF,QAAQ,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,sEAAsE;IACtE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7D;AAYD,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,8BAA8B,GACrC,OAAO,CAAC,YAAY,EAAE,CAAC,CA2DzB"}
@@ -10,6 +10,7 @@
10
10
  // §4.2 keeps the edge system-scoped.
11
11
  import { readFile } from "node:fs/promises";
12
12
  import { collectC4DiagramFiles } from "./c4-external-systems.js";
13
+ import { mergeEdgeLabel } from "./edge-label-merge.js";
13
14
  // Any C4-PlantUML relationship macro: Rel, Rel_U/D/L/R, BiRel, Rel_Back, etc.
14
15
  // Capture the first two positional args (from, to) and an optional label.
15
16
  const REL_RE = /^(?:Bi)?Rel(?:_[A-Za-z]+)?\s*\(\s*(\w+)\s*,\s*(\w+)\s*(?:,\s*"([^"]*)")?/;
@@ -28,6 +29,7 @@ export async function buildSystemExternalDependency(inputs) {
28
29
  const files = await collectC4DiagramFiles(inputs.sddPath);
29
30
  const rows = [];
30
31
  const seen = new Set();
32
+ const rowsById = new Map();
31
33
  // F14: a Rel in the syndicated platform L1 is a statement about the
32
34
  // PLATFORM. For any other SDD those lines minted the platform's
33
35
  // dependencies (and even its persona interactions) as the sibling's own
@@ -54,16 +56,20 @@ export async function buildSystemExternalDependency(inputs) {
54
56
  const localEntry = fromExt === undefined ? rel.from : rel.to;
55
57
  const fromContainerId = inputs.containerIdByEntryId?.get(localEntry) ?? "";
56
58
  const id = `${systemId}__${externalSystemId}`;
57
- if (seen.has(id))
59
+ const existing = rowsById.get(id);
60
+ if (existing !== undefined) {
61
+ mergeEdgeLabel(existing, rel.label, "system_external_dependency", inputs.findings);
58
62
  continue;
63
+ }
59
64
  seen.add(id);
60
- rows.push({
65
+ rowsById.set(id, {
61
66
  id,
62
67
  c4_system_id: systemId,
63
68
  external_system_id: externalSystemId,
64
69
  interaction: rel.label,
65
70
  from_container_id: fromContainerId,
66
71
  });
72
+ rows.push(rowsById.get(id));
67
73
  }
68
74
  }
69
75
  rows.sort((a, b) => String(a["id"]).localeCompare(String(b["id"])));
@@ -1 +1 @@
1
- {"version":3,"file":"system-external-dependency.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/system-external-dependency.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"system-external-dependency.js","sourceRoot":"","sources":["../../../../src/lib/catalogue/builders/system-external-dependency.ts"],"names":[],"mappings":"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"}
@@ -45,9 +45,22 @@
45
45
  # Builder contract: see docs/method/methods/catalogue-builder-specification.md.
46
46
  # Category taxonomy: see docs/method/methods/product-category-taxonomy.md.
47
47
 
48
- schema_version: "2.33.1"
48
+ schema_version: "2.34.0"
49
49
  schema_owner: "sdd-method"
50
50
  schema_status: "canonical"
51
+ # Bump rationale (2.34.0 — additive minor, per M-ADR 0189 F26 §3, ratified
52
+ # 2026-07-10): adds the `persona_container` edge — the L2-granularity
53
+ # companion to persona_c4system. Person→Container Rels are drawn routinely
54
+ # (11 L2s on one estate; the bulk of 81 unroutable Rels on the other) and
55
+ # had no catalogue: F26 made the silence loud, this gives the loudness a
56
+ # destination. An unmatched Person stays a coverage finding.
57
+ # Bump rationale (2.33.2 — description patch, per adopter finding F25,
58
+ # 2026-07-10): one edge per node pair remains the rule for all three
59
+ # dependency edge catalogues, but the merge now KEEPS every distinct
60
+ # authored label — `interaction` may hold multiple "; "-joined labels —
61
+ # and each merge is a convention finding. The silence was the defect:
62
+ # distinct parallel labels had merged first-seen since 2.30.0, discarding
63
+ # authored facts at member and aggregate tier without a word.
51
64
  # Bump rationale (2.33.0 — additive minor, per adopter finding F17,
52
65
  # 2026-07-10): adds the `container_dependency` edge catalogue and a
53
66
  # nullable member-resolved `from_container_id` on
@@ -1079,6 +1092,28 @@ catalogues:
1079
1092
  - { name: c4_system_id, type: string, nullable: false }
1080
1093
  - { name: interaction, type: string, nullable: true, description: "Optional interaction label from the Rel(...) line, e.g. 'Web browser' / 'Mobile app'." }
1081
1094
 
1095
+ persona_container:
1096
+ primary_key: id
1097
+ description: >
1098
+ Edge: a persona uses a C4 container — the L2-granularity companion to
1099
+ persona_c4system (M-ADR 0189 F26 §3, ratified 2026-07-10). Eleven of
1100
+ one estate's L2 diagrams and the bulk of another's 81 unroutable Rels
1101
+ drew Person→Container relationships that had no catalogue and, until
1102
+ F26, no finding. Harvested at member tier from Rel(...) lines whose
1103
+ endpoints resolve to a file-local Person and a local container (either
1104
+ direction; the row is normalised persona→container). A Person that
1105
+ matches no persona row is a coverage finding, never a silent skip.
1106
+ Both authoring directions feed from the same diagram surface
1107
+ (M-ADR 0157 parity). Added in schema 2.34.0.
1108
+ foreign_keys:
1109
+ - { column: persona_id, references: personas.id, nullable: false }
1110
+ - { column: container_id, references: c4_containers.id, nullable: false }
1111
+ columns:
1112
+ - { name: id, type: string, nullable: false, description: "{persona_id}__{container_id}." }
1113
+ - { name: persona_id, type: string, nullable: false }
1114
+ - { name: container_id, type: string, nullable: false }
1115
+ - { name: interaction, type: string, nullable: true, description: "Optional interaction label from the Rel(...) line. May hold multiple '; '-joined labels (F25)." }
1116
+
1082
1117
  system_external_dependency:
1083
1118
  primary_key: id
1084
1119
  description: "Edge: a C4 system integrates with an external software system. Captures the L1 context 'System integrates with External System' relationship, extracted from System_Ext(...) + Rel(...) on L1/L2 diagrams. Per ADR 0155. Container-level external dependencies are out of scope (system-level only). Added in schema 2.10.0. From 2.30.0 (M-ADR 0189 §4.4): edges whose external endpoint the aggregator adjudicates as an INTERNAL system are rewritten onto system_system_dependency and removed from this catalogue."
@@ -1090,7 +1125,7 @@ catalogues:
1090
1125
  - { name: id, type: string, nullable: false, description: "{c4_system_id}__{external_system_id}." }
1091
1126
  - { name: c4_system_id, type: string, nullable: false }
1092
1127
  - { name: external_system_id, type: string, nullable: false }
1093
- - { name: interaction, type: string, nullable: true, description: "Optional integration label/protocol from the Rel(...) line." }
1128
+ - { name: interaction, type: string, nullable: true, description: "Optional integration label/protocol from the Rel(...) line. May hold multiple '; '-joined labels when one pair is declared with distinct labels (F25, 2.33.2)." }
1094
1129
  - { name: from_container_id, type: string, nullable: true, 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." }
1095
1130
 
1096
1131
  container_dependency: