@tiangong-lca/cli 0.0.8 → 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.
@@ -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"]}
@@ -209,7 +209,7 @@ const RULESETS_BY_ID = Object.fromEntries(RULESETS.map((item) => [item.id, item]
209
209
  const RULES_BY_ID = Object.fromEntries(RUNTIME_RULES.map((item) => [item.id, item]));
210
210
  const LOCAL_RULE_ID_MAP = {
211
211
  'process-authoring/strict': {
212
- process_missing_bilingual_base_name: 'tidas.process.name.base-name.align-reference-flow',
212
+ process_missing_source_base_name: 'tidas.process.name.base-name.align-reference-flow',
213
213
  process_missing_functional_unit: 'tidas.process.quantitative-reference.required',
214
214
  process_missing_quantitative_reference: 'tidas.process.quantitative-reference.required',
215
215
  process_missing_exchange_amount: 'tidas.process.exchange.amount.required',
@@ -229,7 +229,7 @@ const LOCAL_RULE_ID_MAP = {
229
229
  },
230
230
  'flow-authoring/strict': {
231
231
  missing_type_of_dataset: 'tidas.flow.type.required',
232
- elementary_flow_in_flow_review: 'tidas.flow.type.required',
232
+ elementary_flow_in_flow_qa: 'tidas.flow.type.required',
233
233
  methodology_invalid_type_of_dataset: 'tidas.flow.type.required',
234
234
  missing_name_text: 'tidas.flow.name.base-name.technical',
235
235
  name_contains_emergy: 'tidas.flow.name.base-name.technical',
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-rulesets.js","sourceRoot":"","sources":["../../../src/lib/runtime-rulesets.ts"],"names":[],"mappings":"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","sourcesContent":["export type RuntimeDatasetType = 'process' | 'flow' | 'publish';\nexport type RuntimeRuleSeverity = 'info' | 'warning' | 'blocker';\nexport type RuntimeRulesetPhase = 'authoring' | 'repair' | 'publish' | 'identity' | 'verification';\n\nexport type RuntimeRulesetId =\n | 'process-authoring/strict'\n | 'process-authoring/repair'\n | 'process-publish/default'\n | 'process-dedup/default'\n | 'flow-authoring/strict'\n | 'flow-publish/default'\n | 'flow-dedup/default'\n | 'publish-run/default';\n\nexport type RuntimeRule = {\n id: string;\n dataset_type: RuntimeDatasetType;\n severity: RuntimeRuleSeverity;\n default_blocker: boolean;\n phases: string[];\n};\n\nexport type RuntimeRuleset = {\n id: RuntimeRulesetId;\n version: '1';\n source_version: typeof RUNTIME_RULESET_SOURCE_VERSION;\n dataset_type: RuntimeDatasetType;\n phase: RuntimeRulesetPhase;\n rule_ids: string[];\n};\n\nexport const RUNTIME_RULESET_SOURCE_VERSION = '2026.05.23';\nexport const RUNTIME_RULESET_VERSION = '1';\n\nconst RUNTIME_RULES = [\n {\n id: 'tidas.process.name.base-name.align-reference-flow',\n dataset_type: 'process',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.process.name.qualifiers.structured',\n dataset_type: 'process',\n severity: 'warning',\n default_blocker: false,\n phases: ['build-plan', 'materialize', 'publish-build'],\n },\n {\n id: 'tidas.process.quantitative-reference.required',\n dataset_type: 'process',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.process.exchange.amount.required',\n dataset_type: 'process',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.process.evidence.field-bindings.required',\n dataset_type: 'process',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'publish-run'],\n },\n {\n id: 'tidas.process.version.format',\n dataset_type: 'process',\n severity: 'blocker',\n default_blocker: true,\n phases: ['save-draft', 'publish-build', 'publish-run'],\n },\n {\n id: 'tidas.process.identity.duplicate-fingerprint.block',\n dataset_type: 'process',\n severity: 'blocker',\n default_blocker: true,\n phases: ['identity-preflight', 'dedup-review'],\n },\n {\n id: 'tidas.flow.name.base-name.technical',\n dataset_type: 'flow',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.flow.type.required',\n dataset_type: 'flow',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.flow.reference-property-unit.required',\n dataset_type: 'flow',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.flow.flow-property.mean-value.positive',\n dataset_type: 'flow',\n severity: 'blocker',\n default_blocker: true,\n phases: ['materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.flow.classification.elementary.valid',\n dataset_type: 'flow',\n severity: 'blocker',\n default_blocker: true,\n phases: ['materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.flow.evidence.field-bindings.required',\n dataset_type: 'flow',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'publish-run'],\n },\n {\n id: 'tidas.flow.identity.alias-equivalence.review',\n dataset_type: 'flow',\n severity: 'warning',\n default_blocker: false,\n phases: ['identity-preflight', 'dedup-review'],\n },\n {\n id: 'tidas.publish.verification.required',\n dataset_type: 'publish',\n severity: 'blocker',\n default_blocker: true,\n phases: ['publish-run'],\n },\n] as const satisfies RuntimeRule[];\n\nconst RULESETS = [\n {\n id: 'process-authoring/strict',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'process',\n phase: 'authoring',\n rule_ids: [\n 'tidas.process.name.base-name.align-reference-flow',\n 'tidas.process.name.qualifiers.structured',\n 'tidas.process.quantitative-reference.required',\n 'tidas.process.exchange.amount.required',\n 'tidas.process.evidence.field-bindings.required',\n ],\n },\n {\n id: 'process-authoring/repair',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'process',\n phase: 'repair',\n rule_ids: [\n 'tidas.process.quantitative-reference.required',\n 'tidas.process.exchange.amount.required',\n 'tidas.process.evidence.field-bindings.required',\n 'tidas.process.version.format',\n ],\n },\n {\n id: 'process-publish/default',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'process',\n phase: 'publish',\n rule_ids: [\n 'tidas.process.name.base-name.align-reference-flow',\n 'tidas.process.quantitative-reference.required',\n 'tidas.process.exchange.amount.required',\n 'tidas.process.evidence.field-bindings.required',\n 'tidas.process.version.format',\n ],\n },\n {\n id: 'process-dedup/default',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'process',\n phase: 'identity',\n rule_ids: ['tidas.process.identity.duplicate-fingerprint.block'],\n },\n {\n id: 'flow-authoring/strict',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'flow',\n phase: 'authoring',\n rule_ids: [\n 'tidas.flow.name.base-name.technical',\n 'tidas.flow.type.required',\n 'tidas.flow.reference-property-unit.required',\n 'tidas.flow.flow-property.mean-value.positive',\n 'tidas.flow.classification.elementary.valid',\n 'tidas.flow.evidence.field-bindings.required',\n 'tidas.flow.identity.alias-equivalence.review',\n ],\n },\n {\n id: 'flow-publish/default',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'flow',\n phase: 'publish',\n rule_ids: [\n 'tidas.flow.name.base-name.technical',\n 'tidas.flow.type.required',\n 'tidas.flow.reference-property-unit.required',\n 'tidas.flow.classification.elementary.valid',\n 'tidas.flow.flow-property.mean-value.positive',\n 'tidas.flow.evidence.field-bindings.required',\n ],\n },\n {\n id: 'flow-dedup/default',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'flow',\n phase: 'identity',\n rule_ids: ['tidas.flow.identity.alias-equivalence.review'],\n },\n {\n id: 'publish-run/default',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'publish',\n phase: 'verification',\n rule_ids: ['tidas.publish.verification.required'],\n },\n] as const satisfies RuntimeRuleset[];\n\nconst RULESETS_BY_ID = Object.fromEntries(RULESETS.map((item) => [item.id, item]));\nconst RULES_BY_ID = Object.fromEntries(RUNTIME_RULES.map((item) => [item.id, item]));\n\nconst LOCAL_RULE_ID_MAP: Partial<Record<RuntimeRulesetId, Record<string, string>>> = {\n 'process-authoring/strict': {\n process_missing_bilingual_base_name: 'tidas.process.name.base-name.align-reference-flow',\n process_missing_functional_unit: 'tidas.process.quantitative-reference.required',\n process_missing_quantitative_reference: 'tidas.process.quantitative-reference.required',\n process_missing_exchange_amount: 'tidas.process.exchange.amount.required',\n process_material_balance_deviation: 'tidas.process.exchange.amount.required',\n process_missing_system_boundary: 'tidas.process.evidence.field-bindings.required',\n process_missing_time: 'tidas.process.evidence.field-bindings.required',\n process_missing_geography: 'tidas.process.evidence.field-bindings.required',\n process_missing_technology: 'tidas.process.evidence.field-bindings.required',\n process_missing_admin_metadata: 'tidas.process.evidence.field-bindings.required',\n process_exchange_unit_semantic_mismatch: 'tidas.process.exchange.amount.required',\n },\n 'process-dedup/default': {\n process_exact_duplicate_fingerprint: 'tidas.process.identity.duplicate-fingerprint.block',\n },\n 'process-publish/default': {\n process_schema_failed: 'tidas.process.evidence.field-bindings.required',\n },\n 'flow-authoring/strict': {\n missing_type_of_dataset: 'tidas.flow.type.required',\n elementary_flow_in_flow_review: 'tidas.flow.type.required',\n methodology_invalid_type_of_dataset: 'tidas.flow.type.required',\n missing_name_text: 'tidas.flow.name.base-name.technical',\n name_contains_emergy: 'tidas.flow.name.base-name.technical',\n methodology_missing_base_name_en: 'tidas.flow.name.base-name.technical',\n methodology_basename_semicolon: 'tidas.flow.name.base-name.technical',\n missing_classification_leaf: 'tidas.flow.classification.elementary.valid',\n methodology_missing_class_id: 'tidas.flow.classification.elementary.valid',\n methodology_missing_cat_id: 'tidas.flow.classification.elementary.valid',\n methodology_product_classification_level_gap: 'tidas.flow.classification.elementary.valid',\n methodology_elementary_classification_level_gap: 'tidas.flow.classification.elementary.valid',\n missing_flow_property: 'tidas.flow.reference-property-unit.required',\n invalid_flow_property_reference: 'tidas.flow.reference-property-unit.required',\n missing_quantitative_reference: 'tidas.flow.reference-property-unit.required',\n quantitative_reference_mismatch: 'tidas.flow.reference-property-unit.required',\n methodology_quant_ref_missing_target: 'tidas.flow.reference-property-unit.required',\n same_category_high_similarity: 'tidas.flow.identity.alias-equivalence.review',\n },\n 'flow-publish/default': {\n flow_schema_failed: 'tidas.flow.evidence.field-bindings.required',\n },\n 'flow-dedup/default': {\n same_property_semantic_review: 'tidas.flow.identity.alias-equivalence.review',\n },\n};\n\nexport function listRuntimeRulesets(): RuntimeRuleset[] {\n return RULESETS.map((ruleset) => ({ ...ruleset, rule_ids: [...ruleset.rule_ids] }));\n}\n\nexport function getRuntimeRuleset<T extends RuntimeRulesetId>(id: T): RuntimeRuleset & { id: T } {\n const ruleset = RULESETS_BY_ID[id];\n return { ...ruleset, rule_ids: [...ruleset.rule_ids] } as RuntimeRuleset & { id: T };\n}\n\nexport function getRuntimeRule(id: string): RuntimeRule | null {\n const rule = RULES_BY_ID[id];\n return rule ? { ...rule, phases: [...rule.phases] } : null;\n}\n\nexport function runtimeRuleIds(id: RuntimeRulesetId): string[] {\n return getRuntimeRuleset(id).rule_ids;\n}\n\nexport function resolveRuntimeRuleId(\n rulesetId: RuntimeRulesetId,\n localRuleId: string | null | undefined,\n): string | null {\n if (!localRuleId) {\n return null;\n }\n return LOCAL_RULE_ID_MAP[rulesetId]?.[localRuleId] ?? null;\n}\n\nexport function isRuntimeRuleBlocker(ruleId: string | null | undefined): boolean {\n if (!ruleId) {\n return false;\n }\n return RULES_BY_ID[ruleId]?.default_blocker ?? false;\n}\n"]}
1
+ {"version":3,"file":"runtime-rulesets.js","sourceRoot":"","sources":["../../../src/lib/runtime-rulesets.ts"],"names":[],"mappings":"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","sourcesContent":["export type RuntimeDatasetType = 'process' | 'flow' | 'publish';\nexport type RuntimeRuleSeverity = 'info' | 'warning' | 'blocker';\nexport type RuntimeRulesetPhase = 'authoring' | 'repair' | 'publish' | 'identity' | 'verification';\n\nexport type RuntimeRulesetId =\n | 'process-authoring/strict'\n | 'process-authoring/repair'\n | 'process-publish/default'\n | 'process-dedup/default'\n | 'flow-authoring/strict'\n | 'flow-publish/default'\n | 'flow-dedup/default'\n | 'publish-run/default';\n\nexport type RuntimeRule = {\n id: string;\n dataset_type: RuntimeDatasetType;\n severity: RuntimeRuleSeverity;\n default_blocker: boolean;\n phases: string[];\n};\n\nexport type RuntimeRuleset = {\n id: RuntimeRulesetId;\n version: '1';\n source_version: typeof RUNTIME_RULESET_SOURCE_VERSION;\n dataset_type: RuntimeDatasetType;\n phase: RuntimeRulesetPhase;\n rule_ids: string[];\n};\n\nexport const RUNTIME_RULESET_SOURCE_VERSION = '2026.05.23';\nexport const RUNTIME_RULESET_VERSION = '1';\n\nconst RUNTIME_RULES = [\n {\n id: 'tidas.process.name.base-name.align-reference-flow',\n dataset_type: 'process',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.process.name.qualifiers.structured',\n dataset_type: 'process',\n severity: 'warning',\n default_blocker: false,\n phases: ['build-plan', 'materialize', 'publish-build'],\n },\n {\n id: 'tidas.process.quantitative-reference.required',\n dataset_type: 'process',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.process.exchange.amount.required',\n dataset_type: 'process',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.process.evidence.field-bindings.required',\n dataset_type: 'process',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'publish-run'],\n },\n {\n id: 'tidas.process.version.format',\n dataset_type: 'process',\n severity: 'blocker',\n default_blocker: true,\n phases: ['save-draft', 'publish-build', 'publish-run'],\n },\n {\n id: 'tidas.process.identity.duplicate-fingerprint.block',\n dataset_type: 'process',\n severity: 'blocker',\n default_blocker: true,\n phases: ['identity-preflight', 'dedup-review'],\n },\n {\n id: 'tidas.flow.name.base-name.technical',\n dataset_type: 'flow',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.flow.type.required',\n dataset_type: 'flow',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.flow.reference-property-unit.required',\n dataset_type: 'flow',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.flow.flow-property.mean-value.positive',\n dataset_type: 'flow',\n severity: 'blocker',\n default_blocker: true,\n phases: ['materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.flow.classification.elementary.valid',\n dataset_type: 'flow',\n severity: 'blocker',\n default_blocker: true,\n phases: ['materialize', 'publish-build', 'save-draft', 'publish-run'],\n },\n {\n id: 'tidas.flow.evidence.field-bindings.required',\n dataset_type: 'flow',\n severity: 'blocker',\n default_blocker: true,\n phases: ['build-plan', 'materialize', 'publish-build', 'publish-run'],\n },\n {\n id: 'tidas.flow.identity.alias-equivalence.review',\n dataset_type: 'flow',\n severity: 'warning',\n default_blocker: false,\n phases: ['identity-preflight', 'dedup-review'],\n },\n {\n id: 'tidas.publish.verification.required',\n dataset_type: 'publish',\n severity: 'blocker',\n default_blocker: true,\n phases: ['publish-run'],\n },\n] as const satisfies RuntimeRule[];\n\nconst RULESETS = [\n {\n id: 'process-authoring/strict',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'process',\n phase: 'authoring',\n rule_ids: [\n 'tidas.process.name.base-name.align-reference-flow',\n 'tidas.process.name.qualifiers.structured',\n 'tidas.process.quantitative-reference.required',\n 'tidas.process.exchange.amount.required',\n 'tidas.process.evidence.field-bindings.required',\n ],\n },\n {\n id: 'process-authoring/repair',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'process',\n phase: 'repair',\n rule_ids: [\n 'tidas.process.quantitative-reference.required',\n 'tidas.process.exchange.amount.required',\n 'tidas.process.evidence.field-bindings.required',\n 'tidas.process.version.format',\n ],\n },\n {\n id: 'process-publish/default',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'process',\n phase: 'publish',\n rule_ids: [\n 'tidas.process.name.base-name.align-reference-flow',\n 'tidas.process.quantitative-reference.required',\n 'tidas.process.exchange.amount.required',\n 'tidas.process.evidence.field-bindings.required',\n 'tidas.process.version.format',\n ],\n },\n {\n id: 'process-dedup/default',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'process',\n phase: 'identity',\n rule_ids: ['tidas.process.identity.duplicate-fingerprint.block'],\n },\n {\n id: 'flow-authoring/strict',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'flow',\n phase: 'authoring',\n rule_ids: [\n 'tidas.flow.name.base-name.technical',\n 'tidas.flow.type.required',\n 'tidas.flow.reference-property-unit.required',\n 'tidas.flow.flow-property.mean-value.positive',\n 'tidas.flow.classification.elementary.valid',\n 'tidas.flow.evidence.field-bindings.required',\n 'tidas.flow.identity.alias-equivalence.review',\n ],\n },\n {\n id: 'flow-publish/default',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'flow',\n phase: 'publish',\n rule_ids: [\n 'tidas.flow.name.base-name.technical',\n 'tidas.flow.type.required',\n 'tidas.flow.reference-property-unit.required',\n 'tidas.flow.classification.elementary.valid',\n 'tidas.flow.flow-property.mean-value.positive',\n 'tidas.flow.evidence.field-bindings.required',\n ],\n },\n {\n id: 'flow-dedup/default',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'flow',\n phase: 'identity',\n rule_ids: ['tidas.flow.identity.alias-equivalence.review'],\n },\n {\n id: 'publish-run/default',\n version: RUNTIME_RULESET_VERSION,\n source_version: RUNTIME_RULESET_SOURCE_VERSION,\n dataset_type: 'publish',\n phase: 'verification',\n rule_ids: ['tidas.publish.verification.required'],\n },\n] as const satisfies RuntimeRuleset[];\n\nconst RULESETS_BY_ID = Object.fromEntries(RULESETS.map((item) => [item.id, item]));\nconst RULES_BY_ID = Object.fromEntries(RUNTIME_RULES.map((item) => [item.id, item]));\n\nconst LOCAL_RULE_ID_MAP: Partial<Record<RuntimeRulesetId, Record<string, string>>> = {\n 'process-authoring/strict': {\n process_missing_source_base_name: 'tidas.process.name.base-name.align-reference-flow',\n process_missing_functional_unit: 'tidas.process.quantitative-reference.required',\n process_missing_quantitative_reference: 'tidas.process.quantitative-reference.required',\n process_missing_exchange_amount: 'tidas.process.exchange.amount.required',\n process_material_balance_deviation: 'tidas.process.exchange.amount.required',\n process_missing_system_boundary: 'tidas.process.evidence.field-bindings.required',\n process_missing_time: 'tidas.process.evidence.field-bindings.required',\n process_missing_geography: 'tidas.process.evidence.field-bindings.required',\n process_missing_technology: 'tidas.process.evidence.field-bindings.required',\n process_missing_admin_metadata: 'tidas.process.evidence.field-bindings.required',\n process_exchange_unit_semantic_mismatch: 'tidas.process.exchange.amount.required',\n },\n 'process-dedup/default': {\n process_exact_duplicate_fingerprint: 'tidas.process.identity.duplicate-fingerprint.block',\n },\n 'process-publish/default': {\n process_schema_failed: 'tidas.process.evidence.field-bindings.required',\n },\n 'flow-authoring/strict': {\n missing_type_of_dataset: 'tidas.flow.type.required',\n elementary_flow_in_flow_qa: 'tidas.flow.type.required',\n methodology_invalid_type_of_dataset: 'tidas.flow.type.required',\n missing_name_text: 'tidas.flow.name.base-name.technical',\n name_contains_emergy: 'tidas.flow.name.base-name.technical',\n methodology_missing_base_name_en: 'tidas.flow.name.base-name.technical',\n methodology_basename_semicolon: 'tidas.flow.name.base-name.technical',\n missing_classification_leaf: 'tidas.flow.classification.elementary.valid',\n methodology_missing_class_id: 'tidas.flow.classification.elementary.valid',\n methodology_missing_cat_id: 'tidas.flow.classification.elementary.valid',\n methodology_product_classification_level_gap: 'tidas.flow.classification.elementary.valid',\n methodology_elementary_classification_level_gap: 'tidas.flow.classification.elementary.valid',\n missing_flow_property: 'tidas.flow.reference-property-unit.required',\n invalid_flow_property_reference: 'tidas.flow.reference-property-unit.required',\n missing_quantitative_reference: 'tidas.flow.reference-property-unit.required',\n quantitative_reference_mismatch: 'tidas.flow.reference-property-unit.required',\n methodology_quant_ref_missing_target: 'tidas.flow.reference-property-unit.required',\n same_category_high_similarity: 'tidas.flow.identity.alias-equivalence.review',\n },\n 'flow-publish/default': {\n flow_schema_failed: 'tidas.flow.evidence.field-bindings.required',\n },\n 'flow-dedup/default': {\n same_property_semantic_review: 'tidas.flow.identity.alias-equivalence.review',\n },\n};\n\nexport function listRuntimeRulesets(): RuntimeRuleset[] {\n return RULESETS.map((ruleset) => ({ ...ruleset, rule_ids: [...ruleset.rule_ids] }));\n}\n\nexport function getRuntimeRuleset<T extends RuntimeRulesetId>(id: T): RuntimeRuleset & { id: T } {\n const ruleset = RULESETS_BY_ID[id];\n return { ...ruleset, rule_ids: [...ruleset.rule_ids] } as RuntimeRuleset & { id: T };\n}\n\nexport function getRuntimeRule(id: string): RuntimeRule | null {\n const rule = RULES_BY_ID[id];\n return rule ? { ...rule, phases: [...rule.phases] } : null;\n}\n\nexport function runtimeRuleIds(id: RuntimeRulesetId): string[] {\n return getRuntimeRuleset(id).rule_ids;\n}\n\nexport function resolveRuntimeRuleId(\n rulesetId: RuntimeRulesetId,\n localRuleId: string | null | undefined,\n): string | null {\n if (!localRuleId) {\n return null;\n }\n return LOCAL_RULE_ID_MAP[rulesetId]?.[localRuleId] ?? null;\n}\n\nexport function isRuntimeRuleBlocker(ruleId: string | null | undefined): boolean {\n if (!ruleId) {\n return false;\n }\n return RULES_BY_ID[ruleId]?.default_blocker ?? false;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tiangong-lca/cli",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "description": "Unified TianGong LCA CLI with direct REST adapters and low-entropy command surface.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-flow.js","sourceRoot":"","sources":["../../../src/lib/review-flow.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 {\n coerceText,\n deepGet,\n extractFlowRecord,\n flowDatasetFromRow,\n isRecord,\n listify,\n loadRowsFromFile,\n normalizeText,\n} from './flow-governance.js';\nimport type { JsonRecord } from './flow-governance.js';\nimport type { FetchLike } from './http.js';\nimport { invokeLlm, readLlmRuntimeEnv, type LlmRuntimeEnv } from './llm.js';\nimport {\n getRuntimeRuleset,\n isRuntimeRuleBlocker,\n resolveRuntimeRuleId,\n} from './runtime-rulesets.js';\n\nconst UUID_RE = /[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/u;\n\ntype ClassificationEntry = {\n level: string;\n class_id?: string;\n cat_id?: string;\n text: string;\n};\n\ntype FlowRuleFinding = {\n flow_uuid: string;\n base_version: string;\n severity: string;\n rule_id?: string;\n ruleset_id?: 'flow-authoring/strict';\n methodology_rule_id?: string | null;\n message?: string;\n fixability?: string;\n source: 'rule' | 'llm';\n rule_source?: string;\n evidence?: JsonRecord;\n action?: string;\n};\n\ntype FlowSummary = {\n flow_uuid: string;\n base_version: string;\n type_of_dataset: string;\n names: {\n primary_en: string;\n primary_zh: string;\n all_texts: string[];\n };\n classification: {\n leaf: {\n class_id: string;\n text: string;\n key: string;\n };\n path: ClassificationEntry[];\n };\n flow_property: JsonRecord;\n quantitative_reference: {\n reference_flow_property_internal_id: string;\n };\n unitgroup: {\n uuid: string;\n name: string;\n reference_unit_name: string;\n lookup_status: string;\n lookup_source: string;\n };\n rule_signals: Array<{\n rule_id: string;\n severity: string;\n message: string;\n evidence: JsonRecord;\n }>;\n similarity_candidates: Array<{\n other_flow_uuid: string;\n other_base_version: string;\n similarity: number;\n other_name_en: string;\n classification_group: string;\n }>;\n source_file?: string;\n _name_fingerprint: string;\n};\n\ntype FlowSimilarityPair = {\n classification_group: string;\n flow_property_uuid: string;\n unitgroup_uuid: string;\n left_flow_uuid: string;\n right_flow_uuid: string;\n left_version: string;\n right_version: string;\n similarity: number;\n left_name_en: string;\n right_name_en: string;\n};\n\ntype FlowReviewLlmBatchResult = {\n batch_index: number;\n batch_size: number;\n enabled: boolean;\n ok: boolean;\n reason?: string;\n raw_preview?: string;\n};\n\nexport type FlowReviewLlmResult = {\n enabled: boolean;\n ok?: boolean;\n reason?: string;\n batch_count: number;\n reviewed_flow_count: number;\n truncated: boolean;\n batch_results: FlowReviewLlmBatchResult[];\n};\n\ntype FlowReviewLlmRunResult = FlowReviewLlmResult & {\n llmFindings: FlowRuleFinding[];\n};\n\ntype FlowRulesetGate = {\n status: 'passed' | 'needs_review' | 'blocked';\n ruleset_id: 'flow-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: FlowRuleFinding[];\n next_action: 'continue' | 'review_findings' | 'fix_blockers';\n};\n\nexport type FlowReviewReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_local_flow_review';\n run_id: string;\n out_dir: string;\n input_mode: 'rows_file' | 'flows_dir' | 'run_root';\n effective_flows_dir: string;\n logic_version: string;\n ruleset_id?: 'flow-authoring/strict';\n ruleset_version?: '1';\n ruleset_source_version?: string;\n ruleset_rule_ids?: string[];\n flow_count: number;\n similarity_threshold: number;\n methodology_rule_source: string;\n with_reference_context: false;\n reference_context_mode: 'disabled';\n rule_finding_count: number;\n llm_finding_count: number;\n finding_count: number;\n blocker_count?: number;\n severity_counts: Record<string, number>;\n rule_counts: Record<string, number>;\n methodology_rule_counts?: Record<string, number>;\n ruleset_gate?: FlowRulesetGate;\n llm: FlowReviewLlmResult;\n files: {\n review_input_summary: string;\n materialization_summary: string | null;\n rule_findings: string;\n llm_findings: string;\n findings: string;\n ruleset_gate?: string;\n flow_summaries: string;\n similarity_pairs: string;\n summary: string;\n review_zh: string;\n review_en: string;\n timing: string;\n report: string;\n };\n};\n\nexport type RunFlowReviewOptions = {\n rowsFile?: string;\n flowsDir?: 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 llmMaxFlows?: number;\n llmBatchSize?: number;\n similarityThreshold?: number;\n methodologyId?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n now?: () => Date;\n};\n\nfunction walkStrings(node: unknown): string[] {\n if (typeof node === 'string') {\n return node.trim() ? [node.trim()] : [];\n }\n\n if (Array.isArray(node)) {\n return node.flatMap((item) => walkStrings(item));\n }\n\n if (!isRecord(node)) {\n return [];\n }\n\n const strings: string[] = [];\n if (typeof node['#text'] === 'string' && String(node['#text']).trim()) {\n strings.push(String(node['#text']).trim());\n }\n\n Object.values(node).forEach((value) => {\n strings.push(...walkStrings(value));\n });\n return strings;\n}\n\nfunction langTextForLang(value: unknown, lang: string): string {\n for (const item of listify(value)) {\n if (!isRecord(item)) {\n continue;\n }\n\n if (coerceText(item['@xml:lang']).toLowerCase() !== lang.toLowerCase()) {\n continue;\n }\n\n const text = coerceText(item['#text']);\n if (text) {\n return text;\n }\n }\n\n for (const item of listify(value)) {\n const text = coerceText(item);\n if (text) {\n return text;\n }\n }\n\n return '';\n}\n\nfunction findUuidInNode(node: unknown): string {\n if (isRecord(node)) {\n for (const key of ['@refObjectId', '@uri']) {\n const raw = coerceText(node[key]);\n const match = raw.match(UUID_RE);\n if (match) {\n return match[0].toLowerCase();\n }\n }\n }\n\n const raw = coerceText(node);\n const match = raw.match(UUID_RE);\n return match ? match[0].toLowerCase() : '';\n}\n\nfunction flowRoot(doc: JsonRecord): JsonRecord {\n return isRecord(doc.flowDataSet) ? { ...doc.flowDataSet } : { ...doc };\n}\n\nfunction flowUuid(flow: JsonRecord): string {\n return coerceText(deepGet(flow, ['flowInformation', 'dataSetInformation', 'common:UUID']));\n}\n\nfunction flowVersion(flow: JsonRecord): string {\n return coerceText(\n deepGet(flow, [\n 'administrativeInformation',\n 'publicationAndOwnership',\n 'common:dataSetVersion',\n ]),\n );\n}\n\nfunction flowType(flow: JsonRecord): string {\n return (\n coerceText(\n deepGet(flow, ['modellingAndValidation', 'LCIMethodAndAllocation', 'typeOfDataSet']),\n ) || coerceText(deepGet(flow, ['modellingAndValidation', 'LCIMethod', 'typeOfDataSet']))\n );\n}\n\nfunction nameNode(flow: JsonRecord): unknown {\n return deepGet(flow, ['flowInformation', 'dataSetInformation', 'name']);\n}\n\nfunction nameTexts(flow: JsonRecord): string[] {\n return walkStrings(nameNode(flow));\n}\n\nfunction namePrimary(flow: JsonRecord, lang: string): string {\n const name = nameNode(flow);\n if (!isRecord(name)) {\n return '';\n }\n\n return langTextForLang(name.baseName, lang);\n}\n\nfunction nameFingerprint(flow: JsonRecord): string {\n const name = nameNode(flow);\n if (!isRecord(name)) {\n return '';\n }\n\n const parts: string[] = [];\n for (const key of ['baseName', 'treatmentStandardsRoutes', 'mixAndLocationTypes']) {\n const values = listify(name[key])\n .map((item) => (isRecord(item) ? coerceText(item['#text']) : coerceText(item)))\n .filter(Boolean);\n if (values.length) {\n parts.push(values.join(' | '));\n }\n }\n\n const text = parts.length ? parts.join(' || ') : nameTexts(flow).join(' || ');\n return normalizeText(text);\n}\n\nfunction classificationEntries(flow: JsonRecord): ClassificationEntry[] {\n return listify(\n deepGet(flow, [\n 'flowInformation',\n 'dataSetInformation',\n 'classificationInformation',\n 'common:classification',\n 'common:class',\n ]),\n )\n .filter(isRecord)\n .map((item) => ({\n level: coerceText(item['@level']),\n class_id: coerceText(item['@classId']),\n text: coerceText(item['#text']),\n }));\n}\n\nfunction elementaryClassEntries(flow: JsonRecord): ClassificationEntry[] {\n return listify(\n deepGet(flow, [\n 'flowInformation',\n 'dataSetInformation',\n 'classificationInformation',\n 'common:elementaryFlowCategorization',\n 'common:category',\n ]),\n )\n .filter(isRecord)\n .map((item) => ({\n level: coerceText(item['@level']),\n cat_id: coerceText(item['@catId']),\n text: coerceText(item['#text']),\n }));\n}\n\nfunction classificationLeaf(flow: JsonRecord): { class_id: string; text: string; key: string } {\n const entries = classificationEntries(flow);\n if (!entries.length) {\n return {\n class_id: '',\n text: '',\n key: '',\n };\n }\n\n const leaf = entries[entries.length - 1]!;\n const classId = leaf.class_id as string;\n const key = `${classId}|${leaf.text}`.replace(/^\\||\\|$/gu, '');\n return {\n class_id: classId,\n text: leaf.text,\n key,\n };\n}\n\nfunction flowProperties(flow: JsonRecord): JsonRecord[] {\n return listify(deepGet(flow, ['flowProperties', 'flowProperty'])).filter(isRecord);\n}\n\nfunction pickReferenceFlowProperty(flow: JsonRecord): {\n prop: JsonRecord | null;\n internalId: string;\n} {\n const props = flowProperties(flow);\n\n for (const prop of props) {\n const internalId = coerceText(prop['@dataSetInternalID']);\n if (internalId === '0') {\n return {\n prop,\n internalId,\n };\n }\n }\n\n if (props.length) {\n return {\n prop: props[0],\n internalId: coerceText(props[0]['@dataSetInternalID']),\n };\n }\n\n return {\n prop: null,\n internalId: '',\n };\n}\n\nfunction quantitativeReferenceInternalId(flow: JsonRecord): string {\n return coerceText(\n deepGet(flow, ['flowInformation', 'quantitativeReference', 'referenceToReferenceFlowProperty']),\n );\n}\n\nfunction flowPropertyRef(prop: JsonRecord): {\n uuid: string;\n version: string;\n internal_id: string;\n short_name_en: string;\n} {\n const ref = isRecord(prop.referenceToFlowPropertyDataSet)\n ? prop.referenceToFlowPropertyDataSet\n : null;\n return {\n uuid: findUuidInNode(ref),\n version: coerceText(ref?.['@version']),\n internal_id: coerceText(prop['@dataSetInternalID']),\n short_name_en: langTextForLang(ref?.['common:shortDescription'], 'en'),\n };\n}\n\nfunction computeSimilarity(left: string, right: string): number {\n if (!left || !right) {\n return 0;\n }\n if (left === right) {\n return 1;\n }\n\n const leftTokens = new Set(left.split(' ').filter(Boolean));\n const rightTokens = new Set(right.split(' ').filter(Boolean));\n if (!leftTokens.size || !rightTokens.size) {\n return 0;\n }\n\n let intersection = 0;\n leftTokens.forEach((token) => {\n if (rightTokens.has(token)) {\n intersection += 1;\n }\n });\n return intersection / Math.max(leftTokens.size, rightTokens.size);\n}\n\nfunction createRuleFinding(\n flowUuidValue: string,\n baseVersion: string,\n severity: string,\n ruleId: string,\n message: string,\n options?: {\n fixability?: string;\n evidence?: JsonRecord;\n action?: string;\n ruleSource?: string;\n },\n): FlowRuleFinding {\n const ruleset = getRuntimeRuleset('flow-authoring/strict');\n return {\n flow_uuid: flowUuidValue,\n base_version: baseVersion,\n severity,\n rule_id: ruleId,\n ruleset_id: ruleset.id,\n methodology_rule_id: resolveRuntimeRuleId(ruleset.id, ruleId),\n message,\n fixability: options?.fixability ?? 'manual',\n source: 'rule',\n ...(options?.ruleSource ? { rule_source: options.ruleSource } : {}),\n ...(options?.evidence ? { evidence: options.evidence } : {}),\n ...(options?.action ? { action: options.action } : {}),\n };\n}\n\nfunction flowRulesetGate(findings: FlowRuleFinding[]): FlowRulesetGate {\n const ruleset = getRuntimeRuleset('flow-authoring/strict');\n const blockers = findings.filter(\n (finding) =>\n finding.severity === 'error' ||\n finding.severity === 'blocker' ||\n isRuntimeRuleBlocker(finding.methodology_rule_id),\n );\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'\n : 'continue',\n };\n}\n\nfunction applyMethodologyChecks(\n flow: JsonRecord,\n flowUuidValue: string,\n baseVersion: string,\n ruleSource: string,\n): FlowRuleFinding[] {\n const findings: FlowRuleFinding[] = [];\n const allowedTypes = new Set(['elementary flow', 'product flow', 'waste flow']);\n const typeOfDataset = flowType(flow).toLowerCase();\n if (typeOfDataset && !allowedTypes.has(typeOfDataset)) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'error',\n 'methodology_invalid_type_of_dataset',\n 'typeOfDataSet not in allowed set: Elementary flow | Product flow | Waste flow.',\n {\n evidence: {\n typeOfDataSet: flowType(flow),\n },\n ruleSource,\n },\n ),\n );\n }\n\n const baseNameItems = listify(\n deepGet(flow, ['flowInformation', 'dataSetInformation', 'name', 'baseName']),\n );\n const baseNameEn = langTextForLang(baseNameItems, 'en');\n if (!baseNameEn) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'warning',\n 'methodology_missing_base_name_en',\n 'English baseName is missing (methodology marks English as mandatory).',\n {\n fixability: 'auto',\n ruleSource,\n },\n ),\n );\n }\n\n if (\n baseNameItems.some((item) => {\n const text = isRecord(item) ? coerceText(item['#text']) : coerceText(item);\n return text.includes(';');\n })\n ) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'warning',\n 'methodology_basename_semicolon',\n 'baseName contains semicolon; methodology requires comma-separated descriptors.',\n {\n fixability: 'auto',\n ruleSource,\n },\n ),\n );\n }\n\n const quantId = quantitativeReferenceInternalId(flow);\n const propertyIds = new Set(\n flowProperties(flow)\n .map((prop) => coerceText(prop['@dataSetInternalID']))\n .filter(Boolean),\n );\n if (quantId && !propertyIds.has(quantId)) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'error',\n 'methodology_quant_ref_missing_target',\n 'referenceToReferenceFlowProperty points to a non-existing flowProperty internal ID.',\n {\n evidence: {\n referenceToReferenceFlowProperty: quantId,\n available_internal_ids: [...propertyIds].sort(),\n },\n ruleSource,\n },\n ),\n );\n }\n\n for (const [entries, label, idKey, maxLevel] of [\n [classificationEntries(flow), 'product_classification', 'class_id', 4],\n [elementaryClassEntries(flow), 'elementary_classification', 'cat_id', 2],\n ] as const) {\n const levels: number[] = [];\n entries.forEach((entry) => {\n const level = Number.parseInt(entry.level, 10);\n if (Number.isInteger(level)) {\n levels.push(level);\n }\n\n if (!coerceText(entry[idKey])) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'warning',\n `methodology_missing_${idKey}`,\n `${label} entry has level but missing ${idKey}.`,\n {\n evidence: {\n entry,\n },\n ruleSource,\n },\n ),\n );\n }\n });\n\n if (levels.length) {\n const uniqueLevels = [...new Set(levels)].sort((left, right) => left - right);\n const expectedLevels: number[] = [];\n for (\n let level = uniqueLevels[0];\n level <= Math.min(maxLevel, uniqueLevels[uniqueLevels.length - 1]);\n level += 1\n ) {\n expectedLevels.push(level);\n }\n if (\n uniqueLevels[0] !== 0 ||\n JSON.stringify(uniqueLevels) !== JSON.stringify(expectedLevels)\n ) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'warning',\n `methodology_${label}_level_gap`,\n `${label} levels should be continuous and start from 0.`,\n {\n evidence: {\n levels: uniqueLevels,\n },\n ruleSource,\n },\n ),\n );\n }\n }\n }\n\n return findings;\n}\n\nfunction buildFlowSummaryAndRuleFindings(\n doc: JsonRecord,\n methodologyRuleSource: string,\n): {\n summary: FlowSummary;\n findings: FlowRuleFinding[];\n} {\n const flow = flowRoot(doc);\n const flowUuidValue = flowUuid(flow) || '(missing-uuid)';\n const baseVersion = flowVersion(flow);\n const typeOfDataset = flowType(flow);\n const names = nameTexts(flow);\n const leaf = classificationLeaf(flow);\n const summary: FlowSummary = {\n flow_uuid: flowUuidValue,\n base_version: baseVersion,\n type_of_dataset: typeOfDataset,\n names: {\n primary_en: namePrimary(flow, 'en'),\n primary_zh: namePrimary(flow, 'zh'),\n all_texts: names.slice(0, 20),\n },\n classification: {\n leaf,\n path: classificationEntries(flow).slice(0, 20),\n },\n flow_property: {},\n quantitative_reference: {\n reference_flow_property_internal_id: quantitativeReferenceInternalId(flow),\n },\n unitgroup: {\n uuid: '',\n name: '',\n reference_unit_name: '',\n lookup_status: 'disabled',\n lookup_source: '',\n },\n rule_signals: [],\n similarity_candidates: [],\n _name_fingerprint: nameFingerprint(flow),\n };\n\n const findings: FlowRuleFinding[] = [];\n\n if (!typeOfDataset) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'error',\n 'missing_type_of_dataset',\n 'typeOfDataSet is missing under modellingAndValidation.LCIMethod.',\n ),\n );\n } else if (typeOfDataset.toLowerCase() === 'elementary flow') {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'warning',\n 'elementary_flow_in_flow_review',\n 'Flow type is Elementary flow; check whether this batch should exclude it.',\n {\n fixability: 'review-needed',\n evidence: {\n typeOfDataSet: typeOfDataset,\n },\n },\n ),\n );\n }\n\n if (!names.length) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'warning',\n 'missing_name_text',\n 'No textual entries found under flowInformation.dataSetInformation.name.',\n ),\n );\n } else if (names.some((value) => value.toLowerCase().includes('emergy'))) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'warning',\n 'name_contains_emergy',\n \"Name subtree contains 'Emergy'.\",\n {\n fixability: 'review-needed',\n evidence: {\n matched_count: names.filter((value) => value.toLowerCase().includes('emergy')).length,\n },\n },\n ),\n );\n }\n\n if (!leaf.key) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'warning',\n 'missing_classification_leaf',\n 'Classification leaf is missing.',\n ),\n );\n }\n\n const { prop, internalId } = pickReferenceFlowProperty(flow);\n if (!prop) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'error',\n 'missing_flow_property',\n 'No flowProperties.flowProperty entry found.',\n ),\n );\n } else {\n const ref = flowPropertyRef(prop);\n summary.flow_property = {\n selected_internal_id: internalId || ref.internal_id,\n referenced_uuid: ref.uuid,\n referenced_version: ref.version,\n referenced_short_name_en: ref.short_name_en,\n available_count: flowProperties(flow).length,\n };\n\n if (!ref.uuid) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'error',\n 'invalid_flow_property_reference',\n 'Could not parse flow property UUID from referenceToFlowPropertyDataSet.',\n {\n evidence: {\n selected_internal_id: internalId || ref.internal_id,\n },\n },\n ),\n );\n }\n\n const quantId = summary.quantitative_reference.reference_flow_property_internal_id;\n if (!quantId) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'warning',\n 'missing_quantitative_reference',\n 'referenceToReferenceFlowProperty is missing.',\n {\n fixability: 'auto',\n evidence: {\n expected_internal_id: internalId || ref.internal_id,\n },\n },\n ),\n );\n } else if (internalId && quantId !== internalId) {\n findings.push(\n createRuleFinding(\n flowUuidValue,\n baseVersion,\n 'warning',\n 'quantitative_reference_mismatch',\n 'Quantitative reference internal ID differs from selected reference flowProperty internal ID.',\n {\n fixability: 'auto',\n evidence: {\n quant_ref_internal_id: quantId,\n expected_internal_id: internalId,\n },\n action: 'Align quantitative reference internal ID to the selected flowProperty.',\n },\n ),\n );\n }\n }\n\n findings.push(...applyMethodologyChecks(flow, flowUuidValue, baseVersion, methodologyRuleSource));\n\n summary.rule_signals = findings.slice(0, 20).map((finding) => ({\n rule_id: coerceText(finding.rule_id),\n severity: finding.severity,\n message: coerceText(finding.message),\n evidence: finding.evidence ?? {},\n }));\n\n return {\n summary,\n findings,\n };\n}\n\nfunction buildSimilarity(\n summaries: FlowSummary[],\n threshold: number,\n): {\n pairs: FlowSimilarityPair[];\n candidatesByFlow: Record<string, FlowSummary['similarity_candidates']>;\n} {\n const grouped: Record<string, FlowSummary[]> = {};\n const candidatesByFlow: Record<string, FlowSummary['similarity_candidates']> = {};\n const pairs: FlowSimilarityPair[] = [];\n\n summaries.forEach((summary) => {\n const leafKey = summary.classification.leaf.key;\n const flowPropertyUuid = coerceText(summary.flow_property.referenced_uuid);\n const unitgroupUuid = summary.unitgroup.uuid;\n if (!leafKey || !summary._name_fingerprint) {\n return;\n }\n\n const key = `${leafKey}::${flowPropertyUuid}::${unitgroupUuid}`;\n grouped[key] ??= [];\n grouped[key].push(summary);\n });\n\n Object.entries(grouped).forEach(([key, rows]) => {\n if (rows.length < 2) {\n return;\n }\n\n const [classificationGroup, flowPropertyUuid, unitgroupUuid] = key.split('::');\n for (let leftIndex = 0; leftIndex < rows.length; leftIndex += 1) {\n for (let rightIndex = leftIndex + 1; rightIndex < rows.length; rightIndex += 1) {\n const left = rows[leftIndex];\n const right = rows[rightIndex];\n const similarity = computeSimilarity(left._name_fingerprint, right._name_fingerprint);\n if (similarity < threshold) {\n continue;\n }\n\n const pair: FlowSimilarityPair = {\n classification_group: classificationGroup,\n flow_property_uuid: flowPropertyUuid,\n unitgroup_uuid: unitgroupUuid,\n left_flow_uuid: left.flow_uuid,\n right_flow_uuid: right.flow_uuid,\n left_version: left.base_version,\n right_version: right.base_version,\n similarity: Number(similarity.toFixed(6)),\n left_name_en: left.names.primary_en,\n right_name_en: right.names.primary_en,\n };\n pairs.push(pair);\n\n for (const [source, target] of [\n [left, right],\n [right, left],\n ] as const) {\n candidatesByFlow[source.flow_uuid] ??= [];\n candidatesByFlow[source.flow_uuid].push({\n other_flow_uuid: target.flow_uuid,\n other_base_version: target.base_version,\n similarity: Number(similarity.toFixed(6)),\n other_name_en: target.names.primary_en,\n classification_group: classificationGroup,\n });\n }\n }\n }\n });\n\n Object.keys(candidatesByFlow).forEach((flowUuidValue) => {\n candidatesByFlow[flowUuidValue].sort(\n (left, right) =>\n right.similarity - left.similarity ||\n left.other_flow_uuid.localeCompare(right.other_flow_uuid),\n );\n candidatesByFlow[flowUuidValue] = candidatesByFlow[flowUuidValue].slice(0, 5);\n });\n\n return {\n pairs,\n candidatesByFlow,\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\nfunction buildLlmPrompt(batch: unknown[]): string {\n return [\n '请对以下 flow 摘要进行 LCI 复审,重点关注:',\n '1) flow property 与 quantitative reference 是否合理/一致;',\n '2) 同类别高相似度 flow 的重复/近重复风险;',\n '3) 名称、分类、typeOfDataSet 的语义一致性与明显异常。',\n '',\n '规则:',\n '- 只能依据输入摘要中的证据;',\n '- 若证据不足,必须明确写证据不足;',\n '- 对每条问题给出 flow_uuid;',\n '- 输出必须是 JSON 对象。',\n '',\n '输出格式:{findings:[{flow_uuid, severity, fixability, evidence, action}]}。',\n '',\n `输入摘要:\\n${JSON.stringify(batch, null, 2)}`,\n ].join('\\n');\n}\n\nfunction normalizeLlmFinding(\n item: JsonRecord,\n summaryByUuid: Record<string, FlowSummary>,\n fallbackFlowUuid = '',\n): FlowRuleFinding | null {\n const flowUuidValue = coerceText(item.flow_uuid) || fallbackFlowUuid;\n if (!flowUuidValue) {\n return null;\n }\n\n const severity = (() => {\n const value = coerceText(item.severity).toLowerCase();\n if (value === 'error' || value === 'warning' || value === 'info') {\n return value;\n }\n return 'warning';\n })();\n\n const evidence = item.evidence;\n return {\n flow_uuid: flowUuidValue,\n base_version: summaryByUuid[flowUuidValue]?.base_version ?? '',\n severity,\n fixability: coerceText(item.fixability) || 'review-needed',\n source: 'llm',\n ...(isRecord(evidence)\n ? { evidence }\n : evidence === undefined\n ? {}\n : { evidence: { text: coerceText(evidence) } }),\n ...(coerceText(item.action) || coerceText(item.suggestion) || coerceText(item.suggested_action)\n ? {\n action:\n coerceText(item.action) ||\n coerceText(item.suggestion) ||\n coerceText(item.suggested_action),\n }\n : {}),\n };\n}\n\nasync function runOptionalLlmReview(\n summaries: FlowSummary[],\n options: {\n enableLlm: boolean;\n llmModel?: string;\n llmMaxFlows: number;\n llmBatchSize: number;\n env: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n outDir: string;\n runId: string;\n },\n): Promise<FlowReviewLlmRunResult> {\n if (!options.enableLlm) {\n return {\n enabled: false,\n reason: 'disabled',\n batch_count: 0,\n reviewed_flow_count: 0,\n truncated: false,\n batch_results: [],\n llmFindings: [],\n };\n }\n\n let env = readLlmRuntimeEnv(options.env);\n if (options.llmModel) {\n env = {\n ...env,\n model: options.llmModel,\n } satisfies LlmRuntimeEnv;\n }\n\n const target = options.llmMaxFlows > 0 ? summaries.slice(0, options.llmMaxFlows) : summaries;\n const batchSize = Math.max(1, options.llmBatchSize);\n const batches: FlowSummary[][] = [];\n for (let index = 0; index < target.length; index += batchSize) {\n batches.push(target.slice(index, index + batchSize));\n }\n\n const summaryByUuid = Object.fromEntries(\n summaries.map((summary) => [summary.flow_uuid, summary]),\n );\n const batchResults: FlowReviewLlmBatchResult[] = [];\n const llmFindings: FlowRuleFinding[] = [];\n\n for (let index = 0; index < batches.length; index += 1) {\n const batch = batches[index];\n const llmPayload = batch.map((summary) => {\n const serializable = JSON.parse(JSON.stringify(summary)) as JsonRecord & {\n _name_fingerprint?: string;\n };\n delete serializable._name_fingerprint;\n return serializable;\n });\n\n try {\n const response = await invokeLlm({\n env,\n input: {\n prompt: '你是严谨的LCA flow复审助手。只基于输入证据判断,不得臆造。输出必须是JSON对象。',\n context: buildLlmPrompt(llmPayload),\n },\n fetchImpl: options.fetchImpl ?? (globalThis.fetch as FetchLike),\n timeoutMs: 45_000,\n cacheDir: path.join(options.outDir, '.llm-cache'),\n tracePath: path.join(options.outDir, 'llm-trace.jsonl'),\n module: 'review-flow',\n stage: `semantic-review-${index + 1}`,\n runId: options.runId,\n });\n\n const parsed = parseLlmJsonOutput(response.output);\n if (!parsed) {\n batchResults.push({\n batch_index: index + 1,\n batch_size: batch.length,\n enabled: true,\n ok: false,\n reason: 'llm_non_json_output',\n raw_preview: response.output.slice(0, 500),\n });\n continue;\n }\n\n const rawFindings = Array.isArray(parsed.findings) ? parsed.findings : [];\n rawFindings\n .filter(isRecord)\n .map((item) =>\n normalizeLlmFinding(item, summaryByUuid, batch.length === 1 ? batch[0].flow_uuid : ''),\n )\n .filter((item): item is FlowRuleFinding => item !== null)\n .forEach((item) => {\n llmFindings.push(item);\n });\n\n batchResults.push({\n batch_index: index + 1,\n batch_size: batch.length,\n enabled: true,\n ok: true,\n });\n } catch (error) {\n batchResults.push({\n batch_index: index + 1,\n batch_size: batch.length,\n enabled: true,\n ok: false,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const deduped: FlowRuleFinding[] = [];\n const seen = new Set<string>();\n llmFindings.forEach((finding) => {\n const key = JSON.stringify({\n flow_uuid: finding.flow_uuid,\n severity: finding.severity,\n fixability: finding.fixability,\n evidence: finding.evidence ?? {},\n action: finding.action ?? '',\n });\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n deduped.push(finding);\n });\n\n return {\n enabled: true,\n ok: batchResults.some((item) => item.ok),\n reason: batchResults.some((item) => item.ok) ? undefined : 'all_batches_failed',\n batch_count: batches.length,\n reviewed_flow_count: target.length,\n truncated: target.length < summaries.length,\n batch_results: batchResults,\n llmFindings: deduped,\n };\n}\n\nfunction severityCounts(rows: FlowRuleFinding[]): Record<string, number> {\n const counts: Record<string, number> = {};\n rows.forEach((row) => {\n const key = row.severity;\n counts[key] = (counts[key] ?? 0) + 1;\n });\n return Object.fromEntries(\n Object.entries(counts).sort(([left], [right]) => left.localeCompare(right)),\n );\n}\n\nfunction ruleCounts(rows: FlowRuleFinding[]): Record<string, number> {\n const counts: Record<string, number> = {};\n rows.forEach((row) => {\n const key = coerceText(row.rule_id);\n counts[key] = (counts[key] ?? 0) + 1;\n });\n return Object.fromEntries(\n Object.entries(counts).sort(([left], [right]) => left.localeCompare(right)),\n );\n}\n\nfunction methodologyRuleCounts(rows: FlowRuleFinding[]): Record<string, number> {\n const counts: Record<string, number> = {};\n rows.forEach((row) => {\n const key = coerceText(row.methodology_rule_id);\n if (!key) {\n return;\n }\n counts[key] = (counts[key] ?? 0) + 1;\n });\n return Object.fromEntries(\n Object.entries(counts).sort(([left], [right]) => left.localeCompare(right)),\n );\n}\n\nfunction readJsonObject(filePath: string): JsonRecord {\n try {\n const parsed = JSON.parse(readFileSync(filePath, 'utf8')) as unknown;\n if (!isRecord(parsed)) {\n throw new CliError(`Expected JSON object in flow file: ${filePath}`, {\n code: 'FLOW_REVIEW_INVALID_FLOW_FILE',\n exitCode: 2,\n });\n }\n return parsed;\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n throw new CliError(`Invalid flow JSON file: ${filePath}`, {\n code: 'FLOW_REVIEW_INVALID_FLOW_FILE',\n exitCode: 2,\n details: String(error),\n });\n }\n}\n\nfunction materializeRowsFile(\n rowsFile: string,\n outDir: string,\n): { flowsDir: string; summaryPath: string } {\n const rows = loadRowsFromFile(rowsFile);\n const targetDir = path.join(outDir, 'review-input', 'flows');\n mkdirSync(targetDir, { recursive: true });\n\n const byKey: Record<string, JsonRecord> = {};\n let duplicateCount = 0;\n rows.forEach((row, index) => {\n const record = extractFlowRecord(row);\n const flowId = record.id || `row-${index}`;\n const version = record.version;\n const key = `${flowId}@${version}`;\n if (key in byKey) {\n duplicateCount += 1;\n }\n byKey[key] = row;\n });\n\n const items: Array<{ flow_key: string; primary_name: string; file: string }> = [];\n Object.entries(byKey)\n .sort(([left], [right]) => left.localeCompare(right))\n .forEach(([key, row]) => {\n const record = extractFlowRecord(row);\n const fileName = `${record.id || key.split('@', 1)[0]}__${record.version}.json`;\n const filePath = path.join(targetDir, fileName);\n writeJsonArtifact(filePath, {\n flowDataSet: flowDatasetFromRow(row),\n });\n items.push({\n flow_key: key,\n primary_name: record.name,\n file: filePath,\n });\n });\n\n const summaryPath = path.join(outDir, 'review-input', 'materialization-summary.json');\n writeJsonArtifact(summaryPath, {\n source_rows_file: path.resolve(rowsFile),\n input_row_count: rows.length,\n materialized_flow_count: Object.keys(byKey).length,\n duplicate_input_rows_collapsed: duplicateCount,\n flows_dir: targetDir,\n items,\n });\n\n return {\n flowsDir: targetDir,\n summaryPath,\n };\n}\n\nfunction resolveReviewInput(options: RunFlowReviewOptions): {\n inputMode: 'rows_file' | 'flows_dir' | 'run_root';\n effectiveFlowsDir: string;\n materializationSummaryPath: string | null;\n runId: string;\n reviewInputSummary: JsonRecord;\n} {\n const declaredModes = [\n Boolean(options.rowsFile),\n Boolean(options.flowsDir),\n Boolean(options.runRoot),\n ].filter(Boolean);\n if (declaredModes.length !== 1) {\n throw new CliError(\n 'Flow review requires exactly one of --rows-file, --flows-dir, or --run-root.',\n {\n code: 'FLOW_REVIEW_INPUT_MODE_REQUIRED',\n exitCode: 2,\n },\n );\n }\n\n if (options.rowsFile) {\n const materialized = materializeRowsFile(options.rowsFile, options.outDir);\n return {\n inputMode: 'rows_file',\n effectiveFlowsDir: materialized.flowsDir,\n materializationSummaryPath: materialized.summaryPath,\n runId: options.runId || path.parse(options.rowsFile).name,\n reviewInputSummary: {\n input_mode: 'rows_file',\n rows_file: path.resolve(options.rowsFile),\n flows_dir: '',\n run_root: '',\n materialized_flows_dir: materialized.flowsDir,\n effective_flows_dir: materialized.flowsDir,\n },\n };\n }\n\n if (options.flowsDir) {\n const resolved = path.resolve(options.flowsDir);\n return {\n inputMode: 'flows_dir',\n effectiveFlowsDir: resolved,\n materializationSummaryPath: null,\n runId: options.runId || path.basename(resolved),\n reviewInputSummary: {\n input_mode: 'flows_dir',\n rows_file: '',\n flows_dir: resolved,\n run_root: '',\n materialized_flows_dir: '',\n effective_flows_dir: resolved,\n },\n };\n }\n\n const runRoot = path.resolve(options.runRoot!);\n const candidates = [path.join(runRoot, 'cache', 'flows'), path.join(runRoot, 'exports', 'flows')];\n const effective = candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];\n return {\n inputMode: 'run_root',\n effectiveFlowsDir: effective,\n materializationSummaryPath: null,\n runId: options.runId || path.basename(runRoot),\n reviewInputSummary: {\n input_mode: 'run_root',\n rows_file: '',\n flows_dir: '',\n run_root: runRoot,\n materialized_flows_dir: '',\n effective_flows_dir: effective,\n },\n };\n}\n\nfunction listFlowFiles(flowsDir: string): string[] {\n if (!existsSync(flowsDir) || !statSync(flowsDir).isDirectory()) {\n throw new CliError(`Flow review directory not found: ${flowsDir}`, {\n code: 'FLOW_REVIEW_DIR_NOT_FOUND',\n exitCode: 2,\n });\n }\n\n return readdirSync(flowsDir)\n .filter((entry) => entry.endsWith('.json'))\n .map((entry) => path.join(flowsDir, entry))\n .filter((entry) => statSync(entry).isFile())\n .sort((left, right) => left.localeCompare(right));\n}\n\nfunction stripInternalSummaryFields(summary: FlowSummary): JsonRecord {\n const serializable = JSON.parse(JSON.stringify(summary)) as JsonRecord & {\n _name_fingerprint?: string;\n };\n delete serializable._name_fingerprint;\n return serializable;\n}\n\nfunction renderZhReview(options: {\n runId: string;\n logicVersion: string;\n flowsDir: string;\n flowSummaries: JsonRecord[];\n ruleFindings: FlowRuleFinding[];\n llmFindings: FlowRuleFinding[];\n llmResult: FlowReviewLlmResult;\n mergedFindings: FlowRuleFinding[];\n summary: FlowReviewReport;\n}): string {\n const lines = [\n '# flow_review_zh\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n `- flows_dir: \\`${options.flowsDir}\\`\\n`,\n `- flow count: \\`${options.flowSummaries.length}\\`\\n`,\n '- with_reference_context: `false`\\n',\n `- methodology_rule_source: \\`${options.summary.methodology_rule_source}\\`\\n`,\n '\\n## 基础统计\\n',\n `- rule-based findings: **${options.ruleFindings.length}**\\n`,\n `- LLM findings: **${options.llmFindings.length}**\\n`,\n `- merged findings: **${options.mergedFindings.length}**\\n`,\n ];\n\n if (options.mergedFindings.length) {\n lines.push('\\n### Severity 统计\\n');\n Object.entries(options.summary.severity_counts).forEach(([key, value]) => {\n lines.push(`- ${key}: ${value}\\n`);\n });\n }\n\n lines.push(\n '\\n## Flow 摘要(最多展示 100 条)\\n',\n '|flow uuid|version|typeOfDataSet|name(en)|class leaf|flow property|规则信号数|相似候选数|\\n',\n '|---|---|---|---|---|---|---:|---:|\\n',\n );\n\n options.flowSummaries.slice(0, 100).forEach((row) => {\n const summary = row as FlowSummary;\n lines.push(\n `|${summary.flow_uuid.replace(/\\|/gu, '/')}|${summary.base_version.replace(/\\|/gu, '/')}|${summary.type_of_dataset.replace(/\\|/gu, '/')}|${summary.names.primary_en.replace(/\\|/gu, '/')}|${summary.classification.leaf.text.replace(/\\|/gu, '/')}|${coerceText(summary.flow_property.referenced_short_name_en ?? summary.flow_property.referenced_uuid).replace(/\\|/gu, '/')}|${summary.rule_signals.length}|${summary.similarity_candidates.length}|\\n`,\n );\n });\n\n lines.push('\\n## LLM 语义复审层\\n');\n if (!options.llmResult.enabled) {\n lines.push(`- 未启用:\\`${options.llmResult.reason ?? 'disabled'}\\`\\n`);\n } else if (!options.llmResult.ok) {\n lines.push(`- 调用失败:\\`${options.llmResult.reason ?? 'unknown'}\\`\\n`);\n } else if (!options.llmFindings.length) {\n lines.push('- 未返回额外语义 findings。\\n');\n } else {\n if (options.llmResult.truncated) {\n lines.push(\n `- 注意:LLM 仅复审前 \\`${options.llmResult.reviewed_flow_count}\\` 条(受 \\`--llm-max-flows\\` 限制)。\\n`,\n );\n }\n lines.push('\\n|flow uuid|severity|fixability|evidence|action|\\n|---|---|---|---|---|\\n');\n options.llmFindings.slice(0, 200).forEach((finding) => {\n lines.push(\n `|${finding.flow_uuid.replace(/\\|/gu, '/')}|${finding.severity.replace(/\\|/gu, '/')}|${coerceText(finding.fixability).replace(/\\|/gu, '/')}|${JSON.stringify(finding.evidence ?? {}).replace(/\\|/gu, '/')}|${coerceText(finding.action).replace(/\\|/gu, '/')}|\\n`,\n );\n });\n }\n\n lines.push(\n '\\n## 说明\\n',\n '- 当前 CLI 版本保持 local-first / artifact-first,不在 review flow 阶段接入 MCP。\\n',\n '- flow property / unitgroup 的额外本地 registry 丰富暂未接入 CLI,本轮 summary 中统一标记为 disabled。\\n',\n );\n\n return lines.join('');\n}\n\nfunction renderEnReview(options: {\n runId: string;\n logicVersion: string;\n flowsDir: string;\n flowCount: number;\n ruleFindingCount: number;\n llmFindingCount: number;\n llmResult: FlowReviewLlmResult;\n methodologyRuleSource: string;\n}): string {\n const lines = [\n '# flow_review_en\\n',\n `- run_id: \\`${options.runId}\\`\\n`,\n `- logic_version: \\`${options.logicVersion}\\`\\n`,\n `- flows_dir: \\`${options.flowsDir}\\`\\n`,\n `- flow count: \\`${options.flowCount}\\`\\n`,\n '- with_reference_context: `false`\\n',\n `- methodology_rule_source: \\`${options.methodologyRuleSource}\\`\\n`,\n '\\n## Summary\\n',\n `- rule-based findings: **${options.ruleFindingCount}**\\n`,\n `- llm findings: **${options.llmFindingCount}**\\n`,\n ];\n\n if (!options.llmResult.enabled) {\n lines.push(`- LLM disabled: \\`${options.llmResult.reason ?? 'disabled'}\\`\\n`);\n } else if (!options.llmResult.ok) {\n lines.push(`- LLM failed: \\`${options.llmResult.reason ?? 'unknown'}\\`\\n`);\n } else if (options.llmResult.truncated) {\n lines.push(\n `- LLM reviewed only the first \\`${options.llmResult.reviewed_flow_count}\\` flows due to \\`--llm-max-flows\\`.\\n`,\n );\n }\n\n return lines.join('');\n}\n\nfunction renderTimingReview(options: {\n runId: string;\n startTs?: string;\n endTs?: string;\n flowCount: number;\n}): string {\n const lines = ['# flow_review_timing\\n', `- run_id: \\`${options.runId}\\`\\n`];\n if (options.startTs) {\n lines.push(`- start: \\`${options.startTs}\\`\\n`);\n }\n if (options.endTs) {\n lines.push(`- end: \\`${options.endTs}\\`\\n`);\n }\n if (options.startTs && options.endTs) {\n const started = Date.parse(options.startTs);\n const ended = Date.parse(options.endTs);\n if (Number.isFinite(started) && Number.isFinite(ended)) {\n lines.push(`- total elapsed: **${((ended - started) / 60_000).toFixed(2)} min**\\n`);\n }\n }\n lines.push(`- flow files reviewed: \\`${options.flowCount}\\`\\n`);\n lines.push(\n '- major time consumers: flow JSON parsing, similarity grouping, optional LLM review batches.\\n',\n );\n return lines.join('');\n}\n\nexport async function runFlowReview(options: RunFlowReviewOptions): Promise<FlowReviewReport> {\n if (!options.outDir.trim()) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_REVIEW_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n const outDir = path.resolve(options.outDir);\n mkdirSync(outDir, { recursive: true });\n\n const resolvedInput = resolveReviewInput({\n ...options,\n outDir,\n });\n const flowFiles = listFlowFiles(resolvedInput.effectiveFlowsDir);\n if (!flowFiles.length) {\n throw new CliError(`No flow JSON files found in ${resolvedInput.effectiveFlowsDir}`, {\n code: 'FLOW_REVIEW_NO_FLOW_FILES',\n exitCode: 2,\n });\n }\n\n const methodologyRuleSource = options.methodologyId?.trim() || 'built_in';\n const ruleFindings: FlowRuleFinding[] = [];\n const flowSummaries: FlowSummary[] = [];\n\n flowFiles.forEach((filePath) => {\n const doc = readJsonObject(filePath);\n const { summary, findings } = buildFlowSummaryAndRuleFindings(doc, methodologyRuleSource);\n summary.source_file = path.basename(filePath);\n flowSummaries.push(summary);\n ruleFindings.push(...findings);\n });\n\n const similarity = buildSimilarity(flowSummaries, options.similarityThreshold ?? 0.92);\n flowSummaries.forEach((summary) => {\n summary.similarity_candidates = similarity.candidatesByFlow[summary.flow_uuid] ?? [];\n if (!summary.similarity_candidates.length) {\n return;\n }\n\n ruleFindings.push(\n createRuleFinding(\n summary.flow_uuid,\n summary.base_version,\n 'warning',\n 'same_category_high_similarity',\n 'Another flow in the same classification/flowProperty/unitgroup group is highly similar.',\n {\n fixability: 'review-needed',\n evidence: {\n candidates: summary.similarity_candidates.slice(0, 3),\n },\n },\n ),\n );\n });\n\n const llmRun = await runOptionalLlmReview(flowSummaries, {\n enableLlm: Boolean(options.enableLlm),\n llmModel: options.llmModel,\n llmMaxFlows: options.llmMaxFlows ?? 120,\n llmBatchSize: options.llmBatchSize ?? 20,\n env: options.env ?? process.env,\n fetchImpl: options.fetchImpl,\n outDir,\n runId: resolvedInput.runId,\n });\n\n const llmResult: FlowReviewLlmResult = {\n enabled: llmRun.enabled,\n ...(llmRun.ok === undefined ? {} : { ok: llmRun.ok }),\n ...(llmRun.reason ? { reason: llmRun.reason } : {}),\n batch_count: llmRun.batch_count,\n reviewed_flow_count: llmRun.reviewed_flow_count,\n truncated: llmRun.truncated,\n batch_results: llmRun.batch_results,\n };\n const mergedFindings = [...ruleFindings, ...llmRun.llmFindings];\n const rulesetGate = flowRulesetGate(ruleFindings);\n const savedSummaries = flowSummaries.map((summary) => stripInternalSummaryFields(summary));\n const now = options.now ?? (() => new Date());\n\n const reviewInputSummaryPath = path.join(outDir, 'review-input-summary.json');\n const ruleFindingsPath = path.join(outDir, 'rule_findings.jsonl');\n const llmFindingsPath = path.join(outDir, 'llm_findings.jsonl');\n const findingsPath = path.join(outDir, 'findings.jsonl');\n const rulesetGatePath = path.join(outDir, 'flow-review-ruleset-gate.json');\n const flowSummariesPath = path.join(outDir, 'flow_summaries.jsonl');\n const similarityPairsPath = path.join(outDir, 'similarity_pairs.jsonl');\n const summaryPath = path.join(outDir, 'flow_review_summary.json');\n const reviewZhPath = path.join(outDir, 'flow_review_zh.md');\n const reviewEnPath = path.join(outDir, 'flow_review_en.md');\n const timingPath = path.join(outDir, 'flow_review_timing.md');\n const reportPath = path.join(outDir, 'flow_review_report.json');\n\n writeJsonArtifact(reviewInputSummaryPath, resolvedInput.reviewInputSummary);\n writeJsonLinesArtifact(ruleFindingsPath, ruleFindings);\n writeJsonLinesArtifact(llmFindingsPath, llmRun.llmFindings);\n writeJsonLinesArtifact(findingsPath, mergedFindings);\n writeJsonArtifact(rulesetGatePath, rulesetGate);\n writeJsonLinesArtifact(flowSummariesPath, savedSummaries);\n writeJsonLinesArtifact(similarityPairsPath, similarity.pairs);\n\n const report: FlowReviewReport = {\n schema_version: 1,\n generated_at_utc: now().toISOString(),\n status: 'completed_local_flow_review',\n run_id: resolvedInput.runId,\n out_dir: outDir,\n input_mode: resolvedInput.inputMode,\n effective_flows_dir: resolvedInput.effectiveFlowsDir,\n logic_version: options.logicVersion?.trim() || 'flow-v1.0-cli',\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 flow_count: flowSummaries.length,\n similarity_threshold: options.similarityThreshold ?? 0.92,\n methodology_rule_source: methodologyRuleSource,\n with_reference_context: false,\n reference_context_mode: 'disabled',\n rule_finding_count: ruleFindings.length,\n llm_finding_count: llmRun.llmFindings.length,\n finding_count: mergedFindings.length,\n blocker_count: rulesetGate.counts.blockers,\n severity_counts: severityCounts(mergedFindings),\n rule_counts: ruleCounts(ruleFindings),\n methodology_rule_counts: methodologyRuleCounts(ruleFindings),\n ruleset_gate: rulesetGate,\n llm: llmResult,\n files: {\n review_input_summary: reviewInputSummaryPath,\n materialization_summary: resolvedInput.materializationSummaryPath,\n rule_findings: ruleFindingsPath,\n llm_findings: llmFindingsPath,\n findings: findingsPath,\n ruleset_gate: rulesetGatePath,\n flow_summaries: flowSummariesPath,\n similarity_pairs: similarityPairsPath,\n summary: summaryPath,\n review_zh: reviewZhPath,\n review_en: reviewEnPath,\n timing: timingPath,\n report: reportPath,\n },\n };\n\n writeJsonArtifact(summaryPath, {\n run_id: report.run_id,\n logic_version: report.logic_version,\n flow_count: report.flow_count,\n with_reference_context: report.with_reference_context,\n reference_context_mode: report.reference_context_mode,\n similarity_threshold: report.similarity_threshold,\n methodology_rule_source: report.methodology_rule_source,\n ruleset_id: report.ruleset_id,\n ruleset_version: report.ruleset_version,\n ruleset_source_version: report.ruleset_source_version,\n ruleset_rule_ids: report.ruleset_rule_ids,\n ruleset_gate: report.ruleset_gate,\n rule_finding_count: report.rule_finding_count,\n llm_finding_count: report.llm_finding_count,\n finding_count: report.finding_count,\n severity_counts: report.severity_counts,\n rule_counts: report.rule_counts,\n methodology_rule_counts: report.methodology_rule_counts,\n llm: report.llm,\n });\n writeTextArtifact(\n reviewZhPath,\n renderZhReview({\n runId: report.run_id,\n logicVersion: report.logic_version,\n flowsDir: report.effective_flows_dir,\n flowSummaries: savedSummaries,\n ruleFindings,\n llmFindings: llmRun.llmFindings,\n llmResult,\n mergedFindings,\n summary: report,\n }),\n );\n writeTextArtifact(\n reviewEnPath,\n renderEnReview({\n runId: report.run_id,\n logicVersion: report.logic_version,\n flowsDir: report.effective_flows_dir,\n flowCount: report.flow_count,\n ruleFindingCount: report.rule_finding_count,\n llmFindingCount: report.llm_finding_count,\n llmResult,\n methodologyRuleSource: report.methodology_rule_source,\n }),\n );\n writeTextArtifact(\n timingPath,\n renderTimingReview({\n runId: report.run_id,\n startTs: options.startTs,\n endTs: options.endTs,\n flowCount: report.flow_count,\n }),\n );\n writeJsonArtifact(reportPath, report);\n\n return report;\n}\n\nexport const __testInternals = {\n applyMethodologyChecks,\n buildFlowSummaryAndRuleFindings,\n buildSimilarity,\n buildLlmPrompt,\n classificationLeaf,\n computeSimilarity,\n createRuleFinding,\n findUuidInNode,\n flowRoot,\n langTextForLang,\n listFlowFiles,\n materializeRowsFile,\n nameFingerprint,\n normalizeLlmFinding,\n parseLlmJsonOutput,\n readJsonObject,\n renderEnReview,\n renderTimingReview,\n renderZhReview,\n resolveReviewInput,\n runOptionalLlmReview,\n flowRulesetGate,\n methodologyRuleCounts,\n ruleCounts,\n severityCounts,\n walkStrings,\n};\n"]}