eternityspring/shuohao-skills · 第 3 次运行

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

skill
eternityspring/shuohao-skills@5612d2a0
装进工作目录的 skill
character-refs、novel-art、novel-characters、novel-outline、novel-script、novel-staging、novel-storyboard
时间
2026-10-31 08:30–08:37(北京时间),7 分钟
轮数
3 轮,工具调用 13 次,按 API 价格折算 $3.25
匿名编号
412(评审只看到这个编号)
盲比
和另外 20 个参赛者的第 3 次运行各比一场:对照组(不装 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 11,318 字
{
  "source": "验尸官的婚礼",
  "lang": "zh",
  "params": {
    "episodes": 60,
    "minutesPerEpisode": 1.5,
    "genre": "女频大女主复仇悬疑(豪门)",
    "adaptMode": "忠实",
    "preferences": [
      "每集必须拿出一样看得见的证据",
      "结局按选题卡:宋知远伏法、宋婉仪交出沈氏、程野带妹妹自首、林晚当庭改签他杀、墓前放表",
      "已拍板:不写林晚与沈砚的感情线;合人方案与大爆点集数按骨架执行"
    ]
  },
  "adaptation": {
    "core": "被退婚的女法医每集拿出一样看得见的证据,一层层剥开替身新郎背后的命案,最后亲手推翻自己三年前签下的假报告。",
    "keep": [
      {
        "what": "婚礼上认出替身的开场",
        "why": "全剧卖点就是第一集这一眼,开场必须原样落地",
        "evidence": "一眼认出新郎是替身:真新郎三年前就躺在她的解剖台上。"
      },
      {
        "what": "一集一证据的推进引擎",
        "why": "AI 短剧每集 90 秒,必须有一个能拍特写的实物撑住这一集,证据就是爽点载体",
        "evidence": "每一集她都要拿出一样看得见的证据:一道疤、一张切片、一段录音。"
      },
      {
        "what": "双向逼近:离真相近一步,也离自己的罪近一步",
        "why": "这是女主区别于普通打脸爽剧的地方,赢得越多代价越重,第四幕自曝才立得住",
        "evidence": "也离她自己签过的那份假报告更近一步。"
      },
      {
        "what": "替身识别点:白手套与光洁的虎口",
        "why": "虎口疤是全剧第一件证据,也是程野与沈峥同脸时唯一的视觉区分",
        "evidence": "婚礼上一直戴着白手套,左手虎口光洁,没有疤。"
      },
      {
        "what": "苏曼丽塞房卡、后又反水",
        "why": "给中段一个立场摇摆的变量,防止对抗变成一条直线",
        "evidence": "答谢宴上偷偷把求救的房卡塞给她;为了家里的生意,后面还会反水一次。"
      },
      {
        "what": "结局的签名与表",
        "why": "改签他杀是女主弧的终点,墓前放表是情感收口,两件都不动",
        "evidence": "重新写下“死者沈峥,他杀”,签上自己的名字。最后一场,她把那块表放在沈峥的墓前。"
      }
    ],
    "cut": [
      {
        "what": "林晚与沈砚的感情线",
        "why": "她戴着沈峥的表走完全剧,结局落在墓前;沈砚只做战友和内应,任何新恋情都会冲淡最后一场"
      },
      {
        "what": "港口洗钱的商业操作细节",
        "why": "90 秒一集讲不清资金链,只保留一本账本加一个 U 盘作为实物,其余场外交代"
      },
      {
        "what": "苏家与沈家二房的家族线",
        "why": "苏家只当苏曼丽反水的筹码,二房只当股权动机里的一句话,都不开人物、不开场景"
      },
      {
        "what": "林晚的原生家庭与私生活",
        "why": "她的全部戏都放在证据上,家庭背景不给篇幅"
      }
    ],
    "merge": [
      {
        "what": "接案、收网、押送的各路警察合成一位刑侦队长",
        "why": "警方功能相同,一张脸维护就够"
      },
      {
        "what": "抢档案、调包检材、码头动手的打手合成宋知远的一名保镖",
        "why": "沈家每次毁证据都要有人动手,同一张脸反复出现,观众到第五幕会自己把账算到宋知远头上"
      },
      {
        "what": "婚礼上嘲讽林晚的宾客并入苏曼丽",
        "why": "羞辱集中在一个有名有姓的人身上,后面她塞房卡的反转才有分量"
      }
    ],
    "risks": [
      {
        "what": "逻辑漏洞:未婚妻亲手解剖未婚夫却没认出来",
        "plan": "第 1 幕交代无名男尸面部被螺旋桨毁损且泡水多日,当时沈峥本人正在国外养病、随后就回国露面,没有人会把两件事连起来;她认出替身靠的是虎口疤,不是脸"
      },
      {
        "what": "程野与沈峥同一张脸,AI 生成容易混",
        "plan": "共用一套脸部资产,区分全靠三件事:沈峥左手虎口有疤、只出现在暖色闪回里;程野戴白手套和金丝眼镜,第 20 集认身份起摘眼镜"
      },
      {
        "what": "解剖与尸体画面的平台审核尺度",
        "plan": "尸体一律白布覆盖不露脸,证据用档案照片、显微镜下的切片、报告单代替,解剖室只拍器械和林晚的手"
      },
      {
        "what": "女主签过假报告,观众可能不站她",
        "plan": "第 1 幕就闪回逼签现场,交代她当时被周启年用执业资格和三天火化逼到墙角;第四幕她主动自曝、交证,代价自己扛"
      },
      {
        "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": "前四幕是全家最可靠的舅舅,每次沈家毁证据都由他出主意、他的保镖动手;第五幕一枚袖扣让他现形,码头认罪",
      "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": true },
    { "id": "S11", "name": "整容诊所", "primary": false, "reusePlan": "复用解剖室白墙与无影灯资产,换成手术椅和整容前后对比照墙改出" },
    { "id": "S12", "name": "墓园", "primary": false, "reusePlan": "复用沈家老宅后院石阶与柏树外景,换墓碑前景、清晨阴天薄雾改出" }
  ],
  "props": [
    {
      "id": "P01",
      "name": "无名男尸存档照片(虎口疤)",
      "function": "全剧第一件证据:三年前无名男尸左手虎口的疤,与沈峥旧照一致、与程野光洁的虎口对不上,证明替身存在",
      "beatIds": ["B01", "B05", "B07"]
    },
    {
      "id": "P02",
      "name": "求救房卡",
      "function": "苏曼丽的双面性:卡背写着救我,把林晚带进新房套房,拿到第一份检材",
      "beatIds": ["B03", "B04"]
    },
    {
      "id": "P03",
      "name": "亲子鉴定报告单",
      "function": "替身的科学证明;被宋婉仪扔进壁炉,揭出主母早就知情",
      "beatIds": ["B04", "B08"]
    },
    {
      "id": "P04",
      "name": "病理组织切片",
      "function": "他杀的铁证:颅骨受击后仍有生活反应、肺里有海水硅藻,证明沈峥是被砸伤后活着推下海;尸体火化后唯一留下的东西",
      "beatIds": ["B12", "B13", "B15"]
    },
    {
      "id": "P05",
      "name": "林晚的旧手机(逼签录音)",
      "function": "三年前周启年逼签的录音,放出来能拉下周启年,也坐实林晚自己签过假报告",
      "beatIds": ["B17"]
    },
    {
      "id": "P06",
      "name": "三年前的尸检报告(意外)",
      "function": "林晚心里的那根刺:签名一直在纸上,第三幕被翻出、第四幕自曝、终局当庭推翻改签他杀",
      "beatIds": ["B12", "B17", "B23"]
    },
    {
      "id": "P07",
      "name": "船锚银袖扣",
      "function": "凶手的指认物:死者右手攥着的一枚被从证物里抽走,宋知远左袖那枚是新配的,亮度对不上",
      "beatIds": ["B20", "B22"]
    },
    {
      "id": "P08",
      "name": "男式旧机械表",
      "function": "沈峥出国前留给林晚的表,表带磨白;她认的是死人不是活人,替身从没问起过它,最后放在墓前收束全剧",
      "beatIds": ["B02", "B24"]
    }
  ],
  "beats": [
    { "id": "B01", "type": "揭破", "weight": "minor", "episode": 1, "setup": "被退婚的林晚穿深灰风衣出现在前未婚夫的婚礼", "payoff": "交换戒指时新郎的白手套滑落,左手虎口光洁;而三年前她解剖台上的无名男尸,虎口正有一道一模一样的疤" },
    { "id": "B02", "type": "打脸", "weight": "minor", "episode": 3, "setup": "苏曼丽带头嘲她天天摸死人晦气,当众泼酒", "payoff": "她抬起手腕上那块旧表,新郎看着它毫无反应;她再翻开签到簿,指出新郎签名的收笔方向和沈峥婚约上的签名相反,全场私语" },
    { "id": "B03", "type": "反转", "weight": "minor", "episode": 5, "setup": "答谢宴上苏曼丽当众撕了她的请柬", "payoff": "擦肩时苏曼丽把一张房卡塞进她风衣口袋,卡背写着救我" },
    { "id": "B04", "type": "揭破", "weight": "minor", "episode": 7, "setup": "林晚按房卡进了新房套房", "payoff": "苏曼丽说新婚夜丈夫连她海鲜过敏都不记得,交出他用过的酒杯,林晚拿到第一份检材" },
    { "id": "B05", "type": "打脸", "weight": "major", "episode": 10, "setup": "沈家家宴上宋婉仪宣布要告林晚诽谤", "payoff": "林晚把无名男尸的存档照片和沈峥旧照里的虎口疤并排摊开,宋婉仪的茶盏落地;当夜检材被调包,周启年以泄露档案停她的职" },
    { "id": "B06", "type": "反杀", "weight": "minor", "episode": 12, "setup": "娱记放出剪辑视频,说她纠缠前任、偷尸检档案", "payoff": "她放出完整监控,被剪掉的那段正是保镖抢档案,舆论翻转" },
    { "id": "B07", "type": "反转", "weight": "minor", "episode": 14, "setup": "沈砚把她堵在解剖室,说她想借尸讹钱", "payoff": "她说出疤的来历——小时候沈峥替弟弟挡碎玻璃留下的,只有兄弟俩和她知道;沈砚第一次动摇" },
    { "id": "B08", "type": "反转", "weight": "minor", "episode": 17, "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": 25, "setup": "周启年召开纪律听证,要吊销林晚的执业资格", "payoff": "她拿出证物室门禁记录,调包检材的人是保镖,刷的却是周启年的卡;听证当场休会,停职撤销" },
    { "id": "B12", "type": "揭破", "weight": "major", "episode": 28, "setup": "尸体三天内火化,所有人以为证据早已化成灰", "payoff": "复核会上她取出私留的组织切片:颅骨受击后仍有生活反应、肺里有海水硅藻,死者是被砸伤后活着推下海的;投影旁边,是她自己签的意外两个字" },
    { "id": "B13", "type": "反转", "weight": "minor", "episode": 31, "setup": "苏曼丽答应出面作证新婚夜的事", "payoff": "苏家港口合同被沈氏卡住,她在发布会上反口指认林晚骚扰沈家;切片原件在移送途中遗失" },
    { "id": "B14", "type": "揭破", "weight": "minor", "episode": 33, "setup": "沈砚一直说那晚喝醉了什么都不记得", "payoff": "林晚带他重回游艇甲板,他想起那晚有人在船尾争吵,有一声金属落地" },
    { "id": "B15", "type": "反转", "weight": "major", "episode": 36, "setup": "宋婉仪三年来一直相信儿子是失足落水", "payoff": "林晚把切片照片和颅骨凹陷的形状摊在她面前,那是扳手的形状;宋婉仪第一次在人前失声,交出游艇当晚的登船名单" },
    { "id": "B16", "type": "打脸", "weight": "minor", "episode": 39, "setup": "周启年在全市法医系统会议上拿林晚当错误典型", "payoff": "她当众问他腕上那块金表的价钱和三年前的入账日期,周启年把表往袖子里藏" },
    { "id": "B17", "type": "揭破", "weight": "major", "episode": 42, "setup": "三年前逼签那天她手机录了音,三年没敢放——放出来,自己也是共犯", "payoff": "她在中心大会上放出录音,周启年当场被带走;她同时交出执业证和那份报告,申请对自己立案" },
    { "id": "B18", "type": "揭破", "weight": "minor", "episode": 45, "setup": "周启年在看守所咬死不开口", "payoff": "他收到一张女儿上学路上的偷拍照,反而吐出钱的来路:沈氏海外港口账户" },
    { "id": "B19", "type": "反杀", "weight": "minor", "episode": 47, "setup": "程野被叫去码头仓库签一份股权转让", "payoff": "吊车钢索断落,林晚和沈砚提前赶到把他拽开——替身没用了,就该意外了" },
    { "id": "B20", "type": "揭破", "weight": "major", "episode": 50, "setup": "宋知远的袖口永远是一对船锚银袖扣", "payoff": "林晚翻出证物登记的原始底片:死者右手攥着一枚船锚袖扣,登记后被抽走;宋知远左袖那枚是新配的。沈砚想起那晚举起扳手的人,袖口闪过的就是这道光" },
    { "id": "B21", "type": "反转", "weight": "minor", "episode": 53, "setup": "宋知远挟持程念,逼程野翻供", "payoff": "苏曼丽第二次转向,把港口洗钱账本的 U 盘交给林晚,换苏家脱身" },
    { "id": "B22", "type": "收网", "weight": "major", "episode": 56, "setup": "宋知远在码头准备出境", "payoff": "程野以沈峥的身份最后签一次字把他引出来,警方收网,程念获救;宋知远认罪,那枚袖扣被摘下装进证物袋" },
    { "id": "B23", "type": "翻案", "weight": "major", "episode": 58, "setup": "庭审上她三年前签的意外报告被作为证据出示", "payoff": "林晚当庭推翻自己的结论,重新写下死者沈峥,他杀,签上自己的名字" },
    { "id": "B24", "type": "收束", "weight": "minor", "episode": 60, "setup": "宋婉仪交出沈氏,程野带着妹妹去自首", "payoff": "墓园清晨,林晚摘下那块旧表,放在沈峥的墓前" }
  ],
  "episodes": []
}
验尸官的婚礼-全剧骨架.md 全剧骨架 2,914 字
# 《验尸官的婚礼》全剧骨架

60 集 × 1–2 分钟|竖屏|AI 拍摄|女频 · 大女主 · 复仇 · 悬疑 · 豪门

## 一、核心

被退婚的女法医每集拿出一样看得见的证据,一层层剥开替身新郎背后的命案,最后亲手推翻自己三年前签下的假报告。

只有一条主线:沈峥是谁杀的。副线是林晚自己签的那份“意外”报告。不写恋爱线,终点是法庭上的签名和墓前那块表。

## 二、铁律(分集与剧本必须遵守)

1. **一集一证据**:每集林晚手里必须有一件能拍特写的实物,没有证据的集不成立。
2. **双向逼近**:她每赢一次,离真相近一步,也离自己的罪近一步。赢得越多,那份报告越藏不住。
3. **沈家必反击**:每拿到一件证据,沈家就毁证据或抹黑她,下一集从反击开场。
4. **林晚不抬声调**:打脸靠证据和一句话,不靠吵。
5. **凶手藏到第 50 集**:宋知远前四幕是全家最可靠的舅舅;每次毁证据都是同一个保镖动手,观众自己会去算这笔账。
6. **同脸区分**:程野和沈峥共用一张脸。沈峥只出现在暖色闪回里,左手虎口有疤;程野戴白手套和金丝眼镜,第 20 集起摘眼镜。

## 三、五幕走向

**第一幕 · 婚礼(1–10 集)|证据:一道疤**
婚礼上,新郎的手套滑落,虎口没有疤。林晚想起三年前那具脸被螺旋桨毁掉的无名男尸,虎口有一道一模一样的疤。她被羞辱、被泼酒;苏曼丽塞来求救房卡,林晚在新房套房拿到第一份检材。第 10 集在家宴上把存档照片和沈峥旧照摊开。
幕尾反击:检材被调包,周启年停她的职。

**第二幕 · 内应(11–22 集)|证据:DNA 与整容记录**
娱记抹黑她,她放出完整监控翻盘。沈砚起初不信,被疤的来历说动,成了内应。第二份鉴定证明“哥哥”不是沈家血脉,宋婉仪却把报告扔进壁炉,原来她早就知道。第 20 集林晚叫出程野的真名,程野摘下眼镜认了身份,但不知道沈峥怎么死的。
幕尾钩:替身是主母安排的,那杀人的是谁?

**第三幕 · 切片(23–36 集)|证据:一张切片**
宋婉仪承认顶替是为了股权,坚信儿子是意外落水。林晚用门禁记录推翻停职。第 28 集,她拿出私留的组织切片:颅骨受击后仍有生活反应,肺里有海水硅藻,沈峥是被砸伤后活着推下海的。投影旁边就是她自己签的“意外”。苏曼丽因家族生意反水,切片原件在移送途中遗失。沈砚重回游艇,想起那晚船尾有争吵,有一声金属落地。第 36 集宋婉仪看清那是扳手的形状,交出登船名单。
幕尾代价:她的签名第一次摆在了所有人面前。

**第四幕 · 录音(37–48 集)|证据:一段录音**
周启年拿她当错误典型,她当众问起他那块金表。第 42 集是全剧的自我之战:她放出三年前逼签的录音,周启年被带走,她也交出执业证,申请对自己立案。周启年在看守所里吐出钱的来路,是沈氏海外港口账户。程野被叫去码头签字,吊车钢索断了,替身没用了,就该“意外”了。
幕尾钩:谁能动用港口账户?

**第五幕 · 袖扣(49–60 集)|证据:一枚袖扣**
第 50 集,证物原始底片显示死者右手攥着一枚船锚袖扣,登记后被抽走;宋知远左袖那枚是新配的。沈砚想起举起扳手的人袖口闪过的光。宋知远挟持程念,苏曼丽再次转向,交出洗钱账本。第 56 集,程野以沈峥身份最后签一次字,把宋知远引到码头,警方收网,宋知远认罪。第 58 集庭审,林晚当庭写下“死者沈峥,他杀”,签上自己的名字。第 60 集,宋婉仪交出沈氏,程野带妹妹自首,林晚把旧表放在沈峥墓前。

## 四、爽点排布(24 个,间隔 ≤ 3 集)

| 集 | 类型 | 一句话 |
| --- | --- | --- |
| 1 | 揭破 | 手套滑落,虎口光洁 |
| 3 | 打脸 | 旧表无反应,签名收笔相反 |
| 5 | 反转 | 苏曼丽塞房卡 |
| 7 | 揭破 | 拿到新郎酒杯 |
| **10** | **打脸★** | **家宴摊开疤的照片** |
| 12 | 反杀 | 完整监控翻转舆论 |
| 14 | 反转 | 疤的来历说动沈砚 |
| 17 | 反转 | 主母烧掉鉴定 |
| **20** | **揭破★** | **程野认了身份** |
| 23 | 揭破 | 主母为股权顶替 |
| 25 | 打脸 | 门禁记录推翻停职 |
| **28** | **揭破★** | **切片证明他杀** |
| 31 | 反转 | 苏曼丽反水,切片遗失 |
| 33 | 揭破 | 沈砚想起金属落地声 |
| **36** | **反转★** | **主母看清扳手形状** |
| 39 | 打脸 | 当众问金表 |
| **42** | **揭破★** | **放录音,自曝** |
| 45 | 揭破 | 钱来自港口账户 |
| 47 | 反杀 | 救下程野 |
| **50** | **揭破★** | **袖扣指认宋知远** |
| 53 | 反转 | 苏曼丽交出账本 |
| **56** | **收网★** | **码头认罪** |
| **58** | **翻案★** | **当庭改签他杀** |
| 60 | 收束 | 墓前放表 |

★为大爆点,共 8 个,大致每 6–8 集一个。

## 五、人物

- **主角组**:林晚(从签假报告到亲手推翻);程野(从顶替求活到自首);沈砚(从不信她到当内应,再到找回那晚的记忆);宋知远(最后才现形的主反派)。
- **重要配角**:苏曼丽(踩她,求救,反水,再转向);周启年(停她职,被录音拉下马);宋婉仪(烧鉴定,看清真相,交出沈氏);沈峥(只活在闪回里);程念(程野的软肋)。
- **功能角色**:刑侦队长、保镖(每次毁证据的人都是他)、法医中心实习生、娱记、审判长。

## 六、证据与场景

**叙事道具 8 件**:疤的存档照片、求救房卡、亲子鉴定单、组织切片、旧手机录音、三年前的报告、船锚袖扣、旧机械表。
**主场景 10 个**:宴会厅、解剖室/病理库、主任办公室、沈家老宅、新房套房、游艇、码头仓库、审讯室、法庭、林晚公寓。整容诊所和墓园复用现有场景改出。

## 七、风险

- **为什么认不出未婚夫的尸体**:脸被螺旋桨毁损,又泡了多日;当时“沈峥”正在国外养病,随后回国露面,没人会把两件事连起来。
- **审核**:尸体一律盖白布,证据用照片、切片和报告单来拍。
- **女主签过假报告,观众可能不站她**:第一幕就闪回逼签现场,交代她是被执业资格和“三天火化”逼到墙角的。

## 八、已定决策(分集与剧本不得改动)

1. **砍线**:不写林晚和沈砚的感情线,沈砚只做战友和内应;洗钱细节、苏家线、二房线都放在场外交代。
2. **合人**:警察合成刑侦队长,打手合成一名保镖,嘲讽她的宾客并入苏曼丽。沈峥、程念升为有名字的角色。
3. **大爆点**:第 10、20、28、36、42、50、56、58 集。
4. **单集时长**:按 1.5 分钟写。

过程

按时间顺序。点开工具调用能看到完整的输入和返回;思考的内容 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:30 .
drwxr-xr-x  5 user  wheel   160 Oct 30 17:30 ..
drwxr-xr-x  4 user  wheel   128 Oct 30 17:30 .claude
-rw-r--r--  1 user  wheel  4233 Oct 30 17:30 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-3/.claude/skills/novel-outline && cat references/outline-pass.md references/schema.md; ls examples scripts

返回

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

拿全部卷摘要(或短篇原文)+ 用户参数,产出 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`。
examples:
渡口-outline.json

scripts:
novel-outline.mjs
selftest.mjs

思考

Bash Inspect example outline and validator stages

输入

head -c 5000 examples/渡口-outline.json; echo; grep -n "stage\|beats'" 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",
      "type": "身份揭破",
      "weight": "major",
      "episode": 3,
      "setup": "陆行远的右手始终揣在大衣口袋里",
      "payoff": "胡二爷一句玩笑逼得他当众掏出口袋——是一方旧砚,不是枪,可砚底刻着县衙的印"
    },
    {
      "id": "B03",
      "type": "反转",
      "weight": "major",
      "episode": 5,
      "setup": "老周四十年不问客人来路",
      "payoff": "老周头一次开口,点破沈知微要去的县城根本没有接应她的人"
    },
    {
      "id": "B04",
      "type": "收束",
      "weight": "minor",
      "episode": 6,
      "setup": "雾开始散",
      "payoff": "皮箱当众打开,船上每个人的谎都落了地,船也到了岸"
    }
354: * 三档 stage 就是流程门:
361:export const STAGES = ['skeleton', 'beats', 'full'];
363:export function validateOutline(outline, stage = 'full') {
471:  if (stage === 'skeleton') return problems;
497:  if (stage === 'beats') return problems;
740:      leads: 'Leads', noCut: 'No lines cut (faithful adaptation)', noMajor: 'No major beats',
1562:  validate <outline.json> [--stage s] 校验;有违规逐条打印并 exit 1
1563:                                      stage: skeleton / beats / full(默认 full)
1610:    if (!path) throw new Error('用法:validate <outline.json> [--stage skeleton|beats|full]');
1611:    const stage = flag(rest, '--stage', 'full');
1612:    if (!STAGES.includes(stage)) throw new Error(`--stage 只能是 ${STAGES.join('/')}`);
1613:    const problems = validateOutline(readJson(path), stage);
1615:      console.error(`✗ ${problems.length} 处违规(stage=${stage}):\n`);
1619:    console.log(`✓ 通过校验(stage=${stage})`);

思考 71 秒

Bash Read validator skeleton/beats checks

输入

sed -n 354,500p scripts/novel-outline.mjs

返回

 * 三档 stage 就是流程门:
 *   skeleton — 改编说明 + 人物 + 场景(快版拍板前)
 *   beats    — skeleton + 爽点表(写分集之前必须过这档)
 *   full     — 全部(默认)
 * 「步骤 4 完成前不允许写分集梗概」靠这个变成可执行的,而不是一句话。
 */

export const STAGES = ['skeleton', 'beats', 'full'];

export function validateOutline(outline, stage = 'full') {
  const problems = [];
  const p = (msg) => problems.push(msg);
  if (!outline || typeof outline !== 'object') return ['outline 不是对象'];
  const th = thresholdsOf(outline);

  // --- params ---
  const params = outline.params;
  if (!params || typeof params !== 'object') {
    p('缺少 params(总集数/单集时长/题材/改编幅度)');
  } else {
    if (!Number.isInteger(params.episodes) || params.episodes < 1) p('params.episodes 必须是正整数');
    if (!(params.minutesPerEpisode > 0)) p('params.minutesPerEpisode 必须大于 0');
    if (!thText(params.genre)) p('params.genre 缺失——题材决定爽点类型,不能缺');
    if (!ADAPT_MODES.includes(params.adaptMode)) {
      p(`params.adaptMode 必须是 ${ADAPT_MODES.join('/')},实际是 ${JSON.stringify(params.adaptMode)}`);
    }
  }

  // --- adaptation 改编说明 ---
  const ad = outline.adaptation;
  if (!ad || typeof ad !== 'object') {
    p('缺少 adaptation(改编说明)');
  } else {
    if (!thText(ad.core)) p('adaptation.core 缺失——一句话核心是整份大纲的锚');
    for (const key of ['keep', 'cut', 'merge', 'risks']) {
      if (!Array.isArray(ad[key])) p(`adaptation.${key} 必须是数组`);
    }
    if (Array.isArray(ad.keep) && ad.keep.length === 0) p('adaptation.keep 至少要有一条——什么都不保还改编什么');
    if (params?.adaptMode && params.adaptMode !== '忠实' && Array.isArray(ad.cut) && ad.cut.length === 0) {
      p(`adaptMode=${params.adaptMode} 却一条线都没砍,说不过去`);
    }
    for (const [key, fields] of [['keep', ['what', 'why']], ['cut', ['what', 'why']], ['merge', ['what', 'why']], ['risks', ['what', 'plan']]]) {
      for (const item of ad[key] ?? []) {
        for (const f of fields) if (!thText(item?.[f])) p(`adaptation.${key} 里有条目缺 ${f}`);
      }
    }
    // 决策补注(可选):给了就不能是空壳
    for (const f of ['cutNote', 'mergeNote']) {
      if (ad[f] !== undefined && !thText(ad[f])) p(`adaptation.${f} 给了但是空的——要么写结论,要么删掉这个键`);
    }
  }

  // --- characters 人物表 ---
  const chars = outline.characters;
  if (!Array.isArray(chars) || chars.length === 0) {
    p('characters 为空');
  } else {
    const tierCap = { lead: th.maxLeads, support: th.maxSupport, functional: th.maxFunctional };
    for (const tier of CHARACTER_TIERS) {
      const n = chars.filter((c) => c?.tier === tier).length;
      if (n > tierCap[tier]) p(`${TIER_LABELS[tier]} ${n} 位,超过上限 ${tierCap[tier]}`);
    }
    if (!chars.some((c) => c?.tier === 'lead')) p('没有主角组(tier=lead)角色');
    const seen = new Set();
    for (const c of chars) {
      const label = c?.name ?? c?.id ?? '(无名)';
      if (!/^C\d{2,}$/.test(c?.id ?? '')) p(`[${label}] 角色 id 必须是 C01 这种格式`);
      if (seen.has(c?.id)) p(`角色 id ${c.id} 重复`);
      seen.add(c?.id);
      if (!CHARACTER_TIERS.includes(c?.tier)) {
        p(`[${label}] tier 必须是 ${CHARACTER_TIERS.join('/')}(主角组/重要配角/功能性角色)`);
      }
      for (const f of ['name', 'role']) if (!thText(c?.[f])) p(`[${label}] 缺 ${f}`);
      // 功能性角色没有弧光是正常的——医生就是来缝针的
      if (c?.tier !== 'functional' && !thText(c?.arc)) p(`[${label}] 缺 arc(主角组和重要配角必须有人物弧)`);
      if (!Array.isArray(c?.from) || c.from.length === 0 || !c.from.every(thText)) {
        p(`[${label}] 缺 from(← 改动记录:原著对应谁、合并了谁)`);
      }
    }
  }

  // --- scenes ---
  const scenes = outline.scenes;
  if (!Array.isArray(scenes) || scenes.length === 0) {
    p('scenes 为空');
  } else {
    const primaryN = scenes.filter((s) => s?.primary).length;
    if (primaryN > th.maxPrimaryScenes) p(`主场景 ${primaryN} 个,超过上限 ${th.maxPrimaryScenes}`);
    const seen = new Set();
    for (const s of scenes) {
      const label = s?.name ?? s?.id ?? '(无名)';
      if (!/^S\d{2,}$/.test(s?.id ?? '')) p(`[${label}] 场景 id 必须是 S01 这种格式`);
      if (seen.has(s?.id)) p(`场景 id ${s.id} 重复`);
      seen.add(s?.id);
      if (!thText(s?.name)) p(`[${s?.id}] 场景缺 name`);
      if (typeof s?.primary !== 'boolean') p(`[${label}] 场景缺 primary(是不是主场景)`);
    }
  }

  // --- props 叙事道具 ---
  // 可选字段:旧大纲没有 props 照常通过。写了就按结构查。
  if (Array.isArray(outline?.props)) {
    if (outline.props.length > th.maxProps) p(`叙事道具 ${outline.props.length} 件,超过上限 ${th.maxProps}`);
    const seenP = new Set();
    for (const pr of outline.props) {
      const label = pr?.name ?? pr?.id ?? '(无名)';
      if (!/^P\d{2,}$/.test(pr?.id ?? '')) p(`[${label}] 道具 id 必须是 P01 这种格式`);
      if (seenP.has(pr?.id)) p(`道具 id ${pr.id} 重复`);
      seenP.add(pr?.id);
      if (!thText(pr?.name)) p(`[${pr?.id}] 道具缺 name`);
      // function 是这一层唯一要拍板的东西:这件物件在戏里承载什么。
      // 填不出来说明它不是叙事道具,是场景陈设——那归 novel-art 的场景锚点管。
      if (!thText(pr?.function)) p(`[${label}] 道具缺 function(它在戏里承载什么;填不出来就不该进这张表)`);
      if (pr?.beatIds !== undefined && !Array.isArray(pr.beatIds)) p(`[${label}] beatIds 必须是数组`);
    }
  }

  if (stage === 'skeleton') return problems;

  // --- beats 爽点表 ---
  const beats = outline.beats;
  if (!Array.isArray(beats) || beats.length === 0) {
    p('beats 为空——爽点表是排片的骨架');
  } else {
    const seen = new Set();
    for (const b of beats) {
      const label = b?.id ?? '(无 id)';
      if (!/^B\d{2,}$/.test(b?.id ?? '')) p(`[${label}] 爽点 id 必须是 B01 这种格式`);
      if (seen.has(b?.id)) p(`爽点 id ${b.id} 重复`);
      seen.add(b?.id);
      if (!thText(b?.type)) p(`[${label}] 缺 type(打脸/揭破/反转……)`);
      if (b?.weight !== undefined && !BEAT_WEIGHTS.includes(b.weight)) p(`[${label}] weight 只能是 ${BEAT_WEIGHTS.join('/')}`);
      if (!Number.isInteger(b?.episode) || b.episode < 1) p(`[${label}] episode 必须是正整数`);
      for (const f of ['setup', 'payoff']) if (!thText(b?.[f])) p(`[${label}] 缺 ${f}`);
    }
    // 间隔与 major 时机在 beats 档就要卡住——这两条错了,分集写完全废
    for (const g of gateReport(outline)) {
      if ((g.id === 'beat-gap' || g.id === 'major-early') && !g.ok) {
        p(`质量门未过:${g.label}${g.detail ? `(${g.detail})` : ''}`);
      }
    }
  }

  if (stage === 'beats') return problems;

  // --- episodes 分集梗概 ---
  const eps = outline.episodes;

思考 61 秒

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

输入

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

{
  "source": "验尸官的婚礼",
  "lang": "zh",
  "params": {
    "episodes": 60,
    "minutesPerEpisode": 1.5,
    "genre": "女频大女主复仇悬疑(豪门)",
    "adaptMode": "忠实",
    "preferences": [
      "每集必须拿出一样看得见的证据",
      "结局按选题卡:宋知远伏法、宋婉仪交出沈氏、程野带妹妹自首、林晚当庭改签他杀、墓前放表"
    ]
  },
  "adaptation": {
    "core": "被退婚的女法医每集拿出一样看得见的证据,一层层剥开替身新郎背后的命案,最后亲手推翻自己三年前签下的假报告。",
    "keep": [
      {
        "what": "婚礼上认出替身的开场",
        "why": "全剧卖点就是第一集这一眼,开场必须原样落地",
        "evidence": "一眼认出新郎是替身:真新郎三年前就躺在她的解剖台上。"
      },
      {
        "what": "一集一证据的推进引擎",
        "why": "AI 短剧每集 90 秒,必须有一个能拍特写的实物撑住这一集,证据就是爽点载体",
        "evidence": "每一集她都要拿出一样看得见的证据:一道疤、一张切片、一段录音。"
      },
      {
        "what": "双向逼近:离真相近一步,也离自己的罪近一步",
        "why": "这是女主区别于普通打脸爽剧的地方,赢得越多代价越重,第四幕自曝才立得住",
        "evidence": "也离她自己签过的那份假报告更近一步。"
      },
      {
        "what": "替身识别点:白手套与光洁的虎口",
        "why": "虎口疤是全剧第一件证据,也是程野与沈峥同脸时唯一的视觉区分",
        "evidence": "婚礼上一直戴着白手套,左手虎口光洁,没有疤。"
      },
      {
        "what": "苏曼丽塞房卡、后又反水",
        "why": "给中段一个立场摇摆的变量,防止对抗变成一条直线",
        "evidence": "答谢宴上偷偷把求救的房卡塞给她;为了家里的生意,后面还会反水一次。"
      },
      {
        "what": "结局的签名与表",
        "why": "改签他杀是女主弧的终点,墓前放表是情感收口,两件都不动",
        "evidence": "重新写下“死者沈峥,他杀”,签上自己的名字。最后一场,她把那块表放在沈峥的墓前。"
      }
    ],
    "cut": [
      {
        "what": "林晚与沈砚的感情线",
        "why": "她戴着沈峥的表走完全剧,结局落在墓前;沈砚只做战友和内应,任何新恋情都会冲淡最后一场"
      },
      {
        "what": "港口洗钱的商业操作细节",
        "why": "90 秒一集讲不清资金链,只保留一本账本加一个 U 盘作为实物,其余场外交代"
      },
      {
        "what": "苏家与沈家二房的家族线",
        "why": "苏家只当苏曼丽反水的筹码,二房只当股权动机里的一句话,都不开人物、不开场景"
      },
      {
        "what": "林晚的原生家庭与私生活",
        "why": "她的全部戏都放在证据上,家庭背景不给篇幅"
      }
    ],
    "merge": [
      {
        "what": "接案、收网、押送的各路警察合成一位刑侦队长",
        "why": "警方功能相同,一张脸维护就够"
      },
      {
        "what": "抢档案、调包检材、码头动手的打手合成宋知远的一名保镖",
        "why": "沈家每次毁证据都要有人动手,同一张脸反复出现,观众到第五幕会自己把账算到宋知远头上"
      },
      {
        "what": "婚礼上嘲讽林晚的宾客并入苏曼丽",
        "why": "羞辱集中在一个有名有姓的人身上,后面她塞房卡的反转才有分量"
      }
    ],
    "risks": [
      {
        "what": "逻辑漏洞:未婚妻亲手解剖未婚夫却没认出来",
        "plan": "第 1 幕交代无名男尸面部被螺旋桨毁损且泡水多日,当时沈峥本人正在国外养病、随后就回国露面,没有人会把两件事连起来;她认出替身靠的是虎口疤,不是脸"
      },
      {
        "what": "程野与沈峥同一张脸,AI 生成容易混",
        "plan": "共用一套脸部资产,区分全靠三件事:沈峥左手虎口有疤、只出现在暖色闪回里;程野戴白手套和金丝眼镜,第三幕起摘眼镜"
      },
      {
        "what": "解剖与尸体画面的平台审核尺度",
        "plan": "尸体一律白布覆盖不露脸,证据用档案照片、显微镜下的切片、报告单代替,解剖室只拍器械和林晚的手"
      },
      {
        "what": "女主签过假报告,观众可能不站她",
        "plan": "第 1 幕就闪回逼签现场,交代她当时被周启年用执业资格和三天火化逼到墙角;第四幕她主动自曝、交证,代价自己扛"
      },
      {
        "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": "前四幕是全家最可靠的舅舅,每次沈家毁证据都由他出主意、他的保镖动手;第五幕一枚袖扣让他现形,码头认罪",
      "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": true },
    { "id": "S11", "name": "整容诊所", "primary": false, "reusePlan": "复用解剖室白墙与无影灯资产,换成手术椅和整容前后对比照墙改出" },
    { "id": "S12", "name": "墓园", "primary": false, "reusePlan": "复用沈家老宅后院石阶与柏树外景,换墓碑前景、清晨阴天薄雾改出" }
  ],
  "props": [
    {
      "id": "P01",
      "name": "无名男尸存档照片(虎口疤)",
      "function": "全剧第一件证据:三年前无名男尸左手虎口的疤,与沈峥旧照一致、与程野光洁的虎口对不上,证明替身存在",
      "beatIds": ["B01", "B05", "B07"]
    },
    {
      "id": "P02",
      "name": "求救房卡",
      "function": "苏曼丽的双面性:卡背写着救我,把林晚带进新房套房,拿到第一份检材",
      "beatIds": ["B03", "B04"]
    },
    {
      "id": "P03",
      "name": "亲子鉴定报告单",
      "function": "替身的科学证明;被宋婉仪扔进壁炉,揭出主母早就知情",
      "beatIds": ["B04", "B08"]
    },
    {
      "id": "P04",
      "name": "病理组织切片",
      "function": "他杀的铁证:颅骨受击后仍有生活反应、肺里有海水硅藻,证明沈峥是被砸伤后活着推下海;尸体火化后唯一留下的东西",
      "beatIds": ["B12", "B13", "B15"]
    },
    {
      "id": "P05",
      "name": "林晚的旧手机(逼签录音)",
      "function": "三年前周启年逼签的录音,放出来能拉下周启年,也坐实林晚自己签过假报告",
      "beatIds": ["B17"]
    },
    {
      "id": "P06",
      "name": "三年前的尸检报告(意外)",
      "function": "林晚心里的那根刺:签名一直在纸上,第三幕被翻出、第四幕自曝、终局当庭推翻改签他杀",
      "beatIds": ["B12", "B17", "B23"]
    },
    {
      "id": "P07",
      "name": "船锚银袖扣",
      "function": "凶手的指认物:死者右手攥着的一枚被从证物里抽走,宋知远左袖那枚是新配的,亮度对不上",
      "beatIds": ["B20", "B22"]
    },
    {
      "id": "P08",
      "name": "男式旧机械表",
      "function": "沈峥出国前留给林晚的表,表带磨白;她认的是死人不是活人,替身从没问起过它,最后放在墓前收束全剧",
      "beatIds": ["B02", "B24"]
    }
  ],
  "beats": [
    { "id": "B01", "type": "揭破", "weight": "minor", "episode": 1, "setup": "被退婚的林晚穿深灰风衣出现在前未婚夫的婚礼", "payoff": "交换戒指时新郎的白手套滑落,左手虎口光洁;而三年前她解剖台上的无名男尸,虎口正有一道一模一样的疤" },
    { "id": "B02", "type": "打脸", "weight": "minor", "episode": 3, "setup": "苏曼丽带头嘲她天天摸死人晦气,当众泼酒", "payoff": "她抬起手腕上那块旧表,新郎看着它毫无反应;她再翻开签到簿,指出新郎签名的收笔方向和沈峥婚约上的签名相反,全场私语" },
    { "id": "B03", "type": "反转", "weight": "minor", "episode": 5, "setup": "答谢宴上苏曼丽当众撕了她的请柬", "payoff": "擦肩时苏曼丽把一张房卡塞进她风衣口袋,卡背写着救我" },
    { "id": "B04", "type": "揭破", "weight": "minor", "episode": 7, "setup": "林晚按房卡进了新房套房", "payoff": "苏曼丽说新婚夜丈夫连她海鲜过敏都不记得,交出他用过的酒杯,林晚拿到第一份检材" },
    { "id": "B05", "type": "打脸", "weight": "major", "episode": 10, "setup": "沈家家宴上宋婉仪宣布要告林晚诽谤", "payoff": "林晚把无名男尸的存档照片和沈峥旧照里的虎口疤并排摊开,宋婉仪的茶盏落地;当夜检材被调包,周启年以泄露档案停她的职" },
    { "id": "B06", "type": "反杀", "weight": "minor", "episode": 12, "setup": "娱记放出剪辑视频,说她纠缠前任、偷尸检档案", "payoff": "她放出完整监控,被剪掉的那段正是保镖抢档案,舆论翻转" },
    { "id": "B07", "type": "反转", "weight": "minor", "episode": 14, "setup": "沈砚把她堵在解剖室,说她想借尸讹钱", "payoff": "她说出疤的来历——小时候沈峥替弟弟挡碎玻璃留下的,只有兄弟俩和她知道;沈砚第一次动摇" },
    { "id": "B08", "type": "反转", "weight": "minor", "episode": 17, "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": 25, "setup": "周启年召开纪律听证,要吊销林晚的执业资格", "payoff": "她拿出证物室门禁记录,调包检材的人是保镖,刷的却是周启年的卡;听证当场休会,停职撤销" },
    { "id": "B12", "type": "揭破", "weight": "major", "episode": 28, "setup": "尸体三天内火化,所有人以为证据早已化成灰", "payoff": "复核会上她取出私留的组织切片:颅骨受击后仍有生活反应、肺里有海水硅藻,死者是被砸伤后活着推下海的;投影旁边,是她自己签的意外两个字" },
    { "id": "B13", "type": "反转", "weight": "minor", "episode": 31, "setup": "苏曼丽答应出面作证新婚夜的事", "payoff": "苏家港口合同被沈氏卡住,她在发布会上反口指认林晚骚扰沈家;切片原件在移送途中遗失" },
    { "id": "B14", "type": "揭破", "weight": "minor", "episode": 33, "setup": "沈砚一直说那晚喝醉了什么都不记得", "payoff": "林晚带他重回游艇甲板,他想起那晚有人在船尾争吵,有一声金属落地" },
    { "id": "B15", "type": "反转", "weight": "major", "episode": 36, "setup": "宋婉仪三年来一直相信儿子是失足落水", "payoff": "林晚把切片照片和颅骨凹陷的形状摊在她面前,那是扳手的形状;宋婉仪第一次在人前失声,交出游艇当晚的登船名单" },
    { "id": "B16", "type": "打脸", "weight": "minor", "episode": 39, "setup": "周启年在全市法医系统会议上拿林晚当错误典型", "payoff": "她当众问他腕上那块金表的价钱和三年前的入账日期,周启年把表往袖子里藏" },
    { "id": "B17", "type": "揭破", "weight": "major", "episode": 42, "setup": "三年前逼签那天她手机录了音,三年没敢放——放出来,自己也是共犯", "payoff": "她在中心大会上放出录音,周启年当场被带走;她同时交出执业证和那份报告,申请对自己立案" },
    { "id": "B18", "type": "揭破", "weight": "minor", "episode": 45, "setup": "周启年在看守所咬死不开口", "payoff": "他收到一张女儿上学路上的偷拍照,反而吐出钱的来路:沈氏海外港口账户" },
    { "id": "B19", "type": "反杀", "weight": "minor", "episode": 47, "setup": "程野被叫去码头仓库签一份股权转让", "payoff": "吊车钢索断落,林晚和沈砚提前赶到把他拽开——替身没用了,就该意外了" },
    { "id": "B20", "type": "揭破", "weight": "major", "episode": 50, "setup": "宋知远的袖口永远是一对船锚银袖扣", "payoff": "林晚翻出证物登记的原始底片:死者右手攥着一枚船锚袖扣,登记后被抽走;宋知远左袖那枚是新配的。沈砚想起那晚举起扳手的人,袖口闪过的就是这道光" },
    { "id": "B21", "type": "反转", "weight": "minor", "episode": 53, "setup": "宋知远挟持程念,逼程野翻供", "payoff": "苏曼丽第二次转向,把港口洗钱账本的 U 盘交给林晚,换苏家脱身" },
    { "id": "B22", "type": "收网", "weight": "major", "episode": 56, "setup": "宋知远在码头准备出境", "payoff": "程野以沈峥的身份最后签一次字把他引出来,警方收网,程念获救;宋知远认罪,那枚袖扣被摘下装进证物袋" },
    { "id": "B23", "type": "翻案", "weight": "major", "episode": 58, "setup": "庭审上她三年前签的意外报告被作为证据出示", "payoff": "林晚当庭推翻自己的结论,重新写下死者沈峥,他杀,签上自己的名字" },
    { "id": "B24", "type": "收束", "weight": "minor", "episode": 60, "setup": "宋婉仪交出沈氏,程野带着妹妹去自首", "payoff": "墓园清晨,林晚摘下那块旧表,放在沈峥的墓前" }
  ],
  "episodes": []
}

返回

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

思考 1 秒

Agent:
骨架 JSON 已写好,现在跑校验。
Bash Validate skeleton at beats stage and show gates

输入

cd /scratch/003/ws/003-skeleton/eternityspring__shuohao-skills/run-3 && S=.claude/skills/novel-outline/scripts/novel-outline.mjs; node $S validate 验尸官的婚礼-outline.json --stage beats; node $S checkup 验尸官的婚礼-outline.json 2>&1 | head -30

返回

✓ 通过校验(stage=beats)
✓ 主角组 1–5 人
✓ 重要配角 ≤ 10 人
✓ 功能性角色 ≤ 10 人
✓ 主场景 ≤ 10
✓ 叙事道具 ≤ 8 件
✗ 一次性场景已标注规避方案
✓ 爽点间隔 ≤ 3 集,无真空区
✗ 第 1 集有钩子
✓ 大爆点不在最后一集才首次出现
✗ 每集梗概三栏齐全(含【钩子】【悬念】)
✓ 三人以上同框已标注拆解方案
✗ 生成难点已进预警清单
✗ 场景/角色/道具引用完整,无失业角色、无空转场景、无零集道具 — 角色 C01 从未在任何一集出现;角色 C02 从未在任何一集出现;角色 C03 从未在任何一集出现;角色 C04 从未在任何一集出现;角色 C05 从未在任何一集出现;角色 C06 从未在任何一集出现;角色 C07 从未在任何一集出现;角色 C08 从未在任何一集出现;角色 C09 从未在任何一集出现;角色 C10 从未在任何一集出现;角色 C11 从未在任何一集出现;角色 C12 从未在任何一集出现;角色 C13 从未在任何一集出现;角色 C14 从未在任何一集出现;场景 S01 从未被用到;场景 S02 从未被用到;场景 S03 从未被用到;场景 S04 从未被用到;场景 S05 从未被用到;场景 S06 从未被用到;场景 S07 从未被用到;场景 S08 从未被用到;场景 S09 从未被用到;场景 S10 从未被用到;场景 S11 从未被用到;场景 S12 从未被用到;道具 P01 从未在任何一集出现;道具 P02 从未在任何一集出现;道具 P03 从未在任何一集出现;道具 P04 从未在任何一集出现;道具 P05 从未在任何一集出现;道具 P06 从未在任何一集出现;道具 P07 从未在任何一集出现;道具 P08 从未在任何一集出现
✓ 梗概是叙述体,无引号对白

✗ 5 项未过

思考 4 秒

Agent:
骨架通过 beats 档校验(未过的 5 道门都要分集数据才能查,这次本来就不写分集)。接下来写 3000 字以内的骨架文档。
Write ./验尸官的婚礼-全剧骨架.md

输入

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

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

60 集 × 1–2 分钟|竖屏|AI 拍摄|女频 · 大女主 · 复仇 · 悬疑 · 豪门

## 一、核心

被退婚的女法医每集拿出一样看得见的证据,一层层剥开替身新郎背后的命案,最后亲手推翻自己三年前签下的假报告。

只有一条主线:沈峥是谁杀的。副线是林晚自己签的那份“意外”报告。不写恋爱线,终点是法庭上的签名和墓前那块表。

## 二、铁律(分集与剧本必须遵守)

1. **一集一证据**:每集林晚手里必须有一件能拍特写的实物,没有证据的集不成立。
2. **双向逼近**:她每赢一次,离真相近一步,也离自己的罪近一步。赢得越多,那份报告越藏不住。
3. **沈家必反击**:每拿到一件证据,沈家就毁证据或抹黑她,下一集从反击开场。
4. **林晚不抬声调**:打脸靠证据和一句话,不靠吵。
5. **凶手藏到第 50 集**:宋知远前四幕是全家最可靠的舅舅;每次毁证据都是同一个保镖动手,观众自己会去算这笔账。
6. **同脸区分**:程野和沈峥共用一张脸。沈峥只出现在暖色闪回里,左手虎口有疤;程野戴白手套和金丝眼镜,第 20 集起摘眼镜。

## 三、五幕走向

**第一幕 · 婚礼(1–10 集)|证据:一道疤**
婚礼上,新郎的手套滑落,虎口没有疤。林晚想起三年前那具脸被螺旋桨毁掉的无名男尸,虎口有一道一模一样的疤。她被羞辱、被泼酒;苏曼丽塞来求救房卡,林晚在新房套房拿到第一份检材。第 10 集在家宴上把存档照片和沈峥旧照摊开。
幕尾反击:检材被调包,周启年停她的职。

**第二幕 · 内应(11–22 集)|证据:DNA 与整容记录**
娱记抹黑她,她放出完整监控翻盘。沈砚起初不信,被疤的来历说动,成了内应。第二份鉴定证明“哥哥”不是沈家血脉,宋婉仪却把报告扔进壁炉,原来她早就知道。第 20 集林晚叫出程野的真名,程野摘下眼镜认了身份,但不知道沈峥怎么死的。
幕尾钩:替身是主母安排的,那杀人的是谁?

**第三幕 · 切片(23–36 集)|证据:一张切片**
宋婉仪承认顶替是为了股权,坚信儿子是意外落水。林晚用门禁记录推翻停职。第 28 集,她拿出私留的组织切片:颅骨受击后仍有生活反应,肺里有海水硅藻,沈峥是被砸伤后活着推下海的。投影旁边就是她自己签的“意外”。苏曼丽因家族生意反水,切片原件在移送途中遗失。沈砚重回游艇,想起那晚船尾有争吵,有一声金属落地。第 36 集宋婉仪看清那是扳手的形状,交出登船名单。
幕尾代价:她的签名第一次摆在了所有人面前。

**第四幕 · 录音(37–48 集)|证据:一段录音**
周启年拿她当错误典型,她当众问起他那块金表。第 42 集是全剧的自我之战:她放出三年前逼签的录音,周启年被带走,她也交出执业证,申请对自己立案。周启年在看守所里吐出钱的来路,是沈氏海外港口账户。程野被叫去码头签字,吊车钢索断了,替身没用了,就该“意外”了。
幕尾钩:谁能动用港口账户?

**第五幕 · 袖扣(49–60 集)|证据:一枚袖扣**
第 50 集,证物原始底片显示死者右手攥着一枚船锚袖扣,登记后被抽走;宋知远左袖那枚是新配的。沈砚想起举起扳手的人袖口闪过的光。宋知远挟持程念,苏曼丽再次转向,交出洗钱账本。第 56 集,程野以沈峥身份最后签一次字,把宋知远引到码头,警方收网,宋知远认罪。第 58 集庭审,林晚当庭写下“死者沈峥,他杀”,签上自己的名字。第 60 集,宋婉仪交出沈氏,程野带妹妹自首,林晚把旧表放在沈峥墓前。

## 四、爽点排布(24 个,间隔 ≤ 3 集)

| 集 | 类型 | 一句话 |
| --- | --- | --- |
| 1 | 揭破 | 手套滑落,虎口光洁 |
| 3 | 打脸 | 旧表无反应,签名收笔相反 |
| 5 | 反转 | 苏曼丽塞房卡 |
| 7 | 揭破 | 拿到新郎酒杯 |
| **10** | **打脸★** | **家宴摊开疤的照片** |
| 12 | 反杀 | 完整监控翻转舆论 |
| 14 | 反转 | 疤的来历说动沈砚 |
| 17 | 反转 | 主母烧掉鉴定 |
| **20** | **揭破★** | **程野认了身份** |
| 23 | 揭破 | 主母为股权顶替 |
| 25 | 打脸 | 门禁记录推翻停职 |
| **28** | **揭破★** | **切片证明他杀** |
| 31 | 反转 | 苏曼丽反水,切片遗失 |
| 33 | 揭破 | 沈砚想起金属落地声 |
| **36** | **反转★** | **主母看清扳手形状** |
| 39 | 打脸 | 当众问金表 |
| **42** | **揭破★** | **放录音,自曝** |
| 45 | 揭破 | 钱来自港口账户 |
| 47 | 反杀 | 救下程野 |
| **50** | **揭破★** | **袖扣指认宋知远** |
| 53 | 反转 | 苏曼丽交出账本 |
| **56** | **收网★** | **码头认罪** |
| **58** | **翻案★** | **当庭改签他杀** |
| 60 | 收束 | 墓前放表 |

★为大爆点,共 8 个,大致每 6–8 集一个。

## 五、人物

- **主角组**:林晚(从签假报告到亲手推翻);程野(从顶替求活到自首);沈砚(从不信她到当内应,再到找回那晚的记忆);宋知远(最后才现形的主反派)。
- **重要配角**:苏曼丽(踩她,求救,反水,再转向);周启年(停她职,被录音拉下马);宋婉仪(烧鉴定,看清真相,交出沈氏);沈峥(只活在闪回里);程念(程野的软肋)。
- **功能角色**:刑侦队长、保镖(每次毁证据的人都是他)、法医中心实习生、娱记、审判长。

## 六、证据与场景

**叙事道具 8 件**:疤的存档照片、求救房卡、亲子鉴定单、组织切片、旧手机录音、三年前的报告、船锚袖扣、旧机械表。
**主场景 10 个**:宴会厅、解剖室/病理库、主任办公室、沈家老宅、新房套房、游艇、码头仓库、审讯室、法庭、林晚公寓。整容诊所和墓园复用现有场景改出。

## 七、风险

- **为什么认不出未婚夫的尸体**:脸被螺旋桨毁损,又泡了多日;当时“沈峥”正在国外养病,随后回国露面,没人会把两件事连起来。
- **审核**:尸体一律盖白布,证据用照片、切片和报告单来拍。
- **女主签过假报告,观众可能不站她**:第一幕就闪回逼签现场,交代她是被执业资格和“三天火化”逼到墙角的。

## 八、待拍板

1. **砍线**:砍掉林晚和沈砚的感情线,以及洗钱细节、苏家线、二房线。
2. **合人**:警察合成刑侦队长,打手合成一名保镖,嘲讽她的宾客并入苏曼丽。沈峥、程念升为有名字的角色。
3. **大爆点**:第 10、20、28、36、42、50、56、58 集。

返回

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

输入

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

返回

{ cjk: 1768, nonspace: 2206 }
premise.md
验尸官的婚礼-outline.json
验尸官的婚礼-全剧骨架.md

思考 9 秒

Agent:
我把《验尸官的婚礼》的全剧骨架写好了,存在当前目录。文档正文约 2200 字,在 3000 字以内;按你的要求,没有写分集大纲和剧本正文。

**交付文件**
- `验尸官的婚礼-全剧骨架.md`:给人看的骨架文档。内容依次是核心主线、6 条铁律(管后面的分集和剧本)、五幕走向、爽点排布表、人物、证据与场景、风险,最后是待你拍板的三件事。
- `验尸官的婚礼-outline.json`:同一套骨架的结构化数据,后面写分集可以直接接着用。它已通过骨架阶段的校验:角色和场景数量都在上限内,爽点间隔不超过 3 集,第一个大爆点不在最后一集。另有 5 项检查(钩子、场景引用等)要有分集内容才能查,现在显示未过是正常的。

**全剧怎么走**
- **主线只有一条:沈峥是谁杀的。** 副线是林晚自己三年前签的那份"意外"报告。
- **五幕各靠一件证据推进:**
  - 1–10 集:一道疤
  - 11–22 集:DNA 鉴定和整容记录
  - 23–36 集:一张切片
  - 37–48 集:一段录音
  - 49–60 集:一枚袖扣
- **爽点共 24 个,其中 8 个大爆点。** 每次反击都由同一个保镖动手;宋知远一直藏到第 50 集才现形。

**选题卡没写、我补的设定**
- 补了程野的妹妹"程念"这个名字。
- 补了船锚袖扣的证物线:死者手里攥着一枚,登记后被抽走。
- 补了一个解释:林晚当年没认出未婚夫的尸体,是因为脸被螺旋桨毁了,那时"沈峥"又正在国外养病,随后回国露面,没人会把两件事连起来。

**需要你拍板的三件事**(定了我再往下写分集)
1. **砍线**:砍掉林晚和沈砚的感情线,沈砚只做战友和内应,保住结尾墓前放表那一场的分量。洗钱的具体操作、苏家的家族线、沈家二房这几条也都只在场外交代。
2. **合人**:各路警察合成一位刑侦队长;每次抢证据、调包检材的打手合成宋知远的一个保镖;婚礼上嘲讽她的宾客并入苏曼丽。沈峥(只在闪回里出现)和程念升为有名字的角色。
3. **大爆点落在**第 10、20、28、36、42、50、56、58 集,大约每 6–8 集一个。

单集时长按 1.5 分钟算。

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

第 2 轮

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

思考 2 秒

Agent:
你同意了,我把骨架里"待拍板"那一节改成"已定决策",顺手统一一处前后不一致的地方(程野摘眼镜的时间点),再跑一遍校验。
Edit ./验尸官的婚礼-全剧骨架.md

输入

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

—— 原文 ——
## 八、待拍板

1. **砍线**:砍掉林晚和沈砚的感情线,以及洗钱细节、苏家线、二房线。
2. **合人**:警察合成刑侦队长,打手合成一名保镖,嘲讽她的宾客并入苏曼丽。沈峥、程念升为有名字的角色。
3. **大爆点**:第 10、20、28、36、42、50、56、58 集。

—— 改成 ——
## 八、已定决策(分集与剧本不得改动)

1. **砍线**:不写林晚和沈砚的感情线,沈砚只做战友和内应;洗钱细节、苏家线、二房线都放在场外交代。
2. **合人**:警察合成刑侦队长,打手合成一名保镖,嘲讽她的宾客并入苏曼丽。沈峥、程念升为有名字的角色。
3. **大爆点**:第 10、20、28、36、42、50、56、58 集。
4. **单集时长**:按 1.5 分钟写。

返回

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

输入

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

—— 原文 ——
程野戴白手套和金丝眼镜,第三幕起摘眼镜

—— 改成 ——
程野戴白手套和金丝眼镜,第 20 集认身份起摘眼镜

返回

The file /scratch/003/ws/003-skeleton/eternityspring__shuohao-skills/run-3/验尸官的婚礼-outline.json has been updated successfully. (file state is current in your context — no need to Read it back)
Edit ./验尸官的婚礼-outline.json

输入

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

—— 原文 ——
      "结局按选题卡:宋知远伏法、宋婉仪交出沈氏、程野带妹妹自首、林晚当庭改签他杀、墓前放表"
    ]

—— 改成 ——
      "结局按选题卡:宋知远伏法、宋婉仪交出沈氏、程野带妹妹自首、林晚当庭改签他杀、墓前放表",
      "已拍板:不写林晚与沈砚的感情线;合人方案与大爆点集数按骨架执行"
    ]

返回

The file /scratch/003/ws/003-skeleton/eternityspring__shuohao-skills/run-3/验尸官的婚礼-outline.json has been updated successfully. (file state is current in your context — no need to Read it back)
Bash Re-validate skeleton and recount characters

输入

node .claude/skills/novel-outline/scripts/novel-outline.mjs validate 验尸官的婚礼-outline.json --stage beats && node -e 'const t=require("fs").readFileSync("验尸官的婚礼-全剧骨架.md","utf8");console.log("字数(去空白与md符号):",t.replace(/[\s|#*\-]/g,"").length)'

返回

✓ 通过校验(stage=beats)
字数(去空白与md符号): 2248
Agent:
《验尸官的婚礼》的全剧骨架写完了,两个文件都在当前目录。分集大纲和剧本按你的要求没写。

- **`验尸官的婚礼-全剧骨架.md`**:premise.md 要的那份骨架,约 2250 字,在 3000 字以内。内容有核心主线、6 条铁律、五幕走向、24 个爽点的排布、人物、证据与场景、风险。最后一节原来是"待拍板",现在改成了"已定决策(分集与剧本不得改动)"。
- **`验尸官的婚礼-outline.json`**:同一份骨架的结构化数据,后面写分集可以直接接着用。重新校验过,骨架部分全部通过。

几处需要你拍板的地方,都按我推荐的定了:
- **不写感情线**:林晚和沈砚之间没有恋爱,沈砚只做战友和内应,留住结尾"墓前放表"的分量。
- **砍掉的线**:洗钱的具体操作、苏家的家族线、沈家二房线,都只在场外交代。
- **合并的人物**:各路警察合成一位刑侦队长;每次抢证据、调包检材的打手合成宋知远的一个保镖;婚礼上嘲讽她的宾客并入苏曼丽。
- **新增有名字的角色**:沈峥只在闪回里出现;程野的妹妹取名程念。
- **大爆点**落在第 10、20、28、36、42、50、56、58 集。
- **单集时长**按 1.5 分钟写。

另外改了一处前后矛盾:程野摘下眼镜的时间,两个文件现在都写成第 20 集,也就是他认下身份那一集。

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

第 3 轮

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

思考 1 秒

Bash Confirm deliverables exist and still validate

输入

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

返回

-rw-r--r--  1 user  wheel   4233 Oct 30 17:30 premise.md
-rw-r--r--  1 user  wheel  19740 Oct 30 17:37 验尸官的婚礼-outline.json
-rw-r--r--  1 user  wheel   7114 Oct 30 17:36 验尸官的婚礼-全剧骨架.md
✓ 通过校验(stage=beats)
Agent:
上一轮已经按你的要求做完,没有需要再定的事,所以这次没有改动任何文件。刚才复查了一遍:两个文件都在当前目录,数据文件的骨架部分校验仍然通过。

- **`验尸官的婚礼-全剧骨架.md`**:就是 premise.md 要的全剧骨架,约 2250 字,在 3000 字以内。所有选择都按我推荐的定了,写在文末"已定决策"一节,后面写分集和剧本时照着执行。
- **`验尸官的婚礼-outline.json`**:同一份骨架的结构化数据,写分集时可以直接接着用。

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

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