@velum-labs/routekit-eval-setup 1.0.26 → 1.1.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.
Files changed (38) hide show
  1. package/dist/adapters/git-basis-snapshot.d.ts +27 -0
  2. package/dist/adapters/git-basis-snapshot.js +178 -0
  3. package/dist/basis-candidates.d.ts +72 -0
  4. package/dist/basis-candidates.js +157 -0
  5. package/dist/basis-projection.d.ts +9 -0
  6. package/dist/basis-projection.js +30 -0
  7. package/dist/basis-validation.d.ts +38 -0
  8. package/dist/basis-validation.js +187 -0
  9. package/dist/effect-api.d.ts +8 -0
  10. package/dist/effect-api.js +5 -0
  11. package/dist/errors.d.ts +11 -1
  12. package/dist/errors.js +5 -0
  13. package/dist/index.d.ts +15 -3
  14. package/dist/index.js +10 -2
  15. package/dist/project-artifacts.d.ts +26 -1
  16. package/dist/project-artifacts.js +52 -1
  17. package/dist/project-contracts.d.ts +3594 -0
  18. package/dist/project-contracts.js +344 -1
  19. package/dist/project-store.d.ts +3 -1
  20. package/dist/project-store.js +39 -33
  21. package/dist/project-workflow.d.ts +2 -2
  22. package/dist/services/basis-authoring/service.d.ts +253 -0
  23. package/dist/services/basis-authoring/service.js +547 -0
  24. package/dist/services/basis-onboarding/service.d.ts +48 -0
  25. package/dist/services/basis-onboarding/service.js +491 -0
  26. package/dist/services/basis-repair/service.d.ts +25 -0
  27. package/dist/services/basis-repair/service.js +249 -0
  28. package/dist/test/basis-authoring.test.d.ts +1 -0
  29. package/dist/test/basis-authoring.test.js +194 -0
  30. package/dist/test/basis-onboarding.test.d.ts +1 -0
  31. package/dist/test/basis-onboarding.test.js +385 -0
  32. package/dist/test/basis-repair.test.d.ts +1 -0
  33. package/dist/test/basis-repair.test.js +338 -0
  34. package/dist/test/basis-v3.test.d.ts +1 -0
  35. package/dist/test/basis-v3.test.js +262 -0
  36. package/dist/test/project-v2.test.d.ts +1 -0
  37. package/dist/test/project-v2.test.js +99 -0
  38. package/package.json +4 -3
