@velum-labs/routekit-eval-setup 1.3.2 → 1.5.0
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/dist/adapters/authoring-responses-request.d.ts +5 -0
- package/dist/adapters/authoring-responses-request.js +38 -0
- package/dist/adapters/evaluation-evidence-freshness.d.ts +7 -0
- package/dist/adapters/evaluation-evidence-freshness.js +76 -0
- package/dist/adapters/git-task-history.d.ts +67 -0
- package/dist/adapters/git-task-history.js +171 -0
- package/dist/adapters/integrated-repository-history.d.ts +21 -0
- package/dist/adapters/integrated-repository-history.js +175 -0
- package/dist/adapters/repository-command-diagnostic.d.ts +8 -0
- package/dist/adapters/repository-command-diagnostic.js +46 -0
- package/dist/adapters/repository-command-evidence.d.ts +13 -0
- package/dist/adapters/repository-command-evidence.js +102 -0
- package/dist/adapters/repository-command-runner.d.ts +238 -0
- package/dist/adapters/repository-command-runner.js +1483 -0
- package/dist/adapters/repository-import-context.d.ts +47 -0
- package/dist/adapters/repository-import-context.js +469 -0
- package/dist/adapters/repository-node-test-reporter.d.ts +3 -0
- package/dist/adapters/repository-node-test-reporter.js +27 -0
- package/dist/adapters/repository-review-evidence.d.ts +39 -0
- package/dist/adapters/repository-review-evidence.js +632 -0
- package/dist/adapters/repository-seed-selection.d.ts +7 -0
- package/dist/adapters/repository-seed-selection.js +79 -0
- package/dist/adapters/repository-solution-edits.d.ts +49 -0
- package/dist/adapters/repository-solution-edits.js +136 -0
- package/dist/adapters/repository-vitest-phase-adapter.d.ts +8 -0
- package/dist/adapters/repository-vitest-phase-adapter.js +310 -0
- package/dist/adapters/repository-vitest-reporter.d.ts +24 -0
- package/dist/adapters/repository-vitest-reporter.js +314 -0
- package/dist/adapters/strict-authoring-schema.d.ts +5 -0
- package/dist/adapters/strict-authoring-schema.js +158 -0
- package/dist/adapters/test-discovery.d.ts +30 -0
- package/dist/adapters/test-discovery.js +124 -0
- package/dist/adapters/typescript-repository-index.d.ts +51 -0
- package/dist/adapters/typescript-repository-index.js +226 -0
- package/dist/agentic-capabilities-protocol.d.ts +1373 -0
- package/dist/agentic-capabilities-protocol.js +786 -0
- package/dist/case-checkpoint-store.d.ts +29 -0
- package/dist/case-checkpoint-store.js +133 -0
- package/dist/case-pipeline-protocol-v2.d.ts +184 -0
- package/dist/case-pipeline-protocol-v2.js +193 -0
- package/dist/case-pipeline-protocol.d.ts +2626 -0
- package/dist/case-pipeline-protocol.js +371 -0
- package/dist/effect-api.d.ts +74 -10
- package/dist/effect-api.js +56 -6
- package/dist/errors.d.ts +31 -0
- package/dist/errors.js +10 -0
- package/dist/eval-capability-execution-envelope.d.ts +64 -0
- package/dist/eval-capability-execution-envelope.js +98 -0
- package/dist/eval-capability-policy.d.ts +90 -0
- package/dist/eval-capability-policy.js +107 -0
- package/dist/eval-event-log.d.ts +140 -0
- package/dist/eval-event-log.js +220 -0
- package/dist/evaluation-authoring-policy.d.ts +18 -0
- package/dist/evaluation-authoring-policy.js +19 -0
- package/dist/evaluation-authoring-validation.d.ts +22 -0
- package/dist/evaluation-authoring-validation.js +72 -0
- package/dist/evaluation-evidence.d.ts +20 -0
- package/dist/evaluation-evidence.js +319 -0
- package/dist/evaluation-grader-calibration-protocol.d.ts +108 -0
- package/dist/evaluation-grader-calibration-protocol.js +80 -0
- package/dist/evaluation-grader-calibration.d.ts +18 -0
- package/dist/evaluation-grader-calibration.js +334 -0
- package/dist/evaluation-grading-policy.d.ts +24 -0
- package/dist/evaluation-grading-policy.js +54 -0
- package/dist/evaluation-proposal-policy.d.ts +4 -0
- package/dist/evaluation-proposal-policy.js +91 -0
- package/dist/evaluation-source-retrieval.d.ts +68 -0
- package/dist/evaluation-source-retrieval.js +513 -0
- package/dist/evaluation-structure-policy.d.ts +29 -0
- package/dist/evaluation-structure-policy.js +138 -0
- package/dist/index.d.ts +124 -17
- package/dist/index.js +69 -11
- package/dist/inspection.js +2 -3
- package/dist/project-artifacts.d.ts +7 -2
- package/dist/project-artifacts.js +49 -136
- package/dist/project-authoring.d.ts +66 -5
- package/dist/project-authoring.js +783 -109
- package/dist/project-contracts.d.ts +419 -84
- package/dist/project-contracts.js +160 -52
- package/dist/project-store.js +2 -1
- package/dist/project-workflow.d.ts +5 -4
- package/dist/project-workflow.js +154 -35
- package/dist/repository-adversary-protocol.d.ts +64 -0
- package/dist/repository-adversary-protocol.js +105 -0
- package/dist/repository-behavior-protocol.d.ts +188 -0
- package/dist/repository-behavior-protocol.js +202 -0
- package/dist/repository-benchmark-protocol.d.ts +487 -0
- package/dist/repository-benchmark-protocol.js +96 -0
- package/dist/repository-execution-protocol.d.ts +150 -0
- package/dist/repository-execution-protocol.js +38 -0
- package/dist/repository-fixture-instructions.d.ts +3 -0
- package/dist/repository-fixture-instructions.js +91 -0
- package/dist/repository-fixture-protocol.d.ts +79 -0
- package/dist/repository-fixture-protocol.js +79 -0
- package/dist/repository-foundry-plan-protocol.d.ts +118 -0
- package/dist/repository-foundry-plan-protocol.js +296 -0
- package/dist/repository-foundry-progress-protocol.d.ts +52 -0
- package/dist/repository-foundry-progress-protocol.js +52 -0
- package/dist/repository-improvement-protocol.d.ts +100 -0
- package/dist/repository-improvement-protocol.js +106 -0
- package/dist/repository-language-model-protocol.d.ts +43 -0
- package/dist/repository-language-model-protocol.js +146 -0
- package/dist/repository-oracle-coverage-protocol.d.ts +18 -0
- package/dist/repository-oracle-coverage-protocol.js +39 -0
- package/dist/repository-oracle-execution-binding.d.ts +27 -0
- package/dist/repository-oracle-execution-binding.js +59 -0
- package/dist/repository-oracle-protocol.d.ts +230 -0
- package/dist/repository-oracle-protocol.js +156 -0
- package/dist/repository-oracle-scope-policy.d.ts +22 -0
- package/dist/repository-oracle-scope-policy.js +92 -0
- package/dist/repository-quality-policy.d.ts +15 -0
- package/dist/repository-quality-policy.js +357 -0
- package/dist/repository-routing-benchmark-protocol.d.ts +176 -0
- package/dist/repository-routing-benchmark-protocol.js +103 -0
- package/dist/repository-routing-model-protocol.d.ts +36 -0
- package/dist/repository-routing-model-protocol.js +89 -0
- package/dist/repository-routing-plan-protocol.d.ts +112 -0
- package/dist/repository-routing-plan-protocol.js +58 -0
- package/dist/repository-routing-quality-policy.d.ts +9 -0
- package/dist/repository-routing-quality-policy.js +191 -0
- package/dist/repository-seed-qualification-progress-protocol.d.ts +205 -0
- package/dist/repository-seed-qualification-progress-protocol.js +28 -0
- package/dist/repository-semantic-calibration-protocol.d.ts +768 -0
- package/dist/repository-semantic-calibration-protocol.js +276 -0
- package/dist/repository-semantic-calibration.d.ts +163 -0
- package/dist/repository-semantic-calibration.js +581 -0
- package/dist/repository-specification-contract-facts-protocol.d.ts +224 -0
- package/dist/repository-specification-contract-facts-protocol.js +276 -0
- package/dist/repository-specification-critique-protocol.d.ts +189 -0
- package/dist/repository-specification-critique-protocol.js +103 -0
- package/dist/repository-task-family-protocol.d.ts +24 -0
- package/dist/repository-task-family-protocol.js +37 -0
- package/dist/repository-task-seed-protocol.d.ts +384 -0
- package/dist/repository-task-seed-protocol.js +236 -0
- package/dist/repository-trajectory-protocol.d.ts +20 -0
- package/dist/repository-trajectory-protocol.js +42 -0
- package/dist/service.js +1 -1
- package/dist/services/adversary/service.d.ts +64 -0
- package/dist/services/adversary/service.js +330 -0
- package/dist/services/benchmark-compiler/service.d.ts +450 -0
- package/dist/services/benchmark-compiler/service.js +9 -0
- package/dist/services/budgeted-model/service.d.ts +118 -0
- package/dist/services/budgeted-model/service.js +460 -0
- package/dist/services/case-authoring/service.d.ts +163 -0
- package/dist/services/case-authoring/service.js +1456 -0
- package/dist/services/case-finalization/service.d.ts +283 -0
- package/dist/services/case-finalization/service.js +370 -0
- package/dist/services/case-generation/service.d.ts +619 -0
- package/dist/services/case-generation/service.js +2628 -0
- package/dist/services/case-pipeline/service.d.ts +31 -0
- package/dist/services/case-pipeline/service.js +485 -0
- package/dist/services/case-pipeline-v2/service.d.ts +70 -0
- package/dist/services/case-pipeline-v2/service.js +477 -0
- package/dist/services/command-observability/service.d.ts +13 -0
- package/dist/services/command-observability/service.js +3 -0
- package/dist/services/dimension-labeling/service.d.ts +77 -0
- package/dist/services/dimension-labeling/service.js +188 -0
- package/dist/services/eval-candidate/service.d.ts +208 -0
- package/dist/services/eval-candidate/service.js +64 -0
- package/dist/services/eval-capabilities/service.d.ts +183 -0
- package/dist/services/eval-capabilities/service.js +1433 -0
- package/dist/services/eval-environment/service.d.ts +173 -0
- package/dist/services/eval-environment/service.js +127 -0
- package/dist/services/evidence-reconstruction/service.d.ts +36 -0
- package/dist/services/evidence-reconstruction/service.js +145 -0
- package/dist/services/fixture-builder/service.d.ts +62 -0
- package/dist/services/fixture-builder/service.js +36 -0
- package/dist/services/fixture-validation/service.d.ts +75 -0
- package/dist/services/fixture-validation/service.js +295 -0
- package/dist/services/foundry/service.d.ts +831 -0
- package/dist/services/foundry/service.js +442 -0
- package/dist/services/foundry-progress/service.d.ts +62 -0
- package/dist/services/foundry-progress/service.js +149 -0
- package/dist/services/foundry-v2/service.d.ts +54 -0
- package/dist/services/foundry-v2/service.js +28 -0
- package/dist/services/grounded-authoring/service.d.ts +126 -0
- package/dist/services/grounded-authoring/service.js +822 -0
- package/dist/services/historical-case/service.d.ts +722 -0
- package/dist/services/historical-case/service.js +177 -0
- package/dist/services/improvement-loop/service.d.ts +59 -0
- package/dist/services/improvement-loop/service.js +176 -0
- package/dist/services/language-model/service.d.ts +52 -0
- package/dist/services/language-model/service.js +194 -0
- package/dist/services/oracle-builder/service.d.ts +146 -0
- package/dist/services/oracle-builder/service.js +513 -0
- package/dist/services/oracle-coverage/service.d.ts +28 -0
- package/dist/services/oracle-coverage/service.js +50 -0
- package/dist/services/oracle-coverage-witness/service.d.ts +130 -0
- package/dist/services/oracle-coverage-witness/service.js +538 -0
- package/dist/services/pipeline-challenge/service.d.ts +551 -0
- package/dist/services/pipeline-challenge/service.js +427 -0
- package/dist/services/pipeline-controls/service.d.ts +130 -0
- package/dist/services/pipeline-controls/service.js +483 -0
- package/dist/services/pipeline-oracle/service.d.ts +8 -0
- package/dist/services/pipeline-oracle/service.js +256 -0
- package/dist/services/pipeline-seed/service.d.ts +298 -0
- package/dist/services/pipeline-seed/service.js +428 -0
- package/dist/services/pipeline-spec/service.d.ts +103 -0
- package/dist/services/pipeline-spec/service.js +619 -0
- package/dist/services/pipeline-tournament/service.d.ts +258 -0
- package/dist/services/pipeline-tournament/service.js +476 -0
- package/dist/services/quality-gate/service.d.ts +233 -0
- package/dist/services/quality-gate/service.js +136 -0
- package/dist/services/repository-bundle/service.d.ts +33 -0
- package/dist/services/repository-bundle/service.js +114 -0
- package/dist/services/repository-model/service.d.ts +105 -0
- package/dist/services/repository-model/service.js +250 -0
- package/dist/services/repository-public-artifact/service.d.ts +133 -0
- package/dist/services/repository-public-artifact/service.js +330 -0
- package/dist/services/routing-benchmark/service.d.ts +362 -0
- package/dist/services/routing-benchmark/service.js +96 -0
- package/dist/services/specification-critic/service.d.ts +92 -0
- package/dist/services/specification-critic/service.js +172 -0
- package/dist/services/task-family/service.d.ts +40 -0
- package/dist/services/task-family/service.js +55 -0
- package/dist/services/task-seed/service.d.ts +906 -0
- package/dist/services/task-seed/service.js +1406 -0
- package/dist/services/task-specification/service.d.ts +27 -0
- package/dist/services/task-specification/service.js +40 -0
- package/dist/services/trajectory-policy/service.d.ts +110 -0
- package/dist/services/trajectory-policy/service.js +216 -0
- package/dist/test/agentic-capabilities-protocol.test.d.ts +1 -0
- package/dist/test/agentic-capabilities-protocol.test.js +570 -0
- package/dist/test/agentic-capabilities.test.d.ts +1 -0
- package/dist/test/agentic-capabilities.test.js +1461 -0
- package/dist/test/agentic-environment.test.d.ts +1 -0
- package/dist/test/agentic-environment.test.js +213 -0
- package/dist/test/case-pipeline-foundation.test.d.ts +1 -0
- package/dist/test/case-pipeline-foundation.test.js +535 -0
- package/dist/test/case-pipeline-protocol-v2.test.d.ts +1 -0
- package/dist/test/case-pipeline-protocol-v2.test.js +124 -0
- package/dist/test/case-pipeline-v2.test.d.ts +1 -0
- package/dist/test/case-pipeline-v2.test.js +286 -0
- package/dist/test/case-pipeline.test.d.ts +1 -0
- package/dist/test/case-pipeline.test.js +851 -0
- package/dist/test/eval-capability-policy.test.d.ts +1 -0
- package/dist/test/eval-capability-policy.test.js +50 -0
- package/dist/test/eval-event-log.test.d.ts +1 -0
- package/dist/test/eval-event-log.test.js +125 -0
- package/dist/test/evaluation-evidence-freshness.test.d.ts +1 -0
- package/dist/test/evaluation-evidence-freshness.test.js +44 -0
- package/dist/test/evaluation-evidence.test.d.ts +1 -0
- package/dist/test/evaluation-evidence.test.js +230 -0
- package/dist/test/evaluation-grader-calibration.test.d.ts +1 -0
- package/dist/test/evaluation-grader-calibration.test.js +373 -0
- package/dist/test/evaluation-proposal-digest.test.d.ts +1 -0
- package/dist/test/evaluation-proposal-digest.test.js +187 -0
- package/dist/test/evaluation-source-retrieval.test.d.ts +1 -0
- package/dist/test/evaluation-source-retrieval.test.js +237 -0
- package/dist/test/evaluation-structure-policy.test.d.ts +1 -0
- package/dist/test/evaluation-structure-policy.test.js +196 -0
- package/dist/test/fixtures/repository-resource-panel.d.ts +39 -0
- package/dist/test/fixtures/repository-resource-panel.js +111 -0
- package/dist/test/fixtures/vitest-boundary-panel.d.ts +84 -0
- package/dist/test/fixtures/vitest-boundary-panel.js +120 -0
- package/dist/test/fixtures/vitest-phase-panel.d.ts +135 -0
- package/dist/test/fixtures/vitest-phase-panel.js +213 -0
- package/dist/test/fixtures/vitest-reporter-results.d.ts +76 -0
- package/dist/test/fixtures/vitest-reporter-results.js +94 -0
- package/dist/test/grounded-authoring.test.d.ts +1 -0
- package/dist/test/grounded-authoring.test.js +565 -0
- package/dist/test/integrated-repository-history.test.d.ts +1 -0
- package/dist/test/integrated-repository-history.test.js +227 -0
- package/dist/test/project-authoring.test.js +593 -43
- package/dist/test/project-workflow.test.js +419 -40
- package/dist/test/repository-authoring-artifacts.test.d.ts +1 -0
- package/dist/test/repository-authoring-artifacts.test.js +185 -0
- package/dist/test/repository-bundle.test.d.ts +1 -0
- package/dist/test/repository-bundle.test.js +52 -0
- package/dist/test/repository-case-generation.test.d.ts +1 -0
- package/dist/test/repository-case-generation.test.js +3465 -0
- package/dist/test/repository-command-diagnostic.test.d.ts +1 -0
- package/dist/test/repository-command-diagnostic.test.js +55 -0
- package/dist/test/repository-command-signals.test.d.ts +1 -0
- package/dist/test/repository-command-signals.test.js +124 -0
- package/dist/test/repository-fixture-scope-coverage.test.d.ts +1 -0
- package/dist/test/repository-fixture-scope-coverage.test.js +127 -0
- package/dist/test/repository-fixture-validation.test.d.ts +1 -0
- package/dist/test/repository-fixture-validation.test.js +362 -0
- package/dist/test/repository-foundry-progress.test.d.ts +1 -0
- package/dist/test/repository-foundry-progress.test.js +110 -0
- package/dist/test/repository-foundry-quality.test.d.ts +1 -0
- package/dist/test/repository-foundry-quality.test.js +1138 -0
- package/dist/test/repository-import-context.test.d.ts +1 -0
- package/dist/test/repository-import-context.test.js +354 -0
- package/dist/test/repository-model-authoring.test.d.ts +1 -0
- package/dist/test/repository-model-authoring.test.js +544 -0
- package/dist/test/repository-model.test.d.ts +1 -0
- package/dist/test/repository-model.test.js +2195 -0
- package/dist/test/repository-node-test-reporter.test.d.ts +1 -0
- package/dist/test/repository-node-test-reporter.test.js +104 -0
- package/dist/test/repository-oracle-concurrency.test.d.ts +1 -0
- package/dist/test/repository-oracle-concurrency.test.js +542 -0
- package/dist/test/repository-oracle-coverage-witness.test.d.ts +1 -0
- package/dist/test/repository-oracle-coverage-witness.test.js +511 -0
- package/dist/test/repository-oracle-coverage.test.d.ts +1 -0
- package/dist/test/repository-oracle-coverage.test.js +168 -0
- package/dist/test/repository-oracle-evidence.test.d.ts +1 -0
- package/dist/test/repository-oracle-evidence.test.js +185 -0
- package/dist/test/repository-oracle-plan.test.d.ts +1 -0
- package/dist/test/repository-oracle-plan.test.js +176 -0
- package/dist/test/repository-overlay-isolation.test.d.ts +1 -0
- package/dist/test/repository-overlay-isolation.test.js +85 -0
- package/dist/test/repository-preparation-cache.test.d.ts +1 -0
- package/dist/test/repository-preparation-cache.test.js +414 -0
- package/dist/test/repository-public-artifact.test.d.ts +1 -0
- package/dist/test/repository-public-artifact.test.js +273 -0
- package/dist/test/repository-qualification-diagnostics.test.d.ts +1 -0
- package/dist/test/repository-qualification-diagnostics.test.js +524 -0
- package/dist/test/repository-reference-authoring.test.d.ts +1 -0
- package/dist/test/repository-reference-authoring.test.js +1633 -0
- package/dist/test/repository-review-evidence-v2.test.d.ts +1 -0
- package/dist/test/repository-review-evidence-v2.test.js +183 -0
- package/dist/test/repository-review-evidence.test.d.ts +1 -0
- package/dist/test/repository-review-evidence.test.js +124 -0
- package/dist/test/repository-seed-exclusions.test.d.ts +1 -0
- package/dist/test/repository-seed-exclusions.test.js +96 -0
- package/dist/test/repository-seed-selection.test.d.ts +1 -0
- package/dist/test/repository-seed-selection.test.js +504 -0
- package/dist/test/repository-semantic-calibration.test.d.ts +1 -0
- package/dist/test/repository-semantic-calibration.test.js +688 -0
- package/dist/test/repository-solution-edits.test.d.ts +1 -0
- package/dist/test/repository-solution-edits.test.js +377 -0
- package/dist/test/repository-specification-budget.test.d.ts +1 -0
- package/dist/test/repository-specification-budget.test.js +171 -0
- package/dist/test/repository-specification-contract-checkpoint.test.d.ts +1 -0
- package/dist/test/repository-specification-contract-checkpoint.test.js +228 -0
- package/dist/test/repository-specification-contract-facts.test.d.ts +1 -0
- package/dist/test/repository-specification-contract-facts.test.js +177 -0
- package/dist/test/repository-trajectory-authoring.test.d.ts +1 -0
- package/dist/test/repository-trajectory-authoring.test.js +176 -0
- package/dist/test/repository-valid-control-plan.test.d.ts +1 -0
- package/dist/test/repository-valid-control-plan.test.js +45 -0
- package/dist/test/repository-vitest-phase.test.d.ts +1 -0
- package/dist/test/repository-vitest-phase.test.js +848 -0
- package/dist/test/repository-vitest-reporter.test.d.ts +1 -0
- package/dist/test/repository-vitest-reporter.test.js +158 -0
- package/dist/test/repository-workspace-build.test.d.ts +1 -0
- package/dist/test/repository-workspace-build.test.js +160 -0
- package/dist/test/strict-authoring-schema.test.d.ts +1 -0
- package/dist/test/strict-authoring-schema.test.js +169 -0
- package/package.json +48 -6
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { repositoryCommandTestEvidenceV1 } from "../../adapters/repository-command-evidence.js";
|
|
3
|
+
import { makeRepositoryPreparationCacheV1, replayRepositoryCommandsV1 } from "../../adapters/repository-command-runner.js";
|
|
4
|
+
import { loadPinnedSolutionEditSourcesV1, materializeSolutionFileOverridesV1 } from "../../adapters/repository-solution-edits.js";
|
|
5
|
+
import { RepositoryFoundryError } from "../../errors.js";
|
|
6
|
+
import { REPOSITORY_FIXTURE_EVIDENCE_INSTRUCTIONS, repositoryFixtureAuthoringInstructionsV1 } from "../../repository-fixture-instructions.js";
|
|
7
|
+
import { assertRepositoryHiddenFixtureSuiteV1 } from "../../repository-fixture-protocol.js";
|
|
8
|
+
import { repositoryFoundryRoleOutputCeilingV1 } from "../../repository-foundry-plan-protocol.js";
|
|
9
|
+
import { assertRepositoryTaskSeedV1 } from "../../repository-task-seed-protocol.js";
|
|
10
|
+
import { reportFoundryAuthoringArtifactV1, reportFoundryHeartbeatV1 } from "../foundry-progress/service.js";
|
|
11
|
+
import { RepositoryFoundryLanguageModel } from "../language-model/service.js";
|
|
12
|
+
const WitnessProposal = Schema.Struct({
|
|
13
|
+
witnesses: Schema.Array(Schema.Struct({
|
|
14
|
+
scopeId: Schema.String,
|
|
15
|
+
explanation: Schema.String,
|
|
16
|
+
fileOverrides: Schema.Array(Schema.Struct({
|
|
17
|
+
path: Schema.String,
|
|
18
|
+
edits: Schema.Array(Schema.Struct({ search: Schema.String, replace: Schema.String }))
|
|
19
|
+
})),
|
|
20
|
+
testPath: Schema.String,
|
|
21
|
+
testSource: Schema.String,
|
|
22
|
+
expectedBehavior: Schema.String,
|
|
23
|
+
expectationMode: Schema.Literals(["changes", "preserved"])
|
|
24
|
+
}))
|
|
25
|
+
});
|
|
26
|
+
const INSTRUCTIONS = `Turn each supplied coverage hypothesis into one isolated executable counterexample.
|
|
27
|
+
Use the pinned reference as the correct implementation. Make the smallest implementation change that
|
|
28
|
+
violates ONLY the named visible contract clause for the supplied scenario. Preserve all other behavior.
|
|
29
|
+
Return one witness for every requested scopeId, with:
|
|
30
|
+
- exactly one implementation fileOverride with exactly one exact edit against the REFERENCE source;
|
|
31
|
+
- one small complete test file at an allowed testPath, containing exactly ONE named test;
|
|
32
|
+
- a concrete observable assertion that passes the reference and fails this mutant.
|
|
33
|
+
The test must call repository behavior. It must not inspect source text, patch identity, filenames,
|
|
34
|
+
implementation style, or another test's results. Do not use a compound mutant whose unrelated defect
|
|
35
|
+
could cause the assertion failure. Do not rewrite the visible contract or propose extra scope.
|
|
36
|
+
Avoid fixed timing assumptions: use explicit state or a bounded deterministic scheduling observation.
|
|
37
|
+
Use the repository's test framework and APIs shown in the pinned sources. Keep the witness focused;
|
|
38
|
+
do not reproduce the original test suite or invent a general replacement implementation.
|
|
39
|
+
Return {path, edits: [{search, replace}]}; search must occur exactly once in the supplied reference.
|
|
40
|
+
Keep search below 8000 characters and replace below 12000 characters. Do not bundle separate defects.
|
|
41
|
+
You do not receive the current generated fixtures. The host will independently check whether they
|
|
42
|
+
already reject your mutant. If a previous witness was invalid, repair only the listed pending scopeIds
|
|
43
|
+
using the actual execution diagnostics. Return only the structured proposal.
|
|
44
|
+
|
|
45
|
+
${REPOSITORY_FIXTURE_EVIDENCE_INSTRUCTIONS}`;
|
|
46
|
+
const failure = (detail, cause) => new RepositoryFoundryError({
|
|
47
|
+
operation: "compile-reviewed-case",
|
|
48
|
+
detail,
|
|
49
|
+
...(cause === undefined ? {} : { cause })
|
|
50
|
+
});
|
|
51
|
+
const canonicalPath = (path) => path.length > 0 &&
|
|
52
|
+
path.length <= 1_024 &&
|
|
53
|
+
!path.includes("\\") &&
|
|
54
|
+
!path.includes("\0") &&
|
|
55
|
+
!path.split("/").some((part) => part === "" || part === "." || part === "..");
|
|
56
|
+
// The evidence adapter has already validated reporter identity, complete execution,
|
|
57
|
+
// and assertion attribution. Requiring one executed test makes the witness isolated.
|
|
58
|
+
const oneTest = (evidence, outcome) => evidence.outcome === outcome && /^executed=1(?:;|$)/u.test(evidence.detail);
|
|
59
|
+
const executedPassingProbe = (evidence) => evidence.outcome === "pass" && /^executed=[1-9]\d*; failed=0; reporter=/u.test(evidence.detail);
|
|
60
|
+
const executedSingleAssertionFailure = (evidence) => evidence.outcome === "fail" &&
|
|
61
|
+
/^executed=[1-9]\d*; assertionFailures=1; reporter=/u.test(evidence.detail);
|
|
62
|
+
const executedTestCount = (evidence) => {
|
|
63
|
+
const matched = /^executed=([1-9]\d*)(?:;|$)/u.exec(evidence.detail);
|
|
64
|
+
return matched === null ? undefined : Number(matched[1]);
|
|
65
|
+
};
|
|
66
|
+
const diagnostic = (results) => results.map((result) => ({
|
|
67
|
+
recipeId: result.recipeId,
|
|
68
|
+
stage: result.stage,
|
|
69
|
+
exitCode: result.exitCode,
|
|
70
|
+
gradeExecuted: result.gradeExecuted,
|
|
71
|
+
timedOut: result.timedOut,
|
|
72
|
+
outputTruncated: result.outputTruncated,
|
|
73
|
+
stdout: result.stdout.slice(-6_000),
|
|
74
|
+
stderr: result.stderr.slice(-6_000)
|
|
75
|
+
}));
|
|
76
|
+
const replayWitness = Effect.fn("OracleCoverageWitness.replay")(function* (input) {
|
|
77
|
+
const { operationId, overlay, fileOverrides, preparationCache } = input;
|
|
78
|
+
const referenceCommit = input.seed.referenceCommit;
|
|
79
|
+
const overlays = [
|
|
80
|
+
...input.seed.environment.protectedControlPaths.map((path) => ({
|
|
81
|
+
path,
|
|
82
|
+
sourceCommit: referenceCommit
|
|
83
|
+
})),
|
|
84
|
+
...input.seed.capabilityEvidence
|
|
85
|
+
.filter((entry) => entry.kind === "test" && entry.path !== undefined)
|
|
86
|
+
.map((entry) => ({ path: entry.path, sourceCommit: referenceCommit }))
|
|
87
|
+
];
|
|
88
|
+
const recipe = [...input.seed.environment.gradeRecipes]
|
|
89
|
+
.filter((entry) => entry.cwd === "." || overlay.path.startsWith(`${entry.cwd}/`))
|
|
90
|
+
.sort((left, right) => right.cwd.length - left.cwd.length)[0];
|
|
91
|
+
if (recipe === undefined)
|
|
92
|
+
return yield* failure("coverage witness has no reviewed test recipe");
|
|
93
|
+
const replayInput = {
|
|
94
|
+
repositoryRoot: input.repositoryRoot,
|
|
95
|
+
commit: input.seed.referenceCommit,
|
|
96
|
+
recipes: [recipe],
|
|
97
|
+
repetitions: 2,
|
|
98
|
+
trustedPreparationRecipes: input.seed.environment.trustedPreparationRecipes,
|
|
99
|
+
candidateValidationRecipes: input.seed.environment.candidateValidationRecipes,
|
|
100
|
+
overlays,
|
|
101
|
+
contentOverlays: [{ path: overlay.path, content: overlay.content }],
|
|
102
|
+
fileOverrides
|
|
103
|
+
};
|
|
104
|
+
const replay = yield* replayRepositoryCommandsV1({
|
|
105
|
+
...replayInput,
|
|
106
|
+
preparationCache
|
|
107
|
+
}).pipe(Effect.match({
|
|
108
|
+
onFailure: (error) => ({ results: [], error }),
|
|
109
|
+
onSuccess: (results) => ({ results, error: undefined })
|
|
110
|
+
}));
|
|
111
|
+
const { results } = replay;
|
|
112
|
+
const observations = results
|
|
113
|
+
.filter((result) => result.recipeId === recipe.id)
|
|
114
|
+
.map((result) => repositoryCommandTestEvidenceV1(result, recipe.id));
|
|
115
|
+
const evidence = observations.length === 2 &&
|
|
116
|
+
observations.every((entry) => entry.outcome === observations[0].outcome && entry.detail === observations[0].detail)
|
|
117
|
+
? observations[0]
|
|
118
|
+
: { outcome: "unknown", detail: "coverage probe did not produce two agreeing repetitions" };
|
|
119
|
+
yield* reportFoundryAuthoringArtifactV1({
|
|
120
|
+
version: 1,
|
|
121
|
+
operationId,
|
|
122
|
+
role: "coverage-witness-executor",
|
|
123
|
+
model: "local-replay",
|
|
124
|
+
reasoningEffort: "none",
|
|
125
|
+
schemaName: "routekit_repository_coverage_witness_replay_v1",
|
|
126
|
+
validation: "validated",
|
|
127
|
+
request: {
|
|
128
|
+
instructions: "Replay one coverage probe in isolation; no benchmark admission authority.",
|
|
129
|
+
input: { replayInput },
|
|
130
|
+
jsonSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
131
|
+
maximumOutputTokens: 0
|
|
132
|
+
},
|
|
133
|
+
response: { text: JSON.stringify({ evidence, ...replay }) },
|
|
134
|
+
value: { diagnosticOnly: true, admissionEvidence: false, evidence, ...replay }
|
|
135
|
+
});
|
|
136
|
+
if (replay.error !== undefined ||
|
|
137
|
+
results.some((result) => result.stage === "trusted-preparation" || result.timedOut || result.outputTruncated)) {
|
|
138
|
+
return yield* failure("coverage witness stopped on infrastructure or incomplete execution", {
|
|
139
|
+
operationId,
|
|
140
|
+
evidence,
|
|
141
|
+
diagnostics: diagnostic(results)
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return { results, evidence, operationId };
|
|
145
|
+
});
|
|
146
|
+
/**
|
|
147
|
+
* A witness preserves a demonstrated defect-detection obligation, not immutable
|
|
148
|
+
* test mechanics. This only validates a proposed revision; its caller owns
|
|
149
|
+
* adoption after the complete candidate tournament succeeds.
|
|
150
|
+
*/
|
|
151
|
+
export const validateRepositoryOracleCoverageWitnessRevisionsV1 = Effect.fn("OracleCoverageWitness.validateRevisions")(function* (input) {
|
|
152
|
+
return yield* Effect.scoped(Effect.gen(function* () {
|
|
153
|
+
const changes = yield* Effect.try({
|
|
154
|
+
try: () => {
|
|
155
|
+
assertRepositoryTaskSeedV1(input.seed);
|
|
156
|
+
assertRepositoryHiddenFixtureSuiteV1(input.suite);
|
|
157
|
+
if (input.seed.status !== "qualified" ||
|
|
158
|
+
input.seed.referenceCommit === undefined ||
|
|
159
|
+
input.operationId.trim().length === 0 ||
|
|
160
|
+
new Set(input.retained.map((entry) => entry.witness.fixture.id)).size !==
|
|
161
|
+
input.retained.length)
|
|
162
|
+
throw new Error("revisions require a qualified reference and unique retained witnesses");
|
|
163
|
+
return input.retained.flatMap((entry) => {
|
|
164
|
+
const { witness } = entry;
|
|
165
|
+
const fixture = input.suite.fixtures.find((candidate) => candidate.id === witness.fixture.id);
|
|
166
|
+
const overlay = input.suite.overlays.find((candidate) => candidate.fixtureIds[0] === witness.fixture.id);
|
|
167
|
+
if (witness.referenceCommit !== input.seed.referenceCommit ||
|
|
168
|
+
!executedPassingProbe(witness.referenceEvidence) ||
|
|
169
|
+
!executedSingleAssertionFailure(witness.mutantEvidence) ||
|
|
170
|
+
witness.fileOverrides.length !== 1 ||
|
|
171
|
+
witness.fileOverrides.some((override) => !canonicalPath(override.path) ||
|
|
172
|
+
input.seed.environment.protectedControlPaths.includes(override.path) ||
|
|
173
|
+
input.seed.capabilityEvidence.some((evidence) => evidence.kind === "test" && evidence.path === override.path)) ||
|
|
174
|
+
fixture === undefined ||
|
|
175
|
+
Object.entries(witness.fixture).some(([key, value]) => fixture[key] !== value) ||
|
|
176
|
+
overlay === undefined ||
|
|
177
|
+
overlay.path !== witness.overlay.path ||
|
|
178
|
+
entry.overlay.path !== witness.overlay.path ||
|
|
179
|
+
entry.overlay.fixtureIds.length !== 1 ||
|
|
180
|
+
entry.overlay.fixtureIds[0] !== witness.fixture.id ||
|
|
181
|
+
!canonicalPath(overlay.path) ||
|
|
182
|
+
input.seed.environment.protectedControlPaths.includes(overlay.path) ||
|
|
183
|
+
!input.seed.capabilityEvidence.some((evidence) => evidence.kind === "test" && evidence.path === overlay.path) ||
|
|
184
|
+
overlay.content.length > 32_000)
|
|
185
|
+
throw new Error("witness revisions must preserve original reference, mutant, metadata and reviewed path");
|
|
186
|
+
return overlay.content === entry.overlay.content ? [] : [{ ...entry, overlay }];
|
|
187
|
+
});
|
|
188
|
+
},
|
|
189
|
+
catch: (cause) => failure("coverage witness revision failed identity validation", cause)
|
|
190
|
+
});
|
|
191
|
+
if (changes.length === 0)
|
|
192
|
+
return [];
|
|
193
|
+
const preparationCache = yield* makeRepositoryPreparationCacheV1({
|
|
194
|
+
repositoryRoot: input.repositoryRoot,
|
|
195
|
+
commits: [input.seed.referenceCommit],
|
|
196
|
+
trustedPreparationRecipes: input.seed.environment.trustedPreparationRecipes
|
|
197
|
+
});
|
|
198
|
+
return yield* Effect.forEach(changes, (entry) => Effect.gen(function* () {
|
|
199
|
+
const operationId = `${input.operationId}:${entry.witness.fixture.id}`;
|
|
200
|
+
const reference = yield* replayWitness({
|
|
201
|
+
repositoryRoot: input.repositoryRoot,
|
|
202
|
+
seed: input.seed,
|
|
203
|
+
preparationCache,
|
|
204
|
+
operationId: `${operationId}:reference`,
|
|
205
|
+
overlay: entry.overlay,
|
|
206
|
+
fileOverrides: []
|
|
207
|
+
});
|
|
208
|
+
const referenceCompatible = executedPassingProbe(reference.evidence) &&
|
|
209
|
+
executedTestCount(reference.evidence) ===
|
|
210
|
+
executedTestCount(entry.witness.referenceEvidence);
|
|
211
|
+
const mutant = referenceCompatible
|
|
212
|
+
? yield* replayWitness({
|
|
213
|
+
repositoryRoot: input.repositoryRoot,
|
|
214
|
+
seed: input.seed,
|
|
215
|
+
preparationCache,
|
|
216
|
+
operationId: `${operationId}:mutant`,
|
|
217
|
+
overlay: entry.overlay,
|
|
218
|
+
fileOverrides: entry.witness.fileOverrides
|
|
219
|
+
})
|
|
220
|
+
: undefined;
|
|
221
|
+
const validated = referenceCompatible &&
|
|
222
|
+
mutant !== undefined &&
|
|
223
|
+
executedSingleAssertionFailure(mutant.evidence) &&
|
|
224
|
+
executedTestCount(mutant.evidence) ===
|
|
225
|
+
executedTestCount(entry.witness.mutantEvidence);
|
|
226
|
+
const revision = {
|
|
227
|
+
scopeId: entry.witness.scopeId,
|
|
228
|
+
fixtureId: entry.witness.fixture.id,
|
|
229
|
+
originalExecutionOperationId: entry.witness.executionOperationId,
|
|
230
|
+
executionOperationId: operationId,
|
|
231
|
+
referenceCommit: entry.witness.referenceCommit,
|
|
232
|
+
beforeOverlay: input.retained.find((retained) => retained.witness.fixture.id === entry.witness.fixture.id).overlay,
|
|
233
|
+
overlay: entry.overlay,
|
|
234
|
+
referenceEvidence: reference.evidence,
|
|
235
|
+
...(mutant === undefined ? {} : { mutantEvidence: mutant.evidence }),
|
|
236
|
+
status: validated ? "validated" : "rejected",
|
|
237
|
+
detail: validated
|
|
238
|
+
? "Two reference passes and two isolated assertion failures preserve the original witnessed defect."
|
|
239
|
+
: "The revised witness did not establish two reference passes and two isolated original-mutant assertion failures."
|
|
240
|
+
};
|
|
241
|
+
yield* reportFoundryAuthoringArtifactV1({
|
|
242
|
+
version: 1,
|
|
243
|
+
operationId,
|
|
244
|
+
role: "coverage-witness-executor",
|
|
245
|
+
model: "host",
|
|
246
|
+
reasoningEffort: "none",
|
|
247
|
+
schemaName: "routekit_repository_coverage_witness_revision_v1",
|
|
248
|
+
validation: "validated",
|
|
249
|
+
request: {
|
|
250
|
+
instructions: "Validate revised witness mechanics against the original reference and mutant. This does not adopt a suite or admit a benchmark.",
|
|
251
|
+
input: {
|
|
252
|
+
witness: entry.witness,
|
|
253
|
+
beforeOverlay: revision.beforeOverlay,
|
|
254
|
+
overlay: entry.overlay
|
|
255
|
+
},
|
|
256
|
+
jsonSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
257
|
+
maximumOutputTokens: 0
|
|
258
|
+
},
|
|
259
|
+
response: { text: JSON.stringify(revision) },
|
|
260
|
+
value: { diagnosticOnly: true, admissionEvidence: false, ...revision }
|
|
261
|
+
});
|
|
262
|
+
yield* reportFoundryHeartbeatV1({
|
|
263
|
+
role: "coverage-witness-executor",
|
|
264
|
+
detail: `coverage witness revision; fixture=${revision.fixtureId}; status=${revision.status}; reference=${reference.evidence.outcome}; original mutant=${mutant?.evidence.outcome ?? "unmeasured"}`
|
|
265
|
+
});
|
|
266
|
+
return revision;
|
|
267
|
+
}), { concurrency: 2 });
|
|
268
|
+
}));
|
|
269
|
+
});
|
|
270
|
+
/** Resolve a fixed set of critic hypotheses through execution, without minting a model approval. */
|
|
271
|
+
export const resolveRepositoryOracleCoverageWitnessesV1 = Effect.fn("OracleCoverageWitness.resolve")(function* (input) {
|
|
272
|
+
return yield* Effect.scoped(Effect.gen(function* () {
|
|
273
|
+
const referenceCommit = input.seed.referenceCommit;
|
|
274
|
+
const claims = input.review.scopeCoverage.filter((entry) => entry.outcome !== "covered");
|
|
275
|
+
if (input.seed.status !== "qualified" ||
|
|
276
|
+
referenceCommit === undefined ||
|
|
277
|
+
claims.length === 0 ||
|
|
278
|
+
claims.length > 16 ||
|
|
279
|
+
new Set(claims.map((entry) => entry.scopeId)).size !== claims.length ||
|
|
280
|
+
!Number.isSafeInteger(input.maximumAttempts) ||
|
|
281
|
+
input.maximumAttempts < 1 ||
|
|
282
|
+
input.maximumAttempts > 2 ||
|
|
283
|
+
!/^[a-z][a-z0-9-]{0,63}$/u.test(input.witnessPrefix)) {
|
|
284
|
+
return yield* failure("coverage witnesses require a qualified reference, fixed claims and a bounded allowance");
|
|
285
|
+
}
|
|
286
|
+
yield* Effect.try({
|
|
287
|
+
try: () => {
|
|
288
|
+
assertRepositoryTaskSeedV1(input.seed);
|
|
289
|
+
assertRepositoryHiddenFixtureSuiteV1(input.suite);
|
|
290
|
+
if (input.operationId.trim().length === 0 ||
|
|
291
|
+
input.review.verdict !== "revise" ||
|
|
292
|
+
input.allowedSolutionPaths.size === 0 ||
|
|
293
|
+
[...input.allowedSolutionPaths].some((path) => !canonicalPath(path) ||
|
|
294
|
+
input.allowedTestPaths.has(path) ||
|
|
295
|
+
input.seed.environment.protectedControlPaths.includes(path) ||
|
|
296
|
+
input.seed.capabilityEvidence.some((entry) => entry.kind === "test" && entry.path === path)) ||
|
|
297
|
+
input.suite.overlays.some((overlay) => !canonicalPath(overlay.path) ||
|
|
298
|
+
!input.allowedTestPaths.has(overlay.path) ||
|
|
299
|
+
input.seed.environment.protectedControlPaths.includes(overlay.path))) {
|
|
300
|
+
throw new Error("witness paths must preserve reviewed tests and protected controls");
|
|
301
|
+
}
|
|
302
|
+
},
|
|
303
|
+
catch: (cause) => failure("coverage witnesses require a valid incumbent fixture suite", cause)
|
|
304
|
+
});
|
|
305
|
+
const languageModel = yield* RepositoryFoundryLanguageModel;
|
|
306
|
+
const sources = yield* loadPinnedSolutionEditSourcesV1({
|
|
307
|
+
repositoryRoot: input.repositoryRoot,
|
|
308
|
+
initialCommit: referenceCommit,
|
|
309
|
+
visibleSources: input.referenceSources,
|
|
310
|
+
allowedPaths: input.allowedSolutionPaths
|
|
311
|
+
});
|
|
312
|
+
const preparationCache = yield* makeRepositoryPreparationCacheV1({
|
|
313
|
+
repositoryRoot: input.repositoryRoot,
|
|
314
|
+
commits: [referenceCommit],
|
|
315
|
+
trustedPreparationRecipes: input.seed.environment.trustedPreparationRecipes
|
|
316
|
+
});
|
|
317
|
+
const run = (operationId, overlay, fileOverrides) => replayWitness({
|
|
318
|
+
repositoryRoot: input.repositoryRoot,
|
|
319
|
+
seed: input.seed,
|
|
320
|
+
preparationCache,
|
|
321
|
+
operationId,
|
|
322
|
+
overlay,
|
|
323
|
+
fileOverrides
|
|
324
|
+
});
|
|
325
|
+
const resolved = [];
|
|
326
|
+
const modelCalls = [];
|
|
327
|
+
let pending = claims;
|
|
328
|
+
let previousDiagnostics = [];
|
|
329
|
+
for (let attempt = 0; attempt < input.maximumAttempts; attempt += 1) {
|
|
330
|
+
yield* input.onGenerationAttempt(attempt);
|
|
331
|
+
const generated = yield* languageModel.generateStructured({
|
|
332
|
+
plan: input.modelPlan,
|
|
333
|
+
role: "oracle-designer",
|
|
334
|
+
operationId: `${input.operationId}:author:${String(attempt + 1)}`,
|
|
335
|
+
instructions: repositoryFixtureAuthoringInstructionsV1(INSTRUCTIONS, input.oracleCoverageWitnessVersion, input.oracleRepairFeedbackVersion),
|
|
336
|
+
input: {
|
|
337
|
+
...input.context,
|
|
338
|
+
referenceCommit,
|
|
339
|
+
referenceSources: input.referenceSources,
|
|
340
|
+
allowedSolutionPaths: [...input.allowedSolutionPaths],
|
|
341
|
+
allowedTestPaths: [...input.allowedTestPaths],
|
|
342
|
+
gradeRecipes: input.seed.environment.gradeRecipes,
|
|
343
|
+
coverageHypotheses: pending,
|
|
344
|
+
previousDiagnostics
|
|
345
|
+
},
|
|
346
|
+
schemaName: "routekit_repository_oracle_coverage_witnesses_v1",
|
|
347
|
+
outputSchema: WitnessProposal,
|
|
348
|
+
maximumOutputTokens: repositoryFoundryRoleOutputCeilingV1("oracle-designer")
|
|
349
|
+
});
|
|
350
|
+
modelCalls.push(generated.call);
|
|
351
|
+
const validation = yield* Effect.try({
|
|
352
|
+
try: () => {
|
|
353
|
+
const expected = new Set(pending.map((entry) => entry.scopeId));
|
|
354
|
+
const proposed = generated.value.witnesses;
|
|
355
|
+
if (proposed.length !== expected.size ||
|
|
356
|
+
new Set(proposed.map((entry) => entry.scopeId)).size !== expected.size ||
|
|
357
|
+
proposed.some((entry) => !expected.has(entry.scopeId) ||
|
|
358
|
+
!canonicalPath(entry.testPath) ||
|
|
359
|
+
!input.allowedTestPaths.has(entry.testPath) ||
|
|
360
|
+
input.seed.environment.protectedControlPaths.includes(entry.testPath) ||
|
|
361
|
+
!input.seed.capabilityEvidence.some((evidence) => evidence.kind === "test" && evidence.path === entry.testPath) ||
|
|
362
|
+
entry.testSource.trim().length === 0 ||
|
|
363
|
+
entry.testSource.length > 32_000 ||
|
|
364
|
+
entry.explanation.trim().length === 0 ||
|
|
365
|
+
entry.expectedBehavior.trim().length === 0 ||
|
|
366
|
+
entry.fileOverrides.length !== 1 ||
|
|
367
|
+
entry.fileOverrides[0].edits.length !== 1 ||
|
|
368
|
+
entry.fileOverrides[0].edits[0].search.length > 8_000 ||
|
|
369
|
+
entry.fileOverrides[0].edits[0].replace.length > 12_000)) {
|
|
370
|
+
throw new Error("witnesses must match every pending scope once and use reviewed paths");
|
|
371
|
+
}
|
|
372
|
+
return proposed.map((entry) => {
|
|
373
|
+
const materialized = materializeSolutionFileOverridesV1({
|
|
374
|
+
fileOverrides: entry.fileOverrides,
|
|
375
|
+
sources,
|
|
376
|
+
allowedPaths: input.allowedSolutionPaths
|
|
377
|
+
});
|
|
378
|
+
if (materialized.fileOverrides.every((override) => sources.find((source) => source.path === override.path)?.content ===
|
|
379
|
+
override.content)) {
|
|
380
|
+
throw new Error("a witness mutant must change the pinned reference implementation");
|
|
381
|
+
}
|
|
382
|
+
const id = `${input.witnessPrefix}-${String(claims.findIndex((claim) => claim.scopeId === entry.scopeId) + 1)}`;
|
|
383
|
+
if (input.suite.fixtures.some((fixture) => fixture.id === id)) {
|
|
384
|
+
throw new Error("coverage witness identity collides with an incumbent fixture");
|
|
385
|
+
}
|
|
386
|
+
return {
|
|
387
|
+
...entry,
|
|
388
|
+
fileOverrides: materialized.fileOverrides,
|
|
389
|
+
fixture: {
|
|
390
|
+
id,
|
|
391
|
+
kind: "boundary",
|
|
392
|
+
source: "generated",
|
|
393
|
+
description: `Executed counterexample for ${entry.scopeId}: ${entry.explanation}`,
|
|
394
|
+
expectedBehavior: entry.expectedBehavior,
|
|
395
|
+
testPath: entry.testPath,
|
|
396
|
+
expectationMode: entry.expectationMode
|
|
397
|
+
},
|
|
398
|
+
overlay: { path: entry.testPath, content: entry.testSource, fixtureIds: [id] }
|
|
399
|
+
};
|
|
400
|
+
});
|
|
401
|
+
},
|
|
402
|
+
catch: (cause) => failure("coverage witness proposal failed validation", cause)
|
|
403
|
+
}).pipe(Effect.match({
|
|
404
|
+
onFailure: (error) => ({ ok: false, error }),
|
|
405
|
+
onSuccess: (proposals) => ({ ok: true, proposals })
|
|
406
|
+
}));
|
|
407
|
+
if (!validation.ok) {
|
|
408
|
+
previousDiagnostics = [
|
|
409
|
+
{
|
|
410
|
+
detail: validation.error.detail,
|
|
411
|
+
cause: validation.error.cause instanceof Error
|
|
412
|
+
? validation.error.cause.message
|
|
413
|
+
: String(validation.error.cause),
|
|
414
|
+
priorProposal: generated.value
|
|
415
|
+
}
|
|
416
|
+
];
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
const reports = yield* Effect.forEach(validation.proposals, (proposal) => Effect.gen(function* () {
|
|
420
|
+
const operationId = `${input.operationId}:execution:${String(attempt + 1)}:${proposal.fixture.id}`;
|
|
421
|
+
const reference = yield* run(`${operationId}:reference`, proposal.overlay, []);
|
|
422
|
+
const mutant = oneTest(reference.evidence, "pass")
|
|
423
|
+
? yield* run(`${operationId}:mutant`, proposal.overlay, proposal.fileOverrides)
|
|
424
|
+
: undefined;
|
|
425
|
+
const valid = oneTest(reference.evidence, "pass") &&
|
|
426
|
+
mutant !== undefined &&
|
|
427
|
+
oneTest(mutant.evidence, "fail");
|
|
428
|
+
const incumbentEvidence = [];
|
|
429
|
+
const incumbentReplays = [];
|
|
430
|
+
if (valid) {
|
|
431
|
+
for (const [index, overlay] of input.suite.overlays.entries()) {
|
|
432
|
+
const replay = yield* run(`${operationId}:incumbent:${String(index + 1)}`, overlay, proposal.fileOverrides);
|
|
433
|
+
incumbentReplays.push(replay.operationId);
|
|
434
|
+
incumbentEvidence.push({
|
|
435
|
+
fixtureId: overlay.fixtureIds[0],
|
|
436
|
+
evidence: replay.evidence
|
|
437
|
+
});
|
|
438
|
+
if (replay.evidence.outcome !== "pass")
|
|
439
|
+
break;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
const known = valid &&
|
|
443
|
+
incumbentEvidence.length > 0 &&
|
|
444
|
+
incumbentEvidence.every((entry) => entry.evidence.outcome !== "unknown");
|
|
445
|
+
const report = {
|
|
446
|
+
scopeId: proposal.scopeId,
|
|
447
|
+
proposal,
|
|
448
|
+
reference: { evidence: reference.evidence, results: reference.results },
|
|
449
|
+
...(mutant === undefined
|
|
450
|
+
? {}
|
|
451
|
+
: { mutant: { evidence: mutant.evidence, results: mutant.results } }),
|
|
452
|
+
incumbentEvidence,
|
|
453
|
+
replayOperationIds: [
|
|
454
|
+
reference.operationId,
|
|
455
|
+
...(mutant === undefined ? [] : [mutant.operationId]),
|
|
456
|
+
...incumbentReplays
|
|
457
|
+
],
|
|
458
|
+
resolved: known
|
|
459
|
+
};
|
|
460
|
+
yield* reportFoundryAuthoringArtifactV1({
|
|
461
|
+
version: 1,
|
|
462
|
+
operationId,
|
|
463
|
+
role: "coverage-witness-executor",
|
|
464
|
+
model: "host",
|
|
465
|
+
reasoningEffort: "none",
|
|
466
|
+
schemaName: "routekit_repository_coverage_witness_execution_v1",
|
|
467
|
+
validation: "validated",
|
|
468
|
+
request: {
|
|
469
|
+
instructions: "Host execution of one fixed coverage hypothesis; not a model approval or benchmark admission.",
|
|
470
|
+
input: { referenceCommit, suite: input.suite, scopeId: proposal.scopeId },
|
|
471
|
+
jsonSchema: { type: "object" },
|
|
472
|
+
maximumOutputTokens: 0
|
|
473
|
+
},
|
|
474
|
+
response: { text: JSON.stringify(report) },
|
|
475
|
+
value: { diagnosticOnly: true, admissionEvidence: false, ...report }
|
|
476
|
+
});
|
|
477
|
+
yield* reportFoundryHeartbeatV1({
|
|
478
|
+
role: "coverage-witness-executor",
|
|
479
|
+
detail: `coverage witness; reference=${reference.evidence.outcome}; mutant=${mutant?.evidence.outcome ?? "unmeasured"}; incumbent=${known ? (incumbentEvidence.some((entry) => entry.evidence.outcome === "fail") ? "detected" : "escaped") : "unresolved"}; resolved=${String(known)}`
|
|
480
|
+
});
|
|
481
|
+
if (!known) {
|
|
482
|
+
return {
|
|
483
|
+
scopeId: proposal.scopeId,
|
|
484
|
+
diagnostics: {
|
|
485
|
+
scopeId: proposal.scopeId,
|
|
486
|
+
priorProposal: proposal,
|
|
487
|
+
referenceEvidence: reference.evidence,
|
|
488
|
+
referenceDiagnostics: diagnostic(reference.results),
|
|
489
|
+
mutantEvidence: mutant?.evidence,
|
|
490
|
+
mutantDiagnostics: mutant === undefined ? [] : diagnostic(mutant.results),
|
|
491
|
+
incumbentEvidence
|
|
492
|
+
}
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
const witness = {
|
|
496
|
+
scopeId: proposal.scopeId,
|
|
497
|
+
hypothesis: claims.find((claim) => claim.scopeId === proposal.scopeId)
|
|
498
|
+
.counterexample,
|
|
499
|
+
outcome: incumbentEvidence.some((entry) => entry.evidence.outcome === "fail")
|
|
500
|
+
? "already-detected"
|
|
501
|
+
: "confirmed-escape",
|
|
502
|
+
explanation: proposal.explanation,
|
|
503
|
+
referenceCommit,
|
|
504
|
+
fileOverrides: proposal.fileOverrides,
|
|
505
|
+
fixture: proposal.fixture,
|
|
506
|
+
overlay: proposal.overlay,
|
|
507
|
+
referenceEvidence: reference.evidence,
|
|
508
|
+
mutantEvidence: mutant.evidence,
|
|
509
|
+
incumbentEvidence,
|
|
510
|
+
executionOperationId: operationId
|
|
511
|
+
};
|
|
512
|
+
resolved.push(witness);
|
|
513
|
+
return { scopeId: proposal.scopeId, diagnostics: undefined };
|
|
514
|
+
}), { concurrency: 2 });
|
|
515
|
+
pending = claims.filter((claim) => !resolved.some((entry) => entry.scopeId === claim.scopeId));
|
|
516
|
+
if (pending.length === 0) {
|
|
517
|
+
const ordered = claims.map((claim) => resolved.find((entry) => entry.scopeId === claim.scopeId));
|
|
518
|
+
// Retain the isolated test for every resolved hypothesis. Retaining a whole
|
|
519
|
+
// incumbent overlay instead could freeze unrelated overconstraints and
|
|
520
|
+
// prevent a later valid-solution repair. Already-detected claims remain
|
|
521
|
+
// separately labeled and never count as a newly detected escape.
|
|
522
|
+
const additions = ordered;
|
|
523
|
+
const suite = {
|
|
524
|
+
...input.suite,
|
|
525
|
+
fixtures: [...input.suite.fixtures, ...additions.map((entry) => entry.fixture)],
|
|
526
|
+
overlays: [...input.suite.overlays, ...additions.map((entry) => entry.overlay)]
|
|
527
|
+
};
|
|
528
|
+
yield* Effect.try({
|
|
529
|
+
try: () => assertRepositoryHiddenFixtureSuiteV1(suite),
|
|
530
|
+
catch: (cause) => failure("coverage witnesses could not be added to the incumbent", cause)
|
|
531
|
+
});
|
|
532
|
+
return { suite, witnesses: ordered, modelCalls };
|
|
533
|
+
}
|
|
534
|
+
previousDiagnostics = reports.flatMap((report) => report.diagnostics === undefined ? [] : [report.diagnostics]);
|
|
535
|
+
}
|
|
536
|
+
return yield* failure(`oracle-coverage-witness-exhausted: ${String(pending.length)} coverage hypotheses lack valid isolated execution evidence`, { pendingScopeIds: pending.map((entry) => entry.scopeId), previousDiagnostics });
|
|
537
|
+
}));
|
|
538
|
+
});
|