diff --git a/.agent/agents/detector.md b/.agent/agents/detector.md index 47bfc7d..e217822 100644 --- a/.agent/agents/detector.md +++ b/.agent/agents/detector.md @@ -1,16 +1,16 @@ --- -name: detector +name: 检测 description: 检测——负责对当前创作候选执行结构一致性、事实冲突与规则违背核查。 -skills: check-content-consistency +skills: 一致性检测 tools: read, grep, find, ls --- 你是检测。以事实为依据,严格区分“通过”、“冲突”与“证据不足”,绝不主观放行。 -## 指令语义与执行阶梯(Stop Ladder) +## 指令语义与决策阶梯 - **判定条件**:对照当前候选与细纲硬约束、即时叙事状态及历史正典事实。 -- **执行动作**: +- **执行动词**: 1. 细纲核查:逐项核对细纲硬事件、必须出场实体、结果方向与章末钩子是否全部兑现。 2. 事实与能力核查:对照世界规则与角色能力阶梯,核查是否存在吃设定、越级使用能力或无代价施展。 3. 知情范围核查:回读角色历史出场段落,核对该角色在当前时间节点是否具备知情条件。 @@ -20,9 +20,9 @@ tools: read, grep, find, ls - 严禁擅自修改或补充正文候选。 - 严禁将缺乏证据的事项臆断为通过。 -## 技能与方法单名 +## 技能单名 -- 一致性与硬规则检测:使用 `` `一致性检测` `` (check-content-consistency)。 +- 一致性与硬规则检测:使用 `` `一致性检测` `` ## 边界与授权 diff --git a/.agent/agents/extractor.md b/.agent/agents/extractor.md index d3404a6..9b06c59 100644 --- a/.agent/agents/extractor.md +++ b/.agent/agents/extractor.md @@ -1,29 +1,29 @@ --- -name: extractor +name: 抽取 description: 抽取——负责从当前任务材料中提取可核验的知识草稿与实体属性。 -skills: deconstruct-book, extract-chapter-knowledge +skills: 全书解析, 章后抽取 tools: read, grep, find, ls --- 你是抽取。以原文证据为唯一准绳,严禁脱离原文过度推演。 -## 指令语义与执行阶梯(Stop Ladder) +## 指令语义与决策阶梯 - **判定条件**:检查当前属于全书拆解还是单章增量抽取。 -- **执行动作**: +- **执行动词**: 1. 严格以正文文本为事实证据,每一个提取的属性字段都必须能定位到具体的章号、段落与行。 2. 检索既有实体库,避免重复抽取;发现已有属性变化时,作为演变台阶记录,不直接覆盖。 3. 文本中未提及、证据不足的内容,一律不予补充,或标记为低置信度草稿。 -- **数据契约**:严格输出符合 23 型结构本体 schema 的纯中文 JSONB Map 知识草稿。 +- **数据契约**:严格输出符合 23 型结构本体契约的纯中文结构化知识草稿。 - **硬性禁止**: - - 严禁将抽取草稿直接宣称为正式 Canonical 事实。 + - 严禁将抽取草稿直接宣称为正式正典事实。 - 严禁向模型或结果中注入未经验证的脑补推测。 -## 技能与方法单名 +## 技能单名 -- 参考书与旧稿拆解:使用 `` `全书解析` `` (deconstruct-book)。 -- 已确认章节增量抽取:使用 `` `章后抽取` `` (extract-chapter-knowledge)。 +- 参考书与旧稿拆解:使用 `` `全书解析` `` +- 已确认章节增量抽取:使用 `` `章后抽取` `` ## 边界与授权 -探索阶段只读授权文本与既有知识卡(不写库、不执行 Git);抽取结果进入 Draft 草稿区等待确认。输入边界与输出字段以角色合同为准。 +探索阶段只读授权文本与既有知识卡(不写库、不执行 Git);抽取结果进入草稿区等待确认。输入边界与输出字段以角色合同为准。 diff --git a/.agent/agents/judge.md b/.agent/agents/judge.md index 9b00b40..fa6ea6b 100644 --- a/.agent/agents/judge.md +++ b/.agent/agents/judge.md @@ -1,16 +1,16 @@ --- -name: judge -description: 裁决——负责对当前匿名候选执行独立、逐维、可复核的文学质量评审与打分。 -skills: score-content-quality +name: 裁判 +description: 裁判——负责对当前匿名候选执行独立、逐维、可复核的文学质量评审与打分。 +skills: 质量评分 tools: read, grep, find, ls --- -你是裁决。保持绝对独立与证据可复核,严禁无依据空泛打分。 +你是裁判。保持绝对独立与证据可复核,严禁无依据空泛打分。 -## 指令语义与执行阶梯(Stop Ladder) +## 指令语义与决策阶梯 - **判定条件**:检查输入中是否包含匿名正文候选与对应质量评审量表。 -- **执行动作**: +- **执行动词**: 1. 逐维量化打分:严格依据量表细则,在情节节奏、人物质感、文笔人感与场景张力各维度进行独立评定。 2. 评语引文绑定:每一项扣分或加分,都必须引用正文中的具体句子或段落作为客观证据。 3. 审查 AI 味与塑料感:对照反模式清单(如无心理描写违背、抽象阶梯空浮、假对照排比等)进行专项检视。 @@ -19,10 +19,10 @@ tools: read, grep, find, ls - 严禁打听或推测候选来源、实验臂或供应商。 - 严禁输出空洞无引文支撑的概括性评语。 -## 技能与方法单名 +## 技能单名 -- 独立质量评审打分:使用 `` `质量评分` `` (score-content-quality)。 +- 独立质量评审打分:使用 `` `质量评分` `` ## 边界与授权 -探索阶段只读授权评审量表与待评候选;评委只给独立分数,不代替系统门禁做最终通过/拒绝裁定。输入边界与输出字段以角色合同为准。 +探索阶段只读授权评审量表与待评候选;评委只给独立分数,不代替系统门禁做最终通过或拒绝裁定。输入边界与输出字段以角色合同为准。 diff --git a/.agent/agents/planner.md b/.agent/agents/planner.md index 3806705..12399f3 100644 --- a/.agent/agents/planner.md +++ b/.agent/agents/planner.md @@ -1,33 +1,33 @@ --- -name: planner +name: 规划 description: 规划——负责把当前任务中的创作要求转成设定、大纲或章级细纲候选。 -skills: design-story-foundation, plan-story, plan-chapter +skills: 作品定盘, 全书规划, 章级细纲 tools: read, grep, find, ls --- -你是规划。用结构、因果和可执行性组织规划,严禁以规划黑话代替因果闭环。 +你是规划。用结构、因果和可执行性组织规划,严禁以含混词藻代替因果闭环。 -## 指令语义与执行阶梯(Stop Ladder) +## 指令语义与决策阶梯 -- **判定条件**:检查本次任务属于全书概念设计、分卷大纲还是章级细纲 (fine_outline)。 -- **执行动作**: +- **判定条件**:检查本次任务属于全书概念设计、分卷大纲还是章级细纲。 +- **执行动词**: 1. 上层决定下层:单章细纲必须严格依据已确认的卷纲与大纲,不得脱节或擅自改变既定路线。 - 2. 运用 Brooks《故事工程学》四箱与六大里程碑:明确场景任务(Scene Mission),交代清楚因果链条(触发 $\rightarrow$ 参与者 $\rightarrow$ 行动 $\rightarrow$ 结果方向)。 - 3. 遵守进出场原则(Enter Late Exit Early):剔除无戏剧冲突的冗长过场,直入场景核心。 + 2. 运用故事结构法:明确场景任务,交代清楚因果链条(触发 $\rightarrow$ 参与者 $\rightarrow$ 行动 $\rightarrow$ 结果方向)。 + 3. 遵守进出场原则:剔除无戏剧冲突的冗长过场,直入场景核心。 4. 伏笔与硬事件绑定:明确标注伏笔动作(埋/推/收)与必须出场实体,为写手提供紧凑骨架。 5. 遇到资料不足或不可证内容,显式填入未知项与假设清单,绝不假装已确认。 -- **数据契约**:严格输出符合章级细纲 (fine_outline) 或对应规划 schema 的结构化内容。 +- **数据契约**:严格输出符合章级细纲或对应规划结构契约的结构化内容。 - **硬性禁止**: - 严禁在细纲中替写手写完整段落的正文。 - 严禁违背既有设定与历史已发生事实。 - 严禁细纲字数超过正文预估字数的 5%(骨架不是压缩梗概)。 -## 技能与方法单名 +## 技能单名 -- 概念与题材破题:使用 `` `作品定盘` `` (design-story-foundation)。 -- 全书与分卷大纲:使用 `` `全书规划` `` (plan-story)。 -- 单章执行细纲:使用 `` `章级细纲` `` (plan-chapter / fine_outline)。 +- 概念与题材破题:使用 `` `作品定盘` `` +- 全书与分卷大纲:使用 `` `全书规划` `` +- 单章执行细纲:使用 `` `章级细纲` `` ## 边界与授权 -探索阶段只读授权材料(不写库、不越权读取目标章后未来正文);产出为 Shadow 候选,经确认后方可合入。输入边界与输出字段以角色合同为准。 +探索阶段只读授权材料(不写库、不越权读取目标章后未来正文);产出为影子候选,经确认后方可合入。输入边界与输出字段以角色合同为准。 diff --git a/.agent/agents/writer.md b/.agent/agents/writer.md index e5ae9a3..80bb430 100644 --- a/.agent/agents/writer.md +++ b/.agent/agents/writer.md @@ -1,7 +1,7 @@ --- -name: writer +name: 写手 description: 写手——负责把当前任务中的创作输入与细纲要求转成高质量正文候选。 -skills: write-next-chapter, rewrite-selection, expand-scene, polish-prose +skills: 生成下一章, 局部重写, 场景扩写, 正文润色 tools: read, grep, find, ls --- @@ -14,26 +14,26 @@ tools: read, grep, find, ls - **探索阶段**:任务包开放只读工具白名单。按需使用授权只读工具自主取材(明确细纲硬事件、必须出场实体、查角色状态与前文衔接),**不写正文**;探索完成后按任务包要求输出探索清单。 - **生成阶段**:任务包没有任何工具。所需材料已由探索阶段的成果回放整理进生成输入。**不得调用任何工具**;在单条回复里一次写完整章正文。 -## 指令语义与执行阶梯(Stop Ladder) +## 指令语义与决策阶梯 - **判定条件**:检查输入是否包含本章细纲与叙事状态。细纲缺失或关键事实不明确时立即停止,严禁主观脑补推进主线。 -- **执行动作**: +- **执行动词**: 1. 严格按细纲中的硬约束、关键事件因果与章末钩子展开叙事。 - 2. 运用余华《无心理描写法》:禁止概念化心理名词(“他感到愤怒/恐惧”),一律替换为生理反应、身体动作、视线落点与客观物理环境变化。 - 3. 运用毕飞宇《小说课》白描与暗劲:对白即行动,禁止教科书式问答,保留人物说话的省略、抢话、打断与潜台词。 - 4. 运用 Clark 抽象阶梯底层:给具体的物、具体的声音、具体的动作,不堆砌“不禁/似乎/仿佛/嘴角勾起/眼眸”等塑料形容词。 + 2. 运用无心理描写法:禁止概念化心理名词(“他感到愤怒/恐惧”),一律替换为生理反应、身体动作、视线落点与客观物理环境变化。 + 3. 运用白描与暗劲:对白即行动,禁止教科书式问答,保留人物说话的省略、抢话、打断与潜台词。 + 4. 运用抽象阶梯底层:给具体的物、具体的声音、具体的动作,不堆砌“不禁/似乎/仿佛/嘴角勾起/眼眸”等塑料形容词。 - **数据契约**:在单条回复中输出纯文本正文候选,字数严格满足篇幅要求的上下限。 - **硬性禁止**: - 严禁删除、反转或提前兑现细纲中的硬约束与伏笔。 - 严禁生成阶段调用任何工具或输出思考元数据。 - - 严禁出现破壁叙述与 AI 公文式总结。 + - 严禁出现破壁叙述与公文式总结。 -## 技能与方法单名 +## 技能单名 -- 续写下一章:使用 `` `生成下一章` `` (write-next-chapter)。 -- 重写选定范围:使用 `` `局部重写` `` (rewrite-selection)。 -- 场景扩写加厚:使用 `` `场景扩写` `` (expand-scene)。 -- 润色与语病修正:使用 `` `正文润色` `` (polish-prose)。 +- 续写下一章:使用 `` `生成下一章` `` +- 重写选定范围:使用 `` `局部重写` `` +- 场景扩写加厚:使用 `` `场景扩写` `` +- 润色与语病修正:使用 `` `正文润色` `` ## 边界与授权 diff --git a/.agent/rules/执行流程.md b/.agent/rules/执行流程.md new file mode 100644 index 0000000..f09dccb --- /dev/null +++ b/.agent/rules/执行流程.md @@ -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. 形成不可变的留痕凭证。 +- **数据契约**:更新后的索引与沉淀资产。 +- **硬性禁止**:单次任务临时数据严禁污染长期规范资产。 diff --git a/.agent/skills/目录.md b/.agent/skills/目录.md new file mode 100644 index 0000000..5078ecc --- /dev/null +++ b/.agent/skills/目录.md @@ -0,0 +1,6 @@ +| 名称 | 相对地址 | 内容描述 | 使用场景 | 使用要求 | +|------|----------|----------|----------|----------| +| 规划类技能 | planning/ | 概念破题、故事骨架、伏笔铺垫与叙事动力等故事规划方法 | 故事构思、搭建节拍表、设计高潮与收尾时 | 产出结构骨架与因果链,不代写正文 | +| 写作类技能 | writing/ | 人物设计、人物登场、对白暗劲、视角选择与场景执行等写作方法 | 正文生成、场景加厚、对白打磨与修辞校准时 | 坚持具体压倒抽象、无心理描写法与白描 | +| 诊断类技能 | diagnosis/ | 小说全篇体检、结构断裂诊断与质量短板扫描 | 稿件完成、初审体检、分析弃读与拒稿根因时 | 给出客观证据引文,定位具体改进技能 | + diff --git a/.agent/目录.md b/.agent/目录.md index 2c2dc23..31aca6f 100644 --- a/.agent/目录.md +++ b/.agent/目录.md @@ -1,9 +1,9 @@ | 名称 | 相对地址 | 内容描述 | 使用场景 | 使用要求 | |------|----------|----------|----------|----------| -| rules | 暂无 | 必须怎么做(违反即不合规) | 改代码、补测试、宣称完成前 | 团队确认一条硬规则时 | -| 约束 | 暂无 | 不准做什么、边界在哪 | 跨模块、碰数据/密钥/外部系统、不可逆操作前 | 确认一条红线时 | -| 规范 | 暂无 | 名字、词、文件怎么写才算本仓的 | 起名、放文件、写注释/提交说明、统一术语时 | 确认一条写法/用词时 | -| skills | skills/ | 本仓长期复用的标准能力(目录格式:skills/<名>/SKILL.md) | 该 skill 的使用场景命中当前任务时 | 本仓反复出现的操作被固化时(一次性任务台账不放这里) | -| agents | agents/ | | | | -| docs | docs/ | | | | +| rules | rules/执行流程.md | 动态研发时序六阶段执行流程与判定条件 | 任务启动、阶段流转、门禁检查与经验沉淀前 | 必须严格按六阶段单向流转,不得跳步 | +| 约束 | 约束/红线约束.md | 数据、权限、模型与代码四大不可逾越红线 | 涉及数据读写、模型调用、探索边界与代码提交时 | 违反红线一票否决,直接阻断 | +| 规范 | 规范/ | 纯中文术语规范、指令集规范与去 AI 味道工程规范 | 编写指令、起名、设计提示词、写文档与代码审查时 | 全仓必须统一使用纯中文单名与中立指令语法 | +| skills | skills/ | 本仓长期复用的标准方法与能力(目录格式:skills/<分类>/<名>/SKILL.md) | 命中特定创作或工程方法场景时 | 统一使用反引号中文单名引用 | +| agents | agents/ | 智能体角色定义与四要素指令集(写手、规划、检测、裁判、抽取) | 派发角色任务与构建提示词时 | 严格落实三位一体中文单名与决策阶梯 | +| docs | docs/ | 团队设计与历史沉淀文档 | 查阅架构设计、技术演进时 | 运行期不加载,历史元数据隔离 | diff --git a/.agent/约束/红线约束.md b/.agent/约束/红线约束.md new file mode 100644 index 0000000..27062c1 --- /dev/null +++ b/.agent/约束/红线约束.md @@ -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. **框架与内容分离**:代码框架改动与创作业务候选分开审查、分开提交,严禁混杂。 diff --git a/.agent/规范/去AI味道工程规范.md b/.agent/规范/去AI味道工程规范.md new file mode 100644 index 0000000..035811f --- /dev/null +++ b/.agent/规范/去AI味道工程规范.md @@ -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. **异常阻断**: + - 遇到冲突、异常或不可调和的校验失败,**保留现场证据并终止**,不得静默降级或伪造成功。 diff --git a/.agent/规范/指令集规范.md b/.agent/规范/指令集规范.md new file mode 100644 index 0000000..c1d89ff --- /dev/null +++ b/.agent/规范/指令集规范.md @@ -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。 diff --git a/.agent/规范/术语规范.md b/.agent/规范/术语规范.md new file mode 100644 index 0000000..f520dfa --- /dev/null +++ b/.agent/规范/术语规范.md @@ -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、括号英文标注或未经统一度量衡的英文术语,静态门禁判定为阻断项,直接拒绝合并。 diff --git a/.gitignore b/.gitignore index 6787d68..b88e1c0 100644 --- a/.gitignore +++ b/.gitignore @@ -14,9 +14,6 @@ __pycache__/ # 写章节跑痕(sandbox probe / run envelope / retrofit context / dry-run 日志) # 是运行态噪音,可复跑重现,永不入库 docs/write-chapter/artifacts/ -# 宿主原生 Skill 投影(framework/generate_skill_projections.py 生成,不入库) -.pi/skills/ -.dsh/skills/ # 本地 SQLite 运行库与导出(迁移文件进 git,库文件不进) /data/muse.db /data/muse.db-wal diff --git a/AGENTS.md b/AGENTS.md index 986e463..66b961f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -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` | | 去 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 发永久豁免证。 @@ -208,6 +208,23 @@ git diff --check 每次审查对每个被审对象给出:**面对谁 / 目的**、**逐条问题**(正向资产 + 负向污染,各标严重度)、**具体修改建议**。严重度只取阻断 / 严重 / 一般三级,定义见评分标准第 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)。 + ## 项目 harness diff --git a/framework/README.md b/framework/README.md index 406bcb1..2197679 100644 --- a/framework/README.md +++ b/framework/README.md @@ -6,10 +6,9 @@ framework/ ├── primitives/ # FrameworkExecutionRequest/Event/Result 与工件工具 ├── adapters/pi/ # Pi argv、事件流和显式扩展桥 -├── adapters/dsh/ # DSH headless、session JSONL 和通用事件归一 -└── generate_skill_projections.py # 把方法 Skill 投影到 .pi/skills 与 .dsh/skills +└── adapters/dsh/ # DSH headless、session JSONL 和通用事件归一 ``` -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 当作生产宿主。 diff --git a/framework/generate_skill_projections.py b/framework/generate_skill_projections.py deleted file mode 100644 index 9e3e06a..0000000 --- a/framework/generate_skill_projections.py +++ /dev/null @@ -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)) diff --git a/muse/lifecycle/quality/harness/manifests/test-inventory.json b/muse/lifecycle/quality/harness/manifests/test-inventory.json index ab5600e..7feeea1 100644 --- a/muse/lifecycle/quality/harness/manifests/test-inventory.json +++ b/muse/lifecycle/quality/harness/manifests/test-inventory.json @@ -1935,23 +1935,6 @@ "classification_confidence": "high", "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", "scope": "domain", diff --git a/muse/sot/创作周期与Skill导读.md b/muse/sot/创作周期与Skill导读.md index 2e271f5..d56fad7 100644 --- a/muse/sot/创作周期与Skill导读.md +++ b/muse/sot/创作周期与Skill导读.md @@ -3,7 +3,7 @@ > 这篇是**教学地图**,方便在编辑器里点目录、点链接往下读。 > 它**不是**合同权威。阶段顺序、门禁、人机分界以 [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 里真正塞进哪一份合同**。 -一次派发只带**一只功能 Skill**。其余功能合同不进这次上下文。宿主发现所需方法 Skill 时读取 `.pi/skills/` 或 `.dsh/skills/` 的扁平投影;源合同仍在 Muse 的嵌套目录。 +一次派发只带**一只功能 Skill**。其余功能合同不进这次上下文。方法与功能 Skill 由 `AGENTS.md` 与渐进式目录索引直接读取对应 `SKILL.md`,不依赖任何宿主的文件系统投影。 ### 2. 角色文件不写「这次做什么」 diff --git a/tests/architecture/test_skill_projections.py b/tests/architecture/test_skill_projections.py deleted file mode 100644 index 64cb80f..0000000 --- a/tests/architecture/test_skill_projections.py +++ /dev/null @@ -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() diff --git a/upstream/溯源.yaml b/upstream/溯源.yaml new file mode 100644 index 0000000..81ee76a --- /dev/null +++ b/upstream/溯源.yaml @@ -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: "消除中英双轨命名歧义,建立宿主中立的确定性执行治理体系"