@@ -0,0 +1,187 @@
1
+ import { assertRoutingBasisV3, routingBasisApprovalDigestV3, routingContractDigest } from "@velum-labs/routekit-eval-contracts";
2
+ import { evaluateClassificationMetricsV3, inspectRoutingBasisStructureV3, selectRoutingBasisCandidatesV3 } from "@velum-labs/routekit-eval-core";
3
+ import { projectRoutingBasisV3 } from "./basis-projection.js";
4
+ function sameIds(left, right) {
5
+ return (left.length === right.length &&
6
+ left.every((value, index) => value === right[index]));
7
+ }
8
+ export function inspectBasisCandidatesV3(candidates, aliasSimilarityThreshold = 0.58) {
9
+ return candidates.map((candidate) => {
10
+ if (candidate.basisDigest !== candidate.basis.basisDigest ||
11
+ candidate.candidateId !== candidate.basis.basisId) {
12
+ throw new Error(`basis candidate ${JSON.stringify(candidate.candidateId)} has inconsistent identity`);
13
+ }
14
+ assertRoutingBasisV3(candidate.basis);
15
+ const report = inspectRoutingBasisStructureV3(candidate.basis, aliasSimilarityThreshold);
16
+ let projectionFinding;
17
+ try {
18
+ projectRoutingBasisV3(candidate.basis);
19
+ }
20
+ catch (cause) {
21
+ projectionFinding = {
22
+ severity: "hard",
23
+ code: "evaluation-projection-invalid",
24
+ dimensionIds: candidate.basis.dimensions.map((dimension) => dimension.id),
25
+ detail: cause instanceof Error
26
+ ? cause.message
27
+ : "basis cannot be projected into existing evaluation dimensions"
28
+ };
29
+ }
30
+ return {
31
+ candidateId: candidate.candidateId,
32
+ basisDigest: candidate.basisDigest,
33
+ eligible: report.eligible && projectionFinding === undefined,
34
+ dimensionCount: report.dimensionCount,
35
+ definitionBytes: report.definitionBytes,
36
+ findings: [
37
+ ...report.findings,
38
+ ...(projectionFinding === undefined ? [] : [projectionFinding])
39
+ ]
40
+ };
41
+ });
42
+ }
43
+ export function makeBasisCandidateDatasetV3(input) {
44
+ const taskIds = input.tasks.map((task) => task.caseId);
45
+ const labelIds = input.labels.map((label) => label.caseId);
46
+ if (!sameIds(taskIds, labelIds)) {
47
+ throw new Error("candidate labels must cover validation tasks in exact order");
48
+ }
49
+ const dimensionIds = input.candidate.basis.dimensions.map((dimension) => dimension.id);
50
+ for (const label of input.labels) {
51
+ if (label.basisDigest !== input.candidate.basisDigest ||
52
+ !sameIds(label.scores.map((score) => score.dimensionId), dimensionIds)) {
53
+ throw new Error(`candidate label ${JSON.stringify(label.caseId)} does not cover the exact basis`);
54
+ }
55
+ }
56
+ const semantic = {
57
+ version: 1,
58
+ splitDigest: input.splitDigest,
59
+ basisDigest: input.candidate.basisDigest,
60
+ labelProtocol: input.labelProtocol,
61
+ tasks: input.tasks,
62
+ labels: input.labels
63
+ };
64
+ return {
65
+ ...semantic,
66
+ datasetDigest: routingContractDigest("routekit.basis-validation-dataset.v1", "dataset", semantic)
67
+ };
68
+ }
69
+ export function evaluateBasisCandidateValidationV3(input) {
70
+ const classifierBinding = input.validationPlan.classifierBindings.find((binding) => binding.candidateId === input.candidate.candidateId);
71
+ if (input.dataset.basisDigest !== input.candidate.basisDigest ||
72
+ !input.validationPlan.candidateIds.includes(input.candidate.candidateId) ||
73
+ !input.validationPlan.datasetDigests.includes(input.dataset.datasetDigest) ||
74
+ classifierBinding?.basisDigest !== input.candidate.basisDigest) {
75
+ throw new Error("validation inputs do not match the immutable plan");
76
+ }
77
+ if (input.predictions.some((prediction) => prediction.classifierConfigurationDigest !==
78
+ classifierBinding.classifierConfigurationDigest)) {
79
+ throw new Error("validation predictions use a different classifier configuration");
80
+ }
81
+ const metrics = evaluateClassificationMetricsV3(input.dataset.labels, input.predictions, {
82
+ activeDimensionThreshold: input.dataset.labelProtocol.activeDimensionThreshold,
83
+ unknownThreshold: input.dataset.labelProtocol.unknownThreshold
84
+ });
85
+ return {
86
+ version: 1,
87
+ candidateId: input.candidate.candidateId,
88
+ basisDigest: input.candidate.basisDigest,
89
+ validationDatasetDigest: input.dataset.datasetDigest,
90
+ classifierConfigurationDigest: classifierBinding.classifierConfigurationDigest,
91
+ predictions: input.predictions,
92
+ ...metrics,
93
+ selectionScore: metrics.activeMae +
94
+ 0.5 * metrics.unknownMae +
95
+ 0.15 * metrics.referenceUnknownRate,
96
+ provisional: input.provisional
97
+ };
98
+ }
99
+ export function selectValidatedBasisCandidatesV3(input) {
100
+ const structureByCandidate = new Map(input.structureReports.map((report) => [report.candidateId, report]));
101
+ const validationByCandidate = new Map(input.validationResults.map((result) => [result.candidateId, result]));
102
+ const selection = selectRoutingBasisCandidatesV3(input.candidates.map((candidate) => {
103
+ const structure = structureByCandidate.get(candidate.candidateId);
104
+ const validation = validationByCandidate.get(candidate.candidateId);
105
+ if (structure === undefined || validation === undefined) {
106
+ throw new Error(`candidate ${JSON.stringify(candidate.candidateId)} is missing structural or validation evidence`);
107
+ }
108
+ return {
109
+ basis: candidate.basis,
110
+ structure: {
111
+ basisId: candidate.candidateId,
112
+ basisDigest: candidate.basisDigest,
113
+ eligible: structure.eligible,
114
+ dimensionCount: structure.dimensionCount,
115
+ definitionBytes: structure.definitionBytes,
116
+ findings: structure.findings
117
+ },
118
+ activeMae: validation.activeMae,
119
+ unknownMae: validation.unknownMae,
120
+ referenceUnknownRate: validation.referenceUnknownRate,
121
+ activeF1: validation.activeF1,
122
+ topDimensionAgreement: validation.topDimensionAgreement,
123
+ provisional: validation.provisional
124
+ };
125
+ }));
126
+ if (selection.selectedBasisId === undefined) {
127
+ throw new Error("no structurally eligible basis candidate can be selected");
128
+ }
129
+ const semantic = {
130
+ version: 1,
131
+ repositoryDigest: input.repositoryDigest,
132
+ validationPlanDigest: input.validationPlan.planDigest,
133
+ objectiveVersion: "basis-selection-v1",
134
+ rankedCandidateIds: selection.ranked.map((candidate) => candidate.basis.basisId),
135
+ paretoCandidateIds: selection.paretoBasisIds,
136
+ selectedCandidateId: selection.selectedBasisId,
137
+ provisional: input.validationResults.some((result) => result.provisional)
138
+ };
139
+ return {
140
+ ...semantic,
141
+ selectionReportDigest: routingContractDigest("routekit.basis-selection-report.v1", "selection", semantic)
142
+ };
143
+ }
144
+ export function approveSelectedBasisV3(input) {
145
+ assertRoutingBasisV3(input.candidate.basis);
146
+ const { selectionReportDigest: _selectionReportDigest, ...selectionSemantic } = input.selection;
147
+ if (routingContractDigest("routekit.basis-selection-report.v1", "selection", selectionSemantic) !== input.selection.selectionReportDigest) {
148
+ throw new Error("basis selection report digest does not match its contents");
149
+ }
150
+ if (input.snapshot.dirty) {
151
+ throw new Error("a dirty repository snapshot cannot be approved");
152
+ }
153
+ if (!input.structure.eligible) {
154
+ throw new Error("a structurally invalid basis cannot be approved");
155
+ }
156
+ if (input.selection.selectedCandidateId !== input.candidate.candidateId ||
157
+ input.structure.candidateId !== input.candidate.candidateId ||
158
+ input.validation.candidateId !== input.candidate.candidateId ||
159
+ input.validation.basisDigest !== input.candidate.basisDigest ||
160
+ input.snapshot.repositoryDigest !== input.candidate.basis.repositoryDigest) {
161
+ throw new Error("basis approval inputs contain stale or mismatched identities");
162
+ }
163
+ if (input.selection.provisional &&
164
+ (input.provisionalAcknowledgement?.trim().length ?? 0) === 0) {
165
+ throw new Error("provisional basis approval requires an acknowledgement");
166
+ }
167
+ const approval = {
168
+ version: 1,
169
+ projectId: input.projectId,
170
+ candidateId: input.candidate.candidateId,
171
+ basisDigest: input.candidate.basisDigest,
172
+ repositoryDigest: input.snapshot.repositoryDigest,
173
+ validationDatasetDigest: input.validation.validationDatasetDigest,
174
+ selectionReportDigest: input.selection.selectionReportDigest,
175
+ approvedAt: input.approvedAt,
176
+ approvedBy: input.approvedBy,
177
+ ...(input.provisionalAcknowledgement === undefined
178
+ ? {}
179
+ : {
180
+ provisionalAcknowledgement: input.provisionalAcknowledgement
181
+ })
182
+ };
183
+ return {
184
+ approval,
185
+ approvalDigest: routingBasisApprovalDigestV3(approval)
186
+ };
187
+ }
@@ -1,3 +1,11 @@
1
+ export { projectRoutingBasisV3, projectRoutingDimensionV3 } from "./basis-projection.js";
2
+ export { captureFrozenRepositorySnapshotV3 } from "./adapters/git-basis-snapshot.js";
3
+ export type { BasisAuthoringShape } from "./services/basis-authoring/service.js";
4
+ export { BasisAuthoring, BasisAuthoringLive, makeBasisAuthoring } from "./services/basis-authoring/service.js";
5
+ export type { BasisOnboardingShape } from "./services/basis-onboarding/service.js";
6
+ export { BasisOnboarding, BasisOnboardingLive, makeBasisOnboarding } from "./services/basis-onboarding/service.js";
7
+ export type { BasisRepairShape } from "./services/basis-repair/service.js";
8
+ export { BasisRepair, BasisRepairLive, makeBasisRepair } from "./services/basis-repair/service.js";
1
9
  export { EvalRepositoryInspector, EvalRepositoryInspectorLive, inspectRepository } from "./inspection.js";
