@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.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -0
  3. package/dist/agentSdkRunner.d.ts +64 -0
  4. package/dist/agentSdkRunner.d.ts.map +1 -0
  5. package/dist/agentSdkRunner.js +158 -0
  6. package/dist/agentSdkRunner.js.map +1 -0
  7. package/dist/assembleStage.d.ts +41 -0
  8. package/dist/assembleStage.d.ts.map +1 -0
  9. package/dist/assembleStage.js +33 -0
  10. package/dist/assembleStage.js.map +1 -0
  11. package/dist/authorStage.d.ts +123 -0
  12. package/dist/authorStage.d.ts.map +1 -0
  13. package/dist/authorStage.js +284 -0
  14. package/dist/authorStage.js.map +1 -0
  15. package/dist/cloneRepo.d.ts +72 -0
  16. package/dist/cloneRepo.d.ts.map +1 -0
  17. package/dist/cloneRepo.js +104 -0
  18. package/dist/cloneRepo.js.map +1 -0
  19. package/dist/flagship.d.ts +62 -0
  20. package/dist/flagship.d.ts.map +1 -0
  21. package/dist/flagship.js +216 -0
  22. package/dist/flagship.js.map +1 -0
  23. package/dist/generateLab.d.ts +151 -0
  24. package/dist/generateLab.d.ts.map +1 -0
  25. package/dist/generateLab.js +291 -0
  26. package/dist/generateLab.js.map +1 -0
  27. package/dist/index.d.ts +22 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +21 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/intake.d.ts +31 -0
  32. package/dist/intake.d.ts.map +1 -0
  33. package/dist/intake.js +45 -0
  34. package/dist/intake.js.map +1 -0
  35. package/dist/live.d.ts +2 -0
  36. package/dist/live.d.ts.map +1 -0
  37. package/dist/live.js +213 -0
  38. package/dist/live.js.map +1 -0
  39. package/dist/mapStage.d.ts +84 -0
  40. package/dist/mapStage.d.ts.map +1 -0
  41. package/dist/mapStage.js +241 -0
  42. package/dist/mapStage.js.map +1 -0
  43. package/dist/pass1.d.ts +85 -0
  44. package/dist/pass1.d.ts.map +1 -0
  45. package/dist/pass1.js +81 -0
  46. package/dist/pass1.js.map +1 -0
  47. package/dist/pipeline.d.ts +73 -0
  48. package/dist/pipeline.d.ts.map +1 -0
  49. package/dist/pipeline.js +70 -0
  50. package/dist/pipeline.js.map +1 -0
  51. package/dist/planStage.d.ts +141 -0
  52. package/dist/planStage.d.ts.map +1 -0
  53. package/dist/planStage.js +275 -0
  54. package/dist/planStage.js.map +1 -0
  55. package/dist/progress.d.ts +45 -0
  56. package/dist/progress.d.ts.map +1 -0
  57. package/dist/progress.js +2 -0
  58. package/dist/progress.js.map +1 -0
  59. package/dist/repoCommit.d.ts +41 -0
  60. package/dist/repoCommit.d.ts.map +1 -0
  61. package/dist/repoCommit.js +84 -0
  62. package/dist/repoCommit.js.map +1 -0
  63. package/dist/repoSize.d.ts +23 -0
  64. package/dist/repoSize.d.ts.map +1 -0
  65. package/dist/repoSize.js +74 -0
  66. package/dist/repoSize.js.map +1 -0
  67. package/dist/resolveAnchors.d.ts +142 -0
  68. package/dist/resolveAnchors.d.ts.map +1 -0
  69. package/dist/resolveAnchors.js +242 -0
  70. package/dist/resolveAnchors.js.map +1 -0
  71. package/dist/verifyStage.d.ts +150 -0
  72. package/dist/verifyStage.d.ts.map +1 -0
  73. package/dist/verifyStage.js +461 -0
  74. package/dist/verifyStage.js.map +1 -0
  75. 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
+ }