@bjoernrochel/sevro 0.1.0-rc.7 → 1.0.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/CONTRIBUTING.md +22 -6
- package/README.md +5 -1
- package/docs/README.md +19 -15
- package/docs/architecture.md +138 -17
- package/docs/assets/README.md +5 -4
- package/docs/builtin-graders-v1.md +17 -3
- package/docs/codex-host.md +155 -49
- package/docs/contracts.md +2 -1
- package/docs/creating-cases.md +9 -2
- package/docs/development-cli.md +187 -19
- package/docs/documentation-quality.md +12 -2
- package/docs/evaluation-workflow.md +110 -0
- package/docs/extension-protocol-v1.md +26 -3
- package/docs/getting-started.md +23 -2
- package/docs/guide-evaluation.md +33 -1
- package/docs/identity-v1.md +25 -2
- package/docs/installing.md +11 -11
- package/docs/native-controls.md +76 -5
- package/docs/native-hosts.md +196 -7
- package/docs/reading-results.md +102 -0
- package/docs/recipes.md +489 -0
- package/docs/releases.md +31 -12
- package/docs/report-v1.md +29 -1
- package/docs/results-v1.md +141 -4
- package/docs/run-settings-v1.md +147 -0
- package/docs/runtime-v1.md +307 -18
- package/docs/troubleshooting.md +12 -12
- package/docs/typescript-quality.md +89 -26
- package/examples/recipes/candidate.ts +26 -0
- package/examples/recipes/cases/coding-change.json +21 -0
- package/examples/recipes/cases/host-tools.json +21 -0
- package/examples/recipes/cases/mise.json +21 -0
- package/examples/recipes/cases/node.json +21 -0
- package/examples/recipes/cases/python-uv.json +21 -0
- package/examples/recipes/cases/semantic.json +17 -0
- package/examples/recipes/coding-change/check.ts +23 -0
- package/examples/recipes/extension-artifacts.ts +65 -0
- package/examples/recipes/extension-methods.ts +174 -0
- package/examples/recipes/extension.ts +37 -0
- package/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
- package/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
- package/examples/recipes/repository-skill/README.md +3 -0
- package/examples/recipes/run-inputs.ts +188 -0
- package/examples/recipes/run-options.ts +131 -0
- package/examples/recipes/run.ts +63 -0
- package/examples/recipes/runtime/empty.json +1 -0
- package/examples/recipes/runtime/goals.json +1 -0
- package/examples/recipes/runtime/mise.json +6 -0
- package/examples/recipes/runtime/path.json +1 -0
- package/examples/recipes/runtime/plugins.json +4 -0
- package/examples/recipes/runtime/python-uv.json +10 -0
- package/examples/recipes/semantic-judge.ts +29 -0
- package/examples/templates/coding/adapter.ts +17 -0
- package/examples/templates/coding/case.json +15 -0
- package/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
- package/examples/templates/repository-skill/extension-data.ts +64 -0
- package/examples/templates/repository-skill/extension.ts +31 -0
- package/examples/templates/response/adapter.ts +12 -0
- package/examples/templates/response/case.json +13 -0
- package/package.json +11 -5
- package/schemas/report-v1.schema.json +9 -0
- package/schemas/run-evidence-v1.schema.json +2 -1
- package/schemas/runtime-v1.schema.json +63 -7
- package/src/advisory.ts +2 -2
- package/src/candidate-artifacts.ts +206 -0
- package/src/candidate-codex-state.ts +185 -0
- package/src/case-validation.ts +73 -50
- package/src/cli/cancellation.ts +20 -0
- package/src/cli/command.ts +87 -0
- package/src/cli/completion.ts +15 -0
- package/src/cli/demo.ts +60 -0
- package/src/cli/evaluation.ts +55 -0
- package/src/cli/extension.ts +79 -0
- package/src/cli/help.ts +198 -0
- package/src/cli/hosts.ts +55 -0
- package/src/cli/init-settings.ts +30 -0
- package/src/cli/init.ts +111 -0
- package/src/{cli-invocation.ts → cli/invocation.ts} +214 -218
- package/src/cli/loading.ts +151 -0
- package/src/cli/preparation.ts +154 -0
- package/src/cli/presentation.ts +93 -0
- package/src/cli/progress.ts +6 -0
- package/src/cli/run-manifest.ts +128 -0
- package/src/cli/run-options.ts +403 -0
- package/src/cli/run-overrides.ts +69 -0
- package/src/cli/settings.ts +154 -0
- package/src/cli/summary.ts +43 -0
- package/src/cli.ts +13 -591
- package/src/contract-types.ts +94 -0
- package/src/engine.ts +13 -5
- package/src/evaluation/advisory.ts +150 -0
- package/src/{evaluation-check-plan.ts → evaluation/check-plan.ts} +103 -67
- package/src/evaluation/collection.ts +88 -0
- package/src/evaluation/context.ts +10 -0
- package/src/{evaluation-grading-host.ts → evaluation/grading-host.ts} +5 -5
- package/src/evaluation/grading.ts +235 -0
- package/src/{evaluation-invocation-plan.ts → evaluation/invocation-plan.ts} +147 -58
- package/src/{evaluation-plan.ts → evaluation/plan.ts} +208 -141
- package/src/evaluation/progress.ts +19 -0
- package/src/evaluation/resources.ts +241 -0
- package/src/evaluation/run.ts +206 -0
- package/src/{evaluation-semantic.ts → evaluation/semantic.ts} +133 -115
- package/src/evaluation/trial.ts +800 -0
- package/src/evaluation/types.ts +207 -0
- package/src/evidence/host-results.ts +85 -0
- package/src/evidence/retained-artifacts.ts +18 -0
- package/src/evidence/trial-writer.ts +203 -0
- package/src/evidence/usage.ts +17 -0
- package/src/extension-client.ts +34 -96
- package/src/extension-session.ts +24 -48
- package/src/{advisory-fixture.ts → fixtures/advisory.ts} +15 -76
- package/src/{fixture-bin.ts → fixtures/bin.ts} +1 -1
- package/src/{fixture-cleanup.ts → fixtures/cleanup.ts} +13 -7
- package/src/fixtures/create.ts +183 -0
- package/src/{generated-fixture.ts → fixtures/generated.ts} +10 -53
- package/src/{git-hooks.ts → fixtures/git-hooks.ts} +1 -1
- package/src/{preparation.ts → fixtures/preparation.ts} +6 -16
- package/src/{repository-fixture.ts → fixtures/repository.ts} +30 -64
- package/src/{fixture-setup.ts → fixtures/setup.ts} +33 -51
- package/src/{fixture-tools.ts → fixtures/tools.ts} +1 -1
- package/src/fixtures/workspace-state.ts +212 -0
- package/src/generated/cli-result.d.cts +2 -1
- package/src/generated/extension.d.cts +2 -1
- package/src/generated/report.cjs +1 -1
- package/src/generated/report.d.cts +2 -1
- package/src/generated/run-evidence.cjs +1 -1
- package/src/generated/run-evidence.d.cts +2 -1
- package/src/generated/runtime.cjs +1 -1
- package/src/generated/runtime.d.cts +2 -1
- package/src/git.ts +93 -0
- package/src/graders/git-head.ts +29 -84
- package/src/graders/shell.ts +57 -68
- package/src/host-diagnostic-redaction.ts +52 -0
- package/src/host-diagnostics.ts +331 -0
- package/src/hosts/claude-continuation.ts +57 -40
- package/src/hosts/claude-credential.ts +160 -63
- package/src/hosts/claude-events.ts +34 -18
- package/src/hosts/claude-keychain.ts +78 -21
- package/src/hosts/claude-login-recovery.ts +85 -0
- package/src/hosts/claude-login-refresh.ts +178 -0
- package/src/hosts/claude-login-store.ts +162 -0
- package/src/hosts/claude-login.ts +107 -0
- package/src/hosts/claude-native-goal.ts +15 -12
- package/src/hosts/claude-process.ts +10 -50
- package/src/hosts/claude-refresh-lock.ts +81 -0
- package/src/hosts/claude-repository-invocation.ts +9 -34
- package/src/hosts/claude-settings.ts +91 -14
- package/src/hosts/claude-skill-activations.ts +169 -0
- package/src/hosts/claude-state.ts +46 -16
- package/src/hosts/claude-tool-calls.ts +13 -10
- package/src/hosts/claude.ts +122 -73
- package/src/hosts/codex-app-server.ts +78 -52
- package/src/hosts/codex-configuration.ts +5 -10
- package/src/hosts/codex-exec-controls.ts +516 -0
- package/src/hosts/codex-marketplace.ts +12 -10
- package/src/hosts/codex-native-calls.ts +15 -122
- package/src/hosts/codex-process.ts +10 -54
- package/src/hosts/codex-profile.ts +50 -21
- package/src/hosts/codex-session-files.ts +1 -9
- package/src/hosts/codex-state.ts +141 -19
- package/src/hosts/codex.ts +221 -179
- package/src/hosts/isolation-common.ts +15 -11
- package/src/hosts/isolation-roots.ts +13 -20
- package/src/hosts/linux-sandbox.ts +27 -3
- package/src/hosts/mac-sandbox.ts +111 -18
- package/src/hosts/native-controls.ts +72 -22
- package/src/hosts/native-request.ts +55 -0
- package/src/hosts/process-lifecycle.ts +221 -45
- package/src/hosts/protected-worktrees.ts +1 -1
- package/src/hosts/skill-hook-catalog.ts +131 -0
- package/src/hosts/skill-hook-handler.ts +374 -0
- package/src/hosts/skill-hooks.ts +577 -0
- package/src/instrumentation.ts +7 -8
- package/src/native-transcript-state.ts +22 -3
- package/src/native-transcript-view.ts +52 -13
- package/src/native-transcripts.ts +34 -15
- package/src/paths.ts +22 -0
- package/src/process-lifecycle.ts +150 -0
- package/src/provenance.ts +27 -7
- package/src/prune.ts +300 -0
- package/src/report.ts +63 -36
- package/src/resolved-case.ts +1 -1
- package/src/results-lock.ts +42 -0
- package/src/results.ts +14 -18
- package/src/run-owner.ts +4 -4
- package/src/{runtime-config.ts → runtime/config.ts} +182 -44
- package/src/{runtime-discovery-apple.ts → runtime/discovery-apple.ts} +3 -3
- package/src/{runtime-discovery-providers.ts → runtime/discovery-providers.ts} +3 -9
- package/src/{runtime-discovery.ts → runtime/discovery.ts} +4 -4
- package/src/{runtime-hook-processes.ts → runtime/hook-processes.ts} +1 -1
- package/src/{runtime-hooks.ts → runtime/hooks.ts} +33 -22
- package/src/{runtime-paths.ts → runtime/paths.ts} +6 -18
- package/src/{runtime-query.ts → runtime/query.ts} +5 -5
- package/src/{runtime-seeds.ts → runtime/seeds.ts} +3 -3
- package/src/runtime/shared-cache.ts +130 -0
- package/src/{runtime-state.ts → runtime/state.ts} +28 -11
- package/src/schema-types.ts +73 -161
- package/src/shell.ts +4 -0
- package/src/transcript-retention.ts +146 -0
- package/src/value-guards.ts +22 -0
- package/docs/assets/sevro-logo.png +0 -0
- package/docs/assets/sevro-symbol.svg +0 -1
- package/docs/assets/sevro-wordmark.svg +0 -1
- package/docs/cache-ownership-validation.md +0 -49
- package/docs/claude-continuation-validation.md +0 -47
- package/docs/concurrency-validation.md +0 -86
- package/docs/configuration-root-validation.md +0 -70
- package/docs/engine-slice.md +0 -114
- package/docs/evidence/runtime-startup-30/README.md +0 -185
- package/docs/evidence/runtime-startup-30/after.json +0 -319
- package/docs/evidence/runtime-startup-30/baseline-timeout.jsonl +0 -2
- package/docs/evidence/runtime-startup-30/before.json +0 -403
- package/docs/evidence/runtime-startup-30/consumer-smoke.json +0 -63
- package/docs/evidence/runtime-startup-30/full-policy-diagnostic.jsonl +0 -3
- package/docs/evidence/runtime-startup-30/minimal-policy-diagnostic.jsonl +0 -3
- package/docs/evidence/runtime-startup-30/plugin-template-assessment.json +0 -20
- package/docs/evidence/runtime-startup-30/seedless-timeout.jsonl +0 -2
- package/docs/evidence.md +0 -17
- package/docs/fixture-cleanup-validation.md +0 -70
- package/docs/guide-verification.json +0 -239
- package/src/evaluation-context.ts +0 -257
- package/src/evaluation-fixture.ts +0 -313
- package/src/evaluation-run.ts +0 -198
- package/src/evaluation-trial.ts +0 -946
- package/src/evaluation-types.ts +0 -149
- package/src/hosts/claude-nested-skills.ts +0 -272
- package/src/hosts/codex-command-output.ts +0 -510
- package/src/hosts/codex-executor-command.ts +0 -291
- package/src/hosts/codex-skill-reads.ts +0 -609
- /package/src/{trial-scheduler.ts → evaluation/scheduler.ts} +0 -0
|
@@ -1,50 +1,53 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { clearFixtureContents } from "../fixtures/cleanup";
|
|
2
|
+
import type { CandidateArtifactRoots } from "../candidate-artifacts";
|
|
3
|
+
import { createFixture } from "../fixtures/create";
|
|
4
|
+
import { hostArtifacts } from "../evidence/host-results";
|
|
5
|
+
import { usage } from "../evidence/usage";
|
|
6
|
+
import { gradingRuntimePolicy, scopedHostArtifacts } from "./grading-host";
|
|
5
7
|
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
import { readSemanticArtifact } from "
|
|
8
|
+
HostExecutionFailure,
|
|
9
|
+
type HostAdapter,
|
|
10
|
+
type HostResult,
|
|
11
|
+
} from "./types";
|
|
12
|
+
import { readSemanticArtifact } from "../graders/artifact";
|
|
11
13
|
import {
|
|
12
14
|
parseSemanticVerdicts,
|
|
13
15
|
semanticCheckGroups,
|
|
14
16
|
semanticPrompt,
|
|
15
17
|
type PreparedSemanticCheck,
|
|
16
18
|
type SemanticVerdict,
|
|
17
|
-
} from "
|
|
18
|
-
import { sha256 } from "
|
|
19
|
-
import type { CheckOutcome } from "
|
|
20
|
-
import type {
|
|
19
|
+
} from "../graders/semantic";
|
|
20
|
+
import { sha256 } from "../identity";
|
|
21
|
+
import type { CheckOutcome } from "../results";
|
|
22
|
+
import type {
|
|
23
|
+
TrialEvidenceWriter,
|
|
24
|
+
TrialObservation,
|
|
25
|
+
} from "../evidence/trial-writer";
|
|
26
|
+
import type { GradingFailure, GradingResult } from "./grading";
|
|
27
|
+
import type { RuntimePolicy } from "../runtime/config";
|
|
28
|
+
import { HostDiagnosticPersistenceError } from "../host-diagnostics";
|
|
21
29
|
|
|
22
|
-
interface SemanticObservation {
|
|
23
|
-
id: string;
|
|
24
|
-
source: string;
|
|
25
|
-
completeness: "complete" | "partial";
|
|
26
|
-
data: Record<string, unknown>;
|
|
27
|
-
}
|
|
28
30
|
interface SemanticGradingInput {
|
|
29
|
-
checks: PreparedSemanticCheck[];
|
|
30
|
-
declaredChecks:
|
|
31
|
-
host: HostAdapter | undefined;
|
|
32
|
-
message: string | null;
|
|
33
|
-
candidateWorkspace: string;
|
|
34
|
-
candidateTranscriptRoot?: string;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
signal?: AbortSignal;
|
|
31
|
+
readonly checks: readonly PreparedSemanticCheck[];
|
|
32
|
+
readonly declaredChecks: readonly { id: string }[];
|
|
33
|
+
readonly host: HostAdapter | undefined;
|
|
34
|
+
readonly message: string | null;
|
|
35
|
+
readonly candidateWorkspace: string;
|
|
36
|
+
readonly candidateTranscriptRoot?: string;
|
|
37
|
+
readonly candidateArtifactRoots?: CandidateArtifactRoots;
|
|
38
|
+
readonly projectRoot: string;
|
|
39
|
+
readonly reservedWorkspace?: string;
|
|
40
|
+
readonly runtimePolicy?: RuntimePolicy;
|
|
41
|
+
readonly signal?: AbortSignal;
|
|
41
42
|
}
|
|
42
43
|
interface SemanticGradingEffects {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
readonly evidence: Pick<
|
|
45
|
+
TrialEvidenceWriter,
|
|
46
|
+
"artifactRefs" | "retainArtifacts" | "retainSemanticVerdicts"
|
|
47
|
+
>;
|
|
48
|
+
/** Close admission at detection, before retaining or cleaning auxiliary state. */
|
|
49
|
+
onFailure(failure: GradingFailure): void;
|
|
50
|
+
retainWorkspace(workspace: string): Promise<void>;
|
|
48
51
|
}
|
|
49
52
|
type SemanticGroup = ReturnType<typeof semanticCheckGroups>[number];
|
|
50
53
|
|
|
@@ -94,16 +97,25 @@ function semanticHostPrompt(
|
|
|
94
97
|
);
|
|
95
98
|
}
|
|
96
99
|
class SemanticGrading {
|
|
97
|
-
private observations:
|
|
100
|
+
private observations: TrialObservation[] = [];
|
|
98
101
|
private checks: CheckOutcome[] = [];
|
|
102
|
+
private failure: GradingFailure | null = null;
|
|
99
103
|
constructor(
|
|
100
104
|
private readonly input: SemanticGradingInput,
|
|
101
105
|
private readonly effects: SemanticGradingEffects,
|
|
102
106
|
) {}
|
|
103
|
-
async run() {
|
|
104
|
-
for (const group of semanticCheckGroups(this.input.checks))
|
|
107
|
+
async run(): Promise<GradingResult> {
|
|
108
|
+
for (const group of semanticCheckGroups([...this.input.checks]))
|
|
105
109
|
await this.gradeSemanticGroup(group);
|
|
106
|
-
return {
|
|
110
|
+
return {
|
|
111
|
+
checks: this.checks,
|
|
112
|
+
observations: this.observations,
|
|
113
|
+
failure: this.failure,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
private failGrading(message: string, cancelable = true): void {
|
|
117
|
+
this.failure = { message, cancelable };
|
|
118
|
+
this.effects.onFailure(this.failure);
|
|
107
119
|
}
|
|
108
120
|
private async semanticInput(
|
|
109
121
|
pattern: string | undefined,
|
|
@@ -115,16 +127,12 @@ class SemanticGrading {
|
|
|
115
127
|
|
|
116
128
|
private async semanticWorkspace(): Promise<string> {
|
|
117
129
|
return createFixture(
|
|
118
|
-
{ files: {} },
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
null,
|
|
125
|
-
this.input.projectRoot,
|
|
126
|
-
this.input.signal,
|
|
127
|
-
this.input.reservedWorkspace,
|
|
130
|
+
{ kind: "inline", files: {} },
|
|
131
|
+
{
|
|
132
|
+
projectRoot: this.input.projectRoot,
|
|
133
|
+
signal: this.input.signal,
|
|
134
|
+
reservedWorkspace: this.input.reservedWorkspace,
|
|
135
|
+
},
|
|
128
136
|
);
|
|
129
137
|
}
|
|
130
138
|
|
|
@@ -141,53 +149,43 @@ class SemanticGrading {
|
|
|
141
149
|
source = semanticSource(artifact);
|
|
142
150
|
const host = this.input.host;
|
|
143
151
|
if (!host) throw new Error("semantic host is unavailable");
|
|
144
|
-
const response = await host
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
152
|
+
const response = await host
|
|
153
|
+
.run({
|
|
154
|
+
retainHostDiagnostics: (bytes) =>
|
|
155
|
+
this.effects.evidence.retainArtifacts([
|
|
156
|
+
{
|
|
157
|
+
id: `sevro.semantic${suffix}.sevro.host.diagnostics`,
|
|
158
|
+
bytes: Buffer.from(bytes),
|
|
159
|
+
},
|
|
160
|
+
]),
|
|
161
|
+
candidateTranscriptRoot: this.input.candidateTranscriptRoot,
|
|
162
|
+
candidateArtifactRoots: this.input.candidateArtifactRoots,
|
|
163
|
+
prompt: semanticHostPrompt(message, group, artifact),
|
|
164
|
+
runtimePolicy: gradingRuntimePolicy(
|
|
165
|
+
this.input.runtimePolicy,
|
|
166
|
+
pattern === undefined,
|
|
167
|
+
),
|
|
168
|
+
runtimeRole: "semantic",
|
|
169
|
+
workspace,
|
|
170
|
+
condition: "passive",
|
|
171
|
+
signal: this.input.signal,
|
|
172
|
+
})
|
|
173
|
+
.catch((cause: unknown) => {
|
|
174
|
+
if (cause instanceof HostExecutionFailure) return cause.result;
|
|
175
|
+
throw cause;
|
|
176
|
+
});
|
|
156
177
|
const artifacts = scopedHostArtifacts(
|
|
157
178
|
response,
|
|
158
179
|
`sevro.semantic${suffix}.`,
|
|
159
|
-
this.effects.artifactRefs,
|
|
180
|
+
this.effects.evidence.artifactRefs,
|
|
160
181
|
this.input.declaredChecks,
|
|
161
182
|
`sevro.semantic.verdicts${suffix}`,
|
|
162
183
|
);
|
|
163
184
|
return { result: response, artifacts, source, hostId: host.id };
|
|
164
|
-
} catch {
|
|
165
|
-
|
|
185
|
+
} catch (cause) {
|
|
186
|
+
if (cause instanceof HostDiagnosticPersistenceError) throw cause;
|
|
187
|
+
this.failGrading("semantic grading did not complete");
|
|
166
188
|
return { result: null, artifacts: [], source, hostId: null };
|
|
167
|
-
} finally {
|
|
168
|
-
await rm(workspace, { recursive: true, force: true });
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
private async retainSemanticVerdicts(
|
|
173
|
-
result: HostResult,
|
|
174
|
-
suffix: string,
|
|
175
|
-
): Promise<void> {
|
|
176
|
-
if (
|
|
177
|
-
result.finalMessage !== null &&
|
|
178
|
-
Buffer.byteLength(result.finalMessage, "utf8") <= 1024 * 1024
|
|
179
|
-
) {
|
|
180
|
-
const bytes = Buffer.from(result.finalMessage, "utf8");
|
|
181
|
-
const path = join(
|
|
182
|
-
this.input.runDir,
|
|
183
|
-
`trial-${this.input.trial}-semantic-verdicts${suffix}.json`,
|
|
184
|
-
);
|
|
185
|
-
await this.effects.writeTrialFile(path, bytes);
|
|
186
|
-
this.effects.artifactRefs.push({
|
|
187
|
-
id: `sevro.semantic.verdicts${suffix}`,
|
|
188
|
-
path: pathToFileURL(path).href,
|
|
189
|
-
sha256: sha256(bytes),
|
|
190
|
-
});
|
|
191
189
|
}
|
|
192
190
|
}
|
|
193
191
|
|
|
@@ -223,14 +221,19 @@ class SemanticGrading {
|
|
|
223
221
|
pattern: string | undefined,
|
|
224
222
|
source: Record<string, unknown>,
|
|
225
223
|
hostId: string,
|
|
226
|
-
):
|
|
224
|
+
): boolean {
|
|
227
225
|
try {
|
|
228
226
|
const message = this.completeSemanticGraderMessage(result);
|
|
229
227
|
const verdicts = parseSemanticVerdicts(message, group);
|
|
230
228
|
for (const verdict of verdicts)
|
|
231
229
|
this.recordSemanticVerdict(verdict, pattern, source, hostId);
|
|
230
|
+
return true;
|
|
232
231
|
} catch {
|
|
233
|
-
this.
|
|
232
|
+
this.failGrading(
|
|
233
|
+
result.failureMessage ?? "semantic grading did not complete",
|
|
234
|
+
result.processFailure?.reason === "cancelled",
|
|
235
|
+
);
|
|
236
|
+
return false;
|
|
234
237
|
}
|
|
235
238
|
}
|
|
236
239
|
|
|
@@ -243,7 +246,7 @@ class SemanticGrading {
|
|
|
243
246
|
private async gradeSemanticGroup(group: SemanticGroup): Promise<void> {
|
|
244
247
|
const pattern = group[0].artifactPath;
|
|
245
248
|
const suffix = semanticGroupSuffix(pattern);
|
|
246
|
-
if (
|
|
249
|
+
if (this.failure) return;
|
|
247
250
|
const message = this.input.message;
|
|
248
251
|
if (message === null) {
|
|
249
252
|
this.checks.push(
|
|
@@ -257,29 +260,44 @@ class SemanticGrading {
|
|
|
257
260
|
return;
|
|
258
261
|
}
|
|
259
262
|
const workspace = await this.semanticWorkspace();
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
263
|
+
let successful = false;
|
|
264
|
+
try {
|
|
265
|
+
const outcome = await this.runSemanticHost(
|
|
266
|
+
group,
|
|
267
|
+
pattern,
|
|
268
|
+
suffix,
|
|
269
|
+
workspace,
|
|
270
|
+
message,
|
|
271
|
+
);
|
|
272
|
+
if (outcome.result === null) return;
|
|
273
|
+
await this.effects.evidence.retainArtifacts(outcome.artifacts);
|
|
274
|
+
this.observations.push({
|
|
275
|
+
id: `sevro.observation.semantic.usage${suffix}`,
|
|
276
|
+
source: outcome.hostId,
|
|
277
|
+
completeness: outcome.result.usageComplete ? "complete" : "partial",
|
|
278
|
+
data: usage(outcome.result),
|
|
279
|
+
});
|
|
280
|
+
await this.effects.evidence.retainSemanticVerdicts(
|
|
281
|
+
outcome.result.finalMessage,
|
|
282
|
+
suffix,
|
|
283
|
+
);
|
|
284
|
+
successful = this.parseSemanticResults(
|
|
285
|
+
outcome.result,
|
|
286
|
+
group,
|
|
287
|
+
pattern,
|
|
288
|
+
outcome.source,
|
|
289
|
+
outcome.hostId,
|
|
290
|
+
);
|
|
291
|
+
} finally {
|
|
292
|
+
await this.finishWorkspace(workspace, successful);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
private async finishWorkspace(
|
|
296
|
+
workspace: string,
|
|
297
|
+
successful: boolean,
|
|
298
|
+
): Promise<void> {
|
|
299
|
+
if (successful) await clearFixtureContents(workspace);
|
|
300
|
+
else await this.effects.retainWorkspace(workspace);
|
|
283
301
|
}
|
|
284
302
|
}
|
|
285
303
|
export async function gradeSemanticChecks(
|