@tiangong-ai/cli 0.0.57 → 0.0.59

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 (62) hide show
  1. package/AGENTS.md +8 -2
  2. package/CONTRIBUTING.md +79 -0
  3. package/README.md +116 -3
  4. package/dist/cli.js +5 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/research/orchestration.js +96 -26
  7. package/dist/research/orchestration.js.map +1 -1
  8. package/dist/research/workspace/acquisition-forecast.d.ts +18 -0
  9. package/dist/research/workspace/acquisition-forecast.js +116 -0
  10. package/dist/research/workspace/acquisition-forecast.js.map +1 -0
  11. package/dist/research/workspace/acquisition.d.ts +13 -1
  12. package/dist/research/workspace/acquisition.js +71 -62
  13. package/dist/research/workspace/acquisition.js.map +1 -1
  14. package/dist/research/workspace/artifacts.d.ts +18 -0
  15. package/dist/research/workspace/artifacts.js +40 -2
  16. package/dist/research/workspace/artifacts.js.map +1 -1
  17. package/dist/research/workspace/content-evidence.d.ts +37 -0
  18. package/dist/research/workspace/content-evidence.js +287 -137
  19. package/dist/research/workspace/content-evidence.js.map +1 -1
  20. package/dist/research/workspace/downloads.js +2 -2
  21. package/dist/research/workspace/downloads.js.map +1 -1
  22. package/dist/research/workspace/evidence-content-schema.d.ts +14 -0
  23. package/dist/research/workspace/evidence-content-schema.js +123 -0
  24. package/dist/research/workspace/evidence-content-schema.js.map +1 -0
  25. package/dist/research/workspace/evidence-ledger.d.ts +1 -1
  26. package/dist/research/workspace/evidence-ledger.js.map +1 -1
  27. package/dist/research/workspace/evidence-role-coverage.d.ts +35 -0
  28. package/dist/research/workspace/evidence-role-coverage.js +81 -0
  29. package/dist/research/workspace/evidence-role-coverage.js.map +1 -0
  30. package/dist/research/workspace/journal.d.ts +2 -0
  31. package/dist/research/workspace/journal.js +6 -0
  32. package/dist/research/workspace/journal.js.map +1 -1
  33. package/dist/research/workspace/preflight.d.ts +2 -0
  34. package/dist/research/workspace/preflight.js +14 -5
  35. package/dist/research/workspace/preflight.js.map +1 -1
  36. package/dist/research/workspace/projects.d.ts +7 -0
  37. package/dist/research/workspace/projects.js +65 -19
  38. package/dist/research/workspace/projects.js.map +1 -1
  39. package/dist/research/workspace/review-executor.d.ts +2 -0
  40. package/dist/research/workspace/review-executor.js +69 -1
  41. package/dist/research/workspace/review-executor.js.map +1 -1
  42. package/dist/research/workspace/runtime.d.ts +8 -1
  43. package/dist/research/workspace/runtime.js +54 -28
  44. package/dist/research/workspace/runtime.js.map +1 -1
  45. package/dist/research/workspace/schemas.js +10 -2
  46. package/dist/research/workspace/schemas.js.map +1 -1
  47. package/dist/research/workspace/scientific-design.d.ts +2 -1
  48. package/dist/research/workspace/scientific-design.js +39 -2
  49. package/dist/research/workspace/scientific-design.js.map +1 -1
  50. package/dist/research/workspace/scientific-review-execution.d.ts +19 -0
  51. package/dist/research/workspace/scientific-review-execution.js +445 -0
  52. package/dist/research/workspace/scientific-review-execution.js.map +1 -0
  53. package/dist/research/workspace/scientific-review.d.ts +110 -3
  54. package/dist/research/workspace/scientific-review.js +113 -20
  55. package/dist/research/workspace/scientific-review.js.map +1 -1
  56. package/dist/research/workspace/setup-catalog.js +3 -3
  57. package/dist/research/workspace/types.d.ts +4 -1
  58. package/dist/research/workspace/types.js +14 -1
  59. package/dist/research/workspace/types.js.map +1 -1
  60. package/dist/research/workspace/workspace.js +13 -1
  61. package/dist/research/workspace/workspace.js.map +1 -1
  62. package/package.json +2 -1
@@ -0,0 +1,445 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { copyFile, lstat, mkdtemp, open, readFile, rm } from "node:fs/promises";
4
+ import { dirname, join } from "node:path";
5
+ import { CliError } from "../../errors.js";
6
+ import { verifyCapabilities } from "./capabilities.js";
7
+ import { appendJournalEvent, readVerifiedJournal } from "./journal.js";
8
+ import { calculateAgentCallTokenReservation, RESEARCH_ESTIMATED_BYTES_PER_TOKEN, researchStructuredOutputMaxTurns, reservedAgentPackageCost, } from "./preflight.js";
9
+ import { loadProject, saveProject } from "./projects.js";
10
+ import { assertResearchPolicyBinding } from "./research-policy.js";
11
+ import { createReviewExecutor } from "./review-executor.js";
12
+ import { loadPreparedScientificReview, readScientificReviewOutput, scientificReviewSchema, submitScientificReview, } from "./scientific-review.js";
13
+ import { configuredResearchSecrets, sanitizeResearchText, sanitizeResearchValue, } from "./sanitization.js";
14
+ import { canonicalJson, ensureDirectory, isObject, resolveContained, sha256File, sha256Text, workspacePaths, writeJsonAtomic, } from "./storage.js";
15
+ import { loadWorkspaceConfig, verifyDoctorAttestation, withWorkspaceLock } from "./workspace.js";
16
+ const MAX_EXECUTION_RECEIPT_BYTES = 1024 * 1024;
17
+ export async function executeScientificReview(input, executor) {
18
+ if (!input.confirmCost) {
19
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_COST_CONFIRMATION_REQUIRED", "Explicit --confirm-review-cost is required before running the independent reviewer.");
20
+ }
21
+ const prepared = await withWorkspaceLock(input.root, "scientific-review.execute", async () => {
22
+ const paths = workspacePaths(input.root);
23
+ const journal = await readVerifiedJournal(paths.journal);
24
+ const existingProject = await loadProject(input.root, input.projectId);
25
+ const existingGate = existingProject.scientificDesign?.gates[input.role];
26
+ const packetHash = existingGate?.packetSha256;
27
+ const events = journal.filter((event) => event.scope === input.projectId &&
28
+ event.payload.packetSha256 === packetHash &&
29
+ event.payload.role === input.role);
30
+ const completed = events.findLast((event) => event.type === "scientific-review.execution.completed");
31
+ if (completed) {
32
+ const receipt = await readReceipt(input.root, completed.payload.receiptLocator, completed.payload.receiptSha256, {
33
+ projectId: input.projectId,
34
+ role: input.role,
35
+ packetSha256: packetHash,
36
+ reviewerSessionSha256: existingGate?.reviewerSessionSha256,
37
+ });
38
+ return {
39
+ packetSha256: String(packetHash),
40
+ receipt,
41
+ receiptSha256: String(completed.payload.receiptSha256),
42
+ replayed: true,
43
+ };
44
+ }
45
+ const { project, packet } = await loadPreparedScientificReview(input.root, input.projectId, input.role);
46
+ const config = await loadWorkspaceConfig(input.root);
47
+ if (project.lineage.supersededBy ||
48
+ ["archived", "abandoned"].includes(project.status) ||
49
+ project.handoff.state !== "agent-actionable") {
50
+ throw executionError("RESEARCH_PROJECT_NOT_AUTHORITATIVE", "Only an active authoritative project may execute a scientific review.");
51
+ }
52
+ if (config.reviewer.agent !== packet.reviewer.agent ||
53
+ config.reviewer.agent === project.scientificDesign?.producer.agent) {
54
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEWER_MISMATCH", "The prepared packet must use the configured independent reviewer family.");
55
+ }
56
+ const capabilities = await verifyCapabilities(input.root);
57
+ if (capabilities.status !== "verified") {
58
+ throw executionError("RESEARCH_CAPABILITY_DRIFT", "Verify the locked capabilities before reviewer execution.");
59
+ }
60
+ let expectedRuntime;
61
+ if (config.mode === "production-research") {
62
+ const doctor = await verifyDoctorAttestation(input.root);
63
+ if (doctor.status !== "verified" || !doctor.attestation) {
64
+ throw executionError("RESEARCH_DOCTOR_ATTESTATION_REQUIRED", "Refresh the independent reviewer doctor attestation before production review.");
65
+ }
66
+ expectedRuntime = doctor.attestation.runtimes.find((runtime) => runtime.agent === config.reviewer.agent && runtime.model === config.reviewer.model);
67
+ if (!expectedRuntime) {
68
+ throw executionError("RESEARCH_EXECUTOR_DRIFT", "The doctor attestation does not bind the configured reviewer route.");
69
+ }
70
+ await assertResearchPolicyBinding(input.root, project.publicationPolicy);
71
+ }
72
+ const attempts = events.filter((event) => event.type === "scientific-review.execution.started").length;
73
+ if (attempts > 0 && !input.retry) {
74
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_RETRY_REQUIRED", "The previous execution did not complete. Inspect its receipt, correct the cause, then explicitly use --retry.");
75
+ }
76
+ if (attempts >= config.budget.maxAttemptsPerPackage) {
77
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_ATTEMPTS_EXHAUSTED", "The bounded scientific reviewer attempts are exhausted; do not retry automatically.");
78
+ }
79
+ const runId = randomUUID();
80
+ const capsuleParent = join(paths.runtime, "scientific-capsules");
81
+ await ensureDirectory(capsuleParent);
82
+ const capsuleRoot = await mkdtemp(join(capsuleParent, "review-"));
83
+ const capsuleProject = join(capsuleRoot, "project");
84
+ await ensureDirectory(capsuleProject);
85
+ let started = false;
86
+ let completedCall = false;
87
+ let usageBeforeReservation = null;
88
+ let callStartedAt = null;
89
+ let usageSettled = false;
90
+ try {
91
+ await copyPacketInputs(input.root, capsuleProject, packet, project.publicationPolicy);
92
+ const prompt = await scientificReviewPrompt(capsuleProject, packet, config, project.publicationPolicy);
93
+ const schema = scientificReviewSchema(input.role);
94
+ const maxTurns = researchStructuredOutputMaxTurns(config.reviewer);
95
+ const reservation = calculateAgentCallTokenReservation({
96
+ route: config.reviewer,
97
+ primaryPayloadTokens: Math.ceil(Buffer.byteLength(prompt + JSON.stringify(schema)) / RESEARCH_ESTIMATED_BYTES_PER_TOKEN),
98
+ repairPayloadTokens: 0,
99
+ maxTurns,
100
+ maxOutputTokens: config.budget.maxOutputTokens,
101
+ maxToolContextTokens: 0,
102
+ maxRepairTokens: 0,
103
+ reserveRepair: false,
104
+ }).totalTokens;
105
+ const reservedCostUsd = reservedAgentPackageCost(config.reviewer, reservation, config);
106
+ const timeoutSeconds = Math.min(config.budget.earlyScientificReviewMaxWallSeconds, config.budget.maxWallSeconds - project.usage.wallSeconds);
107
+ if (reservation > config.budget.earlyScientificReviewMaxTokens ||
108
+ reservation > config.budget.maxTokens - project.usage.tokens ||
109
+ reservedCostUsd > config.budget.maxCostUsd - project.usage.costUsd ||
110
+ timeoutSeconds <= 0) {
111
+ throw executionError("RESEARCH_BUDGET_EXCEEDED", "The independent review reservation does not fit the reviewed token, cost, or time limits.");
112
+ }
113
+ // Reserve before spawning. An interrupted call remains conservatively charged;
114
+ // a returned result replaces that reservation with measured usage.
115
+ const priorUsage = { ...project.usage };
116
+ project.usage.tokens += reservation;
117
+ project.usage.inputTokens += reservation;
118
+ project.usage.costUsd += reservedCostUsd;
119
+ project.usage.wallSeconds += timeoutSeconds;
120
+ await saveProject(input.root, project);
121
+ usageBeforeReservation = priorUsage;
122
+ await appendJournalEvent(paths.journal, "scientific-review.execution.started", project.id, {
123
+ role: input.role,
124
+ packetSha256: packet.packetSha256,
125
+ runId,
126
+ attempt: attempts + 1,
127
+ reservedTokens: reservation,
128
+ reservedCostUsd,
129
+ reservedWallSeconds: timeoutSeconds,
130
+ transport: config.reviewerExecution.transport,
131
+ });
132
+ started = true;
133
+ const execute = executor ??
134
+ createReviewExecutor({ root: input.root, execution: config.reviewerExecution }).execute;
135
+ callStartedAt = process.hrtime.bigint();
136
+ const result = await execute({
137
+ route: config.reviewer,
138
+ prompt,
139
+ outputSchema: schema,
140
+ requestId: runId,
141
+ purpose: "primary",
142
+ capsuleRoot,
143
+ projectRoot: capsuleProject,
144
+ workspaceRoot: input.root,
145
+ timeoutSeconds,
146
+ maxTurns,
147
+ maxOutputTokens: config.budget.maxOutputTokens,
148
+ maxToolContextTokens: 0,
149
+ maxCostUsd: reservedCostUsd,
150
+ expectedRuntime,
151
+ toolPolicy: "none",
152
+ brokerUrl: null,
153
+ environment: input.environment,
154
+ });
155
+ const reportedUsage = checkedUsage(result);
156
+ const usageKnown = reportedUsage.tokens > 0;
157
+ const usage = usageKnown
158
+ ? reportedUsage
159
+ : {
160
+ ...reportedUsage,
161
+ tokens: reservation,
162
+ inputTokens: reservation,
163
+ costUsd: Math.max(reportedUsage.costUsd, reservedCostUsd),
164
+ };
165
+ project.usage.tokens = priorUsage.tokens + usage.tokens;
166
+ project.usage.inputTokens = priorUsage.inputTokens + usage.inputTokens;
167
+ project.usage.cachedInputTokens = priorUsage.cachedInputTokens + usage.cachedInputTokens;
168
+ project.usage.outputTokens = priorUsage.outputTokens + usage.outputTokens;
169
+ project.usage.costUsd = priorUsage.costUsd + usage.costUsd;
170
+ project.usage.wallSeconds = priorUsage.wallSeconds + usage.wallSeconds;
171
+ await saveProject(input.root, project);
172
+ usageSettled = true;
173
+ if (result.exitCode !== 0) {
174
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_EXECUTION_FAILED", "The isolated reviewer failed. No scientific review was submitted.");
175
+ }
176
+ if (usage.tokens > reservation ||
177
+ usage.outputTokens > config.budget.maxOutputTokens ||
178
+ (config.reviewer.pricing && usage.costUsd > reservedCostUsd) ||
179
+ usage.wallSeconds > timeoutSeconds) {
180
+ throw executionError("RESEARCH_BUDGET_EXCEEDED", "The reviewer exceeded its reserved execution limit. No review was submitted.");
181
+ }
182
+ if (!result.runtime ||
183
+ result.runtime.agent !== config.reviewer.agent ||
184
+ (config.reviewer.model !== null && result.model !== config.reviewer.model) ||
185
+ result.isolation?.toolPolicy !== "none" ||
186
+ result.isolation.networkPolicy !== "reviewer-provider-only" ||
187
+ (config.reviewerExecution.transport === "sandbox-bridge" && !result.reviewAttestation)) {
188
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_EXECUTION_BINDING_INVALID", "The reviewer result does not contain the expected model, runtime, and isolation proof.");
189
+ }
190
+ const secrets = configuredResearchSecrets(input.environment);
191
+ if (sanitizeResearchText(result.stdout, secrets) !== result.stdout ||
192
+ Buffer.byteLength(result.stdout) > config.budget.maxOutputTokens * 16) {
193
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_OUTPUT_UNSAFE", "The reviewer output is unsafe or exceeds the bounded capture size.");
194
+ }
195
+ let output;
196
+ try {
197
+ output = JSON.parse(result.stdout);
198
+ }
199
+ catch {
200
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_INVALID", "The reviewer did not return schema-valid JSON. No review was submitted.");
201
+ }
202
+ if (canonicalJson(sanitizeResearchValue(output, secrets)) !== canonicalJson(output)) {
203
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_OUTPUT_UNSAFE", "The reviewer output contains sensitive material.");
204
+ }
205
+ const reviewPath = join(capsuleRoot, "review.json");
206
+ await writeJsonAtomic(reviewPath, output);
207
+ const review = await readScientificReviewOutput(reviewPath, input.role);
208
+ if (review.packetSha256 !== packet.packetSha256 ||
209
+ review.reviewerSessionSha256 !== packet.reviewer.sessionSha256) {
210
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_BINDING_INVALID", "The reviewer output does not bind the prepared packet and independent session.");
211
+ }
212
+ const reviewBytes = JSON.stringify(review, null, 2) + "\n";
213
+ const reviewSha256 = sha256Text(reviewBytes);
214
+ const reviewLocator = "projects/" + project.id + "/scientific/execution-outputs/" + reviewSha256 + ".json";
215
+ await writeJsonAtomic(resolveContained(paths.control, reviewLocator), review, 0o444);
216
+ const core = sanitizeResearchValue({
217
+ schemaVersion: 1,
218
+ projectId: project.id,
219
+ role: input.role,
220
+ packetSha256: packet.packetSha256,
221
+ reviewerSessionSha256: packet.reviewer.sessionSha256,
222
+ runId,
223
+ attempt: attempts + 1,
224
+ transport: config.reviewerExecution.transport,
225
+ reviewerAgent: config.reviewer.agent,
226
+ model: result.model,
227
+ reviewLocator,
228
+ reviewSha256,
229
+ usage,
230
+ accountingMode: usageKnown ? "measured" : "reserved-unknown-usage",
231
+ runtime: result.runtime,
232
+ isolation: result.isolation,
233
+ reviewAttestation: result.reviewAttestation ?? null,
234
+ stdoutSha256: sha256Text(result.stdout),
235
+ stderrSha256: sha256Text(result.stderr),
236
+ }, secrets);
237
+ const receiptSha256 = sha256Text(JSON.stringify(core, null, 2) + "\n");
238
+ const receiptLocator = "projects/" + project.id + "/scientific/execution-receipts/" + receiptSha256 + ".json";
239
+ await writeJsonAtomic(resolveContained(paths.control, receiptLocator), core, 0o444);
240
+ await appendJournalEvent(paths.journal, "scientific-review.execution.completed", project.id, {
241
+ role: input.role,
242
+ packetSha256: packet.packetSha256,
243
+ runId,
244
+ receiptLocator,
245
+ receiptSha256,
246
+ reviewSha256,
247
+ });
248
+ completedCall = true;
249
+ return { packetSha256: packet.packetSha256, receipt: core, receiptSha256, replayed: false };
250
+ }
251
+ catch (error) {
252
+ if (usageBeforeReservation && !usageSettled) {
253
+ // A live process can measure elapsed time even if the executor throws.
254
+ // SIGKILL cannot reach this settlement, so the durable timeout stays reserved.
255
+ const elapsed = callStartedAt === null
256
+ ? 0
257
+ : Number(process.hrtime.bigint() - callStartedAt) / 1_000_000_000;
258
+ project.usage.wallSeconds = usageBeforeReservation.wallSeconds + elapsed;
259
+ if (callStartedAt === null) {
260
+ project.usage = { ...usageBeforeReservation };
261
+ }
262
+ await saveProject(input.root, project);
263
+ }
264
+ if (started) {
265
+ await appendJournalEvent(paths.journal, "scientific-review.execution.failed", project.id, {
266
+ role: input.role,
267
+ packetSha256: packet.packetSha256,
268
+ runId,
269
+ attempt: attempts + 1,
270
+ code: error instanceof CliError ? error.code : "RESEARCH_SCIENTIFIC_REVIEW_EXECUTION_FAILED",
271
+ capsuleDisposition: "retained-failed-execution",
272
+ });
273
+ }
274
+ if (error instanceof CliError)
275
+ throw error;
276
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_EXECUTION_FAILED", "The isolated reviewer failed. Its packet and failed execution remain available for explicit recovery.");
277
+ }
278
+ finally {
279
+ if ((completedCall || !started) &&
280
+ !["workbuddy", "codebuddy"].includes(project.scientificDesign.producer.agent)) {
281
+ await rm(capsuleRoot, { recursive: true, force: true });
282
+ }
283
+ }
284
+ });
285
+ const reviewLocator = prepared.receipt.reviewLocator;
286
+ const reviewSha256 = prepared.receipt.reviewSha256;
287
+ if (typeof reviewLocator !== "string" || typeof reviewSha256 !== "string") {
288
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_EXECUTION_BINDING_INVALID", "The execution receipt is missing its review binding.");
289
+ }
290
+ const reviewPath = resolveContained(workspacePaths(input.root).control, reviewLocator);
291
+ if ((await sha256File(reviewPath)) !== reviewSha256) {
292
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_EXECUTION_BINDING_INVALID", "The saved reviewer output drifted after execution.");
293
+ }
294
+ const submission = await submitScientificReview({
295
+ ...input,
296
+ reviewPath,
297
+ executionBinding: { packetSha256: prepared.packetSha256, reviewSha256 },
298
+ });
299
+ return {
300
+ ...submission,
301
+ packetSha256: prepared.packetSha256,
302
+ receiptSha256: prepared.receiptSha256,
303
+ replayed: prepared.replayed,
304
+ };
305
+ }
306
+ async function readReceipt(root, locator, digest, expected) {
307
+ if (typeof digest !== "string" ||
308
+ !/^[a-f0-9]{64}$/.test(digest) ||
309
+ locator !== `projects/${expected.projectId}/scientific/execution-receipts/${digest}.json`) {
310
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_EXECUTION_BINDING_INVALID", "The completed execution has invalid receipt metadata.");
311
+ }
312
+ const path = resolveContained(workspacePaths(root).control, String(locator));
313
+ const info = await lstat(path).catch(() => null);
314
+ if (!info?.isFile() || info.isSymbolicLink() || info.size > MAX_EXECUTION_RECEIPT_BYTES) {
315
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_EXECUTION_BINDING_INVALID", "The completed execution receipt failed its hash check.");
316
+ }
317
+ let value;
318
+ try {
319
+ const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
320
+ try {
321
+ const opened = await handle.stat();
322
+ if (!opened.isFile() || opened.size < 2 || opened.size > MAX_EXECUTION_RECEIPT_BYTES)
323
+ throw new Error("invalid receipt size");
324
+ const buffer = Buffer.alloc(opened.size + 1);
325
+ let length = 0;
326
+ while (length < buffer.length) {
327
+ const result = await handle.read(buffer, length, buffer.length - length, length);
328
+ if (result.bytesRead === 0)
329
+ break;
330
+ length += result.bytesRead;
331
+ }
332
+ const bytes = buffer.subarray(0, length);
333
+ if (length !== opened.size || createHash("sha256").update(bytes).digest("hex") !== digest)
334
+ throw new Error("receipt hash mismatch");
335
+ value = JSON.parse(bytes.toString("utf8"));
336
+ }
337
+ finally {
338
+ await handle.close();
339
+ }
340
+ }
341
+ catch {
342
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_EXECUTION_BINDING_INVALID", "The completed execution receipt failed its bounded snapshot check.");
343
+ }
344
+ if (!isObject(value) ||
345
+ value.schemaVersion !== 1 ||
346
+ value.projectId !== expected.projectId ||
347
+ value.role !== expected.role ||
348
+ value.packetSha256 !== expected.packetSha256 ||
349
+ value.reviewerSessionSha256 !== expected.reviewerSessionSha256 ||
350
+ typeof value.reviewSha256 !== "string" ||
351
+ !/^[a-f0-9]{64}$/.test(value.reviewSha256) ||
352
+ value.reviewLocator !==
353
+ `projects/${expected.projectId}/scientific/execution-outputs/${value.reviewSha256}.json`) {
354
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_EXECUTION_BINDING_INVALID", "The execution receipt does not match its project, packet, or review binding.");
355
+ }
356
+ return value;
357
+ }
358
+ function checkedUsage(result) {
359
+ const usage = {
360
+ tokens: result.tokens,
361
+ inputTokens: result.inputTokens,
362
+ cachedInputTokens: result.cachedInputTokens,
363
+ outputTokens: result.outputTokens,
364
+ costUsd: result.costUsd,
365
+ wallSeconds: result.wallSeconds,
366
+ };
367
+ if (Object.values(usage).some((value) => !Number.isFinite(value) || value < 0) ||
368
+ usage.tokens !== usage.inputTokens + usage.cachedInputTokens + usage.outputTokens) {
369
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_EXECUTION_BINDING_INVALID", "Reviewer usage metadata is invalid.");
370
+ }
371
+ return usage;
372
+ }
373
+ async function scientificReviewPrompt(controlRoot, packet, config, policy) {
374
+ const mandatory = [
375
+ "Review the exact prepared scientific packet independently. Tools are disabled. Read only embedded content; complete files are bound for audit but are not evidence that you read omitted bytes.",
376
+ "Return the supplied JSON schema with the exact packetSha256 and reviewerSessionSha256. A mechanical canPass=false cannot be upgraded by prose; return stop, handoff, or revise as appropriate.",
377
+ JSON.stringify(packet),
378
+ ];
379
+ for (const locator of [
380
+ packet.design.objectLocator,
381
+ packet.assessment.objectLocator,
382
+ packet.policy.objectLocator,
383
+ ...new Set(policy.documents.map((document) => document.objectLocator)),
384
+ ]) {
385
+ const path = resolveContained(controlRoot, locator);
386
+ mandatory.push("### " + locator + "\n" + (await readFile(path, "utf8")));
387
+ }
388
+ const maxBytes = config.budget.maxInputContextTokens * RESEARCH_ESTIMATED_BYTES_PER_TOKEN;
389
+ const required = mandatory.join("\n\n");
390
+ if (Buffer.byteLength(required) > maxBytes) {
391
+ throw executionError("RESEARCH_INPUT_CONTEXT_BUDGET_EXCEEDED", "Required scientific review design, policy, and assessment exceed the input context limit; revise the bounded assessment before execution.");
392
+ }
393
+ let remaining = maxBytes - Buffer.byteLength(required);
394
+ const context = [required];
395
+ for (const [index, record] of packet.stageInputs.entries()) {
396
+ const allowance = Math.max(0, Math.floor(remaining / (packet.stageInputs.length - index)) - 256);
397
+ if (!allowance)
398
+ continue;
399
+ const path = resolveContained(controlRoot, record.path);
400
+ const handle = await open(path, "r");
401
+ let text;
402
+ try {
403
+ const buffer = Buffer.alloc(Math.min(record.bytes, allowance));
404
+ const read = await handle.read(buffer, 0, buffer.length, 0);
405
+ text = buffer.subarray(0, read.bytesRead).toString("utf8");
406
+ }
407
+ finally {
408
+ await handle.close();
409
+ }
410
+ const section = "### " + record.path + " (bounded excerpt; " + record.bytes + " total file bytes)\n" + text;
411
+ const size = Buffer.byteLength(section);
412
+ if (size <= remaining) {
413
+ context.push(section);
414
+ remaining -= size;
415
+ }
416
+ }
417
+ return context.join("\n\n");
418
+ }
419
+ async function copyPacketInputs(root, capsuleProject, packet, policy) {
420
+ const paths = workspacePaths(root);
421
+ const records = new Map(packet.stageInputs.map((record) => [record.path, record.sha256]));
422
+ records.set(packet.design.objectLocator, packet.design.sha256);
423
+ records.set(packet.assessment.objectLocator, packet.assessment.sha256);
424
+ records.set(packet.policy.objectLocator, packet.policy.bindingSha256);
425
+ for (const document of policy.documents)
426
+ records.set(document.objectLocator, document.sha256);
427
+ for (const [locator, digest] of records) {
428
+ const source = resolveContained(paths.control, locator);
429
+ const info = await lstat(source).catch(() => null);
430
+ if (!info?.isFile() || info.isSymbolicLink()) {
431
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_BINDING_INVALID", "A scientific input is missing or unsafe.");
432
+ }
433
+ const target = resolveContained(capsuleProject, locator);
434
+ await ensureDirectory(dirname(target));
435
+ await copyFile(source, target, constants.COPYFILE_EXCL);
436
+ if ((await sha256File(target)) !== digest) {
437
+ throw executionError("RESEARCH_SCIENTIFIC_REVIEW_BINDING_INVALID", "A scientific input changed while staging the reviewer capsule.");
438
+ }
439
+ }
440
+ await writeJsonAtomic(join(capsuleProject, "packet.json"), packet);
441
+ }
442
+ function executionError(code, message) {
443
+ return new CliError(message, { code, exitCode: 3 });
444
+ }
445
+ //# sourceMappingURL=scientific-review-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scientific-review-execution.js","sourceRoot":"","sources":["../../../src/research/workspace/scientific-review-execution.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,109 @@
1
1
  import { nextScientificGate } from "./projects.js";
