@tiangong-lca/cli 0.0.11 → 0.0.13

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 (60) hide show
  1. package/README.md +18 -7
  2. package/assets/tidas-schemas/tidas_contacts.json +312 -0
  3. package/assets/tidas-schemas/tidas_contacts_category.json +126 -0
  4. package/assets/tidas-schemas/tidas_data_types.json +359 -0
  5. package/assets/tidas-schemas/tidas_flowproperties.json +303 -0
  6. package/assets/tidas-schemas/tidas_flowproperties_category.json +61 -0
  7. package/assets/tidas-schemas/tidas_flows.json +809 -0
  8. package/assets/tidas-schemas/tidas_flows_elementary_category.json +720 -0
  9. package/assets/tidas-schemas/tidas_flows_product_category.json +59623 -0
  10. package/assets/tidas-schemas/tidas_lciamethods.json +1326 -0
  11. package/assets/tidas-schemas/tidas_lciamethods_category.json +685 -0
  12. package/assets/tidas-schemas/tidas_lifecyclemodels.json +1374 -0
  13. package/assets/tidas-schemas/tidas_locations_category.json +2593 -0
  14. package/assets/tidas-schemas/tidas_processes.json +1646 -0
  15. package/assets/tidas-schemas/tidas_processes_category.json +10795 -0
  16. package/assets/tidas-schemas/tidas_sources.json +228 -0
  17. package/assets/tidas-schemas/tidas_sources_category.json +100 -0
  18. package/assets/tidas-schemas/tidas_unitgroups.json +338 -0
  19. package/assets/tidas-schemas/tidas_unitgroups_category.json +61 -0
  20. package/dist/src/cli.js +847 -13
  21. package/dist/src/cli.js.map +1 -1
  22. package/dist/src/lib/dataset-classification.js +947 -0
  23. package/dist/src/lib/dataset-classification.js.map +1 -0
  24. package/dist/src/lib/dataset-command.js +11 -0
  25. package/dist/src/lib/dataset-command.js.map +1 -1
  26. package/dist/src/lib/dataset-contract.js +2 -0
  27. package/dist/src/lib/dataset-contract.js.map +1 -1
  28. package/dist/src/lib/dataset-curation-queue.js +359 -2
  29. package/dist/src/lib/dataset-curation-queue.js.map +1 -1
  30. package/dist/src/lib/dataset-import-lca.js +18 -0
  31. package/dist/src/lib/dataset-import-lca.js.map +1 -1
  32. package/dist/src/lib/dataset-local.js +94 -1
  33. package/dist/src/lib/dataset-local.js.map +1 -1
  34. package/dist/src/lib/dataset-maintenance-clear-account.js +506 -0
  35. package/dist/src/lib/dataset-maintenance-clear-account.js.map +1 -0
  36. package/dist/src/lib/dataset-patch.js +797 -0
  37. package/dist/src/lib/dataset-patch.js.map +1 -0
  38. package/dist/src/lib/dataset-remote-verify.js +188 -3
  39. package/dist/src/lib/dataset-remote-verify.js.map +1 -1
  40. package/dist/src/lib/dataset-save-draft-run.js +725 -0
  41. package/dist/src/lib/dataset-save-draft-run.js.map +1 -0
  42. package/dist/src/lib/dataset-validate.js +32 -2
  43. package/dist/src/lib/dataset-validate.js.map +1 -1
  44. package/dist/src/lib/flow-publish-version.js +7 -2
  45. package/dist/src/lib/flow-publish-version.js.map +1 -1
  46. package/dist/src/lib/flow-qa.js +8 -0
  47. package/dist/src/lib/flow-qa.js.map +1 -1
  48. package/dist/src/lib/identity-preflight.js +895 -117
  49. package/dist/src/lib/identity-preflight.js.map +1 -1
  50. package/dist/src/lib/lifecyclemodel-qa.js +159 -34
  51. package/dist/src/lib/lifecyclemodel-qa.js.map +1 -1
  52. package/dist/src/lib/process-required-fields.js +62 -12
  53. package/dist/src/lib/process-required-fields.js.map +1 -1
  54. package/dist/src/lib/process-save-draft-run.js +10 -0
  55. package/dist/src/lib/process-save-draft-run.js.map +1 -1
  56. package/dist/src/lib/process-save-draft.js +59 -3
  57. package/dist/src/lib/process-save-draft.js.map +1 -1
  58. package/dist/src/lib/supabase-client.js +19 -8
  59. package/dist/src/lib/supabase-client.js.map +1 -1
  60. package/package.json +2 -1