2
10
  export { OriEvalAuthoring, oriAuthoringFromApi } from "./ori-authoring.js";
3
11
  export type { OriEvalAuthoringApi, OriEvalResult } from "./ori-result.js";
@@ -1,3 +1,8 @@
1
+ export { projectRoutingBasisV3, projectRoutingDimensionV3 } from "./basis-projection.js";
2
+ export { captureFrozenRepositorySnapshotV3 } from "./adapters/git-basis-snapshot.js";
3
+ export { BasisAuthoring, BasisAuthoringLive, makeBasisAuthoring } from "./services/basis-authoring/service.js";
4
+ export { BasisOnboarding, BasisOnboardingLive, makeBasisOnboarding } from "./services/basis-onboarding/service.js";
5
+ export { BasisRepair, BasisRepairLive, makeBasisRepair } from "./services/basis-repair/service.js";
1
6
  export { EvalRepositoryInspector, EvalRepositoryInspectorLive, inspectRepository } from "./inspection.js";
2
7
  export { OriEvalAuthoring, oriAuthoringFromApi } from "./ori-authoring.js";
3
8
  export { EvalProjectArtifacts, EvalProjectArtifactsLive, evaluationProposalDigest, makeFileEvalProjectArtifacts, routingBasisDigest } from "./project-artifacts.js";
package/dist/errors.d.ts CHANGED
@@ -91,7 +91,17 @@ declare const EvalProjectAuthoringError_base: new <A extends Record<string, any>
91
91
  readonly _tag: "EvalProjectAuthoringError";
92
92
  } & Readonly<A>;
93
93
  export declare class EvalProjectAuthoringError extends EvalProjectAuthoringError_base<{
94
- readonly operation: "reading-sources" | "authoring-dimensions" | "authoring-evaluations";
94
+ readonly operation: "reading-sources" | "authoring-basis" | "authoring-dimensions" | "authoring-evaluations";
95
+ readonly detail: string;
96
+ readonly cause?: unknown;
97
+ }> {
98
+ get message(): string;
99
+ }
100
+ declare const EvalBasisSnapshotError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
101
+ readonly _tag: "EvalBasisSnapshotError";
102
+ } & Readonly<A>;
103
+ export declare class EvalBasisSnapshotError extends EvalBasisSnapshotError_base<{
104
+ readonly operation: "resolve-root" | "inspect-status" | "resolve-ref" | "read-tree" | "read-dirty-content";
95
105
  readonly detail: string;
96
106
  readonly cause?: unknown;
97
107
  }> {
package/dist/errors.js CHANGED
@@ -49,3 +49,8 @@ export class EvalProjectAuthoringError extends Data.TaggedError("EvalProjectAuth
49
49
  return `RouteKit Eval could not complete ${this.operation}: ${this.detail}`;
50
50
  }
51
51
  }
52
+ export class EvalBasisSnapshotError extends Data.TaggedError("EvalBasisSnapshotError") {
53
+ get message() {
54
+ return `RouteKit Eval could not ${this.operation}: ${this.detail}`;
55
+ }
56
+ }
package/dist/index.d.ts CHANGED
@@ -1,15 +1,27 @@
1
- export { EvalDimensionContrastError, EvalProjectArtifactError, EvalProjectAuthoringError, EvalProjectStoreError, EvalProjectTransitionError, EvalSetupInspectionError, EvalSetupRunnerError, EvalSetupScaffoldError, EvalSetupStateError, EvalSetupTransitionError } from "./errors.js";
1
+ export { projectRoutingBasisV3, projectRoutingDimensionV3 } from "./basis-projection.js";
2
+ export { EvalBasisSnapshotError, EvalDimensionContrastError, EvalProjectArtifactError, EvalProjectAuthoringError, EvalProjectStoreError, EvalProjectTransitionError, EvalSetupInspectionError, EvalSetupRunnerError, EvalSetupScaffoldError, EvalSetupStateError, EvalSetupTransitionError } from "./errors.js";
3
+ export { captureFrozenRepositorySnapshotV3 } from "./adapters/git-basis-snapshot.js";
4
+ export type { CapturedRepositorySnapshotV3, FrozenRepositorySourceV3 } from "./adapters/git-basis-snapshot.js";
5
+ export { readFrozenRepositorySourcesV3 } from "./adapters/git-basis-snapshot.js";
2
6
  export type { EvalHostMetadata, HostEligibility } from "./host-metadata.js";
3
7
  export { authoringRequest, hostDirectory } from "./host-metadata.js";
8
+ export { BASIS_AUTHOR_INPUT_TOKENS_PER_ATTEMPT, BASIS_AUTHOR_OUTPUT_TOKENS_PER_ATTEMPT, DEFAULT_BASIS_CANDIDATE_RECIPES_V3, selectConstructionTasksForRecipeV3, splitBasisTasksChronologicallyV3 } from "./basis-candidates.js";
9
+ export { approveSelectedBasisV3, evaluateBasisCandidateValidationV3, inspectBasisCandidatesV3, makeBasisCandidateDatasetV3, selectValidatedBasisCandidatesV3 } from "./basis-validation.js";
4
10
  export { EvalRepositoryInspector, EvalRepositoryInspectorLive, inspectRepository } from "./inspection.js";
5
11
  export { OriEvalAuthoring, oriAuthoringFromApi } from "./ori-authoring.js";
6
12
  export type { OriEvalAuthoringApi, OriEvalResult } from "./ori-result.js";
7
13
  export { EvalProjectArtifacts, EvalProjectArtifactsLive, evaluationProposalDigest, makeFileEvalProjectArtifacts, routingBasisDigest } from "./project-artifacts.js";
8
14
  export type { EvalAuthoringCompletion, EvalAuthoringSource, EvalAuthoringTransportShape, EvalProjectAuthorShape } from "./project-authoring.js";
9
15
  export { EVAL_AUTHORING_CASES_PER_DIMENSION, EVAL_AUTHORING_EVALUATION_OUTPUT_TOKENS, EVAL_AUTHORING_REQUEST_BYTES, EVAL_AUTHORING_SOURCE_BYTES, EVAL_AUTHORING_SOURCE_FILES, EvalAuthoringTransport, EvalProjectAuthor, EvalProjectAuthorLive, makeEvalProjectAuthor, readProjectAuthoringSources, selectProjectAuthoringSourceFiles } from "./project-authoring.js";
