---
phase: 04-release
plan: 03
type: execute
wave: 3
depends_on:
  - 04-02
files_modified:
  - README.md
  - CHANGELOG.md
autonomous: false
requirements:
  - PLAT-01
  - PLAT-02
  - PLAT-03
  - PLAT-04
tags:
  - documentation
  - release
  - verification

must_haves:
  truths:
    - "README.md 顶部含安装段落，给出 curl|sh 安装 dm-installer 工具的标准命令（指向 GitHub Releases 的 installer.sh）"
    - "README.md 区分 install.sh（DM8 数据库安装脚本，Phase 1）与 dm-database-installer-installer.sh（cargo-dist 生成的工具引导，Phase 4）两个不同脚本的功能"
    - "README.md 列出三个支持平台（Linux x86_64、Linux aarch64、Windows）的下载链接模板"
    - "README.md 含 PLAT-04 Windows 目标机安装的限制说明（placeholder，setup.exe 集成待 spike）"
    - "CHANGELOG.md 存在并按 Keep a Changelog 风格记录 v0.1.0 的核心变更"
    - "cargo dist plan 在 checkpoint 第 5 步成功输出三平台的 manifest，含 x86_64-pc-windows-msvc（必做，无 fallback）"
    - "用户手动 checkpoint 确认 Cargo.toml/release.yml/.cargo/config.toml/README/CHANGELOG 五个文件均符合发布预期"
  artifacts:
    - path: "README.md"
      provides: "安装指引 + 平台支持矩阵 + PLAT-04 限制说明"
      contains: "GitHub Releases"
    - path: "CHANGELOG.md"
      provides: "v0.1.0 发布说明（cargo-dist 可选读取）"
      contains: "0.1.0"
  key_links:
    - from: "README.md 安装段落"
      to: "GitHub Releases dm-installer-installer.sh"
      via: "curl --proto '=https' --tlsv1.2 -LsSf <url> | sh"
      pattern: "curl.*--proto.*tlsv1\\.2"
    - from: "README.md 平台矩阵"
      to: "三个 cargo-dist target（x86_64-unknown-linux-gnu / aarch64-unknown-linux-gnu / x86_64-pc-windows-msvc）"
      via: "文字说明并匹配 Cargo.toml [workspace.metadata.dist].targets"
      pattern: "x86_64-pc-windows-msvc|x86_64-unknown-linux-gnu|aarch64-unknown-linux-gnu"
    - from: "checkpoint:human-verify"
      to: "用户确认发布流水线就绪"
      via: "用户在本地或干净 fork 上验证 cargo dist plan + git tag dry-run"
      pattern: "approved"
---

<objective>
**As a** 项目用户（开发者/DBA）, **I want to** 阅读 README 了解如何用一行 curl|sh 在三个平台安装 dm-installer 工具，并通过人工 checkpoint 确认 v0.1.0 发布流水线就绪, **so that** 真正打 v0.1.0 tag 时 GitHub Actions 自动构建三平台二进制并发布到 GitHub Releases，新用户照 README 即可下载使用。

Purpose:
- 这是 Phase 4 的最终切片：文档让发布流水线对真实用户可见可用；人工 checkpoint 在打 tag 前最后一次校验所有配置正确（避免 tag 推送后 CI 失败导致回滚成本）
- README 区分两个 install.sh 是 04-CONTEXT.md D-08 + 04-RESEARCH.md Pitfall 4 明确点出的混淆风险点
- PLAT-04 限制说明让用户提前知晓 Windows 目标机功能尚未完整

Output: 完整的 README 安装段落 + CHANGELOG.md 起始版本记录 + 人工 checkpoint 确认所有 Phase 4 产物可发布（含 cargo dist plan 强制本地验证）。
</objective>

<execution_context>
@$HOME/.claude/get-shit-done/workflows/execute-plan.md
@$HOME/.claude/get-shit-done/templates/summary.md
</execution_context>

<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
@.planning/phases/04-release/04-CONTEXT.md
@.planning/phases/04-release/04-RESEARCH.md
@.planning/phases/04-release/04-02-SUMMARY.md
@Cargo.toml
@README.md

<interfaces>
<!-- 关键事实，executor 直接照用 -->