@@ -1 +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"]}
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 { materializeDatasetRows } from './dataset-local.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 inputMode: 'run_dir' | 'rows_file';\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 rows_file: string;\n input_mode: 'run_dir' | 'rows_file';\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 qa_input_summary: string | null;\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 rowsFile?: 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 rowsFile: string;\n inputMode: 'run_dir' | 'rows_file';\n outDir: string;\n modelsDir: string;\n reportsDir: string;\n manifestsDir: string;\n runManifestPath: string;\n invocationIndexPath: string;\n validationReportPath: string;\n qaInputSummaryPath: string | null;\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 sanitizeFileName(value: unknown): string {\n return (\n String(value ?? 'missing')\n .replace(/[^A-Za-z0-9._-]+/gu, '_')\n .replace(/^_+|_+$/gu, '') || 'missing'\n );\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(options: {\n runRoot: string;\n outDir: string;\n rowsFile?: string;\n inputMode?: 'run_dir' | 'rows_file';\n}): LifecyclemodelQaLayout {\n const runRoot = options.runRoot;\n const outDir = options.outDir;\n const runId = path.basename(runRoot);\n return {\n runId,\n runRoot,\n rowsFile: options.rowsFile ?? '',\n inputMode: options.inputMode ?? 'run_dir',\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 qaInputSummaryPath:\n options.inputMode === 'rows_file' ? path.join(outDir, 'qa_input_summary.json') : null,\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 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 const rowsFile = nonEmptyString(options.rowsFile);\n const runDir = nonEmptyString(options.runDir);\n if (rowsFile && runDir) {\n throw new CliError('Use either --rows-file or --run-dir for qa lifecyclemodel, not both.', {\n code: 'LIFECYCLEMODEL_QA_INPUT_MODE_CONFLICT',\n exitCode: 2,\n });\n }\n\n if (rowsFile) {\n const resolvedRowsFile = path.resolve(rowsFile);\n return buildLayout({\n runRoot: path.join(\n path.resolve(outDir),\n 'qa-input',\n sanitizeFileName(path.basename(rowsFile)),\n ),\n rowsFile: resolvedRowsFile,\n inputMode: 'rows_file',\n outDir: path.resolve(outDir),\n });\n }\n if (!runDir) {\n throw new CliError('Missing required --rows-file or --run-dir for qa lifecyclemodel.', {\n code: 'LIFECYCLEMODEL_QA_RUN_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n return buildLayout({\n runRoot: path.resolve(runDir),\n outDir: path.resolve(outDir),\n inputMode: 'run_dir',\n });\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 inputMode: layout.inputMode,\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 materializeRowsFile(layout: LifecyclemodelQaLayout): {\n invocationIndex: JsonObject;\n validationAggregate: LifecyclemodelValidationAggregate;\n modelEntries: ModelEntry[];\n} {\n if (!layout.rowsFile || !existsSync(layout.rowsFile)) {\n throw new CliError(`Lifecyclemodel QA rows file not found: ${layout.rowsFile}`, {\n code: 'LIFECYCLEMODEL_QA_ROWS_FILE_NOT_FOUND',\n exitCode: 2,\n details: { rowsFile: layout.rowsFile },\n });\n }\n\n const rows = materializeDatasetRows(layout.rowsFile);\n const entries: ModelEntry[] = [];\n writeJsonArtifact(layout.runManifestPath, {\n schemaVersion: 1,\n runId: layout.runId,\n input_mode: 'rows_file',\n rows_file: layout.rowsFile,\n row_count: rows.length,\n });\n writeJsonArtifact(layout.invocationIndexPath, {\n schema_version: 1,\n invocations: [],\n });\n\n rows.forEach((row) => {\n if (row.kind && row.kind !== 'lifecyclemodel') {\n throw new CliError(\n `Expected lifecyclemodel row at index ${row.index}; detected ${row.kind}.`,\n {\n code: 'LIFECYCLEMODEL_QA_ROWS_FILE_KIND_MISMATCH',\n exitCode: 2,\n details: { index: row.index, detectedKind: row.kind },\n },\n );\n }\n\n const runName = sanitizeFileName(row.id ?? `row-${row.index + 1}`);\n const modelFile = path.join(\n layout.modelsDir,\n runName,\n 'tidas_bundle',\n 'lifecyclemodels',\n `${runName}.json`,\n );\n writeJsonArtifact(modelFile, row.payload);\n entries.push({\n runName,\n modelFiles: [modelFile],\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 inputMode: 'rows_file',\n });\n });\n\n if (layout.qaInputSummaryPath) {\n writeJsonArtifact(layout.qaInputSummaryPath, {\n input_mode: 'rows_file',\n rows_file: layout.rowsFile,\n run_root: layout.runRoot,\n materialized_lifecyclemodel_count: entries.length,\n materialized_models_dir: layout.modelsDir,\n });\n }\n\n return {\n invocationIndex: {\n schema_version: 1,\n invocations: [],\n },\n validationAggregate: {\n ok: null,\n reportPath: null,\n modelReports: new Map(),\n },\n modelEntries: entries,\n };\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 (entry.inputMode === 'run_dir' && !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 (entry.inputMode === 'run_dir' && !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 (entry.inputMode === 'run_dir' && !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 (entry.inputMode === 'run_dir' && 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 = ['qa', 'lifecyclemodel'];\n if (layout.inputMode === 'rows_file') {\n command.push('--rows-file', options.rowsFile as string);\n } else {\n command.push('--run-dir', options.runDir as string);\n }\n command.push('--out-dir', options.outDir);\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 if (layout.inputMode === 'rows_file') {\n return [\n `inspect: ${layout.findingsPath}`,\n `run: tiangong-lca dataset validate --type lifecyclemodel --input ${layout.rowsFile}`,\n `run: tiangong-lca lifecyclemodel save-draft --input ${layout.rowsFile} --dry-run`,\n ];\n }\n\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 rowsFile: string;\n inputMode: 'run_dir' | 'rows_file';\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 `- input_mode: \\`${options.inputMode}\\`\\n`,\n ...(options.rowsFile ? [`- rows_file: \\`${options.rowsFile}\\`\\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 options.inputMode === 'rows_file'\n ? '- 当前 qa lifecyclemodel rows-file 模式只做 payload-level deterministic QA,不要求 lifecyclemodel build-run 产物。\\n'\n : '- 当前 qa lifecyclemodel run-dir 模式保持 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 rowsFile: string;\n inputMode: 'run_dir' | 'rows_file';\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 `- input_mode: \\`${options.inputMode}\\`\\n`,\n ...(options.rowsFile ? [`- rows_file: \\`${options.rowsFile}\\`\\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 const input =\n layout.inputMode === 'rows_file'\n ? materializeRowsFile(layout)\n : (() => {\n ensureRunRootExists(layout);\n readRequiredRunManifest(layout);\n return {\n invocationIndex: readInvocationIndex(layout),\n validationAggregate: readValidationAggregate(layout),\n modelEntries: discoverModelEntries(layout),\n };\n })();\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 = input.modelEntries.map((entry) =>\n buildModelReview(entry, input.validationAggregate),\n );\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 rows_file: layout.rowsFile,\n input_mode: layout.inputMode,\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: input.validationAggregate.reportPath !== null,\n ok: input.validationAggregate.ok,\n report: input.validationAggregate.reportPath,\n },\n files: {\n run_manifest: layout.runManifestPath,\n invocation_index: layout.invocationIndexPath,\n qa_input_summary: layout.qaInputSummaryPath,\n validation_report: input.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, input.validationAggregate),\n };\n\n writeJsonArtifact(\n layout.invocationIndexPath,\n buildInvocationIndex(layout, input.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 rows_file: report.rows_file,\n input_mode: report.input_mode,\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 rowsFile: report.rows_file,\n inputMode: report.input_mode,\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 rowsFile: report.rows_file,\n inputMode: report.input_mode,\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 materializeRowsFile,\n sanitizeFileName,\n readModelFileReviewInfo,\n buildModelReview,\n buildInvocationIndex,\n buildNextActions,\n renderZhReview,\n renderEnReview,\n renderTiming,\n};\n"]}
@@ -4,6 +4,8 @@ import { CliError } from './errors.js';
4
4
  import { cloneJson, datasetRoot, firstNonEmpty, isRecord, materializeDatasetRows, } from './dataset-local.js';
5
5
  const ANNUAL_SUPPLY_FIELD = 'processDataSet.modellingAndValidation.dataSourcesTreatmentAndRepresentativeness.annualSupplyOrProductionVolume';
6
6
  const ANNUAL_SUPPLY_ROOT_FIELD = 'modellingAndValidation.dataSourcesTreatmentAndRepresentativeness.annualSupplyOrProductionVolume';
7
+ const DATA_SOURCES_TREATMENT_FIELD = 'processDataSet.modellingAndValidation.dataSourcesTreatmentAndRepresentativeness';
8
+ const ANNUAL_SUPPLY_MISSING_DATA_SENTINEL_TEXT = '9999 missing-data-sentinel/year';
7
9
  const NUMERIC_TEXT_WITH_SUFFIX_PATTERN = /^[+-]?(\d+(\.\d*)?|\.\d+)([Ee][+-]?\d+)?\s+\S.*$/u;
8
10
  const ANNUAL_PERIOD_PATTERN = /(?:\/\s*(?:year|yr|a)\b|\bper\s+(?:year|annum)\b|\/\s*年|每年|年度|年供应|年产)/iu;
9
11
  const ANNUAL_UNAVAILABLE_PATTERN = /\b(?:source\s+)?(?:production\s+)?volume\s+(?:unavailable|unknown|not\s+available)\b/iu;
@@ -84,6 +86,33 @@ function isValidAnnualSupplyVolume(value) {
84
86
  ANNUAL_PERIOD_PATTERN.test(text));
85
87
  }));
86
88
  }
89
+ function unresolvedTraceEntries(root) {
90
+ const dataSetInformation = isRecord(root.processInformation)
91
+ ? isRecord(root.processInformation.dataSetInformation)
92
+ ? root.processInformation.dataSetInformation
93
+ : {}
94
+ : {};
95
+ const commonOther = isRecord(dataSetInformation['common:other'])
96
+ ? dataSetInformation['common:other']
97
+ : {};
98
+ return asList(commonOther['tiangongfoundry:unresolvedTrace']).filter((item) => isRecord(item));
99
+ }
100
+ function hasDeferredAnnualSupplyTrace(root) {
101
+ return unresolvedTraceEntries(root).some((entry) => {
102
+ const actionItemCode = firstNonEmpty(entry.action_item_code, entry.actionItemCode, entry.code);
103
+ const blockedPath = firstNonEmpty(entry.blocked_path, entry.blockedPath, entry.field_path, entry.fieldPath, entry.path);
104
+ const status = firstNonEmpty(entry.status, entry.decision_status, entry.decisionStatus);
105
+ return ((actionItemCode === 'annual_supply_or_production_volume_invalid' ||
106
+ actionItemCode === 'annual_supply_or_production_volume_missing' ||
107
+ actionItemCode === 'invalid_format' ||
108
+ blockedPath === ANNUAL_SUPPLY_FIELD ||
109
+ blockedPath === ANNUAL_SUPPLY_ROOT_FIELD ||
110
+ blockedPath?.endsWith('.annualSupplyOrProductionVolume') === true) &&
111
+ (status === 'unresolved_deferred' ||
112
+ status === 'deferred_to_common_other' ||
113
+ status === 'needs_followup'));
114
+ });
115
+ }
87
116
  function isValidReview(value) {
88
117
  return asList(value).some((item) => isRecord(item) && Boolean(firstNonEmpty(item['@type'])));
89
118
  }
@@ -105,12 +134,14 @@ export function collectProcessRequiredFieldIssues(payload) {
105
134
  const dataSources = isRecord(modelling.dataSourcesTreatmentAndRepresentativeness)
106
135
  ? modelling.dataSourcesTreatmentAndRepresentativeness
107
136
  : null;
108
- if (!dataSources) {
137
+ const annualSupplyDeferredToTrace = hasDeferredAnnualSupplyTrace(root);
138
+ const dataSourcesDeferredToTrace = !dataSources && annualSupplyDeferredToTrace;
139
+ if (!dataSources && !dataSourcesDeferredToTrace) {
109
140
  return [
110
141
  {
111
142
  code: 'process_data_sources_treatment_missing',
112
143
  message: 'Process payload must include dataSourcesTreatmentAndRepresentativeness.',
113
- path: 'processDataSet.modellingAndValidation.dataSourcesTreatmentAndRepresentativeness',
144
+ path: DATA_SOURCES_TREATMENT_FIELD,
114
145
  },
115
146
  ];
116
147
  }
@@ -133,11 +164,17 @@ export function collectProcessRequiredFieldIssues(payload) {
133
164
  path: 'processDataSet.modellingAndValidation.complianceDeclarations.compliance',
134
165
  });
135
166
  }
167
+ if (dataSourcesDeferredToTrace) {
168
+ return issues;
169
+ }
136
170
  const annualSupply = dataSources.annualSupplyOrProductionVolume;
137
171
  if (isValidAnnualSupplyVolume(annualSupply)) {
138
172
  return issues;
139
173
  }
140
174
  const items = annualSupplyItems(annualSupply);
175
+ if (items.length === 0 && annualSupplyDeferredToTrace) {
176
+ return issues;
177
+ }
141
178
  if (items.length === 0) {
142
179
  return [
143
180
  ...issues,
@@ -609,6 +646,20 @@ function ensureDataSources(root) {
609
646
  }
610
647
  return modelling.dataSourcesTreatmentAndRepresentativeness;
611
648
  }
649
+ function annualSupplyMissingDataSentinelValue() {
650
+ return [{ '@xml:lang': 'en', '#text': ANNUAL_SUPPLY_MISSING_DATA_SENTINEL_TEXT }];
651
+ }
652
+ function annualSupplyMissingDataSentinelCompletion() {
653
+ return {
654
+ field_path: ANNUAL_SUPPLY_FIELD,
655
+ source: 'missing_data_sentinel',
656
+ value: annualSupplyMissingDataSentinelValue(),
657
+ amount: '9999',
658
+ unit: 'missing-data-sentinel/year',
659
+ reference_exchange_internal_id: null,
660
+ basis: 'No source annual supply or production volume evidence was available; Foundry policy uses an intentionally non-physical 9999 sentinel so database-side follow-up can bulk-locate and replace it later.',
661
+ };
662
+ }
612
663
  function cloneRowWithPayload(row) {
613
664
  const clonedRow = cloneJson(row.row);
614
665
  if (isRecord(clonedRow.json_ordered)) {
@@ -704,6 +755,9 @@ function completeProcessRow(row, context) {
704
755
  },
705
756
  };
706
757
  }
758
+ const dataSources = ensureDataSources(root);
759
+ const completion = annualSupplyMissingDataSentinelCompletion();
760
+ dataSources.annualSupplyOrProductionVolume = completion.value;
707
761
  return {
708
762
  row: clonedRow,
709
763
  report: {
@@ -711,16 +765,9 @@ function completeProcessRow(row, context) {
711
765
  id: row.id,
712
766
  version: row.version,
713
767
  type: row.kind,
714
- status: 'blocked',
715
- issues: [
716
- ...existingIssues,
717
- {
718
- code: 'annual_supply_evidence_missing',
719
- message: 'Could not complete annualSupplyOrProductionVolume because no source evidence value was provided.',
720
- path: ANNUAL_SUPPLY_FIELD,
721
- },
722
- ],
723
- completions: repairCompletions,
768
+ status: 'completed',
769
+ issues: [],
770
+ completions: [...repairCompletions, completion],
724
771
  },
725
772
  };
726
773
  }
@@ -795,7 +842,9 @@ export async function runProcessRequiredFieldsComplete(options) {
795
842
  return report;
796
843
  }
797
844
  export const __testInternals = {
845
+ ANNUAL_SUPPLY_MISSING_DATA_SENTINEL_TEXT,
798
846
  ANNUAL_SUPPLY_ROOT_FIELD,
847
+ annualSupplyMissingDataSentinelValue,
799
848
  annualSupplyTextParts,
800
849
  annualSupplyValueFromText,
801
850
  cloneRowWithPayload,
@@ -803,6 +852,7 @@ export const __testInternals = {
803
852
  completeProcessRow,
804
853
  ensureDataSources,
805
854
  fieldPathFromEvidenceEntry,
855
+ hasDeferredAnnualSupplyTrace,
806
856
  findAnnualSupplyEvidenceValue,
807
857
  findAnnualSupplyEvidenceEntry,
808
858
  buildFlowUnitIndex,