@shrkcrft/cli 0.1.0-alpha.30 → 0.1.0-alpha.31

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 (510) hide show
  1. package/dist/asset-preview/apply-asset-preview.js +1 -1
  2. package/dist/authoring/authoring-kit.d.ts +9 -1
  3. package/dist/authoring/authoring-kit.d.ts.map +1 -1
  4. package/dist/authoring/authoring-kit.js +26 -13
  5. package/dist/bootstrap/unlinked-workspace-dependency.d.ts +11 -0
  6. package/dist/bootstrap/unlinked-workspace-dependency.d.ts.map +1 -0
  7. package/dist/bootstrap/unlinked-workspace-dependency.js +99 -0
  8. package/dist/command-registry.d.ts +100 -1
  9. package/dist/command-registry.d.ts.map +1 -1
  10. package/dist/command-registry.js +130 -3
  11. package/dist/commands/api-diff.command.d.ts.map +1 -1
  12. package/dist/commands/api-diff.command.js +12 -0
  13. package/dist/commands/apply.command.d.ts.map +1 -1
  14. package/dist/commands/apply.command.js +3 -0
  15. package/dist/commands/arch.command.d.ts.map +1 -1
  16. package/dist/commands/arch.command.js +26 -7
  17. package/dist/commands/architecture.command.d.ts.map +1 -1
  18. package/dist/commands/architecture.command.js +8 -2
  19. package/dist/commands/baseline.command.d.ts +54 -3
  20. package/dist/commands/baseline.command.d.ts.map +1 -1
  21. package/dist/commands/baseline.command.js +582 -74
  22. package/dist/commands/biome.command.d.ts.map +1 -1
  23. package/dist/commands/biome.command.js +20 -0
  24. package/dist/commands/boundaries.command.d.ts +9 -1
  25. package/dist/commands/boundaries.command.d.ts.map +1 -1
  26. package/dist/commands/boundaries.command.js +88 -20
  27. package/dist/commands/bundle.command.d.ts.map +1 -1
  28. package/dist/commands/bundle.command.js +57 -11
  29. package/dist/commands/cache-align.command.d.ts.map +1 -1
  30. package/dist/commands/cache-align.command.js +3 -1
  31. package/dist/commands/changelog-data.d.ts.map +1 -1
  32. package/dist/commands/changelog-data.js +138 -0
  33. package/dist/commands/changes.command.d.ts.map +1 -1
  34. package/dist/commands/changes.command.js +15 -0
  35. package/dist/commands/check.command.d.ts.map +1 -1
  36. package/dist/commands/check.command.js +1241 -322
  37. package/dist/commands/checks.command.d.ts.map +1 -1
  38. package/dist/commands/checks.command.js +188 -40
  39. package/dist/commands/ci.command.d.ts.map +1 -1
  40. package/dist/commands/ci.command.js +35 -2
  41. package/dist/commands/code-intel.command.d.ts.map +1 -1
  42. package/dist/commands/code-intel.command.js +3 -0
  43. package/dist/commands/command-catalog.d.ts +23 -1
  44. package/dist/commands/command-catalog.d.ts.map +1 -1
  45. package/dist/commands/command-catalog.js +152 -35
  46. package/dist/commands/commands.command.d.ts +21 -3
  47. package/dist/commands/commands.command.d.ts.map +1 -1
  48. package/dist/commands/commands.command.js +172 -27
  49. package/dist/commands/compress.command.d.ts.map +1 -1
  50. package/dist/commands/compress.command.js +4 -0
  51. package/dist/commands/constructs.command.d.ts.map +1 -1
  52. package/dist/commands/constructs.command.js +50 -12
  53. package/dist/commands/context.command.d.ts.map +1 -1
  54. package/dist/commands/context.command.js +40 -5
  55. package/dist/commands/contract-templates.command.d.ts.map +1 -1
  56. package/dist/commands/contract-templates.command.js +9 -1
  57. package/dist/commands/contract.command.d.ts.map +1 -1
  58. package/dist/commands/contract.command.js +35 -0
  59. package/dist/commands/conventions.command.d.ts.map +1 -1
  60. package/dist/commands/conventions.command.js +189 -29
  61. package/dist/commands/coverage.command.d.ts.map +1 -1
  62. package/dist/commands/coverage.command.js +9 -0
  63. package/dist/commands/daily.commands.d.ts +0 -1
  64. package/dist/commands/daily.commands.d.ts.map +1 -1
  65. package/dist/commands/daily.commands.js +12 -76
  66. package/dist/commands/dashboard.command.d.ts.map +1 -1
  67. package/dist/commands/dashboard.command.js +10 -0
  68. package/dist/commands/dev.command.d.ts.map +1 -1
  69. package/dist/commands/dev.command.js +45 -2
  70. package/dist/commands/diagnostics.command.d.ts +0 -2
  71. package/dist/commands/diagnostics.command.d.ts.map +1 -1
  72. package/dist/commands/diagnostics.command.js +5 -78
  73. package/dist/commands/diff-check.command.d.ts +6 -4
  74. package/dist/commands/diff-check.command.d.ts.map +1 -1
  75. package/dist/commands/diff-check.command.js +190 -103
  76. package/dist/commands/docs-references.command.d.ts +13 -0
  77. package/dist/commands/docs-references.command.d.ts.map +1 -1
  78. package/dist/commands/docs-references.command.js +269 -72
  79. package/dist/commands/doctor.command.d.ts.map +1 -1
  80. package/dist/commands/doctor.command.js +58 -4
  81. package/dist/commands/drift.command.d.ts.map +1 -1
  82. package/dist/commands/drift.command.js +17 -4
  83. package/dist/commands/eslint.command.d.ts.map +1 -1
  84. package/dist/commands/eslint.command.js +20 -0
  85. package/dist/commands/export.command.d.ts.map +1 -1
  86. package/dist/commands/export.command.js +23 -1
  87. package/dist/commands/feedback-dispatch.command.d.ts.map +1 -1
  88. package/dist/commands/feedback-dispatch.command.js +29 -0
  89. package/dist/commands/feedback.command.d.ts.map +1 -1
  90. package/dist/commands/feedback.command.js +6 -1
  91. package/dist/commands/finish.command.d.ts.map +1 -1
  92. package/dist/commands/finish.command.js +32 -8
  93. package/dist/commands/fix.command.d.ts.map +1 -1
  94. package/dist/commands/fix.command.js +19 -0
  95. package/dist/commands/gate.command.d.ts +6 -1
  96. package/dist/commands/gate.command.d.ts.map +1 -1
  97. package/dist/commands/gate.command.js +50 -124
  98. package/dist/commands/gates.command.d.ts +52 -0
  99. package/dist/commands/gates.command.d.ts.map +1 -1
  100. package/dist/commands/gates.command.js +811 -185
  101. package/dist/commands/gen.command.d.ts.map +1 -1
  102. package/dist/commands/gen.command.js +4 -0
  103. package/dist/commands/generated.command.d.ts +33 -3
  104. package/dist/commands/generated.command.d.ts.map +1 -1
  105. package/dist/commands/generated.command.js +499 -147
  106. package/dist/commands/graph-code-subverbs.d.ts +15 -0
  107. package/dist/commands/graph-code-subverbs.d.ts.map +1 -1
  108. package/dist/commands/graph-code-subverbs.js +198 -24
  109. package/dist/commands/graph.command.d.ts.map +1 -1
  110. package/dist/commands/graph.command.js +79 -37
  111. package/dist/commands/help.command.d.ts +30 -6
  112. package/dist/commands/help.command.d.ts.map +1 -1
  113. package/dist/commands/help.command.js +323 -199
  114. package/dist/commands/helper.command.d.ts +1 -0
  115. package/dist/commands/helper.command.d.ts.map +1 -1
  116. package/dist/commands/helper.command.js +195 -56
  117. package/dist/commands/impact.command.d.ts.map +1 -1
  118. package/dist/commands/impact.command.js +115 -12
  119. package/dist/commands/infer.command.d.ts.map +1 -1
  120. package/dist/commands/infer.command.js +20 -45
  121. package/dist/commands/ingest.command.d.ts +0 -1
  122. package/dist/commands/ingest.command.d.ts.map +1 -1
  123. package/dist/commands/ingest.command.js +25 -41
  124. package/dist/commands/knowledge-author.command.d.ts +0 -3
  125. package/dist/commands/knowledge-author.command.d.ts.map +1 -1
  126. package/dist/commands/knowledge-author.command.js +10 -23
  127. package/dist/commands/knowledge.command.d.ts.map +1 -1
  128. package/dist/commands/knowledge.command.js +469 -129
  129. package/dist/commands/languages.command.d.ts.map +1 -1
  130. package/dist/commands/languages.command.js +27 -0
  131. package/dist/commands/lint.command.d.ts.map +1 -1
  132. package/dist/commands/lint.command.js +3 -0
  133. package/dist/commands/mcp.command.d.ts +18 -0
  134. package/dist/commands/mcp.command.d.ts.map +1 -1
  135. package/dist/commands/mcp.command.js +33 -8
  136. package/dist/commands/onboard.command.d.ts.map +1 -1
  137. package/dist/commands/onboard.command.js +20 -0
  138. package/dist/commands/owners.command.d.ts.map +1 -1
  139. package/dist/commands/owners.command.js +14 -2
  140. package/dist/commands/packs-new.d.ts +13 -1
  141. package/dist/commands/packs-new.d.ts.map +1 -1
  142. package/dist/commands/packs-new.js +500 -335
  143. package/dist/commands/packs.command.d.ts.map +1 -1
  144. package/dist/commands/packs.command.js +378 -36
  145. package/dist/commands/paths.command.d.ts.map +1 -1
  146. package/dist/commands/paths.command.js +9 -1
  147. package/dist/commands/pipelines.command.d.ts.map +1 -1
  148. package/dist/commands/pipelines.command.js +7 -1
  149. package/dist/commands/plan-check.command.d.ts.map +1 -1
  150. package/dist/commands/plan-check.command.js +3 -0
  151. package/dist/commands/plan.command.d.ts.map +1 -1
  152. package/dist/commands/plan.command.js +3 -0
  153. package/dist/commands/playbooks.command.d.ts.map +1 -1
  154. package/dist/commands/playbooks.command.js +7 -2
  155. package/dist/commands/policy-lint.command.d.ts +19 -2
  156. package/dist/commands/policy-lint.command.d.ts.map +1 -1
  157. package/dist/commands/policy-lint.command.js +224 -65
  158. package/dist/commands/policy.command.d.ts.map +1 -1
  159. package/dist/commands/policy.command.js +6 -1
  160. package/dist/commands/pr.command.d.ts.map +1 -1
  161. package/dist/commands/pr.command.js +14 -0
  162. package/dist/commands/presets.command.d.ts.map +1 -1
  163. package/dist/commands/presets.command.js +12 -27
  164. package/dist/commands/profiles.command.d.ts.map +1 -1
  165. package/dist/commands/profiles.command.js +94 -26
  166. package/dist/commands/provenance.command.js +1 -1
  167. package/dist/commands/quality.command.d.ts.map +1 -1
  168. package/dist/commands/quality.command.js +129 -33
  169. package/dist/commands/recommend.command.d.ts +20 -4
  170. package/dist/commands/recommend.command.d.ts.map +1 -1
  171. package/dist/commands/recommend.command.js +172 -278
  172. package/dist/commands/registrations.command.d.ts.map +1 -1
  173. package/dist/commands/registrations.command.js +138 -13
  174. package/dist/commands/registry-lifecycle-run.d.ts +14 -0
  175. package/dist/commands/registry-lifecycle-run.d.ts.map +1 -0
  176. package/dist/commands/registry-lifecycle-run.js +336 -0
  177. package/dist/commands/registry.command.d.ts.map +1 -1
  178. package/dist/commands/registry.command.js +235 -62
  179. package/dist/commands/release.command.d.ts.map +1 -1
  180. package/dist/commands/release.command.js +99 -20
  181. package/dist/commands/report.command.d.ts.map +1 -1
  182. package/dist/commands/report.command.js +38 -2
  183. package/dist/commands/reuse-coverage.command.d.ts +23 -0
  184. package/dist/commands/reuse-coverage.command.d.ts.map +1 -0
  185. package/dist/commands/reuse-coverage.command.js +536 -0
  186. package/dist/commands/reuse.command.d.ts +3 -18
  187. package/dist/commands/reuse.command.d.ts.map +1 -1
  188. package/dist/commands/reuse.command.js +395 -244
  189. package/dist/commands/review.command.d.ts.map +1 -1
  190. package/dist/commands/review.command.js +33 -1
  191. package/dist/commands/rounds.command.d.ts.map +1 -1
  192. package/dist/commands/rounds.command.js +5 -0
  193. package/dist/commands/safety.command.d.ts.map +1 -1
  194. package/dist/commands/safety.command.js +9 -0
  195. package/dist/commands/scaffolds.command.d.ts.map +1 -1
  196. package/dist/commands/scaffolds.command.js +97 -25
  197. package/dist/commands/search.command.d.ts +0 -8
  198. package/dist/commands/search.command.d.ts.map +1 -1
  199. package/dist/commands/search.command.js +136 -28
  200. package/dist/commands/self-config-xrefs.command.d.ts +24 -0
  201. package/dist/commands/self-config-xrefs.command.d.ts.map +1 -0
  202. package/dist/commands/self-config-xrefs.command.js +170 -0
  203. package/dist/commands/self-config.command.d.ts.map +1 -1
  204. package/dist/commands/self-config.command.js +261 -65
  205. package/dist/commands/smart-context.command.d.ts.map +1 -1
  206. package/dist/commands/smart-context.command.js +39 -3
  207. package/dist/commands/spec.command.d.ts.map +1 -1
  208. package/dist/commands/spec.command.js +3 -0
  209. package/dist/commands/stats.command.d.ts.map +1 -1
  210. package/dist/commands/stats.command.js +3 -0
  211. package/dist/commands/surface.command.d.ts +6 -1
  212. package/dist/commands/surface.command.d.ts.map +1 -1
  213. package/dist/commands/surface.command.js +256 -54
  214. package/dist/commands/task-context.command.js +1 -1
  215. package/dist/commands/task.command.d.ts.map +1 -1
  216. package/dist/commands/task.command.js +22 -1
  217. package/dist/commands/templates.command.d.ts +4 -0
  218. package/dist/commands/templates.command.d.ts.map +1 -1
  219. package/dist/commands/templates.command.js +109 -22
  220. package/dist/commands/test.command.d.ts.map +1 -1
  221. package/dist/commands/test.command.js +161 -33
  222. package/dist/commands/tests.command.d.ts.map +1 -1
  223. package/dist/commands/tests.command.js +29 -3
  224. package/dist/commands/trace.command.d.ts.map +1 -1
  225. package/dist/commands/trace.command.js +29 -4
  226. package/dist/commands/watch.command.d.ts.map +1 -1
  227. package/dist/commands/watch.command.js +3 -0
  228. package/dist/commands/why.command.d.ts.map +1 -1
  229. package/dist/commands/why.command.js +3 -0
  230. package/dist/commands/wiring.command.d.ts +18 -4
  231. package/dist/commands/wiring.command.d.ts.map +1 -1
  232. package/dist/commands/wiring.command.js +360 -73
  233. package/dist/dashboard/code-intelligence-data.js +4 -4
  234. package/dist/diff/deleted-orphan-coverage.d.ts +32 -0
  235. package/dist/diff/deleted-orphan-coverage.d.ts.map +1 -0
  236. package/dist/diff/deleted-orphan-coverage.js +107 -0
  237. package/dist/diff/deleted-orphan-scope-notes.d.ts +23 -0
  238. package/dist/diff/deleted-orphan-scope-notes.d.ts.map +1 -0
  239. package/dist/diff/deleted-orphan-scope-notes.js +49 -0
  240. package/dist/diff/deleted-orphans.d.ts +32 -0
  241. package/dist/diff/deleted-orphans.d.ts.map +1 -1
  242. package/dist/diff/deleted-orphans.js +42 -2
  243. package/dist/dispatch/closest-match.d.ts +15 -0
  244. package/dist/dispatch/closest-match.d.ts.map +1 -0
  245. package/dist/dispatch/closest-match.js +47 -0
  246. package/dist/dispatch/global-flags.d.ts +94 -0
  247. package/dist/dispatch/global-flags.d.ts.map +1 -0
  248. package/dist/dispatch/global-flags.js +123 -0
  249. package/dist/dispatch/guard-invocation-input.d.ts +24 -0
  250. package/dist/dispatch/guard-invocation-input.d.ts.map +1 -0
  251. package/dist/dispatch/guard-invocation-input.js +1 -0
  252. package/dist/dispatch/guard-invocation.d.ts +33 -0
  253. package/dist/dispatch/guard-invocation.d.ts.map +1 -0
  254. package/dist/dispatch/guard-invocation.js +183 -0
  255. package/dist/dispatch/help-intercept.d.ts +22 -0
  256. package/dist/dispatch/help-intercept.d.ts.map +1 -0
  257. package/dist/dispatch/help-intercept.js +42 -0
  258. package/dist/dispatch/i-declared-invocation.d.ts +17 -0
  259. package/dist/dispatch/i-declared-invocation.d.ts.map +1 -0
  260. package/dist/dispatch/i-declared-invocation.js +1 -0
  261. package/dist/dispatch/i-unknown-flag-refusal-input.d.ts +28 -0
  262. package/dist/dispatch/i-unknown-flag-refusal-input.d.ts.map +1 -0
  263. package/dist/dispatch/i-unknown-flag-refusal-input.js +1 -0
  264. package/dist/dispatch/invocation-rejection-kind.d.ts +15 -0
  265. package/dist/dispatch/invocation-rejection-kind.d.ts.map +1 -0
  266. package/dist/dispatch/invocation-rejection-kind.js +15 -0
  267. package/dist/dispatch/invocation-rejection.d.ts +18 -0
  268. package/dist/dispatch/invocation-rejection.d.ts.map +1 -0
  269. package/dist/dispatch/invocation-rejection.js +1 -0
  270. package/dist/dispatch/judge-invocation.d.ts +24 -0
  271. package/dist/dispatch/judge-invocation.d.ts.map +1 -0
  272. package/dist/dispatch/judge-invocation.js +50 -0
  273. package/dist/dispatch/positional-mode.d.ts +18 -0
  274. package/dist/dispatch/positional-mode.d.ts.map +1 -0
  275. package/dist/dispatch/positional-mode.js +18 -0
  276. package/dist/dispatch/read-tracking-map.d.ts +28 -0
  277. package/dist/dispatch/read-tracking-map.d.ts.map +1 -0
  278. package/dist/dispatch/read-tracking-map.js +58 -0
  279. package/dist/dispatch/refuse-sibling-valve-flags.d.ts +30 -0
  280. package/dist/dispatch/refuse-sibling-valve-flags.d.ts.map +1 -0
  281. package/dist/dispatch/refuse-sibling-valve-flags.js +65 -0
  282. package/dist/dispatch/subverb-spec.d.ts +26 -0
  283. package/dist/dispatch/subverb-spec.d.ts.map +1 -0
  284. package/dist/dispatch/subverb-spec.js +1 -0
  285. package/dist/dispatch/undocumented-flag-reads.d.ts +22 -0
  286. package/dist/dispatch/undocumented-flag-reads.d.ts.map +1 -0
  287. package/dist/dispatch/undocumented-flag-reads.js +283 -0
  288. package/dist/dispatch/unknown-flag-refusal-mode.d.ts +13 -0
  289. package/dist/dispatch/unknown-flag-refusal-mode.d.ts.map +1 -0
  290. package/dist/dispatch/unknown-flag-refusal-mode.js +13 -0
  291. package/dist/dispatch/unknown-flag-refusal.d.ts +22 -0
  292. package/dist/dispatch/unknown-flag-refusal.d.ts.map +1 -0
  293. package/dist/dispatch/unknown-flag-refusal.js +57 -0
  294. package/dist/dispatch/unread-flags.d.ts +152 -0
  295. package/dist/dispatch/unread-flags.d.ts.map +1 -0
  296. package/dist/dispatch/unread-flags.js +295 -0
  297. package/dist/dispatch/verdict-valve-flag.d.ts +21 -0
  298. package/dist/dispatch/verdict-valve-flag.d.ts.map +1 -0
  299. package/dist/dispatch/verdict-valve-flag.js +21 -0
  300. package/dist/dispatch/walk-declared-subverbs.d.ts +14 -0
  301. package/dist/dispatch/walk-declared-subverbs.d.ts.map +1 -0
  302. package/dist/dispatch/walk-declared-subverbs.js +28 -0
  303. package/dist/exit-codes.d.ts +41 -3
  304. package/dist/exit-codes.d.ts.map +1 -1
  305. package/dist/exit-codes.js +153 -14
  306. package/dist/finish/run-finish.d.ts +72 -5
  307. package/dist/finish/run-finish.d.ts.map +1 -1
  308. package/dist/finish/run-finish.js +453 -104
  309. package/dist/gates/accepted-empty-note.d.ts +10 -0
  310. package/dist/gates/accepted-empty-note.d.ts.map +1 -0
  311. package/dist/gates/accepted-empty-note.js +11 -0
  312. package/dist/gates/allow-empty.d.ts +25 -0
  313. package/dist/gates/allow-empty.d.ts.map +1 -0
  314. package/dist/gates/allow-empty.js +27 -0
  315. package/dist/gates/asset-doctor-failing-units.d.ts +16 -0
  316. package/dist/gates/asset-doctor-failing-units.d.ts.map +1 -0
  317. package/dist/gates/asset-doctor-failing-units.js +14 -0
  318. package/dist/gates/asset-doctor-failure-line.d.ts +16 -0
  319. package/dist/gates/asset-doctor-failure-line.d.ts.map +1 -0
  320. package/dist/gates/asset-doctor-failure-line.js +28 -0
  321. package/dist/gates/empty-rule-advice-lines.d.ts +15 -0
  322. package/dist/gates/empty-rule-advice-lines.d.ts.map +1 -0
  323. package/dist/gates/empty-rule-advice-lines.js +20 -0
  324. package/dist/gates/gate-envelope.d.ts +85 -8
  325. package/dist/gates/gate-envelope.d.ts.map +1 -1
  326. package/dist/gates/gate-envelope.js +56 -7
  327. package/dist/gates/gate-rule-globs.d.ts +37 -3
  328. package/dist/gates/gate-rule-globs.d.ts.map +1 -1
  329. package/dist/gates/gate-rule-globs.js +78 -40
  330. package/dist/gates/gate-rule-view.d.ts +17 -4
  331. package/dist/gates/gate-rule-view.d.ts.map +1 -1
  332. package/dist/gates/gate-rule-view.js +105 -90
  333. package/dist/gates/i-coverage-dead-glob.d.ts +19 -0
  334. package/dist/gates/i-coverage-dead-glob.d.ts.map +1 -0
  335. package/dist/gates/i-coverage-dead-glob.js +1 -0
  336. package/dist/gates/i-coverage-negation.d.ts +13 -0
  337. package/dist/gates/i-coverage-negation.d.ts.map +1 -0
  338. package/dist/gates/i-coverage-negation.js +1 -0
  339. package/dist/gates/i-registration-query-settle-input.d.ts +18 -0
  340. package/dist/gates/i-registration-query-settle-input.d.ts.map +1 -0
  341. package/dist/gates/i-registration-query-settle-input.js +1 -0
  342. package/dist/gates/i-unit-state-note-row.d.ts +16 -0
  343. package/dist/gates/i-unit-state-note-row.d.ts.map +1 -0
  344. package/dist/gates/i-unit-state-note-row.js +1 -0
  345. package/dist/gates/i-unit-state-notes.d.ts +32 -0
  346. package/dist/gates/i-unit-state-notes.d.ts.map +1 -0
  347. package/dist/gates/i-unit-state-notes.js +1 -0
  348. package/dist/gates/incomplete-registry-inventory.d.ts +19 -0
  349. package/dist/gates/incomplete-registry-inventory.d.ts.map +1 -0
  350. package/dist/gates/incomplete-registry-inventory.js +63 -0
  351. package/dist/gates/measure-registration-roles.d.ts +10 -0
  352. package/dist/gates/measure-registration-roles.d.ts.map +1 -0
  353. package/dist/gates/measure-registration-roles.js +9 -0
  354. package/dist/gates/plane-verdict.d.ts +14 -0
  355. package/dist/gates/plane-verdict.d.ts.map +1 -0
  356. package/dist/gates/plane-verdict.js +22 -0
  357. package/dist/gates/qualify-clean-for-units.d.ts +12 -0
  358. package/dist/gates/qualify-clean-for-units.d.ts.map +1 -0
  359. package/dist/gates/qualify-clean-for-units.js +18 -0
  360. package/dist/gates/registration-graph-verdict.d.ts +34 -0
  361. package/dist/gates/registration-graph-verdict.d.ts.map +1 -0
  362. package/dist/gates/registration-graph-verdict.js +70 -0
  363. package/dist/gates/registration-roles.d.ts +9 -0
  364. package/dist/gates/registration-roles.d.ts.map +1 -0
  365. package/dist/gates/registration-roles.js +1 -0
  366. package/dist/gates/registry-liveness.d.ts +11 -0
  367. package/dist/gates/registry-liveness.d.ts.map +1 -0
  368. package/dist/gates/registry-liveness.js +13 -0
  369. package/dist/gates/rule-coverage.d.ts +187 -4
  370. package/dist/gates/rule-coverage.d.ts.map +1 -1
  371. package/dist/gates/rule-coverage.js +501 -49
  372. package/dist/gates/run-gate-planes.d.ts +14 -0
  373. package/dist/gates/run-gate-planes.d.ts.map +1 -1
  374. package/dist/gates/run-gate-planes.js +172 -30
  375. package/dist/gates/scaffold-selftest.d.ts +56 -0
  376. package/dist/gates/scaffold-selftest.d.ts.map +1 -0
  377. package/dist/gates/scaffold-selftest.js +119 -0
  378. package/dist/gates/seam-rejected-rules.d.ts +28 -0
  379. package/dist/gates/seam-rejected-rules.d.ts.map +1 -0
  380. package/dist/gates/seam-rejected-rules.js +95 -0
  381. package/dist/gates/self-test-check.d.ts +29 -0
  382. package/dist/gates/self-test-check.d.ts.map +1 -0
  383. package/dist/gates/self-test-check.js +1 -0
  384. package/dist/gates/self-test-subject.d.ts +28 -0
  385. package/dist/gates/self-test-subject.d.ts.map +1 -0
  386. package/dist/gates/self-test-subject.js +1 -0
  387. package/dist/gates/self-test.d.ts +20 -0
  388. package/dist/gates/self-test.d.ts.map +1 -0
  389. package/dist/gates/self-test.js +82 -0
  390. package/dist/gates/settle-verdict.d.ts +14 -0
  391. package/dist/gates/settle-verdict.d.ts.map +1 -0
  392. package/dist/gates/settle-verdict.js +13 -0
  393. package/dist/gates/settled-verdict.d.ts +8 -0
  394. package/dist/gates/settled-verdict.d.ts.map +1 -0
  395. package/dist/gates/settled-verdict.js +1 -0
  396. package/dist/gates/template-registry-coverage.d.ts +18 -0
  397. package/dist/gates/template-registry-coverage.d.ts.map +1 -0
  398. package/dist/gates/template-registry-coverage.js +24 -0
  399. package/dist/gates/unit-state-notes.d.ts +40 -0
  400. package/dist/gates/unit-state-notes.d.ts.map +1 -0
  401. package/dist/gates/unit-state-notes.js +71 -0
  402. package/dist/gates/verdict-line.d.ts +18 -0
  403. package/dist/gates/verdict-line.d.ts.map +1 -0
  404. package/dist/gates/verdict-line.js +40 -0
  405. package/dist/graph/graph-reuse-lookup.d.ts +10 -0
  406. package/dist/graph/graph-reuse-lookup.d.ts.map +1 -0
  407. package/dist/graph/graph-reuse-lookup.js +41 -0
  408. package/dist/graph/index-behind-hint.d.ts +11 -0
  409. package/dist/graph/index-behind-hint.d.ts.map +1 -0
  410. package/dist/graph/index-behind-hint.js +27 -0
  411. package/dist/knowledge/knowledge-stale-gate-flags.d.ts +3 -0
  412. package/dist/knowledge/knowledge-stale-gate-flags.d.ts.map +1 -0
  413. package/dist/knowledge/knowledge-stale-gate-flags.js +1 -0
  414. package/dist/knowledge/knowledge-stale-gate-input.d.ts +3 -0
  415. package/dist/knowledge/knowledge-stale-gate-input.d.ts.map +1 -0
  416. package/dist/knowledge/knowledge-stale-gate-input.js +1 -0
  417. package/dist/knowledge/knowledge-stale-gate-result.d.ts +3 -0
  418. package/dist/knowledge/knowledge-stale-gate-result.d.ts.map +1 -0
  419. package/dist/knowledge/knowledge-stale-gate-result.js +1 -0
  420. package/dist/knowledge/knowledge-stale-gate.d.ts +10 -0
  421. package/dist/knowledge/knowledge-stale-gate.d.ts.map +1 -0
  422. package/dist/knowledge/knowledge-stale-gate.js +9 -0
  423. package/dist/main.d.ts.map +1 -1
  424. package/dist/main.js +200 -83
  425. package/dist/output/failure-hints.d.ts.map +1 -1
  426. package/dist/output/failure-hints.js +11 -9
  427. package/dist/output/rejected-entries-note.d.ts +57 -0
  428. package/dist/output/rejected-entries-note.d.ts.map +1 -0
  429. package/dist/output/rejected-entries-note.js +103 -0
  430. package/dist/output/stdout-is-pipe.d.ts +13 -0
  431. package/dist/output/stdout-is-pipe.d.ts.map +1 -0
  432. package/dist/output/stdout-is-pipe.js +21 -0
  433. package/dist/packs/stale-build-warning.d.ts +11 -0
  434. package/dist/packs/stale-build-warning.d.ts.map +1 -0
  435. package/dist/packs/stale-build-warning.js +23 -0
  436. package/dist/quality/run-quality.d.ts +123 -0
  437. package/dist/quality/run-quality.d.ts.map +1 -0
  438. package/dist/quality/run-quality.js +442 -0
  439. package/dist/schemas/json-schemas.d.ts +184 -3
  440. package/dist/schemas/json-schemas.d.ts.map +1 -1
  441. package/dist/schemas/json-schemas.js +113 -2
  442. package/dist/shrk.d.ts +3 -0
  443. package/dist/shrk.d.ts.map +1 -0
  444. package/dist/shrk.js +30 -0
  445. package/dist/surface/audience-applicability.d.ts +26 -0
  446. package/dist/surface/audience-applicability.d.ts.map +1 -0
  447. package/dist/surface/audience-applicability.js +60 -0
  448. package/dist/surface/catalog-command-safety.d.ts +18 -0
  449. package/dist/surface/catalog-command-safety.d.ts.map +1 -0
  450. package/dist/surface/catalog-command-safety.js +62 -0
  451. package/dist/surface/cli-command-resolver.d.ts +21 -0
  452. package/dist/surface/cli-command-resolver.d.ts.map +1 -0
  453. package/dist/surface/cli-command-resolver.js +87 -0
  454. package/dist/surface/command-dispatch-kind.d.ts +20 -0
  455. package/dist/surface/command-dispatch-kind.d.ts.map +1 -0
  456. package/dist/surface/command-dispatch-kind.js +20 -0
  457. package/dist/surface/command-index-entry.d.ts +40 -0
  458. package/dist/surface/command-index-entry.d.ts.map +1 -0
  459. package/dist/surface/command-index-entry.js +1 -0
  460. package/dist/surface/command-index.d.ts +77 -0
  461. package/dist/surface/command-index.d.ts.map +1 -0
  462. package/dist/surface/command-index.js +323 -0
  463. package/dist/surface/i-command-index.d.ts +22 -0
  464. package/dist/surface/i-command-index.d.ts.map +1 -0
  465. package/dist/surface/i-command-index.js +1 -0
  466. package/dist/surface/i-command-string-context.d.ts +20 -0
  467. package/dist/surface/i-command-string-context.d.ts.map +1 -0
  468. package/dist/surface/i-command-string-context.js +1 -0
  469. package/dist/surface/i-surface-denial.d.ts +13 -0
  470. package/dist/surface/i-surface-denial.d.ts.map +1 -0
  471. package/dist/surface/i-surface-denial.js +1 -0
  472. package/dist/surface/load-surface-context.d.ts +17 -1
  473. package/dist/surface/load-surface-context.d.ts.map +1 -1
  474. package/dist/surface/load-surface-context.js +48 -10
  475. package/dist/surface/not-enabled-error.d.ts +38 -4
  476. package/dist/surface/not-enabled-error.d.ts.map +1 -1
  477. package/dist/surface/not-enabled-error.js +96 -6
  478. package/dist/surface/profiles.d.ts +7 -0
  479. package/dist/surface/profiles.d.ts.map +1 -1
  480. package/dist/surface/resolve-command-string.d.ts +10 -0
  481. package/dist/surface/resolve-command-string.d.ts.map +1 -0
  482. package/dist/surface/resolve-command-string.js +572 -0
  483. package/dist/surface/surface-config-writer.d.ts +7 -2
  484. package/dist/surface/surface-config-writer.d.ts.map +1 -1
  485. package/dist/surface/surface-config-writer.js +25 -6
  486. package/dist/surface/surface-layer.d.ts +11 -0
  487. package/dist/surface/surface-layer.d.ts.map +1 -0
  488. package/dist/surface/surface-layer.js +11 -0
  489. package/dist/surface/surface-refusal-reason.d.ts +16 -0
  490. package/dist/surface/surface-refusal-reason.d.ts.map +1 -0
  491. package/dist/surface/surface-refusal-reason.js +16 -0
  492. package/dist/surface/surface-selector.d.ts +26 -0
  493. package/dist/surface/surface-selector.d.ts.map +1 -0
  494. package/dist/surface/surface-selector.js +42 -0
  495. package/dist/surface/surface-summary.d.ts +61 -18
  496. package/dist/surface/surface-summary.d.ts.map +1 -1
  497. package/dist/surface/surface-summary.js +147 -60
  498. package/dist/surface/tier.d.ts +85 -22
  499. package/dist/surface/tier.d.ts.map +1 -1
  500. package/dist/surface/tier.js +132 -30
  501. package/dist/usage/usage-log.d.ts +6 -1
  502. package/dist/usage/usage-log.d.ts.map +1 -1
  503. package/dist/usage/usage-log.js +7 -2
  504. package/dist/validation/run-validation-loop.d.ts +9 -0
  505. package/dist/validation/run-validation-loop.d.ts.map +1 -1
  506. package/dist/validation/run-validation-loop.js +14 -11
  507. package/dist/validation/typecheck-emitted.d.ts +8 -9
  508. package/dist/validation/typecheck-emitted.d.ts.map +1 -1
  509. package/dist/validation/typecheck-emitted.js +17 -97
  510. package/package.json +34 -34