cargo-dist 0.32.0 生成的 installer URL 模式（基于 Cargo.toml repository 字段）：
- `https://github.com/guangl/dm-database-installer/releases/latest/download/dm-database-installer-installer.sh`
- `https://github.com/guangl/dm-database-installer/releases/latest/download/dm-database-installer-installer.ps1`
（注：installer 脚本名以 [package].name 为前缀，本项目 name = "dm-database-installer"，二进制名 = "dm-installer"）

cargo-dist 生成的 curl|sh 推荐命令（来自 04-RESEARCH.md System Architecture Diagram）：
```
curl --proto '=https' --tlsv1.2 -LsSf \
  https://github.com/guangl/dm-database-installer/releases/latest/download/dm-database-installer-installer.sh | sh
```

PowerShell 等价命令（Windows）：
```
powershell -ExecutionPolicy ByPass -c "irm https://github.com/guangl/dm-database-installer/releases/latest/download/dm-database-installer-installer.ps1 | iex"
```

三个目标平台及对应的二进制 archive 名（cargo-dist 默认命名）：
- Linux x86_64: `dm-database-installer-x86_64-unknown-linux-gnu.tar.xz`
- Linux aarch64: `dm-database-installer-aarch64-unknown-linux-gnu.tar.xz`
- Windows x86_64: `dm-database-installer-x86_64-pc-windows-msvc.zip`

两个 install.sh 的区分（CONTEXT.md D-08）：
- `install.sh`（仓库根目录，Phase 1 产出，未完成）：DM8 数据库静默安装脚本
- `dm-database-installer-installer.sh`（cargo-dist 生成，发布到 GitHub Releases）：dm-installer 工具自身的下载安装引导

PLAT-04 限制（04-PATTERNS.md + Plan 02 实现）：
- `dm-installer install-windows` 子命令存在但仅打印未实现警告 + exit 1
- 真实的 setup.exe /q /XML 集成是 PLAT-04 spike，留下一 Phase
</interfaces>
</context>

<tasks>

