Skip to content

fix(engine): 允许无本地草稿收口 proposal - #201

Merged
catoncat merged 2 commits into
mainfrom
agent/abandon-missing-draft
Jul 22, 2026
Merged

fix(engine): 允许无本地草稿收口 proposal#201
catoncat merged 2 commits into
mainfrom
agent/abandon-missing-draft

Conversation

@catoncat

Copy link
Copy Markdown
Collaborator

Mainline Intent

Intent: int_7d0eabd8
Status: proposed
Title: 允许收口缺失本地 draft 的共享 proposal

What changed

调整 Service.Abandon 的状态来源:本地 draft 真正缺失时回退共享 IntentView,沿既有状态机处理 sealed_local/proposed 到 abandoned;只在本地 draft 原本存在时更新缓存。新增回归覆盖 proposed、sealed_local、drafting、两边缺失和全部非法终态,并验证不会伪造 draft 或误写 actor log。

Why

已 seal/publish 的 proposal 在 worktree 正常清理后仍属于共享控制面,但旧实现无条件先读 gitignored 的本地 draft,导致 doctor 建议的 abandon 永远返回 NO_ACTIVE_INTENT,旧 proposal 无法进入 abandoned 终态。

Decisions

  • 本地 draft 缺失时的生命周期状态来源: 仅在 os.IsNotExist 时回退共享 IntentView,并继续使用既有 ValidateStateTransition (共享 view 是 sealed/published 生命周期的可恢复权威;复用状态机可以同时允许 sealed_local/proposed 并拒绝所有非法终态。)
    • Rejected: 继续把本地 draft 作为所有 abandon 的强制前置条件
    • Rejected: 绕过状态机直接把共享 view 标记为 abandoned
  • drafting 的本地语义: draft 缺失且共享 view 不存在或仅为 drafting 时仍返回 NO_ACTIVE_INTENT (drafting 从未发布,本地文件仍是其完整生命周期足迹,不能因共享缓存残影写公共 abandon 事件。)
  • 缺失 draft 的写回策略: 只在 draft 原本存在时更新其状态,缺失时只写 actor-log event 并刷新共享读面 (worktree 缓存清理是正常生命周期,不应为完成共享状态转换重新制造本地缓存。)
    • Rejected: 为缺失 draft 合成占位文件

Subsystems: engine, intent-lifecycle, actor-log, materialized-view

@catoncat
catoncat marked this pull request as ready for review July 22, 2026 03:37
@catoncat
catoncat merged commit 37bdcb7 into main Jul 22, 2026
8 checks passed
@catoncat
catoncat deleted the agent/abandon-missing-draft branch July 22, 2026 03:42
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