@@ -1,5 +1,6 @@
1
1
  import { type ISharkcraftInspection } from '@shrkcrft/inspector';
2
2
  import type { IGateRuleResult } from './gate-envelope.js';
3
+ import type { IUnitStateNoteRow } from './i-unit-state-note-row.js';
3
4
  import type { IGateRuleView } from './gate-rule-view.js';
4
5
  /**
5
6
  * Run every data-defined plane's VIOLATION check and normalize the results.
@@ -11,6 +12,12 @@ import type { IGateRuleView } from './gate-rule-view.js';
11
12
  * per-plane verbs call. A second implementation of any plane's check would
12
13
  * eventually disagree with the verb, and the aggregate — the one wired into CI
13
14
  * — would be the copy nobody notices is wrong.
15
+ *
16
+ * The same holds for COVERAGE: each rule's `coverage` comes from the plane's
17
+ * own coverage function (the one its verb uses), so `gates check` and the
18
+ * per-plane verb can never disagree about how much of a rule's scope was
19
+ * examined. Round 13: so does each rule's `expectEmpty` acceptance
20
+ * (`unitAcceptance`, folded into the envelope's one settle) and its unit lines.
14
21
  */
15
22
  export interface IRunGatePlanesOptions {
16
23
  readonly cwd: string;
@@ -38,6 +45,13 @@ export interface IRunGatePlanesOptions {
38
45
  export interface IGatePlaneRun {
39
46
  readonly results: readonly IGateRuleResult[];
40
47
  readonly diagnostics: readonly string[];
48
+ /**
49
+ * Each rule's settled non-live selector units (round 13, K2) — what THE
50
+ * shared unit-state renderer (`unitStateNotes`) reads, so `gates check` lists
51
+ * a dead unit or a went-live marker exactly as the plane verb does. Kept off
52
+ * the envelope rows, which carry the `units` lines only.
53
+ */
54
+ readonly noteRows?: readonly IUnitStateNoteRow[];
41
55
  }
42
56
  /** Evaluate the given rules, dispatching each to its plane's real engine. */
43
57
  export declare function runGatePlanes(rules: readonly IGateRuleView[], options: IRunGatePlanesOptions): IGatePlaneRun;
@@ -1 +1 @@
1
- {"version":3,"file":"run-gate-planes.d.ts","sourceRoot":"","sources":["../../src/gates/run-gate-planes.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAsBrF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpE;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,qBAAqB,CAAC;CAC7C;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,OAAO,EAAE,qBAAqB,GAC7B,aAAa,CAef"}
1
+ {"version":3,"file":"run-gate-planes.d.ts","sourceRoot":"","sources":["../../src/gates/run-gate-planes.ts"],"names":[],"mappings":"AAYA,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AA+BrF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpE;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,qBAAqB,CAAC;CAC7C;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAClD;AAqCD,6EAA6E;AAC7E,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,OAAO,EAAE,qBAAqB,GAC7B,aAAa,CA2Bf"}
@@ -1,21 +1,56 @@
1
- import { resolveSourceGlobs } from '@shrkcrft/core';
1
+ import { failsWhenEmpty, resolveSourceGlobs, RuleEmptiness, settleRuleEmptiness, unitStateLists, UnitLivenessState, } from '@shrkcrft/core';
2
2
  import { checkDocReferences } from '@shrkcrft/inspector';
3
- import { buildRegistrationGraph, matchesAny, registrationOrphans, registrationUnprovided, registryDuplicates, runPolicyLint, runWiring, scanRegistry, } from '@shrkcrft/boundaries';
4
- import { evaluateBaselineRule } from "../commands/baseline.command.js";
5
- import { evaluateGeneratedRule, generatedHintFor } from "../commands/generated.command.js";
3
+ import { buildRegistrationGraph, globListSelects, readScopeCoverage, readScopeHasUnread, registrationOrphans, registrationUnprovided, registryDuplicates, runPolicyLint, runWiring, scanRegistry, settleGlobLists, } from '@shrkcrft/boundaries';
4
+ import { baselineCoverage, evaluateBaselineRule } from "../commands/baseline.command.js";
5
+ import { evaluateGeneratedRule, generatedCoverage, generatedHintFor, } from "../commands/generated.command.js";
6
+ import { docReferenceCoverage } from "../commands/docs-references.command.js";
7
+ import { policyRuleCoverage } from "../commands/policy-lint.command.js";
8
+ import { measureRegistrationRoles } from "./measure-registration-roles.js";
9
+ import { registryLiveness } from "./registry-liveness.js";
10
+ /** The unit fields a plane engine put on its result, passed through to the envelope rule (round 13). */
11
+ function unitFields(r) {
12
+ return {
13
+ ...(r.unitAcceptance !== undefined ? { unitAcceptance: r.unitAcceptance } : {}),
14
+ ...(r.units !== undefined ? { units: r.units } : {}),
15
+ ...(r.unitLiveness !== undefined && r.unitLiveness.length > 0 ? { unitLiveness: r.unitLiveness } : {}),
16
+ };
17
+ }
18
+ /** The same, from a settle this module ran itself. */
19
+ function livenessFields(l) {
20
+ if (l === undefined)
21
+ return {};
22
+ const nonLive = l.units.filter((u) => u.state !== UnitLivenessState.Live);
23
+ return {
24
+ ...(l.acceptance !== undefined ? { unitAcceptance: l.acceptance } : {}),
25
+ ...(l.dead.length + l.intendedEmpty.length + l.wentLive.length > 0 ? { units: unitStateLists(l) } : {}),
26
+ ...(nonLive.length > 0 ? { unitLiveness: nonLive } : {}),
27
+ };
28
+ }
6
29
  /** Evaluate the given rules, dispatching each to its plane's real engine. */
7
30
  export function runGatePlanes(rules, options) {
8
31
  const results = [];
9
32
  const diagnostics = [];
10
33
  const byPlane = (plane) => rules.filter((r) => r.plane === plane).map((r) => r.raw);
11
- results.push(...runWiringPlane(byPlane('wiring'), options, diagnostics));
12
- results.push(...runPolicyPlane(byPlane('policy'), options));
13
- results.push(...runRegistryPlane(byPlane('registry'), options));
14
- results.push(...runRegistrationPlane(byPlane('registration'), options));
15
- results.push(...runBaselinePlane(byPlane('baseline'), options));
16
- results.push(...runGeneratedPlane(byPlane('generated'), options));
17
- results.push(...runDocReferencePlane(byPlane('doc-reference'), options));
18
- return { results, diagnostics };
34
+ const planeResults = [
35
+ ...runWiringPlane(byPlane('wiring'), options, diagnostics),
36
+ ...runPolicyPlane(byPlane('policy'), options),
37
+ ...runRegistryPlane(byPlane('registry'), options),
38
+ ...runRegistrationPlane(byPlane('registration'), options),
39
+ ...runBaselinePlane(byPlane('baseline'), options),
40
+ ...runGeneratedPlane(byPlane('generated'), options),
41
+ ...runDocReferencePlane(byPlane('doc-reference'), options),
42
+ ];
43
+ // Each rule's settled units leave its envelope row (the envelope carries the
44
+ // `units` lines) for the note rows THE shared unit-state renderer reads (K2).
45
+ const noteRows = [];
46
+ for (const r of planeResults) {
47
+ const { unitLiveness, ...row } = r;
48
+ results.push(row);
49
+ if (unitLiveness !== undefined) {
50
+ noteRows.push({ id: r.id, unitLiveness, reportedEmpty: r.status === 'skipped' || r.skipReason !== undefined });
51
+ }
52
+ }
53
+ return { results, diagnostics, noteRows };
19
54
  }
20
55
  function runWiringPlane(rules, options, diagnostics) {
21
56
  if (rules.length === 0)
@@ -39,6 +74,10 @@ function runWiringPlane(rules, options, diagnostics) {
39
74
  })),
40
75
  ...(skip ? { skipReason: skip.reason } : {}),
41
76
  ...(r.error ? { error: r.error } : {}),
77
+ // The engine's own coverage — a subset rule's registered-only tokens
78
+ // arrive here as unexamined, which is what makes it `partial`.
79
+ coverage: r.coverage,
80
+ ...unitFields(r),
42
81
  };
43
82
  });
