@tiangong-ai/cli 0.0.59 → 0.0.61

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 (104) hide show
  1. package/AGENTS.md +2 -2
  2. package/README.md +287 -41
  3. package/dist/research/orchestration.js +209 -62
  4. package/dist/research/orchestration.js.map +1 -1
  5. package/dist/research/workspace/acquisition-forecast.d.ts +3 -0
  6. package/dist/research/workspace/acquisition-forecast.js +28 -3
  7. package/dist/research/workspace/acquisition-forecast.js.map +1 -1
  8. package/dist/research/workspace/acquisition-revision.d.ts +13 -0
  9. package/dist/research/workspace/acquisition-revision.js +142 -0
  10. package/dist/research/workspace/acquisition-revision.js.map +1 -0
  11. package/dist/research/workspace/acquisition-routes.d.ts +1 -1
  12. package/dist/research/workspace/acquisition-routes.js +2 -11
  13. package/dist/research/workspace/acquisition-routes.js.map +1 -1
  14. package/dist/research/workspace/acquisition.d.ts +3 -1
  15. package/dist/research/workspace/acquisition.js +67 -35
  16. package/dist/research/workspace/acquisition.js.map +1 -1
  17. package/dist/research/workspace/analysis-run.d.ts +2 -0
  18. package/dist/research/workspace/analysis-run.js +28 -0
  19. package/dist/research/workspace/analysis-run.js.map +1 -0
  20. package/dist/research/workspace/artifact-read-audit.d.ts +16 -0
  21. package/dist/research/workspace/artifact-read-audit.js +176 -0
  22. package/dist/research/workspace/artifact-read-audit.js.map +1 -0
  23. package/dist/research/workspace/artifact-trace.d.ts +12 -0
  24. package/dist/research/workspace/artifact-trace.js +109 -0
  25. package/dist/research/workspace/artifact-trace.js.map +1 -0
  26. package/dist/research/workspace/artifact-view-mcp.d.ts +75 -0
  27. package/dist/research/workspace/artifact-view-mcp.js +214 -0
  28. package/dist/research/workspace/artifact-view-mcp.js.map +1 -0
  29. package/dist/research/workspace/artifact-views.d.ts +100 -0
  30. package/dist/research/workspace/artifact-views.js +395 -0
  31. package/dist/research/workspace/artifact-views.js.map +1 -0
  32. package/dist/research/workspace/artifacts.d.ts +3 -0
  33. package/dist/research/workspace/artifacts.js +13 -0
  34. package/dist/research/workspace/artifacts.js.map +1 -1
  35. package/dist/research/workspace/audit-bundle.d.ts +9 -0
  36. package/dist/research/workspace/audit-bundle.js +124 -8
  37. package/dist/research/workspace/audit-bundle.js.map +1 -1
  38. package/dist/research/workspace/content-evidence.d.ts +3 -0
  39. package/dist/research/workspace/content-evidence.js +149 -22
  40. package/dist/research/workspace/content-evidence.js.map +1 -1
  41. package/dist/research/workspace/executor.d.ts +5 -1
  42. package/dist/research/workspace/executor.js +106 -22
  43. package/dist/research/workspace/executor.js.map +1 -1
  44. package/dist/research/workspace/native-run.d.ts +77 -0
  45. package/dist/research/workspace/native-run.js +637 -0
  46. package/dist/research/workspace/native-run.js.map +1 -0
  47. package/dist/research/workspace/preflight.d.ts +8 -2
  48. package/dist/research/workspace/preflight.js +17 -14
  49. package/dist/research/workspace/preflight.js.map +1 -1
  50. package/dist/research/workspace/project-authority.d.ts +21 -0
  51. package/dist/research/workspace/project-authority.js +186 -0
  52. package/dist/research/workspace/project-authority.js.map +1 -0
  53. package/dist/research/workspace/project-mutations.d.ts +26 -0
  54. package/dist/research/workspace/project-mutations.js +332 -0
  55. package/dist/research/workspace/project-mutations.js.map +1 -0
  56. package/dist/research/workspace/projects.d.ts +2 -1
  57. package/dist/research/workspace/projects.js +133 -91
  58. package/dist/research/workspace/projects.js.map +1 -1
  59. package/dist/research/workspace/publication-workflow.d.ts +3 -0
  60. package/dist/research/workspace/publication-workflow.js +15 -3
  61. package/dist/research/workspace/publication-workflow.js.map +1 -1
  62. package/dist/research/workspace/request-provenance.d.ts +67 -0
  63. package/dist/research/workspace/request-provenance.js +115 -0
  64. package/dist/research/workspace/request-provenance.js.map +1 -0
  65. package/dist/research/workspace/review-executor.js +22 -11
  66. package/dist/research/workspace/review-executor.js.map +1 -1
  67. package/dist/research/workspace/runtime.d.ts +57 -0
  68. package/dist/research/workspace/runtime.js +292 -140
  69. package/dist/research/workspace/runtime.js.map +1 -1
  70. package/dist/research/workspace/sanitization.js +1 -1
  71. package/dist/research/workspace/sanitization.js.map +1 -1
  72. package/dist/research/workspace/schema-compatibility.d.ts +5 -0
  73. package/dist/research/workspace/schema-compatibility.js +55 -0
  74. package/dist/research/workspace/schema-compatibility.js.map +1 -0
  75. package/dist/research/workspace/schemas.d.ts +6 -0
  76. package/dist/research/workspace/schemas.js +13 -2
  77. package/dist/research/workspace/schemas.js.map +1 -1
  78. package/dist/research/workspace/scientific-design.js +8 -17
  79. package/dist/research/workspace/scientific-design.js.map +1 -1
  80. package/dist/research/workspace/scientific-fulfillment-audit.d.ts +3 -0
  81. package/dist/research/workspace/scientific-fulfillment-audit.js +137 -0
  82. package/dist/research/workspace/scientific-fulfillment-audit.js.map +1 -0
  83. package/dist/research/workspace/scientific-fulfillment.d.ts +121 -0
  84. package/dist/research/workspace/scientific-fulfillment.js +539 -0
  85. package/dist/research/workspace/scientific-fulfillment.js.map +1 -0
  86. package/dist/research/workspace/scientific-review-execution.js +84 -61
  87. package/dist/research/workspace/scientific-review-execution.js.map +1 -1
  88. package/dist/research/workspace/scientific-review.d.ts +8 -2
  89. package/dist/research/workspace/scientific-review.js +205 -53
  90. package/dist/research/workspace/scientific-review.js.map +1 -1
  91. package/dist/research/workspace/setup-catalog.js +2 -2
  92. package/dist/research/workspace/task-acceptance.d.ts +134 -0
  93. package/dist/research/workspace/task-acceptance.js +544 -0
  94. package/dist/research/workspace/task-acceptance.js.map +1 -0
  95. package/dist/research/workspace/task-audit.d.ts +12 -0
  96. package/dist/research/workspace/task-audit.js +231 -0
  97. package/dist/research/workspace/task-audit.js.map +1 -0
  98. package/dist/research/workspace/task-contract.d.ts +142 -0
  99. package/dist/research/workspace/task-contract.js +506 -0
  100. package/dist/research/workspace/task-contract.js.map +1 -0
  101. package/dist/research/workspace/types.d.ts +6 -3
  102. package/dist/research/workspace/workspace.js +11 -8
  103. package/dist/research/workspace/workspace.js.map +1 -1
  104. package/package.json +1 -1
