@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.
@@ -374,7 +374,7 @@ function buildFlowSummaryAndRuleFindings(doc, methodologyRuleSource) {
374
374
  findings.push(createRuleFinding(flowUuidValue, baseVersion, 'error', 'missing_type_of_dataset', 'typeOfDataSet is missing under modellingAndValidation.LCIMethod.'));
375
375
  }
376
376
  else if (typeOfDataset.toLowerCase() === 'elementary flow') {
377
- findings.push(createRuleFinding(flowUuidValue, baseVersion, 'warning', 'elementary_flow_in_flow_review', 'Flow type is Elementary flow; check whether this batch should exclude it.', {
377
+ findings.push(createRuleFinding(flowUuidValue, baseVersion, 'warning', 'elementary_flow_in_flow_qa', 'Flow type is Elementary flow; check whether this batch should exclude it.', {
378
378
  fixability: 'review-needed',
379
379
  evidence: {
380
380
  typeOfDataSet: typeOfDataset,
@@ -623,7 +623,7 @@ async function runOptionalLlmReview(summaries, options) {
623
623
  timeoutMs: 45_000,
624
624
  cacheDir: path.join(options.outDir, '.llm-cache'),
625
625
  tracePath: path.join(options.outDir, 'llm-trace.jsonl'),
626
- module: 'review-flow',
626
+ module: 'flow-qa',
627
627
  stage: `semantic-review-${index + 1}`,
628
628
  runId: options.runId,
629
629
  });
@@ -723,7 +723,7 @@ function readJsonObject(filePath) {
723
723
  const parsed = JSON.parse(readFileSync(filePath, 'utf8'));
724
724
  if (!isRecord(parsed)) {
725
725
  throw new CliError(`Expected JSON object in flow file: ${filePath}`, {
726
- code: 'FLOW_REVIEW_INVALID_FLOW_FILE',
726
+ code: 'FLOW_QA_INVALID_FLOW_FILE',
727
727
  exitCode: 2,
728
728
  });
729
729
  }
@@ -734,7 +734,7 @@ function readJsonObject(filePath) {
734
734
  throw error;
735
735
  }
736
736
  throw new CliError(`Invalid flow JSON file: ${filePath}`, {
737
- code: 'FLOW_REVIEW_INVALID_FLOW_FILE',
737
+ code: 'FLOW_QA_INVALID_FLOW_FILE',
738
738
  exitCode: 2,
739
739
  details: String(error),
740
740
  });
@@ -742,7 +742,7 @@ function readJsonObject(filePath) {
742
742
  }
743
743
  function materializeRowsFile(rowsFile, outDir) {
744
744
  const rows = loadRowsFromFile(rowsFile);
745
- const targetDir = path.join(outDir, 'review-input', 'flows');
745
+ const targetDir = path.join(outDir, 'qa-input', 'flows');
746
746
  mkdirSync(targetDir, { recursive: true });
747
747
  const byKey = {};
748
748
  let duplicateCount = 0;
@@ -772,7 +772,7 @@ function materializeRowsFile(rowsFile, outDir) {
772
772
  file: filePath,
773
773
  });
774
774
  });
775
- const summaryPath = path.join(outDir, 'review-input', 'materialization-summary.json');
775
+ const summaryPath = path.join(outDir, 'qa-input', 'materialization-summary.json');
776
776
  writeJsonArtifact(summaryPath, {
777
777
  source_rows_file: path.resolve(rowsFile),
778
778
  input_row_count: rows.length,
@@ -793,8 +793,8 @@ function resolveReviewInput(options) {
793
793
  Boolean(options.runRoot),
794
794
  ].filter(Boolean);
795
795
  if (declaredModes.length !== 1) {
796
- throw new CliError('Flow review requires exactly one of --rows-file, --flows-dir, or --run-root.', {
797
- code: 'FLOW_REVIEW_INPUT_MODE_REQUIRED',
796
+ throw new CliError('Flow QA requires exactly one of --rows-file, --flows-dir, or --run-root.', {
797
+ code: 'FLOW_QA_INPUT_MODE_REQUIRED',
798
798
  exitCode: 2,
799
799
  });
800
800
  }
@@ -852,8 +852,8 @@ function resolveReviewInput(options) {
852
852
  }
853
853
  function listFlowFiles(flowsDir) {
854
854
  if (!existsSync(flowsDir) || !statSync(flowsDir).isDirectory()) {
855
- throw new CliError(`Flow review directory not found: ${flowsDir}`, {
856
- code: 'FLOW_REVIEW_DIR_NOT_FOUND',
855
+ throw new CliError(`Flow QA directory not found: ${flowsDir}`, {
856
+ code: 'FLOW_QA_DIR_NOT_FOUND',
857
857
  exitCode: 2,
858
858
  });
859
859
  }
@@ -870,7 +870,7 @@ function stripInternalSummaryFields(summary) {
870
870
  }
871
871
  function renderZhReview(options) {
872
872
  const lines = [
873
- '# flow_review_zh\n',
873
+ '# flow_qa_zh\n',
874
874
  `- run_id: \`${options.runId}\`\n`,
875
875
  `- logic_version: \`${options.logicVersion}\`\n`,
876
876
  `- flows_dir: \`${options.flowsDir}\`\n`,
@@ -912,12 +912,12 @@ function renderZhReview(options) {
912
912
  lines.push(`|${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`);
913
913
  });
914
914
  }
915
- lines.push('\n## 说明\n', '- 当前 CLI 版本保持 local-first / artifact-first,不在 review flow 阶段接入 MCP。\n', '- flow property / unitgroup 的额外本地 registry 丰富暂未接入 CLI,本轮 summary 中统一标记为 disabled。\n');
915
+ lines.push('\n## 说明\n', '- 当前 CLI 版本保持 local-first / artifact-first,不在 qa flow 阶段接入 MCP。\n', '- flow property / unitgroup 的额外本地 registry 丰富暂未接入 CLI,本轮 summary 中统一标记为 disabled。\n');
916
916
  return lines.join('');
917
917
  }
918
918
  function renderEnReview(options) {
919
919
  const lines = [
920
- '# flow_review_en\n',
920
+ '# flow_qa_en\n',
921
921
  `- run_id: \`${options.runId}\`\n`,
922
922
  `- logic_version: \`${options.logicVersion}\`\n`,
923
923
  `- flows_dir: \`${options.flowsDir}\`\n`,
@@ -940,7 +940,7 @@ function renderEnReview(options) {
940
940
  return lines.join('');
941
941
  }
942
942
  function renderTimingReview(options) {
943
- const lines = ['# flow_review_timing\n', `- run_id: \`${options.runId}\`\n`];
943
+ const lines = ['# flow_qa_timing\n', `- run_id: \`${options.runId}\`\n`];
944
944
  if (options.startTs) {
945
945
  lines.push(`- start: \`${options.startTs}\`\n`);
946
946
  }
@@ -958,10 +958,10 @@ function renderTimingReview(options) {
958
958
  lines.push('- major time consumers: flow JSON parsing, similarity grouping, optional LLM review batches.\n');
959
959
  return lines.join('');
960
960
  }
961
- export async function runFlowReview(options) {
961
+ export async function runFlowQa(options) {
962
962
  if (!options.outDir.trim()) {
963
963
  throw new CliError('Missing required --out-dir value.', {
964
- code: 'FLOW_REVIEW_OUT_DIR_REQUIRED',
964
+ code: 'FLOW_QA_OUT_DIR_REQUIRED',
965
965
  exitCode: 2,
966
966
  });
967
967
  }
@@ -974,7 +974,7 @@ export async function runFlowReview(options) {
974
974
  const flowFiles = listFlowFiles(resolvedInput.effectiveFlowsDir);
975
975
  if (!flowFiles.length) {
976
976
  throw new CliError(`No flow JSON files found in ${resolvedInput.effectiveFlowsDir}`, {
977
- code: 'FLOW_REVIEW_NO_FLOW_FILES',
977
+ code: 'FLOW_QA_NO_FLOW_FILES',
978
978
  exitCode: 2,
979
979
  });
980
980
  }
@@ -1024,18 +1024,18 @@ export async function runFlowReview(options) {
1024
1024
  const rulesetGate = flowRulesetGate(ruleFindings);
1025
1025
  const savedSummaries = flowSummaries.map((summary) => stripInternalSummaryFields(summary));
1026
1026
  const now = options.now ?? (() => new Date());
1027
- const reviewInputSummaryPath = path.join(outDir, 'review-input-summary.json');
1027
+ const reviewInputSummaryPath = path.join(outDir, 'qa-input-summary.json');
1028
1028
  const ruleFindingsPath = path.join(outDir, 'rule_findings.jsonl');
1029
1029
  const llmFindingsPath = path.join(outDir, 'llm_findings.jsonl');
1030
1030
  const findingsPath = path.join(outDir, 'findings.jsonl');
1031
- const rulesetGatePath = path.join(outDir, 'flow-review-ruleset-gate.json');
1031
+ const rulesetGatePath = path.join(outDir, 'flow-qa-ruleset-gate.json');
1032
1032
  const flowSummariesPath = path.join(outDir, 'flow_summaries.jsonl');
1033
1033
  const similarityPairsPath = path.join(outDir, 'similarity_pairs.jsonl');
1034
- const summaryPath = path.join(outDir, 'flow_review_summary.json');
1035
- const reviewZhPath = path.join(outDir, 'flow_review_zh.md');
1036
- const reviewEnPath = path.join(outDir, 'flow_review_en.md');
1037
- const timingPath = path.join(outDir, 'flow_review_timing.md');
1038
- const reportPath = path.join(outDir, 'flow_review_report.json');
1034
+ const summaryPath = path.join(outDir, 'flow_qa_summary.json');
1035
+ const reviewZhPath = path.join(outDir, 'flow_qa_zh.md');
1036
+ const reviewEnPath = path.join(outDir, 'flow_qa_en.md');
1037
+ const timingPath = path.join(outDir, 'flow_qa_timing.md');
1038
+ const reportPath = path.join(outDir, 'flow_qa_report.json');
1039
1039
  writeJsonArtifact(reviewInputSummaryPath, resolvedInput.reviewInputSummary);
1040
1040
  writeJsonLinesArtifact(ruleFindingsPath, ruleFindings);
1041
1041
  writeJsonLinesArtifact(llmFindingsPath, llmRun.llmFindings);
@@ -1046,7 +1046,7 @@ export async function runFlowReview(options) {
1046
1046
  const report = {
1047
1047
  schema_version: 1,
1048
1048
  generated_at_utc: now().toISOString(),
1049
- status: 'completed_local_flow_review',
1049
+ status: 'completed_local_flow_qa',
1050
1050
  run_id: resolvedInput.runId,
1051
1051
  out_dir: outDir,
1052
1052
  input_mode: resolvedInput.inputMode,
@@ -1071,7 +1071,7 @@ export async function runFlowReview(options) {
1071
1071
  ruleset_gate: rulesetGate,
1072
1072
  llm: llmResult,
1073
1073
  files: {
1074
- review_input_summary: reviewInputSummaryPath,
1074
+ qa_input_summary: reviewInputSummaryPath,
1075
1075
  materialization_summary: resolvedInput.materializationSummaryPath,
1076
1076
  rule_findings: ruleFindingsPath,
1077
1077
  llm_findings: llmFindingsPath,
@@ -1080,8 +1080,8 @@ export async function runFlowReview(options) {
1080
1080
  flow_summaries: flowSummariesPath,
1081
1081
  similarity_pairs: similarityPairsPath,
1082
1082
  summary: summaryPath,
1083
- review_zh: reviewZhPath,
1084
- review_en: reviewEnPath,
1083
+ qa_zh: reviewZhPath,
1084
+ qa_en: reviewEnPath,
1085
1085
  timing: timingPath,
1086
1086
  report: reportPath,
1087
1087
  },
@@ -1165,4 +1165,4 @@ export const __testInternals = {
1165
1165
  severityCounts,
1166
1166
  walkStrings,
1167
1167
  };
1168
- //# sourceMappingURL=review-flow.js.map
1168
+ //# sourceMappingURL=flow-qa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-qa.js","sourceRoot":"","sources":["../../../src/lib/flow-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 {\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 FlowQaLlmBatchResult = {\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 FlowQaLlmResult = {\n enabled: boolean;\n ok?: boolean;\n reason?: string;\n batch_count: number;\n reviewed_flow_count: number;\n truncated: boolean;\n batch_results: FlowQaLlmBatchResult[];\n};\n\ntype FlowQaLlmRunResult = FlowQaLlmResult & {\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 FlowQaReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'completed_local_flow_qa';\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: FlowQaLlmResult;\n files: {\n qa_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 qa_zh: string;\n qa_en: string;\n timing: string;\n report: string;\n };\n};\n\nexport type RunFlowQaOptions = {\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_qa',\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<FlowQaLlmRunResult> {\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: FlowQaLlmBatchResult[] = [];\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: 'flow-qa',\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_QA_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_QA_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, 'qa-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, 'qa-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: RunFlowQaOptions): {\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('Flow QA requires exactly one of --rows-file, --flows-dir, or --run-root.', {\n code: 'FLOW_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 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 QA directory not found: ${flowsDir}`, {\n code: 'FLOW_QA_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: FlowQaLlmResult;\n mergedFindings: FlowRuleFinding[];\n summary: FlowQaReport;\n}): string {\n const lines = [\n '# flow_qa_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,不在 qa 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: FlowQaLlmResult;\n methodologyRuleSource: string;\n}): string {\n const lines = [\n '# flow_qa_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_qa_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 runFlowQa(options: RunFlowQaOptions): Promise<FlowQaReport> {\n if (!options.outDir.trim()) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_QA_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_QA_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: FlowQaLlmResult = {\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, 'qa-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-qa-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_qa_summary.json');\n const reviewZhPath = path.join(outDir, 'flow_qa_zh.md');\n const reviewEnPath = path.join(outDir, 'flow_qa_en.md');\n const timingPath = path.join(outDir, 'flow_qa_timing.md');\n const reportPath = path.join(outDir, 'flow_qa_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: FlowQaReport = {\n schema_version: 1,\n generated_at_utc: now().toISOString(),\n status: 'completed_local_flow_qa',\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 qa_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 qa_zh: reviewZhPath,\n qa_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"]}