@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,53 @@
1
+ import path from "node:path";
2
+ export function validateWorkspace(workspace, projects) {
3
+ const nodes = new Set(projects);
4
+ const seen = new Set();
5
+ for (const edge of workspace.dependencies) {
6
+ if (!nodes.has(edge.consumer) || !nodes.has(edge.producer))
7
+ throw new Error("Workspace dependency names an unconfigured project");
8
+ if (edge.consumer === edge.producer)
9
+ throw new Error("Workspace dependency cannot reference itself");
10
+ const key = JSON.stringify([edge.consumer, edge.producer]);
11
+ if (seen.has(key))
12
+ throw new Error("Duplicate workspace dependency");
13
+ seen.add(key);
14
+ }
15
+ }
16
+ export function affectedProjects(projects, files, workspace) {
17
+ const all = [...new Set(projects)].sort();
18
+ const fallback = (reason) => ({
19
+ projects: all,
20
+ reason,
21
+ affected: false,
22
+ });
23
+ if (!workspace?.complete)
24
+ return fallback("Workspace dependency completeness is not declared.");
25
+ if (!files.length)
26
+ return fallback("No changed paths were found; retaining full validation.");
27
+ const selected = new Set();
28
+ for (const file of files) {
29
+ if (path.posix.dirname(file) === "." ||
30
+ file.split("/").some((part) => part.startsWith(".")))
31
+ return fallback("Root or hidden configuration changed; impact is global.");
32
+ const owner = all
33
+ .filter((project) => project === "." || file.startsWith(`${project}/`))
34
+ .sort((a, b) => (b === "." ? 0 : b.length) - (a === "." ? 0 : a.length))[0];
35
+ if (!owner)
36
+ return fallback("A changed path has no configured project owner.");
37
+ if (owner === ".")
38
+ return fallback("A root-project change may affect nested projects.");
39
+ selected.add(owner);
40
+ }
41
+ let previous = -1;
42
+ while (previous !== selected.size) {
43
+ previous = selected.size;
44
+ for (const edge of workspace.dependencies)
45
+ if (selected.has(edge.producer))
46
+ selected.add(edge.consumer);
47
+ }
48
+ return {
49
+ projects: [...selected].sort(),
50
+ reason: "Changed projects and their declared transitive consumers were selected.",
51
+ affected: true,
52
+ };
53
+ }
@@ -0,0 +1,56 @@
1
+ # Milestone acceptance audit
2
+
3
+ This audit maps the original plan to implemented profiles and their recorded
4
+ verification. It does not replace the plan or promote an unverified capability.
5
+ Local implementation, local native evidence, hosted CI and publication are
6
+ separate states. Follow the linked evidence for tested versions and limits.
7
+
8
+ | Milestone | Implemented scope and evidence | Open acceptance work |
9
+ | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
10
+ | M0: public contracts | Original public fixtures, MIT license, security/contribution guidance, schemas, explicit package allowlist, dependency notices and CI definitions. `STATUS.md`, `SECURITY.md`, `RELEASE.md`. | Public source is published and all hosted jobs passed at `52ba415`. The preview candidate still requires its own release commit, CI and publication verification. |
11
+ | M1: executable foundation | Shared CLI/library/MCP engine, bounded inventory/runner, startup trust, native Node/Python/Go/PHP profiles, protocol and lifecycle regressions. `ARCHITECTURE.md`, `STATUS.md`, `MCP-COMPATIBILITY.md`. Fresh installed application-client profiles now have evidence in `CLIENTS.md`. | Application-client coverage beyond the named profiles. PHP remains unavailable when the consumer has no prepared runtime. |
12
+ | M2: practical language validation | Explicit JS/TS, Python, Go and PHP native tool profiles, structured diagnostics/test evidence, versions, environments, workspace selection, scope accounting, SARIF/JUnit and finding ratchets. `LANGUAGES.md`, adapter documents, `WORKSPACES.md`, `FINDING-POLICY.md`, `NATIVE-CI.md`. | Hosted toolchain profiles passed at `52ba415`. Wider tool versions/framework configurations must be promoted separately; detection is not execution support. |
13
+ | M3: framework/contracts | Native Laravel, Vue Router/Nuxt, Django/FastAPI assembly projections; imported runtime comparison, explicit architecture boundaries, producer/consumer schemas and a built package consumer. `RUNTIME-INVENTORY.md`, framework documents, `CONTRACTS.md`, `ARCHITECTURE-POLICY.md`, `examples/package-contract/README.md`. | Broader native semantics/import collection and live service integration are not implemented. Synthetic evidence does not establish equivalent results in a private application; private integration feedback must remain private. |
14
+ | M4: ecosystem/distribution | Bounded Rust, Java, C#, Ruby, Swift, Clang and actionlint profiles; trusted external adapters, pinned data-only pack distribution, fresh offline package checks, production notice audit, measured performance and unpublished registry metadata. `LANGUAGES.md`, `EXTERNAL-ADAPTERS.md`, `PACK-DISTRIBUTION.md`, `PERFORMANCE.md`, `RELEASE.md`. | Concrete preview release authorization and verification. Windows execution and the unimplemented subsequent integrations in `LANGUAGES.md` remain unsupported. Runtime/container/development dependency provenance is broader than the production npm notice audit. |
15
+ | M5: measured assistance | Advisory guidance, bounded Node mutation experiments, explicit-graph impact measurements, optional local/model review exchange, durable library task storage/worker, development evaluation and externally authored ESLint and Ruff integration cohorts. `GUIDANCE.md`, `MUTATIONS.md`, `IMPACT-MEASUREMENT.md`, `REVIEW-EXCHANGE.md`, `VALIDATION-TASKS.md`, `EVALUATION.md`, `EXTERNAL-EVALUATION.md`, `EXTERNAL-RUFF-EVALUATION.md`. | Standard MCP Tasks wire integration; wider held-out rule-family/review evidence, prior-workflow comparison and representative cost/latency measurement. No general equal-or-better review-quality claim is supported. |
16
+
17
+ ## Remaining work that can proceed locally
18
+
19
+ 1. Extend independently authored evaluation cohorts to additional implemented
20
+ language/rule families, preserving the verifier freeze and recording exact
21
+ selection, exclusions, native baselines and interpretation limits. New fixtures
22
+ authored after inspecting the implementation remain development tests.
23
+ 2. Run the comparison prepared in `PRIOR-WORKFLOW-EVALUATION.md` after resolving
24
+ the actual baseline, independently labeled public cases and reviewer/adjudicator. A native-tool comparison alone is not this baseline.
25
+ Model-assisted comparisons need declared model/version and actual inference
26
+ cost; review exchange by itself supplies neither effectiveness nor cost evidence.
27
+ 3. Continue the requirement-specific validation of any newly promoted profile.
28
+ Optional breadth is not a reason to mark already measured profiles unsupported,
29
+ and a measured profile is not permission to claim its whole ecosystem.
30
+
31
+ The recorded client schema warning is corrected and the current Claude Code
32
+ check requires no startup/schema warnings. Published schemas compile under strict
33
+ standard validation; URL/path boundary cases and actual Codex guidance retrieval
34
+ are verified in `CLIENTS.md`. The original frozen ESLint runtime and harness were
35
+ archived before that correction and replayed against the original observations
36
+ on both platforms; see `EXTERNAL-EVALUATION.md`. Later engine revisions must not
37
+ be silently substituted into that frozen holdout.
38
+
39
+ ## External gates
40
+
41
+ The pinned MCP server SDK routing probe still rejects `tasks/get` and `tasks/cancel` before their extension handlers
42
+ run. The local worker/store are available independently; standard Tasks must stay
43
+ unadvertised until routing and the integrated wire/lifecycle suite pass. See
44
+ `MCP-COMPATIBILITY.md` for the reproduction and upstream issue.
45
+
46
+ The public repository and initial commit `60131d6` are available on `main`.
47
+ All 13 hosted jobs passed at `52ba415`, recorded in `NATIVE-CI.md`.
48
+ That result identifies the source baseline, not an unpublished preview package. Package publishing, GitHub releases and registry
49
+ registration have not been performed. The repository's explicit-action
50
+ requirements still apply. `RELEASE.md` defines the concrete
51
+ candidate checks and the authorization sequence; a local green run does not
52
+ replace external acceptance.
53
+
54
+ This audit uses the existing execution ledger and recorded native observations.
55
+ It is not a fresh security review of every source file, an independent review of
56
+ the evaluation labels, or proof that the entire M0–M5 plan is complete.
@@ -0,0 +1,112 @@
1
+ # GitHub Actions workflow validation
2
+
3
+ `infrastructure.actionlint` statically checks inventoried
4
+ `.github/workflows/*.yml` and `*.yaml` files using the official actionlint 1.7.12
5
+ release executable. Planning reads files only. Execution requires operator trust
6
+ and an already prepared tool on `PATH`; the engine never downloads one.
7
+
8
+ Each workflow directory identifies its repository root, including nested roots.
9
+ Workflow dependencies use the full inventory below that root even when a local
10
+ action also contains a separate package manifest. Default planning retains an
11
+ unsupported result for Terraform, Helm and Kustomize markers beside workflows.
12
+ Selecting this check explicitly covers workflows only.
13
+
14
+ ## Configuration
15
+
16
+ Place `checktrail.actionlint.json` at the repository root:
17
+
18
+ ```json
19
+ {
20
+ "schemaVersion": 1,
21
+ "runnerLabels": [],
22
+ "variables": []
23
+ }
24
+ ```
25
+
26
+ `runnerLabels` lists additional self-hosted runner labels. Only literal ASCII
27
+ letters, digits, underscores and hyphens are accepted; glob patterns are rejected.
28
+ `variables` lists configuration-variable identifiers available to `vars` expressions.
29
+ An empty list declares none. Case-insensitive duplicates and unknown keys are
30
+ rejected. These declarations describe the expected environment; they do not query
31
+ GitHub or prove that a runner or variable exists. The generated schema is
32
+ `schemas/actionlint-config.schema.json`; runtime validation also checks duplicates.
33
+
34
+ To select the profile explicitly, use `infrastructure.actionlint` in the
35
+ repository policy. `packs/actionlint.json` is the corresponding data-only public
36
+ pack. Neither the profile nor a pack grants execution permission.
37
+
38
+ ## Execution and evidence
39
+
40
+ The wrapper makes a fresh bounded copy of inventoried project files. It omits
41
+ Git metadata and repository actionlint configuration, including case variants,
42
+ creates its own empty Git marker, and supplies its own explicit native config.
43
+ Consequently repository `paths.*.ignore` settings cannot suppress findings.
44
+ This intentionally differs from running actionlint with repository defaults.
45
+
46
+ Before running actionlint, the wrapper checks local `uses` references in workflows
47
+ and local action metadata. A local action needs exactly one inventoried
48
+ `action.yml` or `action.yaml`; referenced runtime files and local reusable
49
+ workflows must also be inventoried. Missing, excluded, symbolic-link or escaping
50
+ inputs cannot pass. Main/pre/post scripts, Dockerfiles and entrypoint files are
51
+ copied as data. They are never executed by this profile. Composite metadata
52
+ dependencies are inspected, but this does not establish semantic validation of
53
+ every composite step.
54
+
55
+ YAML parser errors produce `yaml/*` findings and incomplete analysis. YAML aliases,
56
+ merge keys, unsupported tags/warnings and dependency-inspection failures produce
57
+ incomplete results. These are explicit profile limits, not claims that GitHub
58
+ rejects those constructs.
59
+
60
+ The wrapper invokes one actionlint process per workflow with JSON diagnostics,
61
+ verbose tracing, ShellCheck disabled and Pyflakes disabled. The parser reconciles
62
+ the planned files, native project selection, parse/total counts, disabled optional
63
+ integrations and exit status. Missing, duplicate, unexpected or contradictory
64
+ evidence cannot pass. Errors retain their `actionlint/*` identifiers and source
65
+ locations; failed analysis does not establish complete findings. Successful
66
+ analysis provides no test-execution evidence.
67
+
68
+ Source fingerprints are checked before copying and after validation, alongside
69
+ the shared engine's source checks. Limits include 128 workflows, 512 YAML files in
70
+ the local dependency closure, the shared inventory's 8 MiB/file and 64 MiB total,
71
+ 100 KiB invocation arguments, 2,000 parsed diagnostics per native result and the
72
+ shared time/output limits. A source change or exceeded limit prevents success.
73
+ Native tool identity is version evidence, not an attestation of every executable
74
+ byte; the preparation recipe separately verifies the release archive digest.
75
+
76
+ ## What this does not validate
77
+
78
+ No jobs, shell/Python bodies, actions, JavaScript payloads, containers, remote
79
+ checkouts or services are executed. Remote actions are not downloaded; analysis
80
+ uses actionlint's static knowledge. There is no claim of complete GitHub runtime
81
+ compatibility, action supply-chain auditing, least-privilege authorization,
82
+ secret safety, deployment safety or successful CI execution. This is not an OS
83
+ sandbox. Terraform, Helm, Kustomize and arbitrary YAML need separate profiles.
84
+
85
+ ## Reproduction
86
+
87
+ With the pinned official release prepared on `PATH`:
88
+
89
+ ```sh
90
+ npm run build
91
+ node --test dist/test/actionlint.test.js
92
+ node dist/src/cli.js run --root examples/actionlint --trust-project --detailed
93
+ ```
94
+
95
+ The Linux fixture image downloads and verifies a fixed release during its explicit
96
+ preparation step. Validation and packaged library/CLI/MCP smoke tests then run
97
+ with networking disabled and read-only source/consumer mounts:
98
+
99
+ ```sh
100
+ docker build --file scripts/actionlint-tools.Dockerfile --tag checktrail-actionlint-test:1.7.12 scripts
101
+ node scripts/verify-actionlint-container.mjs
102
+ ```
103
+
104
+ The native tests cover broken/fixed expressions, YAML failures, literal runner and
105
+ variable settings, reusable workflow inputs, local metadata and runtime assets,
106
+ repository suppression bypass, missing dependencies, and evidence tampering.
107
+ The CI job is configured separately; a local container run is not hosted CI.
108
+
109
+ Upstream references: [release and assets](https://github.com/rhysd/actionlint/releases/tag/v1.7.12),
110
+ [CLI usage](https://github.com/rhysd/actionlint/blob/v1.7.12/docs/usage.md),
111
+ [configuration](https://github.com/rhysd/actionlint/blob/v1.7.12/docs/config.md),
112
+ [checks](https://github.com/rhysd/actionlint/blob/v1.7.12/docs/checks.md).
@@ -0,0 +1,82 @@
1
+ # Explicit architecture boundaries
2
+
3
+ `check-architecture` evaluates a captured project dependency graph against a
4
+ closed project/layer policy. It is language-agnostic: native tooling can supply
5
+ graphs from different languages using the same artifact contract. This feature
6
+ does not itself scan imports, run a build system, or attest graph completeness.
7
+
8
+ ```sh
9
+ checktrail check-architecture --root /path/to/workspace \
10
+ --input dependency-graph.json --policy architecture.json
11
+ ```
12
+
13
+ The library exports `checkArchitecture(graph, policy)`. MCP exposes the read-only
14
+ `architecture_validation` tool with relative `input` and `policy` paths. Operator
15
+ root and output settings remain fixed at server startup. These artifact checks
16
+ need no project execution permission. Their outcome is separate from any native
17
+ validation report.
18
+
19
+ ## Policy
20
+
21
+ Every project has an exact ID and exactly one declared layer. An allowed
22
+ dependency names a **consumer layer** and a **producer layer**. Edges not in that
23
+ allowlist are forbidden, including edges within the same layer unless explicitly
24
+ allowed. IDs are case-sensitive literal strings: prefixes, suffixes, `*` and
25
+ regular-expression characters have no matching semantics. Duplicate IDs, duplicate
26
+ edges and undeclared layers are errors.
27
+
28
+ ```json
29
+ {
30
+ "schemaVersion": 1,
31
+ "format": "architecture-policy",
32
+ "layers": ["domain", "application"],
33
+ "projects": [
34
+ { "id": "catalog-model", "layer": "domain" },
35
+ { "id": "catalog-api", "layer": "application" }
36
+ ],
37
+ "allowedDependencies": [{ "consumer": "application", "producer": "domain" }],
38
+ "requireAcyclic": true
39
+ }
40
+ ```
41
+
42
+ With `requireAcyclic`, observed cycles fail even when every individual edge is
43
+ allowed. The report lists strongly connected components, including self-loops;
44
+ member order is for deterministic presentation, not a traversal path. Converging
45
+ paths and diamonds do not count as cycles. Detection uses bounded iterative graph
46
+ traversal rather than recursive calls.
47
+
48
+ ## Evidence
49
+
50
+ The graph records its collector/version, capture timestamp, a global completeness
51
+ flag, project IDs, language labels, recorded source fingerprints, per-project
52
+ completeness, and exact consumer/producer edges. An edge referencing an absent
53
+ graph node is invalid. A project missing from either graph or policy makes coverage
54
+ incomplete. Known forbidden edges or cycles still fail when other evidence is
55
+ incomplete; the report does not discard a known violation.
56
+
57
+ Results carry `imported-dependency-graph` provenance and separate artifact/policy
58
+ fingerprints. The recorded graph can describe imports, build references or package
59
+ manifest dependencies; the collector must document which. A complete manifest
60
+ graph does not establish complete source import coverage. Recorded fingerprints
61
+ and completeness flags are declarations by that collector, not independent proof
62
+ of origin, current source state or absence of undeclared dependencies.
63
+
64
+ Project statuses mean `verified` (configured layer and declared complete capture),
65
+ `missing`, `unconfigured` or `incomplete`. Edge statuses are `allowed`, `forbidden`
66
+ or `unverified`. Their categories sum to the corresponding project/edge totals.
67
+ `captureComplete` preserves the graph-wide declaration separately. A one-project
68
+ graph with no dependencies can pass if complete and fully configured. It does not
69
+ claim that any tests ran.
70
+
71
+ Inputs are bounded to 8 MiB each, 1,000 projects, 20,000 observed dependencies,
72
+ 128 layers and 16,384 allowed layer pairs. JSON schemas reject unknown fields.
73
+ Summaries omit project IDs, edges, layer names and cycle members; detailed output
74
+ is operator-selected. Exit codes are 0 passed, 1 policy violations, and 2 incomplete
75
+ or invalid evidence. No network, model or external project code is invoked.
76
+
77
+ The public `examples/package-contract/architecture.json` applies the same boundary
78
+ policy to a built producer and installed consumer. Its native integration test
79
+ derives the workspace package edge from the consumer's installed dependency
80
+ declaration, validates the packaged artifact through type and runtime checks, and
81
+ tests a synthetic reverse-edge violation separately. It is not a general native
82
+ import-graph collector. Additional language-specific graph collectors remain work.
@@ -0,0 +1,122 @@
1
+ # Architecture
2
+
3
+ ```mermaid
4
+ flowchart TD
5
+ CLI[CLI / CI] --> Engine
6
+ MCP[MCP stdio server] --> Engine
7
+ Policy[Validated declarative policy] --> Engine
8
+ Engine --> Inventory[Bounded file inventory]
9
+ Engine --> Adapters[Registered language/tool adapters]
10
+ Adapters --> Runner[Trusted process runner]
11
+ Runner --> Evidence[Evidence parsers]
12
+ Evidence --> Report[Versioned report]
13
+ Report --> Output[Operator-selected output projection]
14
+ ```
15
+
16
+ The engine owns discovery, planning, execution accounting and report construction.
17
+ Adapters describe checks and parse results; they do not write protocol messages.
18
+ CLI and MCP call the same functions. stdout belongs exclusively to JSON or MCP;
19
+ diagnostics go to stderr. The engine does not call an LLM.
20
+
21
+ ## Discovery and scope
22
+
23
+ The root is configured by the operator, canonicalized once, and never supplied by
24
+ an MCP tool call. Inventory is deterministic, bounded, excludes dependency/build
25
+ directories and sensitive local files, and does not follow symlinks. Read errors
26
+ are errors, not silently empty inventories. Scope exclusions accompany results.
27
+
28
+ Checks validate whole discovered project units. Optional operator-selected Git
29
+ base comparison narrows projects through an explicitly declared complete dependency
30
+ graph, with full-plan fallback whenever impact is uncertain. See `WORKSPACES.md`.
31
+ Persistent caching is not implemented. An inventory fingerprint
32
+ identifies included file contents; it is not a claim about ignored dependencies,
33
+ outside files, runtime services or hermetic reproducibility.
34
+
35
+ ## Configuration
36
+
37
+ `checktrail.json` is optional and uses `schemaVersion: 1`. It can select known
38
+ checks for detected project roots. Unknown keys, IDs and project roots fail before
39
+ any process starts. A missing config uses conservative registered defaults. Pinned JSON packs add
40
+ registered checks, and an operator-selected private overlay adds requirements to
41
+ an explicit base policy. See `POLICY-PACKS.md`.
42
+ Local operator trust and output settings cannot be enabled by this file. Projects
43
+ can require named environment variables, but values are supplied only through
44
+ operator CLI/library/MCP startup permissions. Values are not recorded in commands;
45
+ detailed reports retain names and a fingerprint. See `ENVIRONMENTS.md`.
46
+
47
+ ## Execution and results
48
+
49
+ Commands are executable/argument arrays with no shell interpolation. A required
50
+ check gets one terminal result. Aggregate status is failed if any check fails,
51
+ incomplete if any required check lacks a conclusive result, otherwise passed.
52
+ An empty plan is incomplete. The report retains both failures and incomplete work.
53
+
54
+ Test results need evidence of at least one executed non-skipped test. Missing or
55
+ unparseable evidence is inconclusive even if the process exits zero. Successful
56
+ format checks need no diagnostics. A process failure cannot be converted into a
57
+ pass by a parser. Source changes during execution invalidate a green result.
58
+
59
+ Use bounded process output and timeouts, terminate the process group on supported
60
+ POSIX hosts, and propagate cancellation. No automatic dependency installation,
61
+ source rewriting, infrastructure startup, deployment or repository mutation.
62
+ Executed project code still has the process user's privileges; this is not a
63
+ sandbox. Tests may modify files or access networks and must be trusted accordingly.
64
+
65
+ ## MCP boundary
66
+
67
+ Expose `project_context`, `validation_plan`, `validation_run`, `validation_report`,
68
+ `finding_comparison`, `runtime_comparison`, `contract_validation`,
69
+ `architecture_validation`, `review_guidance`, `review_context`, `review_receipt`,
70
+ and `mutation_experiment`.
71
+ Tool schemas are validated. Execution is disabled unless enabled when starting
72
+ the server. Keep a bounded in-memory report store; report IDs are opaque and a
73
+ restart clears them. The optional library-only [task store](TASK-STORAGE.md)
74
+ retains projected reports in bounded, exclusively owned SQLite databases. It is
75
+ not connected to these tools. The separate [library worker](VALIDATION-TASKS.md)
76
+ owns the store while executing through the shared engine and cancels on parent
77
+ disconnection. MCP Tasks integration remains pending.
78
+ Request cancellation is matched by exact ID, including numeric zero. Connection
79
+ closure and process signals terminate active validation workers. The
80
+ [compatibility record](MCP-COMPATIBILITY.md) describes the SDK constraints and
81
+ standard Tasks acceptance gates.
82
+
83
+ Default summary output contains aggregate counts, adapter/check IDs and statuses;
84
+ it omits source excerpts, paths, commands and raw logs. Detailed output requires a
85
+ startup flag and is intended for trusted clients. Both can reveal project activity;
86
+ neither is a guarantee against the MCP client's own data handling.
87
+
88
+ ## Extension boundaries
89
+
90
+ Public rule packs, private overlays and tool adapters share stable schemas.
91
+ Built-in checks and operator-registered external checks execute through the shared
92
+ runner. Local data-only packs use pinned content integrity and bounded reads; public
93
+ profiles are included in the package. External executable bundles require a manifest
94
+ digest and per-file digests; verified bytes are copied into an owned temporary
95
+ directory. Their JSON protocol accounts for every planned file and labels delegated
96
+ tool identities as adapter-reported. See `EXTERNAL-ADAPTERS.md`. An explicit CLI/library HTTPS fetch operation installs
97
+ pinned data-only packs without activating them; planning, validation and MCP remain
98
+ offline with respect to pack loading. See `PACK-DISTRIBUTION.md`. Remote executable
99
+ bundle distribution, sandboxing and dependency resolution remain separate work. Advisory guidance is never serialized as a passed
100
+ automated check.
101
+
102
+ Native framework capture is opt-in and uses version-gated collectors. The Vue Router
103
+ profile constructs a selected testing router, awaits registration and verifies native
104
+ URL resolution with complete route-record participation. Its assembly projection
105
+ and limits are documented in `VUE-ROUTER.md`. The separate Nuxt profile builds
106
+ a fresh SSR testing assembly and captures its native router after in-process
107
+ requests complete, without a listening socket; see `NUXT.md`.
108
+
109
+ ## Advisory assistance
110
+
111
+ Guidance selects built-in public questions by exact check/topic triggers without
112
+ executing code. Mutation experiments use the shared validator in bounded fresh
113
+ copies, preserving baseline and changed-test evidence. Both have separate advisory
114
+ schemas and cannot rewrite deterministic outcomes. The initial mutation profile
115
+ is limited to dependency-free Node projects with flat tests; see `GUIDANCE.md` and
116
+ `MUTATIONS.md`. No model call or source upload is required.
117
+
118
+ Optional review exchange captures explicitly selected source and receives external
119
+ assessments without invoking a model. Source and review prose require a separate
120
+ operator disclosure setting. Context identity, freshness, quotations and declared
121
+ file accounting are checked, while defect claims remain unverified and separate
122
+ from validation. See `REVIEW-EXCHANGE.md`.
package/docs/CLANG.md ADDED
@@ -0,0 +1,113 @@
1
+ # C and C++ compilation checks
2
+
3
+ `cpp.clang-check` runs Clang's front end using a prepared project-root
4
+ `compile_commands.json`. Detection recognizes that file, `CMakeLists.txt` and
5
+ `meson.build`. Discovery and planning never execute a build system. Missing or
6
+ unsupported configuration is unavailable rather than a successful compilation.
7
+
8
+ ```sh
9
+ node dist/src/cli.js run --root examples/cpp --trust-project --detailed
10
+ ```
11
+
12
+ The public example contains separate C17 and C++20 translation units and shared
13
+ headers. Its portable database is authored explicitly. A consumer can prepare a
14
+ database using its own build system, then place it in the inventoried project
15
+ root. A database left only under excluded `build/` is not used automatically.
16
+
17
+ ## Supported database profile
18
+
19
+ The [Clang compilation database specification](https://clang.llvm.org/docs/JSONCompilationDatabase.html)
20
+ defines argument arrays separately from shell command strings. This profile
21
+ requires `arguments`; it never tokenizes or executes `command`. When both fields
22
+ exist, the argument array is used. Directory and input paths must resolve within
23
+ the operator root, and each entry must name exactly one inventoried C/C++ source.
24
+ Relative directories are interpreted from the project root; other relative paths
25
+ are interpreted from the entry's directory.
26
+
27
+ The compiler must be `clang` or `clang++`, or an absolute path resolving to the
28
+ same executable selected by PATH. Wrappers, response files and arbitrary compiler
29
+ paths are unsupported. The selected PATH is protected for execution. Multiple
30
+ distinct configurations of a source file are checked; duplicate normalized entries
31
+ are rejected.
32
+
33
+ The closed flag set supports:
34
+
35
+ - C and C++ language-standard flags explicitly enumerated in `src/clang.ts`.
36
+ - Object-like `-D` definitions and `-U` undefinitions, preserving literal values.
37
+ - Root-contained `-I`, `-iquote` and `-isystem` directories.
38
+ - `-O0` through `-O3`, `-Os`, `-Og`, `-Oz`, PIC/PIE, pthread,
39
+ no-exceptions and no-rtti settings.
40
+ - `-Wall`, `-Wextra`, `-Werror`, `-Wpedantic`, `-Wconversion`,
41
+ `-Wsign-conversion`, `-Wshadow`, `-Wunused`, `-Wunused-parameter` and
42
+ `-Wno-unused-parameter`.
43
+
44
+ Compile/output/dependency arguments (`-c`, separate `-o`, `-MF`, `-MT`, `-MQ`,
45
+ `-MD`, `-MMD`, `-MP`) are replaced with engine-owned front-end/dependency output.
46
+ `-g` and `-g0` are omitted. Source and include path spellings are preserved because
47
+ rewriting relative paths can change `__FILE__`. All other flags are unavailable;
48
+ the adapter does not silently drop unknown target, language, plugin or ABI options.
49
+ Cross-compilation, modules, precompiled headers and compiler plugins need separate
50
+ profiles. Default Clang configuration loading and implicit modules are disabled.
51
+ Compiler override/include environment variables are protected; they cannot be
52
+ injected through project environment requirements.
53
+
54
+ ## Evidence and limits
55
+
56
+ The engine requires native SARIF diagnostics for each database entry and a fresh
57
+ compiler dependency file. It reconciles entry identity, process status, diagnostic
58
+ severity and compiler version. Native compiler errors fail the check; malformed
59
+ or partial evidence cannot pass. Warnings are retained and follow the configured
60
+ native warning policy, including `-Werror`; this is not an all-warnings lint policy.
61
+ Source-level pragmas and the selected preprocessor definitions remain part of
62
+ native compiler semantics.
63
+
64
+ Every inventoried C/C++ translation unit and header must appear in at least one
65
+ observed dependency list. Uncompiled sources, unused headers, generated project
66
+ headers under excluded directories, and symlinked project inputs make the result
67
+ incomplete. Nested projects retain separate inventory boundaries. The recognized
68
+ extensions are listed in `src/clang.ts`; Objective-C, CUDA and assembly are not
69
+ covered. C++ module extensions `.ixx` and `.cppm` are explicitly unavailable.
70
+
71
+ System/toolchain headers outside the root are counted separately in the detailed
72
+ process evidence. They are not included in the source fingerprint; host SDKs,
73
+ standard libraries and compiler binaries are not hermetic inputs. The evidence
74
+ does not cover inactive preprocessor branches, every target configuration, linking,
75
+ code generation, ABI compatibility, static-analysis rules or executed tests.
76
+ No object files or configured build outputs are written by this profile. Native
77
+ tools run with operator trust and are not sandboxed.
78
+
79
+ The database is bounded to 64 entries and 256 arguments per entry; the prepared
80
+ invocation must fit 100 KiB. Each native process has bounded captured output and
81
+ the wrapper limits aggregate native output to 4 MiB. Dependency files are capped
82
+ at 8 MiB each and 16 MiB total. The shared engine also enforces its total timeout,
83
+ output, source-freshness and cancellation limits. Dependency outputs use a fresh
84
+ temporary directory, removed on normal completion/error. Forced process or machine
85
+ termination can leave that directory. Newline, backslash, dollar, hash and colon
86
+ in source paths are unsupported; native literal-space dependencies are tested.
87
+
88
+ ## Verified toolchains
89
+
90
+ - Apple Clang 21.0.0, build `clang-2100.3.34.2`, arm64 macOS.
91
+ - Alpine Clang 22.1.3, arm64 Linux, with Node 22.23.2 in a prepared container.
92
+
93
+ Other versions are unavailable until their native evidence has been verified.
94
+ Apple's SARIF includes an invocation result and a full version banner; the tested
95
+ Alpine build omits the invocation record and uses a numeric version. The parser
96
+ checks each verified form rather than assuming the outputs are identical.
97
+
98
+ Prepare the development fixture explicitly, then run it without networking:
99
+
100
+ ```sh
101
+ docker build --file scripts/clang-tools.Dockerfile --tag checktrail-clang-test:22.1.3 scripts
102
+ node scripts/verify-clang-container.mjs
103
+ ```
104
+
105
+ The base image digest and Clang/LLVM package versions are pinned. Auxiliary Alpine
106
+ toolchain dependencies are resolved during preparation, so this is not a completely
107
+ locked container supply chain. Verification records the resulting image digest,
108
+ mounts the repository read-only and creates synthetic fixtures inside the container.
109
+
110
+ Tests cover the actual public example, native C/C++ errors and repair, header
111
+ coverage, ignored build configuration, relative `__FILE__` spelling, working
112
+ directories, space-containing includes, standard-library headers, multiple
113
+ configurations, warnings, missing compilers and malformed evidence.