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