@descryy/core 0.3.0 → 0.5.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 (362) hide show
  1. package/dist/budget/reply.d.ts +11 -46
  2. package/dist/budget/reply.d.ts.map +1 -1
  3. package/dist/budget/reply.js +10 -39
  4. package/dist/budget/reply.js.map +1 -1
  5. package/dist/budget/size.d.ts +2 -21
  6. package/dist/budget/size.d.ts.map +1 -1
  7. package/dist/budget/size.js +3 -24
  8. package/dist/budget/size.js.map +1 -1
  9. package/dist/capabilities/preconditions.d.ts +7 -68
  10. package/dist/capabilities/preconditions.d.ts.map +1 -1
  11. package/dist/capabilities/preconditions.js +6 -57
  12. package/dist/capabilities/preconditions.js.map +1 -1
  13. package/dist/contracts/engine.d.ts +26 -12
  14. package/dist/contracts/engine.d.ts.map +1 -1
  15. package/dist/contracts/engine.js +28 -11
  16. package/dist/contracts/engine.js.map +1 -1
  17. package/dist/contracts/index.d.ts +1 -1
  18. package/dist/contracts/index.d.ts.map +1 -1
  19. package/dist/contracts/index.js.map +1 -1
  20. package/dist/contracts/orphans.d.ts +28 -77
  21. package/dist/contracts/orphans.d.ts.map +1 -1
  22. package/dist/contracts/orphans.js +124 -94
  23. package/dist/contracts/orphans.js.map +1 -1
  24. package/dist/contracts/paths.d.ts +4 -114
  25. package/dist/contracts/paths.d.ts.map +1 -1
  26. package/dist/contracts/paths.js +7 -140
  27. package/dist/contracts/paths.js.map +1 -1
  28. package/dist/contracts/shapes.d.ts +13 -66
  29. package/dist/contracts/shapes.d.ts.map +1 -1
  30. package/dist/contracts/shapes.js +20 -91
  31. package/dist/contracts/shapes.js.map +1 -1
  32. package/dist/governance/budget.d.ts +12 -48
  33. package/dist/governance/budget.d.ts.map +1 -1
  34. package/dist/governance/budget.js +12 -48
  35. package/dist/governance/budget.js.map +1 -1
  36. package/dist/governance/candidate-boundary.d.ts +4 -32
  37. package/dist/governance/candidate-boundary.d.ts.map +1 -1
  38. package/dist/governance/candidate-boundary.js +4 -32
  39. package/dist/governance/candidate-boundary.js.map +1 -1
  40. package/dist/governance/escalation.d.ts +7 -45
  41. package/dist/governance/escalation.d.ts.map +1 -1
  42. package/dist/governance/escalation.js +7 -45
  43. package/dist/governance/escalation.js.map +1 -1
  44. package/dist/governance/fact-boundary.d.ts +7 -49
  45. package/dist/governance/fact-boundary.d.ts.map +1 -1
  46. package/dist/governance/fact-boundary.js +5 -43
  47. package/dist/governance/fact-boundary.js.map +1 -1
  48. package/dist/governance/finding-funnel.d.ts +11 -72
  49. package/dist/governance/finding-funnel.d.ts.map +1 -1
  50. package/dist/governance/finding-funnel.js +9 -68
  51. package/dist/governance/finding-funnel.js.map +1 -1
  52. package/dist/graph/build.d.ts +13 -75
  53. package/dist/graph/build.d.ts.map +1 -1
  54. package/dist/graph/build.js +0 -0
  55. package/dist/graph/build.js.map +1 -1
  56. package/dist/graph/cross-language.d.ts +4 -43
  57. package/dist/graph/cross-language.d.ts.map +1 -1
  58. package/dist/graph/cross-language.js +9 -77
  59. package/dist/graph/cross-language.js.map +1 -1
  60. package/dist/graph/index.d.ts +1 -1
  61. package/dist/graph/index.d.ts.map +1 -1
  62. package/dist/graph/merge.d.ts +8 -76
  63. package/dist/graph/merge.d.ts.map +1 -1
  64. package/dist/graph/merge.js +27 -77
  65. package/dist/graph/merge.js.map +1 -1
  66. package/dist/graph/observed-tests.d.ts +7 -68
  67. package/dist/graph/observed-tests.d.ts.map +1 -1
  68. package/dist/graph/observed-tests.js +5 -60
  69. package/dist/graph/observed-tests.js.map +1 -1
  70. package/dist/graph/persist.d.ts +2 -25
  71. package/dist/graph/persist.d.ts.map +1 -1
  72. package/dist/graph/persist.js +2 -25
  73. package/dist/graph/persist.js.map +1 -1
  74. package/dist/graph/runtime-confirmation.d.ts +14 -91
  75. package/dist/graph/runtime-confirmation.d.ts.map +1 -1
  76. package/dist/graph/runtime-confirmation.js +19 -103
  77. package/dist/graph/runtime-confirmation.js.map +1 -1
  78. package/dist/ledger/mint.d.ts +9 -43
  79. package/dist/ledger/mint.d.ts.map +1 -1
  80. package/dist/ledger/mint.js +15 -65
  81. package/dist/ledger/mint.js.map +1 -1
  82. package/dist/ledger/resolve.d.ts +13 -81
  83. package/dist/ledger/resolve.d.ts.map +1 -1
  84. package/dist/ledger/resolve.js +13 -76
  85. package/dist/ledger/resolve.js.map +1 -1
  86. package/dist/multipr/fingerprint.d.ts +5 -46
  87. package/dist/multipr/fingerprint.d.ts.map +1 -1
  88. package/dist/multipr/fingerprint.js +22 -74
  89. package/dist/multipr/fingerprint.js.map +1 -1
  90. package/dist/multipr/hidden-dependency.d.ts +13 -73
  91. package/dist/multipr/hidden-dependency.d.ts.map +1 -1
  92. package/dist/multipr/hidden-dependency.js +12 -63
  93. package/dist/multipr/hidden-dependency.js.map +1 -1
  94. package/dist/multipr/mechanical.d.ts +25 -160
  95. package/dist/multipr/mechanical.d.ts.map +1 -1
  96. package/dist/multipr/mechanical.js +21 -137
  97. package/dist/multipr/mechanical.js.map +1 -1
  98. package/dist/multipr/migration-heads.d.ts +18 -105
  99. package/dist/multipr/migration-heads.d.ts.map +1 -1
  100. package/dist/multipr/migration-heads.js +15 -84
  101. package/dist/multipr/migration-heads.js.map +1 -1
  102. package/dist/multipr/overlap.d.ts +16 -94
  103. package/dist/multipr/overlap.d.ts.map +1 -1
  104. package/dist/multipr/overlap.js +25 -105
  105. package/dist/multipr/overlap.js.map +1 -1
  106. package/dist/multipr/scope-store.d.ts +15 -80
  107. package/dist/multipr/scope-store.d.ts.map +1 -1
  108. package/dist/multipr/scope-store.js +17 -87
  109. package/dist/multipr/scope-store.js.map +1 -1
  110. package/dist/multipr/superseded.d.ts +10 -95
  111. package/dist/multipr/superseded.d.ts.map +1 -1
  112. package/dist/multipr/superseded.js +7 -60
  113. package/dist/multipr/superseded.js.map +1 -1
  114. package/dist/query/confirmed-facts.d.ts +12 -58
  115. package/dist/query/confirmed-facts.d.ts.map +1 -1
  116. package/dist/query/confirmed-facts.js +8 -47
  117. package/dist/query/confirmed-facts.js.map +1 -1
  118. package/dist/query/declared-value-closure.d.ts +13 -104
  119. package/dist/query/declared-value-closure.d.ts.map +1 -1
  120. package/dist/query/declared-value-closure.js +15 -104
  121. package/dist/query/declared-value-closure.js.map +1 -1
  122. package/dist/query/memory.d.ts +5 -9
  123. package/dist/query/memory.d.ts.map +1 -1
  124. package/dist/query/memory.js +31 -15
  125. package/dist/query/memory.js.map +1 -1
  126. package/dist/query/prominence.d.ts +6 -55
  127. package/dist/query/prominence.d.ts.map +1 -1
  128. package/dist/query/prominence.js +6 -55
  129. package/dist/query/prominence.js.map +1 -1
  130. package/dist/query/provider.d.ts +28 -81
  131. package/dist/query/provider.d.ts.map +1 -1
  132. package/dist/query/provider.js +8 -29
  133. package/dist/query/provider.js.map +1 -1
  134. package/dist/query/queries.d.ts +15 -65
  135. package/dist/query/queries.d.ts.map +1 -1
  136. package/dist/query/queries.js +43 -100
  137. package/dist/query/queries.js.map +1 -1
  138. package/dist/query/refusal-fetch.d.ts +8 -85
  139. package/dist/query/refusal-fetch.d.ts.map +1 -1
  140. package/dist/query/refusal-fetch.js +11 -93
  141. package/dist/query/refusal-fetch.js.map +1 -1
  142. package/dist/query/refusal-questions.d.ts +17 -92
  143. package/dist/query/refusal-questions.d.ts.map +1 -1
  144. package/dist/query/refusal-questions.js +14 -78
  145. package/dist/query/refusal-questions.js.map +1 -1
  146. package/dist/query/resolution-floor.d.ts +3 -23
  147. package/dist/query/resolution-floor.d.ts.map +1 -1
  148. package/dist/query/resolution-floor.js +3 -23
  149. package/dist/query/resolution-floor.js.map +1 -1
  150. package/dist/query/root-cause-score.d.ts +11 -161
  151. package/dist/query/root-cause-score.d.ts.map +1 -1
  152. package/dist/query/root-cause-score.js +6 -137
  153. package/dist/query/root-cause-score.js.map +1 -1
  154. package/dist/query/row-closure-picture.d.ts +5 -67
  155. package/dist/query/row-closure-picture.d.ts.map +1 -1
  156. package/dist/query/row-closure-picture.js +6 -67
  157. package/dist/query/row-closure-picture.js.map +1 -1
  158. package/dist/query/similar-incidents.d.ts +6 -41
  159. package/dist/query/similar-incidents.d.ts.map +1 -1
  160. package/dist/query/similar-incidents.js +15 -69
  161. package/dist/query/similar-incidents.js.map +1 -1
  162. package/dist/query/sqlite.d.ts +3 -7
  163. package/dist/query/sqlite.d.ts.map +1 -1
  164. package/dist/query/sqlite.js +13 -16
  165. package/dist/query/sqlite.js.map +1 -1
  166. package/dist/query/test-coverage.d.ts +5 -45
  167. package/dist/query/test-coverage.d.ts.map +1 -1
  168. package/dist/query/test-coverage.js +10 -53
  169. package/dist/query/test-coverage.js.map +1 -1
  170. package/dist/query/traverse.d.ts +22 -126
  171. package/dist/query/traverse.d.ts.map +1 -1
  172. package/dist/query/traverse.js +0 -0
  173. package/dist/query/traverse.js.map +1 -1
  174. package/dist/query/unresolved.d.ts +19 -164
  175. package/dist/query/unresolved.d.ts.map +1 -1
  176. package/dist/query/unresolved.js +11 -138
  177. package/dist/query/unresolved.js.map +1 -1
  178. package/dist/query/verification-status.d.ts +12 -109
  179. package/dist/query/verification-status.d.ts.map +1 -1
  180. package/dist/query/verification-status.js +9 -99
  181. package/dist/query/verification-status.js.map +1 -1
  182. package/dist/recording/migrate.d.ts +4 -10
  183. package/dist/recording/migrate.d.ts.map +1 -1
  184. package/dist/recording/migrate.js +4 -10
  185. package/dist/recording/migrate.js.map +1 -1
  186. package/dist/recording/reader.d.ts +2 -7
  187. package/dist/recording/reader.d.ts.map +1 -1
  188. package/dist/recording/reader.js +2 -7
  189. package/dist/recording/reader.js.map +1 -1
  190. package/dist/recording/redact.d.ts +6 -57
  191. package/dist/recording/redact.d.ts.map +1 -1
  192. package/dist/recording/redact.js +8 -64
  193. package/dist/recording/redact.js.map +1 -1
  194. package/dist/recording/schema.d.ts +3 -38
  195. package/dist/recording/schema.d.ts.map +1 -1
  196. package/dist/recording/schema.js +3 -38
  197. package/dist/recording/schema.js.map +1 -1
  198. package/dist/recording/writer.d.ts +11 -74
  199. package/dist/recording/writer.d.ts.map +1 -1
  200. package/dist/recording/writer.js +3 -43
  201. package/dist/recording/writer.js.map +1 -1
  202. package/dist/scoping/fanout.d.ts +6 -68
  203. package/dist/scoping/fanout.d.ts.map +1 -1
  204. package/dist/scoping/fanout.js +6 -68
  205. package/dist/scoping/fanout.js.map +1 -1
  206. package/dist/scoping/score.d.ts +20 -70
  207. package/dist/scoping/score.d.ts.map +1 -1
  208. package/dist/scoping/score.js +20 -70
  209. package/dist/scoping/score.js.map +1 -1
  210. package/dist/scoping/tiers.d.ts +4 -16
  211. package/dist/scoping/tiers.d.ts.map +1 -1
  212. package/dist/scoping/tiers.js +4 -16
  213. package/dist/scoping/tiers.js.map +1 -1
  214. package/dist/scoping/traverse.d.ts +3 -25
  215. package/dist/scoping/traverse.d.ts.map +1 -1
  216. package/dist/scoping/traverse.js +14 -49
  217. package/dist/scoping/traverse.js.map +1 -1
  218. package/dist/scoping/weights.d.ts +10 -74
  219. package/dist/scoping/weights.d.ts.map +1 -1
  220. package/dist/scoping/weights.js +14 -86
  221. package/dist/scoping/weights.js.map +1 -1
  222. package/dist/sources/confirmed/incidents.d.ts +5 -35
  223. package/dist/sources/confirmed/incidents.d.ts.map +1 -1
  224. package/dist/sources/confirmed/incidents.js +14 -48
  225. package/dist/sources/confirmed/incidents.js.map +1 -1
  226. package/dist/sources/git/diff.d.ts +71 -65
  227. package/dist/sources/git/diff.d.ts.map +1 -1
  228. package/dist/sources/git/diff.js +136 -83
  229. package/dist/sources/git/diff.js.map +1 -1
  230. package/dist/sources/git/env.d.ts +7 -0
  231. package/dist/sources/git/env.d.ts.map +1 -1
  232. package/dist/sources/git/env.js +10 -11
  233. package/dist/sources/git/env.js.map +1 -1
  234. package/dist/sources/git/history.d.ts +64 -84
  235. package/dist/sources/git/history.d.ts.map +1 -1
  236. package/dist/sources/git/history.js +141 -112
  237. package/dist/sources/git/history.js.map +1 -1
  238. package/dist/sources/git/incidents.d.ts +13 -75
  239. package/dist/sources/git/incidents.d.ts.map +1 -1
  240. package/dist/sources/git/incidents.js +21 -91
  241. package/dist/sources/git/incidents.js.map +1 -1
  242. package/dist/sources/git/index.d.ts +5 -3
  243. package/dist/sources/git/index.d.ts.map +1 -1
  244. package/dist/sources/git/index.js +3 -2
  245. package/dist/sources/git/index.js.map +1 -1
  246. package/dist/sources/git/source.d.ts +9 -79
  247. package/dist/sources/git/source.d.ts.map +1 -1
  248. package/dist/sources/git/source.js +0 -0
  249. package/dist/sources/git/source.js.map +1 -1
  250. package/dist/sources/migrations/across-change.d.ts +94 -0
  251. package/dist/sources/migrations/across-change.d.ts.map +1 -0
  252. package/dist/sources/migrations/across-change.js +278 -0
  253. package/dist/sources/migrations/across-change.js.map +1 -0
  254. package/dist/sources/migrations/dialects.d.ts +20 -36
  255. package/dist/sources/migrations/dialects.d.ts.map +1 -1
  256. package/dist/sources/migrations/dialects.js +11 -36
  257. package/dist/sources/migrations/dialects.js.map +1 -1
  258. package/dist/sources/migrations/index.d.ts +3 -1
  259. package/dist/sources/migrations/index.d.ts.map +1 -1
  260. package/dist/sources/migrations/index.js +2 -1
  261. package/dist/sources/migrations/index.js.map +1 -1
  262. package/dist/sources/migrations/read.d.ts +14 -79
  263. package/dist/sources/migrations/read.d.ts.map +1 -1
  264. package/dist/sources/migrations/read.js +14 -89
  265. package/dist/sources/migrations/read.js.map +1 -1
  266. package/dist/sources/workspace/workspace.d.ts +6 -42
  267. package/dist/sources/workspace/workspace.d.ts.map +1 -1
  268. package/dist/sources/workspace/workspace.js +10 -53
  269. package/dist/sources/workspace/workspace.js.map +1 -1
  270. package/dist/store/driver/driver.d.ts +9 -38
  271. package/dist/store/driver/driver.d.ts.map +1 -1
  272. package/dist/store/driver/driver.js +4 -22
  273. package/dist/store/driver/driver.js.map +1 -1
  274. package/dist/store/driver/node-sqlite.d.ts +3 -12
  275. package/dist/store/driver/node-sqlite.d.ts.map +1 -1
  276. package/dist/store/driver/node-sqlite.js +4 -18
  277. package/dist/store/driver/node-sqlite.js.map +1 -1
  278. package/dist/store/index.d.ts +2 -7
  279. package/dist/store/index.d.ts.map +1 -1
  280. package/dist/store/index.js +4 -10
  281. package/dist/store/index.js.map +1 -1
  282. package/dist/store/migrate.d.ts +14 -50
  283. package/dist/store/migrate.d.ts.map +1 -1
  284. package/dist/store/migrate.js +15 -52
  285. package/dist/store/migrate.js.map +1 -1
  286. package/dist/store/reader.d.ts +19 -84
  287. package/dist/store/reader.d.ts.map +1 -1
  288. package/dist/store/reader.js +25 -92
  289. package/dist/store/reader.js.map +1 -1
  290. package/dist/store/schema.d.ts +14 -76
  291. package/dist/store/schema.d.ts.map +1 -1
  292. package/dist/store/schema.js +14 -76
  293. package/dist/store/schema.js.map +1 -1
  294. package/dist/store/writer.d.ts +14 -88
  295. package/dist/store/writer.d.ts.map +1 -1
  296. package/dist/store/writer.js +29 -123
  297. package/dist/store/writer.js.map +1 -1
  298. package/dist/tiers/certify.d.ts +46 -281
  299. package/dist/tiers/certify.d.ts.map +1 -1
  300. package/dist/tiers/certify.js +46 -226
  301. package/dist/tiers/certify.js.map +1 -1
  302. package/dist/tiers/ladder.d.ts +7 -51
  303. package/dist/tiers/ladder.d.ts.map +1 -1
  304. package/dist/tiers/ladder.js +13 -89
  305. package/dist/tiers/ladder.js.map +1 -1
  306. package/dist/validation/attributes.d.ts +47 -0
  307. package/dist/validation/attributes.d.ts.map +1 -0
  308. package/dist/validation/attributes.js +130 -0
  309. package/dist/validation/attributes.js.map +1 -0
  310. package/dist/validation/config-graph.d.ts +7 -56
  311. package/dist/validation/config-graph.d.ts.map +1 -1
  312. package/dist/validation/config-graph.js +15 -61
  313. package/dist/validation/config-graph.js.map +1 -1
  314. package/dist/validation/env.d.ts +53 -2
  315. package/dist/validation/env.d.ts.map +1 -1
  316. package/dist/validation/env.js +99 -4
  317. package/dist/validation/env.js.map +1 -1
  318. package/dist/validation/index.d.ts +5 -1
  319. package/dist/validation/index.d.ts.map +1 -1
  320. package/dist/validation/index.js +3 -1
  321. package/dist/validation/index.js.map +1 -1
  322. package/dist/validation/join-substitution.d.ts +22 -120
  323. package/dist/validation/join-substitution.d.ts.map +1 -1
  324. package/dist/validation/join-substitution.js +13 -90
  325. package/dist/validation/join-substitution.js.map +1 -1
  326. package/dist/validation/migration-integrity.d.ts +72 -0
  327. package/dist/validation/migration-integrity.d.ts.map +1 -0
  328. package/dist/validation/migration-integrity.js +238 -0
  329. package/dist/validation/migration-integrity.js.map +1 -0
  330. package/dist/validation/migrations.d.ts +23 -88
  331. package/dist/validation/migrations.d.ts.map +1 -1
  332. package/dist/validation/migrations.js +20 -79
  333. package/dist/validation/migrations.js.map +1 -1
  334. package/dist/validation/nodes.d.ts +3 -1
  335. package/dist/validation/nodes.d.ts.map +1 -1
  336. package/dist/validation/nodes.js +3 -1
  337. package/dist/validation/nodes.js.map +1 -1
  338. package/dist/validation/rollback.d.ts +10 -73
  339. package/dist/validation/rollback.d.ts.map +1 -1
  340. package/dist/validation/rollback.js +23 -81
  341. package/dist/validation/rollback.js.map +1 -1
  342. package/dist/validation/route-drift.d.ts +9 -62
  343. package/dist/validation/route-drift.d.ts.map +1 -1
  344. package/dist/validation/route-drift.js +7 -52
  345. package/dist/validation/route-drift.js.map +1 -1
  346. package/dist/validation/sources.d.ts +16 -94
  347. package/dist/validation/sources.d.ts.map +1 -1
  348. package/dist/validation/sources.js +51 -147
  349. package/dist/validation/sources.js.map +1 -1
  350. package/dist/worker/pool.d.ts +6 -45
  351. package/dist/worker/pool.d.ts.map +1 -1
  352. package/dist/worker/pool.js +5 -42
  353. package/dist/worker/pool.js.map +1 -1
  354. package/dist/worker/protocol.d.ts +7 -20
  355. package/dist/worker/protocol.d.ts.map +1 -1
  356. package/dist/worker/protocol.js +3 -10
  357. package/dist/worker/protocol.js.map +1 -1
  358. package/dist/worker/traversal.worker.d.ts +2 -21
  359. package/dist/worker/traversal.worker.d.ts.map +1 -1
  360. package/dist/worker/traversal.worker.js +4 -23
  361. package/dist/worker/traversal.worker.js.map +1 -1
  362. package/package.json +11 -2
