devcontour-harness 0.0.0-stage → 0.1.0-alpha.6
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/LICENSE +21 -0
- package/README.md +183 -2
- package/docs/architecture.md +473 -0
- package/docs/compatibility-versions.md +56 -0
- package/docs/compatibility.md +192 -0
- package/docs/connectors.md +323 -0
- package/docs/contracts.md +603 -0
- package/docs/integrations/hindsight.md +148 -0
- package/docs/quickstart.md +182 -0
- package/docs/release-notes/0.1.0-alpha.6.md +238 -0
- package/docs/review-probes.md +120 -0
- package/docs/review-protocol.md +251 -0
- package/docs/toolchains.md +167 -0
- package/docs/turbo-starter.md +269 -0
- package/docs/upgrade.md +202 -0
- package/examples/README.md +27 -0
- package/examples/external-connector/README.md +19 -0
- package/examples/external-connector/connector.mjs +55 -0
- package/examples/files-only/README.md +28 -0
- package/examples/files-only/context/norms/rules.md +4 -0
- package/examples/files-only/graph.json +23 -0
- package/examples/files-only/policy.json +30 -0
- package/examples/one-vendor/README.md +19 -0
- package/examples/one-vendor/policy.json +27 -0
- package/examples/single-task/README.md +18 -0
- package/examples/single-task/graph.json +27 -0
- package/examples/single-task/policy-same-vendor.json +55 -0
- package/examples/single-task/policy.json +52 -0
- package/examples/single-task/src/.gitkeep +0 -0
- package/examples/single-task/test/run.js +19 -0
- package/examples/toolchains/README.md +32 -0
- package/examples/toolchains/go/bad/label/label.go +9 -0
- package/examples/toolchains/go/good/label/label.go +9 -0
- package/examples/toolchains/go/policy.json +79 -0
- package/examples/toolchains/go/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/go/repo/_gitignore +1 -0
- package/examples/toolchains/go/repo/go.mod +5 -0
- package/examples/toolchains/go/repo/go.sum +2 -0
- package/examples/toolchains/go/repo/label/label.go +9 -0
- package/examples/toolchains/go/repo/label/label_test.go +27 -0
- package/examples/toolchains/go/repo/label/version.go +9 -0
- package/examples/toolchains/go/task.json +25 -0
- package/examples/toolchains/mixed-go/bad/backend/label/label.go +9 -0
- package/examples/toolchains/mixed-go/bad/frontend/src/label.js +4 -0
- package/examples/toolchains/mixed-go/good/backend/label/label.go +9 -0
- package/examples/toolchains/mixed-go/good/frontend/src/label.js +4 -0
- package/examples/toolchains/mixed-go/policy.json +126 -0
- package/examples/toolchains/mixed-go/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/mixed-go/repo/_gitignore +6 -0
- package/examples/toolchains/mixed-go/repo/backend/go.mod +3 -0
- package/examples/toolchains/mixed-go/repo/backend/label/label.go +9 -0
- package/examples/toolchains/mixed-go/repo/backend/label/label_test.go +30 -0
- package/examples/toolchains/mixed-go/repo/contract/check.mjs +17 -0
- package/examples/toolchains/mixed-go/repo/contract/label.json +9 -0
- package/examples/toolchains/mixed-go/repo/frontend/package.json +15 -0
- package/examples/toolchains/mixed-go/repo/frontend/pnpm-lock.yaml +22 -0
- package/examples/toolchains/mixed-go/repo/frontend/src/label.js +4 -0
- package/examples/toolchains/mixed-go/repo/frontend/test/label.test.js +11 -0
- package/examples/toolchains/mixed-go/task.json +25 -0
- package/examples/toolchains/mixed-python/bad/backend/src/fx_backend/__init__.py +6 -0
- package/examples/toolchains/mixed-python/bad/frontend/src/label.js +4 -0
- package/examples/toolchains/mixed-python/good/backend/src/fx_backend/__init__.py +6 -0
- package/examples/toolchains/mixed-python/good/frontend/src/label.js +4 -0
- package/examples/toolchains/mixed-python/policy.json +121 -0
- package/examples/toolchains/mixed-python/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/mixed-python/repo/_gitignore +6 -0
- package/examples/toolchains/mixed-python/repo/backend/.python-version +1 -0
- package/examples/toolchains/mixed-python/repo/backend/pyproject.toml +19 -0
- package/examples/toolchains/mixed-python/repo/backend/src/fx_backend/__init__.py +6 -0
- package/examples/toolchains/mixed-python/repo/backend/tests/test_label.py +11 -0
- package/examples/toolchains/mixed-python/repo/backend/uv.lock +108 -0
- package/examples/toolchains/mixed-python/repo/contract/check.mjs +17 -0
- package/examples/toolchains/mixed-python/repo/contract/label.json +9 -0
- package/examples/toolchains/mixed-python/repo/frontend/package.json +15 -0
- package/examples/toolchains/mixed-python/repo/frontend/pnpm-lock.yaml +22 -0
- package/examples/toolchains/mixed-python/repo/frontend/src/label.js +4 -0
- package/examples/toolchains/mixed-python/repo/frontend/test/label.test.js +11 -0
- package/examples/toolchains/mixed-python/task.json +25 -0
- package/examples/toolchains/npm/bad/src/label.js +4 -0
- package/examples/toolchains/npm/good/src/label.js +4 -0
- package/examples/toolchains/npm/policy.json +82 -0
- package/examples/toolchains/npm/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/npm/repo/_gitignore +4 -0
- package/examples/toolchains/npm/repo/package-lock.json +22 -0
- package/examples/toolchains/npm/repo/package.json +13 -0
- package/examples/toolchains/npm/repo/src/label.js +4 -0
- package/examples/toolchains/npm/repo/test/label.test.js +13 -0
- package/examples/toolchains/npm/task.json +25 -0
- package/examples/toolchains/pnpm/bad/packages/label/src/label.js +4 -0
- package/examples/toolchains/pnpm/good/packages/label/src/label.js +4 -0
- package/examples/toolchains/pnpm/policy.json +85 -0
- package/examples/toolchains/pnpm/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/pnpm/repo/_gitignore +4 -0
- package/examples/toolchains/pnpm/repo/package.json +10 -0
- package/examples/toolchains/pnpm/repo/packages/checker/check.mjs +5 -0
- package/examples/toolchains/pnpm/repo/packages/checker/package.json +9 -0
- package/examples/toolchains/pnpm/repo/packages/label/package.json +14 -0
- package/examples/toolchains/pnpm/repo/packages/label/src/label.js +4 -0
- package/examples/toolchains/pnpm/repo/packages/label/test/label.test.js +13 -0
- package/examples/toolchains/pnpm/repo/pnpm-lock.yaml +29 -0
- package/examples/toolchains/pnpm/repo/pnpm-workspace.yaml +2 -0
- package/examples/toolchains/pnpm/task.json +25 -0
- package/examples/toolchains/python/bad/src/fx_label/__init__.py +6 -0
- package/examples/toolchains/python/good/src/fx_label/__init__.py +6 -0
- package/examples/toolchains/python/policy.json +80 -0
- package/examples/toolchains/python/repo/.python-version +1 -0
- package/examples/toolchains/python/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/python/repo/_gitignore +5 -0
- package/examples/toolchains/python/repo/pyproject.toml +19 -0
- package/examples/toolchains/python/repo/src/fx_label/__init__.py +6 -0
- package/examples/toolchains/python/repo/tests/test_label.py +13 -0
- package/examples/toolchains/python/repo/uv.lock +108 -0
- package/examples/toolchains/python/task.json +25 -0
- package/examples/toolchains/turbo/bad/packages/label/src/label.js +4 -0
- package/examples/toolchains/turbo/good/packages/label/src/label.js +4 -0
- package/examples/toolchains/turbo/policy.json +110 -0
- package/examples/toolchains/turbo/repo/REQUIREMENTS.md +9 -0
- package/examples/toolchains/turbo/repo/_gitignore +4 -0
- package/examples/toolchains/turbo/repo/package.json +13 -0
- package/examples/toolchains/turbo/repo/packages/checker/check.mjs +5 -0
- package/examples/toolchains/turbo/repo/packages/checker/package.json +9 -0
- package/examples/toolchains/turbo/repo/packages/label/package.json +14 -0
- package/examples/toolchains/turbo/repo/packages/label/src/label.js +4 -0
- package/examples/toolchains/turbo/repo/packages/label/test/label.test.js +13 -0
- package/examples/toolchains/turbo/repo/pnpm-lock.yaml +94 -0
- package/examples/toolchains/turbo/repo/pnpm-workspace.yaml +2 -0
- package/examples/toolchains/turbo/repo/turbo.json +7 -0
- package/examples/toolchains/turbo/task.json +25 -0
- package/examples/turbo-starter/README.md +16 -0
- package/examples/turbo-starter/changes/issued-at-consumer-only.patch +12 -0
- package/examples/turbo-starter/changes/issued-at.patch +130 -0
- package/examples/turbo-starter/cleanup.mjs +58 -0
- package/examples/turbo-starter/graph.json +32 -0
- package/examples/turbo-starter/harness/acceptance/db-isolation.test.mjs +97 -0
- package/examples/turbo-starter/harness/acceptance/env-probe.test.mjs +75 -0
- package/examples/turbo-starter/harness/acceptance/generation.test.mjs +54 -0
- package/examples/turbo-starter/harness/acceptance/issued-at.test.mjs +43 -0
- package/examples/turbo-starter/harness/acceptance/lifecycle-probe.test.mjs +47 -0
- package/examples/turbo-starter/harness/compose-bridge.mjs +593 -0
- package/examples/turbo-starter/harness/compose.acceptance.yml +23 -0
- package/examples/turbo-starter/harness/env/backend.env.template +7 -0
- package/examples/turbo-starter/harness/env/compose.env.template +6 -0
- package/examples/turbo-starter/policy.json +109 -0
- package/examples/turbo-starter/policy.lifecycle.json +114 -0
- package/examples/turbo-starter/setup.mjs +352 -0
- package/examples/two-vendors/policy.json +30 -0
- package/lib/agents/cli-adapter.d.ts +48 -0
- package/lib/agents/cli-adapter.js +386 -0
- package/lib/agents/inspect.d.ts +6 -0
- package/lib/agents/inspect.js +46 -0
- package/lib/agents/probe-server.d.ts +2 -0
- package/lib/agents/probe-server.js +13 -0
- package/lib/agents/review-probe.d.ts +295 -0
- package/lib/agents/review-probe.js +872 -0
- package/lib/agents/runtime-events.d.ts +11 -0
- package/lib/agents/runtime-events.js +21 -0
- package/lib/agents/schemas.d.ts +217 -0
- package/lib/agents/schemas.js +124 -0
- package/lib/agents/usage.d.ts +8 -0
- package/lib/agents/usage.js +83 -0
- package/lib/cli.d.ts +2 -0
- package/lib/cli.js +491 -0
- package/lib/connectors/files.d.ts +108 -0
- package/lib/connectors/files.js +133 -0
- package/lib/contracts/checks.d.ts +307 -0
- package/lib/contracts/checks.js +181 -0
- package/lib/contracts/cli.d.ts +3895 -0
- package/lib/contracts/cli.js +664 -0
- package/lib/contracts/context.d.ts +135 -0
- package/lib/contracts/context.js +129 -0
- package/lib/contracts/digest.d.ts +9 -0
- package/lib/contracts/digest.js +22 -0
- package/lib/contracts/errors.d.ts +81 -0
- package/lib/contracts/errors.js +70 -0
- package/lib/contracts/events.d.ts +827 -0
- package/lib/contracts/events.js +258 -0
- package/lib/contracts/execution.d.ts +3216 -0
- package/lib/contracts/execution.js +872 -0
- package/lib/contracts/failure.d.ts +67 -0
- package/lib/contracts/failure.js +127 -0
- package/lib/contracts/index.d.ts +18 -0
- package/lib/contracts/index.js +18 -0
- package/lib/contracts/policy.d.ts +1080 -0
- package/lib/contracts/policy.js +544 -0
- package/lib/contracts/ports.d.ts +417 -0
- package/lib/contracts/ports.js +1 -0
- package/lib/contracts/primitives.d.ts +63 -0
- package/lib/contracts/primitives.js +73 -0
- package/lib/contracts/profiles.d.ts +336 -0
- package/lib/contracts/profiles.js +109 -0
- package/lib/contracts/published.d.ts +3237 -0
- package/lib/contracts/published.js +34 -0
- package/lib/contracts/result.d.ts +1280 -0
- package/lib/contracts/result.js +311 -0
- package/lib/contracts/review.d.ts +441 -0
- package/lib/contracts/review.js +477 -0
- package/lib/contracts/toolchain.d.ts +96 -0
- package/lib/contracts/toolchain.js +89 -0
- package/lib/contracts/version.d.ts +17 -0
- package/lib/contracts/version.js +17 -0
- package/lib/contracts/work.d.ts +173 -0
- package/lib/contracts/work.js +178 -0
- package/lib/control/base-move.d.ts +44 -0
- package/lib/control/base-move.js +90 -0
- package/lib/control/doctor.d.ts +50 -0
- package/lib/control/doctor.js +113 -0
- package/lib/control/harness.d.ts +1125 -0
- package/lib/control/harness.js +741 -0
- package/lib/control/provenance.d.ts +17 -0
- package/lib/control/provenance.js +25 -0
- package/lib/control/recovery.d.ts +237 -0
- package/lib/control/recovery.js +236 -0
- package/lib/control/review.d.ts +62 -0
- package/lib/control/review.js +178 -0
- package/lib/control/workflow.d.ts +247 -0
- package/lib/control/workflow.js +259 -0
- package/lib/engine/budget.d.ts +345 -0
- package/lib/engine/budget.js +278 -0
- package/lib/engine/classify.d.ts +8 -0
- package/lib/engine/classify.js +32 -0
- package/lib/engine/engine.d.ts +1527 -0
- package/lib/engine/engine.js +2259 -0
- package/lib/engine/failure.d.ts +1 -0
- package/lib/engine/failure.js +3 -0
- package/lib/engine/joint-runner.d.ts +257 -0
- package/lib/engine/joint-runner.js +254 -0
- package/lib/engine/measured.d.ts +15 -0
- package/lib/engine/measured.js +82 -0
- package/lib/engine/prompt.d.ts +66 -0
- package/lib/engine/prompt.js +131 -0
- package/lib/engine/property-recovery.d.ts +50 -0
- package/lib/engine/property-recovery.js +171 -0
- package/lib/engine/repair.d.ts +33 -0
- package/lib/engine/repair.js +82 -0
- package/lib/engine/result.d.ts +9 -0
- package/lib/engine/result.js +218 -0
- package/lib/engine/reuse.d.ts +80 -0
- package/lib/engine/reuse.js +102 -0
- package/lib/engine/runner.d.ts +360 -0
- package/lib/engine/runner.js +1836 -0
- package/lib/engine/standalone.d.ts +6 -0
- package/lib/engine/standalone.js +48 -0
- package/lib/engine/usage.d.ts +87 -0
- package/lib/engine/usage.js +165 -0
- package/lib/environment/isolation.d.ts +110 -0
- package/lib/environment/isolation.js +238 -0
- package/lib/environment/lifecycle.d.ts +40 -0
- package/lib/environment/lifecycle.js +197 -0
- package/lib/environment/live-calls.d.ts +14 -0
- package/lib/environment/live-calls.js +73 -0
- package/lib/environment/os-tools.d.ts +16 -0
- package/lib/environment/os-tools.js +35 -0
- package/lib/environment/process.d.ts +32 -0
- package/lib/environment/process.js +369 -0
- package/lib/environment/redaction.d.ts +22 -0
- package/lib/environment/redaction.js +102 -0
- package/lib/environment/resources.d.ts +31 -0
- package/lib/environment/resources.js +120 -0
- package/lib/index.d.ts +65 -0
- package/lib/index.js +67 -0
- package/lib/integrations/connector/commands.d.ts +358 -0
- package/lib/integrations/connector/commands.js +428 -0
- package/lib/integrations/connector/config.d.ts +215 -0
- package/lib/integrations/connector/config.js +214 -0
- package/lib/integrations/connector/delivery.d.ts +107 -0
- package/lib/integrations/connector/delivery.js +591 -0
- package/lib/integrations/connector/fake.d.ts +291 -0
- package/lib/integrations/connector/fake.js +786 -0
- package/lib/integrations/connector/history.d.ts +124 -0
- package/lib/integrations/connector/history.js +497 -0
- package/lib/integrations/connector/index.d.ts +16 -0
- package/lib/integrations/connector/index.js +16 -0
- package/lib/integrations/connector/redact.d.ts +19 -0
- package/lib/integrations/connector/redact.js +91 -0
- package/lib/integrations/connector/registry.d.ts +15 -0
- package/lib/integrations/connector/registry.js +43 -0
- package/lib/integrations/connector/snapshot.d.ts +131 -0
- package/lib/integrations/connector/snapshot.js +422 -0
- package/lib/integrations/connector/source.d.ts +37 -0
- package/lib/integrations/connector/source.js +73 -0
- package/lib/integrations/connector/steps.d.ts +71 -0
- package/lib/integrations/connector/steps.js +188 -0
- package/lib/integrations/connector/store.d.ts +140 -0
- package/lib/integrations/connector/store.js +277 -0
- package/lib/integrations/connector/summary.d.ts +38 -0
- package/lib/integrations/connector/summary.js +59 -0
- package/lib/integrations/connector/testing-worker.d.ts +1 -0
- package/lib/integrations/connector/testing-worker.js +81 -0
- package/lib/integrations/connector/testing.d.ts +205 -0
- package/lib/integrations/connector/testing.js +1615 -0
- package/lib/integrations/connector/transport.d.ts +240 -0
- package/lib/integrations/connector/transport.js +28 -0
- package/lib/integrations/memory/context.d.ts +120 -0
- package/lib/integrations/memory/context.js +239 -0
- package/lib/integrations/memory/index.d.ts +8 -0
- package/lib/integrations/memory/index.js +8 -0
- package/lib/integrations/memory/provider.d.ts +79 -0
- package/lib/integrations/memory/provider.js +22 -0
- package/lib/integrations/memory/sink.d.ts +56 -0
- package/lib/integrations/memory/sink.js +116 -0
- package/lib/integrations/memory/testing.d.ts +44 -0
- package/lib/integrations/memory/testing.js +61 -0
- package/lib/integrations/relay-v1/index.d.ts +122 -0
- package/lib/integrations/relay-v1/index.js +860 -0
- package/lib/integrations/relay-v2/index.d.ts +145 -0
- package/lib/integrations/relay-v2/index.js +752 -0
- package/lib/integrations/relay-v2/process.d.ts +32 -0
- package/lib/integrations/relay-v2/process.js +112 -0
- package/lib/integrations/relay-v2/protocol.d.ts +172 -0
- package/lib/integrations/relay-v2/protocol.js +142 -0
- package/lib/package.d.ts +2 -0
- package/lib/package.js +3 -0
- package/lib/profiles/resolve.d.ts +190 -0
- package/lib/profiles/resolve.js +273 -0
- package/lib/storage/document.d.ts +1234 -0
- package/lib/storage/document.js +80 -0
- package/lib/storage/sqlite.d.ts +35 -0
- package/lib/storage/sqlite.js +260 -0
- package/lib/testing/index.d.ts +5 -0
- package/lib/testing/index.js +5 -0
- package/lib/testing/store-contract.d.ts +8 -0
- package/lib/testing/store-contract.js +167 -0
- package/lib/toolchains/index.d.ts +9 -0
- package/lib/toolchains/index.js +9 -0
- package/lib/toolchains/inspect.d.ts +105 -0
- package/lib/toolchains/inspect.js +831 -0
- package/lib/toolchains/manifests.d.ts +67 -0
- package/lib/toolchains/manifests.js +238 -0
- package/lib/toolchains/probe.d.ts +28 -0
- package/lib/toolchains/probe.js +54 -0
- package/lib/toolchains/recipes.d.ts +33 -0
- package/lib/toolchains/recipes.js +51 -0
- package/lib/validate.d.ts +36 -0
- package/lib/validate.js +175 -0
- package/lib/verification/acceptance.d.ts +284 -0
- package/lib/verification/acceptance.js +670 -0
- package/lib/verification/checks.d.ts +72 -0
- package/lib/verification/checks.js +190 -0
- package/lib/verification/confirm.d.ts +125 -0
- package/lib/verification/confirm.js +411 -0
- package/lib/verification/corpus.d.ts +1303 -0
- package/lib/verification/corpus.js +744 -0
- package/lib/verification/dependencies.d.ts +66 -0
- package/lib/verification/dependencies.js +144 -0
- package/lib/verification/gates.d.ts +160 -0
- package/lib/verification/gates.js +600 -0
- package/lib/verification/joint.d.ts +63 -0
- package/lib/verification/joint.js +121 -0
- package/lib/verification/proof.d.ts +54 -0
- package/lib/verification/proof.js +96 -0
- package/lib/verification/property.d.ts +86 -0
- package/lib/verification/property.js +214 -0
- package/lib/verification/requirements.d.ts +25 -0
- package/lib/verification/requirements.js +69 -0
- package/lib/verification/self-check.d.ts +29 -0
- package/lib/verification/self-check.js +99 -0
- package/lib/verification/spike.d.ts +79 -0
- package/lib/verification/spike.js +124 -0
- package/package.json +100 -4
- package/profiles/expo-mobile.json +15 -0
- package/profiles/go-api.json +15 -0
- package/profiles/go-gotestsum.json +21 -0
- package/profiles/mobile-maestro.json +29 -0
- package/profiles/nest-api.json +26 -0
- package/profiles/next-product.json +72 -0
- package/profiles/node-checks.json +77 -0
- package/profiles/npm-ci.json +22 -0
- package/profiles/pnpm-frozen.json +24 -0
- package/profiles/python-api.json +32 -0
- package/profiles/python-uv.json +26 -0
- package/profiles/react-native.json +50 -0
- package/profiles/react-vite-admin.json +71 -0
- package/schemas/context-snapshot.schema.json +231 -0
- package/schemas/contract-document.schema.json +385 -0
- package/schemas/execution-document.schema.json +3695 -0
- package/schemas/execution-policy.schema.json +2196 -0
- package/schemas/joint-verification.schema.json +617 -0
- package/schemas/result-envelope.schema.json +1652 -0
- package/schemas/review-record.schema.json +177 -0
- package/schemas/run-event.schema.json +2458 -0
- package/schemas/run-result.schema.json +1570 -0
- package/schemas/stack-profile.schema.json +535 -0
- package/schemas/work-graph.schema.json +381 -0
- package/schemas/work-order.schema.json +256 -0
- package/skills/harness/SKILL.md +64 -0
- package/templates/AGENTS.md +13 -0
- package/templates/controller-mode/AGENTS.controller.md +58 -0
- package/templates/controller-mode/README.md +44 -0
- package/templates/graph.json +22 -0
- package/templates/policy.json +28 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type CheckDeclaration, type CheckSuite, type ContractDocument, type ExecutionView, type GatePolicy, type Obligation, type WorkOrder, type WorkState } from '../contracts/index.ts';
|
|
2
|
+
import type { CheckManifest } from './property.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Договоры проверки поручения. Механизм включает само поручение полем
|
|
5
|
+
* `properties`; поручение без него проверяется на прежнем уровне.
|
|
6
|
+
*/
|
|
7
|
+
/** Документы контрактов поручения по закреплённым digest; неизвестный — отсутствует. */
|
|
8
|
+
export declare function contractDocuments(order: Pick<WorkOrder, 'contracts'>, view: ExecutionView): ContractDocument[];
|
|
9
|
+
type Declared = {
|
|
10
|
+
contract: ContractDocument;
|
|
11
|
+
gate: string;
|
|
12
|
+
obligation: Obligation;
|
|
13
|
+
};
|
|
14
|
+
/** Основание случаев корпуса: закреплённые файлы, gate и смысл обязательств. */
|
|
15
|
+
export declare function suiteBasis(contract: ContractDocument): string;
|
|
16
|
+
/**
|
|
17
|
+
* Привязка поручения к версии корпуса остаётся в силе, только пока среди его
|
|
18
|
+
* договоров есть договор этого корпуса с тем же нормативным основанием.
|
|
19
|
+
* Изменение постороннего контракта её не снимает; новый ID или новые правила
|
|
20
|
+
* того же ID — снимают: ожидания прежнего основания не становятся нормой для
|
|
21
|
+
* новых правил.
|
|
22
|
+
*/
|
|
23
|
+
export declare function corpusBindingHolds(suite: Pick<CheckSuite, 'contractId' | 'basis'> | undefined, contracts: ContractDocument[],
|
|
24
|
+
/** Основание корпуса по формуле хоста; без неё — формула harness. */
|
|
25
|
+
basisOf?: (contract: ContractDocument) => string): boolean;
|
|
26
|
+
/** Обязательство по property ID среди договоров поручения. */
|
|
27
|
+
export declare function obligationOf(contracts: ContractDocument[], id: string): Declared | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Структурные пропуски договора проверки — до вызова модели. Способ проверки
|
|
30
|
+
* обязан ссылаться на закреплённые файлы контракта: иначе происхождение
|
|
31
|
+
* эталона не закреплено ничем.
|
|
32
|
+
*/
|
|
33
|
+
export declare function declarationProblems(declaration: CheckDeclaration, context: {
|
|
34
|
+
gates: GatePolicy[];
|
|
35
|
+
repositoryId: string;
|
|
36
|
+
artifacts: string[];
|
|
37
|
+
spike?: (id: string) => {
|
|
38
|
+
digest: string;
|
|
39
|
+
} | undefined;
|
|
40
|
+
}): string[];
|
|
41
|
+
/**
|
|
42
|
+
* Свойства, объявленные поручением, существуют в его договорах и исполняются
|
|
43
|
+
* его генеративными gates. Поручение без `properties` — прежний уровень.
|
|
44
|
+
*/
|
|
45
|
+
export declare function orderPropertyProblems(order: Pick<WorkOrder, 'id' | 'properties' | 'gates' | 'requirements'>, contracts: ContractDocument[],
|
|
46
|
+
/** Gates репозитория поручения и раскрытая область поручения. */
|
|
47
|
+
gates: {
|
|
48
|
+
configured: GatePolicy[];
|
|
49
|
+
scope?: string[];
|
|
50
|
+
}): string[];
|
|
51
|
+
/** Случаи корпуса, закреплённые за попыткой. */
|
|
52
|
+
export interface CorpusSnapshot {
|
|
53
|
+
digest: string;
|
|
54
|
+
cases: {
|
|
55
|
+
id: string;
|
|
56
|
+
property: string;
|
|
57
|
+
}[];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Манифест ожидаемой проверки gate для поручения или undefined — прежний
|
|
61
|
+
* уровень доказательства (поручение не включило механизм).
|
|
62
|
+
*/
|
|
63
|
+
export declare function orderCheckManifest(order: Pick<WorkOrder, 'properties'>, contracts: ContractDocument[], gate: string, corpus?: CorpusSnapshot): CheckManifest | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Действующая версия проверок поручения: согласованная постановка,
|
|
66
|
+
* контракты, политика и принятый snapshot корпуса. Закрепляется в попытке
|
|
67
|
+
* при выдаче и участвует в evidence, finish, recovery и reuse.
|
|
68
|
+
*/
|
|
69
|
+
export declare function effectiveChecks(work: Pick<WorkState, 'approvedDigest' | 'order' | 'checkVersion'>, policyDigest: string): string;
|
|
70
|
+
/** Основание эпизода восстановления: согласованная постановка и контракты. */
|
|
71
|
+
export declare function episodeBasis(work: Pick<WorkState, 'approvedDigest' | 'order'>): string;
|
|
72
|
+
export {};
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { WORKSPACE_OWNER, digestOf, } from "../contracts/index.js";
|
|
2
|
+
import { strongPromises } from "../contracts/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Договоры проверки поручения. Механизм включает само поручение полем
|
|
5
|
+
* `properties`; поручение без него проверяется на прежнем уровне.
|
|
6
|
+
*/
|
|
7
|
+
/** Документы контрактов поручения по закреплённым digest; неизвестный — отсутствует. */
|
|
8
|
+
export function contractDocuments(order, view) {
|
|
9
|
+
return order.contracts
|
|
10
|
+
.map((ref) => view.local('contract-documents', WORKSPACE_OWNER, ref.digest))
|
|
11
|
+
.filter((d) => !!d);
|
|
12
|
+
}
|
|
13
|
+
/** Обязательства договоров поручения, исполняемые данным gate. */
|
|
14
|
+
function declared(contracts, gate) {
|
|
15
|
+
return contracts
|
|
16
|
+
.filter((c) => c.checks)
|
|
17
|
+
.flatMap((c) => c.checks.gate === gate || gate === undefined
|
|
18
|
+
? c.checks.obligations.map((o) => ({ contract: c, gate: c.checks.gate, obligation: o }))
|
|
19
|
+
: []);
|
|
20
|
+
}
|
|
21
|
+
/** Основание случаев корпуса: закреплённые файлы, gate и смысл обязательств. */
|
|
22
|
+
export function suiteBasis(contract) {
|
|
23
|
+
const declaration = contract.checks;
|
|
24
|
+
return digestOf({
|
|
25
|
+
artifacts: (contract.artifacts ?? []).map((a) => ({ path: a.path, blob: a.blob })),
|
|
26
|
+
gate: declaration.gate,
|
|
27
|
+
obligations: declaration.obligations.map((o) => ({
|
|
28
|
+
property: o.property,
|
|
29
|
+
domain: o.domain,
|
|
30
|
+
answer: o.answer,
|
|
31
|
+
method: o.method,
|
|
32
|
+
})),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Привязка поручения к версии корпуса остаётся в силе, только пока среди его
|
|
37
|
+
* договоров есть договор этого корпуса с тем же нормативным основанием.
|
|
38
|
+
* Изменение постороннего контракта её не снимает; новый ID или новые правила
|
|
39
|
+
* того же ID — снимают: ожидания прежнего основания не становятся нормой для
|
|
40
|
+
* новых правил.
|
|
41
|
+
*/
|
|
42
|
+
export function corpusBindingHolds(suite, contracts,
|
|
43
|
+
/** Основание корпуса по формуле хоста; без неё — формула harness. */
|
|
44
|
+
basisOf = suiteBasis) {
|
|
45
|
+
if (!suite)
|
|
46
|
+
return false;
|
|
47
|
+
const contract = contracts.find((c) => c.id === suite.contractId && c.checks);
|
|
48
|
+
return !!contract && basisOf(contract) === suite.basis;
|
|
49
|
+
}
|
|
50
|
+
/** Обязательство по property ID среди договоров поручения. */
|
|
51
|
+
export function obligationOf(contracts, id) {
|
|
52
|
+
return declared(contracts).find((x) => x.obligation.property === id);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Структурные пропуски договора проверки — до вызова модели. Способ проверки
|
|
56
|
+
* обязан ссылаться на закреплённые файлы контракта: иначе происхождение
|
|
57
|
+
* эталона не закреплено ничем.
|
|
58
|
+
*/
|
|
59
|
+
export function declarationProblems(declaration, context) {
|
|
60
|
+
const problems = [];
|
|
61
|
+
const gate = context.gates.find((g) => g.id === declaration.gate);
|
|
62
|
+
if (!gate)
|
|
63
|
+
problems.push(`gate ${declaration.gate} не настроен в репозитории ${context.repositoryId}`);
|
|
64
|
+
const ids = declaration.obligations.map((o) => o.property);
|
|
65
|
+
for (const id of new Set(ids))
|
|
66
|
+
if (ids.filter((x) => x === id).length > 1)
|
|
67
|
+
problems.push(`свойство ${id} объявлено дважды`);
|
|
68
|
+
for (const o of declaration.obligations) {
|
|
69
|
+
const at = `свойство ${o.property}`;
|
|
70
|
+
if (o.promise === 'other' && !o.explanation)
|
|
71
|
+
problems.push(`${at}: для типа other объясните, какое это обещание`);
|
|
72
|
+
const families = o.coverage.families.map((f) => f.id);
|
|
73
|
+
if (new Set(families).size !== families.length)
|
|
74
|
+
problems.push(`${at}: id семейств входов повторяются`);
|
|
75
|
+
const sum = o.coverage.families.reduce((n, f) => n + f.minCases, 0);
|
|
76
|
+
if (sum > o.coverage.minCases)
|
|
77
|
+
problems.push(`${at}: семейства требуют ${sum} входов, больше общего минимума ${o.coverage.minCases}`);
|
|
78
|
+
for (const path of o.method.artifacts)
|
|
79
|
+
if (!context.artifacts.includes(path))
|
|
80
|
+
problems.push(`${at}: ${path} не объявлен артефактом контракта и не закреплён`);
|
|
81
|
+
if (strongPromises.has(o.promise)) {
|
|
82
|
+
if (!['oracle', 'certificate', 'analytic', 'invariant'].includes(o.method.kind))
|
|
83
|
+
problems.push(`${at}: для обещания ${o.promise} нужен независимый способ проверки (эталон, сертификат, аналитическое основание или инвариант), а не ${o.method.kind}`);
|
|
84
|
+
if (!o.method.artifacts.length && o.method.kind !== 'analytic')
|
|
85
|
+
problems.push(`${at}: способ проверки не ссылается на закреплённый checker или эталон`);
|
|
86
|
+
if (gate && !gate.property)
|
|
87
|
+
problems.push(`${at}: gate ${gate.id} не генеративный (нет property)`);
|
|
88
|
+
}
|
|
89
|
+
if (o.promise === 'performance' && !o.resources.benchmark)
|
|
90
|
+
problems.push(`${at}: для производительности укажите метод измерения и среду`);
|
|
91
|
+
if (o.coverage.corpus && !declaration.corpus)
|
|
92
|
+
problems.push(`${at}: корпус включён, но политика расширения корпуса не описана`);
|
|
93
|
+
if (o.hard) {
|
|
94
|
+
if (!o.feasibility)
|
|
95
|
+
problems.push(`${at}: тяжёлое обязательство требует ограниченного эксперимента до реализации (spike)`);
|
|
96
|
+
else {
|
|
97
|
+
const spike = context.spike?.(o.feasibility.spike);
|
|
98
|
+
if (!spike)
|
|
99
|
+
problems.push(`${at}: эксперимент ${o.feasibility.spike} не найден`);
|
|
100
|
+
else if (spike.digest !== o.feasibility.digest)
|
|
101
|
+
problems.push(`${at}: эксперимент ${o.feasibility.spike} изменился после ссылки на него`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return problems;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Свойства, объявленные поручением, существуют в его договорах и исполняются
|
|
109
|
+
* его генеративными gates. Поручение без `properties` — прежний уровень.
|
|
110
|
+
*/
|
|
111
|
+
export function orderPropertyProblems(order, contracts,
|
|
112
|
+
/** Gates репозитория поручения и раскрытая область поручения. */
|
|
113
|
+
gates) {
|
|
114
|
+
if (!order.properties?.length)
|
|
115
|
+
return [];
|
|
116
|
+
const problems = [];
|
|
117
|
+
const all = declared(contracts);
|
|
118
|
+
if (new Set(order.properties).size !== order.properties.length)
|
|
119
|
+
problems.push(`${order.id}: свойства поручения повторяются`);
|
|
120
|
+
for (const id of order.properties) {
|
|
121
|
+
const found = all.filter((x) => x.obligation.property === id);
|
|
122
|
+
if (!found.length) {
|
|
123
|
+
problems.push(`${order.id}: свойство ${id} не объявлено в договорах поручения`);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (found.length > 1)
|
|
127
|
+
problems.push(`${order.id}: свойство ${id} объявлено в нескольких договорах`);
|
|
128
|
+
const gate = found[0].gate;
|
|
129
|
+
if (gates.scope && !gates.scope.includes(gate))
|
|
130
|
+
problems.push(`${order.id}: свойство ${id} проверяет gate ${gate}, которого нет в поручении`);
|
|
131
|
+
// Селектор свойств передаёт controller, а исполняет harness генеративного
|
|
132
|
+
// gate: без него область поручения в общем файле проверок не выбрать.
|
|
133
|
+
const configured = gates.configured.find((g) => g.id === gate);
|
|
134
|
+
if (!configured)
|
|
135
|
+
problems.push(`${order.id}: gate ${gate} свойства ${id} не настроен`);
|
|
136
|
+
else if (!configured.property)
|
|
137
|
+
problems.push(`${order.id}: gate ${gate} свойства ${id} не генеративный — селектор свойств не подготовлен`);
|
|
138
|
+
}
|
|
139
|
+
// Сценарий, названный тем же id, проверяет тот же gate: иначе требование
|
|
140
|
+
// ссылается на свойство, а подтверждается другой проверкой.
|
|
141
|
+
for (const link of order.requirements ?? []) {
|
|
142
|
+
if (!link.testId)
|
|
143
|
+
continue;
|
|
144
|
+
const found = all.find((x) => x.obligation.property === link.testId);
|
|
145
|
+
if (found && found.gate !== link.gate)
|
|
146
|
+
problems.push(`${order.id}: ${link.id} ссылается на свойство ${link.testId}, но через gate ${link.gate}, а не ${found.gate}`);
|
|
147
|
+
}
|
|
148
|
+
return problems;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Манифест ожидаемой проверки gate для поручения или undefined — прежний
|
|
152
|
+
* уровень доказательства (поручение не включило механизм).
|
|
153
|
+
*/
|
|
154
|
+
export function orderCheckManifest(order, contracts, gate, corpus) {
|
|
155
|
+
if (!order.properties?.length)
|
|
156
|
+
return undefined;
|
|
157
|
+
const obligations = declared(contracts, gate).filter((x) => order.properties.includes(x.obligation.property));
|
|
158
|
+
if (!obligations.length)
|
|
159
|
+
return undefined;
|
|
160
|
+
const ids = new Set(obligations.map((x) => x.obligation.property));
|
|
161
|
+
const cases = corpus?.cases.filter((c) => ids.has(c.property)) ?? [];
|
|
162
|
+
return {
|
|
163
|
+
properties: obligations.map(({ obligation: o }) => ({
|
|
164
|
+
id: o.property,
|
|
165
|
+
minCases: o.coverage.minCases,
|
|
166
|
+
families: o.coverage.families.map((f) => ({ id: f.id, minCases: f.minCases })),
|
|
167
|
+
})),
|
|
168
|
+
...(corpus && cases.length ? { corpus: { digest: corpus.digest, cases } } : {}),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Действующая версия проверок поручения: согласованная постановка,
|
|
173
|
+
* контракты, политика и принятый snapshot корпуса. Закрепляется в попытке
|
|
174
|
+
* при выдаче и участвует в evidence, finish, recovery и reuse.
|
|
175
|
+
*/
|
|
176
|
+
export function effectiveChecks(work, policyDigest) {
|
|
177
|
+
return digestOf({
|
|
178
|
+
spec: work.approvedDigest ?? null,
|
|
179
|
+
contracts: Object.fromEntries(work.order.contracts.map((c) => [c.id, c.digest])),
|
|
180
|
+
policy: policyDigest,
|
|
181
|
+
corpus: work.checkVersion?.digest ?? null,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/** Основание эпизода восстановления: согласованная постановка и контракты. */
|
|
185
|
+
export function episodeBasis(work) {
|
|
186
|
+
return digestOf({
|
|
187
|
+
spec: work.approvedDigest ?? null,
|
|
188
|
+
contracts: Object.fromEntries(work.order.contracts.map((c) => [c.id, c.digest])),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type ContractArtifact, type ExecutionPolicy } from '../contracts/index.ts';
|
|
3
|
+
import { type CorpusStore } from './corpus.ts';
|
|
4
|
+
/**
|
|
5
|
+
* Быстрый маршрут: подтверждённый пример становится обязательным случаем.
|
|
6
|
+
*
|
|
7
|
+
* Пример reviewer или ведущего — гипотеза. Controller сам запускает
|
|
8
|
+
* закреплённый эталон на этом входе (режим одного случая того же checker,
|
|
9
|
+
* что исполняет gate), повторяет проверку реализации на исходном дефектном
|
|
10
|
+
* SHA и требует воспроизводимого расхождения. Ответ эталона, а не слова
|
|
11
|
+
* reviewer, становится ожиданием. Команда из воспроизведения не исполняется
|
|
12
|
+
* никогда; данные входа не интерпретируются как shell.
|
|
13
|
+
*
|
|
14
|
+
* Маршрут только добавляет данные под тем же checker/oracle, той же областью
|
|
15
|
+
* и правилами ответа. Удаление случая, замена ожидания, допуск, покрытие,
|
|
16
|
+
* новый checker или команда — обычное изменение договора проверки.
|
|
17
|
+
*/
|
|
18
|
+
export declare const fastPathChanges: readonly ["add", "remove", "replace-expected", "tolerance", "coverage", "checker", "command"];
|
|
19
|
+
export declare const caseInputSchema: z.ZodObject<{
|
|
20
|
+
workId: z.ZodString;
|
|
21
|
+
property: z.ZodString;
|
|
22
|
+
input: z.ZodString;
|
|
23
|
+
expected: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
24
|
+
actual: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
25
|
+
reproductionId: z.ZodOptional<z.ZodString>;
|
|
26
|
+
sourceSha: z.ZodOptional<z.ZodString>;
|
|
27
|
+
sourceRunId: z.ZodOptional<z.ZodString>;
|
|
28
|
+
adopt: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
29
|
+
key: z.ZodString;
|
|
30
|
+
change: z.ZodDefault<z.ZodEnum<{
|
|
31
|
+
command: "command";
|
|
32
|
+
tolerance: "tolerance";
|
|
33
|
+
coverage: "coverage";
|
|
34
|
+
add: "add";
|
|
35
|
+
remove: "remove";
|
|
36
|
+
"replace-expected": "replace-expected";
|
|
37
|
+
checker: "checker";
|
|
38
|
+
}>>;
|
|
39
|
+
origin: z.ZodDefault<z.ZodEnum<{
|
|
40
|
+
review: "review";
|
|
41
|
+
agent: "agent";
|
|
42
|
+
operator: "operator";
|
|
43
|
+
lead: "lead";
|
|
44
|
+
}>>;
|
|
45
|
+
runtime: z.ZodOptional<z.ZodString>;
|
|
46
|
+
}, z.core.$strict>;
|
|
47
|
+
export type CaseRequest = z.input<typeof caseInputSchema>;
|
|
48
|
+
/** Точка после записи версии и до принятия: тест моделирует в ней сбой. */
|
|
49
|
+
export declare const caseHooks: {
|
|
50
|
+
afterRecord: () => void;
|
|
51
|
+
};
|
|
52
|
+
/** Что нужно подтверждению от controller. */
|
|
53
|
+
export interface ConfirmContext {
|
|
54
|
+
corpus: CorpusStore;
|
|
55
|
+
policy: ExecutionPolicy;
|
|
56
|
+
stateDir: string;
|
|
57
|
+
repoPath(repo: ExecutionPolicy['repositories'][number]): string;
|
|
58
|
+
/** Закрытое проверке и открытое внутри него. */
|
|
59
|
+
boundary(): {
|
|
60
|
+
hidden: string[];
|
|
61
|
+
readable: string[];
|
|
62
|
+
};
|
|
63
|
+
/** Источник переменных окружения (по умолчанию — процесс). */
|
|
64
|
+
environment?: NodeJS.ProcessEnv;
|
|
65
|
+
}
|
|
66
|
+
/** Изменённые закреплённые файлы на SHA: checker должен быть утверждённой редакцией. */
|
|
67
|
+
export declare function staleArtifacts(repoPath: string, sha: string, artifacts: ContractArtifact[]): Promise<string[]>;
|
|
68
|
+
export declare function submitCase(ctx: ConfirmContext, raw: unknown): Promise<{
|
|
69
|
+
suite: string;
|
|
70
|
+
repeated: boolean;
|
|
71
|
+
decision: {
|
|
72
|
+
id: string;
|
|
73
|
+
property: string;
|
|
74
|
+
input: string;
|
|
75
|
+
inputHash: string;
|
|
76
|
+
outcome: "rejected" | "inconclusive" | "confirmed" | "refuted";
|
|
77
|
+
reason: string;
|
|
78
|
+
source: {
|
|
79
|
+
sha: string;
|
|
80
|
+
runId?: string | undefined;
|
|
81
|
+
taskId?: string | undefined;
|
|
82
|
+
};
|
|
83
|
+
origin: {
|
|
84
|
+
kind: "review" | "agent" | "operator" | "lead";
|
|
85
|
+
runtime?: string | undefined;
|
|
86
|
+
};
|
|
87
|
+
at: string;
|
|
88
|
+
key?: string | undefined;
|
|
89
|
+
claimed?: {
|
|
90
|
+
expected: string | null;
|
|
91
|
+
actual: string | null;
|
|
92
|
+
reproduction?: string | undefined;
|
|
93
|
+
} | undefined;
|
|
94
|
+
observed?: {
|
|
95
|
+
repeats: number;
|
|
96
|
+
durationsMs: number[];
|
|
97
|
+
expected?: string | undefined;
|
|
98
|
+
actual?: string | undefined;
|
|
99
|
+
equal?: boolean | undefined;
|
|
100
|
+
} | undefined;
|
|
101
|
+
method?: {
|
|
102
|
+
gate: string;
|
|
103
|
+
artifacts: {
|
|
104
|
+
path: string;
|
|
105
|
+
blob: string;
|
|
106
|
+
}[];
|
|
107
|
+
contract: string;
|
|
108
|
+
basis: string;
|
|
109
|
+
command?: string[] | undefined;
|
|
110
|
+
} | undefined;
|
|
111
|
+
caseId?: string | undefined;
|
|
112
|
+
version?: number | undefined;
|
|
113
|
+
};
|
|
114
|
+
version: {
|
|
115
|
+
number: number;
|
|
116
|
+
digest: string;
|
|
117
|
+
cases: number;
|
|
118
|
+
} | null;
|
|
119
|
+
adoption: {
|
|
120
|
+
awaitingOperator?: true | undefined;
|
|
121
|
+
id: string;
|
|
122
|
+
status: "completed" | "waiting";
|
|
123
|
+
results: Record<string, string>;
|
|
124
|
+
}[];
|
|
125
|
+
}>;
|