@@ -0,0 +1,506 @@
1
+ import { Ajv2020 } from "ajv/dist/2020.js";
2
+ import { lstat, mkdir, readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { CliError } from "../../errors.js";
5
+ import { loadBoundAcquisitionDesign } from "./acquisition-routes.js";
6
+ import { appendJournalEvent, readVerifiedJournal } from "./journal.js";
7
+ import { assertProjectAuthority, projectAuthorityIndex } from "./project-authority.js";
8
+ import { beginProjectMutation, prepareProjectMutation, projectMutationBinding, settleProjectMutation, } from "./project-mutations.js";
9
+ import { loadProject } from "./projects.js";
10
+ import { prepareRequestProvenance, requestProvenanceInputSchema, unrecordedRequestProvenance, verifyRequestProvenance, } from "./request-provenance.js";
11
+ import { configuredResearchSecrets, sanitizeResearchValue } from "./sanitization.js";
12
+ import { canonicalJson, isObject, pathExists, sha256Text, workspacePaths, writeJsonAtomic, } from "./storage.js";
13
+ import { withWorkspaceLock } from "./workspace.js";
14
+ const HASH = /^[a-f0-9]{64}$/;
15
+ const ID = "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$";
16
+ const MAX_BYTES = 4 * 1024 * 1024;
17
+ const object = (properties) => ({
18
+ type: "object",
19
+ additionalProperties: false,
20
+ required: Object.keys(properties),
21
+ properties,
22
+ });
23
+ const ids = {
24
+ type: "array",
25
+ maxItems: 256,
26
+ uniqueItems: true,
27
+ items: { type: "string", pattern: ID },
28
+ };
29
+ const requirement = object({
30
+ id: { type: "string", pattern: ID },
31
+ text: { type: "string", minLength: 8, maxLength: 2000 },
32
+ acceptance: { type: "string", minLength: 8, maxLength: 4000 },
33
+ checkKind: { enum: ["evidence", "computation", "proof"] },
34
+ designClaimIds: ids,
35
+ coverageDimensionIds: ids,
36
+ });
37
+ const requirements = { type: "array", minItems: 1, maxItems: 256, items: requirement };
38
+ const inputSchemas = {
39
+ "task-contract": {
40
+ ...object({
41
+ schemaVersion: { const: 1 },
42
+ originalRequest: { type: "string", minLength: 8 },
43
+ requirements,
44
+ requestProvenance: requestProvenanceInputSchema,
45
+ }),
46
+ required: ["schemaVersion", "originalRequest", "requirements"],
47
+ },
48
+ "task-scope-change": object({
49
+ schemaVersion: { const: 1 },
50
+ reason: { type: "string", minLength: 8, maxLength: 4000 },
51
+ requirements,
52
+ }),
53
+ };
54
+ const ajv = new Ajv2020({ strict: false, allErrors: true });
55
+ const validators = new Map();
56
+ export function latestTaskBinding(events, projectId) {
57
+ const latest = events.findLast((event) => event.scope === projectId &&
58
+ (["project.task.defined", "project.task.scope.approved"].includes(event.type) ||
59
+ (["project.forked", "project.addendum.created"].includes(event.type) &&
60
+ isObject(event.payload.taskContract))));
61
+ return latest
62
+ ? isObject(latest.payload.taskContract)
63
+ ? latest.payload.taskContract
64
+ : latest.payload
65
+ : null;
66
+ }
67
+ export function isTaskSchemaName(value) {
68
+ return Object.hasOwn(inputSchemas, value);
69
+ }
70
+ export function taskInputSchema(name) {
71
+ return structuredClone({
72
+ $schema: "https://json-schema.org/draft/2020-12/schema",
73
+ $id: `urn:tiangong:research:${name}:v1`,
74
+ ...inputSchemas[name],
75
+ });
76
+ }
77
+ function validateInput(name, value) {
78
+ const validate = validators.get(name) ?? ajv.compile(taskInputSchema(name));
79
+ validators.set(name, validate);
80
+ if (Buffer.byteLength(JSON.stringify(value) ?? "") > MAX_BYTES ||
81
+ !validate(value) ||
82
+ !isObject(value) ||
83
+ canonicalJson(sanitizeResearchValue(value, configuredResearchSecrets(process.env))) !==
84
+ canonicalJson(value)) {
85
+ throw invalid("Task input must match its closed schema and contain no credentials.");
86
+ }
87
+ const items = value.requirements;
88
+ if (new Set(items.map((item) => item.id)).size !== items.length ||
89
+ items.some((item) => item.text.trim().length < 8 || item.acceptance.trim().length < 8)) {
90
+ throw invalid("Task requirements need unique stable IDs and meaningful acceptance conditions.");
91
+ }
92
+ return value;
93
+ }
94
+ export function taskRequirementSha256(item) {
95
+ return sha256Text(canonicalJson(item));
96
+ }
97
+ export async function loadProjectTask(root, projectId, knownEvents) {
98
+ if (knownEvents === undefined &&
99
+ !(await pathExists(join(workspacePaths(root).projects, projectId, "task"))))
100
+ return null;
101
+ const events = (knownEvents ?? (await readVerifiedJournal(workspacePaths(root).journal))).filter((event) => event.scope === projectId);
102
+ const binding = latestTaskBinding(events, projectId);
103
+ if (!binding)
104
+ return null;
105
+ const history = await loadTaskHistory(projectId, String(binding.contractSha256), (group, hash, hashField) => readTaskObject(root, projectId, group, hash, hashField));
106
+ return { ...history, events };
107
+ }
108
+ /** Shared live/audit relationship validation over already hash-verified immutable objects. */
109
+ export async function loadTaskHistory(projectId, currentHash, read) {
110
+ const readContract = async (hash) => validateTaskContract(await read("contracts", hash, "contractSha256"));
111
+ const current = await readContract(currentHash);
112
+ if (current.projectId !== projectId)
113
+ throw invalid("Current task contract belongs to another project.");
114
+ const contracts = [current];
115
+ const seen = new Set([current.contractSha256]);
116
+ let cursor = current;
117
+ while (cursor.parentContractSha256) {
118
+ if (seen.has(cursor.parentContractSha256) || contracts.length >= 1000)
119
+ throw invalid("Task history is cyclic or exceeds its bound.");
120
+ const parent = await readContract(cursor.parentContractSha256);
121
+ if (cursor.version !== parent.version + 1 ||
122
+ cursor.originalRequest !== parent.originalRequest ||
123
+ canonicalJson(cursor.requestProvenance ?? unrecordedRequestProvenance()) !==
124
+ canonicalJson(parent.requestProvenance ?? unrecordedRequestProvenance()) ||
125
+ (cursor.projectId !== parent.projectId &&
126
+ (cursor.origin?.projectId !== parent.projectId ||
127
+ cursor.origin.contractSha256 !== parent.contractSha256))) {
128
+ throw invalid("Task history parent identity is inconsistent.");
129
+ }
130
+ contracts.push(parent);
131
+ seen.add(parent.contractSha256);
132
+ cursor = parent;
133
+ }
134
+ const original = contracts.at(-1);
135
+ await verifyRequestProvenance(original.originalRequest, original.requestProvenance, read);
136
+ if (current.originalContractSha256 !== null &&
137
+ current.originalContractSha256 !== original.contractSha256)
138
+ throw invalid("Task original requirement binding drifted.");
139
+ for (const contract of contracts) {
140
+ if (!contract.authorization)
141
+ continue;
142
+ const proposal = await read("proposals", contract.authorization.proposalSha256, "proposalSha256");
143
+ if (proposal.parentContractSha256 !== contract.parentContractSha256 ||
144
+ canonicalJson(proposal.requirements) !== canonicalJson(contract.requirements))
145
+ throw invalid("Task scope authorization does not bind this exact change.");
146
+ }
147
+ return { current, original, contracts };
148
+ }
149
+ export async function defineProjectTask(root, projectId, value) {
150
+ const input = validateInput("task-contract", value);
151
+ const provenance = prepareRequestProvenance(input.originalRequest, input.requestProvenance);
152
+ return withWorkspaceLock(root, "research.task.define", async () => {
153
+ const project = await loadProject(root, projectId);
154
+ const events = await readVerifiedJournal(workspacePaths(root).journal);
155
+ assertProjectAuthority(project, projectAuthorityIndex(events));
156
+ const existing = await loadProjectTask(root, projectId, events);
157
+ if (existing) {
158
+ if (existing.original.originalRequest !== input.originalRequest ||
159
+ canonicalJson(existing.original.requestProvenance ?? unrecordedRequestProvenance()) !==
160
+ canonicalJson(provenance.binding) ||
161
+ canonicalJson(existing.original.requirements) !== canonicalJson(input.requirements))
162
+ throw invalid("Original requirements cannot be overwritten; propose an explicit scope change.");
163
+ return taskBinding(existing.current, existing.original);
164
+ }
165
+ await assertTaskWindow(root, project, true);
166
+ await validateTaskBindings(root, project, input.requirements);
167
+ const contract = bindContract({
168
+ schemaVersion: 1,
169
+ kind: "tiangong-research-task",
170
+ projectId,
171
+ version: 1,
172
+ questionSha256: sha256Text(project.question),
173
+ originalRequest: input.originalRequest,
174
+ requestProvenance: provenance.binding,
175
+ requirements: input.requirements,
176
+ parentContractSha256: null,
177
+ originalContractSha256: null,
178
+ origin: null,
179
+ authorization: null,
180
+ });
181
+ if (provenance.sourceObject) {
182
+ await writeTaskObject(root, projectId, "request-sources", provenance.sourceObject.objectSha256, provenance.sourceObject);
183
+ }
184
+ await writeTaskObject(root, projectId, "contracts", contract.contractSha256, contract);
185
+ await appendJournalEvent(workspacePaths(root).journal, "project.task.defined", projectId, taskBinding(contract, contract));
186
+ return taskBinding(contract, contract);
187
+ });
188
+ }
189
+ export async function proposeProjectTaskScope(root, projectId, expectedContractSha256, value) {
190
+ const input = validateInput("task-scope-change", value);
191
+ return withWorkspaceLock(root, "research.task.scope.propose", async () => {
192
+ const project = await loadProject(root, projectId);
193
+ const events = await readVerifiedJournal(workspacePaths(root).journal);
194
+ assertProjectAuthority(project, projectAuthorityIndex(events));
195
+ await assertTaskWindow(root, project, false);
196
+ const view = await requireTask(root, projectId, events);
197
+ if (view.current.contractSha256 !== expectedContractSha256)
198
+ throw scopeConflict();
199
+ const nextRequirements = input.requirements;
200
+ await validateTaskBindings(root, project, nextRequirements);
201
+ const changes = scopeChanges(view.current.requirements, nextRequirements);
202
+ if (![
203
+ changes.addedRequirementIds,
204
+ changes.changedRequirementIds,
205
+ changes.withdrawnRequirementIds,
206
+ ].some((items) => items.length)) {
207
+ return {
208
+ status: "unchanged",
209
+ requiresApproval: false,
210
+ contractSha256: view.current.contractSha256,
211
+ changes,
212
+ };
213
+ }
214
+ const core = {
215
+ schemaVersion: 1,
216
+ projectId,
217
+ parentContractSha256: expectedContractSha256,
218
+ reason: input.reason,
219
+ requirements: nextRequirements,
220
+ };
221
+ const proposal = { ...core, proposalSha256: sha256Text(canonicalJson(core)) };
222
+ await writeTaskObject(root, projectId, "proposals", proposal.proposalSha256, proposal);
223
+ if (!events.some((event) => event.scope === projectId &&
224
+ event.type === "project.task.scope.proposed" &&
225
+ event.payload.proposalSha256 === proposal.proposalSha256)) {
226
+ await appendJournalEvent(workspacePaths(root).journal, "project.task.scope.proposed", projectId, { proposalSha256: proposal.proposalSha256, parentContractSha256: expectedContractSha256 });
227
+ }
228
+ return {
229
+ status: "proposed",
230
+ requiresApproval: true,
231
+ proposalSha256: proposal.proposalSha256,
232
+ parentContractSha256: expectedContractSha256,
233
+ changes,
234
+ };
235
+ });
236
+ }
237
+ export async function approveProjectTaskScope(root, projectId, proposalSha256, confirmation) {
238
+ if (!HASH.test(proposalSha256) || confirmation !== proposalSha256) {
239
+ throw new CliError("Explicit operator authorization must name the exact reviewed scope-change hash; a producer approval field or generic continue instruction is not sufficient.", { code: "RESEARCH_TASK_SCOPE_APPROVAL_REQUIRED", exitCode: 3 });
240
+ }
241
+ return withWorkspaceLock(root, "research.task.scope.approve", async () => {
242
+ const project = await loadProject(root, projectId);
243
+ const events = await readVerifiedJournal(workspacePaths(root).journal);
244
+ assertProjectAuthority(project, projectAuthorityIndex(events));
245
+ const replay = events.find((event) => event.scope === projectId &&
246
+ event.type === "project.task.scope.approved" &&
247
+ event.payload.proposalSha256 === proposalSha256);
248
+ if (replay)
249
+ return { ...replay.payload, replayed: true };
250
+ await assertTaskWindow(root, project, false);
251
+ const view = await requireTask(root, projectId, events);
252
+ const proposal = await readTaskObject(root, projectId, "proposals", proposalSha256, "proposalSha256");
253
+ if (proposal.projectId !== projectId ||
254
+ proposal.parentContractSha256 !== view.current.contractSha256 ||
255
+ !events.some((event) => event.scope === projectId &&
256
+ event.type === "project.task.scope.proposed" &&
257
+ event.payload.proposalSha256 === proposalSha256))
258
+ throw scopeConflict();
259
+ validateInput("task-scope-change", {
260
+ schemaVersion: 1,
261
+ reason: proposal.reason,
262
+ requirements: proposal.requirements,
263
+ });
264
+ await validateTaskBindings(root, project, proposal.requirements);
265
+ const contract = bindContract({
266
+ ...view.current,
267
+ version: view.current.version + 1,
268
+ requirements: proposal.requirements,
269
+ parentContractSha256: view.current.contractSha256,
270
+ originalContractSha256: view.original.contractSha256,
271
+ authorization: { kind: "operator-confirmation", proposalSha256 },
272
+ });
273
+ await writeTaskObject(root, projectId, "contracts", contract.contractSha256, contract);
274
+ const binding = {
275
+ projectId,
276
+ ...taskBinding(contract, view.original),
277
+ proposalSha256,
278
+ authorizationKind: "operator-confirmation",
279
+ };
280
+ if (project.scientificDesign) {
281
+ let mutation = await beginProjectMutation(root, "task-scope", project, proposalSha256);
282
+ try {
283
+ const invalidatedScientificReviews = Object.entries(project.scientificDesign.gates)
284
+ .filter(([, gate]) => gate.packetSha256 !== null)
285
+ .map(([role, gate]) => ({ role, packetSha256: gate.packetSha256 }));
286
+ for (const role of ["research-design", "evidence-construct", "pilot-methods"]) {
287
+ project.scientificDesign.gates[role] = {
288
+ status: "pending",
289
+ packetSha256: null,
290
+ assessmentSha256: null,
291
+ reviewSha256: null,
292
+ reviewerSessionSha256: null,
293
+ };
294
+ }
295
+ project.updatedAt = new Date().toISOString();
296
+ mutation = await prepareProjectMutation(root, mutation, project);
297
+ await appendJournalEvent(workspacePaths(root).journal, "project.task.scope.approved", projectId, { ...binding, invalidatedScientificReviews, mutation: projectMutationBinding(mutation) });
298
+ await settleProjectMutation(root, mutation);
299
+ }
300
+ catch (error) {
301
+ if (!(await settleProjectMutation(root, mutation)))
302
+ throw error;
303
+ }
304
+ }
305
+ else {
306
+ await appendJournalEvent(workspacePaths(root).journal, "project.task.scope.approved", projectId, binding);
307
+ }
308
+ return { ...binding, replayed: false };
309
+ });
310
+ }
311
+ /** Materialize before a fork/addendum's existing commit; never copy completion claims. */
312
+ export async function inheritProjectTask(root, source, target) {
313
+ const view = await loadProjectTask(root, source.id);
314
+ if (!view)
315
+ return null;
316
+ const requestSource = view.original.requestProvenance?.source;
317
+ if (requestSource) {
318
+ const object = await readTaskObject(root, source.id, "request-sources", requestSource.objectSha256, "objectSha256");
319
+ await writeTaskObject(root, target.id, "request-sources", object.objectSha256, object);
320
+ }
321
+ for (const contract of view.contracts) {
322
+ await writeTaskObject(root, target.id, "contracts", contract.contractSha256, contract);
323
+ if (contract.authorization) {
324
+ const proposal = await readTaskObject(root, source.id, "proposals", contract.authorization.proposalSha256, "proposalSha256");
325
+ await writeTaskObject(root, target.id, "proposals", proposal.proposalSha256, proposal);
326
+ }
327
+ }
328
+ const contract = bindContract({
329
+ ...view.current,
330
+ projectId: target.id,
331
+ questionSha256: sha256Text(target.question),
332
+ version: view.current.version + 1,
333
+ parentContractSha256: view.current.contractSha256,
334
+ originalContractSha256: view.original.contractSha256,
335
+ origin: { projectId: source.id, contractSha256: view.current.contractSha256 },
336
+ authorization: null,
337
+ });
338
+ await writeTaskObject(root, target.id, "contracts", contract.contractSha256, contract);
339
+ return taskBinding(contract, view.original);
340
+ }
341
+ export async function taskContext(root, projectId, knownEvents) {
342
+ const view = await loadProjectTask(root, projectId, knownEvents);
343
+ const active = new Set(view?.current.requirements.map(taskRequirementSha256));
344
+ return view
345
+ ? {
346
+ ...taskBinding(view.current, view.original),
347
+ originalRequest: view.original.originalRequest,
348
+ requestProvenance: view.original.requestProvenance ?? unrecordedRequestProvenance(),
349
+ requirements: view.current.requirements,
350
+ originalRequirementRefs: view.original.requirements.map((item) => ({
351
+ id: item.id,
352
+ requirementSha256: taskRequirementSha256(item),
353
+ })),
354
+ originalOnlyRequirements: view.original.requirements.filter((item) => !active.has(taskRequirementSha256(item))),
355
+ origin: view.current.origin,
356
+ executionCertified: false,
357
+ }
358
+ : null;
359
+ }
360
+ function taskBinding(current, original) {
361
+ return {
362
+ contractSha256: current.contractSha256,
363
+ originalContractSha256: original.contractSha256,
364
+ version: current.version,
365
+ };
366
+ }
367
+ function bindContract(input) {
368
+ const { contractSha256: _old, ...core } = input;
369
+ return { ...core, contractSha256: sha256Text(canonicalJson(core)) };
370
+ }
371
+ function scopeChanges(previous, next) {
372
+ const prior = new Map(previous.map((item) => [item.id, item]));
373
+ const nextById = new Map(next.map((item) => [item.id, item]));
374
+ const nextIds = new Set(next.map((item) => item.id));
375
+ return {
376
+ details: [...new Set([...prior.keys(), ...nextById.keys()])]
377
+ .filter((id) => canonicalJson(prior.get(id) ?? null) !== canonicalJson(nextById.get(id) ?? null))
378
+ .map((id) => ({ id, before: prior.get(id) ?? null, after: nextById.get(id) ?? null })),
379
+ addedRequirementIds: next.filter((item) => !prior.has(item.id)).map((item) => item.id),
380
+ changedRequirementIds: next
381
+ .filter((item) => prior.has(item.id) && canonicalJson(prior.get(item.id)) !== canonicalJson(item))
382
+ .map((item) => item.id),
383
+ withdrawnRequirementIds: previous
384
+ .filter((item) => !nextIds.has(item.id))
385
+ .map((item) => item.id),
386
+ };
387
+ }
388
+ async function assertTaskWindow(root, project, initial) {
389
+ if (project.handoff.state !== "agent-actionable" ||
390
+ project.status === "complete" ||
391
+ (initial &&
392
+ project.scientificDesign &&
393
+ Object.values(project.scientificDesign.gates).some((gate) => gate.status !== "pending" || gate.packetSha256 !== null)) ||
394
+ (await pathExists(join(workspacePaths(root).projects, project.id, "native", "active.json"))) ||
395
+ project.packages.some((item) => (initial || ["analyze", "synthesize", "review", "close"].includes(item.stage)) &&
396
+ item.attempts > 0)) {
397
+ throw new CliError("Task definition/scope changes require an idle pre-analysis boundary. Original requirements must be recorded before execution or scientific review; use a new generation for later scientific changes.", { code: "RESEARCH_TASK_WINDOW_REQUIRED", exitCode: 3 });
398
+ }
399
+ }
400
+ async function validateTaskBindings(root, project, items) {
401
+ const dimensions = new Set(project.evidenceRequirements.dimensions);
402
+ if (items.some((item) => item.coverageDimensionIds.some((id) => !dimensions.has(id))))
403
+ throw invalid("Task coverage bindings must use the existing project dimensions; task scope approval cannot rewrite evidence requirements.");
404
+ if (!project.scientificDesign && items.some((item) => item.designClaimIds.length))
405
+ throw invalid("Task design claims require a declared scientific design.");
406
+ if (project.scientificDesign) {
407
+ const claims = new Set((await loadBoundAcquisitionDesign(root, project)).claims.map((claim) => claim.id));
408
+ if (items.some((item) => item.designClaimIds.some((id) => !claims.has(id))))
409
+ throw invalid("Task requirements must bind declared scientific claims; a scope change cannot invent a new design.");
410
+ }
411
+ }
412
+ async function requireTask(root, projectId, events) {
413
+ const view = await loadProjectTask(root, projectId, events);
414
+ if (!view)
415
+ throw invalid("Define the original task before proposing a scope change.");
416
+ return view;
417
+ }
418
+ function validateTaskContract(record) {
419
+ validateInput("task-contract", {
420
+ schemaVersion: record.schemaVersion,
421
+ originalRequest: record.originalRequest,
422
+ requirements: record.requirements,
423
+ });
424
+ if (record.kind !== "tiangong-research-task" ||
425
+ !Number.isInteger(record.version) ||
426
+ record.version < 1 ||
427
+ !HASH.test(record.questionSha256) ||
428
+ (record.parentContractSha256 !== null && !HASH.test(record.parentContractSha256)) ||
429
+ (record.originalContractSha256 !== null && !HASH.test(record.originalContractSha256)) ||
430
+ (record.authorization !== null &&
431
+ (record.authorization.kind !== "operator-confirmation" ||
432
+ !HASH.test(record.authorization.proposalSha256))))
433
+ throw invalid("Stored task contract identity is invalid.");
434
+ return record;
435
+ }
436
+ export async function writeTaskObject(root, projectId, group, hash, value) {
437
+ if (!HASH.test(hash) || !/^[a-z-]+$/.test(group))
438
+ throw invalid("Task object address is invalid.");
439
+ const directory = await taskDirectory(root, projectId, group, true);
440
+ const path = join(directory, `${hash}.json`);
441
+ if (await pathExists(path)) {
442
+ const existing = await readRegularJson(path);
443
+ if (canonicalJson(existing) !== canonicalJson(value))
444
+ throw invalid("Immutable task object changed; preserved bytes were not overwritten.");
445
+ }
446
+ else
447
+ await writeJsonAtomic(path, value, 0o444);
448
+ }
449
+ export async function readTaskObject(root, projectId, group, hash, hashField) {
450
+ if (!HASH.test(hash) || !/^[a-z-]+$/.test(group))
451
+ throw invalid("Task object address is invalid.");
452
+ const directory = await taskDirectory(root, projectId, group, false);
453
+ const record = await readRegularJson(join(directory, `${hash}.json`));
454
+ return validateTaskObject(record, hash, hashField);
455
+ }
456
+ export function validateTaskObject(record, hash, hashField) {
457
+ if (!isObject(record))
458
+ throw invalid("Stored task object must be an object.");
459
+ const { [hashField]: declared, ...core } = record;
460
+ if (declared !== hash || sha256Text(canonicalJson(core)) !== hash)
461
+ throw invalid("Stored task object failed its hash binding.");
462
+ return record;
463
+ }
464
+ export async function taskDirectory(root, projectId, group, create) {
465
+ if (!/^[a-z0-9][a-z0-9-]{2,63}$/.test(projectId))
466
+ throw invalid("Task project identity is invalid.");
467
+ const paths = workspacePaths(root);
468
+ const directories = [
469
+ paths.control,
470
+ paths.projects,
471
+ join(paths.projects, projectId),
472
+ join(paths.projects, projectId, "task"),
473
+ join(paths.projects, projectId, "task", group),
474
+ ];
475
+ for (const directory of directories) {
476
+ let info = await lstat(directory).catch(() => undefined);
477
+ if (!info && create) {
478
+ await mkdir(directory, { mode: 0o700 });
479
+ info = await lstat(directory);
480
+ }
481
+ if (!info?.isDirectory() || info.isSymbolicLink())
482
+ throw invalid("Task storage must use existing regular directories without symlinks.");
483
+ }
484
+ return directories.at(-1);
485
+ }
486
+ async function readRegularJson(path) {
487
+ const info = await lstat(path).catch(() => undefined);
488
+ if (!info?.isFile() || info.isSymbolicLink() || info.size > MAX_BYTES)
489
+ throw invalid("Task record must be a bounded regular file.");
490
+ try {
491
+ return JSON.parse(await readFile(path, "utf8"));
492
+ }
493
+ catch {
494
+ throw invalid("Task record is not valid JSON.");
495
+ }
496
+ }
497
+ function invalid(message) {
498
+ return new CliError(message, { code: "RESEARCH_TASK_INVALID", exitCode: 3 });
499
+ }
500
+ function scopeConflict() {
501
+ return new CliError("Task scope proposal no longer matches the current committed contract.", {
502
+ code: "RESEARCH_TASK_SCOPE_CONFLICT",
503
+ exitCode: 3,
504
+ });
505
+ }
506
+ //# sourceMappingURL=task-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-contract.js","sourceRoot":"","sources":["../../../src/research/workspace/task-contract.ts"],"names":[],"mappings":"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"}
@@ -259,6 +259,7 @@ export type ScientificGateStatus = "pending" | "prepared" | "passed" | "revision
259
259
  export interface ScientificDesignBinding {
260
260
  schemaVersion: 1;
261
261
  designSha256: string;
262
+ fulfillmentSha256?: string | null;
262
263
  objectLocator: string;
263
264
  centralStudyKind: string;
264
265
  producer: {
@@ -368,21 +369,22 @@ export interface ExecutionResult {
368
369
  isolation?: ReviewIsolationFingerprint | undefined;
369
370
  reviewAttestation?: ReviewExecutionAttestation | undefined;
370
371
  telemetry?: AgentExecutionTelemetry | undefined;
372
+ artifactReads?: import("./artifact-views.js").ArtifactReadReceipt[];
371
373
  }
372
374
  export interface ReviewIsolationFingerprint {
373
375
  provider: "sandbox-exec" | "bubblewrap";
374
376
  policySha256: string;
375
377
  readScopes: Array<"platform-runtime" | "agent-runtime" | "private-capsule">;
376
378
  writeScopes: ["private-capsule"];
377
- networkPolicy: "reviewer-provider-only";
378
- toolPolicy: "none";
379
+ networkPolicy: "reviewer-provider-only" | "reviewer-provider-and-local-artifacts";
380
+ toolPolicy: "none" | "packet-read";
379
381
  }
380
382
  export interface ReviewExecutionAttestation {
381
383
  schemaVersion: 1;
382
384
  protocolVersion: 1;
383
385
  transport: "sandbox-bridge";
384
386
  isolationProvider: ReviewIsolationFingerprint["provider"];
385
- toolPolicy: "none";
387
+ toolPolicy: "none" | "packet-read";
386
388
  workspaceId: string;
387
389
  requestId: string;
388
390
  requestSha256: string;
@@ -399,6 +401,7 @@ export interface AgentExecutionTelemetry {
399
401
  eventCounts: Record<string, number>;
400
402
  itemCounts: Record<string, number>;
401
403
  toolCalls: number;
404
+ packetReadViolations?: number;
402
405
  providerTurns: number | null;
403
406
  reasoningOutputTokens: number;
404
407
  providerErrors: string[];
@@ -1,12 +1,14 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { lstat, mkdir, readdir, rm, writeFile } from "node:fs/promises";
3
- import { basename, isAbsolute, join } from "node:path";
3
+ import { basename, isAbsolute, join, resolve } from "node:path";
4
4
  import { CliError } from "../../errors.js";
5
5
  import { loadCapabilityDeclarations, verifyCapabilities } from "./capabilities.js";
6
6
  import { packageVersion, RESEARCH_PACKAGE_NAME, RESEARCH_PROTOCOL_VERSION } from "./constants.js";
7
7
  import { inspectResearchContext, isWorkspaceMarker } from "./context.js";
8
8
  import { inspectCapabilityCredentialEnvironment } from "./credentials.js";
9
9
  import { appendJournalEvent, verifyJournal } from "./journal.js";
10
+ import { readProjectAuthorityIndex, visibleProjectIds } from "./project-authority.js";
11
+ import { recoverProjectMutations } from "./project-mutations.js";
10
12
  import { loadProjectEvidenceReceipts } from "./evidence.js";
11
13
  import { executeAgent, fingerprintAgentRoute } from "./executor.js";
12
14
  import { doctorExternalCapabilities, hasPublicInternetCapability } from "./external-skills.js";
@@ -868,6 +870,7 @@ export async function withWorkspaceLock(root, operation, callback) {
868
870
  recoveryOperation: operation,
869
871
  });
870
872
  }
873
+ await recoverProjectMutations(root);
871
874
  return await callback();
872
875
  }
873
876
  finally {
@@ -897,14 +900,14 @@ export async function requireCurrentRuntimeLock(root, knownMarker) {
897
900
  return lock;
898
901
  }
899
902
  async function readProjectStates(projectsPath) {
900
- const entries = await readdir(projectsPath, { withFileTypes: true });
903
+ const root = resolve(projectsPath, "..", "..");
904
+ const authority = await readProjectAuthorityIndex(root);
905
+ const ids = await visibleProjectIds(root, authority);
901
906
  const states = [];
902
- for (const entry of entries) {
903
- if (!entry.isDirectory() || entry.isSymbolicLink())
904
- continue;
905
- const state = await readJsonFile(join(projectsPath, entry.name, "project.json"), `Project ${entry.name}`);
906
- if (!isProjectStateShape(state) || state.id !== entry.name) {
907
- throw new Error(`project ${entry.name} has an unsupported state shape`);
907
+ for (const id of ids) {
908
+ const state = await readJsonFile(join(projectsPath, id, "project.json"), "Project " + id);
909
+ if (!isProjectStateShape(state) || state.id !== id) {
910
+ throw new Error("project " + id + " has an unsupported state shape");
908
911
  }
909
912
  states.push(state);
910
913
  }