@ramplab/generator 0.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.
- package/LICENSE +21 -0
- package/README.md +23 -0
- package/dist/agentSdkRunner.d.ts +64 -0
- package/dist/agentSdkRunner.d.ts.map +1 -0
- package/dist/agentSdkRunner.js +158 -0
- package/dist/agentSdkRunner.js.map +1 -0
- package/dist/assembleStage.d.ts +41 -0
- package/dist/assembleStage.d.ts.map +1 -0
- package/dist/assembleStage.js +33 -0
- package/dist/assembleStage.js.map +1 -0
- package/dist/authorStage.d.ts +123 -0
- package/dist/authorStage.d.ts.map +1 -0
- package/dist/authorStage.js +284 -0
- package/dist/authorStage.js.map +1 -0
- package/dist/cloneRepo.d.ts +72 -0
- package/dist/cloneRepo.d.ts.map +1 -0
- package/dist/cloneRepo.js +104 -0
- package/dist/cloneRepo.js.map +1 -0
- package/dist/flagship.d.ts +62 -0
- package/dist/flagship.d.ts.map +1 -0
- package/dist/flagship.js +216 -0
- package/dist/flagship.js.map +1 -0
- package/dist/generateLab.d.ts +151 -0
- package/dist/generateLab.d.ts.map +1 -0
- package/dist/generateLab.js +291 -0
- package/dist/generateLab.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/intake.d.ts +31 -0
- package/dist/intake.d.ts.map +1 -0
- package/dist/intake.js +45 -0
- package/dist/intake.js.map +1 -0
- package/dist/live.d.ts +2 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +213 -0
- package/dist/live.js.map +1 -0
- package/dist/mapStage.d.ts +84 -0
- package/dist/mapStage.d.ts.map +1 -0
- package/dist/mapStage.js +241 -0
- package/dist/mapStage.js.map +1 -0
- package/dist/pass1.d.ts +85 -0
- package/dist/pass1.d.ts.map +1 -0
- package/dist/pass1.js +81 -0
- package/dist/pass1.js.map +1 -0
- package/dist/pipeline.d.ts +73 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +70 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/planStage.d.ts +141 -0
- package/dist/planStage.d.ts.map +1 -0
- package/dist/planStage.js +275 -0
- package/dist/planStage.js.map +1 -0
- package/dist/progress.d.ts +45 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +2 -0
- package/dist/progress.js.map +1 -0
- package/dist/repoCommit.d.ts +41 -0
- package/dist/repoCommit.d.ts.map +1 -0
- package/dist/repoCommit.js +84 -0
- package/dist/repoCommit.js.map +1 -0
- package/dist/repoSize.d.ts +23 -0
- package/dist/repoSize.d.ts.map +1 -0
- package/dist/repoSize.js +74 -0
- package/dist/repoSize.js.map +1 -0
- package/dist/resolveAnchors.d.ts +142 -0
- package/dist/resolveAnchors.d.ts.map +1 -0
- package/dist/resolveAnchors.js +242 -0
- package/dist/resolveAnchors.js.map +1 -0
- package/dist/verifyStage.d.ts +150 -0
- package/dist/verifyStage.d.ts.map +1 -0
- package/dist/verifyStage.js +461 -0
- package/dist/verifyStage.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { parseLabSpec, } from '@ramplab/spec';
|
|
3
|
+
import { extractJson } from './mapStage.js';
|
|
4
|
+
import { mapWithConcurrency } from './pipeline.js';
|
|
5
|
+
import { createAnchorFileCache, readAnchorRegion } from './resolveAnchors.js';
|
|
6
|
+
/**
|
|
7
|
+
* The verify stage (PLAN.md §3–§4): adversarial grounding enforcement.
|
|
8
|
+
*
|
|
9
|
+
* Anchor resolution proves a claim *points at real code*; this stage proves
|
|
10
|
+
* the claim is *true of that code*. An independent verifier agent receives
|
|
11
|
+
* each machine-generated claim together with the ACTUAL content of its
|
|
12
|
+
* anchored regions (read via the same `readAnchorRegion` that resolution
|
|
13
|
+
* fingerprints, so verifier and resolver see identical bytes) and tries to
|
|
14
|
+
* REFUTE it. Per-claim verdicts: `verified` | `refuted` | `unverifiable`,
|
|
15
|
+
* each with a reason. Anything not verified is dropped from the base spec —
|
|
16
|
+
* the overlay (human tribal knowledge) is never touched.
|
|
17
|
+
*
|
|
18
|
+
* **Batching (deliberate):** one verifier call per module, covering every
|
|
19
|
+
* claim in that module's widgets. Per-claim calls would cost one agent
|
|
20
|
+
* invocation per sentence of the lab; per-module batches keep the call count
|
|
21
|
+
* at the same order as the author fan-out (which produced the claims in the
|
|
22
|
+
* first place), keep each prompt's code context focused on one subsystem's
|
|
23
|
+
* files, and still yield strictly per-claim verdicts because the output
|
|
24
|
+
* contract demands exactly one verdict per listed claim id. Batches run in
|
|
25
|
+
* parallel under the same worker-pool/concurrency cap as authoring.
|
|
26
|
+
*
|
|
27
|
+
* **Drop semantics:** the unit of removal is the whole teachable widget —
|
|
28
|
+
* consistent with `UnitResolution` granularity in anchor resolution — with
|
|
29
|
+
* one refinement: a quiz drops only the failed question, and the quiz widget
|
|
30
|
+
* itself only when no questions remain. A module emptied by drops is removed
|
|
31
|
+
* (the spec schema demands ≥1 widget-bearing structure stays parseable) and
|
|
32
|
+
* recorded in the report.
|
|
33
|
+
*
|
|
34
|
+
* **Failure policy (consistent with the author stage):** a batch whose
|
|
35
|
+
* verifier output is still invalid after bounded retries fails the whole
|
|
36
|
+
* stage with an error naming the module — verification is a grounding
|
|
37
|
+
* guarantee, so there is no silent-skip mode. Other in-flight batches finish
|
|
38
|
+
* first so all failures are reported at once.
|
|
39
|
+
*/
|
|
40
|
+
/** Default cap on concurrent verifier agents. */
|
|
41
|
+
export const DEFAULT_VERIFY_CONCURRENCY = 4;
|
|
42
|
+
/** Raised when at least one module batch never produced valid verdicts. */
|
|
43
|
+
export class VerifyStageError extends Error {
|
|
44
|
+
failures;
|
|
45
|
+
constructor(failures) {
|
|
46
|
+
const detail = failures
|
|
47
|
+
.map((f) => `- module "${f.moduleId}" failed after ${f.attempts} attempt` +
|
|
48
|
+
`${f.attempts === 1 ? '' : 's'}:\n${indent(f.lastFailure)}`)
|
|
49
|
+
.join('\n');
|
|
50
|
+
super(`Verify stage failed: ${failures.length} module batch` +
|
|
51
|
+
`${failures.length === 1 ? '' : 'es'} did not produce valid verdicts.\n${detail}`);
|
|
52
|
+
this.name = 'VerifyStageError';
|
|
53
|
+
this.failures = failures;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function indent(text) {
|
|
57
|
+
return text
|
|
58
|
+
.split('\n')
|
|
59
|
+
.map((line) => ` ${line}`)
|
|
60
|
+
.join('\n');
|
|
61
|
+
}
|
|
62
|
+
export async function runVerifyStage(runner, repoDir, options) {
|
|
63
|
+
const concurrency = Math.max(1, options.concurrency ?? DEFAULT_VERIFY_CONCURRENCY);
|
|
64
|
+
const skip = new Set((options.flaggedUnits ?? []).map((u) => unitKey(u.moduleId, u.widgetId)));
|
|
65
|
+
const fileCache = createAnchorFileCache();
|
|
66
|
+
const batches = options.spec.base.modules
|
|
67
|
+
.map((module) => ({
|
|
68
|
+
module,
|
|
69
|
+
claims: collectModuleClaims(module).filter((claim) => !skip.has(unitKey(claim.moduleId, claim.widgetId))),
|
|
70
|
+
}))
|
|
71
|
+
.filter((batch) => batch.claims.length > 0);
|
|
72
|
+
const outcomes = await mapWithConcurrency(batches, concurrency, (batch) => verifyBatch(runner, repoDir, batch.module.id, batch.claims, {
|
|
73
|
+
model: options.model,
|
|
74
|
+
maxRetries: options.maxRetries ?? 1,
|
|
75
|
+
fileCache,
|
|
76
|
+
}));
|
|
77
|
+
let costUsd;
|
|
78
|
+
const attempts = {};
|
|
79
|
+
const claims = [];
|
|
80
|
+
const failures = [];
|
|
81
|
+
for (const outcome of outcomes) {
|
|
82
|
+
if (outcome.costUsd !== undefined) {
|
|
83
|
+
costUsd = (costUsd ?? 0) + outcome.costUsd;
|
|
84
|
+
}
|
|
85
|
+
if (outcome.attempts > 0) {
|
|
86
|
+
attempts[outcome.moduleId] = outcome.attempts;
|
|
87
|
+
}
|
|
88
|
+
if (outcome.failure !== undefined) {
|
|
89
|
+
failures.push(outcome.failure);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
claims.push(...outcome.verdicts);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (failures.length > 0) {
|
|
96
|
+
throw new VerifyStageError(failures);
|
|
97
|
+
}
|
|
98
|
+
const { spec, drops } = applyVerdicts(options.spec, claims);
|
|
99
|
+
const verified = claims.filter((c) => c.verdict === 'verified').length;
|
|
100
|
+
const report = {
|
|
101
|
+
claims,
|
|
102
|
+
drops,
|
|
103
|
+
summary: {
|
|
104
|
+
totalClaims: claims.length,
|
|
105
|
+
verified,
|
|
106
|
+
refuted: claims.filter((c) => c.verdict === 'refuted').length,
|
|
107
|
+
unverifiable: claims.filter((c) => c.verdict === 'unverifiable').length,
|
|
108
|
+
passRate: claims.length === 0 ? 1 : verified / claims.length,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
return { spec, report, attempts, costUsd };
|
|
112
|
+
}
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
// Claim extraction (one entry per machine-generated teachable statement)
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
/** Extract every claim carried by a module's widgets, in spec order. */
|
|
117
|
+
export function collectModuleClaims(module) {
|
|
118
|
+
const claims = [];
|
|
119
|
+
for (const widget of module.widgets) {
|
|
120
|
+
collectWidgetClaims(module.id, widget, claims);
|
|
121
|
+
}
|
|
122
|
+
return claims;
|
|
123
|
+
}
|
|
124
|
+
function collectWidgetClaims(moduleId, widget, out) {
|
|
125
|
+
const add = (part, claim, anchors, questionId) => {
|
|
126
|
+
out.push({
|
|
127
|
+
moduleId,
|
|
128
|
+
widgetId: widget.id,
|
|
129
|
+
claimId: `${widget.id}#${part}`,
|
|
130
|
+
claim,
|
|
131
|
+
anchors,
|
|
132
|
+
...(questionId !== undefined ? { questionId } : {}),
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
switch (widget.type) {
|
|
136
|
+
case 'callout':
|
|
137
|
+
add('body', widget.title !== undefined ? `${widget.title}: ${widget.body}` : widget.body, widget.anchors);
|
|
138
|
+
return;
|
|
139
|
+
case 'code-walkthrough':
|
|
140
|
+
widget.steps.forEach((step, index) => {
|
|
141
|
+
add(`step-${index + 1}`, `Walkthrough step ${index + 1} (excerpt lines ${step.lines.start}-${step.lines.end}): ${step.commentary.body}`, step.commentary.anchors);
|
|
142
|
+
});
|
|
143
|
+
return;
|
|
144
|
+
case 'code-figure':
|
|
145
|
+
add('caption', widget.caption.body, widget.caption.anchors);
|
|
146
|
+
return;
|
|
147
|
+
case 'quiz':
|
|
148
|
+
for (const question of widget.questions) {
|
|
149
|
+
const correct = question.options.find((o) => o.id === question.correctOptionId);
|
|
150
|
+
add(`question-${question.id}`, `Quiz question: ${question.prompt}\n` +
|
|
151
|
+
`Claimed correct answer: ${correct?.label ?? question.correctOptionId}\n` +
|
|
152
|
+
`Explanation: ${question.explanation.body}`, question.explanation.anchors, question.id);
|
|
153
|
+
}
|
|
154
|
+
return;
|
|
155
|
+
case 'system-map':
|
|
156
|
+
for (const node of widget.nodes) {
|
|
157
|
+
if (node.description !== undefined) {
|
|
158
|
+
add(`node-${node.id}`, `System-map node "${node.label}": ${node.description}`, node.anchors ?? []);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
widget.edges.forEach((edge, index) => {
|
|
162
|
+
if (edge.label !== undefined) {
|
|
163
|
+
add(`edge-${index + 1}`, `System-map edge ${edge.from} -> ${edge.to}: ${edge.label}`, edge.anchors ?? []);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
return;
|
|
167
|
+
case 'state-machine':
|
|
168
|
+
for (const state of widget.states) {
|
|
169
|
+
if (state.description !== undefined) {
|
|
170
|
+
add(`state-${state.id}`, `State "${state.label}": ${state.description.body}`, state.description.anchors);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
widget.transitions.forEach((transition, index) => {
|
|
174
|
+
if (transition.commentary !== undefined) {
|
|
175
|
+
add(`transition-${index + 1}`, `Transition ${transition.from} -> ${transition.to} on "${transition.trigger}": ${transition.commentary.body}`, transition.commentary.anchors);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
return;
|
|
179
|
+
case 'pipeline':
|
|
180
|
+
for (const stage of widget.stages) {
|
|
181
|
+
if (stage.description !== undefined) {
|
|
182
|
+
add(`stage-${stage.id}`, `Pipeline stage "${stage.label}": ${stage.description.body}`, stage.description.anchors);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return;
|
|
186
|
+
case 'data-model':
|
|
187
|
+
collectDataModelClaims(widget.nodes, [], add);
|
|
188
|
+
return;
|
|
189
|
+
case 'decision-table':
|
|
190
|
+
widget.rules.forEach((rule, index) => {
|
|
191
|
+
add(`rule-${index + 1}`, `Decision rule ${index + 1} (outcome "${rule.outcome}"): ${rule.explanation.body}`, rule.explanation.anchors);
|
|
192
|
+
});
|
|
193
|
+
if (widget.defaultOutcome?.explanation !== undefined) {
|
|
194
|
+
add('default-outcome', `Default outcome "${widget.defaultOutcome.outcome}": ${widget.defaultOutcome.explanation.body}`, widget.defaultOutcome.explanation.anchors);
|
|
195
|
+
}
|
|
196
|
+
return;
|
|
197
|
+
default:
|
|
198
|
+
assertNever(widget);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function collectDataModelClaims(nodes, path, add) {
|
|
202
|
+
for (const node of nodes) {
|
|
203
|
+
const nodePath = [...path, node.name];
|
|
204
|
+
if (node.annotation !== undefined) {
|
|
205
|
+
add(`field-${nodePath.join('.')}`, `Data-model field "${nodePath.join('.')}" (${node.type}): ${node.annotation.body}`, node.annotation.anchors);
|
|
206
|
+
}
|
|
207
|
+
if (node.children !== undefined) {
|
|
208
|
+
collectDataModelClaims(node.children, nodePath, add);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function assertNever(value) {
|
|
213
|
+
throw new Error(`verifyStage: unhandled widget shape ${JSON.stringify(value)}`);
|
|
214
|
+
}
|
|
215
|
+
async function verifyBatch(runner, repoDir, moduleId, claims, config) {
|
|
216
|
+
// Render every claim with the actual anchored code. A claim none of whose
|
|
217
|
+
// anchors can be read (possible only if the repo changed between anchor
|
|
218
|
+
// resolution and now, or under the `flag` policy misuse) is mechanically
|
|
219
|
+
// unverifiable — there is nothing to check it against.
|
|
220
|
+
const mechanical = new Map();
|
|
221
|
+
const checkable = [];
|
|
222
|
+
for (const claim of claims) {
|
|
223
|
+
const rendered = renderClaim(claim, repoDir, config.fileCache);
|
|
224
|
+
if (rendered.readableAnchors === 0) {
|
|
225
|
+
mechanical.set(claim.claimId, {
|
|
226
|
+
...claim,
|
|
227
|
+
verdict: 'unverifiable',
|
|
228
|
+
reason: `None of the claim's anchors could be read: ${rendered.problems.join('; ')}`,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
checkable.push(rendered);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
const finish = (byId, attempts, costUsd) => ({
|
|
236
|
+
moduleId,
|
|
237
|
+
verdicts: claims.map((claim) => {
|
|
238
|
+
const verdict = mechanical.get(claim.claimId) ?? byId.get(claim.claimId);
|
|
239
|
+
/* v8 ignore next 3 -- parseVerdicts guarantees full coverage */
|
|
240
|
+
if (verdict === undefined) {
|
|
241
|
+
throw new Error(`verifyStage: missing verdict for claim "${claim.claimId}"`);
|
|
242
|
+
}
|
|
243
|
+
return verdict;
|
|
244
|
+
}),
|
|
245
|
+
attempts,
|
|
246
|
+
costUsd,
|
|
247
|
+
});
|
|
248
|
+
if (checkable.length === 0) {
|
|
249
|
+
return finish(new Map(), 0, undefined);
|
|
250
|
+
}
|
|
251
|
+
const basePrompt = buildVerifyPrompt(moduleId, checkable);
|
|
252
|
+
const maxAttempts = 1 + Math.max(0, config.maxRetries);
|
|
253
|
+
let costUsd;
|
|
254
|
+
let lastFailure = 'no attempt was made';
|
|
255
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
256
|
+
const prompt = attempt === 1 ? basePrompt : `${basePrompt}\n\n${retryPreamble(lastFailure)}`;
|
|
257
|
+
const response = await runner.runStage({
|
|
258
|
+
stage: 'verify',
|
|
259
|
+
model: config.model,
|
|
260
|
+
repoDir,
|
|
261
|
+
prompt,
|
|
262
|
+
attempt,
|
|
263
|
+
});
|
|
264
|
+
if (response.costUsd !== undefined) {
|
|
265
|
+
costUsd = (costUsd ?? 0) + response.costUsd;
|
|
266
|
+
}
|
|
267
|
+
const outcome = parseVerdicts(response.output, checkable.map((c) => c.claim));
|
|
268
|
+
if (outcome.ok) {
|
|
269
|
+
return finish(outcome.byId, attempt, costUsd);
|
|
270
|
+
}
|
|
271
|
+
lastFailure = outcome.failure;
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
moduleId,
|
|
275
|
+
verdicts: [],
|
|
276
|
+
attempts: maxAttempts,
|
|
277
|
+
costUsd,
|
|
278
|
+
failure: { moduleId, attempts: maxAttempts, lastFailure },
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
// ---------------------------------------------------------------------------
|
|
282
|
+
// Verifier output contract
|
|
283
|
+
// ---------------------------------------------------------------------------
|
|
284
|
+
const verdictEntrySchema = z.object({
|
|
285
|
+
claimId: z.string().min(1),
|
|
286
|
+
verdict: z.enum(['verified', 'refuted', 'unverifiable']),
|
|
287
|
+
reason: z.string().min(1, 'every verdict needs a non-empty reason'),
|
|
288
|
+
});
|
|
289
|
+
const verifyResponseSchema = z.object({
|
|
290
|
+
verdicts: z.array(verdictEntrySchema),
|
|
291
|
+
});
|
|
292
|
+
/**
|
|
293
|
+
* Parse the verifier's text as the verdict payload and enforce exact claim
|
|
294
|
+
* coverage: one verdict per listed claim id — no omissions, extras, or
|
|
295
|
+
* duplicates. Any problem becomes a `failure` string feeding the retry.
|
|
296
|
+
*/
|
|
297
|
+
function parseVerdicts(output, claims) {
|
|
298
|
+
const json = extractJson(output);
|
|
299
|
+
if (json === undefined) {
|
|
300
|
+
return { ok: false, failure: 'The output did not contain a parseable JSON object.' };
|
|
301
|
+
}
|
|
302
|
+
const parsed = verifyResponseSchema.safeParse(json);
|
|
303
|
+
if (!parsed.success) {
|
|
304
|
+
return { ok: false, failure: z.prettifyError(parsed.error) };
|
|
305
|
+
}
|
|
306
|
+
const claimsById = new Map(claims.map((claim) => [claim.claimId, claim]));
|
|
307
|
+
const byId = new Map();
|
|
308
|
+
const problems = [];
|
|
309
|
+
for (const entry of parsed.data.verdicts) {
|
|
310
|
+
const claim = claimsById.get(entry.claimId);
|
|
311
|
+
if (claim === undefined) {
|
|
312
|
+
problems.push(`verdict for unknown claim id "${entry.claimId}"`);
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
if (byId.has(entry.claimId)) {
|
|
316
|
+
problems.push(`duplicate verdict for claim id "${entry.claimId}"`);
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
byId.set(entry.claimId, { ...claim, verdict: entry.verdict, reason: entry.reason });
|
|
320
|
+
}
|
|
321
|
+
for (const claim of claims) {
|
|
322
|
+
if (!byId.has(claim.claimId)) {
|
|
323
|
+
problems.push(`missing verdict for claim id "${claim.claimId}"`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (problems.length > 0) {
|
|
327
|
+
return {
|
|
328
|
+
ok: false,
|
|
329
|
+
failure: `The verdicts must cover exactly the listed claim ids:\n${problems.map((p) => `- ${p}`).join('\n')}`,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
return { ok: true, byId };
|
|
333
|
+
}
|
|
334
|
+
function renderClaim(claim, repoDir, fileCache) {
|
|
335
|
+
const parts = [
|
|
336
|
+
`### Claim ${claim.claimId}`,
|
|
337
|
+
`Widget: "${claim.widgetId}"`,
|
|
338
|
+
`Claim: ${claim.claim}`,
|
|
339
|
+
];
|
|
340
|
+
let readableAnchors = 0;
|
|
341
|
+
const problems = [];
|
|
342
|
+
claim.anchors.forEach((anchor, index) => {
|
|
343
|
+
const where = [
|
|
344
|
+
anchor.file,
|
|
345
|
+
anchor.lines !== undefined ? `lines ${anchor.lines.start}-${anchor.lines.end}` : undefined,
|
|
346
|
+
anchor.symbol !== undefined ? `symbol "${anchor.symbol}"` : undefined,
|
|
347
|
+
]
|
|
348
|
+
.filter((part) => part !== undefined)
|
|
349
|
+
.join(', ');
|
|
350
|
+
const region = readAnchorRegion(anchor, repoDir, fileCache);
|
|
351
|
+
if (region.kind === 'ok') {
|
|
352
|
+
readableAnchors += 1;
|
|
353
|
+
parts.push(`Anchor ${index + 1} — ${where}:`, '```', region.text, '```');
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
problems.push(region.detail);
|
|
357
|
+
parts.push(`Anchor ${index + 1} — ${where}: could not be read (${region.detail})`);
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
return { claim, text: parts.join('\n'), readableAnchors, problems };
|
|
361
|
+
}
|
|
362
|
+
function retryPreamble(failure) {
|
|
363
|
+
return (`IMPORTANT — your previous attempt was rejected because it did not ` +
|
|
364
|
+
`validate against the verdict schema:\n\n${failure}\n\n` +
|
|
365
|
+
`Fix these problems and respond again with ONLY the corrected JSON object.`);
|
|
366
|
+
}
|
|
367
|
+
function buildVerifyPrompt(moduleId, rendered) {
|
|
368
|
+
return `You are the adversarial verifier for a codebase onboarding lab about the repository in your working directory. A previous authoring pass produced the claims below; your job is to try to REFUTE each one against the code it cites.
|
|
369
|
+
|
|
370
|
+
Each claim is followed by the ACTUAL content of every code region its anchors point at, read directly from the repository. Judge the claim against that code. You may use the read-only tools available to you (Read, Glob, Grep) to examine surrounding context, but the cited code is the evidence that counts. Do not modify anything.
|
|
371
|
+
|
|
372
|
+
Be skeptical — a claim earns "verified" only if the anchored code actually substantiates it:
|
|
373
|
+
- "verified": the anchored code substantiates the claim.
|
|
374
|
+
- "refuted": the anchored code contradicts the claim (wrong behavior, wrong name, wrong direction, wrong answer).
|
|
375
|
+
- "unverifiable": the anchored code neither supports nor contradicts the claim — it is about something else, or the claim asserts things the code cannot show.
|
|
376
|
+
|
|
377
|
+
Claims from module "${moduleId}":
|
|
378
|
+
|
|
379
|
+
${rendered.map((r) => r.text).join('\n\n')}
|
|
380
|
+
|
|
381
|
+
When you are done, respond with ONLY a single JSON object (no prose before or after) with exactly this shape:
|
|
382
|
+
|
|
383
|
+
{
|
|
384
|
+
"verdicts": [
|
|
385
|
+
{ "claimId": "<claim id from above>", "verdict": "verified" | "refuted" | "unverifiable", "reason": "<1-2 sentences>" }
|
|
386
|
+
]
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
Hard requirements — the JSON is machine-validated and rejected on any violation:
|
|
390
|
+
- Exactly one verdict per claim id listed above: no omissions, no extras, no duplicates, ids copied verbatim.
|
|
391
|
+
- "verdict" is exactly one of "verified", "refuted", "unverifiable".
|
|
392
|
+
- "reason" is non-empty: for "verified", name what in the code substantiates the claim; for "refuted" or "unverifiable", say precisely why. Claims that are not verified are dropped from the lab, and your reasons are shown to the lab's maintainer.`;
|
|
393
|
+
}
|
|
394
|
+
// ---------------------------------------------------------------------------
|
|
395
|
+
// Applying verdicts (drops + structural cleanup)
|
|
396
|
+
// ---------------------------------------------------------------------------
|
|
397
|
+
/**
|
|
398
|
+
* Remove every unit with a non-verified claim, without mutating the input:
|
|
399
|
+
* quiz questions individually (the quiz widget only when emptied), whole
|
|
400
|
+
* widgets otherwise, and modules that end up widget-less. The overlay is
|
|
401
|
+
* untouched. The result is revalidated through `parseLabSpec` — the same
|
|
402
|
+
* single validation path the assemble stage uses.
|
|
403
|
+
*/
|
|
404
|
+
function applyVerdicts(spec, claims) {
|
|
405
|
+
const failedByUnit = new Map();
|
|
406
|
+
for (const claim of claims) {
|
|
407
|
+
if (claim.verdict === 'verified')
|
|
408
|
+
continue;
|
|
409
|
+
const key = unitKey(claim.moduleId, claim.widgetId);
|
|
410
|
+
const list = failedByUnit.get(key) ?? [];
|
|
411
|
+
list.push(claim);
|
|
412
|
+
failedByUnit.set(key, list);
|
|
413
|
+
}
|
|
414
|
+
const drops = { widgets: [], questions: [], modules: [] };
|
|
415
|
+
const out = structuredClone(spec);
|
|
416
|
+
for (const module of out.base.modules) {
|
|
417
|
+
module.widgets = module.widgets.filter((widget) => {
|
|
418
|
+
const failures = failedByUnit.get(unitKey(module.id, widget.id));
|
|
419
|
+
if (failures === undefined)
|
|
420
|
+
return true;
|
|
421
|
+
const reasons = failures.map((f) => `${f.claimId}: ${f.verdict} — ${f.reason}`);
|
|
422
|
+
if (widget.type === 'quiz') {
|
|
423
|
+
const failedQuestions = new Map(failures.map((f) => [f.questionId, f]));
|
|
424
|
+
widget.questions = widget.questions.filter((question) => {
|
|
425
|
+
const failure = failedQuestions.get(question.id);
|
|
426
|
+
if (failure === undefined)
|
|
427
|
+
return true;
|
|
428
|
+
drops.questions.push({
|
|
429
|
+
moduleId: module.id,
|
|
430
|
+
widgetId: widget.id,
|
|
431
|
+
questionId: question.id,
|
|
432
|
+
reason: `${failure.verdict} — ${failure.reason}`,
|
|
433
|
+
});
|
|
434
|
+
return false;
|
|
435
|
+
});
|
|
436
|
+
if (widget.questions.length > 0)
|
|
437
|
+
return true;
|
|
438
|
+
// Every question failed: the widget itself goes.
|
|
439
|
+
drops.widgets.push({ moduleId: module.id, widgetId: widget.id, reasons });
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
drops.widgets.push({ moduleId: module.id, widgetId: widget.id, reasons });
|
|
443
|
+
return false;
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
drops.modules = out.base.modules
|
|
447
|
+
.filter((module) => module.widgets.length === 0)
|
|
448
|
+
.map((module) => module.id);
|
|
449
|
+
out.base.modules = out.base.modules.filter((module) => module.widgets.length > 0);
|
|
450
|
+
if (out.base.modules.length === 0) {
|
|
451
|
+
throw new Error('Verification dropped every module in the lab — no machine-generated claim survived. ' +
|
|
452
|
+
'Refusing to emit an empty spec; regenerate with better anchoring or review the verifier reasons in the report.');
|
|
453
|
+
}
|
|
454
|
+
// Single validation path: a JSON round-trip plus parseLabSpec guarantees
|
|
455
|
+
// the post-drop spec is exactly what a consumer would load from disk.
|
|
456
|
+
return { spec: parseLabSpec(JSON.parse(JSON.stringify(out))), drops };
|
|
457
|
+
}
|
|
458
|
+
function unitKey(moduleId, widgetId) {
|
|
459
|
+
return `${moduleId} ${widgetId}`;
|
|
460
|
+
}
|
|
461
|
+
//# sourceMappingURL=verifyStage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyStage.js","sourceRoot":"","sources":["../src/verifyStage.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ramplab/generator",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "The RampLab pipeline: reads a repository, writes an edition of it, and mechanically resolves every code anchor against the source so nothing unverifiable survives.",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"ramplab",
|
|
9
|
+
"onboarding",
|
|
10
|
+
"claude",
|
|
11
|
+
"code-analysis"
|
|
12
|
+
],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist"
|
|
21
|
+
],
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.201",
|
|
24
|
+
"zod": "^4.4.3",
|
|
25
|
+
"@ramplab/spec": "0.1.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^26.1.0",
|
|
29
|
+
"typescript": "^6.0.3",
|
|
30
|
+
"vitest": "^4.1.9"
|
|
31
|
+
},
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/ramplab/press.git"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://library.ramplab.dev/cli/",
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc -p tsconfig.build.json",
|
|
43
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
44
|
+
"test": "vitest run",
|
|
45
|
+
"live": "pnpm run build && node dist/live.js"
|
|
46
|
+
}
|
|
47
|
+
}
|