<task type="auto">
  <name>Task 1: 撰写 README.md 安装段落 + 平台支持矩阵 + PLAT-04 限制说明</name>
  <files>README.md</files>
  <read_first>
    - README.md（当前文件；若不存在则新建）
    - Cargo.toml（确认 [package].name = "dm-database-installer"，二进制名 = "dm-installer"，repository URL）
    - .planning/phases/04-release/04-CONTEXT.md（D-08：两个 install.sh 必须明确区分）
    - .planning/phases/04-release/04-RESEARCH.md（System Architecture Diagram 含 curl|sh 命令模板；Pitfall 4 关于命名冲突的说明）
    - .planning/phases/04-release/04-02-SUMMARY.md（Plan 02 决策：D-04 更新到 msvc）
  </read_first>
  <action>
    重写或追加 README.md，确保按以下小节顺序包含必需内容：

    **小节 1：项目简介**（若 README 已有，保留不破坏）
    简述 dm-database-installer 是什么、面向开发者 + DBA 两类用户。

    **小节 2：安装（## 安装 / ## Installation）**
    包含三段内容：
    a) **Linux / macOS（shell installer）** — 给出精确的 curl|sh 命令：
       ```
       curl --proto '=https' --tlsv1.2 -LsSf \
         https://github.com/guangl/dm-database-installer/releases/latest/download/dm-database-installer-installer.sh | sh
       ```
       并标注：脚本会自动检测 x86_64 / aarch64 架构，下载对应预编译二进制到 `$CARGO_HOME/bin`（默认 `~/.cargo/bin/dm-installer`）。
    b) **Windows（PowerShell installer）** — 给出精确的 PowerShell 命令：
       ```
       powershell -ExecutionPolicy ByPass -c "irm https://github.com/guangl/dm-database-installer/releases/latest/download/dm-database-installer-installer.ps1 | iex"
       ```
    c) **手动下载** — 列出三个平台的 archive 文件名（dm-database-installer-x86_64-unknown-linux-gnu.tar.xz / aarch64-unknown-linux-gnu.tar.xz / x86_64-pc-windows-msvc.zip），指向 GitHub Releases 页面 `https://github.com/guangl/dm-database-installer/releases`。

    **小节 3：支持平台矩阵（## 支持平台）**
    用 markdown 表格列出至少四列（架构、操作系统、控制机、目标机），覆盖：
    - Linux x86_64 → 控制机 ✓ / 目标机 ✓（PLAT-01）
    - Linux aarch64 → 控制机 ✓ / 目标机 ✓（PLAT-02）
    - Windows x86_64 → 控制机 ✓（PLAT-03 通过 SSH 操作 Linux 节点）/ 目标机 ⚠️ placeholder（PLAT-04）

    **小节 4：脚本区分（## 两个 install.sh 的区别 / ## 重要：脚本命名说明）**
    明确区分以下两个不同脚本，避免用户混淆：
    - `install.sh`（仓库 Phase 1 产出，单机达梦数据库安装脚本，待 Phase 1 完成）—— 用户在目标机运行以安装 DM8 数据库
    - `dm-database-installer-installer.sh`（GitHub Releases asset，cargo-dist 生成）—— 用户运行以安装 dm-installer 工具本身

    **小节 5：PLAT-04 Windows 目标机限制（## 已知限制 / ## Limitations）**
    明确写明：
    - dm-installer 二进制在 Windows 控制机上可运行，可通过 SSH 在 Linux 目标节点上完成集群部署（PLAT-03 完整支持）
    - `dm-installer install-windows` 子命令是 placeholder：CLI 入口已存在但实际 setup.exe /q /XML 集成留待后续 spike
    - 当前运行 `install-windows` 会打印 PLAT-04 未实现警告并退出码 1，不会损坏目标机

    **保留原有内容**：若 README 已有 Phase 1 install.sh 的引用、项目介绍、贡献指南等内容，保留不删除；本任务只新增/调整安装+平台+限制三个小节。

    使用中文（response_language=zh-CN）；命令块用 fenced code block（```bash 或 ```powershell）；URL 必须精确匹配 Cargo.toml repository 字段。
  </action>
  <verify>
    <automated>grep -c "dm-database-installer-installer.sh" README.md && grep -c "x86_64-pc-windows-msvc" README.md && grep -c "PLAT-04" README.md</automated>
  </verify>
  <acceptance_criteria>
    - 源断言：`grep -c "curl --proto '=https'" README.md` ≥ 1（含标准 curl 命令）
    - 源断言：`grep -c "dm-database-installer-installer.sh" README.md` ≥ 1（含 cargo-dist 生成脚本名）
    - 源断言：`grep -c "dm-database-installer-installer.ps1" README.md` ≥ 1（含 PowerShell installer）
    - 源断言：`grep -c "x86_64-unknown-linux-gnu" README.md` ≥ 1
    - 源断言：`grep -c "aarch64-unknown-linux-gnu" README.md` ≥ 1
    - 源断言：`grep -c "x86_64-pc-windows-msvc" README.md` ≥ 1
    - 源断言：`grep -ic "PLAT-04\|install-windows" README.md` ≥ 1（含 placeholder 说明）
    - 源断言：`grep -ic "github.com/guangl/dm-database-installer" README.md` ≥ 1（URL 一致性）
    - 源断言：`grep -c "install.sh" README.md` ≥ 2（明确区分两个脚本）
    - 行为断言：md 语法基本正确（无未闭合的 fenced block）— 用 `awk '/^```/ {c++} END {print c%2}' README.md` 输出 0（fenced block 偶数对）
  </acceptance_criteria>
  <done>
    README.md 含安装段落（curl|sh + PowerShell）、三平台支持矩阵、两个 install.sh 的区分说明、PLAT-04 placeholder 限制说明；所有 URL/文件名/平台 triple 与 Cargo.toml 和 cargo-dist 实际生成的产物一致。
  </done>
</task>

