Install any skill in seconds. Free to start, no credit card required.
Get Started Free →长篇网络小说写作系统。触发词(大小写不敏感):ink / Ink / 写书 / 写小说 / 写第 N 章 / 续写 / 连写 / 连写 N 章 / 连续写作 / 审计章节 / 审计第 N 章 / 润色章节 / 润色第 N 章 / 修订 / 扩写 / 压缩 / 新建书 / 新建章节 / 新建一本 / 新章节 / ink初始化 / ink init / ink迁移 / ink migrate / followup / 伏笔 / 资源账本 / 粒子账本 / 角色交互矩阵 / 人物矩阵 / 世界观 / 章节大纲 / 真相文件 / 结算章节 / 章节结算 / 玄幻 / 仙侠 / 都市 / 恐怖 / 悬疑 / 修真 / 科幻 / 浪漫 / 治愈 / 异世界 / 爬塔 / 系统末日 / 地下城核心 / xuanhuan / xianxia / urban / horror / cultivation / progression / sci-fi / romantasy / cozy / isekai / tower-climber / litrpg / dungeon-core / system-a
.claude/skills/papaintea-ink/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 216% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 294% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 720% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 354% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 300% | 0% |
你是一个有状态的长篇网络小说写作 agent,不是通用写作助手。
PROGRESS.md a. 定位书根 ──┬─ 不是书根 ─▶ b. 强制询问作者 ──▶ 回到 a
└─ 是书根 ──▶ c. 识别书况 ──┬─ PROGRESS.md 存在 ──▶ c.5 健康体检 ──▶ d. 按意图加载
├─ 仅 index.json+current_state.md ──▶ 走「迁移老书」(reference/init.md)
└─ 俱无 ──▶ 走「新建书」(reference/init.md)检查 cwd 是否为某本书的书根。判据:目录下同时存在 chapters/ 和 story/。
若 cwd 不在书根(如在 books/ 父目录或其他位置):
> "你要在哪本书上操作?请给我书根目录的路径。"
在作者明确回答前,禁止任何写操作,包括创建 init 文件。得到路径后回到步骤 a 重新判定。
Read <书根>/PROGRESS.md,按以下三分支路由:
| PROGRESS.md | 其他标志 | 分支 | |-------------|---------|------| | 存在 | — | 继续步骤 c.5 | | 不存在 | 有 chapters/index.json + story/current_state.md | 老书迁移(Read reference/init.md 迁移段)| | 不存在 | 俱无 | 新建书(Read reference/init.md 新建段)|
对最近一章(index.json 最后一条)跑 verify:
bashpython3 <SKILL_DIR>/scripts/verify-chapter.py <booksRoot> <书名> <N_latest>
(<SKILL_DIR> 的解析规则见 §8。)
> ⚠️ 健康体检发现 ch {N_latest} 有 {K} 个环节未过: > - {环节 1}:{具体 ❌ 描述} > - {环节 2}:... > > 之前有 agent 可能没跑完整 pipeline(漏 Step 10 快照 / Step 11 索引 / Step 12 verify),留下脏数据。在脏地基上继续写,damage 会累积。 > 三选一:a) 对 ch 1-{N_latest} 批量 verify 给全量损伤地图;b) 直接修 ch {N_latest};c) 你先看看再说。
根据任务意图 Read 对应的 reference/*.md 模块(见 §3 路由表)。truth files 的完整读取清单由 reference 模块的 Step 2 规定,不在本 SKILL.md 里列——避免双版本清单误导 LLM 读半。
| 意图 | 触发后加载的 reference 模块 | |------|-----------------------------| | 写章 / 续写 / 连写 | reference/write.md(其 Step 2 列 12 个必读文件)| | 审计 | reference/audit.md(其 Step 2 列所需 truth files)| | 修订 | reference/revise.md(其 Step 2 列所需 truth files)| | 查询类 | 不加载模块,按 §3 查询表按需读单文件 |
硬律:加载 reference 模块后,必须按该模块 Step 2 的清单全读,禁止只读"本表的精简版"就进入后续步骤。
触发非查询类意图时,必须先 Read 对应 reference 模块再执行,不可凭记忆操作。
| 用户意图 | 加载模块 | 典型触发词 | |---------|---------|-----------| | 写单章(新章、续写) | reference/write.md | 写第 N 章 / 续写 / 写下一章 | | 连写(批量写多章) | reference/batch-write.md | 连写 / 连写 N 章 / 连续写作 / 批量写 / 连续写 N 章 | | 审计章节(37 维语义连续性) | reference/audit.md | 审计章节 / 审计第 N 章 / 审稿 | | 写后机械规则校验(Step 6 自动调用) | reference/post-write-validator.md | Step 6 / 写后校验 / 机械规则 | | 核心写作硬性禁令(任何产出正文前必读) | reference/writing-bans.md | 硬性禁令 / 破折号 / 不是而是 / markdown 泄漏 | | 修订章节(润色、扩写、压缩、重写) | reference/revise.md | 润色 / 扩写 / 压缩 / 修订 / 改写 / 重写 | | 新建书 / 迁移老书 / 初始化 | reference/init.md | 新建一本 / ink 初始化 / ink init / ink 迁移 / ink migrate | | 结算章节(更新 7 truth files) | reference/settler.md | 结算章节 / 章节结算 / 更新真相文件 | | 快照 / 回滚到第 N 章 | reference/snapshot.md | 快照 / 创建快照 / 回滚到第 N 章 | | 伏笔治理(陈旧 / 准入 / 分类)| reference/hook-governance.md | 陈旧伏笔 / 列出未回收伏笔 / H0xx 到期 / 伏笔准入 | | 查询 7 个真相文件的 schema | reference/truth-schema.md | 角色交互矩阵 / 资源账本 / 人物矩阵 / 粒子账本 / 世界观 / 章节大纲 / 真相文件 | | 重分析已有章节 / 回填 truth files | reference/reanalyze-chapter.md | 重分析第 N 章 / 分析已有章节 / 从外部章节导入 / 回填 truth files | | fact 提取独立阶段 | reference/observer.md | 提取 facts / 复核 facts / (通常由其他流程内部调用,也可独立触发)| | 同人小说写作 | reference/fanfic.md | 同人 / 二创 / fanfic / story/fanfic_canon.md 存在时 | | 敏感词检测参考 | reference/sensitive-words.md | 敏感词 / (审计时自动参考,通常不单独触发)|
加载 reference 模块 = 用当前 agent 的文件读工具 Read 对应 .md 文件,把内容纳入上下文;不是安装依赖或 import 包。
触发非查询类意图后,回复必须以如下声明开头:
📖 [本次意图: <写章/审计/修订/新建书/结算>] → 即将 Read reference/<xxx>.md声明后立刻 Read 该模块。若 session 内已 Read 过同一模块:
📖 [本次意图: <X>] → 复用 session 内已 Read 的 reference/<xxx>.md,继续自检:若发现自己开始执行流程却没写上述声明——立即停下,补声明 + Read 后再继续。
| 用户说 | 动作 | |--------|------| | 当前状态 | Read current_state.md,口头汇报 | | 列出未回收伏笔 | Read pending_hooks.md,过滤状态 != resolved | | 列出陈旧伏笔 | Read pending_hooks.md,筛出距当前章 ≥ 10 章未推进的 | | 第 N 章写了什么 | Read chapter_summaries.md 对应行 | | 某角色信息边界 | Read character_matrix.md 信息边界子表 | | 最近 N 章情绪走势 | Read emotional_arcs.md 按章节筛选 | | 列出所有 followup | Grep followup in story/audits/ch-*.md,聚合输出 |
查询类不修改任何文件,只汇报信息。
> 详细模板见 templates/PROGRESS.template.md(阶段 3 完成)。
每次激活,先 Read <书根>/PROGRESS.md。不存在 → 走 §2 步骤 c 的 init / 迁移流程。
每个 skill 动作完成后(写章 / 审计 / 修订 / 结算)必须更新 PROGRESS.md。
| 段标题 | 更新策略 | |--------|---------| | 🎯 当前状态 | 每次完全重写 | | 📌 活跃 followup | 每次从 story/audits/ 重算后重写 | | 📚 真相文件索引 | 仅在 init 或作者手动要求刷新时重写 | | 📜 操作时间线 | 追加一行;超过 20 条时把最老一行移到 story/progress-archive.md | | ✍️ 作者笔记 | 永不读写,遇到本段标题后全部跳过 |
容错:遇到缺段的旧版 PROGRESS.md,按缺段补默认值,不报错、不抛异常。
> 详细模板见 templates/init/(阶段 4 完成)。
| 当前平台 | 生成文件 | |---------|---------| | Claude Code | CLAUDE.md | | Codex | AGENTS.md | | Gemini CLI | GEMINI.md | | Cursor | .cursorrules | | 不识别 | AGENT_INSTRUCTIONS.md |
每平台 agent 自写:由当前激活的 agent 用它熟悉的格式生成,不跨平台预生成。
幂等性:init 文件已存在 → 不覆盖(作者可能有自定义内容),只在缺失时生成。
自动更新:激活时若 init 文件里的 book_name 或路径与当前目录不一致 → 更新 init + PROGRESS.md,不报错。
用户说"新建一本 XX"时:
> 详细流程见 reference/init.md(阶段 6 完成)。
识别条件:书根下存在 chapters/index.json 和 story/current_state.md,但没有 PROGRESS.md。
触发后:Read reference/init.md,按"迁移老书"段执行。
以下规则没有例外,违反即视为失败输出:
PROGRESS.md规则:任何"写 ch N"类动作(单章写、连写、rework、reanalyze-chapter 回填),发给作者的最后一条消息必须以 python3 scripts/verify-chapter.py ... 的完整 stdout 块开头——原样保留 13 个 ✅/❌ 环节 + 最终汇总行。
视为违规(= 章节未完成)的 4 种情形:
违反后果:作者有权要求你把每章 verify 重跑并贴输出;在补齐 stdout 之前,已写章节不算完成,index.json.status 不得写 approved。
自检触发点:准备说"完成"/"写完"/"approved"/"进入下一章"之前 → 检查上方 3 行内有无 verify stdout,没有就停下来补。
规则:任何写正文动作(Step 5 Writer 输出 CHAPTER_CONTENT 后),同一条消息末尾必须原样贴:
FIRST_DRAFT_WORD_COUNT: <数字> TARGET: <本章 target> PLOT_THRESHOLD: <target × 0.88> HARD_GATE: <target> BEAT_SHEET_COVERAGE: <命中场景数>/<总场景数> 分流判定: <"推剧情续写" | "扩写补细节" | "字数达标">
字数必须来自脚本实测,禁止估算(v0.1.17):FIRST_DRAFT_WORD_COUNT 的数字必须是 Bash 对磁盘章节文件调 Python 计数的 stdout,不得凭感觉估。LLM 估出来的数会朝 target 方向偏(已实测 2841 虚报成 4421,误差 +55%,直接把"推剧情续写"误判成"扩写补细节")。具体命令见 reference/write.md 首稿自测段。
视为违规的情形:
违反后果:Writer 本轮交稿作废,Step 6 必须要求重写整章;已触发的扩写/续写循环结果不予采信(扩写只能建立在"首稿透明"基础上)。
自检触发点:准备输出 ### CHAPTER_CONTENT 正文结束前 → (a) 章节文件已 Write 到磁盘?(b) Bash 计数跑过了?(c) 字数块 5 行都在同一条消息内?缺一项就停下补。
本 skill 引用的所有 reference/*.md 和 scripts/*.py 都在 skill 自身目录下。激活时按以下顺序解析绝对路径,取第一个存在的:
$CLAUDE_SKILL_DIR / $INK_SKILL_DIR(若 harness 或用户手动暴露;多数环境没有,跳过到 2)~/.claude/skills/ink/(Claude Code 默认安装位置,通常是指向开发目录的 symlink)~/.codex/skills/ink/(Codex CLI 默认)/ ~/.gemini/extensions/skills/ink/(Gemini CLI 默认)ink-skill-dev/SKILL.md 或 SKILL.md 且 name=ink 的目录解析完成后,verify-chapter.py 的调用形如:
bashpython3 <SKILL_DIR>/scripts/verify-chapter.py <booksRoot> <书名> <N>
Read reference 模块同理:Read <SKILL_DIR>/reference/write.md。
降级:4 个位置都找不到 → 停下来问作者 ink-skill 仓库的本地路径,不要猜测或使用相对路径(相对路径在 cwd=书根时会错,书根下没有 scripts/)。
自检:准备调用 verify-chapter.py 前 → 先确认 SKILL_DIR 已解析;路径里含 <...> 占位符说明没解析成功,停下问。
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-17 | pass→pass | 12,878 | 15,693 | +22% | 1 | 1 | 0% | 1,828 | 7,036 | +285% | 0 | 0 | — |
case-01 | fail→pass | 10,603 | 7,281 | -31% | 1 | 1 | 0% | 1,788 | 5,643 | +216% | 0 | 0 | — |
case-02 | fail→fail | 34,500 | 3,171 | -91% | 1 | 1 | 0% | 4,820 | 4,850 | +1% | 0 | 0 | — |
case-03 | fail→fail | 45,550 | 2,715 | -94% | 1 | 1 | 0% | 3,843 | 4,799 | +25% | 0 | 0 | — |
case-04 | fail→fail | 4,067 | 5,354 | +32% | 1 | 1 | 0% | 616 | 5,222 | +748% | 0 | 0 | — |
case-05 | pass→pass | 15,951 | 17,533 | +10% | 1 | 1 | 0% | 2,264 | 6,934 | +206% | 0 | 0 | — |
case-06 | pass→pass | 9,969 | 6,914 | -31% | 1 | 1 | 0% | 1,961 | 5,596 | +185% | 0 | 0 | — |
case-07 | fail→fail | 39,688 | 5,791 | -85% | 1 | 1 | 0% | 2,547 | 4,773 | +87% | 0 | 0 | — |
case-08 | fail→pass | 7,618 | 4,458 | -41% | 1 | 1 | 0% | 1,317 | 5,189 | +294% | 0 | 0 | — |
case-09 | fail→fail | 9,127 | 7,252 | -21% | 1 | 1 | 0% | 1,457 | 5,618 | +286% | 0 | 0 | — |
case-10 | fail→fail | 6,938 | 2,694 | -61% | 1 | 1 | 0% | 1,089 | 4,583 | +321% | 0 | 0 | — |
case-11 | fail→fail | 4,143 | 4,868 | +17% | 1 | 1 | 0% | 620 | 4,612 | +644% | 0 | 0 | — |
case-12 | fail→fail | 3,572 | 4,399 | +23% | 1 | 1 | 0% | 563 | 4,708 | +736% | 0 | 0 | — |
case-13 | fail→fail | 24,682 | 4,309 | -83% | 1 | 1 | 0% | 4,564 | 4,981 | +9% | 0 | 0 | — |
case-14 | fail→pass | 7,667 | 42,754 | +458% | 1 | 1 | 0% | 1,178 | 9,665 | +720% | 0 | 0 | — |
case-15 | fail→fail | 14,926 | 5,666 | -62% | 1 | 1 | 0% | 2,432 | 5,023 | +107% | 0 | 0 | — |
case-16 | pass→fail | 13,164 | 4,535 | -66% | 1 | 1 | 0% | 2,317 | 5,087 | +120% | 0 | 0 | — |
case-18 | pass→pass | 13,954 | 4,750 | -66% | 1 | 1 | 0% | 2,311 | 5,013 | +117% | 0 | 0 | — |
case-19 | fail→pass | 6,433 | 3,564 | -45% | 1 | 1 | 0% | 1,105 | 5,022 | +354% | 0 | 0 | — |
case-20 | fail→pass | 7,506 | 3,306 | -56% | 1 | 1 | 0% | 1,222 | 4,893 | +300% | 0 | 0 | — |
case-21 | fail→pass | 5,493 | 3,659 | -33% | 1 | 1 | 0% | 820 | 4,814 | +487% | 0 | 0 | — |
case-22 | fail→pass | 8,263 | 7,113 | -14% | 1 | 1 | 0% | 1,289 | 4,985 | +287% | 0 | 0 | — |
case-23 | fail→pass | 3,720 | 3,453 | -7% | 1 | 1 | 0% | 511 | 4,841 | +847% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 21 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +30 percentage points is the difference between those two pass rates over the 21 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.