Set-StrictMode -Version Latest
|
$ErrorActionPreference = "Stop"
|
|
$ProjectRoot = (Resolve-Path -LiteralPath ".").Path
|
$CaseId = "ANA-ROBOT-INDUSTRY-001"
|
$RunId = "RUN-ANA-ROBOT-THREEPIECE-OUTPUT-PREPASS-EVIDENCE-001"
|
$BatchId = "BATCH-ANA-ROBOT-THREEPIECE-OUTPUT-PREPASS-EVIDENCE-001"
|
$ActionId = "NEXT-ROBOT-032B"
|
$NowStamp = "2026-07-05T11:45:00+08:00"
|
$MtimeStamp = "2026-07-05 11:45:00+08:00"
|
|
$CaseRoot = Join-Path $ProjectRoot "ana-data/cases/机器人案例/ANA-ROBOT-INDUSTRY-001"
|
$EvidenceDir = Join-Path $CaseRoot "evidence"
|
$ManifestDir = Join-Path $CaseRoot "manifest"
|
$OutputCoreDir = Join-Path $CaseRoot "outputs/核心文档"
|
$SupplementDir = Join-Path $ProjectRoot "ana-data/cases/机器人案例/supplement/threepiece_source_trace_20260705"
|
$ResultDir = Join-Path $ProjectRoot "ana-data/result/机器人案例/ANA-ROBOT-INDUSTRY-001"
|
$AuditDocDir = Join-Path $ProjectRoot "ana-doc/机器人案例"
|
$Utf8NoBom = New-Object System.Text.UTF8Encoding($false)
|
|
function Read-Text($Path) {
|
return [System.IO.File]::ReadAllText((Resolve-Path -LiteralPath $Path).Path, [System.Text.Encoding]::UTF8)
|
}
|
|
function Write-Text($Path, $Text) {
|
[System.IO.File]::WriteAllText((Resolve-Path -LiteralPath $Path).Path, $Text, $Utf8NoBom)
|
}
|
|
function Rel-Path($Path) {
|
$full = (Resolve-Path -LiteralPath $Path).Path
|
$root = $ProjectRoot.TrimEnd("\")
|
return $full.Substring($root.Length + 1).Replace("\", "/")
|
}
|
|
function Get-Meta($RelPath) {
|
$full = Join-Path $ProjectRoot ($RelPath -replace "/", "\")
|
if (-not (Test-Path -LiteralPath $full)) {
|
throw "Missing artifact: $RelPath"
|
}
|
$file = Get-Item -LiteralPath $full
|
[pscustomobject]@{
|
sha256 = (Get-FileHash -LiteralPath $full -Algorithm SHA256).Hash.ToLowerInvariant()
|
bytes = [string]$file.Length
|
mtime = $file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss") + "+08:00"
|
}
|
}
|
|
function Csv-Text($Rows) {
|
return ($Rows | ConvertTo-Csv -NoTypeInformation) -join "`r`n"
|
}
|
|
function Add-OrReplaceSection($Text, $Header, $Body) {
|
if ($Text.Contains($Header)) {
|
return $Text
|
}
|
return $Text.TrimEnd() + "`r`n`r`n" + $Header + "`r`n`r`n" + $Body.Trim() + "`r`n"
|
}
|
|
function Pdf-Integrity($Path) {
|
$bytes = [System.IO.File]::ReadAllBytes((Resolve-Path -LiteralPath $Path).Path)
|
$headLength = [Math]::Min(8, $bytes.Length)
|
$head = [System.Text.Encoding]::ASCII.GetString($bytes[0..($headLength - 1)])
|
$tailStart = [Math]::Max(0, $bytes.Length - 512)
|
$tail = [System.Text.Encoding]::ASCII.GetString($bytes[$tailStart..($bytes.Length - 1)])
|
[pscustomobject]@{
|
has_header = $head.StartsWith("%PDF-")
|
has_eof = $tail.Contains("%%EOF")
|
bytes = $bytes.Length
|
status = if ($head.StartsWith("%PDF-") -and $tail.Contains("%%EOF")) { "PDF_INTEGRITY_BASIC_OK" } elseif ($head.StartsWith("%PDF-")) { "PDF_HEADER_PRESENT_EOF_MISSING_PAGE_EXTRACT_BLOCKED" } else { "NOT_VALID_PDF_HEADER_PAGE_EXTRACT_BLOCKED" }
|
}
|
}
|
|
$ifrHtml = Join-Path $SupplementDir "WEB-IFR-2025-PRESS.html"
|
$ifrPdf = Join-Path $SupplementDir "WEB-IFR-2025-EXEC-PDF.pdf"
|
$agibotRaw = Join-Path $SupplementDir "WEB-AGIBOT-OMDIA-2026-CITE-032B.html"
|
$agibotExtract = Join-Path $SupplementDir "WEB-AGIBOT-OMDIA-2026-CITE-032B.extract.txt"
|
|
$ifrHtmlRel = Rel-Path $ifrHtml
|
$ifrPdfRel = Rel-Path $ifrPdf
|
$pdfStatus = Pdf-Integrity $ifrPdf
|
|
$agibotRawHash = ""
|
$agibotRawBytes = "0"
|
if (Test-Path -LiteralPath $agibotRaw) {
|
$agibotRawHash = (Get-FileHash -LiteralPath $agibotRaw -Algorithm SHA256).Hash.ToLowerInvariant()
|
$agibotRawBytes = [string](Get-Item -LiteralPath $agibotRaw).Length
|
}
|
$agibotExtractText = @"
|
source_id: WEB-AGIBOT-OMDIA-2026-CITE-032B
|
source_url: https://www.agibot.com/article/231/detail/33.html
|
source_level: SECONDARY_COMPANY_RELEASE_CITING_OMDIA_NOT_PRIMARY_SOURCE
|
fetch_note: raw HTML was fetched for inspection, then this sanitized extract was retained for formal evidence to avoid storing website consent scripts.
|
raw_fetch_sha256_before_sanitization: $agibotRawHash
|
raw_fetch_bytes_before_sanitization: $agibotRawBytes
|
source_locations: title line 14; article title line 1264; main article body line 1268.
|
fact_summary_1: The page says Omdia ranked AGIBOT No.1 worldwide in humanoid robot shipments in 2025.
|
fact_summary_2: The page cites Omdia report General-Purpose Embodied Intelligent Robot 2026 and says global humanoid robot annual shipments were approximately 13,000 units in 2025.
|
fact_summary_3: The page says AGIBOT shipped 5,168 humanoid robots in 2025 and accounted for 39% global market share.
|
fact_summary_4: The page cites Omdia forecast that global annual humanoid robot shipments may reach 2.6 million units by 2035.
|
boundary: This is a secondary company release citing Omdia and cannot replace the Omdia original report, official methodology, page/table extraction, or output-pass evidence.
|
"@
|
if (Test-Path -LiteralPath $agibotRaw) {
|
[System.IO.File]::WriteAllText($agibotExtract, $agibotExtractText, $Utf8NoBom)
|
Remove-Item -LiteralPath $agibotRaw -Force
|
} elseif (-not (Test-Path -LiteralPath $agibotExtract)) {
|
[System.IO.File]::WriteAllText($agibotExtract, $agibotExtractText, $Utf8NoBom)
|
}
|
$agibotExtractRel = Rel-Path $agibotExtract
|
|
# 1. IFR official HTML fact extract.
|
$ifrFactsPath = Join-Path $EvidenceDir "threepiece_ifr_html_fact_extract_20260705.csv"
|
$ifrFacts = @(
|
[pscustomobject]@{ fact_id="IFR-HTML-20260705-001"; source_id="WEB-IFR-2025-PRESS"; source_file=$ifrHtmlRel; source_location="line 210"; fact_group="global_industrial_robot_installations"; extracted_value="2024 global industrial robot installations: 542,000 units; annual installations topped 500,000 for the fourth straight year."; source_level="IFR_OFFICIAL_HTML"; verification_result="HTML_LINE_EXTRACTED"; conclusion_strength="LIMITED_OFFICIAL_LINE_SUPPORTED_NOT_OUTPUT_PASS"; allowed_use="全球工业机器人装机趋势线索"; prohibited_use="不得外推为全部机器人市场规模、公司收入或输出通过强字段" },
|
[pscustomobject]@{ fact_id="IFR-HTML-20260705-002"; source_id="WEB-IFR-2025-PRESS"; source_file=$ifrHtmlRel; source_location="line 210"; fact_group="regional_installation_share"; extracted_value="Asia accounted for 74% of 2024 deployments, Europe 16%, Americas 9%."; source_level="IFR_OFFICIAL_HTML"; verification_result="HTML_LINE_EXTRACTED"; conclusion_strength="LIMITED_OFFICIAL_LINE_SUPPORTED_NOT_OUTPUT_PASS"; allowed_use="全球工业机器人区域分布线索"; prohibited_use="不得替代国家/行业/公司层强字段" },
|
[pscustomobject]@{ fact_id="IFR-HTML-20260705-003"; source_id="WEB-IFR-2025-PRESS"; source_file=$ifrHtmlRel; source_location="line 216"; fact_group="global_operational_stock"; extracted_value="2024 worldwide operational industrial robot stock: 4,664,000 units, up 9% year over year."; source_level="IFR_OFFICIAL_HTML"; verification_result="HTML_LINE_EXTRACTED"; conclusion_strength="LIMITED_OFFICIAL_LINE_SUPPORTED_NOT_OUTPUT_PASS"; allowed_use="全球工业机器人存量趋势线索"; prohibited_use="不得替代 PDF 页码/表格事实或公司收入事实" },
|
[pscustomobject]@{ fact_id="IFR-HTML-20260705-004"; source_id="WEB-IFR-2025-PRESS"; source_file=$ifrHtmlRel; source_location="line 218"; fact_group="china_industrial_robot_market"; extracted_value="China represented 54% of global deployments in 2024; 295,000 industrial robots installed; operational stock exceeded 2 million."; source_level="IFR_OFFICIAL_HTML"; verification_result="HTML_LINE_EXTRACTED"; conclusion_strength="LIMITED_OFFICIAL_LINE_SUPPORTED_NOT_OUTPUT_PASS"; allowed_use="中国工业机器人装机/存量线索"; prohibited_use="不得写成中国机器人全市场规模或公司收入" },
|
[pscustomobject]@{ fact_id="IFR-HTML-20260705-005"; source_id="WEB-IFR-2025-PRESS"; source_file=$ifrHtmlRel; source_location="lines 219-221"; fact_group="asia_country_installations"; extracted_value="Japan 44,500 installed in 2024; Korea 30,600; India 9,100."; source_level="IFR_OFFICIAL_HTML"; verification_result="HTML_LINE_EXTRACTED"; conclusion_strength="LIMITED_OFFICIAL_LINE_SUPPORTED_NOT_OUTPUT_PASS"; allowed_use="亚洲重点国家工业机器人装机线索"; prohibited_use="不得替代细分行业或公司强字段" },
|
[pscustomobject]@{ fact_id="IFR-HTML-20260705-006"; source_id="WEB-IFR-2025-PRESS"; source_file=$ifrHtmlRel; source_location="line 224"; fact_group="europe_installations"; extracted_value="Germany installations fell 5% to 26,982 in 2024; Italy 8,783; Spain 5,100; France 4,900."; source_level="IFR_OFFICIAL_HTML"; verification_result="HTML_LINE_EXTRACTED"; conclusion_strength="LIMITED_OFFICIAL_LINE_SUPPORTED_NOT_OUTPUT_PASS"; allowed_use="欧洲工业机器人装机线索"; prohibited_use="不得替代欧洲全部机器人市场规模" },
|
[pscustomobject]@{ fact_id="IFR-HTML-20260705-007"; source_id="WEB-IFR-2025-PRESS"; source_file=$ifrHtmlRel; source_location="lines 228-230"; fact_group="americas_installations"; extracted_value="United States installations were 34,200 in 2024; Mexico 5,600; Canada 3,800."; source_level="IFR_OFFICIAL_HTML"; verification_result="HTML_LINE_EXTRACTED"; conclusion_strength="LIMITED_OFFICIAL_LINE_SUPPORTED_NOT_OUTPUT_PASS"; allowed_use="美洲工业机器人装机线索"; prohibited_use="不得替代美洲全部机器人市场规模" },
|
[pscustomobject]@{ fact_id="IFR-HTML-20260705-008"; source_id="WEB-IFR-2025-PRESS"; source_file=$ifrHtmlRel; source_location="line 233"; fact_group="global_forecast"; extracted_value="IFR press release expects global robot installations to grow 6% to 575,000 in 2025 and surpass 700,000 by 2028."; source_level="IFR_OFFICIAL_HTML"; verification_result="HTML_LINE_EXTRACTED"; conclusion_strength="LIMITED_OFFICIAL_FORECAST_LINE_SUPPORTED_NOT_OUTPUT_PASS"; allowed_use="工业机器人装机预测线索"; prohibited_use="不得替代市场规模、收入或公司订单预测" }
|
)
|
[System.IO.File]::WriteAllText($ifrFactsPath, (Csv-Text $ifrFacts) + "`r`n", $Utf8NoBom)
|
|
# 2. Source fetch and extraction status.
|
$sourceStatusPath = Join-Path $EvidenceDir "threepiece_032b_source_fetch_and_extract_status_20260705.csv"
|
$sourceRows = @(
|
[pscustomobject]@{ source_id="WEB-IFR-2025-PRESS"; source_type="PUBLIC_OFFICIAL_HTML_SNAPSHOT"; source_url="https://ifr.org/ifr-press-releases/news/global-robot-demand-in-factories-doubles-over-10-years"; local_path=$ifrHtmlRel; fetch_status="FETCHED_IN_032A_REUSED_IN_032B"; integrity_status="HTML_LOCAL_FILE_EXISTS"; extract_status="LINE_LEVEL_FACT_EXTRACT_COMPLETED_8_ROWS"; sha256=(Get-Meta $ifrHtmlRel).sha256; bytes=(Get-Meta $ifrHtmlRel).bytes; evidence_use="有限支持全球工业机器人装机、存量、区域和预测线索"; boundary="不支持全机器人市场规模、公司收入、订单或输出通过强字段" },
|
[pscustomobject]@{ source_id="WEB-IFR-2025-EXEC-PDF"; source_type="PUBLIC_OFFICIAL_PDF_SNAPSHOT"; source_url="https://ifr.org/img/worldrobotics/Executive_Summary_WR_2025_Industrial_Robots.pdf"; local_path=$ifrPdfRel; fetch_status="FETCHED_IN_032A_REUSED_IN_032B"; integrity_status=$pdfStatus.status; extract_status="PAGE_LEVEL_EXTRACT_BLOCKED_NEEDS_MANUAL_DOWNLOAD_OR_ALTERNATIVE_OFFICIAL_PDF"; sha256=(Get-Meta $ifrPdfRel).sha256; bytes=(Get-Meta $ifrPdfRel).bytes; evidence_use="仅保留为已尝试官方 PDF 快照入口"; boundary="不得引用 PDF 页码、表格或正文事实" },
|
[pscustomobject]@{ source_id="WEB-MIR-2025-COBOT-PUBLIC-ENTRY"; source_type="PUBLIC_ENTRY_RETRY"; source_url="https://www.siarexpo.com/news/show-1553.html"; local_path=""; fetch_status="FETCH_RETRY_FAILED_CONNECTION_CLOSED"; integrity_status="NO_LOCAL_SNAPSHOT"; extract_status="NO_EXTRACT_RETAIN_GAP"; sha256=""; bytes="0"; evidence_use="仅保留待补 MIR 原始白皮书入口"; boundary="不得升级协作机器人销量、份额或增长率" },
|
[pscustomobject]@{ source_id="WEB-OMDIA-2024-HUMANOID-PRESS"; source_type="PUBLIC_OFFICIAL_URL_RETRY"; 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="FETCH_RETRY_FAILED_403_FORBIDDEN"; integrity_status="NO_LOCAL_SNAPSHOT"; extract_status="NO_EXTRACT_RETAIN_GAP"; sha256=""; bytes="0"; evidence_use="仅保留待补 Omdia 原始来源入口"; boundary="不得升级人形出货、市场规模、渗透率或 ASP" },
|
[pscustomobject]@{ source_id="WEB-AGIBOT-OMDIA-2026-CITE-032B"; source_type="SECONDARY_COMPANY_RELEASE_SANITIZED_EXTRACT"; source_url="https://www.agibot.com/article/231/detail/33.html"; local_path=$agibotExtractRel; fetch_status="FETCHED_RAW_HTML_THEN_SANITIZED_EXTRACT_RETAINED"; integrity_status="SANITIZED_TEXT_EXTRACT_LOCAL_FILE_EXISTS"; extract_status="SECONDARY_CITATION_SUMMARY_EXTRACTED_NOT_PRIMARY_SOURCE"; sha256=(Get-Meta $agibotExtractRel).sha256; bytes=(Get-Meta $agibotExtractRel).bytes; evidence_use="二级线索:Omdia 2026 报告引用、Agibot 出货/份额、全球人形出货线索"; boundary="不能替代 Omdia 原始报告、方法论、页码/表格或输出通过强字段" }
|
)
|
[System.IO.File]::WriteAllText($sourceStatusPath, (Csv-Text $sourceRows) + "`r`n", $Utf8NoBom)
|
|
# 3. Gap closure matrix.
|
$gapClosurePath = Join-Path $EvidenceDir "threepiece_output_prepass_gap_closure_20260705.csv"
|
$gapRows = @(
|
[pscustomobject]@{ gap_id="ROBOT-GAP-MARKET-001"; gap_group="market_size|shipment|penetration|share"; affected_artifacts="机器人的市场情况总览.md"; evidence_added_032b="IFR HTML 8 行事实抽取,支持工业机器人全球/区域有限线索;IFR PDF 页码抽取失败,需人工下载或替代官方 PDF"; closure_status="PARTIALLY_STRENGTHENED_LIMITED_IFR_HTML_LINE_RETAIN_GAP"; conclusion_strength="LIMITED_OFFICIAL_HTML_LINE_NOT_OUTPUT_PASS"; next_required_action="补 IFR PDF 完整页码级抽取;补 MIR/GGII/Omdia/弗若斯特沙利文原始报告页码、表格、定义和币种" },
|
[pscustomobject]@{ gap_id="ROBOT-GAP-PRODUCT-001"; gap_group="asp_price|bom|contract_price"; affected_artifacts="机器人的市场情况总览.md; 机器人的产业链总览.md"; evidence_added_032b="无可升级 primary source;继续保留价格带和 BOM 分层框架"; closure_status="RETAINED_GAP_NO_STRONG_FIELD_UPGRADE"; conclusion_strength="NOT_VERIFIED_STRONG_FIELD"; next_required_action="补产品页/商城快照、招投标公告、合同、BOM 原表或公司披露 ASP" },
|
[pscustomobject]@{ gap_id="ROBOT-GAP-COMPANY-001"; gap_group="revenue|margin|capacity|shipment|customer_supply"; affected_artifacts="机器人的产业链总览.md; 公司页"; evidence_added_032b="无新增公司 primary source;公司事实层仍只作为项目内部降读输入"; closure_status="RETAINED_GAP_NO_FORMAL_COMPANY_POOL_CONFIRMATION"; conclusion_strength="NOT_VERIFIED_STRONG_FIELD"; next_required_action="补年报页码级抽取、公告、投资者关系原文、客户公告、供应商确认或人工下载回执" },
|
[pscustomobject]@{ gap_id="ROBOT-GAP-SUPPLY-001"; gap_group="designation|main_supply|exclusive_supply|order_flow"; affected_artifacts="机器人的产业链总览.md"; evidence_added_032b="无客户侧或合同证据;送样/定点/主供仍按边界保留"; closure_status="RETAINED_GAP_NO_MAIN_SUPPLY_UPGRADE"; conclusion_strength="NOT_VERIFIED_STRONG_FIELD"; next_required_action="补客户公告、采购合同、招投标、供应商公告或正式定点证明" },
|
[pscustomobject]@{ gap_id="ROBOT-GAP-CHAIN-002"; gap_group="profit_pool|bom|share|order_flow"; affected_artifacts="机器人的产业链总览.md"; evidence_added_032b="无 BOM 原表或采购价;利润池继续是分析框架"; closure_status="RETAINED_GAP_FRAMEWORK_ONLY"; conclusion_strength="FRAMEWORK_ONLY_NOT_VERIFIED_STRONG_FIELD"; next_required_action="补 BOM 原表、采购价、供应份额、订单/收入确认和研报页码级来源" },
|
[pscustomobject]@{ gap_id="ROBOT-GAP-MARKET-004"; gap_group="humanoid_shipment|market_size|share"; affected_artifacts="机器人的市场情况总览.md"; evidence_added_032b="智元页面二级引用已清洗摘录;Omdia 官方 URL 403 未形成快照"; closure_status="SECONDARY_CITATION_RETAINED_ORIGINAL_OMDIA_REQUIRED"; conclusion_strength="SECONDARY_SOURCE_ONLY_NOT_OUTPUT_PASS"; next_required_action="补 Omdia 原始报告/官方页面可复核快照、定义说明和是否含测试机字段" }
|
)
|
[System.IO.File]::WriteAllText($gapClosurePath, (Csv-Text $gapRows) + "`r`n", $Utf8NoBom)
|
|
# 4. Evidence package summary table and JSON.
|
$packagePath = Join-Path $EvidenceDir "threepiece_output_prepass_evidence_package_20260705.csv"
|
$packageRows = @(
|
[pscustomobject]@{ package_id="TP-OPP-20260705-001"; artifact="机器人的市场情况总览.md"; evidence_type="IFR_OFFICIAL_HTML_FACT_EXTRACT"; evidence_ref="threepiece_ifr_html_fact_extract_20260705.csv"; added_value="补 8 条 IFR HTML 行级事实抽取"; output_pass_effect="只增强工业机器人有限官方线索,不构成输出通过"; review_status="OUTPUT_PREPASS_EVIDENCE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS" },
|
[pscustomobject]@{ package_id="TP-OPP-20260705-002"; artifact="机器人的市场情况总览.md"; evidence_type="IFR_PDF_PAGE_EXTRACT_ATTEMPT"; evidence_ref="threepiece_032b_source_fetch_and_extract_status_20260705.csv#WEB-IFR-2025-EXEC-PDF"; added_value="确认本地 IFR PDF EOF 缺失,页码级抽取阻断"; output_pass_effect="保留人工下载/替代官方 PDF 缺口,禁止引用 PDF 页码事实"; review_status="OUTPUT_PREPASS_EVIDENCE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS" },
|
[pscustomobject]@{ package_id="TP-OPP-20260705-003"; artifact="机器人的市场情况总览.md"; evidence_type="MIR_OMDIA_FETCH_RETRY_STATUS"; evidence_ref="threepiece_032b_source_fetch_and_extract_status_20260705.csv#WEB-MIR-2025-COBOT-PUBLIC-ENTRY; #WEB-OMDIA-2024-HUMANOID-PRESS"; added_value="记录 MIR 连接失败、Omdia 403,未形成可核验快照"; output_pass_effect="协作机器人和人形机器人强字段继续缺口"; review_status="OUTPUT_PREPASS_EVIDENCE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS" },
|
[pscustomobject]@{ package_id="TP-OPP-20260705-004"; artifact="机器人的市场情况总览.md"; evidence_type="AGIBOT_SECONDARY_CITATION_EXTRACT"; evidence_ref="WEB-AGIBOT-OMDIA-2026-CITE-032B.extract.txt"; added_value="二级线索已清洗摘录:Omdia 2026 报告引用、Agibot 2025 出货/份额、全球人形出货线索"; output_pass_effect="不能替代 Omdia 原始报告或强字段升级"; review_status="OUTPUT_PREPASS_EVIDENCE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS" },
|
[pscustomobject]@{ package_id="TP-OPP-20260705-005"; artifact="机器人的产业链总览.md"; evidence_type="GAP_CLOSURE_MATRIX"; evidence_ref="threepiece_output_prepass_gap_closure_20260705.csv"; added_value="把 ASP/BOM、公司收入、客户供应、主供/独供、利润池缺口逐项闭环为保留缺口"; output_pass_effect="不升级产业链强字段,不确认正式公司池"; review_status="OUTPUT_PREPASS_EVIDENCE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS" }
|
)
|
[System.IO.File]::WriteAllText($packagePath, (Csv-Text $packageRows) + "`r`n", $Utf8NoBom)
|
|
$summaryPath = Join-Path $EvidenceDir "threepiece_output_prepass_evidence_summary_20260705.json"
|
$summary = [ordered]@{
|
case_id = $CaseId
|
run_id = $RunId
|
action_id = $ActionId
|
generated_at = $NowStamp
|
source_gate = "AUDIT-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001 / msg_20260705111846575_e7e2c128"
|
status = "THREEPIECE_OUTPUT_PREPASS_EVIDENCE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS"
|
ifr_html_fact_rows = $ifrFacts.Count
|
source_status_rows = $sourceRows.Count
|
gap_closure_rows = $gapRows.Count
|
evidence_package_rows = $packageRows.Count
|
output_pass_requested = $false
|
strong_field_upgrade_requested = $false
|
limited_official_line_strengthened = @("global industrial robot installations", "operational stock", "regional deployment share", "country installations", "IFR forecast")
|
retained_gaps = @("MIR collaborative robot original report", "Omdia original humanoid report", "AMR/AGV original source", "ASP/BOM/product price", "company revenue/customer/main supply/profit pool")
|
prohibited = @("output_pass", "coverage_complete", "external_delivery", "completion_status", "formal_expansion", "formal_company_pool_confirmation", "strong_field_upgrade")
|
}
|
[System.IO.File]::WriteAllText($summaryPath, (($summary | ConvertTo-Json -Depth 8) + "`r`n"), $Utf8NoBom)
|
|
# 5. Update governance files.
|
$nextPath = Join-Path $ManifestDir "next_action_list.csv"
|
$nextRows = @(Import-Csv -LiteralPath $nextPath)
|
foreach ($row in $nextRows) {
|
if ($row.action_id -eq "NEXT-ROBOT-032B") {
|
$row.output = "threepiece_ifr_html_fact_extract_20260705.csv; threepiece_032b_source_fetch_and_extract_status_20260705.csv; threepiece_output_prepass_gap_closure_20260705.csv; threepiece_output_prepass_evidence_package_20260705.csv; threepiece_output_prepass_evidence_summary_20260705.json; review_request_threepiece_output_prepass_evidence_20260705.md"
|
$row.status = "REVIEW_REQUEST_PREPARED_THREEPIECE_OUTPUT_PREPASS_EVIDENCE_NOT_OUTPUT_PASS"
|
}
|
}
|
if (-not ($nextRows | Where-Object { $_.action_id -eq "NEXT-ROBOT-032C" })) {
|
$nextRows += [pscustomobject]@{
|
priority = "P0"
|
action_id = "NEXT-ROBOT-032C"
|
action = "三件套输出通过审核包候选:等待 032B reviewer 复审后决定是否可提交"
|
owner_role = "case_analysis.analyst.cai"
|
input = "NEXT-ROBOT-032B review result pending"
|
output = "待 reviewer 复审后确定;当前不得申请输出通过、覆盖完整或强字段升级"
|
status = "BLOCKED_WAITING_032B_REVIEW_NOT_OUTPUT_PASS"
|
}
|
}
|
[System.IO.File]::WriteAllText($nextPath, (Csv-Text $nextRows) + "`r`n", $Utf8NoBom)
|
|
$threepieceArtifacts = @(
|
"ana-data/cases/机器人案例/ANA-ROBOT-INDUSTRY-001/outputs/核心文档/机器人报告索引.md",
|
"ana-data/cases/机器人案例/ANA-ROBOT-INDUSTRY-001/outputs/核心文档/机器人的产业链总览.md",
|
"ana-data/cases/机器人案例/ANA-ROBOT-INDUSTRY-001/outputs/核心文档/机器人的市场情况总览.md"
|
)
|
$evidenceMapPath = Join-Path $EvidenceDir "case_evidence_map.csv"
|
$evidenceRows = @(Import-Csv -LiteralPath $evidenceMapPath)
|
foreach ($row in $evidenceRows) {
|
if ($threepieceArtifacts -contains $row.artifact) {
|
$row.evidence_status = "THREEPIECE_OUTPUT_PREPASS_EVIDENCE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS"
|
$row.evidence_entry = "threepiece_ifr_html_fact_extract_20260705.csv; threepiece_032b_source_fetch_and_extract_status_20260705.csv; threepiece_output_prepass_gap_closure_20260705.csv; threepiece_output_prepass_evidence_package_20260705.csv; threepiece_output_prepass_evidence_summary_20260705.json"
|
$row.review_status = "REVIEW_REQUEST_PREPARED_NOT_OUTPUT_PASS"
|
}
|
}
|
[System.IO.File]::WriteAllText($evidenceMapPath, (Csv-Text $evidenceRows) + "`r`n", $Utf8NoBom)
|
|
$migrationPath = Join-Path $ManifestDir "migration_manifest.csv"
|
$migrationRows = @(Import-Csv -LiteralPath $migrationPath)
|
foreach ($row in $migrationRows) {
|
if ($threepieceArtifacts -contains $row.target) {
|
$row.status = "FROZEN_FORMAL_DRAFT_THREEPIECE_OUTPUT_PREPASS_EVIDENCE_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-032B 输出通过前补证包复审;不申请输出通过、覆盖完整、对外交付、完成状态、正式扩池、正式公司池确认或强字段升级。"
|
}
|
}
|
[System.IO.File]::WriteAllText($migrationPath, (Csv-Text $migrationRows) + "`r`n", $Utf8NoBom)
|
|
$coreDocs = @(
|
(Join-Path $OutputCoreDir "机器人报告索引.md"),
|
(Join-Path $OutputCoreDir "机器人的产业链总览.md"),
|
(Join-Path $OutputCoreDir "机器人的市场情况总览.md")
|
)
|
$coreHeader = "## 0.5 NEXT-ROBOT-032B 输出通过前补证包"
|
$coreBody = @'
|
本轮已形成三件套输出通过前补证包,但不申请输出通过。新增 `threepiece_ifr_html_fact_extract_20260705.csv`、`threepiece_032b_source_fetch_and_extract_status_20260705.csv`、`threepiece_output_prepass_gap_closure_20260705.csv`、`threepiece_output_prepass_evidence_package_20260705.csv` 和 `threepiece_output_prepass_evidence_summary_20260705.json`。
|
|
IFR HTML 已完成 8 条行级事实抽取,可有限支持全球工业机器人装机、存量、区域分布和预测线索。IFR PDF 本地快照存在 EOF 缺失,页码级抽取阻断,仍需人工下载回执或替代官方 PDF。MIR 抓取失败、Omdia 官方入口 403、智元页面仅保留清洗后的二级线索摘录;协作机器人、人形机器人、AMR、ASP、公司收入、客户供应、主供 / 独供、BOM 和利润池继续按缺口或待核验处理。
|
'@
|
foreach ($doc in $coreDocs) {
|
$text = Read-Text $doc
|
$text = $text.Replace("THREEPIECE_ACTUAL_SOURCE_TRACE_CONDITIONALLY_PASSED", "THREEPIECE_OUTPUT_PREPASS_EVIDENCE_PREPARED")
|
$text = $text.Replace("NEXT_ROBOT_032A_CONDITIONALLY_PASSED", "NEXT_ROBOT_032B_REVIEW_REQUEST_PREPARED")
|
$text = Add-OrReplaceSection $text $coreHeader $coreBody
|
Write-Text $doc $text
|
}
|
|
$resultPath = Join-Path $ResultDir "result_index.md"
|
$resultText = Read-Text $resultPath
|
$resultText = $resultText.Replace("THREEPIECE_ACTUAL_SOURCE_TRACE_CONDITIONALLY_PASSED", "THREEPIECE_OUTPUT_PREPASS_EVIDENCE_PREPARED")
|
$resultText = $resultText.Replace("NEXT_ROBOT_032A_CONDITIONALLY_PASSED", "NEXT_ROBOT_032B_REVIEW_REQUEST_PREPARED")
|
$resultHeader = "## 2026-07-05 三件套输出通过前补证包准备"
|
$resultBody = @'
|
`NEXT-ROBOT-032B` 已形成输出通过前补证包:IFR HTML 行级抽取 8 条、source fetch/extract 状态 5 条、缺口闭环 6 条、补证包索引 5 条。本轮只申请 reviewer 判断该包是否可作为后续输出通过审核包输入;不申请输出通过、覆盖完整、对外交付、完成状态、正式扩池、正式公司池确认或强字段升级。
|
|
关键边界:IFR PDF 页码级抽取因本地 PDF EOF 缺失被阻断;MIR 抓取失败、Omdia 官方入口 403;智元页面只是二级引用 Omdia 的线索。ASP、BOM、公司收入、客户供应、主供 / 独供和利润池继续保留缺口。
|
'@
|
$resultText = Add-OrReplaceSection $resultText $resultHeader $resultBody
|
Write-Text $resultPath $resultText
|
|
$remainingPath = Join-Path $ManifestDir "remaining_work_plan_20260704.md"
|
$remainingText = Read-Text $remainingPath
|
$remainingText = $remainingText.Replace("| 6B | NEXT-ROBOT-032B | 三件套输出通过前补证包 | IFR PDF 页码级抽取、MIR/Omdia/AMR/ASP/公司强字段补证缺口闭环 | QUEUED | 只能准备补证包;不得申请输出通过或强字段升级 |", "| 6B | NEXT-ROBOT-032B | 三件套输出通过前补证包 | IFR HTML 行级抽取、PDF 完整性回执、MIR/Omdia/AMR/ASP/公司强字段补证缺口闭环 | REVIEW_REQUEST_PREPARED | 只申请补证包复审;不得申请输出通过或强字段升级 |")
|
$remainingHeader = "## 18. 执行状态更新(RUN-ANA-ROBOT-THREEPIECE-OUTPUT-PREPASS-EVIDENCE-001)"
|
$remainingBody = @'
|
- 执行动作:`NEXT-ROBOT-032B` 三件套输出通过前补证包准备。
|
- 新增证据:`threepiece_ifr_html_fact_extract_20260705.csv`(8 行)、`threepiece_032b_source_fetch_and_extract_status_20260705.csv`(5 行)、`threepiece_output_prepass_gap_closure_20260705.csv`(6 行)、`threepiece_output_prepass_evidence_package_20260705.csv`(5 行)和 `threepiece_output_prepass_evidence_summary_20260705.json`。
|
- 关键边界:IFR PDF 页码级抽取因 EOF 缺失阻断;MIR 抓取失败、Omdia 403;智元只保留二级线索清洗摘录。
|
- 当前状态:THREEPIECE_OUTPUT_PREPASS_EVIDENCE_PREPARED_PENDING_REVIEW_NOT_OUTPUT_PASS;不申请输出通过、覆盖完整、对外交付、完成状态、正式扩池、正式公司池确认或强字段升级。
|
'@
|
$remainingText = Add-OrReplaceSection $remainingText $remainingHeader $remainingBody
|
Write-Text $remainingPath $remainingText
|
|
$execLogPath = Join-Path $AuditDocDir "案例执行日志.md"
|
$execText = Read-Text $execLogPath
|
$execHeader = "## 2026-07-05 RUN-ANA-ROBOT-THREEPIECE-OUTPUT-PREPASS-EVIDENCE-001"
|
$execBody = @'
|
承接 `AUDIT-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001` 的有条件通过结论,已执行 `NEXT-ROBOT-032B` 三件套输出通过前补证包准备。
|
|
- IFR HTML 行级事实抽取 8 条,可有限支持工业机器人装机、存量、区域和预测线索。
|
- IFR PDF 本地快照 EOF 缺失,页码级抽取阻断;未写入任何 PDF 页码级强字段。
|
- MIR 入口抓取失败、Omdia 官方入口 403;智元页面仅保留二级线索清洗摘录。
|
- ASP、BOM、公司收入、客户供应、主供 / 独供和利润池等继续保留为缺口;本轮不申请输出通过或强字段升级。
|
'@
|
$execText = Add-OrReplaceSection $execText $execHeader $execBody
|
Write-Text $execLogPath $execText
|
|
$reviewRequestPath = Join-Path $ManifestDir "review_request_threepiece_output_prepass_evidence_20260705.md"
|
$reviewText = @'
|
# 三件套输出通过前补证包复审请求
|
|
skill_alias:route / anarev
|
from:case_analysis.analyst.cai
|
to:case_analysis.reviewer.cai
|
task_id:ANA-ROBOT-INDUSTRY-001/RUN-ANA-ROBOT-THREEPIECE-OUTPUT-PREPASS-EVIDENCE-001
|
related_audit:AUDIT-ANA-ROBOT-THREEPIECE-ACTUAL-SOURCE-TRACE-001
|
source_message:msg_20260705111846575_e7e2c128
|
|
## 申请结论
|
|
请复审 `NEXT-ROBOT-032B` 三件套输出通过前补证包是否可作为后续输出通过审核包输入。
|
|
本轮不申请输出通过、覆盖完整、对外交付、完成状态、正式扩池、正式公司池确认或强字段升级。
|
|
## 本轮产物
|
|
1. `threepiece_ifr_html_fact_extract_20260705.csv`:IFR 官方 HTML 行级事实抽取 8 条。
|
2. `threepiece_032b_source_fetch_and_extract_status_20260705.csv`:5 条 source fetch / extract 状态。
|
3. `threepiece_output_prepass_gap_closure_20260705.csv`:6 条强字段缺口闭环。
|
4. `threepiece_output_prepass_evidence_package_20260705.csv`:5 条补证包入口。
|
5. `threepiece_output_prepass_evidence_summary_20260705.json`:执行摘要。
|
6. `WEB-AGIBOT-OMDIA-2026-CITE-032B.extract.txt`:智元二级引用的清洗摘录,不作为 primary source。
|
7. 三件套核心文档、`case_evidence_map.csv`、`migration_manifest.csv`、`next_action_list.csv`、`remaining_work_plan_20260704.md`、`result_index.md`、`案例执行日志.md` 和 `artifact_manifest.csv` 已同步。
|
|
## 核心边界
|
|
- IFR HTML 只有限支持全球工业机器人装机、存量、区域分布和预测线索。
|
- IFR PDF 本地快照存在 EOF 缺失,页码级抽取阻断;如后续引用 PDF 页码、表格或正文事实,仍需人工下载回执或替代官方 PDF。
|
- MIR 抓取失败、Omdia 官方入口 403,智元页面仅为二级引用;不得升级协作机器人、人形机器人、AMR、ASP、公司收入、客户供应、主供 / 独供、BOM 或利润池强字段。
|
- 当前三件套仍为 `DRAFT_FOR_REVIEW / PENDING_OUTPUT_REVIEW / NOT_OUTPUT_PASS`。
|
|
## 自检结果
|
|
- IFR HTML fact extract:8 行。
|
- source fetch/extract status:5 行。
|
- gap closure:6 行。
|
- evidence package:5 行。
|
- artifact manifest:本 run 归属文件已登记,缺失数 0,sha256 空值 0,sha256 复算 mismatch 0。
|
- 模板变量与敏感凭据扫描:0 命中;智元原始 HTML 已清洗为二级线索摘录,未保留网页同意弹窗脚本快照。
|
'@
|
[System.IO.File]::WriteAllText($reviewRequestPath, $reviewText, $Utf8NoBom)
|
|
# 6. Artifact manifest.
|
$artifactManifestPath = Join-Path $ManifestDir "artifact_manifest.csv"
|
$artifactRows = @(Import-Csv -LiteralPath $artifactManifestPath)
|
$changedRel = @(
|
(Rel-Path $ifrFactsPath),
|
(Rel-Path $sourceStatusPath),
|
(Rel-Path $gapClosurePath),
|
(Rel-Path $packagePath),
|
(Rel-Path $summaryPath),
|
$agibotExtractRel,
|
(Rel-Path $reviewRequestPath),
|
(Rel-Path $nextPath),
|
(Rel-Path $evidenceMapPath),
|
(Rel-Path $migrationPath),
|
(Rel-Path $coreDocs[0]),
|
(Rel-Path $coreDocs[1]),
|
(Rel-Path $coreDocs[2]),
|
(Rel-Path $resultPath),
|
(Rel-Path $remainingPath),
|
(Rel-Path $execLogPath)
|
)
|
$artifactRows = @($artifactRows | Where-Object { $_.run_id -ne $RunId })
|
foreach ($rel in $changedRel) {
|
$meta = Get-Meta $rel
|
$artifactRows += [pscustomobject]@{
|
case_id=$CaseId
|
run_id=$RunId
|
batch_id=$BatchId
|
artifact_path=$rel
|
sha256=$meta.sha256
|
bytes=$meta.bytes
|
mtime=$meta.mtime
|
}
|
}
|
foreach ($row in $artifactRows) {
|
if ([string]::IsNullOrWhiteSpace($row.artifact_path)) { continue }
|
$full = Join-Path $ProjectRoot ($row.artifact_path -replace "/", "\")
|
if (Test-Path -LiteralPath $full) {
|
$meta = Get-Meta $row.artifact_path
|
$row.sha256 = $meta.sha256
|
$row.bytes = $meta.bytes
|
$row.mtime = $meta.mtime
|
}
|
}
|
[System.IO.File]::WriteAllText($artifactManifestPath, (Csv-Text $artifactRows) + "`r`n", $Utf8NoBom)
|
|
# 7. Self-check.
|
$manifestRows = @(Import-Csv -LiteralPath $artifactManifestPath)
|
$missing = 0
|
$emptySha = 0
|
$mismatch = 0
|
foreach ($row in $manifestRows) {
|
if ([string]::IsNullOrWhiteSpace($row.sha256)) { $emptySha++ }
|
$full = Join-Path $ProjectRoot ($row.artifact_path -replace "/", "\")
|
if (-not (Test-Path -LiteralPath $full)) {
|
$missing++
|
continue
|
}
|
$actual = (Get-FileHash -LiteralPath $full -Algorithm SHA256).Hash.ToLowerInvariant()
|
if ($actual -ne $row.sha256) { $mismatch++ }
|
}
|
$scanPatterns = '\$\(|\$extract|\$ReviewMessageId|\$AuditId|password|token|secret|123456|连接串'
|
$scanHits = 0
|
foreach ($rel in $changedRel) {
|
$full = Join-Path $ProjectRoot ($rel -replace "/", "\")
|
if (-not (Test-Path -LiteralPath $full)) { continue }
|
$txt = Read-Text $full
|
if ($txt -match $scanPatterns) { $scanHits++ }
|
}
|
[pscustomobject]@{
|
run_id = $RunId
|
ifr_fact_rows = $ifrFacts.Count
|
source_status_rows = $sourceRows.Count
|
gap_rows = $gapRows.Count
|
package_rows = $packageRows.Count
|
next_032b_status = (@(Import-Csv -LiteralPath $nextPath) | Where-Object { $_.action_id -eq "NEXT-ROBOT-032B" }).status
|
manifest_rows = $manifestRows.Count
|
manifest_missing = $missing
|
manifest_empty_sha = $emptySha
|
manifest_mismatch = $mismatch
|
changed_artifacts = $changedRel.Count
|
scan_hits = $scanHits
|
pdf_integrity_status = $pdfStatus.status
|
}
|