@stsepelin/checktrail 0.1.0-alpha.1

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 (385) hide show
  1. package/CONTRIBUTING.md +42 -0
  2. package/LICENSE +21 -0
  3. package/README.md +355 -0
  4. package/SECURITY.md +46 -0
  5. package/dist/src/actionlint-evidence.d.ts +2 -0
  6. package/dist/src/actionlint-evidence.js +166 -0
  7. package/dist/src/actionlint-inputs.d.ts +5 -0
  8. package/dist/src/actionlint-inputs.js +123 -0
  9. package/dist/src/actionlint-runner.d.ts +1 -0
  10. package/dist/src/actionlint-runner.js +122 -0
  11. package/dist/src/actionlint.d.ts +19 -0
  12. package/dist/src/actionlint.js +80 -0
  13. package/dist/src/adapters.d.ts +49 -0
  14. package/dist/src/adapters.js +430 -0
  15. package/dist/src/architecture.d.ts +107 -0
  16. package/dist/src/architecture.js +230 -0
  17. package/dist/src/clang-evidence.d.ts +2 -0
  18. package/dist/src/clang-evidence.js +194 -0
  19. package/dist/src/clang-protocol.d.ts +3 -0
  20. package/dist/src/clang-protocol.js +25 -0
  21. package/dist/src/clang-runner.d.ts +1 -0
  22. package/dist/src/clang-runner.js +159 -0
  23. package/dist/src/clang.d.ts +44 -0
  24. package/dist/src/clang.js +197 -0
  25. package/dist/src/cli.d.ts +2 -0
  26. package/dist/src/cli.js +338 -0
  27. package/dist/src/config.d.ts +33 -0
  28. package/dist/src/config.js +140 -0
  29. package/dist/src/contract-schema.d.ts +85 -0
  30. package/dist/src/contract-schema.js +56 -0
  31. package/dist/src/contract-worker.d.ts +1 -0
  32. package/dist/src/contract-worker.js +123 -0
  33. package/dist/src/contracts.d.ts +22 -0
  34. package/dist/src/contracts.js +123 -0
  35. package/dist/src/django-evidence.d.ts +2 -0
  36. package/dist/src/django-evidence.js +100 -0
  37. package/dist/src/django-runner.d.ts +1 -0
  38. package/dist/src/django-runner.js +80 -0
  39. package/dist/src/django.d.ts +9 -0
  40. package/dist/src/django.js +50 -0
  41. package/dist/src/dotnet-compiler.d.ts +1 -0
  42. package/dist/src/dotnet-compiler.js +87 -0
  43. package/dist/src/dotnet-evidence.d.ts +2 -0
  44. package/dist/src/dotnet-evidence.js +127 -0
  45. package/dist/src/dotnet-runner.d.ts +1 -0
  46. package/dist/src/dotnet-runner.js +167 -0
  47. package/dist/src/dotnet.d.ts +65 -0
  48. package/dist/src/dotnet.js +120 -0
  49. package/dist/src/engine.d.ts +19 -0
  50. package/dist/src/engine.js +239 -0
  51. package/dist/src/environment.d.ts +6 -0
  52. package/dist/src/environment.js +36 -0
  53. package/dist/src/eslint-evidence.d.ts +2 -0
  54. package/dist/src/eslint-evidence.js +98 -0
  55. package/dist/src/eslint-runner.d.ts +1 -0
  56. package/dist/src/eslint-runner.js +61 -0
  57. package/dist/src/eslint.d.ts +2 -0
  58. package/dist/src/eslint.js +40 -0
  59. package/dist/src/evidence.d.ts +2 -0
  60. package/dist/src/evidence.js +313 -0
  61. package/dist/src/external-adapter.d.ts +164 -0
  62. package/dist/src/external-adapter.js +265 -0
  63. package/dist/src/external-evidence.d.ts +2 -0
  64. package/dist/src/external-evidence.js +127 -0
  65. package/dist/src/external-runner.d.ts +1 -0
  66. package/dist/src/external-runner.js +122 -0
  67. package/dist/src/fastapi-evidence.d.ts +2 -0
  68. package/dist/src/fastapi-evidence.js +126 -0
  69. package/dist/src/fastapi-runner.d.ts +1 -0
  70. package/dist/src/fastapi-runner.js +84 -0
  71. package/dist/src/fastapi.d.ts +10 -0
  72. package/dist/src/fastapi.js +52 -0
  73. package/dist/src/fetch-pack.d.ts +16 -0
  74. package/dist/src/fetch-pack.js +154 -0
  75. package/dist/src/finding-policy-schema.d.ts +146 -0
  76. package/dist/src/finding-policy-schema.js +70 -0
  77. package/dist/src/finding-policy.d.ts +62 -0
  78. package/dist/src/finding-policy.js +206 -0
  79. package/dist/src/git-selection.d.ts +3 -0
  80. package/dist/src/git-selection.js +229 -0
  81. package/dist/src/go-directives.d.ts +1 -0
  82. package/dist/src/go-directives.js +32 -0
  83. package/dist/src/go-scope.d.ts +11 -0
  84. package/dist/src/go-scope.js +122 -0
  85. package/dist/src/golangci-evidence.d.ts +2 -0
  86. package/dist/src/golangci-evidence.js +92 -0
  87. package/dist/src/golangci-runner.d.ts +1 -0
  88. package/dist/src/golangci-runner.js +124 -0
  89. package/dist/src/golangci.d.ts +2 -0
  90. package/dist/src/golangci.js +35 -0
  91. package/dist/src/guidance.d.ts +98 -0
  92. package/dist/src/guidance.js +247 -0
  93. package/dist/src/index.d.ts +31 -0
  94. package/dist/src/index.js +16 -0
  95. package/dist/src/inventory.d.ts +4 -0
  96. package/dist/src/inventory.js +94 -0
  97. package/dist/src/java-compiler.d.ts +1 -0
  98. package/dist/src/java-compiler.js +110 -0
  99. package/dist/src/java-evidence.d.ts +2 -0
  100. package/dist/src/java-evidence.js +114 -0
  101. package/dist/src/java-runner.d.ts +1 -0
  102. package/dist/src/java-runner.js +79 -0
  103. package/dist/src/java.d.ts +25 -0
  104. package/dist/src/java.js +102 -0
  105. package/dist/src/jest-evidence.d.ts +2 -0
  106. package/dist/src/jest-evidence.js +117 -0
  107. package/dist/src/jest-runner.d.ts +1 -0
  108. package/dist/src/jest-runner.js +46 -0
  109. package/dist/src/jest.d.ts +2 -0
  110. package/dist/src/jest.js +36 -0
  111. package/dist/src/junit.d.ts +18 -0
  112. package/dist/src/junit.js +157 -0
  113. package/dist/src/laravel-evidence.d.ts +2 -0
  114. package/dist/src/laravel-evidence.js +175 -0
  115. package/dist/src/laravel-runner.d.ts +1 -0
  116. package/dist/src/laravel-runner.js +168 -0
  117. package/dist/src/laravel.d.ts +8 -0
  118. package/dist/src/laravel.js +50 -0
  119. package/dist/src/local-tool.d.ts +1 -0
  120. package/dist/src/local-tool.js +19 -0
  121. package/dist/src/mcp.d.ts +14 -0
  122. package/dist/src/mcp.js +362 -0
  123. package/dist/src/mutation.d.ts +118 -0
  124. package/dist/src/mutation.js +370 -0
  125. package/dist/src/mypy-evidence.d.ts +2 -0
  126. package/dist/src/mypy-evidence.js +63 -0
  127. package/dist/src/mypy.d.ts +2 -0
  128. package/dist/src/mypy.js +59 -0
  129. package/dist/src/node-reporter.d.ts +1 -0
  130. package/dist/src/node-reporter.js +28 -0
  131. package/dist/src/nuxt-evidence.d.ts +2 -0
  132. package/dist/src/nuxt-evidence.js +160 -0
  133. package/dist/src/nuxt-protocol.d.ts +52 -0
  134. package/dist/src/nuxt-protocol.js +29 -0
  135. package/dist/src/nuxt-runner.d.ts +1 -0
  136. package/dist/src/nuxt-runner.js +165 -0
  137. package/dist/src/nuxt.d.ts +24 -0
  138. package/dist/src/nuxt.js +105 -0
  139. package/dist/src/output.d.ts +3 -0
  140. package/dist/src/output.js +48 -0
  141. package/dist/src/phpstan-evidence.d.ts +2 -0
  142. package/dist/src/phpstan-evidence.js +81 -0
  143. package/dist/src/phpstan.d.ts +2 -0
  144. package/dist/src/phpstan.js +51 -0
  145. package/dist/src/phpunit-evidence.d.ts +2 -0
  146. package/dist/src/phpunit-evidence.js +53 -0
  147. package/dist/src/phpunit.d.ts +2 -0
  148. package/dist/src/phpunit.js +58 -0
  149. package/dist/src/pint-evidence.d.ts +2 -0
  150. package/dist/src/pint-evidence.js +79 -0
  151. package/dist/src/pint-runner.d.ts +1 -0
  152. package/dist/src/pint-runner.js +53 -0
  153. package/dist/src/pint.d.ts +2 -0
  154. package/dist/src/pint.js +37 -0
  155. package/dist/src/playwright-evidence.d.ts +2 -0
  156. package/dist/src/playwright-evidence.js +127 -0
  157. package/dist/src/playwright-reporter.d.ts +10 -0
  158. package/dist/src/playwright-reporter.js +37 -0
  159. package/dist/src/playwright-runner.d.ts +1 -0
  160. package/dist/src/playwright-runner.js +61 -0
  161. package/dist/src/playwright.d.ts +2 -0
  162. package/dist/src/playwright.js +35 -0
  163. package/dist/src/policy-pack.d.ts +21 -0
  164. package/dist/src/policy-pack.js +41 -0
  165. package/dist/src/pytest-evidence.d.ts +2 -0
  166. package/dist/src/pytest-evidence.js +116 -0
  167. package/dist/src/pytest-runner.d.ts +1 -0
  168. package/dist/src/pytest-runner.js +48 -0
  169. package/dist/src/pytest.d.ts +2 -0
  170. package/dist/src/pytest.js +25 -0
  171. package/dist/src/report-validation.d.ts +129 -0
  172. package/dist/src/report-validation.js +27 -0
  173. package/dist/src/review.d.ts +270 -0
  174. package/dist/src/review.js +349 -0
  175. package/dist/src/ruby.d.ts +2 -0
  176. package/dist/src/ruby.js +25 -0
  177. package/dist/src/ruff-evidence.d.ts +2 -0
  178. package/dist/src/ruff-evidence.js +99 -0
  179. package/dist/src/ruff.d.ts +2 -0
  180. package/dist/src/ruff.js +40 -0
  181. package/dist/src/runner.d.ts +8 -0
  182. package/dist/src/runner.js +117 -0
  183. package/dist/src/runtime-inventory.d.ts +112 -0
  184. package/dist/src/runtime-inventory.js +200 -0
  185. package/dist/src/rust-dep-info.d.ts +1 -0
  186. package/dist/src/rust-dep-info.js +46 -0
  187. package/dist/src/rust-evidence.d.ts +2 -0
  188. package/dist/src/rust-evidence.js +157 -0
  189. package/dist/src/rust-runner.d.ts +1 -0
  190. package/dist/src/rust-runner.js +161 -0
  191. package/dist/src/rust.d.ts +7 -0
  192. package/dist/src/rust.js +39 -0
  193. package/dist/src/sarif.d.ts +86 -0
  194. package/dist/src/sarif.js +113 -0
  195. package/dist/src/schemas.d.ts +393 -0
  196. package/dist/src/schemas.js +222 -0
  197. package/dist/src/staticcheck-evidence.d.ts +2 -0
  198. package/dist/src/staticcheck-evidence.js +75 -0
  199. package/dist/src/swift.d.ts +2 -0
  200. package/dist/src/swift.js +20 -0
  201. package/dist/src/task-store.d.ts +37 -0
  202. package/dist/src/task-store.js +349 -0
  203. package/dist/src/tool-versions.d.ts +3 -0
  204. package/dist/src/tool-versions.js +260 -0
  205. package/dist/src/types.d.ts +157 -0
  206. package/dist/src/types.js +37 -0
  207. package/dist/src/typescript-build-evidence.d.ts +2 -0
  208. package/dist/src/typescript-build-evidence.js +86 -0
  209. package/dist/src/typescript-build-runner.d.ts +1 -0
  210. package/dist/src/typescript-build-runner.js +132 -0
  211. package/dist/src/typescript-build.d.ts +2 -0
  212. package/dist/src/typescript-build.js +41 -0
  213. package/dist/src/typescript.d.ts +2 -0
  214. package/dist/src/typescript.js +54 -0
  215. package/dist/src/validation-task-worker.d.ts +1 -0
  216. package/dist/src/validation-task-worker.js +205 -0
  217. package/dist/src/validation-tasks-protocol.d.ts +69 -0
  218. package/dist/src/validation-tasks-protocol.js +57 -0
  219. package/dist/src/validation-tasks.d.ts +11 -0
  220. package/dist/src/validation-tasks.js +144 -0
  221. package/dist/src/vitest-evidence.d.ts +2 -0
  222. package/dist/src/vitest-evidence.js +112 -0
  223. package/dist/src/vitest-runner.d.ts +1 -0
  224. package/dist/src/vitest-runner.js +48 -0
  225. package/dist/src/vitest.d.ts +2 -0
  226. package/dist/src/vitest.js +36 -0
  227. package/dist/src/vue-router-capture.d.ts +42 -0
  228. package/dist/src/vue-router-capture.js +87 -0
  229. package/dist/src/vue-router-evidence.d.ts +2 -0
  230. package/dist/src/vue-router-evidence.js +126 -0
  231. package/dist/src/vue-router-protocol.d.ts +63 -0
  232. package/dist/src/vue-router-protocol.js +44 -0
  233. package/dist/src/vue-router-runner.d.ts +1 -0
  234. package/dist/src/vue-router-runner.js +88 -0
  235. package/dist/src/vue-router.d.ts +23 -0
  236. package/dist/src/vue-router.js +108 -0
  237. package/dist/src/vue-tsc-runner.d.ts +1 -0
  238. package/dist/src/vue-tsc-runner.js +24 -0
  239. package/dist/src/workspace.d.ts +7 -0
  240. package/dist/src/workspace.js +53 -0
  241. package/docs/ACCEPTANCE.md +56 -0
  242. package/docs/ACTIONLINT.md +112 -0
  243. package/docs/ARCHITECTURE-POLICY.md +82 -0
  244. package/docs/ARCHITECTURE.md +122 -0
  245. package/docs/CLANG.md +113 -0
  246. package/docs/CLIENTS.md +109 -0
  247. package/docs/CONTRACTS.md +73 -0
  248. package/docs/DEPENDENCIES.md +42 -0
  249. package/docs/DJANGO.md +70 -0
  250. package/docs/DOTNET.md +114 -0
  251. package/docs/ENVIRONMENTS.md +52 -0
  252. package/docs/ESLINT.md +68 -0
  253. package/docs/EVALUATION.md +124 -0
  254. package/docs/EXECUTION.md +250 -0
  255. package/docs/EXTERNAL-ADAPTERS.md +170 -0
  256. package/docs/EXTERNAL-EVALUATION.md +155 -0
  257. package/docs/EXTERNAL-RUFF-EVALUATION.md +85 -0
  258. package/docs/FASTAPI.md +73 -0
  259. package/docs/FINDING-POLICY.md +67 -0
  260. package/docs/GO-RACE.md +19 -0
  261. package/docs/GO-SCOPE.md +63 -0
  262. package/docs/GOLANGCI-LINT.md +64 -0
  263. package/docs/GUIDANCE.md +46 -0
  264. package/docs/IMPACT-MEASUREMENT.md +97 -0
  265. package/docs/INSTALLATION.md +102 -0
  266. package/docs/JAVA.md +79 -0
  267. package/docs/JEST.md +36 -0
  268. package/docs/JUNIT.md +31 -0
  269. package/docs/LANGUAGES.md +113 -0
  270. package/docs/LARAVEL.md +111 -0
  271. package/docs/MCP-COMPATIBILITY.md +68 -0
  272. package/docs/MUTATIONS.md +93 -0
  273. package/docs/MYPY.md +37 -0
  274. package/docs/NATIVE-CI.md +96 -0
  275. package/docs/NUXT.md +123 -0
  276. package/docs/PACK-DISTRIBUTION.md +98 -0
  277. package/docs/PERFORMANCE.md +71 -0
  278. package/docs/PEST.md +36 -0
  279. package/docs/PHPSTAN.md +48 -0
  280. package/docs/PHPUNIT.md +32 -0
  281. package/docs/PINT.md +41 -0
  282. package/docs/PLAN.md +265 -0
  283. package/docs/PLAYWRIGHT.md +73 -0
  284. package/docs/POLICY-PACKS.md +106 -0
  285. package/docs/PRIOR-WORKFLOW-EVALUATION.md +116 -0
  286. package/docs/PUBLICATION.md +28 -0
  287. package/docs/PYTEST.md +51 -0
  288. package/docs/RELEASE.md +115 -0
  289. package/docs/RENAMING.md +55 -0
  290. package/docs/REVIEW-EXCHANGE.md +136 -0
  291. package/docs/RUBY.md +50 -0
  292. package/docs/RUFF.md +39 -0
  293. package/docs/RUNTIME-INVENTORY.md +56 -0
  294. package/docs/RUST.md +74 -0
  295. package/docs/SARIF.md +64 -0
  296. package/docs/STATUS.md +530 -0
  297. package/docs/SWIFT.md +48 -0
  298. package/docs/TASK-STORAGE.md +141 -0
  299. package/docs/TOOL-IDENTITY.md +30 -0
  300. package/docs/TYPESCRIPT-BUILD.md +55 -0
  301. package/docs/VALIDATION-TASKS.md +119 -0
  302. package/docs/VITEST.md +36 -0
  303. package/docs/VUE-ROUTER.md +130 -0
  304. package/docs/VUE-TSC.md +26 -0
  305. package/docs/WORKSPACES.md +81 -0
  306. package/docs/licenses/nodable-entities-3.0.0.txt +21 -0
  307. package/docs/measurements/client-claude-before-schema-fix-darwin-arm64-node26.json +60 -0
  308. package/docs/measurements/client-claude-darwin-arm64-node26.json +55 -0
  309. package/docs/measurements/client-codex-darwin-arm64-node26.json +175 -0
  310. package/docs/measurements/evaluation-corpus-repo-verifier.json +332 -0
  311. package/docs/measurements/evaluation-darwin-arm64-node26.json +1236 -0
  312. package/docs/measurements/evaluation-linux-arm64-node22.json +1236 -0
  313. package/docs/measurements/external-eslint-darwin-arm64-node26.json +11866 -0
  314. package/docs/measurements/external-eslint-linux-arm64-node22.json +11866 -0
  315. package/docs/measurements/external-eslint-preservation.json +1527 -0
  316. package/docs/measurements/external-ruff-darwin-arm64-node26.json +1031 -0
  317. package/docs/measurements/external-ruff-linux-arm64-node22.json +1031 -0
  318. package/docs/measurements/hosted-ci-52ba415.json +1005 -0
  319. package/docs/measurements/impact-darwin-arm64-node26.json +6685 -0
  320. package/docs/measurements/impact-linux-arm64-node22.json +6690 -0
  321. package/docs/measurements/performance-darwin-arm64-node26.json +845 -0
  322. package/docs/measurements/performance-linux-arm64-node22.json +845 -0
  323. package/docs/measurements/required-native-profiles.json +500 -0
  324. package/package.json +72 -0
  325. package/packs/actionlint.json +8 -0
  326. package/packs/cpp.json +8 -0
  327. package/packs/dotnet.json +8 -0
  328. package/packs/go.json +7 -0
  329. package/packs/java.json +8 -0
  330. package/packs/javascript-node.json +7 -0
  331. package/packs/nuxt.json +7 -0
  332. package/packs/php-pest.json +7 -0
  333. package/packs/php-phpunit.json +7 -0
  334. package/packs/python-pytest.json +7 -0
  335. package/packs/ruby.json +7 -0
  336. package/packs/rust.json +7 -0
  337. package/packs/swift.json +7 -0
  338. package/packs/vue-router.json +7 -0
  339. package/packs/vue.json +11 -0
  340. package/schemas/actionlint-config.schema.json +19 -0
  341. package/schemas/architecture-policy.schema.json +51 -0
  342. package/schemas/architecture-report.schema.json +123 -0
  343. package/schemas/architecture-summary.schema.json +82 -0
  344. package/schemas/clang-database.schema.json +23 -0
  345. package/schemas/config.schema.json +69 -0
  346. package/schemas/contract-bundle.schema.json +78 -0
  347. package/schemas/contract-report.schema.json +114 -0
  348. package/schemas/contract-summary.schema.json +72 -0
  349. package/schemas/dependency-graph.schema.json +65 -0
  350. package/schemas/django-config.schema.json +16 -0
  351. package/schemas/dotnet-config.schema.json +60 -0
  352. package/schemas/external-manifest.schema.json +97 -0
  353. package/schemas/external-reference.schema.json +10 -0
  354. package/schemas/external-request.schema.json +56 -0
  355. package/schemas/external-result.schema.json +111 -0
  356. package/schemas/fastapi-config.schema.json +27 -0
  357. package/schemas/finding-baseline.schema.json +92 -0
  358. package/schemas/finding-comparison-summary.schema.json +95 -0
  359. package/schemas/finding-comparison.schema.json +121 -0
  360. package/schemas/guidance-context.schema.json +34 -0
  361. package/schemas/guidance-report.schema.json +176 -0
  362. package/schemas/guidance-summary.schema.json +68 -0
  363. package/schemas/java-config.schema.json +24 -0
  364. package/schemas/junit.schema.json +69 -0
  365. package/schemas/laravel-config.schema.json +11 -0
  366. package/schemas/mutation-recipe.schema.json +31 -0
  367. package/schemas/mutation-report.schema.json +238 -0
  368. package/schemas/mutation-summary.schema.json +98 -0
  369. package/schemas/nuxt-config.schema.json +51 -0
  370. package/schemas/plan-summary.schema.json +63 -0
  371. package/schemas/plan.schema.json +244 -0
  372. package/schemas/policy-pack.schema.json +41 -0
  373. package/schemas/report-summary.schema.json +100 -0
  374. package/schemas/report.schema.json +463 -0
  375. package/schemas/review-assessment.schema.json +133 -0
  376. package/schemas/review-context-summary.schema.json +31 -0
  377. package/schemas/review-context.schema.json +254 -0
  378. package/schemas/review-receipt-summary.schema.json +104 -0
  379. package/schemas/review-receipt.schema.json +271 -0
  380. package/schemas/review-selection.schema.json +30 -0
  381. package/schemas/runtime-comparison-summary.schema.json +68 -0
  382. package/schemas/runtime-comparison.schema.json +127 -0
  383. package/schemas/runtime-inventory.schema.json +99 -0
  384. package/schemas/vue-router-config.schema.json +67 -0
  385. package/server.json +47 -0