<task type="auto">
  <name>Task 2: 创建 CHANGELOG.md（cargo-dist 可选读取 release notes）</name>
  <files>CHANGELOG.md</files>
  <read_first>
    - .planning/PROJECT.md（项目历史；可选）
    - .planning/ROADMAP.md（Phase 1-4 完成情况：Phase 2/3 已完成、Phase 1/4 部分完成）
    - .planning/STATE.md（最新进度）
    - .planning/phases/04-release/04-CONTEXT.md（D-10：可选 CHANGELOG）
  </read_first>
  <action>
    在仓库根目录创建 CHANGELOG.md（若已存在则在顶部追加 v0.1.0 段落，不删除既有内容）。使用 Keep a Changelog 1.1.0 风格 + 中文条目。

    必须包含的固定结构（按 Keep a Changelog 模板，含 # Changelog 标题、Unreleased 段、0.1.0 段）：
    - 文件第一行 `# Changelog`
    - 说明段引用 `[Keep a Changelog](https://keepachangelog.com/en/1.1.0/)` 与 `[Semantic Versioning](https://semver.org/spec/v2.0.0.html)`
    - `## [Unreleased]` 占位（暂为空）
    - `## [0.1.0] - 2026-06-13` 段落，含三组：

    `### Added`（必须列出以下条目，每条标注对应需求 ID + Phase）：
    - TOML 配置驱动的达梦单机静默安装（INST-02，Phase 2）
    - dm-installer validate --config 验证配置合法性（QUAL-03，Phase 2）
    - SSH 主备集群部署：自动生成 dm.ini/dmmal.ini/dmarch.ini/dmwatcher.ini 并分发到各节点（CLUS-01，Phase 3）
    - 集群有序启动：主节点健康检查通过后再启动备节点（CLUS-02，Phase 3）
    - SSH 预检查：sudo 免密、目标端口可用性、磁盘空间（QUAL-01，Phase 3）
    - cargo-dist 多平台发布流水线：Linux x86_64、Linux aarch64、Windows x86_64 三平台预编译二进制（PLAT-01/02/03，Phase 4）
    - dm-installer install-windows placeholder 子命令（PLAT-04，Phase 4，实际安装逻辑留 spike）

    `### Fixed`（必须列出五个 Critical 修复，每条引用 CR-XX）：
    - 集群 SFTP 配置文件上传失败：sftp_write 改用 SFTP create flag（CR-02）
    - 集群安装包上传后无法执行：改为上传 .bin 完整可执行文件 + chmod +x + 全路径调用（CR-01）
    - SSH 私钥路径 ~/.ssh/id_rsa 不展开：新增 expand_tilde 函数（CR-03）
    - 集群部署 shell 命令注入：所有 user-controlled 字符串经 shell_quote 单引号转义（CR-04）
    - SSH TOFU 静默接受任意主机密钥：新增指纹 warning 日志（CR-05）

    `### Security`：
    - 用 rustls-tls 替代 native-tls 避免 OpenSSL 依赖（Phase 2+）
    - 配置层（可选）路径白名单 validate_safe_path 防御 install_path/data_path/instance_name 注入（CR-04 第二道防线）

    文件末尾追加比较链接：
    - `[Unreleased]: https://github.com/guangl/dm-database-installer/compare/v0.1.0...HEAD`
    - `[0.1.0]: https://github.com/guangl/dm-database-installer/releases/tag/v0.1.0`

    如果 Phase 1 还未完成，CHANGELOG 的 Added 中不必列出 INST-01/INST-03/INST-04/DOWN-01/DOWN-02/QUAL-02 等 Phase 1 需求（这些属于 Phase 1 ship 时再记录）；本任务只记录已完成的 Phase 2/3/4 范围。
  </action>
  <verify>
    <automated>test -f CHANGELOG.md && grep -c "## \[0.1.0\]" CHANGELOG.md && grep -c "Keep a Changelog" CHANGELOG.md</automated>
  </verify>
  <acceptance_criteria>
    - 源断言：`test -f CHANGELOG.md` 退出码 0
    - 源断言：`grep -c "^# Changelog" CHANGELOG.md` == 1
    - 源断言：`grep -c "^## \[0.1.0\]" CHANGELOG.md` == 1
    - 源断言：`grep -c "^### Added" CHANGELOG.md` ≥ 1
    - 源断言：`grep -c "^### Fixed" CHANGELOG.md` ≥ 1
    - 源断言：`grep -c "CR-0[12345]" CHANGELOG.md` ≥ 5（五个 Critical 修复都列出）
    - 源断言：`grep -c "PLAT-0[1234]" CHANGELOG.md` ≥ 4（四个 PLAT 需求都列出）
    - 源断言：`grep -c "Keep a Changelog" CHANGELOG.md` ≥ 1
    - 源断言：`grep -c "Semantic Versioning" CHANGELOG.md` ≥ 1
    - 行为断言：cargo build --release 不受影响（CHANGELOG.md 是文档文件）
  </acceptance_criteria>
  <done>
    CHANGELOG.md 存在且按 Keep a Changelog 风格记录 v0.1.0 的 Added/Fixed/Security 段落，含五个 CR-XX 修复和四个 PLAT-XX 需求条目，日期写为 2026-06-13。
  </done>
