@gate-forge/core 0.1.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 (242) hide show
  1. package/LICENSE +202 -0
  2. package/dist/baselines/adoption.d.ts +76 -0
  3. package/dist/baselines/adoption.d.ts.map +1 -0
  4. package/dist/baselines/adoption.js +163 -0
  5. package/dist/baselines/adoption.js.map +1 -0
  6. package/dist/baselines/index.d.ts +102 -0
  7. package/dist/baselines/index.d.ts.map +1 -0
  8. package/dist/baselines/index.js +186 -0
  9. package/dist/baselines/index.js.map +1 -0
  10. package/dist/canonical-json.d.ts +51 -0
  11. package/dist/canonical-json.d.ts.map +1 -0
  12. package/dist/canonical-json.js +112 -0
  13. package/dist/canonical-json.js.map +1 -0
  14. package/dist/classifier/bind.d.ts +64 -0
  15. package/dist/classifier/bind.d.ts.map +1 -0
  16. package/dist/classifier/bind.js +188 -0
  17. package/dist/classifier/bind.js.map +1 -0
  18. package/dist/classifier/classify.d.ts +154 -0
  19. package/dist/classifier/classify.d.ts.map +1 -0
  20. package/dist/classifier/classify.js +1207 -0
  21. package/dist/classifier/classify.js.map +1 -0
  22. package/dist/classifier/glob.d.ts +48 -0
  23. package/dist/classifier/glob.d.ts.map +1 -0
  24. package/dist/classifier/glob.js +104 -0
  25. package/dist/classifier/glob.js.map +1 -0
  26. package/dist/classifier/index.d.ts +10 -0
  27. package/dist/classifier/index.d.ts.map +1 -0
  28. package/dist/classifier/index.js +21 -0
  29. package/dist/classifier/index.js.map +1 -0
  30. package/dist/classifier/schema.d.ts +150 -0
  31. package/dist/classifier/schema.d.ts.map +1 -0
  32. package/dist/classifier/schema.js +139 -0
  33. package/dist/classifier/schema.js.map +1 -0
  34. package/dist/config/index.d.ts +259 -0
  35. package/dist/config/index.d.ts.map +1 -0
  36. package/dist/config/index.js +523 -0
  37. package/dist/config/index.js.map +1 -0
  38. package/dist/fingerprints.d.ts +56 -0
  39. package/dist/fingerprints.d.ts.map +1 -0
  40. package/dist/fingerprints.js +59 -0
  41. package/dist/fingerprints.js.map +1 -0
  42. package/dist/graph/build.d.ts +16 -0
  43. package/dist/graph/build.d.ts.map +1 -0
  44. package/dist/graph/build.js +423 -0
  45. package/dist/graph/build.js.map +1 -0
  46. package/dist/graph/index.d.ts +12 -0
  47. package/dist/graph/index.d.ts.map +1 -0
  48. package/dist/graph/index.js +10 -0
  49. package/dist/graph/index.js.map +1 -0
  50. package/dist/graph/schema.d.ts +448 -0
  51. package/dist/graph/schema.d.ts.map +1 -0
  52. package/dist/graph/schema.js +237 -0
  53. package/dist/graph/schema.js.map +1 -0
  54. package/dist/graph/symbols.d.ts +129 -0
  55. package/dist/graph/symbols.d.ts.map +1 -0
  56. package/dist/graph/symbols.js +177 -0
  57. package/dist/graph/symbols.js.map +1 -0
  58. package/dist/graph/util.d.ts +40 -0
  59. package/dist/graph/util.d.ts.map +1 -0
  60. package/dist/graph/util.js +41 -0
  61. package/dist/graph/util.js.map +1 -0
  62. package/dist/index.d.ts +683 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +563 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/mapping/resolve.d.ts +177 -0
  67. package/dist/mapping/resolve.d.ts.map +1 -0
  68. package/dist/mapping/resolve.js +523 -0
  69. package/dist/mapping/resolve.js.map +1 -0
  70. package/dist/policy/coverage.d.ts +79 -0
  71. package/dist/policy/coverage.d.ts.map +1 -0
  72. package/dist/policy/coverage.js +119 -0
  73. package/dist/policy/coverage.js.map +1 -0
  74. package/dist/policy/evaluate.d.ts +275 -0
  75. package/dist/policy/evaluate.d.ts.map +1 -0
  76. package/dist/policy/evaluate.js +382 -0
  77. package/dist/policy/evaluate.js.map +1 -0
  78. package/dist/policy/index.d.ts +15 -0
  79. package/dist/policy/index.d.ts.map +1 -0
  80. package/dist/policy/index.js +14 -0
  81. package/dist/policy/index.js.map +1 -0
  82. package/dist/policy/trusted.d.ts +59 -0
  83. package/dist/policy/trusted.d.ts.map +1 -0
  84. package/dist/policy/trusted.js +96 -0
  85. package/dist/policy/trusted.js.map +1 -0
  86. package/dist/provenance.d.ts +170 -0
  87. package/dist/provenance.d.ts.map +1 -0
  88. package/dist/provenance.js +306 -0
  89. package/dist/provenance.js.map +1 -0
  90. package/dist/receipt/index.d.ts +74 -0
  91. package/dist/receipt/index.d.ts.map +1 -0
  92. package/dist/receipt/index.js +154 -0
  93. package/dist/receipt/index.js.map +1 -0
  94. package/dist/report/index.d.ts +100 -0
  95. package/dist/report/index.d.ts.map +1 -0
  96. package/dist/report/index.js +355 -0
  97. package/dist/report/index.js.map +1 -0
  98. package/dist/schemas/adoption.d.ts +40 -0
  99. package/dist/schemas/adoption.d.ts.map +1 -0
  100. package/dist/schemas/adoption.js +87 -0
  101. package/dist/schemas/adoption.js.map +1 -0
  102. package/dist/schemas/baseline.d.ts +19 -0
  103. package/dist/schemas/baseline.d.ts.map +1 -0
  104. package/dist/schemas/baseline.js +45 -0
  105. package/dist/schemas/baseline.js.map +1 -0
  106. package/dist/schemas/claim.d.ts +32 -0
  107. package/dist/schemas/claim.d.ts.map +1 -0
  108. package/dist/schemas/claim.js +34 -0
  109. package/dist/schemas/claim.js.map +1 -0
  110. package/dist/schemas/classification-policy.d.ts +84 -0
  111. package/dist/schemas/classification-policy.d.ts.map +1 -0
  112. package/dist/schemas/classification-policy.js +130 -0
  113. package/dist/schemas/classification-policy.js.map +1 -0
  114. package/dist/schemas/classification-signal.d.ts +125 -0
  115. package/dist/schemas/classification-signal.d.ts.map +1 -0
  116. package/dist/schemas/classification-signal.js +126 -0
  117. package/dist/schemas/classification-signal.js.map +1 -0
  118. package/dist/schemas/classification.d.ts +120 -0
  119. package/dist/schemas/classification.d.ts.map +1 -0
  120. package/dist/schemas/classification.js +154 -0
  121. package/dist/schemas/classification.js.map +1 -0
  122. package/dist/schemas/common.d.ts +73 -0
  123. package/dist/schemas/common.d.ts.map +1 -0
  124. package/dist/schemas/common.js +60 -0
  125. package/dist/schemas/common.js.map +1 -0
  126. package/dist/schemas/coverage-policy.d.ts +89 -0
  127. package/dist/schemas/coverage-policy.d.ts.map +1 -0
  128. package/dist/schemas/coverage-policy.js +81 -0
  129. package/dist/schemas/coverage-policy.js.map +1 -0
  130. package/dist/schemas/evidence.d.ts +65 -0
  131. package/dist/schemas/evidence.d.ts.map +1 -0
  132. package/dist/schemas/evidence.js +64 -0
  133. package/dist/schemas/evidence.js.map +1 -0
  134. package/dist/schemas/execution-result.d.ts +214 -0
  135. package/dist/schemas/execution-result.d.ts.map +1 -0
  136. package/dist/schemas/execution-result.js +240 -0
  137. package/dist/schemas/execution-result.js.map +1 -0
  138. package/dist/schemas/gate-receipt.d.ts +86 -0
  139. package/dist/schemas/gate-receipt.d.ts.map +1 -0
  140. package/dist/schemas/gate-receipt.js +193 -0
  141. package/dist/schemas/gate-receipt.js.map +1 -0
  142. package/dist/schemas/index.d.ts +22 -0
  143. package/dist/schemas/index.d.ts.map +1 -0
  144. package/dist/schemas/index.js +22 -0
  145. package/dist/schemas/index.js.map +1 -0
  146. package/dist/schemas/obligation.d.ts +37 -0
  147. package/dist/schemas/obligation.d.ts.map +1 -0
  148. package/dist/schemas/obligation.js +46 -0
  149. package/dist/schemas/obligation.js.map +1 -0
  150. package/dist/schemas/plugin.d.ts +19 -0
  151. package/dist/schemas/plugin.d.ts.map +1 -0
  152. package/dist/schemas/plugin.js +20 -0
  153. package/dist/schemas/plugin.js.map +1 -0
  154. package/dist/schemas/policy.d.ts +73 -0
  155. package/dist/schemas/policy.d.ts.map +1 -0
  156. package/dist/schemas/policy.js +46 -0
  157. package/dist/schemas/policy.js.map +1 -0
  158. package/dist/schemas/resource.d.ts +26 -0
  159. package/dist/schemas/resource.d.ts.map +1 -0
  160. package/dist/schemas/resource.js +29 -0
  161. package/dist/schemas/resource.js.map +1 -0
  162. package/dist/schemas/run-manifest.d.ts +72 -0
  163. package/dist/schemas/run-manifest.d.ts.map +1 -0
  164. package/dist/schemas/run-manifest.js +125 -0
  165. package/dist/schemas/run-manifest.js.map +1 -0
  166. package/dist/schemas/runner-adapter.d.ts +169 -0
  167. package/dist/schemas/runner-adapter.d.ts.map +1 -0
  168. package/dist/schemas/runner-adapter.js +2 -0
  169. package/dist/schemas/runner-adapter.js.map +1 -0
  170. package/dist/schemas/test-catalog.d.ts +472 -0
  171. package/dist/schemas/test-catalog.d.ts.map +1 -0
  172. package/dist/schemas/test-catalog.js +311 -0
  173. package/dist/schemas/test-catalog.js.map +1 -0
  174. package/dist/schemas/test-map.d.ts +99 -0
  175. package/dist/schemas/test-map.d.ts.map +1 -0
  176. package/dist/schemas/test-map.js +103 -0
  177. package/dist/schemas/test-map.js.map +1 -0
  178. package/dist/schemas/verdict.d.ts +73 -0
  179. package/dist/schemas/verdict.d.ts.map +1 -0
  180. package/dist/schemas/verdict.js +92 -0
  181. package/dist/schemas/verdict.js.map +1 -0
  182. package/dist/schemas/waiver.d.ts +36 -0
  183. package/dist/schemas/waiver.d.ts.map +1 -0
  184. package/dist/schemas/waiver.js +42 -0
  185. package/dist/schemas/waiver.js.map +1 -0
  186. package/dist/supervision/index.d.ts +170 -0
  187. package/dist/supervision/index.d.ts.map +1 -0
  188. package/dist/supervision/index.js +354 -0
  189. package/dist/supervision/index.js.map +1 -0
  190. package/dist/testing/clock.d.ts +50 -0
  191. package/dist/testing/clock.d.ts.map +1 -0
  192. package/dist/testing/clock.js +75 -0
  193. package/dist/testing/clock.js.map +1 -0
  194. package/dist/testing/env.d.ts +66 -0
  195. package/dist/testing/env.d.ts.map +1 -0
  196. package/dist/testing/env.js +106 -0
  197. package/dist/testing/env.js.map +1 -0
  198. package/dist/testing/gate-runner.d.ts +141 -0
  199. package/dist/testing/gate-runner.d.ts.map +1 -0
  200. package/dist/testing/gate-runner.js +173 -0
  201. package/dist/testing/gate-runner.js.map +1 -0
  202. package/dist/testing/gf19.d.ts +106 -0
  203. package/dist/testing/gf19.d.ts.map +1 -0
  204. package/dist/testing/gf19.js +282 -0
  205. package/dist/testing/gf19.js.map +1 -0
  206. package/dist/testing/index.d.ts +20 -0
  207. package/dist/testing/index.d.ts.map +1 -0
  208. package/dist/testing/index.js +14 -0
  209. package/dist/testing/index.js.map +1 -0
  210. package/dist/testing/red-probe.d.ts +138 -0
  211. package/dist/testing/red-probe.d.ts.map +1 -0
  212. package/dist/testing/red-probe.js +251 -0
  213. package/dist/testing/red-probe.js.map +1 -0
  214. package/dist/testing/temp-repo.d.ts +126 -0
  215. package/dist/testing/temp-repo.d.ts.map +1 -0
  216. package/dist/testing/temp-repo.js +214 -0
  217. package/dist/testing/temp-repo.js.map +1 -0
  218. package/dist/verdict/cause.d.ts +99 -0
  219. package/dist/verdict/cause.d.ts.map +1 -0
  220. package/dist/verdict/cause.js +206 -0
  221. package/dist/verdict/cause.js.map +1 -0
  222. package/dist/verdict/evaluate.d.ts +135 -0
  223. package/dist/verdict/evaluate.d.ts.map +1 -0
  224. package/dist/verdict/evaluate.js +1513 -0
  225. package/dist/verdict/evaluate.js.map +1 -0
  226. package/dist/verdict/index.d.ts +21 -0
  227. package/dist/verdict/index.d.ts.map +1 -0
  228. package/dist/verdict/index.js +20 -0
  229. package/dist/verdict/index.js.map +1 -0
  230. package/dist/verdict/pack-verifiers.d.ts +97 -0
  231. package/dist/verdict/pack-verifiers.d.ts.map +1 -0
  232. package/dist/verdict/pack-verifiers.js +763 -0
  233. package/dist/verdict/pack-verifiers.js.map +1 -0
  234. package/dist/verdict/registry.d.ts +180 -0
  235. package/dist/verdict/registry.d.ts.map +1 -0
  236. package/dist/verdict/registry.js +67 -0
  237. package/dist/verdict/registry.js.map +1 -0
  238. package/dist/waivers/index.d.ts +103 -0
  239. package/dist/waivers/index.d.ts.map +1 -0
  240. package/dist/waivers/index.js +192 -0
  241. package/dist/waivers/index.js.map +1 -0
  242. package/package.json +40 -0