10
- export type { EvalClassifierObservation, EvalCompositionCase, EvalCompositionCaseResult, EvalCompositionSuite, EvalDecompositionBenchmark, EvalDecompositionBenchmarkCase, EvalDimensionCase, EvalDimensionContrast, EvalDimensionSuite, EvalEvaluationProposal, EvalExecutionPlan, EvalPlanScope, EvalProposedDimension, EvalProjectArtifactsStatus, EvalProjectStatus, EvalRoutingBasisProposal, EvalRunCleanup, EvalRunFailureError, EvalRunLedger, EvalRunQualification, EvalRunReport, EvalRunTarget, EvalScopedExpectedCalls } from "./project-contracts.js";
11
- export { EVAL_PROJECT_VERSION, EvalArtifactApproval, EvalCompositionSuite as EvalCompositionSuiteSchema, EvalDecompositionBenchmark as EvalDecompositionBenchmarkSchema, EvalDimensionCase as EvalDimensionCaseSchema, EvalDimensionContrast as EvalDimensionContrastSchema, EvalDimensionSuite as EvalDimensionSuiteSchema, EvalEvaluationProposal as EvalEvaluationProposalSchema, EvalExecutionPlan as EvalExecutionPlanSchema, EvalPlanScope as EvalPlanScopeSchema, EvalProposedDimension as EvalProposedDimensionSchema, EvalProjectConfiguration, EvalProjectQuestion, EvalProjectSetupProgress, EvalProjectState, EvalRoutingBasisProposal as EvalRoutingBasisProposalSchema, EvalRunCleanup as EvalRunCleanupSchema, EvalRunFailureError as EvalRunFailureErrorSchema, EvalRunLedger as EvalRunLedgerSchema, EvalRunReport as EvalRunReportSchema, EvalRunTarget as EvalRunTargetSchema, scopedExpectedCalls, summarizeEvalRunLedger } from "./project-contracts.js";
16
+ export type { BasisCandidateDatasetV3, BasisCandidatesArtifactsV3, BasisCandidateCheckpointV3, BasisCandidateRecipeV3, BasisCandidateRecordV3, BasisGenerationArtifactsV3, BasisEvaluationProjectionV3, BasisGenerationJobV3, BasisGenerationLedgerV3, BasisGenerationPlanV3, BasisLabelProtocolV3, BasisQualificationArtifactsV3, BasisRepairArtifactsV3, BasisRepairPlanV3, BasisRepairSummaryV3, BasisSelectionReportV3, BasisStructureFindingV3, BasisStructureReportV3, BasisTaskRecordV3, BasisTaskSplitV3, BasisValidationPlanV3, BasisValidationClassifierBindingV3, BasisValidationJobCheckpointV3, BasisValidationResultsArtifactsV3, BasisValidationArtifactsV3, BasisValidationResultV3, EvalClassifierObservation, EvalCompositionCase, EvalCompositionCaseResult, EvalCompositionSuite, EvalDecompositionBenchmark, EvalDecompositionBenchmarkCase, EvalDimensionCase, EvalDimensionContrast, EvalDimensionSuite, EvalEvaluationProposal, EvalExecutionPlan, EvalPlanScope, EvalProposedDimension, EvalProjectArtifactsStatus, EvalProjectDocument, EvalProjectStateV2, EvalProjectStatus, EvalRoutingBasisProposal, EvalRunCleanup, EvalRunFailureError, EvalRunLedger, EvalRunQualification, EvalRunReport, EvalRunTarget, EvalScopedExpectedCalls, FrozenRepositorySnapshotV3 } from "./project-contracts.js";
17
+ export { EVAL_PROJECT_VERSION, EVAL_PROJECT_V2_VERSION, BasisCandidateDatasetV3 as BasisCandidateDatasetV3Schema, BasisCandidatesArtifactsV3 as BasisCandidatesArtifactsV3Schema, BasisCandidateCheckpointV3 as BasisCandidateCheckpointV3Schema, BasisCandidateRecipeV3 as BasisCandidateRecipeV3Schema, BasisCandidateRecordV3 as BasisCandidateRecordV3Schema, BasisGenerationArtifactsV3 as BasisGenerationArtifactsV3Schema, BasisEvaluationProjectionV3 as BasisEvaluationProjectionV3Schema, BasisGenerationJobV3 as BasisGenerationJobV3Schema, BasisGenerationLedgerV3 as BasisGenerationLedgerV3Schema, BasisGenerationPlanV3 as BasisGenerationPlanV3Schema, BasisLabelProtocolV3 as BasisLabelProtocolV3Schema, BasisQualificationArtifactsV3 as BasisQualificationArtifactsV3Schema, BasisRepairArtifactsV3 as BasisRepairArtifactsV3Schema, BasisRepairPlanV3 as BasisRepairPlanV3Schema, BasisRepairSummaryV3 as BasisRepairSummaryV3Schema, BasisSelectionReportV3 as BasisSelectionReportV3Schema, BasisStructureReportV3 as BasisStructureReportV3Schema, BasisTaskRecordV3 as BasisTaskRecordV3Schema, BasisTaskSplitV3 as BasisTaskSplitV3Schema, BasisValidationPlanV3 as BasisValidationPlanV3Schema, BasisValidationClassifierBindingV3 as BasisValidationClassifierBindingV3Schema, BasisValidationJobCheckpointV3 as BasisValidationJobCheckpointV3Schema, BasisValidationResultsArtifactsV3 as BasisValidationResultsArtifactsV3Schema, BasisValidationArtifactsV3 as BasisValidationArtifactsV3Schema, BasisValidationResultV3 as BasisValidationResultV3Schema, EvalArtifactApproval, EvalCompositionSuite as EvalCompositionSuiteSchema, EvalDecompositionBenchmark as EvalDecompositionBenchmarkSchema, EvalDimensionCase as EvalDimensionCaseSchema, EvalDimensionContrast as EvalDimensionContrastSchema, EvalDimensionSuite as EvalDimensionSuiteSchema, EvalEvaluationProposal as EvalEvaluationProposalSchema, EvalExecutionPlan as EvalExecutionPlanSchema, EvalPlanScope as EvalPlanScopeSchema, EvalProposedDimension as EvalProposedDimensionSchema, EvalProjectConfiguration, EvalProjectQuestion, EvalProjectDocument as EvalProjectDocumentSchema, EvalProjectSetupProgress, EvalProjectState, EvalProjectStateV2 as EvalProjectStateV2Schema, EvalRoutingBasisProposal as EvalRoutingBasisProposalSchema, EvalRunCleanup as EvalRunCleanupSchema, EvalRunFailureError as EvalRunFailureErrorSchema, EvalRunLedger as EvalRunLedgerSchema, EvalRunReport as EvalRunReportSchema, EvalRunTarget as EvalRunTargetSchema, FrozenRepositorySnapshotV3 as FrozenRepositorySnapshotV3Schema, scopedExpectedCalls, summarizeEvalRunLedger } from "./project-contracts.js";
12
18
  export { EvalProjectStore, EvalProjectStoreLive, makeFileEvalProjectStore } from "./project-store.js";