</task>

<task type="checkpoint:human-verify" gate="blocking">
  <name>Task 3: Phase 4 发布前最终人工验证 checkpoint</name>
  <files>Cargo.toml, .cargo/config.toml, .github/workflows/release.yml, .github/workflows/update-versions.yml, README.md, CHANGELOG.md, src/cli.rs, src/main.rs</files>
  <read_first>
    - 全部 files_modified 列出的文件（用户需在本地查看以确认内容）
    - .planning/phases/04-release/04-01-SUMMARY.md, 04-02-SUMMARY.md, 04-03-SUMMARY.md（执行总结，若已生成）
  </read_first>
  <what-built>
    Wave 1（Plan 01）已完成：Phase 3 五个 Critical bug（CR-01..CR-05）修复 + Cargo.toml description/license/repository 元数据。
    Wave 2（Plan 02）已完成：cargo-dist 0.32.0 安装 + [workspace.metadata.dist] 配置 + .cargo/config.toml aarch64 linker + .github/workflows/release.yml（含 NASM 步骤）+ PLAT-04 install-windows placeholder CLI；cargo dist plan 已在本地通过验证。
    Wave 3（Plan 03 上面两个 task）已完成：README.md 安装段落 + 平台矩阵 + 限制说明、CHANGELOG.md v0.1.0 记录。
  </what-built>
  <action>
    暂停 executor，将控制权交给人工用户。Executor 在此 task 不执行任何文件修改；only 在用户回复 "approved" 后才继续推进。用户的验证内容详见 <how-to-verify> 步骤说明。
  </action>
  <how-to-verify>
    请按顺序执行以下步骤并向 executor 反馈结果。**全部 8 步均为必做**（Plan 02 已强制安装 cargo-dist 并通过 cargo dist plan，故本 checkpoint 第 5 步不再允许 fallback）：

    1) **本地构建验证**：
       ```
       cargo build --release 2>&1 | tail -5
       cargo test --lib 2>&1 | tail -10
       ```
       期望：两条命令均退出码 0，无 warning（既有 + 新增测试全部 pass）。

    2) **Cargo.toml 与配置文件检查**：
       ```
       grep -E "^(description|license|repository|version)" Cargo.toml
       grep -A 30 "\[workspace.metadata.dist\]" Cargo.toml
       cat .cargo/config.toml
       ```
       期望：description/license/repository 三个字段都填了，dist 配置完整，三个 target triple 正确（注意 Windows 用 msvc 而非 gnu，符合更新后的 D-04），.cargo/config.toml 含 aarch64-linux-gnu-gcc linker（符合更新后的 D-05）。

    3) **release.yml 检查**：
       ```
       head -30 .github/workflows/release.yml
       grep -ic "nasm" .github/workflows/release.yml
       grep -ic "tags:" .github/workflows/release.yml
       ```
       期望：on.push.tags 触发条件存在，NASM 安装步骤至少一次。

    4) **CLI placeholder 验证**：
       ```
       cargo run --release -- install-windows 2>&1 | head -5
       echo "exit code: $?"
       ```
       期望：stderr 含 "PLAT-04 spike 待完成" 提示，进程退出码 1。

    5) **cargo dist plan（必做，无 fallback）**：
       ```
       cargo dist --version
       cargo dist plan 2>&1 | tail -20
       ```
       期望：
       - `cargo dist --version` 输出含 "0.32"（Plan 02 已强制安装）
       - `cargo dist plan` 退出码 0
       - 输出含三个平台 triple：`x86_64-unknown-linux-gnu`、`aarch64-unknown-linux-gnu`、`x86_64-pc-windows-msvc`
       - 无 "Missing required Cargo.toml fields" 或 "unsupported target" 错误
       **重要变更**：此步骤已从原"可选"升级为"必做"。Plan 02 已要求 executor 完成 cargo-dist 0.32.0 的本地安装并通过 cargo dist plan，故 checkpoint 必须二次确认。若本地未安装/失败，说明 Plan 02 验证不充分，应回到 Plan 02 修复而非跳过。

    6) **README/CHANGELOG 一致性**：
       打开 README.md 检查：curl|sh 命令、PowerShell 命令、平台矩阵、PLAT-04 限制段落是否齐全且与 Cargo.toml 一致。
       打开 CHANGELOG.md 检查：v0.1.0 的 Added/Fixed/Security 段落是否完整。

    7) **既有 CI 未破坏**：
       ```
       cat .github/workflows/update-versions.yml | head -10
       ```
       期望：内容与原版一致（cron + workflow_dispatch + 更新 versions.json 的 job）。

    8) **确认 Cargo.toml 版本号非占位符**：
       ```
       grep '^version' Cargo.toml
       ```
       期望：版本字段不为 `0.0.0`，已手动更新为要发布的版本（如 `version = "0.1.0"`）。

    完成后请告诉 executor：
    - 全部 8 步是否通过
    - 如有问题，具体哪一步出错（含命令输出片段）
    - 是否同意进入 **"approved"** 状态（同意后 executor 将自动执行步骤 9-12 完成实际发布）

    9) **（approved 后，executor 执行）推送 tag 触发发布**：
       读取 Cargo.toml 版本号，执行：
       ```
       git tag v$(grep '^version' Cargo.toml | head -1 | sed 's/.*= *"//;s/"//')
       git push origin HEAD
       git push origin --tags
       ```
       期望：tag push 成功，无错误输出。

    10) **（executor 执行）等待 CI 完成**：
       ```
       gh run watch --exit-status $(gh run list --workflow=release.yml --json databaseId -q '.[0].databaseId')
       ```
       期望：命令退出码 0（CI 成功）。若 CI 失败则回报失败步骤，本 Plan 标记为 blocked。

    11) **（executor 执行）验证 Release assets 已发布**：
       ```
       TAG=v$(grep '^version' Cargo.toml | head -1 | sed 's/.*= *"//;s/"//')
       gh release view "$TAG" --json assets -q '.assets[].name'
       ```
       期望输出含（可部分匹配）：
       - `dm-installer-x86_64-unknown-linux-gnu.tar.gz`
       - `dm-installer-aarch64-unknown-linux-gnu.tar.gz`
       - `dm-installer-x86_64-pc-windows-msvc.zip`

    12) **（executor 执行）验证 Linux x86_64 asset 可下载**：
       ```
       TAG=v$(grep '^version' Cargo.toml | head -1 | sed 's/.*= *"//;s/"//')
       ASSET_URL=$(gh release view "$TAG" --json assets -q '.assets[] | select(.name | contains("linux-gnu.tar.gz")) | .url')
       curl -sSfL "$ASSET_URL" | tar -tz | head -5
       ```
       期望：tar 列表包含 `dm-installer` 二进制文件名，退出码 0。
  </how-to-verify>
  <verify>
    <human-check>用户回复 "approved"（步骤 1-8 全通过）；若有失败步骤则回复失败步骤号 + 命令输出片段</human-check>
    <automated>步骤 9-12 由 executor 在 approved 后自动执行；步骤 11 的 gh release view 输出必须包含三平台 asset 名称；步骤 12 的 curl|tar 退出码必须为 0</automated>
  </verify>
  <acceptance_criteria>
    - 行为断言：用户在 checkpoint 中执行 8 步验证（全部必做，不允许第 5 步 fallback），并明确回复 "approved"
    - 行为断言：第 5 步 `cargo dist plan` 必须成功输出三平台 triple；若失败则回报 Plan 02 验证不充分
    - 源码断言：`grep '^version' Cargo.toml` 输出版本号非 `0.0.0`（approved 前必须确认）
    - 行为断言（approved 后）：`git push origin --tags` 退出码 0，tag 成功推送
    - 行为断言（approved 后）：`gh run watch` 退出码 0，GitHub Actions release.yml 运行成功
    - 行为断言（approved 后）：`gh release view` 输出包含三平台 asset 名称（linux-gnu.tar.gz、aarch64-linux-gnu.tar.gz、windows-msvc.zip）
    - 行为断言（approved 后）：`curl -sSfL <linux asset url> | tar -tz` 退出码 0，tar 列表含 `dm-installer`
  </acceptance_criteria>
  <done>
    用户已完成 8 步 checkpoint 验证并回复 "approved"；executor 推送 v0.1.0 tag，GitHub Actions 成功构建三平台二进制，GitHub Releases 已发布含三个 asset 的 Release；Linux x86_64 asset 可通过 curl 下载并解压。Phase 4 目标达成：多平台二进制通过 GitHub Releases 分发，用户可通过 curl|sh 实际安装。
  </done>
  <resume-signal>Type "approved" 或描述具体问题（含失败步骤号 + 命令输出）</resume-signal>
