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