19
+ export type { BasisAuthoringShape } from "./services/basis-authoring/service.js";
20
+ export { BasisAuthoring, BasisAuthoringLive, makeBasisAuthoring } from "./services/basis-authoring/service.js";
21
+ export type { BasisOnboardingShape } from "./services/basis-onboarding/service.js";
22
+ export { BasisOnboarding, BasisOnboardingLive, makeBasisOnboarding } from "./services/basis-onboarding/service.js";
23
+ export type { BasisRepairShape } from "./services/basis-repair/service.js";
24
+ export { BasisRepair, BasisRepairLive, makeBasisRepair } from "./services/basis-repair/service.js";
13
25
  export type { EvalProjectWorkflowError, EvalProjectWorkflowShape } from "./project-workflow.js";
14
26
  export { EvalProjectWorkflow, EvalProjectWorkflowLive, makeEvalProjectWorkflow } from "./project-workflow.js";
15
27
  export { questionForStage, withOpenQuestion } from "./questions.js";
package/dist/index.js CHANGED
@@ -1,11 +1,19 @@
1
- export { EvalDimensionContrastError, EvalProjectArtifactError, EvalProjectAuthoringError, EvalProjectStoreError, EvalProjectTransitionError, EvalSetupInspectionError, EvalSetupRunnerError, EvalSetupScaffoldError, EvalSetupStateError, EvalSetupTransitionError } from "./errors.js";
1
+ export { projectRoutingBasisV3, projectRoutingDimensionV3 } from "./basis-projection.js";
2
+ export { EvalBasisSnapshotError, EvalDimensionContrastError, EvalProjectArtifactError, EvalProjectAuthoringError, EvalProjectStoreError, EvalProjectTransitionError, EvalSetupInspectionError, EvalSetupRunnerError, EvalSetupScaffoldError, EvalSetupStateError, EvalSetupTransitionError } from "./errors.js";
3
+ export { captureFrozenRepositorySnapshotV3 } from "./adapters/git-basis-snapshot.js";
4
+ export { readFrozenRepositorySourcesV3 } from "./adapters/git-basis-snapshot.js";
2
5
  export { authoringRequest, hostDirectory } from "./host-metadata.js";
6
+ export { BASIS_AUTHOR_INPUT_TOKENS_PER_ATTEMPT, BASIS_AUTHOR_OUTPUT_TOKENS_PER_ATTEMPT, DEFAULT_BASIS_CANDIDATE_RECIPES_V3, selectConstructionTasksForRecipeV3, splitBasisTasksChronologicallyV3 } from "./basis-candidates.js";
7
+ export { approveSelectedBasisV3, evaluateBasisCandidateValidationV3, inspectBasisCandidatesV3, makeBasisCandidateDatasetV3, selectValidatedBasisCandidatesV3 } from "./basis-validation.js";
3
8
  export { EvalRepositoryInspector, EvalRepositoryInspectorLive, inspectRepository } from "./inspection.js";
4
9
  export { OriEvalAuthoring, oriAuthoringFromApi } from "./ori-authoring.js";
5
10
  export { EvalProjectArtifacts, EvalProjectArtifactsLive, evaluationProposalDigest, makeFileEvalProjectArtifacts, routingBasisDigest } from "./project-artifacts.js";
6
11
  export { EVAL_AUTHORING_CASES_PER_DIMENSION, EVAL_AUTHORING_EVALUATION_OUTPUT_TOKENS, EVAL_AUTHORING_REQUEST_BYTES, EVAL_AUTHORING_SOURCE_BYTES, EVAL_AUTHORING_SOURCE_FILES, EvalAuthoringTransport, EvalProjectAuthor, EvalProjectAuthorLive, makeEvalProjectAuthor, readProjectAuthoringSources, selectProjectAuthoringSourceFiles } from "./project-authoring.js";
7
- export { EVAL_PROJECT_VERSION, EvalArtifactApproval, EvalCompositionSuite as EvalCompositionSuiteSchema, EvalDecompositionBenchmark as EvalDecompositionBenchmarkSchema, EvalDimensionCase as EvalDimensionCaseSchema, EvalDimensionContrast as EvalDimensionContrastSchema, EvalDimensionSuite as EvalDimensionSuiteSchema, EvalEvaluationProposal as EvalEvaluationProposalSchema, EvalExecutionPlan as EvalExecutionPlanSchema, EvalPlanScope as EvalPlanScopeSchema, EvalProposedDimension as EvalProposedDimensionSchema, EvalProjectConfiguration, EvalProjectQuestion, EvalProjectSetupProgress, EvalProjectState, EvalRoutingBasisProposal as EvalRoutingBasisProposalSchema, EvalRunCleanup as EvalRunCleanupSchema, EvalRunFailureError as EvalRunFailureErrorSchema, EvalRunLedger as EvalRunLedgerSchema, EvalRunReport as EvalRunReportSchema, EvalRunTarget as EvalRunTargetSchema, scopedExpectedCalls, summarizeEvalRunLedger } from "./project-contracts.js";
12
+ export { EVAL_PROJECT_VERSION, EVAL_PROJECT_V2_VERSION, BasisCandidateDatasetV3 as BasisCandidateDatasetV3Schema, BasisCandidatesArtifactsV3 as BasisCandidatesArtifactsV3Schema, BasisCandidateCheckpointV3 as BasisCandidateCheckpointV3Schema, BasisCandidateRecipeV3 as BasisCandidateRecipeV3Schema, BasisCandidateRecordV3 as BasisCandidateRecordV3Schema, BasisGenerationArtifactsV3 as BasisGenerationArtifactsV3Schema, BasisEvaluationProjectionV3 as BasisEvaluationProjectionV3Schema, BasisGenerationJobV3 as BasisGenerationJobV3Schema, BasisGenerationLedgerV3 as BasisGenerationLedgerV3Schema, BasisGenerationPlanV3 as BasisGenerationPlanV3Schema, BasisLabelProtocolV3 as BasisLabelProtocolV3Schema, BasisQualificationArtifactsV3 as BasisQualificationArtifactsV3Schema, BasisRepairArtifactsV3 as BasisRepairArtifactsV3Schema, BasisRepairPlanV3 as BasisRepairPlanV3Schema, BasisRepairSummaryV3 as BasisRepairSummaryV3Schema, BasisSelectionReportV3 as BasisSelectionReportV3Schema, BasisStructureReportV3 as BasisStructureReportV3Schema, BasisTaskRecordV3 as BasisTaskRecordV3Schema, BasisTaskSplitV3 as BasisTaskSplitV3Schema, BasisValidationPlanV3 as BasisValidationPlanV3Schema, BasisValidationClassifierBindingV3 as BasisValidationClassifierBindingV3Schema, BasisValidationJobCheckpointV3 as BasisValidationJobCheckpointV3Schema, BasisValidationResultsArtifactsV3 as BasisValidationResultsArtifactsV3Schema, BasisValidationArtifactsV3 as BasisValidationArtifactsV3Schema, BasisValidationResultV3 as BasisValidationResultV3Schema, EvalArtifactApproval, EvalCompositionSuite as EvalCompositionSuiteSchema, EvalDecompositionBenchmark as EvalDecompositionBenchmarkSchema, EvalDimensionCase as EvalDimensionCaseSchema, EvalDimensionContrast as EvalDimensionContrastSchema, EvalDimensionSuite as EvalDimensionSuiteSchema, EvalEvaluationProposal as EvalEvaluationProposalSchema, EvalExecutionPlan as EvalExecutionPlanSchema, EvalPlanScope as EvalPlanScopeSchema, EvalProposedDimension as EvalProposedDimensionSchema, EvalProjectConfiguration, EvalProjectQuestion, EvalProjectDocument as EvalProjectDocumentSchema, EvalProjectSetupProgress, EvalProjectState, EvalProjectStateV2 as EvalProjectStateV2Schema, EvalRoutingBasisProposal as EvalRoutingBasisProposalSchema, EvalRunCleanup as EvalRunCleanupSchema, EvalRunFailureError as EvalRunFailureErrorSchema, EvalRunLedger as EvalRunLedgerSchema, EvalRunReport as EvalRunReportSchema, EvalRunTarget as EvalRunTargetSchema, FrozenRepositorySnapshotV3 as FrozenRepositorySnapshotV3Schema, scopedExpectedCalls, summarizeEvalRunLedger } from "./project-contracts.js";
8
13
  export { EvalProjectStore, EvalProjectStoreLive, makeFileEvalProjectStore } from "./project-store.js";