44
83
  }
@@ -65,6 +104,8 @@ function runPolicyPlane(rules, options) {
65
104
  })),
66
105
  ...(skip ? { skipReason: skip.reason } : {}),
67
106
  ...(r.error ? { error: r.error } : {}),
107
+ coverage: policyRuleCoverage(r),
108
+ ...unitFields(r),
68
109
  };
69
110
  });
70
111
  }
@@ -77,12 +118,58 @@ function runRegistryPlane(decls, options) {
77
118
  return decls.map((decl) => {
78
119
  const inventory = scanRegistry(options.cwd, decl, { excludeDirs: options.excludeDirs });
79
120
  const dupes = registryDuplicates(inventory);
80
- const empty = inventory.entries.length === 0;
121
+ // A source file the reader could not read (over the read cap) makes the
122
+ // inventory incomplete. Zero ids over it is not "matched nothing" (never a
123
+ // failOnEmpty failure), and "no duplicates" over it is not a pass: its
124
+ // coverage is the file record, so the rule settles PARTIAL.
125
+ const empty = inventory.entries.length === 0 && !readScopeHasUnread(inventory.readScope);
126
+ // The registry's globs settled with their `expectEmpty` markers (round 13)
127
+ // — only when a unit is marked, or the inventory is empty (what it is
128
+ // decided from). The registry verbs read the same `registryLiveness`.
129
+ const marked = [decl.source, decl.consumer].some((s) => (s?.expectEmptyUnits?.length ?? 0) > 0);
130
+ const liveness = marked || empty ? registryLiveness(options.cwd, decl, options.excludeDirs) : undefined;
131
+ // `failOnEmpty` makes a dead inventory BLOCK, exactly as a failOnEmpty
132
+ // wiring rule does; without it an empty registry stays a loud skip. A
133
+ // registry has no severity of its own, so THE failOnEmpty authority answers
134
+ // for a warning-severity rule (default off; an explicit `true` promotes it).
135
+ const failOnEmpty = failsWhenEmpty({
136
+ ...(decl.failOnEmpty !== undefined ? { failOnEmpty: decl.failOnEmpty } : {}),
137
+ severity: 'warning',
138
+ });
139
+ const staleReason = failOnEmpty
140
+ ? 'matched 0 ids — failOnEmpty: the source selector is probably stale'
141
+ : 'matched 0 ids — the source selector is probably stale';
142
+ // THE rule-emptiness settle: every source inclusion glob marked
143
+ // `expectEmpty` and no source file matched → an inventory over a planned
144
+ // directory, accepted and printed; anything else is the loud skip.
145
+ const emptiness = empty && liveness !== undefined
146
+ ? settleRuleEmptiness({
147
+ subject: decl.name,
148
+ unitLabel: 'ids',
149
+ filesMatched: inventory.readScope.read,
150
+ unitsMatched: 0,
151
+ unread: false,
152
+ liveness,
153
+ primaryLists: ['source.files'],
154
+ failOnEmpty,
155
+ noFilesReason: staleReason,
156
+ noUnitsReason: staleReason,
157
+ })
158
+ : undefined;
159
+ const intended = emptiness?.state === RuleEmptiness.IntendedEmpty && emptiness.coverage !== undefined;
160
+ const skipped = emptiness?.skipped === true;
161
+ const skipReason = emptiness?.skipReason ?? staleReason;
81
162
  return {
82
163
  id: decl.name,
83
164
  type: 'registry',
84
- status: empty ? 'skipped' : dupes.length > 0 ? 'failed' : 'passed',
85
- severity: 'warning',
165
+ status: skipped
166
+ ? emptiness?.fails
167
+ ? 'failed'
168
+ : 'skipped'
169
+ : dupes.length > 0
170
+ ? 'failed'
171
+ : 'passed',
172
+ severity: emptiness?.fails ? 'error' : 'warning',
86
173
  counts: { ids: inventory.entries.length, duplicates: dupes.length },
87
174
  violations: dupes.map((d) => ({
88
175
  id: d.id,
@@ -90,7 +177,16 @@ function runRegistryPlane(decls, options) {
90
177
  message: `declared in ${d.sites.length} places: ${d.sites.map((s) => `${s.file}:${s.line}`).join(', ')}`,
91
178
  hint: 'remove the duplicate declaration — which one wins is load-order roulette',
92
179
  })),
93
- ...(empty ? { skipReason: 'matched 0 ids — the source selector is probably stale' } : {}),
180
+ ...(skipped ? { skipReason } : {}),
181
+ coverage: intended && emptiness?.coverage !== undefined
182
+ ? emptiness.coverage
183
+ : readScopeCoverage({
184
+ unit: 'ids',
185
+ expected: inventory.entries.length,
186
+ examined: inventory.entries.length,
187
+ ...(skipped ? { reason: skipReason } : {}),
188
+ }, inventory.readScope),
189
+ ...livenessFields(liveness),
94
190
  };
95
191
  });
96
192
  }
@@ -112,24 +208,56 @@ function runRegistrationPlane(idioms, options) {
112
208
  const graph = buildRegistrationGraph(options.cwd, idioms, { excludeDirs: options.excludeDirs });
113
209
  const unprovided = registrationUnprovided(graph, options.changedFiles);
114
210
  const orphans = registrationOrphans(graph, options.changedFiles);
115
- const ownsFile = (idiom, file) => matchesAny(file, [
116
- ...resolveSourceGlobs(idiom.declared),
117
- ...resolveSourceGlobs(idiom.consumed),
118
- ...resolveSourceGlobs(idiom.provided),
119
- ]);
211
+ // Per ROLE list: a role's `!x` subtracts from that role only, so it never
212
+ // disowns a file another role of the idiom reads.
213
+ const ownsFile = (idiom, file) => [idiom.declared, idiom.consumed, idiom.provided].some((role) => globListSelects(file, resolveSourceGlobs(role)));
120
214
  return idioms.map((idiom) => {
121
215
  const mine = unprovided.filter((t) => [...t.declared, ...t.consumed].some((site) => ownsFile(idiom, site.file)));
122
216
  const myOrphans = orphans.filter((t) => t.provided.some((site) => ownsFile(idiom, site.file)));
123
- const empty = graph.tokens.length === 0;
217
+ // "Is this idiom empty?" and "which role examined nothing?" come from the
218
+ // ONE measurement `gates coverage` reads too. Keying emptiness on the
219
+ // graph's token union used to print a ✓ over an idiom whose declared glob
220
+ // had moved (its provided/consumed roles kept the union non-empty), while
221
+ // coverage FAILED the same idiom.
222
+ const roles = measureRegistrationRoles(options.cwd, idiom, options.excludeDirs);
223
+ const failOnEmpty = failsWhenEmpty({
224
+ ...(idiom.failOnEmpty !== undefined ? { failOnEmpty: idiom.failOnEmpty } : {}),
225
+ severity: 'warning',
226
+ });
227
+ const staleReason = `the declared role extracted 0 tokens${failOnEmpty ? ' (failOnEmpty)' : ''}, ` +
228
+ 'so the declared selector is probably stale';
229
+ // THE rule-emptiness settle (round 13) on the declared role — the idiom's
230
+ // primary selector: every declared inclusion glob marked `expectEmpty` and
231
+ // no declared file matched → a planned token space, accepted; 0 tokens out
232
+ // of live declared files is the loud skip it always was.
233
+ const emptiness = roles.error === undefined && roles.empty
234
+ ? settleRuleEmptiness({
235
+ subject: idiom.name,
236
+ unitLabel: 'declared tokens',
237
+ filesMatched: roles.declared.filesScanned,
238
+ unitsMatched: 0,
239
+ unread: false,
240
+ liveness: roles.liveness ?? settleGlobLists({ subject: idiom.name, lists: [], marks: [] }),
241
+ primaryLists: ['declared.files'],
242
+ failOnEmpty,
243
+ noFilesReason: staleReason,
244
+ noUnitsReason: staleReason,
245
+ })
246
+ : undefined;
247
+ const skipped = emptiness?.skipped === true;
124
248
  return {
125
249
  id: idiom.name,
126
250
  type: 'registration',
127
- status: empty
128
- ? 'skipped'
129
- : mine.length > 0
130
- ? 'failed'
131
- : 'passed',
132
- severity: 'warning',
251
+ status: roles.error !== undefined
252
+ ? 'error'
253
+ : skipped
254
+ ? emptiness?.fails
255
+ ? 'failed'
256
+ : 'skipped'
257
+ : mine.length > 0
258
+ ? 'failed'
259
+ : 'passed',
260
+ severity: emptiness?.fails ? 'error' : 'warning',
133
261
  counts: { tokens: graph.tokens.length, unprovided: mine.length, orphans: myOrphans.length },
134
262
  violations: mine.map((t) => ({
135
263
  id: t.token,
@@ -137,7 +265,12 @@ function runRegistrationPlane(idioms, options) {
137
265
  message: 'declared/consumed but provided by nothing — resolves to nothing at runtime',
138
266
  hint: `trace it with \`shrk wiring chain ${t.token}\``,
139
267
  })),
140
- ...(empty ? { skipReason: 'registration graph matched 0 tokens' } : {}),
268
+ ...(skipped ? { skipReason: emptiness?.skipReason ?? staleReason } : {}),
269
+ ...(roles.error !== undefined ? { error: roles.error } : {}),
270
+ // A dead role is an unexamined unit: the rule settles to `partial`, never
271
+ // ✓. An intended-empty role rides on the acceptance instead.
272
+ coverage: roles.coverage,
273
+ ...livenessFields(roles.liveness),
141
274
  };
142
275
  });
143
276
  }
@@ -154,6 +287,7 @@ function runBaselinePlane(rules, options) {
154
287
  counts: { committed: 0, current: 0 },
155
288
  violations: [],
156
289
  skipReason: '`command` compute skipped by --no-spawn',
290
+ coverage: { unit: 'baseline computes', expected: 1, examined: 0, reason: 'skipped by --no-spawn' },
157
291
  };
158
292
  }
159
293
  const o = evaluateBaselineRule(options.cwd, rule, options.excludeDirs, options.changedFiles);
@@ -169,6 +303,8 @@ function runBaselinePlane(rules, options) {
169
303
  ].map((v) => ({ ...v, hint: rule.hint ?? `bless with \`shrk baseline update --id ${rule.id}\`` })),
170
304
  ...(o.skipReason ? { skipReason: o.skipReason } : {}),
171
305
  ...(o.error ? { error: o.error } : {}),
306
+ coverage: baselineCoverage(o),
307
+ ...unitFields(o),
172
308
  };
