From 5abd76fdb6899cbf8b4645052c406d6334724f92 Mon Sep 17 00:00:00 2001 From: yuqei Date: Wed, 13 May 2026 15:11:54 +0800 Subject: [PATCH] feat: generate reviewer execution handoffs --- ...µ·草与审查助手-当前工作进度保存-2026-05-11.md | 39 ++++++++ .../assigned-reviewer-execution-summary.md | 10 +++ .../BUSINESS_TEMPLATE/handoff.md | 28 +++--- .../FINAL_APPROVER/handoff.md | 18 ++-- .../LEGAL_CORE/handoff.md | 30 ++++--- .../OPS_MATERIAL/handoff.md | 26 +++--- ...rmal-launch-reviewer-assignment-matrix.ps1 | 88 +++++++++++++++++++ 7 files changed, 198 insertions(+), 41 deletions(-) create mode 100644 project-docs/formal-launch-ops/reviewers/assigned-reviewer-execution-summary.md diff --git a/project-docs/AI合同起草与审查助手-当前工作进度保存-2026-05-11.md b/project-docs/AI合同起草与审查助手-当前工作进度保存-2026-05-11.md index 0ae47d7f..5cb61ccc 100644 --- a/project-docs/AI合同起草与审查助手-当前工作进度保存-2026-05-11.md +++ b/project-docs/AI合同起草与审查助手-当前工作进度保存-2026-05-11.md @@ -807,3 +807,42 @@ - 对应证据文件需要从 `TEMPLATE` 改成 `READY`,并删除 `TODO_REAL_REVIEWER`。 - 生产材料、模板、知识卡、规则、条款仍需真实签收。 - 最终上线批准清单仍是 `TEMPLATE`,最终批准人尚未签署。 + +## 2026-05-13 已分配 reviewer 的执行包交付补强 + +### 本轮完成项 +- 已补强 `scripts/apply-formal-launch-reviewer-assignment-matrix.ps1` 的交付能力: + - `-Apply` 后不仅写回台账,还会刷新四个协作包的 `handoff.md`。 + - 新增 `project-docs/formal-launch-ops/reviewers/assigned-reviewer-execution-summary.md`,汇总法务、业务、运营、最终批准人的姓名、截止日期和对应 handoff 文件。 +- 新版 handoff 文档现在直接带有: + - `reviewer_name` + - `due_date` + - 当前包的 `bundle_rows` + - 校验命令和正式 `-Apply` 命令 + - 对最终批准人的 `final-launch-approval-checklist.md` 路径和批准门禁命令 + +### 本轮验证 +- 分配矩阵再次执行: + - `FORMAL_LAUNCH_REVIEWER_ASSIGNMENT_MATRIX_PASS` + - 产物:`project-docs/qa-artifacts/formal-launch-reviewer-assignment-matrix/2026-05-13T15-09-23-865/formal-launch-reviewer-assignment-matrix-summary.md` +- 已生成 reviewer 执行汇总: + - `project-docs/formal-launch-ops/reviewers/assigned-reviewer-execution-summary.md` +- 已刷新协作包交付文档: + - `LEGAL_CORE/handoff.md` + - `BUSINESS_TEMPLATE/handoff.md` + - `OPS_MATERIAL/handoff.md` + - `FINAL_APPROVER/handoff.md` + +### 当前状态更新 +- 真实 reviewer 现在不只是在台账里“被分配”,而是已经有可直接执行的 handoff 包。 +- 当前最适合真人接手的入口: + - 法务:`project-docs/formal-launch-ops/reviewers/collaboration-packages/LEGAL_CORE/handoff.md` + - 业务:`project-docs/formal-launch-ops/reviewers/collaboration-packages/BUSINESS_TEMPLATE/handoff.md` + - 运营:`project-docs/formal-launch-ops/reviewers/collaboration-packages/OPS_MATERIAL/handoff.md` + - 最终批准:`project-docs/formal-launch-ops/reviewers/collaboration-packages/FINAL_APPROVER/handoff.md` + +### 当前阻塞项 +- 仍然是“真实复核执行”阻塞,不是技术阻塞: + - 各 reviewer 需要在自己包里的 `return-bundle.csv` 填写真正的复核日期、结论和 notes。 + - 对应 evidence 文件仍需从 `TEMPLATE` 变成 `READY`。 + - `FINAL_APPROVER` 的 `due_date` 仍未填写。 diff --git a/project-docs/formal-launch-ops/reviewers/assigned-reviewer-execution-summary.md b/project-docs/formal-launch-ops/reviewers/assigned-reviewer-execution-summary.md new file mode 100644 index 00000000..53a168cd --- /dev/null +++ b/project-docs/formal-launch-ops/reviewers/assigned-reviewer-execution-summary.md @@ -0,0 +1,10 @@ +# Assigned Reviewer Execution Summary + +| group | reviewer_name | due_date | handoff | +|---|---|---|---| +| LEGAL_CORE | 陈钰麒 | 20271221 | project-docs/formal-launch-ops/reviewers/collaboration-packages/LEGAL_CORE/handoff.md | +| BUSINESS_TEMPLATE | 美凤 | 20271221 | project-docs/formal-launch-ops/reviewers/collaboration-packages/BUSINESS_TEMPLATE/handoff.md | +| OPS_MATERIAL | 诗融 | 20271221 | project-docs/formal-launch-ops/reviewers/collaboration-packages/OPS_MATERIAL/handoff.md | +| FINAL_APPROVER | 陈勇 | | project-docs/formal-launch-ops/reviewers/collaboration-packages/FINAL_APPROVER/handoff.md | + +This summary is generated after reviewer assignment apply. It does not approve review results or evidence. \ No newline at end of file diff --git a/project-docs/formal-launch-ops/reviewers/collaboration-packages/BUSINESS_TEMPLATE/handoff.md b/project-docs/formal-launch-ops/reviewers/collaboration-packages/BUSINESS_TEMPLATE/handoff.md index 3a158f47..340aea2b 100644 --- a/project-docs/formal-launch-ops/reviewers/collaboration-packages/BUSINESS_TEMPLATE/handoff.md +++ b/project-docs/formal-launch-ops/reviewers/collaboration-packages/BUSINESS_TEMPLATE/handoff.md @@ -1,22 +1,26 @@ # Review Collaboration Package: BUSINESS_TEMPLATE -This package is for real production launch review. Automation generated the package, but it cannot approve any record. +This package is for real production launch review by the assigned business reviewer. -## Package Metrics +## Assigned Reviewer -| metric | value | -|---|---:| -| total_rows | 38 | -| review_task | 28 | -| template_signoff | 10 | +- reviewer_name: 美凤 +- due_date: 20271221 ## How To Complete -1. Open return-bundle.csv and fill real reviewer names, review dates, statuses, decisions, and notes. -2. Open each evidence file under evidence/ and replace EVIDENCE_STATUS: TEMPLATE with EVIDENCE_STATUS: READY only after real review. -3. Attach or link the actual review basis inside the evidence file. -4. Run scripts/import-formal-launch-review-return-bundle.ps1 with this package CSV. Add -Apply only after validation passes. +- bundle_rows: 38 +- review_task: 28 +- template_signoff: 10 +- return_bundle: D:\ai-contract-platform\project-docs\formal-launch-ops\reviewers\collaboration-packages\BUSINESS_TEMPLATE\return-bundle.csv +- validation_command: powershell -NoProfile -ExecutionPolicy Bypass -File scripts\\import-formal-launch-review-return-bundle.ps1 -BundleCsv "D:\ai-contract-platform\project-docs\formal-launch-ops\reviewers\collaboration-packages\BUSINESS_TEMPLATE\return-bundle.csv" +- apply_command: powershell -NoProfile -ExecutionPolicy Bypass -File scripts\\import-formal-launch-review-return-bundle.ps1 -BundleCsv "D:\ai-contract-platform\project-docs\formal-launch-ops\reviewers\collaboration-packages\BUSINESS_TEMPLATE\return-bundle.csv" -Apply + +1. Open return-bundle.csv and fill review_date, review_status, approval_result, signoff_result, and reviewer_notes. +2. Open each evidence file under evidence/ and change EVIDENCE_STATUS: TEMPLATE to READY only after real review. +3. Keep reviewer_name as the real assigned reviewer; add the real review date before validation. +4. Run the validation command first. Add -Apply only after validation passes. ## Safety Rule -A row marked APPROVED will still be rejected if its evidence file is missing, still marked TEMPLATE, or contains TODO_REAL_REVIEWER. \ No newline at end of file +This package cannot approve itself. Any APPROVED or READY result still requires real evidence and real reviewer dates. \ No newline at end of file diff --git a/project-docs/formal-launch-ops/reviewers/collaboration-packages/FINAL_APPROVER/handoff.md b/project-docs/formal-launch-ops/reviewers/collaboration-packages/FINAL_APPROVER/handoff.md index 2b893bea..9fc6a8f0 100644 --- a/project-docs/formal-launch-ops/reviewers/collaboration-packages/FINAL_APPROVER/handoff.md +++ b/project-docs/formal-launch-ops/reviewers/collaboration-packages/FINAL_APPROVER/handoff.md @@ -1,14 +1,22 @@ # Review Collaboration Package: FINAL_APPROVER -This package is for the final launch approver. It is intentionally not imported by the review return bundle script because final approval depends on all real review and signoff registers first. +This package is for the final launch approver after all real review and signoff packages are complete. + +## Assigned Reviewer + +- reviewer_name: 陈勇 +- due_date: not_set ## How To Complete -1. Confirm the preparation gate, approval gate checks, legal package, business package, ops package, and production signoff registers. +- final_checklist: D:\ai-contract-platform\project-docs\formal-launch-ops\reviewers\collaboration-packages\FINAL_APPROVER\final-launch-approval-checklist.md +- validation_command: powershell -NoProfile -ExecutionPolicy Bypass -File scripts\\run-formal-launch-approval-gate.ps1 -RequireDatabaseTruth -SkipPreparationGate + +1. Confirm the legal, business, and ops packages are fully reviewed and imported. 2. Update final-launch-approval-checklist.md with the real approver name and approval date. -3. Change EVIDENCE_STATUS: TEMPLATE to EVIDENCE_STATUS: READY only after real final approval. -4. Re-run scripts/run-formal-launch-approval-gate.ps1. The gate will reject this checklist while it is still TEMPLATE or contains TODO placeholders. +3. Change EVIDENCE_STATUS: TEMPLATE to READY only after real final approval. +4. Re-run the approval gate to verify the final checklist is no longer blocking. ## Safety Rule -Do not use scripts/import-formal-launch-review-return-bundle.ps1 for this folder. Use the approval gate itself to validate the final checklist. +This package cannot approve itself. Any APPROVED or READY result still requires real evidence and real reviewer dates. \ No newline at end of file diff --git a/project-docs/formal-launch-ops/reviewers/collaboration-packages/LEGAL_CORE/handoff.md b/project-docs/formal-launch-ops/reviewers/collaboration-packages/LEGAL_CORE/handoff.md index f6d3ae53..3f0f83bf 100644 --- a/project-docs/formal-launch-ops/reviewers/collaboration-packages/LEGAL_CORE/handoff.md +++ b/project-docs/formal-launch-ops/reviewers/collaboration-packages/LEGAL_CORE/handoff.md @@ -1,23 +1,27 @@ # Review Collaboration Package: LEGAL_CORE -This package is for real production launch review. Automation generated the package, but it cannot approve any record. +This package is for real production launch review by the assigned legal reviewer. -## Package Metrics +## Assigned Reviewer -| metric | value | -|---|---:| -| total_rows | 101 | -| knowledge_signoff | 26 | -| material_signoff | 4 | -| review_task | 71 | +- reviewer_name: 陈钰麒 +- due_date: 20271221 ## How To Complete -1. Open return-bundle.csv and fill real reviewer names, review dates, statuses, decisions, and notes. -2. Open each evidence file under evidence/ and replace EVIDENCE_STATUS: TEMPLATE with EVIDENCE_STATUS: READY only after real review. -3. Attach or link the actual review basis inside the evidence file. -4. Run scripts/import-formal-launch-review-return-bundle.ps1 with this package CSV. Add -Apply only after validation passes. +- bundle_rows: 101 +- knowledge_signoff: 26 +- material_signoff: 4 +- review_task: 71 +- return_bundle: D:\ai-contract-platform\project-docs\formal-launch-ops\reviewers\collaboration-packages\LEGAL_CORE\return-bundle.csv +- validation_command: powershell -NoProfile -ExecutionPolicy Bypass -File scripts\\import-formal-launch-review-return-bundle.ps1 -BundleCsv "D:\ai-contract-platform\project-docs\formal-launch-ops\reviewers\collaboration-packages\LEGAL_CORE\return-bundle.csv" +- apply_command: powershell -NoProfile -ExecutionPolicy Bypass -File scripts\\import-formal-launch-review-return-bundle.ps1 -BundleCsv "D:\ai-contract-platform\project-docs\formal-launch-ops\reviewers\collaboration-packages\LEGAL_CORE\return-bundle.csv" -Apply + +1. Open return-bundle.csv and fill review_date, review_status, approval_result, signoff_result, and reviewer_notes. +2. Open each evidence file under evidence/ and change EVIDENCE_STATUS: TEMPLATE to READY only after real review. +3. Keep reviewer_name as the real assigned reviewer; add the real review date before validation. +4. Run the validation command first. Add -Apply only after validation passes. ## Safety Rule -A row marked APPROVED will still be rejected if its evidence file is missing, still marked TEMPLATE, or contains TODO_REAL_REVIEWER. \ No newline at end of file +This package cannot approve itself. Any APPROVED or READY result still requires real evidence and real reviewer dates. \ No newline at end of file diff --git a/project-docs/formal-launch-ops/reviewers/collaboration-packages/OPS_MATERIAL/handoff.md b/project-docs/formal-launch-ops/reviewers/collaboration-packages/OPS_MATERIAL/handoff.md index cb990648..42436350 100644 --- a/project-docs/formal-launch-ops/reviewers/collaboration-packages/OPS_MATERIAL/handoff.md +++ b/project-docs/formal-launch-ops/reviewers/collaboration-packages/OPS_MATERIAL/handoff.md @@ -1,21 +1,25 @@ # Review Collaboration Package: OPS_MATERIAL -This package is for real production launch review. Automation generated the package, but it cannot approve any record. +This package is for real production launch review by the assigned ops or delivery reviewer. -## Package Metrics +## Assigned Reviewer -| metric | value | -|---|---:| -| total_rows | 3 | -| material_signoff | 3 | +- reviewer_name: 诗融 +- due_date: 20271221 ## How To Complete -1. Open return-bundle.csv and fill real reviewer names, review dates, statuses, decisions, and notes. -2. Open each evidence file under evidence/ and replace EVIDENCE_STATUS: TEMPLATE with EVIDENCE_STATUS: READY only after real review. -3. Attach or link the actual review basis inside the evidence file. -4. Run scripts/import-formal-launch-review-return-bundle.ps1 with this package CSV. Add -Apply only after validation passes. +- bundle_rows: 3 +- material_signoff: 3 +- return_bundle: D:\ai-contract-platform\project-docs\formal-launch-ops\reviewers\collaboration-packages\OPS_MATERIAL\return-bundle.csv +- validation_command: powershell -NoProfile -ExecutionPolicy Bypass -File scripts\\import-formal-launch-review-return-bundle.ps1 -BundleCsv "D:\ai-contract-platform\project-docs\formal-launch-ops\reviewers\collaboration-packages\OPS_MATERIAL\return-bundle.csv" +- apply_command: powershell -NoProfile -ExecutionPolicy Bypass -File scripts\\import-formal-launch-review-return-bundle.ps1 -BundleCsv "D:\ai-contract-platform\project-docs\formal-launch-ops\reviewers\collaboration-packages\OPS_MATERIAL\return-bundle.csv" -Apply + +1. Open return-bundle.csv and fill review_date, review_status, approval_result, signoff_result, and reviewer_notes. +2. Open each evidence file under evidence/ and change EVIDENCE_STATUS: TEMPLATE to READY only after real review. +3. Keep reviewer_name as the real assigned reviewer; add the real review date before validation. +4. Run the validation command first. Add -Apply only after validation passes. ## Safety Rule -A row marked APPROVED will still be rejected if its evidence file is missing, still marked TEMPLATE, or contains TODO_REAL_REVIEWER. \ No newline at end of file +This package cannot approve itself. Any APPROVED or READY result still requires real evidence and real reviewer dates. \ No newline at end of file diff --git a/scripts/apply-formal-launch-reviewer-assignment-matrix.ps1 b/scripts/apply-formal-launch-reviewer-assignment-matrix.ps1 index b388270c..f3b3ab2b 100644 --- a/scripts/apply-formal-launch-reviewer-assignment-matrix.ps1 +++ b/scripts/apply-formal-launch-reviewer-assignment-matrix.ps1 @@ -26,6 +26,10 @@ function Write-Utf8File { [System.IO.File]::WriteAllText($Path, $Text, (New-Utf8NoBomEncoding)) } +function New-MarkdownLines { + return New-Object System.Collections.Generic.List[string] +} + function Import-CsvRows { param([Parameter(Mandatory = $true)][string]$Path) if (-not (Test-Path -LiteralPath $Path)) { @@ -205,6 +209,62 @@ function Set-IfColumnExists { } } +function Write-AssignedReviewerHandoff { + param( + [Parameter(Mandatory = $true)][string]$Group, + [Parameter(Mandatory = $true)][string]$ReviewerName, + [Parameter(Mandatory = $false)][string]$DueDate = "", + [Parameter(Mandatory = $false)][string]$BundlePath = "", + [Parameter(Mandatory = $false)][string]$HandoffPath = "", + [Parameter(Mandatory = $false)][string]$ChecklistPath = "", + [Parameter(Mandatory = $false)][string]$PackageDescription = "" + ) + + $lines = New-MarkdownLines + $lines.Add("# Review Collaboration Package: $Group") | Out-Null + $lines.Add("") | Out-Null + $lines.Add($PackageDescription) | Out-Null + $lines.Add("") | Out-Null + $lines.Add("## Assigned Reviewer") | Out-Null + $lines.Add("") | Out-Null + $lines.Add("- reviewer_name: $ReviewerName") | Out-Null + $lines.Add("- due_date: $(if ([string]::IsNullOrWhiteSpace($DueDate)) { 'not_set' } else { $DueDate })") | Out-Null + $lines.Add("") | Out-Null + $lines.Add("## How To Complete") | Out-Null + $lines.Add("") | Out-Null + + if (-not [string]::IsNullOrWhiteSpace($BundlePath)) { + $bundleRows = Import-CsvRows -Path $BundlePath + $lines.Add("- bundle_rows: $($bundleRows.Count)") | Out-Null + $byType = @($bundleRows | Group-Object -Property record_type | Sort-Object Name) + foreach ($item in $byType) { + $lines.Add("- $($item.Name): $($item.Count)") | Out-Null + } + $lines.Add("- return_bundle: $BundlePath") | Out-Null + $lines.Add("- validation_command: powershell -NoProfile -ExecutionPolicy Bypass -File scripts\\import-formal-launch-review-return-bundle.ps1 -BundleCsv `"$BundlePath`"") | Out-Null + $lines.Add("- apply_command: powershell -NoProfile -ExecutionPolicy Bypass -File scripts\\import-formal-launch-review-return-bundle.ps1 -BundleCsv `"$BundlePath`" -Apply") | Out-Null + $lines.Add("") | Out-Null + $lines.Add("1. Open return-bundle.csv and fill review_date, review_status, approval_result, signoff_result, and reviewer_notes.") | Out-Null + $lines.Add("2. Open each evidence file under evidence/ and change EVIDENCE_STATUS: TEMPLATE to READY only after real review.") | Out-Null + $lines.Add("3. Keep reviewer_name as the real assigned reviewer; add the real review date before validation.") | Out-Null + $lines.Add("4. Run the validation command first. Add -Apply only after validation passes.") | Out-Null + } else { + $lines.Add("- final_checklist: $ChecklistPath") | Out-Null + $lines.Add("- validation_command: powershell -NoProfile -ExecutionPolicy Bypass -File scripts\\run-formal-launch-approval-gate.ps1 -RequireDatabaseTruth -SkipPreparationGate") | Out-Null + $lines.Add("") | Out-Null + $lines.Add("1. Confirm the legal, business, and ops packages are fully reviewed and imported.") | Out-Null + $lines.Add("2. Update final-launch-approval-checklist.md with the real approver name and approval date.") | Out-Null + $lines.Add("3. Change EVIDENCE_STATUS: TEMPLATE to READY only after real final approval.") | Out-Null + $lines.Add("4. Re-run the approval gate to verify the final checklist is no longer blocking.") | Out-Null + } + + $lines.Add("") | Out-Null + $lines.Add("## Safety Rule") | Out-Null + $lines.Add("") | Out-Null + $lines.Add("This package cannot approve itself. Any APPROVED or READY result still requires real evidence and real reviewer dates.") | Out-Null + Write-Utf8File -Path $HandoffPath -Text ($lines -join [Environment]::NewLine) +} + $repoRoot = Get-RepoRoot if ([string]::IsNullOrWhiteSpace($AssignmentMatrixCsv)) { $AssignmentMatrixCsv = Join-Path $repoRoot "project-docs\formal-launch-ops\reviewers\reviewer-assignment-matrix.csv" @@ -234,6 +294,12 @@ $knowledgeSignoffPath = Join-Path $repoRoot "project-docs\formal-launch-ops\sign $legalBundlePath = Join-Path $repoRoot "project-docs\formal-launch-ops\reviewers\collaboration-packages\LEGAL_CORE\return-bundle.csv" $businessBundlePath = Join-Path $repoRoot "project-docs\formal-launch-ops\reviewers\collaboration-packages\BUSINESS_TEMPLATE\return-bundle.csv" $opsBundlePath = Join-Path $repoRoot "project-docs\formal-launch-ops\reviewers\collaboration-packages\OPS_MATERIAL\return-bundle.csv" +$legalHandoffPath = Join-Path $repoRoot "project-docs\formal-launch-ops\reviewers\collaboration-packages\LEGAL_CORE\handoff.md" +$businessHandoffPath = Join-Path $repoRoot "project-docs\formal-launch-ops\reviewers\collaboration-packages\BUSINESS_TEMPLATE\handoff.md" +$opsHandoffPath = Join-Path $repoRoot "project-docs\formal-launch-ops\reviewers\collaboration-packages\OPS_MATERIAL\handoff.md" +$finalHandoffPath = Join-Path $repoRoot "project-docs\formal-launch-ops\reviewers\collaboration-packages\FINAL_APPROVER\handoff.md" +$finalChecklistPath = Join-Path $repoRoot "project-docs\formal-launch-ops\reviewers\collaboration-packages\FINAL_APPROVER\final-launch-approval-checklist.md" +$assignmentSummaryPath = Join-Path $repoRoot "project-docs\formal-launch-ops\reviewers\assigned-reviewer-execution-summary.md" $requiredGroups = @("LEGAL_CORE", "BUSINESS_TEMPLATE", "OPS_MATERIAL", "FINAL_APPROVER") $errors = New-Object System.Collections.Generic.List[string] @@ -352,6 +418,28 @@ if ($Apply -and $errors.Count -eq 0 -and $missingGroups.Count -eq 0) { $changedFiles.Add($bundlePath) | Out-Null } + Write-AssignedReviewerHandoff -Group "LEGAL_CORE" -ReviewerName $legalName -DueDate (Get-DueDate -Matrix $matrix -Group "LEGAL_CORE") -BundlePath $legalBundlePath -HandoffPath $legalHandoffPath -PackageDescription "This package is for real production launch review by the assigned legal reviewer." + Write-AssignedReviewerHandoff -Group "BUSINESS_TEMPLATE" -ReviewerName $businessName -DueDate (Get-DueDate -Matrix $matrix -Group "BUSINESS_TEMPLATE") -BundlePath $businessBundlePath -HandoffPath $businessHandoffPath -PackageDescription "This package is for real production launch review by the assigned business reviewer." + Write-AssignedReviewerHandoff -Group "OPS_MATERIAL" -ReviewerName $opsName -DueDate (Get-DueDate -Matrix $matrix -Group "OPS_MATERIAL") -BundlePath $opsBundlePath -HandoffPath $opsHandoffPath -PackageDescription "This package is for real production launch review by the assigned ops or delivery reviewer." + Write-AssignedReviewerHandoff -Group "FINAL_APPROVER" -ReviewerName $finalName -DueDate (Get-DueDate -Matrix $matrix -Group "FINAL_APPROVER") -ChecklistPath $finalChecklistPath -HandoffPath $finalHandoffPath -PackageDescription "This package is for the final launch approver after all real review and signoff packages are complete." + foreach ($path in @($legalHandoffPath, $businessHandoffPath, $opsHandoffPath, $finalHandoffPath)) { + $changedFiles.Add($path) | Out-Null + } + + $assignmentSummaryLines = New-MarkdownLines + $assignmentSummaryLines.Add("# Assigned Reviewer Execution Summary") | Out-Null + $assignmentSummaryLines.Add("") | Out-Null + $assignmentSummaryLines.Add("| group | reviewer_name | due_date | handoff |") | Out-Null + $assignmentSummaryLines.Add("|---|---|---|---|") | Out-Null + $assignmentSummaryLines.Add("| LEGAL_CORE | $legalName | $(Get-DueDate -Matrix $matrix -Group "LEGAL_CORE") | project-docs/formal-launch-ops/reviewers/collaboration-packages/LEGAL_CORE/handoff.md |") | Out-Null + $assignmentSummaryLines.Add("| BUSINESS_TEMPLATE | $businessName | $(Get-DueDate -Matrix $matrix -Group "BUSINESS_TEMPLATE") | project-docs/formal-launch-ops/reviewers/collaboration-packages/BUSINESS_TEMPLATE/handoff.md |") | Out-Null + $assignmentSummaryLines.Add("| OPS_MATERIAL | $opsName | $(Get-DueDate -Matrix $matrix -Group "OPS_MATERIAL") | project-docs/formal-launch-ops/reviewers/collaboration-packages/OPS_MATERIAL/handoff.md |") | Out-Null + $assignmentSummaryLines.Add("| FINAL_APPROVER | $finalName | $(Get-DueDate -Matrix $matrix -Group "FINAL_APPROVER") | project-docs/formal-launch-ops/reviewers/collaboration-packages/FINAL_APPROVER/handoff.md |") | Out-Null + $assignmentSummaryLines.Add("") | Out-Null + $assignmentSummaryLines.Add("This summary is generated after reviewer assignment apply. It does not approve review results or evidence.") | Out-Null + Write-Utf8File -Path $assignmentSummaryPath -Text ($assignmentSummaryLines -join [Environment]::NewLine) + $changedFiles.Add($assignmentSummaryPath) | Out-Null + $warnings.Add("FINAL_APPROVER checklist is not auto-signed; final approval must be completed after all review and signoff evidence is ready. Final approver candidate: $finalName") | Out-Null }