From muse-derivative
角色人格构建器 — Phase 2 完成后,将结构化人物设计转化为标准化的运行时角色 Skill 包。当 Phase 2 人物系统设计完成、需要为角色生成独立的人格 Skill 时使用。只构建,不执行角色扮演。
How this skill is triggered — by the user, by Claude, or both
Slash command
/muse-derivative:character-persona build | rebuild <role-slug>build | rebuild <role-slug>This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
> 本 Skill 是**元技能/构建器**:把 Phase 2 的结构化人物数据转化为可被角色 Agent 加载的标准 Skill 包。
本 Skill 是元技能/构建器:把 Phase 2 的结构化人物数据转化为可被角色 Agent 加载的标准 Skill 包。 它不执行角色扮演、不触发排练。
| # | 约束 | 违反后果 |
|---|---|---|
| 1 | 使用 role_slug 作为 skill 目录名(小写字母 + 连字符,如 li-an、xiao-long-nv),不拼接故事前缀。隔离由工作目录承担(pipeline/story-character-skills/,每个 query 独立目录) | 角色 Skill 无法被当前运行时发现,或与同名角色(不同来源)冲突 |
| 2 | pipeline/characters/{角色名}.md(adapter)是 SKILL.md 的只读派生物,禁止手改 | adapter 与 SKILL.md 出现双源漂移,审稿和校验以哪个为准不明确 |
| 3 | SKILL.md frontmatter 的 version 字段应与 build-meta.yaml 同步维护 | adapter 物理校验由 adapter_sha256 锁定 |
| 4 | rebuild 绝不覆盖 state.md(state.md 包含角色 agent 的运行时记忆) | 角色失忆,破坏跨场景的主观状态连续性 |
| 5 | 资产写入路径固定:pipeline/story-character-skills/.claude/skills/{role-slug}/ + pipeline/characters/{角色名}.md | 与 pipeline 全局目录契约(init_derivative_run.py 建的 work_dir 骨架)不一致,下游消费方读取失败 |
pipeline/phase2_character.yaml 已生成pipeline/phase2_character.yaml — Phase 2 产出的结构化人物数据。
需要从中提取的关键字段:
protagonist:desire_system, character_arc, characterization_vs_truth, voice_traits, voice_boundaries, backstory, daily_life, empathy_mechanismdeuteragonist(若存在):结构同 protagonist,按同一路径提取 desire_system, character_arc, characterization_vs_truth, voice_traits, voice_boundaries, backstory, daily_life, empathy_mechanismantagonist:name, motivation, desire, voice_traits, voice_boundariessupporting_cast[]:name, function, relationship, voice_traits_summarycontrast_axes:角色间的极化关系relationships:权力动态、关键张力| 文件 | 读取条件 | 提取内容 |
|---|---|---|
pipeline/phase0_conception.yaml | 角色声音需要与作品整体风格对齐时 | style_directives(风格指令)、core_value(核心价值) |
pipeline/phase1_world.yaml | 角色身份与处境需要世界规则支撑时 | daily_life(日常生活)、world_rules(世界规则)、creative_constraints(创作约束) |
读取原则:不整体吞入,只提取与当前角色直接相关的片段。
pipeline/phase2_character.yamlrole_slug,并推导 story_slug(story_slug 只作元数据与报告标题,不参与 skill 命名;role_slug 作为 skill 目录名与 build-meta 字段)
/character-persona build 补充story_slug(按优先级):
{数据集名}_{index}(如 writing-bench_184)phase0_conception.yaml 的 title 推导(如 desert-outpost)role_slug(小写字母 + 连字符,从中文名音译,如 li-an、xiao-long-nv、chen-mo),既是 skill 目录名也是 build-meta 中的字段对每个角色执行以下操作。参考 ${SKILL_DIR}/references/skill-template.md 中的模板;填写启发见 ${SKILL_DIR}/references/runtime-writing-guide.md。
从 Phase 2 数据中提炼角色的人格定义,按 skill-template.md 的结构落盘。
生成时遵循以下创作启发(质量倾向,不是硬约束;理论依据见 ${SKILL_DIR}/references/mckee-voice-principles.md):
<!-- 来源:phase2_X → 字段 --> HTML 注释必须原样保留在最终产出 SKILL.md 中,不得删除或转换为其他形式——这是下游 evidence-map / reviewer 追溯每节内容到 Phase 2 依据的唯一锚点state.md 是角色的"记忆和感受",在创作过程中由角色 Agent 通过 state_delta 更新(orchestrator 统一落盘)。
初始化内容:
character_arc.mode 解释——transformative/degenerative 下是"变化前的初始情绪";revelatory 下是"稳定核的开场情绪色,不是变化前的基线";static 下是"稳定核本身的情绪色,start 与 end 同值"。不要把 static/revelatory 角色的当前情绪解读为"缓慢转变的起点")如果 Phase 2 的 backstory 数组包含 3 个以上事件,将其整理为独立的幕后故事参考文件。角色 Agent 在需要回忆过去时可按需读取。
build-meta.yaml 是该角色 Skill 包的 provenance 证据——下游 verify_phase2_assets 凭此校验"产物来自本 builder"。
generated_by: character-persona # 固定字符串,标记本 builder 产出
character_slug: {role-slug} # = skill 目录名 = SKILL.md frontmatter name
character_display_name: {中文角色名}
input_sources: # 实际读取的输入文件列表(用于追溯)
- pipeline/phase2_character.yaml
# - pipeline/phase0_conception.yaml (按需)
# - pipeline/phase1_world.yaml (按需)
adapter_path: pipeline/characters/{中文角色名}.md # adapter 文件路径
adapter_sha256: {adapter 文件实际内容 sha256 前 16 位} # 防 adapter 手改的物理校验
字段语义关键点:
generated_by: character-persona 是 verify 区分"本 builder 产出"vs"其他来源"的唯一标识,禁止删除或改写。adapter_sha256 锁住 adapter 文件不被手改。章节白名单的权威来源是
references/skill-template.md,不在本 SKILL.md 或 verify 脚本中硬编码章节名——避免与模板漂移、避免误杀历史合法章节。
具体规则:
references/skill-template.md 中嵌入的角色 SKILL.md 模板里,每个顶级 ## 章节 紧跟一行 HTML 注释:
<!-- required --> → 必备章节(生成的角色 SKILL.md 缺此章节即 fail)<!-- optional --> → 允许追加的章节(特殊角色可酌情裁剪)## 章节集合必须满足:
不在本 SKILL.md 或下游 reviewer 中规定「
<!-- 来源:出现 ≥N 次」「确定性标记 ≥N 次」等人肉计数门槛——这种门槛会诱导 builder 凑数。
落盘的角色 SKILL.md 需满足以下描述性信号(reviewer 据此做 HOW 判定,无固定数量阈值):
<!-- 来源:phase2_X → 字段 --> HTML 注释应覆盖每一节的核心断言,让 reviewer 能反查 Phase 2 依据;不规定具体数量——一条覆盖一节的核心断言、还是按子项分散覆盖,由 builder 按节内容密度判断。reviewer 校验落点:读完该节是否能预测出角色一句具体台词或一类具体反应?能 = 通过;只看到形容词标签 = fail。
为每个角色在 pipeline/characters/{中文角色名}.md 生成旧格式 adapter 文件。
adapter 是从 SKILL.md 单向生成的只读文件,格式沿用现有消费方期望的结构:
# {角色名}
## 身份与处境
{从 SKILL.md 的"身份与处境"章节提取}
## 欲望
{从 SKILL.md 的"核心欲望"章节提取}
## 声音
{从 SKILL.md 的"声音框架"章节提取}
## 边界
{从 SKILL.md 的"边界"章节提取}
## 弧光
{从 SKILL.md 的"**人物轨迹**"章节提取——包含 `mode / start_state / end_state / 轨迹机制` 四字段。adapter 标题保留 `## 弧光` 作为 compatibility alias(下游 Phase 6 / design-validation / 审稿 B 组消费方按此标题定位内容),但内容语义由 SKILL 模板"人物轨迹"段提供的 mode-aware 字段决定——static/revelatory 角色填入的内容不是"变化轨迹"}
在 pipeline/story-character-skills/build-report.md 生成 build-report.md,记录本次应构建集判定与每个角色的决策。本文件同时承担 name → slug 映射桥梁——下游 verify_phase2_assets 凭它把 phase2_character.yaml 中的 name(真实 schema 主键)反查到 builder 产出的 slug,不要求 phase2_character.yaml 自带 slug 字段。
真实 phase2_character.yaml schema:
protagonist.name/deuteragonist.name/antagonist.name/supporting_cast[].name—— 全部以name为主键,没有slug字段。本 builder 在 build-report 中显式建立 name → slug 映射。
| 阶段 | 必建 | 推迟(Phase 5 补建) |
|---|---|---|
| Phase 2 | protagonist.name + deuteragonist.name(若该键存在)+ antagonist.name + 满足上文判据的 supporting_cast[].name(独立对白场景 / 关键互动 / 声音区分) | supporting_cast[].name 中"背景人物 / 转述人物 / 群体敌人"等不满足判据的 |
| Phase 5+ | phase5_scenes.yaml.participants 中"直接登场且有对白或关键行动"但 Phase 2 未建的 name | — |
Phase 2 阶段调用本 skill 时,phase2 列出的每个 name 必须在 build-report 已构建表或未构建表里出现一次——任一 name 缺判定 = builder 漏过判断 = phase2 hard gate fail。
# Build Report — {story_slug}
构建时间:{ISO 时间}
来源:pipeline/phase2_character.yaml
本次阶段:{phase2 | phase5_supplement}
## 已构建
| name | slug | 类型 | 深度 | 4 产物落盘 |
|------|------|------|------|------------|
| {phase2 中的 name} | {role-slug} | protagonist | 完整 | ✅ |
| ... | ... | ... | ... | ... |
## 未构建
| name | 类型 | skip_reason |
|------|------|-------------|
| {phase2 中的 name} | supporting_cast | {为什么本阶段不需要独立 Skill;引用本 SKILL.md §"是否构建独立 Skill 的判据" 段判据} |
## 补充输入
{是否读取了 phase0/phase1,读取了哪些字段,为什么}
字段约束:
name 必须在 phase2_character.yaml 中存在(不允许幻觉构建未授权角色)skip_reason(缺失 = phase2 hard gate fail)4 产物落盘 列指向下文 §Step 4.1,4 件产物全齐才标 ✅每个落入"已构建"表的角色,必须产出以下 4 个文件——builder 自查路径:
| # | 产物 | 路径 | 生产步骤 |
|---|---|---|---|
| 1 | 角色 SKILL.md | pipeline/story-character-skills/.claude/skills/{slug}/SKILL.md | Step 2a |
| 2 | state.md | pipeline/story-character-skills/.claude/skills/{slug}/state.md | Step 2b |
| 3 | build-meta.yaml | pipeline/story-character-skills/.claude/skills/{slug}/build-meta.yaml | Step 2d |
| 4 | adapter | pipeline/characters/{display_name}.md | Step 3 |
Phase 2 hard gate:4 产物 + 应构建集声明完整后,由 verify_phase2_assets.py 校验。
详细字段断言与错误码以脚本为权威:MUSE-writing/scripts/verify_phase2_assets.py。
本 SKILL.md 不复述校验维度;脚本调用与退出码处理见 phase2-character/SKILL.md §7。
接口约束自检:对照本文件顶部"接口约束"6 条逐一核验,外加 frontmatter 完整性(包含 name、description、version、allowed-tools)。必须全部通过,否则构建失败。
builder 写作动作自检(脚本兜底之前 builder 自身要做的事):
<!-- 来源:phase2_X → 字段 --> 注解是否覆盖每节核心断言(脚本不校验注解内容,靠 builder 自觉)字段断言、4 产物完整性、sha 一致性等结构校验以 verify_phase2_assets.py 为权威,本 SKILL.md 不复述。
创作质量自检(描述性 HOW 信号,reviewer 判定,不计数):
<!-- 来源:phase2_X → 字段 --> 注解是否覆盖每节的核心断言?(不规定具体数量;按节内容密度判断)向 orchestrator 汇报构建结果:
✅ 角色 Skill 包构建完成
已构建:
- {角色名} → pipeline/story-character-skills/.claude/skills/{role-slug}/
adapter → pipeline/characters/{角色名}.md
- ...
决策详情见 pipeline/story-character-skills/build-report.md
提醒:确保当前运行时已挂载或可发现 `pipeline/story-character-skills`;若运行时需要显式加入项目目录,按其目录挂载机制加入该路径。
pipeline/
├── story-character-skills/
│ ├── .claude/skills/ ← 当前兼容挂载点
│ │ ├── {role-a}/ # 直接以 role-slug 命名(如 li-an)
│ │ │ ├── SKILL.md # 静态人格定义
│ │ │ ├── state.md # 初始主观状态
│ │ │ ├── references/
│ │ │ │ └── backstory.md # 幕后故事(可选)
│ │ │ └── build-meta.yaml # 构建元数据
│ │ └── {role-b}/
│ │ └── ...
│ └── build-report.md ← 构建决策记录
│
└── characters/ ← 兼容 adapter
├── {角色名A}.md
└── {角色名B}.md
本 Skill 只负责:
本 Skill 不负责:
当 Phase 2 数据更新(如设计修订后调整了 voice_traits)或需要重新生成某个角色的 Skill 时:
/character-persona rebuild li-an
这会:
state.md 不会被覆盖(它包含运行时状态)。
也可用于 Phase 5 后为新确认的重要配角补充构建:
/character-persona build
此时会重新扫描 phase2_character.yaml,为尚未构建 Skill 的配角生成新的 Skill 包。
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub roadtoagi/muse-derivative --plugin muse-derivative