@@ -0,0 +1,16 @@
1
+ import { type ResourceGraph, type ResourceGraphInput } from './schema.js';
2
+ /** Detector id stamped onto every graph-issued finding/entry. */
3
+ export declare const GRAPH_DETECTOR_ID = "gateforge.graph";
4
+ /**
5
+ * Builds the resource graph. See the module doc for the normalization
6
+ * rules; see `ResourceGraphSchema` for the output shape.
7
+ *
8
+ * Args:
9
+ * input: detector contributions and the claim/adapter/waiver
10
+ * populations to watch for staleness.
11
+ *
12
+ * Returns:
13
+ * ResourceGraph: normalized, sorted, byte-for-byte deterministic.
14
+ */
15
+ export declare function buildResourceGraph(input: ResourceGraphInput): ResourceGraph;
16
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/graph/build.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAiI,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAuB,MAAM,aAAa,CAAC;AAI9N,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AAKnD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CA2B3E"}
@@ -0,0 +1,423 @@
1
+ /**
2
+ * Resource-graph construction (Phase 1 "resource graph construction",
3
+ * plan §11). Pure function: detector contributions + classifications +
4
+ * watched artifact populations → normalized, deterministically ordered
5
+ * {@link ResourceGraph}.
6
+ *
7
+ * Determinism contract: same inputs → identical graph, byte-for-byte
8
+ * under `canonicalJson`. All output arrays carry a total order; all
9
+ * lookups iterate in sorted order; no clock, randomness, network, or
10
+ * filesystem access happens here.
11
+ *
12
+ * Normalization rules (ADR 0001):
13
+ * - D5.3: resource id = plane-qualified `plane.name`; `source` paths
14
+ * are repo-root-relative (posix, no `./`, no escape).
15
+ * - Plane resolution per resource: a valid `attributes.plane` from the
16
+ * detector. Resources with none stay id-less here; the deterministic
17
+ * classifier (`runClassification`, plan phase 5) resolves planes from
18
+ * classification signals and binds the effective classification —
19
+ * the manual classifications document no longer exists (ADR 0003 D5).
20
+ * - Invariant 9 / GF-06: claims, adapter files, and waivers pointing at
21
+ * removed/renamed resources surface as typed `stale` entries.
22
+ */
23
+ import { z } from 'zod';
24
+ import { ClaimSchema } from '../schemas/claim.js';
25
+ import { LocationSchema } from '../schemas/common.js';
26
+ import { ResourceSchema } from '../schemas/resource.js';
27
+ import { WaiverSchema } from '../schemas/waiver.js';
28
+ import { isEvidenceOnlyKind, RESOURCE_NAME_ATTRIBUTE } from './schema.js';
29
+ import { buildSymbolTable, locationIndex, resolveInheritedName, sortUnresolved } from './symbols.js';
30
+ import { compareStrings, compareLocations } from './util.js';
31
+ /** Detector id stamped onto every graph-issued finding/entry. */
32
+ export const GRAPH_DETECTOR_ID = 'gateforge.graph';
33
+ /** Names must not break the `<plane>.<name>` id or `<id>:<contract>` grammar. */
34
+ const RESOURCE_NAME_PATTERN = /^[^.]+$/;
35
+ /**
36
+ * Builds the resource graph. See the module doc for the normalization
37
+ * rules; see `ResourceGraphSchema` for the output shape.
38
+ *
39
+ * Args:
40
+ * input: detector contributions and the claim/adapter/waiver
41
+ * populations to watch for staleness.
42
+ *
43
+ * Returns:
44
+ * ResourceGraph: normalized, sorted, byte-for-byte deterministic.
45
+ */
46
+ export function buildResourceGraph(input) {
47
+ const findings = [];
48
+ const symbolTable = buildSymbolTable(input.detectors, findings);
49
+ const resources = [];
50
+ const unresolved = [];
51
+ const declaredNames = new Set();
52
+ for (const detector of input.detectors) {
53
+ ingestDetector(detector, symbolTable, resources, unresolved, declaredNames, findings);
54
+ }
55
+ const stale = collectStaleReferences(input, resources, declaredNames, idLessNames(resources, declaredNames), findings);
56
+ return {
57
+ schemaVersion: 1,
58
+ resources: sortResources(resources),
59
+ unresolved: sortUnresolved(unresolved),
60
+ findings: sortFindings([...findings, ...detectDuplicateIds(resources)]),
61
+ stale: sortStale(stale),
62
+ };
63
+ }
64
+ /**
65
+ * Declared names whose entry carries NO plane-qualified id — either
66
+ * the entry is id-less (unclassified) or it was excluded while
67
+ * malformed (bad path/name). References to such a resource bind by
68
+ * name so they stay visible but never read as stale.
69
+ */
70
+ function idLessNames(resources, declaredNames) {
71
+ const idNames = new Set();
72
+ for (const resource of resources) {
73
+ if (resource.id !== null)
74
+ idNames.add(resource.name);
75
+ }
76
+ const idLess = new Set();
77
+ for (const name of declaredNames) {
78
+ if (!idNames.has(name))
79
+ idLess.add(name);
80
+ }
81
+ return idLess;
82
+ }
83
+ function ingestDetector(detector, symbolTable, resources, unresolved, declaredNames, findings) {
84
+ const symbols = symbolsOf(symbolTable, detector.detectorId);
85
+ const symbolAt = locationIndex(symbols);
86
+ // Inheritance resolution first: symbols the table can resolve emit
87
+ // concrete resources; `resolvedQnames` drives which of this
88
+ // detector's unresolved entries are retired this run.
89
+ const resolvedQnames = new Set();
90
+ for (const symbol of symbols) {
91
+ if (symbol.tableName !== null)
92
+ continue;
93
+ const resolution = resolveInheritedName(symbol, symbolTable);
94
+ if (!resolution.ok) {
95
+ if (symbol.tablenameUnresolved) {
96
+ unresolved.push({
97
+ reason: {
98
+ code: 'inherited_tablename_unresolved',
99
+ detail: `class '${symbol.qname}' inherits its tablename but the symbol table could not resolve it statically: ${resolution.cause}`,
100
+ location: symbol.location,
101
+ },
102
+ detectorId: GRAPH_DETECTOR_ID,
103
+ detectorVersion: null,
104
+ });
105
+ }
106
+ continue;
107
+ }
108
+ resolvedQnames.add(symbol.qname);
109
+ emitEntry({
110
+ name: resolution.name,
111
+ kind: symbol.resourceKind,
112
+ source: symbol.source,
113
+ location: symbol.location,
114
+ attributes: {
115
+ [RESOURCE_NAME_ATTRIBUTE]: resolution.name,
116
+ classQname: symbol.qname,
117
+ provenance: `inherited-from-abstract:${resolution.baseQname}`,
118
+ },
119
+ }, detector, declaredNames, resources, unresolved, findings);
120
+ }
121
+ for (const rawResource of detector.resources) {
122
+ if (isEvidenceOnlyKind(rawResource.kind))
123
+ continue; // symbol-table / endpoint-compiler input, not a business resource
124
+ const parsed = ResourceSchema.safeParse(rawResource);
125
+ if (!parsed.success) {
126
+ findings.push({
127
+ code: 'INVALID_RESOURCE',
128
+ detail: `resource from ${detector.detectorId} failed schema validation: ${parsed.error.issues[0]?.message ?? 'unknown issue'}`,
129
+ locations: [validLocationOrUnknown(rawResource)],
130
+ detectorId: detector.detectorId,
131
+ });
132
+ continue;
133
+ }
134
+ const resource = parsed.data;
135
+ const name = resource.attributes[RESOURCE_NAME_ATTRIBUTE];
136
+ if (typeof name !== 'string' || name === '') {
137
+ unresolved.push({
138
+ reason: {
139
+ code: 'no_resource_name',
140
+ detail: `resource kind '${resource.kind}' at ${resource.location.file}:${resource.location.line} carries no '${RESOURCE_NAME_ATTRIBUTE}' attribute; identity cannot be normalized`,
141
+ location: resource.location,
142
+ },
143
+ detectorId: detector.detectorId,
144
+ detectorVersion: detector.detectorVersion,
145
+ });
146
+ continue;
147
+ }
148
+ emitEntry({
149
+ name,
150
+ kind: resource.kind,
151
+ source: resource.source,
152
+ location: resource.location,
153
+ attributes: resource.attributes,
154
+ }, detector, declaredNames, resources, unresolved, findings);
155
+ }
156
+ for (const detectorFinding of detector.findings) {
157
+ findings.push({
158
+ ...detectorFinding,
159
+ locations: [...detectorFinding.locations].sort(compareLocations),
160
+ detectorId: detector.detectorId,
161
+ });
162
+ }
163
+ for (const reason of detector.unresolved) {
164
+ const symbol = symbolAt.get(locationKey(reason.location));
165
+ if (symbol !== undefined && resolvedQnames.has(symbol.qname))
166
+ continue;
167
+ unresolved.push({
168
+ reason,
169
+ detectorId: detector.detectorId,
170
+ detectorVersion: detector.detectorVersion,
171
+ });
172
+ }
173
+ }
174
+ /**
175
+ * Normalizes one named declaration into a graph resource and appends
176
+ * it (or its typed diagnostic) to the accumulators. Failures produce
177
+ * findings/unresolved entries — never silent drops. The declared name
178
+ * is recorded even when the entry is excluded, so references to it do
179
+ * not read as stale while the resource is merely malformed.
180
+ */
181
+ function emitEntry(seed, detector, declaredNames, resources, unresolved, findings) {
182
+ declaredNames.add(seed.name);
183
+ const path = normalizeSourcePath(seed.source);
184
+ if (!path.ok) {
185
+ findings.push({
186
+ code: 'NON_REPO_RELATIVE_PATH',
187
+ detail: `resource '${seed.name}' source '${seed.source}' is not repo-root-relative: ${path.error}`,
188
+ locations: [seed.location],
189
+ detectorId: detector.detectorId,
190
+ });
191
+ return;
192
+ }
193
+ if (!RESOURCE_NAME_PATTERN.test(seed.name)) {
194
+ findings.push({
195
+ code: 'INVALID_RESOURCE_NAME',
196
+ detail: `resource name '${seed.name}' must not contain '.' or ':' (breaks the plane.name / id:contract grammars)`,
197
+ locations: [seed.location],
198
+ detectorId: detector.detectorId,
199
+ });
200
+ return;
201
+ }
202
+ // Business meaning is bound ONLY by the deterministic classifier
203
+ // (`runClassification`, ADR 0003 D5) over detector signals. Here the
204
+ // graph binds detector plane evidence alone: a lone valid
205
+ // `attributes.plane` qualifies the identity; resources without any
206
+ // plane evidence stay id-less until the classifier resolves one
207
+ // (never guessed across tenant/master/global).
208
+ const attributePlane = seed.attributes['plane'];
209
+ const attributePlaneValid = attributePlane === 'tenant' || attributePlane === 'master' || attributePlane === 'global';
210
+ resources.push({
211
+ schemaVersion: 1,
212
+ id: attributePlaneValid ? `${String(attributePlane)}.${seed.name}` : null,
213
+ name: seed.name,
214
+ plane: attributePlaneValid ? attributePlane : null,
215
+ kind: seed.kind,
216
+ source: path.path,
217
+ location: seed.location,
218
+ exposure: null,
219
+ classification: null,
220
+ // The classifier stamps this sibling field when it decides; the
221
+ // graph itself never asserts business meaning.
222
+ classificationTrace: null,
223
+ detector: { id: detector.detectorId, version: detector.detectorVersion },
224
+ attributes: seed.attributes,
225
+ });
226
+ }
227
+ /**
228
+ * Normalizes a detector-supplied source path to repo-root-relative
229
+ * posix form: backslashes become slashes, leading `./` is stripped.
230
+ * Absolute, drive-qualified, and `..`-escaping paths are rejected with
231
+ * a single-cause error.
232
+ */
233
+ function normalizeSourcePath(raw) {
234
+ let path = raw.replaceAll('\\', '/');
235
+ while (path.startsWith('./'))
236
+ path = path.slice(2);
237
+ if (path === '')
238
+ return { ok: false, error: 'path is empty' };
239
+ if (path.startsWith('/'))
240
+ return { ok: false, error: 'absolute paths are not repo-root-relative' };
241
+ if (/^[A-Za-z]:/.test(path))
242
+ return { ok: false, error: 'drive-qualified paths are not repo-root-relative' };
243
+ if (path === '..' || path.startsWith('../') || path.includes('/../') || path.endsWith('/..')) {
244
+ return { ok: false, error: "paths escaping the repo root ('..') are not repo-root-relative" };
245
+ }
246
+ return { ok: true, path };
247
+ }
248
+ function symbolsOf(table, detectorId) {
249
+ const symbols = [];
250
+ for (const symbol of table.byQname.values()) {
251
+ if (symbol.detectorId === detectorId)
252
+ symbols.push(symbol);
253
+ }
254
+ symbols.sort((a, b) => compareStrings(a.source, b.source) || compareLocations(a.location, b.location));
255
+ return symbols;
256
+ }
257
+ function locationKey(location) {
258
+ return `${location.file}:${location.line}`;
259
+ }
260
+ /**
261
+ * Best-effort location from a resource that FAILED schema validation:
262
+ * the raw value is untrusted, so anything that does not itself parse
263
+ * as a Location degrades to a synthetic `<unknown>` location.
264
+ */
265
+ function validLocationOrUnknown(resource) {
266
+ const parsed = LocationSchema.safeParse(resource.location);
267
+ return parsed.success
268
+ ? parsed.data
269
+ : { file: '<unknown>', line: 1, col: 0 };
270
+ }
271
+ /**
272
+ * Duplicate-table-name detection (GF-20 groundwork): group normalized
273
+ * entries by id (`plane.name`). Any id declared by more than one entry
274
+ * — across files or within one file — yields one finding listing every
275
+ * declaration location. The same name on different planes is
276
+ * legitimate (plane qualification exists precisely to disambiguate it)
277
+ * and is not flagged.
278
+ */
279
+ function detectDuplicateIds(resources) {
280
+ const byId = new Map();
281
+ for (const resource of resources) {
282
+ if (resource.id === null)
283
+ continue;
284
+ const bucket = byId.get(resource.id);
285
+ if (bucket === undefined)
286
+ byId.set(resource.id, [resource]);
287
+ else
288
+ bucket.push(resource);
289
+ }
290
+ const findings = [];
291
+ for (const id of [...byId.keys()].sort(compareStrings)) {
292
+ const bucket = byId.get(id);
293
+ if (bucket === undefined || bucket.length < 2)
294
+ continue;
295
+ const first = bucket[0];
296
+ if (first === undefined)
297
+ continue;
298
+ const locations = bucket.map((r) => r.location).sort(compareLocations);
299
+ const files = [...new Set(bucket.map((r) => r.source))].sort(compareStrings);
300
+ findings.push({
301
+ code: 'DUPLICATE_TABLE_NAME',
302
+ detail: `table name '${first.name}' declared ${bucket.length} time(s) across ${files.length} file(s) in plane '${String(first.plane)}' (files: ${files.join(', ')}); declarations collapse onto one identity — review required`,
303
+ locations,
304
+ detectorId: GRAPH_DETECTOR_ID,
305
+ });
306
+ }
307
+ return findings;
308
+ }
309
+ /**
310
+ * Stale-reference validation (invariant 9 / GF-06): every watched
311
+ * artifact still pointing at a removed/renamed resource is reported.
312
+ * Matching rules:
313
+ * - claims, adapters, and waivers reference FINAL plane-qualified ids
314
+ * and match strictly — a plane change or rename is exactly the
315
+ * rename invariant 9 exists to catch. A reference also binds when
316
+ * its resource NAME was declared but currently carries no id
317
+ * (unclassified, or excluded while malformed): the resource exists,
318
+ * so references must not rot while the blocking entry is being fixed.
319
+ */
320
+ function collectStaleReferences(input, resources, declaredNames, idLessNames, findings) {
321
+ const stale = [];
322
+ const knownIds = new Set();
323
+ for (const resource of resources) {
324
+ if (resource.id !== null)
325
+ knownIds.add(resource.id);
326
+ }
327
+ const bindsResource = (referenceId) => {
328
+ if (knownIds.has(referenceId))
329
+ return true;
330
+ for (const name of idLessNames) {
331
+ if (referenceId === name || referenceId.endsWith(`.${name}`))
332
+ return true;
333
+ }
334
+ return false;
335
+ };
336
+ if (input.claims !== undefined) {
337
+ for (const raw of input.claims) {
338
+ const parsed = ClaimSchema.safeParse(raw);
339
+ if (!parsed.success) {
340
+ findings.push(invalidArtifactFinding('INVALID_CLAIM', 'claim', parsed.error));
341
+ continue;
342
+ }
343
+ const claim = parsed.data;
344
+ const resourceId = claim.obligationId.slice(0, claim.obligationId.indexOf(':'));
345
+ if (!bindsResource(resourceId)) {
346
+ stale.push({
347
+ kind: 'claim',
348
+ reference: claim.obligationId,
349
+ detail: `claim by test '${claim.testId}' references resource '${resourceId}' which no longer exists`,
350
+ });
351
+ }
352
+ }
353
+ }
354
+ if (input.adapters !== undefined) {
355
+ for (const adapter of input.adapters) {
356
+ const name = adapterName(adapter);
357
+ if (!bindsResource(name)) {
358
+ stale.push({
359
+ kind: 'adapter',
360
+ reference: name,
361
+ detail: `adapter file '${adapter}' references resource '${name}' which no longer exists`,
362
+ });
363
+ }
364
+ }
365
+ }
366
+ if (input.waivers !== undefined) {
367
+ for (const raw of input.waivers) {
368
+ const parsed = WaiverSchema.safeParse(raw);
369
+ if (!parsed.success) {
370
+ findings.push(invalidArtifactFinding('INVALID_WAIVER', 'waiver', parsed.error));
371
+ continue;
372
+ }
373
+ const waiver = parsed.data;
374
+ if (!bindsResource(waiver.scope.resourceId)) {
375
+ stale.push({
376
+ kind: 'waiver',
377
+ reference: waiver.scope.resourceId,
378
+ detail: `waiver owned by '${waiver.owner}' is scoped to resource '${waiver.scope.resourceId}' which no longer exists`,
379
+ });
380
+ }
381
+ }
382
+ }
383
+ return stale;
384
+ }
385
+ function invalidArtifactFinding(code, what, error) {
386
+ return {
387
+ code,
388
+ detail: `watched ${what} failed schema validation: ${error.issues[0]?.message ?? 'unknown issue'}`,
389
+ locations: [],
390
+ detectorId: GRAPH_DETECTOR_ID,
391
+ };
392
+ }
393
+ /** Strips adapter paths/extensions: `.gateforge/adapters/<id>.mjs` → `<id>`. */
394
+ function adapterName(adapter) {
395
+ const base = adapter.replaceAll('\\', '/').split('/').at(-1) ?? adapter;
396
+ return base.replace(/\.mjs$/, '');
397
+ }
398
+ function sortResources(resources) {
399
+ return [...resources].sort((a, b) => {
400
+ if (a.id !== null && b.id !== null) {
401
+ const byId = compareStrings(a.id, b.id);
402
+ if (byId !== 0)
403
+ return byId;
404
+ }
405
+ if (a.id !== null)
406
+ return -1; // id-bearing entries sort before id-less ones
407
+ if (b.id !== null)
408
+ return 1;
409
+ return (compareStrings(a.name, b.name) ||
410
+ compareStrings(a.source, b.source) ||
411
+ compareLocations(a.location, b.location));
412
+ });
413
+ }
414
+ function sortFindings(findings) {
415
+ return [...findings].sort((a, b) => compareStrings(a.code, b.code) ||
416
+ compareStrings(a.detail, b.detail) ||
417
+ compareStrings(a.detectorId, b.detectorId) ||
418
+ compareLocations(a.locations[0] ?? { file: '', line: 0, col: 0 }, b.locations[0] ?? { file: '', line: 0, col: 0 }));
419
+ }
420
+ function sortStale(stale) {
421
+ return [...stale].sort((a, b) => compareStrings(a.kind, b.kind) || compareStrings(a.reference, b.reference));
422
+ }
423
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/graph/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAA6B,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAiB,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAsJ,MAAM,aAAa,CAAC;AAC9N,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,EAAE,cAAc,EAAsC,MAAM,cAAc,CAAC;AACzI,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7D,iEAAiE;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAEnD,iFAAiF;AACjF,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAExC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC1D,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhE,MAAM,SAAS,GAAoB,EAAE,CAAC;IACtC,MAAM,UAAU,GAAsB,EAAE,CAAC;IACzC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACvC,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,KAAK,GAAG,sBAAsB,CAClC,KAAK,EACL,SAAS,EACT,aAAa,EACb,WAAW,CAAC,SAAS,EAAE,aAAa,CAAC,EACrC,QAAQ,CACT,CAAC;IAEF,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC;QACnC,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC;QACtC,QAAQ,EAAE,YAAY,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;QACvE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;KACxB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,SAA0B,EAAE,aAA0B;IACzE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CACrB,QAAwB,EACxB,WAAwB,EACxB,SAA0B,EAC1B,UAA6B,EAC7B,aAA0B,EAC1B,QAAwB;IAExB,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAExC,mEAAmE;IACnE,4DAA4D;IAC5D,sDAAsD;IACtD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI;YAAE,SAAS;QACxC,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;gBAC/B,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE;wBACN,IAAI,EAAE,gCAAgC;wBACtC,MAAM,EAAE,UAAU,MAAM,CAAC,KAAK,kFAAkF,UAAU,CAAC,KAAK,EAAE;wBAClI,QAAQ,EAAE,MAAM,CAAC,QAAQ;qBAC1B;oBACD,UAAU,EAAE,iBAAiB;oBAC7B,eAAe,EAAE,IAAI;iBACtB,CAAC,CAAC;YACL,CAAC;YACD,SAAS;QACX,CAAC;QACD,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,SAAS,CACP;YACE,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,IAAI,EAAE,MAAM,CAAC,YAAY;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU,EAAE;gBACV,CAAC,uBAAuB,CAAC,EAAE,UAAU,CAAC,IAAI;gBAC1C,UAAU,EAAE,MAAM,CAAC,KAAK;gBACxB,UAAU,EAAE,2BAA2B,UAAU,CAAC,SAAS,EAAE;aAC9D;SACF,EACD,QAAQ,EACR,aAAa,EACb,SAAS,EACT,UAAU,EACV,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,WAAW,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC7C,IAAI,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC;YAAE,SAAS,CAAC,kEAAkE;QACtH,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,iBAAiB,QAAQ,CAAC,UAAU,8BAA8B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,eAAe,EAAE;gBAC9H,SAAS,EAAE,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;gBAChD,UAAU,EAAE,QAAQ,CAAC,UAAU;aAChC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;QAC1D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAC5C,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE;oBACN,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,kBAAkB,QAAQ,CAAC,IAAI,QAAQ,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,gBAAgB,uBAAuB,4CAA4C;oBAClL,QAAQ,EAAE,QAAQ,CAAC,QAAQ;iBAC5B;gBACD,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,eAAe,EAAE,QAAQ,CAAC,eAAe;aAC1C,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,SAAS,CACP;YACE,IAAI;YACJ,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;SAChC,EACD,QAAQ,EACR,aAAa,EACb,SAAS,EACT,UAAU,EACV,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,eAAe,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG,eAAe;YAClB,SAAS,EAAE,CAAC,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAChE,UAAU,EAAE,QAAQ,CAAC,UAAU;SAChC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1D,IAAI,MAAM,KAAK,SAAS,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,SAAS;QACvE,UAAU,CAAC,IAAI,CAAC;YACd,MAAM;YACN,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,eAAe,EAAE,QAAQ,CAAC,eAAe;SAC1C,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAUD;;;;;;GAMG;AACH,SAAS,SAAS,CAChB,IAAe,EACf,QAAwB,EACxB,aAA0B,EAC1B,SAA0B,EAC1B,UAA6B,EAC7B,QAAwB;IAExB,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7B,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,wBAAwB;YAC9B,MAAM,EAAE,aAAa,IAAI,CAAC,IAAI,aAAa,IAAI,CAAC,MAAM,gCAAgC,IAAI,CAAC,KAAK,EAAE;YAClG,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC1B,UAAU,EAAE,QAAQ,CAAC,UAAU;SAChC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,uBAAuB;YAC7B,MAAM,EAAE,kBAAkB,IAAI,CAAC,IAAI,8EAA8E;YACjH,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC1B,UAAU,EAAE,QAAQ,CAAC,UAAU;SAChC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,iEAAiE;IACjE,qEAAqE;IACrE,0DAA0D;IAC1D,mEAAmE;IACnE,gEAAgE;IAChE,+CAA+C;IAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,mBAAmB,GACvB,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,QAAQ,CAAC;IAC5F,SAAS,CAAC,IAAI,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QACzE,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAE,cAAwB,CAAC,CAAC,CAAC,IAAI;QAC7D,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,IAAI;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,IAAI;QACpB,gEAAgE;QAChE,+CAA+C;QAC/C,mBAAmB,EAAE,IAAI;QACzB,QAAQ,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,eAAe,EAAE;QACxE,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAC;AACL,CAAC;AAID;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,GAAW;IACtC,IAAI,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAC9D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;IACnG,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kDAAkD,EAAE,CAAC;IAC7G,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gEAAgE,EAAE,CAAC;IAChG,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,SAAS,CAAC,KAAkB,EAAE,UAAkB;IACvD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,UAAU,KAAK,UAAU;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,CAAC,IAAI,CACV,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CACjF,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,QAAkB;IACrC,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAAC,QAAkB;IAChD,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,OAAO;QACnB,CAAC,CAAC,MAAM,CAAC,IAAI;QACb,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,kBAAkB,CAAC,SAA0B;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAA2B,CAAC;IAChD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI;YAAE,SAAS;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;;YACvD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7E,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,sBAAsB;YAC5B,MAAM,EAAE,eAAe,KAAK,CAAC,IAAI,cAAc,MAAM,CAAC,MAAM,mBAAmB,KAAK,CAAC,MAAM,sBAAsB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,8DAA8D;YAC/N,SAAS;YACT,UAAU,EAAE,iBAAiB;SAC9B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,sBAAsB,CAC7B,KAAyB,EACzB,SAA0B,EAC1B,aAA0B,EAC1B,WAAwB,EACxB,QAAwB;IAExB,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI;YAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,aAAa,GAAG,CAAC,WAAmB,EAAW,EAAE;QACrD,IAAI,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC5E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC9E,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;YAC1B,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,KAAK,CAAC,YAAY;oBAC7B,MAAM,EAAE,kBAAkB,KAAK,CAAC,MAAM,0BAA0B,UAAU,0BAA0B;iBACrG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,SAAS;oBACf,SAAS,EAAE,IAAI;oBACf,MAAM,EAAE,iBAAiB,OAAO,0BAA0B,IAAI,0BAA0B;iBACzF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAChF,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;oBAClC,MAAM,EAAE,oBAAoB,MAAM,CAAC,KAAK,4BAA4B,MAAM,CAAC,KAAK,CAAC,UAAU,0BAA0B;iBACtH,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAC7B,IAAY,EACZ,IAAY,EACZ,KAAiB;IAEjB,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,WAAW,IAAI,8BAA8B,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,eAAe,EAAE;QAClG,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,iBAAiB;KAC9B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IACxE,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,aAAa,CAAC,SAA0B;IAC/C,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACxC,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,8CAA8C;QAC5E,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC;QAC5B,OAAO,CACL,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;YAC9B,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YAClC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,QAAwB;IAC5C,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CACvB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;QAC9B,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QAClC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC;QAC1C,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CACrH,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAuB;IACxC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CACpB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CACrF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Resource graph (G2): detector-output ingestion, id/path
3
+ * normalization, symbol-table inheritance resolution, duplicate-table
4
+ * detection, and stale-reference validation (invariant 9 / GF-06).
5
+ */
6
+ export { CLASS_SYMBOL_KIND, EVIDENCE_ONLY_RESOURCE_KINDS, HTTP_ENDPOINT_RESOURCE_KIND, isEvidenceOnlyKind, RESOURCE_NAME_ATTRIBUTE, ClassSymbolAttributesSchema, DetectorOutputSchema, FindingSchema, GraphFindingSchema, GraphResourceSchema, GraphUnresolvedSchema, ResourceGraphSchema, StaleReferenceKindSchema, StaleReferenceSchema, } from './schema.js';
7
+ export type { ClassSymbolAttributes, DetectorOutput, Finding, GraphFinding, GraphResource, GraphUnresolved, ResourceGraph, ResourceGraphInput, StaleReference, StaleReferenceKind, } from './schema.js';
8
+ export { buildResourceGraph, GRAPH_DETECTOR_ID } from './build.js';
9
+ export { buildSymbolTable, locationIndex, resolveInheritedName, sortUnresolved, } from './symbols.js';
10
+ export type { ClassSymbol, InheritanceResolution, SymbolTable } from './symbols.js';
11
+ export { compareLocations, compareStrings } from './util.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,4BAA4B,EAC5B,2BAA2B,EAC3B,kBAAkB,EAClB,uBAAuB,EACvB,2BAA2B,EAC3B,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,qBAAqB,EACrB,cAAc,EACd,OAAO,EACP,YAAY,EACZ,aAAa,EACb,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Resource graph (G2): detector-output ingestion, id/path
3
+ * normalization, symbol-table inheritance resolution, duplicate-table
4
+ * detection, and stale-reference validation (invariant 9 / GF-06).
5
+ */
6
+ export { CLASS_SYMBOL_KIND, EVIDENCE_ONLY_RESOURCE_KINDS, HTTP_ENDPOINT_RESOURCE_KIND, isEvidenceOnlyKind, RESOURCE_NAME_ATTRIBUTE, ClassSymbolAttributesSchema, DetectorOutputSchema, FindingSchema, GraphFindingSchema, GraphResourceSchema, GraphUnresolvedSchema, ResourceGraphSchema, StaleReferenceKindSchema, StaleReferenceSchema, } from './schema.js';
7
+ export { buildResourceGraph, GRAPH_DETECTOR_ID } from './build.js';
8
+ export { buildSymbolTable, locationIndex, resolveInheritedName, sortUnresolved, } from './symbols.js';
9
+ export { compareLocations, compareStrings } from './util.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,4BAA4B,EAC5B,2BAA2B,EAC3B,kBAAkB,EAClB,uBAAuB,EACvB,2BAA2B,EAC3B,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAarB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}