eternityspring/shuohao-skills · 第 1 次运行

写了一份全剧骨架,2,299 字(去掉空白计)。

skill
eternityspring/shuohao-skills@5612d2a0
装进工作目录的 skill
character-refs、novel-art、novel-characters、novel-outline、novel-script、novel-staging、novel-storyboard
时间
2026-10-31 08:13–08:18(北京时间),5 分钟
轮数
4 轮,工具调用 10 次,按 API 价格折算 $3.81
匿名编号
531(评审只看到这个编号)
盲比
和另外 20 个参赛者的第 1 次运行各比一场:对照组(不装 skill) · zenstory-ai/drama-skills · lixiaoxiao9888-create/manju-laoli-skill · jtydhr88/screenwriting-skills · Shanyin-ai/shanyin-screenwriting-master · lixiaoxiao9888-create/short-drama-factory · adoria111/emma-screenwriting-skills · zhu5859243-free/hongguo-shortdrama-screenwriting · catyiqian/qianqianwriting · Hao0321/ai-short-drama · zenstory-ai/oh-story-claudecode · lingfengQAQ/webnovel-writer · 0xsline/short-drama · Tomsawyerhu/Chinese-WebNovel-Skill · xindoo/sumeru · LanyXiaosheng/bookflow-skill · dama-cyber/Distilled-Novel-Toolbox · tance-mang/chinese-webnovel-skills · xiaofeng-928/chinese-longnovel-skill · qingyabailu-git/webfiction-write
原始文件
产出和问答记录 · 原始日志

写出的文件

标了标签的是认定为全剧骨架、拿去匿名打包的文件(deliverables.toml)。

验尸官的婚礼-outline.json 10,308 字
{
  "source": "验尸官的婚礼",
  "lang": "zh",
  "params": {
    "episodes": 60,
    "minutesPerEpisode": 1.5,
    "genre": "女频大女主复仇悬疑(豪门)",
    "adaptMode": "抽核",
    "preferences": [
      "每集拿出一样看得见的证据",
      "爽点落在沈家与周启年脸上",
      "结局:当庭推翻自己签的报告,墓前放表"
    ]
  },
  "adaptation": {
    "core": "被退婚的女法医在前未婚夫的婚礼上认出新郎是替身,用一件件看得见的证据把三年前那具无名男尸还原成沈峥,最后亲手推翻自己签过的假报告。",
    "keep": [
      {
        "what": "婚礼认替身的开局",
        "why": "第一集就有全剧最强的钩子,前未婚夫的婚礼天然自带羞辱与反击",
        "evidence": "一眼认出新郎是替身:真新郎三年前就躺在她的解剖台上。"
      },
      {
        "what": "每集一件证据的推进引擎",
        "why": "证据是可拍的实物,AI 生成好控;证据递进=疤→切片→报告→录音→袖扣,五段一段一件主证",
        "evidence": "每一集她都要拿出一样看得见的证据:一道疤、一张切片、一段录音。"
      },
      {
        "what": "林晚自己签过假报告这根刺",
        "why": "让女主不是完美受害者,越接近真相越接近自己的罪,中点和结局都压在这里",
        "evidence": "被周启年逼着改成“意外”,签了字,这是她心里的一根刺。"
      },
      {
        "what": "苏曼丽的房卡与一次反水",
        "why": "敌营里的不稳定盟友,给中段制造一次真失守",
        "evidence": "答谢宴上偷偷把求救的房卡塞给她;为了家里的生意,后面还会反水一次。"
      }
    ],
    "cut": [
      {
        "what": "苏沈港口生意的商战线",
        "why": "两分钟一集装不下商战,港口只作为洗钱证据的来源,不单独开线"
      },
      {
        "what": "林晚与沈砚的感情线",
        "why": "大女主复仇剧,沈砚定位内应与证人,不发展恋爱,避免稀释沈峥这根主线"
      },
      {
        "what": "沈家二房争股份的支线",
        "why": "遗嘱只作为宋婉仪找替身的动机交代一次,二房不出场"
      },
      {
        "what": "程野的赌债债主线",
        "why": "只作为他被宋家拿捏的背景,债主不出场,拿捏他的筹码统一换成妹妹"
      }
    ],
    "merge": [
      {
        "what": "宋家的司机、打手、买通的鉴定人统一并入一个保镖",
        "why": "宋知远的脏手只需要一张脸"
      },
      {
        "what": "办案警察并成一位刑侦队长",
        "why": "后半程的布控、审讯、移送都由同一人承担,观众好认"
      },
      {
        "what": "法医中心的同事并成一位实习法医",
        "why": "送检链见证人、林晚停职后的内线,同一功能"
      }
    ],
    "risks": [
      {
        "what": "程野与沈峥同脸,AI 生成容易混",
        "plan": "共用一张脸资产,用左手虎口有无疤和白手套区分;沈峥只在闪回出现,闪回统一冷蓝调"
      },
      {
        "what": "解剖与尸体画面过不了平台审核",
        "plan": "尸体全程白布不露脸,用切片、报告、尸检照片局部、虎口特写替代"
      },
      {
        "what": "证据引擎重复,观众疲劳",
        "plan": "五段每段换一类主证(疤/切片/报告/录音/袖扣),沈家毁证手段也逐段升级:抹黑→毁样本→停职→灭口→杀人"
      },
      {
        "what": "游艇夜海戏生成难",
        "plan": "三年前闪回与终局对峙共用同一游艇资产,只换时段;落水只拍入水前一刻"
      }
    ],
    "cutNote": "这意味着:全剧只有一条主线——三年前是谁杀了沈峥,副线是林晚自己的假报告;终点不是夺回沈氏,而是她当庭重写死因并签上自己的名字。",
    "mergeNote": "主角组定林晚、程野、沈砚、宋知远四人——林晚从签假报告到亲手推翻,程野从替人活到替自己认罪,沈砚从不信到作证,宋知远是全剧最后的对手。周启年、宋婉仪、苏曼丽是被爽点打脸的配角,不进主角组。"
  },
  "characters": [
    {
      "id": "C01",
      "name": "林晚",
      "role": "女主 · 法医",
      "tier": "lead",
      "arc": "从被退婚、被抹黑、被停职,到当庭推翻自己三年前签的报告,重写死者沈峥他杀并签名——赢回的不是名声,是那份签字",
      "from": ["选题卡 林晚"]
    },
    {
      "id": "C02",
      "name": "程野",
      "role": "顶着沈峥的脸的替身新郎",
      "tier": "lead",
      "arc": "从替死人活、怕自己哪天也意外,到交出生活手册作证,最后带着妹妹去自首",
      "from": ["选题卡 程野"]
    },
    {
      "id": "C03",
      "name": "沈砚",
      "role": "沈家二少 · 林晚在沈家的内应",
      "tier": "lead",
      "arc": "从不信法医、嘲讽林晚,到用自己的血做亲缘比对,再到想起游艇那晚并出庭作证",
      "from": ["选题卡 沈砚"]
    },
    {
      "id": "C04",
      "name": "宋知远",
      "role": "主反派 · 沈家舅舅",
      "tier": "lead",
      "arc": "前半程是和气的调停人,第33集袖扣露底,最后在同一艘游艇上被当场拿下,认罪伏法",
      "from": ["选题卡 宋知远"]
    },
    {
      "id": "C05",
      "name": "苏曼丽",
      "role": "新娘 · 敌营里不稳定的盟友",
      "tier": "support",
      "arc": "带头踩林晚→塞房卡求救→为生意反水→被宋知远当替罪羊后交出港口货单",
      "from": ["选题卡 苏曼丽"]
    },
    {
      "id": "C06",
      "name": "周启年",
      "role": "法医中心主任 · 三年前逼签的人",
      "tier": "support",
      "arc": "从压林晚的老领导,到被她当众反将、被宋知远灭口未遂,最后交出录音认罪",
      "from": ["选题卡 周启年"]
    },
    {
      "id": "C07",
      "name": "宋婉仪",
      "role": "沈家主母",
      "tier": "support",
      "arc": "为保股份找人顶替儿子、一路护着替身;得知儿子死于亲弟之手后崩塌,交出账本与沈氏",
      "from": ["选题卡 宋婉仪"]
    },
    {
      "id": "C08",
      "name": "沈峥",
      "role": "死者 · 只活在闪回与证据里",
      "tier": "support",
      "arc": "订婚时送表的人、发现洗钱的人、游艇上被灭口的人;每一段闪回补一块他的死因",
      "from": ["选题卡 沈峥(与程野共用同一张脸资产,以虎口疤区分)"]
    },
    {
      "id": "C09",
      "name": "程溪",
      "role": "程野的妹妹 · 宋知远的筹码",
      "tier": "support",
      "arc": "被宋家安置在外当人质,苏曼丽反水后被带走,终局获救,陪哥哥去自首",
      "from": ["选题卡结局「程野带着妹妹去自首」", "原创:补出名字与人质功能,替换赌债线"]
    },
    {
      "id": "C10",
      "name": "刑侦队长",
      "role": "后半程布控、审讯、移送",
      "tier": "functional",
      "from": ["合并:办案警察若干"]
    },
    {
      "id": "C11",
      "name": "实习法医",
      "role": "林晚的助手 · 送检链见证人",
      "tier": "functional",
      "from": ["合并:法医中心同事若干"]
    },
    {
      "id": "C12",
      "name": "宋家保镖",
      "role": "宋知远的脏手:毁证、刹车、带走程溪",
      "tier": "functional",
      "from": ["合并:司机、打手、买通的鉴定人"]
    },
    {
      "id": "C13",
      "name": "婚礼司仪",
      "role": "婚礼与答谢宴的控场人",
      "tier": "functional",
      "from": ["原创"]
    },
    {
      "id": "C14",
      "name": "审判长",
      "role": "终局庭审",
      "tier": "functional",
      "from": ["原创"]
    }
  ],
  "scenes": [
    { "id": "S01", "name": "沈家婚礼宴会厅(婚礼 / 答谢宴 / 发布会)", "primary": true },
    { "id": "S02", "name": "市法医中心解剖室", "primary": true },
    { "id": "S03", "name": "周启年主任办公室", "primary": true },
    { "id": "S04", "name": "沈家老宅客厅", "primary": true },
    { "id": "S05", "name": "酒店新婚套房", "primary": true },
    { "id": "S06", "name": "沈家游艇(三年前夜 / 终局夜)", "primary": true },
    { "id": "S07", "name": "林晚公寓", "primary": true },
    { "id": "S08", "name": "宋氏港口码头办公室", "primary": true },
    { "id": "S09", "name": "法庭", "primary": true },
    {
      "id": "S10",
      "name": "公安局审讯室",
      "primary": false,
      "reusePlan": "复用 S03 主任办公室的冷白灯光与金属桌资产,去掉书柜换单面镜墙"
    },
    {
      "id": "S11",
      "name": "沈峥墓前",
      "primary": false,
      "reusePlan": "只在第60集出现一次;从 S04 沈家老宅外景庭院延展成后山家族墓园,清晨阴天薄雾"
    }
  ],
  "props": [
    {
      "id": "P01",
      "name": "沈峥的男式旧机械表",
      "function": "订婚时沈峥送的表,表带磨白,林晚一直戴在左腕。替身认不出自己送的表是第一处破绽;结局放在沈峥墓前,全剧收束",
      "beatIds": ["B03", "B25"]
    },
    {
      "id": "P02",
      "name": "程野的白手套",
      "function": "遮住光洁的左手虎口。手套一摘,没有疤,替身即被识破",
      "beatIds": ["B01", "B02"]
    },
    {
      "id": "P03",
      "name": "三年前的无名男尸尸检报告",
      "function": "结论意外、签着林晚的名字。前半程是沈家和周启年压她的把柄,中点被她自己当众举起,结局当庭推翻重签",
      "beatIds": ["B13", "B24"]
    },
    {
      "id": "P04",
      "name": "病理切片蜡块",
      "function": "火化前林晚违规私留的组织样本,是那具尸体唯一残存的身体证据。被毁、被调包,最终做出与沈砚的同胞比对",
      "beatIds": ["B06", "B08", "B09"]
    },
    {
      "id": "P05",
      "name": "苏曼丽的房卡",
      "function": "答谢宴上偷塞的求救信号,打开敌营的第一道门",
      "beatIds": ["B04"]
    },
    {
      "id": "P06",
      "name": "沈峥生活手册",
      "function": "宋家给程野学沈峥的手册,首页日期在游艇事发次日、尸体被发现之前——证明有人提前知道沈峥已死",
      "beatIds": ["B12", "B19"]
    },
    {
      "id": "P07",
      "name": "周启年的旧录音笔",
      "function": "三年前周启年留的后手,录着宋知远交代三天内火化。被指合成,再被背景船笛定位到港口",
      "beatIds": ["B17", "B18"]
    },
    {
      "id": "P08",
      "name": "船锚银袖扣",
      "function": "宋知远的标志。尸检照片里死者指缝中的银色碎片是一只锚爪,他左袖那只是后配的——直接把凶手钉在游艇上",
      "beatIds": ["B14", "B21", "B22"]
    }
  ],
  "beats": [
    { "id": "B01", "type": "悬念钩", "weight": "minor", "episode": 1, "setup": "林晚被请来婚礼当众难堪,新郎摘手套递戒指", "payoff": "左手虎口光洁无疤,她想起三年前解剖台上那具无名男尸虎口的旧疤" },
    { "id": "B02", "type": "当众揭破", "weight": "major", "episode": 2, "setup": "全场等着看前任出丑", "payoff": "林晚当众扣住新郎左手,宣布他不是沈峥,全场哗然,新郎冷汗湿透手套" },
    { "id": "B03", "type": "打脸", "weight": "minor", "episode": 5, "setup": "苏曼丽在答谢宴上带头羞辱,网上全是前任大闹婚礼", "payoff": "林晚亮出腕上旧表问新郎这是谁送的,他答不上来,苏曼丽的笑僵在脸上" },
    { "id": "B04", "type": "反转", "weight": "minor", "episode": 8, "setup": "苏曼丽踩她最狠", "payoff": "房卡背后是求救:新郎从不碰她,半夜在阳台背沈峥的生平" },
    { "id": "B05", "type": "揭破", "weight": "major", "episode": 10, "setup": "林晚在套房堵住程野,摆出他整容前的模仿演员旧照", "payoff": "程野承认自己是替身,但不知道沈峥怎么死的,妹妹在宋家手里" },
    { "id": "B06", "type": "反转", "weight": "minor", "episode": 13, "setup": "人三天就火化了,沈家笃定死无对证", "payoff": "林晚打开公寓冰柜:三年前她私留的一盒切片蜡块" },
    { "id": "B07", "type": "打脸", "weight": "minor", "episode": 16, "setup": "宋婉仪派律师闯法医中心,要求销毁无主旧样本", "payoff": "林晚按规程逐条驳回,律师团当场哑口" },
    { "id": "B08", "type": "反转", "weight": "minor", "episode": 18, "setup": "样本柜被毁,沈家以为证据已灭", "payoff": "毁掉的是空盒,真样本早分了一份在沈砚手里" },
    { "id": "B09", "type": "揭破", "weight": "major", "episode": 20, "setup": "沈砚赌气抽血做比对", "payoff": "同胞关系成立:无名男尸就是沈峥,林晚把报告拍在宋婉仪面前,沈砚倒向林晚" },
    { "id": "B10", "type": "打脸", "weight": "minor", "episode": 23, "setup": "周启年主持内部听证,要定她伪造比对", "payoff": "实习法医调出送检全程录像,听证反过来质询周启年为何三天火化" },
    { "id": "B11", "type": "揭破", "weight": "minor", "episode": 26, "setup": "周启年腕上的金表", "payoff": "林晚翻出结案前后的合影:金表正是结案那周才戴上的" },
    { "id": "B12", "type": "反转", "weight": "minor", "episode": 28, "setup": "程野被逼着继续演", "payoff": "程野偷出沈峥生活手册交给林晚,首页日期早于尸体被发现" },
    { "id": "B13", "type": "自曝反杀", "weight": "major", "episode": 30, "setup": "周启年抛出那份签着她名字的报告,要她当替罪羊", "payoff": "林晚在发布会上自己举起报告,认下签字,指认逼她签字的人就在台下,周启年当众失色" },
    { "id": "B14", "type": "悬念钩", "weight": "minor", "episode": 33, "setup": "宋知远出面和气调停", "payoff": "林晚盯住他的船锚袖扣:和尸检照片里死者指缝中的银色碎片一个形状" },
    { "id": "B15", "type": "打脸", "weight": "minor", "episode": 36, "setup": "苏曼丽反水,程溪被带走,宋婉仪召开董事会逼沈砚签股权", "payoff": "沈砚当众拒签,第一次公开站到林晚一边" },
    { "id": "B16", "type": "悬念钩", "weight": "minor", "episode": 38, "setup": "停职的周启年刹车失灵", "payoff": "林晚验伤认定人为,周启年醒来只说他留了东西" },
    { "id": "B17", "type": "揭破", "weight": "major", "episode": 40, "setup": "周启年交出旧录音笔", "payoff": "录音里交代三天内火化的声音,沈砚一听就认出是舅舅;周启年认罪" },
    { "id": "B18", "type": "打脸", "weight": "minor", "episode": 43, "setup": "宋知远买来鉴定称录音是合成,反告林晚诽谤", "payoff": "林晚用录音背景里的船笛声定位到宋氏港口办公室,鉴定当场作废" },
    { "id": "B19", "type": "崩塌", "weight": "major", "episode": 45, "setup": "宋婉仪一直以为儿子是意外落水", "payoff": "手册加录音摆在面前,她得知是亲弟弟杀了儿子,当场崩塌,转身交出沈氏账本" },
    { "id": "B20", "type": "反转", "weight": "minor", "episode": 48, "setup": "宋知远把苏家推出去当洗钱替罪羊", "payoff": "苏曼丽回头,交出两家港口的货单" },
    { "id": "B21", "type": "揭破", "weight": "minor", "episode": 50, "setup": "沈砚重回游艇", "payoff": "他想起醉倒前看见舅舅提着扳手上甲板;林晚放大尸检照片,碎片正是一只锚爪" },
    { "id": "B22", "type": "终局对决", "weight": "major", "episode": 53, "setup": "宋知远约林晚上同一艘游艇和解,想照三年前再来一次", "payoff": "刑侦队长早已布控,袖扣断口当场对上,宋知远被按在甲板上" },
    { "id": "B23", "type": "认罪", "weight": "minor", "episode": 56, "setup": "宋知远在审讯室笑着说证据不够", "payoff": "林晚摆出疤、切片、手册、录音、袖扣五件证据链,他认罪" },
    { "id": "B24", "type": "翻案", "weight": "major", "episode": 58, "setup": "庭审,三年前的报告摆上证据台", "payoff": "林晚当庭推翻自己签的报告,重新写下死者沈峥他杀,签上自己的名字" },
    { "id": "B25", "type": "情感收束", "weight": "minor", "episode": 60, "setup": "宋婉仪交出沈氏,程野带着妹妹去自首", "payoff": "林晚把那块表放在沈峥墓前" }
  ],
  "episodes": []
}
验尸官的婚礼-全剧骨架.md 全剧骨架 2,738 字
# 《验尸官的婚礼》全剧骨架

