@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,109 @@
1
+ # Application client compatibility
2
+
3
+ The recorded snapshots below predate the Checktrail rename and retain their
4
+ original package identities. A release candidate needs its own client checks;
5
+ see [RENAMING.md](RENAMING.md).
6
+
7
+ The local package was installed offline into a fresh temporary consumer and tested
8
+ with Claude Code 2.1.263 and Codex CLI 0.154.0 on macOS arm64, Node 26.8.1. These
9
+ are specific client surfaces and versions; they do not establish compatibility
10
+ with every editor or with model-driven tool selection.
11
+
12
+ | Client surface | Observed protocol | Verified behavior |
13
+ | ------------------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
14
+ | Claude Code `mcp list` | `2025-11-25` | Successful connection and discovery of every advertised tool |
15
+ | Codex app-server direct MCP API | `2025-06-18` | Tool discovery, inspection, planning, HTTPS guidance results, default execution denial, rejection of tool-supplied trust, trusted native passing/failing/skipped-only runs, and exact retained report retrieval |
16
+
17
+ Both clients use the SDK's existing legacy negotiation path. The separate SDK
18
+ integration suite exercises `2026-07-28`; these application observations do not
19
+ establish modern protocol or standard Tasks support. See
20
+ [MCP compatibility](MCP-COMPATIBILITY.md).
21
+
22
+ The initial Claude Code check exposed an ignored `starts_with` format in the
23
+ guidance-reference URL output schema. That observation is retained in the
24
+ [pre-fix snapshot](measurements/client-claude-before-schema-fix-darwin-arm64-node26.json).
25
+ Guidance and exported Vue/Nuxt path constraints now use standard patterns, with
26
+ URI format metadata for guidance links. The current health check requires empty
27
+ stderr, rather than accepting that warning. It still does not call a tool or
28
+ establish full client-side validation of tool results.
29
+
30
+ Published schemas are also compiled with strict Ajv 2020-12 and standard formats.
31
+ Runtime and JSON Schema regressions cover valid HTTPS links, wrong schemes/prefixes,
32
+ length boundaries, route prefixes, authority-style probe paths, and Nuxt fragments
33
+ and newlines. The latter probe restrictions previously existed only in runtime
34
+ refinements; the exported schemas now express them too. This corrects the schema
35
+ representation without permitting values the runtime previously rejected. Zod's
36
+ [JSON Schema metadata](https://zod.dev/json-schema#metadata) carries the standard
37
+ URI format; [JSON Schema validation](https://json-schema.org/draft/2020-12/json-schema-validation)
38
+ defines the pattern and format vocabulary. Runtime-only refinements elsewhere are
39
+ not thereby proven equivalent to every exported schema.
40
+
41
+ Codex tests call its real app-server MCP API directly, without starting a model
42
+ turn. A synthetic Node assertion passes, is changed to fail, and is replaced by a
43
+ skipped test. The helper checks exact executed-test counters, result categories,
44
+ unchanged source during each run, and equality of retained reports. Summary
45
+ responses must not contain the temporary project path. This does not test an
46
+ editor UI, model reasoning, every tool, or cancellation of active native work.
47
+
48
+ ## Reproduce
49
+
50
+ The client executables must already be installed. The helper does not install or
51
+ update clients, authenticate, invoke a model, register a persistent user server,
52
+ or publish a package. Run from the source checkout after building:
53
+
54
+ ```sh
55
+ node scripts/verify-mcp-clients.mjs claude
56
+ node scripts/verify-mcp-clients.mjs codex
57
+ ```
58
+
59
+ Each run packs the current checkout, installs the tarball with npm offline and
60
+ lifecycle scripts disabled, creates an original synthetic fixture, and removes
61
+ its temporary installation afterward. A transparent stdio observer records only
62
+ protocol versions, methods, advertised tool names and process lifecycle metadata;
63
+ it forwards protocol bytes unchanged. Tool calls go through the actual client.
64
+ No custom MCP compatibility implementation is introduced.
65
+
66
+ Claude Code uses a fresh `CLAUDE_CONFIG_DIR`, bare mode, user settings from that
67
+ directory, and disabled nonessential traffic/marketplace auto-installation.
68
+ Its own `mcp add-json` writes only that temporary configuration. See the official
69
+ [configuration directory](https://code.claude.com/docs/en/claude-directory) and
70
+ [environment settings](https://code.claude.com/docs/en/env-vars) references.
71
+
72
+ Codex receives process-local configuration overrides. Existing named MCP servers
73
+ are individually disabled, and a preflight requires only the two synthetic
74
+ servers to be enabled. Apps, plugins and hooks are disabled for this invocation;
75
+ its ephemeral thread uses temporary state/log directories. Existing configuration
76
+ files and home-directory variables are not rewritten. Client policy constraints
77
+ can still prevent this profile from running; such failures are not passes.
78
+
79
+ The configured Codex provider points to a temporary loopback endpoint. It answers
80
+ only the observed model-catalog GET request; any inference request fails the
81
+ measurement. No model turn is submitted and no provider credentials are inherited
82
+ from the invoking environment. This is a direct client-integration check, not a
83
+ network-sandbox or client-telemetry attestation. The API schema was generated by
84
+ the installed CLI; the official [app-server reference](https://developers.openai.com/codex/app-server)
85
+ and [configuration reference](https://developers.openai.com/codex/config-reference)
86
+ describe those interfaces.
87
+
88
+ The observer checks that its own process and each observed server process have
89
+ stopped before deleting the temporary directory. Client shutdown can terminate an
90
+ observer before it records the server's exit event; recorded exit counts are
91
+ therefore separate from the process-liveness check. Neither establishes cleanup
92
+ of an active validation's descendants. That behavior has separate engine/SDK
93
+ lifecycle tests.
94
+
95
+ ## Recorded evidence
96
+
97
+ - [Claude Code observation](measurements/client-claude-darwin-arm64-node26.json)
98
+ - [Codex app-server observation](measurements/client-codex-darwin-arm64-node26.json)
99
+
100
+ Snapshots include the client/runtime versions, package and installed runtime
101
+ hashes, harness hash, observed protocols, outcomes and available exit records.
102
+ They omit source, raw client logs, configured personal server names and absolute
103
+ paths. The package digest identifies the measured tarball, not every later
104
+ checkout: changing documentation or adding these snapshots changes package bytes.
105
+ The runtime digest identifies the installed `dist/src` tree independently.
106
+
107
+ These local checks satisfy only the named client profiles. Claude Desktop,
108
+ Cursor, VS Code integrations, other client versions and target operating systems
109
+ remain unverified. No public package installation or hosted CI run is implied.
@@ -0,0 +1,73 @@
1
+ # Captured producer/consumer contracts
2
+
3
+ Contract validation checks actual JSON samples against a consumer's schema using
4
+ Ajv 8.20.0 and ajv-formats 3.0.1. It does not infer general schema compatibility or
5
+ run a service. Each contract names both sides, their recorded source fingerprints,
6
+ the consumer schema and named captured samples. The artifact format is versioned
7
+ by `contract-bundle.schema.json`.
8
+
9
+ ```sh
10
+ checktrail check-contracts --root /path/to/project --input contract.json
11
+ ```
12
+
13
+ The library exports async `validateContracts(bundle, {timeoutMs?, signal?})`.
14
+ MCP `contract_validation` accepts a local relative `input` and optional `timeoutMs`.
15
+ No project execution permission is needed to read and validate artifacts. MCP
16
+ allows one contract worker at a time, remains responsive to other tools, and
17
+ supports cancellation and connection/signal shutdown. Root, output mode and
18
+ execution permission remain operator settings.
19
+
20
+ The supported schema dialect is JSON Schema 2020-12. A root `type` is required;
21
+ empty or catch-all schemas cannot establish a meaningful contract here. Strict
22
+ schema/type/required checking and format assertions are enabled. Unknown keywords,
23
+ unknown formats and unsupported dialects are incomplete evidence. Local references
24
+ within the document are supported; external references, asynchronous schemas and
25
+ `$data` and OpenAPI-only `nullable`/`discriminator` extensions are rejected. Literal `$ref` names inside `const` or `enum`
26
+ values are data. No schema loader or network fetch is configured.
27
+
28
+ Validation does not coerce types, insert defaults or remove fields. For example,
29
+ `"2"` fails an integer requirement instead of being changed to `2`. Required fields,
30
+ numeric limits, extra properties, formats and nested array elements are checked
31
+ according to the schema. A valid payload says nothing about unexpressed business
32
+ rules. Missing samples and incomplete captures cannot pass.
33
+
34
+ Each contract is passed, failed or incomplete. Known payload failures take
35
+ precedence over other contracts' incompleteness; all counts remain visible.
36
+ `passed + failed + unverified = contracts`, and `accepted + rejected = samples`
37
+ for evaluated samples. Detailed results include contract/sample names and schema
38
+ keyword/instance/schema paths, without echoing payload values. Summaries omit those
39
+ identifiers. Exit codes are 0 passed, 1 failed, and 2 incomplete or malformed input.
40
+
41
+ Schema compilation and matching run in a worker with a default 10-second budget
42
+ (CLI default 30 seconds), configurable up to 30 seconds, a 64 MiB old-generation
43
+ heap limit, a 16 MiB young-generation limit and a 4 MiB stack limit. Timeout,
44
+ cancellation or worker failure returns incomplete evidence. Worker limits are not
45
+ a sandbox or a promise about total process memory. Inputs are limited to 8 MiB,
46
+ depth 32, 100,000 JSON values, 100 contracts and 1,000 samples per contract. Duplicate
47
+ contract IDs, duplicate sample names, missing payloads and non-JSON values are
48
+ rejected. The worker never loads producer or consumer application code.
49
+
50
+ Results carry `imported-contract-samples` provenance. A capture timestamp and source
51
+ fingerprints are declared evidence, not proof of origin, freshness, transport,
52
+ authorization, or complete behavior coverage. Use native isolated integration
53
+ tests to capture the producer output and consumer schema when those claims matter.
54
+
55
+ The synthetic `examples/contracts/` pair can be exercised from this checkout:
56
+
57
+ ```sh
58
+ node examples/contracts/capture.mjs > .checktrail/contracts.json
59
+ node dist/src/cli.js check-contracts --root . --input .checktrail/contracts.json
60
+ node examples/contracts/capture.mjs --broken > .checktrail/contracts.json
61
+ node dist/src/cli.js check-contracts --root . --input .checktrail/contracts.json
62
+ ```
63
+
64
+ Create `.checktrail/` first if it does not exist. The first capture serializes
65
+ numeric quantities; the second simulates a legacy string quantity and fails the
66
+ consumer schema. This example fingerprints its producer module and consumer schema
67
+ only. Tests cover native producer serialization, valid/invalid boundary payloads,
68
+ non-mutating validation, local references, formats, unsupported definitions, input
69
+ limits, pathological regex deadlines, cancellation and CLI/MCP privacy.
70
+
71
+ References: [JSON Schema 2020-12](https://json-schema.org/draft/2020-12),
72
+ [Ajv strict mode](https://ajv.js.org/strict-mode),
73
+ [Ajv validation options](https://ajv.js.org/options).
@@ -0,0 +1,42 @@
1
+ # Dependency provenance and notices
2
+
3
+ Run `node scripts/audit-dependencies.mjs` from the checkout after installing the
4
+ locked dependencies. It makes no network calls or project changes and emits a
5
+ JSON inventory of production npm packages, their exact versions, declared licenses,
6
+ registry tarball locations, lockfile integrity declarations and notice-file hashes.
7
+ The installed production dependency tree must reconcile with the lock. Missing
8
+ notices produce incomplete evidence; mismatches and stale fallback entries fail.
9
+
10
+ This audits installed metadata and notice presence. It does not recompute registry
11
+ tarball integrity over installed code, establish legal compliance, cover development
12
+ tools or establish native/container supply-chain provenance. The package uses npm
13
+ dependencies without bundling their code; installed packages retain their own
14
+ notices. Audit and retain those notices if distribution arrangements change.
15
+
16
+ ## Supplementary upstream notice
17
+
18
+ `@nodable/entities@3.0.0` declares MIT but its installed distribution omits a
19
+ license file. The supplementary notice is preserved verbatim at
20
+ [`licenses/nodable-entities-3.0.0.txt`](licenses/nodable-entities-3.0.0.txt).
21
+
22
+ The npm registry metadata for that exact version identifies Git commit
23
+ `d2070d76a8ba07e6c7fa142caeb51ffd756e47eb`. The notice was retrieved from that
24
+ commit's [root LICENSE](https://raw.githubusercontent.com/nodable/val-parsers/d2070d76a8ba07e6c7fa142caeb51ffd756e47eb/LICENSE).
25
+ Every distributed source/declaration file and the README was compared byte-for-byte
26
+ with the commit's `Entity/` directory and matched.
27
+
28
+ The upstream manifest says **2.2.0**, while the installed/registry manifest says
29
+ **3.0.0**. That discrepancy is preserved rather than treated as a matching release
30
+ manifest. The fallback records both versions, the exact installed file inventory
31
+ and SHA-256 digests. The offline audit rejects changed source, a changed notice,
32
+ an unused fallback or a newly bundled notice that makes the fallback stale.
33
+
34
+ `scripts/license-sources.json` records this preparation evidence. The supplementary
35
+ notice and this explanation ship inside the package's existing `docs/` allowlist.
36
+ No dependency version or package-manager signature setting was changed.
37
+
38
+ `node scripts/smoke-package.mjs` also compares two packs of the same checkout byte
39
+ for byte, checks the file allowlist and installs the tarball offline into a fresh
40
+ consumer. This demonstrates repeated packaging of one built checkout, not an
41
+ independent cross-platform rebuild or reproducible native toolchain. The dependency
42
+ audit and package smoke passed in the hosted matrix at `52ba415`; see `NATIVE-CI.md`.
package/docs/DJANGO.md ADDED
@@ -0,0 +1,70 @@
1
+ # Django URL inventory profile
2
+
3
+ Select `python.django-routes` and provide project-local
4
+ `checktrail.django.json`:
5
+
6
+ ```json
7
+ {
8
+ "schemaVersion": 1,
9
+ "settings": "settings",
10
+ "assembly": "catalog-api",
11
+ "environment": "isolated-test"
12
+ }
13
+ ```
14
+
15
+ The verified runtime is Django 6.1.1 on Python 3.12.13 in an isolated Linux
16
+ container. Other Django versions are unavailable until verified. Settings must
17
+ resolve to one inventoried local Python module or package. Planning does not
18
+ import settings, URLconfs or applications. Unselected framework profiles are not
19
+ loaded by other Python checks.
20
+
21
+ Trusted execution fixes `DJANGO_SETTINGS_MODULE` to the selected module, invokes
22
+ `django.setup()`, then recursively enumerates the actual root URL resolver. This
23
+ includes registrations made by application `ready()` hooks and nested included
24
+ URLconfs. No HTTP server, request, migration or package installation is started
25
+ by the adapter. Application setup can access services or files with the process
26
+ user's privileges; the declared environment label is not a sandbox. Supply isolated
27
+ settings and prepare any required services separately.
28
+
29
+ The supported profile handles native `URLPattern` and `URLResolver` with
30
+ `RoutePattern` and `RegexPattern`, plus Django's built-in integer, string, UUID,
31
+ slug and path converters. Custom route classes/converters, translated route
32
+ objects and locale-prefix patterns are incomplete evidence. Unsupported callable
33
+ identities, non-JSON default arguments, setup/resolver errors and empty URL tables
34
+ also cannot pass. Traversal is limited to depth 32 and 20,000 visited nodes, within
35
+ the shared execution time/output limits.
36
+
37
+ Each detailed check result includes a `runtime` route inventory compatible with
38
+ the runtime comparison tool. Entries retain ordered native pattern chains,
39
+ pattern class, regex text, regex flags and endpoint matching mode. The last field
40
+ matters because Django can use full matching or searching for identical regex
41
+ text. Namespace order, route name, handler identity and a hash of inherited/default
42
+ arguments are also captured. Defaults are hashed rather than emitted directly;
43
+ this is not a guarantee of secrecy for low-entropy values.
44
+
45
+ Exact duplicate pattern chains fail. Prefix/suffix names are compared exactly.
46
+ Equivalent URL matchers expressed through different nesting or regex syntax are
47
+ not normalized, and arbitrary pattern overlap is not analyzed. Request methods,
48
+ authorization, middleware effects, callback behavior and per-request URLconf
49
+ overrides are outside this projection. Regex matching is not executed against
50
+ sample request paths by this check.
51
+
52
+ The capture records native visited/unsupported counts, and the parser verifies
53
+ collection accounting, profile/source identity and canonical pattern signatures.
54
+ Known duplicates fail even if a different node is unsupported; incomplete
55
+ collection metadata remains available. Summary reports omit runtime entries and
56
+ application logs. The shared engine verifies source and policy after execution.
57
+ Check scope names the settings entry file, not every imported source file.
58
+
59
+ Native regression fixtures cover nested URLconfs, namespace capture, duplicated
60
+ resolver branches, fixed counterparts, regex endpoint-mode near misses, setup-time
61
+ registrations, empty tables, custom converters/routes and resolver failures. Tests
62
+ also verify non-executing planning, protected settings environment, malformed
63
+ evidence and skipped unused framework profiles. Reproduce prepared Linux tests
64
+ with `node scripts/verify-framework-container.mjs`; preparation dependencies are
65
+ pinned in `scripts/framework-tools.requirements.txt`. Hosted CI remains unexecuted.
66
+
67
+ References: [Django URL dispatcher](https://docs.djangoproject.com/en/6.0/topics/http/urls/),
68
+ [Django setup and settings](https://docs.djangoproject.com/en/4.2/topics/settings/).
69
+ Collector behavior is verified against installed Django 6.1.1 source and fixtures;
70
+ these references describe the underlying public concepts.
package/docs/DOTNET.md ADDED
@@ -0,0 +1,114 @@
1
+ # C# compilation
2
+
3
+ `dotnet.csharp` compiles all inventoried `.cs` files in a project as one explicitly
4
+ configured assembly. It requires one project-root `.csproj` marker, a prepared
5
+ .NET SDK 10.0.401, Roslyn 5.9.0 from that SDK, and the .NET 10.0.12 runtime and
6
+ reference pack. This profile has native evidence on arm64 Linux.
7
+
8
+ The project-root `checktrail.dotnet.json` declares the complete supported
9
+ configuration. For example:
10
+
11
+ ```json
12
+ {
13
+ "schemaVersion": 1,
14
+ "targetFramework": "net10.0",
15
+ "assemblyName": "Example.Catalog",
16
+ "languageVersion": "14",
17
+ "outputKind": "library",
18
+ "nullable": "enable",
19
+ "warningsAsErrors": true,
20
+ "allowUnsafe": false,
21
+ "checkedArithmetic": true,
22
+ "implicitUsings": false,
23
+ "defines": ["NET", "NET10_0", "NETCOREAPP"],
24
+ "references": []
25
+ }
26
+ ```
27
+
28
+ The adapter does not infer these settings from project XML, environment variables,
29
+ `.editorconfig`, response files or build targets. C# language versions 12, 13 and
30
+ 14 are accepted; preview versions are not. Nullable context accepts `enable`,
31
+ `disable`, `warnings` or `annotations`. The assembly name matters for accessibility,
32
+ including friend assemblies. Conditional symbols are exact explicit identifiers;
33
+ the adapter adds none automatically and does not check every preprocessor branch.
34
+
35
+ When requested, `implicitUsings` adds the fixed global imports for `System`,
36
+ `System.Collections.Generic`, `System.IO`, `System.Linq`, `System.Net.Http`,
37
+ `System.Threading` and `System.Threading.Tasks`. This owned syntax tree is counted
38
+ separately from project inputs. Source directives retain native compiler semantics.
39
+ The compiler enables its warning waves; `warningsAsErrors` controls promotion.
40
+ Diagnostics suppressed by the compiler cannot establish complete findings and
41
+ make an otherwise successful check inconclusive.
42
+
43
+ ## Dependencies and execution
44
+
45
+ Each optional reference has the shape `{ "path": "…dll", "sha256": "…" }`.
46
+ Paths resolve from the project, must remain inside the operator root and cannot
47
+ traverse symbolic links. Prepared DLLs can live in the excluded `.checktrail/`
48
+ directory. Exact bytes are checked during planning, before native compilation
49
+ and afterwards. Limits are 128 references, 32 MiB per DLL and 128 MiB total.
50
+ Duplicates, unpinned changes, non-managed files, standalone modules and multi-file
51
+ assemblies are rejected. Assembly-file metadata cannot bring in unpinned sidecars.
52
+
53
+ The runner locates the exact SDK and invokes its `csc.dll` directly to prepare an
54
+ owned compiler helper in a fresh temporary directory. It uses existing local
55
+ reference assemblies. It does not run MSBuild, NuGet restore, workloads, project
56
+ targets, source generators, analyzers, application initializers or tests. Project
57
+ `global.json` does not select a different SDK. No project assembly is loaded for
58
+ execution; reference assemblies are read as metadata. SDK compiler libraries are
59
+ trusted tooling and are loaded by the owned helper.
60
+
61
+ Native processes receive the snapshotted PATH and fixed .NET settings, including
62
+ disabled telemetry/diagnostics and invariant globalization. Other inherited or
63
+ operator-supplied environment values, including startup hooks and profiler
64
+ configuration, are not forwarded. Operator trust is still required: native
65
+ compilers and metadata readers have the process user's privileges, and this is
66
+ not a sandbox.
67
+
68
+ Project output is emitted into a bounded memory stream and discarded. Owned
69
+ helper artifacts are temporary; no `bin`, `obj` or application DLL is written
70
+ inside the project. Output is limited to 32 MiB, diagnostics to 2,000 entries,
71
+ native stdout/stderr to 1 MiB per invocation and 4 MiB total, and the prepared
72
+ argument to 100 KiB. Native managed heaps have a 256 MiB bound, which does not
73
+ bound total process memory. The engine's normal time and process-group limits
74
+ also apply.
75
+
76
+ ## Evidence and limitations
77
+
78
+ Every inventoried source must have a native syntax tree covering its complete
79
+ text and a completed semantic-model diagnostic query. Input paths are reconciled
80
+ exactly, including empty files and partial classes. The profile requires a
81
+ successful native emit with nonempty output, matching declared options and
82
+ reference counts. Compiler, runtime and SDK identities are retained, together
83
+ with a digest of the reference-pack DLLs and compiler assemblies checked before
84
+ and after the run. This is not a digest of the entire installed SDK or runtime.
85
+
86
+ The helper uses Roslyn's
87
+ [semantic model](https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/get-started/semantic-analysis)
88
+ and compilation emit diagnostics. Errors retain their `CS…` codes and original
89
+ source locations. Failed compilation has incomplete findings. Missing, malformed,
90
+ inconsistent or suppressed evidence cannot pass. Native compiler diagnostics are
91
+ not analyzer, framework, authorization or business-logic coverage.
92
+
93
+ The result means that the inventoried files compile under the explicit profile.
94
+ It does not prove equivalence to an SDK project build. Generated source under
95
+ `obj`/`build` is excluded and never silently included. Prepare required generated
96
+ source as inventoried files or a pinned assembly. F#, Visual Basic, scripts,
97
+ Razor/XAML, source generation, multi-project builds, other target frameworks,
98
+ MSBuild properties, package restore, format checks and test runners require
99
+ separate profiles. Solution files, including `.slnx`, are detected; select actual
100
+ C# project roots for compilation.
101
+
102
+ ## Reproduce
103
+
104
+ ```sh
105
+ npm run build
106
+ docker build --file scripts/dotnet-tools.Dockerfile --tag checktrail-dotnet-test:10.0.401 scripts
107
+ node scripts/verify-dotnet-container.mjs
108
+ ```
109
+
110
+ The helper checks the pinned native SDK/compiler, runs original synthetic cases
111
+ with networking disabled, and tests a fresh offline package installation through
112
+ the library, CLI and MCP. The host npm cache needs the production dependencies.
113
+ The hosted amd64 job passed at `52ba415`; see `NATIVE-CI.md`. Windows process-tree handling and
114
+ native macOS .NET execution remain unverified.
@@ -0,0 +1,52 @@
1
+ # Project environments
2
+
3
+ A project may declare required environment variable names in `checktrail.json`:
4
+
5
+ ```json
6
+ {
7
+ "schemaVersion": 1,
8
+ "projects": [
9
+ {
10
+ "path": ".",
11
+ "checks": ["javascript.node-test"],
12
+ "environment": ["APP_ENV", "DATABASE_URL"]
13
+ }
14
+ ]
15
+ }
16
+ ```
17
+
18
+ The declaration does not grant access. The CLI operator must name each permitted
19
+ variable, whose value is read from the CLI's environment:
20
+
21
+ ```sh
22
+ checktrail plan --root /path/to/project --allow-env APP_ENV --allow-env DATABASE_URL
23
+ checktrail run --root /path/to/project --trust-project --allow-env APP_ENV --allow-env DATABASE_URL
24
+ checktrail serve --root /path/to/project --allow-execution --allow-env APP_ENV --allow-env DATABASE_URL
25
+ ```
26
+
27
+ The library accepts an explicit `environment` record in `createPlan` and
28
+ `validate` options. MCP uses values captured at server startup; tool-call
29
+ arguments cannot add names, supply values or change permissions. Reading a
30
+ `.env` file is not part of this feature. Tools may independently read their own
31
+ configuration because executed project code is trusted, not sandboxed.
32
+
33
+ Only names requested by each configured project are added to that project's
34
+ validation processes and version probes. Other supplied values are not forwarded.
35
+ The existing minimal process environment remains present. Missing permission or
36
+ an unset required value makes that project's checks unavailable before execution.
37
+ A named but unset CLI permission is a startup error; explicitly empty values are
38
+ allowed. Names use uppercase ASCII letters, digits and underscores, start with a
39
+ letter or underscore, and are bounded along with values and the number of entries.
40
+ Duplicate names and conflicts with fixed adapter settings, such as Go's offline
41
+ proxy setting, are rejected.
42
+
43
+ Plans contain required names. Detailed results contain supplied names and a
44
+ SHA-256 fingerprint of their sorted values. Values are not copied into command
45
+ metadata; summary output omits names and fingerprints. Fingerprints are identity
46
+ signals, not secret encryption, and invoked tools can print values into detailed
47
+ logs. Tool identity reuse is scoped to the environment fingerprint. Operator
48
+ values are copied at the start of a library invocation and at MCP startup.
49
+
50
+ This supplies process configuration; it does not start databases, load credentials
51
+ from external services, validate service availability, or promise isolated tests.
52
+ Those prerequisites still need explicit preparation by the consumer.
package/docs/ESLINT.md ADDED
@@ -0,0 +1,68 @@
1
+ # ESLint validation
2
+
3
+ Select `javascript.eslint` in `checktrail.json`:
4
+
5
+ ```json
6
+ {
7
+ "schemaVersion": 1,
8
+ "projects": [{ "path": ".", "checks": ["javascript.eslint"] }]
9
+ }
10
+ ```
11
+
12
+ The project must have exactly one `eslint.config.js`, `eslint.config.mjs` or
13
+ `eslint.config.cjs`. The adapter selects that file explicitly; it does not search
14
+ outside the project for configuration or apply nested configuration overrides.
15
+ ESLint must already be installed in the project's `node_modules` or an ancestor's
16
+ `node_modules` within the operator-configured root. Missing or ambiguous
17
+ prerequisites produce an unavailable check. Planning only inspects paths.
18
+
19
+ ## Scope and execution
20
+
21
+ Candidates are inventoried `.js`, `.mjs`, `.cjs`, `.jsx`, `.ts`, `.mts`, `.cts`,
22
+ `.tsx` and `.vue` files owned by the detected project. Dependency/build exclusions
23
+ and nested project boundaries apply before planning. Configuration files with
24
+ these extensions are candidates too. Every candidate needs matching configuration
25
+ and at least one enabled rule; otherwise the check is incomplete.
26
+
27
+ After operator trust is granted, a child process loads the consumer's installed
28
+ ESLint API and configuration. It uses `calculateConfigForFile` and `lintText` for
29
+ each explicit file, preserving filenames containing spaces or glob characters.
30
+ It requests no fixes and does not use the file-cache path, preserving an existing
31
+ `.eslintcache`. Project configuration, plugins and processors remain executable
32
+ trusted code with the process user's privileges.
33
+
34
+ Rule settings and inline suppressions follow the selected configuration. This is
35
+ evidence that configured checks ran, not a judgment that the chosen rules are
36
+ sufficient. Suppression reconciliation and policy packs are separate future work.
37
+ The file must have enabled rules even if its contents happen to be empty.
38
+
39
+ ## Evidence
40
+
41
+ The child emits versioned JSON with the ESLint version, per-file configuration
42
+ and enabled-rule evidence, native diagnostics and counters. Parsing requires
43
+ exact planned paths, one result per configured file, consistent severity counts
44
+ and complete output. Ignored/unconfigured files, no enabled rules, malformed
45
+ output, unexpected stderr, cancellation or output truncation cannot yield pass.
46
+ Both errors and warnings fail a fully accounted check. Configuration/runtime
47
+ exceptions are execution errors, not code findings.
48
+
49
+ CLI and MCP use the same engine and interpretation. Summary output omits paths,
50
+ rule messages and source excerpts. Detailed mode includes the structured evidence
51
+ in the process output. Native lint diagnostics may contain source identifiers.
52
+
53
+ ## Verified scope
54
+
55
+ Integration tests exercise ESLint 10.10.0 on synthetic JavaScript: valid code,
56
+ syntax errors, rule errors/warnings, ignored files, unmatched TypeScript files,
57
+ disabled rules, invalid configuration, root-hoisted tooling, unusual filenames,
58
+ existing caches and CLI/MCP parity. Other versions, legacy `.eslintrc` files,
59
+ TypeScript configuration loaders and parser/processor combinations for TypeScript
60
+ or Vue are not verified by this adapter's integration suite. Those file types
61
+ are candidates so that lack of matching configuration remains visible.
62
+
63
+ Reference: [ESLint Node.js API](https://eslint.org/docs/latest/integrate/nodejs-api).
64
+
65
+ A separate [external integration evaluation](EXTERNAL-EVALUATION.md) checks
66
+ upstream-authored synthetic cases for three core rules against a frozen verifier
67
+ and the native CLI. This adds diagnostic-preservation evidence for those profiles;
68
+ it does not establish a general false-positive rate or parser/plugin compatibility.
@@ -0,0 +1,124 @@
1
+ # Detection and completeness evaluation
2
+
3
+ The recorded results use the archived `synthetic-evaluation-v1` corpus under
4
+ `measurements/evaluation-corpus-repo-verifier.json`. The current runnable corpus
5
+ is v2 with Checktrail configuration filenames; these historical measurements
6
+ do not validate v2. See [RENAMING.md](RENAMING.md).
7
+
8
+ The development evaluation compares Checktrail with direct native commands on
9
+ the same original synthetic Node, TypeScript and GitHub Actions inputs. The
10
+ versioned corpus is separate from the adapter regression tests and was authored
11
+ after those profiles were implemented. It is a small, paired convenience sample,
12
+ not independent held-out evidence or a comparison with a private review workflow.
13
+
14
+ ```sh
15
+ npm run build
16
+ node scripts/measure-evaluation.mjs > evaluation.json
17
+ ```
18
+
19
+ Prepare TypeScript from the locked development dependencies and the official
20
+ actionlint 1.7.12 release on `PATH` first. The harness installs nothing. Its only
21
+ inputs are the checked-in development corpus and prepared tools; it accepts no
22
+ custom executable commands. Fixtures are created in temporary directories and
23
+ removed after each case. The corpus remains unchanged during measurement.
24
+
25
+ ## Labels and observations
26
+
27
+ `scripts/evaluation-corpus.json` records an ID, family, original source files,
28
+ label and expected diagnostic signals for every case:
29
+
30
+ - `defect`: a deliberately broken assertion, type contract or workflow construct.
31
+ - `valid`: a corresponding valid example or valid boundary condition.
32
+ - `insufficient-evidence`: empty/skipped tests, a source outside compiler scope or
33
+ a local action whose metadata has not been prepared.
34
+ - `unsupported-profile`: a valid YAML alias outside this adapter's declared profile.
35
+
36
+ A failed command counts as a detected defect only when its expected diagnostic
37
+ signal is present. An unrelated runtime failure is not a detected assertion
38
+ defect. Incomplete observations remain in the relevant denominators and have
39
+ their own matrix column. Valid inputs that produce incomplete results are shown
40
+ separately from both passes and false-positive failures. Unknown/duplicate/missing
41
+ cases and malformed measurement processes fail the harness instead of shrinking
42
+ the sample. Source changes also invalidate measurement.
43
+
44
+ The report preserves per-case classifications, diagnostic identifiers, tool
45
+ versions, source fingerprints, native output digests and raw timings. It also
46
+ records hashes of the corpus, harness, runtime artifacts, compiler distribution
47
+ and package lock. These identities are checked before and after the run. Raw
48
+ source, logs, local paths and command environments are not stored in the report.
49
+
50
+ ## Native baseline and interpretation
51
+
52
+ The baseline is the exit status from these fixed native operations:
53
+
54
+ | Family | Native operation | Verifier difference |
55
+ | -------------- | ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
56
+ | Node | `node --test --test-reporter=tap value.test.js` | Structured event accounting requires executed, non-skipped tests |
57
+ | TypeScript | `tsc --project tsconfig.json --noEmit --incremental false --pretty false` | Forces `noCheck=false` and accounts for all inventoried source through the compiler file list |
58
+ | GitHub Actions | `actionlint -format '{{json .}}' -shellcheck= -pyflakes= -no-color .github/workflows/check.yml` | Explicit configuration, local input preparation and native per-file completion requirements |
59
+
60
+ This compares operational contracts, not competing parsing algorithms. In
61
+ particular, the additional TypeScript defect is caught because the verifier
62
+ overrides the fixture's `noCheck` setting. The native compiler honors that setting;
63
+ this is not a compiler defect. Likewise actionlint's acceptance of a YAML alias
64
+ is correct native behavior, while this adapter reports its unsupported profile.
65
+ Neither difference establishes generally better detection quality.
66
+
67
+ ## Recorded observations
68
+
69
+ The [macOS/Node 26 report](measurements/evaluation-darwin-arm64-node26.json) and
70
+ [Linux/Node 22 report](measurements/evaluation-linux-arm64-node22.json) agree on
71
+ classifications and expected diagnostic signals. In this fixed corpus, both
72
+ systems detect the ordinary broken/fixed pairs without failing their valid
73
+ counterparts. The verifier additionally identifies the disabled TypeScript
74
+ analysis and keeps the insufficient-evidence/profile cases from passing.
75
+
76
+ The Linux measurement ran with networking disabled and the repository mounted
77
+ read-only in the explicitly prepared `checktrail-actionlint-test:1.7.12` image.
78
+ The local immutable image reference was
79
+ `sha256:60fe972d5efcb28a85a9557afe5e8428949dfe675b57b52bf33e9b3e560354dd`.
80
+ Fixture directories were writable temporary storage inside the container.
81
+ This is local container evidence; hosted CI and Windows were not measured.
82
+
83
+ Every case has one observation per system. Native/engine order alternates between
84
+ cases; each engine observation starts a fresh Node worker. `wallMs` includes
85
+ process startup, engine import and child execution as applicable. `engineMs`
86
+ excludes worker startup/import. Fixture preparation, compiler copying and final
87
+ cleanup are outside the measured operation. Filesystem caches and scheduling are
88
+ uncontrolled. These timings describe this run, not a statistically established
89
+ overhead ratio or an isolated comparison between operating systems.
90
+
91
+ The paired, deliberately selected sample cannot justify population confidence
92
+ intervals or production false-positive estimates. Rates are exact fractions over
93
+ the stated corpus only; raw counts and all incomplete cases are retained. No
94
+ model was called, so model-token usage and provider cost are zero. Machine/runtime
95
+ cost, human review effort and the cost of creating this project are not measured.
96
+
97
+ ## External integration sample
98
+
99
+ A separate [external ESLint evaluation](EXTERNAL-EVALUATION.md) now uses upstream-
100
+ authored synthetic cases against a verifier frozen before inspecting them. It
101
+ compares diagnostic preservation with the native tool on macOS and Linux. This
102
+ does not turn the development corpus above into held-out evidence or establish
103
+ general review quality.
104
+
105
+ The [external Ruff cohort](EXTERNAL-RUFF-EVALUATION.md) adds Python diagnostic
106
+ preservation evidence on both platforms. Its mixed files do not supply a separate
107
+ clean-case denominator or establish native-rule effectiveness.
108
+
109
+ ## Remaining evidence
110
+
111
+ Independent end-to-end review cases beyond that integration sample, additional
112
+ rule/language families, larger workloads,
113
+ native tool configurations beyond these fixed baselines, and comparison with a
114
+ previous review process remain work. The project makes no equivalent-or-better
115
+ review-quality claim. A private baseline can be evaluated privately against the
116
+ same labels, with only aggregate results considered for public documentation.
117
+
118
+ The tests for the harness reject lost cases, duplicate IDs, invalid observations,
119
+ incorrect failure signals and removal of incomplete cases from denominators.
120
+ Recorded matrices are independently recomputed from their raw observations.
121
+
122
+ The [prior-workflow protocol](PRIOR-WORKFLOW-EVALUATION.md) specifies a provisional
123
+ public baseline, matched comparison arms, declaration requirements and independent
124
+ adjudication. No prior-workflow comparison has been run.