@bett3r-dev/blueprint-schema 1.6.0 → 1.8.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 (235) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/build/cjs/apply-design.d.ts +5 -5
  3. package/build/cjs/apply-design.d.ts.map +1 -1
  4. package/build/cjs/apply-design.js +21 -5
  5. package/build/cjs/apply-design.js.map +1 -1
  6. package/build/cjs/apply-overrides.d.ts +3 -3
  7. package/build/cjs/apply-overrides.d.ts.map +1 -1
  8. package/build/cjs/apply-overrides.js +5 -1
  9. package/build/cjs/apply-overrides.js.map +1 -1
  10. package/build/cjs/card-channel.d.ts +18 -0
  11. package/build/cjs/card-channel.d.ts.map +1 -0
  12. package/build/cjs/card-channel.js +30 -0
  13. package/build/cjs/card-channel.js.map +1 -0
  14. package/build/cjs/convergence.d.ts +2 -2
  15. package/build/cjs/convergence.d.ts.map +1 -1
  16. package/build/cjs/coverage-links.d.ts +27 -0
  17. package/build/cjs/coverage-links.d.ts.map +1 -0
  18. package/build/cjs/coverage-links.js +117 -0
  19. package/build/cjs/coverage-links.js.map +1 -0
  20. package/build/cjs/design.d.ts +44 -2
  21. package/build/cjs/design.d.ts.map +1 -1
  22. package/build/cjs/design.js +42 -2
  23. package/build/cjs/design.js.map +1 -1
  24. package/build/cjs/diagnostics.d.ts +2 -2
  25. package/build/cjs/diagnostics.d.ts.map +1 -1
  26. package/build/cjs/edge-endpoints.d.ts +33 -0
  27. package/build/cjs/edge-endpoints.d.ts.map +1 -0
  28. package/build/cjs/edge-endpoints.js +83 -0
  29. package/build/cjs/edge-endpoints.js.map +1 -0
  30. package/build/cjs/edges.d.ts +2 -2
  31. package/build/cjs/edges.d.ts.map +1 -1
  32. package/build/cjs/edges.js +2 -1
  33. package/build/cjs/edges.js.map +1 -1
  34. package/build/cjs/effective-design.d.ts +21 -0
  35. package/build/cjs/effective-design.d.ts.map +1 -0
  36. package/build/cjs/effective-design.js +172 -0
  37. package/build/cjs/effective-design.js.map +1 -0
  38. package/build/cjs/entry-points.d.ts +2 -2
  39. package/build/cjs/entry-points.d.ts.map +1 -1
  40. package/build/cjs/find-orphan-nodes.d.ts +3 -3
  41. package/build/cjs/find-orphan-nodes.d.ts.map +1 -1
  42. package/build/cjs/flow-traversal.d.ts +3 -3
  43. package/build/cjs/flow-traversal.d.ts.map +1 -1
  44. package/build/cjs/fork-scenarios.d.ts +44 -0
  45. package/build/cjs/fork-scenarios.d.ts.map +1 -0
  46. package/build/cjs/fork-scenarios.js +83 -0
  47. package/build/cjs/fork-scenarios.js.map +1 -0
  48. package/build/cjs/graph.d.ts +27 -2
  49. package/build/cjs/graph.d.ts.map +1 -1
  50. package/build/cjs/graph.js +36 -0
  51. package/build/cjs/graph.js.map +1 -1
  52. package/build/cjs/handler-scope.d.ts +3 -3
  53. package/build/cjs/handler-scope.d.ts.map +1 -1
  54. package/build/cjs/index.d.ts +9 -0
  55. package/build/cjs/index.d.ts.map +1 -1
  56. package/build/cjs/index.js +9 -0
  57. package/build/cjs/index.js.map +1 -1
  58. package/build/cjs/invariants.d.ts +26 -0
  59. package/build/cjs/invariants.d.ts.map +1 -0
  60. package/build/cjs/invariants.js +39 -0
  61. package/build/cjs/invariants.js.map +1 -0
  62. package/build/cjs/map-links.d.ts +1 -0
  63. package/build/cjs/map-links.d.ts.map +1 -1
  64. package/build/cjs/map-links.js +14 -1
  65. package/build/cjs/map-links.js.map +1 -1
  66. package/build/cjs/map-structure.d.ts +172 -3
  67. package/build/cjs/map-structure.d.ts.map +1 -1
  68. package/build/cjs/map-structure.js +46 -4
  69. package/build/cjs/map-structure.js.map +1 -1
  70. package/build/cjs/map-vocabulary.d.ts +29 -1
  71. package/build/cjs/map-vocabulary.d.ts.map +1 -1
  72. package/build/cjs/map-vocabulary.js +72 -2
  73. package/build/cjs/map-vocabulary.js.map +1 -1
  74. package/build/cjs/nodes.d.ts +11 -1
  75. package/build/cjs/nodes.d.ts.map +1 -1
  76. package/build/cjs/nodes.js +4 -2
  77. package/build/cjs/nodes.js.map +1 -1
  78. package/build/cjs/ops.d.ts +43 -10
  79. package/build/cjs/ops.d.ts.map +1 -1
  80. package/build/cjs/ops.js +1 -1
  81. package/build/cjs/ops.js.map +1 -1
  82. package/build/cjs/overrides.d.ts +5 -2
  83. package/build/cjs/overrides.d.ts.map +1 -1
  84. package/build/cjs/overrides.js.map +1 -1
  85. package/build/cjs/package.json +1 -0
  86. package/build/cjs/reachability.d.ts +4 -4
  87. package/build/cjs/reachability.d.ts.map +1 -1
  88. package/build/cjs/reachability.js +5 -1
  89. package/build/cjs/reachability.js.map +1 -1
  90. package/build/cjs/reality-check.d.ts +4 -4
  91. package/build/cjs/reality-check.d.ts.map +1 -1
  92. package/build/cjs/reality-check.js +52 -9
  93. package/build/cjs/reality-check.js.map +1 -1
  94. package/build/cjs/session-phase.d.ts +80 -0
  95. package/build/cjs/session-phase.d.ts.map +1 -0
  96. package/build/cjs/session-phase.js +97 -0
  97. package/build/cjs/session-phase.js.map +1 -0
  98. package/build/cjs/session.d.ts +21 -0
  99. package/build/cjs/session.d.ts.map +1 -1
  100. package/build/cjs/session.js +19 -0
  101. package/build/cjs/session.js.map +1 -1
  102. package/build/cjs/spec.d.ts +140 -0
  103. package/build/cjs/spec.d.ts.map +1 -0
  104. package/build/cjs/spec.js +514 -0
  105. package/build/cjs/spec.js.map +1 -0
  106. package/build/cjs/topology.d.ts +2 -2
  107. package/build/cjs/topology.d.ts.map +1 -1
  108. package/build/cjs/topology.js +2 -0
  109. package/build/cjs/topology.js.map +1 -1
  110. package/build/cjs/unproduced-events.d.ts +10 -0
  111. package/build/cjs/unproduced-events.d.ts.map +1 -0
  112. package/build/cjs/unproduced-events.js +37 -0
  113. package/build/cjs/unproduced-events.js.map +1 -0
  114. package/build/cjs/validate-design.d.ts +3 -3
  115. package/build/cjs/validate-design.d.ts.map +1 -1
  116. package/build/cjs/validate-design.js +40 -3
  117. package/build/cjs/validate-design.js.map +1 -1
  118. package/build/esm/apply-design.d.ts +5 -5
  119. package/build/esm/apply-design.d.ts.map +1 -1
  120. package/build/esm/apply-design.js +21 -5
  121. package/build/esm/apply-design.js.map +1 -1
  122. package/build/esm/apply-overrides.d.ts +3 -3
  123. package/build/esm/apply-overrides.d.ts.map +1 -1
  124. package/build/esm/apply-overrides.js +5 -1
  125. package/build/esm/apply-overrides.js.map +1 -1
  126. package/build/esm/card-channel.d.ts +18 -0
  127. package/build/esm/card-channel.d.ts.map +1 -0
  128. package/build/esm/card-channel.js +25 -0
  129. package/build/esm/card-channel.js.map +1 -0
  130. package/build/esm/convergence.d.ts +2 -2
  131. package/build/esm/convergence.d.ts.map +1 -1
  132. package/build/esm/coverage-links.d.ts +27 -0
  133. package/build/esm/coverage-links.d.ts.map +1 -0
  134. package/build/esm/coverage-links.js +113 -0
  135. package/build/esm/coverage-links.js.map +1 -0
  136. package/build/esm/design.d.ts +44 -2
  137. package/build/esm/design.d.ts.map +1 -1
  138. package/build/esm/design.js +38 -1
  139. package/build/esm/design.js.map +1 -1
  140. package/build/esm/diagnostics.d.ts +2 -2
  141. package/build/esm/diagnostics.d.ts.map +1 -1
  142. package/build/esm/edge-endpoints.d.ts +33 -0
  143. package/build/esm/edge-endpoints.d.ts.map +1 -0
  144. package/build/esm/edge-endpoints.js +77 -0
  145. package/build/esm/edge-endpoints.js.map +1 -0
  146. package/build/esm/edges.d.ts +2 -2
  147. package/build/esm/edges.d.ts.map +1 -1
  148. package/build/esm/edges.js +2 -1
  149. package/build/esm/edges.js.map +1 -1
  150. package/build/esm/effective-design.d.ts +21 -0
  151. package/build/esm/effective-design.d.ts.map +1 -0
  152. package/build/esm/effective-design.js +169 -0
  153. package/build/esm/effective-design.js.map +1 -0
  154. package/build/esm/entry-points.d.ts +2 -2
  155. package/build/esm/entry-points.d.ts.map +1 -1
  156. package/build/esm/find-orphan-nodes.d.ts +3 -3
  157. package/build/esm/find-orphan-nodes.d.ts.map +1 -1
  158. package/build/esm/flow-traversal.d.ts +3 -3
  159. package/build/esm/flow-traversal.d.ts.map +1 -1
  160. package/build/esm/fork-scenarios.d.ts +44 -0
  161. package/build/esm/fork-scenarios.d.ts.map +1 -0
  162. package/build/esm/fork-scenarios.js +78 -0
  163. package/build/esm/fork-scenarios.js.map +1 -0
  164. package/build/esm/graph.d.ts +27 -2
  165. package/build/esm/graph.d.ts.map +1 -1
  166. package/build/esm/graph.js +33 -0
  167. package/build/esm/graph.js.map +1 -1
  168. package/build/esm/handler-scope.d.ts +3 -3
  169. package/build/esm/handler-scope.d.ts.map +1 -1
  170. package/build/esm/index.d.ts +9 -0
  171. package/build/esm/index.d.ts.map +1 -1
  172. package/build/esm/index.js +9 -0
  173. package/build/esm/index.js.map +1 -1
  174. package/build/esm/invariants.d.ts +26 -0
  175. package/build/esm/invariants.d.ts.map +1 -0
  176. package/build/esm/invariants.js +36 -0
  177. package/build/esm/invariants.js.map +1 -0
  178. package/build/esm/map-links.d.ts +1 -0
  179. package/build/esm/map-links.d.ts.map +1 -1
  180. package/build/esm/map-links.js +14 -1
  181. package/build/esm/map-links.js.map +1 -1
  182. package/build/esm/map-structure.d.ts +172 -3
  183. package/build/esm/map-structure.d.ts.map +1 -1
  184. package/build/esm/map-structure.js +42 -3
  185. package/build/esm/map-structure.js.map +1 -1
  186. package/build/esm/map-vocabulary.d.ts +29 -1
  187. package/build/esm/map-vocabulary.d.ts.map +1 -1
  188. package/build/esm/map-vocabulary.js +64 -1
  189. package/build/esm/map-vocabulary.js.map +1 -1
  190. package/build/esm/nodes.d.ts +11 -1
  191. package/build/esm/nodes.d.ts.map +1 -1
  192. package/build/esm/nodes.js +4 -2
  193. package/build/esm/nodes.js.map +1 -1
  194. package/build/esm/ops.d.ts +43 -10
  195. package/build/esm/ops.d.ts.map +1 -1
  196. package/build/esm/ops.js +1 -1
  197. package/build/esm/ops.js.map +1 -1
  198. package/build/esm/overrides.d.ts +5 -2
  199. package/build/esm/overrides.d.ts.map +1 -1
  200. package/build/esm/overrides.js.map +1 -1
  201. package/build/esm/reachability.d.ts +4 -4
  202. package/build/esm/reachability.d.ts.map +1 -1
  203. package/build/esm/reachability.js +5 -1
  204. package/build/esm/reachability.js.map +1 -1
  205. package/build/esm/reality-check.d.ts +4 -4
  206. package/build/esm/reality-check.d.ts.map +1 -1
  207. package/build/esm/reality-check.js +53 -10
  208. package/build/esm/reality-check.js.map +1 -1
  209. package/build/esm/session-phase.d.ts +80 -0
  210. package/build/esm/session-phase.d.ts.map +1 -0
  211. package/build/esm/session-phase.js +93 -0
  212. package/build/esm/session-phase.js.map +1 -0
  213. package/build/esm/session.d.ts +21 -0
  214. package/build/esm/session.d.ts.map +1 -1
  215. package/build/esm/session.js +17 -0
  216. package/build/esm/session.js.map +1 -1
  217. package/build/esm/spec.d.ts +140 -0
  218. package/build/esm/spec.d.ts.map +1 -0
  219. package/build/esm/spec.js +501 -0
  220. package/build/esm/spec.js.map +1 -0
  221. package/build/esm/topology.d.ts +2 -2
  222. package/build/esm/topology.d.ts.map +1 -1
  223. package/build/esm/topology.js +2 -0
  224. package/build/esm/topology.js.map +1 -1
  225. package/build/esm/unproduced-events.d.ts +10 -0
  226. package/build/esm/unproduced-events.d.ts.map +1 -0
  227. package/build/esm/unproduced-events.js +32 -0
  228. package/build/esm/unproduced-events.js.map +1 -0
  229. package/build/esm/validate-design.d.ts +3 -3
  230. package/build/esm/validate-design.d.ts.map +1 -1
  231. package/build/esm/validate-design.js +41 -4
  232. package/build/esm/validate-design.js.map +1 -1
  233. package/build/tsconfig.tsbuildinfo +1 -1
  234. package/package.json +14 -4
  235. package/schema/map.schema.json +62 -1
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.forkScenarioKey = exports.FORK_SCENARIO_KEY_PREFIX = void 0;
4
+ exports.joinForkScenarios = joinForkScenarios;
5
+ /** Every virtual proposal's key starts with it; no entry id can, since a map id never holds a colon. */
6
+ exports.FORK_SCENARIO_KEY_PREFIX = 'derived:';
7
+ const forkScenarioKey = (forkId, optionId, walk) => `${exports.FORK_SCENARIO_KEY_PREFIX}${forkId}/${optionId}/${walk}`;
8
+ exports.forkScenarioKey = forkScenarioKey;
9
+ const isStructural = (walk) => walk.kind === 'structural';
10
+ const hasGherkin = (walk) => walk.given !== undefined && walk.when !== undefined && walk.then !== undefined;
11
+ const stepsOf = (text) => text === undefined ? [] : [{ text }];
12
+ // The walk's fields a basis records; `kind` absent reads as behavioral, so spelling it out changes nothing.
13
+ const sameWalk = (walk, basis) => walk.text === basis.text
14
+ && isStructural(walk) === isStructural(basis)
15
+ && walk.given === basis.given
16
+ && walk.when === basis.when
17
+ && walk.then === basis.then;
18
+ function reviewReasonOf(derivedFrom, forks) {
19
+ const fork = forks.get(derivedFrom.forkId);
20
+ if (fork === undefined)
21
+ return 'fork-gone';
22
+ if (fork.status.kind === 'open')
23
+ return 'reopened';
24
+ if (fork.status.kind === 'moot')
25
+ return 'moot';
26
+ if (fork.status.option !== derivedFrom.optionId)
27
+ return 'option-changed';
28
+ // A derivation from before ESAS-296 names no walk; it is judged on its fork and option alone.
29
+ if (derivedFrom.walk === undefined)
30
+ return null;
31
+ const option = fork.card?.options.find(candidate => candidate.id === derivedFrom.optionId);
32
+ const walk = option?.walks.find(candidate => candidate.scenario === derivedFrom.walk);
33
+ if (walk === undefined)
34
+ return 'walk-gone';
35
+ if (derivedFrom.basis !== undefined && !sameWalk(walk, derivedFrom.basis))
36
+ return 'walk-changed';
37
+ return null;
38
+ }
39
+ /**
40
+ * Every decided, testable fork proposes one scenario per behavioural walk of its chosen option, in
41
+ * map order, unless a stored scenario already names that (fork, option, walk) in any status; and
42
+ * every stored scenario with derivedFrom is judged against its fork, in map order.
43
+ */
44
+ function joinForkScenarios(map) {
45
+ const stored = new Set(map.scenarios.flatMap(({ derivedFrom }) => derivedFrom?.walk === undefined
46
+ ? []
47
+ : [(0, exports.forkScenarioKey)(derivedFrom.forkId, derivedFrom.optionId, derivedFrom.walk)]));
48
+ const proposals = [];
49
+ for (const fork of map.forks) {
50
+ const status = fork.status;
51
+ if (status.kind !== 'decided' || fork.testable === false)
52
+ continue;
53
+ const chosenWalks = (fork.card?.options ?? [])
54
+ .filter(option => option.id === status.option)
55
+ .flatMap(option => option.walks);
56
+ for (const walk of chosenWalks) {
57
+ const key = (0, exports.forkScenarioKey)(fork.id, status.option, walk.scenario);
58
+ if (isStructural(walk) || stored.has(key))
59
+ continue;
60
+ const ready = hasGherkin(walk);
61
+ proposals.push({
62
+ key,
63
+ forkId: fork.id,
64
+ optionId: status.option,
65
+ walk: walk.scenario,
66
+ source: status.source,
67
+ state: ready ? 'ready' : 'needs-gherkin',
68
+ title: walk.scenario,
69
+ text: walk.text,
70
+ anchors: [fork.anchor ?? fork.id],
71
+ given: ready ? stepsOf(walk.given) : [],
72
+ when: ready ? stepsOf(walk.when) : [],
73
+ then: ready ? stepsOf(walk.then) : []
74
+ });
75
+ }
76
+ }
77
+ const forks = new Map(map.forks.map(fork => [fork.id, fork]));
78
+ const derived = map.scenarios.flatMap(({ id, derivedFrom }) => derivedFrom === undefined
79
+ ? []
80
+ : [{ scenarioId: id, reviewReason: reviewReasonOf(derivedFrom, forks) }]);
81
+ return { proposals, derived };
82
+ }
83
+ //# sourceMappingURL=fork-scenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fork-scenarios.js","sourceRoot":"","sources":["../../src/fork-scenarios.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,40 @@
1
- import { BlueprintEdge } from './edges.js';
2
- import { BlueprintNode, NodeType } from './nodes.js';
1
+ import type { BlueprintEdge } from './edges.js';
2
+ import { type BlueprintNode, type NodeType } from './nodes.js';
3
3
  export type SchemaVersion = 1;
