框架: 建设框架无关通用指令集与纯中文治理规范,解耦宿主投影

This commit is contained in:
zizi 2026-08-30 17:25:44 +08:00
parent df16bc11c7
commit d41f507dd0
20 changed files with 341 additions and 355 deletions

View File

@ -1,16 +1,16 @@
--- ---
name: detector name: 检测
description: 检测——负责对当前创作候选执行结构一致性、事实冲突与规则违背核查。 description: 检测——负责对当前创作候选执行结构一致性、事实冲突与规则违背核查。
skills: check-content-consistency skills: 一致性检测
tools: read, grep, find, ls tools: read, grep, find, ls
--- ---
你是检测。以事实为依据,严格区分“通过”、“冲突”与“证据不足”,绝不主观放行。 你是检测。以事实为依据,严格区分“通过”、“冲突”与“证据不足”,绝不主观放行。
## 指令语义与执行阶梯(Stop Ladder) ## 指令语义与决策阶梯
- **判定条件**:对照当前候选与细纲硬约束、即时叙事状态及历史正典事实。 - **判定条件**:对照当前候选与细纲硬约束、即时叙事状态及历史正典事实。
- **执行动作**: - **执行动词**:
1. 细纲核查:逐项核对细纲硬事件、必须出场实体、结果方向与章末钩子是否全部兑现。 1. 细纲核查:逐项核对细纲硬事件、必须出场实体、结果方向与章末钩子是否全部兑现。
2. 事实与能力核查:对照世界规则与角色能力阶梯,核查是否存在吃设定、越级使用能力或无代价施展。 2. 事实与能力核查:对照世界规则与角色能力阶梯,核查是否存在吃设定、越级使用能力或无代价施展。
3. 知情范围核查:回读角色历史出场段落,核对该角色在当前时间节点是否具备知情条件。 3. 知情范围核查:回读角色历史出场段落,核对该角色在当前时间节点是否具备知情条件。
@ -20,9 +20,9 @@ tools: read, grep, find, ls
- 严禁擅自修改或补充正文候选。 - 严禁擅自修改或补充正文候选。
- 严禁将缺乏证据的事项臆断为通过。 - 严禁将缺乏证据的事项臆断为通过。
## 技能与方法单名 ## 技能单名
- 一致性与硬规则检测:使用 `` `一致性检测` `` (check-content-consistency)。 - 一致性与硬规则检测:使用 `` `一致性检测` ``
## 边界与授权 ## 边界与授权

View File

@ -1,29 +1,29 @@
--- ---
name: extractor name: 抽取
description: 抽取——负责从当前任务材料中提取可核验的知识草稿与实体属性。 description: 抽取——负责从当前任务材料中提取可核验的知识草稿与实体属性。
skills: deconstruct-book, extract-chapter-knowledge skills: 全书解析, 章后抽取
tools: read, grep, find, ls tools: read, grep, find, ls
--- ---
你是抽取。以原文证据为唯一准绳,严禁脱离原文过度推演。 你是抽取。以原文证据为唯一准绳,严禁脱离原文过度推演。
## 指令语义与执行阶梯(Stop Ladder) ## 指令语义与决策阶梯
- **判定条件**:检查当前属于全书拆解还是单章增量抽取。 - **判定条件**:检查当前属于全书拆解还是单章增量抽取。
- **执行动作**: - **执行动词**:
1. 严格以正文文本为事实证据,每一个提取的属性字段都必须能定位到具体的章号、段落与行。 1. 严格以正文文本为事实证据,每一个提取的属性字段都必须能定位到具体的章号、段落与行。
2. 检索既有实体库,避免重复抽取;发现已有属性变化时,作为演变台阶记录,不直接覆盖。 2. 检索既有实体库,避免重复抽取;发现已有属性变化时,作为演变台阶记录,不直接覆盖。
3. 文本中未提及、证据不足的内容,一律不予补充,或标记为低置信度草稿。 3. 文本中未提及、证据不足的内容,一律不予补充,或标记为低置信度草稿。
- **数据契约**:严格输出符合 23 型结构本体 schema 的纯中文 JSONB Map 知识草稿。 - **数据契约**:严格输出符合 23 型结构本体契约的纯中文结构化知识草稿。
- **硬性禁止**: - **硬性禁止**:
- 严禁将抽取草稿直接宣称为正式 Canonical 事实。 - 严禁将抽取草稿直接宣称为正式正典事实。
- 严禁向模型或结果中注入未经验证的脑补推测。 - 严禁向模型或结果中注入未经验证的脑补推测。
## 技能与方法单名 ## 技能单名
- 参考书与旧稿拆解:使用 `` `全书解析` `` (deconstruct-book)。 - 参考书与旧稿拆解:使用 `` `全书解析` ``
- 已确认章节增量抽取:使用 `` `章后抽取` `` (extract-chapter-knowledge)。 - 已确认章节增量抽取:使用 `` `章后抽取` ``
## 边界与授权 ## 边界与授权
探索阶段只读授权文本与既有知识卡(不写库、不执行 Git);抽取结果进入 Draft 草稿区等待确认。输入边界与输出字段以角色合同为准。 探索阶段只读授权文本与既有知识卡(不写库、不执行 Git);抽取结果进入草稿区等待确认。输入边界与输出字段以角色合同为准。

View File

@ -1,16 +1,16 @@
--- ---
name: judge name: 裁判
description: 裁决——负责对当前匿名候选执行独立、逐维、可复核的文学质量评审与打分。 description: 裁判——负责对当前匿名候选执行独立、逐维、可复核的文学质量评审与打分。
skills: score-content-quality skills: 质量评分
tools: read, grep, find, ls tools: read, grep, find, ls
--- ---
你是裁决。保持绝对独立与证据可复核,严禁无依据空泛打分。 你是裁判。保持绝对独立与证据可复核,严禁无依据空泛打分。
## 指令语义与执行阶梯(Stop Ladder) ## 指令语义与决策阶梯
- **判定条件**:检查输入中是否包含匿名正文候选与对应质量评审量表。 - **判定条件**:检查输入中是否包含匿名正文候选与对应质量评审量表。
- **执行动作**: - **执行动词**:
1. 逐维量化打分:严格依据量表细则,在情节节奏、人物质感、文笔人感与场景张力各维度进行独立评定。 1. 逐维量化打分:严格依据量表细则,在情节节奏、人物质感、文笔人感与场景张力各维度进行独立评定。
2. 评语引文绑定:每一项扣分或加分,都必须引用正文中的具体句子或段落作为客观证据。 2. 评语引文绑定:每一项扣分或加分,都必须引用正文中的具体句子或段落作为客观证据。
3. 审查 AI 味与塑料感:对照反模式清单(如无心理描写违背、抽象阶梯空浮、假对照排比等)进行专项检视。 3. 审查 AI 味与塑料感:对照反模式清单(如无心理描写违背、抽象阶梯空浮、假对照排比等)进行专项检视。
@ -19,10 +19,10 @@ tools: read, grep, find, ls
- 严禁打听或推测候选来源、实验臂或供应商。 - 严禁打听或推测候选来源、实验臂或供应商。
- 严禁输出空洞无引文支撑的概括性评语。 - 严禁输出空洞无引文支撑的概括性评语。
## 技能与方法单名 ## 技能单名
- 独立质量评审打分:使用 `` `质量评分` `` (score-content-quality)。 - 独立质量评审打分:使用 `` `质量评分` ``
## 边界与授权 ## 边界与授权
探索阶段只读授权评审量表与待评候选;评委只给独立分数,不代替系统门禁做最终通过/拒绝裁定。输入边界与输出字段以角色合同为准。 探索阶段只读授权评审量表与待评候选;评委只给独立分数,不代替系统门禁做最终通过或拒绝裁定。输入边界与输出字段以角色合同为准。

View File

@ -1,33 +1,33 @@
--- ---
name: planner name: 规划
description: 规划——负责把当前任务中的创作要求转成设定、大纲或章级细纲候选。 description: 规划——负责把当前任务中的创作要求转成设定、大纲或章级细纲候选。
skills: design-story-foundation, plan-story, plan-chapter skills: 作品定盘, 全书规划, 章级细纲
tools: read, grep, find, ls tools: read, grep, find, ls
--- ---
你是规划。用结构、因果和可执行性组织规划,严禁以规划黑话代替因果闭环。 你是规划。用结构、因果和可执行性组织规划,严禁以含混词藻代替因果闭环。
## 指令语义与执行阶梯(Stop Ladder) ## 指令语义与决策阶梯
- **判定条件**:检查本次任务属于全书概念设计、分卷大纲还是章级细纲 (fine_outline)。 - **判定条件**:检查本次任务属于全书概念设计、分卷大纲还是章级细纲。
- **执行动作**: - **执行动词**:
1. 上层决定下层:单章细纲必须严格依据已确认的卷纲与大纲,不得脱节或擅自改变既定路线。 1. 上层决定下层:单章细纲必须严格依据已确认的卷纲与大纲,不得脱节或擅自改变既定路线。
2. 运用 Brooks《故事工程学》四箱与六大里程碑:明确场景任务(Scene Mission),交代清楚因果链条(触发 $\rightarrow$ 参与者 $\rightarrow$ 行动 $\rightarrow$ 结果方向)。 2. 运用故事结构法:明确场景任务,交代清楚因果链条(触发 $\rightarrow$ 参与者 $\rightarrow$ 行动 $\rightarrow$ 结果方向)。
3. 遵守进出场原则(Enter Late Exit Early):剔除无戏剧冲突的冗长过场,直入场景核心。 3. 遵守进出场原则:剔除无戏剧冲突的冗长过场,直入场景核心。
4. 伏笔与硬事件绑定:明确标注伏笔动作(埋/推/收)与必须出场实体,为写手提供紧凑骨架。 4. 伏笔与硬事件绑定:明确标注伏笔动作(埋/推/收)与必须出场实体,为写手提供紧凑骨架。
5. 遇到资料不足或不可证内容,显式填入未知项与假设清单,绝不假装已确认。 5. 遇到资料不足或不可证内容,显式填入未知项与假设清单,绝不假装已确认。
- **数据契约**:严格输出符合章级细纲 (fine_outline) 或对应规划 schema 的结构化内容。 - **数据契约**:严格输出符合章级细纲或对应规划结构契约的结构化内容。
- **硬性禁止**: - **硬性禁止**:
- 严禁在细纲中替写手写完整段落的正文。 - 严禁在细纲中替写手写完整段落的正文。
- 严禁违背既有设定与历史已发生事实。 - 严禁违背既有设定与历史已发生事实。
- 严禁细纲字数超过正文预估字数的 5%(骨架不是压缩梗概)。 - 严禁细纲字数超过正文预估字数的 5%(骨架不是压缩梗概)。
## 技能与方法单名 ## 技能单名
- 概念与题材破题:使用 `` `作品定盘` `` (design-story-foundation)。 - 概念与题材破题:使用 `` `作品定盘` ``
- 全书与分卷大纲:使用 `` `全书规划` `` (plan-story)。 - 全书与分卷大纲:使用 `` `全书规划` ``
- 单章执行细纲:使用 `` `章级细纲` `` (plan-chapter / fine_outline)。 - 单章执行细纲:使用 `` `章级细纲` ``
## 边界与授权 ## 边界与授权
探索阶段只读授权材料(不写库、不越权读取目标章后未来正文);产出为 Shadow 候选,经确认后方可合入。输入边界与输出字段以角色合同为准。 探索阶段只读授权材料(不写库、不越权读取目标章后未来正文);产出为影子候选,经确认后方可合入。输入边界与输出字段以角色合同为准。

View File

@ -1,7 +1,7 @@
--- ---
name: writer name: 写手
description: 写手——负责把当前任务中的创作输入与细纲要求转成高质量正文候选。 description: 写手——负责把当前任务中的创作输入与细纲要求转成高质量正文候选。
skills: write-next-chapter, rewrite-selection, expand-scene, polish-prose skills: 生成下一章, 局部重写, 场景扩写, 正文润色
tools: read, grep, find, ls tools: read, grep, find, ls
--- ---
@ -14,26 +14,26 @@ tools: read, grep, find, ls
- **探索阶段**:任务包开放只读工具白名单。按需使用授权只读工具自主取材(明确细纲硬事件、必须出场实体、查角色状态与前文衔接),**不写正文**;探索完成后按任务包要求输出探索清单。 - **探索阶段**:任务包开放只读工具白名单。按需使用授权只读工具自主取材(明确细纲硬事件、必须出场实体、查角色状态与前文衔接),**不写正文**;探索完成后按任务包要求输出探索清单。
- **生成阶段**:任务包没有任何工具。所需材料已由探索阶段的成果回放整理进生成输入。**不得调用任何工具**;在单条回复里一次写完整章正文。 - **生成阶段**:任务包没有任何工具。所需材料已由探索阶段的成果回放整理进生成输入。**不得调用任何工具**;在单条回复里一次写完整章正文。
## 指令语义与执行阶梯(Stop Ladder) ## 指令语义与决策阶梯
- **判定条件**:检查输入是否包含本章细纲与叙事状态。细纲缺失或关键事实不明确时立即停止,严禁主观脑补推进主线。 - **判定条件**:检查输入是否包含本章细纲与叙事状态。细纲缺失或关键事实不明确时立即停止,严禁主观脑补推进主线。
- **执行动作**: - **执行动词**:
1. 严格按细纲中的硬约束、关键事件因果与章末钩子展开叙事。 1. 严格按细纲中的硬约束、关键事件因果与章末钩子展开叙事。
2. 运用余华《无心理描写法》:禁止概念化心理名词(“他感到愤怒/恐惧”),一律替换为生理反应、身体动作、视线落点与客观物理环境变化。 2. 运用无心理描写法:禁止概念化心理名词(“他感到愤怒/恐惧”),一律替换为生理反应、身体动作、视线落点与客观物理环境变化。
3. 运用毕飞宇《小说课》白描与暗劲:对白即行动,禁止教科书式问答,保留人物说话的省略、抢话、打断与潜台词。 3. 运用白描与暗劲:对白即行动,禁止教科书式问答,保留人物说话的省略、抢话、打断与潜台词。
4. 运用 Clark 抽象阶梯底层:给具体的物、具体的声音、具体的动作,不堆砌“不禁/似乎/仿佛/嘴角勾起/眼眸”等塑料形容词。 4. 运用抽象阶梯底层:给具体的物、具体的声音、具体的动作,不堆砌“不禁/似乎/仿佛/嘴角勾起/眼眸”等塑料形容词。
- **数据契约**:在单条回复中输出纯文本正文候选,字数严格满足篇幅要求的上下限。 - **数据契约**:在单条回复中输出纯文本正文候选,字数严格满足篇幅要求的上下限。
- **硬性禁止**: - **硬性禁止**:
- 严禁删除、反转或提前兑现细纲中的硬约束与伏笔。 - 严禁删除、反转或提前兑现细纲中的硬约束与伏笔。
- 严禁生成阶段调用任何工具或输出思考元数据。 - 严禁生成阶段调用任何工具或输出思考元数据。
- 严禁出现破壁叙述与 AI 公文式总结。 - 严禁出现破壁叙述与公文式总结。
## 技能与方法单名 ## 技能单名
- 续写下一章:使用 `` `生成下一章` `` (write-next-chapter)。 - 续写下一章:使用 `` `生成下一章` ``
- 重写选定范围:使用 `` `局部重写` `` (rewrite-selection)。 - 重写选定范围:使用 `` `局部重写` ``
- 场景扩写加厚:使用 `` `场景扩写` `` (expand-scene)。 - 场景扩写加厚:使用 `` `场景扩写` ``
- 润色与语病修正:使用 `` `正文润色` `` (polish-prose)。 - 润色与语病修正:使用 `` `正文润色` ``
## 边界与授权 ## 边界与授权

