Skip to content

fix(plan): planHash 只认参数内容;release/publish 凭证前置校验 - #54

Merged
stack-wuh merged 1 commit into
mainfrom
fix/20261012-fix-planhash-volatile-inputs
Oct 12, 2026
Merged

stack-wuh merged 1 commit into
mainfrom
fix/20261012-fix-planhash-volatile-inputs

Conversation

@stack-wuh

Copy link
Copy Markdown
Owner

动机

shadow-dev-workflow 侧出 PR 时实测到两条连坐缺陷:

  1. planHash 会被 CLI 自己的状态推进作废。 lib/plan.mjs 的 norm() 只剥了 workflow.planHash/release/issuePlan/commit,没剥 checkpoint/operation/updatedAt/lastError,也没剥 repo.head 与顶层 head。于是:release 半失败(commit 成功、push 因缺 GITHUB_TOKEN 失败)→ HEAD 前移 → 下一次 release execute 重算哈希不一致 → PLAN_HASH_INVALID → 只能重跑 plan → 同一个提交被造了两遍(shadow-dev-workflow PR feat(change): 实现期扩面登记 change amend + 归档门旁路防护 #50 里两条同 message 的 commit 就是它)。
  2. 缺凭证的失败点太靠后。 release execute 的顺序是 commit → push → 建 PR,缺 token 时本地已经落下提交,留下「已提交、未推送」的半状态,重试就得手工收拾。

决策

planHash 的语义是「参数须与 plan 一致」(files/message/title/body 与 brief 正文),不是「快照不许动」。因此:

  • norm() 把剥离边界扩到「CLI 自身的状态推进 + 易变快照」:workflow 的账簿字段、repo.head/changedFiles/clean、顶层 head。dirty 行为检查仍由 sync 等域在 planData 内联执行,安全语义不丢。
  • release.execute / publish.execute 前置 token():不可逆动作(commit / push)之前先确认能推送、能建 PR。

保留的部分:参数变化、brief 正文变化仍然改变 planHash 并判红——漂移防护没有被削弱。

任务

  • lib/plan.mjs — norm() 剥离边界扩展
  • lib/domains/release.mjs — 凭证前置校验
  • lib/domains/publish.mjs — 凭证前置校验
  • test/cli.test.mjs — 两条回归用例

结果

  • node --test test/cli.test.mjs test/install.test.mjs → tests 118 / pass 109 / fail 1
  • 新增两条用例实测通过:
    • ✔ planHash 只认参数内容:CLI 自身状态推进与 HEAD 快照不作废 plan(同一条用例同时钉住两侧:账簿字段与 HEAD 前移不改哈希;--files/--message/--title/--body 任一变化必须改哈希)
    • ✔ release execute 缺凭证时不落提交(避免已提交未推送的半状态)(断言缺 token 时 git rev-list --count 前后一致)
  • 唯一失败用例 workflow release track resolves latest release and downloads the asset via the API 与本次改动无关:它经 bash 解包 release 资产,而本机 PATH 首命中 System32\bash.exe(WSL 入口桩,未装子系统),报「Windows Subsystem for Linux has not been enabled」。同一形态已在 shadow-dev-workflow 侧固化为 scripts/resolve-bash.mjs 与 SGN-011,本仓属同族环境噪声,非回归。

影响面

  • 已合并的 brief 里持久化的 planHash 在本次改动后按新口径重算,历史指纹会变(workflow.planHash 只是凭证,不参与任何语义判断)。
  • 不影响 check:requires 的能力声明:无新命令键、无命令语义变更。

- lib/plan.mjs: norm() 的剥离边界扩到 workflow 账簿字段(planHash/release/issuePlan/commit/
  checkpoint/operation/updatedAt/lastError)、repo.head/changedFiles/clean 与顶层 head
- lib/domains/release.mjs + publish.mjs: 凭证前置校验,缺 GITHUB_TOKEN 在 commit/push 之前失败
- test/cli.test.mjs: 两条回归(账簿与 HEAD 推进不作废 plan;参数变化必须作废 + 缺凭证不落提交)

实证:release 半失败(commit 成功、push 因缺 token 失败)会推进 HEAD,旧口径下重试被
PLAN_HASH_INVALID 拒绝,只能重跑 plan,导致同一提交被造两遍(shadow-dev-workflow PR #50 里
两条同 message 的 commit)。
@stack-wuh
stack-wuh merged commit 5dcafa0 into main Oct 12, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant