- name
- skein-spec
- description
- SKEIN 规则记忆库 (.skein/spec)。触发: planning 召回既有约定 / finish 后沉淀或改写规则 / 现状 wiki 与记忆库维护 / spec 一致性核查 / 空仓播种与整库重构。recall·sediment·amend·map·analyze·migrate·bootstrap·reconstruct·maintain 全模式入口。
- user-invocable
- true
- argument-hint
- [模式: recall/召回, sediment/沉淀, amend/改写, map/结构现算, analyze/一致性核查, migrate/迁移, bootstrap/播种, reconstruct/重构, maintain/维护 (加 --apply 自动修)] [--deep=recall/low/full/deep/max/high (reconstruct 模式可选)]
- arguments
- ['recall(召回)|sediment(沉淀)|amend(改写)|map(结构现算)|analyze(一致性核查)|migrate(迁移)|bootstrap(播种)|reconstruct(重构)|maintain(维护)', '--deep=recall/low/full/deep/max/high']
- model
- inherit
- effort
- medium
# skein-spec — 规则记忆库 (namespace × inclusion)
> 🔒 全局流程规则(状态机/调度/优先级等)以 skein-flow/references/ 为单一真值源。
**差异化核心**。不同于「按需沉淀单一 spec 文件」, SKEIN 记忆按两个正交维度组织, 基于 `.skein/spec`:
> **绑定 agent (按读/写拆两个, 均 frontmatter `skills: skein:skein-spec`)**:
>
> - **读路径默认归 `skein-recaller`** (只读同步召回员): recall 检索 (planning) 派它, **main 等召回结果进 planning** (dispatch prompt「已知」段带上); executor/main 也可直跑 `skein-spec recall` CLI 等价命令。
> - **写路径默认归 `skein-specer`** (记忆写盘员): sediment/amend/reconstruct·maintain/prune 五类写作业 (finish 读 diff + subagent 回传摘要 跑判定门产候选 + 写盘 + reindex)。executor 踩到可复用约定也可直跑 `skein-spec sediment` CLI 等价命令。**异步 fire-and-forget 模式** (被 skein-flow finish 阶段在 finish 闭环后派发): specer 自主跑判定门 + `skein-spec sediment`/`amend` 写盘 + reindex, **无需 main 等待回传** (main 派发即结束回合, 回传到达后只补 output trace; 判定门通过即自主写, 不逐次询问用户)。仅 bootstrap/reconstruct 全局动作跑前一次征同意。
## namespace × inclusion 正交两维
**两者正交**: namespace 决定放哪个目录 (内容分类), inclusion 决定怎么加载 (写在每篇 frontmatter 里, 与目录无关) —— 把文件从一个 namespace 目录搬到另一个**不会**改变它的加载策略, 这条曾被文档写反过, 教用户把文件搬目录来「降级」, 而那什么也不会发生。
| namespace \ inclusion | always 常驻注入 (SessionStart) | auto 按需召回 (默认) | fileMatch 按 globs 命中注入 | manual 纯手动检索 |
| --------------------------- | --------------------------------------------------------------- | --------------------------------------------------- | --------------------------- | ----------------------------- |
| **rules** (硬规 / 经验规则) | 硬约束 / 命令式契约 (软预算 `spec.always_budget`, 超则告警降级) | 长尾经验规则 (默认落点) | 特定路径触发的规则 | 极冷门参考 |
| **product** (需求现状 wiki) | 极少见 (核心边界铁律) | 功能域现状页 (默认落点, 见下文) | — | 历史存档快照 |
| **map** (代码结构语义页) | — | 职责 / 数据流说明页, 配合 `map --skeleton` 现算骨架 | — | — |
| **external** (外部长文档) | — | 索引摘要 | — | 原文全文, 手动检索 (默认落点) |
namespace 开放不设白名单 (目录扫描得, 新增 namespace 不改代码, 常见 rules/product/map/external), inclusion 是封闭四值。索引: 每个 `<namespace>/index.md` (该 namespace 全规则, 带 category / inclusion / anchors 列) + 顶层 `index.md` 聚合概览。
## 寻找纪律 (planning/调研/找方案时)
**动手前优先跑 `skein-spec recall "<关键词>"`** — 现有规则沉淀比凭记忆重推快且准, `inclusion: always` 的规则已常驻无需 recall。
顺序: recall spec (全 namespace, FTS5 BM25 排序) → vault → 项目本地 (Read/Grep) → 外部搜索。
recall 命中 → model 读全文判相关 → 相关的注入当前 task 上下文 (dispatch prompt「已知」段带上)。
external 层 (不入 hook, 纯手动) 存长文档/外部资料, 同经 `recall` 跨层检索。
## recall (planning 阶段, 派 skein-recaller)
> 默认派 `skein-recaller` (只读同步召回员) 承载, main 等其结果进 planning; main 也可直跑 `skein-spec recall` CLI 等价命令。
```
skein-spec recall "<任务关键词>" [--src rules/product/map/code/all]
```
- grep `<namespace>/index.md` 输出命中行 → **model 读命中规则全文, 判是否真相关** → 相关的注入当前 task 上下文 (dispatch prompt「已知」段带上)。
- `inclusion: always` 的规则已由 SessionStart hook 常驻, 无需 recall。
- `--src` 分源: `rules`/`product`/`map` 限定单 namespace, `code` 专召 map namespace 语义页 + anchors 汇总, 缺省 `all` 跨 namespace 检索。
## sediment (task finish 阶段, 异步 fire-and-forget) — 判定门 + 自主写盘
task finish 闭环后由 skein-flow finish 阶段异步 fire-and-forget 派 `skein-specer` 跑「判定门 checklist → 分层归类 → `skein-spec sediment` 自主写盘 + reindex」三步 (含升降级)。**异步**: main 派 skein-specer 即结束回合, 不等回传 (finish 已闭环, 禁为 sediment 阻塞); skein-specer 自主写盘, 回传到达后 main 只补 output trace 供审阅。**判定门 (语义) 通过即写, 不逐次 AskUserQuestion** —— 记忆积累高频, 每次询问是噪声; 误沉淀后续调 inclusion/删文件可逆纠正。完整判定 trace 模板、分层/归类规则、写盘命令详见 [references/sediment-workflow.md](references/sediment-workflow.md)。
sediment 只**追加**新章节 —— 现状类内容 (尤其 product wiki) 过时后要**改写**旧结论而非无限并存新版本, 追加 vs 改写的抉择见下文 amend。
## prune (sediment 后自动精简, skein-specer) — 判定门 + 自主归档
sediment 写盘后 skein-specer 顺带跑一轮精简: 扫全 namespace, 按判据检出 candidate 并**自动 archive** (可逆) 而非只报告。**异步 fire-and-forget**: 同 sediment, main 派即放手, 不等回传。
- 判据分两层 —— 全局恒跑 (always 超预算 / 断链) + 按 namespace 分表 (product 只报告, 需求真值只有人知道该不该删)。**完整判据表与判定顺序见 [references/prune-workflow.md](references/prune-workflow.md)**, 本文件不重抄。
- **archive 即可逆, 不删文件** — 归档到 `.skein/spec/.archive/<ts>/`, `restore <ts>` 可回滚。
- **保护标记**: 规则头 `protected: true` 跳过不精简。
- **无命中 → 跳过**, 如实报「无精简项」, 不空跑 archive。
## 写盘参照模板 (软骨架, 非强制)
规则 body 各有脊柱, sediment 写盘前 skein-specer 参照对应模板填:
- **always** 规则 (命令式契约) 参照 [references/templates/rules-always.md.tmpl](references/templates/rules-always.md.tmpl): 铁律/禁 (MUST/禁, 一句一规则) + 反例表 (禁/改为) + 可选关联。
- **auto** 规则 (ADR/陷阱型) 参照 [references/templates/rules-auto.md.tmpl](references/templates/rules-auto.md.tmpl): 触发场景 / 陷阱-正解 / 反例 / 案例 / 适用 / 关联。
- **product** 现状页参照 [references/templates/product.md.tmpl](references/templates/product.md.tmpl): 现状 / 边界 / 为什么这样 / anchors / 关联。
- **map** 语义页参照 [references/templates/map.md.tmpl](references/templates/map.md.tmpl): 职责 / 入口 / 数据流 / anchors。
> **参考骨架非强制** — sediment 是 fire-and-forget, 模板仅作 skein-specer 填 body 的结构引导, **不强校验、不阻塞写盘**; 实际规则按内容取舍段名 (elastic spine), 缺段不报错。
## product wiki (现状记忆, namespace=product)
> 编写 product wiki 时参考 [skein-flow/references/writing-for-agents.md](../skein-flow/references/writing-for-agents.md) 的 information hierarchy — 现状页 (state) 用 in-file reference 格式,决策变更 (delta) 落 rules namespace 作 ADR 式记录。
区别于 rules 的「决策 / 规则」(为什么这样改), product namespace 只存**当前系统现状** —— 单一功能域此刻是什么样, 不叠加历史决策链。
- **delta vs state**: sediment 沉淀的是「决策变更」(踩过的坑 / 为什么这样约定), 落 rules namespace; product 只留**现状快照**, 旧结论过时直接 `amend` 改写, 不追加并存多个矛盾版本 (这一条决定了 product 与 rules 的判据也不同, 见上文 prune 分表)。
- **按功能域切页**: 一个功能域 (登录 / 计费 / 权限...) 一个 topic 文件, 不与 rules 按类目混放。
- **finish 时回写候选**: skein-flow finish 阶段跑 `skein-spec finish-candidates <tid>`, 三路降级产候选 —— ① diff 改动文件反查 anchors 命中的既有 product 页 → ② 皆无命中则用 prd 关键词 `recall --src product` 找弱候选 → ③ 仍无则报「无候选, 可能是新功能域, 建议新建」, **禁硬凑**。main 拿到候选后派 specer 用 `amend` (改写既有页) 或 `sediment --namespace product` (新建页) 落盘。
- **不自动精简**: product 是需求真值, maintain 判据只有 anchors 失效才报告 (禁自动 archive, 需人判断), 无 stale / keywords 重复 / 废弃 / 孤立判据。
## amend (改写既有章节, 而非追加)
sediment 只会**追加**新章节; 现状类内容 (product wiki 尤甚) 过时后要**改写**旧结论, 而非无限并存新版本, 用 `amend`:
```
skein-spec amend --topic <ns/cat/topic> --section <章节名> --body-file <正文文件> [--rename-section <新章节名>]
```
- 改前先 `archive` 旧版本 (可逆), 其余章节与 frontmatter 逐字不动。
- **目标章节不存在 → 报错并列出该主题现有章节名**, 不静默追加新章节 (❌ 静默追加; 追加新章节走 `sediment`)。
- `--rename-section` 同步更新库内反链 (`[[topic#旧章节名]]` → 新名), 缺省不改章节名。
- 写盘后自动 `reindex`。
**amend vs sediment 抉择**: 是「改写现状」(旧结论已过时, 只该有一份真值) 用 amend; 是「新增条目」(新踩的坑 / 新决策, 不否定旧条目) 用 sediment。详细抉择树见 [references/sediment-workflow.md](references/sediment-workflow.md)。
## map (代码结构现算, namespace=map)
```
skein-spec map [--skeleton] [--paths <逗号分隔路径>]
```
现算目录树 + 符号 + 行数, **不写盘**:
- `--skeleton`: 仅顶层符号 (Python `def`/`class`/`async def`, JS/TS `function`/`class`/`export ...`, Go `func`/`type`), 正则非 AST (ponytail: 装饰器 / 嵌套 / 多行签名抓不准, 升级路径 tree-sitter)。
- `--paths`: 文件清单注入 (逗号分隔; 缺省 `git ls-files`, 非 git 仓降级 rglob 并排除 `node_modules`/`__pycache__` 等衍生目录)。
- map namespace 的语义页 (人写的职责 / 数据流说明) 与现算骨架合并展示; `recall --src code` 专召 map namespace 语义页 + anchors 汇总。
## analyze (task 一致性核查, 只读)
```
skein-spec analyze <tid>
```
对齐 spec-kit `/speckit.analyze`, 五类只读检查 (不写任何盘), 全启发式关键词/子串匹配, 措辞统一带「候选」字样, 零命中就如实报零冲突, **禁断言违规**:
| 检查 | 比对 |
| --------------- | --------------------------------------------------------------------- |
| 验收覆盖率 | prd 验收标准 ↔ subtask 验收项, 报关键词无命中的验收条 (候选未覆盖) |
| 硬规冲突 | design.md ↔ `inclusion: always` 规则的否定式表述, 报候选 (不断言违规) |
| 范围蔓延 | subtask 名/desc ↔ prd 全文关键词, 报无命中的 subtask (候选蔓延) |
| proposed 置信度 | design.md 提及的规则标题 ↔ 该规则 `status: proposed`, 报未验证引用 |
| 接缝存在性 | design.md「测试接缝」段声明的路径/符号 ↔ codebase, 报未找到 |
缺省输出机器可读 JSON 供 `skein-checker` 消费 (`--show` 才是人读文本); `for-check.md` 的一致性核查段直接调这条, 不再手工 diff 比对。
## migrate (旧两层结构 → namespace × inclusion)
旧 `spec/core/` + `spec/recall/` 两层结构迁移到 `rules/product/map/external` namespace × inclusion 新结构: `skein-setup` 在已初始化仓检出 `spec/core/` 存在时提示跑迁移, `init` 对全新仓直接建新结构目录。两阶段全流程 —— 阶段 1 机械改名 (旧 core→rules/inclusion:always, 旧 recall→rules/inclusion:auto) / 阶段 2 语义分拣 (把该归 product 的现状类内容、该归 map 的结构说明从 rules 分拣出去) —— 详见 [references/migration-v2.md](references/migration-v2.md)。
## restructure (碎片文件批量合并进主题文件)
```
skein-spec restructure --map <plan.json> [--dry-run]
```
映射 JSON (`{"<namespace>/<类目>/<主题>.md": ["<namespace>/<类目>/<碎片>.md", ...]}`) 把右侧碎片文件合并为左侧主题文件; 源文件自动归档到 `.archive/` (可 `restore <ts>` 回滚), 写盘后自动 reindex。`--dry-run` 只打印计划不落盘。碎片规则文件批量归并走此命令, 禁一条规则一个文件手工搬。
## 空仓冷启动播种 (一次性, main)
新仓 `.skein/spec` 为空时前几十轮 planning 无规则可召回。此时 main **可**提议从既有代码库提炼约定作冷启动基线 —— 派 skein-researcher 扫五维 (命名/错误处理/测试/架构边界/构建), 候选逐条定 namespace×inclusion 或 drop, 复用上文 sediment 写盘流程落盘 (bootstrap 跑前一次征同意覆盖整轮, 内部候选自动写)。
一次性动作, `AskUserQuestion` 征同意再跑 (禁自动); 用户拒 → 走正常 planning, 规则随 finish sediment 增量积累。完整流程 (触发条件 / 五维明细 / ns×inclusion 判定表 / 落盘) 见 [references/bootstrap-seeding.md](references/bootstrap-seeding.md)。
## 完全重构 (reconstruct, main) — 依代码/项目内容重建整库
既有记忆大面积失效 (大重构 / 换技术栈 / 记忆漂移 / 接手可疑旧库) 时, 把全库规则**可逆归档**后依当前代码 + 项目内容从零重建。区别于 bootstrap (仅空仓、纯增量): 重构多 `skein-spec archive` 前置 (可逆清库) + **按项目类型分型扫描**。
**六档深度** (`--deep=<recall|low|full|deep|max|high>`, 默认 full): 档位同时决定 ②archive 范围 (长尾 namespace / 全库) 与 ④扫描深度 (五维基线 / 全 8 型探针 / 加旧规则逐条比对), 逐档明细见 [references/reconstruct-memory.md §1.5](references/reconstruct-memory.md)。
```
skein-spec archive --namespace <ns> # 只归档指定 namespace (recall/low 档)
skein-spec archive # 全 namespace 归档 (full/deep/max/high 档)
skein-spec restore <ts> # 回滚 (撞名不覆盖新规则, 加 restored- 前缀并存)
# 注: 深度档 (recall/low/full/deep/max/high) 是本 skill 的参数, 决定「归档多大范围 + 扫多深」,
# 不是 CLI 参数 —— archive 只认 --namespace。
```
流程: 快照 → 归档 → 识别项目类型 → 分型扫描 (researcher bootstrap 模式 + 类型侧重) → 逐条定 ns×inclusion → sediment 自动写盘 → 验证 + 保留归档。🛑 `AskUserQuestion` 征同意再跑 (归档全库虽可逆仍是全局动作 · STOP, 禁自动)。**事无巨细设计 + 8 类项目 (backend/frontend/cli/monorepo/data-ml/infra/mobile/docs) 分型扫描侧重、探针、always 倾向、规则示例、陷阱** 见 [references/reconstruct-memory.md](references/reconstruct-memory.md)。
## 失败模式 (if-then 三段式: 触发 → 一线修复 → 仍失败兜底)
| 触发 | 一线修复 | 仍失败兜底 |
Voir sur GitHub