@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":"process-flow-build-plan.js","sourceRoot":"","sources":["../../../src/lib/process-flow-build-plan.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport * as tidasSdk from '@tiangong-lca/tidas-sdk';\nimport { writeJsonArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport {\n cloneJson,\n detectDatasetKind,\n isRecord,\n unwrapDatasetPayload,\n type JsonObject,\n} from './dataset-local.js';\nimport { readJsonInput } from './io.js';\nimport {\n normalizeIssuePath,\n validateSchemaWithDeepFallback,\n type SafeParseSchema,\n type SdkValidationFactory,\n} from './tidas-sdk-validation.js';\n\ntype BuildPlanKind = 'process' | 'flow';\ntype BuildPlanAction = 'validate' | 'materialize';\ntype BuildPlanStatus = 'passed' | 'blocked';\ntype ProcessTypeOfDataSet =\n | 'Unit process, single operation'\n | 'Unit process, black box'\n | 'LCI result'\n | 'Partly terminated system'\n | 'Avoided product system';\ntype BuildPlanDecision =\n | 'reuse'\n | 'update_same_row'\n | 'version_bump'\n | 'create_new'\n | 'block_duplicate'\n | 'manual_review';\ntype UnitOfAnalysisDecision =\n | 'ready_for_materialization'\n | 'declared_unit_dataset'\n | 'blocked_until_scaling_evidence'\n | 'manual_review';\n\ntype GateFinding = {\n code: string;\n severity: 'info' | 'warning' | 'blocker';\n message: string;\n path?: string;\n};\n\ntype SchemaValidationSummary = {\n status: 'passed' | 'failed' | 'not_applicable';\n validator: string | null;\n issue_count: number;\n issues: Array<{\n path: string;\n message: string;\n code: string;\n }>;\n};\n\ntype BuildPlanRequiredFields = {\n required: string[];\n satisfied: string[];\n missing: string[];\n};\n\ntype BuildPlanFiles = {\n gate_report: string | null;\n materialized_artifact: string | null;\n};\n\nexport type BuildPlanGateReport = {\n schema_version: 1;\n generated_at_utc: string;\n kind: BuildPlanKind;\n action: BuildPlanAction;\n status: BuildPlanStatus;\n ruleset_id: string;\n ruleset_version: string;\n input_path: string;\n out_dir: string | null;\n report_only: boolean;\n inputs: {\n plan_schema_version: number | string | null;\n identity_decision: BuildPlanDecision | null;\n unit_of_analysis_decision: UnitOfAnalysisDecision | null;\n };\n required_fields: BuildPlanRequiredFields;\n schema_validation: SchemaValidationSummary;\n findings: GateFinding[];\n blockers: GateFinding[];\n next_action: 'materialize_payload' | 'use_materialized_artifact' | 'fix_build_plan';\n files: BuildPlanFiles;\n};\n\nexport type RunBuildPlanOptions = {\n inputPath: string;\n outDir?: string | null;\n reportOnly?: boolean;\n rawInput?: unknown;\n now?: Date;\n schemas?: Partial<Record<BuildPlanKind, SafeParseSchema>>;\n};\n\nexport type RunProcessBuildPlanValidateOptions = RunBuildPlanOptions;\nexport type RunProcessBuildPlanMaterializeOptions = RunBuildPlanOptions;\nexport type RunFlowBuildPlanValidateOptions = RunBuildPlanOptions;\nexport type RunFlowBuildPlanMaterializeOptions = RunBuildPlanOptions;\n\nexport type ProcessBuildPlanGateReport = BuildPlanGateReport & { kind: 'process' };\nexport type FlowBuildPlanGateReport = BuildPlanGateReport & { kind: 'flow' };\n\ntype Evaluation = {\n plan: JsonObject;\n findings: GateFinding[];\n blockers: GateFinding[];\n requiredFields: BuildPlanRequiredFields;\n decision: BuildPlanDecision | null;\n unitOfAnalysisDecision: UnitOfAnalysisDecision | null;\n};\n\ntype SchemaSpec = {\n validator: string;\n schema: SafeParseSchema;\n createEntity: SdkValidationFactory | null;\n};\n\nconst AUTO_DECISIONS = new Set<BuildPlanDecision>([\n 'reuse',\n 'update_same_row',\n 'version_bump',\n 'create_new',\n]);\n\nconst ALL_DECISIONS = new Set<BuildPlanDecision>([\n 'reuse',\n 'update_same_row',\n 'version_bump',\n 'create_new',\n 'block_duplicate',\n 'manual_review',\n]);\n\nconst AUTOMATIC_UNIT_OF_ANALYSIS_DECISIONS = new Set<UnitOfAnalysisDecision>([\n 'ready_for_materialization',\n 'declared_unit_dataset',\n]);\n\nconst ALL_UNIT_OF_ANALYSIS_DECISIONS = new Set<UnitOfAnalysisDecision>([\n 'ready_for_materialization',\n 'declared_unit_dataset',\n 'blocked_until_scaling_evidence',\n 'manual_review',\n]);\n\nconst SCHEMA_EXPORTS: Record<BuildPlanKind, keyof typeof tidasSdk> = {\n flow: 'FlowSchema' as keyof typeof tidasSdk,\n process: 'ProcessSchema' as keyof typeof tidasSdk,\n};\n\nconst ENTITY_FACTORY_EXPORTS: Record<BuildPlanKind, keyof typeof tidasSdk> = {\n flow: 'createFlow' as keyof typeof tidasSdk,\n process: 'createProcess' as keyof typeof tidasSdk,\n};\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nfunction requiredInputPath(inputPath: string): string {\n const normalized = inputPath.trim();\n if (!normalized) {\n throw new CliError('Missing required --input value.', {\n code: 'BUILD_PLAN_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n return normalized;\n}\n\nfunction asObject(value: unknown, label: string): JsonObject {\n if (!isRecord(value)) {\n throw new CliError(`${label} must be a JSON object.`, {\n code: 'BUILD_PLAN_INVALID_INPUT',\n exitCode: 2,\n });\n }\n return value;\n}\n\nfunction loadBuildPlan(inputPath: string, rawInput: unknown): JsonObject {\n const input = asObject(rawInput, 'build-plan input');\n const nested =\n input.build_plan ??\n input.buildPlan ??\n input.process_build_plan ??\n input.processBuildPlan ??\n input.flow_build_plan ??\n input.flowBuildPlan;\n return nested === undefined ? input : asObject(nested, 'nested build plan');\n}\n\nfunction readBuildPlanInput(inputPath: string, rawInput: unknown): JsonObject {\n return loadBuildPlan(inputPath, rawInput === undefined ? readJsonInput(inputPath) : rawInput);\n}\n\nfunction textToken(value: unknown): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || null;\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n return String(value);\n }\n return null;\n}\n\nfunction valueAtPath(root: JsonObject, pathExpression: string): unknown {\n let current: unknown = root;\n for (const segment of pathExpression.split('.')) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\nfunction firstValue(root: JsonObject, paths: string[]): unknown {\n for (const candidate of paths) {\n const value = valueAtPath(root, candidate);\n if (value !== undefined && value !== null) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction firstToken(root: JsonObject, paths: string[]): string | null {\n for (const candidate of paths) {\n const token = textToken(valueAtPath(root, candidate));\n if (token) {\n return token;\n }\n }\n return null;\n}\n\nfunction valueAsObject(root: JsonObject, paths: string[]): JsonObject | null {\n for (const candidate of paths) {\n const value = valueAtPath(root, candidate);\n if (isRecord(value)) {\n return value;\n }\n }\n return null;\n}\n\nfunction valueAsArray(root: JsonObject, paths: string[]): unknown[] {\n for (const candidate of paths) {\n const value = valueAtPath(root, candidate);\n if (Array.isArray(value)) {\n return value;\n }\n }\n return [];\n}\n\nfunction normalizeAmount(value: unknown, fallback = '1.0'): string {\n const token = textToken(value);\n if (!token) {\n return fallback;\n }\n const numeric = Number(token);\n return Number.isFinite(numeric) ? String(numeric) : token;\n}\n\nfunction normalizeVersion(value: unknown, fallback = '00.00.001'): string {\n return textToken(value) ?? fallback;\n}\n\nfunction normalizeYear(value: unknown, fallback = 1970): number {\n const token = textToken(value);\n if (!token) {\n return fallback;\n }\n const year = Number.parseInt(token, 10);\n return Number.isFinite(year) ? year : fallback;\n}\n\nfunction deterministicUuid(seed: string): string {\n const hex = createHash('sha256').update(seed).digest('hex');\n const chars = hex.slice(0, 32).split('');\n chars[12] = '5';\n chars[16] = ((Number.parseInt(chars[16] as string, 16) & 0x3) | 0x8).toString(16);\n return `${chars.slice(0, 8).join('')}-${chars.slice(8, 12).join('')}-${chars\n .slice(12, 16)\n .join('')}-${chars.slice(16, 20).join('')}-${chars.slice(20, 32).join('')}`;\n}\n\nfunction uuidFromPlan(plan: JsonObject, paths: string[], seed: string): string {\n const token = firstToken(plan, paths);\n return token ?? deterministicUuid(seed);\n}\n\nfunction localizedText(text: string, lang = 'en'): JsonObject {\n return { '#text': text, '@xml:lang': lang };\n}\n\nfunction multiLangFromValue(value: unknown, fallback: string, fallbackLang = 'en'): JsonObject[] {\n if (Array.isArray(value)) {\n const normalized = value\n .map((entry) => {\n if (isRecord(entry)) {\n const text = textToken(entry['#text'] ?? entry.text ?? entry.value);\n if (!text) {\n return null;\n }\n return localizedText(text, textToken(entry['@xml:lang'] ?? entry.lang) ?? fallbackLang);\n }\n const text = textToken(entry);\n return text ? localizedText(text, fallbackLang) : null;\n })\n .filter((entry): entry is JsonObject => Boolean(entry));\n if (normalized.length) {\n return normalized;\n }\n }\n if (isRecord(value)) {\n const text = textToken(value['#text'] ?? value.text ?? value.value);\n if (text) {\n return [localizedText(text, textToken(value['@xml:lang'] ?? value.lang) ?? fallbackLang)];\n }\n const en = textToken(value.en);\n const zh = textToken(value.zh);\n const rows = [en ? localizedText(en, 'en') : null, zh ? localizedText(zh, 'zh') : null].filter(\n (entry): entry is JsonObject => Boolean(entry),\n );\n if (rows.length) {\n return rows;\n }\n }\n const token = textToken(value);\n return [localizedText(token ?? fallback, fallbackLang)];\n}\n\nfunction firstMultiLang(plan: JsonObject, paths: string[], fallback: string): JsonObject[] {\n for (const candidate of paths) {\n const value = valueAtPath(plan, candidate);\n if (value !== undefined && value !== null) {\n return multiLangFromValue(value, fallback);\n }\n }\n return multiLangFromValue(undefined, fallback);\n}\n\nfunction globalReference(options: {\n type: string;\n refObjectId: string;\n version?: string | null;\n uri?: string | null;\n shortDescription: string;\n}): JsonObject {\n const version = normalizeVersion(options.version, '00.00.000');\n return {\n '@type': options.type,\n '@refObjectId': options.refObjectId,\n '@version': version,\n '@uri': options.uri ?? `../${options.type.replaceAll(' ', '-')}/${options.refObjectId}.xml`,\n 'common:shortDescription': localizedText(options.shortDescription),\n };\n}\n\nfunction evidenceSourceReference(plan: JsonObject): JsonObject {\n const evidence = valueAsObject(plan, ['evidence_manifest', 'evidenceManifest']) ?? {};\n const sources = Array.isArray(evidence.sources) ? evidence.sources : [];\n const firstSource = sources.find(isRecord);\n const sourceId =\n textToken(firstSource?.id ?? firstSource?.source_id ?? firstSource?.ref_object_id) ??\n deterministicUuid(`${JSON.stringify(plan)}:source`);\n const sourceVersion = textToken(firstSource?.version) ?? '00.00.000';\n const shortDescription =\n textToken(firstSource?.title ?? firstSource?.name ?? firstSource?.short_description) ??\n 'Build plan evidence source';\n return globalReference({\n type: 'source data set',\n refObjectId: sourceId,\n version: sourceVersion,\n uri: textToken(firstSource?.uri),\n shortDescription,\n });\n}\n\nfunction contactReference(plan: JsonObject, role: string): JsonObject {\n const explicit = valueAsObject(plan, [\n `administrative_information.${role}`,\n `administrativeInformation.${role}`,\n ]);\n const id =\n textToken(explicit?.id ?? explicit?.ref_object_id ?? explicit?.refObjectId) ??\n deterministicUuid(`${JSON.stringify(plan)}:${role}`);\n return globalReference({\n type: 'contact data set',\n refObjectId: id,\n version: textToken(explicit?.version) ?? '00.00.000',\n uri: textToken(explicit?.uri),\n shortDescription:\n textToken(explicit?.short_description ?? explicit?.shortDescription ?? explicit?.name) ??\n `Build plan ${role}`,\n });\n}\n\nfunction complianceReference(plan: JsonObject): JsonObject {\n const explicit = valueAsObject(plan, [\n 'compliance_reference',\n 'complianceReference',\n 'administrative_information.compliance_reference',\n 'administrativeInformation.complianceReference',\n ]);\n return globalReference({\n type: 'source data set',\n refObjectId:\n textToken(explicit?.id ?? explicit?.ref_object_id ?? explicit?.refObjectId) ??\n deterministicUuid(`${JSON.stringify(plan)}:compliance`),\n version: textToken(explicit?.version) ?? '00.00.000',\n uri: textToken(explicit?.uri),\n shortDescription:\n textToken(explicit?.short_description ?? explicit?.shortDescription ?? explicit?.name) ??\n 'Build plan compliance system',\n });\n}\n\nfunction dataSetFormatReference(plan: JsonObject): JsonObject {\n const explicit = valueAsObject(plan, [\n 'format_reference',\n 'formatReference',\n 'administrative_information.format_reference',\n 'administrativeInformation.formatReference',\n ]);\n return globalReference({\n type: 'source data set',\n refObjectId:\n textToken(explicit?.id ?? explicit?.ref_object_id ?? explicit?.refObjectId) ??\n deterministicUuid('tiangong-lca-tidas-format-reference'),\n version: textToken(explicit?.version) ?? '00.00.000',\n uri: textToken(explicit?.uri),\n shortDescription:\n textToken(explicit?.short_description ?? explicit?.shortDescription ?? explicit?.name) ??\n 'TIDAS / ILCD data set format',\n });\n}\n\nfunction classificationClasses(plan: JsonObject, kind: BuildPlanKind): JsonObject[] {\n const pathValues =\n valueAsArray(plan, ['target.classification_path', 'target.classificationPath']).length > 0\n ? valueAsArray(plan, ['target.classification_path', 'target.classificationPath'])\n : valueAsArray(plan, ['classification_path', 'classificationPath']);\n const labels = pathValues\n .map((entry) => textToken(entry))\n .filter((entry): entry is string => Boolean(entry));\n const fallback =\n kind === 'process'\n ? ['Technosphere', 'Unspecified sector', 'Unspecified activity', 'Unspecified process']\n : ['Technosphere flows', 'Product flows', 'Unspecified category', 'Unspecified flow'];\n const requiredCount = kind === 'process' ? 4 : Math.max(labels.length, 1);\n const values = Array.from(\n { length: requiredCount },\n (_, index) => labels[index] ?? (fallback[index] as string),\n );\n return values.map((label, index) => ({\n '@level': String(index),\n '@classId': deterministicUuid(`${kind}:classification:${index}:${label}`),\n '#text': label,\n }));\n}\n\nfunction normalizeFlowType(\n value: string | null,\n): 'Elementary flow' | 'Product flow' | 'Waste flow' {\n const lower = (value ?? '').toLowerCase();\n if (lower.includes('elementary')) {\n return 'Elementary flow';\n }\n if (lower.includes('waste')) {\n return 'Waste flow';\n }\n return 'Product flow';\n}\n\nfunction normalizeProcessType(value: string | null): ProcessTypeOfDataSet {\n const allowed = new Set([\n 'Unit process, single operation',\n 'Unit process, black box',\n 'LCI result',\n 'Partly terminated system',\n 'Avoided product system',\n ]);\n return value && allowed.has(value)\n ? (value as ProcessTypeOfDataSet)\n : 'Unit process, single operation';\n}\n\nfunction flowPropertyReference(plan: JsonObject): JsonObject {\n const propertyName =\n firstToken(plan, [\n 'flow_property_plan.reference_property',\n 'flowPropertyPlan.referenceProperty',\n ]) ?? 'Reference flow property';\n const propertyId =\n firstToken(plan, [\n 'flow_property_plan.reference_property_id',\n 'flowPropertyPlan.referencePropertyId',\n ]) ??\n (propertyName.toLowerCase() === 'mass'\n ? '93a60a56-a3c8-11da-a746-0800200b9a66'\n : deterministicUuid(`flow-property:${propertyName}`));\n return globalReference({\n type: 'flow property data set',\n refObjectId: propertyId,\n version:\n firstToken(plan, [\n 'flow_property_plan.reference_property_version',\n 'flowPropertyPlan.referencePropertyVersion',\n ]) ?? '00.00.000',\n uri: firstToken(plan, [\n 'flow_property_plan.reference_property_uri',\n 'flowPropertyPlan.referencePropertyUri',\n ]),\n shortDescription: propertyName,\n });\n}\n\nfunction referenceFlowRef(plan: JsonObject): JsonObject {\n const referenceFlowId =\n firstToken(plan, [\n 'quantitative_reference_plan.reference_flow_id',\n 'quantitativeReferencePlan.referenceFlowId',\n 'target.intended_reference_flow',\n ]) ?? deterministicUuid(`${JSON.stringify(plan)}:reference-flow`);\n return globalReference({\n type: 'flow data set',\n refObjectId: referenceFlowId,\n version:\n firstToken(plan, [\n 'quantitative_reference_plan.reference_flow_version',\n 'quantitativeReferencePlan.referenceFlowVersion',\n ]) ?? '00.00.000',\n uri: firstToken(plan, [\n 'quantitative_reference_plan.reference_flow_uri',\n 'quantitativeReferencePlan.referenceFlowUri',\n ]),\n shortDescription:\n firstToken(plan, [\n 'quantitative_reference_plan.reference_flow_name',\n 'quantitativeReferencePlan.referenceFlowName',\n 'name_plan.functional_unit_flow_properties',\n 'namePlan.functionalUnitFlowProperties',\n ]) ?? 'Quantitative reference flow',\n });\n}\n\nfunction buildAnnualSupply(plan: JsonObject, referenceExchange: JsonObject): JsonObject[] {\n const explicit = firstValue(plan, [\n 'required_fields.annualSupplyOrProductionVolume',\n 'requiredFields.annualSupplyOrProductionVolume',\n 'authoring.required_fields.annualSupplyOrProductionVolume',\n 'authoring.requiredFields.annualSupplyOrProductionVolume',\n 'modelling_and_validation.annualSupplyOrProductionVolume',\n 'modellingAndValidation.annualSupplyOrProductionVolume',\n ]);\n if (explicit !== undefined && explicit !== null) {\n return multiLangFromValue(explicit, String(explicit));\n }\n\n const amount =\n textToken(referenceExchange.meanAmount) ??\n textToken(referenceExchange.resultingAmount) ??\n '1.0';\n const unit =\n firstToken(plan, [\n 'quantitative_reference_plan.reference_unit',\n 'quantitativeReferencePlan.referenceUnit',\n 'flow_property_plan.reference_unit',\n 'flowPropertyPlan.referenceUnit',\n ]) ?? 'unit';\n return [localizedText(`${amount} ${unit}/year`, 'en')];\n}\n\nfunction normalizeExchangeDirection(value: string | null): 'Input' | 'Output' {\n return value === 'Input' ? 'Input' : 'Output';\n}\n\nfunction exchangeFromPlan(plan: JsonObject, entry: unknown, index: number): JsonObject | null {\n if (!isRecord(entry)) {\n return null;\n }\n const flowId =\n textToken(entry.flow_id ?? entry.flowId ?? entry.reference_flow_id ?? entry.referenceFlowId) ??\n deterministicUuid(`${JSON.stringify(plan)}:exchange:${index}`);\n const internalId =\n textToken(entry.internal_id ?? entry.internalId ?? entry['@dataSetInternalID']) ??\n String(index + 1);\n const meanAmount = normalizeAmount(entry.mean_amount ?? entry.meanAmount);\n return {\n '@dataSetInternalID': internalId,\n referenceToFlowDataSet: globalReference({\n type: 'flow data set',\n refObjectId: flowId,\n version: normalizeVersion(entry.version, '00.00.000'),\n uri: textToken(entry.uri),\n shortDescription:\n textToken(entry.short_description ?? entry.shortDescription ?? entry.name) ??\n `Exchange flow ${internalId}`,\n }),\n exchangeDirection: normalizeExchangeDirection(\n textToken(entry.direction ?? entry.exchangeDirection),\n ),\n meanAmount,\n resultingAmount: normalizeAmount(entry.resulting_amount ?? entry.resultingAmount, meanAmount),\n dataDerivationTypeStatus:\n textToken(entry.data_derivation_type_status ?? entry.dataDerivationTypeStatus) ?? 'Estimated',\n quantitativeReference: Boolean(entry.quantitative_reference ?? entry.quantitativeReference),\n referencesToDataSource: {\n referenceToDataSource: evidenceSourceReference(plan),\n },\n };\n}\n\nfunction exchangePlanEntries(plan: JsonObject): JsonObject[] {\n return valueAsArray(plan, ['exchange_plan.exchanges', 'exchangePlan.exchanges'])\n .map((entry, index) => exchangeFromPlan(plan, entry, index))\n .filter((entry): entry is JsonObject => Boolean(entry));\n}\n\nfunction referenceExchange(plan: JsonObject): JsonObject {\n const internalId =\n firstToken(plan, [\n 'quantitative_reference_plan.reference_flow_internal_id',\n 'quantitativeReferencePlan.referenceFlowInternalId',\n ]) ?? '1';\n const meanAmount =\n firstToken(plan, [\n 'quantitative_reference_plan.mean_amount',\n 'quantitativeReferencePlan.meanAmount',\n 'quantitative_reference_plan.resulting_amount',\n 'quantitativeReferencePlan.resultingAmount',\n ]) ?? '1.0';\n const resultingAmount =\n firstToken(plan, [\n 'quantitative_reference_plan.resulting_amount',\n 'quantitativeReferencePlan.resultingAmount',\n ]) ?? meanAmount;\n return {\n '@dataSetInternalID': internalId,\n referenceToFlowDataSet: referenceFlowRef(plan),\n exchangeDirection: 'Output',\n meanAmount: normalizeAmount(meanAmount),\n resultingAmount: normalizeAmount(resultingAmount, normalizeAmount(meanAmount)),\n dataDerivationTypeStatus:\n firstToken(plan, [\n 'quantitative_reference_plan.data_derivation_type_status',\n 'quantitativeReferencePlan.dataDerivationTypeStatus',\n ]) ?? 'Estimated',\n quantitativeReference: true,\n referencesToDataSource: {\n referenceToDataSource: evidenceSourceReference(plan),\n },\n };\n}\n\nfunction buildCanonicalFlowPayload(plan: JsonObject, inputPath: string): JsonObject {\n const baseName = firstToken(plan, ['name_plan.base_name', 'namePlan.baseName']) ?? 'Unnamed flow';\n const flowId = uuidFromPlan(\n plan,\n ['target.uuid', 'target.id', 'identity_decision.target_id', 'identityDecision.targetId'],\n `flow:${baseName}:${inputPath}`,\n );\n const version = normalizeVersion(\n firstToken(plan, [\n 'target.version',\n 'publication.version',\n 'administrative_information.version',\n ]),\n );\n const propertyMean =\n firstToken(plan, ['flow_property_plan.mean_value', 'flowPropertyPlan.meanValue']) ?? '1.0';\n const flowType = normalizeFlowType(\n firstToken(plan, [\n 'target.flow_type',\n 'target.flowType',\n 'modelling_and_validation.typeOfDataSet',\n ]),\n );\n const location = firstToken(plan, ['target.geography', 'target.location']);\n\n return {\n flowDataSet: {\n '@xmlns': 'http://lca.jrc.it/ILCD/Flow',\n '@xmlns:common': 'http://lca.jrc.it/ILCD/Common',\n '@xmlns:ecn': 'http://eplca.jrc.ec.europa.eu/ILCD/Extensions/2018/ECNumber',\n '@xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n '@version': '1.1',\n '@locations': '../ILCDLocations.xml',\n '@xsi:schemaLocation': 'http://lca.jrc.it/ILCD/Flow ../../schemas/ILCD_FlowDataSet.xsd',\n flowInformation: {\n dataSetInformation: {\n 'common:UUID': flowId,\n name: {\n baseName: firstMultiLang(plan, ['name_plan.base_name', 'namePlan.baseName'], baseName),\n treatmentStandardsRoutes: firstMultiLang(\n plan,\n ['name_plan.treatment_standards_routes', 'namePlan.treatmentStandardsRoutes'],\n 'Reference flow',\n ),\n mixAndLocationTypes: firstMultiLang(\n plan,\n ['name_plan.mix_and_location_types', 'namePlan.mixAndLocationTypes'],\n location ?? 'Global',\n ),\n },\n classificationInformation: {\n 'common:classification': {\n 'common:class': classificationClasses(plan, 'flow'),\n },\n },\n ...(firstToken(plan, ['target.cas_number', 'target.CASNumber'])\n ? { CASNumber: firstToken(plan, ['target.cas_number', 'target.CASNumber']) }\n : {}),\n 'common:generalComment': firstMultiLang(\n plan,\n ['target.general_comment', 'target.generalComment', 'evidence_manifest.summary'],\n `Flow materialized from build plan ${inputPath}.`,\n ),\n },\n quantitativeReference: {\n referenceToReferenceFlowProperty: '0',\n },\n ...(location ? { geography: { locationOfSupply: location } } : {}),\n },\n modellingAndValidation: {\n LCIMethod: {\n typeOfDataSet: flowType,\n },\n complianceDeclarations: {\n compliance: {\n 'common:referenceToComplianceSystem': complianceReference(plan),\n 'common:approvalOfOverallCompliance': 'Not defined',\n },\n },\n },\n administrativeInformation: {\n dataEntryBy: {\n 'common:timeStamp':\n firstToken(plan, [\n 'administrative_information.time_stamp',\n 'administrativeInformation.timeStamp',\n ]) ?? '1970-01-01T00:00:00.000Z',\n 'common:referenceToDataSetFormat': dataSetFormatReference(plan),\n },\n publicationAndOwnership: {\n 'common:dataSetVersion': version,\n 'common:permanentDataSetURI':\n firstToken(plan, ['target.permanent_uri', 'target.permanentDataSetURI']) ??\n `https://data.tiangong.earth/flows/${flowId}.xml`,\n 'common:referenceToOwnershipOfDataSet': contactReference(plan, 'owner'),\n },\n },\n flowProperties: {\n flowProperty: {\n '@dataSetInternalID': '0',\n referenceToFlowPropertyDataSet: flowPropertyReference(plan),\n meanValue: normalizeAmount(propertyMean),\n },\n },\n },\n };\n}\n\nfunction buildCanonicalProcessPayload(plan: JsonObject, inputPath: string): JsonObject {\n const baseName =\n firstToken(plan, ['name_plan.base_name', 'namePlan.baseName']) ?? 'Unnamed process';\n const processId = uuidFromPlan(\n plan,\n ['target.uuid', 'target.id', 'identity_decision.target_id', 'identityDecision.targetId'],\n `process:${baseName}:${inputPath}`,\n );\n const location = firstToken(plan, ['target.geography', 'target.location']) ?? 'GLO';\n const reference = referenceExchange(plan);\n const exchangeEntries = exchangePlanEntries(plan);\n const exchanges = [reference, ...exchangeEntries.filter((entry) => !entry.quantitativeReference)];\n const annualSupply = buildAnnualSupply(plan, reference);\n const sourceRef = evidenceSourceReference(plan);\n\n return {\n processDataSet: {\n '@xmlns': 'http://lca.jrc.it/ILCD/Process',\n '@xmlns:common': 'http://lca.jrc.it/ILCD/Common',\n '@xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n '@version': '1.1',\n '@locations': '../ILCDLocations.xml',\n '@xsi:schemaLocation': 'http://lca.jrc.it/ILCD/Process ../../schemas/ILCD_ProcessDataSet.xsd',\n processInformation: {\n dataSetInformation: {\n 'common:UUID': processId,\n name: {\n baseName: firstMultiLang(plan, ['name_plan.base_name', 'namePlan.baseName'], baseName),\n treatmentStandardsRoutes: firstMultiLang(\n plan,\n ['name_plan.treatment_standards_routes', 'namePlan.treatmentStandardsRoutes'],\n firstToken(plan, ['target.technology_route', 'target.technologyRoute']) ??\n 'Technology route documented in build plan',\n ),\n mixAndLocationTypes: firstMultiLang(\n plan,\n ['name_plan.mix_and_location_types', 'namePlan.mixAndLocationTypes'],\n location,\n ),\n functionalUnitFlowProperties: firstMultiLang(\n plan,\n [\n 'name_plan.functional_unit_flow_properties',\n 'namePlan.functionalUnitFlowProperties',\n ],\n firstToken(plan, [\n 'quantitative_reference_plan.reference_unit',\n 'quantitativeReferencePlan.referenceUnit',\n ]) ?? 'reference unit',\n ),\n },\n classificationInformation: {\n 'common:classification': {\n 'common:class': classificationClasses(plan, 'process'),\n },\n },\n 'common:generalComment': firstMultiLang(\n plan,\n ['target.general_comment', 'target.generalComment', 'evidence_manifest.summary'],\n `Process materialized from build plan ${inputPath}.`,\n ),\n },\n quantitativeReference: {\n '@type': 'Reference flow(s)',\n referenceToReferenceFlow: String(reference['@dataSetInternalID']),\n },\n time: {\n 'common:referenceYear': normalizeYear(\n firstToken(plan, [\n 'target.reference_year',\n 'target.referenceYear',\n 'time.reference_year',\n ]),\n ),\n 'common:timeRepresentativenessDescription': firstMultiLang(\n plan,\n ['time.description', 'time.timeRepresentativenessDescription'],\n 'Reference year documented in build plan evidence.',\n ),\n },\n geography: {\n locationOfOperationSupplyOrProduction: {\n '@location': location,\n descriptionOfRestrictions: firstMultiLang(\n plan,\n ['target.geography_description', 'target.geographyDescription'],\n `Operation location: ${location}.`,\n ),\n },\n },\n technology: {\n technologyDescriptionAndIncludedProcesses: firstMultiLang(\n plan,\n ['technology.description', 'technology.technologyDescriptionAndIncludedProcesses'],\n firstToken(plan, ['target.technology_route', 'target.technologyRoute']) ??\n 'Technology route documented in build plan evidence.',\n ),\n },\n },\n modellingAndValidation: {\n LCIMethodAndAllocation: {\n typeOfDataSet: normalizeProcessType(\n firstToken(plan, [\n 'modelling_and_validation.type_of_dataset',\n 'modellingAndValidation.typeOfDataSet',\n ]),\n ),\n LCIMethodPrinciple:\n firstToken(plan, [\n 'modelling_and_validation.lci_method_principle',\n 'modellingAndValidation.lciMethodPrinciple',\n ]) ?? 'Attributional',\n },\n dataSourcesTreatmentAndRepresentativeness: {\n dataCutOffAndCompletenessPrinciples: firstMultiLang(\n plan,\n ['modelling_and_validation.data_cutoff', 'modellingAndValidation.dataCutoff'],\n 'Cut-off and completeness principles are documented in the build plan evidence.',\n ),\n referenceToDataSource: sourceRef,\n annualSupplyOrProductionVolume: annualSupply,\n },\n validation: {\n review: {\n '@type': 'Not reviewed',\n },\n },\n complianceDeclarations: {\n compliance: {\n 'common:referenceToComplianceSystem': complianceReference(plan),\n 'common:approvalOfOverallCompliance': 'Not defined',\n 'common:nomenclatureCompliance': 'Not defined',\n 'common:methodologicalCompliance': 'Not defined',\n 'common:reviewCompliance': 'Not defined',\n 'common:documentationCompliance': 'Not defined',\n 'common:qualityCompliance': 'Not defined',\n },\n },\n },\n administrativeInformation: {\n 'common:commissionerAndGoal': {\n 'common:referenceToCommissioner': contactReference(plan, 'commissioner'),\n 'common:intendedApplications': firstMultiLang(\n plan,\n [\n 'administrative_information.intended_applications',\n 'administrativeInformation.intendedApplications',\n ],\n 'Automated LCA data production draft for expert review.',\n ),\n },\n dataEntryBy: {\n 'common:timeStamp':\n firstToken(plan, [\n 'administrative_information.time_stamp',\n 'administrativeInformation.timeStamp',\n ]) ?? '1970-01-01T00:00:00.000Z',\n 'common:referenceToDataSetFormat': dataSetFormatReference(plan),\n 'common:referenceToPersonOrEntityEnteringTheData': contactReference(plan, 'data_entry'),\n },\n publicationAndOwnership: {\n 'common:dataSetVersion': normalizeVersion(\n firstToken(plan, [\n 'target.version',\n 'publication.version',\n 'administrative_information.version',\n ]),\n ),\n 'common:permanentDataSetURI':\n firstToken(plan, ['target.permanent_uri', 'target.permanentDataSetURI']) ??\n `https://data.tiangong.earth/processes/${processId}.xml`,\n 'common:referenceToOwnershipOfDataSet': contactReference(plan, 'owner'),\n 'common:copyright': 'false',\n 'common:licenseType': 'Free of charge for all users and uses',\n },\n },\n exchanges: {\n exchange: exchanges,\n },\n },\n };\n}\n\nfunction isNonEmptyArray(value: unknown): value is unknown[] {\n return Array.isArray(value) && value.length > 0;\n}\n\nfunction pathIsSatisfied(root: JsonObject, paths: string[]): boolean {\n const value = firstValue(root, paths);\n if (isNonEmptyArray(value)) {\n return true;\n }\n if (isRecord(value)) {\n return Object.keys(value).length > 0;\n }\n return Boolean(textToken(value));\n}\n\nfunction evidenceBindingPaths(plan: JsonObject): Set<string> {\n const evidence = firstValue(plan, ['evidence_manifest', 'evidenceManifest']);\n const bindings = isRecord(evidence)\n ? firstValue(evidence, ['field_bindings', 'fieldBindings'])\n : undefined;\n const rows = Array.isArray(bindings) ? bindings : [];\n return new Set(\n rows\n .map((row) =>\n isRecord(row) ? textToken(row.field_path ?? row.path ?? row.field ?? row.fieldPath) : null,\n )\n .filter((rowPath): rowPath is string => Boolean(rowPath)),\n );\n}\n\nfunction evidenceSourcesPresent(plan: JsonObject): boolean {\n const evidence = firstValue(plan, ['evidence_manifest', 'evidenceManifest']);\n const sources = isRecord(evidence) ? firstValue(evidence, ['sources']) : undefined;\n return isNonEmptyArray(sources);\n}\n\nfunction decisionFromPlan(plan: JsonObject): BuildPlanDecision | null {\n const raw =\n firstToken(plan, ['identity_decision.decision', 'identityDecision.decision', 'decision']) ??\n null;\n return raw && ALL_DECISIONS.has(raw as BuildPlanDecision) ? (raw as BuildPlanDecision) : null;\n}\n\nfunction unitOfAnalysisFromPlan(plan: JsonObject): JsonObject | null {\n return valueAsObject(plan, ['unit_of_analysis', 'unitOfAnalysis']);\n}\n\nfunction unitOfAnalysisDecisionFromArtifact(artifact: JsonObject): UnitOfAnalysisDecision | null {\n const raw = textToken(artifact.decision);\n return raw && ALL_UNIT_OF_ANALYSIS_DECISIONS.has(raw as UnitOfAnalysisDecision)\n ? (raw as UnitOfAnalysisDecision)\n : null;\n}\n\nfunction buildPlanRuleset(plan: JsonObject, kind: BuildPlanKind): { id: string; version: string } {\n const ruleset = firstValue(plan, ['ruleset']);\n const id =\n firstToken(plan, ['ruleset_id', 'rulesetId']) ??\n (isRecord(ruleset) ? textToken(ruleset.id) : null) ??\n `${kind}-authoring/strict`;\n const version =\n firstToken(plan, ['ruleset_version', 'rulesetVersion']) ??\n (isRecord(ruleset) ? textToken(ruleset.version) : null) ??\n '1';\n return { id, version };\n}\n\nfunction requiredFieldSpecs(kind: BuildPlanKind): Array<{ path: string; aliases: string[] }> {\n const common = [\n { path: 'target', aliases: ['target'] },\n {\n path: 'identity_decision.decision',\n aliases: ['identity_decision.decision', 'identityDecision.decision', 'decision'],\n },\n { path: 'unit_of_analysis', aliases: ['unit_of_analysis', 'unitOfAnalysis'] },\n { path: 'name_plan.base_name', aliases: ['name_plan.base_name', 'namePlan.baseName'] },\n ];\n const process = [\n { path: 'target.geography', aliases: ['target.geography', 'target.location'] },\n {\n path: 'target.technology_route',\n aliases: ['target.technology_route', 'target.technologyRoute'],\n },\n {\n path: 'quantitative_reference_plan.reference_flow_id',\n aliases: [\n 'quantitative_reference_plan.reference_flow_id',\n 'quantitativeReferencePlan.referenceFlowId',\n 'target.intended_reference_flow',\n ],\n },\n ];\n const flow = [\n { path: 'target.flow_type', aliases: ['target.flow_type', 'target.flowType'] },\n {\n path: 'flow_property_plan.reference_property',\n aliases: ['flow_property_plan.reference_property', 'flowPropertyPlan.referenceProperty'],\n },\n {\n path: 'flow_property_plan.reference_unit',\n aliases: ['flow_property_plan.reference_unit', 'flowPropertyPlan.referenceUnit'],\n },\n ];\n return kind === 'process' ? [...common, ...process] : [...common, ...flow];\n}\n\nfunction makeFinding(\n code: string,\n severity: GateFinding['severity'],\n message: string,\n pathExpression?: string,\n): GateFinding {\n return pathExpression\n ? { code, severity, message, path: pathExpression }\n : { code, severity, message };\n}\n\nfunction evaluateUnitOfAnalysis(plan: JsonObject): {\n findings: GateFinding[];\n blockers: GateFinding[];\n decision: UnitOfAnalysisDecision | null;\n} {\n const findings: GateFinding[] = [];\n const blockers: GateFinding[] = [];\n const artifact = unitOfAnalysisFromPlan(plan);\n if (!artifact) {\n blockers.push(\n makeFinding(\n 'unit_of_analysis_missing',\n 'blocker',\n 'Build plan must include the skill-authored unit_of_analysis artifact.',\n 'unit_of_analysis',\n ),\n );\n return { findings, blockers, decision: null };\n }\n\n const decision = unitOfAnalysisDecisionFromArtifact(artifact);\n if (!decision) {\n blockers.push(\n makeFinding(\n 'unit_of_analysis_decision_missing',\n 'blocker',\n 'unit_of_analysis must include a supported decision.',\n 'unit_of_analysis.decision',\n ),\n );\n } else if (!AUTOMATIC_UNIT_OF_ANALYSIS_DECISIONS.has(decision)) {\n blockers.push(\n makeFinding(\n 'unit_of_analysis_not_automatic',\n 'blocker',\n `unit_of_analysis decision ${decision} cannot proceed to materialization.`,\n 'unit_of_analysis.decision',\n ),\n );\n }\n\n for (const spec of [\n { path: 'unit_of_analysis.target_kind', aliases: ['target_kind', 'targetKind'] },\n { path: 'unit_of_analysis.reference_flow', aliases: ['reference_flow', 'referenceFlow'] },\n {\n path: 'unit_of_analysis.reference_flow.reference_unit',\n aliases: ['reference_flow.reference_unit', 'referenceFlow.referenceUnit'],\n },\n {\n path: 'unit_of_analysis.reference_flow.reference_amount',\n aliases: ['reference_flow.reference_amount', 'referenceFlow.referenceAmount'],\n },\n {\n path: 'unit_of_analysis.reference_flow.flow_property',\n aliases: ['reference_flow.flow_property', 'referenceFlow.flowProperty'],\n },\n ]) {\n if (!pathIsSatisfied(artifact, spec.aliases)) {\n blockers.push(\n makeFinding(\n 'unit_of_analysis_required_field_missing',\n 'blocker',\n `unit_of_analysis is missing ${spec.path}.`,\n spec.path,\n ),\n );\n }\n }\n\n const hasBasis =\n pathIsSatisfied(artifact, ['functional_unit', 'functionalUnit']) ||\n pathIsSatisfied(artifact, ['declared_unit', 'declaredUnit']);\n if (!hasBasis) {\n blockers.push(\n makeFinding(\n 'unit_of_analysis_basis_missing',\n 'blocker',\n 'unit_of_analysis must describe either functional_unit or declared_unit.',\n 'unit_of_analysis.functional_unit',\n ),\n );\n }\n\n if (\n decision === 'ready_for_materialization' &&\n !pathIsSatisfied(artifact, [\n 'scaling_evidence',\n 'scalingEvidence',\n 'scaling_evidence_status',\n 'scalingEvidenceStatus',\n ])\n ) {\n blockers.push(\n makeFinding(\n 'scaling_evidence_missing',\n 'blocker',\n 'ready_for_materialization requires scaling evidence or an explicit scaling evidence status.',\n 'unit_of_analysis.scaling_evidence',\n ),\n );\n }\n\n if (blockers.length === 0) {\n findings.push(\n makeFinding(\n 'unit_of_analysis_contract_satisfied',\n 'info',\n 'unit_of_analysis artifact is present and complete enough for deterministic validation.',\n ),\n );\n }\n\n return { findings, blockers, decision };\n}\n\nfunction evaluateBuildPlan(plan: JsonObject, kind: BuildPlanKind): Evaluation {\n const findings: GateFinding[] = [];\n const blockers: GateFinding[] = [];\n const expectedKind = firstToken(plan, ['kind', 'dataset_kind', 'datasetKind']);\n if (expectedKind && expectedKind !== kind) {\n blockers.push(\n makeFinding(\n 'build_plan_kind_mismatch',\n 'blocker',\n `Expected ${kind} build plan but received ${expectedKind}.`,\n 'kind',\n ),\n );\n }\n\n const decision = decisionFromPlan(plan);\n if (!decision) {\n blockers.push(\n makeFinding(\n 'identity_decision_missing',\n 'blocker',\n 'Build plan must include a supported identity decision.',\n 'identity_decision.decision',\n ),\n );\n } else if (!AUTO_DECISIONS.has(decision)) {\n blockers.push(\n makeFinding(\n 'identity_decision_not_automatic',\n 'blocker',\n `Build plan identity decision ${decision} cannot proceed without review.`,\n 'identity_decision.decision',\n ),\n );\n }\n\n if (!evidenceSourcesPresent(plan)) {\n blockers.push(\n makeFinding(\n 'evidence_sources_missing',\n 'blocker',\n 'EvidenceManifest must include at least one source.',\n 'evidence_manifest.sources',\n ),\n );\n }\n\n const unitOfAnalysis = evaluateUnitOfAnalysis(plan);\n findings.push(...unitOfAnalysis.findings);\n blockers.push(...unitOfAnalysis.blockers);\n\n const bindingPaths = evidenceBindingPaths(plan);\n const required = requiredFieldSpecs(kind);\n const satisfied: string[] = [];\n const missing: string[] = [];\n for (const spec of required) {\n if (pathIsSatisfied(plan, spec.aliases)) {\n satisfied.push(spec.path);\n if (!bindingPaths.has(spec.path)) {\n blockers.push(\n makeFinding(\n 'evidence_binding_missing',\n 'blocker',\n `EvidenceManifest must bind source evidence to ${spec.path}.`,\n spec.path,\n ),\n );\n }\n } else {\n missing.push(spec.path);\n blockers.push(\n makeFinding(\n 'build_plan_required_field_missing',\n 'blocker',\n `Build plan is missing ${spec.path}.`,\n spec.path,\n ),\n );\n }\n }\n\n if (blockers.length === 0) {\n findings.push(\n makeFinding(\n 'build_plan_contract_satisfied',\n 'info',\n `${kind} build plan satisfies the minimum authoring gate contract.`,\n ),\n );\n }\n\n return {\n plan,\n findings,\n blockers,\n requiredFields: {\n required: required.map((spec) => spec.path),\n satisfied,\n missing,\n },\n decision,\n unitOfAnalysisDecision: unitOfAnalysis.decision,\n };\n}\n\nfunction schemaForKind(\n kind: BuildPlanKind,\n schemas: Partial<Record<BuildPlanKind, SafeParseSchema>> | undefined,\n): SchemaSpec {\n const injected = schemas?.[kind] ?? null;\n if (injected) {\n return {\n validator: 'injected',\n schema: injected,\n createEntity: null,\n };\n }\n\n const schema = (tidasSdk as unknown as Record<string, SafeParseSchema>)[\n String(SCHEMA_EXPORTS[kind])\n ];\n const createEntity = (tidasSdk as unknown as Record<string, SdkValidationFactory>)[\n String(ENTITY_FACTORY_EXPORTS[kind])\n ];\n return {\n validator: `@tiangong-lca/tidas-sdk/${String(SCHEMA_EXPORTS[kind])}`,\n schema,\n createEntity,\n };\n}\n\nfunction normalizeSchemaIssue(issue: {\n path?: Array<string | number>;\n message?: string;\n code?: string;\n}): { path: string; message: string; code: string } {\n return {\n path: normalizeIssuePath(issue.path),\n message: issue.message ?? 'Validation failed',\n code: issue.code ?? 'custom',\n };\n}\n\nfunction validateMaterializedSchema(\n artifact: JsonObject,\n kind: BuildPlanKind,\n schemas: Partial<Record<BuildPlanKind, SafeParseSchema>> | undefined,\n): SchemaValidationSummary {\n const detectedKind = detectDatasetKind(artifact);\n if (!detectedKind) {\n return {\n status: 'not_applicable',\n validator: null,\n issue_count: 0,\n issues: [],\n };\n }\n if (detectedKind !== kind) {\n return {\n status: 'failed',\n validator: null,\n issue_count: 1,\n issues: [\n {\n path: '<root>',\n message: `Expected ${kind} payload but detected ${detectedKind}.`,\n code: 'dataset_kind_mismatch',\n },\n ],\n };\n }\n\n const { validator, schema, createEntity } = schemaForKind(kind, schemas);\n const payload = unwrapDatasetPayload(artifact);\n const outcome = validateSchemaWithDeepFallback(schema, payload, createEntity);\n if (outcome.success) {\n return {\n status: 'passed',\n validator,\n issue_count: 0,\n issues: [],\n };\n }\n\n return {\n status: 'failed',\n validator,\n issue_count: outcome.issues.length,\n issues: outcome.issues.map(normalizeSchemaIssue),\n };\n}\n\nfunction materializePlan(plan: JsonObject, kind: BuildPlanKind, inputPath: string): JsonObject {\n const payload = firstValue(plan, ['payload', 'materialized_payload', 'materializedPayload']);\n if (isRecord(payload)) {\n return cloneJson(payload);\n }\n return kind === 'process'\n ? buildCanonicalProcessPayload(plan, inputPath)\n : buildCanonicalFlowPayload(plan, inputPath);\n}\n\nfunction emptySchemaValidation(): SchemaValidationSummary {\n return {\n status: 'not_applicable',\n validator: null,\n issue_count: 0,\n issues: [],\n };\n}\n\nfunction reportPaths(outDir: string | null, kind: BuildPlanKind): BuildPlanFiles {\n if (!outDir) {\n return {\n gate_report: null,\n materialized_artifact: null,\n };\n }\n return {\n gate_report: path.join(outDir, 'outputs', 'build-plan-gate-report.json'),\n materialized_artifact: path.join(outDir, 'outputs', `materialized-${kind}.json`),\n };\n}\n\nfunction makeReport(options: {\n kind: BuildPlanKind;\n action: BuildPlanAction;\n inputPath: string;\n outDir: string | null;\n reportOnly: boolean;\n evaluation: Evaluation;\n schemaValidation: SchemaValidationSummary;\n generatedAt: string;\n files: BuildPlanFiles;\n}): BuildPlanGateReport {\n const ruleset = buildPlanRuleset(options.evaluation.plan, options.kind);\n const schemaBlockers =\n options.schemaValidation.status === 'failed'\n ? [\n makeFinding(\n 'materialized_schema_failed',\n 'blocker',\n 'Materialized payload failed schema validation.',\n 'materialized_artifact',\n ),\n ]\n : [];\n const blockers = [...options.evaluation.blockers, ...schemaBlockers];\n const status: BuildPlanStatus = blockers.length > 0 ? 'blocked' : 'passed';\n return {\n schema_version: 1,\n generated_at_utc: options.generatedAt,\n kind: options.kind,\n action: options.action,\n status,\n ruleset_id: ruleset.id,\n ruleset_version: ruleset.version,\n input_path: options.inputPath,\n out_dir: options.outDir,\n report_only: options.reportOnly,\n inputs: {\n plan_schema_version:\n textToken(options.evaluation.plan.schema_version) ??\n textToken(options.evaluation.plan.schemaVersion),\n identity_decision: options.evaluation.decision,\n unit_of_analysis_decision: options.evaluation.unitOfAnalysisDecision,\n },\n required_fields: options.evaluation.requiredFields,\n schema_validation: options.schemaValidation,\n findings: options.evaluation.findings,\n blockers,\n next_action:\n status === 'blocked'\n ? 'fix_build_plan'\n : options.action === 'validate'\n ? 'materialize_payload'\n : 'use_materialized_artifact',\n files: options.files,\n };\n}\n\nasync function runBuildPlan(\n kind: BuildPlanKind,\n action: BuildPlanAction,\n options: RunBuildPlanOptions,\n): Promise<BuildPlanGateReport> {\n const inputPath = requiredInputPath(options.inputPath);\n const outDir = options.outDir?.trim() ? options.outDir.trim() : null;\n const files = reportPaths(outDir, kind);\n const evaluation = evaluateBuildPlan(readBuildPlanInput(inputPath, options.rawInput), kind);\n const materialized =\n action === 'materialize' && evaluation.blockers.length === 0\n ? materializePlan(evaluation.plan, kind, inputPath)\n : null;\n const schemaValidation = materialized\n ? validateMaterializedSchema(materialized, kind, options.schemas)\n : emptySchemaValidation();\n const report = makeReport({\n kind,\n action,\n inputPath,\n outDir,\n reportOnly: Boolean(options.reportOnly),\n evaluation,\n schemaValidation,\n generatedAt: nowIso(options.now),\n files,\n });\n\n if (files.gate_report) {\n writeJsonArtifact(files.gate_report, report);\n }\n if (files.materialized_artifact && materialized) {\n writeJsonArtifact(files.materialized_artifact, materialized);\n }\n return report;\n}\n\nexport async function runProcessBuildPlanValidate(\n options: RunProcessBuildPlanValidateOptions,\n): Promise<ProcessBuildPlanGateReport> {\n return (await runBuildPlan('process', 'validate', options)) as ProcessBuildPlanGateReport;\n}\n\nexport async function runProcessBuildPlanMaterialize(\n options: RunProcessBuildPlanMaterializeOptions,\n): Promise<ProcessBuildPlanGateReport> {\n return (await runBuildPlan('process', 'materialize', options)) as ProcessBuildPlanGateReport;\n}\n\nexport async function runFlowBuildPlanValidate(\n options: RunFlowBuildPlanValidateOptions,\n): Promise<FlowBuildPlanGateReport> {\n return (await runBuildPlan('flow', 'validate', options)) as FlowBuildPlanGateReport;\n}\n\nexport async function runFlowBuildPlanMaterialize(\n options: RunFlowBuildPlanMaterializeOptions,\n): Promise<FlowBuildPlanGateReport> {\n return (await runBuildPlan('flow', 'materialize', options)) as FlowBuildPlanGateReport;\n}\n\nexport const __testInternals = {\n decisionFromPlan,\n evidenceBindingPaths,\n evaluateBuildPlan,\n loadBuildPlan,\n materializePlan,\n validateMaterializedSchema,\n buildCanonicalFlowPayload,\n buildCanonicalProcessPayload,\n buildAnnualSupply,\n multiLangFromValue,\n};\n"]}
@@ -1,6 +1,7 @@
1
1
  import * as tidasSdk from '@tiangong-lca/tidas-sdk';
2
2
  import { normalizeIssuePath, validateSchemaWithDeepFallback, } from './tidas-sdk-validation.js';
3
- const PROCESS_SCHEMA_VALIDATOR = '@tiangong-lca/tidas-sdk/ProcessSchema';
3
+ import { collectProcessPlaceholderIssues, collectProcessRequiredFieldIssues, } from './process-required-fields.js';
4
+ const PROCESS_SCHEMA_VALIDATOR = '@tiangong-lca/tidas-sdk/ProcessSchema+tiangong/process-authoring-required-fields';
4
5
  function getProcessSchema() {
5
6
  const schema = tidasSdk.ProcessSchema;
6
7
  if (!schema?.safeParse) {
@@ -24,7 +25,9 @@ export function summarizeProcessPayloadValidation(result) {
24
25
  }
25
26
  export function validateProcessPayload(payload, schema = getProcessSchema(), createEntity = getProcessFactory()) {
26
27
  const outcome = validateSchemaWithDeepFallback(schema, payload, createEntity);
27
- if (outcome.success) {
28
+ const requiredFieldIssues = collectProcessRequiredFieldIssues(payload);
29
+ const placeholderIssues = collectProcessPlaceholderIssues(payload);
30
+ if (outcome.success && requiredFieldIssues.length === 0 && placeholderIssues.length === 0) {
28
31
  return {
29
32
  ok: true,
30
33
  validator: PROCESS_SCHEMA_VALIDATOR,
@@ -32,11 +35,15 @@ export function validateProcessPayload(payload, schema = getProcessSchema(), cre
32
35
  issues: [],
33
36
  };
34
37
  }
35
- const issues = outcome.issues.map((issue) => ({
36
- path: normalizeIssuePath(issue.path),
37
- message: issue.message ?? 'Validation failed',
38
- code: issue.code ?? 'custom',
39
- }));
38
+ const issues = [
39
+ ...outcome.issues.map((issue) => ({
40
+ path: normalizeIssuePath(issue.path),
41
+ message: issue.message ?? 'Validation failed',
42
+ code: issue.code ?? 'custom',
43
+ })),
44
+ ...requiredFieldIssues,
45
+ ...placeholderIssues,
46
+ ];
40
47
  return {
41
48
  ok: false,
42
49
  validator: PROCESS_SCHEMA_VALIDATOR,
@@ -1 +1 @@
1
- {"version":3,"file":"process-payload-validation.js","sourceRoot":"","sources":["../../../src/lib/process-payload-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AACpD,OAAO,EACL,kBAAkB,EAGlB,8BAA8B,GAC/B,MAAM,2BAA2B,CAAC;AAInC,MAAM,wBAAwB,GAAG,uCAAuC,CAAC;AAsBzE,SAAS,gBAAgB;IACvB,MAAM,MAAM,GAAI,QAAgD,CAAC,aAAa,CAAC;IAC/E,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,wBAAwB,+CAA+C,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAmC,QAAQ;IAE3C,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;IACxC,OAAO,OAAO,aAAa,KAAK,UAAU,CAAC,CAAC,CAAE,aAAsC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,MAAsC;IACtF,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,uCAAuC,CAAC;IACjD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM;SAC1B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,8CAA8C,MAAM,CAAC,WAAW,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACtH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAmB,EACnB,SAA0B,gBAAgB,EAAE,EAC5C,eAA4C,iBAAiB,EAAE;IAE/D,MAAM,OAAO,GAAG,8BAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAE9E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,SAAS,EAAE,wBAAwB;YACnC,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC;QACpC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,mBAAmB;QAC7C,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ;KAC7B,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,EAAE,EAAE,KAAK;QACT,SAAS,EAAE,wBAAwB;QACnC,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,iBAAiB;CAClB,CAAC","sourcesContent":["import * as tidasSdk from '@tiangong-lca/tidas-sdk';\nimport {\n normalizeIssuePath,\n type SafeParseSchema,\n type SdkValidationFactory,\n validateSchemaWithDeepFallback,\n} from './tidas-sdk-validation.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst PROCESS_SCHEMA_VALIDATOR = '@tiangong-lca/tidas-sdk/ProcessSchema';\n\nexport type ProcessPayloadValidationIssue = {\n path: string;\n message: string;\n code: string;\n};\n\nexport type ProcessPayloadValidationResult =\n | {\n ok: true;\n validator: string;\n issue_count: 0;\n issues: [];\n }\n | {\n ok: false;\n validator: string;\n issue_count: number;\n issues: ProcessPayloadValidationIssue[];\n };\n\nfunction getProcessSchema(): SafeParseSchema {\n const schema = (tidasSdk as { ProcessSchema?: SafeParseSchema }).ProcessSchema;\n if (!schema?.safeParse) {\n throw new Error(`${PROCESS_SCHEMA_VALIDATOR} is unavailable in the published CLI runtime.`);\n }\n return schema;\n}\n\nfunction getProcessFactory(\n sdk: { createProcess?: unknown } = tidasSdk,\n): SdkValidationFactory | null {\n const createProcess = sdk.createProcess;\n return typeof createProcess === 'function' ? (createProcess as SdkValidationFactory) : null;\n}\n\nexport function summarizeProcessPayloadValidation(result: ProcessPayloadValidationResult): string {\n if (result.ok) {\n return 'local ProcessSchema validation passed';\n }\n\n const preview = result.issues\n .slice(0, 3)\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join('; ');\n return `local ProcessSchema validation failed with ${result.issue_count} issue(s)${preview ? ` (${preview})` : ''}`;\n}\n\nexport function validateProcessPayload(\n payload: JsonObject,\n schema: SafeParseSchema = getProcessSchema(),\n createEntity: SdkValidationFactory | null = getProcessFactory(),\n): ProcessPayloadValidationResult {\n const outcome = validateSchemaWithDeepFallback(schema, payload, createEntity);\n\n if (outcome.success) {\n return {\n ok: true,\n validator: PROCESS_SCHEMA_VALIDATOR,\n issue_count: 0,\n issues: [],\n };\n }\n\n const issues = outcome.issues.map((issue) => ({\n path: normalizeIssuePath(issue.path),\n message: issue.message ?? 'Validation failed',\n code: issue.code ?? 'custom',\n }));\n\n return {\n ok: false,\n validator: PROCESS_SCHEMA_VALIDATOR,\n issue_count: issues.length,\n issues,\n };\n}\n\nexport const __testInternals = {\n getProcessFactory,\n};\n"]}
1
+ {"version":3,"file":"process-payload-validation.js","sourceRoot":"","sources":["../../../src/lib/process-payload-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AACpD,OAAO,EACL,kBAAkB,EAGlB,8BAA8B,GAC/B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,+BAA+B,EAC/B,iCAAiC,GAClC,MAAM,8BAA8B,CAAC;AAItC,MAAM,wBAAwB,GAC5B,kFAAkF,CAAC;AAsBrF,SAAS,gBAAgB;IACvB,MAAM,MAAM,GAAI,QAAgD,CAAC,aAAa,CAAC;IAC/E,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,wBAAwB,+CAA+C,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAmC,QAAQ;IAE3C,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;IACxC,OAAO,OAAO,aAAa,KAAK,UAAU,CAAC,CAAC,CAAE,aAAsC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,MAAsC;IACtF,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,uCAAuC,CAAC;IACjD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM;SAC1B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,8CAA8C,MAAM,CAAC,WAAW,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACtH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAmB,EACnB,SAA0B,gBAAgB,EAAE,EAC5C,eAA4C,iBAAiB,EAAE;IAE/D,MAAM,OAAO,GAAG,8BAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAC9E,MAAM,mBAAmB,GAAG,iCAAiC,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,iBAAiB,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAC;IAEnE,IAAI,OAAO,CAAC,OAAO,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1F,OAAO;YACL,EAAE,EAAE,IAAI;YACR,SAAS,EAAE,wBAAwB;YACnC,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG;QACb,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChC,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC;YACpC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,mBAAmB;YAC7C,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ;SAC7B,CAAC,CAAC;QACH,GAAG,mBAAmB;QACtB,GAAG,iBAAiB;KACrB,CAAC;IAEF,OAAO;QACL,EAAE,EAAE,KAAK;QACT,SAAS,EAAE,wBAAwB;QACnC,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,iBAAiB;CAClB,CAAC","sourcesContent":["import * as tidasSdk from '@tiangong-lca/tidas-sdk';\nimport {\n normalizeIssuePath,\n type SafeParseSchema,\n type SdkValidationFactory,\n validateSchemaWithDeepFallback,\n} from './tidas-sdk-validation.js';\nimport {\n collectProcessPlaceholderIssues,\n collectProcessRequiredFieldIssues,\n} from './process-required-fields.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst PROCESS_SCHEMA_VALIDATOR =\n '@tiangong-lca/tidas-sdk/ProcessSchema+tiangong/process-authoring-required-fields';\n\nexport type ProcessPayloadValidationIssue = {\n path: string;\n message: string;\n code: string;\n};\n\nexport type ProcessPayloadValidationResult =\n | {\n ok: true;\n validator: string;\n issue_count: 0;\n issues: [];\n }\n | {\n ok: false;\n validator: string;\n issue_count: number;\n issues: ProcessPayloadValidationIssue[];\n };\n\nfunction getProcessSchema(): SafeParseSchema {\n const schema = (tidasSdk as { ProcessSchema?: SafeParseSchema }).ProcessSchema;\n if (!schema?.safeParse) {\n throw new Error(`${PROCESS_SCHEMA_VALIDATOR} is unavailable in the published CLI runtime.`);\n }\n return schema;\n}\n\nfunction getProcessFactory(\n sdk: { createProcess?: unknown } = tidasSdk,\n): SdkValidationFactory | null {\n const createProcess = sdk.createProcess;\n return typeof createProcess === 'function' ? (createProcess as SdkValidationFactory) : null;\n}\n\nexport function summarizeProcessPayloadValidation(result: ProcessPayloadValidationResult): string {\n if (result.ok) {\n return 'local ProcessSchema validation passed';\n }\n\n const preview = result.issues\n .slice(0, 3)\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join('; ');\n return `local ProcessSchema validation failed with ${result.issue_count} issue(s)${preview ? ` (${preview})` : ''}`;\n}\n\nexport function validateProcessPayload(\n payload: JsonObject,\n schema: SafeParseSchema = getProcessSchema(),\n createEntity: SdkValidationFactory | null = getProcessFactory(),\n): ProcessPayloadValidationResult {\n const outcome = validateSchemaWithDeepFallback(schema, payload, createEntity);\n const requiredFieldIssues = collectProcessRequiredFieldIssues(payload);\n const placeholderIssues = collectProcessPlaceholderIssues(payload);\n\n if (outcome.success && requiredFieldIssues.length === 0 && placeholderIssues.length === 0) {\n return {\n ok: true,\n validator: PROCESS_SCHEMA_VALIDATOR,\n issue_count: 0,\n issues: [],\n };\n }\n\n const issues = [\n ...outcome.issues.map((issue) => ({\n path: normalizeIssuePath(issue.path),\n message: issue.message ?? 'Validation failed',\n code: issue.code ?? 'custom',\n })),\n ...requiredFieldIssues,\n ...placeholderIssues,\n ];\n\n return {\n ok: false,\n validator: PROCESS_SCHEMA_VALIDATOR,\n issue_count: issues.length,\n issues,\n };\n}\n\nexport const __testInternals = {\n getProcessFactory,\n};\n"]}
@@ -2,8 +2,12 @@ import { existsSync, readdirSync } from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { readJsonArtifact, writeJsonArtifact } from './artifacts.js';
4
4
  import { CliError } from './errors.js';
5
+ import { summarizeProcessPayloadValidation, validateProcessPayload, } from './process-payload-validation.js';
5
6
  import { normalizePublishRequest } from './publish.js';
7
+ import { getRuntimeRuleset, resolveRuntimeRuleId } from './runtime-rulesets.js';
6
8
  import { withStateFileLock } from './state-lock.js';
9
+ const PROCESS_PUBLISH_RULESET_ID = 'process-publish/default';
10
+ const PROCESS_PUBLISH_RULESET_VERSION = '1';
7
11
  function isRecord(value) {
8
12
  return Boolean(value && typeof value === 'object' && !Array.isArray(value));
9
13
  }
@@ -53,6 +57,7 @@ function buildLayout(runRoot, runId) {
53
57
  publishBundlePath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-bundle.json'),
54
58
  publishRequestPath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-request.json'),
55
59
  publishIntentPath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-intent.json'),
60
+ processSchemaGatePath: path.join(runRoot, 'reports', 'process-publish-schema-gate.json'),
56
61
  reportPath: path.join(runRoot, 'reports', 'process-publish-build-report.json'),
57
62
  };
58
63
  }
@@ -259,7 +264,7 @@ function buildInvocationIndex(layout, invocationIndex, options, now) {
259
264
  ],
260
265
  };
261
266
  }
262
- function buildPublishBundle(layout, state, runManifest, processes, sources, counts, datasetOrigins, now) {
267
+ function buildPublishBundle(layout, state, runManifest, processes, sources, counts, datasetOrigins, schemaGate, now) {
263
268
  return {
264
269
  generated_at_utc: now.toISOString(),
265
270
  run_id: layout.runId,
@@ -268,6 +273,16 @@ function buildPublishBundle(layout, state, runManifest, processes, sources, coun
268
273
  status: 'prepared_local_process_publish_bundle',
269
274
  counts,
270
275
  dataset_origins: datasetOrigins,
276
+ process_schema_gate: {
277
+ status: schemaGate.status,
278
+ ruleset_id: schemaGate.ruleset_id,
279
+ ruleset_version: schemaGate.ruleset_version,
280
+ validator: schemaGate.validator,
281
+ counts: schemaGate.counts,
282
+ blocker_count: schemaGate.blockers.length,
283
+ next_action: schemaGate.next_action,
284
+ report_path: layout.processSchemaGatePath,
285
+ },
271
286
  source_run: {
272
287
  build_status: nonEmptyString(state.build_status),
273
288
  next_stage: nonEmptyString(state.next_stage),
@@ -320,7 +335,7 @@ function buildNextActions(layout) {
320
335
  function stateArrayLength(value) {
321
336
  return Array.isArray(value) ? value.length : 0;
322
337
  }
323
- function buildAgentHandoffSummary(layout, state, counts, now) {
338
+ function buildAgentHandoffSummary(layout, state, counts, schemaGate, now) {
324
339
  return {
325
340
  schema_version: 1,
326
341
  generated_at_utc: now.toISOString(),
@@ -341,6 +356,7 @@ function buildAgentHandoffSummary(layout, state, counts, now) {
341
356
  publish_bundle: layout.publishBundlePath,
342
357
  publish_request: layout.publishRequestPath,
343
358
  publish_intent: layout.publishIntentPath,
359
+ process_schema_gate: layout.processSchemaGatePath,
344
360
  process_update_report: null,
345
361
  flow_auto_build_manifest: null,
346
362
  publish_summary: null,
@@ -351,6 +367,14 @@ function buildAgentHandoffSummary(layout, state, counts, now) {
351
367
  extra: {
352
368
  status: 'prepared_local_process_publish_bundle',
353
369
  request_id: nonEmptyString(state.request_id),
370
+ process_schema_gate: {
371
+ status: schemaGate.status,
372
+ ruleset_id: schemaGate.ruleset_id,
373
+ ruleset_version: schemaGate.ruleset_version,
374
+ counts: schemaGate.counts,
375
+ blocker_count: schemaGate.blockers.length,
376
+ next_action: schemaGate.next_action,
377
+ },
354
378
  },
355
379
  };
356
380
  }
@@ -374,11 +398,97 @@ function buildReport(layout, state, counts, datasetOrigins, publishDefaults, now
374
398
  publish_bundle: layout.publishBundlePath,
375
399
  publish_request: layout.publishRequestPath,
376
400
  publish_intent: layout.publishIntentPath,
401
+ process_schema_gate: layout.processSchemaGatePath,
377
402
  report: layout.reportPath,
378
403
  },
379
404
  next_actions: buildNextActions(layout),
380
405
  };
381
406
  }
407
+ function extractProcessSummary(process) {
408
+ const root = isRecord(process.processDataSet) ? process.processDataSet : process;
409
+ const processInformation = isRecord(root.processInformation) ? root.processInformation : {};
410
+ const dataSetInformation = isRecord(processInformation.dataSetInformation)
411
+ ? processInformation.dataSetInformation
412
+ : {};
413
+ const administrativeInformation = isRecord(root.administrativeInformation)
414
+ ? root.administrativeInformation
415
+ : {};
416
+ const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)
417
+ ? administrativeInformation.publicationAndOwnership
418
+ : {};
419
+ return {
420
+ id: nonEmptyString(dataSetInformation['common:UUID']),
421
+ version: nonEmptyString(publicationAndOwnership['common:dataSetVersion']),
422
+ };
423
+ }
424
+ function buildProcessSchemaGateReport(processes, options) {
425
+ const ruleset = getRuntimeRuleset('process-publish/default');
426
+ const validate = options.validateProcessPayloadImpl ?? validateProcessPayload;
427
+ const processResults = processes.map((process, index) => {
428
+ const result = validate(process);
429
+ const summary = extractProcessSummary(process);
430
+ return {
431
+ index,
432
+ id: summary.id,
433
+ version: summary.version,
434
+ ok: result.ok,
435
+ issue_count: result.issue_count,
436
+ issues: result.issues,
437
+ };
438
+ });
439
+ const invalid = processResults.filter((process) => !process.ok).length;
440
+ const blockers = processResults.flatMap((process) => process.issues.map((issue) => ({
441
+ code: issue.code,
442
+ severity: 'blocker',
443
+ methodology_rule_id: resolveRuntimeRuleId(ruleset.id, issue.code),
444
+ message: issue.message,
445
+ path: issue.path,
446
+ dataset_index: process.index,
447
+ dataset_id: process.id,
448
+ dataset_version: process.version,
449
+ })));
450
+ return {
451
+ schema_version: 1,
452
+ generated_at_utc: options.now.toISOString(),
453
+ status: invalid > 0 ? 'blocked' : 'passed',
454
+ ruleset_id: PROCESS_PUBLISH_RULESET_ID,
455
+ ruleset_version: PROCESS_PUBLISH_RULESET_VERSION,
456
+ ruleset_source_version: ruleset.source_version,
457
+ ruleset_rule_ids: ruleset.rule_ids,
458
+ validator: '@tiangong-lca/tidas-sdk/ProcessSchema',
459
+ counts: {
460
+ total: processResults.length,
461
+ valid: processResults.length - invalid,
462
+ invalid,
463
+ },
464
+ findings: blockers,
465
+ blockers,
466
+ next_action: invalid > 0 ? 'fix_process_payloads' : 'write_publish_bundle',
467
+ processes: processResults,
468
+ };
469
+ }
470
+ function assertProcessSchemaGatePassed(gate, layout) {
471
+ if (gate.status === 'passed') {
472
+ return;
473
+ }
474
+ const firstInvalid = gate.processes.find((process) => !process.ok);
475
+ const detail = firstInvalid
476
+ ? ` First invalid process index ${firstInvalid.index}: ${summarizeProcessPayloadValidation({
477
+ ok: false,
478
+ validator: gate.validator,
479
+ issue_count: firstInvalid.issue_count,
480
+ issues: firstInvalid.issues,
481
+ })}`
482
+ : '';
483
+ throw new CliError(`process publish-build schema gate failed with ${gate.counts.invalid} invalid process dataset(s).${detail}`, {
484
+ code: 'PROCESS_PUBLISH_SCHEMA_GATE_FAILED',
485
+ exitCode: 2,
486
+ details: {
487
+ gate_report: layout.processSchemaGatePath,
488
+ counts: gate.counts,
489
+ },
490
+ });
491
+ }
382
492
  export async function runProcessPublishBuild(options) {
383
493
  const now = options.now ?? new Date();
384
494
  const layout = resolveLayout(options);
@@ -404,7 +514,13 @@ export async function runProcessPublishBuild(options) {
404
514
  processes: datasets.processOrigin,
405
515
  sources: datasets.sourceOrigin,
406
516
  };
407
- const publishBundle = buildPublishBundle(layout, state, runManifest, datasets.processes, datasets.sources, counts, datasetOrigins, now);
517
+ const schemaGate = buildProcessSchemaGateReport(datasets.processes, {
518
+ now,
519
+ validateProcessPayloadImpl: options.validateProcessPayloadImpl,
520
+ });
521
+ writeJsonArtifact(layout.processSchemaGatePath, schemaGate);
522
+ assertProcessSchemaGatePassed(schemaGate, layout);
523
+ const publishBundle = buildPublishBundle(layout, state, runManifest, datasets.processes, datasets.sources, counts, datasetOrigins, schemaGate, now);
408
524
  const publishRequest = buildPublishRequest();
409
525
  const normalizedPublishRequest = normalizePublishRequest(publishRequest, {
410
526
  requestPath: layout.publishRequestPath,
@@ -413,7 +529,7 @@ export async function runProcessPublishBuild(options) {
413
529
  const publishIntent = buildPublishIntent(layout, counts);
414
530
  const updatedState = buildUpdatedState(state, layout, counts, datasetOrigins, now);
415
531
  const updatedInvocationIndex = buildInvocationIndex(layout, invocationIndex, options, now);
416
- const handoffSummary = buildAgentHandoffSummary(layout, updatedState, counts, now);
532
+ const handoffSummary = buildAgentHandoffSummary(layout, updatedState, counts, schemaGate, now);
417
533
  const report = buildReport(layout, updatedState, counts, datasetOrigins, {
418
534
  commit: normalizedPublishRequest.publish.commit,
419
535
  publish_lifecyclemodels: normalizedPublishRequest.publish.publish_lifecyclemodels,
@@ -441,6 +557,8 @@ export const __testInternals = {
441
557
  collectCanonicalDatasets,
442
558
  buildPublishRequest,
443
559
  buildPublishIntent,
560
+ buildProcessSchemaGateReport,
561
+ assertProcessSchemaGatePassed,
444
562
  buildUpdatedState,
445
563
  buildInvocationIndex,
446
564
  buildNextActions,