</task>

</tasks>

<threat_model>
## Trust Boundaries

| Boundary | Description |
|----------|-------------|
| README 文档 → 用户认知 | 文档准确性直接影响用户操作；URL 错误会导致下载失败或加载错误版本 |
| GitHub Releases asset → 用户机器 | cargo-dist 的 installer.sh 在用户本地以 root/普通用户身份执行；asset 完整性由 GitHub Releases attestation 保护 |
| 人工 checkpoint → tag 推送 | 用户在 checkpoint 确认所有配置后，由用户手动 push tag 触发真实发布 |

## STRIDE Threat Register

| Threat ID | Category | Component | Disposition | Mitigation Plan |
|-----------|----------|-----------|-------------|-----------------|
| T-04-10 | InformationDisclosure | README 中 curl|sh 命令若指向错误的 repository URL，可能误导用户下载其他人的 fork | mitigate | URL 严格基于 Cargo.toml [package].repository 生成；checkpoint 步骤 6 检查一致性 |
| T-04-11 | Tampering | 用户混淆 install.sh（Phase 1 DM 安装）与 dm-database-installer-installer.sh（dm-installer 工具引导），可能执行错误脚本 | mitigate | README 小节 4 明确区分；CHANGELOG 也提及 |
| T-04-12 | Repudiation | tag 推送后若 CI 失败但无人发现，发布状态不一致 | mitigate | 步骤 10 用 `gh run watch --exit-status` 阻塞等待 CI 完成；若 CI 失败则 Plan 立即标记为 blocked，不继续步骤 11-12 |
| T-04-SC | Tampering | 本 plan 不引入新代码/依赖 | accept | 仅文档变更；CHANGELOG 与 README 是纯 Markdown，无可执行内容 |
</threat_model>