4
+ /**
5
+ * The type words a repository's code names end in, by node type, as the repository declares them
6
+ * (`{ "aggregate": "Aggregate" }`). They are the repository's convention, never Blueprint's: its
7
+ * extractor writes them on the graph, and Blueprint tolerates exactly those. A label carries no type
8
+ * word by guarantee, so a node proposed as `Greeter` is realized by the code named `GreeterAggregate`
9
+ * ({@link codeNodeId}).
10
+ */
11
+ export type TypeWords = Partial<Record<NodeType, string>>;
4
12
  export type BlueprintGraph = {
5
13
  schemaVersion: SchemaVersion;
6
14
  subdomains: string[];
7
15
  nodes: BlueprintNode[];
8
16
  edges: BlueprintEdge[];
17
+ typeWords?: TypeWords;
9
18
  };
10
19
  export declare function emptyGraph(): BlueprintGraph;
11
20
  export declare function slugify(label: string): string;
12
21
  export declare function nodeId(subdomain: string, type: NodeType, label: string): string;
22
+ /** The type words a graph carries, each a string with a letter or digit; anything else in the field is ignored. */
23
+ export declare function typeWordsOf(graph: Pick<BlueprintGraph, 'typeWords'>): TypeWords | undefined;
24
+ /**
25
+ * The name the code of a node labelled `label` carries when its type's word is `word`: the label
26
+ * without the word it may end in, in PascalCase, then the word once. `Greeter` and `Greeter
27
+ * Aggregate` are both `GreeterAggregate`. The label ends in the word when its last letters and
28
+ * digits spell it, case and anything between them aside (`Orders Read Model` ends in `Readmodel`);
29
+ * a label that is nothing but the word keeps it.
30
+ */
31
+ export declare function codeName(label: string, word: string): string;
32
+ /**
33
+ * The id the code of a node proposed as (`subdomain`, `type`, `label`) extracts to when the
34
+ * repository declares a type word for `type`: the id of its {@link codeName}. `undefined` when the
35
+ * repository declares none for the type, so a proposal is realized by its own id alone.
36
+ */
37
+ export declare function codeNodeId(subdomain: string, type: NodeType, label: string, typeWords: TypeWords | undefined): string | undefined;
13
38
  export type ParsedNodeId = {
14
39
  subdomain: string;
15
40
  type: NodeType;
@@ -1 +1 @@
1
- {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAoC,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC;AAE9B,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB,CAAC;AAEF,wBAAgB,UAAU,IAAI,cAAc,CAE3C;AAED,wBAAgB,OAAO,CAAE,KAAK,EAAE,MAAM,GAAI,MAAM,CAO/C;AAED,wBAAgB,MAAM,CAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAI,MAAM,CAEjF;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,WAAW,CAAE,EAAE,EAAE,MAAM,GAAI,YAAY,GAAG,SAAS,CAOlE"}
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,KAAK,aAAa,EAAoC,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjG,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,wBAAgB,UAAU,IAAI,cAAc,CAE3C;AAED,wBAAgB,OAAO,CAAE,KAAK,EAAE,MAAM,GAAI,MAAM,CAO/C;AAED,wBAAgB,MAAM,CAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAI,MAAM,CAEjF;AAED,mHAAmH;AACnH,wBAAgB,WAAW,CAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,GAAI,SAAS,GAAG,SAAS,CAM7F;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAI,MAAM,CAQ9D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,GAAG,SAAS,GAC/B,MAAM,GAAG,SAAS,CAGpB;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,WAAW,CAAE,EAAE,EAAE,MAAM,GAAI,YAAY,GAAG,SAAS,CAOlE"}
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.emptyGraph = emptyGraph;
4
4
  exports.slugify = slugify;
5
5
  exports.nodeId = nodeId;
6
+ exports.typeWordsOf = typeWordsOf;
7
+ exports.codeName = codeName;
8
+ exports.codeNodeId = codeNodeId;
6
9
  exports.parseNodeId = parseNodeId;
7
10
  const nodes_js_1 = require("./nodes.js");
8
11
  function emptyGraph() {
@@ -19,6 +22,39 @@ function slugify(label) {
19
22
  function nodeId(subdomain, type, label) {
20
23
  return `${slugify(subdomain)}_${nodes_js_1.NODE_ABBREV[type]}_${slugify(label)}`;
21
24
  }
25
+ /** The type words a graph carries, each a string with a letter or digit; anything else in the field is ignored. */
26
+ function typeWordsOf(graph) {
27
+ const declared = graph.typeWords;
28
+ if (declared === null || typeof declared !== 'object' || Array.isArray(declared))
29
+ return undefined;
30
+ const words = Object.entries(declared).filter((entry) => Object.prototype.hasOwnProperty.call(nodes_js_1.NODE_ABBREV, entry[0]) && typeof entry[1] === 'string' && /[a-zA-Z0-9]/.test(entry[1]));
31
+ return words.length > 0 ? Object.fromEntries(words) : undefined;
32
+ }
33
+ /**
34
+ * The name the code of a node labelled `label` carries when its type's word is `word`: the label
35
+ * without the word it may end in, in PascalCase, then the word once. `Greeter` and `Greeter
36
+ * Aggregate` are both `GreeterAggregate`. The label ends in the word when its last letters and
37
+ * digits spell it, case and anything between them aside (`Orders Read Model` ends in `Readmodel`);
38
+ * a label that is nothing but the word keeps it.
39
+ */
40
+ function codeName(label, word) {
41
+ const letters = [...word.replace(/[^a-zA-Z0-9]/g, '')];
42
+ const tail = new RegExp(`[^a-zA-Z0-9]*${letters.join('[^a-zA-Z0-9]*')}$`, 'i');
43
+ const stripped = label.replace(tail, '');
44
+ const bare = slugify(stripped) === '' ? label : stripped;
45
+ const pascal = slugify(bare).split('-').filter(Boolean)
46
+ .map(segment => segment.charAt(0).toUpperCase() + segment.slice(1)).join('');
47
+ return `${pascal}${word}`;
48
+ }
49
+ /**
50
+ * The id the code of a node proposed as (`subdomain`, `type`, `label`) extracts to when the
51
+ * repository declares a type word for `type`: the id of its {@link codeName}. `undefined` when the
52
+ * repository declares none for the type, so a proposal is realized by its own id alone.
53
+ */
54
+ function codeNodeId(subdomain, type, label, typeWords) {
55
+ const word = typeWords?.[type];
56
+ return word === undefined ? undefined : nodeId(subdomain, type, codeName(label, word));
57
+ }
22
58
  function parseNodeId(id) {
23
59
  const segments = id.split('_');
24
60
  if (segments.length !== 3)
@@ -1 +1 @@
1
- {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/graph.ts"],"names":[],"mappings":";;AAYA,gCAEC;AAED,0BAOC;AAED,wBAEC;AAQD,kCAOC;AAzCD,yCAAuF;AAWvF,SAAgB,UAAU;IACxB,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACpE,CAAC;AAED,SAAgB,OAAO,CAAE,KAAa;IACpC,OAAO,KAAK;SACT,OAAO,CAAE,oBAAoB,EAAE,OAAO,CAAE;SACxC,OAAO,CAAE,uBAAuB,EAAE,OAAO,CAAE;SAC3C,OAAO,CAAE,gBAAgB,EAAE,GAAG,CAAE;SAChC,OAAO,CAAE,UAAU,EAAE,EAAE,CAAE;SACzB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAgB,MAAM,CAAE,SAAiB,EAAE,IAAc,EAAE,KAAa;IACtE,OAAO,GAAI,OAAO,CAAE,SAAS,CAAG,IAAK,sBAAW,CAAE,IAAI,CAAG,IAAK,OAAO,CAAE,KAAK,CAAG,EAAE,CAAC;AACpF,CAAC;AAQD,SAAgB,WAAW,CAAE,EAAU;IACrC,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAE,GAAG,CAAE,CAAC;IACjC,IAAK,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAG,OAAO,SAAS,CAAC;IAC9C,MAAM,CAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAE,GAAG,QAAQ,CAAC;IAC7C,MAAM,IAAI,GAAG,8BAAmB,CAAE,MAAM,CAAE,CAAC;IAC3C,IAAK,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAG,OAAO,SAAS,CAAC;IAC1F,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/graph.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { HandlerScopeIssue } from './diagnostics.js';
2
- import { EdgeKind } from './edges.js';
3
- import { BlueprintNode, NodeType } from './nodes.js';
1
+ import type { HandlerScopeIssue } from './diagnostics.js';
2
+ import type { EdgeKind } from './edges.js';
3
+ import type { BlueprintNode, NodeType } from './nodes.js';
4
4
  export type HandlerAttachment = {
5
5
  discriminator: NodeType;
6
6
  via: EdgeKind;
@@ -1 +1 @@
1
- {"version":3,"file":"handler-scope.d.ts","sourceRoot":"","sources":["../../src/handler-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,aAAa,EAAE,QAAQ,CAAC;IACxB,GAAG,EAAE,QAAQ,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAKtF,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC/B,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAClC,CAAC;AAKF,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC9B,KAAK,EAAE,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,GAC5D,iBAAiB,CAenB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACvC,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CA4BpB"}
1
+ {"version":3,"file":"handler-scope.d.ts","sourceRoot":"","sources":["../../src/handler-scope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,aAAa,EAAE,QAAQ,CAAC;IACxB,GAAG,EAAE,QAAQ,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAKtF,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC/B,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAClC,CAAC;AAKF,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC9B,KAAK,EAAE,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,GAC5D,iBAAiB,CAenB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACvC,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CA4BpB"}
@@ -9,19 +9,28 @@ export * from './entry-points.js';
9
9
  export * from './diagnostics.js';
10
10
  export * from './overrides.js';
11
11
  export * from './find-orphan-nodes.js';
12
+ export * from './unproduced-events.js';
12
13
  export * from './apply-overrides.js';
13
14
  export * from './design.js';
14
15
  export * from './ops.js';
15
16
  export * from './op-chain.js';
16
17
  export * from './validate-design.js';
17
18
  export * from './apply-design.js';
19
+ export * from './effective-design.js';
20
+ export * from './edge-endpoints.js';
18
21
  export * from './reality-check.js';
19
22
  export * from './convergence.js';
20
23
  export * from './replication.js';
21
24
  export * from './session.js';
25
+ export * from './session-phase.js';
22
26
  export * from './organisation.js';
23
27
  export * from './retention.js';
24
28
  export * from './map-vocabulary.js';
25
29
  export * from './map-structure.js';
26
30
  export * from './map-links.js';
31
+ export * from './coverage-links.js';
32
+ export * from './card-channel.js';
33
+ export * from './fork-scenarios.js';
34
+ export * from './invariants.js';
35
+ export * from './spec.js';
27
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
@@ -25,19 +25,28 @@ __exportStar(require("./entry-points.js"), exports);
25
25
  __exportStar(require("./diagnostics.js"), exports);
26
26
  __exportStar(require("./overrides.js"), exports);
27
27
  __exportStar(require("./find-orphan-nodes.js"), exports);
28
+ __exportStar(require("./unproduced-events.js"), exports);
28
29
  __exportStar(require("./apply-overrides.js"), exports);
29
30
  __exportStar(require("./design.js"), exports);
30
31
  __exportStar(require("./ops.js"), exports);
31
32
  __exportStar(require("./op-chain.js"), exports);
32
33
  __exportStar(require("./validate-design.js"), exports);
33
34
  __exportStar(require("./apply-design.js"), exports);
35
+ __exportStar(require("./effective-design.js"), exports);
36
+ __exportStar(require("./edge-endpoints.js"), exports);
34
37
  __exportStar(require("./reality-check.js"), exports);
35
38
  __exportStar(require("./convergence.js"), exports);
36
39
  __exportStar(require("./replication.js"), exports);
37
40
  __exportStar(require("./session.js"), exports);
41
+ __exportStar(require("./session-phase.js"), exports);
38
42
  __exportStar(require("./organisation.js"), exports);
39
43
  __exportStar(require("./retention.js"), exports);
40
44
  __exportStar(require("./map-vocabulary.js"), exports);
41
45
  __exportStar(require("./map-structure.js"), exports);
42
46
  __exportStar(require("./map-links.js"), exports);
47
+ __exportStar(require("./coverage-links.js"), exports);
48
+ __exportStar(require("./card-channel.js"), exports);
49
+ __exportStar(require("./fork-scenarios.js"), exports);
50
+ __exportStar(require("./invariants.js"), exports);
51
+ __exportStar(require("./spec.js"), exports);
43
52
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,6CAA2B;AAC3B,6CAA2B;AAC3B,gDAA8B;AAC9B,qDAAmC;AACnC,sDAAoC;AACpC,oDAAkC;AAClC,oDAAkC;AAClC,mDAAiC;AACjC,iDAA+B;AAC/B,yDAAuC;AACvC,uDAAqC;AACrC,8CAA4B;AAC5B,2CAAyB;AACzB,gDAA8B;AAC9B,uDAAqC;AACrC,oDAAkC;AAClC,qDAAmC;AACnC,mDAAiC;AACjC,mDAAiC;AACjC,+CAA6B;AAC7B,oDAAkC;AAClC,iDAA+B;AAC/B,sDAAoC;AACpC,qDAAmC;AACnC,iDAA+B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,6CAA2B;AAC3B,6CAA2B;AAC3B,gDAA8B;AAC9B,qDAAmC;AACnC,sDAAoC;AACpC,oDAAkC;AAClC,oDAAkC;AAClC,mDAAiC;AACjC,iDAA+B;AAC/B,yDAAuC;AACvC,yDAAuC;AACvC,uDAAqC;AACrC,8CAA4B;AAC5B,2CAAyB;AACzB,gDAA8B;AAC9B,uDAAqC;AACrC,oDAAkC;AAClC,wDAAsC;AACtC,sDAAoC;AACpC,qDAAmC;AACnC,mDAAiC;AACjC,mDAAiC;AACjC,+CAA6B;AAC7B,qDAAmC;AACnC,oDAAkC;AAClC,iDAA+B;AAC/B,sDAAoC;AACpC,qDAAmC;AACnC,iDAA+B;AAC/B,sDAAoC;AACpC,oDAAkC;AAClC,sDAAoC;AACpC,kDAAgC;AAChC,4CAA0B"}
@@ -0,0 +1,26 @@
1
+ import type { CoverageReport } from './coverage-links.js';
2
+ import type { BlueprintEdge } from './edges.js';
3
+ import type { MapEntryId } from './map-structure.js';
4
+ import type { BlueprintNode } from './nodes.js';
5
+ /**
6
+ * ESAS-305: what the board says about one invariant, judged on read. `unproven` when no scenario
7
+ * covers it; `indistinct` when it is covered but its rejection cannot be told apart from another
8
+ * rule's on a command it guards: it has no error code, or one other invariant guarding one of the
9
+ * same commands carries every one of its codes.
10
+ */
11
+ export type InvariantJudgement = {
12
+ coveredBy: MapEntryId[];
13
+ unproven: boolean;
14
+ indistinct: boolean;
15
+ };
16
+ export type InvariantGraph = {
17
+ nodes: ReadonlyArray<Pick<BlueprintNode, 'id' | 'type' | 'status' | 'errorCodes'>>;
18
+ edges: ReadonlyArray<Pick<BlueprintEdge, 'from' | 'to' | 'kind' | 'status'>>;
19
+ };
20
+ /**
21
+ * Judges every invariant of the merged graph against the coverage join (joinCoverageLinks). Pure:
22
+ * it reads its inputs and returns a fresh record keyed by invariant id; it never refuses a write
23
+ * (ADR-106). A removed invariant or a removed guarded-by edge takes no part.
24
+ */
25
+ export declare function judgeInvariants(merged: InvariantGraph, coverage: Pick<CoverageReport, 'coveredBy'>): Record<string, InvariantJudgement>;
26
+ //# sourceMappingURL=invariants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../../src/invariants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC;IACnF,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;CAC9E,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,GAC1C,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CA6BpC"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.judgeInvariants = judgeInvariants;
4
+ /**
5
+ * Judges every invariant of the merged graph against the coverage join (joinCoverageLinks). Pure:
6
+ * it reads its inputs and returns a fresh record keyed by invariant id; it never refuses a write
7
+ * (ADR-106). A removed invariant or a removed guarded-by edge takes no part.
8
+ */
9
+ function judgeInvariants(merged, coverage) {
10
+ const invariants = merged.nodes.filter(node => node.type === 'invariant' && node.status !== 'removed');
11
+ const codesOf = new Map(invariants.map(node => [node.id, new Set(node.errorCodes ?? [])]));
12
+ const guardedBy = new Map();
13
+ for (const edge of merged.edges) {
14
+ if (edge.kind !== 'guarded-by' || edge.status === 'removed' || !codesOf.has(edge.to))
15
+ continue;
16
+ guardedBy.set(edge.from, (guardedBy.get(edge.from) ?? new Set()).add(edge.to));
17
+ }
18
+ const neighboursOf = (id) => {
19
+ const neighbours = new Set();
20
+ for (const guards of guardedBy.values()) {
21
+ if (!guards.has(id))
22
+ continue;
23
+ for (const other of guards)
24
+ if (other !== id)
25
+ neighbours.add(other);
26
+ }
27
+ return neighbours;
28
+ };
29
+ const judged = {};
30
+ for (const { id } of invariants) {
31
+ const coveredBy = [...(coverage.coveredBy[id] ?? [])];
32
+ const unproven = coveredBy.length === 0;
33
+ const codes = [...codesOf.get(id)];
34
+ const indistinct = !unproven && (codes.length === 0 || [...neighboursOf(id)].some(other => codes.every(code => codesOf.get(other).has(code))));
35
+ judged[id] = { coveredBy, unproven, indistinct };
36
+ }
37
+ return judged;
38
+ }
39
+ //# sourceMappingURL=invariants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariants.js","sourceRoot":"","sources":["../../src/invariants.ts"],"names":[],"mappings":";;AA2BA,0CAgCC;AArCD;;;;GAIG;AACH,SAAgB,eAAe,CAC7B,MAAsB,EACtB,QAA2C;IAE3C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAE,CAAC;IACzG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAE,UAAU,CAAC,GAAG,CAAE,IAAI,CAAC,EAAE,CAAC,CAAE,IAAI,CAAC,EAAE,EAAE,IAAI,GAAG,CAAE,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAE,CAAE,CAAC,CAAC;IAEjG,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IACjD,KAAM,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjC,IAAK,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAE,IAAI,CAAC,EAAE,CAAE;YAAE,SAAS;QAClG,SAAS,CAAC,GAAG,CAAE,IAAI,CAAC,IAAI,EAAE,CAAE,SAAS,CAAC,GAAG,CAAE,IAAI,CAAC,IAAI,CAAE,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAE,IAAI,CAAC,EAAE,CAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,YAAY,GAAG,CAAE,EAAU,EAAgB,EAAE;QACjD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,KAAM,MAAM,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAK,CAAC,MAAM,CAAC,GAAG,CAAE,EAAE,CAAE;gBAAE,SAAS;YACjC,KAAM,MAAM,KAAK,IAAI,MAAM;gBAAG,IAAK,KAAK,KAAK,EAAE;oBAAG,UAAU,CAAC,GAAG,CAAE,KAAK,CAAE,CAAC;QAC5E,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAuC,EAAE,CAAC;IACtD,KAAM,MAAM,EAAE,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,CAAE,GAAG,CAAE,QAAQ,CAAC,SAAS,CAAE,EAAE,CAAE,IAAI,EAAE,CAAC,CAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,CAAE,GAAG,OAAO,CAAC,GAAG,CAAE,EAAE,CAAiB,CAAE,CAAC;QACtD,MAAM,UAAU,GAAG,CAAC,QAAQ,IAAI,CAAE,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAE,GAAG,YAAY,CAAE,EAAE,CAAE,CAAE,CAAC,IAAI,CAAE,KAAK,CAAC,EAAE,CAC9F,KAAK,CAAC,KAAK,CAAE,IAAI,CAAC,EAAE,CAAG,OAAO,CAAC,GAAG,CAAE,KAAK,CAAmB,CAAC,GAAG,CAAE,IAAI,CAAE,CAAC,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAE,EAAE,CAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -7,6 +7,7 @@ export type MapLinkReport = {
7
7
  orphanedBy: Record<MapEntryId, string[]>;
8
8
  dangling: MapLink[];
9
9
  removed: MapLink[];
10
+ unserved: MapEntryId[];
10
11
  };
11
12
  export declare function joinMapLinks(merged: BlueprintGraph, design: DesignFile, map: MapFile): MapLinkReport;
12
13
  //# sourceMappingURL=map-links.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-links.d.ts","sourceRoot":"","sources":["../../src/map-links.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,EAAE,CAAC;CACpB,CAAC;AAgBF,wBAAgB,YAAY,CAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAI,aAAa,CA2CtG"}
1
+ {"version":3,"file":"map-links.d.ts","sourceRoot":"","sources":["../../src/map-links.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB,CAAC;AAgBF,wBAAgB,YAAY,CAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,GAAI,aAAa,CAwDtG"}
@@ -54,6 +54,19 @@ function joinMapLinks(merged, design, map) {
54
54
  .filter(link => mapNodes.has(link.deliverableId) && removedIds.has(link.esId))
55
55
  .map(link => ({ esId: link.esId, deliverableId: link.deliverableId }))
56
56
  .sort((a, b) => byString(a.esId, b.esId) || byString(a.deliverableId, b.deliverableId));
57
- return { unlinked, orphaned, orphanedBy, dangling, removed };
57
+ // ESAS-330 D3: a link serves its deliverable when it names a live graph node. A1: under a graph
58
+ // that knows no node (the Design done check joins against emptyGraph()) liveness cannot be judged,
59
+ // so any link serves; struck deliverables are excluded.
60
+ const graphKnown = merged.nodes.length > 0;
61
+ const served = new Set(map.links
62
+ .filter(link => !graphKnown || (nodeIds.has(link.esId) && !removedIds.has(link.esId)))
63
+ .map(link => link.deliverableId));
64
+ const unserved = [];
65
+ for (const node of [...map.nodes].sort((a, b) => byString(a.id, b.id))) {
66
+ if (node.level !== 'deliverable' || node.struck !== undefined || served.has(node.id))
67
+ continue;
68
+ unserved.push(node.id);
69
+ }
70
+ return { unlinked, orphaned, orphanedBy, dangling, removed, unserved };
58
71
  }
59
72
  //# sourceMappingURL=map-links.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-links.js","sourceRoot":"","sources":["../../src/map-links.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"map-links.js","sourceRoot":"","sources":["../../src/map-links.ts"],"names":[],"mappings":";;AA4BA,oCAwDC;AApFD,uDAAmD;AAcnD,SAAS,QAAQ,CAAE,CAAS,EAAE,CAAS;IACrC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,UAAU,CAAE,MAAsB,EAAE,MAAkB;IAC7D,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAM,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QAAG,GAAG,CAAC,GAAG,CAAE,IAAA,gCAAc,EAAE,IAAI,CAAE,CAAC,CAAC;IACnF,KAAM,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE;QAAG,GAAG,CAAC,GAAG,CAAE,KAAK,CAAC,EAAE,CAAE,CAAC;IAC/D,KAAM,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjC,IAAK,IAAI,CAAC,MAAM,KAAK,SAAS;YAAG,GAAG,CAAC,MAAM,CAAE,IAAI,CAAC,EAAE,CAAE,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,YAAY,CAAE,MAAsB,EAAE,MAAkB,EAAE,GAAY;IACpF,MAAM,QAAQ,GAAG,UAAU,CAAE,MAAM,EAAE,MAAM,CAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAE,CAAC,GAAG,CAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC,CAAC;IAC7G,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAE,IAAI,CAAC,EAAE,CAAC,CAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAE,CAAE,CAAC,CAAC;IAEtE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAC;IACvD,KAAM,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC9B,cAAc,CAAC,GAAG,CAAE,IAAI,CAAC,IAAI,EAAE,CAAE,GAAG,CAAE,cAAc,CAAC,GAAG,CAAE,IAAI,CAAC,IAAI,CAAE,IAAI,EAAE,CAAE,EAAE,IAAI,CAAC,aAAa,CAAE,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,MAAM,GAAG,CAAE,aAAyB,EAAY,EAAE;QACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAE,aAAa,CAAE,CAAC;QAC3C,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;IACzD,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAiC,EAAE,CAAC;IACpD,KAAM,MAAM,EAAE,IAAI,CAAE,GAAG,QAAQ,CAAE,CAAC,IAAI,CAAE,QAAQ,CAAE,EAAC,CAAC;QAClD,MAAM,YAAY,GAAG,cAAc,CAAC,GAAG,CAAE,EAAE,CAAE,CAAC;QAC9C,IAAK,YAAY,KAAK,SAAS,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAE,EAAE,CAAE,CAAC;YACpB,SAAS;QACX,CAAC;QACD,IAAK,CAAC,YAAY,CAAC,KAAK,CAAE,MAAM,CAAE;YAAE,SAAS;QAC7C,QAAQ,CAAC,IAAI,CAAE,EAAE,CAAE,CAAC;QACpB,KAAM,MAAM,aAAa,IAAI,YAAY,EAAE,CAAC;YAC1C,CAAE,UAAU,CAAE,aAAa,CAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAE,EAAE,CAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK;SACvB,MAAM,CAAE,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAE,IAAI,CAAC,IAAI,CAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAE,IAAI,CAAC,aAAa,CAAE,CAAC;SACjF,GAAG,CAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;SACtE,IAAI,CAAC,CAAE,CAAC,EAAE,CAAC,EAAG,EAAE,CAAC,QAAQ,CAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAE,IAAI,QAAQ,CAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAE,CAAC,CAAC;IAEhG,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK;SACtB,MAAM,CAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAE,IAAI,CAAC,aAAa,CAAE,IAAI,UAAU,CAAC,GAAG,CAAE,IAAI,CAAC,IAAI,CAAE,CAAC;SAClF,GAAG,CAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;SACtE,IAAI,CAAC,CAAE,CAAC,EAAE,CAAC,EAAG,EAAE,CAAC,QAAQ,CAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAE,IAAI,QAAQ,CAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAE,CAAC,CAAC;IAEhG,gGAAgG;IAChG,mGAAmG;IACnG,wDAAwD;IACxD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAE,GAAG,CAAC,KAAK;SAC9B,MAAM,CAAE,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,IAAI,CAAE,OAAO,CAAC,GAAG,CAAE,IAAI,CAAC,IAAI,CAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAE,IAAI,CAAC,IAAI,CAAE,CAAC,CAAC;SAC3F,GAAG,CAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAE,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,KAAM,MAAM,IAAI,IAAI,CAAE,GAAG,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,CAAE,CAAC,EAAE,CAAC,EAAG,EAAE,CAAC,QAAQ,CAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAE,CAAC,EAAC,CAAC;QAC7E,IAAK,IAAI,CAAC,KAAK,KAAK,aAAa,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAE,IAAI,CAAC,EAAE,CAAE;YAAE,SAAS;QAClG,QAAQ,CAAC,IAAI,CAAE,IAAI,CAAC,EAAE,CAAE,CAAC;IAC3B,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACzE,CAAC"}