MB-X Bilibili Pipeline
2026-09-05 873dca205129f123d5ea9dd768bfa1c2e5452830
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
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
}