173
309
  });
174
310
  }
@@ -183,6 +319,7 @@ function runDocReferencePlane(rules, options) {
183
319
  return [];
184
320
  const inspection = options.inspection;
185
321
  if (!inspection) {
322
+ const skipReason = 'registries not loaded — doc references were not resolved';
186
323
  return rules.map((rule) => ({
187
324
  id: rule.id,
188
325
  type: 'doc-reference',
@@ -190,7 +327,8 @@ function runDocReferencePlane(rules, options) {
190
327
  severity: rule.severity ?? 'error',
191
328
  counts: { files: 0, tokens: 0 },
192
329
  violations: [],
193
- skipReason: 'registries not loaded — doc references were not resolved',
330
+ skipReason,
331
+ coverage: { unit: 'references', expected: 0, examined: 0, reason: skipReason },
194
332
  }));
195
333
  }
196
334
  return rules.map((rule) => {
@@ -210,6 +348,8 @@ function runDocReferencePlane(rules, options) {
210
348
  })),
211
349
  ...(res.skipReason ? { skipReason: res.skipReason } : {}),
212
350
  ...(res.error ? { error: res.error } : {}),
351
+ coverage: docReferenceCoverage(res),
352
+ ...unitFields(res),
213
353
  };
214
354
  });
215
355
  }
