# MEXP14 QA-EDC-03 日期:2026-07-07 项目:Mindraw Plan ID:`P-20260706-external-distribution-candidate` Task ID:`QA-EDC-03` 角色:QA ## 用户目标 PMO 派发 `QA-EDC-03`,要求从 QA 角色收口 MEXP14 外部分发候选的 App rollback 验证与剩余真实环境风险。边界是不得破坏当前主力机器状态,不改源码、构建、候选产物,不替 PMO 宣布候选升级。 ## 已完成事项 - 按派工顺序读取 `AGENTS.md`、`INDEX.md`、统一台账 MEXP14 计划项、治理收口文档、`QA-EDC-02` 报告、用户新机器 CLI / GUI 证据和 OPS rollback 模板。 - 核对 App candidate `1.2.3 / Build202607061556` 与 rollback target `1.2.3 / Build202607042351` 的本地 DMG SHA256。 - 非破坏性读取当前 `/Applications/Mindraw.app` 版本,确认当前主力机器已经是 rollback target `Build202607042351`,不是可用于验证从 candidate 回滚的 prepared machine。 - 补读 `M4C-EDC-02` rollback / freeze / archival 记录,确认 plugin 侧已记录无上一版外部分发 baseline,并选择 remove-only rollback,但仍待 `REVIEW-EDC-02`。 - 产出 QA 报告:`02-P/MEXP14-ExternalDistributionCandidate/qa/qa-edc-03-rollback-and-residual-risk-20260707.md`。 - 回写 `02-P/plan-progress.markdown` 的 MEXP14 状态、任务卡、证据链接和 Progress Log。 - 更新 `INDEX.md`,把 `QA-EDC-03` 报告加入 MEXP14 QA 证据索引。 ## 关键决策 - `qa_result=BLOCKED_PENDING_PREPARED_MACHINE`。 - `PM_NOTIFY_READY=yes`,含义是 QA-EDC-03 报告和阻塞条件已经可供 PMO 收敛,不代表 QA PASS、PMO Gate、发布或用户验收通过。 - 当前机器不执行 destructive rollback:不删除 `/Applications/Mindraw.app`,因为当前机器不是 prepared rollback target,且已经安装 rollback baseline。 - Plugin remove-only rollback 只认定为 CLI 层 `PASS_WITH_LIMITS`;`M4C-EDC-02` 已记录无 previous external plugin baseline 并采用 remove-only policy,但该记录仍待 Review Gate `crg-941a537b8e13` / PMO 接受,Codex Desktop GUI removal 未覆盖。 ## 文件变更 - 新增:`/Users/ar/Projects/Mindraw/02-P/MEXP14-ExternalDistributionCandidate/qa/qa-edc-03-rollback-and-residual-risk-20260707.md` - 修改:`/Users/ar/Projects/Mindraw/02-P/plan-progress.markdown` - 修改:`/Users/ar/Projects/Mindraw/INDEX.md` - 新增本会话记录:`/Users/ar/Projects/Mindraw/.codex-sessionhistory/2026-07-07-MEXP14-QAEDC03.md` - 更新命令索引:`/Users/ar/Projects/Mindraw/.codex-sessionhistory/COMMANDS.md` ## 核心事实 / 变更快照 - 变更对象:MEXP14 `QA-EDC-03` App rollback 与剩余真实环境风险状态。 - 事实来源: - `02-P/MEXP14-ExternalDistributionCandidate/qa/qa-edc-03-rollback-and-residual-risk-20260707.md` - `02-P/plan-progress.markdown` - `INDEX.md` - 变更前:`QA-EDC-03` 仍待执行;`QA-EDC-02` 记录 App rollback 未覆盖,plugin remove-only rollback 只有 clean CLI profile 证据。 - 变更后:`QA-EDC-03` 报告明确 App rollback 状态为 `BLOCKED_PENDING_PREPARED_MACHINE`;台账将 MEXP14 状态更新为 `Active / QA-EDC-03 reported BLOCKED_PENDING_PREPARED_MACHINE / not formal release`;`QA-EDC-03` 任务卡被标为已产出报告;plugin rollback 口径更新为 `remove-only recorded pending review`,不再写成单纯未处理。 - 版本 / build 基线: - App candidate:`1.2.3 / Build202607061556` - Candidate DMG SHA256:`3b17b89461374621c80d127e6475e6de502031486201f672f7fc4fde57e744a8` - Rollback target:`1.2.3 / Build202607042351` - Rollback target DMG SHA256:`5c8041288a61f8c09e7bf0ca8a0bcd68b55d17e5aaa1079eb8d7864a952481b5` - 当前主力机器 `/Applications/Mindraw.app`:`1.2.3 / Build202607042351` - Plugin candidate:`mindraw-plugin-0.1.0+codex.20260704090518-EDC20260706154843` - Plugin marketplace:`mindraw-mexp14-edc-20260706154843` - Plugin tarball SHA256:`ee06e91a866049b6a8062367f77fc659aa3c3c9f5638f7b0c2b61ad8e14aa2f1` - 范围边界:本轮只收口 QA 风险与可执行步骤,不执行真实 App rollback,不做正式发布、不做 PMO Gate、不做用户验收结论。 - 验证证据:DMG SHA256 与当前 App Info.plist 的只读命令输出已写入 `QA-EDC-03` 报告。 ## 可复用命令 / Runbook 用途:在 prepared fresh / clean machine 上验证 MEXP14 App candidate 能从 `Build202607061556` 回滚到 `Build202607042351`,并捕获命令与截图证据。 前置条件: - 只在可替换 `/Applications/Mindraw.app` 的 prepared fresh Mac、clean macOS user、VM 或 disposable machine 上执行。 - 已准备 candidate DMG 与 rollback DMG。 - 当前主力机器不得执行删除 `/Applications/Mindraw.app` 的步骤。 只读基线核对: ```bash shasum -a 256 /Users/ar/Projects/Mindraw/03-O/C2.builds/releases/Build202607061556/Mindraw_1.2.3_aarch64-Build202607061556.dmg shasum -a 256 /Users/ar/Projects/Mindraw/03-O/C2.builds/releases/Build202607042351/Mindraw_1.2.3_aarch64-Build202607042351.dmg /usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' /Applications/Mindraw.app/Contents/Info.plist /usr/libexec/PlistBuddy -c 'Print :CFBundleVersion' /Applications/Mindraw.app/Contents/Info.plist ``` Prepared machine rollback 验证: ```bash sw_vers uname -m whoami test -d /Applications/Mindraw.app && /usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' /Applications/Mindraw.app/Contents/Info.plist test -d /Applications/Mindraw.app && /usr/libexec/PlistBuddy -c 'Print :CFBundleVersion' /Applications/Mindraw.app/Contents/Info.plist CANDIDATE_DMG="/path/to/Mindraw_1.2.3_aarch64-Build202607061556.dmg" ROLLBACK_DMG="/path/to/Mindraw_1.2.3_aarch64-Build202607042351.dmg" shasum -a 256 "$CANDIDATE_DMG" shasum -a 256 "$ROLLBACK_DMG" hdiutil verify "$CANDIDATE_DMG" hdiutil verify "$ROLLBACK_DMG" CANDIDATE_MOUNT="/tmp/mindraw-edc-candidate-mount-$$" mkdir -p "$CANDIDATE_MOUNT" hdiutil attach -nobrowse -readonly -mountpoint "$CANDIDATE_MOUNT" "$CANDIDATE_DMG" ditto "$CANDIDATE_MOUNT/Mindraw.app" /Applications/Mindraw.app hdiutil detach "$CANDIDATE_MOUNT" /usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' /Applications/Mindraw.app/Contents/Info.plist /usr/libexec/PlistBuddy -c 'Print :CFBundleVersion' /Applications/Mindraw.app/Contents/Info.plist codesign --verify --deep --strict --verbose=2 /Applications/Mindraw.app spctl --assess --type execute --verbose=4 /Applications/Mindraw.app open -a /Applications/Mindraw.app BACKUP_ZIP="$HOME/Desktop/Mindraw.app.candidate-backup-$(date +%Y%m%d%H%M%S).zip" ditto -c -k --sequesterRsrc --keepParent /Applications/Mindraw.app "$BACKUP_ZIP" ls -lh "$BACKUP_ZIP" pkill -x Mindraw 2>/dev/null || true rm -rf /Applications/Mindraw.app ROLLBACK_MOUNT="/tmp/mindraw-edc-rollback-mount-$$" mkdir -p "$ROLLBACK_MOUNT" hdiutil attach -nobrowse -readonly -mountpoint "$ROLLBACK_MOUNT" "$ROLLBACK_DMG" ditto "$ROLLBACK_MOUNT/Mindraw.app" /Applications/Mindraw.app hdiutil detach "$ROLLBACK_MOUNT" /usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' /Applications/Mindraw.app/Contents/Info.plist /usr/libexec/PlistBuddy -c 'Print :CFBundleVersion' /Applications/Mindraw.app/Contents/Info.plist codesign --verify --deep --strict --verbose=2 /Applications/Mindraw.app open -a /Applications/Mindraw.app ``` Plugin remove-only rollback 命令: ```bash codex plugin remove mindraw@mindraw-mexp14-edc-20260706154843 codex plugin marketplace remove mindraw-mexp14-edc-20260706154843 codex plugin list ``` 验证步骤: - App rollback 后 `/Applications/Mindraw.app` 必须存在,版本为 `1.2.3`,build 为 `Build202607042351`。 - Mindraw App 能打开,或 Gatekeeper / launch blocker 被截图和记录。 - 如果同时验证 Codex Desktop,sidebar 必须打开当前内容或明确 fail-closed,不得展示旧预览且标为 `READY`。 - Plugin remove-only rollback 需要 CLI removal 后再补 Codex Desktop GUI removal 截图,才覆盖 GUI 层。 搜索关键词:`QA-EDC-03`、`BLOCKED_PENDING_PREPARED_MACHINE`、`Build202607061556`、`Build202607042351`、`mindraw-mexp14-edc-20260706154843`、`App rollback`。 ## 未决问题 - 仍需 PMO / QA 提供 prepared fresh / clean machine 后执行真实 App rollback。 - Plugin remove-only rollback 目前只有 clean CLI profile 证据;用户 fresh machine removal 与 Codex Desktop GUI removal 未覆盖。 - Previous external plugin baseline 已由 `M4C-EDC-02` 记录为不存在,候选策略为 remove-only rollback;仍待 `REVIEW-EDC-02` / PMO 接受。 - 签名 / notarization、App rollback prepared machine、Codex Desktop GUI removal、P2 artifact storage 仍是 MEXP14 剩余治理风险。 ## 后续建议 - PMO 若要关闭 App rollback 风险,应准备可替换 `/Applications/Mindraw.app` 的机器,并按 `QA-EDC-03` 报告步骤执行。 - 若 PMO 只要求 plugin remove-only rollback,应补一轮 Codex Desktop GUI removal 截图,或明确接受 CLI-only 限制;`M4C-EDC-02` 的 `crg-941a537b8e13` 仍需对应代码 / 文档复核闭环。 ## 三个月后回看检查 只读本存档可以还原本轮目标、QA 结论、版本 / build / SHA 基线、为什么不能在当前主力机器执行 rollback、需要怎样的 prepared machine,以及后续补测命令。