@@ -0,0 +1,141 @@
1
+ # Local validation task storage
2
+
3
+ `openTaskStore` is an optional library component for retaining validation results
4
+ on one local macOS or Linux machine. It is not connected to the CLI or MCP server.
5
+ The store itself does not advertise the MCP Tasks extension, execute jobs,
6
+ resume jobs, stop workers or act as a validation cache. The separate library
7
+ [validation worker](VALIDATION-TASKS.md) now connects it to native execution. See [MCP compatibility](MCP-COMPATIBILITY.md)
8
+ for the remaining wire and executor integration gates.
9
+
10
+ The implementation uses Node's built-in SQLite module, imported only when the
11
+ store is opened. Native tests cover Node 26.8.1 on macOS and Node 22.23.2 on Linux;
12
+ the latter reports SQLite as experimental. Earlier Node releases, Windows and
13
+ network filesystems are not verified storage profiles. Core imports do not load
14
+ SQLite, and no new npm runtime dependency is required.
15
+
16
+ ## Use from the library
17
+
18
+ Choose a dedicated storage directory with an existing canonical parent, outside
19
+ the project's inventoried source. An existing store directory must belong to the
20
+ current user with mode `0700`; database files must be singly linked regular files
21
+ with mode `0600`. New directories and files use these modes. Symbolic links,
22
+ unexpected directory entries and unrelated nonempty databases are rejected.
23
+
24
+ ```js
25
+ import { createPlan, validate, openTaskStore } from "@stsepelin/checktrail";
26
+
27
+ const store = await openTaskStore({
28
+ root: projectRoot,
29
+ directory: privateStoreDirectory,
30
+ detailed: false,
31
+ });
32
+ try {
33
+ const { plan } = await createPlan(projectRoot);
34
+ const task = store.create(plan.sourceFingerprint);
35
+ const report = await validate(projectRoot, { trusted: true });
36
+ const transition = store.complete(task.taskId, report);
37
+ if (transition !== "updated")
38
+ throw new Error("Task did not accept this result");
39
+ const retained = store.get(task.taskId);
40
+ // Consume retained.result.structuredContent as a report summary.
41
+ } finally {
42
+ store.close();
43
+ }
44
+ ```
45
+
46
+ Execution trust still comes from the caller. The caller must use the configured
47
+ root when validating; a source fingerprint is not proof of a particular root,
48
+ policy or environment. `complete` rejects a report whose initial source
49
+ fingerprint differs from the one recorded at creation. Full report shape is
50
+ validated, then the existing report projection is applied before serialization.
51
+ Summary databases never receive detailed report paths, commands or logs through
52
+ this API. Summary metadata can still reveal validation activity and check IDs.
53
+
54
+ Each database records a hash binding it to its canonical root and disclosure mode.
55
+ Reopening with a different root or mode fails, including an attempt to open a
56
+ detailed store as summary. Returned objects are detached snapshots. Stored
57
+ results remain historical evidence: reading them does not establish freshness
58
+ against current source, ignored dependencies or a changed toolchain.
59
+
60
+ ## State and ownership
61
+
62
+ Creation commits before returning an opaque UUID. Result completion and
63
+ cancellation transitions use SQLite transactions. A completed result retains the
64
+ original validation outcome, including failed or incomplete outcomes; task
65
+ completion never means that checks passed.
66
+
67
+ Only one store handle may own a directory at a time, including within one process.
68
+ A separate SQLite database holds an exclusive lock for the handle's lifetime.
69
+ The operating system releases this lock when the owning process exits, including
70
+ SIGKILL. Contending opens fail immediately; they do not recover or replace a live
71
+ owner's tasks. There are no PID-reuse guesses or time-based ownership leases.
72
+
73
+ On reopening, retained terminal results remain unchanged. Unfinished tasks become
74
+ `completed` with a fixed `isError: true` tool result describing interruption, and
75
+ no structured validation report. This matches the distinction between tool errors
76
+ and JSON-RPC errors in the [Tasks specification](https://tasks.extensions.modelcontextprotocol.io/specification/2026-07-28/tasks).
77
+ Interrupted work is never resumed or reported as passing. This store does not
78
+ establish that child processes from a crashed executor have stopped; that requires
79
+ executor lifecycle integration before exposing a durable MCP handle.
80
+
81
+ Cancellation has two stages:
82
+
83
+ 1. `requestCancellation(id)` reserves cancellation while status remains `working`.
84
+ Subsequent completion returns `cancellation-requested` and cannot store a result.
85
+ 2. After the executor confirms workers have stopped, call `finishCancellation(id)`.
86
+ It changes status to `cancelled` without a report. Calling it without requesting
87
+ cancellation throws.
88
+
89
+ `interrupt(id)` records the fixed tool error for an execution that cannot produce
90
+ a retained report; it also respects terminal states and cancellation reservations.
91
+ All terminal states are immutable through the API. A late transition returns
92
+ `terminal`; missing or expired IDs throw. Repeated cancellation requests return
93
+ `cancellation-requested`. A restart during cancellation produces an interruption
94
+ error, not an unverified claim that worker termination succeeded. This profile
95
+ has no interactive input or JSON-RPC error state.
96
+
97
+ ## Bounds and failure behavior
98
+
99
+ - At most 32 retained tasks per directory. Capacity exhaustion rejects creation;
100
+ unexpired tasks are never silently evicted.
101
+ - TTL defaults to 24 hours, measured from creation, and accepts integer milliseconds
102
+ from 1 through seven days. Wall-clock changes affect expiration. Expired IDs are
103
+ inaccessible; rows are pruned on creation or reopening.
104
+ - Each serialized tool result is limited to 256 KiB of UTF-8, including both text
105
+ and structured representations. Oversized completion throws and leaves the
106
+ task working. Retained payloads therefore total at most 8 MiB.
107
+ - SQLite uses 4 KiB pages with a 16 MiB database limit, DELETE journaling and FULL
108
+ synchronous commits. A rollback journal temporarily consumes additional bounded
109
+ space. The ownership database and accepted journal sizes have separate limits.
110
+ - Short synchronous database operations run on the caller's thread. The store
111
+ rejects malformed state, mismatched result representations and corrupt databases;
112
+ it does not erase an unreadable store and claim successful recovery.
113
+
114
+ File permissions and path checks assume trusted local ownership. They are not
115
+ protection against another process with the same user's privileges replacing or
116
+ modifying store files. Do not manipulate SQLite files while a handle is open.
117
+ SQLite secure deletion is enabled, but expiry is not a secure-erasure promise for
118
+ backups, filesystem snapshots or storage devices. Tests demonstrate process-crash
119
+ recovery, not arbitrary hardware or power-loss durability.
120
+
121
+ ## Reproduce
122
+
123
+ ```sh
124
+ npm run build
125
+ node --test dist/test/task-store.test.js
126
+ node scripts/verify-task-store-container.mjs
127
+ ```
128
+
129
+ Native regressions cover real validation and reopening, same-process and
130
+ cross-process contention, SIGKILL recovery, rollback of an uncommitted deletion,
131
+ completion/cancellation ordering, capacity and TTL, UTF-8 byte limits, disclosure
132
+ binding, private modes, links, foreign databases and malformed stored results.
133
+ The container helper additionally verifies a fresh offline production-only package
134
+ installation, native validation and reopening with networking disabled and the
135
+ installed package mounted read-only. Hosted CI remains a separate release gate.
136
+
137
+ Guard-removal experiments made the named cancellation and root-binding tests fail
138
+ for their intended conditions: a late completion was accepted after cancellation
139
+ reservation, and another project root could open the same store. Restoring each
140
+ guard restored the tests. The rollback fixture forces dirty pages to spill to disk
141
+ before killing its writer; it does not rely on an unflushed in-memory edit.
@@ -0,0 +1,30 @@
1
+ # Tool identity evidence
2
+
3
+ Detailed plans include how selected tool identities will be obtained. Planning
4
+ does not execute a version command or import project code. Validation captures
5
+ identities only after operator trust, before running checks. Detailed reports
6
+ retain the version, evidence method, native probe result or package metadata path.
7
+ Summaries omit this information along with other tool/environment details.
8
+
9
+ Native probes use the same bounded process runner, environment filtering,
10
+ cancellation signal, overall deadline and output budget as validation commands.
11
+ Each probe has an 8 KiB output limit. Identical probes under the same declared environment fingerprint are reused within one run;
12
+ there is no persistent version cache. Missing, nonzero, truncated, cancelled or
13
+ unrecognized version output is not identified. A successful check with an
14
+ unidentified required tool becomes incomplete; an actual check failure stays a
15
+ failure.
16
+
17
+ Node uses the running engine's version because JavaScript child commands use that
18
+ same executable path. Installed JavaScript tools use their package metadata,
19
+ resolved within the configured root; both package name and version are checked.
20
+ Python, Go, PHP and Ruff use version commands. Pytest and mypy use Python's installed
21
+ distribution metadata through the same selected `python3` runtime.
22
+
23
+ These methods identify the engine runtime and primary tools. Go's recorded version
24
+ identifies the `go` command, not an independently replaced `gofmt` binary. JavaScript
25
+ transitive tools, language plugins, compilers loaded behind another wrapper,
26
+ dependency trees, executable hashes and service versions are not fully fingerprinted.
27
+ Package metadata can be changed independently of code and is labeled accordingly.
28
+ This is not binary attestation, hermetic reproducibility, or proof that any version
29
+ is compatible. Native fixture results and the support matrix remain the evidence
30
+ for compatibility.
@@ -0,0 +1,55 @@
1
+ # TypeScript project-reference validation
2
+
3
+ Select `javascript.typescript-build` on a solution root with `tsconfig.json` and
4
+ an installed TypeScript compiler inside the configured repository. Unlike the
5
+ single-project `javascript.typescript` check, this check inventories TypeScript
6
+ source throughout the solution directory, including nested package boundaries.
7
+ Every inventoried source must appear in a native compiler program. Unrelated or
8
+ excluded source beneath that directory therefore makes the check incomplete.
9
+
10
+ The adapter uses TypeScript's solution-builder API to follow references in native
11
+ dependency order. It forces a fresh build, enables checking even when `noCheck`
12
+ is configured, and supplies an in-memory output filesystem. Declarations flow
13
+ from producers to consumers without writing JavaScript, declarations or build
14
+ state to disk. `noEmit` is overridden for this virtual build; emission happens
15
+ only in memory. Existing build state is not read, and virtual outputs shadow
16
+ existing declarations. Other type-checking options remain project policy.
17
+
18
+ Compiler/configuration diagnostics fail and retain native TS rule IDs and source
19
+ locations where available. Missing runtime integration, unsupported compiler
20
+ version, malformed evidence or omitted source is incomplete. Cyclic references
21
+ produce the native compiler diagnostic. Empty solutions cannot pass.
22
+
23
+ The integration is verified and version-gated to TypeScript 6.0.3. It uses the
24
+ compiler API rather than replacing TypeScript semantics. It does not run custom
25
+ build scripts, verify emitted bundles, install dependencies or validate Vue SFCs.
26
+ Those require their corresponding separate checks. Installed compiler code runs
27
+ only with operator trust and is not sandboxed.
28
+
29
+ Compiler reads are constrained to the configured root, including canonical
30
+ symlink targets. Missing/outside referenced configuration is rejected. Virtual
31
+ outputs must stay within that root and are bounded to 64 MiB and 20,000 entries.
32
+ References can cross the selected solution directory while staying inside the
33
+ configured repository; source outside the selected directory is not thereby
34
+ claimed as completely inventoried or validated. Select its own project or a
35
+ common solution root when that coverage is required.
36
+
37
+ ## Evidence
38
+
39
+ Synthetic native tests cover nested package boundaries, producer errors, changed
40
+ producer types breaking consumers, the corrected consumer, excluded source,
41
+ stale on-disk declarations/build state, cyclic references, escaped configuration
42
+ and output destinations, and planning without compiler execution. Preservation
43
+ assertions check original bytes and absent output paths. Parser tests cover
44
+ missing programs, duplicate/outside paths and partial evidence.
45
+
46
+ ```sh
47
+ npm run build
48
+ node --test dist/test/typescript-build.test.js
49
+ ```
50
+
51
+ Current native evidence is TypeScript 6.0.3 on macOS. Hosted platform runs remain
52
+ separate verification gates.
53
+
54
+ References: [project references](https://www.typescriptlang.org/docs/handbook/project-references.html),
55
+ [compiler API](https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API).
@@ -0,0 +1,119 @@
1
+ # Durable local validation worker
2
+
3
+ `openValidationTasks` connects the shared validation engine to the bounded local
4
+ [task store](TASK-STORAGE.md). This is a library API, not a daemon or an MCP
5
+ extension. The CLI and MCP server still use their existing execution paths.
6
+ Standard MCP Tasks remains unadvertised until its wire contracts and SDK routing
7
+ work; see [MCP compatibility](MCP-COMPATIBILITY.md).
8
+
9
+ ## Use
10
+
11
+ ```js
12
+ import { setTimeout as delay } from "node:timers/promises";
13
+ import { openValidationTasks } from "@stsepelin/checktrail";
14
+
15
+ const tasks = await openValidationTasks({
16
+ root: projectRoot,
17
+ directory: privateStoreDirectory,
18
+ allowExecution: true,
19
+ detailed: false,
20
+ timeoutMs: 30000,
21
+ });
22
+ try {
23
+ let task = await tasks.start();
24
+ while (task.status === "working") {
25
+ await delay(250);
26
+ task = await tasks.get(task.taskId);
27
+ }
28
+ console.log(task);
29
+ } finally {
30
+ await tasks.close();
31
+ }
32
+ ```
33
+
34
+ The store directory must satisfy the canonical-parent, private-permission and
35
+ local-filesystem requirements in `TASK-STORAGE.md`. Keep it outside inventoried
36
+ source, or inside an excluded directory. Native lifecycle tests cover macOS with
37
+ Node 26.8.1 and Linux with Node 22.23.2. Node 22's built-in SQLite is experimental.
38
+ The worker calls the same engine and adapter registry; the new worker-specific
39
+ native fixtures exercise Node validation, rather than claiming another full
40
+ native-toolchain compatibility matrix.
41
+
42
+ Execution permission, output mode, timeout, Git base, policy overlay, explicit
43
+ environment values and external adapter registrations are startup settings.
44
+ `start()` takes no arguments that can change them. Opening with
45
+ `allowExecution: false` permits reading retained results but rejects execution.
46
+ Starting a worker does not evaluate project source. The helper uses the current
47
+ Node executable, empty Node startup arguments and a narrow inherited environment;
48
+ parent `NODE_OPTIONS` preloads are not forwarded. Project execution still has the
49
+ user's privileges and is not sandboxed.
50
+
51
+ ## Operations and results
52
+
53
+ - `start()` performs execution-free planning, durably creates a task, then starts
54
+ validation. It returns the working task with an opaque ID. One validation or
55
+ pending start is allowed at a time; overlap is rejected, not silently queued.
56
+ - `get(id)` returns a detached snapshot while validation continues. Completed
57
+ reports retain their native `passed`, `failed` or `incomplete` outcome. A task
58
+ with status `completed` does not by itself indicate that checks passed.
59
+ - `cancel(id)` reserves cancellation, aborts the shared engine, waits for process
60
+ cleanup and then returns the terminal task. Completed tasks stay unchanged.
61
+ - `close()` rejects new work, stops active validation, waits for cleanup and
62
+ releases the store. It is idempotent. Always await it during normal shutdown.
63
+
64
+ The client wrapper bounds pending requests at 32. The store bounds retained tasks,
65
+ result bytes and disk pages separately. Task TTL is the store default of 24 hours;
66
+ this worker API does not accept per-call TTL overrides. Validation uses the
67
+ engine's timeout contract, defaulting to 30 seconds and accepting at most 120.
68
+ Timeouts retain native incomplete evidence when it fits the configured result
69
+ projection. Invalid, missing and expired IDs fail without exposing filesystem
70
+ paths or raw exceptions.
71
+
72
+ If validation throws, source identity no longer matches the task, or the selected
73
+ result projection exceeds the store limit, the task retains an explicit
74
+ `isError: true` interruption result with no structured validation report. A large
75
+ detailed report can exceed the limit even when its summary fits. A persistence
76
+ failure that also prevents recording interruption shuts down the worker; it is
77
+ not converted into a passing result. Historical results are not revalidated or
78
+ used as a cache on retrieval.
79
+
80
+ ## Ownership and parent loss
81
+
82
+ A child Node process owns both the SQLite handle and the active engine call. The
83
+ parent communicates through a local IPC channel; raw tool output is not forwarded
84
+ to the parent's stdout or stderr. The worker keeps the store's exclusive lock
85
+ until cleanup finishes, preventing a new owner from taking over live work.
86
+
87
+ When the parent disconnects or is killed, the worker detects the lost IPC channel,
88
+ reserves cancellation, aborts validation and closes the store after cleanup. Native
89
+ tests confirm that the running test and its ordinary descendant stop before the
90
+ worker's normal shutdown completes. SIGTERM and SIGINT to the worker use the same
91
+ cleanup path. The caller waits for process exit; it does not depend exclusively
92
+ on Node emitting `close` after simultaneous IPC disconnects.
93
+
94
+ This behavior covers loss of the parent while its worker survives to clean up.
95
+ It is not proof of cleanup if the worker itself is forcibly killed, native code
96
+ escapes its process group, or the operating system fails. After an abrupt store
97
+ owner death, the existing store recovery records unfinished work as an
98
+ interruption error and never resumes it. Broader orphan-process supervision is a
99
+ separate capability; no stronger guarantee is advertised here.
100
+
101
+ ## Reproduce
102
+
103
+ ```sh
104
+ npm run build
105
+ node --test --test-timeout=15000 dist/test/validation-tasks.test.js
106
+ node scripts/verify-task-store-container.mjs
107
+ ```
108
+
109
+ The native regressions exercise passing/failing/empty validation, retained results,
110
+ read-only reopening, trust and preload boundaries, responsive polling, overlap,
111
+ explicit cancellation, shutdown, parent SIGKILL, native descendants, timeout,
112
+ oversized output and close during planning. The container helper additionally
113
+ checks this API from a fresh offline production-only installation, with networking
114
+ disabled and the installed package mounted read-only. The corresponding hosted
115
+ Linux Node 22 step passed at `52ba415`; see `NATIVE-CI.md`.
116
+
117
+ Removing the worker's parent-disconnect handler made the named SIGKILL regression
118
+ fail because native descendants remained alive. Restoring the handler restored
119
+ the native suite. This experiment checks cleanup behavior, not just stored status.
package/docs/VITEST.md ADDED
@@ -0,0 +1,36 @@
1
+ # Vitest validation
2
+
3
+ Select `javascript.vitest` explicitly in the root policy. The adapter resolves an
4
+ installed Vitest within the configured root, including hoisted installations.
5
+ Planning reads paths only. Execution requires operator trust because configuration,
6
+ test code, plugins and setup/teardown hooks can run arbitrary code.
7
+
8
+ Scope is the project's inventoried `.test` and `.spec` files with JavaScript or
9
+ TypeScript extensions, including module/CommonJS and JSX/TSX variants. Each planned
10
+ file must appear exactly once in the native report. Configuration exclusions and
11
+ filters that omit a file produce incomplete evidence. A file executed repeatedly
12
+ through multiple Vitest projects is currently ambiguous and also incomplete.
13
+
14
+ The child invokes the public Vitest API in run mode with a JSON reporter explicitly
15
+ directed to stdout. It overrides configured report output files, watch mode,
16
+ snapshot updating, focused-test allowance, result caches and unhandled-error
17
+ bypasses. Automatic installation through Vitest's package installer is disabled;
18
+ missing dependencies must be prepared by the operator. User code can still write
19
+ files or access networks. This is not an execution sandbox.
20
+
21
+ Evidence reconciles native totals with per-assertion statuses and checks file
22
+ identity and suite counters. Empty, all-skipped, unfinished, malformed and
23
+ truncated reports cannot pass. Successful assertions cannot hide a failing suite,
24
+ unhandled error or nonzero process exit. Test logs that corrupt the JSON output
25
+ produce incomplete evidence rather than being guessed around. Detailed reports
26
+ retain native diagnostics; summaries omit them.
27
+
28
+ The integration suite exercises Vitest 5.0.1 with Vite 8.3.0, using original
29
+ synthetic tests. It covers passing/failing assertions, skips/todos, excluded files,
30
+ focused tests, snapshot protection, unhandled rejections and missing environment
31
+ packages. Other versions, browser mode, custom pools and workspace multi-project
32
+ duplication need separate verification. This check does not establish coverage
33
+ quality or type-checking support.
34
+
35
+ References: [Vitest reporters](https://vitest.dev/guide/reporters),
36
+ [Vitest API](https://vitest.dev/advanced/api/).
@@ -0,0 +1,130 @@
1
+ # Vue Router testing assembly profile
2
+
3
+ `javascript.vue-router` creates a native memory router, awaits an explicitly
4
+ selected registration function, captures its final route records and checks
5
+ declared URL probes using native resolution. A pass means every native record
6
+ participated in a probe and all expected matched chains agreed. It does not prove
7
+ that the selected testing assembly matches the application's production assembly.
8
+ Reuse application registration code instead of maintaining a second route table.
9
+
10
+ The verified versions are Vue Router 5.3.1 and Vue 3.5.43, with Node 26.8.1 on
11
+ macOS arm64 and Node 22.23.2 on Linux arm64. Other framework versions are unavailable
12
+ until verified. Framework dependencies must already exist inside the operator
13
+ root; the engine never installs them. Fixture dependencies are locked separately
14
+ in `scripts/vue-router-tools/package-lock.json` and are not distributed as runtime
15
+ dependencies of Checktrail.
16
+
17
+ ## Configuration
18
+
19
+ Select `javascript.vue-router` in `checktrail.json`, or use the pinned
20
+ `packs/vue-router.json` profile. Add `checktrail.vue-router.json` in that project:
21
+
22
+ ```json
23
+ {
24
+ "schemaVersion": 1,
25
+ "module": "routes.mjs",
26
+ "attribute": "configure",
27
+ "assembly": "example.catalog",
28
+ "environment": "test",
29
+ "strict": false,
30
+ "sensitive": false,
31
+ "probes": [
32
+ {
33
+ "path": "/catalog",
34
+ "matched": [{ "path": "/catalog", "name": "catalog" }]
35
+ }
36
+ ]
37
+ }
38
+ ```
39
+
40
+ The inventoried Node-compatible module exports the named function:
41
+
42
+ ```js
43
+ export async function configure(router) {
44
+ router.addRoute({
45
+ path: "/catalog",
46
+ name: "catalog",
47
+ component: { render: () => null },
48
+ });
49
+ }
50
+ ```
51
+
52
+ Use `name: null` for unnamed records. Each probe contains the complete ordered
53
+ matched chain, including parents and default children. Aliases are separate native
54
+ records and require participation too. A negative probe uses `matched: []`;
55
+ at least one probe must expect a match. Removed or replaced declarations that
56
+ are absent from the final router are not counted. Shadowed records that cannot
57
+ participate in any selected probe prevent a complete result.
58
+
59
+ Planning reads configuration without importing the module. Execution requires
60
+ the normal operator trust setting. The collector protects `NODE_ENV=test` and
61
+ clears `NODE_OPTIONS`; permitted environment inputs remain available to startup.
62
+ Startup and imports execute trusted code with the process user's privileges.
63
+ They can perform I/O or invoke other router methods themselves. This is not a
64
+ sandbox. Node must be able to load the module and its dependencies; the collector
65
+ does not build TypeScript/SFC files or install a loader.
66
+
67
+ ## Evidence and limits
68
+
69
+ The runtime inventory preserves native record order and multiplicity. Each entry
70
+ records path/name, alias identity, named view keys, canonical JSON metadata/static
71
+ redirect data, per-record guard function names, child count and the configured
72
+ global strict/sensitive options. Per-record matcher overrides are exercised by
73
+ probes but are not separately serialized. Component bodies, guard bodies, closure
74
+ captures, props, global navigation hooks and scroll behavior are not captured.
75
+ Changing a function body without changing the projected fields can leave the
76
+ inventory unchanged. Use runtime comparison to review changes in this projection.
77
+
78
+ The collector calls `resolve`, not navigation: it does not follow redirects, run
79
+ navigation guards, load lazy views, render components or initialize a browser.
80
+ Static redirect targets are recorded without proving they exist. Dynamic redirects,
81
+ symbol route names and unsupported metadata make capture incomplete. Metadata
82
+ supports bounded finite JSON values in plain objects and dense arrays; functions,
83
+ custom prototypes, symbol keys, computed properties, hidden object properties and
84
+ extra array properties are unsupported. Metadata and redirects are limited to
85
+ eight levels, 1,024 visited values, 64 members per object/array and 4,096 serialized
86
+ characters. The whole run retains shared process time/output limits.
87
+
88
+ Profiles have at most 256 unique probe paths, 32 records per expected chain and
89
+ 64 KiB of encoded configuration. Native capture permits 2,048 route records.
90
+ Empty routers, uncovered records, unsupported projections and malformed accounting
91
+ cannot pass. A known probe mismatch is a failed finding even if other evidence is
92
+ incomplete; `findingsComplete` records that distinction. Native resolution only
93
+ establishes behavior for the supplied URLs, not every path/parameter combination.
94
+
95
+ Detailed reports include route metadata and configured probe paths. Summary
96
+ CLI/MCP output omits them, and MCP arguments cannot enable detailed output.
97
+ The profile does not infer authorization, server endpoints, Nuxt page generation,
98
+ Nuxt plugins/middleware or application integration. Those need separate profiles
99
+ and native evidence.
100
+
101
+ ## Reproduce native evidence
102
+
103
+ From the checkout, prepare the development fixture tools explicitly:
104
+
105
+ ```sh
106
+ mkdir -p .checktrail/vue-router-tools
107
+ cp scripts/vue-router-tools/package.json scripts/vue-router-tools/package-lock.json .checktrail/vue-router-tools/
108
+ npm ci --prefix .checktrail/vue-router-tools --ignore-scripts --no-audit --no-fund
109
+ npm run build
110
+ node --test dist/test/vue-router.test.js
111
+ node scripts/verify-vue-router-container.mjs
112
+ ```
113
+
114
+ The container helper requires its pinned Node image to be available. Validation
115
+ uses disabled container networking and read-only source mounts. It runs native
116
+ fixtures, installs a freshly packed package offline, and exercises the public
117
+ `examples/vue-router` fixture through installed library, CLI and MCP entry points.
118
+ An intentionally changed route name must fail before the fixture is restored.
119
+ The source tests cover async registration, nested default children, aliases,
120
+ removed records, metadata changes, unprobed and shadowed records, unsupported
121
+ data, evidence tampering, version gates, trust, protected environment and output
122
+ privacy. Hosted CI is configured separately and has not been run remotely.
123
+
124
+ A manual mutation removed the requirement that every record participate in a
125
+ probe. The native uncovered-record regression then failed specifically because
126
+ the result changed from incomplete to passed. Restoring the guard restored the
127
+ passing native suite; container and package verification ran afterward.
128
+
129
+ Reference: [Vue Router API](https://router.vuejs.org/api/). Compatibility claims
130
+ above come from the pinned installed runtime and native tests.
@@ -0,0 +1,26 @@
1
+ # Vue type checking
2
+
3
+ Select `javascript.vue-tsc` explicitly. A project-local `tsconfig.json` and an
4
+ installed `vue-tsc` with TypeScript are required. Installations may be hoisted
5
+ within the configured root; escaping symlinks are rejected. Planning does not
6
+ load compiler code or execute configuration. Execution requires operator trust.
7
+
8
+ The adapter calls the installed Vue compiler with no emit, no incremental state,
9
+ `noCheck` disabled and a compiler file list. Every inventoried `.vue`, `.ts`,
10
+ `.tsx`, `.mts` and `.cts` file must appear in that list. A zero exit with excluded
11
+ source is incomplete. Compilation errors fail the check. Vue compiler options
12
+ are resolved through the installed language core, including inherited options;
13
+ `skipTemplateCodegen` is rejected. Other strictness and suppression choices follow
14
+ project configuration and are not a guarantee of complete semantic coverage.
15
+
16
+ Verified native versions: vue-tsc 3.3.11, Vue 3.5.43 and TypeScript 6.0.3. Fixtures
17
+ exercise script and template type errors, a valid SFC, excluded source, inherited
18
+ template disabling, filenames with spaces, and no emitted or incremental output.
19
+ Project references/composite builds, Nuxt-generated configuration, custom Vue
20
+ language plugins, custom file extensions and alternate loaders require separate
21
+ verification. A library check does not start Nuxt or generate its application
22
+ types. Missing generated configuration remains a compiler failure.
23
+
24
+ The installed compiler and project plugins run with the user's privileges.
25
+ See the official [Vue TypeScript guide](https://vuejs.org/guide/typescript/overview.html)
26
+ for the distinction between transpilation and SFC type checking.
@@ -0,0 +1,81 @@
1
+ # Workspace and Git selection
2
+
3
+ Checks still cover whole configured projects. Optional `--base REVISION` selects
4
+ changed projects and their declared transitive consumers:
5
+
6
+ ```json
7
+ {
8
+ "schemaVersion": 1,
9
+ "projects": [
10
+ { "path": "library", "checks": ["javascript.node-test"] },
11
+ { "path": "web", "checks": ["javascript.node-test"] }
12
+ ],
13
+ "workspace": {
14
+ "complete": true,
15
+ "dependencies": [{ "consumer": "web", "producer": "library" }]
16
+ }
17
+ }
18
+ ```
19
+
20
+ `complete` asserts that the maintainer has listed every relevant dependency
21
+ between configured projects. The engine does not infer imports or prove the
22
+ graph complete. Edges must name configured projects; duplicate and self edges
23
+ are rejected. Cycles terminate and include every reachable consumer.
24
+
25
+ ```sh
26
+ node dist/src/cli.js plan --root /path/to/worktree --base main --detailed
27
+ node dist/src/cli.js run --root /path/to/worktree --base main --trust-project
28
+ ```
29
+
30
+ The library accepts `base` in plan/validation options. For MCP, configure
31
+ `serve --base REVISION` at startup; tool calls cannot override it. Without a
32
+ base, the complete configured plan runs regardless of workspace declarations.
33
+
34
+ ## Comparison and fallback
35
+
36
+ The reader resolves base and HEAD to immutable commit IDs, reads committed trees
37
+ and NUL-delimited index entries, and hashes inventoried working files directly.
38
+ This covers committed changes, staged changes, dirty or deleted files, untracked
39
+ inventoried files and executable modes. Renames include both old and new owners.
40
+ The longest configured project directory owns a changed file.
41
+
42
+ The full configured plan is retained for missing Git/history/base, an incomplete
43
+ graph, no changed paths, a root or hidden configuration change, an unowned path,
44
+ a root-project change, unsupported index entries, unresolved merges, submodules,
45
+ tracked excluded content, inspection limits or inconsistent Git metadata. The
46
+ configured root must be the worktree root. Fallback is a broader validation run,
47
+ not a passing empty selection. It does not add unconfigured checks.
48
+
49
+ Git inspection uses a host executable outside the project and bounded read-only
50
+ commands. It disables filesystem monitors, hooks, lazy fetch and replacement
51
+ objects, and does not invoke working-tree diff, clean or text conversion filters.
52
+ Raw content comparison can select additional files when Git attributes transform
53
+ content; it cannot establish a normalized checkout identity. `.gitignore` is not
54
+ interpreted. The inventory's fixed exclusions still apply.
55
+
56
+ Each Git inspection has a five-second/four-MiB process-output budget, separate
57
+ from native validation execution. Entries and working-file reads use the same
58
+ 20,000-entry, eight-MiB-file and 64-MiB-total limits as inventory. Post-run Git
59
+ identity checks run in addition to the source snapshot. Changed HEAD/index or
60
+ unreadable metadata prevents an aggregate pass, even if source bytes stayed equal.
61
+
62
+ Detailed plans/reports record changed paths, selected projects, resolved commits,
63
+ Git version, an index fingerprint and a digest identifying the canonical worktree
64
+ root. Linked worktrees have distinct identities. Summaries retain selection mode,
65
+ reason and counts only. Neither identity is a hermetic build or dependency hash.
66
+
67
+ ## Evidence
68
+
69
+ Native synthetic tests exercise committed/index/working changes, newline paths,
70
+ renames, modes, linked worktrees, unresolved merges, tracked exclusions and
71
+ project-configured filter commands that must never run. A changed library selects
72
+ its consumer and exposes a real assertion failure. CLI/MCP scope and strict MCP
73
+ startup ownership are covered. Current host evidence is macOS with Git 2.54.0;
74
+ the paired [impact measurement](IMPACT-MEASUREMENT.md) additionally exercises
75
+ its documented corpus on Linux arm64 with Git 2.52.0. That narrower corpus does
76
+ not establish the full Git edge-case matrix on Linux. Other Git/OS combinations
77
+ need their own integration runs.
78
+
79
+ References: [tree entries](https://git-scm.com/docs/git-ls-tree),
80
+ [index entries](https://git-scm.com/docs/git-ls-files),
81
+ [revision resolution](https://git-scm.com/docs/git-rev-parse).
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nodable
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.