@@ -1,93 +1,21 @@
1
- /**
2
- * The four capability tiers of §11A.11, expressed as requirements a machine can
3
- * check — and the ones it cannot, named as such.
4
- *
5
- * ## Why this file exists at all
6
- *
7
- * Nine adapters state a tier in a doc comment. **DEC-075 §6 says a tier is
8
- * generated from `capabilities()` and the gate results, never written in
9
- * prose**, and until now nothing implemented that, so the only tier claims in
10
- * the repository were the ones a human typed. That is the single piece of
11
- * standing dishonesty in the codebase: a claim about what works for a language,
12
- * made by the person who wanted it to be true, in a comment nothing checks.
13
- *
14
- * ## The ladder, from §11A.11
15
- *
16
- * | tier | what works | what it costs |
17
- * | --- | --- | --- |
18
- * | **S — Full** | contract *shape* matching, data propagation, oracle-derived tests | R3 + router extractor + ORM extractor |
19
- * | **A — Contract** | endpoint matching, path-level orphans, migration DAG | R2/R3 + router extractor |
20
- * | **B — Graph** | blast radius, impact scoring, test discovery, in-language root cause | R2 adapter |
21
- * | **C — Signal** | env/config, rollback readiness, hidden dependency, file-level blast radius | R0, one grammar and one query set |
22
- *
23
- * A tier is **cumulative**: S implies A implies B implies C. So a language is
24
- * awarded the highest tier whose requirements are *all* met, and the
25
- * requirements of every tier below it are re-checked rather than assumed —
26
- * because an adapter can reach R3 and still not emit a `FUNCTION`, and a ladder
27
- * that assumed monotonicity would hand it an A on the strength of its routes.
28
- *
29
- * ## What a requirement may be
30
- *
31
- * Three kinds, and the split is the honest part:
32
- *
33
- * - **`capability`** — read straight off `capabilities()`. Machine-checked, no
34
- * judgement. `capabilities()` is itself machine-checked against what the
35
- * adapter actually emitted (DEC-070), so this is evidence, not a promise.
36
- * - **`conformance`** — the corpus passes at the resolution the tier claims.
37
- * Machine-checked by running the harness.
38
- * - **`attested`** — a fact no machine in this repository can establish, so it
39
- * is *declared* with its evidence and marked as declared. There is exactly
40
- * one, and it is DEC-075's second condition: a ≥200-edge precision draw on
41
- * two repositories **the adapter's author did not choose**. A machine can
42
- * check the 200 and the two; it cannot check "did not choose", which is a
43
- * fact about a person's intent. Recording it as attested is what stops the
44
- * generator laundering a human judgement into a computed result.
45
- */
1
+ /** §11A.11's tiers (S/A/B/C, cumulative) as machine-checkable requirements —
2
+ * DEC-075 §6: a tier is generated from `capabilities()` + gate results,
3
+ * never written in prose. Requirements re-checked per tier (not assumed
4
+ * monotonic). Three kinds: `capability`/`conformance` (machine-checked),
5
+ * `attested` (DEC-075's one human-judgment fact, declared with evidence). */
46
6
  /** Highest first. The order the generator walks, and the only place it lives. */