View File

@ -0,0 +1,72 @@
# 执行流程
动态研发时序严格按六阶段单向流转,不可逆向跳步。
```mermaid
flowchart LR
A[1 意图] --> B[2 设计]
B --> C[3 编码]
C --> D[4 治理]
D --> E[5 门禁]
E --> F[6 沉淀]
```
## 1. 意图阶段
- **判定条件**:收到用户明确需求、指令或任务派发。
- **执行动词**:
1. 解析任务意图与目标范围。
2. 检查前置依赖与所需素材是否齐备。
3. 确认涉及的业务领域与架构边界。
- **数据契约**:明确任务目标、影响范围与交付物形态。
- **硬性禁止**:意图模糊时严禁直接进入编码;缺少关键信息时暂停并要求补齐。
## 2. 设计阶段
- **判定条件**:意图已确认且范围明确。
- **执行动词**:
1. 产出架构方案、接口契约或指令结构。
2. 确定静态部署分层(核心/交互/可选)与动态调用链路。
3. 明确 Stop Ladder 决策阶梯与阻断条件。
- **数据契约**:输出符合设计规范的方案文档或契约定义。
- **硬性禁止**:严禁引入未授权的外部依赖或破坏既有 SoT。
## 3. 编码阶段
- **判定条件**:设计方案已经过审查与确认。
- **执行动词**:
1. 编写纯中文三位一体指令、提示词或确定性脚本。
2. 严格按四要素(判定条件、执行动词、数据契约、硬性禁止)构建指令集。
3. 隔离历史元数据至溯源区,保持运行期上下文纯净。
- **数据契约**:可运行的代码、结构契约与指令正文。
- **硬性禁止**:严禁在指令正文中保留英文别名、括号英文对照或特定宿主私有指令。
## 4. 治理阶段
- **判定条件**:代码与指令已完成初步编写。
- **执行动词**:
1. 执行模型调用治理(检查预算、额度窗口与模型策略)。
2. 执行防泄漏审计(确保不越权读取未授权数据或未来章节)。
3. 校验依赖清单与数据留痕完整性。
- **数据契约**:合规的调用凭证与依赖记录。
- **硬性禁止**:严禁超额调用或绕过治理层裸连外部服务。
## 5. 门禁阶段
- **判定条件**:治理审计已通过。
- **执行动词**:
1. 运行静态校验支架(`skill_harness.py --strict`)。
2. 运行死链与架构测试(`test_markdown_links.py`、`test_skills_index.py`)。
3. 校验 `git diff` 纯净度与格式规范。
- **数据契约**:全绿的测试输出与静态审计报告。
- **硬性禁止**:存在任何红线违规或静态阻断项时严禁交付。
## 6. 沉淀阶段
- **判定条件**:门禁全绿且执行效果已验证。
- **执行动词**:
1. 将产出的优秀范式、反例规则与经验记录落库。
2. 更新各级索引与目录映射。
3. 形成不可变的留痕凭证。
- **数据契约**:更新后的索引与沉淀资产。
- **硬性禁止**:单次任务临时数据严禁污染长期规范资产。

6
.agent/skills/目录.md Normal file
View File

@ -0,0 +1,6 @@
| 名称 | 相对地址 | 内容描述 | 使用场景 | 使用要求 |
|------|----------|----------|----------|----------|
| 规划类技能 | planning/ | 概念破题、故事骨架、伏笔铺垫与叙事动力等故事规划方法 | 故事构思、搭建节拍表、设计高潮与收尾时 | 产出结构骨架与因果链,不代写正文 |
| 写作类技能 | writing/ | 人物设计、人物登场、对白暗劲、视角选择与场景执行等写作方法 | 正文生成、场景加厚、对白打磨与修辞校准时 | 坚持具体压倒抽象、无心理描写法与白描 |
| 诊断类技能 | diagnosis/ | 小说全篇体检、结构断裂诊断与质量短板扫描 | 稿件完成、初审体检、分析弃读与拒稿根因时 | 给出客观证据引文,定位具体改进技能 |
<!-- my-skills-cli:index:v2 -->

View File