2
2
  import { type ScientificObjectKind } from "./scientific-objects.js";
3
3
  import type { AgentKind, ProjectState, ScientificReviewRole, ScientificGateStatus } from "./types.js";
4
+ type ReviewDisposition = "pass" | "revise" | "stop" | "handoff";
5
+ interface ScientificFinding {
6
+ code: string;
7
+ severity: "blocking" | "warning" | "note";
8
+ message: string;
9
+ evidenceIds: string[];
10
+ }
11
+ interface ResearchDesignAssessment {
12
+ schemaVersion: 1;
13
+ role: "research-design";
14
+ designSha256: string;
15
+ recommendation: ReviewDisposition;
16
+ checks: {
17
+ identityCoherent: boolean;
18
+ estimandObservable: boolean;
19
+ claimGraphComplete: boolean;
20
+ endpointTruthRolesCorrect: boolean;
21
+ quantityOntologyComplete: boolean;
22
+ validationSemanticsCorrect: boolean;
23
+ knownGapDispositionComplete: boolean;
24
+ lifecycleFeasible: boolean;
25
+ };
26
+ findings: ScientificFinding[];
27
+ }
28
+ interface EvidenceConstructAssessment {
29
+ schemaVersion: 1;
30
+ role: "evidence-construct";
31
+ designSha256: string;
32
+ recommendation: ReviewDisposition;
33
+ constructCanary: {
34
+ usesRealRecords: boolean;
35
+ outcomeBlind: boolean;
36
+ resultValuesInspected: boolean;
37
+ rowCount: number;
38
+ constructedEdgeIds: string[];
39
+ failedEdgeIds: string[];
40
+ artifactSha256s: string[];
41
+ };
42
+ evidenceRoleCoverage: Array<{
43
+ roleId: string;
44
+ fullTextSourceIds: string[];
45
+ independentSourceIds: string[];
46
+ datedSourceIds: string[];
47
+ peerReviewedSourceIds: string[];
48
+ dimensionIds: string[];
49
+ sourceTypes: string[];
50
+ }>;
51
+ closestWorkDispositionComplete: boolean;
52
+ centralEvidenceFitsContext: boolean;
53
+ findings: ScientificFinding[];
54
+ }
55
+ interface PilotMethodsAssessment {
56
+ schemaVersion: 1;
57
+ role: "pilot-methods";
58
+ designSha256: string;
59
+ recommendation: ReviewDisposition;
60
+ checks: {
61
+ noDataLeakage: boolean;
62
+ noCircularValidation: boolean;
63
+ endpointComparisonsCompatible: boolean;
64
+ baselineFair: boolean;
65
+ unitsAndDenominatorsVerified: boolean;
66
+ thresholdsTyped: boolean;
67
+ decisionLossMetricsComputed: boolean;
68
+ };
69
+ validationAudits: Array<{
70
+ validationPlanId: string;
71
+ outcomeBlind: boolean;
72
+ originalUnitCount: number;
73
+ independentClusterCount: number;
74
+ effectiveIndependentUnits: number;
75
+ clusterKeyIds: string[];
76
+ independenceJustification: string;
77
+ resamplingUnit: string;
78
+ resamplingIterations: number;
79
+ resamplingMethod: "exact-enumeration" | "cluster-bootstrap" | "none";
80
+ resamplingStateSpaceSize: number;
81
+ reportingPrecision: string;
82
+ minimumDetectableDifference: string | null;
83
+ independentValidationStatus: "available" | "planned" | "unavailable-scope-bounded" | "not-required";
84
+ independentValidationGapId: string | null;
85
+ }>;
86
+ decisionLossMetricIds: string[];
87
+ findings: ScientificFinding[];
88
+ }
89
+ type ScientificGateAssessment = ResearchDesignAssessment | EvidenceConstructAssessment | PilotMethodsAssessment;
90
+ interface ScientificReview {
91
+ schemaVersion: 1;
92
+ role: ScientificReviewRole;
93
+ packetSha256: string;
94
+ reviewerSessionSha256: string;
95
+ decision: ReviewDisposition;
96
+ findings: ScientificFinding[];
97
+ boundedRecommendation: string;
98
+ }
4
99
  interface ScientificMechanicalIssue {
5
100
  code: string;
6
101
  message: string;
7
102
  objectIds: string[];
8
103
  }