14
+ export { BasisAuthoring, BasisAuthoringLive, makeBasisAuthoring } from "./services/basis-authoring/service.js";
15
+ export { BasisOnboarding, BasisOnboardingLive, makeBasisOnboarding } from "./services/basis-onboarding/service.js";
16
+ export { BasisRepair, BasisRepairLive, makeBasisRepair } from "./services/basis-repair/service.js";
9
17
  export { EvalProjectWorkflow, EvalProjectWorkflowLive, makeEvalProjectWorkflow } from "./project-workflow.js";
10
18
  export { questionForStage, withOpenQuestion } from "./questions.js";
11
19
  export { EvalSetupRunner, EvalSetupRunnerNoop } from "./runner.js";
@@ -1,10 +1,35 @@
1
1
  import { type RoutingBasis } from "@velum-labs/routekit-eval-contracts";
2
2
  import { Context, Effect, FileSystem, Layer, Path } from "effect";
3
3
  import { EvalProjectArtifactError } from "./errors.js";
4
- import { type EvalArtifactApproval, type EvalEvaluationProposal, type EvalExecutionPlan, type EvalRoutingBasisProposal, type EvalRunReport } from "./project-contracts.js";
4
+ import { type EvalArtifactApproval, type BasisCandidatesArtifactsV3, type BasisEvaluationProjectionV3, type BasisCandidateCheckpointV3, type BasisGenerationArtifactsV3, type BasisQualificationArtifactsV3, type BasisRepairArtifactsV3, type BasisValidationJobCheckpointV3, type BasisValidationResultsArtifactsV3, type BasisValidationArtifactsV3, type EvalEvaluationProposal, type EvalExecutionPlan, type EvalRoutingBasisProposal, type EvalRunReport } from "./project-contracts.js";
5
5
  export declare function routingBasisDigest(dimensions: RoutingBasis["dimensions"]): string;
6
6
  export declare function evaluationProposalDigest(proposal: Omit<EvalEvaluationProposal, "evaluationDigest">): string;