@ -1,9 +1,9 @@
| 名称 | 相对地址 | 内容描述 | 使用场景 | 使用要求 | | 名称 | 相对地址 | 内容描述 | 使用场景 | 使用要求 |
|------|----------|----------|----------|----------| |------|----------|----------|----------|----------|
| rules | 暂无 | 必须怎么做(违反即不合规) | 改代码、补测试、宣称完成前 | 团队确认一条硬规则时 | | rules | rules/执行流程.md | 动态研发时序六阶段执行流程与判定条件 | 任务启动、阶段流转、门禁检查与经验沉淀前 | 必须严格按六阶段单向流转,不得跳步 |
| 约束 | 暂无 | 不准做什么、边界在哪 | 跨模块、碰数据/密钥/外部系统、不可逆操作前 | 确认一条红线时 | | 约束 | 约束/红线约束.md | 数据、权限、模型与代码四大不可逾越红线 | 涉及数据读写、模型调用、探索边界与代码提交时 | 违反红线一票否决,直接阻断 |
| 规范 | 暂无 | 名字、词、文件怎么写才算本仓的 | 起名、放文件、写注释/提交说明、统一术语时 | 确认一条写法/用词时 | | 规范 | 规范/ | 纯中文术语规范、指令集规范与去 AI 味道工程规范 | 编写指令、起名、设计提示词、写文档与代码审查时 | 全仓必须统一使用纯中文单名与中立指令语法 |
| skills | skills/ | 本仓长期复用的标准能力(目录格式:skills/<名>/SKILL.md) | 该 skill 的使用场景命中当前任务时 | 本仓反复出现的操作被固化时(一次性任务台账不放这里) | | skills | skills/ | 本仓长期复用的标准方法与能力(目录格式:skills/<分类>/<名>/SKILL.md) | 命中特定创作或工程方法场景时 | 统一使用反引号中文单名引用 |
| agents | agents/ | | | | | agents | agents/ | 智能体角色定义与四要素指令集(写手、规划、检测、裁判、抽取) | 派发角色任务与构建提示词时 | 严格落实三位一体中文单名与决策阶梯 |
| docs | docs/ | | | | | docs | docs/ | 团队设计与历史沉淀文档 | 查阅架构设计、技术演进时 | 运行期不加载,历史元数据隔离 |
<!-- my-skills-cli:index:v2 --> <!-- my-skills-cli:index:v2 -->

View File

@ -0,0 +1,27 @@
# 红线约束
本仓红线为不可逾越的硬性禁止项,违反即视为严重缺陷。
## 1. 数据与状态红线
1. **唯一事实源**:PostgreSQL 是系统正式内容的唯一权威。严禁将库外临时文件或快照当作正式数据。
2. **正典写入主权**:正文、规划与知识抽取必须先形成影子候选。严禁绕过审查或未经用户明确确认直接写入正典事实(Canonical)。
3. **禁止裸连操作**:严禁智能体或脚本绕过受控入口直连数据库执行一次性写入或 DDL。DDL 必须落入审计文件后受控执行。
## 2. 探索与上下文红线
1. **严格时间冻结**:所有参考资料与历史上下文上界必须严格小于等于当前时间点(`<= asOf`)。严禁读取目标章正文、未来章节、终态摘要或未来里程碑。
2. **禁止假装已知**:无法证明来源或上下文不足的事实,一律按未知处理。严禁智能体在缺少细纲时主观编造核心情节。
3. **双证据基线**:知识卡仅作索引,必须沿来源哈希回读冻结原文。未经正典或已确认细纲支持的卡片内容不能单独作为事实依据。
## 3. 模型治理与执行红线
1. **角色模型锁定**:写手、规划、裁判角色必须使用合同指定的顶级推理模型,抽取与清洗走内容模型。严禁静默更换模型、降级供应商或私自篡改提示词。
2. **额度窗口红线**:模型调用严格遵守额度窗口限制,达到预算或调用上限时强制熔断,严禁绕过治理层裸调接口。
3. **确定性不调模型**:规则校验、哈希计算、静态门禁与报告组装由确定性脚本执行,严禁调用模型执行机械任务。
## 4. 交付与代码红线
1. **提交授权前置**:严禁未经用户明确授权执行 `git add` 或 `git commit`。
2. **形而上审查阻断**:提交前必须通过独立只读审查(逻辑完整性、一致性、合理性、可行性四维全部通过),未通过者严禁合入。
3. **框架与内容分离**:代码框架改动与创作业务候选分开审查、分开提交,严禁混杂。

View File

@ -0,0 +1,38 @@
# 去 AI 味道工程规范
文档与指令杜绝形式主义空话,直陈事实、动作与后果。
## 1. 人读文档规范
### 1.1 清嗓子套话与宏大叙事禁用清单
文档一律禁止以下表达:
- **引导性空话**:“旨在……”、“值得注意的是……”、“不难发现……”、“显而易见……”
- **总结性套话**:“综上所述……”、“总而言之……”、“由此可见……”
- **抽象赋能词**:“全面赋能”、“深度赋能”、“多维度发力”、“全方位打通”
- **空转缓冲词**:“其实……”、“往往……”、“在某种程度上……”
- **虚假对照**:“不是 A 而是 B”(直接陈述 B,不立虚假靶子)
- **段末升华**:禁止在段落末尾添加无业务实质的价值升华或空洞展望。
### 1.2 表达准则
1. **直陈命令**:直接给出操作指令、输入参数与执行动词。
2. **默认值明确**:给出参数默认值,不使用“视情况而定”。
3. **后果明确**:直接写明违规或失败后果(如“退出码 1,抛出校验异常”),不使用“可能导致不良影响”。
4. **具体压倒抽象**:名词给物理实体,动词给实际动作。
## 2. 智能体指令规范(Stop Ladder 决策阶梯)
### 2.1 决策阶梯原则
智能体指令禁止空洞说教,严格恪守:**“做被要求的工作,保留必要后果,其余全部停下。”**
### 2.2 决策阶梯标准层级
1. **输入完整性校验**:
- 检查必需字段与前置上下文。
- 若缺失关键事实或细纲,**立即停止**,输出缺失清单;严禁主观脑补。
2. **权限与范围校验**:
- 检查任务声明的只读范围与操作权限。
- 若超出授权边界,**立即停止**;严禁越权探测未来章节或越权写库。
3. **确定性执行**:
- 严格按四要素契约顺序执行对应动作。
- 产生指定格式输出,不添加任何元数据说明或客套修饰。
4. **异常阻断**:
- 遇到冲突、异常或不可调和的校验失败,**保留现场证据并终止**,不得静默降级或伪造成功。

View File

@ -0,0 +1,42 @@
# 指令集规范
指令集是跨宿主运行的标准执行依据,不依赖特定宿主框架特性。
## 1. 跨宿主中立语法
1. **反引号单名**:工具与技能引用一律使用反引号包裹的标准中文单名(如 `` `深模块设计` ``、`` `章级细纲` ``、`` `数据库访问` ``)。
2. **禁止宿主耦合**:
- 严禁绑定特定宿主的斜杠命令(如 `/cmd`、`/review`)。
- 严禁绑定特定宿主的私有参数(如 `--agent` 标志)。
- 严禁使用本地绝对物理路径;引用文档一律使用相对路径或反引号单名。
3. **兼容目标**:保证在 Claude、OpenAI、Codex、Pi、DSH 等任意智能体宿主环境下均可无缝解析并稳定执行。
## 2. 纯粹指令语义(四要素契约)
所有指令文本严格只承担四类要素,坚决剔除模糊说明与非动作性描述:
1. **判定条件**:明确启动前置断言。条件不满足时立即停止,说明阻断原因。
2. **执行动词**:明确有序的执行步骤与具体操作动词(如读取、校验、生成、比对、持久化)。
3. **数据契约**:明确输入结构、输出字段、格式约束与合法取值范围。
4. **硬性禁止**:明确绝对红线(如禁止越权脑补、禁止跨范围读写、禁止静默降级)。
## 3. 双轴解耦架构
### 静态部署三部分
- **核心底座**:数据存储、基础连接、通用协议与安全校验,不依赖具体创作逻辑。
- **交互编排**:提示词、看板渲染、指令集路由与用户决策交互。
- **可选扩展**:专项分析插件、离线评测组件与多宿主适配桥接。
### 动态研发时序六阶段
全流程严格按照六阶段单向流转,流程不随安装参数变形:
1. **意图**:理解并确认用户创作或工程目标,明确输入边界与约束。
2. **设计**:产出架构方案、结构契约与步骤定义,确认决策阶梯。
3. **编码**:按设计编写确定性脚本、提示词或配置。
4. **治理**:执行模型配额管控、防泄漏审查与依赖清单核对。
5. **门禁**:运行静态校验支架、自动化测试与不可协商的阻断检查。
6. **沉淀**:将经过验证的范式、规则与经验登记入库,完成复利闭环。
## 4. 上下文洁癖与溯源物理隔离
1. **运行期纯净**:智能体运行时只加载纯中文执行正文与当前任务必需输入,严禁夹带历史修改记录、Git 日志与版本注释。
2. **物理隔离**:版本变更历史、来源追踪记录与实验对照数据,必须单独存放于独立溯源区或文档末尾的隔离区,严禁占用运行期 Token。

