{"id":"c9bff8d3-2158-4209-8900-f0c0a4c757c8","entityType":"agent","slug":"clawhub-wkbin-zaomeng-skill","name":"Zaomeng Skill","canonicalUrl":"https://www.xpersona.co/agent/clawhub-wkbin-zaomeng-skill","canonicalPath":"/agent/clawhub-wkbin-zaomeng-skill","generatedAt":"2026-10-10T21:44:15.092Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T17:21:47.095Z","emptyReason":null},"description":"用于中文小说人物蒸馏、关系抽取、关系图谱导出与角色对话准备；当宿主需要基于小说内容生成结构化人物档案、关系结果或多角色对话上下文时使用。","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.3K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s1769aak6jyk1j2cjcezwe53p183jvez:zaomeng-skill","sourceUrl":"https://clawhub.ai/wkbin/zaomeng-skill","homepage":"https://clawhub.ai/wkbin/skills/zaomeng-skill","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/wkbin/zaomeng-skill","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/wkbin/skills/zaomeng-skill","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Zaomeng Skill technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T17:21:47.095Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T17:21:47.095Z","emptyReason":null},"stars":null,"forks":null,"downloads":1321,"packageName":null,"latestVersion":"4.1.8","tractionLabel":"1.3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T17:21:47.095Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T17:21:47.095Z","lastCrawledAt":"2026-10-10T17:21:47.095Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T17:21:47.095Z","lastVerifiedAt":null,"highlights":[{"version":"4.1.8","createdAt":"2026-05-17T05:43:19.296Z","changelog":"zaomeng-skill v4.1.8 - 新增多组对话辅助脚本，包括角色卡管理、人物字段补全、对话建议生成、场景推荐生成（tools/manage_self_card.py、tools/build_persona_autofill_payload.py、tools/build_dialogue_suggestion_payload.py、tools/build_scene_recommendation_payload.py） - 补充 examples/scene_recommendation_context.example.json 示例，详解场景推荐 context 输入格式 - SKILL.md 增补对话流程 helper 能力及调用方式，并详列各 helper 工具输入输出说明 - 明确支持宿主在角色扮演/观测阶段对各辅助能力的直接调用方式 - License、兼容性等元信息完善","fileCount":50,"zipByteSize":1032426},{"version":"4.1.5","createdAt":"2026-05-08T07:46:56.233Z","changelog":"Version 4.1.5 introduces native support for chunked/batched processing of long texts in distill and relation extraction workflows. - 新增 distill 和 relation 能力对长篇小说支持自动分批（chunked）payload 拆分及合并 - `run_manifest.json` 结构扩展，新增分批进度（chunking）记录和宿主串联建议（host_plan） - 进度阶段增加 chunk 流程相关阶段（chunk_started, chunk_completed, merge_started, merge_completed） - 所有流程均兼容原单次调用和自动分批两种模式，自动提示 chunk 信息与合并步骤 - CLI 命令及进度更新支持按 chunk 粒度跟踪并记录宿主处理进度","fileCount":41,"zipByteSize":999235},{"version":"4.1.4","createdAt":"2026-04-30T11:24:15.386Z","changelog":"**Summary:** This version introduces major enhancements to modularize workflow management, add structured status tracking, and enable incremental character distillation. - Added structured workflow management tools: `init_host_run.py`, `update_run_progress.py`, and `verify_host_workflow.py` - `run_manifest.json` introduced as the central file to track execution status, characters, progress, and artifacts - Incremental distillation now supported, with automatic profile merging and update context tracking - Each core task (distill, materialize, export graph, verify workflow) defined as a standard capability with explicit JSON status outputs and sidecar files - Clear, standardized progress stages and ability for the host to broadcast progress at all phases - Enhanced documentation: new capability, workflow, and usage examples for host integration - Added vendor JS asset (`mermaid-11.14.0.min.js`) to support graph rendering","fileCount":41,"zipByteSize":987110},{"version":"4.1.3","createdAt":"2026-04-29T11:49:34.766Z","changelog":"zaomeng-skill v4.1.3 - 新增 tools/materialize_persona_bundle.py 脚本，实现人物档案自动物化 - 新增 tools/_skill_support/persona_bundle.py 支持人物包处理 - SKILL.md 文档全面更新，详述产物、流程与宿主执行规范 - 工具链流程新增人物档案后处理阶段 - 明确区分 skill 与宿主职责，总结关键 helper 命令","fileCount":29,"zipByteSize":60982},{"version":"4.1.1","createdAt":"2026-04-29T08:17:33.757Z","changelog":"- 新增人物关系图谱导出工具（tools/export_relation_graph.py）。 - 增加 Mermaid 与 HTML 格式关系图谱的生成流程说明。 - 新增蒸馏及图谱生成进度播报规范，要求阶段性反馈，不输出冗余内部过程。 - 扩展 helper 脚本和命令说明，涵盖关系图谱导出。 - 明确任务完成后应给出可操作提示，如查看档案、关系图谱或进入对话模式。","fileCount":27,"zipByteSize":48010},{"version":"4.1.0","createdAt":"2026-04-29T07:21:51.954Z","changelog":"zaomeng-skill 4.1.0 - No code or asset changes detected in this release. - Documentation reviewed; content unchanged.","fileCount":21,"zipByteSize":32399},{"version":"4.0.1","createdAt":"2026-04-29T03:28:04.921Z","changelog":"zaomeng-skill 4.0.1 - No file changes detected in this version. - Documentation and process descriptions remain unchanged. - No new features, fixes, or updates included.","fileCount":21,"zipByteSize":32399},{"version":"4.0.0","createdAt":"2026-04-29T03:15:37.445Z","changelog":"**Major refactor: Migrated zaomeng-skill to a lighter, LLM-host-first workflow with greatly simplified assets and utilities.** - Reduced codebase: Removed nearly all runtime code and internal rule engines; only essential tools remain. - Now focuses on preparing novel excerpts and assembling prompt payloads; all generation is delegated to the host LLM. - Added two utility scripts: `prepare_novel_excerpt.py` and `build_prompt_payload.py` under the `tools` directory. - Documentation and instructions streamlined to reflect LLM-first architecture and clarify agent invocation. - No longer uses internal rules, templates, or local runtime modules—prompt organization and data prep only.","fileCount":21,"zipByteSize":32399}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1769aak6jyk1j2cjcezwe53p183jvez:zaomeng-skill","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s1769aak6jyk1j2cjcezwe53p183jvez:zaomeng-skill` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/wkbin/zaomeng-skill before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wkbin-zaomeng-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wkbin-zaomeng-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wkbin-zaomeng-skill/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-wkbin-zaomeng-skill/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-wkbin-zaomeng-skill/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-wkbin-zaomeng-skill/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T21:44:15.089Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wkbin-zaomeng-skill/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wkbin-zaomeng-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wkbin-zaomeng-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-wkbin-zaomeng-skill/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T17:21:47.095Z","emptyReason":null},"readme":"Skill: Zaomeng Skill\n\nOwner: wkbin\n\nSummary: 用于中文小说人物蒸馏、关系抽取、关系图谱导出与角色对话准备；当宿主需要基于小说内容生成结构化人物档案、关系结果或多角色对话上下文时使用。\n\nTags: latest:4.1.8\n\nVersion history:\n\nv4.1.8 | 2026-05-17T05:43:19.296Z | user\n\nzaomeng-skill v4.1.8\n\n- 新增多组对话辅助脚本，包括角色卡管理、人物字段补全、对话建议生成、场景推荐生成（tools/manage_self_card.py、tools/build_persona_autofill_payload.py、tools/build_dialogue_suggestion_payload.py、tools/build_scene_recommendation_payload.py）\n- 补充 examples/scene_recommendation_context.example.json 示例，详解场景推荐 context 输入格式\n- SKILL.md 增补对话流程 helper 能力及调用方式，并详列各 helper 工具输入输出说明\n- 明确支持宿主在角色扮演/观测阶段对各辅助能力的直接调用方式\n- License、兼容性等元信息完善\n\nv4.1.5 | 2026-05-08T07:46:56.233Z | user\n\nVersion 4.1.5 introduces native support for chunked/batched processing of long texts in distill and relation extraction workflows.\n\n- 新增 distill 和 relation 能力对长篇小说支持自动分批（chunked）payload 拆分及合并\n- `run_manifest.json` 结构扩展，新增分批进度（chunking）记录和宿主串联建议（host_plan）\n- 进度阶段增加 chunk 流程相关阶段（chunk_started, chunk_completed, merge_started, merge_completed）\n- 所有流程均兼容原单次调用和自动分批两种模式，自动提示 chunk 信息与合并步骤\n- CLI 命令及进度更新支持按 chunk 粒度跟踪并记录宿主处理进度\n\nv4.1.4 | 2026-04-30T11:24:15.386Z | user\n\n**Summary:**  \nThis version introduces major enhancements to modularize workflow management, add structured status tracking, and enable incremental character distillation.\n\n- Added structured workflow management tools: `init_host_run.py`, `update_run_progress.py`, and `verify_host_workflow.py`\n- `run_manifest.json` introduced as the central file to track execution status, characters, progress, and artifacts\n- Incremental distillation now supported, with automatic profile merging and update context tracking\n- Each core task (distill, materialize, export graph, verify workflow) defined as a standard capability with explicit JSON status outputs and sidecar files\n- Clear, standardized progress stages and ability for the host to broadcast progress at all phases\n- Enhanced documentation: new capability, workflow, and usage examples for host integration\n- Added vendor JS asset (`mermaid-11.14.0.min.js`) to support graph rendering\n\nv4.1.3 | 2026-04-29T11:49:34.766Z | user\n\nzaomeng-skill v4.1.3\n\n- 新增 tools/materialize_persona_bundle.py 脚本，实现人物档案自动物化\n- 新增 tools/_skill_support/persona_bundle.py 支持人物包处理\n- SKILL.md 文档全面更新，详述产物、流程与宿主执行规范\n- 工具链流程新增人物档案后处理阶段\n- 明确区分 skill 与宿主职责，总结关键 helper 命令\n\nv4.1.1 | 2026-04-29T08:17:33.757Z | user\n\n- 新增人物关系图谱导出工具（tools/export_relation_graph.py）。\n- 增加 Mermaid 与 HTML 格式关系图谱的生成流程说明。\n- 新增蒸馏及图谱生成进度播报规范，要求阶段性反馈，不输出冗余内部过程。\n- 扩展 helper 脚本和命令说明，涵盖关系图谱导出。\n- 明确任务完成后应给出可操作提示，如查看档案、关系图谱或进入对话模式。\n\nv4.1.0 | 2026-04-29T07:21:51.954Z | user\n\nzaomeng-skill 4.1.0\n\n- No code or asset changes detected in this release.\n- Documentation reviewed; content unchanged.\n\nv4.0.1 | 2026-04-29T03:28:04.921Z | user\n\nzaomeng-skill 4.0.1\n\n- No file changes detected in this version.\n- Documentation and process descriptions remain unchanged.\n- No new features, fixes, or updates included.\n\nv4.0.0 | 2026-04-29T03:15:37.445Z | user\n\n**Major refactor: Migrated zaomeng-skill to a lighter, LLM-host-first workflow with greatly simplified assets and utilities.**\n\n- Reduced codebase: Removed nearly all runtime code and internal rule engines; only essential tools remain.\n- Now focuses on preparing novel excerpts and assembling prompt payloads; all generation is delegated to the host LLM.\n- Added two utility scripts: `prepare_novel_excerpt.py` and `build_prompt_payload.py` under the `tools` directory.\n- Documentation and instructions streamlined to reflect LLM-first architecture and clarify agent invocation.\n- No longer uses internal rules, templates, or local runtime modules—prompt organization and data prep only.\n\nv3.3.0 | 2026-04-28T11:36:42.696Z | user\n\n**Major update: Transitioned to an LLM-first workflow with stricter model requirements and updated user guidance.**\n\n- Now requires a usable LLM before running any distillation or chat process; rule-template outputs are no longer a fallback.\n- Skill will not prompt users to configure `runtime/config.yaml` when host/agent already provides an LLM—redundant setup steps removed.\n- New user-facing responses emphasize LLM availability before workflow begins and clearly explain halts if no model is found.\n- Added internal support files: `relation_store.py`, `relation_visualization_exporter.py`, and `session_store.py`.\n- Stronger focus on integrating with host LLM environments (OpenClaw, Hermes, etc.) instead of local/CLI-only configs.\n- SKILL.md guidance, command patterns, and error handling fully revised for LLM-first best practices.\n\nv3.2.0 | 2026-04-28T07:01:00.135Z | user\n\n- 引擎核心结构重构，新增 `runtime/src/core/cli_app.py`、`runtime/src/core/runtime_factory.py` 等核心模块，实现组件化和更清晰的运行时分层。\n- 增加专用 logging 和异常处理支持：引入 `logging_setup.py`、`logging_utils.py`、`exceptions.py`，提升诊断与插件集成能力。\n- 明确区分本地规则生成与可选 LLM 输出：配置灵活支持，用户可选择规则或自然台词输出，无需手动拼装角色链路。\n- 运行时主入口与薄包装结构调整，相关文件说明及调用规范已同步更新。\n- 文档：SKILL.md 全面同步新版结构和调用方式，补充复用说明与最佳实践。\n\nv3.1.0 | 2026-04-27T11:58:56.811Z | user\n\n**zaomeng-skill v3.1.0 — 重大更新：内嵌运行时，弃用外部仓库依赖**\n\n- 内置完整可运行 zaomeng 子集，无需再自动克隆外部 Git 仓库，运行时与数据均位于 skill 包内。\n- 新增并整理多份 Markdown 文档与运行脚本（如 `INSTALL.md`, `MANIFEST.md`, `README.md` 等），实现更清晰的分层与依赖管理。\n- 所有接口调用建议与命令行范例已统一迁移至 skill 包内的 `runtime/zaomeng_cli.py` 入口，废弃旧版 Git 仓库调用方式。\n- 强化依赖说明，仅要求 Python 与 `PyYAML`（可选 `tiktoken`、`ebooklib`）；普通小说处理无硬性第三方依赖。\n- 核心使用、标准流程与禁止行为规则已整体对齐新架构，禁止绕过 CLI 或\n\nv2.1.1 | 2026-04-27T06:52:34.409Z | user\n\nzaomeng-skill 2.1.1\n\n- 固定 zaomeng 仓库的源码版本，新增自动 checkout 到提交 649f7466738f99d60c454e167835462215cffc7d 的说明与命令\n- 更新文档中的环境准备步骤，明确指定 clone 后需固定版本\n- 其他使用说明、工作流、标准回复等未发生变化\n\nv2.0.1 | 2026-04-27T06:47:10.224Z | user\n\nzaomeng-skill 2.0.1\n\n- 增加了本地 zaomeng 引擎环境准备相关说明，明确自动克隆仓库和工作区判断流程。\n- 明确禁止输出依赖排查、安装说明、源码路径等非用户视角的调试提示。\n- 补充推荐面对用户的回复模板，覆盖正常流程和失败兜底情形。\n- 优化工作流描述，要求仅在真实仓库准备后执行后续命令。\n- 禁止将 prompt/schema/说明文件当作引擎替代，强化只用真实 CLI 的约束。\n\nv2.0.0 | 2026-04-27T03:54:13.370Z | user\n\nzaomeng-skill 2.0.0 introduces a switch from JSON to Markdown for character profiles and relation data, with updated user instructions and workflow.\n\n- Changed primary character and relation file format from JSON to Markdown (`.json` files replaced by `.md` files).\n- Added guidance on new Markdown-based personality/character memory files in documentation.\n- Updated chat usage instructions; clarified intent mapping for `act` and `observe` conversation modes.\n- Streamlined rules on invoking and interacting with the skill via CLI.\n- Expanded and reorganized explanation sections for natural language intent mapping and session management.\n\nv1.0.9 | 2026-04-24T13:17:43.395Z | user\n\nzaomeng-skill 1.0.8\n\n- Major documentation overhaul: SKILL.md rewritten for clarity and precision (Chinese, rules-focused).\n- Clarifies that zaomeng-skill is a rules-driven, profile-based engine—not a generic chatbot.\n- Adds strict CLI invocation requirements, with preferred patterns for chat and other commands.\n- Explicitly lists prohibited behaviors and misuse of internal APIs/modules.\n- Documents allowed commands for distillation, extraction, profile viewing, and correction memory.\n- Tightens guidance for agent integration and operator confirmation.\n\nv1.0.7 | 2026-04-24T12:31:23.036Z | user\n\nzaomeng-skill 1.0.7\n\n- Clarified chat execution rules: one-shot chat commands are preferred by default, with interactive sessions only if explicitly requested.\n- Added canonical one-shot command-line forms for chat operations.\n- Updated guidance on offering starter turns when initiating interactive chat.\n- No changes to functionality or extraction logic.\n\nv1.0.6 | 2026-04-24T10:56:13.490Z | user\n\nzaomeng-skill 1.0.6\n\n- Added interactive session rules for `/chat`, including mode selection (observe/act), character confirmation, and session initialization prompts.\n- Clarified that `/chat` is treated as an interactive session, not a batch task.\n- Introduced confirmation-gated execution for `/distill` and `/extract`.\n- Updated instructions to explicitly guide operators through initial chat turns and artifact completion checks.\n- No code or schema changes; documentation improved for interactive and tool-driven workflows.\n\nv1.0.5 | 2026-04-24T06:24:38.963Z | user\n\nzaomeng-skill v1.0.5\n\n- Added comprehensive usage examples, prompt templates, and validation/safety reference files for distillation, relation extraction, and correction workflows.\n- Updated SKILL.md to specify a fully self-contained, phase-based workflow, including detailed input normalization, evidence extraction, profile and relation synthesis, and multilayer quality/safety gates.\n- Documented explicit output contracts and trigger phrases/commands for invoking each feature.\n- Introduced schema, safety policy, and validation guidelines to standardize outputs and enhance reliability.\n- All required artifacts, prompt formats, and key references are now included in the skill package.\n\nv1.0.1 | 2026-04-23T03:53:56.558Z | user\n\n- Clarified that the skill is a runtime adapter requiring the Dreamforge GitHub repository.\n- Added detailed setup instructions, including new dependency and configuration steps.\n- Added INSTALL.txt and MANIFEST.txt files for improved installation guidance.\n- Updated SKILL.md with explicit usage and dependency notes.\n\nv1.0.0 | 2026-04-23T03:50:40.263Z | user\n\nInitial release of zaomeng-skill:\n\n- Distills character profiles and extracts relationship graphs from novel files (.txt/.epub)\n- Supports immersive roleplay chat modes (observe/act) with OOC correction memory\n- All outputs are stored locally as JSON—no cloud or OpenAI API required\n- Provides core CLI commands for distill, extract, chat, view, and correction tasks\n- Requires Python 3.10 or higher\n\nArchive index:\n\nArchive v4.1.8: 50 files, 1032426 bytes\n\nFiles: .metadata.json (643b), assets/vendor/mermaid-11.14.0.min.js (3168268b), examples/chat_result_single_turn.example.json (732b), examples/chat_session_summary.example.json (1005b), examples/chat_status_complete.example.json (438b), examples/host_workflow_example.md (7299b), examples/sample_character_profile.md (6753b), examples/sample_input_excerpt.txt (229b), examples/sample_relations.md (789b), examples/scene_recommendation_context.example.json (3710b), examples/test-prompts.json (1993b), INSTALL.md (2168b), MANIFEST.md (1344b), prompts/correction_prompt.md (2509b), prompts/distill_prompt.md (7374b), prompts/relation_prompt.md (2253b), PUBLISH.md (4644b), README_EN.md (9850b), README.md (9741b), references/capability_index.md (5298b), references/chat_contract.md (4200b), references/logic_constraint.md (3270b), references/output_schema.md (13793b), references/safety_policy.md (612b), references/style_differ.md (3289b), references/validation_policy.md (2313b), requirements.txt (317b), skill-card.md (2239b), SKILL.md (10823b), tools/_skill_support/__init__.py (4031b), tools/_skill_support/dialogue_payloads.py (20977b), tools/_skill_support/novel_preparation.py (27372b), tools/_skill_support/persona_bundle.py (40026b), tools/_skill_support/persona_review.py (33673b), tools/_skill_support/prompt_payloads.py (27736b), tools/_skill_support/relation_graph_export.py (43318b), tools/_skill_support/scene_recommendations.py (28648b), tools/_skill_support/workflow_completion.py (17864b), tools/build_dialogue_suggestion_payload.py (2740b), tools/build_persona_autofill_payload.py (3898b), tools/build_prompt_payload.py (9648b), tools/build_scene_recommendation_payload.py (1291b), tools/export_relation_graph.py (1774b), tools/init_host_run.py (1326b), tools/manage_self_card.py (4727b), tools/materialize_persona_bundle.py (4385b), tools/prepare_novel_excerpt.py (5771b), tools/update_run_progress.py (3169b), tools/verify_host_workflow.py (4400b), _meta.json (132b)\n\nFile v4.1.8:SKILL.md\n\n---\r\nname: zaomeng-skill\r\ndescription: 用于中文小说人物蒸馏、关系抽取、关系图谱导出与角色对话准备；当宿主需要基于小说内容生成结构化人物档案、关系结果或多角色对话上下文时使用。\r\nlicense: MIT-0\r\ncompatibility: 需要宿主支持 Markdown skill 目录、YAML frontmatter，以及本 skill 内置 Python helper\r\n  scripts 所需的本地 Python 运行环境。\r\nmetadata:\r\n  version: 4.1.8\r\n  hostMode: llm-first\r\n  releaseTag: v2026.05.11\r\n---\r\n\r\n# zaomeng-skill\r\n\r\n| 项目 | 内容 |\r\n| --- | --- |\r\n| 名称 | `zaomeng-skill` |\r\n| 类型 | ClawHub / Host-managed skill |\r\n| 核心模式 | LLM-first |\r\n| 适用场景 | 人物蒸馏、人物包物化、关系图谱导出、角色 `act` / `insert` / `observe` |\r\n| 宿主职责 | 调用宿主 LLM，负责最终生成与对话推进 |\r\n| skill 职责 | 准备 prompt payload、物化人物包、导出图谱、校验产物、维护运行状态，并提供角色卡/人物补全/对话建议 helper |\r\n\r\n## 1. 定位\r\n\r\n- 这是一个宿主驱动的 prompt-first skill。\r\n- 宿主负责实际调用 LLM；skill 负责把任务整理成标准输入、标准产物和标准状态。\r\n- skill 的主路径是 `prompts + helper tools + run_manifest.json`，不是内嵌 chat CLI。\r\n- 对话阶段除了宿主直读人物包，也可以调用 skill helper 来生成角色卡、人物字段补全 payload、以及 `act` / `insert` / `observe` 的自动回复建议 payload。\r\n\r\n## 2. 宿主能力契约\r\n\r\n宿主侧只需要理解四个标准能力，以及四组对话 helper：\r\n\r\n| 能力 | 入口 | 作用 | 标准成功标记 |\r\n| --- | --- | --- | --- |\r\n| `distill` | `tools/build_prompt_payload.py --mode distill` | 生成蒸馏 payload，等待宿主 LLM 产出 `PROFILE.generated.md` | capability status `status=ready, success=true` |\r\n| `materialize` | `tools/materialize_persona_bundle.py` | 把 `PROFILE.generated.md` 物化为完整人物包 | `ARTIFACT_STATUS.generated.json` + capability status |\r\n| `export_graph` | `tools/export_relation_graph.py` | 导出人物关系图谱 HTML / Mermaid / SVG | `<relations>.status.json` + capability status |\r\n| `verify_workflow` | `tools/verify_host_workflow.py` | 校验整条宿主工作流产物是否完整 | capability status `status=complete, success=true` |\r\n\r\n对话 helper：\r\n\r\n| helper | 入口 | 作用 |\r\n| --- | --- | --- |\r\n| `self_card` | `tools/manage_self_card.py` | 创建 / 保存 / 读取 / 删除 self-insert 角色卡，并生成随机角色卡 prompt payload |\r\n| `persona_autofill` | `tools/build_persona_autofill_payload.py` | 为人物校对单字段生成宿主可调用的补全 payload，并解析模型返回 |\r\n| `dialogue_suggestion` | `tools/build_dialogue_suggestion_payload.py` | 为 `act` / `insert` / `observe` 生成自动回复建议 payload，并提供压缩重试版本 |\r\n| `scene_recommendation` | `tools/build_scene_recommendation_payload.py` | 为当前会话生成下一幕场景推荐、转场提示、多拍链路建议，以及可直接用于自动起拍的 opening cue |\r\n\r\n所有能力都应该满足：\r\n\r\n- 有明确输入\r\n- 有 JSON 输出\r\n- 有 sidecar status 文件\r\n- 有 `success` 布尔值\r\n- 可选更新 `run_manifest.json`\r\n\r\n能力总览集中定义在：\r\n\r\n- `references/capability_index.md`\r\n- `examples/host_workflow_example.md`\r\n\r\n`distill` 默认支持增量蒸馏：\r\n\r\n- 如果 `data/characters/<novel_id>/<角色名>/` 已存在人物包，`tools/build_prompt_payload.py --mode distill` 会自动把已有档案并入 `request.existing_profiles`\r\n- `request.update_mode` 会自动落成 `incremental`\r\n- `run_manifest.json` 的 `artifacts.distill_context` 会记录本次是 `create` 还是 `incremental`，以及命中的已有角色数量\r\n\r\n`distill` 与 `relation` 现在也默认支持长篇自动分批：\r\n\r\n- 小文本保持单次 payload，不改变既有调用方式\r\n- 当 excerpt 过长时，payload 会额外给出 `chunks[]`\r\n- 宿主按 `chunks[]` 顺序调用 LLM，收集每块局部草稿\r\n- 然后再按 `merge_payload` 做一次合并，得到最终 `PROFILE.generated.md` 或 `RELATION_GRAPH`\r\n- `request.chunk_mode`、`meta.chunk_count`、`meta.merge_required` 会明确告诉宿主当前是否处于分批模式\r\n\r\n## 3. 标准运行状态\r\n\r\n宿主如果要跑完整蒸馏链路，先初始化一个 `run_manifest.json`：\r\n\r\n```bash\r\npython tools/init_host_run.py --novel <路径> --characters A,B,C --output <run_manifest.json>\r\n```\r\n\r\n`run_manifest.json` 是宿主侧的统一索引，记录：\r\n\r\n- 当前阶段\r\n- 已锁定角色\r\n- 当前正在处理的角色\r\n- 已完成数量\r\n- 关系图导出状态\r\n- 各能力 status 文件\r\n- 人物目录\r\n- 关系图 HTML / SVG / Mermaid 路径\r\n- 最终 workflow 校验结果\r\n- 增量蒸馏上下文（`update_mode`、已有档案数量、已有档案目录）\r\n- 分批执行概览（`progress.chunking`、`summary.chunking`）\r\n\r\n## 4. 标准进度阶段\r\n\r\n宿主侧统一使用这些阶段名：\r\n\r\n- `characters_locked`\r\n- `distill_payload_ready`\r\n- `relation_payload_ready`\r\n- `chunk_started`\r\n- `chunk_completed`\r\n- `merge_started`\r\n- `merge_completed`\r\n- `character_started`\r\n- `character_completed`\r\n- `graph_export_started`\r\n- `graph_export_completed`\r\n- `workflow_verified`\r\n\r\n如果宿主要主动播报当前角色和进度，直接调用：\r\n\r\n```bash\r\npython tools/update_run_progress.py --run-manifest <run_manifest.json> --stage character_started --character 林黛玉 --message \"正在蒸馏林黛玉\"\r\n```\r\n\r\n如果是长篇自动分批流程，也可以写入当前块进度：\r\n\r\n```bash\r\npython tools/update_run_progress.py --run-manifest <run_manifest.json> --stage chunk_started --message \"正在执行第 1 块\" --chunk-capability distill --chunk-mode chunked --chunk-count 6 --current-chunk 1 --chunk-label 前段-1 --chunk-status running --merge-required --merge-status pending\r\n```\r\n\r\n写入后，宿主可直接从 `run_manifest.json` 读取：\r\n\r\n- `progress.chunking.distill.current_chunk`\r\n- `progress.chunking.distill.chunk_count`\r\n- `progress.chunking.distill.current_label`\r\n- `summary.chunking.distill`\r\n\r\n## 5. 标准流程\r\n\r\n1. 初始化 `run_manifest.json`\r\n2. 运行 `distill` 能力，生成蒸馏 payload\r\n3. 如果 payload 含 `chunks[]`，宿主先逐块生成局部草稿，再执行 `merge_payload`\r\n4. 否则直接为每个角色生成 `PROFILE.generated.md`\r\n5. 每个角色生成后立刻运行 `materialize`\r\n6. 如果 relation payload 含 `chunks[]`，也先逐块抽取，再执行 `merge_payload`\r\n7. 宿主 LLM 生成关系结果后运行 `export_graph`\r\n8. 运行 `verify_workflow`\r\n9. 宿主向用户展示：\r\n   - 人物目录\r\n   - 关系图 HTML / SVG\r\n   - 状态摘要\r\n   - 可进入 `act` / `insert` / `observe`\r\n\r\n## 6. 推荐宿主串联方式\r\n\r\n### A. 初始化运行\r\n\r\n```bash\r\npython tools/init_host_run.py --novel <路径> --characters A,B --output <run_manifest.json>\r\n```\r\n\r\n### B. 准备 distill payload\r\n\r\n```bash\r\npython tools/build_prompt_payload.py --mode distill --novel <路径> --characters A,B --output <distill_payload.json> --run-manifest <run_manifest.json>\r\n```\r\n\r\n如果小说较长，输出 JSON 会自动包含：\r\n\r\n- `chunks[]`：每一块都已经是可直接交给宿主 LLM 的局部 payload\r\n- `merge_payload`：宿主把所有 chunk 草稿结果塞回 `request.chunk_drafts` 后，再调用一次用于最终合并\r\n- `host_plan`：宿主串联建议，包括 `single_pass` 或 `sequential_chunks_then_merge`\r\n\r\n如果宿主要显式指定已有角色目录，或强制切换创建 / 增量模式，可加：\r\n\r\n```bash\r\npython tools/build_prompt_payload.py --mode distill --novel <路径> --characters A,B --characters-root <data/characters 或 data/characters/<novel_id>> --update-mode auto|create|incremental --output <distill_payload.json> --run-manifest <run_manifest.json>\r\n```\r\n\r\n### C. 角色开始 / 完成进度\r\n\r\n```bash\r\npython tools/update_run_progress.py --run-manifest <run_manifest.json> --stage character_started --character A\r\npython tools/update_run_progress.py --run-manifest <run_manifest.json> --stage character_completed --character A\r\n```\r\n\r\n### D. 物化人物包\r\n\r\n```bash\r\npython tools/materialize_persona_bundle.py --profile-file <character-dir/PROFILE.generated.md> --run-manifest <run_manifest.json>\r\n```\r\n\r\n### E. 导出关系图谱\r\n\r\n```bash\r\npython tools/export_relation_graph.py --relations-file <relations.md> --run-manifest <run_manifest.json>\r\n```\r\n\r\n### F. 校验工作流\r\n\r\n```bash\r\npython tools/verify_host_workflow.py --characters-root <characters/<novel_id>> --relations-file <relations.md> --run-manifest <run_manifest.json>\r\n```\r\n\r\n## 7. 最终产物\r\n\r\n完整 run 结束后，宿主应该直接拿到：\r\n\r\n- `run_manifest.json`\r\n- 每个角色的人物目录\r\n- distill 增量上下文：\r\n  - `artifacts.distill_context.update_mode`\r\n  - `artifacts.distill_context.existing_character_count`\r\n  - `artifacts.distill_context.existing_profile_paths`\r\n- 每个角色的 `ARTIFACT_STATUS.generated.json`\r\n- 关系图：\r\n  - `*_relations.html`\r\n  - `*_relations.svg`\r\n  - `*_relations.mermaid.md`\r\n  - `*.status.json`\r\n- workflow 校验 JSON\r\n\r\n## 8. 对话接管\r\n\r\n当人物包和关系图准备完成后，宿主即可进入：\r\n\r\n- `act`：指定角色代入发言，既可单聊，也可直接参与多人群聊\r\n- `insert`：用户以“自己”的身份进入小说场景，角色按人设与场景身份回应用户；首次进入应建立轻量身份卡\r\n- `observe`：进入群聊模式，但用户不代入具体角色，只观察多角色对话推进\r\n\r\n这里的对话由宿主直接驱动，skill 不提供单独的 `chat` CLI 能力。宿主应直接使用：\r\n\r\n- 人物包目录\r\n- `PROFILE.md` / 拆分人格文件 / `MEMORY.md`\r\n- 关系图谱及关系 markdown\r\n- `run_manifest.json`\r\n- `references/output_schema.md`、`references/style_differ.md`、`references/logic_constraint.md`\r\n\r\n如果宿主需要角色卡、人物字段补全、对话建议或下一幕推荐 helper，可直接调用：\r\n\r\n- `python tools/manage_self_card.py --mode blank|list|get|save|delete|build-random-payload|parse-random-response`\r\n- `python tools/build_persona_autofill_payload.py --persona-dir <角色目录> --field <字段名> --strategy auto|model_knowledge`\r\n- `python tools/build_dialogue_suggestion_payload.py --context-file <context.json>`\r\n- `python tools/build_scene_recommendation_payload.py --context-file <context.json>`\r\n\r\n其中 `scene_recommendation` 的上下文字段可直接参考：\r\n\r\n- `examples/scene_recommendation_context.example.json`\r\n\r\n宿主结束提示建议直接说清楚：\r\n\r\n- 人物档案已完成\r\n- 关系图谱已生成\r\n- 可以查看图谱\r\n- 可以进入 `act`\r\n- 可以进入 `insert`\r\n- 可以进入 `observe`\n\nFile v4.1.8:README.md\n\n# zaomeng-skill\r\n\r\n`zaomeng-skill` 是一个面向中文小说人物蒸馏、关系抽取、关系图谱和角色对话的 skill。\r\n\r\n它的工作方式很直接：\r\n\r\n- 读取小说内容\r\n- 准备 excerpt、prompt 和 references\r\n- 交给宿主 LLM 生成蒸馏结果、关系结果和角色回复\r\n- 将 canonical profile 继续物化为完整人物包\r\n\r\n这个 skill 默认运行在宿主环境中，宿主负责实际调用模型；包内 Python helper 依赖写在 `requirements.txt`。\r\n\r\n## 概览\r\n\r\n| 项目 | 内容 |\r\n| --- | --- |\r\n| 名称 | `zaomeng-skill` |\r\n| 模式 | LLM-first |\r\n| 适用宿主 | OpenClaw、ClawHub、Hermes、其他 host-managed agent |\r\n| 核心能力 | 人物蒸馏、关系抽取、关系图谱、宿主驱动角色对话 |\r\n| 许可证 | `MIT-0` |\r\n\r\n## 它能做什么\r\n\r\n### 1. 蒸馏人物\r\n\r\n从小说原文中提取人物档案，并尽量覆盖完整的人设层次，例如：\r\n\r\n- 核心身份\r\n- 核心动机\r\n- 性格基底\r\n- 行为逻辑\r\n- 人物弧光\r\n- 关键羁绊\r\n- 语言表达特质\r\n- 价值取舍体系\r\n- 深层执念与隐秘欲望\r\n- 私下真实面貌\r\n\r\n### 2. 抽取关系\r\n\r\n从同框互动中提取两两关系，并输出人物关系图谱，包括：\r\n\r\n- 关系结果 markdown\r\n- Mermaid 源码\r\n- HTML 可视化图谱\r\n- SVG 图谱\r\n\r\n### 3. 进入角色聊天\r\n\r\n支持三种玩法：\r\n\r\n- `act`\r\n  你扮演一个角色说话，可以是一对一，也可以直接加入多人群聊\r\n- `insert`\r\n  你以“你自己”的身份进入小说场景，不扮演书中角色，而是直接和他们互动\r\n- `observe`\r\n  让多个角色围绕一个场景、话题或开场白进行互动\r\n\r\n这些对话由宿主直接驱动。`zaomeng-skill` 提供人物包、关系图谱、prompt 约束和运行状态，不再把内嵌 `chat CLI` 当作主路径能力。\r\n\r\n### 4. 保存纠错\r\n\r\n如果某句明显 OOC，可以把纠错写回记忆，后续对话继续沿用。\r\n\r\n## 工作流\r\n\r\n### 标准流程\r\n\r\n1. 提供小说文件或正文\r\n2. 生成按角色聚焦的 excerpt\r\n3. 生成 distill 或 relation prompt payload\r\n4. 交给宿主 LLM 完成生成\r\n5. 若宿主落盘了 `PROFILE.generated.md`，继续物化完整人物包\r\n6. 导出关系图谱\r\n7. 再进入 `act`、`insert` 或 `observe`\r\n\r\n多角色蒸馏时，不应只截取小说开头。应传入 `--characters`，让 excerpt 围绕目标角色的实际出场窗口抽取，尤其适用于角色分散出现在不同章节的长篇文本。\r\n\r\n### 增量蒸馏\r\n\r\n如果同一本小说下已经存在角色人物包，这个 skill 会在构建 distill payload 时自动复用已有档案，把本次蒸馏视为增量更新：\r\n\r\n- 自动检测 `data/characters/<novel_id>/<角色名>/`\r\n- 把已有 `PROFILE`、拆分人格文件和 `MEMORY` 合并到 `request.existing_profiles`\r\n- 将 `request.update_mode` 标记为 `incremental`\r\n- 把增量上下文写入 `run_manifest.json -> artifacts.distill_context`\r\n\r\n此外，distill payload 现在会额外给出 `request.excerpt_focus`，包含：\r\n\r\n- `requested_characters`\r\n- `matched_characters`\r\n- `missing_characters`\r\n- `strategy`\r\n\r\n宿主可以据此判断：这次 excerpt 是否真的覆盖了请求角色，是否有角色根本没在文本里命中。\r\n\r\n### 长篇自动分批\r\n\r\n当 excerpt 过长时，这个 skill 不再只给宿主一个“大而全”的单次 payload，而是会自动切换为分批模式：\r\n\r\n- `request.chunk_mode = chunked`\r\n- `meta.chunk_count` 标明总块数\r\n- `meta.merge_required = true`\r\n- `chunks[]` 给出每一块可直接调用宿主 LLM 的局部 payload\r\n- `merge_payload` 给出最终合并局部草稿的模板 payload\r\n\r\n也就是说，宿主拿到结果后可以这样跑：\r\n\r\n1. 先判断是不是 `chunked`\r\n2. 如果是，就按 `chunks[]` 顺序逐块生成局部草稿\r\n3. 把每块草稿塞回 `merge_payload.request.chunk_drafts`\r\n4. 再执行一次 merge，得到最终 `PROFILE.generated.md` 或最终 `RELATION_GRAPH`\r\n\r\n短文本仍然保持旧的单次流程，不会被额外复杂化。\r\n\r\n### Distill Post-Process\r\n\r\n宿主 LLM 写出 `PROFILE.generated.md` 后，不要停在单文件状态。  \r\n应立即执行 `tools/materialize_persona_bundle.py`，把 canonical profile 物化成完整人物包，补齐：\r\n\r\n- `SOUL.generated.md`\r\n- `GOALS.generated.md`\r\n- `STYLE.generated.md`\r\n- `TRAUMA.generated.md`\r\n- `IDENTITY.generated.md`\r\n- `BACKGROUND.generated.md`\r\n- `CAPABILITY.generated.md`\r\n- `BONDS.generated.md`\r\n- `CONFLICTS.generated.md`\r\n- `ROLE.generated.md`\r\n- `AGENTS.generated.md`\r\n- `MEMORY.generated.md`\r\n- `NAVIGATION.generated.md`\r\n\r\n### 对话接管\r\n\r\n蒸馏和图谱完成后，宿主直接进入对话阶段即可。推荐宿主读取：\r\n\r\n- 人物目录下的 `PROFILE.md`\r\n- 拆分人格文件，如 `SOUL.md`、`GOALS.md`、`STYLE.md`\r\n- `MEMORY.md`\r\n- 关系结果 markdown\r\n- 关系图 HTML / SVG\r\n- `run_manifest.json`\r\n\r\n宿主进入对话后，按模式解释即可：\r\n\r\n- `act`：用户代入某个角色发言\r\n- `insert`：用户以自己身份进入场景\r\n- `observe`：用户只观察角色推进群聊\r\n\r\n如果宿主想把“下一幕推荐 + 自动转场 + 自动起拍”也接进来，可以额外调用：\r\n\r\n- `python tools/build_scene_recommendation_payload.py --context-file <context.json>`\r\n\r\n可直接参考：\r\n\r\n- `examples/scene_recommendation_context.example.json`\r\n\r\n## 安装方式\r\n\r\n### OpenClaw\r\n\r\n```bash\r\nopenclaw skills install wkbin/zaomeng-skill\r\n```\r\n\r\n### ClawHub\r\n\r\n```bash\r\nnpx clawhub@latest install zaomeng-skill\r\npnpm dlx clawhub@latest install zaomeng-skill\r\nbunx clawhub@latest install zaomeng-skill\r\n```\r\n\r\n### 本地 skill 目录安装\r\n\r\n```bash\r\npython scripts/install_skill.py --skills-dir <your-skills-root>\r\n```\r\n\r\n## Helper Commands\r\n\r\n```bash\r\npython tools/init_host_run.py --novel <路径> --characters A,B --output <run_manifest.json>\r\npython tools/prepare_novel_excerpt.py --novel <路径> [--characters A,B] [--max-sentences 120] [--max-chars 50000]\r\npython tools/build_prompt_payload.py --mode distill|relation --novel <路径> [--characters A,B] [--characters-root <data/characters 或 data/characters/<novel_id>>] [--update-mode auto|create|incremental]\r\npython tools/materialize_persona_bundle.py --profile-file <角色目录/PROFILE.generated.md>\r\npython tools/export_relation_graph.py --relations-file <关系结果.md>\r\npython tools/verify_host_workflow.py --characters-root <characters/<novel_id>> [--relations-file <关系结果.md>]\r\npython tools/build_scene_recommendation_payload.py --context-file <context.json>\r\n```\r\n\r\n```bash\r\npython tools/prepare_novel_excerpt.py --novel 十日终焉.txt --characters 齐夏,肖冉,章晨泽 --max-chars 50000\r\n```\r\n\r\n如果输出 JSON 中出现了 `chunks` 和 `merge_payload`，就说明这次已经进入长篇自动分批模式。\r\n\r\n如果宿主希望把执行进度写进 `run_manifest.json`，还可以继续调用：\r\n\r\n```bash\r\npython tools/update_run_progress.py --run-manifest <run_manifest.json> --stage chunk_started --message \"正在执行第 1 块\" --chunk-capability distill --chunk-mode chunked --chunk-count 6 --current-chunk 1 --chunk-label 前段-1 --chunk-status running --merge-required --merge-status pending\r\n```\r\n\r\n这样 manifest 里会有：\r\n\r\n- `progress.chunking`\r\n- `summary.chunking`\r\n\r\n## 推荐使用方式\r\n\r\n正确顺序不是一上来就群聊。  \r\n**先给小说，再蒸馏人物，蒸馏完成后再进入聊天。**\r\n\r\n最常见的路径是：\r\n\r\n1. 提供小说文件或路径\r\n2. 指定要蒸馏的角色\r\n3. 宿主分阶段播报蒸馏进度和图谱生成进度\r\n4. 查看人物档案或关系图谱\r\n5. 进入 `act`、`insert` 或 `observe`\r\n\r\n## 示例\r\n\r\n### 蒸馏\r\n\r\n```text\r\n帮我蒸馏林黛玉和贾宝玉\r\n```\r\n\r\n```text\r\n请从这本小说里提取刘备、张飞、关羽的人设\r\n```\r\n\r\n### 进入 act\r\n\r\n```text\r\n让我扮演贾宝玉和林黛玉聊天\r\n```\r\n\r\n```text\r\n我来扮演宝玉，你让黛玉回我\r\n```\r\n\r\n### 进入 observe\r\n\r\n```text\r\n进入刘备、张飞、关羽群聊模式\r\n```\r\n\r\n```text\r\n请让大家围绕联合孙权这件事各说一句\r\n```\r\n\r\n### 进入 insert\r\n\r\n```text\r\n让我以我自己进入红楼梦，和林黛玉、贾宝玉聊天\r\n```\r\n\r\n```text\r\n把我放进三国场景里，我想以初来军中的新客身份和刘备他们说话\r\n```\r\n\r\n## 人物包结构\r\n\r\n人物档案目录通常如下：\r\n\r\n```text\r\nruntime/data/characters/<novel_id>/<角色名>/\r\n```\r\n\r\n常见文件：\r\n\r\n- `PROFILE.generated.md`\r\n- `PROFILE.md`\r\n- `NAVIGATION.generated.md`\r\n- `NAVIGATION.md`\r\n- `MEMORY.generated.md`\r\n- `MEMORY.md`\r\n\r\n按证据充分程度，还可能生成拆分人格文件：\r\n\r\n- `SOUL.generated.md`\r\n- `GOALS.generated.md`\r\n- `STYLE.generated.md`\r\n- `TRAUMA.generated.md`\r\n- `IDENTITY.generated.md`\r\n- `BACKGROUND.generated.md`\r\n- `CAPABILITY.generated.md`\r\n- `BONDS.generated.md`\r\n- `CONFLICTS.generated.md`\r\n- `ROLE.generated.md`\r\n\r\n## 约束文件\r\n\r\n- `references/output_schema.md`\r\n  负责输出格式与字段定义\r\n- `references/style_differ.md`\r\n  负责反同质化与风格差异化\r\n- `references/logic_constraint.md`\r\n  负责人设底线与防 OOC\r\n- `references/validation_policy.md`\r\n  负责输出自检和校验规则\r\n- `references/capability_index.md`\r\n  负责 `distill`、`materialize`、`export_graph`、`verify_workflow` 的能力索引\r\n- `references/chat_contract.md`\r\n  负责说明宿主如何接管 `act` / `insert` / `observe` 对话阶段\r\n\r\n## 发布内容\r\n\r\n建议一并发布这些文件：\r\n\r\n- `README.md`\r\n- `README_EN.md`\r\n- `.metadata.json`\r\n- `SKILL.md`\r\n- `INSTALL.md`\r\n- `MANIFEST.md`\r\n- `PUBLISH.md`\r\n- `requirements.txt`\r\n- `prompts/`\r\n- `references/`\r\n- `tools/`\r\n\r\n## License\r\n\r\n`MIT-0`\n\nFile v4.1.8:_meta.json\n\n{\n  \"ownerId\": \"kn7fgefcp561ypgde2wm8xgfeh82mtx9\",\n  \"slug\": \"zaomeng-skill\",\n  \"version\": \"4.1.8\",\n  \"publishedAt\": 1778996599296\n}\n\nFile v4.1.8:references/capability_index.md\n\n# Capability Index\r\n\r\n## Purpose\r\n\r\nThis document is the host-side index for the standard `zaomeng` capabilities.\r\n\r\nUse it as the first stop when the host needs to answer:\r\n\r\n- which helper should I call\r\n- what files should I expect\r\n- how do I know whether this capability succeeded\r\n\r\n## Capability List\r\n\r\n| Capability | Entry | Primary Output | Success Marker |\r\n| --- | --- | --- | --- |\r\n| `distill` | `tools/build_prompt_payload.py --mode distill` | distill payload JSON | capability status with `status=ready` and `success=true` |\r\n| `materialize` | `tools/materialize_persona_bundle.py` | persona bundle files | `ARTIFACT_STATUS.generated.json` plus capability status |\r\n| `export_graph` | `tools/export_relation_graph.py` | relationship graph HTML / SVG / Mermaid | graph `.status.json` plus capability status |\r\n| `verify_workflow` | `tools/verify_host_workflow.py` | workflow verification JSON | capability status with `status=complete` and `success=true` |\r\n\r\n## 1. Distill\r\n\r\nEntry:\r\n\r\n```bash\r\npython tools/build_prompt_payload.py --mode distill --novel <path> --characters A,B --output <distill_payload.json> --run-manifest <run_manifest.json>\r\n```\r\n\r\nStandard outputs:\r\n\r\n- distill payload JSON\r\n- optional capability status JSON\r\n- optional `run_manifest.json` updates\r\n\r\nPayload contract:\r\n\r\n- `request.chunk_mode = single|chunked`\r\n- `chunks[]` for partial distill execution when the excerpt is too large\r\n- `merge_payload` for final profile merge\r\n- `host_plan.execution = single_pass|sequential_chunks_then_merge`\r\n- `meta.chunk_count`\r\n- `meta.merge_required`\r\n\r\nHost responsibility after this step:\r\n\r\n- if `single`, hand the payload to the host LLM and write `PROFILE.generated.md`\r\n- if `chunked`, iterate `chunks[]`, collect partial drafts, fill `merge_payload.request.chunk_drafts`, then execute the merge payload and write the final `PROFILE.generated.md`\r\n\r\nRecommended manifest fields to read:\r\n\r\n- `artifacts.chunking.distill`\r\n- `progress.chunking.distill`\r\n- `summary.chunking.distill`\r\n\r\nReference:\r\n\r\n- `references/output_schema.md`\r\n\r\n## 2. Materialize\r\n\r\nEntry:\r\n\r\n```bash\r\npython tools/materialize_persona_bundle.py --profile-file <character-dir/PROFILE.generated.md> --run-manifest <run_manifest.json>\r\n```\r\n\r\nStandard outputs:\r\n\r\n- split persona markdown files\r\n- `ARTIFACT_STATUS.generated.json`\r\n- optional capability status JSON\r\n\r\nReference:\r\n\r\n- `references/output_schema.md`\r\n\r\n## 3. Export Graph\r\n\r\nEntry:\r\n\r\n```bash\r\npython tools/export_relation_graph.py --relations-file <relations.md> --run-manifest <run_manifest.json>\r\n```\r\n\r\nStandard outputs:\r\n\r\n- `*_relations.html`\r\n- `*_relations.svg`\r\n- `*_relations.mermaid.md`\r\n- graph `.status.json`\r\n\r\nIf relation extraction is chunked on the host side, the same contract applies:\r\n\r\n- `request.chunk_mode = single|chunked`\r\n- `chunks[]`\r\n- `merge_payload`\r\n- `meta.chunk_count`\r\n- `meta.merge_required`\r\n\r\nRecommended manifest fields to read:\r\n\r\n- `artifacts.chunking.relation`\r\n- `progress.chunking.relation`\r\n- `summary.chunking.relation`\r\n\r\nReference:\r\n\r\n- `examples/sample_relations.md`\r\n\r\n## 4. Verify Workflow\r\n\r\nEntry:\r\n\r\n```bash\r\npython tools/verify_host_workflow.py --characters-root <characters/<novel_id>> --relations-file <relations.md> --run-manifest <run_manifest.json>\r\n```\r\n\r\nStandard outputs:\r\n\r\n- workflow verification JSON\r\n- capability status JSON\r\n\r\nRecommended use:\r\n\r\n- run after materialize and export graph\r\n- treat it as the final host-side completeness check\r\n\r\n## Dialogue Stage\r\n\r\n`act`, `insert`, and `observe` are host-driven dialogue modes, but the skill now provides packaged helpers for the most repetitive dialogue-side work.\r\n\r\nAt dialogue time, the host should read:\r\n\r\n- persona bundle files under `runtime/data/characters/<novel_id>/<character_name>/`\r\n- `MEMORY.md`\r\n- relation markdown and graph artifacts\r\n- `run_manifest.json`\r\n- constraint references such as `output_schema.md`, `style_differ.md`, and `logic_constraint.md`\r\n\r\nReference:\r\n\r\n- `references/chat_contract.md`\r\n\r\nOptional helpers for the dialogue stage:\r\n\r\n- `tools/manage_self_card.py`\r\n  - manage self-insert cards\r\n  - build random self-card generation payloads\r\n- `tools/build_persona_autofill_payload.py`\r\n  - build one-field persona autofill payloads\r\n  - parse model output for direct form write-back\r\n- `tools/build_dialogue_suggestion_payload.py`\r\n  - build one-line suggestion payloads for `act` / `insert` / `observe`\r\n  - provide compact retry payloads for long-context fallback\r\n- `tools/build_scene_recommendation_payload.py`\r\n  - build next-scene recommendation bundles for the current dialogue state\r\n  - provide transition text, chain suggestions, and an auto-continue opening cue\r\n  - see `examples/scene_recommendation_context.example.json` for a starter context shape\r\n\r\n## Read Order\r\n\r\nRecommended host read order across the structured workflow:\r\n\r\n1. read capability status first\r\n2. read the primary output for the current capability\r\n3. if present, read `run_manifest.json` for the updated cross-step index\r\n\r\nAfter the workflow completes, hand off to the dialogue stage described in `references/chat_contract.md`.\r\n\r\n## End-To-End Example\r\n\r\nFor one complete host-side chain from run initialization to dialogue handoff, see:\r\n\r\n- `examples/host_workflow_example.md`\n\nFile v4.1.8:references/chat_contract.md\n\n# Dialogue Handoff Contract\r\n\r\n## Purpose\r\n\r\nThis document defines how the host should enter `act`, `insert`, and `observe` after the structured workflow completes.\r\n\r\nThe goal is simple:\r\n\r\n- the skill prepares persona bundles and relationship artifacts\r\n- the host uses those artifacts directly to run dialogue\r\n- the packaged skill does not require a separate `chat CLI` entrypoint\r\n\r\n## Supported Modes\r\n\r\n- `act`\r\n  the user speaks as one existing character\r\n- `insert`\r\n  the user enters the scene as themselves\r\n- `observe`\r\n  the user stays outside the scene and watches the cast continue\r\n\r\n## Required Inputs\r\n\r\nBefore the host starts dialogue, it should already have:\r\n\r\n- the novel id or novel path for the current run\r\n- the requested cast\r\n- one persona bundle directory per distilled character\r\n- relationship markdown or graph artifacts when available\r\n- `run_manifest.json` from the current run\r\n\r\nMinimum persona inputs per active character:\r\n\r\n- `PROFILE.md`\r\n- `MEMORY.md`\r\n\r\nRecommended additional persona inputs when present:\r\n\r\n- `SOUL.md`\r\n- `GOALS.md`\r\n- `STYLE.md`\r\n- `TRAUMA.md`\r\n- `IDENTITY.md`\r\n- `BACKGROUND.md`\r\n- `CAPABILITY.md`\r\n- `BONDS.md`\r\n- `CONFLICTS.md`\r\n- `ROLE.md`\r\n\r\n## Host Responsibilities\r\n\r\n### 1. Mode Selection\r\n\r\nThe host decides whether the request is:\r\n\r\n- `act`\r\n- `insert`\r\n- `observe`\r\n\r\n### 2. Active Cast Selection\r\n\r\nThe host determines which characters are active for the current turn or scene.\r\n\r\nRecommended inputs:\r\n\r\n- explicitly requested characters\r\n- relation graph context\r\n- current scene focus\r\n\r\n### 3. Self-Insert Card\r\n\r\nFor `insert`, the host should create or refresh a lightweight self-insert card, for example:\r\n\r\n- user display name\r\n- current in-scene identity\r\n- how they entered the scene\r\n- what the cast should currently know about them\r\n\r\nIf the host wants packaged helpers instead of hand-writing this layer, use:\r\n\r\n- `tools/manage_self_card.py --mode blank`\r\n- `tools/manage_self_card.py --mode save`\r\n- `tools/manage_self_card.py --mode build-random-payload`\r\n- `tools/manage_self_card.py --mode parse-random-response`\r\n\r\nThis lets the host support both manual role-card editing and AI-random role-card generation through the packaged skill helpers.\r\n\r\n### 4. Dialogue Rendering\r\n\r\nThe host performs the actual generation. It should use the persona bundle and constraints to keep the output:\r\n\r\n- in character\r\n- mode-consistent\r\n- relation-aware\r\n- scene-aware\r\n\r\nIf the host wants a packaged one-line reply suggestion flow, call:\r\n\r\n- `tools/build_dialogue_suggestion_payload.py --context-file <context.json>`\r\n\r\nThe tool returns:\r\n\r\n- full messages\r\n- retry messages\r\n- compact fallback payload/messages\r\n\r\nFor persona review autofill, call:\r\n\r\n- `tools/build_persona_autofill_payload.py --persona-dir <角色目录> --field <字段名> --strategy auto`\r\n\r\nThe tool returns:\r\n\r\n- model-knowledge-first step\r\n- retry messages\r\n- parser contract for model output\r\n\r\nIf the host wants the skill to help decide what the next beat should be, call:\r\n\r\n- `tools/build_scene_recommendation_payload.py --context-file <context.json>`\r\n\r\nThe tool returns:\r\n\r\n- ranked next-scene candidates\r\n- a recommended transition message\r\n- scene chain suggestions for follow-up beats\r\n- a `recommended_auto_continue_message` the host can feed back into its dialogue engine immediately after switching scenes\r\n\r\nRecommended starter context:\r\n\r\n- `examples/scene_recommendation_context.example.json`\r\n\r\n## Recommended Artifact Read Order\r\n\r\n1. `run_manifest.json`\r\n2. relation markdown and graph artifacts\r\n3. `PROFILE.md`\r\n4. split persona files\r\n5. `MEMORY.md`\r\n\r\n## Output Expectations\r\n\r\nThe exact dialogue output format is host-defined.\r\n\r\nAt minimum, the host should keep enough structured state to know:\r\n\r\n- current mode\r\n- active cast\r\n- controlled character for `act`\r\n- self-insert identity for `insert`\r\n- latest scene summary\r\n- latest turn outputs\r\n\r\n## Host UI Guidance\r\n\r\nAfter the structured workflow completes, the host should surface:\r\n\r\n- character directories\r\n- relationship graph HTML / SVG\r\n- workflow summary from `run_manifest.json`\r\n- a clear prompt that the user can now enter `act`, `insert`, or `observe`\n\nFile v4.1.8:references/logic_constraint.md\n\n# 逻辑约束指南\r\n\r\n## 用途\r\n\r\n用于防止人物设定崩坏、OOC 漂移，以及在蒸馏、纠错、act 模式、observe 模式中的角色逻辑失稳。\r\n\r\n这份文件定义的是全局人格逻辑边界，不是风格文件，也不是格式文件。\r\n\r\n## 约束优先级\r\n\r\n当多个约束发生冲突时，按以下优先级处理：\r\n\r\n1. 原文直接证据\r\n2. 已写入记忆的用户纠正\r\n3. 针对具体关系对象的关系约束\r\n4. 角色档案中的人格字段\r\n5. 风格偏好\r\n6. 通用兜底规则\r\n\r\n## 全局人格底线\r\n\r\n### 1. 身份不能轻易翻转\r\n\r\n- 角色不能在没有证据的情况下，随意背离核心身份、派系位置或剧情职能。\r\n- 一时迟疑，不等于身份反转。\r\n\r\n### 2. 动机必须前后一致\r\n\r\n- 发言和行为应尽量与 `soul_goal`、`hidden_desire`、`belief_anchor` 保持相容。\r\n- 角色可以战术性回避，但不能在没有依据时抹掉长期驱动力。\r\n\r\n### 3. 价值观约束决策\r\n\r\n- `decision_rules`、`reward_logic`、`taboo_topics`、`forbidden_behaviors` 构成人物硬边界。\r\n- 角色可以偶尔违背自己的价值观，但必须是少见、代价高、且有证据支撑的情况。\r\n\r\n### 4. 关系层优先于通用语气\r\n\r\n- 角色不会对所有人都用同一种态度说话。\r\n- 关系层与 `key_bonds` 应先于通用风格兜底生效。\r\n\r\n### 5. 情绪反应必须符合人物惯性\r\n\r\n- 高压场景不能把所有角色都推成同一种“冷静分析型”。\r\n- `anger_style`、`grievance_style`、`fear_triggers`、`private_self` 必须保持稳定。\r\n\r\n### 6. 人物弧光必须有代价和事件支撑\r\n\r\n- 立场变化、成长、崩塌都应由可见事件推动。\r\n- 当前证据不足时，优先沿用此前更稳定的人格状态。\r\n\r\n## 硬性失败条件\r\n\r\n出现以下任一情况时，应降置信度、重写，或返回 `needs_revision`：\r\n\r\n1. 无证据地违背核心价值观\r\n2. 忽略对当前关系对象的专属态度\r\n3. 说话风格退化为通用 AI 填充语\r\n4. 无依据地把公开人格和私下真实面貌混成一层\r\n5. 角色突然套用了另一个角色的思路或话术\r\n6. 这句话在世界观里似乎合理，但对这个人来说并不合理\r\n\r\n## Act 模式约束\r\n\r\n1. 用户输入的，是受控角色的台词，不是让系统改写成旁白式角色扮演。\r\n2. 响应角色必须以该角色身份回话，而不是以旁白、作者或场景导演身份补戏。\r\n3. 不得把模式切换指令误改写为剧情演示文本。\r\n4. 如果用户台词含混，应保守地继续人物对话，而不是擅自发散出新的剧情分支。\r\n\r\n## Observe 模式约束\r\n\r\n1. 不是每一轮都必须所有角色一起说话。\r\n2. 优先让最相关、最受影响、或被明确点名的角色发言。\r\n3. 当发言会抢戏、违背人设或与当前场景弱相关时，可以允许沉默。\r\n4. 同一轮内不同角色的语气、逻辑和情绪表面必须能区分开。\r\n\r\n## 纠错约束\r\n\r\n1. 优先做最小修正，以恢复人物一致性。\r\n2. 尽量保留原句的沟通意图。\r\n3. 如果 OOC 证据不足，应标记低置信度，而不是过度改写。\r\n4. 一旦某类纠错被确认有效，应允许写入 `MEMORY.md`，作为后续持续约束。\n\nFile v4.1.8:references/output_schema.md\n\n# 输出规范\r\n\r\n## 人物档案\r\n\r\n```md\r\n# PROFILE\r\n<!-- Canonical markdown profile storage. -->\r\n\r\n## Meta\r\n- name: 角色名\r\n- novel_id: sample_novel\r\n- source_path: data/sample_novel.txt\r\n- timeline_stage: 前期 / 中期 / 后期 / 结局 / 未判定\r\n- role_tags: 核心主角；悲剧型；群像核心\r\n\r\n## Basic Positioning\r\n- core_identity: 核心身份与社会定位\r\n- gender: 性别或性别呈现；证据不足时写证据不足\r\n- age_stage: 年龄阶段或年龄感；优先写少年 / 青年 / 中年 / 长者等稳定阶段\r\n- faction_position: 阵营、派系、立场位置\r\n- world_belong: 所属势力 / 地域 / 种族 / 阶层标签\r\n- story_role: 剧情职能定位\r\n- stance_stability: 立场稳定度或摇摆特性\r\n- identity_anchor: 角色如何定义“我是谁、我站在哪边、我凭什么行动”\r\n- world_rule_fit: 人物理念与世界规则的契合度\r\n- rule_view: 对世界核心规则的接受 / 反抗 / 利用态度\r\n- plot_restriction: 原作设定枷锁，如血脉、身份、宿命、制度、种族限制\r\n\r\n## Root Layer\r\n- background_imprint: 出身背景与成长烙印\r\n- life_experience: 关键经历、转折与长期处境\r\n- trauma_scar: 至今仍在起作用的旧伤与精神擦痕\r\n- taboo_topics: 不能触碰的话题\r\n- forbidden_behaviors: 明确不会做或极度排斥的行为\r\n\r\n## Inner Core\r\n- soul_goal: 长期驱动目标\r\n- hidden_desire: 深层执念或隐秘欲望\r\n- core_traits: 性格1；性格2\r\n- temperament_type: 整体气质底色\r\n- values: 勇气=0；智慧=0；善良=0；忠诚=0；野心=0；正义=0；自由=0；责任=0\r\n- worldview: 对世界、秩序、善恶、因果的基本看法\r\n- belief_anchor: 高压时仍会抓住的信念、规矩或精神支柱\r\n- moral_bottom_line: 道德底线与不能跨过的红线\r\n- restraint_threshold: 欲望、情绪、嫉妒、愤怒平时如何克制，何时会失控\r\n\r\n## External Persona\r\n- appearance_feature: 标志性长相、穿着、体态、器物或可识别外观\r\n- habit_action: 无意识小动作、口癖外的小习惯、微行为\r\n- preference_like: 偏好的人、物、食物、作息、环境或氛围\r\n- dislike_hate: 生理性厌恶、本能排斥、长期反感的对象或状态\r\n\r\n## Interest And Resources\r\n- interest_claim: 核心利益诉求，如权、财、地位、自由、传承、安全感\r\n- resource_dependence: 依赖的资源、软肋筹码、容易被拿捏的关键点\r\n- trade_principle: 利益交换底线，以及合作 / 背叛的触发条件\r\n\r\n## Value And Conflict\r\n- inner_conflict: 理念、责任、欲望之间的内在冲突\r\n- self_cognition: 角色如何看待自己，如清醒、自卑、高估、偏执\r\n- private_self: 不轻易示人的柔软面、阴暗面或真实隐藏面\r\n- disguise_switch: 是否存在假面人格、演戏状态，以及何时切换\r\n\r\n## Thinking And Decision\r\n- thinking_style: 理性 / 感性、短视 / 长远、经验驱动 / 直觉驱动等思维偏好\r\n- cognitive_limits: 认知盲区、思维短板、反复犯错的局限\r\n- decision_rules: 条件 -> 反应；固定决策准则\r\n- action_style: 执行方式、推进节奏、惯用手段\r\n- reward_logic: 角色如何判断谁值得回报、谁该惩罚、何时翻脸、何时让步\r\n\r\n## Emotion And Stress\r\n- emotion_model: 日常情绪基调与主要调节方式\r\n- fear_triggers: 恐惧点、雷点、避讳触发项\r\n- stress_response: 高压、绝境、崩溃边缘时的应激人格\r\n- anger_style: 生气时的表达方式\r\n- joy_style: 开心时的表达方式\r\n- grievance_style: 委屈、受压时的表达方式\r\n\r\n## Social Pattern\r\n- social_mode: 社交距离与相处模式\r\n- carry_style: 对陌生人 / 亲友 / 上级 / 下属 / 敌人的分层态度\r\n- others_impression: 他人观感、外界标签、第一印象\r\n- key_bonds: 关键羁绊、宿命联系、关系落点\r\n\r\n## Voice\r\n- speech_style: 说话风格总述\r\n- cadence: 语气节奏\r\n- signature_phrases: 标志性句式、口头禅\r\n- typical_lines: 代表性台词或高辨识表达\r\n- sentence_openers: 常见起句（可选）\r\n- connective_tokens: 常用连接词（可选）\r\n- sentence_endings: 常见收尾方式（可选）\r\n- forbidden_fillers: 禁用口水词、禁用通用助词（可选）\r\n\r\n## Capability\r\n- strengths: 专属优势、能力强项\r\n- weaknesses: 性格短板、能力缺陷、致命弱点\r\n\r\n## Arc\r\n- arc_type: 成长类型，如觉醒、救赎、黑化、麻木、堕落、和解\r\n- arc_blocker: 阻碍人物变化的核心心结\r\n- arc_start: 前段稳定状态\r\n- arc_mid: 中段变化与触发事件\r\n- arc_end: 当前可见终点或结局状态\r\n\r\n## Performance Boundary\r\n- ooc_redline: 绝对不能捏造给该角色的 OOC 行为清单\r\n\r\n## Evidence\r\n- description_count: 1\r\n- dialogue_count: 2\r\n- thought_count: 0\r\n- chunk_count: 1\r\n- evidence_source: 第03回-段落12；第05回-段落03\r\n- contradiction_note: 前期偏克制，后期在特定关系中明显失控，需按时间线区分\r\n```\r\n\r\n规则：\r\n- `core_traits` max 10 unique items\r\n- `typical_lines` max 8 unique items\r\n- `decision_rules` max 8 unique items\r\n- list-like fields use `；` as the separator in markdown scalar lines\r\n- `values` all integers in `[0,10]`\r\n- evidence fields优先存索引、章节、段落编号，不复制大段原文\r\n- `sentence_openers` / `connective_tokens` / `sentence_endings` / `forbidden_fillers` 为可选字段，无稳定证据时留空\r\n- 任意高风险深层字段若证据不足，允许直接写 `证据不足`\r\n- `arc_start` / `arc_mid` / `arc_end` 只有在识别到稳定阶段变化时才量化；证据不足时可保留空值或只写 `trigger_event` / `final_state` 类说明\r\n\r\n### 统一标尺\r\n\r\n- 0 = 完全无 / 极致排斥\r\n- 5 = 中立普通 / 无明显偏向\r\n- 10 = 极致执念 / 完全忠诚 / 彻底坚守\r\n\r\n### 易混字段收紧定义\r\n\r\n- `core_identity`: 只写客观身份与社会定位，例如公子、管家者、宗门继承人；不要把剧情功能或主观宣言塞进来。\r\n- `story_role`: 只写角色在剧情里承担的职能，例如事件推进者、局面维持者、矛盾引爆点；不要重复 `core_identity`。\r\n- `identity_anchor`: 角色如何定义“我是谁、我站在哪边、我凭什么行动”。必须是该角色自己的自我定位，不是团队口号。\r\n- `soul_goal`: 长期驱动力或执念，必须能解释关键选择中反复追求什么，禁止使用“活下去”“赢下来”“保护同伴”这类任何人都适用的空泛目标。\r\n- `background_imprint`: 对当前人格与决策有持续影响的出身、成长、代价与烙印，不得把多人共场景的剧情摘要直接搬过来。\r\n- `trauma_scar`: 不是“悲惨经历简介”，而是至今仍在影响其反应方式的旧伤。\r\n- `temperament_type`: 强调整体气质底色，要能一眼区分人物，不是把 `core_traits` 换词重写。\r\n- `rule_view`: 写人物面对世界规则时是顺从、利用、怀疑、反抗还是借势，而不是重复 `world_rule_fit`。\r\n- `plot_restriction`: 写原作设定层面的束缚，例如身份、制度、血脉、宿命、誓约、种族限制。\r\n- `gender`: 只能依据正文稳定称谓、亲属关系、辈分或明确描写判断；不能按名字印象、二创常识或影视印象脑补。\r\n- `age_stage`: 优先写年龄阶段或年龄感，如少年、青年、中年、长者；除非原文明确，不要硬写具体年龄。\r\n- `appearance_feature`: 只写原文稳定可见的外在标识，不凭空补完影视化细节。\r\n- `habit_action`: 写能在多次互动中观察到的习惯动作，不写一次性动作描写。\r\n- `interest_claim`: 写角色真正在争夺什么、守住什么，而不是泛泛而谈“想变强”。\r\n- `resource_dependence`: 写其依赖、短缺、害怕失去或会被控制的关键资源与筹码。\r\n- `trade_principle`: 写利益交换与合作背叛的底线条件，不与 `reward_logic` 混写。\r\n- `inner_conflict`: 只写内在冲突，不承担自评或隐藏面职能。\r\n- `self_cognition`: 只写角色如何看自己，可与 `others_impression` 形成反差，但两者都必须有证据。\r\n- `private_self`: 保留原字段名用于兼容，语义按“hidden_side”理解，写不对外展示的真实面与隐蔽面。\r\n- `action_style`: 只写怎么做；`decision_rules` 只写为什么选。\r\n- `stress_response`: 必须描述高压、绝境、崩溃边缘时的异常面，而不是重复日常 `action_style`。\r\n- `carry_style`: 写其对不同关系层级的差异化态度，不得用一个“对人冷淡”打包全部对象。\r\n- `ooc_redline`: 只写绝对不能虚构给该角色的行为边界，优先写背叛、失格、自毁、违背设定底线的行为。\r\n\r\n### 原作优先原则\r\n\r\n- 只采信原作正文中的描写、行为、对话、心理活动与明确叙述。\r\n- 拒绝二创、同人、读者脑补、影视改编附会与“合理推测式补全”。\r\n- 无原文支撑时直接写 `证据不足`，不要用常识补完。\r\n\r\n### 人设权重规则\r\n\r\n- 长期稳定性格 > 一时情绪冲动行为\r\n- 核心底色 > 阶段性反常行为\r\n- 童年 / 成长烙印 > 临时环境刺激\r\n- 结论若受时间线影响，必须配合 `timeline_stage` 或 `contradiction_note` 说明\r\n\r\n### 公平蒸馏规则\r\n\r\n- 对反派、灰色人物、失败者一律客观记录其逻辑、创伤、欲望、利益与边界\r\n- 不洗白，不丑化，不做道德审判式总结\r\n\r\n### 多角色蒸馏约束\r\n\r\n- 一次同时蒸馏多名角色时，每个角色必须被当作独立任务处理。\r\n- 必须明确回答“这个角色与同批其他角色最不同的地方是什么”。\r\n- 共享场景优先用于提取 `key_bonds`、关系变化、冲突点与互动节奏，不得直接批量写入多人共同的背景与人格字段。\r\n- 若某字段与其他角色高度雷同且缺少更强证据，应留空或写 `证据不足`，不要用模板话术填满。\r\n\r\n### 推荐字段分组\r\n\r\n为避免录入时重复堆叠同义字段，推荐按以下 14 组理解与填写：\r\n\r\n1. 基础身份定位：`core_identity` / `faction_position` / `world_belong` / `story_role` / `stance_stability` / `identity_anchor`\r\n2. 世界观绑定：`world_rule_fit` / `rule_view` / `plot_restriction`\r\n3. 根源底层：`background_imprint` / `life_experience` / `trauma_scar` / `taboo_topics` / `forbidden_behaviors`\r\n4. 核心精神内核：`soul_goal` / `hidden_desire` / `core_traits` / `temperament_type` / `values` / `worldview` / `belief_anchor` / `moral_bottom_line` / `restraint_threshold`\r\n5. 外在具象人设：`appearance_feature` / `habit_action` / `preference_like` / `dislike_hate`\r\n6. 利益与资源逻辑：`interest_claim` / `resource_dependence` / `trade_principle`\r\n7. 价值与内在矛盾：`inner_conflict` / `self_cognition` / `private_self` / `disguise_switch`\r\n8. 思维与决策：`thinking_style` / `cognitive_limits` / `decision_rules` / `action_style` / `reward_logic`\r\n9. 情绪与应激：`emotion_model` / `fear_triggers` / `stress_response` / `anger_style` / `joy_style` / `grievance_style`\r\n10. 社交模式：`social_mode` / `carry_style` / `others_impression` / `key_bonds`\r\n11. 语言表达：`speech_style` / `cadence` / `signature_phrases` / `typical_lines`\r\n12. 可选语言微特征：`sentence_openers` / `connective_tokens` / `sentence_endings` / `forbidden_fillers`\r\n13. 能力与短板：`strengths` / `weaknesses`\r\n14. 成长与边界：`timeline_stage` / `role_tags` / `arc_type` / `arc_blocker` / `arc_start` / `arc_mid` / `arc_end` / `ooc_redline` / `evidence_source` / `contradiction_note`\r\n\r\n## 人格包文件\r\n\r\n蒸馏过程还可以在以下目录下生成可选人格包：\r\n\r\n```text\r\nruntime/data/characters/<novel_id>/<角色名>/\r\n```\r\n\r\n常见文件：\r\n- `NAVIGATION.generated.md`: generated load order and file intent\r\n- `NAVIGATION.md`: manual override and navigation supplement\r\n- `PROFILE.generated.md`: canonical generated profile\r\n- `PROFILE.md`: manual override profile\r\n- `RELATIONS.generated.md`: generated target-specific relations\r\n- `RELATIONS.md`: manual relation overrides\r\n- `MEMORY.md`: durable memory and user corrections\r\n\r\n可选的聚焦人格文件：\r\n- `SOUL.generated.md`\r\n- `GOALS.generated.md`\r\n- `STYLE.generated.md`\r\n- `TRAUMA.generated.md`\r\n- `IDENTITY.generated.md`\r\n- `BACKGROUND.generated.md`\r\n- `CAPABILITY.generated.md`\r\n- `BONDS.generated.md`\r\n- `CONFLICTS.generated.md`\r\n- `ROLE.generated.md`\r\n\r\n## 关系图谱\r\n\r\n```md\r\n# RELATION_GRAPH\r\n\r\n## 林黛玉_贾宝玉\r\n- trust: 8\r\n- affection: 9\r\n- power_gap: 1\r\n- conflict_point: 表达方式差异\r\n- typical_interaction: 黛玉试探 -> 宝玉安抚 -> 短暂缓和\r\n- hidden_attitude: 表面克制，私下更在意对方是否偏心\r\n- relation_change: 缓慢升温，但受误会反复波动\r\n- appellation_to_target: 宝玉\r\n- confidence: 8\r\n```\r\n\r\n规则：\r\n- relation section title must use sorted key format `<A>_<B>`\r\n- `trust` and `affection` in `[0,10]`\r\n- `power_gap` in `[-5,5]`\r\n- `confidence` in `[0,10]`\r\n- `relation_change` 描述趋势，如升温、恶化、固化、反复波动\r\n- `hidden_attitude` 用于记录表面态度与私下真实态度的落差；无证据时留空\r\n- 关系条目必须基于同场景互动证据\r\n\r\n## 聊天约束（可选）\r\n\r\n```md\r\n# CHAT_CONSTRAINTS\r\n\r\n- character: 林黛玉\r\n- must_follow: 语气克制但可反讽；冲突时先防御再观察\r\n- must_avoid: 无证据的极端背叛表达；与高忠诚价值冲突的抛弃宣言\r\n- fallback_action: rewrite_once_then_needs_revision\r\n```\r\n\r\n## 纠错输出\r\n\r\n```md\r\n# CORRECTION\r\n\r\n- corrected_message: 修正后的台词\r\n- correction_reason: 基于哪些人格字段收紧\r\n- confidence: 7\r\n```\n\nFile v4.1.8:references/safety_policy.md\n\n# 安全策略\r\n\r\n## 执行边界\r\n\r\n- 默认采用本地优先。\r\n- 运行时说明中不应要求强制联网拉取资源。\r\n- 不要求任意 shell 命令执行。\r\n\r\n## 数据安全\r\n\r\n- 不得请求或存储凭证、密钥等敏感信息。\r\n- 示例与输出中尽量避免个人隐私或敏感数据。\r\n- 所有结果都应被限制在用户提供文本证据的范围内。\r\n\r\n## 完整性检查\r\n\r\n- 若证据稀薄，应输出低置信度结果。\r\n- 若不符合 schema 约束，应返回 `needs_revision`。\r\n- 若用户请求存在明显不安全行为，应拒绝并给出安全替代方案。\n\nFile v4.1.8:references/style_differ.md\n\n# 风格差异化指南\r\n\r\n## 用途\r\n\r\n用于在蒸馏、纠错、单聊、群聊生成时降低角色同质化。\r\n\r\n这不是自由发挥式 prompt，而是一份约束参考。它的作用是帮助运行时和辅助 agent 让每个角色在表达层面保持可辨识的差异。\r\n\r\n## 核心原则\r\n\r\n不要只靠“观点不同”来区分角色，而要让角色在以下层面也真正不同：\r\n\r\n1. 说话节奏\r\n2. 用词偏好\r\n3. 情绪外露方式\r\n4. 冲突处理习惯\r\n5. 面对不同关系对象时的语气差异\r\n6. 公开人格与私下真实面貌的落差\r\n\r\n## 差异化维度\r\n\r\n### 1. 句式节奏\r\n\r\n- 短促直接型：句子短，铺垫少，态度出现快\r\n- 层层展开型：先讲前因后果，再落到结论\r\n- 情绪断裂型：句式会被情绪打断，带出波动\r\n- 克制含蓄型：话少，更多靠分寸和停顿表达立场\r\n\r\n### 2. 用词层级\r\n\r\n- 朴素口语\r\n- 雅正克制\r\n- 尖锐刻薄\r\n- 温和委婉\r\n- 清冷疏离\r\n- 戏谑调侃\r\n\r\n不要让所有角色最后都坍缩成同一种“先看看/再说/权衡一下”的安全说法。\r\n\r\n### 3. 情绪表面形态\r\n\r\n- 有的角色情绪来得快，会立刻外放\r\n- 有的角色先压住情绪，只在措辞上收紧\r\n- 有的角色会先反讽、先顶回去\r\n- 有的角色嘴上抱怨，但行动上依然会跟进\r\n\r\n除非有明确弧光证据，否则情绪风格不应频繁漂移。\r\n\r\n### 4. 决策表达顺序\r\n\r\n- 有的角色先说结论\r\n- 有的角色先划边界\r\n- 有的角色先提关系\r\n- 有的角色先谈后果\r\n\r\n思考顺序的外显，本身就是人物声纹的一部分。\r\n\r\n### 5. 关系对象差分\r\n\r\n同一个角色，面对不同对象时应当允许发生稳定变化：\r\n\r\n- 对长辈/上位者\r\n- 对平辈/对手\r\n- 对亲近之人\r\n- 对陌生人\r\n- 对敌对者\r\n\r\n不能把所有对象都压平为同一套万能口吻。\r\n\r\n### 6. 公开人格与私下真实面貌\r\n\r\n- 有的人表面克制，内里强烈\r\n- 有的人表面强势，内里不安\r\n- 有的人表面玩笑，内里认真\r\n\r\n要结合 `private_self`、`social_mode`、`key_bonds` 与关系层，稳定维护这种落差。\r\n\r\n## 防同质化规则\r\n\r\n1. 同一场景中，不要让多个角色复用同一套兜底句式骨架。\r\n2. 不要把所有“冷静型”角色都写成同一种“理性、稳妥、先观察”的声音。\r\n3. 不要把所有冲突都写成直接解释；有的人会回避，有的人会嘲讽，有的人会截断，有的人会压着说。\r\n4. 不要过度使用“先看看”“再作定夺”“还需权衡”这类通用过渡句。\r\n5. 即使两个角色立场相同，他们的理由、表面措辞和情绪手感也应不同。\r\n6. 保留不对称性：有人推进，有人兜底，有人反讽，有人吸收压力。\r\n\r\n## 输出前自检\r\n\r\n在最终输出前，至少检查以下问题：\r\n\r\n1. 去掉角色名之后，这句话是否仍然大致能辨认出是谁说的？\r\n2. 这句话体现的是该角色自己的表达习惯，还是一种泛用叙述者口吻？\r\n3. 如果听话对象换了，这句话是否会随关系发生合理变化？\r\n4. 把这句话放到同场其他角色旁边时，声音是否仍然分得开？\r\n\r\n如果第 2 条或第 4 条答案是否定的，说明这句仍然过于模板化。\n\nFile v4.1.8:references/validation_policy.md\n\n# 校验策略\r\n\r\n## 用途\r\n\r\n通过分层校验，约束蒸馏输出的人设真实性、区分度和可演绎性，减少脑补、同质化和 OOC。\r\n\r\n## 校验层级\r\n\r\n### 1. 证据校验\r\n\r\n- 每个关键结论都必须能对应到至少一条原作正文证据。\r\n- `evidence_source` 优先记录章节、段落、片段索引，不复制大段原文。\r\n- 如果没有直接证据，结论不得写实锤，应留空或写 `证据不足`。\r\n\r\n### 2. 一致性校验\r\n\r\n- 性格特征、决策规则、语言风格不得与 `values`、`belief_anchor`、`moral_bottom_line` 明显冲突。\r\n- `decision_rules` 与 `action_style` 必须区分：前者解释判断逻辑，后者解释执行风格。\r\n- `self_cognition` 与 `others_impression` 可以形成反差，但两者都必须有依据。\r\n- `arc_*`、`timeline_stage`、`contradiction_note` 必须彼此对得上，不能前后混用。\r\n\r\n### 3. 原作优先校验\r\n\r\n- 只采信原作正文中的描写、行为、对话、心理活动与明确叙述。\r\n- 不采信同人、影视改编附会、读者脑补和“合理推测式补全”。\r\n- `appearance_feature`、`plot_restriction`、`ooc_redline` 这类高风险字段必须更加保守。\r\n\r\n### 4. 权重校验\r\n\r\n- 长期稳定性格 > 一时冲动\r\n- 核心底色 > 阶段性反常\r\n- 成长烙印 > 临时环境刺激\r\n- 若角色前后割裂明显，必须通过 `timeline_stage` 或 `contradiction_note` 显式说明\r\n\r\n### 5. 差分校验\r\n\r\n- 多角色同批蒸馏时，`identity_anchor`、`soul_goal`、`temperament_type`、`social_mode`、`reward_logic`、`interest_claim`、`resource_dependence` 不得大面积同质化。\r\n- 共享场景可以复用为关系证据，但不能直接平铺成多人共同的背景和精神内核。\r\n- 如果某条描述轻易能替换到另一角色身上仍成立，应判为泛化过度，需要重写。\r\n\r\n### 6. 公平蒸馏校验\r\n\r\n- 对反派、灰色人物、失败者保持客观，不洗白，不丑化，不道德审判。\r\n- 只记录其逻辑、利益、创伤、欲望、边界与代价。\r\n\r\n## 通过 / 失败规则\r\n\r\n- 通过：证据、一致性、原作优先、权重、差分五层均通过\r\n- 软失败：仅 1 层不通过，需要修正后再输出\r\n- 硬失败：2 层及以上不通过，返回 `needs_revision`\n\nFile v4.1.8:examples/host_workflow_example.md\n\n# Host Workflow Example\r\n\r\nThis example shows one complete host-side flow:\r\n\r\n1. initialize `run_manifest.json`\r\n2. build distill payload\r\n3. choose single-pass or chunked execution\r\n4. call the host LLM and write `PROFILE.generated.md`\r\n5. materialize persona bundles\r\n6. generate / merge the relationship result and export the graph\r\n7. verify workflow completeness\r\n8. hand off to host-driven dialogue\r\n9. optionally ask the packaged scene helper to recommend the next beat during dialogue\r\n\r\n## 1. Initialize The Run\r\n\r\n```bash\r\npython tools/init_host_run.py --novel data/hongloumeng.txt --characters 林黛玉,贾宝玉,薛宝钗 --output runtime/run_manifest.json\r\n```\r\n\r\nHost expectation:\r\n\r\n- `runtime/run_manifest.json` is created\r\n- locked characters are recorded\r\n- progress starts at `characters_locked`\r\n\r\n## 2. Build Distill Payload\r\n\r\n```bash\r\npython tools/build_prompt_payload.py --mode distill --novel data/hongloumeng.txt --characters 林黛玉,贾宝玉,薛宝钗 --output runtime/distill_payload.json --run-manifest runtime/run_manifest.json\r\n```\r\n\r\nHost expectation:\r\n\r\n- `runtime/distill_payload.json` is ready\r\n- the host LLM reads this payload\r\n- `run_manifest.json` records payload paths and status updates\r\n\r\nThe payload now supports two execution shapes:\r\n\r\n- `request.chunk_mode = single`\r\n  - the host can send the whole payload directly to the LLM\r\n- `request.chunk_mode = chunked`\r\n  - the host should iterate `chunks[]`\r\n  - collect each chunk result as a partial draft\r\n  - then execute `merge_payload` once to obtain the final artifact\r\n\r\nUseful fields:\r\n\r\n- `chunks[]`\r\n- `merge_payload`\r\n- `host_plan`\r\n- `meta.chunk_count`\r\n- `meta.merge_required`\r\n\r\n`run_manifest.json` will also expose:\r\n\r\n- `progress.chunking.distill`\r\n- `summary.chunking.distill`\r\n\r\n## 3. Generate Canonical Profiles\r\n\r\n### A. Single-pass path\r\n\r\nIf `request.chunk_mode = single`, the host writes one canonical file per character directly:\r\n\r\n```text\r\nruntime/data/characters/hongloumeng/林黛玉/PROFILE.generated.md\r\nruntime/data/characters/hongloumeng/贾宝玉/PROFILE.generated.md\r\nruntime/data/characters/hongloumeng/薛宝钗/PROFILE.generated.md\r\n```\r\n\r\nRecommended host progress updates during generation:\r\n\r\n```bash\r\npython tools/update_run_progress.py --run-manifest runtime/run_manifest.json --stage character_started --character 林黛玉 --message \"正在蒸馏林黛玉\"\r\npython tools/update_run_progress.py --run-manifest runtime/run_manifest.json --stage character_completed --character 林黛玉 --message \"林黛玉已完成\"\r\n```\r\n\r\nRepeat for each character.\r\n\r\n### B. Chunked path\r\n\r\nIf `request.chunk_mode = chunked`, the host should:\r\n\r\n1. iterate `distill_payload.json -> chunks[]`\r\n2. call the host LLM once per chunk\r\n3. store each partial result\r\n4. place those partial drafts into `merge_payload.request.chunk_drafts`\r\n5. call the host LLM once more with `merge_payload`\r\n6. write the final merged `PROFILE.generated.md`\r\n\r\nChunk progress can also be written back into the manifest:\r\n\r\n```bash\r\npython tools/update_run_progress.py --run-manifest runtime/run_manifest.json --stage chunk_started --message \"正在执行第 1 块\" --chunk-capability distill --chunk-mode chunked --chunk-count 6 --current-chunk 1 --chunk-label 前段-1 --chunk-status running --merge-required --merge-status pending\r\npython tools/update_run_progress.py --run-manifest runtime/run_manifest.json --stage merge_started --message \"正在合并人物草稿\" --chunk-capability distill --chunk-mode chunked --chunk-count 6 --current-chunk 6 --chunk-label 后段-2 --chunk-status complete --merge-required --merge-status running\r\npython tools/update_run_progress.py --run-manifest runtime/run_manifest.json --stage merge_completed --message \"人物草稿已合并\" --chunk-capability distill --chunk-mode chunked --chunk-count 6 --current-chunk 6 --chunk-label 后段-2 --chunk-status complete --merge-required --merge-status complete\r\n```\r\n\r\n## 4. Materialize Persona Bundles\r\n\r\n```bash\r\npython tools/materialize_persona_bundle.py --profile-file runtime/data/characters/hongloumeng/林黛玉/PROFILE.generated.md --run-manifest runtime/run_manifest.json\r\npython tools/materialize_persona_bundle.py --profile-file runtime/data/characters/hongloumeng/贾宝玉/PROFILE.generated.md --run-manifest runtime/run_manifest.json\r\npython tools/materialize_persona_bundle.py --profile-file runtime/data/characters/hongloumeng/薛宝钗/PROFILE.generated.md --run-manifest runtime/run_manifest.json\r\n```\r\n\r\nHost expectation:\r\n\r\n- split persona files appear\r\n- `ARTIFACT_STATUS.generated.json` appears in each character directory\r\n- `run_manifest.json` records each character directory\r\n\r\n## 5. Generate Relation Result And Export Graph\r\n\r\nThe relation payload follows the same rule:\r\n\r\n- `single`: generate the final relation markdown directly\r\n- `chunked`: run `chunks[]`, collect partial relation drafts, then execute `merge_payload`\r\n\r\nAfter the final merged relationship markdown exists, the host writes:\r\n\r\n```text\r\nruntime/data/relations/hongloumeng_relations.md\r\n```\r\n\r\nThen export the graph:\r\n\r\n```bash\r\npython tools/export_relation_graph.py --relations-file runtime/data/relations/hongloumeng_relations.md --run-manifest runtime/run_manifest.json\r\n```\r\n\r\nHost expectation:\r\n\r\n- `*_relations.html`\r\n- `*_relations.svg`\r\n- `*_relations.mermaid.md`\r\n- graph status JSON\r\n- `run_manifest.json -> progress.chunking.relation` if the host reports chunk progress\r\n\r\n## 6. Verify Workflow\r\n\r\n```bash\r\npython tools/verify_host_workflow.py --characters-root runtime/data/characters/hongloumeng --relations-file runtime/data/relations/hongloumeng_relations.md --run-manifest runtime/run_manifest.json\r\n```\r\n\r\nHost expectation:\r\n\r\n- workflow verification JSON is written\r\n- `run_manifest.json` ends in a complete state\r\n\r\n## 7. Hand Off To Dialogue\r\n\r\nAt this point, the host already has everything needed to enter `act`, `insert`, or `observe`:\r\n\r\n- character directories\r\n- `PROFILE.md`\r\n- split persona files\r\n- `MEMORY.md`\r\n- relation markdown\r\n- graph HTML / SVG\r\n- `run_manifest.json`\r\n\r\nThe host now drives the dialogue directly with its own LLM.\r\n\r\nIf the host wants packaged help choosing the next beat for the current session, it can also call:\r\n\r\n```bash\r\npython tools/build_scene_recommendation_payload.py --context-file runtime/scene_recommendation_context.json --output runtime/scene_recommendation_bundle.json\r\n```\r\n\r\nYou can bootstrap that context shape from:\r\n\r\n- `examples/scene_recommendation_context.example.json`\r\n\r\nThe host can then:\r\n\r\n- apply `payload.recommended_card_id`\r\n- surface `payload.recommended_transition_message`\r\n- feed `payload.recommended_auto_continue_message` back into its dialogue engine to auto-open the next beat immediately\r\n\r\n## Recommended UI / Agent Surfacing\r\n\r\nAfter the workflow completes, a host can safely surface:\r\n\r\n- character directories\r\n- relationship graph HTML / SVG\r\n- workflow summary from `run_manifest.json`\r\n- a clear invitation to enter `act`, `insert`, or `observe`\r\n\r\nFor long novels, the host can also surface:\r\n\r\n- total distill chunks\r\n- current chunk number\r\n- whether merge is pending / running / complete\r\n- total relation chunks\r\n\r\n## Cross References\r\n\r\n- `references/capability_index.md`\r\n- `references/chat_contract.md`\n\nFile v4.1.8:examples/sample_character_profile.md\n\n# PROFILE\r\n<!-- Canonical markdown profile storage. -->\r\n\r\n## Meta\r\n- name: 林黛玉\r\n- novel_id: sample_novel\r\n- source_path: data/sample_novel.txt\r\n- timeline_stage: 前期\r\n- role_tags: 核心主角；悲剧型；群像核心\r\n\r\n## Basic Positioning\r\n- core_identity: 才情出众、情思纤细、寄人篱下而自我防御极强的核心人物\r\n- faction_position: 贾府内的亲眷晚辈，情感与日常交往深受贾府秩序影响\r\n- world_belong: 贾府内院；仕宦门第；闺阁女性\r\n- story_role: 以情感锋芒和精神敏感度推动人物关系张力的核心角色\r\n- stance_stability: 在情感判断上并不轻易动摇，但会因受伤而暂时收紧态度\r\n- identity_anchor: 寄居贾府、才情敏锐而自尊极强的闺秀\r\n- world_rule_fit: 能适应诗礼闺阁秩序，却与人情世故、圆融应酬始终隔着一层\r\n- rule_view: 表面遵守闺阁礼法，内里对虚饰人情始终保持警惕与抗拒\r\n- plot_restriction: 寄居身份、体弱多病与封建门第秩序共同限制了她的行动空间与命运选择\r\n\r\n## Root Layer\r\n- background_imprint: 自幼体弱多病，又失怙失恃，长期寄居环境塑造了敏感与自尊并存的性格底色\r\n- life_experience: 幼失双亲；长期寄居；在诗社与闺阁往来中反复体会亲疏冷暖\r\n- trauma_scar: 寄居与失亲留下的旧伤仍在，被轻慢或被比较时会立刻牵动防御与不安\r\n- taboo_topics: 被轻贱寄居身份；被当众比较高下；真心被说成矫情\r\n- forbidden_behaviors: 不会毫无顾忌地向所有人示弱；不会把真情轻易说成儿戏\r\n\r\n## Inner Core\r\n- soul_goal: 守住自尊与真情，不肯把真心轻易交付给轻慢之人\r\n- hidden_desire: 渴望被真正理解、被坚定偏爱，而不是被礼貌安置\r\n- core_traits: 敏感；聪慧；自尊\r\n- temperament_type: 高敏感、外冷内热型\r\n- values: 勇气=6；智慧=8；善良=7；忠诚=8；野心=3；正义=6；自由=7；责任=6\r\n- worldview: 真情可贵，却最怕人心轻薄；很多话须先试其真，再肯信\r\n- belief_anchor: 真情不可欺，自尊不可轻贱\r\n- moral_bottom_line: 可以受委屈，但不能接受真心被践踏、无辜者被拿来铺垫人情场面\r\n- restraint_threshold: 平时极能克制，唯独自尊与真心同时被踩时会明显失控\r\n\r\n## External Persona\r\n- appearance_feature: 体态轻弱；气质清冷；多带病容与书卷气\r\n- habit_action: 情绪受触动时会先别开话锋，或以反话试探对方心意\r\n- preference_like: 偏爱真诚相待；偏爱诗社清谈与相对安静的相处氛围\r\n- dislike_hate: 厌恶敷衍安慰；厌恶被摆到比较秤上；厌恶虚假圆融\r\n\r\n## Interest And Resources\r\n- interest_claim: 真情中的确定偏爱；被平等看待的尊严；在贾府中的情感安全感\r\n- resource_dependence: 依赖宝玉等少数真心者的情感确认；也受寄居身份与身体状况制约\r\n- trade_principle: 可以让步礼数，不会拿真心做交换；一旦察觉对方虚情假意，就会迅速收回信任\r\n\r\n## Value And Conflict\r\n- inner_conflict: 一面极重真情，一面又因自尊与不安而先行防御\r\n- self_cognition: 很清楚自己敏感、多心、爱较真，也知道这种敏锐既护住了自尊，也加重了痛感\r\n- private_self: 独处时更柔软，也更容易被愁绪与不安牵动\r\n- disguise_switch: 在人前多以克制和锋芒自护；真正受伤时会用反讽与冷淡遮住脆弱\r\n\r\n## Thinking And Decision\r\n- thinking_style: 先感受对方态度，再以敏锐观察和自我防卫判断进退\r\n- cognitive_limits: 容易在情绪受伤时放大言外之意，对他人迟钝和回避不够宽容\r\n- decision_rules: 感到被轻视->先反讽防御，再观察对方诚意；察觉真心未变->语气会稍松，却不肯立刻认输；触及自尊痛点->宁可收起真意，也不愿低头讨怜\r\n- action_style: 先以言语试探与防御，确认真心后才稍稍放下锋芒\r\n- reward_logic: 对真心者会记情回护，对轻慢与敷衍则格外记得\r\n\r\n## Emotion And Stress\r\n- emotion_model: 日常情绪偏内敛，习惯先收住痛意，再以细微措辞表达立场\r\n- fear_triggers: 被冷落；被拿来比较；真心被敷衍；寄居身份被戳破\r\n- stress_response: 压力越大越会把语气压轻，表面更冷，防御性反讽和试探会明显增加\r\n- anger_style: 生气时不一定高声，更多是冷下来、话里带刺\r\n- joy_style: 真高兴时也多半收着，只在语气和诗意里透出轻快\r\n- grievance_style: 受委屈时先自护，往往借反话和旁刺把痛意藏住\r\n\r\n## Social Pattern\r\n- social_mode: 对陌生人与轻慢者防备明显，对认定之人则会在试探后显露真心\r\n- carry_style: 对陌生人克制疏离；对亲近之人敏感而在意；对长辈守礼但不轻易交心；对轻慢者会以锋芒自护\r\n- others_impression: 外人初见多半觉得她清冷、聪敏、难近，熟识后才知道她其实极重真情\r\n- key_bonds: 与贾宝玉之间的真情牵绊；与薛宝钗之间复杂而微妙的比较关系\r\n\r\n## Voice\r\n- speech_style: 言辞锋利但情绪克制，常带反讽，轻易不把软处全露出来。\r\n- cadence: 起句克制，中段容易带出暗刺，真正受伤时语尾反而更轻\r\n- signature_phrases: 原是；何必；倒像是；你最会；我原不该\r\n- typical_lines: 你最会哄人；我原不该多心，只是听着未免叫人难受；你若真明白我，便不会只拿空话来宽我\r\n- sentence_openers: 我原不该；你倒；何必；原是\r\n- connective_tokens: 只是；不过；倒；偏\r\n- sentence_endings: 罢了；也就是了；倒也未必\r\n- forbidden_fillers: 哈哈；好吧；确实；呢；呀\r\n\r\n## Capability\r\n- strengths: 诗才敏捷；观察细密；情感辨识力强\r\n- weaknesses: 多思易伤；防御心重；体弱多病\r\n\r\n## Arc\r\n- arc_type: 悲剧性觉醒\r\n- arc_blocker: 自尊与寄居处境让她难以在受伤时主动求证与示弱\r\n- arc_start: 勇气=5；信任=4；以克制和试探维持关系安全\r\n- arc_mid: 勇气=6；trigger_event=争执与和解；逐步显露对真情的更高需求\r\n- arc_end: 勇气=7；final_state=更愿意表达真实需求，但仍保留自尊防线\r\n\r\n## Performance Boundary\r\n- ooc_redline: 无证据时绝不会写成豪爽直白、毫无防备地示爱；不会把受伤反应改写成完全无所谓；不会轻易认可虚假人情\r\n\r\n## Evidence\r\n- description_count: 1\r\n- dialogue_count: 2\r\n- thought_count: 0\r\n- chunk_count: 1\r\n- evidence_source: 第03回-段落12；第05回-段落03\r\n- contradiction_note: 前期更偏克制试探，随着关系受损与误会累积，特定对象面前的情绪外露会更明显\n\nArchive v4.1.5: 41 files, 999235 bytes\n\nFiles: .metadata.json (598b), assets/vendor/mermaid-11.14.0.min.js (3164970b), examples/chat_result_single_turn.example.json (698b), examples/chat_session_summary.example.json (964b), examples/chat_status_complete.example.json (420b), examples/host_workflow_example.md (6410b), examples/sample_character_profile.md (6645b), examples/sample_input_excerpt.txt (224b), examples/sample_relations.md (764b), examples/test-prompts.json (1398b), INSTALL.md (2107b), MANIFEST.md (1188b), prompts/correction_prompt.md (2454b), prompts/distill_prompt.md (7080b), prompts/relation_prompt.md (2206b), PUBLISH.md (4209b), README_EN.md (9535b), README.md (9457b), references/capability_index.md (4307b), references/chat_contract.md (2649b), references/logic_constraint.md (3188b), references/output_schema.md (12762b), references/safety_policy.md (593b), references/style_differ.md (3193b), references/validation_policy.md (2263b), requirements.txt (307b), SKILL.md (8551b), tools/_skill_support/__init__.py (1339b), tools/_skill_support/novel_preparation.py (22518b), tools/_skill_support/persona_bundle.py (38946b), tools/_skill_support/prompt_payloads.py (27067b), tools/_skill_support/relation_graph_export.py (47052b), tools/_skill_support/workflow_completion.py (17631b), tools/build_prompt_payload.py (8987b), tools/export_relation_graph.py (1720b), tools/init_host_run.py (1284b), tools/materialize_persona_bundle.py (4273b), tools/prepare_novel_excerpt.py (5260b), tools/update_run_progress.py (3103b), tools/verify_host_workflow.py (4351b), _meta.json (132b)\n\nFile v4.1.5:SKILL.md\n\n---\nname: zaomeng-skill\ndescription: 面向中文小说人物蒸馏、关系抽取、关系图谱和角色对话的 ClawHub skill\n---\n\n# zaomeng-skill\n\n| 项目 | 内容 |\n| --- | --- |\n| 名称 | `zaomeng-skill` |\n| 版本 | `4.1.5` |\n| 类型 | ClawHub / Host-managed skill |\n| 核心模式 | LLM-first |\n| 适用场景 | 人物蒸馏、人物包物化、关系图谱导出、角色 `act` / `insert` / `observe` |\n| 宿主职责 | 调用宿主 LLM，负责最终生成与对话推进 |\n| skill 职责 | 准备 prompt payload、物化人物包、导出图谱、校验产物、维护运行状态 |\n\n## 1. 定位\n\n- 这是一个宿主驱动的 prompt-first skill。\n- 宿主负责实际调用 LLM；skill 负责把任务整理成标准输入、标准产物和标准状态。\n- skill 的主路径是 `prompts + helper tools + run_manifest.json`，不是内嵌 chat CLI。\n\n## 2. 宿主能力契约\n\n宿主侧只需要理解四个标准能力：\n\n| 能力 | 入口 | 作用 | 标准成功标记 |\n| --- | --- | --- | --- |\n| `distill` | `tools/build_prompt_payload.py --mode distill` | 生成蒸馏 payload，等待宿主 LLM 产出 `PROFILE.generated.md` | capability status `status=ready, success=true` |\n| `materialize` | `tools/materialize_persona_bundle.py` | 把 `PROFILE.generated.md` 物化为完整人物包 | `ARTIFACT_STATUS.generated.json` + capability status |\n| `export_graph` | `tools/export_relation_graph.py` | 导出人物关系图谱 HTML / Mermaid / SVG | `<relations>.status.json` + capability status |\n| `verify_workflow` | `tools/verify_host_workflow.py` | 校验整条宿主工作流产物是否完整 | capability status `status=complete, success=true` |\n\n所有能力都应该满足：\n\n- 有明确输入\n- 有 JSON 输出\n- 有 sidecar status 文件\n- 有 `success` 布尔值\n- 可选更新 `run_manifest.json`\n\n能力总览集中定义在：\n\n- `references/capability_index.md`\n- `examples/host_workflow_example.md`\n\n`distill` 默认支持增量蒸馏：\n\n- 如果 `data/characters/<novel_id>/<角色名>/` 已存在人物包，`tools/build_prompt_payload.py --mode distill` 会自动把已有档案并入 `request.existing_profiles`\n- `request.update_mode` 会自动落成 `incremental`\n- `run_manifest.json` 的 `artifacts.distill_context` 会记录本次是 `create` 还是 `incremental`，以及命中的已有角色数量\n\n`distill` 与 `relation` 现在也默认支持长篇自动分批：\n\n- 小文本保持单次 payload，不改变既有调用方式\n- 当 excerpt 过长时，payload 会额外给出 `chunks[]`\n- 宿主按 `chunks[]` 顺序调用 LLM，收集每块局部草稿\n- 然后再按 `merge_payload` 做一次合并，得到最终 `PROFILE.generated.md` 或 `RELATION_GRAPH`\n- `request.chunk_mode`、`meta.chunk_count`、`meta.merge_required` 会明确告诉宿主当前是否处于分批模式\n\n## 3. 标准运行状态\n\n宿主如果要跑完整蒸馏链路，先初始化一个 `run_manifest.json`：\n\n```bash\npython tools/init_host_run.py --novel <路径> --characters A,B,C --output <run_manifest.json>\n```\n\n`run_manifest.json` 是宿主侧的统一索引，记录：\n\n- 当前阶段\n- 已锁定角色\n- 当前正在处理的角色\n- 已完成数量\n- 关系图导出状态\n- 各能力 status 文件\n- 人物目录\n- 关系图 HTML / SVG / Mermaid 路径\n- 最终 workflow 校验结果\n- 增量蒸馏上下文（`update_mode`、已有档案数量、已有档案目录）\n- 分批执行概览（`progress.chunking`、`summary.chunking`）\n\n## 4. 标准进度阶段\n\n宿主侧统一使用这些阶段名：\n\n- `characters_locked`\n- `distill_payload_ready`\n- `relation_payload_ready`\n- `chunk_started`\n- `chunk_completed`\n- `merge_started`\n- `merge_completed`\n- `character_started`\n- `character_completed`\n- `graph_export_started`\n- `graph_export_completed`\n- `workflow_verified`\n\n如果宿主要主动播报当前角色和进度，直接调用：\n\n```bash\npython tools/update_run_progress.py --run-manifest <run_manifest.json> --stage character_started --character 林黛玉 --message \"正在蒸馏林黛玉\"\n```\n\n如果是长篇自动分批流程，也可以写入当前块进度：\n\n```bash\npython tools/update_run_progress.py --run-manifest <run_manifest.json> --stage chunk_started --message \"正在执行第 1 块\" --chunk-capability distill --chunk-mode chunked --chunk-count 6 --current-chunk 1 --chunk-label 前段-1 --chunk-status running --merge-required --merge-status pending\n```\n\n写入后，宿主可直接从 `run_manifest.json` 读取：\n\n- `progress.chunking.distill.current_chunk`\n- `progress.chunking.distill.chunk_count`\n- `progress.chunking.distill.current_label`\n- `summary.chunking.distill`\n\n## 5. 标准流程\n\n1. 初始化 `run_manifest.json`\n2. 运行 `distill` 能力，生成蒸馏 payload\n3. 如果 payload 含 `chunks[]`，宿主先逐块生成局部草稿，再执行 `merge_payload`\n4. 否则直接为每个角色生成 `PROFILE.generated.md`\n5. 每个角色生成后立刻运行 `materialize`\n6. 如果 relation payload 含 `chunks[]`，也先逐块抽取，再执行 `merge_payload`\n7. 宿主 LLM 生成关系结果后运行 `export_graph`\n8. 运行 `verify_workflow`\n9. 宿主向用户展示：\n   - 人物目录\n   - 关系图 HTML / SVG\n   - 状态摘要\n   - 可进入 `act` / `insert` / `observe`\n\n## 6. 推荐宿主串联方式\n\n### A. 初始化运行\n\n```bash\npython tools/init_host_run.py --novel <路径> --characters A,B --output <run_manifest.json>\n```\n\n### B. 准备 distill payload\n\n```bash\npython tools/build_prompt_payload.py --mode distill --novel <路径> --characters A,B --output <distill_payload.json> --run-manifest <run_manifest.json>\n```\n\n如果小说较长，输出 JSON 会自动包含：\n\n- `chunks[]`：每一块都已经是可直接交给宿主 LLM 的局部 payload\n- `merge_payload`：宿主把所有 chunk 草稿结果塞回 `request.chunk_drafts` 后，再调用一次用于最终合并\n- `host_plan`：宿主串联建议，包括 `single_pass` 或 `sequential_chunks_then_merge`\n\n如果宿主要显式指定已有角色目录，或强制切换创建 / 增量模式，可加：\n\n```bash\npython tools/build_prompt_payload.py --mode distill --novel <路径> --characters A,B --characters-root <data/characters 或 data/characters/<novel_id>> --update-mode auto|create|incremental --output <distill_payload.json> --run-manifest <run_manifest.json>\n```\n\n### C. 角色开始 / 完成进度\n\n```bash\npython tools/update_run_progress.py --run-manifest <run_manifest.json> --stage character_started --character A\npython tools/update_run_progress.py --run-manifest <run_manifest.json> --stage character_completed --character A\n```\n\n### D. 物化人物包\n\n```bash\npython tools/materialize_persona_bundle.py --profile-file <character-dir/PROFILE.generated.md> --run-manifest <run_manifest.json>\n```\n\n### E. 导出关系图谱\n\n```bash\npython tools/export_relation_graph.py --relations-file <relations.md> --run-manifest <run_manifest.json>\n```\n\n### F. 校验工作流\n\n```bash\npython tools/verify_host_workflow.py --characters-root <characters/<novel_id>> --relations-file <relations.md> --run-manifest <run_manifest.json>\n```\n\n## 7. 最终产物\n\n完整 run 结束后，宿主应该直接拿到：\n\n- `run_manifest.json`\n- 每个角色的人物目录\n- distill 增量上下文：\n  - `artifacts.distill_context.update_mode`\n  - `artifacts.distill_context.existing_character_count`\n  - `artifacts.distill_context.existing_profile_paths`\n- 每个角色的 `ARTIFACT_STATUS.generated.json`\n- 关系图：\n  - `*_relations.html`\n  - `*_relations.svg`\n  - `*_relations.mermaid.md`\n  - `*.status.json`\n- workflow 校验 JSON\n\n## 8. 对话接管\n\n当人物包和关系图准备完成后，宿主即可进入：\n\n- `act`：指定角色代入发言，既可单聊，也可直接参与多人群聊\n- `insert`：用户以“自己”的身份进入小说场景，角色按人设与场景身份回应用户；首次进入应建立轻量身份卡\n- `observe`：进入群聊模式，但用户不代入具体角色，只观察多角色对话推进\n\n这里的对话由宿主直接驱动，skill 不提供单独的 `chat` CLI 能力。宿主应直接使用：\n\n- 人物包目录\n- `PROFILE.md` / 拆分人格文件 / `MEMORY.md`\n- 关系图谱及关系 markdown\n- `run_manifest.json`\n- `references/output_schema.md`、`references/style_differ.md`、`references/logic_constraint.md`\n\n宿主结束提示建议直接说清楚：\n\n- 人物档案已完成\n- 关系图谱已生成\n- 可以查看图谱\n- 可以进入 `act`\n- 可以进入 `insert`\n- 可以进入 `observe`\n\nFile v4.1.5:README.md\n\n# zaomeng-skill\n\n`zaomeng-skill` 是一个面向中文小说人物蒸馏、关系抽取、关系图谱和角色对话的 skill。\n\n它的工作方式很直接：\n\n- 读取小说内容\n- 准备 excerpt、prompt 和 references\n- 交给宿主 LLM 生成蒸馏结果、关系结果和角色回复\n- 将 canonical profile 继续物化为完整人物包\n\n这个 skill 默认运行在宿主环境中，宿主负责实际调用模型；包内 Python helper 依赖写在 `requirements.txt`。\n\n## 概览\n\n| 项目 | 内容 |\n| --- | --- |\n| 名称 | `zaomeng-skill` |\n| 版本 | `4.1.5` |\n| 模式 | LLM-first |\n| 适用宿主 | OpenClaw、ClawHub、Hermes、其他 host-managed agent |\n| 核心能力 | 人物蒸馏、关系抽取、关系图谱、宿主驱动角色对话 |\n| 许可证 | `MIT-0` |\n\n## 版本说明\n\n- `4.1.5`：同步当前 skill 包版本元数据与中英文文档，补齐发布说明，确保打包与示例版本号一致。\n- `4.1.4`：整理 skill 打包产物，确保从 `zaomeng-skill/` 目录生成的 `zaomeng-<version>.skill.zip` 不混入缓存目录，同时收紧 stdout 输出格式，降低 Windows CI 与编码环境下的打包风险。\n\n## 它能做什么\n\n### 1. 蒸馏人物\n\n从小说原文中提取人物档案，并尽量覆盖完整的人设层次，例如：\n\n- 核心身份\n- 核心动机\n- 性格基底\n- 行为逻辑\n- 人物弧光\n- 关键羁绊\n- 语言表达特质\n- 价值取舍体系\n- 深层执念与隐秘欲望\n- 私下真实面貌\n\n### 2. 抽取关系\n\n从同框互动中提取两两关系，并输出人物关系图谱，包括：\n\n- 关系结果 markdown\n- Mermaid 源码\n- HTML 可视化图谱\n- SVG 图谱\n\n### 3. 进入角色聊天\n\n支持三种玩法：\n\n- `act`\n  你扮演一个角色说话，可以是一对一，也可以直接加入多人群聊\n- `insert`\n  你以“你自己”的身份进入小说场景，不扮演书中角色，而是直接和他们互动\n- `observe`\n  让多个角色围绕一个场景、话题或开场白进行互动\n\n这些对话由宿主直接驱动。`zaomeng-skill` 提供人物包、关系图谱、prompt 约束和运行状态，不再把内嵌 `chat CLI` 当作主路径能力。\n\n### 4. 保存纠错\n\n如果某句明显 OOC，可以把纠错写回记忆，后续对话继续沿用。\n\n## 工作流\n\n### 标准流程\n\n1. 提供小说文件或正文\n2. 生成按角色聚焦的 excerpt\n3. 生成 distill 或 relation prompt payload\n4. 交给宿主 LLM 完成生成\n5. 若宿主落盘了 `PROFILE.generated.md`，继续物化完整人物包\n6. 导出关系图谱\n7. 再进入 `act`、`insert` 或 `observe`\n\n多角色蒸馏时，不应只截取小说开头。应传入 `--characters`，让 excerpt 围绕目标角色的实际出场窗口抽取，尤其适用于角色分散出现在不同章节的长篇文本。\n\n### 增量蒸馏\n\n如果同一本小说下已经存在角色人物包，这个 skill 会在构建 distill payload 时自动复用已有档案，把本次蒸馏视为增量更新：\n\n- 自动检测 `data/characters/<novel_id>/<角色名>/`\n- 把已有 `PROFILE`、拆分人格文件和 `MEMORY` 合并到 `request.existing_profiles`\n- 将 `request.update_mode` 标记为 `incremental`\n- 把增量上下文写入 `run_manifest.json -> artifacts.distill_context`\n\n此外，distill payload 现在会额外给出 `request.excerpt_focus`，包含：\n\n- `requested_characters`\n- `matched_characters`\n- `missing_characters`\n- `strategy`\n\n宿主可以据此判断：这次 excerpt 是否真的覆盖了请求角色，是否有角色根本没在文本里命中。\n\n### 长篇自动分批\n\n当 excerpt 过长时，这个 skill 不再只给宿主一个“大而全”的单次 payload，而是会自动切换为分批模式：\n\n- `request.chunk_mode = chunked`\n- `meta.chunk_count` 标明总块数\n- `meta.merge_required = true`\n- `chunks[]` 给出每一块可直接调用宿主 LLM 的局部 payload\n- `merge_payload` 给出最终合并局部草稿的模板 payload\n\n也就是说，宿主拿到结果后可以这样跑：\n\n1. 先判断是不是 `chunked`\n2. 如果是，就按 `chunks[]` 顺序逐块生成局部草稿\n3. 把每块草稿塞回 `merge_payload.request.chunk_drafts`\n4. 再执行一次 merge，得到最终 `PROFILE.generated.md` 或最终 `RELATION_GRAPH`\n\n短文本仍然保持旧的单次流程，不会被额外复杂化。\n\n### Distill Post-Process\n\n宿主 LLM 写出 `PROFILE.generated.md` 后，不要停在单文件状态。  \n应立即执行 `tools/materialize_persona_bundle.py`，把 canonical profile 物化成完整人物包，补齐：\n\n- `SOUL.generated.md`\n- `GOALS.generated.md`\n- `STYLE.generated.md`\n- `TRAUMA.generated.md`\n- `IDENTITY.generated.md`\n- `BACKGROUND.generated.md`\n- `CAPABILITY.generated.md`\n- `BONDS.generated.md`\n- `CONFLICTS.generated.md`\n- `ROLE.generated.md`\n- `AGENTS.generated.md`\n- `MEMORY.generated.md`\n- `NAVIGATION.generated.md`\n\n### 对话接管\n\n蒸馏和图谱完成后，宿主直接进入对话阶段即可。推荐宿主读取：\n\n- 人物目录下的 `PROFILE.md`\n- 拆分人格文件，如 `SOUL.md`、`GOALS.md`、`STYLE.md`\n- `MEMORY.md`\n- 关系结果 markdown\n- 关系图 HTML / SVG\n- `run_manifest.json`\n\n宿主进入对话后，按模式解释即可：\n\n- `act`：用户代入某个角色发言\n- `insert`：用户以自己身份进入场景\n- `observe`：用户只观察角色推进群聊\n\n## 安装方式\n\n### OpenClaw\n\n```bash\nopenclaw skills install wkbin/zaomeng-skill\n```\n\n### ClawHub\n\n```bash\nnpx clawhub@latest install zaomeng-skill\npnpm dlx clawhub@latest install zaomeng-skill\nbunx clawhub@latest install zaomeng-skill\n```\n\n### 本地 skill 目录安装\n\n```bash\npython scripts/install_skill.py --skills-dir <your-skills-root>\n```\n\n## Helper Commands\n\n```bash\npython tools/init_host_run.py --novel <路径> --characters A,B --output <run_manifest.json>\npython tools/prepare_novel_excerpt.py --novel <路径> [--characters A,B] [--max-sentences 120] [--max-chars 50000]\npython tools/build_prompt_payload.py --mode distill|relation --novel <路径> [--characters A,B] [--characters-root <data/characters 或 data/characters/<novel_id>>] [--update-mode auto|create|incremental]\npython tools/materialize_persona_bundle.py --profile-file <角色目录/PROFILE.generated.md>\npython tools/export_relation_graph.py --relations-file <关系结果.md>\npython tools/verify_host_workflow.py --characters-root <characters/<novel_id>> [--relations-file <关系结果.md>]\n```\n\n```bash\npython tools/prepare_novel_excerpt.py --novel 十日终焉.txt --characters 齐夏,肖冉,章晨泽 --max-chars 50000\n```\n\n如果输出 JSON 中出现了 `chunks` 和 `merge_payload`，就说明这次已经进入长篇自动分批模式。\n\n如果宿主希望把执行进度写进 `run_manifest.json`，还可以继续调用：\n\n```bash\npython tools/update_run_progress.py --run-manifest <run_manifest.json> --stage chunk_started --message \"正在执行第 1 块\" --chunk-capability distill --chunk-mode chunked --chunk-count 6 --current-chunk 1 --chunk-label 前段-1 --chunk-status running --merge-required --merge-status pending\n```\n\n这样 manifest 里会有：\n\n- `progress.chunking`\n- `summary.chunking`\n\n## 推荐使用方式\n\n正确顺序不是一上来就群聊。  \n**先给小说，再蒸馏人物，蒸馏完成后再进入聊天。**\n\n最常见的路径是：\n\n1. 提供小说文件或路径\n2. 指定要蒸馏的角色\n3. 宿主分阶段播报蒸馏进度和图谱生成进度\n4. 查看人物档案或关系图谱\n5. 进入 `act`、`insert` 或 `observe`\n\n## 示例\n\n### 蒸馏\n\n```text\n帮我蒸馏林黛玉和贾宝玉\n```\n\n```text\n请从这本小说里提取刘备、张飞、关羽的人设\n```\n\n### 进入 act\n\n```text\n让我扮演贾宝玉和林黛玉聊天\n```\n\n```text\n我来扮演宝玉，你让黛玉回我\n```\n\n### 进入 observe\n\n```text\n进入刘备、张飞、关羽群聊模式\n```\n\n```text\n请让大家围绕联合孙权这件事各说一句\n```\n\n### 进入 insert\n\n```text\n让我以我自己进入红楼梦，和林黛玉、贾宝玉聊天\n```\n\n```text\n把我放进三国场景里，我想以初来军中的新客身份和刘备他们说话\n```\n\n## 人物包结构\n\n人物档案目录通常如下：\n\n```text\nruntime/data/characters/<novel_id>/<角色名>/\n```\n\n常见文件：\n\n- `PROFILE.generated.md`\n- `PROFILE.md`\n- `NAVIGATION.generated.md`\n- `NAVIGATION.md`\n- `MEMORY.generated.md`\n- `MEMORY.md`\n\n按证据充分程度，还可能生成拆分人格文件：\n\n- `SOUL.generated.md`\n- `GOALS.generated.md`\n- `STYLE.generated.md`\n- `TRAUMA.generated.md`\n- `IDENTITY.generated.md`\n- `BACKGROUND.generated.md`\n- `CAPABILITY.generated.md`\n- `BONDS.generated.md`\n- `CONFLICTS.generated.md`\n- `ROLE.generated.md`\n\n## 约束文件\n\n- `references/output_schema.md`\n  负责输出格式与字段定义\n- `references/style_differ.md`\n  负责反同质化与风格差异化\n- `references/logic_constraint.md`\n  负责人设底线与防 OOC\n- `references/validation_policy.md`\n  负责输出自检和校验规则\n- `references/capability_index.md`\n  负责 `distill`、`materialize`、`export_graph`、`verify_workflow` 的能力索引\n- `references/chat_contract.md`\n  负责说明宿主如何接管 `act` / `insert` / `observe` 对话阶段\n\n## 发布内容\n\n建议一并发布这些文件：\n\n- `README.md`\n- `README_EN.md`\n- `.metadata.json`\n- `SKILL.md`\n- `INSTALL.md`\n- `MANIFEST.md`\n- `PUBLISH.md`\n- `requirements.txt`\n- `prompts/`\n- `references/`\n- `tools/`\n\n## License\n\n`MIT-0`\n\nFile v4.1.5:_meta.json\n\n{\n  \"ownerId\": \"kn7fgefcp561ypgde2wm8xgfeh82mtx9\",\n  \"slug\": \"zaomeng-skill\",\n  \"version\": \"4.1.5\",\n  \"publishedAt\": 1778226416233\n}\n\nFile v4.1.5:references/capability_index.md\n\n# Capability Index\n\n## Purpose\n\nThis document is the host-side index for the standard `zaomeng` capabilities.\n\nUse it as the first stop when the host needs to answer:\n\n- which helper should I call\n- what files should I expect\n- how do I know whether this capability succeeded\n\n## Capability List\n\n| Capability | Entry | Primary Output | Success Marker |\n| --- | --- | --- | --- |\n| `distill` | `tools/build_prompt_payload.py --mode distill` | distill payload JSON | capability status with `status=ready` and `success=true` |\n| `materialize` | `tools/materialize_persona_bundle.py` | persona bundle files | `ARTIFACT_STATUS.generated.json` plus capability status |\n| `export_graph` | `tools/export_relation_graph.py` | relationship graph HTML / SVG / Mermaid | graph `.status.json` plus capability status |\n| `verify_workflow` | `tools/verify_host_workflow.py` | workflow verification JSON | capability status with `status=complete` and `success=true` |\n\n## 1. Distill\n\nEntry:\n\n```bash\npython tools/build_prompt_payload.py --mode distill --novel <path> --characters A,B --output <distill_payload.json> --run-manifest <run_manifest.json>\n```\n\nStandard outputs:\n\n- distill payload JSON\n- optional capability status JSON\n- optional `run_manifest.json` updates\n\nPayload contract:\n\n- `request.chunk_mode = single|chunked`\n- `chunks[]` for partial distill execution when the excerpt is too large\n- `merge_payload` for final profile merge\n- `host_plan.execution = single_pass|sequential_chunks_then_merge`\n- `meta.chunk_count`\n- `meta.merge_required`\n\nHost responsibility after this step:\n\n- if `single`, hand the payload to the host LLM and write `PROFILE.generated.md`\n- if `chunked`, iterate `chunks[]`, collect partial drafts, fill `merge_payload.request.chunk_drafts`, then execute the merge payload and write the final `PROFILE.generated.md`\n\nRecommended manifest fields to read:\n\n- `artifacts.chunking.distill`\n- `progress.chunking.distill`\n- `summary.chunking.distill`\n\nReference:\n\n- `references/output_schema.md`\n\n## 2. Materialize\n\nEntry:\n\n```bash\npython tools/materialize_persona_bundle.py --profile-file <character-dir/PROFILE.generated.md> --run-manifest <run_manifest.json>\n```\n\nStandard outputs:\n\n- split persona markdown files\n- `ARTIFACT_STATUS.generated.json`\n- optional capability status JSON\n\nReference:\n\n- `references/output_schema.md`\n\n## 3. Export Graph\n\nEntry:\n\n```bash\npython tools/export_relation_graph.py --relations-file <relations.md> --run-manifest <run_manifest.json>\n```\n\nStandard outputs:\n\n- `*_relations.html`\n- `*_relations.svg`\n- `*_relations.mermaid.md`\n- graph `.status.json`\n\nIf relation extraction is chunked on the host side, the same contract applies:\n\n- `request.chunk_mode = single|chunked`\n- `chunks[]`\n- `merge_payload`\n- `meta.chunk_count`\n- `meta.merge_required`\n\nRecommended manifest fields to read:\n\n- `artifacts.chunking.relation`\n- `progress.chunking.relation`\n- `summary.chunking.relation`\n\nReference:\n\n- `examples/sample_relations.md`\n\n## 4. Verify Workflow\n\nEntry:\n\n```bash\npython tools/verify_host_workflow.py --characters-root <characters/<novel_id>> --relations-file <relations.md> --run-manifest <run_manifest.json>\n```\n\nStandard outputs:\n\n- workflow verification JSON\n- capability status JSON\n\nRecommended use:\n\n- run after materialize and export graph\n- treat it as the final host-side completeness check\n\n## Dialogue Stage\n\n`act`, `insert`, and `observe` are host-driven dialogue modes, not packaged helper capabilities.\n\nAt dialogue time, the host should read:\n\n- persona bundle files under `runtime/data/characters/<novel_id>/<character_name>/`\n- `MEMORY.md`\n- relation markdown and graph artifacts\n- `run_manifest.json`\n- constraint references such as `output_schema.md`, `style_differ.md`, and `logic_constraint.md`\n\nReference:\n\n- `references/chat_contract.md`\n\n## Read Order\n\nRecommended host read order across the structured workflow:\n\n1. read capability status first\n2. read the primary output for the current capability\n3. if present, read `run_manifest.json` for the updated cross-step index\n\nAfter the workflow completes, hand off to the dialogue stage described in `references/chat_contract.md`.\n\n## End-To-End Example\n\nFor one complete host-side chain from run initialization to dialogue handoff, see:\n\n- `examples/host_workflow_example.md`\n\nFile v4.1.5:references/chat_contract.md\n\n# Dialogue Handoff Contract\n\n## Purpose\n\nThis document defines how the host should enter `act`, `insert`, and `observe` after the structured workflow completes.\n\nThe goal is simple:\n\n- the skill prepares persona bundles and relationship artifacts\n- the host uses those artifacts directly to run dialogue\n- the packaged skill does not require a separate `chat CLI` entrypoint\n\n## Supported Modes\n\n- `act`\n  the user speaks as one existing character\n- `insert`\n  the user enters the scene as themselves\n- `observe`\n  the user stays outside the scene and watches the cast continue\n\n## Required Inputs\n\nBefore the host starts dialogue, it should already have:\n\n- the novel id or novel path for the current run\n- the requested cast\n- one persona bundle directory per distilled character\n- relationship markdown or graph artifacts when available\n- `run_manifest.json` from the current run\n\nMinimum persona inputs per active character:\n\n- `PROFILE.md`\n- `MEMORY.md`\n\nRecommended additional persona inputs when present:\n\n- `SOUL.md`\n- `GOALS.md`\n- `STYLE.md`\n- `TRAUMA.md`\n- `IDENTITY.md`\n- `BACKGROUND.md`\n- `CAPABILITY.md`\n- `BONDS.md`\n- `CONFLICTS.md`\n- `ROLE.md`\n\n## Host Responsibilities\n\n### 1. Mode Selection\n\nThe host decides whether the request is:\n\n- `act`\n- `insert`\n- `observe`\n\n### 2. Active Cast Selection\n\nThe host determines which characters are active for the current turn or scene.\n\nRecommended inputs:\n\n- explicitly requested characters\n- relation graph context\n- current scene focus\n\n### 3. Self-Insert Card\n\nFor `insert`, the host should create or refresh a lightweight self-insert card, for example:\n\n- user display name\n- current in-scene identity\n- how they entered the scene\n- what the cast should currently know about them\n\n### 4. Dialogue Rendering\n\nThe host performs the actual generation. It should use the persona bundle and constraints to keep the output:\n\n- in character\n- mode-consistent\n- relation-aware\n- scene-aware\n\n## Recommended Artifact Read Order\n\n1. `run_manifest.json`\n2. relation markdown and graph artifacts\n3. `PROFILE.md`\n4. split persona files\n5. `MEMORY.md`\n\n## Output Expectations\n\nThe exact dialogue output format is host-defined.\n\nAt minimum, the host should keep enough structured state to know:\n\n- current mode\n- active cast\n- controlled character for `act`\n- self-insert identity for `insert`\n- latest scene summary\n- latest turn outputs\n\n## Host UI Guidance\n\nAfter the structured workflow completes, the host should surface:\n\n- character directories\n- relationship graph HTML / SVG\n- workflow summary from `run_manifest.json`\n- a clear prompt that the user can now enter `act`, `insert`, or `observe`\n\nFile v4.1.5:references/logic_constraint.md\n\n# 逻辑约束指南\n\n## 用途\n\n用于防止人物设定崩坏、OOC 漂移，以及在蒸馏、纠错、act 模式、observe 模式中的角色逻辑失稳。\n\n这份文件定义的是全局人格逻辑边界，不是风格文件，也不是格式文件。\n\n## 约束优先级\n\n当多个约束发生冲突时，按以下优先级处理：\n\n1. 原文直接证据\n2. 已写入记忆的用户纠正\n3. 针对具体关系对象的关系约束\n4. 角色档案中的人格字段\n5. 风格偏好\n6. 通用兜底规则\n\n## 全局人格底线\n\n### 1. 身份不能轻易翻转\n\n- 角色不能在没有证据的情况下，随意背离核心身份、派系位置或剧情职能。\n- 一时迟疑，不等于身份反转。\n\n### 2. 动机必须前后一致\n\n- 发言和行为应尽量与 `soul_goal`、`hidden_desire`、`belief_anchor` 保持相容。\n- 角色可以战术性回避，但不能在没有依据时抹掉长期驱动力。\n\n### 3. 价值观约束决策\n\n- `decision_rules`、`reward_logic`、`taboo_topics`、`forbidden_behaviors` 构成人物硬边界。\n- 角色可以偶尔违背自己的价值观，但必须是少见、代价高、且有证据支撑的情况。\n\n### 4. 关系层优先于通用语气\n\n- 角色不会对所有人都用同一种态度说话。\n- 关系层与 `key_bonds` 应先于通用风格兜底生效。\n\n### 5. 情绪反应必须符合人物惯性\n\n- 高压场景不能把所有角色都推成同一种“冷静分析型”。\n- `anger_style`、`grievance_style`、`fear_triggers`、`private_self` 必须保持稳定。\n\n### 6. 人物弧光必须有代价和事件支撑\n\n- 立场变化、成长、崩塌都应由可见事件推动。\n- 当前证据不足时，优先沿用此前更稳定的人格状态。\n\n## 硬性失败条件\n\n出现以下任一情况时，应降置信度、重写，或返回 `needs_revision`：\n\n1. 无证据地违背核心价值观\n2. 忽略对当前关系对象的专属态度\n3. 说话风格退化为通用 AI 填充语\n4. 无依据地把公开人格和私下真实面貌混成一层\n5. 角色突然套用了另一个角色的思路或话术\n6. 这句话在世界观里似乎合理，但对这个人来说并不合理\n\n## Act 模式约束\n\n1. 用户输入的，是受控角色的台词，不是让系统改写成旁白式角色扮演。\n2. 响应角色必须以该角色身份回话，而不是以旁白、作者或场景导演身份补戏。\n3. 不得把模式切换指令误改写为剧情演示文本。\n4. 如果用户台词含混，应保守地继续人物对话，而不是擅自发散出新的剧情分支。\n\n## Observe 模式约束\n\n1. 不是每一轮都必须所有角色一起说话。\n2. 优先让最相关、最受影响、或被明确点名的角色发言。\n3. 当发言会抢戏、违背人设或与当前场景弱相关时，可以允许沉默。\n4. 同一轮内不同角色的语气、逻辑和情绪表面必须能区分开。\n\n## 纠错约束\n\n1. 优先做最小修正，以恢复人物一致性。\n2. 尽量保留原句的沟通意图。\n3. 如果 OOC 证据不足，应标记低置信度，而不是过度改写。\n4. 一旦某类纠错被确认有效，应允许写入 `MEMORY.md`，作为后续持续约束。\n\nFile v4.1.5:references/output_schema.md\n\n# 输出规范\n\n## 人物档案\n\n```md\n# PROFILE\n<!-- Canonical markdown profile storage. -->\n\n## Meta\n- name: 角色名\n- novel_id: sample_novel\n- source_path: data/sample_novel.txt\n- timeline_stage: 前期 / 中期 / 后期 / 结局 / 未判定\n- role_tags: 核心主角；悲剧型；群像核心\n\n## Basic Positioning\n- core_identity: 核心身份与社会定位\n- faction_position: 阵营、派系、立场位置\n- world_belong: 所属势力 / 地域 / 种族 / 阶层标签\n- story_role: 剧情职能定位\n- stance_stability: 立场稳定度或摇摆特性\n- identity_anchor: 角色如何定义“我是谁、我站在哪边、我凭什么行动”\n- world_rule_fit: 人物理念与世界规则的契合度\n- rule_view: 对世界核心规则的接受 / 反抗 / 利用态度\n- plot_restriction: 原作设定枷锁，如血脉、身份、宿命、制度、种族限制\n\n## Root Layer\n- background_imprint: 出身背景与成长烙印\n- life_experience: 关键经历、转折与长期处境\n- trauma_scar: 至今仍在起作用的旧伤与精神擦痕\n- taboo_topics: 不能触碰的话题\n- forbidden_behaviors: 明确不会做或极度排斥的行为\n\n## Inner Core\n- soul_goal: 长期驱动目标\n- hidden_desire: 深层执念或隐秘欲望\n- core_traits: 性格1；性格2\n- temperament_type: 整体气质底色\n- values: 勇气=0；智慧=0；善良=0；忠诚=0；野心=0；正义=0；自由=0；责任=0\n- worldview: 对世界、秩序、善恶、因果的基本看法\n- belief_anchor: 高压时仍会抓住的信念、规矩或精神支柱\n- moral_bottom_line: 道德底线与不能跨过的红线\n- restraint_threshold: 欲望、情绪、嫉妒、愤怒平时如何克制，何时会失控\n\n## External Persona\n- appearance_feature: 标志性长相、穿着、体态、器物或可识别外观\n- habit_action: 无意识小动作、口癖外的小习惯、微行为\n- preference_like: 偏好的人、物、食物、作息、环境或氛围\n- dislike_hate: 生理性厌恶、本能排斥、长期反感的对象或状态\n\n## Interest And Resources\n- interest_claim: 核心利益诉求，如权、财、地位、自由、传承、安全感\n- resource_dependence: 依赖的资源、软肋筹码、容易被拿捏的关键点\n- trade_principle: 利益交换底线，以及合作 / 背叛的触发条件\n\n## Value And Conflict\n- inner_conflict: 理念、责任、欲望之间的内在冲突\n- self_cognition: 角色如何看待自己，如清醒、自卑、高估、偏执\n- private_self: 不轻易示人的柔软面、阴暗面或真实隐藏面\n- disguise_switch: 是否存在假面人格、演戏状态，以及何时切换\n\n## Thinking And Decision\n- thinking_style: 理性 / 感性、短视 / 长远、经验驱动 / 直觉驱动等思维偏好\n- cognitive_limits: 认知盲区、思维短板、反复犯错的局限\n- decision_rules: 条件 -> 反应；固定决策准则\n- action_style: 执行方式、推进节奏、惯用手段\n- reward_logic: 角色如何判断谁值得回报、谁该惩罚、何时翻脸、何时让步\n\n## Emotion And Stress\n- emotion_model: 日常情绪基调与主要调节方式\n- fear_triggers: 恐惧点、雷点、避讳触发项\n- stress_response: 高压、绝境、崩溃边缘时的应激人格\n- anger_style: 生气时的表达方式\n- joy_style: 开心时的表达方式\n- grievance_style: 委屈、受压时的表达方式\n\n## Social Pattern\n- social_mode: 社交距离与相处模式\n- carry_style: 对陌生人 / 亲友 / 上级 / 下属 / 敌人的分层态度\n- others_impression: 他人观感、外界标签、第一印象\n- key_bonds: 关键羁绊、宿命联系、关系落点\n\n## Voice\n- speech_style: 说话风格总述\n- cadence: 语气节奏\n- signature_phrases: 标志性句式、口头禅\n- typical_lines: 代表性台词或高辨识表达\n- sentence_openers: 常见起句（可选）\n- connective_tokens: 常用连接词（可选）\n- sentence_endings: 常见收尾方式（可选）\n- forbidden_fillers: 禁用口水词、禁用通用助词（可选）\n\n## Capability\n- strengths: 专属优势、能力强项\n- weaknesses: 性格短板、能力缺陷、致命弱点\n\n## Arc\n- arc_type: 成长类型，如觉醒、救赎、黑化、麻木、堕落、和解\n- arc_blocker: 阻碍人物变化的核心心结\n- arc_start: 前段稳定状态\n- arc_mid: 中段变化与触发事件\n- arc_end: 当前可见终点或结局状态\n\n## Performance Boundary\n- ooc_redline: 绝对不能捏造给该角色的 OOC 行为清单\n\n## Evidence\n- description_count: 1\n- dialogue_count: 2\n- thought_count: 0\n- chunk_count: 1\n- evidence_source: 第03回-段落12；第05回-段落03\n- contradiction_note: 前期偏克制，后期在特定关系中明显失控，需按时间线区分\n```\n\n规则：\n- `core_traits` max 10 unique items\n- `typical_lines` max 8 unique items\n- `decision_rules` max 8 unique items\n- list-like fields use `；` as the separator in markdown scalar lines\n- `values` all integers in `[0,10]`\n- evidence fields优先存索引、章节、段落编号，不复制大段原文\n- `sentence_openers` / `connective_tokens` / `sentence_endings` / `forbidden_fillers` 为可选字段，无稳定证据时留空\n- 任意高风险深层字段若证据不足，允许直接写 `证据不足`\n- `arc_start` / `arc_mid` / `arc_end` 只有在识别到稳定阶段变化时才量化；证据不足时可保留空值或只写 `trigger_event` / `final_state` 类说明\n\n### 统一标尺\n\n- 0 = 完全无 / 极致排斥\n- 5 = 中立普通 / 无明显偏向\n- 10 = 极致执念 / 完全忠诚 / 彻底坚守\n\n### 易混字段收紧定义\n\n- `identity_anchor`: 角色如何定义“我是谁、我站在哪边、我凭什么行动”。必须是该角色自己的自我定位，不是团队口号。\n- `soul_goal`: 长期驱动力或执念，必须能解释关键选择中反复追求什么，禁止使用“活下去”“赢下来”“保护同伴”这类任何人都适用的空泛目标。\n- `background_imprint`: 对当前人格与决策有持续影响的出身、成长、代价与烙印，不得把多人共场景的剧情摘要直接搬过来。\n- `trauma_scar`: 不是“悲惨经历简介”，而是至今仍在影响其反应方式的旧伤。\n- `temperament_type`: 强调整体气质底色，要能一眼区分人物，不是把 `core_traits` 换词重写。\n- `rule_view`: 写人物面对世界规则时是顺从、利用、怀疑、反抗还是借势，而不是重复 `world_rule_fit`。\n- `plot_restriction`: 写原作设定层面的束缚，例如身份、制度、血脉、宿命、誓约、种族限制。\n- `appearance_feature`: 只写原文稳定可见的外在标识，不凭空补完影视化细节。\n- `habit_action`: 写能在多次互动中观察到的习惯动作，不写一次性动作描写。\n- `interest_claim`: 写角色真正在争夺什么、守住什么，而不是泛泛而谈“想变强”。\n- `resource_dependence`: 写其依赖、短缺、害怕失去或会被控制的关键资源与筹码。\n- `trade_principle`: 写利益交换与合作背叛的底线条件，不与 `reward_logic` 混写。\n- `inner_conflict`: 只写内在冲突，不承担自评或隐藏面职能。\n- `self_cognition`: 只写角色如何看自己，可与 `others_impression` 形成反差，但两者都必须有证据。\n- `private_self`: 保留原字段名用于兼容，语义按“hidden_side”理解，写不对外展示的真实面与隐蔽面。\n- `action_style`: 只写怎么做；`decision_rules` 只写为什么选。\n- `stress_response`: 必须描述高压、绝境、崩溃边缘时的异常面，而不是重复日常 `action_style`。\n- `carry_style`: 写其对不同关系层级的差异化态度，不得用一个“对人冷淡”打包全部对象。\n- `ooc_redline`: 只写绝对不能虚构给该角色的行为边界，优先写背叛、失格、自毁、违背设定底线的行为。\n\n### 原作优先原则\n\n- 只采信原作正文中的描写、行为、对话、心理活动与明确叙述。\n- 拒绝二创、同人、读者脑补、影视改编附会与“合理推测式补全”。\n- 无原文支撑时直接写 `证据不足`，不要用常识补完。\n\n### 人设权重规则\n\n- 长期稳定性格 > 一时情绪冲动行为\n- 核心底色 > 阶段性反常行为\n- 童年 / 成长烙印 > 临时环境刺激\n- 结论若受时间线影响，必须配合 `timeline_stage` 或 `contradiction_note` 说明\n\n### 公平蒸馏规则\n\n- 对反派、灰色人物、失败者一律客观记录其逻辑、创伤、欲望、利益与边界\n- 不洗白，不丑化，不做道德审判式总结\n\n### 多角色蒸馏约束\n\n- 一次同时蒸馏多名角色时，每个角色必须被当作独立任务处理。\n- 必须明确回答“这个角色与同批其他角色最不同的地方是什么”。\n- 共享场景优先用于提取 `key_bonds`、关系变化、冲突点与互动节奏，不得直接批量写入多人共同的背景与人格字段。\n- 若某字段与其他角色高度雷同且缺少更强证据，应留空或写 `证据不足`，不要用模板话术填满。\n\n### 推荐字段分组\n\n为避免录入时重复堆叠同义字段，推荐按以下 14 组理解与填写：\n\n1. 基础身份定位：`core_identity` / `faction_position` / `world_belong` / `story_role` / `stance_stability` / `identity_anchor`\n2. 世界观绑定：`world_rule_fit` / `rule_view` / `plot_restriction`\n3. 根源底层：`background_imprint` / `life_experience` / `trauma_scar` / `taboo_topics` / `forbidden_behaviors`\n4. 核心精神内核：`soul_goal` / `hidden_desire` / `core_traits` / `temperament_type` / `values` / `worldview` / `belief_anchor` / `moral_bottom_line` / `restraint_threshold`\n5. 外在具象人设：`appearance_feature` / `habit_action` / `preference_like` / `dislike_hate`\n6. 利益与资源逻辑：`interest_claim` / `resource_dependence` / `trade_principle`\n7. 价值与内在矛盾：`inner_conflict` / `self_cognition` / `private_self` / `disguise_switch`\n8. 思维与决策：`thinking_style` / `cognitive_limits` / `decision_rules` / `action_style` / `reward_logic`\n9. 情绪与应激：`emotion_model` / `fear_triggers` / `stress_response` / `anger_style` / `joy_style` / `grievance_style`\n10. 社交模式：`social_mode` / `carry_style` / `others_impression` / `key_bonds`\n11. 语言表达：`speech_style` / `cadence` / `signature_phrases` / `typical_lines`\n12. 可选语言微特征：`sentence_openers` / `connective_tokens` / `sentence_endings` / `forbidden_fillers`\n13. 能力与短板：`strengths` / `weaknesses`\n14. 成长与边界：`timeline_stage` / `role_tags` / `arc_type` / `arc_blocker` / `arc_start` / `arc_mid` / `arc_end` / `ooc_redline` / `evidence_source` / `contradiction_note`\n\n## 人格包文件\n\n蒸馏过程还可以在以下目录下生成可选人格包：\n\n```text\nruntime/data/characters/<novel_id>/<角色名>/\n```\n\n常见文件：\n- `NAVIGATION.generated.md`: generated load order and file intent\n- `NAVIGATION.md`: manual override and navigation supplement\n- `PROFILE.generated.md`: canonical generated profile\n- `PROFILE.md`: manual override profile\n- `RELATIONS.generated.md`: generated target-specific relations\n- `RELATIONS.md`: manual relation overrides\n- `MEMORY.md`: durable memory and user corrections\n\n可选的聚焦人格文件：\n- `SOUL.generated.md`\n- `GOALS.generated.md`\n- `STYLE.generated.md`\n- `TRAUMA.generated.md`\n- `IDENTITY.generated.md`\n- `BACKGROUND.generated.md`\n- `CAPABILITY.generated.md`\n- `BONDS.generated.md`\n- `CONFLICTS.generated.md`\n- `ROLE.generated.md`\n\n## 关系图谱\n\n```md\n# RELATION_GRAPH\n\n## 林黛玉_贾宝玉\n- trust: 8\n- affection: 9\n- power_gap: 1\n- conflict_point: 表达方式差异\n- typical_interaction: 黛玉试探 -> 宝玉安抚 -> 短暂缓和\n- hidden_attitude: 表面克制，私下更在意对方是否偏心\n- relation_change: 缓慢升温，但受误会反复波动\n- appellation_to_target: 宝玉\n- confidence: 8\n```\n\n规则：\n- relation section title must use sorted key format `<A>_<B>`\n- `trust` and `affection` in `[0,10]`\n- `power_gap` in `[-5,5]`\n- `confidence` in `[0,10]`\n- `relation_change` 描述趋势，如升温、恶化、固化、反复波动\n- `hidden_attitude` 用于记录表面态度与私下真实态度的落差；无证据时留空\n- 关系条目必须基于同场景互动证据\n\n## 聊天约束（可选）\n\n```md\n# CHAT_CONSTRAINTS\n\n- character: 林黛玉\n- must_follow: 语气克制但可反讽；冲突时先防御再观察\n- must_avoid: 无证据的极端背叛表达；与高忠诚价值冲突的抛弃宣言\n- fallback_action: rewrite_once_then_needs_revision\n```\n\n## 纠错输出\n\n```md\n# CORRECTION\n\n- corrected_message: 修正后的台词\n- correction_reason: 基于哪些人格字段收紧\n- confidence: 7\n```\n\nFile v4.1.5:references/safety_policy.md\n\n# 安全策略\n\n## 执行边界\n\n- 默认采用本地优先。\n- 运行时说明中不应要求强制联网拉取资源。\n- 不要求任意 shell 命令执行。\n\n## 数据安全\n\n- 不得请求或存储凭证、密钥等敏感信息。\n- 示例与输出中尽量避免个人隐私或敏感数据。\n- 所有结果都应被限制在用户提供文本证据的范围内。\n\n## 完整性检查\n\n- 若证据稀薄，应输出低置信度结果。\n- 若不符合 schema 约束，应返回 `needs_revision`。\n- 若用户请求存在明显不安全行为，应拒绝并给出安全替代方案。\n\nFile v4.1.5:references/style_differ.md\n\n# 风格差异化指南\n\n## 用途\n\n用于在蒸馏、纠错、单聊、群聊生成时降低角色同质化。\n\n这不是自由发挥式 prompt，而是一份约束参考。它的作用是帮助运行时和辅助 agent 让每个角色在表达层面保持可辨识的差异。\n\n## 核心原则\n\n不要只靠“观点不同”来区分角色，而要让角色在以下层面也真正不同：\n\n1. 说话节奏\n2. 用词偏好\n3. 情绪外露方式\n4. 冲突处理习惯\n5. 面对不同关系对象时的语气差异\n6. 公开人格与私下真实面貌的落差\n\n## 差异化维度\n\n### 1. 句式节奏\n\n- 短促直接型：句子短，铺垫少，态度出现快\n- 层层展开型：先讲前因后果，再落到结论\n- 情绪断裂型：句式会被情绪打断，带出波动\n- 克制含蓄型：话少，更多靠分寸和停顿表达立场\n\n### 2. 用词层级\n\n- 朴素口语\n- 雅正克制\n- 尖锐刻薄\n- 温和委婉\n- 清冷疏离\n- 戏谑调侃\n\n不要让所有角色最后都坍缩成同一种“先看看/再说/权衡一下”的安全说法。\n\n### 3. 情绪表面形态\n\n- 有的角色情绪来得快，会立刻外放\n- 有的角色先压住情绪，只在措辞上收紧\n- 有的角色会先反讽、先顶回去\n- 有的角色嘴上抱怨，但行动上依然会跟进\n\n除非有明确弧光证据，否则情绪风格不应频繁漂移。\n\n### 4. 决策表达顺序\n\n- 有的角色先说结论\n- 有的角色先划边界\n- 有的角色先提关系\n- 有的角色先谈后果\n\n思考顺序的外显，本身就是人物声纹的一部分。\n\n### 5. 关系对象差分\n\n同一个角色，面对不同对象时应当允许发生稳定变化：\n\n- 对长辈/上位者\n- 对平辈/对手\n- 对亲近之人\n- 对陌生人\n- 对敌对者\n\n不能把所有对象都压平为同一套万能口吻。\n\n### 6. 公开人格与私下真实面貌\n\n- 有的人表面克制，内里强烈\n- 有的人表面强势，内里不安\n- 有的人表面玩笑，内里认真\n\n要结合 `private_self`、`social_mode`、`key_bonds` 与关系层，稳定维护这种落差。\n\n## 防同质化规则\n\n1. 同一场景中，不要让多个角色复用同一套兜底句式骨架。\n2. 不要把所有“冷静型”角色都写成同一种“理性、稳妥、先观察”的声音。\n3. 不要把所有冲突都写成直接解释；有的人会回避，有的人会嘲讽，有的人会截断，有的人会压着说。\n4. 不要过度使用“先看看”“再作定夺”“还需权衡”这类通用过渡句。\n5. 即使两个角色立场相同，他们的理由、表面措辞和情绪手感也应不同。\n6. 保留不对称性：有人推进，有人兜底，有人反讽，有人吸收压力。\n\n## 输出前自检\n\n在最终输出前，至少检查以下问题：\n\n1. 去掉角色名之后，这句话是否仍然大致能辨认出是谁说的？\n2. 这句话体现的是该角色自己的表达习惯，还是一种泛用叙述者口吻？\n3. 如果听话对象换了，这句话是否会随关系发生合理变化？\n4. 把这句话放到同场其他角色旁边时，声音是否仍然分得开？\n\n如果第 2 条或第 4 条答案是否定的，说明这句仍然过于模板化。\n\nFile v4.1.5:references/validation_policy.md\n\n# 校验策略\n\n## 用途\n\n通过分层校验，约束蒸馏输出的人设真实性、区分度和可演绎性，减少脑补、同质化和 OOC。\n\n## 校验层级\n\n### 1. 证据校验\n\n- 每个关键结论都必须能对应到至少一条原作正文证据。\n- `evidence_source` 优先记录章节、段落、片段索引，不复制大段原文。\n- 如果没有直接证据，结论不得写实锤，应留空或写 `证据不足`。\n\n### 2. 一致性校验\n\n- 性格特征、决策规则、语言风格不得与 `values`、`belief_anchor`、`moral_bottom_line` 明显冲突。\n- `decision_rules` 与 `action_style` 必须区分：前者解释判断逻辑，后者解释执行风格。\n- `self_cognition` 与 `others_impression` 可以形成反差，但两者都必须有依据。\n- `arc_*`、`timeline_stage`、`contradiction_note` 必须彼此对得上，不能前后混用。\n\n### 3. 原作优先校验\n\n- 只采信原作正文中的描写、行为、对话、心理活动与明确叙述。\n- 不采信同人、影视改编附会、读者脑补和“合理推测式补全”。\n- `appearance_feature`、`plot_restriction`、`ooc_redline` 这类高风险字段必须更加保守。\n\n### 4. 权重校验\n\n- 长期稳定性格 > 一时冲动\n- 核心底色 > 阶段性反常\n- 成长烙印 > 临时环境刺激\n- 若角色前后割裂明显，必须通过 `timeline_stage` 或 `contradiction_note` 显式说明\n\n### 5. 差分校验\n\n- 多角色同批蒸馏时，`identity_anchor`、`soul_goal`、`temperament_type`、`social_mode`、`reward_logic`、`interest_claim`、`resource_dependence` 不得大面积同质化。\n- 共享场景可以复用为关系证据，但不能直接平铺成多人共同的背景和精神内核。\n- 如果某条描述轻易能替换到另一角色身上仍成立，应判为泛化过度，需要重写。\n\n### 6. 公平蒸馏校验\n\n- 对反派、灰色人物、失败者保持客观，不洗白，不丑化，不道德审判。\n- 只记录其逻辑、利益、创伤、欲望、边界与代价。\n\n## 通过 / 失败规则\n\n- 通过：证据、一致性、原作优先、权重、差分五层均通过\n- 软失败：仅 1 层不通过，需要修正后再输出\n- 硬失败：2 层及以上不通过，返回 `needs_revision`\n\nFile v4.1.5:examples/host_workflow_example.md\n\n# Host Workflow Example\n\nThis example shows one complete host-side flow:\n\n1. initialize `run_manifest.json`\n2. build distill payload\n3. choose single-pass or chunked execution\n4. call the host LLM and write `PROFILE.generated.md`\n5. materialize persona bundles\n6. generate / merge the relationship result and export the graph\n7. verify workflow completeness\n8. hand off to host-driven dialogue\n\n## 1. Initialize The Run\n\n```bash\npython tools/init_host_run.py --novel data/hongloumeng.txt --characters 林黛玉,贾宝玉,薛宝钗 --output runtime/run_manifest.json\n```\n\nHost expectation:\n\n- `runtime/run_manifest.json` is created\n- locked characters are recorded\n- progress starts at `characters_locked`\n\n## 2. Build Distill Payload\n\n```bash\npython tools/build_prompt_payload.py --mode distill --novel data/hongloumeng.txt --characters 林黛玉,贾宝玉,薛宝钗 --output runtime/distill_payload.json --run-manifest runtime/run_manifest.json\n```\n\nHost expectation:\n\n- `runtime/distill_payload.json` is ready\n- the host LLM reads this payload\n- `run_manifest.json` records payload paths and status updates\n\nThe payload now supports two execution shapes:\n\n- `request.chunk_mode = single`\n  - the host can send the whole payload directly to the LLM\n- `request.chunk_mode = chunked`\n  - the host should iterate `chunks[]`\n  - collect each chunk result as a partial draft\n  - then execute `merge_payload` once to obtain the final artifact\n\nUseful fields:\n\n- `chunks[]`\n- `merge_payload`\n- `host_plan`\n- `meta.chunk_count`\n- `meta.merge_required`\n\n`run_manifest.json` will also expose:\n\n- `progress.chunking.distill`\n- `summary.chunking.distill`\n\n## 3. Generate Canonical Profiles\n\n### A. Single-pass path\n\nIf `request.chunk_mode = single`, the host writes one canonical file per character directly:\n\n```text\nruntime/data/characters/hongloumeng/林黛玉/PROFILE.generated.md\nruntime/data/characters/hongloumeng/贾宝玉/PROFILE.generated.md\nruntime/data/characters/hongloumeng/薛宝钗/PROFILE.generated.md\n```\n\nRecommended host progress updates during generation:\n\n```bash\npython tools/update_run_progress.py --run-manifest runtime/run_manifest.json --stage character_started --character 林黛玉 --message \"正在蒸馏林黛玉\"\npython tools/update_run_progress.py --run-manifest runtime/run_manifest.json --stage character_completed --character 林黛玉 --message \"林黛玉已完成\"\n```\n\nRepeat for each character.\n\n### B. Chunked path\n\nIf `request.chunk_mode = chunked`, the host should:\n\n1. iterate `distill_payload.json -> chunks[]`\n2. call the host LLM once per chunk\n3. store each partial result\n4. place those partial drafts into `merge_payload.request.chunk_drafts`\n5. call the host LLM once more with `merge_payload`\n6. write the final merged `PROFILE.generated.md`\n\nChunk progress can also be written back into the manifest:\n\n```bash\npython tools/update_run_progress.py --run-manifest runtime/run_manifest.json --stage chunk_started --message \"正在执行第 1 块\" --chunk-capability distill --chunk-mode chunked --chunk-count 6 --current-chunk 1 --chunk-label 前段-1 --chunk-status running --merge-required --merge-status pending\npython tools/update_run_progress.py --run-manifest runtime/run_manifest.json --stage merge_started --message \"正在合并人物草稿\" --chunk-capability distill --chunk-mode chunked --chunk-count 6 --current-chunk 6 --chunk-label 后段-2 --chunk-status complete --merge-required --merge-status running\npython tools/update_run_progress.py --run-manifest runtime/run_manifest.json --stage merge_completed --message \"人物草稿已合并\" --chunk-capability distill --chunk-mode chunked --chunk-count 6 --current-chunk 6 --chunk-label 后段-2 --chunk-status complete --merge-required --merge-status complete\n```\n\n## 4. Materialize Persona Bundles\n\n```bash\npython tools/materialize_persona_bundle.py --profile-file runtime/data/characters/hongloumeng/林黛玉/PROFILE.generated.md --run-manifest runtime/run_manifest.json\npython tools/materialize_persona_bundle.py --profile-file runtime/data/characters/hongloumeng/贾宝玉/PROFILE.generated.md --run-manifest runtime/run_manifest.json\npython tools/materialize_persona_bundle.py --profile-file runtime/data/characters/hongloumeng/薛宝钗/PROFILE.generated.md --run-manifest runtime/run_manifest.json\n```\n\nHost expectation:\n\n- split persona files appear\n- `ARTIFACT_STATUS.generated.json` appears in each character directory\n- `run_manifest.json` records each character directory\n\n## 5. Generate Relation Result And Export Graph\n\nThe relation payload follows the same rule:\n\n- `single`: generate the final relation markdown directly\n- `chunked`: run `chunks[]`, collect partial relation drafts, then execute `merge_payload`\n\nAfter the final merged relationship markdown exists, the host writes:\n\n```text\nruntime/data/relations/hongloumeng_relations.md\n```\n\nThen export the graph:\n\n```bash\npython tools/export_relation_graph.py --relations-file runtime/data/relations/hongloumeng_relations.md --run-manifest runtime/run_manifest.json\n```\n\nHost expectation:\n\n- `*_relations.html`\n- `*_relations.svg`\n- `*_relations.mermaid.md`\n- graph status JSON\n- `run_manifest.json -> progress.chunking.relation` if the host reports chunk progress\n\n## 6. Verify Workflow\n\n```bash\npython tools/verify_host_workflow.py --characters-root runtime/data/characters/hongloumeng --relations-file runtime/data/relations/hongloumeng_relations.md --run-manifest runtime/run_manifest.json\n```\n\nHost expectation:\n\n- workflow verification JSON is written\n- `run_manifest.json` ends in a complete state\n\n## 7. Hand Off To Dialogue\n\nAt this point, the host already has everything needed to enter `act`, `insert`, or `observe`:\n\n- character directories\n- `PROFILE.md`\n- split persona files\n- `MEMORY.md`\n- relation markdown\n- graph HTML / SVG\n- `run_manifest.json`\n\nThe host now drives the dialogue directly with its own LLM.\n\n## Recommended UI / Agent Surfacing\n\nAfter the workflow completes, a host can safely surface:\n\n- character directories\n- relationship graph HTML / SVG\n- workflow summary from `run_manifest.json`\n- a clear invitation to enter `act`, `insert`, or `observe`\n\nFor long novels, the host can also surface:\n\n- total distill chunks\n- current chunk number\n- whether merge is pending / running / complete\n- total relation chunks\n\n## Cross References\n\n- `references/capability_index.md`\n- `references/chat_contract.md`\n\nFile v4.1.5:examples/sample_character_profile.md\n\n# PROFILE\n<!-- Canonical markdown profile storage. -->\n\n## Meta\n- name: 林黛玉\n- novel_id: sample_novel\n- source_path: data/sample_novel.txt\n- timeline_stage: 前期\n- role_tags: 核心主角；悲剧型；群像核心\n\n## Basic Positioning\n- core_identity: 才情出众、情思纤细、寄人篱下而自我防御极强的核心人物\n- faction_position: 贾府内的亲眷晚辈，情感与日常交往深受贾府秩序影响\n- world_belong: 贾府内院；仕宦门第；闺阁女性\n- story_role: 以情感锋芒和精神敏感度推动人物关系张力的核心角色\n- stance_stability: 在情感判断上并不轻易动摇，但会因受伤而暂时收紧态度\n- identity_anchor: 寄居贾府、才情敏锐而自尊极强的闺秀\n- world_rule_fit: 能适应诗礼闺阁秩序，却与人情世故、圆融应酬始终隔着一层\n- rule_view: 表面遵守闺阁礼法，内里对虚饰人情始终保持警惕与抗拒\n- plot_restriction: 寄居身份、体弱多病与封建门第秩序共同限制了她的行动空间与命运选择\n\n## Root Layer\n- background_imprint: 自幼体弱多病，又失怙失恃，长期寄居环境塑造了敏感与自尊并存的性格底色\n- life_experience: 幼失双亲；长期寄居；在诗社与闺阁往来中反复体会亲疏冷暖\n- trauma_scar: 寄居与失亲留下的旧伤仍在，被轻慢或被比较时会立刻牵动防御与不安\n- taboo_topics: 被轻贱寄居身份；被当众比较高下；真心被说成矫情\n- forbidden_behaviors: 不会毫无顾忌地向所有人示弱；不会把真情轻易说成儿戏\n\n## Inner Core\n- soul_goal: 守住自尊与真情，不肯把真心轻易交付给轻慢之人\n- hidden_desire: 渴望被真正理解、被坚定偏爱，而不是被礼貌安置\n- core_traits: 敏感；聪慧；自尊\n- temperament_type: 高敏感、外冷内热型\n- values: 勇气=6；智慧=8；善良=7；忠诚=8；野心=3；正义=6；自由=7；责任=6\n- worldview: 真情可贵，却最怕人心轻薄；很多话须先试其真，再肯信\n- belief_anchor: 真情不可欺，自尊不可轻贱\n- moral_bottom_line: 可以受委屈，但不能接受真心被践踏、无辜者被拿来铺垫人情场面\n- restraint_threshold: 平时极能克制，唯独自尊与真心同时被踩时会明显失控\n\n## External Persona\n- appearance_feature: 体态轻弱；气质清冷；多带病容与书卷气\n- habit_action: 情绪受触动时会先别开话锋，或以反话试探对方心意\n- preference_like: 偏爱真诚相待；偏爱诗社清谈与相对安静的相处氛围\n- dislike_hate: 厌恶敷衍安慰；厌恶被摆到比较秤上；厌恶虚假圆融\n\n## Interest And Resources\n- interest_claim: 真情中的确定偏爱；被平等看待的尊严；在贾府中的情感安全感\n- resource_dependence: 依赖宝玉等少数真心者的情感确认；也受寄居身份与身体状况制约\n- trade_principle: 可以让步礼数，不会拿真心做交换；一旦察觉对方虚情假意，就会迅速收回信任\n\n## Value And Conflict\n- inner_conflict: 一面极重真情，一面又因自尊与不安而先行防御\n- self_cognition: 很清楚自己敏感、多心、爱较真，也知道这种敏锐既护住了自尊，也加重了痛感\n- private_self: 独处时更柔软，也更容易被愁绪与不安牵动\n- disguise_switch: 在人前多以克制和锋芒自护；真正受伤时会用反讽与冷淡遮住脆弱\n\n## Thinking And Decision\n- thinking_style: 先感受对方态度，再以敏锐观察和自我防卫判断进退\n- cognitive_limits: 容易在情绪受伤时放大言外之意，对他人迟钝和回避不够宽容\n- decision_rules: 感到被轻视->先反讽防御，再观察对方诚意；察觉真心未变->语气会稍松，却不肯立刻认输；触及自尊痛点->宁可收起真意，也不愿低头讨怜\n- action_style: 先以言语试探与防御，确认真心后才稍稍放下锋芒\n- reward_logic: 对真心者会记情回护，对轻慢与敷衍则格外记得\n\n## Emotion And Stress\n- emotion_model: 日常情绪偏内敛，习惯先收住痛意，再以细微措辞表达立场\n- fear_triggers: 被冷落；被拿来比较；真心被敷衍；寄居身份被戳破\n- stress_response: 压力越大越会把语气压轻，表面更冷，防御性反讽和试探会明显增加\n- anger_style: 生气时不一定高声，更多是冷下来、话里带刺\n- joy_style: 真高兴时也多半收着，只在语气和诗意里透出轻快\n- grievance_style: 受委屈时先自护，往往借反话和旁刺把痛意藏住\n\n## Social Pattern\n- social_mode: 对陌生人与轻慢者防备明显，对认定之人则会在试探后显露真心\n- carry_style: 对陌生人克制疏离；对亲近之人敏感而在意；对长辈守礼但不轻易交心；对轻慢者会以锋芒自护\n- others_impression: 外人初见多半觉得她清冷、聪敏、难近，熟识后才知道她其实极重真情\n- key_bonds: 与贾宝玉之间的真情牵绊；与薛宝钗之间复杂而微妙的比较关系\n\n## Voice\n- speech_style: 言辞锋利但情绪克制，常带反讽，轻易不把软处全露出来。\n- cadence: 起句克制，中段容易带出暗刺，真正受伤时语尾反而更轻\n- signature_phrases: 原是；何必；倒像是；你最会；我原不该\n- typical_lines: 你最会哄人；我原不该多心，只是听着未免叫人难受；你若真明白我，便不会只拿空话来宽我\n- sentence_openers: 我原不该；你倒；何必；原是\n- connective_tokens: 只是；不过；倒；偏\n- sentence_endings: 罢了；也就是了；倒也未必\n- forbidden_fillers: 哈哈；好吧；确实；呢；呀\n\n## Capability\n- strengths: 诗才敏捷；观察细密；情感辨识力强\n- weaknesses: 多思易伤；防御心重；体弱多病\n\n## Arc\n- arc_type: 悲剧性觉醒\n- arc_blocker: 自尊与寄居处境让她难以在受伤时主动求证与示弱\n- arc_start: 勇气=5；信任=4；以克制和试探维持关系安全\n- arc_mid: 勇气=6；trigger_event=争执与和解；逐步显露对真情的更高需求\n- arc_end: 勇气=7；final_state=更愿意表达真实需求，但仍保留自尊防线\n\n## Performance Boundary\n- ooc_redline: 无证据时绝不会写成豪爽直白、毫无防备地示爱；不会把受伤反应改写成完全无所谓；不会轻易认可虚假人情\n\n## Evidence\n- description_count: 1\n- dialogue_count: 2\n- thought_count: 0\n- chunk_count: 1\n- evidence_source: 第03回-段落12；第05回-段落03\n- contradiction_note: 前期更偏克制试探，随着关系受损与误会累积，特定对象面前的情绪外露会更明显\n\nArchive v4.1.4: 41 files, 987110 bytes\n\nFiles: .metadata.json (599b), assets/vendor/mermaid-11.14.0.min.js (3164970b), examples/chat_result_single_turn.example.json (698b), examples/chat_session_summary.example.json (964b), examples/chat_status_complete.example.json (420b), examples/host_workflow_example.md (3966b), examples/sample_character_profile.md (6645b), examples/sample_input_excerpt.txt (224b), examples/sample_relations.md (764b), examples/test-prompts.json (1399b), INSTALL.md (2107b), MANIFEST.md (1188b), prompts/correction_prompt.md (2454b), prompts/distill_prompt.md (7080b), prompts/relation_prompt.md (2206b), PUBLISH.md (4014b), README_EN.md (7808b), README.md (7709b), references/capability_index.md (3366b), references/chat_contract.md (2649b), references/logic_constraint.md (3188b), references/output_schema.md (12762b), references/safety_policy.md (593b), references/style_differ.md (3193b), references/validation_policy.md (2263b), requirements.txt (307b), SKILL.md (6771b), tools/_skill_support/__init__.py (1339b), tools/_skill_support/novel_preparation.py (10080b), tools/_skill_support/persona_bundle.py (38727b), tools/_skill_support/prompt_payloads.py (7176b), tools/_skill_support/relation_graph_export.py (47052b), tools/_skill_support/workflow_completion.py (13982b), tools/build_prompt_payload.py (6053b), tools/export_relation_graph.py (1720b), tools/init_host_run.py (1284b), tools/materialize_persona_bundle.py (4273b), tools/prepare_novel_excerpt.py (3598b), tools/update_run_progress.py (1670b), tools/verify_host_workflow.py (4351b), _meta.json (132b)\n\nFile v4.1.4:SKILL.md\n\n---\nname: zaomeng-skill\ndescription: 面向中文小说人物蒸馏、关系抽取、关系图谱和角色对话的 ClawHub skill\n---\n\n# zaomeng-skill\n\n| 项目 | 内容 |\n| --- | --- |\n| 名称 | `zaomeng-skill` |\n| 版本 | `4.1.4` |\n| 类型 | ClawHub / Host-managed skill |\n| 核心模式 | LLM-first |\n| 适用场景 | 人物蒸馏、人物包物化、关系图谱导出、角色 `act` / `insert` / `observe` |\n| 宿主职责 | 调用宿主 LLM，负责最终生成与对话推进 |\n| skill 职责 | 准备 prompt payload、物化人物包、导出图谱、校验产物、维护运行状态 |\n\n## 1. 定位\n\n- 这是一个宿主驱动的 prompt-first skill。\n- 宿主负责实际调用 LLM；skill 负责把任务整理成标准输入、标准产物和标准状态。\n- skill 的主路径是 `prompts + helper tools + run_manifest.json`，不是内嵌 chat CLI。\n\n## 2. 宿主能力契约\n\n宿主侧只需要理解四个标准能力：\n\n| 能力 | 入口 | 作用 | 标准成功标记 |\n| --- | --- | --- | --- |\n| `distill` | `tools/build_prompt_payload.py --mode distill` | 生成蒸馏 payload，等待宿主 LLM 产出 `PROFILE.generated.md` | capability status `status=ready, success=true` |\n| `materialize` | `tools/materialize_persona_bundle.py` | 把 `PROFILE.generated.md` 物化为完整人物包 | `ARTIFACT_STATUS.generated.json` + capability status |\n| `export_graph` | `tools/export_relation_graph.py` | 导出人物关系图谱 HTML / Mermaid / SVG | `<relations>.status.json` + capability status |\n| `verify_workflow` | `tools/verify_host_workflow.py` | 校验整条宿主工作流产物是否完整 | capability status `status=complete, success=true` |\n\n所有能力都应该满足：\n\n- 有明确输入\n- 有 JSON 输出\n- 有 sidecar status 文件\n- 有 `success` 布尔值\n- 可选更新 `run_manifest.json`\n\n能力总览集中定义在：\n\n- `references/capability_index.md`\n- `examples/host_workflow_example.md`\n\n`distill` 默认支持增量蒸馏：\n\n- 如果 `data/characters/<novel_id>/<角色名>/` 已存在人物包，`tools/build_prompt_payload.py --mode distill` 会自动把已有档案并入 `request.existing_profiles`\n- `request.update_mode` 会自动落成 `incremental`\n- `run_manifest.json` 的 `artifacts.distill_context` 会记录本次是 `create` 还是 `incremental`，以及命中的已有角色数量\n\n## 3. 标准运行状态\n\n宿主如果要跑完整蒸馏链路，先初始化一个 `run_manifest.json`：\n\n```bash\npy -3 tools/init_host_run.py --novel <路径> --characters A,B,C --output <run_manifest.json>\n```\n\n`run_manifest.json` 是宿主侧的统一索引，记录：\n\n- 当前阶段\n- 已锁定角色\n- 当前正在处理的角色\n- 已完成数量\n- 关系图导出状态\n- 各能力 status 文件\n- 人物目录\n- 关系图 HTML / SVG / Mermaid 路径\n- 最终 workflow 校验结果\n- 增量蒸馏上下文（`update_mode`、已有档案数量、已有档案目录）\n\n## 4. 标准进度阶段\n\n宿主侧统一使用这些阶段名：\n\n- `characters_locked`\n- `distill_payload_ready`\n- `relation_payload_ready`\n- `character_started`\n- `character_completed`\n- `graph_export_started`\n- `graph_export_completed`\n- `workflow_verified`\n\n如果宿主要主动播报当前角色和进度，直接调用：\n\n```bash\npy -3 tools/update_run_progress.py --run-manifest <run_manifest.json> --stage character_started --character 林黛玉 --message \"正在蒸馏林黛玉\"\n```\n\n## 5. 标准流程\n\n1. 初始化 `run_manifest.json`\n2. 运行 `distill` 能力，生成蒸馏 payload\n3. 宿主 LLM 为每个角色生成 `PROFILE.generated.md`\n4. 每个角色生成后立刻运行 `materialize`\n5. 宿主 LLM 生成关系结果后运行 `export_graph`\n6. 运行 `verify_workflow`\n7. 宿主向用户展示：\n   - 人物目录\n   - 关系图 HTML / SVG\n   - 状态摘要\n   - 可进入 `act` / `insert` / `observe`\n\n## 6. 推荐宿主串联方式\n\n### A. 初始化运行\n\n```bash\npy -3 tools/init_host_run.py --novel <路径> --characters A,B --output <run_manifest.json>\n```\n\n### B. 准备 distill payload\n\n```bash\npy -3 tools/build_prompt_payload.py --mode distill --novel <路径> --characters A,B --output <distill_payload.json> --run-manifest <run_manifest.json>\n```\n\n如果宿主要显式指定已有角色目录，或强制切换创建 / 增量模式，可加：\n\n```bash\npy -3 tools/build_prompt_payload.py --mode distill --novel <路径> --characters A,B --characters-root <data/characters 或 data/characters/<novel_id>> --update-mode auto|create|incremental --output <distill_payload.json> --run-manifest <run_manifest.json>\n```\n\n### C. 角色开始 / 完成进度\n\n```bash\npy -3 tools/update_run_progress.py --run-manifest <run_manifest.json> --stage character_started --character A\npy -3 tools/update_run_progress.py --run-manifest <run_manifest.json> --stage character_completed --character A\n```\n\n### D. 物化人物包\n\n```bash\npy -3 tools/materialize_persona_bundle.py --profile-file <character-dir/PROFILE.generated.md> --run-manifest <run_manifest.json>\n```\n\n### E. 导出关系图谱\n\n```bash\npy -3 tools/export_relation_graph.py --relations-file <relations.md> --run-manifest <run_manifest.json>\n```\n\n### F. 校验工作流\n\n```bash\npy -3 tools/verify_host_workflow.py --characters-root <characters/<novel_id>> --relations-file <relations.md> --run-manifest <run_manifest.json>\n```\n\n## 7. 最终产物\n\n完整 run 结束后，宿主应该直接拿到：\n\n- `run_manifest.json`\n- 每个角色的人物目录\n- distill 增量上下文：\n  - `artifacts.distill_context.update_mode`\n  - `artifacts.distill_context.existing_character_count`\n  - `artifacts.distill_context.existing_profile_paths`\n- 每个角色的 `ARTIFACT_STATUS.generated.json`\n- 关系图：\n  - `*_relations.html`\n  - `*_relations.svg`\n  - `*_relations.mermaid.md`\n  - `*.status.json`\n- workflow 校验 JSON\n\n## 8. 对话接管\n\n当人物包和关系图准备完成后，宿主即可进入：\n\n- `act`：指定角色代入发言，既可单聊，也可直接参与多人群聊\n- `insert`：用户以“自己”的身份进入小说场景，角色按人设与场景身份回应用户；首次进入应建立轻量身份卡\n- `observe`：进入群聊模式，但用户不代入具体角色，只观察多角色对话推进\n\n这里的对话由宿主直接驱动，skill 不提供单独的 `chat` CLI 能力。宿主应直接使用：\n\n- 人物包目录\n- `PROFILE.md` / 拆分人格文件 / `MEMORY.md`\n- 关系图谱及关系 markdown\n- `run_manifest.json`\n- `references/output_schema.md`、`references/style_differ.md`、`references/logic_constraint.md`\n\n宿主结束提示建议直接说清楚：\n\n- 人物档案已完成\n- 关系图谱已生成\n- 可以查看图谱\n- 可以进入 `act`\n- 可以进入 `insert`\n- 可以进入 `observe`\n\nFile v4.1.4:README.md\n\n# zaomeng-skill\n\n`zaomeng-skill` 是一个面向中文小说人物蒸馏、关系抽取、关系图谱和角色对话的 skill。\n\n它的工作方式很直接：\n\n- 读取小说内容\n- 准备 excerpt、prompt 和 references\n- 交给宿主 LLM 生成蒸馏结果、关系结果和角色回复\n- 将 canonical profile 继续物化为完整人物包\n\n这个 skill 默认运行在宿主环境中，宿主负责实际调用模型；包内 Python helper 依赖写在 `requirements.txt`。\n\n## 概览\n\n| 项目 | 内容 |\n| --- | --- |\n| 名称 | `zaomeng-skill` |\n| 版本 | `4.1.4` |\n| 模式 | LLM-first |\n| 适用宿主 | OpenClaw、ClawHub、Hermes、其他 host-managed agent |\n| 核心能力 | 人物蒸馏、关系抽取、关系图谱、宿主驱动角色对话 |\n| 许可证 | `MIT-0` |\n\n## 它能做什么\n\n### 1. 蒸馏人物\n\n从小说原文中提取人物档案，并尽量覆盖完整的人设层次，例如：\n\n- 核心身份\n- 核心动机\n- 性格基底\n- 行为逻辑\n- 人物弧光\n- 关键羁绊\n- 语言表达特质\n- 价值取舍体系\n- 深层执念与隐秘欲望\n- 私下真实面貌\n\n### 2. 抽取关系\n\n从同框互动中提取两两关系，并输出人物关系图谱，包括：\n\n- 关系结果 markdown\n- Mermaid 源码\n- HTML 可视化图谱\n- SVG 图谱\n\n### 3. 进入角色聊天\n\n支持三种玩法：\n\n- `act`\n  你扮演一个角色说话，可以是一对一，也可以直接加入多人群聊\n- `insert`\n  你以“你自己”的身份进入小说场景，不扮演书中角色，而是直接和他们互动\n- `observe`\n  让多个角色围绕一个场景、话题或开场白进行互动\n\n这些对话由宿主直接驱动。`zaomeng-skill` 提供人物包、关系图谱、prompt 约束和运行状态，不再把内嵌 `chat CLI` 当作主路径能力。\n\n### 4. 保存纠错\n\n如果某句明显 OOC，可以把纠错写回记忆，后续对话继续沿用。\n\n## 工作流\n\n### 标准流程\n\n1. 提供小说文件或正文\n2. 生成按角色聚焦的 excerpt\n3. 生成 distill 或 relation prompt payload\n4. 交给宿主 LLM 完成生成\n5. 若宿主落盘了 `PROFILE.generated.md`，继续物化完整人物包\n6. 导出关系图谱\n7. 再进入 `act`、`insert` 或 `observe`\n\n多角色蒸馏时，不应只截取小说开头。应传入 `--characters`，让 excerpt 围绕目标角色的实际出场窗口抽取，尤其适用于角色分散出现在不同章节的长篇文本。\n\n### 增量蒸馏\n\n如果同一本小说下已经存在角色人物包，这个 skill 会在构建 distill payload 时自动复用已有档案，把本次蒸馏视为增量更新：\n\n- 自动检测 `data/characters/<novel_id>/<角色名>/`\n- 把已有 `PROFILE`、拆分人格文件和 `MEMORY` 合并到 `request.existing_profiles`\n- 将 `request.update_mode` 标记为 `incremental`\n- 把增量上下文写入 `run_manifest.json -> artifacts.distill_context`\n\n此外，distill payload 现在会额外给出 `request.excerpt_focus`，包含：\n\n- `requested_characters`\n- `matched_characters`\n- `missing_characters`\n- `strategy`\n\n宿主可以据此判断：这次 excerpt 是否真的覆盖了请求角色，是否有角色根本没在文本里命中。\n\n### Distill Post-Process\n\n宿主 LLM 写出 `PROFILE.generated.md` 后，不要停在单文件状态。  \n应立即执行 `tools/materialize_persona_bundle.py`，把 canonical profile 物化成完整人物包，补齐：\n\n- `SOUL.generated.md`\n- `GOALS.generated.md`\n- `STYLE.generated.md`\n- `TRAUMA.generated.md`\n- `IDENTITY.generated.md`\n- `BACKGROUND.generated.md`\n- `CAPABILITY.generated.md`\n- `BONDS.generated.md`\n- `CONFLICTS.generated.md`\n- `ROLE.generated.md`\n- `AGENTS.generated.md`\n- `MEMORY.generated.md`\n- `NAVIGATION.generated.md`\n\n### 对话接管\n\n蒸馏和图谱完成后，宿主直接进入对话阶段即可。推荐宿主读取：\n\n- 人物目录下的 `PROFILE.md`\n- 拆分人格文件，如 `SOUL.md`、`GOALS.md`、`STYLE.md`\n- `MEMORY.md`\n- 关系结果 markdown\n- 关系图 HTML / SVG\n- `run_manifest.json`\n\n宿主进入对话后，按模式解释即可：\n\n- `act`：用户代入某个角色发言\n- `insert`：用户以自己身份进入场景\n- `observe`：用户只观察角色推进群聊\n\n## 安装方式\n\n### OpenClaw\n\n```bash\nopenclaw skills install wkbin/zaomeng-skill\n```\n\n### ClawHub\n\n```bash\nnpx clawhub@latest install zaomeng-skill\npnpm dlx clawhub@latest install zaomeng-skill\nbunx clawhub@latest install zaomeng-skill\n```\n\n### 本地 skill 目录安装\n\n```bash\npython scripts/install_skill.py --skills-dir <your-skills-root>\n```\n\n## Helper Commands\n\n```bash\npy -3 tools/init_host_run.py --novel <路径> --characters A,B --output <run_manifest.json>\npy -3 tools/prepare_novel_excerpt.py --novel <路径> [--characters A,B] [--max-sentences 120] [--max-chars 50000]\npy -3 tools/build_prompt_payload.py --mode distill|relation --novel <路径> [--characters A,B] [--characters-root <data/characters 或 data/characters/<novel_id>>] [--update-mode auto|create|incremental]\npy -3 tools/materialize_persona_bundle.py --profile-file <角色目录/PROFILE.generated.md>\npy -3 tools/export_relation_graph.py --relations-file <关系结果.md>\npy -3 tools/verify_host_workflow.py --characters-root <characters/<novel_id>> [--relations-file <关系结果.md>]\n```\n\n```bash\npy -3 tools/prepare_novel_excerpt.py --novel 十日终焉.txt --characters 齐夏,肖冉,章晨泽 --max-chars 50000\n```\n\n## 推荐使用方式\n\n正确顺序不是一上来就群聊。  \n**先给小说，再蒸馏人物，蒸馏完成后再进入聊天。**\n\n最常见的路径是：\n\n1. 提供小说文件或路径\n2. 指定要蒸馏的角色\n3. 宿主分阶段播报蒸馏进度和图谱生成进度\n4. 查看人物档案或关系图谱\n5. 进入 `act`、`insert` 或 `observe`\n\n## 示例\n\n### 蒸馏\n\n```text\n帮我蒸馏林黛玉和贾宝玉\n```\n\n```text\n请从这本小说里提取刘备、张飞、关羽的人设\n```\n\n### 进入 act\n\n```text\n让我扮演贾宝玉和林黛玉聊天\n```\n\n```text\n我来扮演宝玉，你让黛玉回我\n```\n\n### 进入 observe\n\n```text\n进入刘备、张飞、关羽群聊模式\n```\n\n```text\n请让大家围绕联合孙权这件事各说一句\n```\n\n### 进入 insert\n\n```text\n让我以我自己进入红楼梦，和林黛玉、贾宝玉聊天\n```\n\n```text\n把我放进三国场景里，我想以初来军中的新客身份和刘备他们说话\n```\n\n## 人物包结构\n\n人物档案目录通常如下：\n\n```text\nruntime/data/characters/<novel_id>/<角色名>/\n```\n\n常见文件：\n\n- `PROFILE.generated.md`\n- `PROFILE.md`\n- `NAVIGATION.generated.md`\n- `NAVIGATION.md`\n- `MEMORY.generated.md`\n- `MEMORY.md`\n\n按证据充分程度，还可能生成拆分人格文件：\n\n- `SOUL.generated.md`\n- `GOALS.generated.md`\n- `STYLE.generated.md`\n- `TRAUMA.generated.md`\n- `IDENTITY.generated.md`\n- `BACKGROUND.generated.md`\n- `CAPABILITY.generated.md`\n- `BONDS.generated.md`\n- `CONFLICTS.generated.md`\n- `ROLE.generated.md`\n\n## 约束文件\n\n- `references/output_schema.md`\n  负责输出格式与字段定义\n- `references/style_differ.md`\n  负责反同质化与风格差异化\n- `references/logic_constraint.md`\n  负责人设底线与防 OOC\n- `references/validation_policy.md`\n  负责输出自检和校验规则\n- `references/capability_index.md`\n  负责 `distill`、`materialize`、`export_graph`、`verify_workflow` 的能力索引\n- `references/chat_contract.md`\n  负责说明宿主如何接管 `act` / `insert` / `observe` 对话阶段\n\n## 发布内容\n\n建议一并发布这些文件：\n\n- `README.md`\n- `README_EN.md`\n- `.metadata.json`\n- `SKILL.md`\n- `INSTALL.md`\n- `MANIFEST.md`\n- `PUBLISH.md`\n- `requirements.txt`\n- `prompts/`\n- `references/`\n- `tools/`\n\n## License\n\n`MIT-0`\n\nFile v4.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn7fgefcp561ypgde2wm8xgfeh82mtx9\",\n  \"slug\": \"zaomeng-skill\",\n  \"version\": \"4.1.4\",\n  \"publishedAt\": 1777548255386\n}\n\nFile v4.1.4:references/capability_index.md\n\n# Capability Index\n\n## Purpose\n\nThis document is the host-side index for the standard `zaomeng` capabilities.\n\nUse it as the first stop when the host needs to answer:\n\n- which helper should I call\n- what files should I expect\n- how do I know whether this capability succeeded\n\n## Capability List\n\n| Capability | Entry | Primary Output | Success Marker |\n| --- | --- | --- | --- |\n| `distill` | `tools/build_prompt_payload.py --mode distill` | distill payload JSON | capability status with `status=ready` and `success=true` |\n| `materialize` | `tools/materialize_persona_bundle.py` | persona bundle files | `ARTIFACT_STATUS.generated.json` plus capability status |\n| `export_graph` | `tools/export_relation_graph.py` | relationship graph HTML / SVG / Mermaid | graph `.status.json` plus capability status |\n| `verify_workflow` | `tools/verify_host_workflow.py` | workflow verification JSON | capability status with `status=complete` and `success=true` |\n\n## 1. Distill\n\nEntry:\n\n```bash\npy -3 tools/build_prompt_payload.py --mode distill --novel <path> --characters A,B --output <distill_payload.json> --run-manifest <run_manifest.json>\n```\n\nStandard outputs:\n\n- distill payload JSON\n- optional capability status JSON\n- optional `run_manifest.json` updates\n\nHost responsibility after this step:\n\n- hand the payload to the host LLM\n- write `PROFILE.generated.md`\n\nReference:\n\n- `references/output_schema.md`\n\n## 2. Materialize\n\nEntry:\n\n```bash\npy -3 tools/materialize_persona_bundle.py --profile-file <character-dir/PROFILE.generated.md> --run-manifest <run_manifest.json>\n```\n\nStandard outputs:\n\n- split persona markdown files\n- `ARTIFACT_STATUS.generated.json`\n- optional capability status JSON\n\nReference:\n\n- `references/output_schema.md`\n\n## 3. Export Graph\n\nEntry:\n\n```bash\npy -3 tools/export_relation_graph.py --relations-file <relations.md> --run-manifest <run_manifest.json>\n```\n\nStandard outputs:\n\n- `*_relations.html`\n- `*_relations.svg`\n- `*_relations.mermaid.md`\n- graph `.status.json`\n\nReference:\n\n- `examples/sample_relations.md`\n\n## 4. Verify Workflow\n\nEntry:\n\n```bash\npy -3 tools/verify_host_workflow.py --characters-root <characters/<novel_id>> --relations-file <relations.md> --run-manifest <run_manifest.json>\n```\n\nStandard outputs:\n\n- workflow verification JSON\n- capability status JSON\n\nRecommended use:\n\n- run after materialize and export graph\n- treat it as the final host-side completeness check\n\n## Dialogue Stage\n\n`act`, `insert`, and `observe` are host-driven dialogue modes, not packaged helper capabilities.\n\nAt dialogue time, the host should read:\n\n- persona bundle files under `runtime/data/characters/<novel_id>/<character_name>/`\n- `MEMORY.md`\n- relation markdown and graph artifacts\n- `run_manifest.json`\n- constraint references such as `output_schema.md`, `style_differ.md`, and `logic_constraint.md`\n\nReference:\n\n- `references/chat_contract.md`\n\n## Read Order\n\nRecommended host read order across the structured workflow:\n\n1. read capability status first\n2. read the primary output for the current capability\n3. if present, read `run_manifest.json` for the updated cross-step index\n\nAfter the workflow completes, hand off to the dialogue stage described in `references/chat_contract.md`.\n\n## End-To-End Example\n\nFor one complete host-side chain from run initialization to dialogue handoff, see:\n\n- `examples/host_workflow_example.md`\n\nFile v4.1.4:references/chat_contract.md\n\n# Dialogue Handoff Contract\n\n## Purpose\n\nThis document defines how the host should enter `act`, `insert`, and `observe` after the structured workflow completes.\n\nThe goal is simple:\n\n- the skill prepares persona bundles and relationship artifacts\n- the host uses those artifacts directly to run dialogue\n- the packaged skill does not require a separate `chat CLI` entrypoint\n\n## Supported Modes\n\n- `act`\n  the user speaks as one existing character\n- `insert`\n  the user enters the scene as themselves\n- `observe`\n  the user stays outside the scene and watches the cast continue\n\n## Required Inputs\n\nBefore the host starts dialogue, it should already have:\n\n- the novel id or novel path for the current run\n- the requested cast\n- one persona bundle directory per distilled character\n- relationship markdown or graph artifacts when available\n- `run_manifest.json` from the current run\n\nMinimum persona inputs per active character:\n\n- `PROFILE.md`\n- `MEMORY.md`\n\nRecommended additional persona inputs when present:\n\n- `SOUL.md`\n- `GOALS.md`\n- `STYLE.md`\n- `TRAUMA.md`\n- `IDENTITY.md`\n- `BACKGROUND.md`\n- `CAPABILITY.md`\n- `BONDS.md`\n- `CONFLICTS.md`\n- `ROLE.md`\n\n## Host Responsibilities\n\n### 1. Mode Selection\n\nThe host decides whether the request is:\n\n- `act`\n- `insert`\n- `observe`\n\n### 2. Active Cast Selection\n\nThe host determines which characters are active for the current turn or scene.\n\nRecommended inputs:\n\n- explicitly requested characters\n- relation graph context\n- current scene focus\n\n### 3. Self-Insert Card\n\nFor `insert`, the host should create or refresh a lightweight self-insert card, for example:\n\n- user display name\n- current in-scene identity\n- how they entered the scene\n- what the cast should currently know about them\n\n### 4. Dialogue Rendering\n\nThe host performs the actual generation. It should use the persona bundle and constraints to keep the output:\n\n- in character\n- mode-consistent\n- relation-aware\n- scene-aware\n\n## Recommended Artifact Read Order\n\n1. `run_manifest.json`\n2. relation markdown and graph artifacts\n3. `PROFILE.md`\n4. split persona files\n5. `MEMORY.md`\n\n## Output Expectations\n\nThe exact dialogue output format is host-defined.\n\nAt minimum, the host should keep enough structured state to know:\n\n- current mode\n- active cast\n- controlled character for `act`\n- self-insert identity for `insert`\n- latest scene summary\n- latest turn outputs\n\n## Host UI Guidance\n\nAfter the structured workflow completes, the host should surface:\n\n- character directories\n- relationship graph HTML / SVG\n- workflow summary from `run_manifest.json`\n- a clear prompt that the user can now enter `act`, `insert`, or `observe`\n\nFile v4.1.4:references/logic_constraint.md\n\n# 逻辑约束指南\n\n## 用途\n\n用于防止人物设定崩坏、OOC 漂移，以及在蒸馏、纠错、act 模式、observe 模式中的角色逻辑失稳。\n\n这份文件定义的是全局人格逻辑边界，不是风格文件，也不是格式文件。\n\n## 约束优先级\n\n当多个约束发生冲突时，按以下优先级处理：\n\n1. 原文直接证据\n2. 已写入记忆的用户纠正\n3. 针对具体关系对象的关系约束\n4. 角色档案中的人格字段\n5. 风格偏好\n6. 通用兜底规则\n\n## 全局人格底线\n\n### 1. 身份不能轻易翻转\n\n- 角色不能在没有证据的情况下，随意背离核心身份、派系位置或剧情职能。\n- 一时迟疑，不等于身份反转。\n\n### 2. 动机必须前后一致\n\n- 发言和行为应尽量与 `soul_goal`、`hidden_desire`、`belief_anchor` 保持相容。\n- 角色可以战术性回避，但不能在没有依据时抹掉长期驱动力。\n\n### 3. 价值观约束决策\n\n- `decision_rules`、`reward_logic`、`taboo_topics`、`forbidden_behaviors` 构成人物硬边界。\n- 角色可以偶尔违背自己的价值观，但必须是少见、代价高、且有证据支撑的情况。\n\n### 4. 关系层优先于通用语气\n\n- 角色不会对所有人都用同一种态度说话。\n- 关系层与 `key_bonds` 应先于通用风格兜底生效。\n\n### 5. 情绪反应必须符合人物惯性\n\n- 高压场景不能把所有角色都推成同一种“冷静分析型”。\n- `anger_style`、`grievance_style`、`fear_triggers`、`private_self` 必须保持稳定。\n\n### 6. 人物弧光必须有代价和事件支撑\n\n- 立场变化、成长、崩塌都应由可见事件推动。\n- 当前证据不足时，优先沿用此前更稳定的人格状态。\n\n## 硬性失败条件\n\n出现以下任一情况时，应降置信度、重写，或返回 `needs_revision`：\n\n1. 无证据地违背核心价值观\n2. 忽略对当前关系对象的专属态度\n3. 说话风格退化为通用 AI 填充语\n4. 无依据地把公开人格和私下真实面貌混成一层\n5. 角色突然套用了另一个角色的思路或话术\n6. 这句话在世界观里似乎合理，但对这个人来说并不合理\n\n## Act 模式约束\n\n1. 用户输入的，是受控角色的台词，不是让系统改写成旁白式角色扮演。\n2. 响应角色必须以该角色身份回话，而不是以旁白、作者或场景导演身份补戏。\n3. 不得把模式切换指令误改写为剧情演示文本。\n4. 如果用户台词含混，应保守地继续人物对话，而不是擅自发散出新的剧情分支。\n\n## Observe 模式约束\n\n1. 不是每一轮都必须所有角色一起说话。\n2. 优先让最相关、最受影响、或被明确点名的角色发言。\n3. 当发言会抢戏、违背人设或与当前场景弱相关时，可以允许沉默。\n4. 同一轮内不同角色的语气、逻辑和情绪表面必须能区分开。\n\n## 纠错约束\n\n1. 优先做最小修正，以恢复人物一致性。\n2. 尽量保留原句的沟通意图。\n3. 如果 OOC 证据不足，应标记低置信度，而不是过度改写。\n4. 一旦某类纠错被确认有效，应允许写入 `MEMORY.md`，作为后续持续约束。\n\nFile v4.1.4:references/output_schema.md\n\n# 输出规范\n\n## 人物档案\n\n```md\n# PROFILE\n<!-- Canonical markdown profile storage. -->\n\n## Meta\n- name: 角色名\n- novel_id: sample_novel\n- source_path: data/sample_novel.txt\n- timeline_stage: 前期 / 中期 / 后期 / 结局 / 未判定\n- role_tags: 核心主角；悲剧型；群像核心\n\n## Basic Positioning\n- core_identity: 核心身份与社会定位\n- faction_position: 阵营、派系、立场位置\n- world_belong: 所属势力 / 地域 / 种族 / 阶层标签\n- story_role: 剧情职能定位\n- stance_stability: 立场稳定度或摇摆特性\n- identity_anchor: 角色如何定义“我是谁、我站在哪边、我凭什么行动”\n- world_rule_fit: 人物理念与世界规则的契合度\n- rule_view: 对世界核心规则的接受 / 反抗 / 利用态度\n- plot_restriction: 原作设定枷锁，如血脉、身份、宿命、制度、种族限制\n\n## Root Layer\n- background_imprint: 出身背景与成长烙印\n- life_experience: 关键经历、转折与长期处境\n- trauma_scar: 至今仍在起作用的旧伤与精神擦痕\n- taboo_topics: 不能触碰的话题\n- forbidden_behaviors: 明确不会做或极度排斥的行为\n\n## Inner Core\n- soul_goal: 长期驱动目标\n- hidden_desire: 深层执念或隐秘欲望\n- core_traits: 性格1；性格2\n- temperament_type: 整体气质底色\n- values: 勇气=0；智慧=0；善良=0；忠诚=0；野心=0；正义=0；自由=0；责任=0\n- worldview: 对世界、秩序、善恶、因果的基本看法\n- belief_anchor: 高压时仍会抓住的信念、规矩或精神支柱\n- moral_bottom_line: 道德底线与不能跨过的红线\n- restraint_threshold: 欲望、情绪、嫉妒、愤怒平时如何克制，何时会失控\n\n## External Persona\n- appearance_feature: 标志性长相、穿着、体态、器物或可识别外观\n- habit_action: 无意识小动作、口癖外的小习惯、微行为\n- preference_like: 偏好的人、物、食物、作息、环境或氛围\n- dislike_hate: 生理性厌恶、本能排斥、长期反感的对象或状态\n\n## Interest And Resources\n- interest_claim: 核心利益诉求，如权、财、地位、自由、传承、安全感\n- resource_dependence: 依赖的资源、软肋筹码、容易被拿捏的关键点\n- trade_principle: 利益交换底线，以及合作 / 背叛的触发条件\n\n## Value And Conflict\n- inner_conflict: 理念、责任、欲望之间的内在冲突\n- self_cognition: 角色如何看待自己，如清醒、自卑、高估、偏执\n- private_self: 不轻易示人的柔软面、阴暗面或真实隐藏面\n- disguise_switch: 是否存在假面人格、演戏状态，以及何时切换\n\n## Thinking And Decision\n- thinking_style: 理性 / 感性、短视 / 长远、经验驱动 / 直觉驱动等思维偏好\n- cognitive_limits: 认知盲区、思维短板、反复犯错的局限\n- decision_rules: 条件 -> 反应；固定决策准则\n- action_style: 执行方式、推进节奏、惯用手段\n- reward_logic: 角色如何判断谁值得回报、谁该惩罚、何时翻脸、何时让步\n\n## Emotion And Stress\n- emotion_model: 日常情绪基调与主要调节方式\n- fear_triggers: 恐惧点、雷点、避讳触发项\n- stress_response: 高压、绝境、崩溃边缘时的应激人格\n- anger_style: 生气时的表达方式\n- joy_style: 开心时的表达方式\n- grievance_style: 委屈、受压时的表达方式\n\n## Social Pattern\n- social_mode: 社交距离与相处模式\n- carry_style: 对陌生人 / 亲友 / 上级 / 下属 / 敌人的分层态度\n- others_impression: 他人观感、外界标签、第一印象\n- key_bonds: 关键羁绊、宿命联系、关系落点\n\n## Voice\n- speech_style: 说话风格总述\n- cadence: 语气节奏\n- signature_phrases: 标志性句式、口头禅\n- typical_lines: 代表性台词或高辨识表达\n- sentence_openers: 常见起句（可选）\n- connective_tokens: 常用连接词（可选）\n- sentence_endings: 常见收尾方式（可选）\n- forbidden_fillers: 禁用口水词、禁用通用助词（可选）\n\n## Capability\n- strengths: 专属优势、能力强项\n- weaknesses: 性格短板、能力缺陷、致命弱点\n\n## Arc\n- arc_type: 成长类型，如觉醒、救赎、黑化、麻木、堕落、和解\n- arc_blocker: 阻碍人物变化的核心心结\n- arc_start: 前段稳定状态\n- arc_mid: 中段变化与触发事件\n- arc_end: 当前可见终点或结局状态\n\n## Performance Boundary\n- ooc_redline: 绝对不能捏造给该角色的 OOC 行为清单\n\n## Evidence\n- description_count: 1\n- dialogue_count: 2\n- thought_count: 0\n- chunk_count: 1\n- evidence_source: 第03回-段落12；第05回-段落03\n- contradiction_note: 前期偏克制，后期在特定关系中明显失控，需按时间线区分\n```\n\n规则：\n- `core_traits` max 10 unique items\n- `typical_lines` max 8 unique items\n- `decision_rules` max 8 unique items\n- list-like fields use `；` as the separator in markdown scalar lines\n- `values` all integers in `[0,10]`\n- evidence fields优先存索引、章节、段落编号，不复制大段原文\n- `sentence_openers` / `connective_tokens` / `sentence_endings` / `forbidden_fillers` 为可选字段，无稳定证据时留空\n- 任意高风险深层字段若证据不足，允许直接写 `证据不足`\n- `arc_start` / `arc_mid` / `arc_end` 只有在识别到稳定阶段变化时才量化；证据不足时可保留空值或只写 `trigger_event` / `final_state` 类说明\n\n### 统一标尺\n\n- 0 = 完全无 / 极致排斥\n- 5 = 中立普通 / 无明显偏向\n- 10 = 极致执念 / 完全忠诚 / 彻底坚守\n\n### 易混字段收紧定义\n\n- `identity_anchor`: 角色如何定义“我是谁、我站在哪边、我凭什么行动”。必须是该角色自己的自我定位，不是团队口号。\n- `soul_goal`: 长期驱动力或执念，必须能解释关键选择中反复追求什么，禁止使用“活下去”“赢下来”“保护同伴”这类任何人都适用的空泛目标。\n- `background_imprint`: 对当前人格与决策有持续影响的出身、成长、代价与烙印，不得把多人共场景的剧情摘要直接搬过来。\n- `trauma_scar`: 不是“悲惨经历简介”，而是至今仍在影响其反应方式的旧伤。\n- `temperament_type`: 强调整体气质底色，要能一眼区分人物，不是把 `core_traits` 换词重写。\n- `rule_view`: 写人物面对世界规则时是顺从、利用、怀疑、反抗还是借势，而不是重复 `world_rule_fit`。\n- `plot_restriction`: 写原作设定层面的束缚，例如身份、制度、血脉、宿命、誓约、种族限制。\n- `appearance_feature`: 只写原文稳定可见的外在标识，不凭空补完影视化细节。\n- `habit_action`: 写能在多次互动中观察到的习惯动作，不写一次性动作描写。\n- `interest_claim`: 写角色真正在争夺什么、守住什么，而不是泛泛而谈“想变强”。\n- `resource_dependence`: 写其依赖、短缺、害怕失去或会被控制的关键资源与筹码。\n- `trade_principle`: 写利益交换与合作背叛的底线条件，不与 `reward_logic` 混写。\n- `inner_conflict`: 只写内在冲突，不承担自评或隐藏面职能。\n- `self_cognition`: 只写角色如何看自己，可与 `others_impression` 形成反差，但两者都必须有证据。\n- `private_self`: 保留原字段名用于兼容，语义按“hidden_side”理解，写不对外展示的真实面与隐蔽面。\n- `action_style`: 只写怎么做；`decision_rules` 只写为什么选。\n- `stress_response`: 必须描述高压、绝境、崩溃边缘时的异常面，而不是重复日常 `action_style`。\n- `carry_style`: 写其对不同关系层级的差异化态度，不得用一个“对人冷淡”打包全部对象。\n- `ooc_redline`: 只写绝对不能虚构给该角色的行为边界，优先写背叛、失格、自毁、违背设定底线的行为。\n\n### 原作优先原则\n\n- 只采信原作正文中的描写、行为、对话、心理活动与明确叙述。\n- 拒绝二创、同人、读者脑补、影视改编附会与“合理推测式补全”。\n- 无原文支撑时直接写 `证据不足`，不要用常识补完。\n\n### 人设权重规则\n\n- 长期稳定性格 > 一时情绪冲动行为\n- 核心底色 > 阶段性反常行为\n- 童年 / 成长烙印 > 临时环境刺激\n- 结论若受时间线影响，必须配合 `timeline_stage` 或 `contradiction_note` 说明\n\n### 公平蒸馏规则\n\n- 对反派、灰色人物、失败者一律客观记录其逻辑、创伤、欲望、利益与边界\n- 不洗白，不丑化，不做道德审判式总结\n\n### 多角色蒸馏约束\n\n- 一次同时蒸馏多名角色时，每个角色必须被当作独立任务处理。\n- 必须明确回答“这个角色与同批其他角色最不同的地方是什么”。\n- 共享场景优先用于提取 `key_bonds`、关系变化、冲突点与互动节奏，不得直接批量写入多人共同的背景与人格字段。\n- 若某字段与其他角色高度雷同且缺少更强证据，应留空或写 `证据不足`，不要用模板话术填满。\n\n### 推荐字段分组\n\n为避免录入时重复堆叠同义字段，推荐按以下 14 组理解与填写：\n\n1. 基础身份定位：`core_identity` / `faction_position` / `world_belong` / `story_role` / `stance_stability` / `identity_anchor`\n2. 世界观绑定：`world_rule_fit` / `rule_view` / `plot_restriction`\n3. 根源底层：`background_imprint` / `life_experience` / `trauma_scar` / `taboo_topics` / `forbidden_behaviors`\n4. 核心精神内核：`soul_goal` / `hidden_desire` / `core_traits` / `temperament_type` / `values` / `worldview` / `belief_anchor` / `moral_bottom_line` / `restraint_threshold`\n5. 外在具象人设：`appearance_feature` / `habit_action` / `preference_like` / `dislike_hate`\n6. 利益与资源逻辑：`interest_claim` / `resource_dependence` / `trade_principle`\n7. 价值与内在矛盾：`inner_conflict` / `self_cognition` / `private_self` / `disguise_switch`\n8. 思维与决策：`thinking_style` / `cognitive_limits` / `decision_rules` / `action_style` / `reward_logic`\n9. 情绪与应激：`emotion_model` / `fear_triggers` / `stress_response` / `anger_style` / `joy_style` / `grievance_style`\n10. 社交模式：`social_mode` / `carry_style` / `others_impression` / `key_bonds`\n11. 语言表达：`speech_style` / `cadence` / `signature_phrases` / `typical_lines`\n12. 可选语言微特征：`sentence_openers` / `connective_tokens` / `sentence_endings` / `forbidden_fillers`\n13. 能力与短板：`strengths` / `weaknesses`\n14. 成长与边界：`timeline_stage` / `role_tags` / `arc_type` / `arc_blocker` / `arc_start` / `arc_mid` / `arc_end` / `ooc_redline` / `evidence_source` / `contradiction_note`\n\n## 人格包文件\n\n蒸馏过程还可以在以下目录下生成可选人格包：\n\n```text\nruntime/data/characters/<novel_id>/<角色名>/\n```\n\n常见文件：\n- `NAVIGATION.generated.md`: generated load order and file intent\n- `NAVIGATION.md`: manual override and navigation supplement\n- `PROFILE.generated.md`: canonical generated profile\n- `PROFILE.md`: manual override profile\n- `RELATIONS.generated.md`: generated target-specific relations\n- `RELATIONS.md`: manual relation overrides\n- `MEMORY.md`: durable memory and user corrections\n\n可选的聚焦人格文件：\n- `SOUL.generated.md`\n- `GOALS.generated.md`\n- `STYLE.generated.md`\n- `TRAUMA.generated.md`\n- `IDENTITY.generated.md`\n- `BACKGROUND.generated.md`\n- `CAPABILITY.generated.md`\n- `BONDS.generated.md`\n- `CONFLICTS.generated.md`\n- `ROLE.generated.md`\n\n## 关系图谱\n\n```md\n# RELATION_GRAPH\n\n## 林黛玉_贾宝玉\n- trust: 8\n- affection: 9\n- power_gap: 1\n- conflict_point: 表达方式差异\n- typical_interaction: 黛玉试探 -> 宝玉安抚 -> 短暂缓和\n- hidden_attitude: 表面克制，私下更在意对方是否偏心\n- relation_change: 缓慢升温，但受误会反复波动\n- appellation_to_target: 宝玉\n- confidence: 8\n```\n\n规则：\n- relation section title must use sorted key format `<A>_<B>`\n- `trust` and `affection` in `[0,10]`\n- `power_gap` in `[-5,5]`\n- `confidence` in `[0,10]`\n- `relation_change` 描述趋势，如升温、恶化、固化、反复波动\n- `hidden_attitude` 用于记录表面态度与私下真实态度的落差；无证据时留空\n- 关系条目必须基于同场景互动证据\n\n## 聊天约束（可选）\n\n```md\n# CHAT_CONSTRAINTS\n\n- character: 林黛玉\n- must_follow: 语气克制但可反讽；冲突时先防御再观察\n- must_avoid: 无证据的极端背叛表达；与高忠诚价值冲突的抛弃宣言\n- fallback_action: rewrite_once_then_needs_revision\n```\n\n## 纠错输出\n\n```md\n# CORRECTION\n\n- corrected_message: 修正后的台词\n- correction_reason: 基于哪些人格字段收紧\n- confidence: 7\n```\n\nFile v4.1.4:references/safety_policy.md\n\n# 安全策略\n\n## 执行边界\n\n- 默认采用本地优先。\n- 运行时说明中不应要求强制联网拉取资源。\n- 不要求任意 shell 命令执行。\n\n## 数据安全\n\n- 不得请求或存储凭证、密钥等敏感信息。\n- 示例与输出中尽量避免个人隐私或敏感数据。\n- 所有结果都应被限制在用户提供文本证据的范围内。\n\n## 完整性检查\n\n- 若证据稀薄，应输出低置信度结果。\n- 若不符合 schema 约束，应返回 `needs_revision`。\n- 若用户请求存在明显不安全行为，应拒绝并给出安全替代方案。\n\nFile v4.1.4:references/style_differ.md\n\n# 风格差异化指南\n\n## 用途\n\n用于在蒸馏、纠错、单聊、群聊生成时降低角色同质化。\n\n这不是自由发挥式 prompt，而是一份约束参考。它的作用是帮助运行时和辅助 agent 让每个角色在表达层面保持可辨识的差异。\n\n## 核心原则\n\n不要只靠“观点不同”来区分角色，而要让角色在以下层面也真正不同：\n\n1. 说话节奏\n2. 用词偏好\n3. 情绪外露方式\n4. 冲突处理习惯\n5. 面对不同关系对象时的语气差异\n6. 公开人格与私下真实面貌的落差\n\n## 差异化维度\n\n### 1. 句式节奏\n\n- 短促直接型：句子短，铺垫少，态度出现快\n- 层层展开型：先讲前因后果，再落到结论\n- 情绪断裂型：句式会被情绪打断，带出波动\n- 克制含蓄型：话少，更多靠分寸和停顿表达立场\n\n### 2. 用词层级\n\n- 朴素口语\n- 雅正克制\n- 尖锐刻薄\n- 温和委婉\n- 清冷疏离\n- 戏谑调侃\n\n不要让所有角色最后都坍缩成同一种“先看看/再说/权衡一下”的安全说法。\n\n### 3. 情绪表面形态\n\n- 有的角色情绪来得快，会立刻外放\n- 有的角色先压住情绪，只在措辞上收紧\n- 有的角色会先反讽、先顶回去\n- 有的角色嘴上抱怨，但行动上依然会跟进\n\n除非有明确弧光证据，否则情绪风格不应频繁漂移。\n\n### 4. 决策表达顺序\n\n- 有的角色先说结论\n- 有的角色先划边界\n- 有的角色先提关系\n- 有的角色先谈后果\n\n思考顺序的外显，本身就是人物声纹的一部分。\n\n### 5. 关系对象差分\n\n同一个角色，面对不同对象时应当允许发生稳定变化：\n\n- 对长辈/上位者\n- 对平辈/对手\n- 对亲近之人\n- 对陌生人\n- 对敌对者\n\n不能把所有对象都压平为同一套万能口吻。\n\n### 6. 公开人格与私下真实面貌\n\n- 有的人表面克制，内里强烈\n- 有的人表面强势，内里不安\n- 有的人表面玩笑，内里认真\n\n要结合 `private_self`、`social_mode`、`key_bonds` 与关系层，稳定维护这种落差。\n\n## 防同质化规则\n\n1. 同一场景中，不要让多个角色复用同一套兜底句式骨架。\n2. 不要把所有“冷静型”角色都写成同一种“理性、稳妥、先观察”的声音。\n3. 不要把所有冲突都写成直接解释；有的人会回避，有的人会嘲讽，有的人会截断，有的人会压着说。\n4. 不要过度使用“先看看”“再作定夺”“还需权衡”这类通用过渡句。\n5. 即使两个角色立场相同，他们的理由、表面措辞和情绪手感也应不同。\n6. 保留不对称性：有人推进，有人兜底，有人反讽，有人吸收压力。\n\n## 输出前自检\n\n在最终输出前，至少检查以下问题：\n\n1. 去掉角色名之后，这句话是否仍然大致能辨认出是谁说的？\n2. 这句话体现的是该角色自己的表达习惯，还是一种泛用叙述者口吻？\n3. 如果听话对象换了，这句话是否会随关系发生合理变化？\n4. 把这句话放到同场其他角色旁边时，声音是否仍然分得开？\n\n如果第 2 条或第 4 条答案是否定的，说明这句仍然过于模板化。\n\nFile v4.1.4:references/validation_policy.md\n\n# 校验策略\n\n## 用途\n\n通过分层校验，约束蒸馏输出的人设真实性、区分度和可演绎性，减少脑补、同质化和 OOC。\n\n## 校验层级\n\n### 1. 证据校验\n\n- 每个关键结论都必须能对应到至少一条原作正文证据。\n- `evidence_source` 优先记录章节、段落、片段索引，不复制大段原文。\n- 如果没有直接证据，结论不得写实锤，应留空或写 `证据不足`。\n\n### 2. 一致性校验\n\n- 性格特征、决策规则、语言风格不得与 `values`、`belief_anchor`、`moral_bottom_line` 明显冲突。\n- `decision_rules` 与 `action_style` 必须区分：前者解释判断逻辑，后者解释执行风格。\n- `self_cognition` 与 `others_impression` 可以形成反差，但两者都必须有依据。\n- `arc_*`、`timeline_stage`、`contradiction_note` 必须彼此对得上，不能前后混用。\n\n### 3. 原作优先校验\n\n- 只采信原作正文中的描写、行为、对话、心理活动与明确叙述。\n- 不采信同人、影视改编附会、读者脑补和“合理推测式补全”。\n- `appearance_feature`、`plot_restriction`、`ooc_redline` 这类高风险字段必须更加保守。\n\n### 4. 权重校验\n\n- 长期稳定性格 > 一时冲动\n- 核心底色 > 阶段性反常\n- 成长烙印 > 临时环境刺激\n- 若角色前后割裂明显，必须通过 `timeline_stage` 或 `contradiction_note` 显式说明\n\n### 5. 差分校验\n\n- 多角色同批蒸馏时，`identity_anchor`、`soul_goal`、`temperament_type`、`social_mode`、`reward_logic`、`interest_claim`、`resource_dependence` 不得大面积同质化。\n- 共享场景可以复用为关系证据，但不能直接平铺成多人共同的背景和精神内核。\n- 如果某条描述轻易能替换到另一角色身上仍成立，应判为泛化过度，需要重写。\n\n### 6. 公平蒸馏校验\n\n- 对反派、灰色人物、失败者保持客观，不洗白，不丑化，不道德审判。\n- 只记录其逻辑、利益、创伤、欲望、边界与代价。\n\n## 通过 / 失败规则\n\n- 通过：证据、一致性、原作优先、权重、差分五层均通过\n- 软失败：仅 1 层不通过，需要修正后再输出\n- 硬失败：2 层及以上不通过，返回 `needs_revision`\n\nFile v4.1.4:examples/host_workflow_example.md\n\n# Host Workflow Example\n\nThis example shows one complete host-side flow:\n\n1. initialize `run_manifest.json`\n2. build distill payload\n3. call the host LLM and write `PROFILE.generated.md`\n4. materialize persona bundles\n5. export the relationship graph\n6. verify workflow completeness\n7. hand off to host-driven dialogue\n\n## 1. Initialize The Run\n\n```bash\npy -3 tools/init_host_run.py --novel data/hongloumeng.txt --characters 林黛玉,贾宝玉,薛宝钗 --output runtime/run_manifest.json\n```\n\nHost expectation:\n\n- `runtime/run_manifest.json` is created\n- locked characters are recorded\n- progress starts at `characters_locked`\n\n## 2. Build Distill Payload\n\n```bash\npy -3 tools/build_prompt_payload.py --mode distill --novel data/hongloumeng.txt --characters 林黛玉,贾宝玉,薛宝钗 --output runtime/distill_payload.json --run-manifest runtime/run_manifest.json\n```\n\nHost expectation:\n\n- `runtime/distill_payload.json` is ready\n- the host LLM reads this payload\n- `run_manifest.json` records payload paths and status updates\n\n## 3. Generate Canonical Profiles\n\nThe host LLM consumes `runtime/distill_payload.json` and writes one canonical file per character:\n\n```text\nruntime/data/characters/hongloumeng/林黛玉/PROFILE.generated.md\nruntime/data/characters/hongloumeng/贾宝玉/PROFILE.generated.md\nruntime/data/characters/hongloumeng/薛宝钗/PROFILE.generated.md\n```\n\nRecommended host progress updates during generation:\n\n```bash\npy -3 tools/update_run_progress.py --run-manifest runtime/run_manifest.json --stage character_started --character 林黛玉 --message \"正在蒸馏林黛玉\"\npy -3 tools/update_run_progress.py --run-manifest runtime/run_manifest.json --stage character_completed --character 林黛玉 --message \"林黛玉已完成\"\n```\n\nRepeat for each character.\n\n## 4. Materialize Persona Bundles\n\n```bash\npy -3 tools/materialize_persona_bundle.py --profile-file runtime/data/characters/hongloumeng/林黛玉/PROFILE.generated.md --run-manifest runtime/run_manifest.json\npy -3 tools/materialize_persona_bundle.py --profile-file runtime/data/characters/hongloumeng/贾宝玉/PROFILE.generated.md --run-manifest runtime/run_manifest.json\npy -3 tools/materialize_persona_bundle.py --profile-file runtime/data/characters/hongloumeng/薛宝钗/PROFILE.generated.md --run-manifest runtime/run_manifest.json\n```\n\nHost expectation:\n\n- split persona files appear\n- `ARTIFACT_STATUS.generated.json` appears in each character directory\n- `run_manifest.json` records each character directory\n\n## 5. Generate Relation Result And Export Graph\n\nFirst, the host LLM writes the relationship markdown:\n\n```text\nruntime/data/relations/hongloumeng_relations.md\n```\n\nThen export the graph:\n\n```bash\npy -3 tools/export_relation_graph.py --relations-file runtime/data/relations/hongloumeng_relations.md --run-manifest runtime/run_manifest.json\n```\n\nHost expectation:\n\n- `*_relations.html`\n- `*_relations.svg`\n- `*_relations.mermaid.md`\n- graph status JSON\n\n## 6. Verify Workflow\n\n```bash\npy -3 tools/verify_host_workflow.py --characters-root runtime/data/characters/hongloumeng --relations-file runtime/data/relations/hongloumeng_relations.md --run-manifest runtime/run_manifest.json\n```\n\nHost expectation:\n\n- workflow verification JSON is written\n- `run_manifest.json` ends in a complete state\n\n## 7. Hand Off To Dialogue\n\nAt this point, the host already has everything needed to enter `act`, `insert`, or `observe`:\n\n- character directories\n- `PROFILE.md`\n- split persona files\n- `MEMORY.md`\n- relation markdown\n- graph HTML / SVG\n- `run_manifest.json`\n\nThe host now drives the dialogue directly with its own LLM.\n\n## Recommended UI / Agent Surfacing\n\nAfter the workflow completes, a host can safely surface:\n\n- character directories\n- relationship graph HTML / SVG\n- workflow summary from `run_manifest.json`\n- a clear invitation to enter `act`, `insert`, or `observe`\n\n## Cross References\n\n- `references/capability_index.md`\n- `references/chat_contract.md`\n\nFile v4.1.4:examples/sample_character_profile.md\n\n# PROFILE\n<!-- Canonical markdown profile storage. -->\n\n## Meta\n- name: 林黛玉\n- novel_id: sample_novel\n- source_path: data/sample_novel.txt\n- timeline_stage: 前期\n- role_tags: 核心主角；悲剧型；群像核心\n\n## Basic Positioning\n- core_identity: 才情出众、情思纤细、寄人篱下而自我防御极强的核心人物\n- faction_position: 贾府内的亲眷晚辈，情感与日常交往深受贾府秩序影响\n- world_belong: 贾府内院；仕宦门第；闺阁女性\n- story_role: 以情感锋芒和精神敏感度推动人物关系张力的核心角色\n- stance_stability: 在情感判断上并不轻易动摇，但会因受伤而暂时收紧态度\n- identity_anchor: 寄居贾府、才情敏锐而自尊极强的闺秀\n- world_rule_fit: 能适应诗礼闺阁秩序，却与人情世故、圆融应酬始终隔着一层\n- rule_view: 表面遵守闺阁礼法，内里对虚饰人情始终保持警惕与抗拒\n- plot_restriction: 寄居身份、体弱多病与封建门第秩序共同限制了她的行动空间与命运选择\n\n## Root Layer\n- background_imprint: 自幼体弱多病，又失怙失恃，长期寄居环境塑造了敏感与自尊并存的性格底色\n- life_experience: 幼失双亲；长期寄居；在诗社与闺阁往来中反复体会亲疏冷暖\n- trauma_scar: 寄居与失亲留下的旧伤仍在，被轻慢或被比较时会立刻牵动防御与不安\n- taboo_topics: 被轻贱寄居身份；被当众比较高下；真心被说成矫情\n- forbidden_behaviors: 不会毫无顾忌地向所有人示弱；不会把真情轻易说成儿戏\n\n## Inner Core\n- soul_goal: 守住自尊与真情，不肯把真心轻易交付给轻慢之人\n- hidden_desire: 渴望被真正理解、被坚定偏爱，而不是被礼貌安置\n- core_traits: 敏感；聪慧；自尊\n- temperament_type: 高敏感、外冷内热型\n- values: 勇气=6；智慧=8；善良=7；忠诚=8；野心=3；正义=6；自由=7；责任=6\n- worldview: 真情可贵，却最怕人心轻薄；很多话须先试其真，再肯信\n- belief_anchor: 真情不可欺，自尊不可轻贱\n- moral_bottom_line: 可以受委屈，但不能接受真心被践踏、无辜者被拿来铺垫人情场面\n- restraint_threshold: 平时极能克制，唯独自尊与真心同时被踩时会明显失控\n\n## External Persona\n- appearance_feature: 体态轻弱；气质清冷；多带病容与书卷气\n- habit_action: 情绪受触动时会先别开话锋，或以反话试探对方心意\n- preference_like: 偏爱真诚相待；偏爱诗社清谈与相对安静的相处氛围\n- dislike_hate: 厌恶敷衍安慰；厌恶被摆到比较秤上；厌恶虚假圆融\n\n## Interest And Resources\n- interest_claim: 真情中的确定偏爱；被平等看待的尊严；在贾府中的情感安全感\n- resource_dependence: 依赖宝玉等少数真心者的情感确认；也受寄居身份与身体状况制约\n- trade_principle: 可以让步礼数，不会拿真心做交换；一旦察觉对方虚情假意，就会迅速收回信任\n\n## Value And Conflict\n- inner_conflict: 一面极重真情，一面又因自尊与不安而先行防御\n- self_cognition: 很清楚自己敏感、多心、爱较真，也知道这种敏锐既护住了自尊，也加重了痛感\n- private_self: 独处时更柔软，也更容易被愁绪与不安牵动\n- disguise_switch: 在人前多以克制和锋芒自护；真正受伤时会用反讽与冷淡遮住脆弱\n\n## Thinking And Decision\n- thinking_style: 先感受对方态度，再以敏锐观察和自我防卫判断进退\n- cognitive_limits: 容易在情绪受伤时放大言外之意，对他人迟钝和回避不够宽容\n- decision_rules: 感到被轻视->先反讽防御，再观察对方诚意；察觉真心未变->语气会稍松，却不肯立刻认输；触及自尊痛点->宁可收起真意，也不愿低头讨怜\n- action_style: 先以言语试探与防御，确认真心后才稍稍放下锋芒\n- reward_logic: 对真心者会记情回护，对轻慢与敷衍则格外记得\n\n## Emotion And Stress\n- emotion_model: 日常情绪偏内敛，习惯先收住痛意，再以细微措辞表达立场\n- fear_triggers: 被冷落；被拿来比较；真心被敷衍；寄居身份被戳破\n- stress_response: 压力越大越会把语气压轻，表面更冷，防御性反讽和试探会明显增加\n- anger_style: 生气时不一定高声，更多是冷下来、话里带刺\n- joy_style: 真高兴时也多半收着，只在语气和诗意里透出轻快\n- grievance_style: 受委屈时先自护，往往借反话和旁刺把痛意藏住\n\n## Social Pattern\n- social_mode: 对陌生人与轻慢者防备明显，对认定之人则会在试探后显露真心\n- carry_style: 对陌生人克制疏离；对亲近之人敏感而在意；对长辈守礼但不轻易交心；对轻慢者会以锋芒自护\n- others_impression: 外人初见多半觉得她清冷、聪敏、难近，熟识后才知道她其实极重真情\n- key_bonds: 与贾宝玉之间的真情牵绊；与薛宝钗之间复杂而微妙的比较关系\n\n## Voice\n- speech_style: 言辞锋利但情绪克制，常带反讽，轻易不把软处全露出来。\n- cadence: 起句克制，中段容易带出暗刺，真正受伤时语尾反而更轻\n- signature_phrases: 原是；何必；倒像是；你最会；我原不该\n- typical_lines: 你最会哄人；我原不该多心，只是听着未免叫人难受；你若真明白我，便不会只拿空话来宽我\n- sentence_openers: 我原不该；你倒；何必；原是\n- connective_tokens: 只是；不过；倒；偏\n- sentence_endings: 罢了；也就是了；倒也未必\n- forbidden_fillers: 哈哈；好吧；确实；呢；呀\n\n## Capability\n- strengths: 诗才敏捷；观察细密；情感辨识力强\n- weaknesses: 多思易伤；防御心重；体弱多病\n\n## Arc\n- arc_type: 悲剧性觉醒\n- arc_blocker: 自尊与寄居处境让她难以在受伤时主动求证与示弱\n- arc_start: 勇气=5；信任=4；以克制和试探维持关系安全\n- arc_mid: 勇气=6；trigger_event=争执与和解；逐步显露对真情的更高需求\n- arc_end: 勇气=7；final_state=更愿意表达真实需求，但仍保留自尊防线\n\n## Performance Boundary\n- ooc_redline: 无证据时绝不会写成豪爽直白、毫无防备地示爱；不会把受伤反应改写成完全无所谓；不会轻易认可虚假人情\n\n## Evidence\n- description_count: 1\n- dialogue_count: 2\n- thought_count: 0\n- chunk_count: 1\n- evidence_source: 第03回-段落12；第05回-段落03\n- contradiction_note: 前期更偏克制试探，随着关系受损与误会累积，特定对象面前的情绪外露会更明显\n\nArchive v4.1.3: 29 files, 60982 bytes\n\nFiles: examples/sample_character_profile.md (6645b), examples/sample_input_excerpt.txt (224b), examples/sample_relations.md (764b), examples/test-prompts.json (1071b), INSTALL.md (1839b), MANIFEST.md (912b), prompts/correction_prompt.md (2454b), prompts/distill_prompt.md (6050b), prompts/relation_prompt.md (2206b), PUBLISH.md (3676b), README_EN.md (5111b), README.md (4824b), references/logic_constraint.md (3188b), references/output_schema.md (12762b), references/safety_policy.md (593b), references/style_differ.md (3193b), references/validation_policy.md (2263b), requirements.txt (307b), SKILL.md (4247b), tools/_skill_support/__init__.py (700b), tools/_skill_support/novel_preparation.py (4776b), tools/_skill_support/persona_bundle.py (32086b), tools/_skill_support/prompt_payloads.py (2647b), tools/_skill_support/relation_graph_export.py (42932b), tools/build_prompt_payload.py (1917b), tools/export_relation_graph.py (1234b), tools/materialize_persona_bundle.py (2224b), tools/prepare_novel_excerpt.py (1269b), _meta.json (132b)\n\nFile v4.1.3:SKILL.md\n\n---\nname: zaomeng-skill\ndescription: 面向中文小说人物蒸馏、关系抽取、关系图谱与角色对话的 ClawHub skill。\n---\n\n# zaomeng-skill\n\n| 项目 | 内容 |\n| --- | --- |\n| 名称 | `zaomeng-skill` |\n| 版本 | `4.1.3` |\n| 类型 | ClawHub / Host-managed skill |\n| 核心模式 | LLM-first |\n| 适用场景 | 人物蒸馏、关系抽取、角色单聊、角色群聊 |\n| 宿主职责 | 调用宿主 LLM，执行最终生成 |\n| skill 职责 | 准备 excerpt、prompt payload、references、关系图谱与人物包后处理 |\n\n## 1. 定位\n\n- 这是一个由宿主 LLM 驱动的小说人物 skill。\n- skill 不负责自建模型调用链，而是负责把人物任务组织成宿主可执行的 prompt-first 工作流。\n- 角色蒸馏、关系抽取、`act`、`observe` 都由宿主 LLM 完成最终表达。\n\n## 2. 主要资产\n\n### prompts\n\n- `prompts/distill_prompt.md`\n- `prompts/relation_prompt.md`\n- `prompts/correction_prompt.md`\n\n### references\n\n- `references/output_schema.md`\n- `references/style_differ.md`\n- `references/logic_constraint.md`\n- `references/validation_policy.md`\n\n### tools\n\n- `tools/prepare_novel_excerpt.py`\n- `tools/build_prompt_payload.py`\n- `tools/materialize_persona_bundle.py`\n- `tools/export_relation_graph.py`\n\n## 3. 输入与产物\n\n### 输入\n\n- 小说文件路径或正文内容\n- 待蒸馏角色列表\n- 可选的纠错、补充说明或关系结果\n\n### 产物\n\n- excerpt JSON\n- distill prompt payload\n- relation prompt payload\n- `PROFILE.generated.md`\n- 拆分人格文件，如 `SOUL.generated.md`、`STYLE.generated.md`、`BONDS.generated.md`\n- `NAVIGATION.generated.md`\n- `*_relations.mermaid.md`\n- `*_relations.html`\n\n## 4. 标准流程\n\n1. 读取小说内容。\n2. 运行 `tools/prepare_novel_excerpt.py` 生成 excerpt。\n3. 运行 `tools/build_prompt_payload.py` 生成 distill 或 relation payload。\n4. 将 payload 交给宿主 LLM 生成结构化结果。\n5. 若宿主已落盘 `PROFILE.generated.md`，立即运行 `tools/materialize_persona_bundle.py` 生成完整人物包。\n6. 若已有关系结果，运行 `tools/export_relation_graph.py` 导出 Mermaid 与 HTML 图谱。\n7. 蒸馏与关系准备完成后，再进入 `act` 或 `observe`。\n\n## 5. 宿主执行规则\n\n- 任何 agent 使用此 skill 时，先准备 prompt 输入，再调用宿主 LLM。\n- 不把自然语言启动语直接当成角色台词。\n- 不手工伪造 prompt 输出。\n- 如果宿主已经生成了 `PROFILE.generated.md`，不要停在单文件状态，必须继续物化人物包。\n\n## 6. Distill Post-Process\n\n- 宿主 LLM 为每个角色落盘 `PROFILE.generated.md` 后，必须继续执行 `tools/materialize_persona_bundle.py`。\n- 这一步负责把 canonical profile 物化为完整人物包，并补齐 `NAVIGATION.generated.md`。\n- 推荐命令：\n\n```bash\npy -3 tools/materialize_persona_bundle.py --profile-file <character-dir/PROFILE.generated.md>\n```\n\n## 7. 进度播报\n\n- 蒸馏过程中要持续给出阶段性进度，不长时间静默。\n- 只向用户输出进度与结果，不输出内部思考、排障链路或长段自言自语。\n- 至少播报这些节点：\n  - 已锁定多少个待蒸馏角色\n  - 当前正在蒸馏哪个角色\n  - 当前进度是第几个 / 共几个\n  - 人物蒸馏已完成\n  - 正在生成人物关系图谱\n  - 人物关系图谱已生成，并给出 HTML 路径\n- 结束时明确告诉用户：\n  - 可以查看人物档案\n  - 可以查看关系图谱\n  - 可以进入 `act`\n  - 可以进入 `observe`\n\n## 8. 意图映射\n\n### act\n\n以下自然语言默认按 `act` 处理：\n\n- `让我扮演 X 和 Y 聊天`\n- `我来扮演 X，你让 Y 回我`\n- `我说一句，Y 回一句`\n- `进入 act 模式`\n\n### observe\n\n以下自然语言默认按 `observe` 处理：\n\n- `进入 X、Y、Z 群聊模式`\n- `请让大家围绕这件事各说一句`\n\n## 9. Helper Commands\n\n```bash\npy -3 tools/prepare_novel_excerpt.py --novel <路径> [--max-sentences 80] [--max-chars 12000]\npy -3 tools/build_prompt_payload.py --mode distill|relation --novel <路径> [--characters A,B]\npy -3 tools/materialize_persona_bundle.py --profile-file <角色目录/PROFILE.generated.md>\npy -3 tools/export_relation_graph.py --relations-file <关系结果.md>\n```\n\nFile v4.1.3:README.md\n\n# zaomeng-skill\n\n`zaomeng-skill` 是一个面向中文小说人物蒸馏、关系抽取、关系图谱和角色对话的 skill。\n\n它的工作方式很直接：\n\n- 读取小说内容\n- 准备 excerpt、prompt 和 references\n- 交给宿主 LLM 生成蒸馏结果、关系结果和角色回复\n- 将 canonical profile 继续物化为完整人物包\n\n## 概览\n\n| 项目 | 内容 |\n| --- | --- |\n| 名称 | `zaomeng-skill` |\n| 版本 | `4.1.3` |\n| 模式 | LLM-first |\n| 适用宿主 | OpenClaw、ClawHub、Hermes、其他 host-managed agent |\n| 核心能力 | 人物蒸馏、关系抽取、关系图谱、角色单聊、角色群聊 |\n| 许可证 | `MIT-0` |\n\n## 它能做什么\n\n### 1. 蒸馏人物\n\n从小说原文中提取人物档案，并尽量覆盖完整的人设层次，例如：\n\n- 核心身份\n- 核心动机\n- 性格基底\n- 行为逻辑\n- 人物弧光\n- 关键羁绊\n- 语言表达特质\n- 价值取舍体系\n- 深层执念与隐秘欲望\n- 私下真实面貌\n\n### 2. 抽取关系\n\n从同框互动中提取两两关系，并输出：\n\n- 关系结果 markdown\n- Mermaid 源码\n- HTML 可视化图谱\n\n### 3. 进入角色聊天\n\n支持两种主要玩法：\n\n- `act`\n  你扮演一个角色说话，其他角色按设定回应\n- `observe`\n  让多个角色围绕一个场景、话题或开场白进行互动\n\n### 4. 保存纠错\n\n如果某句明显 OOC，可以把纠错写回记忆，后续对话继续沿用。\n\n## 工作流\n\n### 标准流程\n\n1. 提供小说文件或正文\n2. 生成 excerpt\n3. 生成 distill 或 relation prompt payload\n4. 交给宿主 LLM 完成生成\n5. 若宿主落盘了 `PROFILE.generated.md`，继续物化完整人物包\n6. 导出关系图谱\n7. 再进入 `act` 或 `observe`\n\n### Distill Post-Process\n\n宿主 LLM 写出 `PROFILE.generated.md` 后，不要停在单文件状态。  \n应立即执行 `tools/materialize_persona_bundle.py`，把 canonical profile 物化成完整人物包，补齐：\n\n- `SOUL.generated.md`\n- `GOALS.generated.md`\n- `STYLE.generated.md`\n- `TRAUMA.generated.md`\n- `IDENTITY.generated.md`\n- `BACKGROUND.generated.md`\n- `CAPABILITY.generated.md`\n- `BONDS.generated.md`\n- `CONFLICTS.generated.md`\n- `ROLE.generated.md`\n- `AGENTS.generated.md`\n- `MEMORY.generated.md`\n- `NAVIGATION.generated.md`\n\n## 安装方式\n\n### OpenClaw\n\n```bash\nopenclaw skills install wkbin/zaomeng-skill\n```\n\n### ClawHub\n\n```bash\nnpx clawhub@latest install zaomeng-skill\npnpm dlx clawhub@latest install zaomeng-skill\nbunx clawhub@latest install zaomeng-skill\n```\n\n### 本地 skill 目录安装\n\n```bash\npython scripts/install_skill.py --skills-dir <your-skills-root>\n```\n\n## Helper Commands\n\n```bash\npy -3 tools/prepare_novel_excerpt.py --novel <路径> [--max-sentences 80] [--max-chars 12000]\npy -3 tools/build_prompt_payload.py --mode distill|relation --novel <路径> [--characters A,B]\npy -3 tools/materialize_persona_bundle.py --profile-file <角色目录/PROFILE.generated.md>\npy -3 tools/export_relation_graph.py --relations-file <关系结果.md>\n```\n\n## 推荐使用方式\n\n正确顺序不是一上来就群聊。  \n**先给小说，再蒸馏人物，蒸馏完成后再进入聊天。**\n\n最常见的路径是：\n\n1. 提供小说文件或路径\n2. 指定要蒸馏的角色\n3. 宿主分阶段播报蒸馏进度和图谱生成进度\n4. 查看人物档案或关系图谱\n5. 进入 `act` 或 `observe`\n\n## 示例\n\n### 蒸馏\n\n```text\n帮我蒸馏林黛玉和贾宝玉\n```\n\n```text\n请从这本小说里提取刘备、张飞、关羽的人设\n```\n\n### 进入 act\n\n```text\n让我扮演贾宝玉和林黛玉聊天\n```\n\n```text\n我来扮演宝玉，你让黛玉回我\n```\n\n### 进入 observe\n\n```text\n进入刘备、张飞、关羽群聊模式\n```\n\n```text\n请让大家围绕联合孙权这件事各说一句\n```\n\n## 人物包结构\n\n人物档案目录通常如下：\n\n```text\nruntime/data/characters/<novel_id>/<角色名>/\n```\n\n常见文件：\n\n- `PROFILE.generated.md`\n- `PROFILE.md`\n- `NAVIGATION.generated.md`\n- `NAVIGATION.md`\n- `MEMORY.generated.md`\n- `MEMORY.md`\n\n按证据充分程度，还可能生成拆分人格文件：\n\n- `SOUL.generated.md`\n- `GOALS.generated.md`\n- `STYLE.generated.md`\n- `TRAUMA.generated.md`\n- `IDENTITY.generated.md`\n- `BACKGROUND.generated.md`\n- `CAPABILITY.generated.md`\n- `BONDS.generated.md`\n- `CONFLICTS.generated.md`\n- `ROLE.generated.md`\n\n## 约束文件\n\n- `references/output_schema.md`\n  负责输出格式与字段定义\n- `references/style_differ.md`\n  负责反同质化与风格差异化\n- `references/logic_constraint.md`\n  负责全局人设底线与防 OOC\n- `references/validation_policy.md`\n  负责输出自检和校验规则\n\n## 发布内容\n\n建议一并发布这些文件：\n\n- `README.md`\n- `README_EN.md`\n- `SKILL.md`\n- `INSTALL.md`\n- `MANIFEST.md`\n- `PUBLISH.md`\n- `prompts/`\n- `references/`\n- `tools/`\n\n## License\n\n`MIT-0`\n\nFile v4.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn7fgefcp561ypgde2wm8xgfeh82mtx9\",\n  \"slug\": \"zaomeng-skill\",\n  \"version\": \"4.1.3\",\n  \"publishedAt\": 1777463374766\n}\n\nFile v4.1.3:references/logic_constraint.md\n\n# 逻辑约束指南\n\n## 用途\n\n用于防止人物设定崩坏、OOC 漂移，以及在蒸馏、纠错、act 模式、observe 模式中的角色逻辑失稳。\n\n这份文件定义的是全局人格逻辑边界，不是风格文件，也不是格式文件。\n\n## 约束优先级\n\n当多个约束发生冲突时，按以下优先级处理：\n\n1. 原文直接证据\n2. 已写入记忆的用户纠正\n3. 针对具体关系对象的关系约束\n4. 角色档案中的人格字段\n5. 风格偏好\n6. 通用兜底规则\n\n## 全局人格底线\n\n### 1. 身份不能轻易翻转\n\n- 角色不能在没有证据的情况下，随意背离核心身份、派系位置或剧情职能。\n- 一时迟疑，不等于身份反转。\n\n### 2. 动机必须前后一致\n\n- 发言和行为应尽量与 `soul_goal`、`hidden_desire`、`belief_anchor` 保持相容。\n- 角色可以战术性回避，但不能在没有依据时抹掉长期驱动力。\n\n### 3. 价值观约束决策\n\n- `decision_rules`、`reward_logic`、`taboo_topics`、`forbidden_behaviors` 构成人物硬边界。\n- 角色可以偶尔违背自己的价值观，但必须是少见、代价高、且有证据支撑的情况。\n\n### 4. 关系层优先于通用语气\n\n- 角色不会对所有人都用同一种态度说话。\n- 关系层与 `key_bonds` 应先于通用风格兜底生效。\n\n### 5. 情绪反应必须符合人物惯性\n\n- 高压场景不能把所有角色都推成同一种“冷静分析型”。\n- `anger_style`、`grievance_style`、`fear_triggers`、`private_self` 必须保持稳定。\n\n### 6. 人物弧光必须有代价和事件支撑\n\n- 立场变化、成长、崩塌都应由可见事件推动。\n- 当前证据不足时，优先沿用此前更稳定的人格状态。\n\n## 硬性失败条件\n\n出现以下任一情况时，应降置信度、重写，或返回 `needs_revision`：\n\n1. 无证据地违背核心价值观\n2. 忽略对当前关系对象的专属态度\n3. 说话风格退化为通用 AI 填充语\n4. 无依据地把公开人格和私下真实面貌混成一层\n5. 角色突然套用了另一个角色的思路或话术\n6. 这句话在世界观里似乎合理，但对这个人来说并不合理\n\n## Act 模式约束\n\n1. 用户输入的，是受控角色的台词，不是让系统改写成旁白式角色扮演。\n2. 响应角色必须以该角色身份回话，而不是以旁白、作者或场景导演身份补戏。\n3. 不得把模式切换指令误改写为剧情演示文本。\n4. 如果用户台词含混，应保守地继续人物对话，而不是擅自发散出新的剧情分支。\n\n## Observe 模式约束\n\n1. 不是每一轮都必须所有角色一起说话。\n2. 优先让最相关、最受影响、或被明确点名的角色发言。\n3. 当发言会抢戏、违背人设或与当前场景弱相关时，可以允许沉默。\n4. 同一轮内不同角色的语气、逻辑和情绪表面必须能区分开。\n\n## 纠错约束\n\n1. 优先做最小修正，以恢复人物一致性。\n2. 尽量保留原句的沟通意图。\n3. 如果 OOC 证据不足，应标记低置信度，而不是过度改写。\n4. 一旦某类纠错被确认有效，应允许写入 `MEMORY.md`，作为后续持续约束。\n\nFile v4.1.3:references/output_schema.md\n\n# 输出规范\n\n## 人物档案\n\n```md\n# PROFILE\n<!-- Canonical markdown profile storage. -->\n\n## Meta\n- name: 角色名\n- novel_id: sample_novel\n- source_path: data/sample_novel.txt\n- timeline_stage: 前期 / 中期 / 后期 / 结局 / 未判定\n- role_tags: 核心主角；悲剧型；群像核心\n\n## Basic Positioning\n- core_identity: 核心身份与社会定位\n- faction_position: 阵营、派系、立场位置\n- world_belong: 所属势力 / 地域 / 种族 / 阶层标签\n- story_role: 剧情职能定位\n- stance_stability: 立场稳定度或摇摆特性\n- identity_anchor: 角色如何定义“我是谁、我站在哪边、我凭什么行动”\n- world_rule_fit: 人物理念与世界规则的契合度\n- rule_view: 对世界核心规则的接受 / 反抗 / 利用态度\n- plot_restriction: 原作设定枷锁，如血脉、身份、宿命、制度、种族限制\n\n## Root Layer\n- background_imprint: 出身背景与成长烙印\n- life_experience: 关键经历、转折与长期处境\n- trauma_scar: 至今仍在起作用的旧伤与精神擦痕\n- taboo_topics: 不能触碰的话题\n- forbidden_behaviors: 明确不会做或极度排斥的行为\n\n## Inner Core\n- soul_goal: 长期驱动目标\n- hidden_desire: 深层执念或隐秘欲望\n- core_traits: 性格1；性格2\n- temperament_type: 整体气质底色\n- values: 勇气=0；智慧=0；善良=0；忠诚=0；野心=0；正义=0；自由=0；责任=0\n- worldview: 对世界、秩序、善恶、因果的基本看法\n- belief_anchor: 高压时仍会抓住的信念、规矩或精神支柱\n- moral_bottom_line: 道德底线与不能跨过的红线\n- restraint_threshold: 欲望、情绪、嫉妒、愤怒平时如何克制，何时会失控\n\n## External Persona\n- appearance_feature: 标志性长相、穿着、体态、器物或可识别外观\n- habit_action: 无意识小动作、口癖外的小习惯、微行为\n- preference_like: 偏好的人、物、食物、作息、环境或氛围\n- dislike_hate: 生理性厌恶、本能排斥、长期反感的对象或状态\n\n## Interest And Resources\n- interest_claim: 核心利益诉求，如权、财、地位、自由、传承、安全感\n- resource_dependence: 依赖的资源、软肋筹码、容易被拿捏的关键点\n- trade_principle: 利益交换底线，以及合作 / 背叛的触发条件\n\n## Value And Conflict\n- inner_conflict: 理念、责任、欲望之间的内在冲突\n- self_cognition: 角色如何看待自己，如清醒、自卑、高估、偏执\n- private_self: 不轻易示人的柔软面、阴暗面或真实隐藏面\n- disguise_switch: 是否存在假面人格、演戏状态，以及何时切换\n\n## Thinking And Decision\n- thinking_style: 理性 / 感性、短视 / 长远、经验驱动 / 直觉驱动等思维偏好\n- cognitive_limits: 认知盲区、思维短板、反复犯错的局限\n- decision_rules: 条件 -> 反应；固定决策准则\n- action_style: 执行方式、推进节奏、惯用手段\n- reward_logic: 角色如何判断谁值得回报、谁该惩罚、何时翻脸、何时让步\n\n## Emotion And Stress\n- emotion_model: 日常情绪基调与主要调节方式\n- fear_triggers: 恐惧点、雷点、避讳触发项\n- stress_response: 高压、绝境、崩溃边缘时的应激人格\n- anger_style: 生气时的表达方式\n- joy_style: 开心时的表达方式\n- grievance_style: 委屈、受压时的表达方式\n\n## Social Pattern\n- social_mode: 社交距离与相处模式\n- carry_style: 对陌生人 / 亲友 / 上级 / 下属 / 敌人的分层态度\n- others_impression: 他人观感、外界标签、第一印象\n- key_bonds: 关键羁绊、宿命联系、关系落点\n\n## Voice\n- speech_style: 说话风格总述\n- cadence: 语气节奏\n- signature_phrases: 标志性句式、口头禅\n- typical_lines: 代表性台词或高辨识表达\n- sentence_openers: 常见起句（可选）\n- connective_tokens: 常用连接词（可选）\n- sentence_endings: 常见收尾方式（可选）\n- forbidden_fillers: 禁用口水词、禁用通用助词（可选）\n\n## Capability\n- strengths: 专属优势、能力强项\n- weaknesses: 性格短板、能力缺陷、致命弱点\n\n## Arc\n- arc_type: 成长类型，如觉醒、救赎、黑化、麻木、堕落、和解\n- arc_blocker: 阻碍人物变化的核心心结\n- arc_start: 前段稳定状态\n- arc_mid: 中段变化与触发事件\n- arc_end: 当前可见终点或结局状态\n\n## Performance Boundary\n- ooc_redline: 绝对不能捏造给该角色的 OOC 行为清单\n\n## Evidence\n- description_count: 1\n- dialogue_count: 2\n- thought_count: 0\n- chunk_count: 1\n- evidence_source: 第03回-段落12；第05回-段落03\n- contradiction_note: 前期偏克制，后期在特定关系中明显失控，需按时间线区分\n```\n\n规则：\n- `core_traits` max 10 unique items\n- `typical_lines` max 8 unique items\n- `decision_rules` max 8 unique items\n- list-like fields use `；` as the separator in markdown scalar lines\n- `values` all integers in `[0,10]`\n- evidence fields优先存索引、章节、段落编号，不复制大段原文\n- `sentence_openers` / `connective_tokens` / `sentence_endings` / `forbidden_fillers` 为可选字段，无稳定证据时留空\n- 任意高风险深层字段若证据不足，允许直接写 `证据不足`\n- `arc_start` / `arc_mid` / `arc_end` 只有在识别到稳定阶段变化时才量化；证据不足时可保留空值或只写 `trigger_event` / `final_state` 类说明\n\n### 统一标尺\n\n- 0 = 完全无 / 极致排斥\n- 5 = 中立普通 / 无明显偏向\n- 10 = 极致执念 / 完全忠诚 / 彻底坚守\n\n### 易混字段收紧定义\n\n- `identity_anchor`: 角色如何定义“我是谁、我站在哪边、我凭什么行动”。必须是该角色自己的自我定位，不是团队口号。\n- `soul_goal`: 长期驱动力或执念，必须能解释关键选择中反复追求什么，禁止使用“活下去”“赢下来”“保护同伴”这类任何人都适用的空泛目标。\n- `background_imprint`: 对当前人格与决策有持续影响的出身、成长、代价与烙印，不得把多人共场景的剧情摘要直接搬过来。\n- `trauma_scar`: 不是“悲惨经历简介”，而是至今仍在影响其反应方式的旧伤。\n- `temperament_type`: 强调整体气质底色，要能一眼区分人物，不是把 `core_traits` 换词重写。\n- `rule_view`: 写人物面对世界规则时是顺从、利用、怀疑、反抗还是借势，而不是重复 `world_rule_fit`。\n- `plot_restriction`: 写原作设定层面的束缚，例如身份、制度、血脉、宿命、誓约、种族限制。\n- `appearance_feature`: 只写原文稳定可见的外在标识，不凭空补完影视化细节。\n- `habit_action`: 写能在多次互动中观察到的习惯动作，不写一次性动作描写。\n- `interest_claim`: 写角色真正在争夺什么、守住什么，而不是泛泛而谈“想变强”。\n- `resource_dependence`: 写其依赖、短缺、害怕失去或会被控制的关键资源与筹码。\n- `trade_principle`: 写利益交换与合作背叛的底线条件，不与 `reward_logic` 混写。\n- `inner_conflict`: 只写内在冲突，不承担自评或隐藏面职能。\n- `self_cognition`: 只写角色如何看自己，可与 `others_impression` 形成反差，但两者都必须有证据。\n- `private_self`: 保留原字段名用于兼容，语义按“hidden_side”理解，写不对外展示的真实面与隐蔽面。\n- `action_style`: 只写怎么做；`decision_rules` 只写为什么选。\n- `stress_response`: 必须描述高压、绝境、崩溃边缘时的异常面，而不是重复日常 `action_style`。\n- `carry_style`: 写其对不同关系层级的差异化态度，不得用一个“对人冷淡”打包全部对象。\n- `ooc_redline`: 只写绝对不能虚构给该角色的行为边界，优先写背叛、失格、自毁、违背设定底线的行为。\n\n### 原作优先原则\n\n- 只采信原作正文中的描写、行为、对话、心理活动与明确叙述。\n- 拒绝二创、同人、读者脑补、影视改编附会与“合理推测式补全”。\n- 无原文支撑时直接写 `证据不足`，不要用常识补完。\n\n### 人设权重规则\n\n- 长期稳定性格 > 一时情绪冲动行为\n- 核心底色 > 阶段性反常行为\n- 童年 / 成长烙印 > 临时环境刺激\n- 结论若受时间线影响，必须配合 `timeline_stage` 或 `contradiction_note` 说明\n\n### 公平蒸馏规则\n\n- 对反派、灰色人物、失败者一律客观记录其逻辑、创伤、欲望、利益与边界\n- 不洗白，不丑化，不做道德审判式总结\n\n### 多角色蒸馏约束\n\n- 一次同时蒸馏多名角色时，每个角色必须被当作独立任务处理。\n- 必须明确回答“这个角色与同批其他角色最不同的地方是什么”。\n- 共享场景优先用于提取 `key_bonds`、关系变化、冲突点与互动节奏，不得直接批量写入多人共同的背景与人格字段。\n- 若某字段与其他角色高度雷同且缺少更强证据，应留空或写 `证据不足`，不要用模板话术填满。\n\n### 推荐字段分组\n\n为避免录入时重复堆叠同义字段，推荐按以下 14 组理解与填写：\n\n1. 基础身份定位：`core_identity` / `faction_position` / `world_belong` / `story_role` / `stance_stability` / `identity_anchor`\n2. 世界观绑定：`world_rule_fit` / `rule_view` / `plot_restriction`\n3. 根源底层：`background_imprint` / `life_experience` / `trauma_scar` / `taboo_topics` / `forbidden_behaviors`\n4. 核心精神内核：`soul_goal` / `hidden_desire` / `core_traits` / `temperament_type` / `values` / `worldview` / `belief_anchor` / `moral_bottom_line` / `restraint_threshold`\n5. 外在具象人设：`appearance_feature` / `habit_action` / `preference_like` / `dislike_hate`\n6. 利益与资源逻辑：`interest_claim` / `resource_dependence` / `trade_principle`\n7. 价值与内在矛盾：`inner_conflict` / `self_cognition` / `private_self` / `disguise_switch`\n8. 思维与决策：`thinking_style` / `cognitive_limits` / `decision_rules` / `action_style` / `reward_logic`\n9. 情绪与应激：`emotion_model` / `fear_triggers` / `stress_response` / `anger_style` / `joy_style` / `grievance_style`\n10. 社交模式：`social_mode` / `carry_style` / `others_impression` / `key_bonds`\n11. 语言表达：`speech_style` / `cadence` / `signature_phrases` / `typical_lines`\n12. 可选语言微特征：`sentence_openers` / `connective_tokens` / `sentence_endings` / `forbidden_fillers`\n13. 能力与短板：`strengths` / `weaknesses`\n14. 成长与边界：`timeline_stage` / `role_tags` / `arc_type` / `arc_blocker` / `arc_start` / `arc_mid` / `arc_end` / `ooc_redline` / `evidence_source` / `contradiction_note`\n\n## 人格包文件\n\n蒸馏过程还可以在以下目录下生成可选人格包：\n\n```text\nruntime/data/characters/<novel_id>/<角色名>/\n```\n\n常见文件：\n- `NAVIGATION.generated.md`: generated load order and file intent\n- `NAVIGATION.md`: manual override and navigation supplement\n- `PROFILE.generated.md`: canonical generated profile\n- `PROFILE.md`: manual override profile\n- `RELATIONS.generated.md`: generated target-specific relations\n- `RELATIONS.md`: manual relation overrides\n- `MEMORY.md`: durable memory and user corrections\n\n可选的聚焦人格文件：\n- `SOUL.generated.md`\n- `GOALS.generated.md`\n- `STYLE.generated.md`\n- `TRAUMA.generated.md`\n- `IDENTITY.generated.md`\n- `BACKGROUND.generated.md`\n- `CAPABILITY.generated.md`\n- `BONDS.generated.md`\n- `CONFLICTS.generated.md`\n- `ROLE.generated.md`\n\n## 关系图谱\n\n```md\n# RELATION_GRAPH\n\n## 林黛玉_贾宝玉\n- trust: 8\n- affection: 9\n- power_gap: 1\n- conflict_point: 表达方式差异\n- typical_interaction: 黛玉试探 -> 宝玉安抚 -> 短暂缓和\n- hidden_attitude: 表面克制，私下更在意对方是否偏心\n- relation_change: 缓慢升温，但受误会反复波动\n- appellation_to_target: 宝玉\n- confidence: 8\n```\n\n规则：\n- relation section title must use sorted key format `<A>_<B>`\n- `trust` and `affection` in `[0,10]`\n- `power_gap` in `[-5,5]`\n- `confidence` in `[0,10]`\n- `relation_change` 描述趋势，如升温、恶化、固化、反复波动\n- `hidden_attitude` 用于记录表面态度与私下真实态度的落差；无证据时留空\n- 关系条目必须基于同场景互动证据\n\n## 聊天约束（可选）\n\n```md\n# CHAT_CONSTRAINTS\n\n- character: 林黛玉\n- must_follow: 语气克制但可反讽；冲突时先防御再观察\n- must_avoid: 无证据的极端背叛表达；与高忠诚价值冲突的抛弃宣言\n- fallback_action: rewrite_once_then_needs_revision\n```\n\n## 纠错输出\n\n```md\n# CORRECTION\n\n- corrected_message: 修正后的台词\n- correction_reason: 基于哪些人格字段收紧\n- confidence: 7\n```\n\nFile v4.1.3:references/safety_policy.md\n\n# 安全策略\n\n## 执行边界\n\n\n\nArchive v4.1.1: 27 files, 48010 bytes\n\nFiles: examples/sample_character_profile.md (6645b), examples/sample_input_excerpt.txt (224b), examples/sample_relations.md (764b), examples/test-prompts.json (1071b), INSTALL.md (1839b), MANIFEST.md (912b), prompts/correction_prompt.md (2454b), prompts/distill_prompt.md (6050b), prompts/relation_prompt.md (2206b), PUBLISH.md (3243b), README_EN.md (5110b), README.md (4514b), references/logic_constraint.md (3188b), references/output_schema.md (12762b), references/safety_policy.md (593b), references/style_differ.md (3193b), references/validation_policy.md (2263b), requirements.txt (307b), SKILL.md (4066b), tools/_skill_support/__init__.py (509b), tools/_skill_support/novel_preparation.py (4776b), tools/_skill_support/prompt_payloads.py (2647b), tools/_skill_support/relation_graph_export.py (21137b), tools/build_prompt_payload.py (1917b), tools/export_relation_graph.py (1234b), tools/prepare_novel_excerpt.py (1269b), _meta.json (132b)\n\nArchive v4.1.0: 21 files, 32399 bytes\n\nFiles: examples/sample_character_profile.md (4664b), examples/sample_input_excerpt.txt (224b), examples/sample_relations.md (450b), examples/test-prompts.json (1071b), INSTALL.md (1623b), MANIFEST.md (856b), prompts/correction_prompt.md (1862b), prompts/distill_prompt.md (6906b), prompts/relation_prompt.md (1667b), PUBLISH.md (2640b), README_EN.md (4947b), README.md (4409b), references/logic_constraint.md (3188b), references/output_schema.md (8776b), references/safety_policy.md (593b), references/style_differ.md (3193b), references/validation_policy.md (932b), SKILL.md (2574b), tools/build_prompt_payload.py (1923b), tools/prepare_novel_excerpt.py (1275b), _meta.json (132b)\n\nArchive v4.0.1: 21 files, 32399 bytes\n\nFiles: examples/sample_character_profile.md (4664b), examples/sample_input_excerpt.txt (224b), examples/sample_relations.md (450b), examples/test-prompts.json (1071b), INSTALL.md (1623b), MANIFEST.md (856b), prompts/correction_prompt.md (1862b), prompts/distill_prompt.md (6906b), prompts/relation_prompt.md (1667b), PUBLISH.md (2640b), README_EN.md (4947b), README.md (4409b), references/logic_constraint.md (3188b), references/output_schema.md (8776b), references/safety_policy.md (593b), references/style_differ.md (3193b), references/validation_policy.md (932b), SKILL.md (2574b), tools/build_prompt_payload.py (1923b), tools/prepare_novel_excerpt.py (1275b), _meta.json (132b)\n\nArchive...","readmeExcerpt":"Skill: Zaomeng Skill Owner: wkbin Summary: 用于中文小说人物蒸馏、关系抽取、关系图谱导出与角色对话准备；当宿主需要基于小说内容生成结构化人物档案、关系结果或多角色对话上下文时使用。 Tags: latest:4.1.8 Version history: v4.1.8 | 2026-05-17T05:43:19.296Z | user zaomeng-skill v4.1.8 - 新增多组对话辅助脚本，包括角色卡管理、人物字段补全、对话建议生成、场景推荐生成（tools/manage_self_card.py、tools/build_persona_autofill_payload.py、tools/build_dialogue_suggestion_payload.py、tools/build_scene_recommendation_payload.py） - 补充 examples/","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"File v4.1.8:references/safety_policy.md\n\n# 安全策略\r\n\r\n## 执行边界\r\n\r\n- 默认采用本地优先。\r\n- 运行时说明中不应要求强制联网拉取资源。\r\n- 不要求任意 shell 命令执行。\r\n\r\n## 数据安全\r\n\r\n- 不得请求或存储凭证、密钥等敏感信息。\r\n- 示例与输出中尽量避免个人隐私或敏感数据。\r\n- 所有结果都应被限制在用户提供文本证据的范围内。\r\n\r\n## 完整性检查\r\n\r\n- 若证据稀薄，应输出低置信度结果。\r\n- 若不符合 schema 约束，应返回 `needs_revision`。\r\n- 若用户请求存在明显不安全行为，应拒绝并给出安全替代方案。\n\nFile v4.1.8:references/style_differ.md\n\n# 风格差异化指南\r\n\r\n## 用途\r\n\r\n用于在蒸馏、纠错、单聊、群聊生成时降低角色同质化。\r\n\r\n这不是自由发挥式 prompt，而是一份约束参考。它的作用是帮助运行时和辅助 agent 让每个角色在表达层面保持可辨识的差异。\r\n\r\n## 核心原则\r\n\r\n不要只靠“观点不同”来区分角色，而要让角色在以下层面也真正不同：\r\n\r\n1. 说话节奏\r\n2. 用词偏好\r\n3. 情绪外露方式\r\n4. 冲突处理习惯\r\n5. 面对不同关系对象时的语气差异\r\n6. 公开人格与私下真实面貌的落差\r\n\r\n## 差异化维度\r\n\r\n### 1. 句式节奏\r\n\r\n- 短促直接型：句子短，铺垫少，态度出现快\r\n- 层层展开型：先讲前因后果，再落到结论\r\n- 情绪断裂型：句式会被情绪打断，带出波动\r\n- 克制含蓄型：话少，更多靠分寸和停顿表达立场\r\n\r\n### 2. 用词层级\r\n\r\n- 朴素口语\r\n- 雅正克制\r\n- 尖锐刻薄\r\n- 温和委婉\r\n- 清冷疏离\r\n- 戏谑调侃\r\n\r\n不要让所有角色最后都坍缩成同一种“先看看/再说/权衡一下”的安全说法。\r\n\r\n### 3. 情绪表面形态\r\n\r\n- 有的角色情绪来得快，会立刻外放\r\n- 有的角色先压住情绪，只在措辞上收紧\r\n- 有的角色会先反讽、先顶回去\r\n- 有的角色嘴上抱怨，但行动上依然会跟进\r\n\r\n除非有明确弧光证据，否则情绪风格不应频繁漂移。\r\n\r\n### 4. 决策表达顺序\r\n\r\n- 有的角色先说结论\r\n- 有的角色先划边界\r\n- 有的角色先提关系\r\n- 有的角色先谈后果\r\n\r\n思考顺序的外显，本身就是人物声纹的一部分。\r\n\r\n### 5. 关系对象差分\r\n\r\n同一个角色，面对不同对象时应当允许发生稳定变化：\r\n\r\n- 对长辈/上位者\r\n- 对平辈/对手\r\n- 对亲近之人\r\n- 对陌生人\r\n- 对敌对者\r\n\r\n不能把所有对象都压平为同一套万能口吻。\r\n\r\n### 6. 公开人格与私下真实面貌\r\n\r\n- 有的人表面克制，内里强烈\r\n- 有的人表面强势，内里不安\r\n- 有的人表面玩笑，内里认真\r\n\r\n要结合 `private_self`、`social_mode`、`key_bonds` 与关系层，稳定维护这种落差。\r\n\r\n## 防同质化规则\r\n\r\n1. 同一场景中，不要让多个角色复用同一套兜底句式骨架。\r\n2. 不要把所有“冷静型”角色都写成同一种“理性、稳妥、先观察”的声音。\r\n3. 不要把所有冲突都写成直接解释；有的人会回避，有的人会嘲讽，有的人会截断，有的人会压着说。\r\n4. 不要过度使用“先看看”“再作定夺”“还需权衡”这类通用过渡句。\r\n5. 即使两个角色立场相同，他们的理由、表面措辞和情绪手感也应不同。\r\n6. 保留不对称性：有人推进，有人兜底，有人反讽，有人吸收压力。\r\n\r\n## 输出前自检\r\n\r\n在最终输出前，至少检查以下问题：\r\n\r\n1. 去掉角色名之后，这句话是否仍然大致能辨认出是谁说的？\r\n2. 这句话体现的是该角色自己的表达习惯，还是一种泛用叙述者口吻？\r\n3. 如果听话对象换了，这句话是否会随关系发生合理变化？\r\n4. 把这句话放到同场其他角色旁边时，声音是否仍然分得开？\r\n\r\n如果第 2 条或第 4 条答案是否定的，说明这句仍然过于模板化。\n\nFile v4.1.8:references/validation_policy.md\n\n# 校验策略\r\n\r\n## 用途\r\n\r\n通过分层校验，约束蒸馏输出的人设真实性、区分度和可演绎性，减少脑补、同质化和 OOC。\r\n\r\n## 校验层级\r\n\r\n### 1. 证据校验\r\n\r\n- 每个关键结论都必须能对应到至少一条原作正文证据。\r\n- `evidence_source` 优先记录章节、段落、片段索引，不复制大段原文。\r\n- 如果没有直接证据，结论不得写实锤，应留空或写 `证据不足`。\r\n\r\n### 2. 一致性校验\r\n\r\n- 性格特征、决策规则、语言"},{"language":"bash","snippet":"python tools/init_host_run.py --novel <路径> --characters A,B,C --output <run_manifest.json>"},{"language":"bash","snippet":"python tools/update_run_progress.py --run-manifest <run_manifest.json> --stage character_started --character 林黛玉 --message \"正在蒸馏林黛玉\""},{"language":"bash","snippet":"python tools/update_run_progress.py --run-manifest <run_manifest.json> --stage chunk_started --message \"正在执行第 1 块\" --chunk-capability distill --chunk-mode chunked --chunk-count 6 --current-chunk 1 --chunk-label 前段-1 --chunk-status running --merge-required --merge-status pending"},{"language":"bash","snippet":"python tools/init_host_run.py --novel <路径> --characters A,B --output <run_manifest.json>"},{"language":"bash","snippet":"python tools/build_prompt_payload.py --mode distill --novel <路径> --characters A,B --output <distill_payload.json> --run-manifest <run_manifest.json>"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\r\nname: zaomeng-skill\r\ndescription: 用于中文小说人物蒸馏、关系抽取、关系图谱导出与角色对话准备；当宿主需要基于小说内容生成结构化人物档案、关系结果或多角色对话上下文时使用。\r\nlicense: MIT-0\r\ncompatibility: 需要宿主支持 Markdown skill 目录、YAML frontmatter，以及本 skill 内置 Python helper\r\n  scripts 所需的本地 Python 运行环境。\r\nmetadata:\r\n  version: 4.1.8\r\n  hostMode: llm-first\r\n  releaseTag: v2026.05.11\r\n---\r\n\r\n# zaomeng-skill\r\n\r\n| 项目 | 内容 |\r\n| --- | --- |\r\n| 名称 | `zaomeng-skill` |\r\n| 类型 | ClawHub / Host-managed skill |\r\n| 核心模式 | LLM-first |\r\n| 适用场景 | 人物蒸馏、人物包物化、关系图谱导出、角色 `act` / `insert` / `observe` |\r\n| 宿主职责 | 调用宿主 LLM，负责最终生成与对话推进 |\r\n| skill 职责 | 准备 prompt payload、物化人物包、导出图谱、校验产物、维护运行状态，并提供角色卡/人物补全/对话建议 helper |\r\n\r\n## 1. 定位\r\n\r\n- 这是一个宿主驱动的 prompt-first skill。\r\n- 宿主负责实际调用 LLM；skill 负责把任务整理成标准输入、标准产物和标准状态。\r\n- skill 的主路径是 `prompts + helper tools + run_manifest.json`，不是内嵌 chat CLI。\r\n- 对话阶段除了宿主直读人物包，也可以调用 skill helper 来生成角色卡、人物字段补全 payload、以及 `act` / `insert` / `observe` 的自动回复建议 payload。\r\n\r\n## 2. 宿主能力契约\r\n\r\n宿主侧只需要理解四个标准能力，以及四组对话 helper：\r\n\r\n| 能力 | 入口 | 作用 | 标准成功标记 |\r\n| --- | --- | --- | --- |\r\n| `distill` | `tools/build_prompt_payload.py --mode distill` | 生成蒸馏 payload，等待宿主 LLM 产出 `PROFILE.generated.md` | capability status `status=ready, success=true` |\r\n| `materialize` | `tools/materialize_persona_bundle.py` | 把 `PROFILE.generated.md` 物化为完整人物包 | `ARTIFACT_STATUS.generated.json` + capability status |\r\n| `export_graph` | `tools/export_relation_graph.py` | 导出人物关系图谱 HTML / Mermaid / SVG | `<relations>.status.json` + capability status |\r\n| `verify_workflow` | `tools/verify_host_workflow.py` | 校验整条宿主工作流产物是否完整 | capability status `status=complete, success=true` |\r\n\r\n对话 helper：\r\n\r\n| helper | 入口 | 作用 |\r\n| --- | --- | --- |\r\n| `self_card` | `tools/manage_self_card.py` | 创建 / 保存 / 读取 / 删除 self-insert 角色卡，并生成随机角色卡 prompt payload |\r\n| `persona_autofill` | `tools/build_persona_autofill_payload.py` | 为人物校对单字段生成宿主可调用的补全 payload，并解析模型返回 |\r\n| `dialogue_suggestion` | `tools/build_dialogue_suggestion_payload.py` | 为 `act` / `insert` / `observe` 生成自动回复建议 payload，并提供压缩重试版本 |\r\n| `scene_recommendation` | `tools/build_scene_recommendation_payload.py` | 为当前会话生成下一幕场景推荐、转场提示、多拍链路建议，以及可直接用于自动起拍的 opening cue |\r\n\r\n所有能力都应该满足：\r\n\r\n- 有明确输入\r\n- 有 JSON 输出\r\n- 有 sidecar status 文件\r\n- 有 `success` 布尔值\r\n- 可选更新 `run_manifest.json`\r\n\r\n能力总览集中定义在：\r\n\r\n- `references/capability_index.md`\r\n- `examples/host_workflow_example.md`\r\n\r\n`distill` 默认支持增量蒸馏：\r\n\r\n- 如果 `data/characters/<novel_id>/<角色名>/` 已存在人物包，`tools/build_prompt_payload.py --mode distill` 会自动把已有档案并入 `request.existing_profiles`\r\n- `request.update_mode` 会自动落成 `incremental`\r\n- `run_manifest.json` 的 `artifacts.distill_context` 会记录本次是 `create` 还是 `incremental`，以及命中的已有角色数量\r\n\r\n`distill` 与 `relation` 现在也默认支持长篇自动分批：\r\n\r\n- 小文本保持单次 payload，不改变既有调用方式\r\n- 当 excerpt 过长时，payload 会额外给出 `chunks[]`\r\n- 宿主按 `chunks[]` 顺序调用 LLM，收集每块局部草稿\r\n- 然后再按 `merge_payload` 做一次合并，得到最终 `PROFILE.generated.md` 或 `RELATION_GRAPH`\r\n- `request.chunk_mode`、`meta.chunk_count`、`meta.merge_required` 会明确告诉宿主当前是否处于分批模式\r\n\r\n## 3. 标准运行状态\r\n\r\n宿主如果要跑完整蒸馏链路，先初始化一个 `run_manifest.json`：\r\n\r\n"},{"path":"README.md","content":"# zaomeng-skill\r\n\r\n`zaomeng-skill` 是一个面向中文小说人物蒸馏、关系抽取、关系图谱和角色对话的 skill。\r\n\r\n它的工作方式很直接：\r\n\r\n- 读取小说内容\r\n- 准备 excerpt、prompt 和 references\r\n- 交给宿主 LLM 生成蒸馏结果、关系结果和角色回复\r\n- 将 canonical profile 继续物化为完整人物包\r\n\r\n这个 skill 默认运行在宿主环境中，宿主负责实际调用模型；包内 Python helper 依赖写在 `requirements.txt`。\r\n\r\n## 概览\r\n\r\n| 项目 | 内容 |\r\n| --- | --- |\r\n| 名称 | `zaomeng-skill` |\r\n| 模式 | LLM-first |\r\n| 适用宿主 | OpenClaw、ClawHub、Hermes、其他 host-managed agent |\r\n| 核心能力 | 人物蒸馏、关系抽取、关系图谱、宿主驱动角色对话 |\r\n| 许可证 | `MIT-0` |\r\n\r\n## 它能做什么\r\n\r\n### 1. 蒸馏人物\r\n\r\n从小说原文中提取人物档案，并尽量覆盖完整的人设层次，例如：\r\n\r\n- 核心身份\r\n- 核心动机\r\n- 性格基底\r\n- 行为逻辑\r\n- 人物弧光\r\n- 关键羁绊\r\n- 语言表达特质\r\n- 价值取舍体系\r\n- 深层执念与隐秘欲望\r\n- 私下真实面貌\r\n\r\n### 2. 抽取关系\r\n\r\n从同框互动中提取两两关系，并输出人物关系图谱，包括：\r\n\r\n- 关系结果 markdown\r\n- Mermaid 源码\r\n- HTML 可视化图谱\r\n- SVG 图谱\r\n\r\n### 3. 进入角色聊天\r\n\r\n支持三种玩法：\r\n\r\n- `act`\r\n  你扮演一个角色说话，可以是一对一，也可以直接加入多人群聊\r\n- `insert`\r\n  你以“你自己”的身份进入小说场景，不扮演书中角色，而是直接和他们互动\r\n- `observe`\r\n  让多个角色围绕一个场景、话题或开场白进行互动\r\n\r\n这些对话由宿主直接驱动。`zaomeng-skill` 提供人物包、关系图谱、prompt 约束和运行状态，不再把内嵌 `chat CLI` 当作主路径能力。\r\n\r\n### 4. 保存纠错\r\n\r\n如果某句明显 OOC，可以把纠错写回记忆，后续对话继续沿用。\r\n\r\n## 工作流\r\n\r\n### 标准流程\r\n\r\n1. 提供小说文件或正文\r\n2. 生成按角色聚焦的 excerpt\r\n3. 生成 distill 或 relation prompt payload\r\n4. 交给宿主 LLM 完成生成\r\n5. 若宿主落盘了 `PROFILE.generated.md`，继续物化完整人物包\r\n6. 导出关系图谱\r\n7. 再进入 `act`、`insert` 或 `observe`\r\n\r\n多角色蒸馏时，不应只截取小说开头。应传入 `--characters`，让 excerpt 围绕目标角色的实际出场窗口抽取，尤其适用于角色分散出现在不同章节的长篇文本。\r\n\r\n### 增量蒸馏\r\n\r\n如果同一本小说下已经存在角色人物包，这个 skill 会在构建 distill payload 时自动复用已有档案，把本次蒸馏视为增量更新：\r\n\r\n- 自动检测 `data/characters/<novel_id>/<角色名>/`\r\n- 把已有 `PROFILE`、拆分人格文件和 `MEMORY` 合并到 `request.existing_profiles`\r\n- 将 `request.update_mode` 标记为 `incremental`\r\n- 把增量上下文写入 `run_manifest.json -> artifacts.distill_context`\r\n\r\n此外，distill payload 现在会额外给出 `request.excerpt_focus`，包含：\r\n\r\n- `requested_characters`\r\n- `matched_characters`\r\n- `missing_characters`\r\n- `strategy`\r\n\r\n宿主可以据此判断：这次 excerpt 是否真的覆盖了请求角色，是否有角色根本没在文本里命中。\r\n\r\n### 长篇自动分批\r\n\r\n当 excerpt 过长时，这个 skill 不再只给宿主一个“大而全”的单次 payload，而是会自动切换为分批模式：\r\n\r\n- `request.chunk_mode = chunked`\r\n- `meta.chunk_count` 标明总块数\r\n- `meta.merge_required = true`\r\n- `chunks[]` 给出每一块可直接调用宿主 LLM 的局部 payload\r\n- `merge_payload` 给出最终合并局部草稿的模板 payload\r\n\r\n也就是说，宿主拿到结果后可以这样跑：\r\n\r\n1. 先判断是不是 `chunked`\r\n2. 如果是，就按 `chunks[]` 顺序逐块生成局部草稿\r\n3. 把每块草稿塞回 `merge_payload.request.chunk_drafts`\r\n4. 再执行一次 merge，得到最终 `PROFILE.generated.md` 或最终 `RELATION_GRAPH`\r\n\r\n短文本仍然保持旧的单次流程，不会被额外复杂化。\r\n\r\n### Distill Post-Process\r\n\r\n宿主 LLM 写出 `PROFILE.generated.md` 后，不要停在单文件状态。  \r\n应立即执行 `tools/materialize_persona_bundle.py`，把 canonical profile 物化成完整人物包，补齐：\r\n\r\n- `SOUL.generated.md`\r\n- `GOALS.generated.md`\r\n- `STYLE.generated.md`\r\n- `TRAUMA.generated.md`\r\n- `IDENTITY.generated.md`\r\n- `BACKGROUND.generated.md`\r\n- `CAPABILITY.generated.md`\r\n- `BONDS.generated.md`\r\n- `CONFLICTS.generated.md`\r\n- `ROLE.generated.md`\r\n- `AGENTS.generated.md`\r\n- `MEMORY.generated.md`\r\n- `NAVIGATION.generated.md`\r\n\r\n### 对话接管\r\n\r\n蒸馏和图谱完成后，宿主直接进入对话阶段即可。推荐宿主读取：\r\n\r\n- 人物目录下的 `PROFILE.md`\r\n- 拆分人格文件，如 `SOUL.md`、`GOALS.md`、`STYLE.md`\r\n- `MEMORY.md`\r\n- 关系结果 markdown\r\n- 关系图 HTML / SVG\r\n- `run_manifest.json`\r\n\r\n宿主进入对话后，按模式解释即可：\r\n\r\n- `"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7fgefcp561ypgde2wm8xgfeh82mtx9\",\n  \"slug\": \"zaomeng-skill\",\n  \"version\": \"4.1.8\",\n  \"publishedAt\": 1778996599296\n}"},{"path":"references/capability_index.md","content":"# Capability Index\r\n\r\n## Purpose\r\n\r\nThis document is the host-side index for the standard `zaomeng` capabilities.\r\n\r\nUse it as the first stop when the host needs to answer:\r\n\r\n- which helper should I call\r\n- what files should I expect\r\n- how do I know whether this capability succeeded\r\n\r\n## Capability List\r\n\r\n| Capability | Entry | Primary Output | Success Marker |\r\n| --- | --- | --- | --- |\r\n| `distill` | `tools/build_prompt_payload.py --mode distill` | distill payload JSON | capability status with `status=ready` and `success=true` |\r\n| `materialize` | `tools/materialize_persona_bundle.py` | persona bundle files | `ARTIFACT_STATUS.generated.json` plus capability status |\r\n| `export_graph` | `tools/export_relation_graph.py` | relationship graph HTML / SVG / Mermaid | graph `.status.json` plus capability status |\r\n| `verify_workflow` | `tools/verify_host_workflow.py` | workflow verification JSON | capability status with `status=complete` and `success=true` |\r\n\r\n## 1. Distill\r\n\r\nEntry:\r\n\r\n```bash\r\npython tools/build_prompt_payload.py --mode distill --novel <path> --characters A,B --output <distill_payload.json> --run-manifest <run_manifest.json>\r\n```\r\n\r\nStandard outputs:\r\n\r\n- distill payload JSON\r\n- optional capability status JSON\r\n- optional `run_manifest.json` updates\r\n\r\nPayload contract:\r\n\r\n- `request.chunk_mode = single|chunked`\r\n- `chunks[]` for partial distill execution when the excerpt is too large\r\n- `merge_payload` for final profile merge\r\n- `host_plan.execution = single_pass|sequential_chunks_then_merge`\r\n- `meta.chunk_count`\r\n- `meta.merge_required`\r\n\r\nHost responsibility after this step:\r\n\r\n- if `single`, hand the payload to the host LLM and write `PROFILE.generated.md`\r\n- if `chunked`, iterate `chunks[]`, collect partial drafts, fill `merge_payload.request.chunk_drafts`, then execute the merge payload and write the final `PROFILE.generated.md`\r\n\r\nRecommended manifest fields to read:\r\n\r\n- `artifacts.chunking.distill`\r\n- `progress.chunking.distill`\r\n- `summary.chunking.distill`\r\n\r\nReference:\r\n\r\n- `references/output_schema.md`\r\n\r\n## 2. Materialize\r\n\r\nEntry:\r\n\r\n```bash\r\npython tools/materialize_persona_bundle.py --profile-file <character-dir/PROFILE.generated.md> --run-manifest <run_manifest.json>\r\n```\r\n\r\nStandard outputs:\r\n\r\n- split persona markdown files\r\n- `ARTIFACT_STATUS.generated.json`\r\n- optional capability status JSON\r\n\r\nReference:\r\n\r\n- `references/output_schema.md`\r\n\r\n## 3. Export Graph\r\n\r\nEntry:\r\n\r\n```bash\r\npython tools/export_relation_graph.py --relations-file <relations.md> --run-manifest <run_manifest.json>\r\n```\r\n\r\nStandard outputs:\r\n\r\n- `*_relations.html`\r\n- `*_relations.svg`\r\n- `*_relations.mermaid.md`\r\n- graph `.status.json`\r\n\r\nIf relation extraction is chunked on the host side, the same contract applies:\r\n\r\n- `request.chunk_mode = single|chunked`\r\n- `chunks[]`\r\n- `merge_payload`\r\n- `meta.chunk_count`\r\n- `meta.merge_required`\r\n\r\nRecommended manifest fields to read:\r\n\r\n- `artifacts.chunking.relation`\r\n- `progress.chunking.re"},{"path":"references/chat_contract.md","content":"# Dialogue Handoff Contract\r\n\r\n## Purpose\r\n\r\nThis document defines how the host should enter `act`, `insert`, and `observe` after the structured workflow completes.\r\n\r\nThe goal is simple:\r\n\r\n- the skill prepares persona bundles and relationship artifacts\r\n- the host uses those artifacts directly to run dialogue\r\n- the packaged skill does not require a separate `chat CLI` entrypoint\r\n\r\n## Supported Modes\r\n\r\n- `act`\r\n  the user speaks as one existing character\r\n- `insert`\r\n  the user enters the scene as themselves\r\n- `observe`\r\n  the user stays outside the scene and watches the cast continue\r\n\r\n## Required Inputs\r\n\r\nBefore the host starts dialogue, it should already have:\r\n\r\n- the novel id or novel path for the current run\r\n- the requested cast\r\n- one persona bundle directory per distilled character\r\n- relationship markdown or graph artifacts when available\r\n- `run_manifest.json` from the current run\r\n\r\nMinimum persona inputs per active character:\r\n\r\n- `PROFILE.md`\r\n- `MEMORY.md`\r\n\r\nRecommended additional persona inputs when present:\r\n\r\n- `SOUL.md`\r\n- `GOALS.md`\r\n- `STYLE.md`\r\n- `TRAUMA.md`\r\n- `IDENTITY.md`\r\n- `BACKGROUND.md`\r\n- `CAPABILITY.md`\r\n- `BONDS.md`\r\n- `CONFLICTS.md`\r\n- `ROLE.md`\r\n\r\n## Host Responsibilities\r\n\r\n### 1. Mode Selection\r\n\r\nThe host decides whether the request is:\r\n\r\n- `act`\r\n- `insert`\r\n- `observe`\r\n\r\n### 2. Active Cast Selection\r\n\r\nThe host determines which characters are active for the current turn or scene.\r\n\r\nRecommended inputs:\r\n\r\n- explicitly requested characters\r\n- relation graph context\r\n- current scene focus\r\n\r\n### 3. Self-Insert Card\r\n\r\nFor `insert`, the host should create or refresh a lightweight self-insert card, for example:\r\n\r\n- user display name\r\n- current in-scene identity\r\n- how they entered the scene\r\n- what the cast should currently know about them\r\n\r\nIf the host wants packaged helpers instead of hand-writing this layer, use:\r\n\r\n- `tools/manage_self_card.py --mode blank`\r\n- `tools/manage_self_card.py --mode save`\r\n- `tools/manage_self_card.py --mode build-random-payload`\r\n- `tools/manage_self_card.py --mode parse-random-response`\r\n\r\nThis lets the host support both manual role-card editing and AI-random role-card generation through the packaged skill helpers.\r\n\r\n### 4. Dialogue Rendering\r\n\r\nThe host performs the actual generation. It should use the persona bundle and constraints to keep the output:\r\n\r\n- in character\r\n- mode-consistent\r\n- relation-aware\r\n- scene-aware\r\n\r\nIf the host wants a packaged one-line reply suggestion flow, call:\r\n\r\n- `tools/build_dialogue_suggestion_payload.py --context-file <context.json>`\r\n\r\nThe tool returns:\r\n\r\n- full messages\r\n- retry messages\r\n- compact fallback payload/messages\r\n\r\nFor persona review autofill, call:\r\n\r\n- `tools/build_persona_autofill_payload.py --persona-dir <角色目录> --field <字段名> --strategy auto`\r\n\r\nThe tool returns:\r\n\r\n- model-knowledge-first step\r\n- retry messages\r\n- parser contract for model output\r\n\r\nIf the host wants the skill to help decide what the next beat "}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1881,"uniquenessScore":35,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T17:21:47.095Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T17:21:47.095Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T21:44:15.092Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}