Files

300 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CodeStable 共享口径
由 `cs-onboard` 复制到项目的 `.codestable/reference/shared-conventions.md`。所有 CodeStable 子技能用项目相对路径 `.codestable/reference/shared-conventions.md` 引用本文件——跨子技能共享但不适合堆在单个技能里的规范的唯一权威版本。
skill 本身不共享文件系统(每个 skill 是独立安装单元),共享口径不能放在某个 skill 内部被别的 skill 引用。放在"工作项目"里对所有 skill 都可达。
---
## 0. 目录结构与路径命名
onboard 完成后骨架(`cs-onboard` 负责搭建):
```
.codestable/
├── .gitignore 忽略 CodeStable 运行期 Python 缓存等机器产物
├── attention.md CodeStable 技能启动必读的项目注意事项
├── requirements/ 能力愿景 + 领域模型 + 决策记录
│ ├── VISION.md 能力中心索引(cs-req 首次落 req 时 lazy 创建并维护)
│ ├── {slug}.md 一个能力一份,扁平(cs-req 产出)
│ ├── CONTEXT.md 领域术语表(cs-domain lazy 创建;多 context 时被 CONTEXT-MAP.md 替代)
│ ├── CONTEXT-MAP.md 多 context 拓扑入口(cs-domain,仅多 context 时存在)
│ ├── adrs/ 架构决策记录(cs-domain,lazy 创建)
│ │ └── NNN-{slug}.md Nygard 四节 + 状态机 frontmatter
│ └── {ctx}/ 子 context 子目录(仅多 context 时存在)
│ ├── CONTEXT.md 子 context 术语
│ ├── adrs/ 子 context 特定 ADR
│ └── {capability}.md 归属本 context 的能力
├── roadmap/ 规划层("接下来怎么做这块大需求 + 模块怎么切 + 接口怎么定")
│ └── {slug}/ 一个大需求一个子目录(cs-epic 产出)
│ ├── {slug}-roadmap.md 主文档:背景 / 范围 / 模块拆分 / 接口契约 / 子 feature 清单 / 排期
│ ├── {slug}-items.yaml 机器可读子 feature 清单,acceptance 回写状态
│ ├── {slug}-roadmap-review.md 人工确认前的规划审查报告
│ └── drafts/ 可选
├── goals/ 目标聚合根(起点报告 / 自主迭代 / 功能验收)
│ └── YYYY-MM-DD-{slug}/ 一个 bounded goal 一个子目录(cs-goal 产出)
│ ├── state.yaml 机器可读状态
│ ├── goal.md 起点报告
│ ├── iterations/{nnn}.md 迭代报告
│ └── functional-acceptance.md Task agent 功能验收
├── features/ feature spec 聚合根
│ └── YYYY-MM-DD-{slug}/ 每个 feature 一个目录
│ ├── {slug}-brainstorm.md (可选,case 2 时产出)
│ ├── {slug}-design.md (标准流程)
│ ├── {slug}-checklist.yaml (标准流程)
│ ├── {slug}-design-review.md(人审前方案审查)
│ ├── {slug}-review.md (实现后代码审查)
│ ├── {slug}-qa.md (代码审查后 QA gate)
│ ├── {slug}-acceptance.md (标准流程)
│ └── {slug}-ff-note.md (fastforward 通道唯一产物,与标准流程产物互斥)
├── issues/ issue spec 聚合根
│ └── YYYY-MM-DD-{slug}/
│ ├── {slug}-report.md
│ ├── {slug}-analysis.md (根因不显然才有)
│ └── {slug}-fix-note.md
├── refactors/ refactor spec 聚合根
│ └── YYYY-MM-DD-{slug}/
│ ├── {slug}-scan.md
│ ├── {slug}-refactor-design.md
│ ├── {slug}-checklist.yaml
│ └── {slug}-apply-notes.md
├── feedback/ CodeStable skill 使用反馈和上报证据
│ └── YYYY-MM-DD-{slug}/
│ ├── {slug}-report.md
│ ├── evidence.json local-private observations
│ ├── triage.json local-private assessments + quality
│ ├── public-issue-context.json allowlist preview,可选
│ ├── github-issue.md 用户确认后可上传,可选
│ └── regression-candidate.json local-private eval 交接,可选
├── compound/ 沉淀类文档统一目录(cs-keep 产出)
│ └── YYYY-MM-DD-{slug}.md
│ 纯 markdown,无 frontmatter,grep 检索
├── gates/ workflow gate 配置(onboard 从技能包释放)
└── reference/ 共享参考文档(onboard 从技能包释放)
```
`.codestable/.gitignore` 由 onboard 安装,至少忽略 `**/__pycache__/` 与 `**/*.pyc`;这些是 gate / validator 运行期缓存,不属于 CodeStable 证据产物。
### 命名规则
- 需求文档:`requirements/{slug}.md`(能力愿景,不带日期前缀,扁平不分组);中心索引 `requirements/VISION.md` 由 cs-req 首次落 req 时 lazy 创建
- roadmap:`roadmap/{slug}/`(不带日期前缀,平铺不嵌套)
- feature / issue / refactor 目录:带日期前缀 `YYYY-MM-DD-{slug}`
- feedback 目录:带日期前缀 `YYYY-MM-DD-{slug}`,保存 report、local-private evidence/triage/candidate 与用户确认的 public preview
- 沉淀类:`compound/YYYY-MM-DD-{slug}.md`,日期用**归档当天**,纯 markdown 无 frontmatter(cs-keep 产出)
- 领域术语:`requirements/CONTEXT.md`(单 context)或 `requirements/{ctx}/CONTEXT.md`(多 context);cs-domain lazy 创建
- 架构决策:`requirements/adrs/NNN-{slug}.md`(系统级)或 `requirements/{ctx}/adrs/NNN-{slug}.md`(子 context);3 位编号,cs-domain 产出
- 项目注意事项入口固定为 `.codestable/attention.md`,所有 CodeStable 子技能启动前必须读取;不要用 `AGENTS.md` / `CLAUDE.md` 等外部入口代替它
### 单 context ↔ 多 context 拓扑
- `requirements/CONTEXT-MAP.md` 存在 → 多 context 模式:术语和 ADR 按子 context 分目录
- 只有 `requirements/CONTEXT.md` → 单 context:术语和 ADR 平铺在 `requirements/` 下
- 升级路径见 `cs-domain` 的"单 → 多 context 升级"节
### 改目录结构
维护者改已安装 `cs-onboard` skill 内的 `references/shared-conventions.md` 模板;新项目 onboard 自动带上,已有项目用 `cs-onboard --mode refresh-runtime` 同步,不手改运行时副本。
---
## 1. 共享元数据口径
**feature spec**:brainstorm / design / design-review / review / QA / acceptance 共用 `doc_type` / `feature` / `status` / `summary` / `tags`。`cs-feat` 的各阶段只补特有字段。`status`:brainstorm = `confirmed`(落盘即确认无 draft);design = `draft` / `approved`;design-review / review / QA / acceptance 见对应阶段协议。
新增 feature gate 的 `doc_type`:`feature-design-review`(status: `passed` / `changes-requested` / `blocked`)、`feature-review`(status: `passed` / `changes-requested` / `blocked`)、`feature-qa`(status: `passed` / `failed` / `blocked`)、`feature-acceptance`(status: `passed` / `blocked`)。review / QA 报告是后续 gate 的输入,不替用户批准 design,也不替 acceptance 做最终验收。
**issue spec**:report / analysis / fix-note 共用 `doc_type` / `issue` / `status` / `tags`。`severity` / `root_cause_type` / `path` 由对应阶段按需补。
**归档类(compound)**:由 `cs-keep` 统一产出,写到 `.codestable/compound/YYYY-MM-DD-{slug}.md`。纯 markdown,**无 frontmatter**。三段足够:背景 / 结论 / 证据。检索靠 grep。
**反馈类(feedback)**:由 `cs-feedback` 显式调用后产出,写到 `.codestable/feedback/YYYY-MM-DD-{slug}/`。`evidence.json` 保存脱敏 observation/incident,`triage.json` 保存 assessment 与 readiness,二者及 candidate 均为 local-private;`github-issue.md` 只能从 public allowlist 渲染并在上传前让用户确认。
**外部读者文档**(`cs-docs` tutorial / api mode):frontmatter 由对应模式定义。无特殊说明:`draft` = 待 review,`current` = 当前有效,`outdated` = 代码已变更待同步。
**写作约束**:子技能提字段时优先写"额外字段"或"阶段状态变化",不重复展开整套通用字段。
---
## 2. {slug}-checklist.yaml 生命周期
它是 feature 工作流的唯一执行清单。fastforward 不生成 checklist/design/acceptance,只在动手后写
`{slug}-ff-note.md`。
```haskell
data ChecklistOwner = Design | Implementation | Acceptance
data ChecklistMutation
= CreateCandidate Steps Checks | ReviseCandidate Steps Checks
| CompleteStep StepId | VerdictCheck CheckId CheckVerdict
data CheckVerdict = Passed | Failed
allowed :: ChecklistOwner -> ChecklistMutation -> Bool
allowed Design (CreateCandidate _ _) = True
allowed Design (ReviseCandidate _ _) = True
allowed Implementation (CompleteStep _) = True
allowed Acceptance (VerdictCheck _ _) = True
allowed _ _ = False
allowed _ _ = False
```
`steps` 的粒度是 **编排-计算分离维度的切片策略**——按"先编排骨架、后计算节点、最后持久化与测试"写(最简 Workflow 先行 → 逐个节点填充),**不下沉到 file:line / 函数级**。具体改哪个文件由 implement 阶段决定。
Design 提取 4-8 个可独立验证的 `steps` 与可追溯的 `checks`;Implementation 只顺序完成 step,
拆 step 或加入微重构前先与用户对齐;Acceptance 只裁决 checks。各阶段只做 `allowed` 的 mutation。
**写作约束**:子技能描述 checklist 时只补本阶段读 / 写哪一部分,不重新定义生命周期。
---
## 2.5 roadmap ↔ feature 衔接协议
`.codestable/roadmap/{slug}/{slug}-items.yaml` 是规划层和 feature 执行层的唯一接口。三个技能共同读写它——是 skill 都读写项目共享产物,不算耦合。
**items.yaml 状态机**:
```haskell
data ItemStatus = Planned | InProgress | Done | Dropped Reason
data ItemEvent = StartDesign | AcceptFeature | OwnerDrops Reason
transition :: ItemStatus -> ItemEvent -> Either Reason ItemStatus
transition Planned StartDesign = Right InProgress
transition InProgress AcceptFeature = Right Done
transition Planned (OwnerDrops reason) = Right (Dropped reason)
transition Done _ = Left TerminalState
transition (Dropped _) _ = Left TerminalState
transition _ _ = Left InvalidTransition
```
回退重做时新加略改 slug 的条目,不改终态。
**cs-epic planning 阶段的职责**:生成和维护 roadmap 主文档 + items.yaml;把 `planned` 改 `dropped`(用户放弃时);不改 `in-progress` / `done`(feature 流程负责)。第一版内部仍使用 `.codestable/roadmap/`。
**cs-epic review 阶段的职责**:在人审前只读审查 roadmap 主文档 + items.yaml + 相关事实,写 `{slug}-roadmap-review.md`;不修改 roadmap,不替用户批准。
**cs-feat design 阶段的职责**(从 roadmap 起头时):
1. design.md frontmatter 加 `roadmap: {roadmap-slug}` + `roadmap_item: {子 feature slug}`
2. items.yaml 对应条目 `status: in-progress` + `feature: YYYY-MM-DD-{slug}`
3. 校验 yaml
**依赖准入分层**:
```haskell
data Admission = DesignAdmission Bool | ImplementationAdmission
data DependencyState = Done | Dropped | DesignReviewPassed | NotReady
dependencyReady :: Admission -> DependencyState -> Bool
dependencyReady (DesignAdmission False) Done = True
dependencyReady (DesignAdmission True) Done = True
dependencyReady (DesignAdmission True) Dropped = True
dependencyReady (DesignAdmission True) DesignReviewPassed = True
dependencyReady ImplementationAdmission Done = True
dependencyReady _ _ = False
```
`DesignAdmission True` 仅对应 `epic_child_batch: true`,用于避免“所有 design 先完成、实现后开始”的批处理死锁;它只授权起草和审查下游 design。任何 implementation / review-fix / qa-fix 开始前都重新读取 items.yaml;`dropped` 或仅 design-review passed 不得进入实现。
**cs-feat design-review 阶段的职责**:在人审前只读审查 design + checklist + 相关事实,写 `{slug}-design-review.md`;不修改 design/checklist,不替用户批准。
直接起 feature(非 roadmap 来)两字段留空,不触发 roadmap 写。
**cs-feat acceptance 阶段的职责**:
1. 读 design frontmatter `roadmap` / `roadmap_item`
2. 空 → 跳过
3. 有值 → items.yaml 对应条目 `status: done`;同步主文档子 feature 清单显示状态;校验 yaml
回写是**实际写文件的动作**,验收报告要明确记录回写结果。
**最小闭环标记**:items.yaml 每份只有一条 `minimal_loop: true`,标记"做完后系统能端到端跑通最窄路径"。design 启动 `minimal_loop` 条目时优先级最高。
---
## 3. 阶段收尾推荐
```haskell
data CloseoutStage = FeatureAcceptance | IssueFix | FeatureFastForward | EpicRoadmap
data CloseoutAction = KeepIfReusable | TutorialIfUserFacing | ApiIfPublic | NeatIfMilestone | NeatIfDocsDrift | ScopedCommit | GoalPackageIfRequested
closeout :: CloseoutStage -> [CloseoutAction]
closeout FeatureAcceptance = [KeepIfReusable, TutorialIfUserFacing, ApiIfPublic, NeatIfMilestone, ScopedCommit]
closeout IssueFix = [KeepIfReusable, NeatIfDocsDrift, ScopedCommit]
closeout FeatureFastForward = [KeepIfReusable, NeatIfDocsDrift, ScopedCommit]
closeout EpicRoadmap = [NeatIfMilestone, GoalPackageIfRequested]
```
**统一规则**:一律一句话提示;用户说"不用"立即跳过;不强制;上游主动提示,下游承接执行。
---
## 4. 收尾提交(scoped-commit)
acceptance / issue-fix 走完后把本次产物提交为一个 commit:
- **范围**:本次工作改到的代码 + 相关 spec 文档 + 本次实际更新过的 CONTEXT.md / ADR / req doc + 本次实际更新过的 roadmap items.yaml / 主文档
- **不该进**:和本次工作无关的顺手修改;属于"下次另起 feature / issue"的扩大范围
- **提交前确认**:用户没明确同意不要 `git commit`
- **Goal commit 授权**:Epic 自动逐 feature 提交必须有独立 `approval-report.md#goal-commits`;它可与 `goal-acceptance` 在同一次 Goal 启动确认中原子批准,但两份 ref 仍分别核验,design 确认或 acceptance ref 都不能替代 commit ref
- **commit message**:一句话说清"做了什么",不贴 spec 目录路径
子技能只描述本阶段特有提交范围,通用规则看这里。
---
## 5. 归档检索规则
feature-design / issue-analyze / issue-fix 动手前到 `.codestable/compound/` 搜已有沉淀,遵守上下文幂等(首次读、已载复用):
- **首次进入该工作项**时搜 `requirements/CONTEXT.md`、`requirements/adrs/`、`compound/`(防术语冲突、防违反已拍板决策);若本会话/本阶段已加载过这些全局输入,则复用已读摘要,不重复 Glob+Read。`epic_child_batch: true` 时这些全局输入已由 `cs-epic` 在批量开始时统一加载,子 feature 直接复用、不重扫
- `compound/` 直接 `grep -r "关键词" .codestable/compound/`(纯 markdown,无 schema)
- 搜到的结果只作参考输入,不盲目套用——可能已过时或不适合当前上下文
- 搜到和当前方向冲突的决策类沉淀 → **必须**正面回应"为什么仍然这么做"或调整方向
---
## 6. cs-keep 守护规则
`cs-keep` 写 compound 时遵守:
1. **宁缺毋滥**——用户说不出理由的内容直接省略,不要 AI 编造
2. **不替用户写实质内容**——AI 负责起草结构和串联语言,实质结论必须来自用户或可追溯的代码证据
3. **attention.md 检查**——写完若沉淀暴露出"每次启动都该知道"的一两行硬约束,提示用户用 `cs-note` 追加到 `.codestable/attention.md`
4. **起草前先 grep 查重叠**——`grep -r "关键词" .codestable/compound/`。命中相近旧文档就问用户:更新已有 / 新写一份。默认优先更新已有,沿用原文件名,文末加"YYYY-MM-DD 更新"。
5. **识别用户意图是"改已有"还是"记新的"**——用户说"改 / 更新 / 补充 {某条}"或话题高度重合时默认走"更新已有",不要闷头新建。分不清就问。
---
## 7. 写代码时的反射检查
`cs-feat` implementation / fastforward、`cs-issue` fix、`cs-refactor` apply / fastforward 共用。AI 默认会往"大函数 / 大文件 / god class / 处处特殊分支"漂,这一节把漂移截在发生那一刻。(这里截"往复杂漂"的结构膨胀;选型层"往省事漂"的实现降级——最小闭环 / fake / 正则凑——见 `.codestable/reference/solution-depth-conventions.md` 的方案深度 pre-pass。)
### 第一性原则 pre-pass
动手前先用一句话写清四件事:本次真正要改变的外部行为;不可破的设计 / 领域 / API 约束;最小充分改动;无法从前三项推出、必须不写的东西。后续每次想新增抽象、参数、兜底、特殊分支或顺手重构,都回到这四项核对:推不出来就删掉、记顺手发现,或回设计 / 用户重新对齐。
**不是阈值,是触发器**——硬数字会诱发为拆而拆把自然聚合的代码切碎。每条都是"遇到 X 情况就停下来问自己"。
| 触发场景 | 停下来问自己 |
|---|---|
| 要往一个已经很长的文件追加代码时 | 文件承担几件事?新加的是已有职责延伸还是第 N+1 件事?是第 N+1 就默认新建文件 |
| 要给已经很多方法的类加方法时 | 新方法是核心职责的自然扩展,还是把类推向"什么都能干"? |
| 写的函数已超过一屏时 | 函数在做几件事?几件事就拆 |
| 要加 `if (特殊情况) { 特殊处理 }` 分支时 | 抽象维度选错了?正确做法可能是把特殊路径和通用路径分成不同函数 / 策略 / 类 |
| 要 copy-paste 一段代码时 | 能抽成共用还是只字面相似?能抽就抽 |
| 要给函数加第 4+ 个参数时 | 函数做的事是不是太多了?参数列表是 API 恶化的早期信号 |
| 要新写"万能工具类 / helper"时 | 真没归属还是只是想不起来放哪儿就先堆 util? |
**停下来之后**:反射检查只把问题提出来,结论用户定。停下来想清楚的动作(拆 / 新建 / 重命名 / 抽共用)会让改动超出现有 steps 范围 → 跟用户对齐再决定(纳入当前推进 / 记顺手发现留后续)。
不许偷偷拆完继续写,也不许忽略信号硬冲。默认动作是停、问、再继续。
## 8. 报告语言策略
- CodeStable 所有落盘产出的正文**默认用中文**:plan / design、plan review / design-review、code review、QA、验收、issue、refactor、roadmap、goal、compound 等所有人读报告都用中文表达。
- 默认语言以 `.codestable/attention.md` 的「报告语言」节为准(onboard 模板默认中文);只有 attention 显式改写默认语言时才以 attention 为准。
- 机器状态(YAML / JSON / `state.yaml` / frontmatter 字段)保持机读格式不翻译,不从不同语言的叙述反推状态。
- 默认只写 canonical 报告文件;只有 attention 明确要求多语言副本时,才额外写 `{name}.{lang}.md`。
## 9. 执行约定
preflight 和 runtime 恢复在 `.codestable/reference/execution-conventions.md`;Task agent 与 Goal driver 在 `agent-conventions.md`;approval 报告口径在 `approval-conventions.md`;context packet、commit planning 和 backlog 工具在 `tools-context.md`。