47
7
  export const TIERS = ["S", "A", "B", "C"];
48
- // ---------------------------------------------------------------------------
49
- // There is deliberately no list of framework names here.
50
- //
51
- // The first version of this file carried three: ROUTER_EXTRACTORS with
52
- // `express`, `fastapi`, `flask`, `django`; ORM_EXTRACTORS with `sqlalchemy`,
53
- // `prisma`, `gorm`; SCHEMA_EXTRACTORS with `pydantic`, `zod`. The boundary lint
54
- // rejected all twelve, and it was right on the merits rather than pedantic:
55
- // **that is engine code above the Canonical IR knowing what a Python web
56
- // framework is called**, which is rule 1, and a list that must grow every time
57
- // anyone writes an extractor is the shape rule 1 exists to prevent.
58
- //
59
- // The fix is not an allowlist entry. It is that the requirement was
60
- // **redundant**. "A router extractor is bound" was asking, indirectly, whether
61
- // the adapter can produce routes — and the requirement immediately above it
62
- // already asks that directly, in vocabulary terms: does it emit `API_ROUTE`,
63
- // `API_ENDPOINT` and `SERVES_API`. An adapter emitting those has a router
64
- // extractor by definition, whatever it is called, and one that does not cannot
65
- // be rescued by a name in `frameworkExtractors`. The same held for the ORM
66
- // requirement against `MODEL`/`READS`/`WRITES`, and for the schema requirement
67
- // against `DTO`/`USES_TYPE`.
68
- //
69
- // So the name check bought nothing and cost the boundary. Deleting it changed
70
- // no adapter's tier, which is the evidence that it was never load-bearing.
71
- //
72
- // The general form, worth keeping: **when engine code needs to know what a
73
- // framework is, ask what it produced.** The vocabulary is the shared language
74
- // precisely so the engine never has to learn a framework's name.
75
- // ---------------------------------------------------------------------------
76
- // ---------------------------------------------------------------------------
77
- // The ladder itself.
78
- // ---------------------------------------------------------------------------
8
+ // No framework-name list here — an earlier version had one (express,
9
+ // fastapi, sqlalchemy, prisma...) and the boundary lint rejected it (rule 1:
10
+ // engine code above the IR can't name a framework). Ask what it produced instead.
79
11
  const C_REQUIREMENTS = [
80
12
  {
81
13
  id: "C.parses",
82
14
  kind: "capability",
83
15
  statement: "the adapter produces a file-level graph",
84
- // `MODULE`, not `FILE`. The vocabulary has both, and this requirement first
85
- // asked for both — at which point every adapter in the repository failed
86
- // Tier C. Checked against a real run rather than assumed: **no adapter
87
- // emits or declares `FILE`**, and `MODULE` is what a file resolves to in
88
- // all nine. A requirement no producer can satisfy does not make a generator
89
- // strict, it makes it useless, and the ladder would have been "corrected"
90
- // by whoever needed a tier first.
16
+ // `MODULE`, not `FILE` — an earlier version required both and every
17
+ // adapter failed Tier C (no adapter emits `FILE`; `MODULE` is what a
18
+ // file resolves to in all nine). Unsatisfiable requirements get "corrected" away.
91
19
  nodeTypes: ["MODULE"],
92
20
  },
93
21
  {
@@ -179,12 +107,8 @@ export const LADDER = [
179
107
  { tier: "A", name: "Contract", requires: A_REQUIREMENTS },
180
108
  { tier: "S", name: "Full", requires: S_REQUIREMENTS },
181
109
  ];
182
- /**
183
- * Every requirement a tier needs, including the tiers beneath it.
184
- *
185
- * Cumulative and re-checked rather than assumed — see the header. `C` is the
186
- * floor, so `requirementsFor("C")` is C's own list.
187
- */
110
+ /** Every requirement a tier needs, including tiers beneath it — cumulative,
111
+ * re-checked not assumed. `C` is the floor. */
188
112
  export function requirementsFor(tier) {
189
113
  const order = ["C", "B", "A", "S"];
190
114
  const upTo = order.indexOf(tier);
@@ -1 +1 @@
1
- {"version":3,"file":"ladder.js","sourceRoot":"","sources":["../../src/tiers/ladder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ladder.js","sourceRoot":"","sources":["../../src/tiers/ladder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /** Attribute-existence check (UAT round 3's 2nd of 4 missed defects): reads `attrs.unresolvedFields`
2
+ * off a READS edge, emitted only when the type's field list is provably complete (same guard
3
+ * USES_TYPE rests on). Absent = silence, never a guess. Location is the reader's file/line, not the access. */
4
+ import { type ResolutionLevel } from "@descryy/ir";
5
+ import type { AdjacencyProvider, QueryResult } from "../query/provider.ts";
6
+ export interface AttributeFinding {
7
+ /** The name read and not declared. */
8
+ readonly attribute: string;
9
+ readonly typeName: string;
10
+ readonly typeId: string;
11
+ /** The reading function's file. Null when that node carries none. */
12
+ readonly file: string | null;
13
+ /** The reading function's own starting line — see the header on precision. */
14
+ readonly line: number;
15
+ readonly detail: string;
16
+ readonly resolution: ResolutionLevel;
17
+ }
18
+ export interface AttributeReport {
19
+ readonly findings: readonly AttributeFinding[];
20
+ /** The count before `maxFindings` capped it — P27's disclosed remainder: a structured field, not only a prose note. */
21
+ readonly findingsTotal: number;
22
+ readonly examined: {
23
+ readonly typesExamined: number;
24
+ readonly readEdgesExamined: number;
25
+ /** Of those, how many carried `fields` or `unresolvedFields` at all — the signal this mechanism ran. */
26
+ readonly edgesWithFieldInfo: number;
27
+ };
28
+ /** True when at least one `READS` edge onto a type-like node carried field-existence information. */
29
+ readonly ran: boolean;
30
+ }
31
+ export interface AttributeCheckOptions {
32
+ /** Restrict to reads whose containing function sits in one of these repo-relative files. */
33
+ readonly files?: readonly string[];
34
+ readonly maxFindings?: number;
35
+ /** Cap on type-like nodes enumerated per type. Truncation is reported. */
36
+ readonly limit?: number;
37
+ }
38
+ /** Pulls attrs.unresolvedFields off a READS edge, refusing malformed entries. `hasFieldInfo` is
39
+ * true whenever `fields` or `unresolvedFields` is present — signals the producer evaluated this
40
+ * edge at all, distinguishing "looked and found nothing" from "never looked" (same as env.ts's readsAvailable). */
41
+ export declare function readUnresolvedFields(attrs: Readonly<Record<string, unknown>> | undefined): {
42
+ readonly unresolvedFields: readonly string[];
43
+ readonly hasFieldInfo: boolean;
44
+ readonly malformed: number;
45
+ };
46
+ export declare function checkAttributeExistence(provider: AdjacencyProvider, options?: AttributeCheckOptions): QueryResult<AttributeReport>;
47
+ //# sourceMappingURL=attributes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../src/validation/attributes.ts"],"names":[],"mappings":"AAAA;;gHAEgH;AAEhH,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,KAAK,EAAE,iBAAiB,EAAc,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEvF,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC/C,uHAAuH;IACvH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnC,wGAAwG;QACxG,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;KACrC,CAAC;IACF,qGAAqG;IACrG,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAID;;oHAEoH;AACpH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,GAAG;IAC1F,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAeA;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE,qBAA0B,GAClC,WAAW,CAAC,eAAe,CAAC,CA6H9B"}
@@ -0,0 +1,130 @@
1
+ /** Attribute-existence check (UAT round 3's 2nd of 4 missed defects): reads `attrs.unresolvedFields`
2
+ * off a READS edge, emitted only when the type's field list is provably complete (same guard
3
+ * USES_TYPE rests on). Absent = silence, never a guess. Location is the reader's file/line, not the access. */
4
+ import { TYPE_LIKE_NODE_TYPES } from "@descryy/ir";
5
+ const DEFAULT_MAX_FINDINGS = 25;
6
+ /** Pulls attrs.unresolvedFields off a READS edge, refusing malformed entries. `hasFieldInfo` is
7
+ * true whenever `fields` or `unresolvedFields` is present — signals the producer evaluated this
8
+ * edge at all, distinguishing "looked and found nothing" from "never looked" (same as env.ts's readsAvailable). */
9
+ export function readUnresolvedFields(attrs) {
10
+ if (attrs === undefined)
11
+ return { unresolvedFields: [], hasFieldInfo: false, malformed: 0 };
12
+ const rawUnresolved = attrs["unresolvedFields"];
13
+ const rawFields = attrs["fields"];
14
+ const hasFieldInfo = Array.isArray(rawUnresolved) || Array.isArray(rawFields);
15
+ if (!Array.isArray(rawUnresolved))
16
+ return { unresolvedFields: [], hasFieldInfo, malformed: 0 };
17
+ const unresolvedFields = [];
18
+ let malformed = 0;
19
+ for (const entry of rawUnresolved) {
20
+ if (typeof entry === "string" && entry !== "")
21
+ unresolvedFields.push(entry);
22
+ else
23
+ malformed += 1;
24
+ }
25
+ return { unresolvedFields, hasFieldInfo, malformed };
26
+ }
27
+ export function checkAttributeExistence(provider, options = {}) {
28
+ const maxFindings = options.maxFindings ?? DEFAULT_MAX_FINDINGS;
29
+ const scoped = options.files === undefined ? null : new Set(options.files);
30
+ const notes = [];
31
+ let typesExamined = 0;
32
+ let readEdgesExamined = 0;
33
+ let edgesWithFieldInfo = 0;
34
+ let malformed = 0;
35
+ let typesTruncated = false;
36
+ const findings = [];
37
+ for (const type of TYPE_LIKE_NODE_TYPES) {
38
+ const set = options.limit === undefined ? provider.nodesOfType(type) : provider.nodesOfType(type, options.limit);
39
+ typesTruncated = typesTruncated || set.truncated;
40
+ for (const typeNode of set.nodes) {
41
+ typesExamined += 1;
42
+ const edges = provider.incoming(typeNode.id, { types: ["READS"] });
43
+ for (const edge of edges) {
44
+ readEdgesExamined += 1;
45
+ const extracted = readUnresolvedFields(edge.attrs);
46
+ malformed += extracted.malformed;
47
+ if (extracted.hasFieldInfo)
48
+ edgesWithFieldInfo += 1;
49
+ if (extracted.unresolvedFields.length === 0)
50
+ continue;
51
+ const from = provider.node(edge.from);
52
+ const path = from?.file ?? null;
53
+ if (scoped !== null && (path === null || !scoped.has(path)))
54
+ continue;
55
+ const where = path === null ? null : from?.range !== null && from?.range !== undefined
56
+ ? `${path}:${from.range.startLine}`
57
+ : path;
58
+ for (const attribute of extracted.unresolvedFields) {
59
+ findings.push({
60
+ attribute,
61
+ typeName: typeNode.name,
62
+ typeId: typeNode.id,
63
+ file: path,
64
+ line: from?.range?.startLine ?? 0,
65
+ detail: `${attribute} is read on a value typed ${typeNode.name}` +
66
+ (where === null ? "" : ` (in the function at ${where})`) +
67
+ `, and ${typeNode.name}'s own field list — provably complete for this type at the ` +
68
+ "resolution this run reached — does not declare it. Any call reaching this read " +
69
+ "raises when it runs. This is not proof the attribute never exists at runtime: a " +
70
+ "dynamically assigned attribute, a mixin declared outside this graph, or a field a " +
71
+ "mapping layer adds without a matching declaration could each still make the read " +
72
+ "valid — it reports absence from the declaration this run resolved, not absence at " +
73
+ "runtime.",
74
+ resolution: edge.resolution,
75
+ });
76
+ }
77
+ }
78
+ }
79
+ }
80
+ findings.sort((a, b) => a.typeName.localeCompare(b.typeName) ||
81
+ a.attribute.localeCompare(b.attribute) ||
82
+ (a.file ?? "").localeCompare(b.file ?? ""));
83
+ const kept = findings.slice(0, maxFindings);
84
+ const ran = edgesWithFieldInfo > 0;
85
+ if (readEdgesExamined === 0) {
86
+ notes.push("No READS edge onto a CLASS, MODEL or DTO node was found in the graph. This check reads " +
87
+ "attrs.unresolvedFields on such an edge — either no code in this graph reads an attribute " +
88
+ "of a modeled type, or no adapter reached the resolution this check needs. This is not a " +
89
+ "result of every read being valid.");
90
+ }
91
+ else if (!ran) {
92
+ notes.push(`${readEdgesExamined} READS edge(s) onto a type-like node were found, and none carried ` +
93
+ "attrs.fields or attrs.unresolvedFields — the field-existence signal this check reads. No " +
94
+ "adapter on this run supplied it, so nothing here could be checked against a declared " +
95
+ "type. This is not a result of zero missing attributes.");
96
+ }
97
+ if (malformed > 0) {
98
+ notes.push(`${malformed} unresolvedFields entry(ies) were dropped as malformed — a row that was not a ` +
99
+ "non-empty string. Dropped rather than guessed at.");
100
+ }
101
+ if (scoped !== null) {
102
+ notes.push(`The read side was restricted to ${scoped.size} scoped file(s), by the file of the function ` +
103
+ "doing the read.");
104
+ }
105
+ if (kept.length < findings.length) {
106
+ notes.push(`${findings.length - kept.length} further finding(s) were withheld: a report is capped at ` +
107
+ `${maxFindings} so a short list stays worth reading. They were found, not missed.`);
108
+ }
109
+ if (typesTruncated) {
110
+ notes.push("More CLASS/MODEL/DTO nodes exist in the graph than were enumerated, so this check covers a " +
111
+ "prefix of the repository's declared types rather than all of them.");
112
+ }
113
+ let resolutionFloor = 4;
114
+ for (const finding of kept)
115
+ if (finding.resolution < resolutionFloor)
116
+ resolutionFloor = finding.resolution;
117
+ const stamp = { ...provider.baseStamp(), resolutionFloor };
118
+ return {
119
+ data: {
120
+ findings: kept,
121
+ findingsTotal: findings.length,
122
+ examined: { typesExamined, readEdgesExamined, edgesWithFieldInfo },
123
+ ran,
124
+ },
125
+ stamp,
126
+ truncated: typesTruncated || kept.length < findings.length,
127
+ notes,
128
+ };
129
+ }
130
+ //# sourceMappingURL=attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../src/validation/attributes.ts"],"names":[],"mappings":"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"}
@@ -1,51 +1,8 @@
1
- /**
2
- * §15.3's config dependency graph — *"track env vars, secrets, flags, config
3
- * files and what uses them"*, and the row whose note reads *"feeds the
4
- * deploy-target check"*.
5
- *
6
- * ## This is a query, not a check, and the distinction is the design
7
- *
8
- * Checks 1 and 2 emit findings. This one emits **structure**: for every variable
9
- * the repository knows about, where it is declared, where it is read, and what
10
- * transitively depends on the files that read it. §15.3 says it feeds check 1,
11
- * and that is exactly what it is for — a missing variable read by a module forty
12
- * others import is a different sentence from one read by a single script, and
13
- * until now the check had no way to tell them apart.
14
- *
15
- * Because it produces no findings of its own, it has **no precision gate of its
16
- * own**, and that is stated rather than quietly skipped. Its correctness rests
17
- * entirely on the `IMPORTS` edges beneath it, whose precision is already gated
18
- * elsewhere. What this module can get wrong on its own is the *join* — attaching
19
- * the wrong file to a variable — and that is what its bench exercises.
20
- *
21
- * ## No new vocabulary, which is the whole reason it is shaped this way
22
- *
23
- * *"New capabilities are new queries over these edges, not new types."* A
24
- * variable still has no node (DEC-120). The dependent set is `scopeChange`
25
- * seeded with the **file that reads the variable** — impact flowing outward from
26
- * a changed file is precisely the existing traversal, with its budgets, its decay
27
- * scoring and its truncation disclosure already correct.
28
- *
29
- * Taking the scope rather than re-deriving it is deliberate: a second traversal
30
- * with its own rules would drift from the one the rest of the engine uses, and
31
- * the first symptom would be two different blast radiuses for the same file.
32
- *
33
- * ## Why R1, and what it degrades to
34
- *
35
- * Reaching *"what depends on this"* needs module resolution — `IMPORTS` edges
36
- * that actually resolve. At R0 there are none, so the dependent set is empty and
37
- * the report says the graph carried no import edges rather than reporting zero
38
- * dependents as a fact. **An empty dependent set from a graph with no imports and
39
- * an empty one from a genuinely unimported module are different statements**, and
40
- * only the second is information.
41
- *
42
- * ## The completeness fence
43
- *
44
- * Every count here is *what this graph can see* and is worded that way. NFR-9's
45
- * rule, and §15.3's own instruction for the neighbouring DB-impact check —
46
- * *"output must state what the tool can see, never implying completeness"* —
47
- * applies with equal force: a dependent set is a lower bound, always.
48
- */
1
+ /** §15.3's config dependency graph — a query, not a check: emits structure
2
+ * (which files transitively depend on a var's reader), no findings, so no
3
+ * precision gate of its own; correctness rests on `IMPORTS` edge precision.
4
+ * No new vocabulary — a var has no node (DEC-120); reuses `scopeChange`.
5
+ * Needs R1 (import resolution) or dependents are unknown, never zero. */
49
6
  import type { AdjacencyProvider, QueryResult } from "../query/provider.ts";
50
7
  import type { SurfaceScan } from "./sources.ts";
51
8
  export interface ConfigDeclaration {
@@ -64,14 +21,8 @@ export interface ConfigVariable {
64
21
  readonly name: string;
65
22
  readonly declaredAt: readonly ConfigDeclaration[];
66
23
  readonly readAt: readonly ConfigReadSite[];
67
- /**
68
- * Files that transitively depend on a file reading this variable, as far as
69
- * this graph can see.
70
- *
71
- * **A lower bound, never a total.** Null when the dependent set could not be
72
- * computed at all — no reading file is in the graph, or the graph carries no
73
- * import edges — which is not the same as zero.
74
- */
24
+ /** Files transitively depending on a reader of this variable — a lower
25
+ * bound, never a total. Null (not zero) when it couldn't be computed. */
75
26
  readonly dependents: number | null;
76
27
  /** A few dependent files, for a reader who wants to look. */
77
28
  readonly dependentSample: readonly string[];
@@ -1 +1 @@
1
- {"version":3,"file":"config-graph.d.ts","sourceRoot":"","sources":["../../src/validation/config-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAc,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,yDAAyD;IACzD,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,8DAA8D;QAC9D,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;KACjC,CAAC;IACF,qEAAqE;IACrE,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,oCAAoC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,kBAAuB,GAC/B,WAAW,CAAC,WAAW,CAAC,CAgL1B"}
1
+ {"version":3,"file":"config-graph.d.ts","sourceRoot":"","sources":["../../src/validation/config-graph.ts"],"names":[],"mappings":"AAAA;;;;0EAI0E;AAI1E,OAAO,KAAK,EAAE,iBAAiB,EAAc,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C;8EAC0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,yDAAyD;IACzD,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,8DAA8D;QAC9D,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;KACjC,CAAC;IACF,qEAAqE;IACrE,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,oCAAoC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,kBAAuB,GAC/B,WAAW,CAAC,WAAW,CAAC,CA6K1B"}
@@ -1,51 +1,8 @@
1
- /**
2
- * §15.3's config dependency graph — *"track env vars, secrets, flags, config
3
- * files and what uses them"*, and the row whose note reads *"feeds the
4
- * deploy-target check"*.
5
- *
6
- * ## This is a query, not a check, and the distinction is the design
7
- *
8
- * Checks 1 and 2 emit findings. This one emits **structure**: for every variable
9
- * the repository knows about, where it is declared, where it is read, and what
10
- * transitively depends on the files that read it. §15.3 says it feeds check 1,
11
- * and that is exactly what it is for — a missing variable read by a module forty
12
- * others import is a different sentence from one read by a single script, and
13
- * until now the check had no way to tell them apart.
14
- *
15
- * Because it produces no findings of its own, it has **no precision gate of its
16
- * own**, and that is stated rather than quietly skipped. Its correctness rests
17
- * entirely on the `IMPORTS` edges beneath it, whose precision is already gated
18
- * elsewhere. What this module can get wrong on its own is the *join* — attaching
19
- * the wrong file to a variable — and that is what its bench exercises.
20
- *
21
- * ## No new vocabulary, which is the whole reason it is shaped this way
22
- *
23
- * *"New capabilities are new queries over these edges, not new types."* A
24
- * variable still has no node (DEC-120). The dependent set is `scopeChange`
25
- * seeded with the **file that reads the variable** — impact flowing outward from
26
- * a changed file is precisely the existing traversal, with its budgets, its decay
27
- * scoring and its truncation disclosure already correct.
28
- *
29
- * Taking the scope rather than re-deriving it is deliberate: a second traversal
30
- * with its own rules would drift from the one the rest of the engine uses, and
31
- * the first symptom would be two different blast radiuses for the same file.
32
- *
33
- * ## Why R1, and what it degrades to
34
- *
35
- * Reaching *"what depends on this"* needs module resolution — `IMPORTS` edges
36
- * that actually resolve. At R0 there are none, so the dependent set is empty and
37
- * the report says the graph carried no import edges rather than reporting zero
38
- * dependents as a fact. **An empty dependent set from a graph with no imports and
39
- * an empty one from a genuinely unimported module are different statements**, and
40
- * only the second is information.
41
- *
42
- * ## The completeness fence
43
- *
44
- * Every count here is *what this graph can see* and is worded that way. NFR-9's
45
- * rule, and §15.3's own instruction for the neighbouring DB-impact check —
46
- * *"output must state what the tool can see, never implying completeness"* —
47
- * applies with equal force: a dependent set is a lower bound, always.
48
- */
1
+ /** §15.3's config dependency graph — a query, not a check: emits structure
2
+ * (which files transitively depend on a var's reader), no findings, so no
3
+ * precision gate of its own; correctness rests on `IMPORTS` edge precision.
4
+ * No new vocabulary — a var has no node (DEC-120); reuses `scopeChange`.
5
+ * Needs R1 (import resolution) or dependents are unknown, never zero. */
49
6
  import { scopeChange } from "../scoping/traverse.js";
50
7
  import { readEnvReads } from "./env.js";
51
8
  import { fileScopedNodes } from "./nodes.js";
@@ -56,7 +13,7 @@ export function buildConfigGraph(provider, scan, options = {}) {
56
13
  const maxTraversals = options.maxTraversals ?? DEFAULT_MAX_TRAVERSALS;
57
14
  const budget = options.budget ?? DEFAULT_BUDGET;
58
15
  const notes = [];
59
- // --- declarations, from the repository -----------------------------------
16
+ // declarations, from the repository
60
17
  const declarations = new Map();
61
18
  for (const surface of scan.surfaces) {
62
19
  for (const declaration of surface.declarations) {
@@ -71,7 +28,7 @@ export function buildConfigGraph(provider, scan, options = {}) {
71
28
  });
72
29
  }
73
30
  }
74
- // --- reads, from the graph -----------------------------------------------
31
+ // reads, from the graph
75
32
  const files = fileScopedNodes(provider, options.limit);
76
33
  const reads = new Map();
77
34
  const readingFile = new Map();
@@ -80,9 +37,8 @@ export function buildConfigGraph(provider, scan, options = {}) {
80
37
  const path = node.file;
81
38
  if (path === null)
82
39
  continue;
83
- // Counted across every file, not only the reading ones: "this graph has no
84
- // import edges" is a property of the graph, and sampling it from the files
85
- // that happen to read configuration would be a property of those files.
40
+ // Counted across every file, not only reading ones — "no import edges"
41
+ // is a property of the graph, not of the files that read config.
86
42
  importEdges += provider.outgoing(node.id, { types: ["IMPORTS"], limit: 1 }).length;
87
43
  const extracted = readEnvReads(node.attrs, path, node.resolution);
88
44
  if (extracted.reads.length === 0)
@@ -96,7 +52,7 @@ export function buildConfigGraph(provider, scan, options = {}) {
96
52
  }
97
53
  }
98
54
  const importsAvailable = importEdges > 0;
99
- // --- assemble, and traverse for the ones worth traversing ----------------
55
+ // assemble, and traverse for the ones worth traversing
100
56
  const names = [...new Set([...declarations.keys(), ...reads.keys()])].sort();
101
57
  const variables = [];
102
58
  let declaredOnly = 0;
@@ -106,9 +62,8 @@ export function buildConfigGraph(provider, scan, options = {}) {
106
62
  let traversals = 0;
107
63
  let floor = 4;
108
64
  let anyTruncated = false;
109
- // Variables with a read site come first: a dependent set is only meaningful
110
- // for one with a reading file, and the traversal budget should not be spent on
111
- // declarations nothing reads.
65
+ // Read-site variables first — a dependent set means nothing without a
66
+ // reading file, and the traversal budget shouldn't go to unread declarations.
112
67
  const ordered = names.sort((a, b) => {
113
68
  const ar = reads.has(a) ? 0 : 1;
114
69
  const br = reads.has(b) ? 0 : 1;
@@ -133,9 +88,8 @@ export function buildConfigGraph(provider, scan, options = {}) {
133
88
  if (seeds.length > 0 && importsAvailable && traversals < maxTraversals) {
134
89
  traversals += 1;
135
90
  const scope = scopeChange(provider, [...new Set(seeds)], { budget });
136
- // `changed` is the seed set itself — the files that read the variable —
137
- // so the dependent count is `affected` alone. Including the seeds would
138
- // report a variable read in one file as having one dependent.
91
+ // `changed` is the seed set (readers) itself, so count is `affected`
92
+ // alone — including seeds would give a single-file var one dependent.
139
93
  const affected = scope.data.affected;
140
94
  dependents = affected.length;
141
95
  dependentSample = affected
@@ -159,7 +113,7 @@ export function buildConfigGraph(provider, scan, options = {}) {
159
113
  });
160
114
  }
161
115
  variables.sort((a, b) => (b.dependents ?? -1) - (a.dependents ?? -1) || a.name.localeCompare(b.name));
162
- // --- disclosures ---------------------------------------------------------
116
+ // disclosures
163
117
  if (!importsAvailable) {
164
118
  notes.push("No resolved import edge is in this graph, so no dependent set could be computed for any " +
165
119
  "variable. Every dependent count is reported as unknown rather than as zero: a module " +
@@ -1 +1 @@
1
- {"version":3,"file":"config-graph.js","sourceRoot":"","sources":["../../src/validation/config-graph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-graph.js","sourceRoot":"","sources":["../../src/validation/config-graph.ts"],"names":[],"mappings":"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"}