7
7
  export type EvalProjectArtifactsShape = {
8
+ readonly loadBasisGenerationV3: (repositoryRoot: string) => Effect.Effect<BasisGenerationArtifactsV3 | undefined, EvalProjectArtifactError>;
9
+ readonly saveBasisGenerationV3: (repositoryRoot: string, artifacts: BasisGenerationArtifactsV3) => Effect.Effect<void, EvalProjectArtifactError>;
10
+ readonly loadBasisCandidatesV3: (repositoryRoot: string) => Effect.Effect<BasisCandidatesArtifactsV3 | undefined, EvalProjectArtifactError>;
11
+ readonly saveBasisCandidatesV3: (repositoryRoot: string, artifacts: BasisCandidatesArtifactsV3) => Effect.Effect<void, EvalProjectArtifactError>;
12
+ readonly loadBasisCandidateCheckpointV3: (repositoryRoot: string, recipeId: string) => Effect.Effect<BasisCandidateCheckpointV3 | undefined, EvalProjectArtifactError>;
13
+ readonly saveBasisCandidateCheckpointV3: (repositoryRoot: string, checkpoint: BasisCandidateCheckpointV3) => Effect.Effect<void, EvalProjectArtifactError>;
14
+ readonly loadBasisValidationV3: (repositoryRoot: string) => Effect.Effect<BasisValidationArtifactsV3 | undefined, EvalProjectArtifactError>;
15
+ readonly saveBasisValidationV3: (repositoryRoot: string, artifacts: BasisValidationArtifactsV3) => Effect.Effect<void, EvalProjectArtifactError>;
16
+ readonly loadBasisValidationJobCheckpointV3: (repositoryRoot: string, input: {
17
+ readonly validationPlanDigest: string;
18
+ readonly candidateId: string;
19
+ readonly caseId: string;
20
+ readonly repetition: number;
21
+ }) => Effect.Effect<BasisValidationJobCheckpointV3 | undefined, EvalProjectArtifactError>;
22
+ readonly saveBasisValidationJobCheckpointV3: (repositoryRoot: string, checkpoint: BasisValidationJobCheckpointV3) => Effect.Effect<void, EvalProjectArtifactError>;
23
+ readonly loadBasisValidationResultsV3: (repositoryRoot: string) => Effect.Effect<BasisValidationResultsArtifactsV3 | undefined, EvalProjectArtifactError>;
24
+ readonly saveBasisValidationResultsV3: (repositoryRoot: string, artifacts: BasisValidationResultsArtifactsV3) => Effect.Effect<void, EvalProjectArtifactError>;
25
+ readonly loadBasisQualificationV3: (repositoryRoot: string) => Effect.Effect<BasisQualificationArtifactsV3 | undefined, EvalProjectArtifactError>;
26
+ readonly saveBasisQualificationV3: (repositoryRoot: string, artifacts: BasisQualificationArtifactsV3) => Effect.Effect<void, EvalProjectArtifactError>;
27
+ readonly loadBasisEvaluationProjectionV3: (repositoryRoot: string) => Effect.Effect<BasisEvaluationProjectionV3 | undefined, EvalProjectArtifactError>;
28
+ readonly saveBasisEvaluationProjectionV3: (repositoryRoot: string, projection: BasisEvaluationProjectionV3) => Effect.Effect<void, EvalProjectArtifactError>;
29
+ readonly loadBasisRepairV3: (repositoryRoot: string) => Effect.Effect<BasisRepairArtifactsV3 | undefined, EvalProjectArtifactError>;
30
+ readonly saveBasisRepairV3: (repositoryRoot: string, artifacts: BasisRepairArtifactsV3) => Effect.Effect<void, EvalProjectArtifactError>;
31
+ readonly saveBasisRepairValidationV3: (repositoryRoot: string, artifacts: BasisValidationArtifactsV3) => Effect.Effect<void, EvalProjectArtifactError>;
32
+ readonly saveBasisRepairValidationResultsV3: (repositoryRoot: string, artifacts: BasisValidationResultsArtifactsV3) => Effect.Effect<void, EvalProjectArtifactError>;
8
33
  readonly loadBasisProposal: (repositoryRoot: string) => Effect.Effect<EvalRoutingBasisProposal | undefined, EvalProjectArtifactError, never>;
9
34
  readonly saveBasisProposal: (repositoryRoot: string, basis: EvalRoutingBasisProposal) => Effect.Effect<void, EvalProjectArtifactError, never>;
10
35
  readonly loadBasisApproval: (repositoryRoot: string) => Effect.Effect<EvalArtifactApproval | undefined, EvalProjectArtifactError, never>;
@@ -3,11 +3,20 @@ import { assertRoutingBasis } from "@velum-labs/routekit-eval-contracts";
3
3
  import { writeFileAtomicEffect } from "@velum-labs/routekit-runtime/effect";
4
4
  import { Context, Effect, Exit, FileSystem, Layer, Path, Schema } from "effect";
5
5
  import { EvalProjectArtifactError } from "./errors.js";
6
- import { EVAL_PROJECT_VERSION, EvalArtifactApproval as EvalArtifactApprovalSchema, EvalEvaluationProposal as EvalEvaluationProposalSchema, EvalExecutionPlan as EvalExecutionPlanSchema, EvalRoutingBasisProposal as EvalRoutingBasisProposalSchema, EvalRunReport as EvalRunReportSchema } from "./project-contracts.js";
6
+ import { EVAL_PROJECT_VERSION, EvalArtifactApproval as EvalArtifactApprovalSchema, BasisCandidatesArtifactsV3 as BasisCandidatesArtifactsV3Schema, BasisEvaluationProjectionV3 as BasisEvaluationProjectionV3Schema, BasisCandidateCheckpointV3 as BasisCandidateCheckpointV3Schema, BasisGenerationArtifactsV3 as BasisGenerationArtifactsV3Schema, BasisQualificationArtifactsV3 as BasisQualificationArtifactsV3Schema, BasisRepairArtifactsV3 as BasisRepairArtifactsV3Schema, BasisValidationJobCheckpointV3 as BasisValidationJobCheckpointV3Schema, BasisValidationResultsArtifactsV3 as BasisValidationResultsArtifactsV3Schema, BasisValidationArtifactsV3 as BasisValidationArtifactsV3Schema, EvalEvaluationProposal as EvalEvaluationProposalSchema, EvalExecutionPlan as EvalExecutionPlanSchema, EvalRoutingBasisProposal as EvalRoutingBasisProposalSchema, EvalRunReport as EvalRunReportSchema } from "./project-contracts.js";
7
7
  const BASIS_PROPOSAL = "routing-basis.proposed.json";
8
8
  const BASIS_APPROVAL = "routing-basis.approval.json";
9
9
  const EVALUATIONS_PROPOSAL = "evaluations.proposed.json";
10
10
  const EVALUATIONS_APPROVAL = "evaluations.approval.json";
11
+ const BASIS_GENERATION_V3 = "basis/generation.v3.json";
12
+ const BASIS_CANDIDATES_V3 = "basis/candidates.v3.json";
13
+ const BASIS_VALIDATION_V3 = "basis/validation.v3.json";
14
+ const BASIS_VALIDATION_RESULTS_V3 = "basis/validation-results.v3.json";
15
+ const BASIS_QUALIFICATION_V3 = "basis/qualification.v3.json";
16
+ const BASIS_EVALUATION_PROJECTION_V3 = "basis/evaluation-projection.v3.json";
17
+ const BASIS_REPAIR_V3 = "basis/repair.v3.json";
18
+ const BASIS_REPAIR_VALIDATION_V3 = "basis/repair-validation.v3.json";
19
+ const BASIS_REPAIR_VALIDATION_RESULTS_V3 = "basis/repair-validation-results.v3.json";
11
20
  const ARTIFACT_ID = /^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/u;
12
21
  const renderCandidatePrompt = () => `const prompt = [
13
22
  testCase.prompt,
@@ -157,6 +166,18 @@ export const makeFileEvalProjectArtifacts = Effect.gen(function* () {
157
166
  const paths = yield* Path.Path;
158
167
  const root = (repositoryRoot) => paths.join(paths.resolve(repositoryRoot), ".routekit", "evals");
159
168
  const artifactPath = (repositoryRoot, name) => paths.join(root(repositoryRoot), name);
169
+ const candidateCheckpointName = (recipeId) => ARTIFACT_ID.test(recipeId)
170
+ ? Effect.succeed(paths.join("basis", "candidates", `${recipeId}.v3.json`))
171
+ : Effect.fail(artifactFailure("reading", recipeId, new Error("recipe id must be a bounded identifier, not a path")));
172
+ const validationCheckpointName = (input) => {
173
+ const identity = {
174
+ validationPlanDigest: input.validationPlanDigest,
175
+ candidateId: input.candidateId,
176
+ caseId: input.caseId,
177
+ repetition: input.repetition
178
+ };
179
+ return paths.join("basis", "validation", `${digest(identity)}.v3.json`);
180
+ };
160
181
  const writeAtomic = (target, content) => writeFileAtomicEffect(target, content, {
161
182
  mode: 0o600
162
183
  }).pipe(Effect.mapError((cause) => artifactFailure("writing", target, cause)), Effect.provideService(FileSystem.FileSystem, fs), Effect.provideService(Path.Path, paths));
@@ -190,7 +211,37 @@ export const makeFileEvalProjectArtifacts = Effect.gen(function* () {
190
211
  yield* writeAtomic(target, content);
191
212
  });
192
213
  const write = (repositoryRoot, name, value, overwrite = true) => writeText(repositoryRoot, name, `${JSON.stringify(value, null, 2)}\n`, overwrite);
214
+ const saveImmutable = (repositoryRoot, name, value, decode) => Effect.gen(function* () {
215
+ const existing = yield* read(repositoryRoot, name, decode);
216
+ if (existing !== undefined) {
217
+ if (JSON.stringify(existing) !== JSON.stringify(value)) {
218
+ return yield* artifactFailure("writing", artifactPath(repositoryRoot, name), new Error("immutable artifact already exists with different contents"));
219
+ }
220
+ return;
221
+ }
222
+ yield* write(repositoryRoot, name, value, false);
223
+ });
193
224
  return EvalProjectArtifacts.of({
225
+ loadBasisGenerationV3: (repositoryRoot) => read(repositoryRoot, BASIS_GENERATION_V3, Schema.decodeUnknownEffect(BasisGenerationArtifactsV3Schema)),
226
+ saveBasisGenerationV3: (repositoryRoot, artifacts) => saveImmutable(repositoryRoot, BASIS_GENERATION_V3, artifacts, Schema.decodeUnknownEffect(BasisGenerationArtifactsV3Schema)),
227
+ loadBasisCandidatesV3: (repositoryRoot) => read(repositoryRoot, BASIS_CANDIDATES_V3, Schema.decodeUnknownEffect(BasisCandidatesArtifactsV3Schema)),
228
+ saveBasisCandidatesV3: (repositoryRoot, artifacts) => saveImmutable(repositoryRoot, BASIS_CANDIDATES_V3, artifacts, Schema.decodeUnknownEffect(BasisCandidatesArtifactsV3Schema)),
229
+ loadBasisCandidateCheckpointV3: (repositoryRoot, recipeId) => candidateCheckpointName(recipeId).pipe(Effect.flatMap((name) => read(repositoryRoot, name, Schema.decodeUnknownEffect(BasisCandidateCheckpointV3Schema)))),
230
+ saveBasisCandidateCheckpointV3: (repositoryRoot, checkpoint) => candidateCheckpointName(checkpoint.job.recipeId).pipe(Effect.flatMap((name) => saveImmutable(repositoryRoot, name, checkpoint, Schema.decodeUnknownEffect(BasisCandidateCheckpointV3Schema)))),
231
+ loadBasisValidationV3: (repositoryRoot) => read(repositoryRoot, BASIS_VALIDATION_V3, Schema.decodeUnknownEffect(BasisValidationArtifactsV3Schema)),
232
+ saveBasisValidationV3: (repositoryRoot, artifacts) => saveImmutable(repositoryRoot, BASIS_VALIDATION_V3, artifacts, Schema.decodeUnknownEffect(BasisValidationArtifactsV3Schema)),
233
+ loadBasisValidationJobCheckpointV3: (repositoryRoot, input) => read(repositoryRoot, validationCheckpointName(input), Schema.decodeUnknownEffect(BasisValidationJobCheckpointV3Schema)),
234
+ saveBasisValidationJobCheckpointV3: (repositoryRoot, checkpoint) => saveImmutable(repositoryRoot, validationCheckpointName(checkpoint), checkpoint, Schema.decodeUnknownEffect(BasisValidationJobCheckpointV3Schema)),
235
+ loadBasisValidationResultsV3: (repositoryRoot) => read(repositoryRoot, BASIS_VALIDATION_RESULTS_V3, Schema.decodeUnknownEffect(BasisValidationResultsArtifactsV3Schema)),
236
+ saveBasisValidationResultsV3: (repositoryRoot, artifacts) => saveImmutable(repositoryRoot, BASIS_VALIDATION_RESULTS_V3, artifacts, Schema.decodeUnknownEffect(BasisValidationResultsArtifactsV3Schema)),
237
+ loadBasisQualificationV3: (repositoryRoot) => read(repositoryRoot, BASIS_QUALIFICATION_V3, Schema.decodeUnknownEffect(BasisQualificationArtifactsV3Schema)),
238
+ saveBasisQualificationV3: (repositoryRoot, artifacts) => saveImmutable(repositoryRoot, BASIS_QUALIFICATION_V3, artifacts, Schema.decodeUnknownEffect(BasisQualificationArtifactsV3Schema)),
239
+ loadBasisEvaluationProjectionV3: (repositoryRoot) => read(repositoryRoot, BASIS_EVALUATION_PROJECTION_V3, Schema.decodeUnknownEffect(BasisEvaluationProjectionV3Schema)),
240
+ saveBasisEvaluationProjectionV3: (repositoryRoot, projection) => saveImmutable(repositoryRoot, BASIS_EVALUATION_PROJECTION_V3, projection, Schema.decodeUnknownEffect(BasisEvaluationProjectionV3Schema)),
241
+ loadBasisRepairV3: (repositoryRoot) => read(repositoryRoot, BASIS_REPAIR_V3, Schema.decodeUnknownEffect(BasisRepairArtifactsV3Schema)),
242
+ saveBasisRepairV3: (repositoryRoot, artifacts) => saveImmutable(repositoryRoot, BASIS_REPAIR_V3, artifacts, Schema.decodeUnknownEffect(BasisRepairArtifactsV3Schema)),
243
+ saveBasisRepairValidationV3: (repositoryRoot, artifacts) => saveImmutable(repositoryRoot, BASIS_REPAIR_VALIDATION_V3, artifacts, Schema.decodeUnknownEffect(BasisValidationArtifactsV3Schema)),
244
+ saveBasisRepairValidationResultsV3: (repositoryRoot, artifacts) => saveImmutable(repositoryRoot, BASIS_REPAIR_VALIDATION_RESULTS_V3, artifacts, Schema.decodeUnknownEffect(BasisValidationResultsArtifactsV3Schema)),
194
245
  loadBasisProposal: (repositoryRoot) => read(repositoryRoot, BASIS_PROPOSAL, Schema.decodeUnknownEffect(EvalRoutingBasisProposalSchema)).pipe(Effect.tap((basis) => basis === undefined
195
246
  ? Effect.void
196
247
  : Effect.try({