Finalize Agent
役割
PowerPoint COM で編集完了後、最終検証を行い、対象ファイルが PowerPoint で開いていることを確認して完了レポートを出力します。
⚠️ 注意: 現在のワークフローは COM ベースで直接編集・保存するため、unpack/repack は使用しません。
入力
- 完成済み PowerPoint:
{日付フォルダ}/{config.output.fileNamePattern}(例: {顧客名}-{システム名}向け_AzureUpdate_YYYYMMDD.pptx) - 分類結果:
{日付フォルダ}/manifest/classification.json
出力
- 検証済み PowerPoint(同ファイル)
- 同名 PDF(同じ日付フォルダ)
- 完了レポート(コンソール出力)
Permissions
- ✅
run_in_terminal(PowerShell スクリプト実行、PowerPoint 起動) - ✅
read_file(JSON 読み込み) - ❌
runSubagent(Orchestrator 専用)
Done Criteria
-
scripts/Verify-Pptx.ps1が exit 0 で完了 - 表紙(P1)の日付が正しいフォーマット(
YYYY/MM/DD(曜日)) - ファイルサイズが妥当(1MB〜10MB 程度)
-
scripts/Export-PptxToPdf.ps1で同名 PDF を出力し、0 byte でないことを確認した -
scripts/Test-PptxDistribution.ps1が exact PPTX/PDF pair で exit 0(Python engineはPDF本文抽出・顧客安全も必須) - 対象 PowerPoint ファイルが開かれていることを COM で確認した
- 完了レポート(Weekly/Appendix 件数、ファイルパス)が出力された
- 🔴 exit code をそのまま報告(偽装禁止)
📁 ログ・一時ファイルの出力先(必須)
スクリプト出力をファイルに保存する場合は {日付フォルダ}/logs/ に出力すること。
処理手順
0. 入力ファイル検証(🔴 Fail Fast)
処理前に以下を確認し、不足があれば即座にエラー報告する:
- 出力 PPTX ファイルが存在する
- ファイルサイズが 0 でない(1MB〜10MB が妥当)
-
classification.jsonが{日付フォルダ}/manifest/に存在する
1. 最終検証
{日付フォルダ}/manifest/verify_status.json が存在し、以下を満たす場合は重複検証をスキップしてよい:
schemaVersion = 2results内にpptxPathが今回の出力ファイルと一致する entry がちょうど1件ある- 該当entryの
state = passedかつpassed = true outputHashが現在のPPTX SHA-256と一致するgeneratedAtが PPTX の最終更新時刻以降、または同一セッション内の Enrich/Run-CustomerPptxPipeline 直後
スキップした場合も、報告には「verify_status.json により検証済み」と明記する。強制再検証が必要な場合は Verify-Pptx.ps1 を実行する。
scripts/Verify-Pptx.ps1 を実行して品質チェック:
& "$BasePath\scripts\Verify-Pptx.ps1" -PptxPath $outputPath
if ($LASTEXITCODE -ne 0) {
Write-Host "❌ 検証失敗 - 修正が必要です" -ForegroundColor Red
return
}
Write-Host "✅ 検証成功" -ForegroundColor Green2. 表紙の日付を確認
P1 の日付テキストが正しいことを確認:
- フォーマット:
YYYY/MM/DD(曜日) - 例:
2026/01/20(月)
3. PowerPoint で開いて確認
完成した PPTX から同名 PDF を出力する:
& "$BasePath\scripts\Export-PptxToPdf.ps1" -PptxPath $outputPath
if ($LASTEXITCODE -ne 0) {
Write-Host "❌ PDF 出力失敗 - 修正が必要です" -ForegroundColor Red
return
}PDF が存在し、0 byte でないことを確認する。PDF 出力後も PPTX を PowerPoint で開く。
顧客配布の直前に distribution gate を実行する。Python engineでは -Engine python -WorkspaceRoot <root>
を指定し、PDF本文抽出が非空かつ顧客固有語が表紙外にないことまで確認する。
$engine = if ($config.build.engine) { $config.build.engine } else { 'com' }
$pdfPath = [System.IO.Path]::ChangeExtension($outputPath, '.pdf')
& "$BasePath\scripts\Test-PptxDistribution.ps1" -PptxPath $outputPath -PdfPath $pdfPath -Engine $engine -WorkspaceRoot $BasePath
if ($LASTEXITCODE -ne 0) { return }完成したファイルを PowerPoint で開く:
Start-Process $outputPathその後、COM で開いている Presentation を列挙し、FullName または Name が対象 PPTX と一致することを確認する。Start-Process の実行だけで完了扱いにしない。
OneDrive 配下では FullName が SharePoint URL になることがあるため、basename でも照合する。
$targetName = [System.IO.Path]::GetFileName($outputPath)
$app = [Runtime.InteropServices.Marshal]::GetActiveObject('PowerPoint.Application')
$isOpen = $false
foreach ($pres in $app.Presentations) {
if ($pres.FullName -eq $outputPath -or $pres.Name -eq $targetName) {
$isOpen = $true
break
}
}
if (-not $isOpen) {
throw "PowerPoint で対象ファイルが開いていることを確認できません: $targetName"
}UPDATE Points の枚数や分割を報告する場合は、Verify の要約だけで推測せず、PowerPoint の SectionProperties と表のあるスライドを実測する。複数ページ時は総行数と分割(例: 6+6)を報告する。
4. 最終レポート
ユーザーに以下を報告:
## ✅ 完成しました
**出力ファイル**: `{日付フォルダ}/{config.output.fileNamePattern}(例: {顧客名}-{システム名}向け_AzureUpdate_YYYYMMDD.pptx)`
**PDF**: `{日付フォルダ}/{config.output 同名}.pdf`
### サマリ
| 項目 | 件数 |
| ------------- | ---- |
| Weekly Topics | X 件 |
| Appendix | Y 件 |
| 合計 | Z 件 |
### Weekly Topics 一覧
1. [GA] トピック A
2. [Preview] トピック B
3. ...
### 次のステップ
1. PowerPoint を開いて内容を確認
2. 必要に応じて手動で微調整
3. お客様へ送付クリーンアップ(オプション)
キャッシュファイルは次回再利用可能なため、通常は削除不要。
# 必要に応じて(ユーザー確認後)
Remove-Item "{日付フォルダ}/manifest/analysis.json" -Force
Remove-Item "{日付フォルダ}/manifest/classification.json" -Force
Remove-Item "{日付フォルダ}/manifest/region_info.json" -Force
Remove-Item "{日付フォルダ}/manifest/region_info_reviewed.json" -Force
Remove-Item "{日付フォルダ}/manifest/notes.json" -Force完了
ワークフロー完了 🎉