60 集竖屏 · 每集 1–2 分钟 · AI 生成 · 女频大女主 / 复仇悬疑 / 豪门

## 一、核心

被退婚的女法医在前未婚夫的婚礼上认出新郎是替身,用一件件看得见的证据把三年前那具无名男尸还原成沈峥,最后亲手推翻自己签过的假报告。

- **主线**:三年前是谁杀了沈峥。
- **副线**:林晚自己签的那份“意外”报告。越接近凶手,越接近她自己的罪。
- **终点**:不是夺回沈氏,是她当庭重写“死者沈峥,他杀”,签上自己的名字。

## 二、推进规则(管住分集和剧本)

1. **每集一件看得见的证据**。全剧分五段,每段换一类主证:疤 → 切片 → 报告 → 录音 → 袖扣。
2. **沈家毁证逐段升级**:抹黑 → 毁样本 → 停职 → 灭口 → 杀人。
3. **爽点只落在沈家人和周启年脸上**。林晚不抬声调,靠证据赢。
4. 每集结尾必须留一个钩子,相邻两次爽点之间最多隔 3 集。

## 三、五段结构

| 段 | 集数 | 主证 | 这一段解决什么 | 段末落点 |
|---|---|---|---|---|
| 一 · 婚礼 | 1–10 | 疤、旧表 | 认出替身,打开敌营 | 程野承认是替身 |
| 二 · 切片 | 11–22 | 切片蜡块 | 证明无名男尸就是沈峥 | 同胞比对成立 |
| 三 · 签字 | 23–35 | 尸检报告、手册 | 林晚直面自己的签字 | 发布会上自曝反杀,袖扣露底 |
| 四 · 录音 | 36–48 | 录音笔、账本 | 打穿周启年,让宋婉仪崩塌 | 宋婉仪倒戈、苏曼丽回头 |
| 五 · 游艇 | 49–60 | 船锚袖扣 | 拿下宋知远,翻案 | 当庭重签,墓前放表 |

## 四、爽点表(25 个,8 个大爆点)

★ = 大爆点

