@tiangong-lca/cli 0.0.7 → 0.0.9

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 (59) hide show
  1. package/README.md +97 -16
  2. package/dist/src/cli.js +1429 -131
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/lib/dataset-author.js +100 -0
  5. package/dist/src/lib/dataset-author.js.map +1 -0
  6. package/dist/src/lib/dataset-bilingual.js +545 -0
  7. package/dist/src/lib/dataset-bilingual.js.map +1 -0
  8. package/dist/src/lib/dataset-contract.js +350 -0
  9. package/dist/src/lib/dataset-contract.js.map +1 -0
  10. package/dist/src/lib/dataset-evidence-search.js +636 -0
  11. package/dist/src/lib/dataset-evidence-search.js.map +1 -0
  12. package/dist/src/lib/dataset-import-lca.js +171 -0
  13. package/dist/src/lib/dataset-import-lca.js.map +1 -0
  14. package/dist/src/lib/dataset-remote-refresh.js +166 -0
  15. package/dist/src/lib/dataset-remote-refresh.js.map +1 -0
  16. package/dist/src/lib/dataset-remote-verify.js +543 -0
  17. package/dist/src/lib/dataset-remote-verify.js.map +1 -0
  18. package/dist/src/lib/dataset-validate.js +63 -7
  19. package/dist/src/lib/dataset-validate.js.map +1 -1
  20. package/dist/src/lib/flow-fetch-rows.js +12 -12
  21. package/dist/src/lib/flow-fetch-rows.js.map +1 -1
  22. package/dist/src/lib/flow-payload-validation.js +51 -0
  23. package/dist/src/lib/flow-payload-validation.js.map +1 -0
  24. package/dist/src/lib/flow-publish-reviewed-data.js +16 -0
  25. package/dist/src/lib/flow-publish-reviewed-data.js.map +1 -1
  26. package/dist/src/lib/flow-publish-version.js +182 -12
  27. package/dist/src/lib/flow-publish-version.js.map +1 -1
  28. package/dist/src/lib/{review-flow.js → flow-qa.js} +86 -28
  29. package/dist/src/lib/flow-qa.js.map +1 -0
  30. package/dist/src/lib/identity-preflight.js +1021 -0
  31. package/dist/src/lib/identity-preflight.js.map +1 -0
  32. package/dist/src/lib/{review-lifecyclemodel.js → lifecyclemodel-qa.js} +54 -54
  33. package/dist/src/lib/lifecyclemodel-qa.js.map +1 -0
  34. package/dist/src/lib/process-auto-build.js +147 -0
  35. package/dist/src/lib/process-auto-build.js.map +1 -1
  36. package/dist/src/lib/process-dedup-review.js +51 -0
  37. package/dist/src/lib/process-dedup-review.js.map +1 -1
  38. package/dist/src/lib/process-flow-build-plan.js +1071 -0
  39. package/dist/src/lib/process-flow-build-plan.js.map +1 -0
  40. package/dist/src/lib/process-payload-validation.js +14 -7
  41. package/dist/src/lib/process-payload-validation.js.map +1 -1
  42. package/dist/src/lib/process-publish-build.js +122 -4
  43. package/dist/src/lib/process-publish-build.js.map +1 -1
  44. package/dist/src/lib/{review-process.js → process-qa.js} +259 -117
  45. package/dist/src/lib/process-qa.js.map +1 -0
  46. package/dist/src/lib/process-refresh-references.js +19 -10
  47. package/dist/src/lib/process-refresh-references.js.map +1 -1
  48. package/dist/src/lib/process-required-fields.js +810 -0
  49. package/dist/src/lib/process-required-fields.js.map +1 -0
  50. package/dist/src/lib/process-save-draft-run.js +4 -1
  51. package/dist/src/lib/process-save-draft-run.js.map +1 -1
  52. package/dist/src/lib/publish.js +100 -0
  53. package/dist/src/lib/publish.js.map +1 -1
  54. package/dist/src/lib/runtime-rulesets.js +283 -0
  55. package/dist/src/lib/runtime-rulesets.js.map +1 -0
  56. package/package.json +2 -2
  57. package/dist/src/lib/review-flow.js.map +0 -1
  58. package/dist/src/lib/review-lifecyclemodel.js.map +0 -1
  59. package/dist/src/lib/review-process.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecyclemodel-qa.js","sourceRoot":"","sources":["../../../src/lib/lifecyclemodel-qa.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport {\n readJsonArtifact,\n writeJsonArtifact,\n writeJsonLinesArtifact,\n writeTextArtifact,\n} from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { ValidationIssue } from './validation.js';\n\ntype JsonObject = Record<string, unknown>;\n\ntype ModelEntry = {\n runName: string;\n modelFiles: string[];\n summaryPath: string;\n connectionsPath: string;\n processCatalogPath: string;\n};\n\ntype ModelFileReviewInfo = {\n modelFile: string;\n modelUuid: string;\n modelVersion: string;\n referenceProcessInternalId: string | null;\n resultingProcessUuid: string | null;\n processInstanceCount: number;\n zeroMultiplicationFactorCount: number;\n};\n\ntype LifecyclemodelValidationAggregate = {\n ok: boolean | null;\n reportPath: string | null;\n modelReports: Map<string, LifecyclemodelModelValidationSummary>;\n};\n\ntype LifecyclemodelModelValidationSummary = {\n ok: boolean | null;\n reportFile: string | null;\n engineCount: number;\n issues: ValidationIssue[];\n};\n\ntype SeverityCounts = {\n error: number;\n warning: number;\n info: number;\n};\n\nexport type LifecyclemodelQaFinding = {\n run_name: string;\n model_file: string | null;\n severity: 'error' | 'warning' | 'info';\n rule_id: string;\n source: 'validation' | 'qa';\n message: string;\n evidence: JsonObject;\n};\n\nexport type LifecyclemodelQaModelSummary = {\n run_name: string;\n model_files: string[];\n model_uuids: string[];\n model_versions: string[];\n reference_process_uuids: string[];\n reference_process_internal_ids: string[];\n resulting_process_uuids: string[];\n summary_process_count: number | null;\n process_instance_count: number;\n summary_edge_count: number | null;\n connection_count: number | null;\n process_catalog_count: number | null;\n multiplication_factor_count: number;\n zero_multiplication_factor_count: number;\n validation: {\n available: boolean;\n ok: boolean | null;\n report_file: string | null;\n engine_count: number;\n issue_count: number;\n };\n artifacts: {\n summary: string | null;\n connections: string | null;\n process_catalog: string | null;\n };\n finding_count: number;\n severity_counts: SeverityCounts;\n};\n\nexport type LifecyclemodelQaReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_local_lifecyclemodel_qa';\n run_id: string;\n run_root: string;\n out_dir: string;\n logic_version: string;\n model_count: number;\n finding_count: number;\n severity_counts: SeverityCounts;\n validation: {\n available: boolean;\n ok: boolean | null;\n report: string | null;\n };\n files: {\n run_manifest: string;\n invocation_index: string;\n validation_report: string | null;\n model_summaries: string;\n findings: string;\n summary: string;\n qa_zh: string;\n qa_en: string;\n timing: string;\n report: string;\n };\n model_summaries: LifecyclemodelQaModelSummary[];\n next_actions: string[];\n};\n\nexport type RunLifecyclemodelQaOptions = {\n runDir: string;\n outDir: string;\n startTs?: string;\n endTs?: string;\n logicVersion?: string;\n now?: () => Date;\n cwd?: string;\n};\n\nexport type LifecyclemodelQaLayout = {\n runId: string;\n runRoot: string;\n outDir: string;\n modelsDir: string;\n reportsDir: string;\n manifestsDir: string;\n runManifestPath: string;\n invocationIndexPath: string;\n validationReportPath: string;\n modelSummariesPath: string;\n findingsPath: string;\n summaryPath: string;\n reviewZhPath: string;\n reviewEnPath: string;\n timingPath: string;\n reportPath: string;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n return normalized || null;\n}\n\nfunction deepGet(value: unknown, pathParts: string[]): unknown {\n let current: unknown = value;\n for (const part of pathParts) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[part];\n }\n return current;\n}\n\nfunction listify(value: unknown): unknown[] {\n if (Array.isArray(value)) {\n return value;\n }\n if (value === undefined || value === null) {\n return [];\n }\n return [value];\n}\n\nfunction toNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n return null;\n}\n\nfunction toNonNegativeInteger(value: unknown): number | null {\n const parsed = toNumber(value);\n if (parsed === null || !Number.isInteger(parsed) || parsed < 0) {\n return null;\n }\n return parsed;\n}\n\nfunction uniqueStrings(values: Array<string | null | undefined>): string[] {\n return [\n ...new Set(\n values.filter(\n (value): value is string => typeof value === 'string' && value.trim().length > 0,\n ),\n ),\n ];\n}\n\nfunction copyJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction emptySeverityCounts(): SeverityCounts {\n return {\n error: 0,\n warning: 0,\n info: 0,\n };\n}\n\nfunction severityCounts(findings: LifecyclemodelQaFinding[]): SeverityCounts {\n return findings.reduce<SeverityCounts>((counts, finding) => {\n counts[finding.severity] += 1;\n return counts;\n }, emptySeverityCounts());\n}\n\nfunction readRequiredJsonObject(\n filePath: string,\n missingCode: string,\n invalidCode: string,\n label: string,\n): JsonObject {\n if (!existsSync(filePath)) {\n throw new CliError(`Required lifecyclemodel ${label} artifact not found: ${filePath}`, {\n code: missingCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected lifecyclemodel ${label} artifact JSON object: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n return value;\n}\n\nfunction readOptionalJsonObject(\n filePath: string,\n invalidCode: string,\n label: string,\n): JsonObject | null {\n if (!existsSync(filePath)) {\n return null;\n }\n\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected lifecyclemodel ${label} artifact JSON object: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n return value;\n}\n\nfunction readOptionalJsonArray(\n filePath: string,\n invalidCode: string,\n label: string,\n): unknown[] | null {\n if (!existsSync(filePath)) {\n return null;\n }\n\n const value = readJsonArtifact(filePath);\n if (!Array.isArray(value)) {\n throw new CliError(`Expected lifecyclemodel ${label} artifact JSON array: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { filePath, label },\n });\n }\n\n return value;\n}\n\nfunction buildLayout(runRoot: string, outDir: string): LifecyclemodelQaLayout {\n const runId = path.basename(runRoot);\n return {\n runId,\n runRoot,\n outDir,\n modelsDir: path.join(runRoot, 'models'),\n reportsDir: path.join(runRoot, 'reports'),\n manifestsDir: path.join(runRoot, 'manifests'),\n runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),\n invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),\n validationReportPath: path.join(\n runRoot,\n 'reports',\n 'lifecyclemodel-validate-build-report.json',\n ),\n modelSummariesPath: path.join(outDir, 'model_summaries.jsonl'),\n findingsPath: path.join(outDir, 'findings.jsonl'),\n summaryPath: path.join(outDir, 'lifecyclemodel_qa_summary.json'),\n reviewZhPath: path.join(outDir, 'lifecyclemodel_qa_zh.md'),\n reviewEnPath: path.join(outDir, 'lifecyclemodel_qa_en.md'),\n timingPath: path.join(outDir, 'lifecyclemodel_qa_timing.md'),\n reportPath: path.join(outDir, 'lifecyclemodel_qa_report.json'),\n };\n}\n\nfunction resolveLayout(options: RunLifecyclemodelQaOptions): LifecyclemodelQaLayout {\n const runDir = nonEmptyString(options.runDir);\n if (!runDir) {\n throw new CliError('Missing required --run-dir for qa lifecyclemodel.', {\n code: 'LIFECYCLEMODEL_QA_RUN_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const outDir = nonEmptyString(options.outDir);\n if (!outDir) {\n throw new CliError('Missing required --out-dir for qa lifecyclemodel.', {\n code: 'LIFECYCLEMODEL_QA_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n return buildLayout(path.resolve(runDir), path.resolve(outDir));\n}\n\nfunction ensureRunRootExists(layout: LifecyclemodelQaLayout): void {\n if (!existsSync(layout.runRoot)) {\n throw new CliError(`lifecyclemodel QA run root not found: ${layout.runRoot}`, {\n code: 'LIFECYCLEMODEL_QA_RUN_NOT_FOUND',\n exitCode: 2,\n });\n }\n}\n\nfunction readRequiredRunManifest(layout: LifecyclemodelQaLayout): JsonObject {\n const manifest = readRequiredJsonObject(\n layout.runManifestPath,\n 'LIFECYCLEMODEL_QA_RUN_MANIFEST_MISSING',\n 'LIFECYCLEMODEL_QA_RUN_MANIFEST_INVALID',\n 'run-manifest',\n );\n\n const manifestRunId = nonEmptyString(manifest.runId);\n if (manifestRunId && manifestRunId !== layout.runId) {\n throw new CliError(`lifecyclemodel QA run manifest runId mismatch: ${layout.runManifestPath}`, {\n code: 'LIFECYCLEMODEL_QA_RUN_MANIFEST_MISMATCH',\n exitCode: 2,\n details: {\n expected: layout.runId,\n actual: manifestRunId,\n },\n });\n }\n\n return manifest;\n}\n\nfunction readInvocationIndex(layout: LifecyclemodelQaLayout): JsonObject {\n if (!existsSync(layout.invocationIndexPath)) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n const value = readJsonArtifact(layout.invocationIndexPath);\n if (!isRecord(value)) {\n throw new CliError(\n `Expected lifecyclemodel QA invocation index JSON object: ${layout.invocationIndexPath}`,\n {\n code: 'LIFECYCLEMODEL_QA_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n if (value.invocations === undefined) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n if (!Array.isArray(value.invocations)) {\n throw new CliError(\n `Expected lifecyclemodel QA invocation index to contain an invocations array: ${layout.invocationIndexPath}`,\n {\n code: 'LIFECYCLEMODEL_QA_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n return value;\n}\n\nfunction discoverModelEntries(layout: LifecyclemodelQaLayout): ModelEntry[] {\n const runNames = existsSync(layout.modelsDir) ? readdirSync(layout.modelsDir).sort() : [];\n const entries = runNames.flatMap((runName) => {\n const lifecyclemodelsDir = path.join(\n layout.modelsDir,\n runName,\n 'tidas_bundle',\n 'lifecyclemodels',\n );\n if (!existsSync(lifecyclemodelsDir)) {\n return [];\n }\n\n const modelFiles = readdirSync(lifecyclemodelsDir)\n .filter((entry) => entry.endsWith('.json'))\n .sort()\n .map((entry) => path.join(lifecyclemodelsDir, entry));\n\n if (modelFiles.length === 0) {\n throw new CliError(\n `lifecyclemodel QA found a bundle without lifecyclemodel JSON files: ${lifecyclemodelsDir}`,\n {\n code: 'LIFECYCLEMODEL_QA_MODELS_EMPTY',\n exitCode: 2,\n },\n );\n }\n\n return [\n {\n runName,\n modelFiles,\n summaryPath: path.join(layout.modelsDir, runName, 'summary.json'),\n connectionsPath: path.join(layout.modelsDir, runName, 'connections.json'),\n processCatalogPath: path.join(layout.modelsDir, runName, 'process-catalog.json'),\n },\n ];\n });\n\n if (entries.length === 0) {\n throw new CliError(\n `lifecyclemodel QA run does not contain any model bundles: ${layout.modelsDir}`,\n {\n code: 'LIFECYCLEMODEL_QA_MODELS_NOT_FOUND',\n exitCode: 2,\n },\n );\n }\n\n return entries;\n}\n\nfunction normalizeValidationIssue(raw: unknown): ValidationIssue {\n if (!isRecord(raw)) {\n return {\n issue_code: 'validation_issue',\n severity: 'error',\n category: 'unknown',\n file_path: '<unknown>',\n message: String(raw),\n location: '<root>',\n context: {},\n };\n }\n\n const severity =\n raw.severity === 'warning' || raw.severity === 'info' || raw.severity === 'error'\n ? raw.severity\n : 'error';\n\n return {\n issue_code: nonEmptyString(raw.issue_code) ?? 'validation_issue',\n severity,\n category: nonEmptyString(raw.category) ?? 'unknown',\n file_path: nonEmptyString(raw.file_path) ?? '<unknown>',\n message: nonEmptyString(raw.message) ?? JSON.stringify(raw),\n location: nonEmptyString(raw.location) ?? '<root>',\n context: isRecord(raw.context) ? raw.context : {},\n };\n}\n\nfunction collectValidationIssues(validation: JsonObject): ValidationIssue[] {\n const executionReports = Array.isArray(validation.reports) ? validation.reports : [];\n const seen = new Set<string>();\n const issues: ValidationIssue[] = [];\n\n executionReports.forEach((report) => {\n if (!isRecord(report) || !isRecord(report.report)) {\n return;\n }\n\n const rawIssues = Array.isArray(report.report.issues) ? report.report.issues : [];\n rawIssues.forEach((rawIssue) => {\n const issue = normalizeValidationIssue(rawIssue);\n const key = JSON.stringify([\n issue.issue_code,\n issue.severity,\n issue.category,\n issue.file_path,\n issue.message,\n issue.location,\n ]);\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n issues.push(issue);\n });\n });\n\n return issues;\n}\n\nfunction readValidationAggregate(\n layout: LifecyclemodelQaLayout,\n): LifecyclemodelValidationAggregate {\n const aggregate = readOptionalJsonObject(\n layout.validationReportPath,\n 'LIFECYCLEMODEL_QA_VALIDATION_REPORT_INVALID',\n 'validate-build report',\n );\n\n if (!aggregate) {\n return {\n ok: null,\n reportPath: null,\n modelReports: new Map(),\n };\n }\n\n if (aggregate.model_reports !== undefined && !Array.isArray(aggregate.model_reports)) {\n throw new CliError(\n `Expected lifecyclemodel validate-build report to contain a model_reports array: ${layout.validationReportPath}`,\n {\n code: 'LIFECYCLEMODEL_QA_VALIDATION_REPORT_INVALID',\n exitCode: 2,\n },\n );\n }\n\n const modelReports = new Map<string, LifecyclemodelModelValidationSummary>();\n for (const rawEntry of Array.isArray(aggregate.model_reports) ? aggregate.model_reports : []) {\n if (!isRecord(rawEntry)) {\n throw new CliError(\n `Expected lifecyclemodel validate-build model report entry JSON object: ${layout.validationReportPath}`,\n {\n code: 'LIFECYCLEMODEL_QA_VALIDATION_REPORT_INVALID',\n exitCode: 2,\n },\n );\n }\n\n const runName = nonEmptyString(rawEntry.run_name);\n if (!runName || !isRecord(rawEntry.validation)) {\n throw new CliError(\n `Expected lifecyclemodel validate-build model report entry to contain run_name and validation: ${layout.validationReportPath}`,\n {\n code: 'LIFECYCLEMODEL_QA_VALIDATION_REPORT_INVALID',\n exitCode: 2,\n },\n );\n }\n\n const validation = rawEntry.validation;\n const executionReports = Array.isArray(validation.reports) ? validation.reports : [];\n modelReports.set(runName, {\n ok: typeof validation.ok === 'boolean' ? validation.ok : null,\n reportFile: nonEmptyString(rawEntry.report_file),\n engineCount: executionReports.length,\n issues: collectValidationIssues(validation),\n });\n }\n\n return {\n ok: typeof aggregate.ok === 'boolean' ? aggregate.ok : null,\n reportPath: layout.validationReportPath,\n modelReports,\n };\n}\n\nfunction modelRoot(value: JsonObject): JsonObject {\n return isRecord(value.lifeCycleModelDataSet)\n ? (value.lifeCycleModelDataSet as JsonObject)\n : value;\n}\n\nfunction readModelFileReviewInfo(filePath: string): ModelFileReviewInfo {\n const payload = readJsonArtifact(filePath);\n if (!isRecord(payload)) {\n throw new CliError(`Expected lifecyclemodel QA payload JSON object: ${filePath}`, {\n code: 'LIFECYCLEMODEL_QA_MODEL_INVALID',\n exitCode: 2,\n });\n }\n\n const root = modelRoot(payload);\n const processInstances = listify(\n deepGet(root, ['lifeCycleModelInformation', 'technology', 'processes', 'processInstance']),\n ).filter(isRecord);\n const zeroMultiplicationFactorCount = processInstances.filter(\n (instance) => toNumber(instance['@multiplicationFactor']) === 0,\n ).length;\n\n return {\n modelFile: filePath,\n modelUuid:\n nonEmptyString(\n deepGet(root, ['lifeCycleModelInformation', 'dataSetInformation', 'common:UUID']),\n ) ?? path.basename(filePath),\n modelVersion:\n nonEmptyString(\n deepGet(root, [\n 'administrativeInformation',\n 'publicationAndOwnership',\n 'common:dataSetVersion',\n ]),\n ) ?? 'unknown',\n referenceProcessInternalId: nonEmptyString(\n deepGet(root, [\n 'lifeCycleModelInformation',\n 'quantitativeReference',\n 'referenceToReferenceProcess',\n ]),\n ),\n resultingProcessUuid: nonEmptyString(\n deepGet(root, [\n 'lifeCycleModelInformation',\n 'dataSetInformation',\n 'referenceToResultingProcess',\n '@refObjectId',\n ]),\n ),\n processInstanceCount: processInstances.length,\n zeroMultiplicationFactorCount,\n };\n}\n\nfunction makeFinding(\n runName: string,\n modelFile: string | null,\n severity: LifecyclemodelQaFinding['severity'],\n ruleId: string,\n source: LifecyclemodelQaFinding['source'],\n message: string,\n evidence: JsonObject,\n): LifecyclemodelQaFinding {\n return {\n run_name: runName,\n model_file: modelFile,\n severity,\n rule_id: ruleId,\n source,\n message,\n evidence,\n };\n}\n\nfunction buildModelReview(\n entry: ModelEntry,\n validationAggregate: LifecyclemodelValidationAggregate,\n): {\n summary: LifecyclemodelQaModelSummary;\n findings: LifecyclemodelQaFinding[];\n} {\n const summaryArtifact = readOptionalJsonObject(\n entry.summaryPath,\n 'LIFECYCLEMODEL_QA_SUMMARY_INVALID',\n 'summary',\n );\n const connections = readOptionalJsonArray(\n entry.connectionsPath,\n 'LIFECYCLEMODEL_QA_CONNECTIONS_INVALID',\n 'connections',\n );\n const processCatalog = readOptionalJsonArray(\n entry.processCatalogPath,\n 'LIFECYCLEMODEL_QA_PROCESS_CATALOG_INVALID',\n 'process-catalog',\n );\n const modelFileInfos = entry.modelFiles.map((modelFile) => readModelFileReviewInfo(modelFile));\n const validation = validationAggregate.modelReports.get(entry.runName) ?? {\n ok: null,\n reportFile: null,\n engineCount: 0,\n issues: [],\n };\n\n const findings: LifecyclemodelQaFinding[] = [];\n validation.issues.forEach((issue) => {\n findings.push(\n makeFinding(\n entry.runName,\n issue.file_path,\n issue.severity,\n `validation:${issue.issue_code}`,\n 'validation',\n issue.message,\n {\n category: issue.category,\n location: issue.location,\n context: issue.context,\n },\n ),\n );\n });\n\n const modelUuids = uniqueStrings(modelFileInfos.map((info) => info.modelUuid));\n const modelVersions = uniqueStrings(modelFileInfos.map((info) => info.modelVersion));\n const resultingProcessUuids = uniqueStrings(\n modelFileInfos.map((info) => info.resultingProcessUuid),\n );\n const referenceProcessInternalIds = uniqueStrings(\n modelFileInfos.map((info) => info.referenceProcessInternalId),\n );\n const referenceProcessUuids = uniqueStrings([\n nonEmptyString(summaryArtifact?.reference_process_uuid),\n ]);\n const processInstanceCount = modelFileInfos.reduce(\n (sum, info) => sum + info.processInstanceCount,\n 0,\n );\n const zeroMultiplicationFactorCount = modelFileInfos.reduce(\n (sum, info) => sum + info.zeroMultiplicationFactorCount,\n 0,\n );\n const summaryProcessCount = toNonNegativeInteger(summaryArtifact?.process_count);\n const summaryEdgeCount = toNonNegativeInteger(summaryArtifact?.edge_count);\n const multiplicationFactors = isRecord(summaryArtifact?.multiplication_factors)\n ? (summaryArtifact?.multiplication_factors as JsonObject)\n : null;\n const multiplicationFactorCount = multiplicationFactors\n ? Object.keys(multiplicationFactors).length\n : 0;\n\n if (!summaryArtifact) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_model_summary',\n 'qa',\n 'Model bundle is missing summary.json generated by lifecyclemodel auto-build.',\n {\n summary_path: entry.summaryPath,\n },\n ),\n );\n }\n\n if (!connections) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_connections_artifact',\n 'qa',\n 'Model bundle is missing connections.json generated by lifecyclemodel auto-build.',\n {\n connections_path: entry.connectionsPath,\n },\n ),\n );\n }\n\n if (!processCatalog) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_process_catalog',\n 'qa',\n 'Model bundle is missing process-catalog.json generated by lifecyclemodel auto-build.',\n {\n process_catalog_path: entry.processCatalogPath,\n },\n ),\n );\n }\n\n if (referenceProcessUuids.length === 0) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_reference_process_uuid',\n 'qa',\n 'QA could not resolve reference_process_uuid from summary.json.',\n {\n summary_path: summaryArtifact ? entry.summaryPath : null,\n },\n ),\n );\n }\n\n if (resultingProcessUuids.length === 0) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'missing_resulting_process_ref',\n 'qa',\n 'QA could not resolve referenceToResultingProcess from the lifecyclemodel payload.',\n {\n model_files: entry.modelFiles,\n },\n ),\n );\n }\n\n if (processInstanceCount === 0) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'error',\n 'empty_process_instances',\n 'qa',\n 'Lifecyclemodel payload does not contain any processInstance entries.',\n {\n model_files: entry.modelFiles,\n },\n ),\n );\n }\n\n if (summaryProcessCount !== null && summaryProcessCount !== processInstanceCount) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'process_count_mismatch',\n 'qa',\n 'summary.json process_count does not match the number of processInstance entries in the payload.',\n {\n summary_process_count: summaryProcessCount,\n process_instance_count: processInstanceCount,\n },\n ),\n );\n }\n\n if (connections && summaryEdgeCount !== null && connections.length !== summaryEdgeCount) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'edge_count_mismatch',\n 'qa',\n 'summary.json edge_count does not match the connections.json row count.',\n {\n summary_edge_count: summaryEdgeCount,\n connection_count: connections.length,\n },\n ),\n );\n }\n\n if (processCatalog && processCatalog.length !== processInstanceCount) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'process_catalog_count_mismatch',\n 'qa',\n 'process-catalog.json row count does not match the number of processInstance entries in the payload.',\n {\n process_catalog_count: processCatalog.length,\n process_instance_count: processInstanceCount,\n },\n ),\n );\n }\n\n if (\n summaryArtifact &&\n multiplicationFactors &&\n multiplicationFactorCount !== processInstanceCount\n ) {\n findings.push(\n makeFinding(\n entry.runName,\n entry.modelFiles[0] ?? null,\n 'warning',\n 'multiplication_factor_count_mismatch',\n 'qa',\n 'summary.json multiplication_factors count does not match the number of processInstance entries in the payload.',\n {\n multiplication_factor_count: multiplicationFactorCount,\n process_instance_count: processInstanceCount,\n },\n ),\n );\n }\n\n const counts = severityCounts(findings);\n return {\n summary: {\n run_name: entry.runName,\n model_files: entry.modelFiles,\n model_uuids: modelUuids,\n model_versions: modelVersions,\n reference_process_uuids: referenceProcessUuids,\n reference_process_internal_ids: referenceProcessInternalIds,\n resulting_process_uuids: resultingProcessUuids,\n summary_process_count: summaryProcessCount,\n process_instance_count: processInstanceCount,\n summary_edge_count: summaryEdgeCount,\n connection_count: connections ? connections.length : null,\n process_catalog_count: processCatalog ? processCatalog.length : null,\n multiplication_factor_count: multiplicationFactorCount,\n zero_multiplication_factor_count: zeroMultiplicationFactorCount,\n validation: {\n available: validationAggregate.reportPath !== null,\n ok: validation.ok,\n report_file: validation.reportFile,\n engine_count: validation.engineCount,\n issue_count: validation.issues.length,\n },\n artifacts: {\n summary: summaryArtifact ? entry.summaryPath : null,\n connections: connections ? entry.connectionsPath : null,\n process_catalog: processCatalog ? entry.processCatalogPath : null,\n },\n finding_count: findings.length,\n severity_counts: counts,\n },\n findings,\n };\n}\n\nfunction buildInvocationIndex(\n layout: LifecyclemodelQaLayout,\n invocationIndex: JsonObject,\n options: RunLifecyclemodelQaOptions,\n now: Date,\n): JsonObject {\n const priorInvocations = Array.isArray(invocationIndex.invocations)\n ? [...invocationIndex.invocations]\n : [];\n const command = [\n 'qa',\n 'lifecyclemodel',\n '--run-dir',\n options.runDir,\n '--out-dir',\n options.outDir,\n ];\n\n if (nonEmptyString(options.logicVersion)) {\n command.push('--logic-version', options.logicVersion as string);\n }\n if (nonEmptyString(options.startTs)) {\n command.push('--start-ts', options.startTs as string);\n }\n if (nonEmptyString(options.endTs)) {\n command.push('--end-ts', options.endTs as string);\n }\n\n return {\n ...invocationIndex,\n schema_version:\n typeof invocationIndex.schema_version === 'number' ? invocationIndex.schema_version : 1,\n invocations: [\n ...priorInvocations,\n {\n command,\n cwd: options.cwd ?? process.cwd(),\n created_at: now.toISOString(),\n run_id: layout.runId,\n run_root: layout.runRoot,\n report_path: layout.reportPath,\n },\n ],\n };\n}\n\nfunction buildNextActions(\n layout: LifecyclemodelQaLayout,\n validationAggregate: LifecyclemodelValidationAggregate,\n): string[] {\n return [\n `inspect: ${layout.findingsPath}`,\n validationAggregate.reportPath\n ? `inspect: ${validationAggregate.reportPath}`\n : `run: tiangong-lca lifecyclemodel validate-build --run-dir ${layout.runRoot}`,\n `run: tiangong-lca lifecyclemodel publish-build --run-dir ${layout.runRoot}`,\n ];\n}\n\nfunction renderZhReview(options: {\n runId: string;\n logicVersion: string;\n runRoot: string;\n modelSummaries: LifecyclemodelQaModelSummary[];\n findings: LifecyclemodelQaFinding[];\n validation: LifecyclemodelQaReport['validation'];\n}): string {\n const lines = [\n '# lifecyclemodel_qa_zh\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n `- run_root: \\`${options.runRoot}\\`\\n`,\n '\\n## 总览\\n',\n `- model bundle 数量: **${options.modelSummaries.length}**\\n`,\n `- findings 数量: **${options.findings.length}**\\n`,\n `- validation report: \\`${options.validation.available ? 'available' : 'missing'}\\`\\n`,\n ];\n\n lines.push(\n '\\n## 模型摘要\\n|run name|model uuid 数|processInstance|connections|validation issues|findings|\\n|---|---:|---:|---:|---:|---:|\\n',\n );\n options.modelSummaries.forEach((summary) => {\n lines.push(\n `|${summary.run_name}|${summary.model_uuids.length}|${summary.process_instance_count}|${summary.connection_count ?? 0}|${summary.validation.issue_count}|${summary.finding_count}|\\n`,\n );\n });\n\n lines.push('\\n## Findings\\n');\n if (options.findings.length === 0) {\n lines.push('- 未发现新的 lifecyclemodel QA findings。\\n');\n } else {\n lines.push('\\n|run name|severity|source|rule id|message|\\n|---|---|---|---|---|\\n');\n options.findings.slice(0, 200).forEach((finding) => {\n lines.push(\n `|${finding.run_name}|${finding.severity}|${finding.source}|${finding.rule_id}|${finding.message.replace(/\\|/gu, '/')}|\\n`,\n );\n });\n }\n\n lines.push(\n '\\n## 说明\\n',\n '- 当前 qa lifecyclemodel 保持 local-first / artifact-first,只读取现有 build run 与 validate-build 产物。\\n',\n '- 当前命令不引入 Python、LangGraph 或 skill 私有 QA runtime。\\n',\n );\n\n return lines.join('');\n}\n\nfunction renderEnReview(options: {\n runId: string;\n logicVersion: string;\n runRoot: string;\n modelSummaries: LifecyclemodelQaModelSummary[];\n findings: LifecyclemodelQaFinding[];\n validation: LifecyclemodelQaReport['validation'];\n}): string {\n const lines = [\n '# lifecyclemodel_qa_en\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n `- run_root: \\`${options.runRoot}\\`\\n`,\n '\\n## Summary\\n',\n `- model bundles: **${options.modelSummaries.length}**\\n`,\n `- findings: **${options.findings.length}**\\n`,\n `- validation report: \\`${options.validation.available ? 'available' : 'missing'}\\`\\n`,\n ];\n\n lines.push(\n '\\n## Model overview\\n|run name|model uuids|process instances|connections|validation issues|findings|\\n|---|---:|---:|---:|---:|---:|\\n',\n );\n options.modelSummaries.forEach((summary) => {\n lines.push(\n `|${summary.run_name}|${summary.model_uuids.length}|${summary.process_instance_count}|${summary.connection_count ?? 0}|${summary.validation.issue_count}|${summary.finding_count}|\\n`,\n );\n });\n\n if (options.findings.length > 0) {\n lines.push('\\n## Findings\\n');\n options.findings.slice(0, 100).forEach((finding) => {\n lines.push(`- [${finding.severity}] ${finding.run_name}: ${finding.message}\\n`);\n });\n }\n\n return lines.join('');\n}\n\nfunction renderTiming(options: {\n runId: string;\n startTs?: string;\n endTs?: string;\n modelCount: number;\n}): string {\n const lines = ['# lifecyclemodel_qa_timing\\n', `- run_id: \\`${options.runId}\\`\\n`];\n if (options.startTs && options.endTs) {\n const started = Date.parse(options.startTs);\n const ended = Date.parse(options.endTs);\n if (!Number.isFinite(started) || !Number.isFinite(ended)) {\n throw new CliError('Expected --start-ts and --end-ts to be valid ISO timestamps.', {\n code: 'LIFECYCLEMODEL_QA_INVALID_TIMESTAMP',\n exitCode: 2,\n });\n }\n\n lines.push(`- start: \\`${options.startTs}\\`\\n`);\n lines.push(`- end: \\`${options.endTs}\\`\\n`);\n lines.push(`- total elapsed: **${((ended - started) / 60_000).toFixed(2)} min**\\n`);\n }\n\n lines.push(`- model bundles reviewed: \\`${options.modelCount}\\`\\n`);\n lines.push(\n '- major time consumers: model JSON parsing, validation issue aggregation, artifact checks.\\n',\n );\n return lines.join('');\n}\n\nexport async function runLifecyclemodelQa(\n options: RunLifecyclemodelQaOptions,\n): Promise<LifecyclemodelQaReport> {\n const layout = resolveLayout(options);\n ensureRunRootExists(layout);\n readRequiredRunManifest(layout);\n const invocationIndex = readInvocationIndex(layout);\n const validationAggregate = readValidationAggregate(layout);\n const modelEntries = discoverModelEntries(layout);\n const logicVersion = options.logicVersion?.trim() || 'lifecyclemodel-qa-v1.0';\n const now = options.now ?? (() => new Date());\n const generatedAt = now();\n\n const reviewedModels = modelEntries.map((entry) => buildModelReview(entry, validationAggregate));\n const modelSummaries = reviewedModels.map((model) => model.summary);\n const findings = reviewedModels.flatMap((model) => model.findings);\n const report: LifecyclemodelQaReport = {\n schema_version: 1,\n generated_at_utc: generatedAt.toISOString(),\n status: 'completed_local_lifecyclemodel_qa',\n run_id: layout.runId,\n run_root: layout.runRoot,\n out_dir: layout.outDir,\n logic_version: logicVersion,\n model_count: modelSummaries.length,\n finding_count: findings.length,\n severity_counts: severityCounts(findings),\n validation: {\n available: validationAggregate.reportPath !== null,\n ok: validationAggregate.ok,\n report: validationAggregate.reportPath,\n },\n files: {\n run_manifest: layout.runManifestPath,\n invocation_index: layout.invocationIndexPath,\n validation_report: validationAggregate.reportPath,\n model_summaries: layout.modelSummariesPath,\n findings: layout.findingsPath,\n summary: layout.summaryPath,\n qa_zh: layout.reviewZhPath,\n qa_en: layout.reviewEnPath,\n timing: layout.timingPath,\n report: layout.reportPath,\n },\n model_summaries: modelSummaries,\n next_actions: buildNextActions(layout, validationAggregate),\n };\n\n writeJsonArtifact(\n layout.invocationIndexPath,\n buildInvocationIndex(layout, invocationIndex, options, generatedAt),\n );\n writeJsonLinesArtifact(layout.modelSummariesPath, modelSummaries);\n writeJsonLinesArtifact(layout.findingsPath, findings);\n writeJsonArtifact(layout.summaryPath, {\n run_id: report.run_id,\n logic_version: report.logic_version,\n model_count: report.model_count,\n finding_count: report.finding_count,\n severity_counts: copyJson(report.severity_counts),\n validation: copyJson(report.validation),\n });\n writeTextArtifact(\n layout.reviewZhPath,\n renderZhReview({\n runId: report.run_id,\n logicVersion: report.logic_version,\n runRoot: report.run_root,\n modelSummaries,\n findings,\n validation: report.validation,\n }),\n );\n writeTextArtifact(\n layout.reviewEnPath,\n renderEnReview({\n runId: report.run_id,\n logicVersion: report.logic_version,\n runRoot: report.run_root,\n modelSummaries,\n findings,\n validation: report.validation,\n }),\n );\n writeTextArtifact(\n layout.timingPath,\n renderTiming({\n runId: report.run_id,\n startTs: options.startTs,\n endTs: options.endTs,\n modelCount: report.model_count,\n }),\n );\n writeJsonArtifact(layout.reportPath, report);\n\n return report;\n}\n\nexport const __testInternals = {\n buildLayout,\n resolveLayout,\n readInvocationIndex,\n discoverModelEntries,\n readValidationAggregate,\n readModelFileReviewInfo,\n buildModelReview,\n buildInvocationIndex,\n buildNextActions,\n renderZhReview,\n renderEnReview,\n renderTiming,\n};\n"]}