<verification>
- `test -f README.md && test -f CHANGELOG.md` 退出码 0
- README 含 curl|sh 命令、PowerShell 命令、三平台 triple、PLAT-04 限制（由 Task 1 acceptance_criteria 已覆盖）
- CHANGELOG 含 v0.1.0 + Added/Fixed/Security 段落 + 5 个 CR + 4 个 PLAT 引用（由 Task 2 acceptance_criteria 已覆盖）
- 用户在 checkpoint 中确认 8 步全部 pass 并签 "approved"
- `gh release view v0.1.0 --json assets -q '.assets[].name'` 输出含三平台 asset 名称
- `curl -sSfL <linux-gnu asset url> | tar -tz` 退出码 0，tar 列表含 `dm-installer`
</verification>

<success_criteria>
- 四个 PLAT 需求文档层全部 cover：README 平台矩阵覆盖 PLAT-01/02/03/04，PLAT-04 的 placeholder 限制明确说明
- README 区分两个 install.sh 的功能（D-08）
- CHANGELOG v0.1.0 记录所有已完成的 Phase 2/3/4 变更和五个 CR-XX 修复
- 人工 checkpoint 8 步全部 pass（含强制的 cargo dist plan 第 5 步），用户签 "approved"
- 现有 update-versions.yml CI 工作流未被破坏
- v0.1.0 tag 已推送，GitHub Actions release.yml 成功运行，GitHub Releases 发布三平台二进制
- Linux x86_64 用户可通过 curl|sh 从 GitHub Releases 实际下载并解压 dm-installer 二进制（PLAT-01 端到端验证）
</success_criteria>

<output>
Create `.planning/phases/04-release/04-03-SUMMARY.md` when done. SUMMARY 应记录：
- README 实际添加的小节标题与位置
- CHANGELOG.md 是新建还是追加
- 人工 checkpoint 的最终签字结果（approved / 调整后 approved / blocked）
- 第 5 步 `cargo dist plan` 的实际输出片段（含三个 triple 命中证据）
- Phase 4 收尾时未解决的遗留事项（若有）：例如 Phase 1 是否仍未完成而影响 README 中 install.sh 引用
- 正式发布所需的最终用户操作（git tag + push）
</output>
</content>