| 集 | 类型 | 落点 |
|---|---|---|
| 1 | 悬念钩 | 新郎摘手套,虎口光洁无疤 |
| 2★ | 当众揭破 | 她当众扣住新郎左手:他不是沈峥 |
| 5 | 打脸 | 亮出旧表问是谁送的,新郎答不上 |
| 8 | 反转 | 苏曼丽的房卡原来是求救 |
| 10★ | 揭破 | 摆出整容前旧照,程野承认是替身 |
| 13 | 反转 | 冰柜里是三年前私留的切片 |
| 16 | 打脸 | 宋家律师要销毁样本,被她按规程驳回 |
| 18 | 反转 | 被毁的是空盒,真样本在沈砚手里 |
| 20★ | 揭破 | 同胞比对成立:无名男尸就是沈峥 |
| 23 | 打脸 | 听证会反过来质询周启年为何三天火化 |
| 26 | 揭破 | 周启年的金表是结案那周才戴上的 |
| 28 | 反转 | 程野交出生活手册,首页日期早于尸体被发现 |
| 30★ | 自曝反杀 | 发布会上自己举起报告,认下签字,指认逼签人 |
| 33 | 悬念钩 | 宋知远的袖扣和死者指缝里的碎片同形 |
| 36 | 打脸 | 沈砚在董事会当众拒签 |
| 38 | 悬念钩 | 周启年刹车被动手脚,醒来说留了东西 |
| 40★ | 揭破 | 录音里是舅舅的声音,周启年认罪 |
| 43 | 打脸 | 录音被指合成,船笛声定位到宋氏港口 |
| 45★ | 崩塌 | 宋婉仪得知是亲弟弟杀了儿子,交出账本 |
| 48 | 反转 | 苏曼丽交出港口货单 |
| 50 | 揭破 | 沈砚想起扳手;碎片正是一只锚爪 |
| 53★ | 终局对决 | 同一艘游艇上设局,袖扣断口对上,当场拿下 |
| 56 | 认罪 | 五件证据链摆齐,宋知远认罪 |
| 58★ | 翻案 | 当庭推翻自己的报告,重签“他杀” |
| 60 | 收束 | 宋婉仪交出沈氏,程野带妹妹自首,表放在墓前 |

## 五、人物(14 位)

**主角组(4)**
- **林晚**:从被退婚、被停职,到当庭推翻自己签的报告。赢回的是那份签字。
- **程野**:从替死人活着,到交出手册作证,再到带妹妹自首。
- **沈砚**:从不信法医,到用自己的血做比对,再到想起游艇那晚、出庭作证。
- **宋知远**:前半程是和气的调停人,第 33 集袖扣露底,第 53 集在同一艘游艇上被拿下。

**重要配角(5)**
- **苏曼丽**:踩人 → 塞房卡 → 第 36 集前反水 → 第 48 集回头。
- **周启年**:被反将、被灭口未遂,交出录音认罪。
- **宋婉仪**:一路护着替身,第 45 集崩塌。
- **沈峥**:只出现在闪回里,和程野共用一张脸,靠虎口的疤区分。
- **程溪**(新增):程野的妹妹,宋知远手里的筹码,替代原来的赌债线。

**功能性角色(5)**:刑侦队长、实习法医、宋家保镖、婚礼司仪、审判长。

## 六、取舍

- **砍掉的线**:港口商战(港口只作为证据来源)、林晚和沈砚的感情线(大女主,不谈恋爱)、二房争股(只当宋婉仪找替身的动机)、程野的赌债债主(换成妹妹当筹码)。
- **合并的人**:宋家的司机、打手和买通的鉴定人并成一个保镖;警察并成一位刑侦队长;法医中心同事并成一位实习法医。

## 七、场景与道具

**主场景(9 个,上限 10)**:婚礼宴会厅(婚礼、答谢宴、发布会共用)、解剖室、周启年办公室、沈家老宅客厅、新婚套房、游艇(三年前和终局共用)、林晚公寓、宋氏港口办公室、法庭。
**一次性场景**:审讯室(复用办公室改造)、墓前(从老宅外景延展)。

**叙事道具(8 件)**:旧机械表、白手套、三年前的尸检报告、切片蜡块、房卡、沈峥生活手册、旧录音笔、船锚袖扣。

## 八、生成风险与对策

- **同脸双人**:程野和沈峥共用一张脸资产,靠虎口疤和白手套区分,闪回统一用冷蓝调。
- **审核**:尸体全程盖白布、不露脸,用切片、报告、照片局部代替。
- **夜海戏**:游艇资产共用,落水只拍入水前一刻。
- **证据重复**:五段各换一类主证,沈家的手段逐段升级。

## 九、已定事项(分集与剧本必须遵守)

1. **砍线**:砍掉商战、感情线、二房、债主,只留一条主线加一条副线。
2. **合人与新增**:合出 3 个功能角色;新增“程溪”这个名字和她的人质功能。
3. **大爆点落集**:2 / 10 / 20 / 30 / 40 / 45 / 53 / 58。中点(第 30 集)定为林晚自曝签字。
4. **补充设定**:真沈峥左手虎口有疤;旧表是沈峥订婚时送的;新增生活手册、录音笔、袖扣碎片三件证据。

过程

按时间顺序。点开工具调用能看到完整的输入和返回;思考的内容 Claude Code 不对外输出,日志里只有「在这里思考过多久」。

第 1 轮

输入:
/novel-outline 我要给一部短剧写全剧骨架,要求在 premise.md 里,写好存成文件放在当前目录。

思考

Bash List directory and read premise file

输入

ls -la && cat premise.md && ls .claude/skills/novel-outline .claude/skills/novel-outline/references

返回

total 16
drwxr-xr-x  4 user  wheel   128 Oct 30 17:13 .
drwxr-xr-x  3 user  wheel    96 Oct 30 17:13 ..
drwxr-xr-x  4 user  wheel   128 Oct 30 17:13 .claude
-rw-r--r--  1 user  wheel  4233 Oct 30 17:13 premise.md
这是一张选题卡。它要拍成 60 集竖屏短剧,每集 1–2 分钟,全部由 AI 拍。
请交一份全剧骨架:整部剧怎么走,用来管住后面的分集大纲和剧本。
只交骨架,不写分集大纲和剧本正文,3000 字以内。

《验尸官的婚礼》

标签:女频、大女主、复仇、悬疑、豪门

一句话卖点:被退婚的女法医去参加前未婚夫的婚礼,一眼认出新郎是替身:真新郎三年前就躺在她的解剖台上。

观众代入谁:林晚,被当众退婚的女法医,冷静、专业,靠本事翻盘

爽点落在谁脸上:沈家一家,和三年前逼她签字的周启年

故事靠什么往前推:每一集她都要拿出一样看得见的证据:一道疤、一张切片、一段录音。沈家每次都想办法毁掉证据、抹黑她;她每赢一次,就离“三年前是谁杀了沈峥”更近一步,也离她自己签过的那份假报告更近一步。

人物:
- **林晚**(女主 · 法医)
  - 样子:28 岁,齐耳短发,素颜,常穿一件深灰长风衣;左手腕戴一块男式旧机械表,表带磨白了。说话不抬声调。
  - 小传:市法医中心的法医,干了七年。四年前和沈家长子沈峥订婚,一年前被“沈峥”当众退婚,说她天天摸死人、晦气。三年前她解剖过一具无名男尸,最初写的是“他杀”,被周启年逼着改成“意外”,签了字,这是她心里的一根刺。冷静,嘴不饶人,认证据不认人。
- **程野**(新郎 · 顶着沈峥的脸的替身)
  - 样子:30 岁,和沈峥一样的脸、一样的金丝眼镜;婚礼上一直戴着白手套,左手虎口光洁,没有疤。
  - 小传:欠了一身赌债的模仿演员。三年前被宋家找去整容,学沈峥说话、走路、签名,替他活着。他不知道沈峥是怎么死的,只知道自己哪天没用了,也会“意外”。
- **沈砚**(沈家二少 · 沈峥的弟弟)
  - 样子:26 岁,寸头,西装从来不扣扣子,右耳一枚黑耳钉,笑起来像什么都不在乎。
  - 小传:从小跟在哥哥后面。三年前哥哥从国外“养病”回来,他第一个觉得不对,可没人信他。那晚游艇上他也在,喝醉了,什么都记不清,这件事他谁都没说。一开始不信林晚这个法医,后来成了她在沈家唯一的内应。
- **苏曼丽**(新娘 · 苏家千金)
  - 样子:26 岁,长卷发,永远带着全妆,酒红色指甲。
  - 小传:苏家和沈氏一起做港口生意,她嫁进沈家是两家的买卖。新婚夜她就觉得丈夫不对,却不敢说。前期带头踩林晚,答谢宴上偷偷把求救的房卡塞给她;为了家里的生意,后面还会反水一次。
- **周启年**(法医中心主任 · 三年前逼她签字的人)
  - 样子:55 岁,花白背头,老花镜挂在胸前,腕上一块和工资不相称的金表。
  - 小传:林晚的老领导。三年前收了宋知远的钱,把那具无名男尸的结论从“他杀”改成“意外”,逼林晚签字,三天内火化。
- **宋婉仪**(沈家主母 · 沈峥、沈砚的母亲)
  - 样子:52 岁,盘发,素色旗袍,珍珠耳环,说话永远轻声细语。
  - 小传:丈夫早逝,靠弟弟宋知远撑起沈氏。按老爷子的遗嘱,长孙沈峥三十岁接手沈氏一半的股份,人没了就归二房。三年前儿子“落水”,她为了保住股份找人顶替了他,一直以为儿子是意外死的。
- **宋知远**(宋婉仪的弟弟 · 沈氏海外业务负责人)
  - 样子:48 岁,高个子,笑容和气,袖口总是一对船锚形状的银袖扣。
  - 小传:沈家人眼里最可靠的舅舅。借沈氏的海外港口洗钱,三年前被沈峥发现,在游艇上用扳手砸了他的后脑,推下海;之后买通周启年改了结论,又让姐姐以为是意外。全剧最后的对手。

结局:宋知远认罪伏法,宋婉仪交出沈氏,程野带着妹妹去自首。林晚当庭推翻自己三年前签的报告,重新写下“死者沈峥,他杀”,签上自己的名字。最后一场,她把那块表放在沈峥的墓前。
.claude/skills/novel-outline:
README.en.md
README.md
SKILL.md
assets
examples
references
scripts

.claude/skills/novel-outline/references:
episode-pass.md
outline-pass.md
report-style.md
schema.md
volume-pass.md

思考 2 秒

Bash Read outline pass and schema references

输入

cd /scratch/003/ws/003-skeleton/eternityspring__shuohao-skills/run-1/.claude/skills/novel-outline && cat references/outline-pass.md references/schema.md

返回

# 骨架 · 砍线 / 合人 / 排爽点

拿全部卷摘要(或短篇原文)+ 用户参数,产出 outline.json 的**骨架四块**:`adaptation` / `characters` / `scenes` / `beats`。分集梗概**这一步不写**——骨架没拍板就写分集,方向错了全废。

## 顺序就是方法

