@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.
- package/README.md +97 -16
- package/dist/src/cli.js +1429 -131
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-author.js +100 -0
- package/dist/src/lib/dataset-author.js.map +1 -0
- package/dist/src/lib/dataset-bilingual.js +545 -0
- package/dist/src/lib/dataset-bilingual.js.map +1 -0
- package/dist/src/lib/dataset-contract.js +350 -0
- package/dist/src/lib/dataset-contract.js.map +1 -0
- package/dist/src/lib/dataset-evidence-search.js +636 -0
- package/dist/src/lib/dataset-evidence-search.js.map +1 -0
- package/dist/src/lib/dataset-import-lca.js +171 -0
- package/dist/src/lib/dataset-import-lca.js.map +1 -0
- package/dist/src/lib/dataset-remote-refresh.js +166 -0
- package/dist/src/lib/dataset-remote-refresh.js.map +1 -0
- package/dist/src/lib/dataset-remote-verify.js +543 -0
- package/dist/src/lib/dataset-remote-verify.js.map +1 -0
- package/dist/src/lib/dataset-validate.js +63 -7
- package/dist/src/lib/dataset-validate.js.map +1 -1
- package/dist/src/lib/flow-fetch-rows.js +12 -12
- package/dist/src/lib/flow-fetch-rows.js.map +1 -1
- package/dist/src/lib/flow-payload-validation.js +51 -0
- package/dist/src/lib/flow-payload-validation.js.map +1 -0
- package/dist/src/lib/flow-publish-reviewed-data.js +16 -0
- package/dist/src/lib/flow-publish-reviewed-data.js.map +1 -1
- package/dist/src/lib/flow-publish-version.js +182 -12
- package/dist/src/lib/flow-publish-version.js.map +1 -1
- package/dist/src/lib/{review-flow.js → flow-qa.js} +86 -28
- package/dist/src/lib/flow-qa.js.map +1 -0
- package/dist/src/lib/identity-preflight.js +1021 -0
- package/dist/src/lib/identity-preflight.js.map +1 -0
- package/dist/src/lib/{review-lifecyclemodel.js → lifecyclemodel-qa.js} +54 -54
- package/dist/src/lib/lifecyclemodel-qa.js.map +1 -0
- package/dist/src/lib/process-auto-build.js +147 -0
- package/dist/src/lib/process-auto-build.js.map +1 -1
- package/dist/src/lib/process-dedup-review.js +51 -0
- package/dist/src/lib/process-dedup-review.js.map +1 -1
- package/dist/src/lib/process-flow-build-plan.js +1071 -0
- package/dist/src/lib/process-flow-build-plan.js.map +1 -0
- package/dist/src/lib/process-payload-validation.js +14 -7
- package/dist/src/lib/process-payload-validation.js.map +1 -1
- package/dist/src/lib/process-publish-build.js +122 -4
- package/dist/src/lib/process-publish-build.js.map +1 -1
- package/dist/src/lib/{review-process.js → process-qa.js} +259 -117
- package/dist/src/lib/process-qa.js.map +1 -0
- package/dist/src/lib/process-refresh-references.js +19 -10
- package/dist/src/lib/process-refresh-references.js.map +1 -1
- package/dist/src/lib/process-required-fields.js +810 -0
- package/dist/src/lib/process-required-fields.js.map +1 -0
- package/dist/src/lib/process-save-draft-run.js +4 -1
- package/dist/src/lib/process-save-draft-run.js.map +1 -1
- package/dist/src/lib/publish.js +100 -0
- package/dist/src/lib/publish.js.map +1 -1
- package/dist/src/lib/runtime-rulesets.js +283 -0
- package/dist/src/lib/runtime-rulesets.js.map +1 -0
- package/package.json +2 -2
- package/dist/src/lib/review-flow.js.map +0 -1
- package/dist/src/lib/review-lifecyclemodel.js.map +0 -1
- package/dist/src/lib/review-process.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-qa.js","sourceRoot":"","sources":["../../../src/lib/process-qa.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact, writeTextArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { readJsonInput } from './io.js';\nimport { getRuntimeRuleset, resolveRuntimeRuleId } from './runtime-rulesets.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nconst KIND_RE = /\\[tg_io_kind_tag=([^\\]]+)\\]/gu;\nconst UOM_RE = /\\[tg_io_uom_tag=([^\\]]+)\\]/gu;\n\nconst ENERGY_WORDS = [\n 'electric',\n 'electricity',\n 'kwh',\n 'mj',\n 'heat',\n 'steam',\n 'fuel',\n 'diesel',\n 'gas',\n 'power',\n '电',\n '能',\n] as const;\n\nconst RAW_WORDS = [\n 'raw material',\n 'feedstock',\n 'fertilizer',\n 'water',\n 'seed',\n 'pesticide',\n '原材料',\n '投入',\n '肥料',\n '种子',\n '农药',\n '用水',\n] as const;\n\nconst BYP_WORDS = ['by-product', 'co-product', '副产品', '联产'] as const;\nconst WASTE_WORDS = ['waste', '废', 'residue', 'sludge'] as const;\n\ntype BaseInfoCheck = {\n source_name_ok: boolean;\n functional_unit_ok: boolean;\n system_boundary_ok: boolean;\n time_ok: boolean;\n geo_ok: boolean;\n tech_ok: boolean;\n admin_ok: boolean;\n completeness_score: number;\n base_names: string[];\n};\n\ntype ClassifiedExchange = {\n classification:\n | 'raw_material_input'\n | 'energy_input'\n | 'other_input'\n | 'product_output'\n | 'byproduct_output'\n | 'waste_output'\n | 'other_output'\n | 'other';\n kinds: string[];\n uoms: string[];\n blob: string;\n source_input_group: string | null;\n source_output_group: string | null;\n reference_flow: boolean;\n};\n\ntype UnitIssue = {\n flow_uuid: string;\n current_unit: string;\n suggested_unit: string;\n basis: string;\n confidence: string;\n};\n\ntype ProcessQaRow = {\n process_file: string;\n raw_input: number;\n product: number;\n byproduct: number;\n waste: number;\n energy_excluded: number;\n delta: number;\n relative_deviation: number | null;\n};\n\ntype ProcessQaTotals = {\n raw_input: number;\n product_plus_byproduct_plus_waste: number;\n delta: number;\n relative_deviation: number | null;\n energy_excluded: number;\n};\n\ntype ProcessQaFinding = {\n process_file: string;\n severity: 'info' | 'warning' | 'blocker';\n code: string;\n methodology_rule_id: string | null;\n message: string;\n source: 'rule';\n evidence?: JsonRecord;\n};\n\ntype ProcessRulesetGate = {\n status: 'passed' | 'needs_review' | 'blocked';\n ruleset_id: 'process-authoring/strict';\n ruleset_version: '1';\n ruleset_source_version: string;\n ruleset_rule_ids: string[];\n counts: {\n findings: number;\n blockers: number;\n };\n blockers: ProcessQaFinding[];\n next_action: 'continue' | 'review_findings_in_foundry' | 'fix_blockers';\n};\n\ntype ProcessSummaryForLlm = {\n process_file: string;\n base_names: string[];\n base_checks: {\n source_name_ok: boolean;\n functional_unit_ok: boolean;\n system_boundary_ok: boolean;\n time_ok: boolean;\n geo_ok: boolean;\n tech_ok: boolean;\n admin_ok: boolean;\n };\n balance: {\n raw_in: number;\n product: number;\n byproduct: number;\n waste: number;\n energy_excluded: number;\n relative_deviation: number | null;\n };\n};\n\nexport type ProcessQaLlmResult =\n | {\n enabled: false;\n reason: string;\n }\n | {\n enabled: true;\n ok: true;\n result: JsonRecord;\n }\n | {\n enabled: true;\n ok: false;\n reason: string;\n raw?: string;\n };\n\nexport type ProcessQaSummary = {\n run_id: string;\n logic_version: string;\n process_count: number;\n totals: ProcessQaTotals;\n ruleset_gate?: ProcessRulesetGate;\n llm: ProcessQaLlmResult;\n policy_decision_owner: 'foundry';\n qa_mode: 'deterministic_qa_report';\n};\n\nexport type ProcessQaReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_local_process_qa';\n run_id: string;\n run_root: string;\n rows_file: string;\n out_dir: string;\n input_mode: 'rows_file' | 'run_root';\n effective_processes_dir: string;\n logic_version: string;\n ruleset_id?: 'process-authoring/strict';\n ruleset_version?: '1';\n ruleset_source_version?: string;\n ruleset_rule_ids?: string[];\n process_count: number;\n totals: ProcessQaTotals;\n rule_finding_count?: number;\n blocker_count?: number;\n ruleset_gate?: ProcessRulesetGate;\n policy_decision_owner: 'foundry';\n qa_mode: 'deterministic_qa_report';\n files: {\n qa_input_summary: string;\n materialization_summary: string | null;\n rule_findings?: string;\n ruleset_gate?: string;\n qa_zh: string;\n qa_en: string;\n timing: string;\n unit_issue_log: string;\n summary: string;\n report: string;\n };\n llm: ProcessQaLlmResult;\n};\n\nexport type RunProcessQaOptions = {\n rowsFile?: string;\n runRoot?: string;\n runId?: string;\n outDir: string;\n startTs?: string;\n endTs?: string;\n logicVersion?: string;\n enableLlm?: boolean;\n llmModel?: string;\n llmMaxProcesses?: number;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n now?: () => Date;\n};\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction requiredNonEmpty(value: string | undefined, label: string, code: string): string {\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n\n throw new CliError(`Missing required ${label}.`, {\n code,\n exitCode: 2,\n });\n}\n\nfunction textFromValue(value: unknown): string {\n if (Array.isArray(value)) {\n return value\n .filter(isRecord)\n .map((item) => String(item['#text'] ?? ''))\n .join(' ');\n }\n\n if (isRecord(value)) {\n return String(value['#text'] ?? '');\n }\n\n return String(value ?? '');\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : 0;\n }\n\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : 0;\n }\n\n return 0;\n}\n\nfunction deepGet(value: unknown, pathParts: string[]): unknown {\n let current: unknown = value;\n\n for (const key of pathParts) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[key];\n if (current === undefined || current === null) {\n return undefined;\n }\n }\n\n return current;\n}\n\nfunction hasNonEmpty(value: unknown): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n\n if (typeof value === 'string') {\n return value.trim().length > 0;\n }\n\n if (Array.isArray(value)) {\n return value.some((item) => hasNonEmpty(item));\n }\n\n if (isRecord(value)) {\n if ('#text' in value) {\n return hasNonEmpty(value['#text']);\n }\n return Object.values(value).some((item) => hasNonEmpty(item));\n }\n\n return true;\n}\n\nfunction extractBaseNames(processPayload: JsonRecord): [boolean, string[]] {\n const base = deepGet(processPayload, [\n 'processDataSet',\n 'processInformation',\n 'dataSetInformation',\n 'name',\n 'baseName',\n ]);\n const items = Array.isArray(base) ? base : base ? [base] : [];\n const values: string[] = [];\n\n items.forEach((item) => {\n if (!isRecord(item)) {\n return;\n }\n const text = String(item['#text'] ?? '').trim();\n if (!text) {\n return;\n }\n values.push(text);\n });\n\n return [values.length > 0, values];\n}\n\nfunction sourceTracePayload(exchange: JsonRecord): JsonRecord | null {\n const payload = deepGet(exchange, ['common:other', 'tidasimport:sourceTrace', 'payload']);\n if (!isRecord(payload)) {\n return null;\n }\n return isRecord(payload.sourceTrace) ? payload.sourceTrace : payload;\n}\n\nfunction sourceClassification(exchange: JsonRecord): JsonRecord {\n const payload = sourceTracePayload(exchange);\n return payload && isRecord(payload.sourceClassification) ? payload.sourceClassification : {};\n}\n\nfunction sourceGroup(exchange: JsonRecord, groupName: 'inputGroup' | 'outputGroup'): string | null {\n const value = sourceClassification(exchange)[groupName];\n const text = String(value ?? '').trim();\n return text || null;\n}\n\nfunction classifyExchange(\n exchange: JsonRecord,\n referenceFlowId: string | null = null,\n): ClassifiedExchange {\n const comments =\n `${textFromValue(exchange.commonComment)} ${textFromValue(exchange.generalComment)}`.toLowerCase();\n const flowDescription = textFromValue(\n isRecord(exchange.referenceToFlowDataSet)\n ? exchange.referenceToFlowDataSet['common:shortDescription']\n : undefined,\n ).toLowerCase();\n const blob = `${comments} ${flowDescription}`.trim();\n const kinds = Array.from(blob.matchAll(KIND_RE), (match) => match[1].toLowerCase());\n const kindSet = new Set(kinds);\n const uoms = Array.from(blob.matchAll(UOM_RE), (match) => match[1].toLowerCase());\n const direction = String(exchange.exchangeDirection ?? '').toLowerCase();\n const inputGroup = sourceGroup(exchange, 'inputGroup');\n const outputGroup = sourceGroup(exchange, 'outputGroup');\n const internalId = String(exchange['@dataSetInternalID'] ?? '').trim();\n const isReferenceFlow = Boolean(referenceFlowId && internalId === referenceFlowId);\n const meta = {\n kinds,\n uoms,\n blob,\n source_input_group: inputGroup,\n source_output_group: outputGroup,\n reference_flow: isReferenceFlow,\n };\n const isEnergy =\n ENERGY_WORDS.some((word) => blob.includes(word)) ||\n uoms.some((uom) => uom === 'kwh' || uom === 'mj' || uom === 'gj');\n\n if (direction === 'input') {\n if (kindSet.has('energy') || isEnergy) {\n return { classification: 'energy_input', ...meta };\n }\n if (kindSet.has('waste')) {\n return { classification: 'other_input', ...meta };\n }\n if (inputGroup === '4' || kindSet.has('raw_material') || kindSet.has('resource')) {\n return { classification: 'raw_material_input', ...meta };\n }\n if (kindSet.has('product') || RAW_WORDS.some((word) => blob.includes(word))) {\n return { classification: 'raw_material_input', ...meta };\n }\n return { classification: 'other_input', ...meta };\n }\n\n if (direction === 'output') {\n if (isReferenceFlow || outputGroup === '0') {\n return { classification: 'product_output', ...meta };\n }\n if (\n kindSet.has('waste') ||\n outputGroup === '4' ||\n outputGroup === '5' ||\n WASTE_WORDS.some((word) => blob.includes(word))\n ) {\n return { classification: 'waste_output', ...meta };\n }\n if (BYP_WORDS.some((word) => blob.includes(word))) {\n return { classification: 'byproduct_output', ...meta };\n }\n if (kindSet.has('product')) {\n return { classification: 'product_output', ...meta };\n }\n return { classification: 'other_output', ...meta };\n }\n\n return { classification: 'other', ...meta };\n}\n\nfunction unitIssueCheck(exchange: JsonRecord, uoms: string[], blob: string): UnitIssue[] {\n const flowUuid = isRecord(exchange.referenceToFlowDataSet)\n ? String(exchange.referenceToFlowDataSet['@refObjectId'] ?? '')\n : '';\n\n if (!flowUuid) {\n return [];\n }\n\n const currentUnit = uoms[0] ?? '';\n if (\n ['electric', 'electricity', '交流电', '电力'].some((word) => blob.includes(word)) &&\n currentUnit &&\n !['kwh', 'mj', 'gj'].includes(currentUnit)\n ) {\n return [\n {\n flow_uuid: flowUuid,\n current_unit: currentUnit,\n suggested_unit: 'kWh',\n basis: 'flow 描述为电力/电能,但 uom 标签非能量单位',\n confidence: '高',\n },\n ];\n }\n\n if (\n ['water', '用水', '工艺用水'].some((word) => blob.includes(word)) &&\n currentUnit &&\n ['kwh', 'mj', 'gj'].includes(currentUnit)\n ) {\n return [\n {\n flow_uuid: flowUuid,\n current_unit: currentUnit,\n suggested_unit: 'm3 或 kg',\n basis: 'flow 描述为水,但 uom 标签为能量单位',\n confidence: '高',\n },\n ];\n }\n\n if (\n ['co2', 'carbon dioxide', '二氧化碳'].some((word) => blob.includes(word)) &&\n currentUnit &&\n ['kwh', 'mj', 'gj'].includes(currentUnit)\n ) {\n return [\n {\n flow_uuid: flowUuid,\n current_unit: currentUnit,\n suggested_unit: 'kg',\n basis: '排放流通常质量单位计,当前为能量单位',\n confidence: '中',\n },\n ];\n }\n\n return [];\n}\n\nfunction hasNumericAmount(exchange: JsonRecord): boolean {\n for (const key of ['meanAmount', 'resultingAmount']) {\n const value = exchange[key];\n if (typeof value === 'number' && Number.isFinite(value)) {\n return true;\n }\n if (typeof value === 'string' && value.trim() && Number.isFinite(Number(value))) {\n return true;\n }\n }\n return false;\n}\n\nfunction createProcessQaFinding(options: {\n processFile: string;\n severity: ProcessQaFinding['severity'];\n code: string;\n message: string;\n evidence?: JsonRecord;\n}): ProcessQaFinding {\n const methodologyRuleId = resolveRuntimeRuleId('process-authoring/strict', options.code);\n return {\n process_file: options.processFile,\n severity: options.severity,\n code: options.code,\n methodology_rule_id: methodologyRuleId,\n message: options.message,\n source: 'rule',\n ...(options.evidence ? { evidence: options.evidence } : {}),\n };\n}\n\nfunction reviewFindingsForBase(processFile: string, base: BaseInfoCheck): ProcessQaFinding[] {\n const findings: ProcessQaFinding[] = [];\n if (!base.source_name_ok) {\n findings.push(\n createProcessQaFinding({\n processFile,\n severity: 'warning',\n code: 'process_missing_source_base_name',\n message:\n 'Process baseName should include a usable source-language entry before Foundry authoring is complete.',\n evidence: { base_names: base.base_names },\n }),\n );\n }\n if (!base.functional_unit_ok) {\n findings.push(\n createProcessQaFinding({\n processFile,\n severity: 'warning',\n code: 'process_missing_functional_unit',\n message:\n 'Process quantitative reference functionalUnitOrOther is missing and should be curated by Foundry.',\n }),\n );\n }\n for (const [ok, code, message] of [\n [\n base.system_boundary_ok,\n 'process_missing_system_boundary',\n 'Process system boundary or typeOfDataSet context is missing.',\n ],\n [base.time_ok, 'process_missing_time', 'Process time coverage is missing.'],\n [base.geo_ok, 'process_missing_geography', 'Process geography is missing.'],\n [base.tech_ok, 'process_missing_technology', 'Process technology description is missing.'],\n [\n base.admin_ok,\n 'process_missing_admin_metadata',\n 'Process administrative metadata is missing.',\n ],\n ] as const) {\n if (!ok) {\n findings.push(\n createProcessQaFinding({\n processFile,\n severity: 'warning',\n code,\n message,\n }),\n );\n }\n }\n return findings;\n}\n\nfunction processRulesetGate(findings: ProcessQaFinding[]): ProcessRulesetGate {\n const ruleset = getRuntimeRuleset('process-authoring/strict');\n const blockers = findings.filter((finding) => finding.severity === 'blocker');\n const status = blockers.length > 0 ? 'blocked' : findings.length > 0 ? 'needs_review' : 'passed';\n return {\n status,\n ruleset_id: ruleset.id,\n ruleset_version: ruleset.version,\n ruleset_source_version: ruleset.source_version,\n ruleset_rule_ids: ruleset.rule_ids,\n counts: {\n findings: findings.length,\n blockers: blockers.length,\n },\n blockers,\n next_action:\n status === 'blocked'\n ? 'fix_blockers'\n : status === 'needs_review'\n ? 'review_findings_in_foundry'\n : 'continue',\n };\n}\n\nfunction baseInfoCheck(processPayload: JsonRecord): BaseInfoCheck {\n const [sourceNameOk, values] = extractBaseNames(processPayload);\n const functionalUnit = deepGet(processPayload, [\n 'processDataSet',\n 'processInformation',\n 'quantitativeReference',\n 'functionalUnitOrOther',\n ]);\n const mixAndLocation = deepGet(processPayload, [\n 'processDataSet',\n 'processInformation',\n 'geography',\n 'mixAndLocationTypes',\n ]);\n const route = deepGet(processPayload, [\n 'processDataSet',\n 'modellingAndValidation',\n 'LCIMethodAndAllocation',\n 'typeOfDataSet',\n ]);\n const time = deepGet(processPayload, ['processDataSet', 'processInformation', 'time']);\n const geography = deepGet(processPayload, ['processDataSet', 'processInformation', 'geography']);\n const technology = deepGet(processPayload, ['processDataSet', 'modellingAndValidation']);\n const administrativeInformation = deepGet(processPayload, [\n 'processDataSet',\n 'administrativeInformation',\n ]);\n\n const functionalUnitOk = hasNonEmpty(functionalUnit);\n const systemBoundaryOk = hasNonEmpty(mixAndLocation) || hasNonEmpty(route);\n const timeOk = hasNonEmpty(time);\n const geographyOk = hasNonEmpty(geography);\n const technologyOk = hasNonEmpty(technology);\n const administrativeOk = hasNonEmpty(administrativeInformation);\n const completenessScore = [\n sourceNameOk,\n functionalUnitOk,\n systemBoundaryOk,\n timeOk,\n geographyOk,\n technologyOk,\n administrativeOk,\n ].filter(Boolean).length;\n\n return {\n source_name_ok: sourceNameOk,\n functional_unit_ok: functionalUnitOk,\n system_boundary_ok: systemBoundaryOk,\n time_ok: timeOk,\n geo_ok: geographyOk,\n tech_ok: technologyOk,\n admin_ok: administrativeOk,\n completeness_score: completenessScore,\n base_names: values,\n };\n}\n\nfunction unwrapProcessPayload(value: unknown, filePath: string): JsonRecord {\n if (!isRecord(value)) {\n throw new CliError(`Expected process QA file to contain a JSON object: ${filePath}`, {\n code: 'PROCESS_QA_INPUT_INVALID',\n exitCode: 2,\n });\n }\n\n const candidate =\n (isRecord(value.process) && value.process) ||\n (isRecord(value.json_ordered) && value.json_ordered) ||\n (isRecord(value.jsonOrdered) && value.jsonOrdered) ||\n (isRecord(value.json) && value.json) ||\n value;\n\n if (!isRecord(candidate.processDataSet)) {\n throw new CliError(`Process QA file is missing processDataSet: ${filePath}`, {\n code: 'PROCESS_QA_INPUT_INVALID',\n exitCode: 2,\n });\n }\n\n return candidate;\n}\n\nfunction extractProcessIdentity(value: JsonRecord, index: number): { id: string; version: string } {\n const payload = unwrapProcessPayload(value, `row-${index + 1}`);\n const root = payload.processDataSet as JsonRecord;\n const processInformation = isRecord(root.processInformation) ? root.processInformation : {};\n const dataSetInformation = isRecord(processInformation.dataSetInformation)\n ? processInformation.dataSetInformation\n : {};\n const administrativeInformation = isRecord(root.administrativeInformation)\n ? root.administrativeInformation\n : {};\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n const id =\n String(dataSetInformation['common:UUID'] ?? value.id ?? '').trim() || `row-${index + 1}`;\n const version =\n String(publicationAndOwnership['common:dataSetVersion'] ?? value.version ?? '').trim() ||\n '01.00.000';\n return {\n id,\n version,\n };\n}\n\nfunction loadReviewRows(rowsFile: string): JsonRecord[] {\n const resolved = path.resolve(rowsFile);\n const text = readFileSync(resolved, 'utf8');\n\n if (resolved.endsWith('.jsonl')) {\n return text\n .split(/\\r?\\n/gu)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n try {\n const parsed = JSON.parse(line) as unknown;\n if (!isRecord(parsed)) {\n throw new CliError(`Expected JSON object rows in JSONL file: ${resolved}`, {\n code: 'PROCESS_QA_ROWS_INVALID_JSONL_ROW',\n exitCode: 2,\n });\n }\n return parsed;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n throw new CliError(`Process QA rows file contains invalid JSONL at line ${index + 1}.`, {\n code: 'PROCESS_QA_ROWS_INVALID_JSONL',\n exitCode: 2,\n details: String(error),\n });\n }\n });\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text) as unknown;\n } catch (error) {\n throw new CliError(`Process QA rows file is not valid JSON: ${resolved}`, {\n code: 'PROCESS_QA_ROWS_INVALID_JSON',\n exitCode: 2,\n details: String(error),\n });\n }\n if (Array.isArray(parsed) && parsed.every(isRecord)) {\n return parsed;\n }\n\n if (isRecord(parsed) && Array.isArray(parsed.rows) && parsed.rows.every(isRecord)) {\n return parsed.rows;\n }\n\n throw new CliError(`Expected JSON array of objects or a report object with rows[]: ${resolved}`, {\n code: 'PROCESS_QA_ROWS_INVALID_JSON',\n exitCode: 2,\n });\n}\n\nfunction materializeRowsFile(\n rowsFile: string,\n outDir: string,\n): { processesDir: string; summaryPath: string } {\n const rows = loadReviewRows(rowsFile);\n const targetDir = path.join(outDir, 'qa-input', 'processes');\n mkdirSync(targetDir, { recursive: true });\n\n const byKey: Record<string, JsonRecord> = {};\n let duplicateCount = 0;\n rows.forEach((row, index) => {\n const payload = unwrapProcessPayload(row, `${rowsFile}#${index + 1}`);\n const identity = extractProcessIdentity(row, index);\n const key = `${identity.id}@${identity.version}`;\n if (key in byKey) {\n duplicateCount += 1;\n }\n byKey[key] = payload;\n });\n\n const items: Array<{ process_key: string; file: string }> = [];\n Object.entries(byKey)\n .sort(([left], [right]) => left.localeCompare(right))\n .forEach(([key, payload]) => {\n const { id, version } = extractProcessIdentity(payload, 0);\n const fileName = `${id}__${version}.json`;\n const filePath = path.join(targetDir, fileName);\n writeJsonArtifact(filePath, payload);\n items.push({\n process_key: key,\n file: filePath,\n });\n });\n\n const summaryPath = path.join(outDir, 'qa-input', 'materialization-summary.json');\n writeJsonArtifact(summaryPath, {\n source_rows_file: path.resolve(rowsFile),\n input_row_count: rows.length,\n materialized_process_count: Object.keys(byKey).length,\n duplicate_input_rows_collapsed: duplicateCount,\n processes_dir: targetDir,\n items,\n });\n\n return {\n processesDir: targetDir,\n summaryPath,\n };\n}\n\nfunction resolveReviewInput(options: {\n rowsFile?: string;\n runRoot?: string;\n runId?: string;\n outDir: string;\n}): {\n inputMode: 'rows_file' | 'run_root';\n effectiveProcessesDir: string;\n materializationSummaryPath: string | null;\n runId: string;\n runRoot: string;\n rowsFile: string;\n reviewInputSummary: JsonRecord;\n} {\n const declaredModes = [Boolean(options.rowsFile), Boolean(options.runRoot)].filter(Boolean);\n if (declaredModes.length !== 1) {\n throw new CliError('Process QA requires exactly one of --rows-file or --run-root.', {\n code: 'PROCESS_QA_INPUT_MODE_REQUIRED',\n exitCode: 2,\n });\n }\n\n if (options.rowsFile) {\n const materialized = materializeRowsFile(options.rowsFile, options.outDir);\n return {\n inputMode: 'rows_file',\n effectiveProcessesDir: materialized.processesDir,\n materializationSummaryPath: materialized.summaryPath,\n runId: options.runId?.trim() || path.parse(options.rowsFile).name,\n runRoot: '',\n rowsFile: path.resolve(options.rowsFile),\n reviewInputSummary: {\n input_mode: 'rows_file',\n rows_file: path.resolve(options.rowsFile),\n run_root: '',\n materialized_processes_dir: materialized.processesDir,\n effective_processes_dir: materialized.processesDir,\n },\n };\n }\n\n const runRoot = path.resolve(options.runRoot!);\n const effective = path.join(runRoot, 'exports', 'processes');\n return {\n inputMode: 'run_root',\n effectiveProcessesDir: effective,\n materializationSummaryPath: null,\n runId: options.runId?.trim() || path.basename(runRoot),\n runRoot,\n rowsFile: '',\n reviewInputSummary: {\n input_mode: 'run_root',\n rows_file: '',\n run_root: runRoot,\n materialized_processes_dir: '',\n effective_processes_dir: effective,\n },\n };\n}\n\nfunction readProcessFiles(processDir: string): string[] {\n if (!existsSync(processDir) || !statSync(processDir).isDirectory()) {\n throw new CliError(`Process QA directory not found: ${processDir}`, {\n code: 'PROCESS_QA_EXPORTS_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n return readdirSync(processDir)\n .filter((entry) => entry.endsWith('.json'))\n .sort()\n .map((entry) => path.join(processDir, entry));\n}\n\nfunction buildPrompt(processSummaries: ProcessSummaryForLlm[]): string {\n return [\n '请基于以下 process 摘要做语义一致性审核(源语言名称、边界表达、修订建议)。',\n '要求:',\n '1) 只根据给定摘要;',\n '2) 证据不足必须明确标注;',\n '3) 输出 JSON,格式:{\"findings\":[{\"process_file\",\"severity\",\"fixability\",\"evidence\",\"action\"}]}。',\n '',\n `输入摘要:\\n${JSON.stringify(processSummaries, null, 2)}`,\n ].join('\\n');\n}\n\nfunction parseLlmJsonOutput(output: string): JsonRecord | null {\n const start = output.indexOf('{');\n const end = output.lastIndexOf('}');\n const candidate = start >= 0 && end > start ? output.slice(start, end + 1) : output;\n\n try {\n const parsed = JSON.parse(candidate) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nasync function runOptionalLlmReview(\n processSummaries: ProcessSummaryForLlm[],\n options: {\n enableLlm: boolean;\n llmModel: string | undefined;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n outDir: string;\n },\n): Promise<ProcessQaLlmResult> {\n void processSummaries;\n void options.env;\n void options.fetchImpl;\n void options.outDir;\n\n if (!options.enableLlm) {\n return {\n enabled: false,\n reason: 'disabled',\n };\n }\n\n return {\n enabled: false,\n reason: 'moved_to_foundry_process_curation',\n };\n}\n\nfunction formatPercent(value: number | null): string {\n return value === null ? '' : `${(value * 100).toFixed(2)}%`;\n}\n\nfunction renderZhReview(options: {\n runId: string;\n logicVersion: string;\n baseRows: Array<[string, BaseInfoCheck]>;\n rows: ProcessQaRow[];\n totals: ProcessQaTotals;\n llmResult: ProcessQaLlmResult;\n evidenceStrong: string[];\n evidenceWeak: string[];\n}): string {\n const lines = [\n '# one_flow_rerun_qa_v2_1_zh\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n '\\n## 2.1 基础信息核查\\n',\n '|process file|源语言名称|功能单位|系统边界|时间|地理|技术|管理元数据|完整性得分(0-7)|\\n',\n '|---|---|---|---|---|---|---|---|---:|\\n',\n ];\n\n options.baseRows.forEach(([fileName, base]) => {\n lines.push(\n `|${fileName}|${base.source_name_ok ? '✅' : '❌'}|${base.functional_unit_ok ? '✅' : '❌'}|${base.system_boundary_ok ? '✅' : '❌'}|${base.time_ok ? '✅' : '❌'}|${base.geo_ok ? '✅' : '❌'}|${base.tech_ok ? '✅' : '❌'}|${base.admin_ok ? '✅' : '❌'}|${base.completeness_score}|\\n`,\n );\n });\n\n lines.push(\n '\\n## 物料平衡口径\\n- 物料平衡:仅核查 `原材料投入 = 产品+副产品+废物`\\n- 能量投入:单列记录,不计入平衡\\n',\n );\n lines.push(\n '\\n## 分过程结果\\n|process file|原材料投入|产品|副产品|废物|能量投入(不计平衡)|差值(输出-投入)|相对偏差|\\n|---|---:|---:|---:|---:|---:|---:|---:|\\n',\n );\n\n options.rows.forEach((row) => {\n lines.push(\n `|${row.process_file}|${row.raw_input.toPrecision(6)}|${row.product.toPrecision(6)}|${row.byproduct.toPrecision(6)}|${row.waste.toPrecision(6)}|${row.energy_excluded.toPrecision(6)}|${row.delta.toPrecision(6)}|${formatPercent(row.relative_deviation)}|\\n`,\n );\n });\n\n lines.push(\n `\\n## 汇总\\n- 原材料投入合计: **${options.totals.raw_input.toPrecision(6)}**\\n- 产品+副产品+废物合计: **${options.totals.product_plus_byproduct_plus_waste.toPrecision(6)}**\\n- 差值(输出-投入): **${options.totals.delta.toPrecision(6)}**\\n- 相对偏差: **${formatPercent(options.totals.relative_deviation)}**\\n- 能量投入(不计平衡)合计: **${options.totals.energy_excluded.toPrecision(6)}**\\n`,\n );\n lines.push('\\n## LLM 语义审核层(可选)\\n');\n\n if (options.llmResult.enabled && options.llmResult.ok) {\n const findings = Array.isArray(options.llmResult.result.findings)\n ? options.llmResult.result.findings\n : [];\n if (findings.length > 0) {\n lines.push('\\n|process file|severity|fixability|evidence|action|\\n|---|---|---|---|---|\\n');\n findings.slice(0, 50).forEach((finding) => {\n const evidenceValue = isRecord(finding) ? finding.evidence : '';\n const evidence =\n typeof evidenceValue === 'string'\n ? evidenceValue\n : JSON.stringify(evidenceValue ?? '', null, 0);\n const action = isRecord(finding) ? String(finding.action ?? finding.suggestion ?? '') : '';\n lines.push(\n `|${String(isRecord(finding) ? (finding.process_file ?? '') : '').replaceAll('|', '/')}|${String(isRecord(finding) ? (finding.severity ?? '') : '').replaceAll('|', '/')}|${String(isRecord(finding) ? (finding.fixability ?? 'review-needed') : 'review-needed').replaceAll('|', '/')}|${evidence.replaceAll('|', '/')}|${action.replaceAll('|', '/')}|\\n`,\n );\n });\n }\n } else {\n lines.push(`- 未启用或调用失败:\\`${options.llmResult.reason}\\`\\n`);\n }\n\n lines.push(\n `\\n## 证据充足的结论\\n${options.evidenceStrong.map((item) => `- ${item}`).join('\\n')}\\n`,\n );\n lines.push(\n `\\n## 证据不足的结论/限制\\n${options.evidenceWeak.map((item) => `- ${item}`).join('\\n')}\\n`,\n );\n\n return lines.join('');\n}\n\nfunction renderEnReview(options: {\n runId: string;\n logicVersion: string;\n baseRows: Array<[string, BaseInfoCheck]>;\n rows: ProcessQaRow[];\n totals: ProcessQaTotals;\n evidenceStrong: string[];\n evidenceWeak: string[];\n}): string {\n const lines = [\n '# one_flow_rerun_qa_v2_1_en\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n '\\n## 2.1 Basic info checks\\n',\n '|process file|source-language name|functional unit|system boundary|time|geo|tech|admin metadata|completeness(0-7)|\\n',\n '|---|---|---|---|---|---|---|---|---:|\\n',\n ];\n\n options.baseRows.forEach(([fileName, base]) => {\n lines.push(\n `|${fileName}|${base.source_name_ok ? '✅' : '❌'}|${base.functional_unit_ok ? '✅' : '❌'}|${base.system_boundary_ok ? '✅' : '❌'}|${base.time_ok ? '✅' : '❌'}|${base.geo_ok ? '✅' : '❌'}|${base.tech_ok ? '✅' : '❌'}|${base.admin_ok ? '✅' : '❌'}|${base.completeness_score}|\\n`,\n );\n });\n\n lines.push(\n '\\n## Material balance scope\\n- Check only `raw material input = product + by-product + waste`\\n- Energy inputs are listed but excluded from balance\\n',\n );\n lines.push(\n '\\n## Per-process results\\n|process file|raw material in|product|by-product|waste|energy in (excluded)|delta(out-in)|relative deviation|\\n|---|---:|---:|---:|---:|---:|---:|---:|\\n',\n );\n\n options.rows.forEach((row) => {\n lines.push(\n `|${row.process_file}|${row.raw_input.toPrecision(6)}|${row.product.toPrecision(6)}|${row.byproduct.toPrecision(6)}|${row.waste.toPrecision(6)}|${row.energy_excluded.toPrecision(6)}|${row.delta.toPrecision(6)}|${formatPercent(row.relative_deviation)}|\\n`,\n );\n });\n\n lines.push(\n `\\n## Summary\\n- Raw material input total: **${options.totals.raw_input.toPrecision(6)}**\\n- Product+by-product+waste total: **${options.totals.product_plus_byproduct_plus_waste.toPrecision(6)}**\\n- Delta (out-in): **${options.totals.delta.toPrecision(6)}**\\n- Relative deviation: **${formatPercent(options.totals.relative_deviation)}**\\n- Energy input total (excluded from balance): **${options.totals.energy_excluded.toPrecision(6)}**\\n`,\n );\n lines.push(\n `\\n## Evidence-sufficient conclusions\\n${options.evidenceStrong.map((item) => `- ${item}`).join('\\n')}\\n`,\n );\n lines.push(\n `\\n## Evidence-insufficient conclusions / limitations\\n${options.evidenceWeak.map((item) => `- ${item}`).join('\\n')}\\n`,\n );\n\n return lines.join('');\n}\n\nfunction renderTiming(options: {\n runId: string;\n startTs: string | undefined;\n endTs: string | undefined;\n processCount: number;\n}): string {\n const lines = ['# one_flow_rerun_timing\\n', `- run_id: \\`${options.runId}\\`\\n`];\n\n if (options.startTs && options.endTs) {\n const start = new Date(options.startTs);\n const end = new Date(options.endTs);\n if (Number.isNaN(start.getTime()) || Number.isNaN(end.getTime())) {\n throw new CliError('Expected --start-ts and --end-ts to be valid ISO timestamps.', {\n code: 'PROCESS_QA_INVALID_TIMESTAMP',\n exitCode: 2,\n });\n }\n lines.push(`- start: \\`${options.startTs}\\`\\n`);\n lines.push(`- end: \\`${options.endTs}\\`\\n`);\n lines.push(\n `- total elapsed: **${((end.getTime() - start.getTime()) / 60_000).toFixed(2)} min**\\n`,\n );\n }\n\n lines.push(`- process files reviewed: \\`${options.processCount}\\`\\n`);\n lines.push(\n '- major time consumers: references retrieval, flow matching/search, flow metadata lookups.\\n',\n );\n return lines.join('');\n}\n\nfunction renderUnitIssues(runId: string, unitIssues: UnitIssue[]): string {\n const lines = [\n '# flow_unit_issue_log\\n',\n `- run_id: \\`${runId}\\`\\n`,\n '\\n|flow UUID|current unit|suggested unit|basis|confidence|\\n|---|---|---|---|---|\\n',\n ];\n\n if (unitIssues.length === 0) {\n lines.push('|无|无|无|未发现基于直接证据的单位矛盾|—|\\n');\n return lines.join('');\n }\n\n const seen = new Set<string>();\n unitIssues.forEach((issue) => {\n const key = JSON.stringify(issue);\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n lines.push(\n `|${issue.flow_uuid}|${issue.current_unit}|${issue.suggested_unit}|${issue.basis}|${issue.confidence}|\\n`,\n );\n });\n\n return lines.join('');\n}\n\nexport async function runProcessQa(options: RunProcessQaOptions): Promise<ProcessQaReport> {\n const outDir = path.resolve(\n requiredNonEmpty(options.outDir, '--out-dir', 'PROCESS_QA_OUT_DIR_REQUIRED'),\n );\n const resolvedInput = resolveReviewInput({\n rowsFile: options.rowsFile,\n runRoot: options.runRoot,\n runId: options.runId,\n outDir,\n });\n const runId = requiredNonEmpty(resolvedInput.runId, '--run-id', 'PROCESS_QA_RUN_ID_REQUIRED');\n const logicVersion = options.logicVersion?.trim() || 'v2.1';\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const env = options.env ?? process.env;\n const llmMaxProcesses =\n typeof options.llmMaxProcesses === 'number' &&\n Number.isInteger(options.llmMaxProcesses) &&\n options.llmMaxProcesses > 0\n ? options.llmMaxProcesses\n : 8;\n const processFiles = readProcessFiles(resolvedInput.effectiveProcessesDir);\n const baseRows: Array<[string, BaseInfoCheck]> = [];\n const rows: ProcessQaRow[] = [];\n const unitIssues: UnitIssue[] = [];\n const ruleFindings: ProcessQaFinding[] = [];\n const processSummariesForLlm: ProcessSummaryForLlm[] = [];\n\n let totalRaw = 0;\n let totalProduct = 0;\n let totalByproduct = 0;\n let totalWaste = 0;\n let totalEnergy = 0;\n\n processFiles.forEach((filePath) => {\n const processPayload = unwrapProcessPayload(readJsonInput(filePath), filePath);\n const exchangesValue = deepGet(processPayload, ['processDataSet', 'exchanges', 'exchange']);\n const exchanges = Array.isArray(exchangesValue)\n ? exchangesValue.filter(isRecord)\n : isRecord(exchangesValue)\n ? [exchangesValue]\n : [];\n const referenceFlowId =\n String(\n deepGet(processPayload, [\n 'processDataSet',\n 'processInformation',\n 'quantitativeReference',\n 'referenceToReferenceFlow',\n ]) ?? '',\n ).trim() || null;\n const base = baseInfoCheck(processPayload);\n const fileName = path.basename(filePath);\n baseRows.push([fileName, base]);\n ruleFindings.push(...reviewFindingsForBase(fileName, base));\n\n let rawInput = 0;\n let product = 0;\n let byproduct = 0;\n let waste = 0;\n let energyExcluded = 0;\n\n exchanges.forEach((exchange) => {\n const classified = classifyExchange(exchange, referenceFlowId);\n if (!hasNumericAmount(exchange)) {\n ruleFindings.push(\n createProcessQaFinding({\n processFile: fileName,\n severity: 'warning',\n code: 'process_missing_exchange_amount',\n message:\n 'Process exchange is missing both numeric meanAmount and resultingAmount and should be curated by Foundry.',\n evidence: {\n exchange_internal_id: String(exchange['@dataSetInternalID'] ?? ''),\n direction: String(exchange.exchangeDirection ?? ''),\n },\n }),\n );\n }\n const amount = toNumber(exchange.meanAmount ?? exchange.resultingAmount);\n if (classified.classification === 'raw_material_input') {\n rawInput += amount;\n } else if (classified.classification === 'product_output') {\n product += amount;\n } else if (classified.classification === 'byproduct_output') {\n byproduct += amount;\n } else if (classified.classification === 'waste_output') {\n waste += amount;\n } else if (classified.classification === 'energy_input') {\n energyExcluded += amount;\n }\n const currentUnitIssues = unitIssueCheck(exchange, classified.uoms, classified.blob);\n unitIssues.push(...currentUnitIssues);\n currentUnitIssues.forEach((issue) => {\n ruleFindings.push(\n createProcessQaFinding({\n processFile: fileName,\n severity: 'warning',\n code: 'process_exchange_unit_semantic_mismatch',\n message: 'Exchange unit tag conflicts with flow description semantics.',\n evidence: { ...issue },\n }),\n );\n });\n });\n\n const balanceOut = product + byproduct + waste;\n const delta = balanceOut - rawInput;\n const relativeDeviation = rawInput > 0 ? Math.abs(delta) / rawInput : null;\n\n rows.push({\n process_file: fileName,\n raw_input: rawInput,\n product,\n byproduct,\n waste,\n energy_excluded: energyExcluded,\n delta,\n relative_deviation: relativeDeviation,\n });\n\n if (relativeDeviation !== null && relativeDeviation > 0.05) {\n ruleFindings.push(\n createProcessQaFinding({\n processFile: fileName,\n severity: 'warning',\n code: 'process_material_balance_deviation',\n message:\n 'Material balance deviation exceeds the QA threshold for raw inputs versus product/by-product/waste outputs.',\n evidence: {\n raw_input: rawInput,\n product,\n byproduct,\n waste,\n relative_deviation: relativeDeviation,\n policy_decision_owner: 'foundry',\n },\n }),\n );\n }\n\n totalRaw += rawInput;\n totalProduct += product;\n totalByproduct += byproduct;\n totalWaste += waste;\n totalEnergy += energyExcluded;\n\n if (processSummariesForLlm.length < Math.max(1, llmMaxProcesses)) {\n processSummariesForLlm.push({\n process_file: fileName,\n base_names: base.base_names.slice(0, 4),\n base_checks: {\n source_name_ok: base.source_name_ok,\n functional_unit_ok: base.functional_unit_ok,\n system_boundary_ok: base.system_boundary_ok,\n time_ok: base.time_ok,\n geo_ok: base.geo_ok,\n tech_ok: base.tech_ok,\n admin_ok: base.admin_ok,\n },\n balance: {\n raw_in: rawInput,\n product,\n byproduct,\n waste,\n energy_excluded: energyExcluded,\n relative_deviation: relativeDeviation,\n },\n });\n }\n });\n\n const totals: ProcessQaTotals = {\n raw_input: totalRaw,\n product_plus_byproduct_plus_waste: totalProduct + totalByproduct + totalWaste,\n delta: totalProduct + totalByproduct + totalWaste - totalRaw,\n relative_deviation:\n totalRaw > 0\n ? Math.abs(totalProduct + totalByproduct + totalWaste - totalRaw) / totalRaw\n : null,\n energy_excluded: totalEnergy,\n };\n\n const evidenceStrong = [\n '已优先使用 quantitativeReference.referenceToReferenceFlow、EcoSpold inputGroup/outputGroup 和 exchange 标签/描述做口径过滤,仅核算 原材料投入 vs 产品+副产品+废物,能量单列不计入平衡。',\n ...(unitIssues.length > 0\n ? ['发现单位疑似错误时均附带 flow 描述与单位标签的直接矛盾证据。']\n : []),\n ];\n\n const evidenceWeak = [\n '部分 exchange 缺少结构化 type 标签,仅能依赖文本关键词分类,存在误判风险。',\n '未逐条拉取 flow 数据集参考单位做机器核对,单位结论以评论标签与流名称语义一致性为主。',\n ];\n\n const llmResult = await runOptionalLlmReview(processSummariesForLlm, {\n enableLlm: Boolean(options.enableLlm),\n llmModel: options.llmModel,\n env,\n fetchImpl,\n outDir,\n });\n const rulesetGate = processRulesetGate(ruleFindings);\n\n const summary: ProcessQaSummary = {\n run_id: runId,\n logic_version: logicVersion,\n process_count: processFiles.length,\n totals,\n ruleset_gate: rulesetGate,\n llm: llmResult,\n policy_decision_owner: 'foundry',\n qa_mode: 'deterministic_qa_report',\n };\n const reviewInputSummaryPath = writeJsonArtifact(\n path.join(outDir, 'qa-input-summary.json'),\n resolvedInput.reviewInputSummary,\n );\n const ruleFindingsPath = writeJsonLinesArtifact(\n path.join(outDir, 'process-qa-rule-findings.jsonl'),\n ruleFindings,\n );\n const rulesetGatePath = writeJsonArtifact(\n path.join(outDir, 'process-qa-ruleset-gate.json'),\n rulesetGate,\n );\n\n const reviewZhPath = writeTextArtifact(\n path.join(outDir, 'one_flow_rerun_qa_v2_1_zh.md'),\n renderZhReview({\n runId,\n logicVersion,\n baseRows,\n rows,\n totals,\n llmResult,\n evidenceStrong,\n evidenceWeak,\n }),\n );\n const reviewEnPath = writeTextArtifact(\n path.join(outDir, 'one_flow_rerun_qa_v2_1_en.md'),\n renderEnReview({\n runId,\n logicVersion,\n baseRows,\n rows,\n totals,\n evidenceStrong,\n evidenceWeak,\n }),\n );\n const timingPath = writeTextArtifact(\n path.join(outDir, 'one_flow_rerun_timing.md'),\n renderTiming({\n runId,\n startTs: options.startTs,\n endTs: options.endTs,\n processCount: processFiles.length,\n }),\n );\n const unitIssuePath = writeTextArtifact(\n path.join(outDir, 'flow_unit_issue_log.md'),\n renderUnitIssues(runId, unitIssues),\n );\n const summaryPath = writeJsonArtifact(path.join(outDir, 'qa_summary_v2_1.json'), summary);\n\n const report: ProcessQaReport = {\n schema_version: 1,\n generated_at_utc: (options.now ?? (() => new Date()))().toISOString(),\n status: 'completed_local_process_qa',\n run_id: runId,\n run_root: resolvedInput.runRoot,\n rows_file: resolvedInput.rowsFile,\n out_dir: outDir,\n input_mode: resolvedInput.inputMode,\n effective_processes_dir: resolvedInput.effectiveProcessesDir,\n logic_version: logicVersion,\n ruleset_id: rulesetGate.ruleset_id,\n ruleset_version: rulesetGate.ruleset_version,\n ruleset_source_version: rulesetGate.ruleset_source_version,\n ruleset_rule_ids: rulesetGate.ruleset_rule_ids,\n process_count: processFiles.length,\n totals,\n rule_finding_count: ruleFindings.length,\n blocker_count: rulesetGate.counts.blockers,\n ruleset_gate: rulesetGate,\n policy_decision_owner: 'foundry',\n qa_mode: 'deterministic_qa_report',\n files: {\n qa_input_summary: reviewInputSummaryPath,\n materialization_summary: resolvedInput.materializationSummaryPath,\n rule_findings: ruleFindingsPath,\n ruleset_gate: rulesetGatePath,\n qa_zh: reviewZhPath,\n qa_en: reviewEnPath,\n timing: timingPath,\n unit_issue_log: unitIssuePath,\n summary: summaryPath,\n report: '',\n },\n llm: llmResult,\n };\n\n const reportPath = writeJsonArtifact(path.join(outDir, 'process-qa-report.json'), report);\n report.files.report = reportPath;\n writeJsonArtifact(reportPath, report);\n return report;\n}\n\nexport const __testInternals = {\n requiredNonEmpty,\n textFromValue,\n toNumber,\n deepGet,\n hasNonEmpty,\n extractBaseNames,\n classifyExchange,\n unitIssueCheck,\n hasNumericAmount,\n createProcessQaFinding,\n reviewFindingsForBase,\n processRulesetGate,\n baseInfoCheck,\n unwrapProcessPayload,\n buildPrompt,\n parseLlmJsonOutput,\n runOptionalLlmReview,\n renderZhReview,\n renderEnReview,\n renderTiming,\n renderUnitIssues,\n};\n"]}
|
|
@@ -23,6 +23,12 @@ const TABLE_BY_TYPE = new Map([
|
|
|
23
23
|
['lifeCycleModel data set', 'lifecyclemodels'],
|
|
24
24
|
['LCIA method data set', 'lciamethods'],
|
|
25
25
|
]);
|
|
26
|
+
function normalizeReferenceType(type) {
|
|
27
|
+
return type.trim().toLowerCase();
|
|
28
|
+
}
|
|
29
|
+
function tableForReferenceType(type) {
|
|
30
|
+
return TABLE_BY_TYPE.get(type) ?? TABLE_BY_TYPE.get(normalizeReferenceType(type)) ?? null;
|
|
31
|
+
}
|
|
26
32
|
function isRecord(value) {
|
|
27
33
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
28
34
|
}
|
|
@@ -227,14 +233,15 @@ function normalizeDatasetPayload(payload, label) {
|
|
|
227
233
|
return payload;
|
|
228
234
|
}
|
|
229
235
|
function getShortDescription(payload, type) {
|
|
230
|
-
|
|
236
|
+
const normalizedType = normalizeReferenceType(type);
|
|
237
|
+
if (normalizedType === 'flow data set') {
|
|
231
238
|
const flowDataSet = isRecord(payload.flowDataSet) ? payload.flowDataSet : {};
|
|
232
239
|
const info = isRecord(flowDataSet.flowInformation) ? flowDataSet.flowInformation : {};
|
|
233
240
|
const dataSetInformation = isRecord(info.dataSetInformation) ? info.dataSetInformation : {};
|
|
234
241
|
const name = isRecord(dataSetInformation.name) ? dataSetInformation.name : null;
|
|
235
242
|
return genFlowNameJson(name);
|
|
236
243
|
}
|
|
237
|
-
if (
|
|
244
|
+
if (normalizedType === 'process data set') {
|
|
238
245
|
const processDataSet = isRecord(payload.processDataSet) ? payload.processDataSet : {};
|
|
239
246
|
const info = isRecord(processDataSet.processInformation)
|
|
240
247
|
? processDataSet.processInformation
|
|
@@ -243,7 +250,7 @@ function getShortDescription(payload, type) {
|
|
|
243
250
|
const name = isRecord(dataSetInformation.name) ? dataSetInformation.name : null;
|
|
244
251
|
return genProcessNameJson(name);
|
|
245
252
|
}
|
|
246
|
-
if (
|
|
253
|
+
if (normalizedType === 'contact data set') {
|
|
247
254
|
const contactDataSet = isRecord(payload.contactDataSet) ? payload.contactDataSet : {};
|
|
248
255
|
const info = isRecord(contactDataSet.contactInformation)
|
|
249
256
|
? contactDataSet.contactInformation
|
|
@@ -251,13 +258,13 @@ function getShortDescription(payload, type) {
|
|
|
251
258
|
const dataSetInformation = isRecord(info.dataSetInformation) ? info.dataSetInformation : {};
|
|
252
259
|
return getLangList(dataSetInformation['common:shortName']);
|
|
253
260
|
}
|
|
254
|
-
if (
|
|
261
|
+
if (normalizedType === 'source data set') {
|
|
255
262
|
const sourceDataSet = isRecord(payload.sourceDataSet) ? payload.sourceDataSet : {};
|
|
256
263
|
const info = isRecord(sourceDataSet.sourceInformation) ? sourceDataSet.sourceInformation : {};
|
|
257
264
|
const dataSetInformation = isRecord(info.dataSetInformation) ? info.dataSetInformation : {};
|
|
258
265
|
return getLangList(dataSetInformation['common:shortName']);
|
|
259
266
|
}
|
|
260
|
-
if (
|
|
267
|
+
if (normalizedType === 'flow property data set') {
|
|
261
268
|
const flowPropertyDataSet = isRecord(payload.flowPropertyDataSet)
|
|
262
269
|
? payload.flowPropertyDataSet
|
|
263
270
|
: {};
|
|
@@ -267,7 +274,7 @@ function getShortDescription(payload, type) {
|
|
|
267
274
|
const dataSetInformation = isRecord(info.dataSetInformation) ? info.dataSetInformation : {};
|
|
268
275
|
return getLangList(dataSetInformation['common:shortName']);
|
|
269
276
|
}
|
|
270
|
-
if (
|
|
277
|
+
if (normalizedType === 'unit group data set') {
|
|
271
278
|
const unitGroupDataSet = isRecord(payload.unitGroupDataSet) ? payload.unitGroupDataSet : {};
|
|
272
279
|
const info = isRecord(unitGroupDataSet.unitGroupInformation)
|
|
273
280
|
? unitGroupDataSet.unitGroupInformation
|
|
@@ -275,7 +282,7 @@ function getShortDescription(payload, type) {
|
|
|
275
282
|
const dataSetInformation = isRecord(info.dataSetInformation) ? info.dataSetInformation : {};
|
|
276
283
|
return getLangList(dataSetInformation['common:shortName']);
|
|
277
284
|
}
|
|
278
|
-
if (
|
|
285
|
+
if (normalizedType === 'lcia method data set') {
|
|
279
286
|
const lciaMethodDataSet = isRecord(payload.lciaMethodDataSet) ? payload.lciaMethodDataSet : {};
|
|
280
287
|
const info = isRecord(lciaMethodDataSet.LCIAMethodInformation)
|
|
281
288
|
? lciaMethodDataSet.LCIAMethodInformation
|
|
@@ -576,7 +583,7 @@ function collectRefs(root) {
|
|
|
576
583
|
typeof current['@refObjectId'] === 'string' &&
|
|
577
584
|
typeof current['@version'] === 'string' &&
|
|
578
585
|
typeof current['@type'] === 'string' &&
|
|
579
|
-
|
|
586
|
+
tableForReferenceType(current['@type'])) {
|
|
580
587
|
refs.push({
|
|
581
588
|
node: current,
|
|
582
589
|
path: pathParts.join('.'),
|
|
@@ -594,7 +601,7 @@ function collectRefs(root) {
|
|
|
594
601
|
async function fetchLatestRefs(options) {
|
|
595
602
|
const missingByTable = new Map();
|
|
596
603
|
for (const ref of options.refs) {
|
|
597
|
-
const table =
|
|
604
|
+
const table = tableForReferenceType(ref.node['@type']);
|
|
598
605
|
const id = ref.node['@refObjectId'];
|
|
599
606
|
const cacheKey = table ? `${table}:${id}` : '';
|
|
600
607
|
if (!table || options.cache.has(cacheKey)) {
|
|
@@ -681,7 +688,7 @@ function updateProcessJson(payload, refs, cache) {
|
|
|
681
688
|
const touchedRefs = [];
|
|
682
689
|
const unresolvedRefs = [];
|
|
683
690
|
for (const ref of refs) {
|
|
684
|
-
const table =
|
|
691
|
+
const table = tableForReferenceType(ref.node['@type']);
|
|
685
692
|
const cacheKey = table ? `${table}:${ref.node['@refObjectId']}` : '';
|
|
686
693
|
const latest = cacheKey ? cache.get(cacheKey) : null;
|
|
687
694
|
if (!latest?.row) {
|
|
@@ -1016,6 +1023,7 @@ export const __testInternals = {
|
|
|
1016
1023
|
getLangList,
|
|
1017
1024
|
getLangText,
|
|
1018
1025
|
getShortDescription,
|
|
1026
|
+
normalizeReferenceType,
|
|
1019
1027
|
normalizeDatasetPayload,
|
|
1020
1028
|
normalizeManifestRow,
|
|
1021
1029
|
parseJsonResponse,
|
|
@@ -1023,6 +1031,7 @@ export const __testInternals = {
|
|
|
1023
1031
|
readCompleted,
|
|
1024
1032
|
readManifest,
|
|
1025
1033
|
recordKey,
|
|
1034
|
+
tableForReferenceType,
|
|
1026
1035
|
updateProcessJson,
|
|
1027
1036
|
};
|
|
1028
1037
|
//# sourceMappingURL=process-refresh-references.js.map
|