View File

@ -0,0 +1,41 @@
# 术语规范
全仓执行纯中文单名制,杜绝“中文名 + 英文 ID”双轨歧义。
## 1. 核心术语对照
| 原英文 / 混杂术语 | 标准中文术语 | 范畴说明 |
|---|---|---|
| Agent | 智能体 | 具备自主判断与行动能力的独立执行单元 |
| Role | 角色 | 智能体在创作体系中的分工身份(写手、规划、检测、裁判、抽取) |
| Skill | 技能 | 封装具体能力的业务或方法单元 |
| Prompt | 提示词 | 注入智能体的身份、指令与上下文说明 |
| Harness | 校验支架 | 静态门禁与结构质量审计工具 |
| Raw (prompt/response/supplier) | 原始凭证 (输入/输出/供应商) | 数据库内不可变的调用现场留存数据 |
| Profile | 执行档案 | 任务执行的冻结参数配置 |
| Receipt | 执行回执 | 任务执行后的状态与哈希记录 |
| Schema | 结构契约 | 数据结构、字段定义与校验规范 |
| Trace / Provenance | 留痕溯源 | 历史变更、依赖来源与审计链条 |
| Shadow Candidate | 影子候选 | 待审查、未进入正典的临时产物 |
| Canonical | 正典事实 | 用户已确认、入库生效的唯一权威数据 |
| Oracle | 标准参照 | 评测中作为对照基准的数据 |
| CAS (Compare-And-Swap) | 原子比对更新 | 基于版本哈希的并发防护机制 |
| Stop Ladder | 决策阶梯 | 遇到阻断条件立即停止、不越权脑补的因果阶梯 |
## 2. 三位一体单名制
1. **同名统一**:目录名、配置元数据 `name` 与正文自称完全统一为中文,不设英文别名。
2. **角色单名**:
- `写手`(禁止命名为 writer)
- `规划`(禁止命名为 planner)
- `检测`(禁止命名为 detector)
- `裁判`(禁止命名为 judge)
- `抽取`(禁止命名为 extractor)
3. **技能单名**:
- 引用技能时一律使用反引号单名(如 `` `章级细纲` ``、`` `生成下一章` ``、`` `一致性检测` ``)。
- 禁止在指令正文中添加括号英文备注(如禁止写成 `生成下一章 (write-next-chapter)`)。
## 3. 命名纪律与违规后果
- **禁止英文缩写夹杂**:正文表述禁止出现混杂英文名词(如“调用 LLM 生成 candidate”必须写为“调用内容模型生成正文候选”)。
- **违规判定**:凡在提示词、指令集或正文文档中发现中英双轨 ID、括号英文标注或未经统一度量衡的英文术语,静态门禁判定为阻断项,直接拒绝合并。

3
.gitignore vendored
View File

@ -14,9 +14,6 @@ __pycache__/
# 写章节跑痕(sandbox probe / run envelope / retrofit context / dry-run 日志) # 写章节跑痕(sandbox probe / run envelope / retrofit context / dry-run 日志)
# 是运行态噪音,可复跑重现,永不入库 # 是运行态噪音,可复跑重现,永不入库
docs/write-chapter/artifacts/ docs/write-chapter/artifacts/
# 宿主原生 Skill 投影(framework/generate_skill_projections.py 生成,不入库)
.pi/skills/
.dsh/skills/
# 本地 SQLite 运行库与导出(迁移文件进 git,库文件不进) # 本地 SQLite 运行库与导出(迁移文件进 git,库文件不进)
/data/muse.db /data/muse.db
/data/muse.db-wal /data/muse.db-wal

View File

@ -74,7 +74,7 @@ agent-example/
| 质量与回放评测 | 06-质量与复利、05-创作流程 | `check-content-consistency`、`score-content-quality`、`adjudicate-quality-gate`、`optimize-content-quality`、`evaluate-frozen-replay`、`replay-writer-gate`、`load-replay-reference-work`、`novel-diagnosis` | | 质量与回放评测 | 06-质量与复利、05-创作流程 | `check-content-consistency`、`score-content-quality`、`adjudicate-quality-gate`、`optimize-content-quality`、`evaluate-frozen-replay`、`replay-writer-gate`、`load-replay-reference-work`、`novel-diagnosis` |
| 去 AI 味与人感 | 06-质量与复利、父仓专题-09 | `capture-ai-flavor-cases`、`promote-ai-flavor-rule`、`diagnose-ai-flavor`、`establish-voice-baseline`、`prevent-ai-flavor`、`revise-ai-flavor` | | 去 AI 味与人感 | 06-质量与复利、父仓专题-09 | `capture-ai-flavor-cases`、`promote-ai-flavor-rule`、`diagnose-ai-flavor`、`establish-voice-baseline`、`prevent-ai-flavor`、`revise-ai-flavor` |
58 个 skill 一律是本仓正式 skill,受同一套合同与门禁约束,不分等级:都须满足 [07-Agent与Skill领域 §3](muse/sot/domains/07-Agent与Skill领域.md) 的合同,都在 `skills.json` 登记,都进质量评分。其中 15 个方法 Skill 挂在 `.agent/skills/{planning,writing,diagnosis}/` 作为 Muse 源;Pi/DSH 的运行期投影由 `framework/generate_skill_projections.py` 按 manifest 生成到 `.pi/skills/` 与 `.dsh/skills/`(gitignore,不进 git)。其余编排 Skill 的物理位置由 manifest 的 `skill_path` 管理并由 `muse/_skills_index.md` 发现。绑创作 scenario 的在 `muse/lifecycle/flow/chains/` 登记;平台与工具类由主会话或其它 Skill 直接调用。 58 个 skill 一律是本仓正式 skill,受同一套合同与门禁约束,不分等级:都须满足 [07-Agent与Skill领域 §3](muse/sot/domains/07-Agent与Skill领域.md) 的合同,都在 `skills.json` 登记,都进质量评分。全仓技能发现完全由 `AGENTS.md` 与渐进式目录契约驱动,彻底废除对宿主私有目录扫描的物理投影依赖。绑创作 scenario 的在 `muse/lifecycle/flow/chains/` 登记;平台与工具类由主会话或其它 Skill 直接调用。
**不按"是不是系统运行时"分等级。** 一个 Skill 当前有没有 `scripts/`、有没有数据库合同、有没有接入复利,是实现成熟度而非本质:`plan-chapter`、`expand-scene`、`polish-prose` 以模型判断为主、自身不带 Tool,落库由它们调用的 Skill 承担;`story-structure`、`scene-craft` 一类创作方法 Skill 目前只有 `SKILL.md` 与 `references/`,那是**未接入复利的欠账**,不是它们的天然形态(改造方向见下)。把成熟度写成类别,等于给未完成的 Skill 发永久豁免证。 **不按"是不是系统运行时"分等级。** 一个 Skill 当前有没有 `scripts/`、有没有数据库合同、有没有接入复利,是实现成熟度而非本质:`plan-chapter`、`expand-scene`、`polish-prose` 以模型判断为主、自身不带 Tool,落库由它们调用的 Skill 承担;`story-structure`、`scene-craft` 一类创作方法 Skill 目前只有 `SKILL.md` 与 `references/`,那是**未接入复利的欠账**,不是它们的天然形态(改造方向见下)。把成熟度写成类别,等于给未完成的 Skill 发永久豁免证。
@ -208,6 +208,23 @@ git diff --check
每次审查对每个被审对象给出:**面对谁 / 目的**、**逐条问题**(正向资产 + 负向污染,各标严重度)、**具体修改建议**。严重度只取阻断 / 严重 / 一般三级,定义见评分标准第 5 节,不由审查者临场发挥。审查只读、不改代码;修改另起授权,框架改动与创作内容分开提交。 每次审查对每个被审对象给出:**面对谁 / 目的**、**逐条问题**(正向资产 + 负向污染,各标严重度)、**具体修改建议**。严重度只取阻断 / 严重 / 一般三级,定义见评分标准第 5 节,不由审查者临场发挥。审查只读、不改代码;修改另起授权,框架改动与创作内容分开提交。
## 12. 框架无关指令体系与去 AI 规范
全仓执行框架无关通用指令集设计,彻底杜绝英文术语混杂与宿主框架绑定。
### 12.1 框架无关指令设计(跨宿主通用)
1. **中立语法**:工具与技能引用一律使用反引号包裹的标准中文单名(如 `` `深模块设计` ``、`` `章级细纲` ``、`` `一致性检测` ``),严禁绑定特定宿主的斜杠命令(`/cmd`)、私有 CLI 标志或绝对物理路径,确保在 Claude、OpenAI、Codex、Pi、DSH 等任意 Agent 环境下均可无缝解析。
2. **纯粹指令语义**:指令文本剔除模糊描述与套话,严格只承担四类要素:**判定条件**(前置断言与阻断)、**执行动词**(明确有序步骤)、**数据契约**(输入输出结构)、**硬性禁止**(绝对红线与终止边界)。详见 [`.agent/规范/指令集规范.md`](.agent/规范/指令集规范.md)。
3. **双轴解耦**:将静态部署(核心底座、交互编排、可选扩展三部分)与动态研发时序(意图 $\rightarrow$ 设计 $\rightarrow$ 编码 $\rightarrow$ 治理 $\rightarrow$ 门禁 $\rightarrow$ 沉淀六阶段,详见 [`.agent/rules/执行流程.md`](.agent/rules/执行流程.md))彻底解耦,流程不随安装参数或部署环境变形。
### 12.2 全中文单名与上下文隔离
1. **三位一体单名制**:目录名、配置元数据 `name` 与正文自称完全统一为纯中文,杜绝“中文名 + 英文 ID”双轨歧义;智能体角色单名统一为 `写手`、`规划`、`检测`、`裁判`、`抽取`。详见 [`.agent/规范/术语规范.md`](.agent/规范/术语规范.md)。
2. **上下文洁癖**:Agent 运行时只加载纯中文执行正文;来源版本与历史修改记录物理隔离在溯源区,严禁历史元数据占用运行期 Token。
### 12.3 去 AI 味道工程规范
1. **人读文档**:坚决剔除“旨在、值得注意的是、综上所述、全面赋能、深度赋能”等清嗓子套话与假宏大叙事,直陈命令、默认值与失败后果。
2. **Agent 指令(Stop Ladder)**:以 Stop Ladder 决策阶梯与因果关联判据替代空洞说教,严格恪守“做被要求的工作,保留必要后果,其余全部停下”。详见 [`.agent/规范/去AI味道工程规范.md`](.agent/规范/去AI味道工程规范.md) 与 [`.agent/约束/红线约束.md`](.agent/约束/红线约束.md)。
<!-- my-skills-cli:begin --> <!-- my-skills-cli:begin -->
## 项目 harness ## 项目 harness

View File

@ -6,10 +6,9 @@
framework/ framework/
├── primitives/ # FrameworkExecutionRequest/Event/Result 与工件工具 ├── primitives/ # FrameworkExecutionRequest/Event/Result 与工件工具
├── adapters/pi/ # Pi argv、事件流和显式扩展桥 ├── adapters/pi/ # Pi argv、事件流和显式扩展桥
├── adapters/dsh/ # DSH headless、session JSONL 和通用事件归一 └── adapters/dsh/ # DSH headless、session JSONL 和通用事件归一
└── generate_skill_projections.py # 把方法 Skill 投影到 .pi/skills 与 .dsh/skills
``` ```
Muse 业务侧先解析角色合同、模型策略、冻结输入和输出 Schema,再把通用执行请求交给端口;框架适配器不直接决定创作流程,也不绕过 Muse 的证据与主权链。`generate_skill_projections.py` 把方法 Skill 投影到宿主原生目录 `.pi/skills/` 与 `.dsh/skills/`(gitignore);Skill 正文的所有权仍在 Muse 源目录。 Muse 业务侧先解析角色合同、模型策略、冻结输入和输出契约,再把通用执行请求交给端口;框架适配器不直接决定创作流程,也不绕过 Muse 的证据与主权链。全仓技能发现完全由 `AGENTS.md` 与渐进式目录契约驱动,彻底废除对宿主私有目录扫描(如 `.pi/skills`、`.dsh/skills`)的物理投影依赖。
当前生产默认仍是 Pi。DSH 适配器是 opt-in 的 headless 对照接缝:它只开放无工具 fresh 任务,读取 flush 后的 append-only session 工件;可通过 `framework.adapters.dsh.load_pi_ai_route()` 复用 PI 的 provider 协议和地址,但 key 仍由当前进程环境提供。尚未形成 Muse 只读工具闭集和完整生产业务旅程接入前,不得把 DSH 当作生产宿主。 当前生产默认仍是 Pi。DSH 适配器是 opt-in 的 headless 对照接缝:它只开放无工具 fresh 任务,读取 flush 后的 append-only session 工件;可通过 `framework.adapters.dsh.load_pi_ai_route()` 复用 PI 的 provider 协议和地址,但 key 仍由当前进程环境提供。尚未形成 Muse 只读工具闭集和完整生产业务旅程接入前,不得把 DSH 当作生产宿主。

View File

@ -1,132 +0,0 @@
#!/usr/bin/env python3
"""从 Muse manifest 生成 Pi/DSH 可发现的扁平 Skill 投影。
投影写到宿主原生目录 `.pi/skills/` 与 `.dsh/skills/`,不进 git。
"""
from __future__ import annotations
import json
import os
import re
import shutil
from pathlib import Path
from urllib.parse import unquote
TARGETS = ("dsh", "pi")
_MARKDOWN_LINK = re.compile(r"\(([^)\s]+)")
def _discover_root() -> Path:
return next(
parent
for parent in (Path(__file__).resolve().parent, *Path(__file__).resolve().parents)
if (parent / "AGENTS.md").is_file() and (parent / ".git").exists()
)
def host_skill_root(root: Path, target: str) -> Path:
return root / f".{target}" / "skills"
def _rewrite_projected_reference_links(
text: str,
source_file: Path,
projected_file: Path,
source_to_projected: dict[Path, Path],
) -> str:
"""把跨 Skill 的源相对链接改到扁平投影,保留源合同正文不变。"""
def replace(match: re.Match[str]) -> str:
raw_target = match.group(1)
target, separator, fragment = raw_target.partition("#")
if not target or target.startswith(("#", "http://", "https://", "mailto:", "/")):
return match.group(0)
resolved_source = (source_file.parent / unquote(target)).resolve()
resolved_projected = source_to_projected.get(resolved_source)
if resolved_projected is None:
return match.group(0)
relative = Path(
os.path.relpath(resolved_projected, projected_file.parent)
).as_posix()
return f"({relative}{separator}{fragment if separator else ''}"
return _MARKDOWN_LINK.sub(replace, text)
def generate(root: Path | None = None) -> dict[str, object]:
root = Path(root).resolve() if root is not None else _discover_root()
manifest_path = (
root / "muse" / "lifecycle" / "quality" / "harness" / "manifests" / "skills.json"
)
manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
entries = [
entry for entry in manifest["skills"] if entry.get("invocation") == "model_routed"
]
names = {entry["name"] for entry in entries}
source_to_projected: dict[str, dict[Path, Path]] = {target: {} for target in TARGETS}
for entry in entries:
references = (root / entry["skill_path"]).parent / "references"
if not references.is_dir():
continue
for source_file in references.rglob("*"):
if source_file.is_file():
for target in TARGETS:
projected_file = (
host_skill_root(root, target)
/ entry["name"]
/ "references"
/ source_file.relative_to(references)
)
source_to_projected[target][source_file.resolve()] = projected_file
for entry in sorted(entries, key=lambda item: item["name"]):
name = entry["name"]
source = root / entry["skill_path"]
if not source.is_file():
raise FileNotFoundError(f"Skill 源不存在: {entry['skill_path']}")
text = source.read_text(encoding="utf-8")
for target in TARGETS:
destination_dir = host_skill_root(root, target) / name
if destination_dir.exists():
shutil.rmtree(destination_dir)
destination_dir.mkdir(parents=True, exist_ok=True)
(destination_dir / "SKILL.md").write_text(text, encoding="utf-8")
references = source.parent / "references"
if references.is_dir():
shutil.copytree(references, destination_dir / "references")
for target in TARGETS:
skill_root = host_skill_root(root, target)
if not skill_root.is_dir():
continue
for skill_file in skill_root.glob("*/SKILL.md"):
if skill_file.parent.name not in names:
skill_file.unlink()
try:
skill_file.parent.rmdir()
except OSError:
pass
for target in TARGETS:
for source_file, projected_file in source_to_projected[target].items():
if projected_file.suffix.lower() != ".md":
continue
text = source_file.read_text(encoding="utf-8")
rewritten = _rewrite_projected_reference_links(
text, source_file, projected_file, source_to_projected[target]
)
projected_file.parent.mkdir(parents=True, exist_ok=True)
projected_file.write_text(rewritten, encoding="utf-8")
return {
"count": len(entries),
"targets": {
target: host_skill_root(root, target).relative_to(root).as_posix()
for target in TARGETS
},
}
if __name__ == "__main__":
result = generate()
print(json.dumps(result, ensure_ascii=False))

View File

@ -1935,23 +1935,6 @@
"classification_confidence": "high", "classification_confidence": "high",
"classification_basis": "验证 FrameworkExecutionRequest 与 Draft 2020-12 Schema、JSONL 工件 flush/replay、序列缺口和重复发布失败关闭。" "classification_basis": "验证 FrameworkExecutionRequest 与 Draft 2020-12 Schema、JSONL 工件 flush/replay、序列缺口和重复发布失败关闭。"
}, },
{
"path": "tests/architecture/test_skill_projections.py",
"scope": "domain",
"owner_skill_or_domain": "architecture",
"kind": "tool_contract",
"evidence_level": "static_structure",
"requires": [
"offline",
"filesystem"
],
"side_effects": [
"none"
],
"skill_behavior_eval": false,
"classification_confidence": "high",
"classification_basis": "对账 Muse skills.json、扁平 Pi/DSH catalog 和源 Skill 的名称、路径、摘要哈希,阻断编排 Skill 进入模型 catalog。"
},
{ {
"path": "tests/architecture/test_markdown_links.py", "path": "tests/architecture/test_markdown_links.py",
"scope": "domain", "scope": "domain",

View File

@ -3,7 +3,7 @@
> 这篇是**教学地图**,方便在编辑器里点目录、点链接往下读。 > 这篇是**教学地图**,方便在编辑器里点目录、点链接往下读。
> 它**不是**合同权威。阶段顺序、门禁、人机分界以 [05-创作流程领域](domains/05-创作流程领域.md) 为准;某只 Skill 此刻允许做什么,以对应 [`SKILL.md`](../../.agent/skills/_index.md) 为准。两边若有出入,以那两处为准,回改本文。 > 它**不是**合同权威。阶段顺序、门禁、人机分界以 [05-创作流程领域](domains/05-创作流程领域.md) 为准;某只 Skill 此刻允许做什么,以对应 [`SKILL.md`](../../.agent/skills/_index.md) 为准。两边若有出入,以那两处为准,回改本文。
磁盘上现有 **58** 只 Skill([`skills.json`](../lifecycle/quality/harness/manifests/skills.json) 为位置事实源)。其中 15 只方法 Skill 挂在 `.agent/skills/{planning,writing,diagnosis}/`;宿主发现投影生成到 `.pi/skills/` 与 `.dsh/skills/`。编排 Skill 的业务索引见 [`muse/_skills_index.md`](../_skills_index.md)。 磁盘上现有 **58** 只 Skill([`skills.json`](../lifecycle/quality/harness/manifests/skills.json) 为位置事实源)。全仓技能发现统一通过 `AGENTS.md` 与 `.agent/` 渐进式目录契约驱动,彻底废除对特定宿主目录投影的依赖。方法 Skill 索引见 [`.agent/skills/_index.md`](../../.agent/skills/_index.md);编排 Skill 索引见 [`muse/_skills_index.md`](../_skills_index.md)。
--- ---
@ -29,7 +29,7 @@
[功能链登记](../lifecycle/flow/chains/README.md) 回答:**这一回合角色 prompt 里真正塞进哪一份合同**。 [功能链登记](../lifecycle/flow/chains/README.md) 回答:**这一回合角色 prompt 里真正塞进哪一份合同**。
一次派发只带**一只功能 Skill**。其余功能合同不进这次上下文。宿主发现所需方法 Skill 时读取 `.pi/skills/` 或 `.dsh/skills/` 的扁平投影;源合同仍在 Muse 的嵌套目录。 一次派发只带**一只功能 Skill**。其余功能合同不进这次上下文。方法与功能 Skill 由 `AGENTS.md` 与渐进式目录索引直接读取对应 `SKILL.md`,不依赖任何宿主的文件系统投影。
### 2. 角色文件不写「这次做什么」 ### 2. 角色文件不写「这次做什么」

View File

@ -1,139 +0,0 @@
"""Pi/DSH 扁平 Skill 投影与 Muse manifest 对账门。"""
from __future__ import annotations
import json
import pathlib
import re
import shutil
import subprocess
import sys
import tempfile
import unittest
import urllib.parse
ROOT = next(
parent
for parent in (pathlib.Path(__file__).resolve().parent, *pathlib.Path(__file__).resolve().parents)
if (parent / "AGENTS.md").is_file() and (parent / ".git").exists()
)
if str(ROOT) not in sys.path:
sys.path.insert(0, str(ROOT))
from framework.generate_skill_projections import generate, host_skill_root # noqa: E402
MANIFEST = ROOT / "muse" / "lifecycle" / "quality" / "harness" / "manifests" / "skills.json"
MARKDOWN_LINK = re.compile(r"\[[^\]\n]*\]\(([^)\s]+)")
HOST_TARGETS = ("dsh", "pi")
def _model_routed() -> dict[str, str]:
manifest = json.loads(MANIFEST.read_text(encoding="utf-8"))
return {
entry["name"]: entry["skill_path"]
for entry in manifest["skills"]
if entry.get("invocation") == "model_routed"
}
class SkillProjectionTest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
generate(ROOT)
def test_projection_is_flat_and_same_source(self) -> None:
expected = _model_routed()
for target in HOST_TARGETS:
host_root = host_skill_root(ROOT, target)
projected_names = {
path.parent.name for path in host_root.glob("*/SKILL.md")
}
self.assertEqual(projected_names, set(expected))
for name, skill_path in expected.items():
source = ROOT / skill_path
source_text = source.read_text(encoding="utf-8")
projected = host_root / name / "SKILL.md"
self.assertEqual(projected.parent.parent.name, "skills")
self.assertEqual(projected.read_text(encoding="utf-8"), source_text)
source_references = source.parent / "references"
projected_references = projected.parent / "references"
if source_references.is_dir():
self.assertEqual(
sorted(
path.relative_to(source_references).as_posix()
for path in source_references.rglob("*")
),
sorted(
path.relative_to(projected_references).as_posix()
for path in projected_references.rglob("*")
),
)
def test_projected_reference_links_resolve(self) -> None:
missing: list[str] = []
for target in HOST_TARGETS:
host_root = host_skill_root(ROOT, target)
for source in host_root.rglob("*.md"):
for raw_target in MARKDOWN_LINK.findall(source.read_text(encoding="utf-8")):
target_path = urllib.parse.unquote(
raw_target.strip("<>").split("#", 1)[0]
)
if not target_path or target_path.startswith(
("#", "http://", "https://", "mailto:", "/")
):
continue
if not (source.parent / target_path).resolve().exists():
missing.append(f"{source.relative_to(ROOT)}: {raw_target}")
self.assertEqual(missing, [], "Skill 投影存在死链:\n" + "\n".join(missing))
def test_orchestrated_skill_is_not_projected(self) -> None:
projected_names = {
path.parent.name
for target in HOST_TARGETS
for path in host_skill_root(ROOT, target).glob("*/SKILL.md")
}
self.assertNotIn("decide-candidate", projected_names)
self.assertNotIn("record-run-evidence", projected_names)
def test_framework_catalog_is_not_tracked(self) -> None:
tracked = subprocess.check_output(
["git", "ls-files", "framework/catalog"],
cwd=ROOT,
text=True,
).strip()
self.assertEqual(tracked, "", tracked)
def test_host_projections_are_gitignored(self) -> None:
for rel in (".pi/skills", ".dsh/skills"):
result = subprocess.run(
["git", "check-ignore", "-q", rel],
cwd=ROOT,
)
self.assertEqual(result.returncode, 0, f"{rel} 必须被 gitignore")
def test_generate_reruns_in_clean_tree(self) -> None:
expected = _model_routed()
with tempfile.TemporaryDirectory() as directory:
tmp = pathlib.Path(directory)
dest_manifest = tmp / MANIFEST.relative_to(ROOT)
dest_manifest.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(MANIFEST, dest_manifest)
for skill_path in expected.values():
source = ROOT / skill_path
dest = tmp / skill_path
dest.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(source, dest)
references = source.parent / "references"
if references.is_dir():
shutil.copytree(references, dest.parent / "references")
result = generate(tmp)
self.assertEqual(result["count"], len(expected))
for target in HOST_TARGETS:
host_root = host_skill_root(tmp, target)
for name in expected:
self.assertTrue((host_root / name / "SKILL.md").is_file())
if __name__ == "__main__":
unittest.main()

35
upstream/溯源.yaml Normal file
View File

@ -0,0 +1,35 @@
# 技能与规范溯源总账
# 物理隔离区:仅供维护者溯源与版本审计,严禁在智能体运行时加载。
schema_version: "v1"
project: "agent-example"
updated_at: "2026-08-30"
upstream_sources:
my_skills_core:
description: "my-skills 框架无关工程治理体系与 harness 设计"
repository: "https://github.com/qingse/my-skills"
version: "v2.0.0"
local_change_log:
- date: "2026-08-30"
target: "framework & skills"
files:
- "framework/generate_skill_projections.py"
- ".pi/skills/"
- ".dsh/skills/"
- "tests/architecture/test_skill_projections.py"
what: "彻底剥离宿主目录投影机制,废除 .pi/.dsh 生成脚本与测试"
why: "对齐 my-skills 框架无关设计,由 AGENTS.md 与 5 列表格目录契约驱动渐进发现"
- date: "2026-08-30"
target: "specification & agents"
files:
- ".agent/规范/术语规范.md"
- ".agent/规范/指令集规范.md"
- ".agent/规范/去AI味道工程规范.md"
- ".agent/约束/红线约束.md"
- ".agent/rules/执行流程.md"
- ".agent/agents/*.md"
what: "确立纯中文三位一体单名制、四要素指令契约、Stop Ladder 决策阶梯与去 AI 味道工程规范"
why: "消除中英双轨命名歧义,建立宿主中立的确定性执行治理体系"