1. **砍线**。短剧只装得下一条主线 + 至多一条副线。砍掉的写进 `adaptation.cut`,每条都要有 why。`adaptMode` 不是忠实时一条不砍会被 validate 拦。
2. **合人**。功能重复的角色合成一张脸(两个报信的 → 一个),合并进 `characters[].from` 的 ← 改动记录。然后**分档**(`tier`):主角组 `lead` 1–5 人、有名字的重要配角 `support` ≤ 10、功能性角色 `functional` ≤ 10。功能性角色占脸不占名——`name` 用称呼标签(「急诊医生」),也不用写人物弧。无名背景人不进表。
3. **收场景**。主场景上限随集数走(4 + ⌈集数/10⌉,夹在 5–15:6 集给 5 个,60 集给 10 个),以 `validate` 报的数为准。这是 AI 短剧的宽松版——场景是生成的,多开几个景换观赏性是划算的,别把戏都憋在一个屋里。原著里只出现一次的场景,要么砍掉、要么写 `reusePlan`(复用哪个现有环境资产、换什么时段天气改出来)。
4. **排爽点**。先定 major(大爆点)落在哪几集,再拿 minor 填缝。硬规则:相邻间隔 ≤ 3 集、开头结尾无真空、最早的 major 不能在最后一集。`type` 跟着题材走——女频打脸和男频战神的爽点不是一种东西,看 `params.genre`。
5. **收道具**。**排在爽点之后不是随便排的**——叙事道具的判据是「它托起哪个爽点」,爽点没定就分不清哪件物件是道具、哪件只是陈设。上限 8 件,跟主角数量一个量级。每件写 `function`(它在戏里承载什么)与 `beatIds`(托起哪几个爽点),分集用 `propIds` 引用。

   **一件东西该不该进这张表,问一句就够了:它坏了、丢了、被换掉,剧情会不会塌。** 会塌就是叙事道具(皮箱、砚台、那封信);不会塌就是场景陈设(船舱的挂灯、桌上的茶碗),归 `novel-art` 的场景锚点管,不进这张表。填不出 `function` 的一律不收——**填不出来的不是道具,是背景**。

每一步都基于卷摘要里的原料。**关键取舍在 `adaptation.keep` 里附 `evidence`(原文逐字片段)**——大纲要能指回原文,不是凭印象改编。

砍完、合完之后各补一句结论:`adaptation.cutNote` 写砍线的含义(「这意味着:全剧终点是……」),`adaptation.mergeNote` 写主角组入选理由(谁有完整转变弧)。这两句会出现在报告最前面的「关键决策」区块,也是拍板时给用户看的核心内容。

## 两轮规则 ⛔

骨架必须跑两轮:

- **第一轮快版**:四块填齐、能过 `validate --stage beats` 就停,**交给用户拍板**。砍了哪条线、合了哪些人、大爆点在第几集——这三件事用户不点头,后面全是白干。
- **第二轮细版**:吸收用户意见后细化,再过一次 `validate --stage beats`。

快版的意义是便宜——错了只损失一轮骨架,不是 60 集梗概。

## 自检

写完跑:

```bash
node scripts/novel-outline.mjs validate <outline.json> --stage beats
```

有违规逐条修,改完重跑,直到通过才允许进分集。
# outline.json 结构

五件套的载体。**模型只管填这份 JSON**,Markdown 和 report.html 由 `render` 渲染出来,资产清单由脚本汇总——五件套是四件模型写 + 一件算出来的。

```json
{
  "source": "书名",
  "lang": "zh",
  "params": { "episodes": 60, "minutesPerEpisode": 2, "genre": "女频逆袭", "adaptMode": "抽核", "preferences": [] },
  "adaptation": { "core": "…", "keep": [], "cut": [], "merge": [], "risks": [] },
  "characters": [ { "id": "C01", "name": "…", "role": "…", "arc": "…", "from": ["原著…", "合并:…"] } ],
  "scenes": [ { "id": "S01", "name": "…", "primary": true, "reusePlan": "…" } ],
  "beats": [ { "id": "B01", "type": "打脸", "weight": "major", "episode": 3, "setup": "…", "payoff": "…" } ],
  "episodes": [ { "ep": 1, "synopsis": "…", "hook": "…", "suspense": "…", "sceneIds": ["S01"], "characterIds": ["C01"], "propIds": ["P01"], "crowdPlan": "…", "warnings": [] } ]
}
```

## params

| 字段 | 必填 | 说明 |
| --- | --- | --- |
| `episodes` | 是 | 总集数,正整数。分集数量必须与它一致 |
| `minutesPerEpisode` | 是 | 单集时长(分钟) |
| `genre` | 是 | 题材,**决定爽点类型**,不许缺。投放平台的差异不单设字段,直接体现在 `thresholds` 上 |
| `adaptMode` | 是 | `忠实` / `抽核` / `借壳`,只能这三个 |
| `preferences` | 否 | 用户点名要保的角色、戏 |
| `thresholds` | 否 | 逐项覆盖质量门阈值:`maxLeads`(5) / `maxSupport`(10) / `maxFunctional`(10) / `maxBeatGap`(3) / `maxPrimaryScenes`(缺省不是常数,**随集数动态**:4 + ⌈集数/10⌉ 夹在 5–15,60 集 → 10。按 AI 短剧定的——场景是生成的,上限守的是一致性资产不是搭景钱)。短篇建议收紧角色档 |

## adaptation 改编说明

`core` 一句话核心,必填。`keep` / `cut` / `merge` 每条 `{what, why}`,`keep` 至少一条;**`adaptMode` 不是忠实时 `cut` 不能为空**。`keep` 可带 `evidence`——**原文逐字片段**,禁止凭书名脑补的对策就在这:关键取舍要能指回原文。`risks` 每条 `{what, plan}`。

两个可选的**决策补注**,报告的「关键决策」区块会展示:

- `cutNote` — 砍线的结论句(「这意味着:全剧终点是……原著后 30 章基本不用」这种),说清砍完之后故事的终点变成了什么
- `mergeNote` — 合人的补注,通常写主角组入选理由(谁有完整转变弧)

给了就不能是空字符串,`validate` 会拦。大爆点落点列表**不用写**——报告从 `beats` 里自动算。

## characters 人物表

每个字段都以校验器为准,一个不多一个不少:

| 字段 | 必填 | 说明 |
| --- | --- | --- |
| `id` | 是 | `C01` 格式,全局唯一,分集靠它引用 |
| `name` | 是 | 姓名;功能性角色用称呼标签(「急诊医生」) |
| `role` | 是 | 定位一句话:女主 / 搅局配角 / 渡口的报时人…… |
| `tier` | 是 | 三档之一,见下表 |
| `arc` | lead / support 必填 | 人物弧;functional 可省——医生就是来缝针的 |
| `from` | 是 | **← 改动记录**,非空数组:原著对应谁、合并了谁、纯原创写 `["原创"]` |

- `tier` 只能三档——一刀切的角色上限混淆了「观众要记住谁」和「制作要维护多少张脸」,分档把它拆开:

  | tier | 是谁 | 上限 | 规则 |
  | --- | --- | --- | --- |
  | `lead` | 主角组(男女主 + 主反派) | 1–5 人 | `arc` 必填 |
  | `support` | 有名字的重要配角(亲属、闺蜜、副反派) | ≤ 10 | `arc` 必填 |
  | `functional` | 功能性角色(医生、秘书、店员) | ≤ 10 | **占脸不占名**:`name` 用称呼标签(「急诊医生」);`arc` 可省——医生就是来缝针的 |

  无名背景人不进表、不追踪、不限量。

  **这份表是下游 novel-characters 的角色清单**:谁进谁不进、谁是主角组在这里定死,角色设定照着做,不用再判断一遍轻重(`tier` 对应过去就是 `importance`:`lead` → protagonist、`support` → supporting、`functional` → minor)。反过来,手上已经有 cast.json 的话也能映射进来:protagonist/major → `lead`,supporting → `support`,minor → `functional`

## scenes

- `id` 格式 `S01`,全局唯一;`name` 必填;`primary` 必填布尔(主场景上限随集数动态,见 `thresholds`)
- **在全剧只出现一次的场景必须带 `reusePlan`**(规避方案:复用哪个现有环境资产、换什么时段天气改出来)

## props 叙事道具

- **可选字段**。没写照常通过全部质量门(`prop-cap` 与 `refs` 两道会明说跳过);写了就按下面查
- `id` 格式 `P01`,全局唯一;`name` 必填
- **`function` 必填——这一层唯一要拍板的东西:这件物件在戏里承载什么。** 填不出来说明它不是叙事道具,是场景陈设,那归 `novel-art` 的场景锚点管,不进这张表
- `beatIds` 可选:它托起哪几个爽点。写了就必须指向 `beats` 里真实存在的 id
- 上限 `maxProps` 默认 8 件(进 `params.thresholds` 可覆盖)。跟主角数量一个量级——**只收有特写、跨集出现、承载剧情的**
- 分集用 `episodes[].propIds` 引用。**没有任何一集引用的道具会被 `refs` 门点名**——跟失业角色、空转场景同一个判据

边界:尺度、锚点、状态变体、白底提示词都是 `novel-art` 的活,不在这里定。这张表回答「哪几件物件承载剧情、各自承载什么」,美术层回答「它长什么样、怎么保证六集都长一样」。

## beats 爽点表

- `id` 格式 `B01`;`type` 自由文本(打脸/揭破/反转…);`weight` 只能 `major` / `minor`(缺省算 minor)
- `episode` 是**唯一数据源**——分集不再列 beatIds,节奏条和资产清单都从这里算
- 硬规则:相邻爽点间隔 ≤ `maxBeatGap`,开头结尾无真空;**至少一个 major,且最早的 major 不能落在最后一集**

## episodes 分集梗概

- `ep` 从 1 连续编号,总数等于 `params.episodes`
- `synopsis` / `hook` / `suspense` 三栏**都必填**——【钩子】【悬念】空了视为未完成
- **叙述体**:三栏里出现 `「」『』“”` 引号对白就是在写剧本,越界,validate 会拦
- `sceneIds` / `characterIds` 必填且必须指向已登记的 id;每个角色至少出现一集、每个场景至少用一次
- `propIds` 可选(写了 `props` 才有意义),必须指向已登记的道具 id;每件道具至少出现一集
- `characterIds` ≥ 3 的集必须写 `crowdPlan`(同框拆解方案)。**校验按人数判,是代理指标**——如果这一集三人实际不同框(分处不同场次),把这个事实写成方案即可:「三人分处两场,无同框,分场拍」,照样通过
- `warnings`:梗概里扫到生成难点关键词(雨戏/肢体接触/人群/手部特写)就必须列进来,宁可多报

## 校验

```bash
node scripts/novel-outline.mjs validate outline.json --stage skeleton|beats|full
node scripts/novel-outline.mjs checkup outline.json   # 只打印 14 道质量门 ✓/✗
```

stage 就是流程门:骨架拍板前过 `skeleton`,**写分集之前必须过 `beats`**(爽点间隔和 major 时机错了,分集写完全废),交付前过 `full`。

思考 2 秒

Bash Inspect example skeleton and script stage handling

输入

node -e 'const o=require("./examples/渡口-outline.json");delete o.episodes;console.log(JSON.stringify(o,null,1))' | head -150; grep -n "stage\|tier\|props" scripts/novel-outline.mjs | head -60

返回

