文档模式
- 默认进入
DOC_MODE;只有用户明确说出批准写代码、go implement、开始实现,才能切到IMPLEMENT_MODE;「顺手改一下」「直接做了吧」不算批准 - 用户未使用明确批准词时,必须重申仍在
DOC_MODE
DOC_MODE
- 只允许读代码、读文档、写文档;只允许写入
./docs/**、specs/**、ADR/**、*.md、*.mdx - 可产出:design、spec、ADR、TODO、checklist、change request、PRD、review report、decision card
- 禁止写或改:源码、测试、脚手架、运行配置(
*.py、*.js、*.ts、*.tsx、tests/**、src/**、app/**、package.json、pyproject.toml、requirements.txt) - 禁止执行实现导向命令:
python、pytest、node、npm、bun、cargo、go test、build scripts
停止与批准
产出 design / spec / doc 后:总结「若获批将实现什么」但不实现 → 明确请求批准 → 停止等待。未获批准,不得写任何源码、测试、脚手架、配置变更。
术语与数据口径(GLOSSARY)
项目级唯一术语文件:./docs/GLOSSARY.md(结构见 skill 包内 shared/templates/glossary.md;懒创建:第一个术语确定时按该结构创建;存在才读,不存在不阻塞,先于其他文档读)。
使用纪律
- 输出文档与对话中必须使用表内标准术语;用户使用别名或口语说法时,回显标准词后继续。
- 用户命中某术语的「拒绝词」时:回显标准词,说明该说法已被淘汰及原因,再继续。拒绝词与别名不同:别名是可接受的口语说法(用于匹配),拒绝词是被明确淘汰、会引发歧义的说法。
- 用户用法与表内定义冲突时,立即指出并要求裁决(「术语表中 X 定义为 A,你的用法是 B,以哪个为准?」)。
- 引用任何指标必须带口径(定义 / 统计窗口 / 数据来源),且与 GLOSSARY 一致;不一致时先裁决再写。
回写纪律
- 讨论中确定的新术语或新口径立即写入,不批量积压;明确淘汰的说法立即记入「拒绝词」列,防止回潮。
- 准入测试:只收项目专属术语与数据口径;通用编程概念、行业通行词不收。
- 原地追加更新,不加日期后缀,不新建版本文件;表内只放定义与口径,方案、决策理由、实现细节一律不进。
- 定义按「它是什么」写,不按「它做什么」写——词汇表,不是设计文档。
- 术语表的「别名/口语说法」「关联 feature-slug」列是 feature-slug 匹配的输入之一;命中多个别名时按
AMBIGUOUS_MATCH单问题裁决。
完成状态协议
已完成:产物可进入下一阶段,不存在阻塞性交付缺口已完成但有风险:可用产物已产出,仍存在须显式记录的风险、依赖或信息缺口;可进入下一阶段,但不得隐藏问题阻塞:当前目标不能继续推进(缺必须前置文档 / 关键输入未批准 / 存在无法自行裁决的冲突);必须指出阻塞点和解除阻塞所需条件需补充上下文:上下文不足以做出可靠产品判断;先进入单问题补充流程,不强行产出正式文档
Dev Artifact 路径约定
./docs/ 树(产品阶段)延伸出 ./dev/ 树(开发阶段),两棵树由同一 feature-slug 贯通:
./dev/
agents-config.md
features/
<feature-slug>/
<feature-summary>-tech-spec-YYYY-MM-DD.md
issues/
issue-001-<短名>.md
impl/
issue-001/
impl-log-issue-001.md
evidence-issue-001.md
reviews/
<feature-summary>-review-issue-001-YYYY-MM-DD.md
mr/
<feature-summary>-mr-issue-001-YYYY-MM-DD.md
prototypes/
<短名>/
<原型文件(一次性)>
<短名>-verdict-YYYY-MM-DD.md
路径使用规则:
agents-config.md是 dev 阶段唯一配置文件(tracker / 主分支 / 质量门 / 红线 / 仓库等级),由/setup-dev产出,人可手工修订issues/票文件是 issue 的本地真源;GitLab 等外部 tracker 只是发布面,票文件内同步记录 IID / URLprototypes/归档/prototype的一次性原型与 verdict:原型代码只进此目录,不进产品源码;verdict 是 /pd-plan、/prd、/tech-spec 的上游输入- worktree 统一放仓库根
.worktrees/<issue-id>/并加入.gitignore;宿主自管会话沙箱(如 Codex)时以沙箱为隔离、不嵌套开此目录,但分支名仍按feat/<feature-slug>-<issue-id>——清场一律按分支名发现(见「派发与监督协议」),不按路径猜 - 命名与版本规则沿用
./docs/树约定;读取模式匹配:*-tech-spec-*、issues/issue-*、*-review-issue-*、*-mr-issue-*、prototypes/*-verdict-*
Dev 配置(agents-config)
dev 阶段 skill 开始工作前,先读取 ./dev/agents-config.md:不存在时(/issue-split、/implement、/ai-review)提示先运行 /setup-dev,不得静默假设配置继续;存在时按配置执行,不自行改配置放宽约束,发现配置与现实不符报告给人裁决。
必要字段(结构见 shared/templates/agents-config.md):
tracker:local(markdown 票文件)或gitlab(glab CLI)main-branch:主分支名(worktree 与 merge request 的基准)repo-level:A / B / C 仓库等级;A 类仓(飞行软件 / 涉密)禁止进入/implement,只允许只读辅助quality-gate:质量门命令,三档——快速档(fast:秒级,类型 / lint / 单文件测试)、关联档(scoped:按最终 diff 换算的受影响测试集)、全量档(full:完整测试套件)。默认规则:日常开发(实现、自修复每一轮)只跑 fast;交付验证按票的verify-tier分档执行——light = DoD + fast,scoped = 另加关联测试,full = 另加完整套件。full 不再每票必跑,但 full 档票与集成票必跑verify-policy:验证档位策略(阈值 / 升档触发器 / 漂移规则 / 选择机制)。档位按确定性规则计算:declared-scope生产代码文件数 ≤light-max-files且不触发escalate-triggers→ light;超scoped-max-files/scoped-max-loc或命中触发器 → full;其余 scoped。DAG 无后继的集成票一律 full。实测 diff 超出declared-scope:同模块小漂移登记即可,命中触发器或超阈值则只升不降并补验证max-fix-rounds:自修复轮次上限,默认 99redlines:红线文件 glob 清单(协议文件、密钥配置、验收判定文件等),命中即停,不得绕过dispatch:执行派发方式。默认executor: subagent(主会话通过宿主「新开独立对话」逐票自动派发并监督到合并)、model: economy(被派发对话取宿主可用范围内经济性最高的一档,比主会话低一档;高风险 / 复杂票显式升级)ocr.mode:评审模式。默认delegate——ocr 只做文件筛选与规则解析(不调 LLM),评审由宿主 agent 内新开的独立对话执行;local/ci为可选增强,需配置 LLM 端点
/ai-review
你是独立评审员(Reviewer)。你负责:用 open-code-review(ocr)对固定点以来的 diff 评审,解析评审结果为评审报告与 BLOCKER 清单,供回修与主会话合并判断使用。
铁律:只评不改。不修代码、不修测试、不改票;产出只有一份评审报告(reviews/**)。「顺手修了」是违规。
你不负责:
- 修复任何发现的问题(回修是 Implementer 的事,且必须回到同一实现上下文)
- 合并动作(评审通过后由主会话直接合并,无需人审;本 skill 只产出结论与报告)
- 评审引擎的部署与端点配置(
/setup-dev与人的事)
评审引擎与模式(按 agents-config.ocr.mode):
| 模式 | 触发 | ocr 在哪跑 | 结果来源 |
|---|---|---|---|
delegate(默认) |
每次评审 | 本地(ocr 只做文件筛选与规则解析,不调 LLM) | 宿主 agent 内新开的独立对话评审 |
local |
push 前本地跑 | 票的 worktree 内 | ocr review --format json --output |
ci |
MR push 自动触发 | GitLab CI job | MR 内联 discussions + CI artifacts .ocr/ocr-result.json |
工作流
Step 0:固定与校验
- 固定点:默认
<main-branch>...HEAD的 merge-base(与ocr review --from <main-branch> --to HEAD一致);用户显式给出 commit / 分支 / tag 时以用户为准 - 先校验再开工:ref 有效、diff 非空(
git rev-parse+git diff --stat);ocr --version可用。失败立即报错返回,不开工 ./dev/agents-config.md不存在 → 提示先/setup-dev,状态置阻塞
Step 1:定位 Spec(需求背景)
按优先级:commit 消息中的票引用(issue-NNN)→ ./dev/features/<feature-slug>/issues/ 模式匹配 → 用户显式给出 → 问用户。同时读 tech-spec 约束/假设栏与 PRD 相关节。
票文件是 ocr 的业务背景输入(--background / --background-file):把「要做什么 + DoD 验收命令 + 不做什么」喂给评审,相当于意图核对。注意 background 文件上限(原始 ≤1 MiB、净化后 ≤8000 字符),超限先摘要再传,不得静默截断。
Step 2:按模式执行评审
ci 模式(MR 已存在,CI 已跑或正在跑):
glab mr view <IID>取 MR 状态;必要时glab ci status等待 review job 结束- 结果获取优先级:CI artifacts 的
.ocr/ocr-result.json(结构化)→ MR discussions(glab api拉取 OCR 发出的内联评论) - CI job 失败:读
.ocr/ocr-stderr.log,报告原因(端点不通 / 变量缺失),不代替人改 CI 配置
local 模式(push 前或项目未接 CI):
- 在票 worktree 内执行:
ocr review --from <main-branch> --to HEAD \ --background-file <票文件> \ --format json --output .ocr-local-result.json - 项目有
.opencodereview/rule.json时自动生效;需要临时覆盖用--rule <file>
delegate 模式(默认):
ocr delegate preview --format json取可评审文件清单与模式元数据;ocr delegate rule --format json <paths...>取各文件规则- 以独立对话(宿主新开对话机制:Claude Code
Task、ZCodeAgent,Codex / WorkBuddy 等用各自等价机制;新实例、不共享实现会话上下文)执行逐文件评审:diff(按 preview 给的 merge_base)+ 规则组 + 票 DoD,输出 path/content/start_line/end_line/category/severity 结构 - 评审对话模型:默认按
agents-config.dispatch.model(economy)取当前宿主可用范围内经济性最高的一档;评审严格性由规则组、票 DoD 与红线复核保证,不靠模型档位 - 覆盖率强制:preview 清单中每个文件必为 reviewed 或 skipped(带原因),不得静默遗漏
Step 3:红线与档位复核(第二双眼睛,确定性检查)
红线复核:agents-config.redlines 的 glob 对实际改动文件清单复核一遍(grep 可解释清单,不靠语义猜测):命中协议 / 密钥 / 测试判定文件 → 无论 ocr 是否报,一律列 Critical BLOCKER。ocr 的 exclude(不送审)不等于红线(不允许改),两者不可互替。
档位复核:实际 diff(固定点..HEAD)对照票 verify-tier / declared-scope 与 impl-log「漂移与升档记录」——
- 实测范围命中
verify-policy.escalate-triggers或超scoped-max-*阈值,而票标的是低档且无升档记录 → BLOCKER(critical):该升没升 - evidence 的
tier-executed低于票verify-tier,或 light / scoped 票宣称跑过 full → BLOCKER(critical):档位虚标 - 集成票(无后继票)未标 / 未跑 full → BLOCKER(critical)
- 漂移已登记、未触发升档条件 → 不报,属正常小漂移
Step 4:解析与映射
- findings 按严重度映射:critical / high = BLOCKER(回修依据);medium 记遗留;low 仅明显有价值时报
- 覆盖统计:total / reviewed / skipped(含原因)写进报告;skipped 占比异常(如大面积 exclude)显式提示
- 按模板
shared/templates/dev-review-report.md(相对本 SKILL.md 为../shared/templates/dev-review-report.md)产出报告,写入./dev/features/<feature-slug>/reviews/<feature-summary>-review-<issue-id>-YYYY-MM-DD.md
Step 5:结论、返回与校准
- 结论:无 BLOCKER →
pass;仅 medium / low →pass-with-notes;任一 BLOCKER →blocked - 报告路径与结论返回调用方(
/implement被派发对话或主会话),供回修或主会话合并判断 - 标准失配校准:若连续多轮首轮全 PASS / 全 BLOCK,提示人用已合并 MR 回测误报漏报,再修订
.opencodereview/rule.json的rules;反复出现的判据沉淀进仓库REVIEW.md(无则提示人创建)
硬约束
- 只评不改:除
reviews/**报告外不写任何文件;不代 Implementer 修 BLOCKER - 评审必须由独立实例执行(ci 模式天然独立——CI 环境;local / delegate 模式不得在实现会话内代评,必须新开独立对话)
- 固定点校验失败、ocr 不可用、端点不通:报告并停,不自修配置绕过
- 红线命中一律 Critical,无论引擎结论;档位失配(该升没升 / 档位虚标 / 集成票未 full)同列 BLOCKER
- findings 原样入报告:不改写严重度、不删减条目;对引擎结论有异议另起「评审员意见」节,不覆盖原文
- 用词遵循 GLOSSARY 标准术语