@@ -256,6 +396,8 @@ function runGeneratedPlane(rules, options) {
256
396
  ? { skipReason: 'regen drift check skipped by --no-spawn (headers + classification still ran)' }
257
397
  : {}),
258
398
  ...(o.error ? { error: o.error } : {}),
399
+ coverage: generatedCoverage(o, spawnSkipped),
400
+ ...unitFields(o),
259
401
  };
260
402
  });
261
403
  }
@@ -0,0 +1,56 @@
1
+ import type { IGateCoverage } from './rule-coverage.js';
2
+ /**
3
+ * A scaffolded `selfTest`, ready to paste (or to insert with `--write`).
4
+ *
5
+ * The trust layer asks every rule to carry `failOnEmpty` + a `selfTest`, so a
6
+ * stale glob after a directory move fails LOUD instead of passing over an empty
7
+ * set. In practice the selfTest is the step that gets skipped — not from
8
+ * disagreement, but because authoring the fixture inline (which ids to pin,
9
+ * what floor to set) is a blank page at the exact moment the author just wants
10
+ * the rule to work. A rule with no selfTest is invisible to the stale-glob
11
+ * detector, so the friction converts directly into missing coverage.
12
+ */
13
+ export interface IScaffoldedSelfTest {
14
+ readonly ruleId: string;
15
+ readonly plane: string;
16
+ /** What the rule matches right now — the number the floor is derived from. */
17
+ readonly currentCount: number;
18
+ readonly expectMatchesAtLeast: number;
19
+ readonly expectIds: readonly string[];
20
+ /** The percentage of headroom left below the current count. */
21
+ readonly marginPercent: number;
22
+ /** The literal block to paste into the rule. */
23
+ readonly snippet: string;
24
+ /**
25
+ * Why some extracted ids were NOT pinned, or why `expectIds` is empty. Today
26
+ * this applies to the policy plane: a live finding is debt, and pinning it
27
+ * would turn paying the debt into a gate failure.
28
+ */
29
+ readonly note?: string;
30
+ }
31
+ /**
32
+ * Build a ready-to-commit `selfTest` from what the rule matches TODAY.
33
+ *
34
+ * The floor is deliberately BELOW the current count: pinning the exact number
35
+ * would turn every legitimate addition into a failure, and a rule that cries
36
+ * wolf on normal work gets its expectations deleted rather than fixed. The
37
+ * margin is what keeps the assertion about "the selector still bites" rather
38
+ * than about "the set never changes".
39
+ */
40
+ export declare function scaffoldSelfTest(coverage: IGateCoverage, marginPercent: number, sampleSize?: number): IScaffoldedSelfTest;
41
+ /** Outcome of inserting a scaffolded selfTest into the config text. */
42
+ export interface IInsertResult {
43
+ readonly ok: boolean;
44
+ readonly text?: string;
45
+ readonly error?: string;
46
+ }
47
+ /**
48
+ * Insert the block into the rule whose `id` matches, in place.
49
+ *
50
+ * Refuses rather than guesses. A config is the file every gate reads, so a
51
+ * write that lands in the wrong rule — or in one of two rules sharing an id —
52
+ * would silently re-point an assertion at a different set, which is worse than
53
+ * making the author paste three lines by hand.
54
+ */
55
+ export declare function insertSelfTest(configText: string, ruleId: string, snippet: string): IInsertResult;
56
+ //# sourceMappingURL=scaffold-selftest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-selftest.d.ts","sourceRoot":"","sources":["../../src/gates/scaffold-selftest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,aAAa,EACvB,aAAa,EAAE,MAAM,EACrB,UAAU,SAAI,GACb,mBAAmB,CA6BrB;AAmBD,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,aAAa,CA8Bf"}
@@ -0,0 +1,119 @@
1
+ /** Markers that make an id a poor anchor: it is likely to be renamed or removed. */
2
+ const UNSTABLE = /(^|[^a-z])(tmp|temp|draft|wip|scratch|legacy|deprecated|old|new|test|fixture|sample|example|foo|bar|baz)([^a-z]|$)/i;
3
+ /**
4
+ * How good an anchor an id is, higher is better.
5
+ *
6
+ * A selfTest is only as useful as the ids it pins: anchoring on a name that was
7
+ * always going to be deleted produces a rule that fails for a reason unrelated
8
+ * to the selector, which trains people to delete the selfTest. So the obviously
9
+ * temporary and the obviously generated are ranked last, and everything else is
10
+ * ordered deterministically by name so the same tree always scaffolds the same
11
+ * fixture.
12
+ */
13
+ function stability(id) {
14
+ let score = 100;
15
+ if (UNSTABLE.test(id))
16
+ score -= 60;
17
+ // A long digit or hex run reads as generated (a hash, a timestamp, an index).
18
+ if (/\d{4,}/.test(id))
19
+ score -= 40;
20
+ if (/[0-9a-f]{8,}/i.test(id))
21
+ score -= 40;
22
+ // Trailing counters (`handlerV2`, `route3`) churn as versions advance.
23
+ if (/\d$/.test(id))
24
+ score -= 15;
25
+ return score;
26
+ }
27
+ /**
28
+ * Build a ready-to-commit `selfTest` from what the rule matches TODAY.
29
+ *
30
+ * The floor is deliberately BELOW the current count: pinning the exact number
31
+ * would turn every legitimate addition into a failure, and a rule that cries
32
+ * wolf on normal work gets its expectations deleted rather than fixed. The
33
+ * margin is what keeps the assertion about "the selector still bites" rather
34
+ * than about "the set never changes".
35
+ */
36
+ export function scaffoldSelfTest(coverage, marginPercent, sampleSize = 3) {
37
+ // A plane whose extracted set mixes stable anchors with ids that are meant to
38
+ // go away (the policy plane: a live finding is debt) says which ids are safe
39
+ // to pin. Only those are scaffolded. Pinning a live violation would make
40
+ // `gates coverage` fail on the day the author fixes the code the rule forbids.
41
+ const ids = coverage.pinIds ?? coverage.allIds ?? coverage.sampleIds;
42
+ const count = coverage.unitsMatched;
43
+ const floor = Math.max(1, Math.floor(count * (1 - marginPercent / 100)));
44
+ const expectIds = [...ids]
45
+ .sort((a, b) => stability(b) - stability(a) || a.localeCompare(b))
46
+ .slice(0, Math.min(sampleSize, ids.length));
47
+ const snippet = [
48
+ 'selfTest: {',
49
+ ` expectMatchesAtLeast: ${floor},`,
50
+ ` expectIds: [${expectIds.map((i) => `'${i}'`).join(', ')}],`,
51
+ ' expectNotIds: [],',
52
+ '},',
53
+ ].join('\n');
54
+ const note = pinNote(coverage);
55
+ return {
56
+ ruleId: coverage.id,
57
+ plane: coverage.plane,
58
+ currentCount: count,
59
+ expectMatchesAtLeast: floor,
60
+ expectIds,
61
+ marginPercent,
62
+ snippet,
63
+ ...(note ? { note } : {}),
64
+ };
65
+ }
66
+ /** Why a plane's pinnable set is narrower than what it extracted, when it is. */
67
+ function pinNote(coverage) {
68
+ if (coverage.pinIds === undefined)
69
+ return undefined;
70
+ const pinnable = new Set(coverage.pinIds);
71
+ const live = (coverage.allIds ?? coverage.sampleIds).filter((id) => !pinnable.has(id));
72
+ const skipped = live.length > 0
73
+ ? `${live.length} id(s) matched by a live finding were not pinned (${live.slice(0, 3).join(', ')}` +
74
+ `${live.length > 3 ? ', …' : ''}). A finding is debt, and pinning it would fail the gate once the debt is paid. `
75
+ : '';
76
+ if (coverage.pinIds.length > 0)
77
+ return skipped ? skipped.trimEnd() : undefined;
78
+ return (`${skipped}No exempted hit to pin, so expectIds is left empty. Add a fixture file under the rule's ` +
79
+ '`exemptFiles` that contains the forbidden pattern. expectIds can then prove the pattern still bites.');
80
+ }
81
+ /**
82
+ * Insert the block into the rule whose `id` matches, in place.
83
+ *
84
+ * Refuses rather than guesses. A config is the file every gate reads, so a
85
+ * write that lands in the wrong rule — or in one of two rules sharing an id —
86
+ * would silently re-point an assertion at a different set, which is worse than
87
+ * making the author paste three lines by hand.
88
+ */
89
+ export function insertSelfTest(configText, ruleId, snippet) {
90
+ // A registry declaration is keyed by `name`, every other plane by `id`. Both
91
+ // are the rule's identity as `gates list` prints it, so both are accepted —
92
+ // an author should not have to know which plane spells it which way.
93
+ const idPattern = new RegExp(`^([ \\t]*)(?:id|name):\\s*['"\`]${escapeRegex(ruleId)}['"\`]\\s*,?\\s*$`, 'gm');
94
+ const matches = [...configText.matchAll(idPattern)];
95
+ if (matches.length === 0) {
96
+ return {
97
+ ok: false,
98
+ error: `no \`id: '${ruleId}'\` (or \`name:\`) line found in the config — is the rule contributed by a pack?`,
99
+ };
100
+ }
101
+ if (matches.length > 1) {
102
+ return {
103
+ ok: false,
104
+ error: `"${ruleId}" appears ${matches.length} times — refusing to guess which rule to edit`,
105
+ };
106
+ }
107
+ const m = matches[0];
108
+ const indent = m[1] ?? ' ';
109
+ const lineEnd = configText.indexOf('\n', m.index);
110
+ const at = lineEnd === -1 ? configText.length : lineEnd + 1;
111
+ const block = snippet
112
+ .split('\n')
113
+ .map((l) => (l === '' ? l : indent + l))
114
+ .join('\n');
115
+ return { ok: true, text: configText.slice(0, at) + block + '\n' + configText.slice(at) };
116
+ }
117
+ function escapeRegex(s) {
118
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
119
+ }
@@ -0,0 +1,28 @@
1
+ import { type IResolvedProjectConfig } from '@shrkcrft/inspector';
2
+ import type { IGateRuleResult } from './gate-envelope.js';
3
+ import type { GatePlane } from './gate-rule-view.js';
4
+ /**
5
+ * THE gate-plane reading of a pack element the merge seam refused (round 12
6
+ * review, R12-X1): a configured rule that did NOT run — an ERRORED row, `failed
7
+ * validation — NOT evaluated`, exactly as the boundary plane reports a rejected
8
+ * boundary rule.
9
+ *
10
+ * `resolveProjectConfig` has always returned the structured rejections
11
+ * (`planeOutcomes`), but every gate verb read only the `planeDiagnostics`
12
+ * strings: a pack policy rule whose `files` was negation-only was dropped, never
13
+ * entered the rule denominator, and `gates check` / `policy-lint` / `gates
14
+ * coverage` printed a ✓ at exit 0 over it while `packs contributions` and
15
+ * `packs doctor` exited 1 on the same tree. Every plane reader — `gates
16
+ * check|coverage|list`, `quality`, `policy-lint`, `check wiring`, `registry`,
17
+ * `baseline check`, `generated check`, `finish` — builds its rows here, so they
18
+ * cannot disagree about one rejected rule.
19
+ *
20
+ * A pack plane FILE that failed to import is one errored row per file (the
21
+ * rules inside it are unknown). A `duplicate-id` rejection is NOT a row: the id
22
+ * it collided with is a rule that runs (local wins), so it stays a diagnostic.
23
+ * `planes` narrows to the planes a verb reads; absent = every plane.
24
+ */
25
+ export declare function seamRejectedRules(resolved: Pick<IResolvedProjectConfig, 'planeOutcomes' | 'projectRoot'>, planes?: readonly GatePlane[]): (IGateRuleResult & {
26
+ readonly type: GatePlane;
27
+ })[];
28
+ //# sourceMappingURL=seam-rejected-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seam-rejected-rules.d.ts","sourceRoot":"","sources":["../../src/gates/seam-rejected-rules.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAmBrD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,IAAI,CAAC,sBAAsB,EAAE,eAAe,GAAG,aAAa,CAAC,EACvE,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,GAC5B,CAAC,eAAe,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,EAAE,CAkDpD"}
@@ -0,0 +1,95 @@
1
+ import { RejectionCause } from '@shrkcrft/core';
2
+ import { ContributionKind, contributionFileLabel, formatEntryRejection, } from '@shrkcrft/inspector';
3
+ /**
4
+ * Each gate-plane contribution kind → the plane its rules run on. A kind absent
5
+ * here (`reuse-primitive`) is not a gate plane. Doc references joined in round
6
+ * 13 (P3): their pack slot (`docReferenceFiles`) is declared, so a rejected
7
+ * pack doc-reference rule is an ERRORED row like every other plane's — before,
8
+ * it was a diagnostic string only.
9
+ */
10
+ const PLANE_OF_KIND = {
11
+ [ContributionKind.WiringRule]: 'wiring',
12
+ [ContributionKind.PolicyRule]: 'policy',
13
+ [ContributionKind.Registry]: 'registry',
14
+ [ContributionKind.RegistrationIdiom]: 'registration',
15
+ [ContributionKind.Baseline]: 'baseline',
16
+ [ContributionKind.GeneratedArtifact]: 'generated',
17
+ [ContributionKind.DocReference]: 'doc-reference',
18
+ };
19
+ /**
20
+ * THE gate-plane reading of a pack element the merge seam refused (round 12
21
+ * review, R12-X1): a configured rule that did NOT run — an ERRORED row, `failed
22
+ * validation — NOT evaluated`, exactly as the boundary plane reports a rejected
23
+ * boundary rule.
24
+ *
25
+ * `resolveProjectConfig` has always returned the structured rejections
26
+ * (`planeOutcomes`), but every gate verb read only the `planeDiagnostics`
27
+ * strings: a pack policy rule whose `files` was negation-only was dropped, never
28
+ * entered the rule denominator, and `gates check` / `policy-lint` / `gates
29
+ * coverage` printed a ✓ at exit 0 over it while `packs contributions` and
30
+ * `packs doctor` exited 1 on the same tree. Every plane reader — `gates
31
+ * check|coverage|list`, `quality`, `policy-lint`, `check wiring`, `registry`,
32
+ * `baseline check`, `generated check`, `finish` — builds its rows here, so they
33
+ * cannot disagree about one rejected rule.
34
+ *
35
+ * A pack plane FILE that failed to import is one errored row per file (the
36
+ * rules inside it are unknown). A `duplicate-id` rejection is NOT a row: the id
37
+ * it collided with is a rule that runs (local wins), so it stays a diagnostic.
38
+ * `planes` narrows to the planes a verb reads; absent = every plane.
39
+ */
40
+ export function seamRejectedRules(resolved, planes) {
41
+ const outcomes = resolved.planeOutcomes;
42
+ if (!outcomes)
43
+ return [];
44
+ const wanted = (kind) => {
45
+ const plane = PLANE_OF_KIND[kind];
46
+ return plane !== undefined && (planes === undefined || planes.includes(plane)) ? plane : undefined;
47
+ };
48
+ const rows = [];
49
+ const seen = new Set();
50
+ for (const r of outcomes.rejected) {
51
+ if (r.cause === RejectionCause.DuplicateId)
52
+ continue;
53
+ const plane = wanted(r.kind);
54
+ if (plane === undefined)
55
+ continue;
56
+ const file = contributionFileLabel(resolved.projectRoot, r.file);
57
+ const id = r.entryId ?? `${file}[${r.index}]`;
58
+ if (seen.has(`${plane}:${id}`))
59
+ continue;
60
+ seen.add(`${plane}:${id}`);
61
+ const pack = r.packageName ? `pack ${r.packageName} ` : '';
62
+ rows.push({
63
+ id,
64
+ type: plane,
65
+ status: 'error',
66
+ severity: 'error',
67
+ counts: {},
68
+ violations: [],
69
+ error: `${pack}${plane} rule failed validation at the pack-plane merge seam — NOT evaluated: ` +
70
+ `${formatEntryRejection(r)} (${file})`,
71
+ coverage: { unit: 'rules', expected: 1, examined: 0, subject: id, reason: 'failed validation — NOT evaluated' },
72
+ });
73
+ }
74
+ for (const f of outcomes.loadFailures) {
75
+ const plane = wanted(f.kind);
76
+ if (plane === undefined)
77
+ continue;
78
+ const file = contributionFileLabel(resolved.projectRoot, f.file);
79
+ const id = `${f.packageName}:${file}`;
80
+ if (seen.has(`${plane}:${id}`))
81
+ continue;
82
+ seen.add(`${plane}:${id}`);
83
+ rows.push({
84
+ id,
85
+ type: plane,
86
+ status: 'error',
87
+ severity: 'error',
88
+ counts: {},
89
+ violations: [],
90
+ error: `pack ${f.packageName} ${plane} rule file failed to load — none of its rules was evaluated: ${f.message}`,
91
+ coverage: { unit: 'rules', expected: 1, examined: 0, subject: id, reason: 'the rule file failed to load' },
92
+ });
93
+ }
94
+ return rows;
95
+ }