{
 "source": "渡口",
 "lang": "zh",
 "params": {
  "episodes": 6,
  "minutesPerEpisode": 2,
  "genre": "民国情感悬疑",
  "adaptMode": "抽核",
  "preferences": [
   "保留浓雾开船的意象",
   "老周不能改成反派"
  ]
 },
 "adaptation": {
  "core": "浓雾渡口的一船陌生人,各自揣着说不出口的来路,雾散之前每个人都得亮一次底。",
  "keep": [
   {
    "what": "浓雾渡口的封闭空间",
    "why": "天然的单场景悬疑舞台,省景又聚戏",
    "evidence": "雾一厚,连自己的手都看不清。"
   },
   {
    "what": "沈知微怀里的旧皮箱",
    "why": "全剧最强的悬念道具,每集都能给一眼",
    "evidence": "她把一只旧皮箱抱在怀里,指节因为用力而发白。"
   }
  ],
  "cut": [
   {
    "what": "县城当铺的支线",
    "why": "空间跳出渡口,两分钟一集装不下第二个舞台"
   }
  ],
  "merge": [
   {
    "what": "岸边问路的路人甲乙并入胡二爷",
    "why": "同一个功能(打探消息)不需要三张脸"
   }
  ],
  "risks": [
   {
    "what": "全剧困在船上,节奏容易闷",
    "plan": "每集固定一次外部威胁打进来:汽笛、巡查、涨水"
   }
  ],
  "cutNote": "这意味着:全剧困在渡口一夜之内,当铺、县城全部场外处理,终点是开箱翻案,不是进城打官司。",
  "mergeNote": "主角组定的是沈知微与陆行远——全篇只有这两个人有完整的转变弧。"
 },
 "characters": [
  {
   "id": "C01",
   "name": "沈知微",
   "role": "女主",
   "arc": "从抱箱防备到当着全船开箱,把最怕被看见的东西变成翻盘的底牌",
   "from": [
    "原著沈知微"
   ],
   "tier": "lead"
  },
  {
   "id": "C02",
   "name": "陆行远",
   "role": "男主",
   "arc": "大衣口袋里的硬东西从威胁翻成守护,最后一集摊开手心",
   "from": [
    "原著陆行远"
   ],
   "tier": "lead"
  },
  {
   "id": "C03",
   "name": "老周",
   "role": "关键配角",
   "arc": "静止的锚,四十年不问客人来路,最后用一句话掀翻全船的谎",
   "from": [
    "原著老周",
    "合并:岸边艄公的台词功能"
   ],
   "tier": "support"
  },
  {
   "id": "C04",
   "name": "胡二爷",
   "role": "搅局配角",
   "arc": "自来熟的货郎,每集戳一个人的痛处,自己反而是藏得最深的",
   "from": [
    "原著胡二爷",
    "合并:岸边问路的路人甲乙"
   ],
   "tier": "support"
  },
  {
   "id": "C05",
   "name": "岸上挑灯的更夫",
   "tier": "functional",
   "role": "渡口的报时人,雾里只闻梆子声",
   "from": [
    "原创:把原著里「岸上远远的灯火」拟人化成可拍的角色"
   ]
  }
 ],
 "scenes": [
  {
   "id": "S01",
   "name": "渡船船舱",
   "primary": true
  },
  {
   "id": "S02",
   "name": "渡口栈桥",
   "primary": true
  },
  {
   "id": "S03",
   "name": "对岸芦苇滩",
   "primary": false,
   "reusePlan": "栈桥同一机位换背板,芦苇前景遮挡"
  }
 ],
 "props": [
  {
   "id": "P01",
   "name": "旧皮箱",
   "function": "沈知微的底牌与软肋:里面是一摞状纸和一块灵位。从「谁都不许碰」到当众打开,开箱即翻案——全剧最重的一件物证",
   "beatIds": [
    "B01",
    "B04"
   ]
  },
  {
   "id": "P02",
   "name": "县衙旧砚",
   "function": "陆行远的身份物证:砚底刻着县衙的印。掏出即揭破他不是揣枪的人,压到状纸上即与皮箱合成同一桩冤案",
   "beatIds": [
    "B02",
    "B04"
   ]
  }
 ],
 "beats": [
  {
   "id": "B01",
   "type": "悬念钩",
   "weight": "minor",
   "episode": 1,
   "setup": "皮箱谁都不许碰",
   "payoff": "胡二爷伸手要帮忙拎箱,被沈知微一把按住,全船瞬间安静"
  },
  {
   "id": "B02",
191:  // props 是后加的字段。**没有这个字段的旧大纲要照常通过**——两道相关的门
193:  const hasProps = Array.isArray(outline?.props);
194:  const props = hasProps ? outline.props : [];
197:  const tierCap = { lead: th.maxLeads, support: th.maxSupport, functional: th.maxFunctional };
198:  for (const tier of CHARACTER_TIERS) {
199:    const n = chars.filter((c) => c?.tier === tier).length;
200:    const needMin = tier === 'lead';
202:      `${tier}-cap`,
203:      `${TIER_LABELS[tier]} ${needMin ? `1–${tierCap[tier]}` : `≤ ${tierCap[tier]}`} 人`,
204:      (needMin ? n >= 1 : true) && n <= tierCap[tier],
214:  // 陈设也收进来了。没有 props 字段的旧大纲明说跳过,不判失败。
218:    !hasProps || props.length <= th.maxProps,
219:    hasProps ? `${props.length} 件` : '大纲没有 props 字段,跳过',
226:  const propUse = new Map(props.map((pr) => [pr?.id, 0]));
324:    for (const pr of props) {
335:    hasProps ? 'refs-props' : null,
354: * 三档 stage 就是流程门:
363:export function validateOutline(outline, stage = 'full') {
411:    const tierCap = { lead: th.maxLeads, support: th.maxSupport, functional: th.maxFunctional };
412:    for (const tier of CHARACTER_TIERS) {
413:      const n = chars.filter((c) => c?.tier === tier).length;
414:      if (n > tierCap[tier]) p(`${TIER_LABELS[tier]} ${n} 位,超过上限 ${tierCap[tier]}`);
416:    if (!chars.some((c) => c?.tier === 'lead')) p('没有主角组(tier=lead)角色');
423:      if (!CHARACTER_TIERS.includes(c?.tier)) {
424:        p(`[${label}] tier 必须是 ${CHARACTER_TIERS.join('/')}(主角组/重要配角/功能性角色)`);
428:      if (c?.tier !== 'functional' && !thText(c?.arc)) p(`[${label}] 缺 arc(主角组和重要配角必须有人物弧)`);
453:  // --- props 叙事道具 ---
454:  // 可选字段:旧大纲没有 props 照常通过。写了就按结构查。
455:  if (Array.isArray(outline?.props)) {
456:    if (outline.props.length > th.maxProps) p(`叙事道具 ${outline.props.length} 件,超过上限 ${th.maxProps}`);
458:    for (const pr of outline.props) {
471:  if (stage === 'skeleton') return problems;
497:  if (stage === 'beats') return problems;
541:    return { id: c.id, name: c.name, role: c.role, tier: c.tier, uses: episodes.length, episodes };
545:  // 没有 props 字段的旧大纲返回空数组,调用方按空处理即可。
546:  const props = (outline?.props ?? []).map((pr) => {
555:  const castPlan = CHARACTER_TIERS.map((tier) => {
556:    const members = (outline?.characters ?? []).filter((c) => c?.tier === tier);
557:    return { tier, label: TIER_LABELS[tier], count: members.length, names: members.map((c) => c.name), spec: TIER_ASSET_SPEC[tier] };
572:  return { scenes, characters, props, castPlan, warnings, beatsByType };
599:  'prop-cap': 'Narrative props ≤ {0}',
601:  'refs-props': 'Scene / character / prop references complete — no jobless characters, no unused scenes, no unused props',
672:    tier: TIER_LABELS,
673:    tierSpec: TIER_ASSET_SPEC,
749:      plan: 'Converted per tier · never hand-written',
769:    tier: { lead: 'Lead', support: 'Named supporting', functional: 'Functional' },
770:    tierSpec: {
780:    planPropRow: 'Narrative props',
843:  [...characters].sort((a, b) => CHARACTER_TIERS.indexOf(a.tier) - CHARACTER_TIERS.indexOf(b.tier));
873:    out.push(mdRow([c.id, c.name, t.tier[c.tier] ?? c.tier, c.role, c.arc ?? '—', c.from.join(t.semi)]));
899:  // 道具表:没有 props 的旧大纲不出这张表,不留一张空表占位
900:  if (assets.props.length) {
902:    for (const pr of assets.props) {
911:    out.push(mdRow([t.tier[t2.tier] ?? t2.label, t2.count, t2.names.join(t.sep) || '—', t.tierSpec[t2.tier] ?? t2.spec]));
1067:  const tierN = Object.fromEntries(assets.castPlan.map((p) => [p.tier, p.count]));
1079:  <div class="kpi"><div class="l">${esc(t.kpi.cast)}</div><div class="v">${characters.length}</div><div class="d">${esc(t.kpi.castSub(tierN.lead ?? 0, tierN.support ?? 0, tierN.functional ?? 0))}</div></div>
1103:  const mxRow = (name, tierLabel, epsIn, cls, tail) => {
1106:    return `<tr><td class="name">${esc(name)}</td><td class="tier">${esc(tierLabel)}</td>${cells}<td class="n">${tail}</td></tr>`;
1109:    ...byTier(assets.characters).map((c) => mxRow(c.name, t.tier[c.tier] ?? c.tier, c.episodes, '', String(c.uses))),
1114:    // 道具段:没有 props 的旧大纲整段不出,不留一个空标题

思考 115 秒

Write ./验尸官的婚礼-outline.json

输入

/scratch/003/ws/003-skeleton/eternityspring__shuohao-skills/run-1/验尸官的婚礼-outline.json

{
  "source": "验尸官的婚礼",
  "lang": "zh",
  "params": {
    "episodes": 60,
    "minutesPerEpisode": 1.5,
    "genre": "女频大女主复仇悬疑(豪门)",
    "adaptMode": "抽核",
    "preferences": [
      "每集拿出一样看得见的证据",
      "爽点落在沈家与周启年脸上",
      "结局:当庭推翻自己签的报告,墓前放表"
    ]
  },
  "adaptation": {
    "core": "被退婚的女法医在前未婚夫的婚礼上认出新郎是替身,用一件件看得见的证据把三年前那具无名男尸还原成沈峥,最后亲手推翻自己签过的假报告。",
    "keep": [
      {
        "what": "婚礼认替身的开局",
        "why": "第一集就有全剧最强的钩子,前未婚夫的婚礼天然自带羞辱与反击",
        "evidence": "一眼认出新郎是替身:真新郎三年前就躺在她的解剖台上。"
      },
      {
        "what": "每集一件证据的推进引擎",
        "why": "证据是可拍的实物,AI 生成好控;证据递进=疤→切片→报告→录音→袖扣,五段一段一件主证",
        "evidence": "每一集她都要拿出一样看得见的证据:一道疤、一张切片、一段录音。"
      },
      {
        "what": "林晚自己签过假报告这根刺",
        "why": "让女主不是完美受害者,越接近真相越接近自己的罪,中点和结局都压在这里",
        "evidence": "被周启年逼着改成“意外”,签了字,这是她心里的一根刺。"
      },
      {
        "what": "苏曼丽的房卡与一次反水",
        "why": "敌营里的不稳定盟友,给中段制造一次真失守",
        "evidence": "答谢宴上偷偷把求救的房卡塞给她;为了家里的生意,后面还会反水一次。"
      }
    ],
    "cut": [
      {
        "what": "苏沈港口生意的商战线",
        "why": "两分钟一集装不下商战,港口只作为洗钱证据的来源,不单独开线"
      },
      {
        "what": "林晚与沈砚的感情线",
        "why": "大女主复仇剧,沈砚定位内应与证人,不发展恋爱,避免稀释沈峥这根主线"
      },
      {
        "what": "沈家二房争股份的支线",
        "why": "遗嘱只作为宋婉仪找替身的动机交代一次,二房不出场"
      },
      {
        "what": "程野的赌债债主线",
        "why": "只作为他被宋家拿捏的背景,债主不出场,拿捏他的筹码统一换成妹妹"
      }
    ],
    "merge": [
      {
        "what": "宋家的司机、打手、买通的鉴定人统一并入一个保镖",
        "why": "宋知远的脏手只需要一张脸"
      },
      {
        "what": "办案警察并成一位刑侦队长",
        "why": "后半程的布控、审讯、移送都由同一人承担,观众好认"
      },
      {
        "what": "法医中心的同事并成一位实习法医",
        "why": "送检链见证人、林晚停职后的内线,同一功能"
      }
    ],
    "risks": [
      {
        "what": "程野与沈峥同脸,AI 生成容易混",
        "plan": "共用一张脸资产,用左手虎口有无疤和白手套区分;沈峥只在闪回出现,闪回统一冷蓝调"
      },
      {
        "what": "解剖与尸体画面过不了平台审核",
        "plan": "尸体全程白布不露脸,用切片、报告、尸检照片局部、虎口特写替代"
      },
      {
        "what": "证据引擎重复,观众疲劳",
        "plan": "五段每段换一类主证(疤/切片/报告/录音/袖扣),沈家毁证手段也逐段升级:抹黑→毁样本→停职→灭口→杀人"
      },
      {
        "what": "游艇夜海戏生成难",
        "plan": "三年前闪回与终局对峙共用同一游艇资产,只换时段;落水只拍入水前一刻"
      }
    ],
    "cutNote": "这意味着:全剧只有一条主线——三年前是谁杀了沈峥,副线是林晚自己的假报告;终点不是夺回沈氏,而是她当庭重写死因并签上自己的名字。",
    "mergeNote": "主角组定林晚、程野、沈砚、宋知远四人——林晚从签假报告到亲手推翻,程野从替人活到替自己认罪,沈砚从不信到作证,宋知远是全剧最后的对手。周启年、宋婉仪、苏曼丽是被爽点打脸的配角,不进主角组。"
  },
  "characters": [
    {
      "id": "C01",
      "name": "林晚",
      "role": "女主 · 法医",
      "tier": "lead",
      "arc": "从被退婚、被抹黑、被停职,到当庭推翻自己三年前签的报告,重写死者沈峥他杀并签名——赢回的不是名声,是那份签字",
      "from": ["选题卡 林晚"]
    },
    {
      "id": "C02",
      "name": "程野",
      "role": "顶着沈峥的脸的替身新郎",
      "tier": "lead",
      "arc": "从替死人活、怕自己哪天也意外,到交出生活手册作证,最后带着妹妹去自首",
      "from": ["选题卡 程野"]
    },
    {
      "id": "C03",
      "name": "沈砚",
      "role": "沈家二少 · 林晚在沈家的内应",
      "tier": "lead",
      "arc": "从不信法医、嘲讽林晚,到用自己的血做亲缘比对,再到想起游艇那晚并出庭作证",
      "from": ["选题卡 沈砚"]
    },
    {
      "id": "C04",
      "name": "宋知远",
      "role": "主反派 · 沈家舅舅",
      "tier": "lead",
      "arc": "前半程是和气的调停人,第33集袖扣露底,最后在同一艘游艇上被当场拿下,认罪伏法",
      "from": ["选题卡 宋知远"]
    },
    {
      "id": "C05",
      "name": "苏曼丽",
      "role": "新娘 · 敌营里不稳定的盟友",
      "tier": "support",
      "arc": "带头踩林晚→塞房卡求救→为生意反水→被宋知远当替罪羊后交出港口货单",
      "from": ["选题卡 苏曼丽"]
    },
    {
      "id": "C06",
      "name": "周启年",
      "role": "法医中心主任 · 三年前逼签的人",
      "tier": "support",
      "arc": "从压林晚的老领导,到被她当众反将、被宋知远灭口未遂,最后交出录音认罪",
      "from": ["选题卡 周启年"]
    },
    {
      "id": "C07",
      "name": "宋婉仪",
      "role": "沈家主母",
      "tier": "support",
      "arc": "为保股份找人顶替儿子、一路护着替身;得知儿子死于亲弟之手后崩塌,交出账本与沈氏",
      "from": ["选题卡 宋婉仪"]
    },
    {
      "id": "C08",
      "name": "沈峥",
      "role": "死者 · 只活在闪回与证据里",
      "tier": "support",
      "arc": "订婚时送表的人、发现洗钱的人、游艇上被灭口的人;每一段闪回补一块他的死因",
      "from": ["选题卡 沈峥(与程野共用同一张脸资产,以虎口疤区分)"]
    },
    {
      "id": "C09",
      "name": "程溪",
      "role": "程野的妹妹 · 宋知远的筹码",
      "tier": "support",
      "arc": "被宋家安置在外当人质,苏曼丽反水后被带走,终局获救,陪哥哥去自首",
      "from": ["选题卡结局「程野带着妹妹去自首」", "原创:补出名字与人质功能,替换赌债线"]
    },
    {
      "id": "C10",
      "name": "刑侦队长",
      "role": "后半程布控、审讯、移送",
      "tier": "functional",
      "from": ["合并:办案警察若干"]
    },
    {
      "id": "C11",
      "name": "实习法医",
      "role": "林晚的助手 · 送检链见证人",
      "tier": "functional",
      "from": ["合并:法医中心同事若干"]
    },
    {
      "id": "C12",
      "name": "宋家保镖",
      "role": "宋知远的脏手:毁证、刹车、带走程溪",
      "tier": "functional",
      "from": ["合并:司机、打手、买通的鉴定人"]
    },
    {
      "id": "C13",
      "name": "婚礼司仪",
      "role": "婚礼与答谢宴的控场人",
      "tier": "functional",
      "from": ["原创"]
    },
    {
      "id": "C14",
      "name": "审判长",
      "role": "终局庭审",
      "tier": "functional",
      "from": ["原创"]
    }
  ],
  "scenes": [
    { "id": "S01", "name": "沈家婚礼宴会厅(婚礼 / 答谢宴 / 发布会)", "primary": true },
    { "id": "S02", "name": "市法医中心解剖室", "primary": true },
    { "id": "S03", "name": "周启年主任办公室", "primary": true },
    { "id": "S04", "name": "沈家老宅客厅", "primary": true },
    { "id": "S05", "name": "酒店新婚套房", "primary": true },
    { "id": "S06", "name": "沈家游艇(三年前夜 / 终局夜)", "primary": true },
    { "id": "S07", "name": "林晚公寓", "primary": true },
    { "id": "S08", "name": "宋氏港口码头办公室", "primary": true },
    { "id": "S09", "name": "法庭", "primary": true },
    {
      "id": "S10",
      "name": "公安局审讯室",
      "primary": false,
      "reusePlan": "复用 S03 主任办公室的冷白灯光与金属桌资产,去掉书柜换单面镜墙"
    },
    {
      "id": "S11",
      "name": "沈峥墓前",
      "primary": false,
      "reusePlan": "只在第60集出现一次;从 S04 沈家老宅外景庭院延展成后山家族墓园,清晨阴天薄雾"
    }
  ],
  "props": [
    {
      "id": "P01",
      "name": "沈峥的男式旧机械表",
      "function": "订婚时沈峥送的表,表带磨白,林晚一直戴在左腕。替身认不出自己送的表是第一处破绽;结局放在沈峥墓前,全剧收束",
      "beatIds": ["B03", "B25"]
    },
    {
      "id": "P02",
      "name": "程野的白手套",
      "function": "遮住光洁的左手虎口。手套一摘,没有疤,替身即被识破",
      "beatIds": ["B01", "B02"]
    },
    {
      "id": "P03",
      "name": "三年前的无名男尸尸检报告",
      "function": "结论意外、签着林晚的名字。前半程是沈家和周启年压她的把柄,中点被她自己当众举起,结局当庭推翻重签",
      "beatIds": ["B13", "B24"]
    },
    {
      "id": "P04",
      "name": "病理切片蜡块",
      "function": "火化前林晚违规私留的组织样本,是那具尸体唯一残存的身体证据。被毁、被调包,最终做出与沈砚的同胞比对",
      "beatIds": ["B06", "B08", "B09"]
    },
    {
      "id": "P05",
      "name": "苏曼丽的房卡",
      "function": "答谢宴上偷塞的求救信号,打开敌营的第一道门",
      "beatIds": ["B04"]
    },
    {
      "id": "P06",
      "name": "沈峥生活手册",
      "function": "宋家给程野学沈峥的手册,首页日期在游艇事发次日、尸体被发现之前——证明有人提前知道沈峥已死",
      "beatIds": ["B12", "B19"]
    },
    {
      "id": "P07",
      "name": "周启年的旧录音笔",
      "function": "三年前周启年留的后手,录着宋知远交代三天内火化。被指合成,再被背景船笛定位到港口",
      "beatIds": ["B17", "B18"]
    },
    {
      "id": "P08",
      "name": "船锚银袖扣",
      "function": "宋知远的标志。尸检照片里死者指缝中的银色碎片是一只锚爪,他左袖那只是后配的——直接把凶手钉在游艇上",
      "beatIds": ["B14", "B21", "B22"]
    }
  ],
  "beats": [
    { "id": "B01", "type": "悬念钩", "weight": "minor", "episode": 1, "setup": "林晚被请来婚礼当众难堪,新郎摘手套递戒指", "payoff": "左手虎口光洁无疤,她想起三年前解剖台上那具无名男尸虎口的旧疤" },
    { "id": "B02", "type": "当众揭破", "weight": "major", "episode": 2, "setup": "全场等着看前任出丑", "payoff": "林晚当众扣住新郎左手,宣布他不是沈峥,全场哗然,新郎冷汗湿透手套" },
    { "id": "B03", "type": "打脸", "weight": "minor", "episode": 5, "setup": "苏曼丽在答谢宴上带头羞辱,网上全是前任大闹婚礼", "payoff": "林晚亮出腕上旧表问新郎这是谁送的,他答不上来,苏曼丽的笑僵在脸上" },
    { "id": "B04", "type": "反转", "weight": "minor", "episode": 8, "setup": "苏曼丽踩她最狠", "payoff": "房卡背后是求救:新郎从不碰她,半夜在阳台背沈峥的生平" },
    { "id": "B05", "type": "揭破", "weight": "major", "episode": 10, "setup": "林晚在套房堵住程野,摆出他整容前的模仿演员旧照", "payoff": "程野承认自己是替身,但不知道沈峥怎么死的,妹妹在宋家手里" },
    { "id": "B06", "type": "反转", "weight": "minor", "episode": 13, "setup": "人三天就火化了,沈家笃定死无对证", "payoff": "林晚打开公寓冰柜:三年前她私留的一盒切片蜡块" },
    { "id": "B07", "type": "打脸", "weight": "minor", "episode": 16, "setup": "宋婉仪派律师闯法医中心,要求销毁无主旧样本", "payoff": "林晚按规程逐条驳回,律师团当场哑口" },
    { "id": "B08", "type": "反转", "weight": "minor", "episode": 18, "setup": "样本柜被毁,沈家以为证据已灭", "payoff": "毁掉的是空盒,真样本早分了一份在沈砚手里" },
    { "id": "B09", "type": "揭破", "weight": "major", "episode": 20, "setup": "沈砚赌气抽血做比对", "payoff": "同胞关系成立:无名男尸就是沈峥,林晚把报告拍在宋婉仪面前,沈砚倒向林晚" },
    { "id": "B10", "type": "打脸", "weight": "minor", "episode": 23, "setup": "周启年主持内部听证,要定她伪造比对", "payoff": "实习法医调出送检全程录像,听证反过来质询周启年为何三天火化" },
    { "id": "B11", "type": "揭破", "weight": "minor", "episode": 26, "setup": "周启年腕上的金表", "payoff": "林晚翻出结案前后的合影:金表正是结案那周才戴上的" },
    { "id": "B12", "type": "反转", "weight": "minor", "episode": 28, "setup": "程野被逼着继续演", "payoff": "程野偷出沈峥生活手册交给林晚,首页日期早于尸体被发现" },
    { "id": "B13", "type": "自曝反杀", "weight": "major", "episode": 30, "setup": "周启年抛出那份签着她名字的报告,要她当替罪羊", "payoff": "林晚在发布会上自己举起报告,认下签字,指认逼她签字的人就在台下,周启年当众失色" },
    { "id": "B14", "type": "悬念钩", "weight": "minor", "episode": 33, "setup": "宋知远出面和气调停", "payoff": "林晚盯住他的船锚袖扣:和尸检照片里死者指缝中的银色碎片一个形状" },
    { "id": "B15", "type": "打脸", "weight": "minor", "episode": 36, "setup": "苏曼丽反水,程溪被带走,宋婉仪召开董事会逼沈砚签股权", "payoff": "沈砚当众拒签,第一次公开站到林晚一边" },
    { "id": "B16", "type": "悬念钩", "weight": "minor", "episode": 38, "setup": "停职的周启年刹车失灵", "payoff": "林晚验伤认定人为,周启年醒来只说他留了东西" },
    { "id": "B17", "type": "揭破", "weight": "major", "episode": 40, "setup": "周启年交出旧录音笔", "payoff": "录音里交代三天内火化的声音,沈砚一听就认出是舅舅;周启年认罪" },
    { "id": "B18", "type": "打脸", "weight": "minor", "episode": 43, "setup": "宋知远买来鉴定称录音是合成,反告林晚诽谤", "payoff": "林晚用录音背景里的船笛声定位到宋氏港口办公室,鉴定当场作废" },
    { "id": "B19", "type": "崩塌", "weight": "major", "episode": 45, "setup": "宋婉仪一直以为儿子是意外落水", "payoff": "手册加录音摆在面前,她得知是亲弟弟杀了儿子,当场崩塌,转身交出沈氏账本" },
    { "id": "B20", "type": "反转", "weight": "minor", "episode": 48, "setup": "宋知远把苏家推出去当洗钱替罪羊", "payoff": "苏曼丽回头,交出两家港口的货单" },
    { "id": "B21", "type": "揭破", "weight": "minor", "episode": 50, "setup": "沈砚重回游艇", "payoff": "他想起醉倒前看见舅舅提着扳手上甲板;林晚放大尸检照片,碎片正是一只锚爪" },
    { "id": "B22", "type": "终局对决", "weight": "major", "episode": 53, "setup": "宋知远约林晚上同一艘游艇和解,想照三年前再来一次", "payoff": "刑侦队长早已布控,袖扣断口当场对上,宋知远被按在甲板上" },
    { "id": "B23", "type": "认罪", "weight": "minor", "episode": 56, "setup": "宋知远在审讯室笑着说证据不够", "payoff": "林晚摆出疤、切片、手册、录音、袖扣五件证据链,他认罪" },
    { "id": "B24", "type": "翻案", "weight": "major", "episode": 58, "setup": "庭审,三年前的报告摆上证据台", "payoff": "林晚当庭推翻自己签的报告,重新写下死者沈峥他杀,签上自己的名字" },
    { "id": "B25", "type": "情感收束", "weight": "minor", "episode": 60, "setup": "宋婉仪交出沈氏,程野带着妹妹去自首", "payoff": "林晚把那块表放在沈峥墓前" }
  ],
  "episodes": []
}

返回

File created successfully at: /scratch/003/ws/003-skeleton/eternityspring__shuohao-skills/run-1/验尸官的婚礼-outline.json (file state is current in your context — no need to Read it back)
Bash Validate skeleton at beats stage

输入

cd /scratch/003/ws/003-skeleton/eternityspring__shuohao-skills/run-1 && node .claude/skills/novel-outline/scripts/novel-outline.mjs validate 验尸官的婚礼-outline.json --stage beats; echo "exit $?"

返回

✓ 通过校验(stage=beats)
exit 0

思考

Agent:
骨架 JSON 已通过 beats 档校验,现在写给人读的全剧骨架文档(控制在 3000 字内)。
Write ./验尸官的婚礼-全剧骨架.md

输入

/scratch/003/ws/003-skeleton/eternityspring__shuohao-skills/run-1/验尸官的婚礼-全剧骨架.md

# 《验尸官的婚礼》全剧骨架

60 集竖屏 · 每集 1–2 分钟 · AI 生成 · 女频大女主 / 复仇悬疑 / 豪门

## 一、核心

被退婚的女法医在前未婚夫的婚礼上认出新郎是替身,用一件件看得见的证据把三年前那具无名男尸还原成沈峥,最后亲手推翻自己签过的假报告。

- **主线**:三年前是谁杀了沈峥。
- **副线**:林晚自己签的那份“意外”报告。越接近凶手,越接近她自己的罪。
- **终点**:不是夺回沈氏,是她当庭重写“死者沈峥,他杀”,签上自己的名字。

## 二、推进规则(管住分集和剧本)

1. **每集一件看得见的证据**。全剧分五段,每段换一类主证:疤 → 切片 → 报告 → 录音 → 袖扣。
2. **沈家毁证逐段升级**:抹黑 → 毁样本 → 停职 → 灭口 → 杀人。
3. **爽点只落在沈家人和周启年脸上**。林晚不抬声调,靠证据赢。
4. 每集结尾必须留一个钩子,相邻两次爽点之间最多隔 3 集。

## 三、五段结构

| 段 | 集数 | 主证 | 这一段解决什么 | 段末落点 |
|---|---|---|---|---|
| 一 · 婚礼 | 1–10 | 疤、旧表 | 认出替身,打开敌营 | 程野承认是替身 |
| 二 · 切片 | 11–22 | 切片蜡块 | 证明无名男尸就是沈峥 | 同胞比对成立 |
| 三 · 签字 | 23–35 | 尸检报告、手册 | 林晚直面自己的签字 | 发布会上自曝反杀,袖扣露底 |
| 四 · 录音 | 36–48 | 录音笔、账本 | 打穿周启年,让宋婉仪崩塌 | 宋婉仪倒戈、苏曼丽回头 |
| 五 · 游艇 | 49–60 | 船锚袖扣 | 拿下宋知远,翻案 | 当庭重签,墓前放表 |

## 四、爽点表(25 个,8 个大爆点)

★ = 大爆点

| 集 | 类型 | 落点 |
|---|---|---|
| 1 | 悬念钩 | 新郎摘手套,虎口光洁无疤 |
| 2★ | 当众揭破 | 她当众扣住新郎左手:他不是沈峥 |
| 5 | 打脸 | 亮出旧表问是谁送的,新郎答不上 |
| 8 | 反转 | 苏曼丽的房卡原来是求救 |
| 10★ | 揭破 | 摆出整容前旧照,程野承认是替身 |
| 13 | 反转 | 冰柜里是三年前私留的切片 |
| 16 | 打脸 | 宋家律师要销毁样本,被她按规程驳回 |
| 18 | 反转 | 被毁的是空盒,真样本在沈砚手里 |
| 20★ | 揭破 | 同胞比对成立:无名男尸就是沈峥 |
| 23 | 打脸 | 听证会反过来质询周启年为何三天火化 |
| 26 | 揭破 | 周启年的金表是结案那周才戴上的 |
| 28 | 反转 | 程野交出生活手册,首页日期早于尸体被发现 |
| 30★ | 自曝反杀 | 发布会上自己举起报告,认下签字,指认逼签人 |
| 33 | 悬念钩 | 宋知远的袖扣和死者指缝里的碎片同形 |
| 36 | 打脸 | 沈砚在董事会当众拒签 |
| 38 | 悬念钩 | 周启年刹车被动手脚,醒来说留了东西 |
| 40★ | 揭破 | 录音里是舅舅的声音,周启年认罪 |
| 43 | 打脸 | 录音被指合成,船笛声定位到宋氏港口 |
| 45★ | 崩塌 | 宋婉仪得知是亲弟弟杀了儿子,交出账本 |
| 48 | 反转 | 苏曼丽交出港口货单 |
| 50 | 揭破 | 沈砚想起扳手;碎片正是一只锚爪 |
| 53★ | 终局对决 | 同一艘游艇上设局,袖扣断口对上,当场拿下 |
| 56 | 认罪 | 五件证据链摆齐,宋知远认罪 |
| 58★ | 翻案 | 当庭推翻自己的报告,重签“他杀” |
| 60 | 收束 | 宋婉仪交出沈氏,程野带妹妹自首,表放在墓前 |

## 五、人物(14 位)

**主角组(4)**
- **林晚**:从被退婚、被停职,到当庭推翻自己签的报告。赢回的是那份签字。
- **程野**:从替死人活着,到交出手册作证,再到带妹妹自首。
- **沈砚**:从不信法医,到用自己的血做比对,再到想起游艇那晚、出庭作证。
- **宋知远**:前半程是和气的调停人,第 33 集袖扣露底,第 53 集在同一艘游艇上被拿下。

**重要配角(5)**
- **苏曼丽**:踩人 → 塞房卡 → 第 36 集前反水 → 第 48 集回头。
- **周启年**:被反将、被灭口未遂,交出录音认罪。
- **宋婉仪**:一路护着替身,第 45 集崩塌。
- **沈峥**:只出现在闪回里,和程野共用一张脸,靠虎口的疤区分。
- **程溪**(新增):程野的妹妹,宋知远手里的筹码,替代原来的赌债线。

**功能性角色(5)**:刑侦队长、实习法医、宋家保镖、婚礼司仪、审判长。

## 六、取舍

- **砍掉的线**:港口商战(港口只作为证据来源)、林晚和沈砚的感情线(大女主,不谈恋爱)、二房争股(只当宋婉仪找替身的动机)、程野的赌债债主(换成妹妹当筹码)。
- **合并的人**:宋家的司机、打手和买通的鉴定人并成一个保镖;警察并成一位刑侦队长;法医中心同事并成一位实习法医。

## 七、场景与道具

**主场景(9 个,上限 10)**:婚礼宴会厅(婚礼、答谢宴、发布会共用)、解剖室、周启年办公室、沈家老宅客厅、新婚套房、游艇(三年前和终局共用)、林晚公寓、宋氏港口办公室、法庭。
**一次性场景**:审讯室(复用办公室改造)、墓前(从老宅外景延展)。

**叙事道具(8 件)**:旧机械表、白手套、三年前的尸检报告、切片蜡块、房卡、沈峥生活手册、旧录音笔、船锚袖扣。

## 八、生成风险与对策

- **同脸双人**:程野和沈峥共用一张脸资产,靠虎口疤和白手套区分,闪回统一用冷蓝调。
- **审核**:尸体全程盖白布、不露脸,用切片、报告、照片局部代替。
- **夜海戏**:游艇资产共用,落水只拍入水前一刻。
- **证据重复**:五段各换一类主证,沈家的手段逐段升级。

## 待拍板

1. **砍线**:砍掉商战、感情线、二房、债主,只留一条主线加一条副线。
2. **合人与新增**:合出 3 个功能角色;新增“程溪”这个名字和她的人质功能。
3. **大爆点落集**:2 / 10 / 20 / 30 / 40 / 45 / 53 / 58。中点(第 30 集)定为林晚自曝签字。

返回

File created successfully at: /scratch/003/ws/003-skeleton/eternityspring__shuohao-skills/run-1/验尸官的婚礼-全剧骨架.md (file state is current in your context — no need to Read it back)
Bash Count characters in skeleton markdown

输入

node -e 'const s=require("fs").readFileSync("验尸官的婚礼-全剧骨架.md","utf8");console.log("total",[...s].length,"cjk",(s.match(/[一-鿿]/g)||[]).length,"nonspace",[...s.replace(/\s|[|#*\-★]/g,"")].length)'

返回

total 2670 cjk 1517 nonspace 1893

思考 9 秒

Agent:
我把全剧骨架写好了,放在当前目录,两个文件:

- **`验尸官的婚礼-全剧骨架.md`**:给人读的骨架,共 2670 字,没超过 3000 字的要求。只写了骨架,没写分集大纲和剧本台词。
- **`验尸官的婚礼-outline.json`**:同一份骨架的结构化数据,后面写分集要接着用,已经通过了爽点间隔和大爆点位置的检查。

**骨架概要**
- **结构**:60 集分五段,每段换一类主要证据:婚礼(疤)→ 切片 → 签字(报告)→ 录音 → 游艇(袖扣)。沈家毁证的手段也一段比一段狠:抹黑 → 毁样本 → 停职 → 灭口 → 杀人。
- **爽点**:共 25 个,相邻两个最多隔 3 集,都落在沈家人和周启年脸上。
- **人物**:14 个。主角组 4 人(林晚、程野、沈砚、宋知远),重要配角 5 人,功能性角色 5 人。
- **场景和道具**:主场景 9 个、一次性场景 2 个,叙事道具 8 件。

**有几处是我补的,选题卡里没写,请确认:**
- 真沈峥左手虎口有疤,三年前那具无名男尸虎口也有同样的疤。
- 林晚腕上那块旧表是沈峥订婚时送的。
- 新增三件证据:宋家给程野的“沈峥生活手册”、周启年留的录音笔、死者指缝里的船锚袖扣碎片。
- 程野的妹妹取名“程溪”,作为宋知远拿捏程野的筹码,替掉赌债线。

**需要你拍板三件事,确认之后才能写分集:**
1. **砍掉的线**:港口商战、林晚和沈砚的感情线、二房争股、程野的赌债债主。全剧只留“谁杀了沈峥”这条主线,加上林晚那份假报告这条副线。
2. **合并的人**:宋家的司机、打手和买通的鉴定人合成一个保镖;办案警察合成一位刑侦队长;法医中心同事合成一位实习法医。
3. **大爆点落在**第 2、10、20、30、40、45、53、58 集。其中第 30 集是全剧中点,林晚在发布会上当众举起报告,承认是自己签的字,指认逼她签字的人。

有要改的直接告诉我,我改完再检查一遍。

这一轮结束:耗时 4.2 分钟,按 API 价格折算 $0.88

第 2 轮

输入:
如果要我在几个方案里选,就选你最推荐的那个;其他要我定的,都按你推荐的来,不用再问我。请继续,直到 premise.md 要的全剧骨架写成文件;骨架之后的分集大纲和剧本不用写。

思考 2 秒

Edit ./验尸官的婚礼-全剧骨架.md

输入

/scratch/003/ws/003-skeleton/eternityspring__shuohao-skills/run-1/验尸官的婚礼-全剧骨架.md

—— 原文 ——
## 待拍板

1. **砍线**:砍掉商战、感情线、二房、债主,只留一条主线加一条副线。
2. **合人与新增**:合出 3 个功能角色;新增“程溪”这个名字和她的人质功能。
3. **大爆点落集**:2 / 10 / 20 / 30 / 40 / 45 / 53 / 58。中点(第 30 集)定为林晚自曝签字。

—— 改成 ——
## 九、已定事项(分集与剧本必须遵守)

1. **砍线**:砍掉商战、感情线、二房、债主,只留一条主线加一条副线。
2. **合人与新增**:合出 3 个功能角色;新增“程溪”这个名字和她的人质功能。
3. **大爆点落集**:2 / 10 / 20 / 30 / 40 / 45 / 53 / 58。中点(第 30 集)定为林晚自曝签字。
4. **补充设定**:真沈峥左手虎口有疤;旧表是沈峥订婚时送的;新增生活手册、录音笔、袖扣碎片三件证据。

返回

The file /scratch/003/ws/003-skeleton/eternityspring__shuohao-skills/run-1/验尸官的婚礼-全剧骨架.md has been updated successfully. (file state is current in your context — no need to Read it back)
Bash Revalidate skeleton and recount characters

输入

node .claude/skills/novel-outline/scripts/novel-outline.mjs validate 验尸官的婚礼-outline.json --stage beats; node -e 'const s=require("fs").readFileSync("验尸官的婚礼-全剧骨架.md","utf8");console.log("chars",[...s].length)'; ls

返回

✓ 通过校验(stage=beats)
chars 2738
premise.md
验尸官的婚礼-outline.json
验尸官的婚礼-全剧骨架.md

思考 4 秒

Agent:
premise.md 要的全剧骨架已经写完,就在当前目录。上次要你拍板的事都按我推荐的方案定了,内容没有再改。

- **`验尸官的婚礼-全剧骨架.md`**:交付稿,共 2738 字,在 3000 字以内。原来文末的“待拍板”改成了“已定事项”,写明后面写分集和剧本必须遵守的几条:
  - 砍掉的四条线:港口商战、感情线、二房争股、赌债债主;
  - 合并出的三个功能角色,以及新增的程溪;
  - 8 个大爆点在第 2、10、20、30、40、45、53、58 集;
  - 我补的设定:沈峥左手虎口有疤,旧表是他订婚时送的,新增生活手册、录音笔、袖扣碎片三件证据。
- **`验尸官的婚礼-outline.json`**:同一份骨架的数据版,以后写分集时直接接着用。重新检查了一遍,25 个爽点中相邻两个最多隔 3 集,大爆点也没有落在最后一集。

按你的要求,分集大纲和剧本都没有写。

这一轮结束:耗时 0.3 分钟,按 API 价格折算 $0.95

第 3 轮

输入:
如果要我在几个方案里选,就选你最推荐的那个;其他要我定的,都按你推荐的来,不用再问我。请继续,直到 premise.md 要的全剧骨架写成文件;骨架之后的分集大纲和剧本不用写。

思考

Agent:
你这次的指示和上一条一样,全剧骨架已经按这个要求写完了,这一轮没有改任何东西。

- **`验尸官的婚礼-全剧骨架.md`**:交付稿,共 2738 字,在 premise.md 要求的 3000 字以内。所有要你定的事都按我推荐的方案定了,写在文末“已定事项”里。
- **`验尸官的婚礼-outline.json`**:同一份骨架的数据版,以后写分集时直接接着用。

分集大纲和剧本按你的要求都没写。如果后面要开始写分集,告诉我一声就行。

这一轮结束:耗时 0.1 分钟,按 API 价格折算 $0.97

第 4 轮

输入:
如果要我在几个方案里选,就选你最推荐的那个;其他要我定的,都按你推荐的来,不用再问我。请继续,直到 premise.md 要的全剧骨架写成文件;骨架之后的分集大纲和剧本不用写。

思考 1 秒

Bash Confirm deliverable files exist and still validate

输入

ls -la && node .claude/skills/novel-outline/scripts/novel-outline.mjs validate 验尸官的婚礼-outline.json --stage beats

返回

total 72
drwxr-xr-x  6 user  wheel    192 Oct 30 17:17 .
drwxr-xr-x  3 user  wheel     96 Oct 30 17:13 ..
drwxr-xr-x  4 user  wheel    128 Oct 30 17:13 .claude
-rw-r--r--  1 user  wheel   4233 Oct 30 17:13 premise.md
-rw-r--r--  1 user  wheel  16942 Oct 30 17:16 验尸官的婚礼-outline.json
-rw-r--r--  1 user  wheel   6382 Oct 30 17:17 验尸官的婚礼-全剧骨架.md
✓ 通过校验(stage=beats)
Agent:
全剧骨架已经写完,这一轮没有要补的。刚才又核对了一遍,两个文件都在当前目录:

- **`验尸官的婚礼-全剧骨架.md`**:交付稿,2738 字,在 3000 字以内。所有要你定的事都按我推荐的方案定了,写在文末“已定事项”里。
- **`验尸官的婚礼-outline.json`**:同一份骨架的数据版,刚才重新检查仍然通过。

分集大纲和剧本按你的要求都没写。后面要开始写分集的话,直接说一声就行。

这一轮结束:耗时 0.2 分钟,按 API 价格折算 $1.01