mcpField
C
close

close

github.com/davidlee开发2142 次安装3 天前更新
代码仓库

关于 close

close 是用于正式结束 Doctrine slice 的开发技能,要求在实现与协调审查后完成关闭。它检查发现项、偏差、提交及相关待办事项,再将 slice 标记为完成。

主要功能

  1. 01检查阶段标准与协调审查
  2. 02关闭前处理所有发现项
  3. 03验证偏差与提交状态
  4. 04处理已派发 slice 的集成

适用场景

  1. 01关闭已审计的 Doctrine slice
  2. 02标记完成前核对协调审查
  3. 03登记已落地的派发变更

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/davidlee/doctrine --skill close

安装后在 Claude Code 中输入/close确认已加载。

详细介绍

关闭

你正在执行正式关闭,而不只是标记工作已完成。

输入:

  • 已完成、审计并协调一致的实现阶段
  • 协调审查(RV),其中每项发现都已终结,并记录了 ## Reconciliation Outcome(参见 /reconcile)
  • 管辖范围内的切片 ID

流程

  1. 预检查:

    • 阶段退出标准(EX-)和验证(VT-)均已满足。确认汇总结果:doctrine slice list 应显示该切片为 X/X complete,且没有 !N 阻塞项、没有 ?N 异常项、没有 — 未跟踪项。
    • /reconcile 已完成(通过 /audit → /reconcile):RV 台账已解决,每项治理/规格发现都已处置,且 RV 中包含 ## Reconciliation Outcome 部分。如果协调简报为空(无操作),结果部分应明确确认这一点。
    • 在关闭前,已依据 lib:reference/harvest.md 收集该切片的持久性发现,或明确拒绝收集。干净的切片可以不收集任何内容;关闭检查的是是否通过了明确拒绝这一关。
    • doctrine check gate 为绿色。
  2. 规格一致性关卡——在标记为 done 前确认协调已完成: 在终态转换前,验证审计协调简报中的每一项都已通过以下四种路径之一解决:

    • REV 已完成——治理/规格事项由状态为 done 的 REV 覆盖(revision status REV-N done)。REV 说明(revision-NNN.md)包含协调叙述。
    • 已撤回——在 RV 中撤回该发现并说明理由。
    • 已容忍——在 RV 中容忍该发现并说明理由。
    • 已升级至设计——通过设计回边(reconcile → design)将切片转回 design。 此外:
    • 每项切片内的直接编辑事项都已应用到 design.md/slice-NNN.md,并记录在 ## Reconciliation Outcome 中。
    • RV 台账已解决(done · await=none):每项发现均已终结,且审查轮次已结束(review conclude RV-NNN --basis …)。即使所有发现均已终结(包括零发现的台账),台账仍会显示 active · await=raiser,直到发起方结束审查轮次;应结束审查轮次,而不是新增一个占位发现。是否存在未解决的阻塞项才是转换的关卡,而非状态字符串(它只是显示摘要,绝非关卡)。
    • 已记录协调结果(REV 说明和/或 RV 的 ## Reconciliation Outcome)。 不允许存在无明确归属的“已拒绝”处置;每项发现都必须进入上述某一终态。 如果仍有任何事项未解决,拒绝关闭并返回 /reconcile。 (结构性关闭接口是机械性兜底;此关卡是实质性检查——动词负责执行,技能负责核验。)
  3. 干净地提交: 将 .doctrine/** 工作流产物拆分为小型、干净且以切片 ID 为范围的常规提交,而不是让它们不断累积。代码与工作流编辑可以一起提交,也可以分开提交,以最先能干净完成的方式为准。

    暂存 slug 符号链接。 */new 动词会创建 <kind>/NNN/,以及同级 slug 符号链接 <kind>/NNN-slug -> NNN(slice、review、revision、rec 等)。 按路径执行 git add <kind>/NNN/ 只会暂存目录,不会包含符号链接,导致其未提交。请同时暂存两者——git add <kind>/NNN*——或明确添加符号链接。最终提交前,检查 git status 中是否有未提交的 NNN-slug。 3a. 已分派的切片——整合获准的 OID(仅限审计后)。 如果该切片由 /dispatch 驱动,现在请投影已审计的单元:

    # 0. Resolve the trunk delivery ref once (config-driven; default refs/heads/main):
    trunk=$(doctrine dispatch deliver-to)
    
    # 1. Admit a close_target candidate (if not already done during /reconcile):
    doctrine dispatch candidate create --slice <N> --label close-001 \
      --role close_target --payload code --base "$trunk" \
      --source refs/heads/review/<N>
    doctrine dispatch candidate admit --slice <N> --role close_target \
      --candidate refs/heads/candidate/<N>/close-001 --review RV-NNN
    
    # 2. Project onto trunk (--trunk is REQUIRED; omitting it is a dry run):
    doctrine dispatch sync --slice <N> --integrate --trunk "$trunk"
    

    当候选工作流处于活动状态时,此操作针对不可变的 已准入 close_target OID(而 --edge 针对已准入的 review_surface OID),并采用仅允许快进的 CAS 行——绝不针对原始 phase/*/review/* 分支顶端或可变候选引用,也绝不在关闭时合并。若主干已移动,则拒绝操作(在新基线上准入一个更新的关闭目标候选项)。这是 唯一 运行 --integrate 的位置——绝不在 /dispatch 收尾时运行,只在此处、审计后运行。

    验证(树级真实校验)。 执行 --integrate --trunk 后,以下两项检查必须通过——除非通过,否则不得继续执行步骤 4:

    # (a) No phantom reverse-diff: the tracked working tree matches HEAD. A nonzero
    #     exit means integrate advanced the ref but desynced the live checkout — STOP.
    git diff --quiet HEAD
    
    # (b) The projected delta genuinely landed (not a silent dry-run): the committed
    #     journal's trunk row holds the planned tip; it must equal the trunk ref.
    trunk=$(doctrine dispatch deliver-to)
    planned=$(doctrine dispatch sync --slice <N> --show-journal-trunk-oid \
      --trunk "$trunk")
    git diff --quiet "$planned" "$trunk"
    

    (a) 这是幻影反向差异检测器——检查整个受跟踪树,而非仅限路径(幻影反向差异可能横跨切片投影的任何文件,不仅仅是 src/)。 (b) 从已提交的 dispatch/<N> 日志读取主干行的 planned_new_oid(读取树,且在此检出中保持稳定),并将其与解析后的主干交付引用(doctrine dispatch deliver-to,默认为 refs/heads/main)进行差异比较;若两者不同,则表示主干未包含投影的顶端,因此集成未落地。

3b. 谱系分离——载荷通过外部途径到达主干 (--record-integration)。 参见 lib:reference/dispatch-mechanics.md § 谱系分离——记录已落地的载荷,不推进主干。 关闭门仍会拒绝 done(“已分发但没有主干行”)。记录已取得的行,而非手动编辑 journal.toml:

trunk=$(doctrine dispatch deliver-to)
doctrine dispatch sync --slice <N> --record-integration --trunk "$trunk"

根据 lib:reference/dispatch-mechanics.md § 谱系分离, --record-integration 会断言载荷已是主干的祖先,并提交一条已验证的主干行。随后,slice status <N> done 会读取该行并通过。这是经认可的手写日志行替代方案;请通过外部途径落地载荷,例如 git merge --no-ff phase/<N>-NN(或已准入的候选项),而不是 review/<N>。

  1. 转换生命周期: 确认切片处于 reconcile 状态(若 /audit 未执行此操作,则用 doctrine slice status <id> reconcile 切换),然后执行 doctrine slice status <id> done(<id> 是不带前缀的数字,例如 40)。 关闭接缝会强制执行顺序;只要存在一个针对该切片且仍带有未解决阻塞项的 RV,就会拒绝操作。重新运行 doctrine slice list,并确认分歧标记 ⚠ 已消失——此时编写的状态与汇总状态一致。(终态集合为 {done, abandoned};此处的关闭是 done 路径——放弃切片是单独的决定,不属于此技能。)
  2. 关闭发起此流程的待办项: 如果某个待办项(ISS/IMP/CHR/RSK)发起了此切片,也要转换该待办项——doctrine backlog edit <ID> --status resolved --resolution fixed(或适合的 resolution)。已关闭的切片若其来源待办项仍未关闭,就是维护负担。
  3. 如果仍有未解决的阻塞性发现,不要关闭——返回 /reconcile。如果关闭依赖于容忍具有实质权衡的偏差,请先执行 /consult,再将其常态化。
偏差消解步骤

当 slice status <id> done 因未消解的剩余偏差而拒绝时,每项被标记的需求都需要一条由正在关闭的切片拥有且满足以下三个条件的 accept REC:

  • (a) move = accept——表示确认,而非 revise/redesign。
  • (b) 包含一个 [[status_delta]],其中指定该需求的 to 等于其当前编写的状态(拒绝信息中打印的状态)。
  • (c) REC 的 [[evidence_ref]] 集合 ⊇ 所有为该需求的合成结果提供信息的不同覆盖键,以免过时的 REC 为新的矛盾证据开脱。

编写后,手动编辑这两张表:

doctrine rec new --move accept --owning-slice SL-NNN --title "accept REQ-NNN"
# then hand-author the [[status_delta]] and [[evidence_ref]] tables

完整谓词、理由和示例: doctrine memory show mem.pattern.doctrine.close-drift-discharge-rec。

成果

  • 切片已标记为 done,且汇总状态一致。
  • 起始的待办事项(如有)已解决。
  • 已将持久性指导记录在记忆中,或明确决定不予记录。
  • 工作树干净,且工作流产物已提交。

评论

支持 Markdown