@tiangong-ai/cli 0.0.60 → 0.0.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +17 -6
- package/README.md +577 -55
- package/dist/data/builtins.js +33 -5
- package/dist/data/builtins.js.map +1 -1
- package/dist/data/catalog.js +46 -0
- package/dist/data/catalog.js.map +1 -1
- package/dist/data/commands.js +15 -1
- package/dist/data/commands.js.map +1 -1
- package/dist/data/connectors/airnow-hourly-observations.js +60 -10
- package/dist/data/connectors/airnow-hourly-observations.js.map +1 -1
- package/dist/data/connectors/epa-eis-records.js +16 -2
- package/dist/data/connectors/epa-eis-records.js.map +1 -1
- package/dist/data/connectors/gdelt-doc-search.js +54 -18
- package/dist/data/connectors/gdelt-doc-search.js.map +1 -1
- package/dist/data/connectors/gdelt-file-feeds.js +20 -11
- package/dist/data/connectors/gdelt-file-feeds.js.map +1 -1
- package/dist/data/connectors/gdelt-web-ngrams.d.ts +2 -0
- package/dist/data/connectors/gdelt-web-ngrams.js +350 -0
- package/dist/data/connectors/gdelt-web-ngrams.js.map +1 -0
- package/dist/data/connectors/gdelt-web-ngrams.schemas.d.ts +188 -0
- package/dist/data/connectors/gdelt-web-ngrams.schemas.js +138 -0
- package/dist/data/connectors/gdelt-web-ngrams.schemas.js.map +1 -0
- package/dist/data/connectors/nasa-firms-fire.js +4 -0
- package/dist/data/connectors/nasa-firms-fire.js.map +1 -1
- package/dist/data/connectors/open-meteo-air-quality.js +27 -22
- package/dist/data/connectors/open-meteo-air-quality.js.map +1 -1
- package/dist/data/connectors/open-meteo-air-quality.schemas.d.ts +4 -1
- package/dist/data/connectors/open-meteo-air-quality.schemas.js +21 -1
- package/dist/data/connectors/open-meteo-air-quality.schemas.js.map +1 -1
- package/dist/data/connectors/open-meteo-flood.js +28 -23
- package/dist/data/connectors/open-meteo-flood.js.map +1 -1
- package/dist/data/connectors/open-meteo-flood.schemas.d.ts +4 -1
- package/dist/data/connectors/open-meteo-flood.schemas.js +21 -1
- package/dist/data/connectors/open-meteo-flood.schemas.js.map +1 -1
- package/dist/data/connectors/open-meteo-historical-weather.js +26 -21
- package/dist/data/connectors/open-meteo-historical-weather.js.map +1 -1
- package/dist/data/connectors/open-meteo-historical-weather.schemas.d.ts +4 -1
- package/dist/data/connectors/open-meteo-historical-weather.schemas.js +21 -1
- package/dist/data/connectors/open-meteo-historical-weather.schemas.js.map +1 -1
- package/dist/data/connectors/openaq-air-quality.js +50 -12
- package/dist/data/connectors/openaq-air-quality.js.map +1 -1
- package/dist/data/connectors/openaq-air-quality.schemas.d.ts +0 -4
- package/dist/data/connectors/openaq-air-quality.schemas.js +2 -2
- package/dist/data/connectors/openaq-air-quality.schemas.js.map +1 -1
- package/dist/data/connectors/youtube-public-content.js +76 -6
- package/dist/data/connectors/youtube-public-content.js.map +1 -1
- package/dist/data/connectors/youtube-public-content.schemas.d.ts +63 -3
- package/dist/data/connectors/youtube-public-content.schemas.js +56 -2
- package/dist/data/connectors/youtube-public-content.schemas.js.map +1 -1
- package/dist/data/contracts.d.ts +22 -1
- package/dist/data/runtime/bounded-http.d.ts +2 -0
- package/dist/data/runtime/bounded-http.js +221 -59
- package/dist/data/runtime/bounded-http.js.map +1 -1
- package/dist/data/runtime/execute.d.ts +2 -0
- package/dist/data/runtime/execute.js +82 -60
- package/dist/data/runtime/execute.js.map +1 -1
- package/dist/data/runtime/http-timing.d.ts +15 -0
- package/dist/data/runtime/http-timing.js +59 -0
- package/dist/data/runtime/http-timing.js.map +1 -0
- package/dist/data/runtime/http-transport.d.ts +1 -0
- package/dist/data/runtime/http-transport.js +27 -0
- package/dist/data/runtime/http-transport.js.map +1 -0
- package/dist/data/schemas/catalog.v1.json +46 -0
- package/dist/data/schemas/discovery.v1.json +12 -0
- package/dist/data/schemas/error.v1.json +1 -0
- package/dist/data/schemas/manifest.v1.json +19 -1
- package/dist/research/orchestration.js +341 -28
- package/dist/research/orchestration.js.map +1 -1
- package/dist/research/setup-command.js +37 -6
- package/dist/research/setup-command.js.map +1 -1
- package/dist/research/workspace/acquisition-routes.d.ts +1 -1
- package/dist/research/workspace/acquisition-routes.js +2 -11
- package/dist/research/workspace/acquisition-routes.js.map +1 -1
- package/dist/research/workspace/artifact-read-audit.d.ts +16 -0
- package/dist/research/workspace/artifact-read-audit.js +176 -0
- package/dist/research/workspace/artifact-read-audit.js.map +1 -0
- package/dist/research/workspace/artifact-trace.d.ts +12 -0
- package/dist/research/workspace/artifact-trace.js +109 -0
- package/dist/research/workspace/artifact-trace.js.map +1 -0
- package/dist/research/workspace/artifact-view-mcp.d.ts +75 -0
- package/dist/research/workspace/artifact-view-mcp.js +214 -0
- package/dist/research/workspace/artifact-view-mcp.js.map +1 -0
- package/dist/research/workspace/artifact-views.d.ts +100 -0
- package/dist/research/workspace/artifact-views.js +395 -0
- package/dist/research/workspace/artifact-views.js.map +1 -0
- package/dist/research/workspace/audit-bundle.d.ts +4 -0
- package/dist/research/workspace/audit-bundle.js +130 -11
- package/dist/research/workspace/audit-bundle.js.map +1 -1
- package/dist/research/workspace/broker.js +25 -4
- package/dist/research/workspace/broker.js.map +1 -1
- package/dist/research/workspace/constants.d.ts +1 -0
- package/dist/research/workspace/constants.js +1 -0
- package/dist/research/workspace/constants.js.map +1 -1
- package/dist/research/workspace/content-evidence.d.ts +1 -0
- package/dist/research/workspace/content-evidence.js +1 -1
- package/dist/research/workspace/content-evidence.js.map +1 -1
- package/dist/research/workspace/credentials.js +2 -1
- package/dist/research/workspace/credentials.js.map +1 -1
- package/dist/research/workspace/data-evidence-adapter.d.ts +71 -0
- package/dist/research/workspace/data-evidence-adapter.js +269 -59
- package/dist/research/workspace/data-evidence-adapter.js.map +1 -1
- package/dist/research/workspace/data-evidence-view.d.ts +58 -0
- package/dist/research/workspace/data-evidence-view.js +411 -0
- package/dist/research/workspace/data-evidence-view.js.map +1 -0
- package/dist/research/workspace/evidence-ledger.js +32 -29
- package/dist/research/workspace/evidence-ledger.js.map +1 -1
- package/dist/research/workspace/evidence.d.ts +28 -0
- package/dist/research/workspace/evidence.js +48 -0
- package/dist/research/workspace/evidence.js.map +1 -1
- package/dist/research/workspace/executor.d.ts +32 -2
- package/dist/research/workspace/executor.js +286 -42
- package/dist/research/workspace/executor.js.map +1 -1
- package/dist/research/workspace/investigation-attempt.d.ts +159 -0
- package/dist/research/workspace/investigation-attempt.js +619 -0
- package/dist/research/workspace/investigation-attempt.js.map +1 -0
- package/dist/research/workspace/investigation-audit.d.ts +20 -0
- package/dist/research/workspace/investigation-audit.js +306 -0
- package/dist/research/workspace/investigation-audit.js.map +1 -0
- package/dist/research/workspace/investigation-candidate.d.ts +84 -0
- package/dist/research/workspace/investigation-candidate.js +156 -0
- package/dist/research/workspace/investigation-candidate.js.map +1 -0
- package/dist/research/workspace/investigation-certification.d.ts +39 -0
- package/dist/research/workspace/investigation-certification.js +152 -0
- package/dist/research/workspace/investigation-certification.js.map +1 -0
- package/dist/research/workspace/investigation-close.d.ts +47 -0
- package/dist/research/workspace/investigation-close.js +153 -0
- package/dist/research/workspace/investigation-close.js.map +1 -0
- package/dist/research/workspace/investigation-lineage.d.ts +8 -0
- package/dist/research/workspace/investigation-lineage.js +10 -0
- package/dist/research/workspace/investigation-lineage.js.map +1 -0
- package/dist/research/workspace/investigation-observer.d.ts +22 -0
- package/dist/research/workspace/investigation-observer.js +122 -0
- package/dist/research/workspace/investigation-observer.js.map +1 -0
- package/dist/research/workspace/investigation-promotion.d.ts +129 -0
- package/dist/research/workspace/investigation-promotion.js +316 -0
- package/dist/research/workspace/investigation-promotion.js.map +1 -0
- package/dist/research/workspace/investigation-requirements.d.ts +5 -0
- package/dist/research/workspace/investigation-requirements.js +32 -0
- package/dist/research/workspace/investigation-requirements.js.map +1 -0
- package/dist/research/workspace/investigation-resources.d.ts +12 -0
- package/dist/research/workspace/investigation-resources.js +78 -0
- package/dist/research/workspace/investigation-resources.js.map +1 -0
- package/dist/research/workspace/investigation-source-export.d.ts +6 -0
- package/dist/research/workspace/investigation-source-export.js +68 -0
- package/dist/research/workspace/investigation-source-export.js.map +1 -0
- package/dist/research/workspace/investigation-store.d.ts +9 -0
- package/dist/research/workspace/investigation-store.js +55 -0
- package/dist/research/workspace/investigation-store.js.map +1 -0
- package/dist/research/workspace/investigation.d.ts +424 -0
- package/dist/research/workspace/investigation.js +716 -0
- package/dist/research/workspace/investigation.js.map +1 -0
- package/dist/research/workspace/native-process-supervisor.d.ts +1 -0
- package/dist/research/workspace/native-process-supervisor.js +97 -0
- package/dist/research/workspace/native-process-supervisor.js.map +1 -0
- package/dist/research/workspace/native-run.d.ts +150 -0
- package/dist/research/workspace/native-run.js +879 -0
- package/dist/research/workspace/native-run.js.map +1 -0
- package/dist/research/workspace/preflight.d.ts +11 -2
- package/dist/research/workspace/preflight.js +28 -20
- package/dist/research/workspace/preflight.js.map +1 -1
- package/dist/research/workspace/project-authority.js +2 -0
- package/dist/research/workspace/project-authority.js.map +1 -1
- package/dist/research/workspace/project-budget.d.ts +41 -0
- package/dist/research/workspace/project-budget.js +265 -0
- package/dist/research/workspace/project-budget.js.map +1 -0
- package/dist/research/workspace/project-mutations.d.ts +1 -1
- package/dist/research/workspace/project-mutations.js +29 -3
- package/dist/research/workspace/project-mutations.js.map +1 -1
- package/dist/research/workspace/projects.d.ts +66 -0
- package/dist/research/workspace/projects.js +182 -3
- package/dist/research/workspace/projects.js.map +1 -1
- package/dist/research/workspace/provider-budget.d.ts +3 -0
- package/dist/research/workspace/provider-budget.js +45 -0
- package/dist/research/workspace/provider-budget.js.map +1 -0
- package/dist/research/workspace/provider-state.d.ts +1 -0
- package/dist/research/workspace/provider-state.js +20 -0
- package/dist/research/workspace/provider-state.js.map +1 -0
- package/dist/research/workspace/publication-lineage.d.ts +34 -0
- package/dist/research/workspace/publication-lineage.js +165 -0
- package/dist/research/workspace/publication-lineage.js.map +1 -0
- package/dist/research/workspace/publication-workflow.d.ts +24 -0
- package/dist/research/workspace/publication-workflow.js +118 -14
- package/dist/research/workspace/publication-workflow.js.map +1 -1
- package/dist/research/workspace/request-provenance.d.ts +67 -0
- package/dist/research/workspace/request-provenance.js +115 -0
- package/dist/research/workspace/request-provenance.js.map +1 -0
- package/dist/research/workspace/review-executor.d.ts +6 -1
- package/dist/research/workspace/review-executor.js +39 -14
- package/dist/research/workspace/review-executor.js.map +1 -1
- package/dist/research/workspace/runtime.d.ts +64 -1
- package/dist/research/workspace/runtime.js +359 -112
- package/dist/research/workspace/runtime.js.map +1 -1
- package/dist/research/workspace/sanitization.js +1 -1
- package/dist/research/workspace/sanitization.js.map +1 -1
- package/dist/research/workspace/schema-compatibility.d.ts +5 -0
- package/dist/research/workspace/schema-compatibility.js +55 -0
- package/dist/research/workspace/schema-compatibility.js.map +1 -0
- package/dist/research/workspace/scientific-amendment.d.ts +103 -0
- package/dist/research/workspace/scientific-amendment.js +537 -0
- package/dist/research/workspace/scientific-amendment.js.map +1 -0
- package/dist/research/workspace/scientific-design.js +8 -17
- package/dist/research/workspace/scientific-design.js.map +1 -1
- package/dist/research/workspace/scientific-fulfillment-audit.d.ts +21 -0
- package/dist/research/workspace/scientific-fulfillment-audit.js +217 -0
- package/dist/research/workspace/scientific-fulfillment-audit.js.map +1 -0
- package/dist/research/workspace/scientific-fulfillment.d.ts +130 -0
- package/dist/research/workspace/scientific-fulfillment.js +553 -0
- package/dist/research/workspace/scientific-fulfillment.js.map +1 -0
- package/dist/research/workspace/scientific-review-execution.js +236 -75
- package/dist/research/workspace/scientific-review-execution.js.map +1 -1
- package/dist/research/workspace/scientific-review.d.ts +6 -1
- package/dist/research/workspace/scientific-review.js +228 -52
- package/dist/research/workspace/scientific-review.js.map +1 -1
- package/dist/research/workspace/setup-catalog.js +3 -3
- package/dist/research/workspace/setup-release.d.ts +22 -0
- package/dist/research/workspace/setup-release.js +426 -0
- package/dist/research/workspace/setup-release.js.map +1 -0
- package/dist/research/workspace/setup-runtime-integrity.d.ts +2 -0
- package/dist/research/workspace/setup-runtime-integrity.js +31 -0
- package/dist/research/workspace/setup-runtime-integrity.js.map +1 -0
- package/dist/research/workspace/setup-upgrade.d.ts +17 -0
- package/dist/research/workspace/setup-upgrade.js +784 -0
- package/dist/research/workspace/setup-upgrade.js.map +1 -0
- package/dist/research/workspace/setup.d.ts +31 -39
- package/dist/research/workspace/setup.js +220 -17
- package/dist/research/workspace/setup.js.map +1 -1
- package/dist/research/workspace/task-acceptance.d.ts +17 -2
- package/dist/research/workspace/task-acceptance.js +106 -10
- package/dist/research/workspace/task-acceptance.js.map +1 -1
- package/dist/research/workspace/task-audit.d.ts +5 -1
- package/dist/research/workspace/task-audit.js +70 -5
- package/dist/research/workspace/task-audit.js.map +1 -1
- package/dist/research/workspace/task-contract.d.ts +4 -1
- package/dist/research/workspace/task-contract.js +26 -5
- package/dist/research/workspace/task-contract.js.map +1 -1
- package/dist/research/workspace/types.d.ts +50 -3
- package/dist/research/workspace/workspace.js +34 -4
- package/dist/research/workspace/workspace.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
import { Ajv2020 } from "ajv/dist/2020.js";
|
|
2
|
+
import { lstat, mkdir, readFile } from "node:fs/promises";
|
|
3
|
+
import { isAbsolute, join } from "node:path";
|
|
4
|
+
import { CliError } from "../../errors.js";
|
|
5
|
+
import { appendJournalEvent, readVerifiedJournal } from "./journal.js";
|
|
6
|
+
import { assertProjectAuthority, projectAuthorityIndex } from "./project-authority.js";
|
|
7
|
+
import { loadProject } from "./projects.js";
|
|
8
|
+
import { assertResearchPolicyBinding } from "./research-policy.js";
|
|
9
|
+
import { configuredResearchSecrets, sanitizeResearchValue } from "./sanitization.js";
|
|
10
|
+
import { evaluateScientificDesign } from "./scientific-design.js";
|
|
11
|
+
import { applyScientificFulfillmentRecord, loadScientificFulfillmentView, } from "./scientific-fulfillment.js";
|
|
12
|
+
import { canonicalJson, isObject, pathExists, resolveContained, sha256Text, workspacePaths, writeTextAtomic, } from "./storage.js";
|
|
13
|
+
import { beginProjectMutation, prepareProjectMutation, projectMutationBinding, settleProjectMutation, } from "./project-mutations.js";
|
|
14
|
+
import { withWorkspaceLock } from "./workspace.js";
|
|
15
|
+
const HASH = /^[a-f0-9]{64}$/;
|
|
16
|
+
const PLAN_NEXT_ACTION = "Review the exact changes and their reason. Apply requires confirmation of this plan hash and its supplied authorization source; neither proves authenticated authorship or scientific approval.";
|
|
17
|
+
/** An operation-local dependency index over the already verified design history. */
|
|
18
|
+
export function scientificAmendmentImpact(records, design) {
|
|
19
|
+
const impact = { claims: new Map(), coverage: new Map() };
|
|
20
|
+
for (const [ordinal, record] of records.entries()) {
|
|
21
|
+
const binding = { sha256: record.recordSha256, ordinal };
|
|
22
|
+
const scope = amendmentChangeScope(record.plan.changes, design);
|
|
23
|
+
for (const id of scope.claims)
|
|
24
|
+
impact.claims.set(id, binding);
|
|
25
|
+
for (const id of scope.coverage)
|
|
26
|
+
impact.coverage.set(id, binding);
|
|
27
|
+
}
|
|
28
|
+
return impact;
|
|
29
|
+
}
|
|
30
|
+
function amendmentChangeScope(changes, design) {
|
|
31
|
+
const claims = new Set();
|
|
32
|
+
const coverage = new Set();
|
|
33
|
+
const roles = new Map(design.evidenceRoles.map((role) => [role.id, role.coverageDimensionIds]));
|
|
34
|
+
for (const change of changes)
|
|
35
|
+
for (const rule of [change.before, change.after]) {
|
|
36
|
+
for (const id of rule.claimIds)
|
|
37
|
+
claims.add(id);
|
|
38
|
+
for (const id of rule.evidenceRoleIds)
|
|
39
|
+
for (const dimension of roles.get(id) ?? [])
|
|
40
|
+
coverage.add(dimension);
|
|
41
|
+
}
|
|
42
|
+
return { claims, coverage };
|
|
43
|
+
}
|
|
44
|
+
export function requirementAmendmentBinding(requirement, impact) {
|
|
45
|
+
let latest;
|
|
46
|
+
for (const binding of [
|
|
47
|
+
...requirement.designClaimIds.map((id) => impact?.claims.get(id)),
|
|
48
|
+
...requirement.coverageDimensionIds.map((id) => impact?.coverage.get(id)),
|
|
49
|
+
])
|
|
50
|
+
if (binding && (!latest || binding.ordinal > latest.ordinal))
|
|
51
|
+
latest = binding;
|
|
52
|
+
return latest?.sha256 ?? null;
|
|
53
|
+
}
|
|
54
|
+
export async function loadScientificAmendmentImpact(root, project, events) {
|
|
55
|
+
if (!project.scientificDesign?.amendmentSha256 &&
|
|
56
|
+
!events.some((event) => event.scope === project.id && event.type === "scientific.amendment.recorded"))
|
|
57
|
+
return undefined;
|
|
58
|
+
const view = await loadScientificFulfillmentView(root, project, undefined, events);
|
|
59
|
+
return scientificAmendmentImpact(view.amendments, view.base);
|
|
60
|
+
}
|
|
61
|
+
const ids = {
|
|
62
|
+
type: "array",
|
|
63
|
+
uniqueItems: true,
|
|
64
|
+
maxItems: 128,
|
|
65
|
+
items: { type: "string", pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$" },
|
|
66
|
+
};
|
|
67
|
+
const inputSchema = {
|
|
68
|
+
type: "object",
|
|
69
|
+
additionalProperties: false,
|
|
70
|
+
required: ["schemaVersion", "reason", "changes"],
|
|
71
|
+
properties: {
|
|
72
|
+
schemaVersion: { const: 1 },
|
|
73
|
+
reason: { type: "string", minLength: 8, maxLength: 4000 },
|
|
74
|
+
changes: {
|
|
75
|
+
type: "array",
|
|
76
|
+
minItems: 1,
|
|
77
|
+
maxItems: 128,
|
|
78
|
+
items: {
|
|
79
|
+
type: "object",
|
|
80
|
+
additionalProperties: false,
|
|
81
|
+
required: [
|
|
82
|
+
"ruleId",
|
|
83
|
+
"dueGate",
|
|
84
|
+
"rationale",
|
|
85
|
+
"modelStructureIds",
|
|
86
|
+
"uncertaintyParameterIds",
|
|
87
|
+
],
|
|
88
|
+
properties: {
|
|
89
|
+
ruleId: { type: "string", minLength: 1, maxLength: 128 },
|
|
90
|
+
dueGate: {
|
|
91
|
+
enum: ["research-design", "evidence-construct", "pilot-methods", "publication-freeze"],
|
|
92
|
+
},
|
|
93
|
+
rationale: { type: "string", minLength: 8, maxLength: 4000 },
|
|
94
|
+
modelStructureIds: ids,
|
|
95
|
+
uncertaintyParameterIds: ids,
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
const validate = new Ajv2020({ strict: false, allErrors: true }).compile(inputSchema);
|
|
102
|
+
export function scientificAmendmentSchema() {
|
|
103
|
+
return structuredClone(inputSchema);
|
|
104
|
+
}
|
|
105
|
+
function invalid(message, code = "RESEARCH_SCIENTIFIC_AMENDMENT_INVALID") {
|
|
106
|
+
return new CliError(message, { code, exitCode: code.endsWith("INVALID") ? 2 : 3 });
|
|
107
|
+
}
|
|
108
|
+
/** Derive a reviewable proposal without changing frozen bytes or authority. */
|
|
109
|
+
export async function planScientificAmendment(root, projectId, value) {
|
|
110
|
+
if (!validate(value) ||
|
|
111
|
+
canonicalJson(sanitizeResearchValue(value, configuredResearchSecrets(process.env))) !==
|
|
112
|
+
canonicalJson(value))
|
|
113
|
+
throw invalid("Amendment must match the closed, secret-free lifecycle/binding schema.");
|
|
114
|
+
const input = value;
|
|
115
|
+
if (input.reason.trim().length < 8 ||
|
|
116
|
+
input.changes.some((change) => change.rationale.trim().length < 8) ||
|
|
117
|
+
new Set(input.changes.map((change) => change.ruleId)).size !== input.changes.length)
|
|
118
|
+
throw invalid("Amendment requires a reason, substantive rationales and unique existing rules.");
|
|
119
|
+
const paths = workspacePaths(root);
|
|
120
|
+
const project = await loadProject(root, projectId);
|
|
121
|
+
const events = await readVerifiedJournal(paths.journal);
|
|
122
|
+
assertProjectAuthority(project, projectAuthorityIndex(events));
|
|
123
|
+
const analyze = project.packages.find((item) => item.stage === "analyze");
|
|
124
|
+
if (!project.scientificDesign ||
|
|
125
|
+
project.status === "complete" ||
|
|
126
|
+
project.handoff.state !== "agent-actionable" ||
|
|
127
|
+
!analyze ||
|
|
128
|
+
analyze.attempts > 0 ||
|
|
129
|
+
analyze.startedAt ||
|
|
130
|
+
!["ready", "pending"].includes(analyze.status) ||
|
|
131
|
+
(await pathExists(join(paths.projects, project.id, "native/active.json"))) ||
|
|
132
|
+
(await pathExists(join(paths.projects, project.id, "outputs/inference-snapshot.json"))))
|
|
133
|
+
throw invalid("Amend only an idle authoritative pre-analysis project. Resolve the active session or handoff; substantive or post-analysis changes require a reviewed successor.", "RESEARCH_SCIENTIFIC_AMENDMENT_UNAVAILABLE");
|
|
134
|
+
if (!project.publicationPolicy)
|
|
135
|
+
throw conflict();
|
|
136
|
+
await assertResearchPolicyBinding(root, project.publicationPolicy);
|
|
137
|
+
const view = await loadScientificFulfillmentView(root, project, undefined, events);
|
|
138
|
+
const effective = structuredClone(view.contract);
|
|
139
|
+
const declaredRules = new Set(project.publicationPolicy?.resolvedRules ?? []);
|
|
140
|
+
const models = new Set(effective.identity.modelStructures.map((model) => model.id));
|
|
141
|
+
const parameters = new Set(effective.uncertaintyParameters.map((parameter) => parameter.id));
|
|
142
|
+
const changes = input.changes.map((change) => {
|
|
143
|
+
const rule = effective.policyRuleDispositions.find((item) => item.ruleId === change.ruleId);
|
|
144
|
+
if (!rule ||
|
|
145
|
+
!declaredRules.has(change.ruleId) ||
|
|
146
|
+
rule.status !== "planned" ||
|
|
147
|
+
change.modelStructureIds.some((id) => !models.has(id)) ||
|
|
148
|
+
change.uncertaintyParameterIds.some((id) => !parameters.has(id)))
|
|
149
|
+
throw invalid("Amend only planned Policy rules and their existing declared model/parameter IDs.");
|
|
150
|
+
const before = structuredClone(rule);
|
|
151
|
+
Object.assign(rule, change);
|
|
152
|
+
const after = structuredClone(rule);
|
|
153
|
+
if (canonicalJson(before) === canonicalJson(after))
|
|
154
|
+
throw invalid("Each proposed rule amendment must change its lifecycle or bindings.");
|
|
155
|
+
return { ruleId: rule.ruleId, before, after };
|
|
156
|
+
});
|
|
157
|
+
const introducedIssues = evaluateScientificDesign(effective).issueCodes;
|
|
158
|
+
if (introducedIssues.length)
|
|
159
|
+
throw new CliError("Amendment introduces blocking scientific-design issues.", {
|
|
160
|
+
code: "RESEARCH_SCIENTIFIC_AMENDMENT_INVALID",
|
|
161
|
+
exitCode: 2,
|
|
162
|
+
details: { issueCodes: introducedIssues },
|
|
163
|
+
});
|
|
164
|
+
const { loadProjectTask } = await import("./task-contract.js");
|
|
165
|
+
const task = await loadProjectTask(root, projectId, events);
|
|
166
|
+
const scope = amendmentChangeScope(changes, view.base);
|
|
167
|
+
const affectedTaskRequirementIds = (task?.current.requirements ?? [])
|
|
168
|
+
.filter((requirement) => requirement.designClaimIds.some((id) => scope.claims.has(id)) ||
|
|
169
|
+
requirement.coverageDimensionIds.some((id) => scope.coverage.has(id)))
|
|
170
|
+
.map((requirement) => requirement.id)
|
|
171
|
+
.sort();
|
|
172
|
+
const core = {
|
|
173
|
+
schemaVersion: 1,
|
|
174
|
+
kind: "tiangong-scientific-amendment-plan",
|
|
175
|
+
projectId: project.id,
|
|
176
|
+
parentDesignSha256: project.scientificDesign.designSha256,
|
|
177
|
+
parentFulfillmentSha256: view.headSha256,
|
|
178
|
+
parentAmendmentSha256: project.scientificDesign.amendmentSha256 ?? null,
|
|
179
|
+
parentEffectiveDesignSha256: view.effectiveSha256,
|
|
180
|
+
parentProjectSha256: sha256Text(canonicalJson(project)),
|
|
181
|
+
reason: input.reason,
|
|
182
|
+
changes,
|
|
183
|
+
proposedEffectiveDesignSha256: sha256Text(canonicalJson(effective)),
|
|
184
|
+
invalidatedScientificRoles: ["research-design", "evidence-construct", "pilot-methods"],
|
|
185
|
+
affectedTaskRequirementIds,
|
|
186
|
+
preservedAcquisitionSnapshotSha256: project.evidenceState.currentSnapshotSha256,
|
|
187
|
+
};
|
|
188
|
+
return {
|
|
189
|
+
...core,
|
|
190
|
+
planSha256: sha256Text(canonicalJson(core)),
|
|
191
|
+
nextAction: PLAN_NEXT_ACTION,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function conflict() {
|
|
195
|
+
return invalid("Amendment no longer matches its exact parent, authorized changes or immutable history. Inspect amendment status and prepare a new plan; do not edit frozen records.", "RESEARCH_SCIENTIFIC_AMENDMENT_CONFLICT");
|
|
196
|
+
}
|
|
197
|
+
function planInput(plan) {
|
|
198
|
+
return {
|
|
199
|
+
schemaVersion: 1,
|
|
200
|
+
reason: plan.reason,
|
|
201
|
+
changes: plan.changes.map(({ ruleId, after }) => ({
|
|
202
|
+
ruleId,
|
|
203
|
+
dueGate: after.dueGate,
|
|
204
|
+
rationale: after.rationale,
|
|
205
|
+
modelStructureIds: after.modelStructureIds,
|
|
206
|
+
uncertaintyParameterIds: after.uncertaintyParameterIds,
|
|
207
|
+
})),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function validatePlan(value) {
|
|
211
|
+
if (!isObject(value))
|
|
212
|
+
throw conflict();
|
|
213
|
+
const { planSha256, nextAction, ...core } = value;
|
|
214
|
+
if (Object.keys(value).sort().join(",") !==
|
|
215
|
+
"affectedTaskRequirementIds,changes,invalidatedScientificRoles,kind,nextAction,parentAmendmentSha256,parentDesignSha256,parentEffectiveDesignSha256,parentFulfillmentSha256,parentProjectSha256,planSha256,preservedAcquisitionSnapshotSha256,projectId,proposedEffectiveDesignSha256,reason,schemaVersion" ||
|
|
216
|
+
value.schemaVersion !== 1 ||
|
|
217
|
+
value.kind !== "tiangong-scientific-amendment-plan" ||
|
|
218
|
+
typeof value.projectId !== "string" ||
|
|
219
|
+
!/^[a-z0-9][a-z0-9-]{2,63}$/.test(value.projectId) ||
|
|
220
|
+
nextAction !== PLAN_NEXT_ACTION ||
|
|
221
|
+
planSha256 !== sha256Text(canonicalJson(core)) ||
|
|
222
|
+
[
|
|
223
|
+
value.parentDesignSha256,
|
|
224
|
+
value.parentEffectiveDesignSha256,
|
|
225
|
+
value.parentProjectSha256,
|
|
226
|
+
value.proposedEffectiveDesignSha256,
|
|
227
|
+
].some((hash) => typeof hash !== "string" || !HASH.test(hash)) ||
|
|
228
|
+
[
|
|
229
|
+
value.parentAmendmentSha256,
|
|
230
|
+
value.parentFulfillmentSha256,
|
|
231
|
+
value.preservedAcquisitionSnapshotSha256,
|
|
232
|
+
].some((hash) => hash !== null && (typeof hash !== "string" || !HASH.test(hash))) ||
|
|
233
|
+
canonicalJson(value.invalidatedScientificRoles) !==
|
|
234
|
+
canonicalJson(["research-design", "evidence-construct", "pilot-methods"]) ||
|
|
235
|
+
!Array.isArray(value.affectedTaskRequirementIds) ||
|
|
236
|
+
value.affectedTaskRequirementIds.some((id) => typeof id !== "string" || !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(id)) ||
|
|
237
|
+
new Set(value.affectedTaskRequirementIds).size !== value.affectedTaskRequirementIds.length ||
|
|
238
|
+
!Array.isArray(value.changes) ||
|
|
239
|
+
value.changes.some((change) => !isObject(change) ||
|
|
240
|
+
!isObject(change.before) ||
|
|
241
|
+
!isObject(change.after) ||
|
|
242
|
+
Object.keys(change).sort().join(",") !== "after,before,ruleId"))
|
|
243
|
+
throw conflict();
|
|
244
|
+
const plan = value;
|
|
245
|
+
if (!validate(planInput(plan)) ||
|
|
246
|
+
new Set(plan.changes.map((item) => item.ruleId)).size !== plan.changes.length)
|
|
247
|
+
throw conflict();
|
|
248
|
+
return plan;
|
|
249
|
+
}
|
|
250
|
+
export function scientificAmendmentLocator(projectId, hash) {
|
|
251
|
+
if (!/^[a-z0-9][a-z0-9-]{2,63}$/.test(projectId) || !HASH.test(hash))
|
|
252
|
+
throw conflict();
|
|
253
|
+
return `projects/${projectId}/scientific/amendments/${hash}.json`;
|
|
254
|
+
}
|
|
255
|
+
export function validateScientificAmendmentRecord(value, projectId, hash) {
|
|
256
|
+
if (!isObject(value) ||
|
|
257
|
+
Object.keys(value).sort().join(",") !==
|
|
258
|
+
"amendmentAuthorization,design,kind,plan,projectId,recordSha256,schemaVersion")
|
|
259
|
+
throw conflict();
|
|
260
|
+
const { recordSha256, ...core } = value;
|
|
261
|
+
if (value.schemaVersion !== 1 ||
|
|
262
|
+
value.kind !== "tiangong-scientific-amendment" ||
|
|
263
|
+
value.projectId !== projectId ||
|
|
264
|
+
recordSha256 !== hash ||
|
|
265
|
+
sha256Text(canonicalJson(core)) !== hash)
|
|
266
|
+
throw conflict();
|
|
267
|
+
const plan = validatePlan(value.plan);
|
|
268
|
+
const authorization = value.amendmentAuthorization;
|
|
269
|
+
const design = value.design;
|
|
270
|
+
if (plan.projectId !== projectId ||
|
|
271
|
+
!isObject(authorization) ||
|
|
272
|
+
!isObject(design) ||
|
|
273
|
+
Object.keys(authorization).sort().join(",") !==
|
|
274
|
+
"kind,planSha256,sourceBytes,sourceLocator,sourceSha256" ||
|
|
275
|
+
authorization.kind !== "operator-confirmation" ||
|
|
276
|
+
authorization.planSha256 !== plan.planSha256 ||
|
|
277
|
+
typeof authorization.sourceSha256 !== "string" ||
|
|
278
|
+
!HASH.test(authorization.sourceSha256) ||
|
|
279
|
+
authorization.sourceLocator !==
|
|
280
|
+
`projects/${projectId}/scientific/authorization/${authorization.sourceSha256}.txt` ||
|
|
281
|
+
!Number.isSafeInteger(authorization.sourceBytes) ||
|
|
282
|
+
Number(authorization.sourceBytes) < 8 ||
|
|
283
|
+
Number(authorization.sourceBytes) > 65536 ||
|
|
284
|
+
Object.keys(design).sort().join(",") !== "objectLocator,sha256" ||
|
|
285
|
+
typeof design.sha256 !== "string" ||
|
|
286
|
+
!HASH.test(design.sha256) ||
|
|
287
|
+
design.objectLocator !== `projects/${projectId}/scientific/design/objects/${design.sha256}.json`)
|
|
288
|
+
throw conflict();
|
|
289
|
+
return value;
|
|
290
|
+
}
|
|
291
|
+
/** Shared by the live loader and portable verifier; rule patches commute with slot fulfillment. */
|
|
292
|
+
export function projectScientificAmendments(base, baseSha256, fulfillments, records) {
|
|
293
|
+
const design = structuredClone(base);
|
|
294
|
+
let parent = null;
|
|
295
|
+
for (const record of records) {
|
|
296
|
+
const plan = record.plan;
|
|
297
|
+
if (plan.parentAmendmentSha256 !== parent ||
|
|
298
|
+
plan.parentDesignSha256 !== baseSha256 ||
|
|
299
|
+
plan.projectId !== base.projectId)
|
|
300
|
+
throw conflict();
|
|
301
|
+
const prefix = plan.parentFulfillmentSha256 === null
|
|
302
|
+
? 0
|
|
303
|
+
: fulfillments.findIndex((item) => item.recordSha256 === plan.parentFulfillmentSha256) + 1;
|
|
304
|
+
if (plan.parentFulfillmentSha256 !== null && prefix === 0)
|
|
305
|
+
throw conflict();
|
|
306
|
+
const previous = structuredClone(design);
|
|
307
|
+
for (const item of fulfillments.slice(0, prefix))
|
|
308
|
+
applyScientificFulfillmentRecord(previous, item);
|
|
309
|
+
if (sha256Text(canonicalJson(previous)) !== plan.parentEffectiveDesignSha256)
|
|
310
|
+
throw conflict();
|
|
311
|
+
const models = new Set(design.identity.modelStructures.map((item) => item.id));
|
|
312
|
+
const parameters = new Set(design.uncertaintyParameters.map((item) => item.id));
|
|
313
|
+
for (const change of plan.changes) {
|
|
314
|
+
const rule = design.policyRuleDispositions.find((item) => item.ruleId === change.ruleId);
|
|
315
|
+
if (!rule ||
|
|
316
|
+
rule.status !== "planned" ||
|
|
317
|
+
canonicalJson(rule) !== canonicalJson(change.before))
|
|
318
|
+
throw conflict();
|
|
319
|
+
const expected = { ...rule, ...planInput({ ...plan, changes: [change] }).changes[0] };
|
|
320
|
+
if (canonicalJson(expected) !== canonicalJson(change.after) ||
|
|
321
|
+
canonicalJson(rule) === canonicalJson(expected) ||
|
|
322
|
+
expected.modelStructureIds.some((id) => !models.has(id)) ||
|
|
323
|
+
expected.uncertaintyParameterIds.some((id) => !parameters.has(id)))
|
|
324
|
+
throw conflict();
|
|
325
|
+
Object.assign(rule, expected);
|
|
326
|
+
}
|
|
327
|
+
const effective = structuredClone(design);
|
|
328
|
+
for (const item of fulfillments.slice(0, prefix))
|
|
329
|
+
applyScientificFulfillmentRecord(effective, item);
|
|
330
|
+
if (sha256Text(canonicalJson(design)) !== record.design.sha256 ||
|
|
331
|
+
sha256Text(canonicalJson(effective)) !== plan.proposedEffectiveDesignSha256 ||
|
|
332
|
+
evaluateScientificDesign(effective).issueCodes.length)
|
|
333
|
+
throw conflict();
|
|
334
|
+
parent = record.recordSha256;
|
|
335
|
+
}
|
|
336
|
+
return design;
|
|
337
|
+
}
|
|
338
|
+
async function controlledPath(root, locator, create = false) {
|
|
339
|
+
const destination = resolveContained(workspacePaths(root).control, locator);
|
|
340
|
+
let directory = workspacePaths(root).control;
|
|
341
|
+
for (const part of locator.split("/").slice(0, -1)) {
|
|
342
|
+
directory = join(directory, part);
|
|
343
|
+
if (create && !(await pathExists(directory)))
|
|
344
|
+
await mkdir(directory, { mode: 0o700 });
|
|
345
|
+
const info = await lstat(directory).catch(() => null);
|
|
346
|
+
if (!info?.isDirectory() || info.isSymbolicLink())
|
|
347
|
+
throw conflict();
|
|
348
|
+
}
|
|
349
|
+
return destination;
|
|
350
|
+
}
|
|
351
|
+
async function readImmutable(root, locator, maxBytes = 16 * 1024 * 1024) {
|
|
352
|
+
const path = await controlledPath(root, locator);
|
|
353
|
+
const info = await lstat(path).catch(() => null);
|
|
354
|
+
if (!info?.isFile() || info.isSymbolicLink() || info.size > maxBytes)
|
|
355
|
+
throw conflict();
|
|
356
|
+
const bytes = await readFile(path);
|
|
357
|
+
if (bytes.length > maxBytes)
|
|
358
|
+
throw conflict();
|
|
359
|
+
try {
|
|
360
|
+
return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes);
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
throw conflict();
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
async function writeImmutable(root, locator, text) {
|
|
367
|
+
const path = await controlledPath(root, locator, true);
|
|
368
|
+
const existing = await lstat(path).catch((error) => {
|
|
369
|
+
if (error.code === "ENOENT")
|
|
370
|
+
return null;
|
|
371
|
+
throw conflict();
|
|
372
|
+
});
|
|
373
|
+
if (existing) {
|
|
374
|
+
if (!existing.isFile() || existing.isSymbolicLink())
|
|
375
|
+
throw conflict();
|
|
376
|
+
if ((await readImmutable(root, locator)) !== text)
|
|
377
|
+
throw conflict();
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
await writeTextAtomic(path, text, 0o444);
|
|
381
|
+
}
|
|
382
|
+
export async function loadScientificAmendments(root, project, events) {
|
|
383
|
+
const entries = events.filter((event) => event.scope === project.id && event.type === "scientific.amendment.recorded");
|
|
384
|
+
if ((entries.at(-1)?.payload.recordSha256 ?? null) !==
|
|
385
|
+
(project.scientificDesign?.amendmentSha256 ?? null))
|
|
386
|
+
throw conflict();
|
|
387
|
+
const records = [];
|
|
388
|
+
for (const event of entries) {
|
|
389
|
+
const hash = String(event.payload.recordSha256);
|
|
390
|
+
let value;
|
|
391
|
+
try {
|
|
392
|
+
value = JSON.parse(await readImmutable(root, scientificAmendmentLocator(project.id, hash)));
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
throw conflict();
|
|
396
|
+
}
|
|
397
|
+
const record = validateScientificAmendmentRecord(value, project.id, hash);
|
|
398
|
+
if (event.payload.planSha256 !== record.plan.planSha256 ||
|
|
399
|
+
!isObject(event.payload.mutation) ||
|
|
400
|
+
event.payload.mutation.requestSha256 !== hash ||
|
|
401
|
+
event.payload.parentAmendmentSha256 !== record.plan.parentAmendmentSha256)
|
|
402
|
+
throw conflict();
|
|
403
|
+
const source = await readImmutable(root, record.amendmentAuthorization.sourceLocator, 65536);
|
|
404
|
+
if (sha256Text(source) !== record.amendmentAuthorization.sourceSha256 ||
|
|
405
|
+
Buffer.byteLength(source) !== record.amendmentAuthorization.sourceBytes)
|
|
406
|
+
throw conflict();
|
|
407
|
+
const version = await readImmutable(root, record.design.objectLocator);
|
|
408
|
+
if (sha256Text(version) !== record.design.sha256)
|
|
409
|
+
throw conflict();
|
|
410
|
+
records.push(record);
|
|
411
|
+
}
|
|
412
|
+
return records;
|
|
413
|
+
}
|
|
414
|
+
export async function applyScientificAmendment(root, projectId, value, confirmation, sourcePath) {
|
|
415
|
+
const plan = validatePlan(value);
|
|
416
|
+
if (confirmation !== plan.planSha256 || !sourcePath || !isAbsolute(sourcePath))
|
|
417
|
+
throw invalid("Apply requires --confirm with the exact reviewed plan hash and an absolute --authorization-source file.");
|
|
418
|
+
const info = await lstat(sourcePath).catch(() => null);
|
|
419
|
+
if (!info?.isFile() || info.isSymbolicLink() || info.size > 65536)
|
|
420
|
+
throw invalid("Authorization source must be a bounded regular UTF-8 file.");
|
|
421
|
+
const bytes = await readFile(sourcePath);
|
|
422
|
+
let source;
|
|
423
|
+
try {
|
|
424
|
+
source = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes);
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
throw invalid("Authorization source must be UTF-8 text.");
|
|
428
|
+
}
|
|
429
|
+
if (bytes.length > 65536 ||
|
|
430
|
+
source.trim().length < 8 ||
|
|
431
|
+
sanitizeResearchValue(source, configuredResearchSecrets(process.env)) !== source)
|
|
432
|
+
throw invalid("Authorization source must contain bounded, non-secret confirmation text.");
|
|
433
|
+
const sourceSha256 = sha256Text(source);
|
|
434
|
+
return withWorkspaceLock(root, "research.scientific.amendment", async () => {
|
|
435
|
+
const project = await loadProject(root, projectId);
|
|
436
|
+
const events = await readVerifiedJournal(workspacePaths(root).journal);
|
|
437
|
+
assertProjectAuthority(project, projectAuthorityIndex(events));
|
|
438
|
+
const view = await loadScientificFulfillmentView(root, project, undefined, events);
|
|
439
|
+
const replay = view.amendments.find((record) => record.plan.planSha256 === plan.planSha256);
|
|
440
|
+
if (replay) {
|
|
441
|
+
if (canonicalJson(replay.plan) !== canonicalJson(plan) ||
|
|
442
|
+
replay.amendmentAuthorization.sourceSha256 !== sourceSha256)
|
|
443
|
+
throw conflict();
|
|
444
|
+
return replay;
|
|
445
|
+
}
|
|
446
|
+
if (plan.projectId !== projectId ||
|
|
447
|
+
canonicalJson(await planScientificAmendment(root, projectId, planInput(plan))) !==
|
|
448
|
+
canonicalJson(plan))
|
|
449
|
+
throw conflict();
|
|
450
|
+
const design = structuredClone(view.amendedBase);
|
|
451
|
+
for (const change of plan.changes)
|
|
452
|
+
Object.assign(design.policyRuleDispositions.find((rule) => rule.ruleId === change.ruleId), change.after);
|
|
453
|
+
const designText = canonicalJson(design);
|
|
454
|
+
const designSha256 = sha256Text(designText);
|
|
455
|
+
const core = {
|
|
456
|
+
schemaVersion: 1,
|
|
457
|
+
kind: "tiangong-scientific-amendment",
|
|
458
|
+
projectId,
|
|
459
|
+
plan,
|
|
460
|
+
amendmentAuthorization: {
|
|
461
|
+
kind: "operator-confirmation",
|
|
462
|
+
planSha256: plan.planSha256,
|
|
463
|
+
sourceSha256,
|
|
464
|
+
sourceLocator: `projects/${projectId}/scientific/authorization/${sourceSha256}.txt`,
|
|
465
|
+
sourceBytes: Buffer.byteLength(source),
|
|
466
|
+
},
|
|
467
|
+
design: {
|
|
468
|
+
sha256: designSha256,
|
|
469
|
+
objectLocator: `projects/${projectId}/scientific/design/objects/${designSha256}.json`,
|
|
470
|
+
},
|
|
471
|
+
};
|
|
472
|
+
const record = {
|
|
473
|
+
...core,
|
|
474
|
+
recordSha256: sha256Text(canonicalJson(core)),
|
|
475
|
+
};
|
|
476
|
+
await writeImmutable(root, record.amendmentAuthorization.sourceLocator, source);
|
|
477
|
+
await writeImmutable(root, record.design.objectLocator, designText);
|
|
478
|
+
await writeImmutable(root, scientificAmendmentLocator(projectId, record.recordSha256), canonicalJson(record));
|
|
479
|
+
let mutation = await beginProjectMutation(root, "scientific-amendment", project, record.recordSha256);
|
|
480
|
+
try {
|
|
481
|
+
project.scientificDesign.amendmentSha256 = record.recordSha256;
|
|
482
|
+
for (const role of ["research-design", "evidence-construct", "pilot-methods"])
|
|
483
|
+
project.scientificDesign.gates[role] = {
|
|
484
|
+
status: "pending",
|
|
485
|
+
packetSha256: null,
|
|
486
|
+
assessmentSha256: null,
|
|
487
|
+
reviewSha256: null,
|
|
488
|
+
reviewerSessionSha256: null,
|
|
489
|
+
};
|
|
490
|
+
project.updatedAt = new Date().toISOString();
|
|
491
|
+
mutation = await prepareProjectMutation(root, mutation, project);
|
|
492
|
+
await appendJournalEvent(workspacePaths(root).journal, "scientific.amendment.recorded", projectId, {
|
|
493
|
+
projectId,
|
|
494
|
+
recordSha256: record.recordSha256,
|
|
495
|
+
planSha256: plan.planSha256,
|
|
496
|
+
parentAmendmentSha256: plan.parentAmendmentSha256,
|
|
497
|
+
mutation: projectMutationBinding(mutation),
|
|
498
|
+
});
|
|
499
|
+
await settleProjectMutation(root, mutation);
|
|
500
|
+
}
|
|
501
|
+
catch (error) {
|
|
502
|
+
await settleProjectMutation(root, mutation);
|
|
503
|
+
throw error;
|
|
504
|
+
}
|
|
505
|
+
return record;
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
export async function inspectScientificAmendment(root, projectId) {
|
|
509
|
+
const project = await loadProject(root, projectId);
|
|
510
|
+
const view = await loadScientificFulfillmentView(root, project);
|
|
511
|
+
return {
|
|
512
|
+
projectId,
|
|
513
|
+
amendmentSha256: project.scientificDesign?.amendmentSha256 ?? null,
|
|
514
|
+
originalDesignSha256: project.scientificDesign?.designSha256,
|
|
515
|
+
effectiveDesignSha256: view.effectiveSha256,
|
|
516
|
+
plannedRules: view.contract.policyRuleDispositions
|
|
517
|
+
.filter((rule) => rule.status === "planned")
|
|
518
|
+
.map(({ ruleId, dueGate, rationale, modelStructureIds, uncertaintyParameterIds }) => ({
|
|
519
|
+
ruleId,
|
|
520
|
+
dueGate,
|
|
521
|
+
rationale,
|
|
522
|
+
modelStructureIds,
|
|
523
|
+
uncertaintyParameterIds,
|
|
524
|
+
})),
|
|
525
|
+
records: view.amendments.map((record) => ({
|
|
526
|
+
recordSha256: record.recordSha256,
|
|
527
|
+
planSha256: record.plan.planSha256,
|
|
528
|
+
parentAmendmentSha256: record.plan.parentAmendmentSha256,
|
|
529
|
+
design: record.design,
|
|
530
|
+
reason: record.plan.reason,
|
|
531
|
+
affectedTaskRequirementIds: record.plan.affectedTaskRequirementIds,
|
|
532
|
+
})),
|
|
533
|
+
gates: project.scientificDesign?.gates,
|
|
534
|
+
nextAction: "Complete the pending scientific gates for this design version. Reuse still-bound acquisition artifacts and typed evidence; authorization is not scientific approval.",
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
//# sourceMappingURL=scientific-amendment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scientific-amendment.js","sourceRoot":"","sources":["../../../src/research/workspace/scientific-amendment.ts"],"names":[],"mappings":"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"}
|
|
@@ -237,7 +237,6 @@ export function scientificDesignSchema() {
|
|
|
237
237
|
pattern: "^lineage/objects/[a-f0-9]{64}/blob$",
|
|
238
238
|
},
|
|
239
239
|
implementationEntrypoint: nonEmptyString,
|
|
240
|
-
implementationFreezeBeforeGate: { const: "research-design" },
|
|
241
240
|
},
|
|
242
241
|
},
|
|
243
242
|
else: {
|
|
@@ -266,7 +265,6 @@ export function scientificDesignSchema() {
|
|
|
266
265
|
type: "string",
|
|
267
266
|
pattern: "^lineage/objects/[a-f0-9]{64}/blob$",
|
|
268
267
|
},
|
|
269
|
-
environmentLockFreezeBeforeGate: { const: "research-design" },
|
|
270
268
|
},
|
|
271
269
|
},
|
|
272
270
|
else: {
|
|
@@ -1316,16 +1314,12 @@ export function evaluateScientificDesign(design) {
|
|
|
1316
1314
|
if (modelsWithoutRetrievableObjects.length) {
|
|
1317
1315
|
add("MODEL_ARTIFACT_OBJECT_UNBOUND", "Every frozen model implementation and environment lock must bind a safe retrievable object locator whose digest is explicitly defined over raw file bytes.", modelsWithoutRetrievableObjects.map((model) => model.id));
|
|
1318
1316
|
}
|
|
1319
|
-
const invalidModelFreezePlans = design.identity.modelStructures.filter((model) => (model.implementationStatus === "
|
|
1320
|
-
model.implementationFreezeBeforeGate
|
|
1321
|
-
(model.implementationStatus === "pending-source-acquisition" &&
|
|
1322
|
-
model.implementationFreezeBeforeGate === "research-design") ||
|
|
1323
|
-
(model.environmentLockStatus === "exact-frozen" &&
|
|
1324
|
-
model.environmentLockFreezeBeforeGate !== "research-design") ||
|
|
1317
|
+
const invalidModelFreezePlans = design.identity.modelStructures.filter((model) => (model.implementationStatus === "pending-source-acquisition" &&
|
|
1318
|
+
model.implementationFreezeBeforeGate === "research-design") ||
|
|
1325
1319
|
(model.environmentLockStatus === "pending-runtime-lock" &&
|
|
1326
1320
|
model.environmentLockFreezeBeforeGate === "research-design"));
|
|
1327
1321
|
if (invalidModelFreezePlans.length) {
|
|
1328
|
-
add("MODEL_FREEZE_PLAN_INVALID", "
|
|
1322
|
+
add("MODEL_FREEZE_PLAN_INVALID", "Pending model objects must declare a later early-review deadline; registered objects may already be frozen before that deadline.", invalidModelFreezePlans.map((model) => model.id));
|
|
1329
1323
|
}
|
|
1330
1324
|
const modelFreezePolicyBindingsMissing = design.identity.modelStructures.filter((model) => {
|
|
1331
1325
|
const pendingGates = [
|
|
@@ -1606,12 +1600,10 @@ export function evaluateScientificDesign(design) {
|
|
|
1606
1600
|
if (incompleteFactorCompositions.length) {
|
|
1607
1601
|
add("FACTOR_UNCERTAINTY_COMPOSITION_UNDECLARED", "An uncertainty parameter that acts on a frozen factor must declare where and how it composes with factor levels and must preserve each level's identity.", incompleteFactorCompositions.map((parameter) => parameter.id));
|
|
1608
1602
|
}
|
|
1609
|
-
const invalidStateFreezePlans = design.uncertaintyParameters.filter((parameter) =>
|
|
1610
|
-
parameter.freezeBeforeGate
|
|
1611
|
-
(parameter.stateValueStatus === "pending-source-acquisition" &&
|
|
1612
|
-
parameter.freezeBeforeGate === "research-design"));
|
|
1603
|
+
const invalidStateFreezePlans = design.uncertaintyParameters.filter((parameter) => parameter.stateValueStatus === "pending-source-acquisition" &&
|
|
1604
|
+
parameter.freezeBeforeGate === "research-design");
|
|
1613
1605
|
if (invalidStateFreezePlans.length) {
|
|
1614
|
-
add("UNCERTAINTY_STATE_FREEZE_PLAN_INVALID", "
|
|
1606
|
+
add("UNCERTAINTY_STATE_FREEZE_PLAN_INVALID", "Pending source-derived states must name a later early-review deadline; exact values may be frozen before that deadline.", invalidStateFreezePlans.map((parameter) => parameter.id));
|
|
1615
1607
|
}
|
|
1616
1608
|
const nonNumericFrozenStates = design.uncertaintyParameters.filter((parameter) => parameter.stateValueStatus === "frozen" &&
|
|
1617
1609
|
parameter.stateValueType === "numeric" &&
|
|
@@ -1773,9 +1765,8 @@ export function evaluateScientificDesign(design) {
|
|
|
1773
1765
|
(baseline.decisionLossMetrics.length === 0 || unboundDecisionLossMetrics.length > 0)) {
|
|
1774
1766
|
add("DECISION_LOSS_METRIC_UNBOUND", "A cross-model design must freeze executable decision-loss metrics bound to concrete comparisons, quantities, rules, and reporting levels.", unboundDecisionLossMetrics.map((metric) => metric.id));
|
|
1775
1767
|
}
|
|
1776
|
-
if (design.contextPlan.
|
|
1777
|
-
|
|
1778
|
-
add("CONTEXT_PLAN_OVER_LIMIT", "The planned claim-critical context does not fit its reviewed token boundary.");
|
|
1768
|
+
if (!design.contextPlan.centralEvidenceFits) {
|
|
1769
|
+
add("CONTEXT_PLAN_OVER_LIMIT", "The design declares no workable route to review its claim-critical evidence. Provide a complete packet/on-demand read route; token estimates alone are not an admission ceiling.");
|
|
1779
1770
|
}
|
|
1780
1771
|
if (design.contextPlan.claimCriticalCapsuleIds.length === 0) {
|
|
1781
1772
|
add("CLAIM_CRITICAL_CONTEXT_MISSING", "At least one claim-critical evidence capsule must be planned before high-cost stages.");
|