9
104
  interface ScientificFutureGateObligation {
10
- code: "UNCERTAINTY_STATE_VALUES_NOT_FROZEN" | "MODEL_IMPLEMENTATION_NOT_FROZEN" | "MODEL_ENVIRONMENT_LOCK_NOT_FROZEN";
11
- dueGate: "evidence-construct" | "pilot-methods";
105
+ code: "UNCERTAINTY_STATE_VALUES_NOT_FROZEN" | "MODEL_IMPLEMENTATION_NOT_FROZEN" | "MODEL_ENVIRONMENT_LOCK_NOT_FROZEN" | "POLICY_RULE_DUE_UNRESOLVED";
106
+ dueGate: "evidence-construct" | "pilot-methods" | "publication-freeze";
12
107
  objectIds: string[];
13
108
  policyRuleIds: string[];
14
109
  }
@@ -96,11 +191,23 @@ export declare function submitScientificReview(input: {
96
191
  projectId: string;
97
192
  role: ScientificReviewRole;
98
193
  reviewPath: string;
194
+ /** Internal execution recovery: exact matching terminal submissions are read-only replays. */
195
+ executionBinding?: {
196
+ packetSha256: string;
197
+ reviewSha256: string;
198
+ };
99
199
  }): Promise<{
100
200
  status: ScientificGateStatus;
101
201
  reviewSha256: string;
102
202
  issueCodes: string[];
103
203
  }>;
204
+ /** Revalidate the immutable prepared packet before an explicit isolated execution. */
205
+ export declare function loadPreparedScientificReview(root: string, projectId: string, role: ScientificReviewRole): Promise<{
206
+ project: ProjectState;
207
+ packet: ScientificReviewPacket;
208
+ assessment: ScientificGateAssessment;
209
+ }>;
210
+ export { readReview as readScientificReviewOutput };
104
211
  export declare function assertScientificGateForStage(root: string, project: ProjectState, stage: "discover" | "acquire" | "analyze" | "synthesize" | "review" | "close"): Promise<void>;
105
212
  export declare function inspectScientificReviewStatus(root: string, projectId: string): Promise<ScientificReviewStatus>;
106
- export {};
213
+ declare function readReview(path: string, role: ScientificReviewRole): Promise<ScientificReview>;