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