@velum-labs/routekit-eval-setup 1.0.26 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/git-basis-snapshot.d.ts +27 -0
- package/dist/adapters/git-basis-snapshot.js +178 -0
- package/dist/basis-candidates.d.ts +72 -0
- package/dist/basis-candidates.js +157 -0
- package/dist/basis-projection.d.ts +9 -0
- package/dist/basis-projection.js +30 -0
- package/dist/basis-validation.d.ts +38 -0
- package/dist/basis-validation.js +187 -0
- package/dist/effect-api.d.ts +8 -0
- package/dist/effect-api.js +5 -0
- package/dist/errors.d.ts +11 -1
- package/dist/errors.js +5 -0
- package/dist/index.d.ts +15 -3
- package/dist/index.js +10 -2
- package/dist/project-artifacts.d.ts +26 -1
- package/dist/project-artifacts.js +52 -1
- package/dist/project-contracts.d.ts +3594 -0
- package/dist/project-contracts.js +344 -1
- package/dist/project-store.d.ts +3 -1
- package/dist/project-store.js +39 -33
- package/dist/project-workflow.d.ts +2 -2
- package/dist/services/basis-authoring/service.d.ts +253 -0
- package/dist/services/basis-authoring/service.js +547 -0
- package/dist/services/basis-onboarding/service.d.ts +48 -0
- package/dist/services/basis-onboarding/service.js +491 -0
- package/dist/services/basis-repair/service.d.ts +25 -0
- package/dist/services/basis-repair/service.js +249 -0
- package/dist/test/basis-authoring.test.d.ts +1 -0
- package/dist/test/basis-authoring.test.js +194 -0
- package/dist/test/basis-onboarding.test.d.ts +1 -0
- package/dist/test/basis-onboarding.test.js +385 -0
- package/dist/test/basis-repair.test.d.ts +1 -0
- package/dist/test/basis-repair.test.js +338 -0
- package/dist/test/basis-v3.test.d.ts +1 -0
- package/dist/test/basis-v3.test.js +262 -0
- package/dist/test/project-v2.test.d.ts +1 -0
- package/dist/test/project-v2.test.js +99 -0
- 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
|
+
}
|
package/dist/effect-api.d.ts
CHANGED
|
@@ -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";
|
package/dist/effect-api.js
CHANGED
|
@@ -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 {
|
|
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 {
|
|
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({
|