@@ -379,6 +379,7 @@ function buildLayout(runRoot, runId) {
379
379
  sourcePolicyPath: path.join(runRoot, 'request', 'source-policy.json'),
380
380
  flowSummaryPath: path.join(runRoot, 'manifests', 'flow-summary.json'),
381
381
  inputManifestPath: path.join(runRoot, 'input', 'input_manifest.json'),
382
+ buildPlanPath: path.join(runRoot, 'manifests', 'process-build-plan.json'),
382
383
  assemblyPlanPath: path.join(runRoot, 'manifests', 'assembly-plan.json'),
383
384
  lineageManifestPath: path.join(runRoot, 'manifests', 'lineage-manifest.json'),
384
385
  invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),
@@ -455,6 +456,147 @@ function buildAssemblyPlan(runRoot) {
455
456
  })),
456
457
  };
457
458
  }
459
+ function flowReferencePropertySummary(flowDataset) {
460
+ const flowInformation = isRecord(flowDataset.flowInformation) ? flowDataset.flowInformation : {};
461
+ const quantitativeReference = isRecord(flowInformation.quantitativeReference)
462
+ ? flowInformation.quantitativeReference
463
+ : {};
464
+ const referenceId = nonEmptyString(quantitativeReference.referenceToReferenceFlowProperty);
465
+ const flowProperties = isRecord(flowDataset.flowProperties) ? flowDataset.flowProperties : {};
466
+ const propertyRows = Array.isArray(flowProperties.flowProperty)
467
+ ? flowProperties.flowProperty
468
+ : flowProperties.flowProperty
469
+ ? [flowProperties.flowProperty]
470
+ : [];
471
+ const referenceProperty = propertyRows.find((entry) => isRecord(entry) && nonEmptyString(entry['@dataSetInternalID']) === (referenceId ?? '0'));
472
+ const propertyRef = isRecord(referenceProperty) && isRecord(referenceProperty.referenceToFlowPropertyDataSet)
473
+ ? referenceProperty.referenceToFlowPropertyDataSet
474
+ : {};
475
+ const shortDescription = isRecord(propertyRef['common:shortDescription'])
476
+ ? propertyRef['common:shortDescription']
477
+ : {};
478
+ const propertyText = extractText(shortDescription) ?? extractText(propertyRef['common:shortDescription']);
479
+ return {
480
+ reference_property: propertyText ?? 'Reference flow property',
481
+ reference_property_id: nonEmptyString(propertyRef['@refObjectId']),
482
+ reference_unit: null,
483
+ };
484
+ }
485
+ function buildInitialProcessBuildPlan(normalized, flowArtifactPath) {
486
+ const flowProperty = flowReferencePropertySummary(normalized.flow_dataset);
487
+ const referenceFlowId = normalized.flow_summary.uuid ??
488
+ nonEmptyString(normalized.flow_dataset['@id']) ??
489
+ sanitizeRunToken(normalized.flow_summary.base_name ?? normalized.run_id, 'reference-flow');
490
+ const referenceFlowVersion = normalized.flow_summary.version ?? '00.00.000';
491
+ const baseName = normalized.flow_summary.base_name
492
+ ? `${normalized.operation === 'treat' ? 'Treatment of' : 'Production of'} ${normalized.flow_summary.base_name}`
493
+ : `${normalized.operation === 'treat' ? 'Treatment' : 'Production'} process from reference flow`;
494
+ return {
495
+ schema_version: 1,
496
+ kind: 'process',
497
+ ruleset: {
498
+ id: 'process-authoring/strict',
499
+ version: '1',
500
+ },
501
+ target: {
502
+ geography: 'GLO',
503
+ technology_route: normalized.operation === 'treat'
504
+ ? 'Treatment route to be evidenced during process auto-build'
505
+ : 'Production route to be evidenced during process auto-build',
506
+ classification_path: [
507
+ 'Technosphere',
508
+ normalized.operation === 'treat' ? 'Treatment' : 'Production',
509
+ flowProperty.reference_property,
510
+ normalized.flow_summary.base_name ?? 'Reference flow',
511
+ ],
512
+ },
513
+ identity_decision: {
514
+ decision: 'create_new',
515
+ rationale: 'Initial process auto-build scaffold; identity preflight must be rerun with remote/local candidates before write.',
516
+ },
517
+ evidence_manifest: {
518
+ sources: [
519
+ {
520
+ id: `flow:${referenceFlowId}`,
521
+ type: 'input_flow_dataset',
522
+ path: flowArtifactPath,
523
+ title: normalized.flow_summary.base_name ?? referenceFlowId,
524
+ version: referenceFlowVersion,
525
+ },
526
+ ...normalized.source_inputs.map((source) => ({
527
+ id: source.source_id,
528
+ type: source.type,
529
+ path: source.artifact_path,
530
+ title: source.artifact_file_name,
531
+ intended_roles: source.intended_roles,
532
+ })),
533
+ ],
534
+ field_bindings: [
535
+ { field_path: 'target', source_id: `flow:${referenceFlowId}` },
536
+ { field_path: 'identity_decision.decision', source_id: `flow:${referenceFlowId}` },
537
+ { field_path: 'unit_of_analysis', source_id: `flow:${referenceFlowId}` },
538
+ { field_path: 'name_plan.base_name', source_id: `flow:${referenceFlowId}` },
539
+ { field_path: 'target.geography', source_id: `flow:${referenceFlowId}` },
540
+ { field_path: 'target.technology_route', source_id: `flow:${referenceFlowId}` },
541
+ {
542
+ field_path: 'quantitative_reference_plan.reference_flow_id',
543
+ source_id: `flow:${referenceFlowId}`,
544
+ },
545
+ ],
546
+ },
547
+ unit_of_analysis: {
548
+ target_kind: normalized.operation === 'treat' ? 'treatment' : 'process_from_flow_scaffold',
549
+ decision: 'manual_review',
550
+ functional_unit: {
551
+ what: normalized.operation === 'treat'
552
+ ? `treat ${normalized.flow_summary.base_name ?? 'the reference flow'}`
553
+ : `produce ${normalized.flow_summary.base_name ?? 'the reference flow'}`,
554
+ how_much: `1 ${flowProperty.reference_unit ?? flowProperty.reference_property}`,
555
+ how_well: 'to be determined from source evidence before materialization',
556
+ how_long: 'not determined in the initial scaffold',
557
+ },
558
+ reference_flow: {
559
+ flow_identity: normalized.flow_summary.base_name ?? referenceFlowId,
560
+ reference_unit: flowProperty.reference_unit ?? flowProperty.reference_property,
561
+ reference_amount: 1,
562
+ flow_property: flowProperty.reference_property,
563
+ },
564
+ declared_unit_allowed: false,
565
+ scaling_evidence_status: 'source_required',
566
+ notes: [
567
+ 'Initial scaffold only. A skill/Codex workflow must revise unit_of_analysis before build-plan materialize.',
568
+ ],
569
+ },
570
+ name_plan: {
571
+ base_name: baseName,
572
+ treatment_standards_routes: normalized.operation === 'treat' ? 'treatment route' : 'production route',
573
+ mix_and_location_types: 'global average',
574
+ functional_unit_flow_properties: flowProperty.reference_unit ?? flowProperty.reference_property,
575
+ },
576
+ quantitative_reference_plan: {
577
+ reference_flow_id: referenceFlowId,
578
+ reference_flow_version: referenceFlowVersion,
579
+ reference_flow_name: normalized.flow_summary.base_name ?? referenceFlowId,
580
+ reference_flow_internal_id: '1',
581
+ mean_amount: '1.0',
582
+ resulting_amount: '1.0',
583
+ reference_unit: flowProperty.reference_unit ?? flowProperty.reference_property,
584
+ },
585
+ flow_property_plan: flowProperty,
586
+ exchange_plan: {
587
+ exchanges: [],
588
+ },
589
+ materialization_readiness: {
590
+ status: 'scaffold_only',
591
+ next_required_steps: [
592
+ 'replace scaffold unit_of_analysis with a skill-authored decision artifact',
593
+ 'run process identity-preflight with local and remote candidates',
594
+ 'replace scaffold geography, technology, classification, exchange values, and annual volume with evidence-backed values',
595
+ 'run process build-plan validate/materialize before save-draft or publish-build',
596
+ ],
597
+ },
598
+ };
599
+ }
458
600
  function buildLineageManifest(normalized) {
459
601
  return {
460
602
  schema_version: 1,
@@ -575,6 +717,7 @@ function buildAgentHandoffSummary(normalized, layout, flowArtifactPath, now) {
575
717
  request_snapshot: layout.requestSnapshotPath,
576
718
  normalized_request: layout.normalizedRequestPath,
577
719
  assembly_plan: layout.assemblyPlanPath,
720
+ build_plan: layout.buildPlanPath,
578
721
  flow_copy: flowArtifactPath,
579
722
  },
580
723
  next_actions: buildNextActions(layout),
@@ -611,6 +754,7 @@ function buildReport(normalized, layout, flowArtifactPath, now) {
611
754
  source_policy: layout.sourcePolicyPath,
612
755
  flow_summary: layout.flowSummaryPath,
613
756
  input_manifest: layout.inputManifestPath,
757
+ build_plan: layout.buildPlanPath,
614
758
  assembly_plan: layout.assemblyPlanPath,
615
759
  lineage_manifest: layout.lineageManifestPath,
616
760
  invocation_index: layout.invocationIndexPath,
@@ -679,7 +823,9 @@ export async function runProcessAutoBuild(options) {
679
823
  flow_path: normalized.flow_file,
680
824
  flow_artifact_path: flowArtifactPath,
681
825
  operation: normalized.operation,
826
+ build_plan_path: layout.buildPlanPath,
682
827
  });
828
+ writeJsonArtifact(layout.buildPlanPath, buildInitialProcessBuildPlan(normalized, flowArtifactPath));
683
829
  writeJsonArtifact(layout.assemblyPlanPath, buildAssemblyPlan(layout.runRoot));
684
830
  writeJsonArtifact(layout.lineageManifestPath, buildLineageManifest(normalized));
685
831
  writeJsonArtifact(layout.invocationIndexPath, buildInvocationIndex(normalized, options, layout.reportPath, now));
@@ -711,6 +857,7 @@ export const __testInternals = {
711
857
  buildProcessAutoBuildRunId,
712
858
  buildLayout,
713
859
  buildAssemblyPlan,
860
+ buildInitialProcessBuildPlan,
714
861
  buildLineageManifest,
715
862
  buildInvocationIndex,
716
863
  buildInitialState,