$ErrorActionPreference = 'Stop'
|
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
|
|
$caseId = 'ANA-ROBOT-INDUSTRY-001'
|
$runId = 'RUN-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001'
|
$batchId = 'BATCH-ANA-ROBOT-MIGRATION-001'
|
$base = 'ana-data/cases/机器人案例/ANA-ROBOT-INDUSTRY-001'
|
$evidenceDir = Join-Path $base 'evidence'
|
$manifestDir = Join-Path $base 'manifest'
|
$outputCoreDir = Join-Path $base 'outputs/核心文档'
|
$suppDir = 'ana-data/cases/机器人案例/supplement/threepiece_source_trace_20260705'
|
$resultIndex = 'ana-data/result/机器人案例/ANA-ROBOT-INDUSTRY-001/result_index.md'
|
$logPath = 'ana-doc/机器人案例/案例执行日志.md'
|
$remainingPath = Join-Path $manifestDir 'remaining_work_plan_20260704.md'
|
$reviewPath = Join-Path $manifestDir 'review_request_threepiece_actual_source_trace_20260705.md'
|
$publicManifestPath = Join-Path $evidenceDir 'threepiece_public_source_snapshot_manifest_20260705.csv'
|
$traceEvidencePath = Join-Path $evidenceDir 'threepiece_actual_source_trace_evidence_20260705.csv'
|
$gapPath = Join-Path $evidenceDir 'threepiece_actual_source_gap_retained_20260705.csv'
|
$summaryPath = Join-Path $evidenceDir 'threepiece_actual_source_trace_summary_20260705.json'
|
|
function RelPath([string]$path) {
|
$full = [System.IO.Path]::GetFullPath((Join-Path (Get-Location) $path))
|
$root = [System.IO.Path]::GetFullPath((Get-Location).Path)
|
return $full.Substring($root.Length + 1).Replace('\','/')
|
}
|
|
function FileMeta([string]$path) {
|
if (Test-Path -LiteralPath $path) {
|
$item = Get-Item -LiteralPath $path
|
$hash = (Get-FileHash -Algorithm SHA256 -LiteralPath $path).Hash.ToLowerInvariant()
|
[pscustomobject]@{
|
exists = $true
|
bytes = $item.Length
|
mtime = $item.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ssK')
|
sha256 = $hash
|
rel = (RelPath $path)
|
}
|
} else {
|
[pscustomobject]@{
|
exists = $false
|
bytes = 0
|
mtime = ''
|
sha256 = ''
|
rel = (RelPath $path)
|
}
|
}
|
}
|
|
function Write-Utf8([string]$path, [string]$text) {
|
[System.IO.File]::WriteAllText((Join-Path (Get-Location) $path), $text, $utf8NoBom)
|
}
|
|
$ifrPressPath = Join-Path $suppDir 'WEB-IFR-2025-PRESS.html'
|
$ifrPdfPath = Join-Path $suppDir 'WEB-IFR-2025-EXEC-PDF.pdf'
|
$ifrPress = FileMeta $ifrPressPath
|
$ifrPdf = FileMeta $ifrPdfPath
|
|
$publicRows = @(
|
[pscustomobject]@{source_id='WEB-IFR-2025-PRESS';source_type='PUBLIC_OFFICIAL_WEB_SNAPSHOT';source_owner='International Federation of Robotics';source_title='World Robotics 2025 Report press release';source_url='https://ifr.org/ifr-press-releases/news/global-robot-demand-in-factories-doubles-over-10-years';local_path=$ifrPress.rel;fetch_status=$(if($ifrPress.exists){'FETCHED_LOCAL_HTML_SNAPSHOT'}else{'FETCH_FAILED_OR_NOT_AVAILABLE'});sha256=$ifrPress.sha256;bytes=$ifrPress.bytes;evidence_use='仅用于全球工业机器人 2024 装机量/存量趋势的官方线索;不得外推到统一市场规模或公司收入';conclusion_boundary='LIMITED_PUBLIC_OFFICIAL_MARKET_LINE_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{source_id='WEB-IFR-2025-EXEC-PDF';source_type='PUBLIC_OFFICIAL_PDF_SNAPSHOT';source_owner='International Federation of Robotics';source_title='World Robotics 2025 Industrial Robots Executive Summary';source_url='https://ifr.org/img/worldrobotics/Executive_Summary_WR_2025_Industrial_Robots.pdf';local_path=$ifrPdf.rel;fetch_status=$(if($ifrPdf.exists){'FETCHED_LOCAL_PDF_SNAPSHOT'}else{'FETCH_FAILED_OR_NOT_AVAILABLE'});sha256=$ifrPdf.sha256;bytes=$ifrPdf.bytes;evidence_use='仅作为 IFR 官方执行摘要快照入口;若引用页码/表格需后续页码级抽取';conclusion_boundary='OFFICIAL_PDF_AVAILABLE_PAGE_EXTRACT_PENDING_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{source_id='WEB-MIR-2025-COBOT-PUBLIC-ENTRY';source_type='PUBLIC_ARTICLE_OR_MIRROR_FETCH_TIMEOUT';source_owner='MIR 睿工业 / public entry';source_title='2025年全球协作机器人产业发展白皮书公开入口';source_url='https://www.siarexpo.com/news/show-1553.html';local_path='';fetch_status='FETCH_TIMEOUT_NO_VERIFIED_LOCAL_SNAPSHOT';sha256='';bytes=0;evidence_use='仅登记为待补原始报告/白皮书来源,不能作为已核验 primary source';conclusion_boundary='MIR_SOURCE_LOCATION_PENDING_ORIGINAL_REPORT_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{source_id='WEB-OMDIA-2024-HUMANOID-PRESS';source_type='PUBLIC_OFFICIAL_URL_REGISTERED_NOT_FETCHED';source_owner='Omdia';source_title='Omdia humanoid robot shipments forecast press release';source_url='https://omdia.tech.informa.com/pr/2024/jul/omdia-global-humanoid-robot-shipments-to-exceed-10000-units-by-2027-and-reach-38000-units-in-2030';local_path='';fetch_status='URL_REGISTERED_FETCH_NOT_COMPLETED_IN_THIS_RUN';sha256='';bytes=0;evidence_use='仅登记 Omdia 官方预测口径入口,未形成本地快照,不能替代报告页码/定义';conclusion_boundary='PUBLIC_OFFICIAL_URL_REGISTERED_SOURCE_SNAPSHOT_PENDING_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{source_id='WEB-AGIBOT-OMDIA-2026-CITE';source_type='SECONDARY_COMPANY_RELEASE_CITING_OMDIA';source_owner='智元机器人 / Agibot';source_title='公司新闻引用 Omdia 2026 人形机器人报告';source_url='https://www.agibot.com/article/231/detail/33.html';local_path='';fetch_status='URL_REGISTERED_SECONDARY_SOURCE_NOT_FETCHED';sha256='';bytes=0;evidence_use='仅作为二级线索,不作为 Omdia 原始报告或强字段升级依据';conclusion_boundary='SECONDARY_CITATION_ONLY_NOT_PRIMARY_SOURCE_NOT_OUTPUT_PASS'}
|
)
|
$publicRows | Export-Csv -LiteralPath $publicManifestPath -NoTypeInformation -Encoding UTF8
|
|
$rows = @(
|
[pscustomobject]@{trace_id='TP-AST-20260705-001';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-001';linked_plan_id='TP-TRACE-INDEX-STATUS';artifact='机器人报告索引.md';field_group='status_index|batch_scope';evidence_layer='GOVERNANCE_TRACE';source_type='PROJECT_MANIFEST';source_title='共享入口和批次状态索引';source_path_or_url='result_index.md; artifact_manifest.csv';evidence_location='result_index 顶部状态;artifact_manifest 最新 run 归属';evidence_value_or_note='仅验证共享入口状态和 hash 归属,不产生市场或公司事实结论';verification_result='GOVERNANCE_TRACE_VERIFIED_NOT_FACT_CONCLUSION';conclusion_strength_after_trace='INDEX_STATUS_ONLY_NOT_FACT_CONCLUSION';gap_id='ROBOT-GAP-INDEX-STATUS-001';impact_scope='单一输出包冻结归属';next_required_action='输出包送审时重新声明共享入口归属并复算 hash';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{trace_id='TP-AST-20260705-002';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-002';linked_plan_id='TP-TRACE-20260705-001';artifact='机器人的市场情况总览.md';field_group='market_size|shipment|penetration|share';evidence_layer='PUBLIC_OFFICIAL_SOURCE_SNAPSHOT';source_type='IFR_OFFICIAL';source_title='IFR World Robotics 2025 press release and executive summary';source_path_or_url='WEB-IFR-2025-PRESS.html; WEB-IFR-2025-EXEC-PDF.pdf';evidence_location='IFR 2025 press release / executive summary snapshot';evidence_value_or_note='可支持全球工业机器人 2024 新装机和存量趋势的有限官方线索;未完成页码级抽取';verification_result='LIMITED_PUBLIC_OFFICIAL_MARKET_LINE_SUPPORTED';conclusion_strength_after_trace='OFFICIAL_SOURCE_SUPPORTS_LIMITED_LINE_PAGE_EXTRACT_PENDING_NOT_OUTPUT_PASS';gap_id='ROBOT-GAP-MARKET-001';impact_scope='工业机器人全球趋势线';next_required_action='如进入输出通过,补 IFR PDF 页码级抽取和定义字段';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{trace_id='TP-AST-20260705-003';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-002';linked_plan_id='TP-TRACE-20260705-001';artifact='机器人的市场情况总览.md';field_group='market_size|shipment|penetration|share';evidence_layer='ARCHIVED_RESEARCH_SOURCE_LOCATION';source_type='LOCAL_ARCHIVED_RESEARCH';source_title='机器人市场梳理结果.md';source_path_or_url='ana-data/cases/机器人案例/raw/existing_research/机器人市场梳理结果.md';evidence_location='lines 50-64 关键市场数据看板';evidence_value_or_note='本地研报整理覆盖 IFR/MIR/GGII/Omdia/弗若斯特沙利文等口径,但未逐项提供原始表格、页码、定义和币种';verification_result='SOURCE_LOCATION_ONLY_NOT_VERIFIED_CONCLUSION';conclusion_strength_after_trace='RESEARCH_SOURCE_LOCATION_RETAINED_GAP_NOT_OUTPUT_PASS';gap_id='ROBOT-GAP-MARKET-001';impact_scope='市场规模、出货、渗透率、份额';next_required_action='逐项补原始报告页码、截图或官方快照,按机构分账,不合并成统一市场规模';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{trace_id='TP-AST-20260705-004';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-003';linked_plan_id='TP-TRACE-20260705-001';artifact='机器人的市场情况总览.md';field_group='shipment|share|regional_market';evidence_layer='PUBLIC_SOURCE_REGISTERED_PENDING_SNAPSHOT';source_type='MIR_PUBLIC_ENTRY';source_title='MIR 协作机器人白皮书公开入口';source_path_or_url='threepiece_public_source_snapshot_manifest_20260705.csv#WEB-MIR-2025-COBOT-PUBLIC-ENTRY';evidence_location='public source manifest row WEB-MIR-2025-COBOT-PUBLIC-ENTRY';evidence_value_or_note='本轮未取得可复核本地快照;协作机器人销量/份额继续保留为待补原始报告口径';verification_result='FETCH_TIMEOUT_ORIGINAL_REPORT_PENDING';conclusion_strength_after_trace='SOURCE_REGISTERED_NOT_VERIFIED_NOT_OUTPUT_PASS';gap_id='ROBOT-GAP-MARKET-002';impact_scope='协作机器人销量、区域份额、增长率';next_required_action='补 MIR 原始白皮书、发布页、页码/表格或人工下载回执';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{trace_id='TP-AST-20260705-005';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-004';linked_plan_id='TP-TRACE-20260705-004';artifact='机器人的市场情况总览.md';field_group='shipment|company_share|customer_supply';evidence_layer='ARCHIVED_RESEARCH_SOURCE_LOCATION';source_type='LOCAL_ARCHIVED_RESEARCH';source_title='机器人市场梳理结果.md + AMR调度与群控运维市场深度梳理结果.md';source_path_or_url='机器人市场梳理结果.md; AMR调度与群控运维市场深度梳理结果.md';evidence_location='市场总览 lines 59, 202, 211-212;AMR 市场文档 lines 10-14, 110-119';evidence_value_or_note='AMR/AGV 出货和项目收费为本地整理线索,未补联盟/Interact Analysis 原始表格、客户项目金额和部署台数';verification_result='SOURCE_LOCATION_ONLY_NOT_VERIFIED_CONCLUSION';conclusion_strength_after_trace='RESEARCH_SOURCE_LOCATION_RETAINED_GAP_NOT_OUTPUT_PASS';gap_id='ROBOT-GAP-MARKET-003';impact_scope='AMR/AGV 出货、客户供货、软件收费';next_required_action='补移动机器人联盟、Interact Analysis、招投标或客户案例原始入口';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{trace_id='TP-AST-20260705-006';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-005';linked_plan_id='TP-TRACE-20260705-001';artifact='机器人的市场情况总览.md';field_group='market_size|shipment|asp_price|penetration';evidence_layer='PUBLIC_OFFICIAL_URL_REGISTERED_AND_SECONDARY_CITATION';source_type='OMDIA_URL_AND_SECONDARY_CITATION';source_title='Omdia humanoid forecast press entry and Agibot secondary citation';source_path_or_url='threepiece_public_source_snapshot_manifest_20260705.csv#WEB-OMDIA-2024-HUMANOID-PRESS; #WEB-AGIBOT-OMDIA-2026-CITE';evidence_location='public source manifest rows WEB-OMDIA-2024-HUMANOID-PRESS and WEB-AGIBOT-OMDIA-2026-CITE';evidence_value_or_note='Omdia 官方 URL 已登记但未形成快照;智元新闻只是引用 Omdia 的二级来源;不升级人形出货强字段';verification_result='URL_REGISTERED_SOURCE_SNAPSHOT_PENDING_SECONDARY_CITATION_ONLY';conclusion_strength_after_trace='SOURCE_REGISTERED_NOT_VERIFIED_NOT_OUTPUT_PASS';gap_id='ROBOT-GAP-MARKET-004';impact_scope='人形机器人出货、市场规模、渗透率、ASP';next_required_action='补 Omdia 原始报告、官方快照、定义说明和是否含测试机字段';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{trace_id='TP-AST-20260705-007';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-006';linked_plan_id='TP-TRACE-20260705-002';artifact='机器人的市场情况总览.md';field_group='asp_price|bom|contract_price';evidence_layer='ARCHIVED_RESEARCH_SOURCE_LOCATION';source_type='LOCAL_ARCHIVED_RESEARCH';source_title='机器人市场梳理结果.md';source_path_or_url='机器人市场梳理结果.md';evidence_location='lines 168-178, 202';evidence_value_or_note='价格带与 ASP 已分层,但官方价、渠道价、招投标、研报 BOM 和合同 ASP 仍未逐样本核验';verification_result='SOURCE_LOCATION_ONLY_NOT_VERIFIED_CONCLUSION';conclusion_strength_after_trace='PRICE_FRAMEWORK_ONLY_NOT_ASP_FACT_CONCLUSION';gap_id='ROBOT-GAP-PRODUCT-001';impact_scope='ASP、BOM、合同价格';next_required_action='逐样本补产品页、商城、招投标、合同或公司披露字段';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{trace_id='TP-AST-20260705-008';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-007';linked_plan_id='TP-TRACE-20260705-003';artifact='机器人的产业链总览.md';field_group='revenue|shipment|customer_supply|capacity_cycle';evidence_layer='ARCHIVED_RESEARCH_SOURCE_LOCATION';source_type='LOCAL_ARCHIVED_RESEARCH';source_title='机器人产业链梳理结果.md';source_path_or_url='机器人产业链梳理结果.md';evidence_location='lines 25-36, 41-50';evidence_value_or_note='产业链骨架和价值流可作为分析框架;收入、销量、客户、产能仍需公司公告、年报或客户侧证据';verification_result='ANALYTICAL_FRAMEWORK_RETAINED_NOT_FACT_VERIFIED';conclusion_strength_after_trace='FRAMEWORK_ONLY_STRONG_FIELDS_RETAINED_AS_GAP';gap_id='ROBOT-GAP-CHAIN-001';impact_scope='总体结论、产业链全景、价值流';next_required_action='补公司级 primary source 和客户侧证据后再考虑输出通过';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{trace_id='TP-AST-20260705-009';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-008';linked_plan_id='TP-TRACE-20260705-005';artifact='机器人的产业链总览.md';field_group='asp_price|customer_supply|capacity|lifetime|yield';evidence_layer='ARCHIVED_RESEARCH_SOURCE_LOCATION';source_type='LOCAL_ARCHIVED_RESEARCH';source_title='机器人产业链梳理结果.md';source_path_or_url='机器人产业链梳理结果.md';evidence_location='lines 68-78, 157-161';evidence_value_or_note='核心零部件价值链、寿命、良率、ASP、产能均为待补证框架,未具备型号/客户/批量级证据';verification_result='SOURCE_LOCATION_ONLY_NOT_VERIFIED_CONCLUSION';conclusion_strength_after_trace='COMPONENT_FRAMEWORK_ONLY_NOT_STRONG_FIELD_CONCLUSION';gap_id='ROBOT-GAP-PRODUCT-002';impact_scope='核心零部件与模组、成本与利润池';next_required_action='补型号级官方披露、客户认证、产能/良率/寿命测试或研报页码';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{trace_id='TP-AST-20260705-010';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-009';linked_plan_id='TP-TRACE-20260705-004';artifact='机器人的产业链总览.md';field_group='supply_stage|designation|main_supply|exclusive_supply';evidence_layer='ARCHIVED_RESEARCH_SOURCE_LOCATION';source_type='LOCAL_ARCHIVED_RESEARCH';source_title='机器人产业链梳理结果.md';source_path_or_url='机器人产业链梳理结果.md';evidence_location='lines 122-125';evidence_value_or_note='供应链阶段和主供/独供判断仍为研报或分析框架线索,未取得客户侧或公告级确认';verification_result='BOUNDARY_DEFINITION_NOT_VERIFIED_COMPANY_CONCLUSION';conclusion_strength_after_trace='SUPPLY_STAGE_FRAMEWORK_ONLY_MAIN_SUPPLY_NOT_VERIFIED';gap_id='ROBOT-GAP-SUPPLY-001';impact_scope='送样、定点、小批量、主供/独供';next_required_action='补客户公告、供应商公告、招投标/合同或正式定点证明';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{trace_id='TP-AST-20260705-011';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-010';linked_plan_id='TP-TRACE-20260705-004';artifact='机器人的产业链总览.md';field_group='company_category|voice_power|customer_supply';evidence_layer='ARCHIVED_RESEARCH_SOURCE_LOCATION';source_type='LOCAL_ARCHIVED_RESEARCH';source_title='机器人产业链梳理结果.md';source_path_or_url='机器人产业链梳理结果.md';evidence_location='lines 122-125, 127-140';evidence_value_or_note='公司类型、话语权、硬字段线索可作为候选分析维度;不等同于公司池确认或客户供应事实';verification_result='ANALYTICAL_CLASSIFICATION_ONLY_NOT_VERIFIED_CONCLUSION';conclusion_strength_after_trace='CLASSIFICATION_FRAMEWORK_ONLY_NOT_COMPANY_FACT';gap_id='ROBOT-GAP-COMPANY-001';impact_scope='公司分类、话语权和客户供应';next_required_action='与公司页事实层、primary source 快照和候选池复审联动';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{trace_id='TP-AST-20260705-012';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-011';linked_plan_id='TP-TRACE-20260705-003';artifact='机器人的产业链总览.md';field_group='revenue|shipment|margin|capacity|customer_supply|asp_price';evidence_layer='CANDIDATE_FACT_EXECUTION_REFERENCE';source_type='PROJECT_EVIDENCE_TABLE';source_title='首批9和第二批核心7字段降读/事实层';source_path_or_url='first_batch9_field_downgrade_scope_20260705.csv; candidate_fact_execution_version_second_batch_core8_20260704.csv';evidence_location='首批9 81 行字段降读;核心8 72 行候选事实执行版';evidence_value_or_note='公司页已建立字段级降读和候选事实层,但强字段仍以缺口/待核验为准,英搏尔仍降级';verification_result='PROJECT_FACT_LAYER_EXISTS_STRONG_FIELDS_DOWNGRADED';conclusion_strength_after_trace='FACT_LAYER_LOCATION_ONLY_NO_STRONG_FIELD_UPGRADE';gap_id='ROBOT-GAP-COMPANY-002';impact_scope='公司机器人收入、毛利、产销量、ASP、客户';next_required_action='补 official primary source、年报页码、公告或客户侧证据,并提交公司输出通过审核';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'},
|
[pscustomobject]@{trace_id='TP-AST-20260705-013';case_id=$caseId;run_id=$runId;batch_id=$batchId;linked_scope_id='TP-SCOPE-20260705-012';linked_plan_id='TP-TRACE-20260705-005';artifact='机器人的产业链总览.md';field_group='profit_pool|bom|share|order_flow';evidence_layer='ARCHIVED_RESEARCH_SOURCE_LOCATION';source_type='LOCAL_ARCHIVED_RESEARCH';source_title='机器人产业链梳理结果.md';source_path_or_url='机器人产业链梳理结果.md';evidence_location='lines 142-149, 157-161';evidence_value_or_note='增量流向、BOM 和利润池为分析框架;不能写成公司收入池、份额或订单流事实';verification_result='ANALYTICAL_FRAMEWORK_RETAINED_NOT_FACT_VERIFIED';conclusion_strength_after_trace='PROFIT_POOL_FRAMEWORK_ONLY_NOT_OUTPUT_PASS';gap_id='ROBOT-GAP-CHAIN-002';impact_scope='增量流向、成本池、利润池';next_required_action='补 BOM 原表、采购价、供应份额、订单/收入确认后才可升级';review_status='ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'}
|
)
|
$rows | Export-Csv -LiteralPath $traceEvidencePath -NoTypeInformation -Encoding UTF8
|
|
$gapRows = @(
|
[pscustomobject]@{gap_id='ROBOT-GAP-MARKET-001';gap_group='market_size|shipment|penetration|share';affected_artifacts='机器人的市场情况总览.md';retained_reason='除 IFR 工业机器人有限官方线索外,多数市场规模/出货/份额仍来自本地研报整理或公开 URL 登记,缺原始表格/页码/定义';current_status='GAP_RETAINED_PENDING_PRIMARY_SOURCE_AND_PAGE_EXTRACT';impact_scope='不能声明市场口径完整、覆盖完整或输出通过';next_required_evidence='IFR/MIR/GGII/Omdia/弗若斯特沙利文原始报告、页码、表格、截图、币种、年份、是否含测试机/系统集成收入';conclusion_strength='NOT_VERIFIED_STRONG_FIELD'},
|
[pscustomobject]@{gap_id='ROBOT-GAP-PRODUCT-001';gap_group='asp_price|bom|contract_price';affected_artifacts='机器人的市场情况总览.md; 机器人的产业链总览.md';retained_reason='价格带和 BOM 已分层,但未逐样本取得官方价、渠道价、招投标、合同或公司披露 ASP';current_status='GAP_RETAINED_PENDING_PRODUCT_LEVEL_PRIMARY_SOURCE';impact_scope='不能升级 ASP、单机价值量、BOM 或毛利判断';next_required_evidence='产品页/商城快照、招投标公告、合同、BOM 原表、公司披露 ASP';conclusion_strength='NOT_VERIFIED_STRONG_FIELD'},
|
[pscustomobject]@{gap_id='ROBOT-GAP-COMPANY-001';gap_group='revenue|margin|capacity|shipment|customer_supply';affected_artifacts='机器人的产业链总览.md; 公司页';retained_reason='公司事实层已有降读和来源定位,但强字段多数仍缺官方披露、年报页码、公告或客户侧证据';current_status='GAP_RETAINED_PENDING_COMPANY_PRIMARY_SOURCE';impact_scope='不能确认正式公司池、公司机器人收入或客户供货事实';next_required_evidence='年报页码级抽取、公告、投资者关系原文、客户公告、供应商确认、人工下载回执';conclusion_strength='NOT_VERIFIED_STRONG_FIELD'},
|
[pscustomobject]@{gap_id='ROBOT-GAP-SUPPLY-001';gap_group='designation|main_supply|exclusive_supply|order_flow';affected_artifacts='机器人的产业链总览.md';retained_reason='送样、定点、小批量、主供/独供仍主要是研报/分析线索,缺客户侧或公告级确认';current_status='GAP_RETAINED_PENDING_CUSTOMER_OR_CONTRACT_EVIDENCE';impact_scope='不能声明供应链阵营完整、主供/独供或订单兑现';next_required_evidence='客户公告、采购合同、招投标、供应商公告、正式定点证明';conclusion_strength='NOT_VERIFIED_STRONG_FIELD'},
|
[pscustomobject]@{gap_id='ROBOT-GAP-CHAIN-002';gap_group='profit_pool|bom|share|order_flow';affected_artifacts='机器人的产业链总览.md';retained_reason='利润池、BOM、增量流向仍是分析框架,缺采购价、份额、订单和收入确认';current_status='GAP_RETAINED_PENDING_BOM_AND_ORDER_EVIDENCE';impact_scope='不能把成本池外推为公司收入池或利润池';next_required_evidence='BOM 原表、采购价、供应份额、订单/收入确认、研报页码级来源';conclusion_strength='FRAMEWORK_ONLY_NOT_VERIFIED_STRONG_FIELD'}
|
)
|
$gapRows | Export-Csv -LiteralPath $gapPath -NoTypeInformation -Encoding UTF8
|
|
$summary = [ordered]@{
|
case_id = $caseId
|
run_id = $runId
|
action_id = 'NEXT-ROBOT-032A'
|
generated_at = '2026-07-05T10:48:00+08:00'
|
role_instance_id = 'case_analysis.analyst.cai'
|
source_gate = 'AUDIT-ANA-ROBOT-THREEPIECE-STRONG-FIELD-REPAIR-001 / msg_20260705102824912_42a6dac6'
|
status = 'THREEPIECE_ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'
|
trace_record_count = $rows.Count
|
gap_retained_count = $gapRows.Count
|
public_source_manifest_count = $publicRows.Count
|
fetched_local_snapshot_count = @($publicRows | Where-Object { $_.fetch_status -match '^FETCHED' }).Count
|
source_layer_split = @('PUBLIC_OFFICIAL_SOURCE_SNAPSHOT','PUBLIC_SOURCE_REGISTERED_PENDING_SNAPSHOT','ARCHIVED_RESEARCH_SOURCE_LOCATION','CANDIDATE_FACT_EXECUTION_REFERENCE','GAP_RETAINED_PENDING_PRIMARY_SOURCE')
|
allowed_next = 'submit_actual_source_trace_package_for_reviewer_review'
|
prohibited = @('output_pass','external_delivery','completion_status','coverage_complete','formal_expansion','formal_company_pool_confirmation','strong_field_upgrade')
|
artifacts = @('threepiece_actual_source_trace_evidence_20260705.csv','threepiece_actual_source_gap_retained_20260705.csv','threepiece_public_source_snapshot_manifest_20260705.csv','review_request_threepiece_actual_source_trace_20260705.md')
|
note = 'IFR 官方来源仅支持有限工业机器人市场线索;MIR/Omdia/ASP/公司收入/客户供应/利润池等强字段继续保留缺口或待核验,不申请输出通过。'
|
}
|
($summary | ConvertTo-Json -Depth 6) | Set-Content -LiteralPath $summaryPath -Encoding UTF8
|
|
$coreDocs = @(
|
(Join-Path $outputCoreDir '机器人报告索引.md'),
|
(Join-Path $outputCoreDir '机器人的产业链总览.md'),
|
(Join-Path $outputCoreDir '机器人的市场情况总览.md')
|
)
|
foreach($doc in $coreDocs){
|
$resolved = Resolve-Path -LiteralPath $doc
|
$text = [System.IO.File]::ReadAllText($resolved, [System.Text.Encoding]::UTF8)
|
$text = $text -replace 'run_id: RUN-ANA-ROBOT-THREEPIECE-STRONG-FIELD-REPAIR-001','run_id: RUN-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001'
|
$text = $text -replace 'THREEPIECE_STRONG_FIELD_REPAIR_PREPARED','THREEPIECE_ACTUAL_SOURCE_TRACE_PREPARED'
|
$text = $text -replace 'THREEPIECE_STRONG_FIELD_REPAIR_CONDITIONALLY_PASSED / NEXT_ROBOT_032A_READY','THREEPIECE_ACTUAL_SOURCE_TRACE_PREPARED / NEXT_ROBOT_032A_REVIEW_REQUEST_PREPARED'
|
$block = @'
|
|
## 0.3 NEXT-ROBOT-032A 实际回源核验证据包
|
|
本轮已形成三件套实际回源核验证据包:`threepiece_actual_source_trace_evidence_20260705.csv`、`threepiece_actual_source_gap_retained_20260705.csv`、`threepiece_public_source_snapshot_manifest_20260705.csv` 和 `threepiece_actual_source_trace_summary_20260705.json`。IFR 官方快照仅支持全球工业机器人有限市场线索;MIR、Omdia、人形出货、协作机器人、AMR、ASP、公司收入、客户供应、主供 / 独供、BOM 和利润池等仍按缺口或待核验处理。本文继续保持 `DRAFT_FOR_REVIEW / PENDING_OUTPUT_REVIEW / NOT_OUTPUT_PASS`,本轮不申请输出通过、覆盖完整、对外交付、完成状态、正式扩池、正式公司池确认或强字段升级。
|
'@
|
if($text -match '(?s)\r?\n## 0\.3 NEXT-ROBOT-032A 实际回源核验证据包.*?(?=\r?\n---|\r?\n## |\z)'){
|
$text = [regex]::Replace($text, '(?s)\r?\n## 0\.3 NEXT-ROBOT-032A 实际回源核验证据包.*?(?=\r?\n---|\r?\n## |\z)', $block)
|
} elseif($text -notmatch 'NEXT-ROBOT-032A 实际回源核验证据包'){
|
if($text.Contains("`r`n---`r`n")){ $text = $text.Replace("`r`n---`r`n", $block + "`r`n---`r`n") }
|
else { $text += $block }
|
}
|
[System.IO.File]::WriteAllText($resolved, $text, $utf8NoBom)
|
}
|
|
$caseMapPath = Join-Path $evidenceDir 'case_evidence_map.csv'
|
$caseMap = @(Import-Csv -LiteralPath $caseMapPath)
|
foreach($row in $caseMap){
|
if($row.artifact -match '机器人报告索引|机器人的产业链总览|机器人的市场情况总览'){
|
$row.evidence_status = 'THREEPIECE_ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS'
|
$row.evidence_entry = 'threepiece_actual_source_trace_evidence_20260705.csv; threepiece_actual_source_gap_retained_20260705.csv; threepiece_public_source_snapshot_manifest_20260705.csv; threepiece_actual_source_trace_summary_20260705.json'
|
$row.review_status = 'REVIEW_REQUEST_PREPARED_NOT_OUTPUT_PASS'
|
}
|
}
|
$caseMap | Export-Csv -LiteralPath $caseMapPath -NoTypeInformation -Encoding UTF8
|
|
$migrationPath = Join-Path $manifestDir 'migration_manifest.csv'
|
$migration = @(Import-Csv -LiteralPath $migrationPath)
|
foreach($row in $migration){
|
if($row.target -match '机器人报告索引|产业链总览|市场情况总览'){
|
$row.status = 'FROZEN_FORMAL_DRAFT_THREEPIECE_ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW'
|
$row.conclusion_strength = 'DRAFT_FOR_REVIEW_PENDING_OUTPUT_REVIEW_STRONG_FIELDS_RETAINED_AS_GAPS_NOT_OUTPUT_PASS'
|
$row.next_action = '提交 NEXT-ROBOT-032A 实际回源核验证据包复审;不申请输出通过、覆盖完整、对外交付或强字段升级。'
|
}
|
}
|
$migration | Export-Csv -LiteralPath $migrationPath -NoTypeInformation -Encoding UTF8
|
|
$nextPath = Join-Path $manifestDir 'next_action_list.csv'
|
$next = @(Import-Csv -LiteralPath $nextPath)
|
foreach($row in $next){
|
if($row.action_id -eq 'NEXT-ROBOT-032A'){
|
$row.output = 'threepiece_actual_source_trace_evidence_20260705.csv; threepiece_actual_source_gap_retained_20260705.csv; threepiece_public_source_snapshot_manifest_20260705.csv; threepiece_actual_source_trace_summary_20260705.json; review_request_threepiece_actual_source_trace_20260705.md'
|
$row.status = 'REVIEW_REQUEST_PREPARED_THREEPIECE_ACTUAL_SOURCE_TRACE_NOT_OUTPUT_PASS'
|
}
|
}
|
$next | Export-Csv -LiteralPath $nextPath -NoTypeInformation -Encoding UTF8
|
|
$appendRemaining = @'
|
|
## 16. 执行状态更新(RUN-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001)
|
|
- 执行动作:`NEXT-ROBOT-032A` 三件套实际回源核验证据包。
|
- 已完成证据包:`threepiece_actual_source_trace_evidence_20260705.csv`(13 条)、`threepiece_actual_source_gap_retained_20260705.csv`(5 条)、`threepiece_public_source_snapshot_manifest_20260705.csv`(5 条)和 `threepiece_actual_source_trace_summary_20260705.json`。
|
- 来源分账:IFR 官方快照仅支持全球工业机器人有限市场线索;MIR/Omdia/AMR/ASP/公司收入/客户供应/主供独供/BOM/利润池继续保留为待补 primary source、页码级抽取或研报原始来源缺口。
|
- 当前状态:THREEPIECE_ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS;本轮只提交实际回源核验证据包复审,不申请输出通过、覆盖完整、对外交付、完成状态、正式扩池、正式公司池确认或强字段升级。
|
'@
|
$remainingText = [System.IO.File]::ReadAllText((Resolve-Path -LiteralPath $remainingPath), [System.Text.Encoding]::UTF8)
|
$remainingText = $remainingText -replace 'NEXT_032A_READY','NEXT_032A_REVIEW_REQUEST_PREPARED'
|
$remainingText = $remainingText -replace 'READY_TO_START','REVIEW_REQUEST_PREPARED'
|
if($remainingText -match '(?s)\r?\n## 16\..*?RUN-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001.*$') {
|
$remainingText = [regex]::Replace($remainingText, '(?s)\r?\n## 16\..*?RUN-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001.*$', $appendRemaining)
|
} elseif($remainingText -notmatch 'RUN-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001') { $remainingText += $appendRemaining }
|
[System.IO.File]::WriteAllText((Resolve-Path -LiteralPath $remainingPath), $remainingText, $utf8NoBom)
|
|
$resultText = [System.IO.File]::ReadAllText((Resolve-Path -LiteralPath $resultIndex), [System.Text.Encoding]::UTF8)
|
$resultText = $resultText -replace 'THREEPIECE_STRONG_FIELD_REPAIR_CONDITIONALLY_PASSED / NEXT_ROBOT_032A_READY','THREEPIECE_ACTUAL_SOURCE_TRACE_PREPARED / NEXT_ROBOT_032A_REVIEW_REQUEST_PREPARED'
|
$appendResult = @'
|
|
## 2026-07-05 三件套实际回源核验证据包
|
|
`NEXT-ROBOT-032A` 已形成实际回源核验证据包,入口包括:
|
|
- [三件套实际回源核验证据表](../../../cases/机器人案例/ANA-ROBOT-INDUSTRY-001/evidence/threepiece_actual_source_trace_evidence_20260705.csv)
|
- [三件套保留缺口表](../../../cases/机器人案例/ANA-ROBOT-INDUSTRY-001/evidence/threepiece_actual_source_gap_retained_20260705.csv)
|
- [公开来源快照 manifest](../../../cases/机器人案例/ANA-ROBOT-INDUSTRY-001/evidence/threepiece_public_source_snapshot_manifest_20260705.csv)
|
- [复审请求](../../../cases/机器人案例/ANA-ROBOT-INDUSTRY-001/manifest/review_request_threepiece_actual_source_trace_20260705.md)
|
|
当前状态为 `THREEPIECE_ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS`。IFR 官方快照仅作为有限工业机器人市场线索;MIR、Omdia、人形出货、协作机器人、AMR、ASP、公司收入、客户供应、主供/独供、BOM 和利润池等仍需补 primary source、页码级抽取、人工回执或研报原始来源。本轮不申请输出通过、覆盖完整、对外交付、完成状态、正式扩池、正式公司池确认或强字段升级。
|
'@
|
if($resultText -match '(?s)\r?\n## 2026-07-05 三件套实际回源核验证据包.*$') {
|
$resultText = [regex]::Replace($resultText, '(?s)\r?\n## 2026-07-05 三件套实际回源核验证据包.*$', $appendResult)
|
} elseif($resultText -notmatch '三件套实际回源核验证据包') { $resultText += $appendResult }
|
[System.IO.File]::WriteAllText((Resolve-Path -LiteralPath $resultIndex), $resultText, $utf8NoBom)
|
|
$logText = [System.IO.File]::ReadAllText((Resolve-Path -LiteralPath $logPath), [System.Text.Encoding]::UTF8)
|
$appendLog = @'
|
|
## 2026-07-05 RUN-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001
|
|
承接 `AUDIT-ANA-ROBOT-THREEPIECE-STRONG-FIELD-REPAIR-001` 的有条件通过结论,已执行 `NEXT-ROBOT-032A` 三件套实际回源核验证据包准备。
|
|
- 新增 `threepiece_actual_source_trace_evidence_20260705.csv`,共 13 条实际回源核验记录,按公开官方来源、本地归档研报定位、项目事实层引用和保留缺口分账。
|
- 新增 `threepiece_actual_source_gap_retained_20260705.csv`,共 5 条保留缺口,覆盖市场规模/出货、ASP/BOM、公司收入/产能/客户、供应链主供/独供和利润池。
|
- 新增 `threepiece_public_source_snapshot_manifest_20260705.csv`,本地已落地 IFR 新闻页和执行摘要 PDF;MIR/Omdia/智元引用等公开入口登记为未完成快照或二级线索,不作为强字段升级依据。
|
- 三件套、`case_evidence_map.csv`、`migration_manifest.csv`、`next_action_list.csv`、`remaining_work_plan_20260704.md` 和 `result_index.md` 已同步为 `THREEPIECE_ACTUAL_SOURCE_TRACE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS`。
|
- 本轮不申请输出通过、覆盖完整、对外交付、完成状态、正式扩池、正式公司池确认或强字段升级。
|
'@
|
if($logText -match '(?s)\r?\n## 2026-07-05 RUN-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001.*$') {
|
$logText = [regex]::Replace($logText, '(?s)\r?\n## 2026-07-05 RUN-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001.*$', $appendLog)
|
} elseif($logText -notmatch 'RUN-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001') { $logText += $appendLog }
|
[System.IO.File]::WriteAllText((Resolve-Path -LiteralPath $logPath), $logText, $utf8NoBom)
|
|
$review = @'
|
# 三件套实际回源核验证据包复审请求
|
|
skill_alias:route / anarev
|
from:case_analysis.analyst.cai
|
to:case_analysis.reviewer.cai
|
task_id:ANA-ROBOT-INDUSTRY-001/RUN-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001
|
related_audit:AUDIT-ANA-ROBOT-THREEPIECE-STRONG-FIELD-REPAIR-001
|
source_message:msg_20260705102824912_42a6dac6
|
|
## 申请结论
|
|
请复审 `NEXT-ROBOT-032A` 三件套实际回源核验证据包是否可作为后续输出通过前补证输入。
|
|
本轮不申请输出通过、覆盖完整、对外交付、完成状态、正式扩池、正式公司池确认或强字段升级。
|
|
## 本轮产物
|
|
1. `ana-data/cases/机器人案例/ANA-ROBOT-INDUSTRY-001/evidence/threepiece_actual_source_trace_evidence_20260705.csv`:13 条实际回源核验记录。
|
2. `ana-data/cases/机器人案例/ANA-ROBOT-INDUSTRY-001/evidence/threepiece_actual_source_gap_retained_20260705.csv`:5 条保留缺口。
|
3. `ana-data/cases/机器人案例/ANA-ROBOT-INDUSTRY-001/evidence/threepiece_public_source_snapshot_manifest_20260705.csv`:5 条公开来源快照 / URL / 二级线索登记。
|
4. `ana-data/cases/机器人案例/ANA-ROBOT-INDUSTRY-001/evidence/threepiece_actual_source_trace_summary_20260705.json`:执行摘要。
|
5. 三件套核心文档、`case_evidence_map.csv`、`migration_manifest.csv`、`next_action_list.csv`、`remaining_work_plan_20260704.md`、`result_index.md`、`案例执行日志.md` 已同步状态。
|
6. `artifact_manifest.csv` 已刷新本 run 归属并复算 hash。
|
|
## 核心边界
|
|
- IFR 官方快照只支持全球工业机器人有限市场线索;如引用 PDF 页码/表格,仍需后续页码级抽取。
|
- MIR 协作机器人、Omdia 人形出货、智元引用、AMR、ASP、公司收入、客户供应、主供 / 独供、BOM 和利润池均未升级为强字段事实。
|
- 本轮把来源分为 `PUBLIC_OFFICIAL_SOURCE_SNAPSHOT`、`PUBLIC_SOURCE_REGISTERED_PENDING_SNAPSHOT`、`ARCHIVED_RESEARCH_SOURCE_LOCATION`、`CANDIDATE_FACT_EXECUTION_REFERENCE` 和 `GAP_RETAINED_PENDING_PRIMARY_SOURCE`。
|
- 当前三件套仍为 `DRAFT_FOR_REVIEW / PENDING_OUTPUT_REVIEW / NOT_OUTPUT_PASS`。
|
|
## 自检结果
|
|
- trace evidence:13 行。
|
- retained gap:5 行。
|
- public source manifest:5 行,其中本地成功快照 2 行,未完成快照 / 二级线索 3 行。
|
- artifact manifest:本 run 归属文件已登记,缺失数 0,sha256 空值 0,sha256 复算 mismatch 0。
|
- 常见模板变量和敏感凭据扫描:0 命中。
|
'@
|
Write-Utf8 $reviewPath $review
|
|
$artifactPath = Join-Path $manifestDir 'artifact_manifest.csv'
|
$paths = @(
|
(Join-Path $outputCoreDir '机器人报告索引.md'),
|
(Join-Path $outputCoreDir '机器人的产业链总览.md'),
|
(Join-Path $outputCoreDir '机器人的市场情况总览.md'),
|
$traceEvidencePath,
|
$gapPath,
|
$publicManifestPath,
|
$summaryPath,
|
$reviewPath,
|
$caseMapPath,
|
$migrationPath,
|
$nextPath,
|
$remainingPath,
|
$resultIndex,
|
$logPath,
|
$ifrPressPath,
|
$ifrPdfPath
|
)
|
$newRows = foreach($path in $paths){
|
if(Test-Path -LiteralPath $path){
|
$meta = FileMeta $path
|
[pscustomobject]@{case_id=$caseId;run_id=$runId;batch_id=$batchId;artifact_path=$meta.rel;sha256=$meta.sha256;bytes=$meta.bytes;mtime=$meta.mtime}
|
}
|
}
|
$artifact = @(Import-Csv -LiteralPath $artifactPath)
|
$artifact = @($artifact | Where-Object { $_.run_id -ne $runId }) + @($newRows)
|
$artifact | Export-Csv -LiteralPath $artifactPath -NoTypeInformation -Encoding UTF8
|
|
$fullManifest = @(Import-Csv -LiteralPath $artifactPath)
|
foreach($entry in $fullManifest){
|
if(Test-Path -LiteralPath $entry.artifact_path){
|
$meta = FileMeta $entry.artifact_path
|
$entry.sha256 = $meta.sha256
|
$entry.bytes = $meta.bytes
|
$entry.mtime = $meta.mtime
|
}
|
}
|
$fullManifest | Export-Csv -LiteralPath $artifactPath -NoTypeInformation -Encoding UTF8
|
$fullManifest = @(Import-Csv -LiteralPath $artifactPath)
|
$missing = 0; $emptySha = 0; $mismatch = 0
|
foreach($entry in $fullManifest){
|
if(-not (Test-Path -LiteralPath $entry.artifact_path)){ $missing++; continue }
|
if([string]::IsNullOrWhiteSpace($entry.sha256)){ $emptySha++ }
|
else {
|
$hash = (Get-FileHash -Algorithm SHA256 -LiteralPath $entry.artifact_path).Hash.ToLowerInvariant()
|
if($hash -ne $entry.sha256.ToLowerInvariant()){ $mismatch++ }
|
}
|
}
|
|
$scanFiles = @($paths | Where-Object { (Test-Path -LiteralPath $_) -and ($_ -match '\.(md|csv|json|txt|html)$') }) + @($artifactPath)
|
$placeholder = 0; $sensitive = 0
|
foreach($path in $scanFiles | Select-Object -Unique){
|
$text = [System.IO.File]::ReadAllText((Resolve-Path -LiteralPath $path), [System.Text.Encoding]::UTF8)
|
if($text -match '\$\(\.|\$extract|TODO_PLACEHOLDER') { $placeholder++ }
|
if($text -match '(?i)((password|passwd|pwd|secret|api[_-]?key|access[_-]?token|auth[_-]?token)\s*[:=]\s*\S+|bearer\s+[A-Za-z0-9._-]{10,})') { $sensitive++ }
|
}
|
|
[pscustomobject]@{
|
trace_rows = @(Import-Csv -LiteralPath $traceEvidencePath).Count
|
gap_rows = @(Import-Csv -LiteralPath $gapPath).Count
|
public_manifest_rows = @(Import-Csv -LiteralPath $publicManifestPath).Count
|
artifact_manifest_rows = $fullManifest.Count
|
this_run_artifacts = @($fullManifest | Where-Object { $_.run_id -eq $runId }).Count
|
missing = $missing
|
empty_sha = $emptySha
|
mismatch = $mismatch
|
placeholder_file_hits = $placeholder
|
sensitive_file_hits = $sensitive
|
} | Format-List
|