@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,115 @@
1
+ # Release preparation
2
+
3
+ The source is public at [stsepelin/checktrail](https://github.com/stsepelin/checktrail);
4
+ the first preview is `0.1.0-alpha.1`. `server.json` describes the
5
+ intended `io.github.stsepelin/checktrail` MCP registry identity and the matching
6
+ `@stsepelin/checktrail` npm package. The npm and registry names are proposed
7
+ metadata, not evidence of a published package or registry entry. Package publishing
8
+ is configured for public access on npm's `next` tag. No credentials or automatic
9
+ publishing workflow are stored in this repository.
10
+
11
+ ## Prepared artifacts
12
+
13
+ - The npm package has an explicit file allowlist, public MIT license, documentation,
14
+ versioned schemas and data-only packs. Dependency notice auditing and repeated
15
+ tarball comparison are implemented in the local verification scripts.
16
+ - `server.json` pins the package version and uses stdio. Its generated command
17
+ starts `serve` with a required operator-selected project root. Execution and
18
+ detailed output remain disabled; an operator can configure a trusted local
19
+ installation separately as documented in `README.md`.
20
+ - `package.json` declares `mcpName` matching the registry identity. A regression
21
+ test reconciles package, lockfile, engine and registry versions, starts the
22
+ metadata-derived command through an SDK client, verifies root-private summary
23
+ output and requires execution to remain denied. The offline package smoke also
24
+ loads the installed metadata and verifies its actual startup command.
25
+ - CI definitions cover the host suite and prepared native profiles. Local
26
+ containers and package checks are evidence only for the environments actually
27
+ exercised. All 13 hosted jobs passed at source baseline `52ba415`; the preview
28
+ release commit requires its own run. The local Claude Code health/discovery and
29
+ Codex direct app-server profiles have fresh-install evidence in `CLIENTS.md`.
30
+
31
+ The metadata follows the official registry
32
+ [publishing guide](https://github.com/modelcontextprotocol/registry/blob/main/docs/modelcontextprotocol-io/quickstart.mdx)
33
+ and the versioned
34
+ [2025-12-11 schema](https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json).
35
+ Registry metadata schema versions are separate from the MCP wire protocol version.
36
+ The official schema was downloaded and validated locally; its bytes are pinned
37
+ by the verifier below, without bundling a copied schema in the package.
38
+
39
+ ```sh
40
+ curl --fail --silent --show-error --location --max-time 30 \
41
+ https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json \
42
+ --output /tmp/checktrail-registry-schema.json
43
+ node scripts/verify-registry-metadata.mjs /tmp/checktrail-registry-schema.json
44
+ ```
45
+
46
+ The checker requires SHA-256
47
+ `3fba09590c99f61735d234822279f4223fab9e300c0a81e81c91ab62a4114de0`.
48
+ A changed schema must be reviewed before changing that pin. Schema validation
49
+ does not establish namespace ownership or registry acceptance. The current metadata
50
+ identifies this release as `preview` under publisher metadata. That label describes
51
+ release maturity, not whether npm or the MCP Registry has accepted it.
52
+
53
+ ## Preview publication sequence
54
+
55
+ The candidate review records the exact tarball SHA-256, file inventory, source
56
+ manifest and test evidence. Keep it outside the package allowlist. Client checks
57
+ must report the same tarball hash; repacking after an edit creates a new candidate.
58
+ The source commit must pass hosted CI before publication.
59
+
60
+ After explicit approval and npm authentication for the `@stsepelin` scope, publish
61
+ the approved file, not a newly packed working tree:
62
+
63
+ ```sh
64
+ npm publish /absolute/path/stsepelin-checktrail-0.1.0-alpha.1.tgz \
65
+ --tag next --access public --ignore-scripts --registry=https://registry.npmjs.org
66
+ ```
67
+
68
+ Verify the registry version and dist-tag, download its tarball, compare its digest
69
+ to the approved file, and repeat a fresh CLI/MCP installation check. This manual
70
+ tarball path does not claim npm build provenance. See
71
+ [npm publishing options](https://docs.npmjs.com/cli/v11/commands/npm-publish/).
72
+
73
+ Only after npm publication and separate registry authentication, publish the
74
+ reviewed `server.json` with the official `mcp-publisher` CLI. Verify the returned
75
+ server name, version, npm identifier and execution-disabled startup arguments
76
+ through the registry API. The registry verifies npm ownership using `mcpName`;
77
+ local schema validation alone cannot establish acceptance. See the official
78
+ [registry quickstart](https://github.com/modelcontextprotocol/registry/blob/main/docs/modelcontextprotocol-io/quickstart.mdx).
79
+
80
+ GitHub private vulnerability reporting is enabled. Use the channel linked in
81
+ `SECURITY.md`. Tags and GitHub releases also require explicit authorization.
82
+
83
+ ## Before a concrete release
84
+
85
+ 1. Select the supported release scope and version using `LANGUAGES.md` and
86
+ `EXECUTION.md`. Reconcile npm, lockfile, engine and registry versions and replace
87
+ the development-candidate status only when appropriate. Do not advertise Tasks
88
+ until the standard wire/lifecycle gates in `MCP-COMPATIBILITY.md` pass.
89
+ 2. Run `npm run check`, `npm run format:check`,
90
+ `node scripts/audit-dependencies.mjs`, then
91
+ `node scripts/prepare-package-cache.mjs` with network access before
92
+ `node scripts/smoke-package.mjs` performs its fresh offline installation.
93
+ Run the corresponding native verification helpers for every advertised profile.
94
+ Record actual tool/platform results and explicit skips. Repeat registry schema
95
+ validation against its pinned bytes.
96
+ 3. Inspect the exact tarball and its SHA-256, its source revision, dependency/notice
97
+ report, package allowlist, public examples and documentation. The smoke helper
98
+ compares repeated packing of the same checkout and tests a fresh offline install;
99
+ it does not establish reproducibility across operating systems or compiler builds.
100
+ 4. Obtain the required explicit authorization for the concrete commits, remote
101
+ creation and push. Establish the public repository, vulnerability reporting,
102
+ maintainer ownership and hosted CI evidence. No local script performs these
103
+ actions as a side effect.
104
+ 5. Re-run the supported client profiles in `CLIENTS.md` against the exact release
105
+ candidate, and complete independent evaluation gates for
106
+ any effectiveness claims. Development fixtures do not prove equal or better
107
+ review quality than a prior workflow; see `EVALUATION.md`.
108
+ 6. Present the exact version, tarball digest, tested scope and known limitations
109
+ for package/release/registry publication authorization. Configure the chosen npm
110
+ publishing identity and provenance mechanism, then verify the published package
111
+ before registry registration. The registry's npm ownership check uses the
112
+ published package's `mcpName`; a local file cannot satisfy that external gate.
113
+
114
+ No arbitrary adapter, broad framework/OS matrix or review-quality claim becomes
115
+ verified through publication. Keep the compatibility record alongside the release.
@@ -0,0 +1,55 @@
1
+ # Checktrail naming
2
+
3
+ Checktrail replaces the development name Repo Verifier before the first npm
4
+ publication. The preview version remains `0.1.0-alpha.1`; the package identity and
5
+ bytes change, so previous tarball hashes and approvals do not apply to this package.
6
+
7
+ | Surface | Current identity |
8
+ | ----------------------- | ------------------------------------------- |
9
+ | GitHub | `stsepelin/checktrail` |
10
+ | npm | `@stsepelin/checktrail` |
11
+ | CLI and MCP server name | `checktrail` |
12
+ | MCP Registry | `io.github.stsepelin/checktrail` |
13
+ | Project policy | `checktrail.json` |
14
+ | Native profiles | `checktrail.<profile>.json` |
15
+ | Private local artifacts | `.checktrail/` and `.checktrail.local.json` |
16
+
17
+ For an existing source checkout:
18
+
19
+ 1. Update the Git remote to `git@github.com:stsepelin/checktrail.git` and rebuild.
20
+ 2. Rename `repo-verifier.json` and each `repo-verifier.<profile>.json` to its
21
+ `checktrail` equivalent. The supported profiles are actionlint, django, dotnet,
22
+ fastapi, java, laravel, nuxt and vue-router. A remaining legacy policy or profile
23
+ causes planning to fail with a rename instruction; it cannot silently drop a
24
+ requirement and proceed with defaults. Remove duplicate old files when both
25
+ names exist.
26
+ 3. Update scripts, imports and MCP client registration using [INSTALLATION.md](INSTALLATION.md).
27
+ Registrations keep an absolute project root, so update that path if the
28
+ checkout directory was moved. Execution still requires explicit startup trust.
29
+ 4. Use `.checktrail/` for new reports and prepared development tools. Legacy
30
+ `.repo-verifier/` and `.repo-verifier.local.json` remain excluded from inventory
31
+ and Git to preserve the privacy of existing artifacts.
32
+
33
+ Internal native-runner markers, temporary paths and runtime producer names now use
34
+ Checktrail. Regenerate runtime captures with the new package when comparing them;
35
+ old producer identities are not rewritten into new observations. The runner-owned
36
+ temporary-directory environment variable is now `CHECKTRAIL_TEMP`.
37
+
38
+ ## Historical evidence
39
+
40
+ Existing JSON measurements retain their original names, versions, hashes, URLs
41
+ and observations. They describe the measured source and artifacts under the old
42
+ name, not verification of a later Checktrail build. Old repository links may
43
+ redirect after the GitHub rename.
44
+
45
+ The original synthetic evaluation corpus is retained byte-for-byte at
46
+ `measurements/evaluation-corpus-repo-verifier.json` so its recorded digests and
47
+ case accounting remain independently checkable. `scripts/evaluation-corpus.json`
48
+ is now `synthetic-evaluation-v2` with the new configuration filenames. The old
49
+ measurements do not establish results for that revised corpus. Reproduction
50
+ commands elsewhere in the documentation use current names; consult the recorded
51
+ source identity to reproduce a historical run exactly.
52
+
53
+ The pre-rename hosted CI baselines remain historical evidence. The rename commit
54
+ requires its own hosted run, and the renamed package requires fresh installation
55
+ and client checks before publication.
@@ -0,0 +1,136 @@
1
+ # Optional advisory review exchange
2
+
3
+ Checktrail can prepare a bounded source context for a human, local reviewer or
4
+ model-backed MCP client, then inspect a structured assessment returned by that
5
+ reviewer. The engine does not invoke inference, select a provider, upload source,
6
+ execute reviewer instructions or apply changes. This implements an exchange
7
+ workflow; it does not establish review quality or independently verify a defect.
8
+
9
+ Every receipt has `channel: advisory`, `automatedCoverage: false`,
10
+ `claimsVerified: false` and `deterministicOutcomeChanged: false`. It has no
11
+ validation outcome and cannot become a native finding, SARIF result or finding
12
+ baseline through this API. A reviewer reporting no observations is not a passing
13
+ validation result. Native validation continues through its existing engine.
14
+
15
+ ## Prepare a context
16
+
17
+ Select exact files and public guidance topics in a JSON artifact:
18
+
19
+ ```json
20
+ {
21
+ "schemaVersion": 1,
22
+ "files": ["catalog.mjs"],
23
+ "topics": ["test-lifecycle"]
24
+ }
25
+ ```
26
+
27
+ `examples/review` supplies an original synthetic source and selection. In a local
28
+ checkout, prepare an ignored artifact directory before capturing the context:
29
+
30
+ ```sh
31
+ mkdir -p examples/review/.checktrail
32
+ node dist/src/cli.js review-context --root examples/review \
33
+ --input selection.json --detailed --allow-review-source \
34
+ > examples/review/.checktrail/context.json
35
+ ```
36
+
37
+ The default output is a summary. `--detailed` alone still omits source and review
38
+ prose for these commands. Source-enabled review output requires both `--detailed`
39
+ and `--allow-review-source`. For MCP, these are server startup settings; tool
40
+ arguments cannot grant access. The same gate protects imported assessment prose
41
+ and quotations, which can themselves contain source or private information.
42
+ Library callers use `createReviewContext()` and explicitly choose their output
43
+ projection with `projectReviewContext()`.
44
+
45
+ Contexts contain exact UTF-8 text, per-file byte digests, the bounded inventory's
46
+ source fingerprint, selected public guidance, a fixed review instruction and a
47
+ content digest identifying the complete context. Files and topics are sorted;
48
+ duplicate selections fail. Source and comments are labeled untrusted data. They
49
+ may contain misleading instructions; neither the collector nor importer executes
50
+ them, and a consuming reviewer must maintain that boundary.
51
+
52
+ Limits are 16 files, 64 KiB per file, 128 KiB combined source and 16 public topics.
53
+ Sources must be inventoried regular files with normalized relative paths. Excluded
54
+ secrets/dependencies/build output and symlinks cannot be selected. Binary NUL data
55
+ and invalid UTF-8 are rejected. These exclusions are not a secret scanner: a
56
+ credential embedded in an ordinary source file remains source. Enabled source
57
+ output can reach the MCP client's provider according to that client's behavior.
58
+
59
+ Context collection compares before/after inventory fingerprints. This detects
60
+ ordinary concurrent edits but is not an atomic filesystem snapshot or protection
61
+ against adversarial filesystem races. Fingerprints retain the inventory's limits
62
+ for dependencies, external files and services. Saving output outside the ignored
63
+ artifact directory can itself change the inventory; creating a new excluded
64
+ directory after capture also changes the recorded exclusion list.
65
+
66
+ ## Receive an assessment
67
+
68
+ The reviewer returns the [assessment schema](../schemas/review-assessment.schema.json),
69
+ including the exact context digest, reviewer provenance, UTC creation time,
70
+ per-file dispositions and optional observations with exact source quotations.
71
+ Human reviewers declare a name; model reviewers declare provider, model and
72
+ version. Those identities and the reported creation time are declarations, not
73
+ verified credentials or measured execution evidence.
74
+
75
+ Usage fields are input tokens, output tokens, elapsed milliseconds and cost in
76
+ USD. Unknown values must be `null`, not zero. The engine labels every value
77
+ `reviewer-declared`; it does not infer pricing or claim a model call occurred.
78
+ Observations have a concern/suggestion label and at least one citation. IDs must
79
+ be unique. Files outside the selected context and reversed line ranges are rejected.
80
+ Out-of-bounds line numbers cannot match a quotation.
81
+ There are at most 64 observations, eight citations per observation and 256 KiB
82
+ of serialized assessment input.
83
+
84
+ Save the assessment under the ignored artifact directory and inspect it:
85
+
86
+ ```sh
87
+ node dist/src/cli.js review-receipt --root examples/review \
88
+ --context .checktrail/context.json \
89
+ --input .checktrail/assessment.json
90
+ ```
91
+
92
+ `receiveReview()` and MCP `review_receipt` use the same implementation. MCP
93
+ receives paths to local artifacts, not an arbitrary executable reviewer command.
94
+ The CLI returns 0 for a current, structurally accepted receipt with matching
95
+ quotations, and 2 for stale context, unmatched quotations or invalid input. Exit 0
96
+ means the receipt was processed; it does not approve code or verify claims.
97
+
98
+ The importer verifies the context's digest, captured bytes and current supported
99
+ guidance/instruction version, then compares the recorded inventory and selected
100
+ file bytes against current source. `freshness: current` only describes that
101
+ comparison. A recomputed digest cannot make fabricated source bytes current.
102
+ Older or modified instruction/catalogue contracts require an explicit migration;
103
+ they are rejected rather than silently interpreted as this version.
104
+
105
+ Citations use one-based inclusive line ranges. A quote must equal the complete
106
+ selected lines joined with LF, excluding the delimiter after the final line.
107
+ CR bytes in CRLF input are preserved. A matching quote establishes an anchor in
108
+ the recorded context, not the truth of the surrounding claim. After source changes,
109
+ a receipt can correctly say both `freshness: stale` and `citations.matched: 1`.
110
+
111
+ Coverage counters distinguish selected, declared reviewed, declared not reviewed
112
+ and unaccounted files. Missing dispositions stay visible; they are not silently
113
+ counted as reviewed. These counters describe the reviewer's accounting, not proof
114
+ that the reviewer inspected any file. Summaries omit paths, quotations, claims,
115
+ observation IDs and arbitrary reviewer names; they retain counts, usage declarations
116
+ and the opaque context digest. Detailed review output requires the source gate.
117
+
118
+ ## Evidence and remaining limits
119
+
120
+ Tests exercise original synthetic contexts and assessments, exact quotation
121
+ matching, stale and forged source, duplicate/out-of-scope inputs, binary and size
122
+ limits, native CLI/MCP permissions and unchanged native validation outcomes.
123
+ The package helper `node scripts/verify-review-container.mjs` runs the review tests
124
+ and an offline fresh-install library/CLI/MCP workflow in a pinned Linux container
125
+ with networking disabled and read-only source mounts. Status belongs in `STATUS.md`;
126
+ a helper definition alone does not establish a successful run.
127
+
128
+ Manual mutations removed the selected-file freshness check and replaced the review
129
+ disclosure gate with ordinary detailed mode. The forged-source regression then
130
+ incorrectly became current, and the MCP privacy regression exposed source without
131
+ the grant. Both tests failed on those exact changes and passed after restoration.
132
+
133
+ Synthetic model names in tests are labels, not evidence of inference. No independent
134
+ held-out assessment, prior-workflow comparison, model accuracy, measured token
135
+ cost or calibrated confidence is claimed by this feature. Those M5 evaluation
136
+ requirements remain separate from correctness of the exchange protocol.
package/docs/RUBY.md ADDED
@@ -0,0 +1,50 @@
1
+ # Ruby syntax profile
2
+
3
+ `ruby.syntax` parses each inventoried `.rb`, `.rake` and `.gemspec` file, plus
4
+ `Gemfile` and `Rakefile` DSL manifests. Project discovery uses Gemfile/gemspec
5
+ boundaries, so nested projects receive separate checks. Extension matching is
6
+ exact; backups and ERB/RBS files are not silently treated as Ruby source.
7
+
8
+ Each file runs through installed MRI Ruby with `--disable-gems -c`, with `RUBYOPT`
9
+ cleared to prevent injected preload flags. The native version probe uses the same
10
+ environment and gem control. Source paths are individual literal arguments, never
11
+ shell fragments. Planning only enumerates files. Execution retains the normal
12
+ operator trust gate and shared time/output/source-freshness limits.
13
+
14
+ Every planned process must complete with zero exit, exact `Syntax OK` output and
15
+ empty stderr for a pass. Nonzero syntax-check exits fail; missing executables,
16
+ warnings/ambiguous output, timeout, cancellation and changed source cannot create
17
+ a passing aggregate. No test counts, type guarantees, gem-resolution guarantees
18
+ or Rails boot coverage are reported. Ruby runtime code, including `BEGIN` blocks,
19
+ is not evaluated by the native syntax-check flag; the fixtures assert this using
20
+ file-write sentinels. Invoking an installed tool remains trusted process execution,
21
+ not a sandbox or a guarantee about arbitrary wrappers on PATH.
22
+
23
+ Verified native versions are MRI 4.0.7 on Alpine Linux and the available MRI
24
+ 2.6.10 on macOS. The older host version is compatibility evidence, not a runtime
25
+ recommendation. Other Ruby implementations/version output formats, RSpec,
26
+ Minitest, RuboCop, ERB/RBS checking and Rails integrations remain separate work.
27
+
28
+ The public fixture is `examples/ruby`. Run it with installed Ruby:
29
+
30
+ ```sh
31
+ node dist/src/cli.js run --root examples/ruby --trust-project
32
+ ```
33
+
34
+ The native container suite is `node scripts/verify-ruby-container.mjs`. It uses
35
+ already installed Ruby 4.0.7 and Node 22 images pinned by registry digest, records
36
+ their identities, disables
37
+ networking, and tests the public files in a temporary Linux copy. No gems are
38
+ installed. Native cases cover broken/fixed methods, misleading literal text,
39
+ per-file success evidence and top-level/BEGIN non-execution. Hosted CI evidence
40
+ remains pending; local tests do not establish remote matrix results.
41
+
42
+ Reference: [Ruby distributions and maintenance status](https://www.ruby-lang.org/en/downloads/).
43
+
44
+ The dedicated Ruby CI job prepares those pinned images and invokes the same
45
+ helper. `scripts/required-native-tests.json` identifies the exact native regression
46
+ that must pass. The required-test runner rejects skips, TODOs, missing or duplicate
47
+ required names, and failures elsewhere in the selected test file. A passing unit
48
+ test cannot replace the native regression. This job definition and its local
49
+ Linux/Node 22 execution are verified. The hosted job also passed at `52ba415`;
50
+ see `NATIVE-CI.md` for the separate run evidence.
package/docs/RUFF.md ADDED
@@ -0,0 +1,39 @@
1
+ # Ruff validation
2
+
3
+ Select `python.ruff` explicitly and provide `ruff` and `python3` on the operator's
4
+ PATH. The current identity profile probes both tools, even though the Ruff binary
5
+ itself does not need Python. The
6
+ adapter targets inventoried `.py` and `.pyi` files. It records native file
7
+ selection, resolved settings for each file, and JSON diagnostics. No dependencies
8
+ are installed. Planning does not execute Ruff or project configuration.
9
+
10
+ Execution forces exclusion rules to apply even to explicit filenames; any
11
+ excluded planned file prevents passing. Fixes, fix-only mode, unsafe fixes and
12
+ cache reuse are disabled. A pre-existing cache is preserved. Errors in native
13
+ configuration are execution errors, not successful checks. Diagnostics fail even
14
+ if the tool unexpectedly exits zero. Malformed or truncated output is incomplete.
15
+
16
+ The resolved settings must show at least one enabled rule not present in any
17
+ per-file ignore entry. This conservative bound does not implement Ruff's glob
18
+ matcher: a broad union of unrelated per-file ignores can make the result
19
+ incomplete even when the native tool has active rules for a particular file.
20
+ Inline suppression comments still follow native policy; suppression reconciliation
21
+ is distinct from exact normalized-finding reconciliation in `FINDING-POLICY.md`. This check does not certify rule sufficiency.
22
+
23
+ Native cases are verified with Ruff 0.16.8 in a prepared Linux container. They
24
+ cover valid source, unused imports, undefined names, invalid syntax, excluded
25
+ files, no enabled rules, broad per-file ignores, configured fix/fix-only settings,
26
+ filenames with spaces and cache preservation. Settings output is a versioned
27
+ text contract; unknown formats fail closed. Notebooks and other extensions are
28
+ not included. One settings command per source file consumes the shared time and
29
+ output budgets; large projects can require a future compact native integration.
30
+
31
+ The [Python container verification steps](PYTEST.md) also run these native Ruff
32
+ cases. Ruff absent from the host PATH causes an explicit native-test skip; it does
33
+ not count as verification. See the official [Ruff configuration reference](https://docs.astral.sh/ruff/configuration/)
34
+ for selection, exclusions and per-file settings.
35
+
36
+ An [external Ruff integration cohort](EXTERNAL-RUFF-EVALUATION.md) additionally
37
+ compares native and verifier diagnostics against pinned upstream snapshots on
38
+ macOS and Linux. It measures diagnostic preservation for those files, not general
39
+ review quality or a population false-positive rate.
@@ -0,0 +1,56 @@
1
+ # Runtime inventory comparison
2
+
3
+ `compare-runtime` compares complete declared collections of routes, listeners,
4
+ middleware, schedules and container bindings. It operates on local artifacts
5
+ without loading the application. The same implementation is exported as
6
+ `compareRuntimeInventories(before, after)` and exposed through MCP
7
+ `runtime_comparison` with relative `before` and `after` paths.
8
+
9
+ ```sh
10
+ checktrail compare-runtime --root /path/to/project \
11
+ --before before-runtime.json --after after-runtime.json --detailed
12
+ ```
13
+
14
+ The versioned `runtime-inventory.schema.json` records producer name/version,
15
+ assembly name/environment, source fingerprint, capture timestamp, and explicitly
16
+ named collections. Every collection declares completeness and whether entry
17
+ ordering matters. Entries have an exact key and flat attributes (strings,
18
+ numbers, booleans, null, or ordered string arrays). This permits framework
19
+ collectors to retain methods, paths, handlers, middleware, scheduling expressions,
20
+ binding implementations and singleton flags without embedding executable code.
21
+
22
+ Repeated registrations remain repeated entries. Comparison accounts for their
23
+ multiplicity; it never deduplicates listeners before comparing them. Attributes
24
+ are compared structurally, object property ordering is ignored, and attribute
25
+ array ordering is preserved. Declared ordered collections detect a pure reorder
26
+ even when every registration remains present. `orderChanged` specifically reports
27
+ that pure-reorder case; other changes are reported through added/removed entries.
28
+ A changed attribute counts as removing the previous registration and adding its
29
+ replacement. Exact identifiers are used throughout.
30
+
31
+ Both artifacts must name the same assembly, environment and producer. Versions
32
+ and source fingerprints may differ, as expected when comparing revisions.
33
+ Collection ordering modes must agree. Missing, incomplete or incompatible
34
+ collections are unverified; their absent entries are not reported as removals.
35
+ Unknown collection kinds, duplicates, unknown schema keys and malformed values
36
+ are errors. Empty complete collections are comparable; an entirely empty profile
37
+ is rejected. Limits are 8 MiB and 20,000 entries per artifact.
38
+
39
+ The result is `passed` for matching complete declared collections, `failed` for
40
+ known differences, and `incomplete` when remaining collections cannot be
41
+ compared. Known changes take precedence over incompleteness, which remains visible
42
+ in counts. `compared + unverified = collections`. Added/removed counts describe
43
+ registrations, while changed counts describe collections. Detailed results include
44
+ changed keys; summaries omit keys, attributes, assembly names and paths.
45
+
46
+ This is imported evidence, labeled `imported-runtime-comparison`. A matching
47
+ snapshot is not evidence of current source freshness, runtime capture correctness,
48
+ authorization correctness or coverage of unlisted assembly categories. A producer
49
+ must enumerate the actual runtime values, including package/default registrations,
50
+ and claim completeness only for categories it can inspect. Collector execution
51
+ belongs in a trusted isolated test environment. Native framework collectors and
52
+ their compatibility matrices are separate implementation gates.
53
+
54
+ Synthetic regressions cover every collection family, duplicate multiplicity,
55
+ attribute/order changes, exact-name near misses, missing versus empty collections,
56
+ partial evidence, artifact limits, CLI exit codes and MCP privacy/root boundaries.
package/docs/RUST.md ADDED
@@ -0,0 +1,74 @@
1
+ # Rust compilation profile
2
+
3
+ `rust.cargo-check` is the default check for an inventoried Cargo project. It uses
4
+ installed Rust/Cargo 1.98.1 and requires an existing local `Cargo.lock`. Planning
5
+ never invokes Cargo or build scripts. Validation needs the normal operator trust
6
+ permission; Cargo build scripts and procedural macros can execute project code.
7
+
8
+ The current profile supports one Cargo workspace member rooted at the discovered
9
+ project. Multi-package workspaces and other toolchain versions remain unavailable
10
+ until separately verified. Native fixtures run on Linux with the official
11
+ `rust:1.98.1-alpine` image and Node 22.23.2. The container helper prints resolved
12
+ image digests and disables networking. Host platforms beyond that fixture remain
13
+ unverified for this profile.
14
+
15
+ ## Execution and scope
16
+
17
+ The collector resolves native metadata with `--offline --locked --no-deps`, then
18
+ runs `cargo check --all-targets --offline --locked --message-format=json` with
19
+ fresh temporary target and build directories. Both native metadata directory
20
+ values must confirm the overrides before compilation starts. Existing target
21
+ directories are not reused. Incremental compilation and rustup's automatic
22
+ toolchain installation are disabled. No dependency or lockfile installation is
23
+ performed. These Cargo settings do not sandbox build scripts, macros or custom
24
+ compiler wrappers; their network and filesystem privileges remain the operator's.
25
+
26
+ Each inventoried `.rs` file must appear in fresh rustc dep-info dependencies. Each
27
+ declared native target must have a matching artifact, with test-mode artifacts
28
+ required where the target enables tests. Missing source, excluded feature targets,
29
+ missing test-mode compilation and artifacts marked fresh/reused are incomplete
30
+ evidence. No test bodies are executed and no test counters are reported. This does
31
+ not prove every conditional branch or feature combination was compiled. Default
32
+ Cargo features and the configured host/target apply; other feature/target matrix
33
+ profiles are not implemented.
34
+
35
+ Dep-info decoding supports ordinary paths, Unicode and escaped spaces. Newline,
36
+ backslash, dollar, hash and colon in the inventoried source paths are outside this
37
+ initial verified grammar. Malformed or unsupported dependency rules fail
38
+ completeness rather than being guessed. The collector bounds native output, build
39
+ inventory entries and dependency-file bytes; the shared process runner bounds
40
+ time, cancellation and total output. Temporary output is removed on normal runner
41
+ exit; forced termination can leave temporary files for host cleanup.
42
+
43
+ Compiler error diagnostics fail the check. Their normalized code, message and
44
+ available source location are retained; compilation errors are never eligible as
45
+ complete baselinable analysis. Warnings remain visible but do not fail this
46
+ compilation check. A nonzero Cargo exit without structured compiler-error evidence
47
+ is an execution/configuration error. A passing result requires a successful final
48
+ build event, complete target/source accounting and identified native tools.
49
+
50
+ This is compiler checking, not linking, Clippy, formatting, test execution or a
51
+ hermetic build guarantee. Dependency content, external files, custom wrappers and
52
+ all environment effects are not fully fingerprinted. Users with non-default
53
+ `CARGO_HOME`/`RUSTUP_HOME` locations can declare those environment requirements and
54
+ grant them through the existing operator environment mechanism.
55
+
56
+ ## Reproduce
57
+
58
+ With the pinned toolchain installed:
59
+
60
+ ```sh
61
+ node dist/src/cli.js run --root examples/rust --trust-project
62
+ ```
63
+
64
+ Change the module's numeric return to a string in a temporary copy to observe
65
+ `rustc/E0308`. Add an unlinked Rust file to observe incomplete scope. The development
66
+ native suite is `node scripts/verify-rust-container.mjs`; it uses already installed
67
+ images and does not pull them. It verifies escaped-space paths, broken/fixed code,
68
+ target/source accounting, preserved existing build output, unavailable workspaces
69
+ and build-script source. The fixture contains a deliberately panicking test body
70
+ to distinguish compilation from test execution.
71
+
72
+ References: [Cargo check](https://doc.rust-lang.org/cargo/commands/cargo-check.html),
73
+ [JSON messages](https://doc.rust-lang.org/cargo/reference/external-tools.html),
74
+ [rustup environment controls](https://rust-lang.github.io/rustup/environment-variables.html).
package/docs/SARIF.md ADDED
@@ -0,0 +1,64 @@
1
+ # SARIF export
2
+
3
+ The CLI and library export existing detailed validation reports as SARIF 2.1.0:
4
+
5
+ ```sh
6
+ checktrail run --root /path/to/project --trust-project --detailed > report.json
7
+ checktrail export-sarif --root /path/to/project --input report.json > results.sarif
8
+ ```
9
+
10
+ The input path is relative to the configured root and is subject to the normal
11
+ bounded-read and path-escape checks. Export only reads the report: it neither
12
+ executes project code nor establishes that a stored report still describes the
13
+ current source. Preserve the original command's exit status in CI; exports also
14
+ retain the report's passed/failed/incomplete exit convention.
15
+
16
+ ```js
17
+ import { exportSarif, validate } from "@stsepelin/checktrail";
18
+ const report = await validate(root, { trusted: true });
19
+ const sarif = exportSarif(report);
20
+ ```
21
+
22
+ ESLint, Ruff, PHPStan, Staticcheck, golangci-lint and TypeScript solution builds currently provide normalized source findings. Each has
23
+ its native rule identifier, severity, message, repository-relative file and line
24
+ when available. Columns are omitted until cross-tool character-unit behavior is
25
+ verified. These findings appear only in detailed reports. CLI/MCP summary output
26
+ continues to omit messages and paths.
27
+
28
+ Each selected check becomes a SARIF run. Rule IDs include both the check and
29
+ native rule ID, and locations use percent-encoded relative URIs with `%SRCROOT%`
30
+ as their base ID. No absolute base directory, source snippets, commands, logs or
31
+ environment values are exported. Native messages can still contain sensitive
32
+ project information; SARIF is an explicitly requested detailed artifact.
33
+
34
+ A completed analysis with source diagnostics has `executionSuccessful: true`
35
+ even when it found violations. Tool errors, unavailable/skipped/inconclusive
36
+ checks, source changes and failed checks without an explicit
37
+ `findingsComplete: true` evidence marker produce
38
+ error execution notifications and `executionSuccessful: false`. Generic command
39
+ or test failures never become invented source findings. Passed checks without
40
+ normalized diagnostics retain their status and indicate that normalized findings
41
+ are unavailable. Run properties preserve the complete report's outcome, source
42
+ and policy fingerprints, check status, test counts and labeled tool identities.
43
+ Do not interpret an empty results array as proof that validation passed.
44
+
45
+ Older reports without this optional marker remain readable, but failed checks
46
+ cannot claim complete SARIF execution. A finding can remain visible even when
47
+ file accounting or another native failure prevents complete analysis.
48
+
49
+ The exporter validates the detailed report schema and rejects contradictions
50
+ between its aggregate outcome and check statuses. It rejects absolute, escaping
51
+ or non-normalized finding paths. Stale findings remain visible with failed
52
+ execution metadata. Importing a report does not independently attest its origin.
53
+
54
+ Tests validate exports against the unmodified OASIS supporting schema, pinned by
55
+ SHA-256. That schema's language patterns require JavaScript regex compilation
56
+ without the Unicode flag because they contain an unescaped closing bracket;
57
+ the exporter does not emit a language field. Tests also exercise the real ESLint
58
+ adapter, CLI round trips, failed/incomplete/stale/empty reports, URI encoding,
59
+ message braces, schema rejection and unchanged summary privacy. The external
60
+ schema and its OASIS notices are development fixtures and are excluded from the
61
+ published package allowlist.
62
+
63
+ References: [OASIS SARIF 2.1.0 specification](https://docs.oasis-open.org/sarif/sarif/v2.1.0/os/sarif-v2.1.0-os.html),
64
+ [official supporting schema](https://docs.oasis-open.org/sarif/sarif/v2.1.0/cos02/schemas/sarif-schema-2.1.0.json).