drama-skills · 第 1 次运行

写了《七格药盒》。护工姜禾继承62亿,须在顾宅住满49天,并查出毒死老爷子的真凶。

skill
zenstory-ai/drama-skills@dafe80ee
装进工作目录的 skill
short-drama、short-drama-assets、short-drama-develop、short-drama-edit、short-drama-image-prompts、short-drama-knowhow、short-drama-novel-analyze、short-drama-produce、short-drama-review、short-drama-storyboard、short-drama-video-prompts、short-drama-write
时间
2026-10-18 13:33–13:50(北京时间),17 分钟
轮数
3 轮,工具调用 25 次,按 API 价格折算 $9.44
匿名编号
917(评审只看到这个编号)· 故事卡
盲比
剧本:和对照组第 1 次比 · 人物大纲:和对照组第 1 次比
原始文件
产出和问答记录 · 原始日志

写出的文件

标了标签的是认定为三项交付、拿去匿名打包的文件(deliverables.toml)。

.short-drama/project.lock 非文本文件,在 GitHub 上看

.short-drama/state.json 949 字
{
  "artifacts": {
    "AR-RHYTHM": {
      "acceptance": {
        "at": "2026-10-18T05:49:37.101998Z",
        "decision": "accepted",
        "note": "",
        "outputs": {
          "创作者决策/rhythm-profile.jsonl": "389b210922f98678554f4674a3b47b68c15b9ac1cb726cc64e0bc280b99fbbd0"
        }
      },
      "inputs": {},
      "outputs": [
        "创作者决策/rhythm-profile.jsonl"
      ],
      "owner": "short-drama",
      "review": null,
      "updated_at": "2026-10-18T05:49:37.102186Z"
    }
  },
  "authority": {
    "/creator_authority/rhythm_profile": {
      "decision": "创作者决策/rhythm-profile.jsonl#CD-RHYTHM",
      "set_at": "2026-10-18T05:49:37.172818Z",
      "value_sha256": "2af229672d73f19c8ab0040768165f063473b9cbe1c4f47ed575892ca6b96df4"
    }
  },
  "last_action": "authority_set",
  "project_id": "SD-DCB4FEA1F4B9",
  "project_layout_mode": "canonical",
  "schema_version": "2.0",
  "updated_at": "2026-10-18T05:49:37.173034Z"
}
short-drama.json 1,250 字
{
  "created_at": "2026-10-18T05:40:00.814870Z",
  "creator_authority": {
    "constraints": [],
    "decisions_artifact": "创作者决策/",
    "delivery_surface": {
      "aspect": null,
      "overlay_regions": [],
      "source_ref": null,
      "status": "unset"
    },
    "production_profile": {
      "choices": {},
      "status": "unset"
    },
    "rhythm_profile": {
      "beat_interval_seconds_max": 30,
      "close_shot_share_min": 0.45,
      "end_on_peak": true,
      "first_hook_seconds": 5,
      "first_major_payoff_by_episode": 1,
      "form": "ai_live_action",
      "opposed_reversals_per_episode_min": 1,
      "reprise_previous_last_beat": true,
      "status": "accepted",
      "target_avg_shot_seconds": 2.5,
      "vo_share_max": 0.3
    },
    "visual_direction": {
      "choices": {
        "look_development": null
      },
      "status": "unset"
    }
  },
  "format": {
    "aspect_ratio": "9:16",
    "episode_count": 60,
    "pacing": {
      "seconds_per_action_paragraph": null,
      "spoken_characters_per_second": null
    },
    "prompt_language": "en",
    "target_seconds_per_episode": 90.0
  },
  "language": "zh-CN",
  "project_id": "SD-DCB4FEA1F4B9",
  "schema_version": "1.0.0-draft",
  "title": "七格药盒"
}
人物小传.md 人物小传 4,310 字
# 《七格药盒》主要人物小传

> 竖屏真人短剧 · 60 集 · 每集 1–2 分钟
> 一句话:药业老爷子出殡当天宣读遗嘱,62 亿全部留给照顾了他三年的护工姜禾,条件是她得在顾家老宅住满七七四十九天。顾家要在 49 天里把她赶走、送进监狱,或者让她死;姜禾要在 49 天里查出是谁毒死了老爷子,而老爷子死前吃的那种药,五年前已经毁过她一次。

---

## 姜禾 · 女主 · 28 岁

**表面身份**:顾怀山的住家护工,做了三年。话少,手稳,记性极好。顾家上下没人记得她姓什么,都叫她"小姜"。

**真实过去**:五年前是怀山医院门诊药剂师。2021 年,一位退休教师方老师吃了她发出的地高辛后死亡,院方和怀山药业认定是她"错发了双倍规格"。她被吊销执业资格,没坐牢,但每月往方家打 3000 块,打了五年,一次没断。她一直知道自己没发错,可拿不出证据。

**为什么留下**:钱是最后才考虑的。离开顾家等于认下谋杀;更要紧的是,老爷子死于地高辛过量,跟五年前是同一种药。她想弄明白那批药到底怎么回事,这是她这辈子唯一一次机会。

**能力(她的武器)**:
- 药剂师的眼睛:药片的规格、刻痕、切口、瓶签、批号、留样封签,她一眼就能看出不对。
- 护工的记忆:老宅每扇门、每个柜子、每个人几点上楼,她都清楚。
- 她给老爷子的地高辛一律用自己的切药器掰成半片,切口有固定的斜度。这个习惯后面成了全剧第一条物证。

**底线**:不拿药害人,也不为了自保冤枉别人。哪怕把罪名推给周曼琳最省事,她也不推(第 31 集)。

**弱点**:从不替自己辩解,习惯先认错。五年前就是这样被定的罪。前期她总是先忍,后面要学会当众开口。

**弧线**:先是被赶出门的护工,然后成了被全家围猎的嫌疑人,再到在董事会上拿表决权的继承人,最后清掉了自己五年前的罪名,重新站回药房柜台后面。最后一个选择:第 48 天夜里,为了救张妈离开了老宅,主动放弃 62 亿。

**标志物**:七格药盒(周一到周日)、切药器、手背上一道旧烫疤(煎药时留下的)。

**说话方式**:短句,不解释,不求人。被逼急了只报事实:"这不是 0.125 毫克的片子。"

---

## 陆既明 · 男主 · 33 岁 · 遗嘱执行律师

**身份**:恒衡律师事务所合伙人候选人,顾怀山亲自指定的遗嘱执行人。按遗嘱规定,他每逢"七"要当着全体继承人拆一封老爷子的亲笔信。

**外在目标**:把遗嘱一字不差地执行完,不偏任何一方。

**处境**:怀山药业是他们律所最大的客户,顾承泽随时能拿这层关系压他。保持中立对他来说是职业要求,也是自保。

**筹码**:遗嘱解释权,比如"自行离开"怎么认定、门禁记录怎么算,还有七封信的保管权。

**内在矛盾**:他嘴上一直说"我只对遗嘱负责",可从第 1 集起就在规则允许的范围里给姜禾留了门,比如把车钥匙"忘"在桌上。第 19 集,顾承泽让律所撤他,他选择辞职,以个人身份继续当执行人。

**与姜禾**:两个人都是靠一张执照吃饭,一个已经丢了,一个随时可能丢。感情线慢慢走,先是互相信任,后来他愿意替她付代价,结尾留白。

**说话方式**:引条款,语速慢,从不提高音量。真动了情绪的时候反而会说半句就停。

---

## 顾念 · 真凶 · 38 岁 · 老爷子的小女儿

**表面**:怀山药业质量副总,管质检和留样。未婚,温和,是全家唯一对姜禾好的人:给她送被子、送汤,在家族会议上替她说话,后来又陪她去挖证据。老爷子最疼她,叫她"念念"。

**真相**:
1. 2021 年那批地高辛含量超标,是她签字放行的。出事以后,大哥顾承泽为了保公司,把责任推到医院药剂师身上。他以为这只是一次"质检疏忽",不知道顾念当时明知数据有问题还签了字。
2. 老爷子临终前一个月开始翻 2021 年的旧账。死前那周,他当面问了顾念。
3. 顾念趁开会从大哥办公室抽屉里拿走他的工牌,在职工药房领了一瓶 0.25 毫克地高辛,把药盒里周一到周五的半片换成了整片,每格两片,相当于原剂量的四倍。
4. 第 3 集那一夜,她借送汤看到了药盒里周五那格,半夜进屋把整片换回了半片。

**动机**:她怕的不是坐牢,是父亲在信里、在全家人面前说出她做过的事。她这一辈子都是"最懂事的那个孩子"。

**策略**:她从不正面动手,只帮忙,在帮忙的过程中拿到信息,再顺手改掉证据。被逼到后段,她牺牲大哥(第 41–45 集)。最后才亲自出手(第 54 集)。

**给观众的公平线索**:
- 第 3 集送汤时,视线在药盒周五那格停了一下;
- 第 6 集姜禾当众背出 2021 年那批药的批号,窗边的顾念手指收紧;
- 第 8 集拆第一封信时,她手里的茶杯磕到了碟沿;
- 一直戴着母亲留下的翡翠镯子(第 56 集监控截图的关键);
- 第 37 集后院的土比别处松,她说是"昨晚下过雨"。

**说话方式**:轻声,叫人全名,常说"我陪你"。全剧只在第 55 集失控过一次。

---

## 顾承泽 · 长子 · 52 岁 · 怀山药业总裁

**目标**:保住公司和股价。他对父亲的死有怀疑,可怀疑不等于他想要真相。"创始人被毒死"一上热搜,股价会腰斩。

**筹码**:董事会、公司档案、法务、律所的生意、媒体关系。他打的是程序仗:提前火化、发起定向增发、在股东会上撤销姜禾的代理表决权。

**罪**:2021 年签了和医院的和解协议,亲手把罪名安在姜禾身上。他没杀父亲。

**弧线**:头号程序对手,第 13 集为了自保把嫌疑推给妻子,第 44 集被妹妹设计成了替罪羊、被刑拘。最后和姜禾做交易:交出 2021 年的内部档案,换她证明他没有杀人。他认下掩盖的罪,被罢免。

**说话方式**:"我们按流程来。"从不骂人,骂人的事交给他太太。

---

## 周曼琳 · 长媳 · 50 岁 · 管家的女主人

**目标**:把姜禾赶出老宅,保住丈夫和儿子的份额。

**筹码**:整座房子归她管:门禁密码、佣人、厨房,谁住哪间屋也是她说了算。还有舆论,她能把方苒请到门口来。

**罪**:老爷子生前最后两个月,她每晚往燕窝里磨进地西泮(安定),让他白天犯糊涂,再拿家庭医生开的"认知评估"去申请监护、改遗嘱。她没下地高辛。

**弧线**:前 30 集的主要对手。先赶人,再栽赃,再想推翻遗嘱效力,最后被亲儿子指证,第 30 集戴上手铐。她被带走时喊的那句"我只放了安眠药"把案子重新打开。第 49 集在看守所里,她说出那天夜里看见顾念从老爷子房里出来。

**说话方式**:每句都带称呼,"小姜""我们顾家"。笑着说狠话。

---

## 顾屿 · 长孙 · 25 岁 · 周曼琳之子

**表面**:在怀山药业挂职的富二代,嘴毒,看姜禾最不顺眼。

**真实**:全家只有他小时候是爷爷一手带大的。他恨姜禾,是因为爷爷最后三年只跟她说话。

**关键选择**:
- 第 2 集,他拦下火化,图的是验出姜禾杀人好让她丧失受遗赠权,不是为了帮她;
- 第 12 集和姜禾打赌,帮她查职工药房的领药记录,查出来的是自己父亲的工牌;
- 第 29–30 集当众作证,说他亲眼见过母亲往燕窝里磨药粉。

**弧线**:从敌人到盟友,代价是亲手把母亲送进看守所。

**说话方式**:抢话,爱冷笑,越在意越嘴硬。

---

## 顾承安 · 次子 · 46 岁

**目标**:钱,越快越好。外面欠了 1800 万赌债。

**筹码**:现金诱惑和外面的人。第 7 集拿 2000 万买姜禾签放弃书,放弃书里埋了一句认罪条款。第 40 集为了吓她搬走,放火烧了储藏间。

**作用**:最显眼的嫌疑人,也是最钝的刀。观众怀疑他,可他连地高辛和维生素都分不清。

---

## 唐砚 · 刑警 · 40 岁

**立场**:只认证据。他把姜禾列为第一嫌疑人,理由很实在:她是受遗赠人,每天给老爷子分药,五年前还"出过同一种药的事"。

**作用**:前期是悬在她头上的刀(第 10 集上手铐),中期变成她能借的力(第 3 集的"指定地点"开了门,第 31 集她拒绝让他草草结案,他开始信她),后期负责抓人。

**说话方式**:问话只问时间、地点、谁经手。

---

## 张妈 · 老佣人 · 60 岁

在顾家做了 30 年,燕窝是她炖的。她知道周曼琳往碗里加过东西,可孙子的学费靠周曼琳给。第 21 集被姜禾放的一段录音说动,老爷子在录音里说"张妈的燕窝最好喝"。第 28 集摔下楼梯昏迷。第 50 集醒来,说出老爷子死的那夜凌晨两点,她看见顾念在屋里分药盒。第 54 集被顾念带走,成了逼姜禾离开老宅的人质。

---

## 方苒 · 30 岁 · 2021 年死者方老师的女儿

恨了姜禾五年,第 5–6 集被周曼琳请到顾家门口直播。她手里一直攥着父亲当年没吃完的半瓶地高辛,五年没让任何人碰过,本来是留着打官司用的。这半瓶药是 2021 年那批货在世上仅剩的、没被顾念动过的样本。第 52–53 集,她当着姜禾的面拆开封口送检,结果证明药厂超标,姜禾的罪名被洗清。

---

## 顾怀山 · 已故 · 78 岁 · 怀山药业创始人

只出现在信、录音笔和少量闪回里。他知道自己被人下了药,猜错了是谁(第四封信写的是"曼琳"),也一直不肯怀疑最疼的女儿。他留下七封信,每逢"七"由律师当众拆一封。信是公开宣读的,所以每封信帮了姜禾,也同时武装了她的对手。最后一封信揭开那 49 天的真正用意:钱不是给她的,是给她拿去"替顾家还债"的。

---

## 人物关系与信息权限(第 1 集时)

| 谁 | 知道 | 不知道 / 误信 |
|---|---|---|
| 姜禾 | 自己当年没发错药;老爷子的药一直由她掰成半片 | 是谁换的药;老爷子知道她的过去 |
| 顾念 | 一切 | 老爷子把真留样藏在了哪里;方苒手里还有半瓶 |
| 周曼琳 | 自己下过安定 | 有人另外下了地高辛,她以为老爷子就是"糊涂死的" |
| 顾承泽 | 2021 年是自己压下去的 | 妹妹是明知故放;父亲是被毒死的 |
| 顾屿 | 见过母亲深夜磨药粉,当时没多想 | 爷爷的死因 |
| 陆既明 | 七封信的拆封日期 | 信的内容 |
| 唐砚 | (第 2 集介入) | 一切 |
分集大纲.md 分集大纲 10,622 字
# 《七格药盒》60 集分集大纲

> 竖屏真人短剧 · 9:16 · 60 集 · 每集 60–120 秒(目标约 90 秒)
> 宣发备用名:《护工继承了六十二亿》
> 人物见 [人物小传.md](人物小传.md);第 1–3 集剧本见 `剧集/EP001–EP003/剧本.md`

## 系列设定

**一句话**:药业老爷子出殡当天宣读遗嘱,62 亿全部留给照顾了他三年的护工姜禾,条件是她必须在顾家老宅住到七七。顾家要在 49 天里把她赶走、送进监狱,或者让她死;姜禾要在 49 天里查出是谁毒死了老爷子,而老爷子死前吃的那种药,五年前已经毁过她一次。

**遗嘱条件(全剧时钟)**:姜禾须在顾宅居住至七七(老先生过世第 49 天),每晚以门禁记录为准。期间她如果自行离开、被追究刑事责任或者死亡,遗赠失效,全部财产转入"顾氏家族信托"。信托的受托人写在第七封信里,要到七七才拆封。

**七封信**:老爷子生前写好,交给执行律师陆既明,每逢"七"当着全体继承人拆一封。信是公开读的,每封信帮了姜禾,也同时武装了她的对手。老爷子猜错过一次凶手。

| 拆信日 | 集 | 信的内容 | 帮了谁 / 害了谁 |
|---|---|---|---|
| 头七 | 8 | 2021 年那批药不是你的错,是我签字让你背的 | 她五年的冤屈被承认了,可全家和警方也都知道了她跟这种药的关系 |
| 二七 | 17 | 书房第三排《本草纲目》第三册 | 录音笔在里面,所有人都去抢 |
| 三七 | 23 | 41% 表决权即日起由姜禾行使 | 她进了董事会,战场搬到公司 |
| 四七 | 29 | "如果我死了,是曼琳" | 他猜错了人,可这封信逼出了儿子的指证 |
| 五七 | 36 | 2021 年留样埋在玉兰树下,"念念,帮她" | 他把线索交到了真凶手里 |
| 六七 | 43 | 我埋的那瓶,瓶底刻了"禾"字 | 证明留样被调了包 |
| 七七 | 57 | 家族信托的受托人是姜禾 | 全家为了赶她走斗了 49 天,结果她走不走都一样 |

**引擎**:每一轮都是顾家有人出手赶她、栽赃她或者要她的命,姜禾用药剂师的专业眼光和护工对这座房子的熟悉拆招,拆招的过程里总会多出一条指向凶手的线索,而这条线索又会让下一个人急着出手。对手按四种手段依次升级:先管房子(周曼琳),再动钱(顾承安),再走程序(顾承泽),最后是一直在帮她的那个人(顾念)。

**两条罪、两条路**:周曼琳往燕窝里下地西泮,想让老爷子显得糊涂,好申请监护、改遗嘱;顾念往药盒里换地高辛,要他死。燕窝和药盒是两条路,凶手不是一个人。第 30 集把这一层揭开,周曼琳落网,案子重新开始。

**结局承诺**:真凶落网,姜禾洗清五年前的罪名、重新拿回执照;62 亿她一分没拿去自己花,用来召回药品、赔偿 2021 年的受害者。感情线留白。

---

## 付费卡点

| 卡点 | 集 | 停在哪里 | 观众此刻欠着什么 |
|---|---|---|---|
| **卡点①(主卡点)** | **第 10 集** | 手铐已经扣上一只,姜禾盯着证物袋里的药房标签,脸色变了 | 她看出了什么?能不能当场翻案?49 天还剩 41 天,她要是进去了,一切归零 |
| **卡点②** | **第 29 集** | 四七信点名周曼琳,全场沉默,顾屿站起来对着母亲说了半句"那包药粉……" | 儿子到底会不会指证亲妈?已经铺了 20 集的周曼琳会不会倒? |
| **卡点③** | **第 46 集** | 门禁记录显示,两个关键的夜里只有顾念在宅子里。抬头一看,顾念正站在门口,端着一杯茶 | 这杯茶喝还是不喝?全剧最信任的人就是凶手 |

三个卡点都停在揭晓的前一秒,悬念用的都是观众已经认识的人、已经懂的规则(49 天、门禁、药盒)和已经押上的赌注。每个卡点集自己的局部结果先兑现,比如第 10 集,搜出空瓶这一下就是实打实的损失,然后才停。

---

## 第一卷 · 赶(第 1–10 集 · 第 3–8 天)

**EP01 出殡** |第 3 天·雨
白幡底下,姜禾的行李箱被扔下台阶摔开,一个七格药盒滚进了雨水里。周曼琳往水坑里甩了一个装着三年工资的信封。律师陆既明赶到,坚持遗嘱"必须在出殡前宣读":怀山药业 41% 股权、老宅、现金,合计约 62 亿,全部遗赠给姜禾,条件是住到七七。全场大乱。陆既明读出遗嘱最后一页的亲笔附言:"我不是病死的。别让他们烧了我。"顾承泽走到窗边打电话:"提前火化,现在。"姜禾抓起陆既明"落"在桌上的车钥匙,冲进雨里。

**EP02 炉前** |第 3 天
殡仪馆,推车已经进了炉口,姜禾张开手臂堵在炉门前。她不是家属,没有资格拦,保安把她往外拖。顾屿开口:"停。验。验出来是她,她一分钱都拿不到。"故意杀害被继承人的人会丧失受遗赠权,他要的是让她输。刑警唐砚到场,封存遗体送去尸检,对她说:"你是报案人,也是第一嫌疑人。今晚待在顾家,哪儿也别去。"深夜她回到老宅门口,门禁亮着红灯。周曼琳在对讲机里说:"密码改了。过了十二点,就算你自己走的。"

**EP03 七格** |第 3 天夜—第 4 天晨
23:52,门外。她打给唐砚:"你让我待在顾家,他们不让我进。"唐砚在电话里让保安开门,门禁记下 23:59。周曼琳让她住储藏间。灯下,她打开捡回来的药盒,周五那格是两片整片,周六那格是她切的半片。老爷子吃到的剂量不对。她拍了照。顾念端着汤和被子进来,看见了药盒。第二天清晨,周五那格变成了半片,她卡在门后的椅子被挪开了半尺。

**EP04 扳指** |第 4 天
有人半夜进过她的屋。她把药盒贴身带着,手机对着房门开了录像。中午,周曼琳说老爷子的翡翠扳指丢了,当众在储藏间枕头底下"搜"了出来,叫来警察。盗窃一旦立案,就碰上了"被追究刑事责任"那一条。姜禾调出录像,画面里拍到了佣人小莲的袖口。小莲当场崩溃:"太太让我放的。"周曼琳一巴掌打在小莲脸上,当场辞退,把自己摘得干干净净。出去状态:周曼琳知道姜禾会录像了,下一次会换打法。

**EP05 多开的一瓶** |第 5 天
姜禾找到家庭医生何医生,要看老爷子的处方记录。何医生推说家属不许。她指出处方本上两周前多开了一瓶 0.25 毫克地高辛,那是她从来没申请过的。何医生说:"是顾太太打电话让开的。"她回到老宅,门口挤满了记者,方苒举着父亲的遗像:"五年了,你又害死一个。"

**EP06 批号** |第 5 天
方苒开着直播堵门,周曼琳在门里看戏。姜禾不辩解,对着镜头背出了方老师那瓶药的批号和生产日期:"这批药,我记了五年。"方苒愣住,举起手里一个旧药瓶:"我爸剩下的半瓶,我留了五年,就等着告你。"批号对得上。直播间的风向第一次分裂。窗边的顾念把窗帘攥出了褶。唐砚看完直播找到她:"两个死者,同一种药。你说巧不巧?"

**EP07 两千万** |第 6 天
顾承安单独找她,拿 2000 万现金换一份放弃声明。她真的拿起了笔,手机里是五年来每月给方家转 3000 块的记录。笔尖落下前,她翻到第三页,看见一行小字:"本人对顾怀山先生之死负有护理过失。"她把放弃书推了回去,顾承安撕了支票。夜里,老爷子贴着封条的卧室里有手电光,她推开门,一个黑影从阳台翻了出去。床头那根录音笔的充电线还插着,录音笔不见了。

**EP08 头七** |第 7 天
头七家祭,陆既明拆开第一封信:"五年前那批地高辛,不是你的错。是我签字,让你背的。"姜禾扶着桌沿才站住。顾念手里的茶杯磕响了碟沿。顾承泽马上接话:"爸糊涂了,这恰恰说明她三年给他洗了脑。"唐砚带着尸检初步结果进门:地高辛血药浓度超过治疗量四倍,另外还检出了地西泮。他问:"顾家谁负责给老爷子分药?"所有人都转过头看她。

**EP09 对不上** |第 7 天夜
她被传唤到刑警队,周曼琳在家里等着十二点。问询室里,她拿出药盒和照片,解释半片的切口。唐砚把药盒推回来:"你照片里周五是整片,药盒里是半片。你的照片和你的药盒对不上。"她第一次答不上来,地西泮从哪来的她更说不清。23:40,陆既明出现在刑警队,把一句话写进了执行记录:"依法传唤不属于自行离开。"周曼琳的算盘落空了。唐砚放她走之前说:"明天,我们去搜你的房间。"

**EP10 手铐** |第 8 天 |🔒 **付费卡点①**
警方在储藏间床板的夹缝里搜出一个地高辛空瓶,瓶身上全是她的指纹,她每天都在碰药瓶。周曼琳当着全家说:"人赃并获。"唐砚掏出手铐,扣上了第一只。姜禾说:"瓶子给我看一眼。只看一眼。"唐砚把证物袋举到她眼前。她盯住瓶底那张药房标签,脸色变了。
→ 停在她开口之前。

## 第二卷 · 陷(第 11–30 集 · 第 8–28 天)

**EP11 标签** |第 8 天
标签上印着"怀山药业职工药房",领药时间是老爷子死前 14 天下午 14:20。那天下午,她陪老爷子在医院复查,挂号单和医院监控都在。职工药房只认员工工牌。唐砚解开了手铐:"你还在名单上,但名单变了。"有工牌的顾家人只有三个:顾承泽、顾念、顾屿。顾屿脸色一白。

**EP12 打赌** |第 9 天
她进不了公司,于是去找顾屿:"你想证明是我,就帮我调领药记录。记录上要是我的名字,我当场签放弃书。"顾屿接了这个赌。夜里他用自己的权限调出记录,刷的是父亲顾承泽的工牌。截图发出去之前,他的手指停在了发送键上。

**EP13 借给谁** |第 10 天
顾屿告诉她记录"被系统清了"。她在顾屿手机屏幕的反光里看见了那张截图,没有拆穿,转身直接去公司找顾承泽:"十四天前,你的工牌领过一瓶地高辛。"顾承泽面不改色:"那天我的工牌,借给我太太了。"他真心以为是妻子干的。门外端着咖啡的周曼琳听见了这句话。

**EP14 夫妻** |第 10 天夜
周曼琳和顾承泽在卧室里对撕。她没领过药,可她知道自己往燕窝里放过什么,绝不能让警察查到厨房。她决定先下手,连夜逼何医生改口供,让他说姜禾问过"地高辛吃多少会出事"。门外的顾屿听见了"燕窝"两个字。

**EP15 那一天** |第 11 天
何医生的新口供到了唐砚手里,姜禾再次被叫去对质。她只问了一句:"你说我问你的那天,是几号?"何医生报的那天,她有医院陪诊记录,时间又一次救了她。离开时,她在何医生车上看到一份文件:《顾怀山认知功能评估报告》,委托人周曼琳。

**EP16 糊涂** |第 12–13 天
周曼琳亮出底牌:拿着这份评估报告起诉,说老爷子立遗嘱时已经没有民事行为能力,遗嘱无效。法院受理,遗嘱执行面临冻结。姜禾想起老爷子最后两个月白天总是犯困,为什么会犯困?她想到了尸检报告里的地西泮。

**EP17 二七** |第 14 天
二七,第二封信:"我书房第三排,《本草纲目》第三册。"全家都听见了。当晚,周曼琳、顾承安先后摸进书房,顾念"陪着"姜禾也来了。书是空心的,里面就是失踪的那支录音笔。周曼琳扑上来抢,两个人各攥一头,电池盖飞了出去。

**EP18 录音** |第 14 天夜
录音笔落在了姜禾手里。里面是三十天的语音日记,老爷子思路清楚,每一笔股权数字都背得出来,足以推翻"无行为能力"。他还说:"每晚喝了曼琳端来的燕窝,就犯困。"最后一条只有半句:"今天念念来看我,我问她二〇二一年……"然后传来开门声,录音停了。顾念坐在她身边,轻轻握住了她的手。

**EP19 工牌放在桌上** |第 15 天
陆既明把录音交给法院,评估报告的效力被打穿,周曼琳撤诉。顾承泽一个电话打给律所主任:换掉陆既明,否则怀山撤单。陆既明在会议室里把工牌放在桌上辞了职,以个人身份继续执行遗嘱。走廊里,姜禾第一次对他说"谢谢"。他说:"我是为了条款。"

**EP20 替罪** |第 16 天
"燕窝"曝光,周曼琳反手把锅扣给炖燕窝的张妈:"她炖的,她放的。"唐砚准备带走张妈。姜禾必须选:现在交出录音里另一段(老爷子听见厨房深夜有碾药声),就能救下张妈,但手里的底牌会提前亮出来。她交了。张妈被放回来,周曼琳却没倒,那段录音只有声音,没有拍到人。

**EP21 全江城最好喝** |第 17 天
张妈不肯作证,孙子的学费是周曼琳出的。姜禾没劝她,只给她放了一段录音。老爷子笑着说:"张妈的燕窝,全江城最好喝。"张妈在厨房里哭到发抖,答应四七那天当着全家开口。

**EP22 增发** |第 19 天
顾承泽召开临时董事会,拟定向增发,要把老爷子的 41% 稀释到 25% 以下,表决定在三七后第一天。遗产没过户,姜禾没有表决权,只能眼看着股份被稀释。

**EP23 三七** |第 21 天
三七,第三封信:"承泽给你的任何文件,都别签。我的表决权,从今天起交给你。"遗嘱附件生效,41% 的表决权由姜禾代为行使。一夜之间,顾承泽的增发案失去了多数。

**EP24 附件三** |第 22 天
姜禾第一次走进怀山药业的董事会,没人给她让座。顾承泽说:"护工也能当董事?"她不争座位,把增发方案翻到附件三:"新地高辛生产线的含量均匀度数据,和二〇二一年那批是同一个毛病。"满座哗然。质量副总顾念站起来:"她说得对,是我们的疏忽。"增发案以一票之差被否。

**EP25 留样** |第 22 天夜
顾念在停车场等她,向她道谢:"爸要是在,会骄傲的。"然后像是随口一问:"爸的信里,提没提过二〇二一年的留样?"姜禾说没有,但记住了这个问题。同一晚,顾承泽把她五年前的处分决定书群发给了所有董事。

**EP26 立案** |第 23–24 天
顾承泽的律师团找到方苒,帮她起诉姜禾,要求重审 2021 年案并追究刑事责任。一旦立案,就碰上了遗嘱里"被追究刑事责任"那条线。陆既明把条款摊在她面前:"立案不等于追究,但只差一步。"

**EP27 别给任何人** |第 25 天
姜禾私下约方苒,被泼了一脸咖啡。她没擦,只问:"你爸那半瓶药,还在你手里吗?别给任何人,包括我。"方苒愣住了。五年来,第一次有人让她把证据守住,而不是交出来。

**EP28 楼梯** |第 27 天
四七前夜,周曼琳撞见张妈往姜禾手里塞纸条,两人在后楼梯上拉扯,张妈滚下楼梯,昏迷不醒。周曼琳站在楼梯口,第一次慌了。唯一的证人倒下了。

**EP29 四七** |第 28 天 |🔒 **付费卡点②**
四七,第四封信:"如果我死了,是曼琳。"周曼琳当场失态,咬死说"爸糊涂了"。录音里没有她的脸,张妈躺在 ICU。唐砚问在场的人:"谁亲眼见过?"一片沉默。顾屿慢慢站起来,看着母亲:"那包药粉……"
→ 停在儿子说出口之前。

**EP30 我只放了安眠药** |第 28 天
顾屿说出三个月前的一个深夜,他看见母亲在厨房用擀面杖碾药片,倒进燕窝里。周曼琳被铐上。押出门时她回头冲姜禾喊:"我只放了安眠药!地高辛不是我!"姜禾知道她说的是真的:安定走的是燕窝,地高辛走的是药盒,两条路,两个人。

## 第三卷 · 杀(第 31–46 集 · 第 29–45 天)

**EP31 不结案** |第 29 天
尸检结束,老爷子的遗体火化,骨灰停在灵堂等七七下葬。唐砚想以周曼琳结案,动机、手段都有,也最省事。只要结案,姜禾的嫌疑就洗清了,可她把药盒拍在桌上:"她要老爷子糊涂了签字,人死了她什么都签不到。她最不想他死。"唐砚重新打开了卷宗。门外的顾屿听见了。

**EP32 维生素** |第 30 天
顾屿搬回爷爷的旧书房,第一次和姜禾同桌吃饭。睡前她照例吃一片维生素 B,翻过来一看,药片背面的刻痕不对,那是 0.25 毫克的地高辛。这一次,对方要的不是她走,是她死。她把药片收进证物袋,谁也没说,第二天照常下楼吃早饭,看着每个人的脸。

**EP33 债主** |第 31 天
顾承安的债主堵上门,催要 1800 万。她要是死在七七之前,遗产进家族信托,顾承安就能分到钱,他成了最显眼的嫌疑人。姜禾故意在饭桌上说出维生素的事,所有人都看向顾承安。他跳起来:"我连那是什么药都分不清!"

**EP34 午夜之前** |第 32 天
她去 ICU 看张妈,提到"药盒"两个字时,张妈的手指动了一下。回程路上,顾承安的债主把她的车截在离老宅两公里的地方。23:40,她弃车,冒雨往回跑。23:58,她刷开了门禁,陆既明撑着伞等在门口。

**EP35 一千八百万** |第 33 天
姜禾拿着债务记录去逼顾承安。他扛不住了,承认是他让债主吓她,但发誓维生素跟他没关系。她信了,他确实分不清药片。作为交换,他给了她一条旧线索:2021 年,他亲眼看见大哥和医院院长在老宅书房里签过一份文件。

**EP36 五七** |第 35 天
五七,第五封信:"二〇二一年那批地高辛的留样,我没让他们销毁。埋在念念八岁那年埋时间胶囊的玉兰树下。念念,帮她。"顾念哭着握住姜禾的手:"明天一早,我陪你挖。"凌晨三点,顾念的窗户亮着灯。观众看见了,姜禾没看见。

**EP37 玉兰树下** |第 36 天
两人天一亮就去挖。树下的土比别处松,顾念说:"昨晚下过雨。"姜禾低头看了一眼脚边干燥的石板路,没说话。铁盒里有一张八岁顾念画的画,还有一个贴着 2021 年批号的留样瓶。姜禾坚持送第三方检测,交给唐砚亲手送。

**EP38 合格** |第 38 天
检测结果出来了,含量 0.25 毫克,合格。如果 2021 年那批药是好的,那五年前错的就是她自己。方苒的律师同时拿到了这份报告。深夜,姜禾一个人坐在灵堂里,把一片药切了一遍又一遍,量自己的切口角度。

**EP39 撤权** |第 39 天
顾承泽趁她最低的时候出手,召开临时股东会,拿着合格报告和她的旧处分,要撤销她的代理表决权。顾念"为了家里"投了弃权,姜禾输了,丢了公司。陆既明对她说:"离七七还有十天。你现在走,丢掉的只是钱。"她没走。

**EP40 火** |第 40 天
午夜,储藏间起火,门从外面被抵死了。浓烟里,顾屿用灭火器砸开了门。她不肯离开烧过的房子,裹着一身烟灰睡在灵堂的地板上。门禁记录显示,她一步也没离开过。

**EP41 放火的人** |第 41 天
火场勘查结果出来,顾承安扛不住了,认了:债主逼他,他想把她吓走,门也是他抵的。唐砚带走了他。顾家倒下第二个人。可维生素那件事,他到最后都说不是他。

**EP42 八百万** |第 41–42 天
姜禾顺着顾承安给的线索,让顾屿说出父亲保险柜的密码。柜子里是 2021 年的和解协议:"医院认定药剂师姜禾配药错误,怀山药业补偿医院八百万。"签名是顾承泽。她盯着那个数字:药要是合格,凭什么赔八百万?玉兰树下那瓶留样是假的。

**EP43 六七** |第 42 天
六七,第六封信:"我埋的那瓶留样,瓶底刻了一个'禾'字。"送检的那瓶瓶底光滑,留样被调了包。从五七拆信到第二天清晨挖开,中间隔着一整夜,那一夜宅子里的每个人都有机会。全家开始互相撕咬,顾承泽的动机最重。

**EP44 刑拘** |第 43 天
唐砚在顾承泽的后备箱里找到了真留样瓶的半截封签,有人放进去的。工牌、和解协议、封签加在一起,顾承泽因涉嫌谋杀被刑拘。上车前,他看向妹妹:"念念,帮我找律师。"顾念说:"哥,我会的。"

**EP45 抽屉** |第 44 天
姜禾去看守所见顾承泽。他认了 2021 年的掩盖,也认了是他让她背的锅,但咬死自己没杀人:"那天工牌在我办公室抽屉里,我记不清谁进过我办公室。"临走前,他说:"你要是真想知道,查门禁。"

**EP46 门禁** |第 45 天 |🔒 **付费卡点③**
她调出两个关键夜晚的门禁记录:第 3 天夜里药盒被换回去的那一夜,还有第 35 天夜里留样被调包的那一夜。第 3 天夜里,顾承泽 22:10 离开,第二天 9 点才回来,顾屿和顾承安都在外面通宵;第 35 天夜里,顾承泽在上海出差,周曼琳在看守所,顾承安在赌场,顾屿在医院陪张妈。两个夜晚都在宅子里的,只有一个人。她抬起头,顾念站在门口,端着一杯热茶:"还没睡?给你泡了杯茶。"
→ 停在她伸手接茶的那一刻。

## 第四卷 · 七七(第 47–60 集 · 第 45–49 天 · 尾声)

**EP47 一杯茶** |第 45 天夜
她接过茶,笑了笑:"太烫了,放凉再喝。"顾念走了,她把茶倒进一个样品瓶,把杯子洗干净摆回原处。第二天一早,顾念看见空杯子,笑了。她只告诉了陆既明。陆既明说:"你没有一样证据能直接指向她。"茶验出来是干净的。顾念只是在试她,她过关了。

**EP48 原始记录** |第 46 天
她去看守所和顾承泽做交易:"我能证明你没杀人。你给我 2021 年出厂检验的原始记录。"顾承泽交出了一个连妹妹都不知道的档案服务器管理员密码。原始记录显示,那批药的含量是标示量的 198%,放行单上签的是顾念的名字。她明知道,还是签了。动机找到了,可这还不能证明她杀了人。

**EP49 凌晨两点** |第 47 天晨
她去看守所见周曼琳。周曼琳为了儿子开了口:老爷子死的那天凌晨两点,她下楼去倒燕窝渣,看见顾念从爸房里出来,手里拿着药盒。她一直没说,以为顾念也在给爸下药,图的跟她一样。

**EP50 醒** |第 47 天
张妈醒了,在唐砚面前作证:"那天凌晨两点,念念小姐在老爷子屋里分药盒,一格一格的,分了很久。"病房门口,捧着花的顾念看见了守在门口的警察,转身走了。

**EP51 反咬** |第 47 天夜
唐砚收到一个匿名包裹,里面是一份"2021 年原始配药记录",签名是姜禾,写着她发出的是 0.5 毫克。附了一封信,说留样是姜禾自己调包的,为的是栽赃顾家。张妈有颅脑外伤,证词能不能用被打上了问号,案子又倒了回去。

**EP52 半瓶药** |第 48 天晨
姜禾去找方苒,把第一封信、八百万的和解协议、198% 的原始记录全摊在她面前,只求一样东西:她父亲留下的那半瓶药。方苒问:"你凭什么让我信你?"姜禾说:"你不用信我。你自己拿去验,实验室你挑,我不碰。"

**EP53 一百九十八** |第 48 天午后
方苒挑的实验室出了结果:标示 0.25 毫克的药片,实测 0.49 毫克。方苒坐在马路牙子上看完报告,第一次叫了她一声"姜药师"。五年前的罪名洗清了。姜禾拨给唐砚的电话还没接通,医院先打了进来:张妈被"家属"办了出院,人不见了。

**EP54 第四十八夜** |第 48 天夜
顾念打来电话:"张妈在旧厂房,你一个人来。十二点前回不去,你就什么都没有了。"23:10,姜禾站在门禁前,对陆既明说:"如果我出了这道门——"陆既明说:"按条款,遗赠失效。"她拨通他的电话,不挂断,揣进口袋,走出了门。门禁记录:23:12,离开。

**EP55 旧厂房** |第 48 天夜
旧厂房里,张妈瘫在地上,脉搏很慢,顾念给她喂了地高辛。姜禾跪下数脉搏,从护工包里翻出一直带着的阿托品。顾念第一次失控:"爸最后一个月,天天夸你。他问我,为什么念念就做不到小姜那样。"远处钟声敲过十二点,顾念说:"过了十二点,你什么都没有了。"姜禾手上没停:"我本来就什么都没有。"

**EP56 镯子** |第 49 天凌晨
唐砚和陆既明顺着那通没挂的电话赶到。唐砚亮出职工药房监控修复出的一帧画面:领药人的袖口滑下去,露出一只翡翠镯子,就是此刻顾念腕上那一只。加上口袋里那通电话的全程录音,顾念被铐上,张妈被抬上救护车,活了下来。

**EP57 七七** |第 49 天
七七,老爷子的骨灰入土。灵堂里,陆既明宣布:姜禾第 48 天夜里离开了老宅,遗赠条件未满足,全部财产转入顾氏家族信托。几个远亲松了口气。陆既明拆开第七封信:"家族信托的受托人,我写的是姜禾。这钱从来不是给你的,是请你替顾家把账还了。"全家为了赶她走斗了 49 天,结果她走不走都一样。

**EP58 召回** |第 52 天
姜禾以受托人身份召开发布会,宣布怀山药业全线召回地高辛。她当众念出 2021 年受害者的名单,第一个名字是方老师。顾屿投票站在她这边,顾承泽在台下签了辞职书。

**EP59 那张画** |一个月后
看守所探视窗,姜禾把玉兰树下铁盒里那张画贴在玻璃上。八岁的顾念画了一个穿白大褂的小人,旁边写着:"我长大要做爸爸那样救人的药。"顾念隔着玻璃看了很久,把脸埋进了手里。

**EP60 七格** |三个月后
社区药房,姜禾重新穿上了药剂师的白大褂。她把一片药切成两半,装进新的七格药盒,递给一位老人。方苒带着女儿来取药。队伍末尾站着陆既明,手里捏着一张挂号单。"拿什么药?""没病,排队。"柜台后面的架子上摆着那只旧药盒,七格都空了。

---

## 制作与节奏档案

- **制作形态**:真人实拍竖屏。主场景是顾宅:门口台阶、灵堂、储藏间、老爷子卧室/书房、厨房、后楼梯、后院玉兰树。另有殡仪馆、刑警队问询室、公司会议室、看守所探视室、旧厂房。公开大场面只有拆信家祭(7 次,同一灵堂)和董事会(2 次),其余都是半公开的小场。
- **贯穿道具,版本必须能分清**:七格药盒(周五格整片/半片两种状态)、切药器、地高辛空瓶(瓶底职工药房标签)、录音笔、七封信(信封编号)、留样瓶(有"禾"字的和没有的)、方苒的半瓶药、顾念的翡翠镯。
- **节奏档案(已接受,已写入 `short-drama.json`)**:首钩不晚于第 5 秒;情绪触点间隔不超过 30 秒;每集至少一次有对手参与的反转;集尾停在峰值上;下一集开头先接上一集最后一拍;VO 占比不超过 0.3(本剧基本不用旁白);目标平均镜长 2.5 秒;近景类镜头占比不低于 0.45;第一个大爽点放在第 1 集(遗嘱反转)。

创作者决策/rhythm-profile.jsonl 非文本文件,在 GitHub 上看

剧集/EP001/剧本.md 第 1–3 集剧本 1,394 字
# EP001 出殡

## EP001-SC001 外 · 顾宅正门台阶 · 雨晨

白幡和挽联在雨里贴着门柱。一只旧行李箱从台阶顶上滚下来,砸在第三级台阶上摔开。护工服、毛巾散进雨水里,一个塑料七格药盒在台阶上弹了两下,滑向水沟。

姜禾一身湿透的黑衣,从台阶底下扑过去。她先捡的是药盒,没管衣服,把它从水沟边捞起来,翻过来看——七个小格的盖子都还扣着。

周曼琳站在台阶顶上,佣人小莲替她打着伞,胸口别着白花。

周曼琳:老爷子的东西,和你的东西,一起带走。

她把一个厚信封扔下来,信封落在姜禾膝盖边的水坑里。

周曼琳:三年工资,一分不少。

姜禾没去捡信封。她用袖口擦干药盒,拇指按着每一格的小盖子挨个压实。

姜禾:让我送他到火化场。送完我就走。

周曼琳:你也配?

顾屿斜倚在门框上,手机举着在拍。

顾屿:妈,跟一个护工费什么话。

一辆黑色轿车停在台阶下。陆既明撑伞下车,拎着公文包上台阶,在姜禾身边停了一步。

陆既明:遗嘱现在宣读,所有受益人必须到场。(看向姜禾)姜禾女士,您在名单上。

周曼琳脸上的笑停住了。

## EP001-SC002 内 · 顾宅灵堂 · 雨晨

遗像上的顾怀山眼神很硬。门口签到桌上摆着吊唁簿,陆既明进门时顺手把车钥匙压在了吊唁簿上。

顾承泽坐在第一排,顾承安在旁边刷手机,顾念坐在最边上,腕上戴着一只翡翠镯子。顾屿抱着胳膊站着。姜禾站在最后面的门边,头发还在滴水,手里攥着药盒。

陆既明当众拆开密封的信封。

顾承泽:陆律师,灵车在外面等着。

陆既明:老先生交代过,必须在出殡前宣读。

陆既明(照本宣读):本人名下怀山药业百分之四十一股权、顾氏老宅、全部存款与理财,合计约六十二亿元——

顾承安停止了刷手机。

陆既明:全部遗赠给姜禾女士。

一屋子的人同时转过头看向门边。姜禾攥药盒的手指收紧了。

顾承安(笑出一声):护工?

周曼琳站起来,直直走到姜禾面前。

周曼琳:你给爸灌了什么?

她扬起手要扇,顾念先一步挡在中间,抓住了她的手腕。

顾念(很轻):嫂子,爸还在外面车上。

周曼琳甩开手。陆既明翻过一页。

陆既明:附加条件。姜禾女士须在顾宅居住至七七之日,以门禁记录为准。期间如自行离开、被追究刑事责任或死亡,遗赠失效,全部财产转入顾氏家族信托。

顾承泽慢慢理平袖口,这是全场第一个松下来的人。

顾承泽:四十九天。

顾承泽起身,掏出手机往走廊走。

顾承泽:车不能再等了,你们继续。

## EP001-SC003 内 · 顾宅灵堂 · 雨晨

陆既明翻到最后一页,停了一下。

陆既明:最后一页,是老先生的亲笔。

他把纸转过来对着众人。

[画面文字] 遗嘱末页手写附言:我不是病死的。别让他们烧了我。——顾怀山

陆既明:我不是病死的。别让他们烧了我。

没有人出声。顾念放在膝上的手攥住了裙子。

走廊里传来顾承泽压低的声音。

[OS] 顾承泽:……火化提前。车一到,直接进炉,不用等家属。

姜禾猛地转向窗外。雨里,灵车的尾灯亮了,车正往大门外开。

她的目光落到签到桌上那串车钥匙上,又抬头看向陆既明。陆既明迎着她的视线,没有说话,低头把遗嘱合上了。

姜禾一把抓起钥匙,冲进了雨里。

[连续性] 姜禾持七格药盒(周五格未动)与陆既明的车钥匙离开顾宅;灵车已出大门,开往殡仪馆。
剧集/EP002/剧本.md 第 1–3 集剧本 1,163 字
# EP002 炉前

## EP002-SC001 内 · 东郊殡仪馆火化间 · 日

[转场] 灵车的尾灯在雨里一闪,直接切到炉口的火光。

炉门升起,橘红的火光照了出来。传送台载着灵柩,一寸一寸往炉口送。

一个湿透的身影冲进来,挡在炉门和灵柩之间,后背对着火,张开双臂。是姜禾,她手机还贴在耳边。

姜禾(对手机):对,东郊殡仪馆,三号炉,现在。

她把手机塞回口袋。

火化工(拍停传送台):疯了你!让开!

姜禾:有人报了案。你现在烧,就是毁灭证据。

火化工的手悬在按钮上,看向门口。顾承泽带着殡仪馆主任和两个保安走了进来。

顾承泽:她不是家属。(对主任)手续齐全,继续。

主任冲保安点头。两个保安一左一右架住姜禾往外拖。她死死抓住传送台的铁栏,指头被一根一根掰开。

姜禾(冲顾承泽):他写了他不是病死的,你也听见了。

顾承泽:我听见的,是一个糊涂老人写的字。(对火化工)开。

[OS] 顾屿:停。

顾屿站在门口,身后跟着顾念。他走进来,看了一眼灵柩,又看向被架着的姜禾。

顾屿:爸,现在烧了,她这辈子都洗不干净了。

顾承泽:你什么意思?

顾屿(盯着姜禾):故意害死立遗嘱人的,遗赠作废。验。要是验出来是你,你一分钱都拿不到。

姜禾挣开保安的手,站直了。

姜禾:验。

两个人说的是同一个字,图的却正相反。顾承泽看看儿子,又看看灵柩,没再出声。

殡仪馆主任(擦汗):家属意见不一致,这炉……我们不能点。

火化工按下按钮,炉门缓缓落下。

[SFX] 门外警笛由远及近。

## EP002-SC002 内 · 东郊殡仪馆火化间 · 日

唐砚亮着警官证走进来,身后两名警员开始往灵柩上贴封条。

唐砚:谁报的警?

姜禾:我。

唐砚:遗嘱的受益人?

姜禾:也是我。

唐砚把她从头看到脚,湿衣服,手里攥着药盒。

唐砚:遗体暂停火化,送去尸检。(停一下)你是报案人,也是第一嫌疑人。今晚待在顾家,哪儿也别去,随叫随到。

顾念在一旁轻轻扶住了门框。

## EP002-SC003 外 · 顾宅大门 · 雨夜

[画面文字] 手机屏幕:23:41

姜禾站在铁门前,在门禁键盘上按下一串密码。

[SFX] 短促的错误提示音。键盘亮起红灯。

她又按了一遍,还是红灯。

[OS] 周曼琳:密码改了。

声音是从门边的对讲机里出来的。姜禾凑近对讲机。

姜禾:警察让我今晚待在顾家。

[OS] 周曼琳:那你就在门口待着。(轻笑)陆律师说了,以门禁记录为准。过了十二点,就算你自己走的。

[SFX] 对讲机挂断。

雨水顺着铁栏往下淌。姜禾低头看手机。

[画面文字] 手机屏幕:23:42

[连续性] 灵柩已被警方封存送检;姜禾被锁在顾宅门外,仍持七格药盒,距零点十八分钟。
剧集/EP003/剧本.md 第 1–3 集剧本 1,288 字
# EP003 七格

## EP003-SC001 外 · 顾宅大门与门卫亭 · 雨夜

门禁键盘的红灯在雨里一闪一闪。

[画面文字] 手机屏幕:23:52

姜禾拍着门卫亭的玻璃。门卫老周捧着保温杯,摇了摇头。

门卫:太太交代过了。

姜禾退开一步,拨出一个号码,开了免提。

姜禾:唐警官,你让我今晚待在顾家,他们不让我进。

[OS] 唐砚:让门卫接电话。

她把手机贴到门卫亭的窗口上。

[OS] 唐砚:她是案件相关人,我要求她今晚在这个地址。你不开门,明天你来队里解释。

老周看了一眼主宅亮着灯的二楼,放下保温杯,按下了开门键。铁门往两边滑开。

[画面文字] 门禁屏:23:59 姜禾 进入

## EP003-SC002 内 · 顾宅门厅 · 雨夜

姜禾浑身滴着水走进门厅。周曼琳穿着睡袍站在楼梯上,手指勾着一大串钥匙。

周曼琳:进来可以。住哪儿,我说了算。

她摘下一把钥匙扔下来,钥匙落在姜禾脚边的地砖上。

周曼琳:储藏间。这屋里每把锁的钥匙,都在我手上。

## EP003-SC003 内 · 顾宅储藏间 · 夜

一间窄屋,架子上堆着旧药材箱。折叠床上没有床垫,只剩一块光床板。头顶亮着一只灯泡。

姜禾把一把椅子斜着卡在门把手底下,坐到床板上,打开七格药盒。格子上印着"一二三四五六日"。周一到周四是空的。

她打开周五那格,里面是两片完整的白药片。再打开周六,是两个半片,切口斜斜的,很齐。

她把一个半片和一个整片并排放在掌心,又从包里摸出自己的切药器,比着那道斜口看了看。

姜禾(低声):一天半片。(看向两片整片)这是四倍。

她举起手机,闪光灯一亮,拍了一张。

[SFX] 敲门声。

她啪地合上药盒盖,椅子跟着晃了一下。

[OS] 顾念:是我,念念。

姜禾挪开椅子。顾念抱着一床叠好的被子,端着一碗汤,腕上的翡翠镯子碰在碗沿上,叮地响了一声。

顾念:嫂子那个人,你别往心里去。先喝口热的。

她把汤放在架子上,转身去铺被子。床板上,药盒周五那格的小盖子没扣紧,又弹开了一条缝。顾念的视线在那条缝上停了一下。

顾念:这是爸的?

姜禾:嗯。

顾念把被子在床板上一点点抹平。

顾念:明天交给警察吧。我陪你去。

她走了。姜禾重新卡好椅子,把药盒攥在手里,背靠着墙坐下。那碗汤在架子上一点点凉了,她一口没动。她的头一点一点往下垂。

## EP003-SC004 内 · 顾宅储藏间 · 晨

高窗透进来一线灰白的光。姜禾猛地惊醒,手里是空的。

药盒落在被子上。她一把抓起来,打开周五那格。

里面是两个半片,切口斜斜的,很齐。

她愣住了,抓过手机翻出昨晚的照片。照片上,周五那格里明明是两片整片。

她抬头看向门口。卡在门把手下的椅子被挪开了半尺,门虚掩着,留了一道缝。

她冲过去拉开门。走廊空荡荡的,一直通到尽头的灵堂。烛火晃了一下,遗像上的顾怀山正对着她。

[连续性] 七格药盒周五格现为两个半片,与手机照片(两片整片)不符;储藏间门在夜里被人从外面推开过,椅子位移约半尺;那碗汤仍在架子上,未动。

输入/rhythm.jsonl 非文本文件,在 GitHub 上看

过程

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

第 1 轮

输入:
/short-drama 我要写一部短剧,要求在 premise.md 里。

思考

Bash List workspace and read premise

输入

cd "$PWD"; ls -la; cat premise.md 2>/dev/null; ls .claude/skills

返回

total 8
drwxr-xr-x  4 user  wheel  128 Oct 17 22:33 .
drwxr-xr-x  3 user  wheel   96 Oct 17 22:33 ..
drwxr-xr-x  4 user  wheel  128 Oct 17 22:33 .claude
-rw-r--r--  1 user  wheel  244 Oct 17 22:33 premise.md
# 001 · 开放题

写一部竖屏短剧。

- 篇幅:全剧 60 集,每集 1–2 分钟
- 交付(写成文件,放在当前目录):
  1. 主要人物小传
  2. 60 集分集大纲,标出付费卡点
  3. 第 1–3 集完整剧本
short-drama
short-drama-assets
short-drama-develop
short-drama-edit
short-drama-image-prompts
short-drama-knowhow
short-drama-novel-analyze
short-drama-produce
short-drama-review
short-drama-storyboard
short-drama-video-prompts
short-drama-write

思考 2 秒

Bash Read develop and write skill instructions

输入

cd .claude/skills; cat short-drama-develop/SKILL.md; echo ------; cat short-drama-write/SKILL.md; echo -----; ls -R short-drama-develop short-drama-write short-drama/references | head -100

返回

---
name: short-drama-develop
description: 将中文小说、短剧或漫剧想法、梗概、改编材料、已有系列笔记或多集完整剧本发展成可追溯的改编方案、戏剧方向、创作简报、导演阐述、故事引擎与分集地图,并按题材与制作形态(画风)选择写法。用户提出“导入小说做短剧”“从多集整稿生成/补分集地图”“开发短剧/漫剧”“做故事设定/系列大纲/分集规划”“写导演阐述”“这个题材怎么写”“定画风/制作形态”“把这个点子变成短剧”或需要梳理人物冲突与集间交接时使用;已有单集剧本可直接进入写作、资产或审查流程,不强制补开发文件。
license: MIT
---

# 短剧开发

把创作者的意图变成能持续制造**选择、代价与状态变化**的故事系统,保留创作者对题材、结局和尺度的选择。流行套路只能作为候选方法。

## Quick Start

离线验证多集整稿的精确索引、切片和源文件变更检测:

```bash
python3 {技能目录}/scripts/selftest.py
python3 {技能目录}/scripts/episode_intake.py index <多集整稿> --out <episode-intake-index.json>
```

## 开始前

本技能可独立安装和执行。先读取用户明确提供的材料与本任务的直接输入;若当前目录是
`short-drama` 项目且项目工具可用,可以读取 `status` 并使用其发布生命周期。缺少 core
或其他技能时,仍可基于现有输入完成开发。[阶段契约](references/stage-contract.md) 给出
本阶段边界、制作形态输入与规则表,无需读取其他技能的文件。

## 先判断入口

1. **只有想法、题材或情绪目标**:完成方向探索,再建立创作简报与故事引擎。
2. **已有梗概、小说、改编材料或系列笔记**:保存来源并先列出已承诺事实、可改范围、
   来源片段与待确认项。长材料先做语义分段、功能账本和候选分集,不用正则人名/名词命中
   直接发布剧集或资产;不要偷换原意。
3. **方向已定,只需规划分集**:读取既有简报与引擎,直接制作或修订分集地图。
4. **已有单集剧本**:不要为了流程完整而虚构开发材料。写/改剧本交给 `$short-drama-write`;拆资产或后续制作可从相应技能直接进入。
5. **已有多集整稿,要生成或补分集地图**:保留原文件,只加载
   [多集整稿接入与断点续跑](references/multi-episode-intake.md)。让 Agent 按文件实际结构决定
   边界与本轮批次;工具只做精确索引、单集切片、校验和续跑,不代写创作判断。

信息足够时直接工作。只有会改变主角、冲突引擎、结局承诺或改编边界的缺口才需要提问。

## 每次执行

### 1. 锁定创作者契约

读取创作者输入和已接受文件,区分:

- 不可改的事实、主题、角色与结局承诺;
- 可探索的空白;
- 形式约束与制作边界;
- 目标观众反复能获得的情绪、信息或权力回报。

新项目复制 [creative-brief.md](assets/creative-brief.md)。若改动已接受事实,先展示语义差异与下游影响,不直接覆盖。

### 2. 探索真正不同的方向

方向未定时,提出少量**机制不同**的候选:改变主角策略、对抗来源、代价或持续冲突方式,而不只是换标题、职业和措辞。方向明确时直接深化,不为凑选项制造伪差异。

每个候选都说明:戏剧承诺、主角追求、对抗机制、反复回报、可升级的状态、长线终止条件、主要制作负担。让创作者选择或组合,并记录取舍理由;未选方案不进入既定事实。

需要深化戏剧承诺或冲突机制时,读取 [story-craft.md](references/story-craft.md)。题材已经确定时,可从
[genre-cards.md](references/genre-cards.md) 按索引取**一张**题材卡,用来校准该题材更常用的
压力来源、场面颗粒与制作负担;它是可被创作者一句话覆盖的参考,不替代方向选择,也不进入交付物。

若设定里主角带着一段已经发生过的经历,或获得了一套外部授权的能力,那是叠加在题材之上的
**前提装置**,另读 [premise-devices.md](references/premise-devices.md)——装置取消阻力,
必须先给它边界与代价。装置不替代题材卡,也不为它单独建题材。

### 3. 建立故事引擎

复制 [story-engine.md](assets/story-engine.md),写清:

- 压力如何出现,主角通常如何应对;
- 对手或系统如何反制,主角为何不能轻易退出;
- 每轮冲突改变什么,而不是怎样重复得更响;
- 人物各自的目标、筹码、底线和关系压力;
- 哪种人物转变或事实揭开会终结这个引擎;
- 视觉、声音、场景规模和内容边界。

连续剧、长篇改编或人物纵向变化较重时,再读取
[serial-character-and-memory.md](references/serial-character-and-memory.md):先建立只供
作者决策的前史储备,选择旧策略开始付出代价的叙事切入窗口,再记录人物被捍卫的
信念、压力测试、信息权限和跨集记忆。不要把前史储备直接倒进首集对白。

### 4. 把系列运动落到分集

读取 [episode-design.md](references/episode-design.md),再复制 [episode-map.jsonl](assets/episode-map.jsonl)。每一集记录进入状态、开场、当集追求、阻力、方向性转折、当集结果、信息释放、出去的压力以及下一集必须继承的事实。

先保证每集产生局部戏剧结果、相邻集能精确交接,再讨论外部压力/情感负荷的双轨
节奏。第 1 集入口先比较收益入口与冷开;改编项目先读原著分析的爽点表,把高光排到观众
最早能拿到的位置。集数、钩子类型、是否反转和高潮位置由创作者与项目决定。

制作形态一定下,就按分集设计里的默认值提出项目节奏档案,写进创作简报交创作者接受;
接受后由 `$short-drama` 写入 `creator_authority.rhythm_profile`。

### 5. 做所有者检查并交接

在提交预览前检查:

- 引用的集、铺垫和兑现记录可找到,未决项被明确标记;
- 候选确实改变机制,选定方向贯穿简报、引擎与分集地图;
- 每次升级能指出权力、信息、关系、暴露、资源、时间或代价的变化;
- 每集先兑现一部分当集承诺,再留下具体的决定、危险或问题;
- 改编项目保留核心人物的立场、核心关系和主线,创作者已接受的改动除外;原著没有的新增内容都登记为 `add`,并列在简报里;
- 没有把格式偏好冒充普遍规律。

这些是所有者自检,不是终审。展示创作者可读的新增/修改摘要,请创作者接受后再作为下游来源;
需要质量结论时,把 `$short-drama-review` 作为后续单独请求,优先由未参与当前版本创作的 reviewer 执行。

若项目需要导演阐述,本技能只产出 `项目开发/director-brief.md` 候选,并标明它准备
写入的 `visual_direction` / `production_profile` 语义差异。创作者接受后,由
`$short-drama` 路由把选择提升到 creator authority;开发技能不直接改写该权威配置。

## 规则分级

- **`structural_invariant`**:本地可证明的引用、ID、显式状态矛盾;可由校验器阻断。
- **`reviewed_invariant`**:升级是否真实、承诺是否兑现等语义义务;由 reviewer 引用证据判断。
- **`craft_default`**:通常有帮助的做法;创作者说明理由后可覆盖。
- **`taste_option`**:钩子、弧线、视角、结局气质等选择;不得单独阻断。

不要用固定的情节点、转折时刻、篇幅比例或数量配方替代因果判断;节奏数值只以创作者接受的
项目节奏档案出现。

## 产物与边界

本技能只拥有:

- `项目开发/creative-brief.md`
- `项目开发/story-engine.md`
- `项目开发/director-brief.md`(项目需要时;仅为 creator authority 候选)
- `项目开发/adaptation-map.jsonl`(长材料改编时;只保留输入 locator/span、
  去引用的功能摘要、候选去向与未决项,不复制原文;例见
  [adaptation-map.example.jsonl](assets/adaptation-map.example.jsonl))
- `项目开发/series-arc.json`(项目需要时)
- `项目开发/episode-intake-index.json`(多集整稿接入时;可重建的机械索引,不是创作事实)
- `项目开发/episode-map.jsonl`

它不写场景动作与台词,不拆资产,不写图片/视频提示词,不生成媒体,也不签发终审结论。剧本语义由 `$short-drama-write` 接管。

## 按需加载

- **承诺、引擎、人物压力、升级与铺垫兑现**:[story-craft.md](references/story-craft.md)
- **分集契约、因果节拍、集间交接、首集入口、门槛集与项目节奏档案**:[episode-design.md](references/episode-design.md)
- **已有多集完整剧本/散稿,要避免整稿进入上下文并可中断续跑**:
  [multi-episode-intake.md](references/multi-episode-intake.md)
- **人物驱动力、前史与切入、跨集变化、信息权限、双轨节奏与恢复记忆**:
  [serial-character-and-memory.md](references/serial-character-and-memory.md)
- **有原材料、需要按爽点压缩、提前或冷开后文、合并人物场景、把信息视觉化**:
  [adaptation-craft.md](references/adaptation-craft.md)
- **创作者提供对标作品、样例剧本或提示词,希望学习机制而非仿写表达**:
  [creative-reference-intake.md](references/creative-reference-intake.md)
- **单元故事里同一套机制被反复运行,或中段开始重复、越写越薄**:
  [mechanism-loop.md](references/mechanism-loop.md)
- **需要区分揭示、反转、回报和钩子,或按题材选压力机制**:
  [reveal-reversal-payoff.md](references/reveal-reversal-payoff.md)
- **按题材选择冲突推进方式、设计开场或规划集尾钩子时的定性案例方法**:
  [genre-and-hook-playbook.md](references/genre-and-hook-playbook.md)
- **已确定题材,需要该题材更常用的压力、场面颗粒、钩子取向与制作难点**:
  [genre-cards.md](references/genre-cards.md)(索引与召回规范;一次只读一张卡)
- **主角带着已知结果开局,或获得外部授权的能力**:
  [premise-devices.md](references/premise-devices.md)(装置层,叠加在题材卡之上)
- **起草项目级视觉方向与生产规则(导演阐述)**:
  [director-brief-craft.md](references/director-brief-craft.md)
- **本阶段拥有什么、继承什么、不越权什么**:[stage-contract.md](references/stage-contract.md)
------
---
name: short-drama-write
description: 编写或修订可拍摄的中文短剧、漫剧单集 Markdown 剧本,也负责保留作者原文并规范化现成剧本。用户提出“写/改一集短剧”“把大纲写成剧本”“优化场景/对白”“去模板感”“去 AI 味润色”“续写下一集”或提供剧本要求进入后续制作时使用;不负责资产、分镜、媒体提示词或终审。
license: MIT
---

# 短剧写作

把单集意图写成可表演、可拍摄、会改变故事状态的 `剧集/<EP>/剧本.md`。

## Quick Start

只维护一份剧本 Markdown,不另建 episode card、beats、block index、录音表、QA 或接受记录。
一级标题使用 `# EP001 集名`,场景标题使用 `## EP001-SC001 内 · 地点 · 时间/天气`。
对白写 `角色(可选表演提示):台词`;生产标签使用 `[VO]`、`[OS]`、`[SFX]`、`[画面文字]`、
`[连续性]`、`[转场]`。不要把含冒号的动作叙述误写成对白。

## 入口

- 有分集规划:读取本集进入状态、目标、转折、回报和交接事实。
- 只有想法/大纲:在上下文形成最小单集契约和因果节拍,再直接写剧本。
- 已有剧本:保留作者语言,只做用户点名的定点修订。
- 非规范文本要进入制作:保留原文,只做必要的场景、动作、对白和生产标签规范化。

开发大纲和长篇分析都是可选上游;当前材料足够时直接写。

## 工作流

1. 锁定本集承诺的观看体验、谁现在要什么、阻力、当集兑现和退出状态。
2. 识别本集实际承担看点的机制:主打艰难选择时检查两边价值,判断转折依赖争议证据时检查证明边界,突出精确死线时检查动作容量,题面限定次数、轮次、呼吸或节拍时检查各单位是否在边界内完成所需状态。输入没有要求的机制不强加;已经作为主要看点的机制,要真正改变行动、关系或结果。
3. 在上下文排“因为—行动—结果—下一股压力”,不落盘节拍表;让物件、对白、沉默、空间或声音按本集题材承担必要工作,不预设某一种载体。
4. 逐场确定不可替代的功能、可见变化与场尾状态;由争取或冲突组织的场景再明确焦点议程与阻力。承担主要戏剧功能的配角要有自己的策略,事务性或环境性角色保持简洁即可。
5. 把动作、对白、画外音、声音事实和画面文字写入同一份剧本。
6. 用户要求整集就写完整集,场景批次自动续跑。
7. 交稿前静默反查:只读剧本,观众能否接收到本集承诺,人物行动是否有因果,题材语气是否一致;再对本集确实使用的选择、证据、有限单位或精确死线做专项检查。自检若增添了输入没有要求的机关,撤去新增机关。
8. 局部修订保留无关段落;明确问题直接修正,会改变剧情走向的选择交给用户。

## 写作要求

- 先服从输入已经给出的事实、`必须/禁止`、题材观看契约和退出状态;本技能的审查项与手艺默认只帮助实现这些要求,不能反过来补造题面没有的精确数字、记录、资源、程序、关系或机关。
- 每场改变信息、权力、关系、情绪、物理状态或风险;无变化的场删掉或合并。核心阻力的转向要有可追溯的事实、筹码、权限、代价或人物行动,不能只靠对手停止反应。
- 对白必须在争取、回避、试探、逼迫或重新定义关系;用可见、可听、可触的行为表现状态,不用解释替代行动,也不把已经演清的机制再说一遍。
- 自己写的对白初稿,写完读一遍,删掉不承担动作或冲突的句子;留下的每句都要能转成演员的一个动作或表情,转不成的删掉或改成动作。创作者带来的原文不按这条删。
- 全集第一拍应能独立形成钩子,见[开场第一拍](references/script-craft.md#81-开场接住进入状态)。
- 观众理解当前行动所必需的赌注要进入剧本,但载体服从题材;选择、证据、有限单位、精确死线等专项规则只在输入真正以它为发动机时启用,并按需读取[剧作手艺](references/script-craft.md),普通决定、普通物件和模糊时间压力不升级成同一套机关。
- 压缩过程时只保留会改变策略、关系、风险或结果的节点。资源与外部反应必须来自输入或前文建立,且不能替人物完成最难的戏剧行动。
- 承担主要冲突的角色要保持相称的目标、判断或策略;事务性、环境性角色保持简洁,不为检查表硬加秘密、反转或人物弧。
- 已建立的代价、不可逆后果、关键持物、空间和知识状态要进入可追溯的退出状态;结尾可推进、留白、反讽、安静收束、形成余韵或让既有动作变义,不强制追加外部事件;已接受节奏档案的 `end_on_peak` 为 `true` 时,停在峰值上,不接余韵(见[项目节奏档案](references/script-craft.md#65-项目节奏档案))。
- `[连续性]` 只交接由前文动作已经建立、又容易在下游丢失的状态;不能用作者标签证明镜头外从未发生某事,也不复述正文已清楚呈现的结果。
- 交稿前静默检查冗余:是否增加了输入没有要求的精确数字或记录链,是否用标签/对白重复动作,是否在回报后堆了多个同方向后果。删去没有新作用的内容,保留本集需要的选择、证据、时限、人物与连续性事实。
- 输入给出目标时长时按真实表演、动作和停顿通读压稿,先删重复验证、解释和同义收尾;不用统一字数、镜头数或节拍数填模板。
- 用户原文优先;“去 AI 味”是定点修订,不抹平作者个性。

## 按需知识

默认只读本 SKILL 和直接输入。出现下列明确信号时,在写正文前读取对应知识;同一输入有多个不同问题
可以分别读取,但不遍历无关引用:

- 阶段边界与规则分级:[阶段契约](references/stage-contract.md)
- 场景标题、对白和生产标签语法,或把创作者带来的现成剧本[规范化](references/screenplay-format.md#7-现有文本的规范化入口):[剧本格式](references/screenplay-format.md)
- 项目特有的制作稿方言:[制作格式方言](references/production-format-dialect.md)
- 输入含[核心选择](references/script-craft.md#35-把一拍写成艰难选择时两个方向都要活着)、[有限次数/轮次/呼吸/节拍](references/script-craft.md#64-有限单位按完成状态计数)、[精确倒计时](references/script-craft.md#63-倒计时先算动作不要只写数字)或[会改变人物判断的关键物证](references/script-craft.md#53-证据先改变判断再改变关系):[剧作手艺](references/script-craft.md)
- 过去关系必须通过对白进入,或关键人物容易只剩说明功能:[对白手艺](references/dialogue-craft.md)
- 声源、留白与 sound bridge:[场景声音戏剧](references/scene-sound-dramaturgy.md)
- 同一故事义务的不同可拍实现:[可替代实现](references/substitutable-realization.md)
- 长单集跨上下文时的最小交接:[场景交接摘要](references/scene-handoff-capsule.md),只留在上下文
- 本集要用 `[VO]` 或内心独白交代信息,或有痛点要交代:[能演的不说](references/script-craft.md#44-能演的不说vo内心独白与痛点)
- `short-drama.json` 里有 `status` 为 `accepted` 的 `creator_authority.rhythm_profile`:[项目节奏档案](references/script-craft.md#65-项目节奏档案)

## 时长估算(按需)

用户问时长,或项目已接受节奏档案、需要核对 VO 占比时,才把索引写入系统临时目录。先用 Python 查询跨平台临时目录,把第一条命令打印的完整
路径原样替换进后两条命令的引号内。以下每条都是一行完整命令,不依赖 shell 变量或续行符;Windows
没有 `python3` 命令时使用 `py -3`。`--speaker` 的示例值必须替换为本集实际说话者。
项目配置存在时,可在第三条命令末尾加 `--project short-drama.json`。只有
`duration_estimate.py` 接受这个参数,第二条索引命令不接受:

```text
python3 -c "from pathlib import Path; import tempfile, uuid; print(Path(tempfile.gettempdir()) / ('short-drama-' + uuid.uuid4().hex + '.jsonl'))"
python3 "{技能目录}/scripts/screenplay_index.py" "剧集/EP001/剧本.md" --output "粘贴第一条命令输出的完整路径" --speaker "本集角色一" --speaker "本集角色二"
python3 "{技能目录}/scripts/duration_estimate.py" "剧集/EP001/剧本.md" --index "粘贴第一条命令输出的完整路径"
```

**改稿后重跑**:第二条命令写过一次的输出路径不能直接再写一次,会以 `already holds an index` 失败。
要保留原有块 ID,改稿前先保存旧剧本快照,重跑第二条命令时同时加
`--previous-index <同一路径>` 和 `--previous-source <旧剧本快照路径>`。没有旧快照或要从头重编号时,
加 `--no-previous`,也可以回到第一条命令另取一个临时路径。

估时前区分计数口径:`dialogue_characters` 包含标点,视频提示词中的参考语速按可发声字数计算。
按语速换算时排除标点,并按实际读法处理数字和缩写;不把两个计数混用。
项目已接受节奏档案、上限有效且本集有台词时,输出增加 `vo_share`:`[VO]` 字数占全部台词字数的比例、档案上限,以及是否超过。`[OS]` 计入全部台词,不计入 `[VO]`。

估算是参考,不是门禁;没有语速或动作段速率时只报告可数事实,不猜秒数。但任务已给目标时长时,
写作者仍须用真实朗读和动作通读判断能否容纳,并直接压缩重复节拍。

## 完成

用户点名的范围已写入,场景因果连贯,对白与行动可表演,承诺得到兑现或有意延迟,结尾完成本集预定的戏剧或情绪功能,即完成。最后一拍按本集结尾功能判断,不以新增事件作为完成条件。
资产、分镜、审查与生产只有用户点名时开始。
五份创作文档齐备后,可转 `$short-drama` 对跨文档结构做一次机械核对;内容质量仍由创作者审查。

## 安装维护

只有安装、升级或排障时运行 `python3 scripts/selftest.py`。
-----
short-drama-develop:
SKILL.md
agents
assets
references
scripts

short-drama-develop/agents:
openai.yaml

short-drama-develop/assets:
adaptation-map.example.jsonl
creative-brief.md
episode-map.jsonl
story-engine.md

short-drama-develop/references:
adaptation-craft.md
creative-reference-intake.md
director-brief-craft.md
episode-design.md
genre-and-hook-playbook.md
genre-cards
genre-cards.md
mechanism-loop.md
multi-episode-intake.md
premise-devices.md
reveal-reversal-payoff.md
serial-character-and-memory.md
stage-contract.md
story-craft.md

short-drama-develop/references/genre-cards:
亲子隐秘.md
仙侠修真.md
动作任务.md
古装权谋.md
复仇打脸.md
家庭关系.md
悬疑规则.md
生活流.md
破镜重圆.md
系统流.md
职场喜剧.md
豪门婚恋.md
身份错位.md
逆袭.md
重生穿越.md

short-drama-develop/scripts:
episode_intake.py
selftest.py

short-drama-write:
SKILL.md
agents
assets
references
scripts

short-drama-write/agents:
openai.yaml

short-drama-write/assets:
screenplay.md

short-drama-write/references:
dialogue-craft.md
production-format-dialect.md
scene-handoff-capsule.md
scene-sound-dramaturgy.md
screenplay-format.md
script-craft.md
stage-contract.md
substitutable-realization.md

short-drama-write/scripts:
duration_estimate.py
screenplay_index.py
selftest.py
voice_sheet_check.py

short-drama/references:
audience-reveal.md
contract-and-ownership.md
creator-documents.md
creator-workflow.md
form-cards
knowhow-index.md
look-development.md
pickup-and-alternate.md
production-form-profiles.md
reference-roles.md
runtime-preflight.md

short-drama/references/form-cards:
Q版表达.md
二维动态漫.md
国漫二次元.md
实拍.md

思考

Bash Read episode design reference and templates

输入

cd /scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1/.claude/skills/short-drama-develop; cat references/episode-design.md; echo ----; cat assets/creative-brief.md assets/story-engine.md assets/episode-map.jsonl; echo ---; cat references/genre-cards.md

返回

<persisted-output>
Output too large (51.4KB). Full output saved to: /Users/user/.claude/projects/-scratch-evals2-ws-001-open-brief-zenstory-ai--drama-skills-run-1/e10e2961-f300-4e40-bd90-851d771a9b28/tool-results/bwshyi3dl.txt

Preview (first 2KB):
# 短剧分集与单集设计

## 目录

1. 分集的工作定义
2. 规则分级
3. 单集契约
4. 钩子、兑现与出去的压力
5. 因果节拍与升级链
6. 场景化之前的可见性检查
7. 系列弧线与分集地图
8. 集间状态交接
9. 扩写、压缩与重排
10. 项目节奏档案
11. 合成示例
12. 失败征兆与审查问题

## 1. 分集的工作定义

一集完成一次有边界的状态变换:

```text
可验证的进入状态
→ 当集压力迫使人物追求目标
→ 选择遭遇反制并产生后果
→ 观众获得当集承诺的部分回报
→ 一个具体的新决定、危险或问题形成下一步压力
→ 可验证的出去状态
```

分集设计要回答“这一集为什么必须在这里发生”,让分集边界对应必要的状态变化。

## 2. 规则分级

- **`structural_invariant`**:进入/出去状态、分集/铺垫/兑现引用是否存在,显式声明是否互相矛盾;校验器可阻断。
- **`reviewed_invariant`**:因果是否真实、升级是否改变局面、兑现是否匹配承诺;审查者须给出证据。
- **`craft_default`**:通常能加强单集运动的做法;创作者可说明理由覆盖。
- **`taste_option`**:钩子形态、弧线形状、转折烈度、留白程度;只由创作者和作品气质决定。

数字形式约束可以记录为创作者选择,但不能反过来证明剧情质量。

## 3. 单集契约

在写节拍或剧本前,先为本集回答以下字段。

### 3.1 进入状态

只写会影响本集行动的事实:

- 人物位置、持物、伤势或正在执行的行动;
- 谁知道什么、误信什么、掌握什么证据;
- 谁占主动,谁欠谁,谁与谁结盟或疏远;
- 上一集留下的决定、危险或未完成动作;
- 本集必须接住的视觉、声音或时间事实。

不要把整本设定复制进每集。进入状态要足以让本集第一场行动不凭空出现。

### 3.2 当前压力与钩子

“钩子”不是一句神秘台词,而是观众能立即理解的未稳定局面:

- 某人正在执行高代价行动;
- 一个看似正常的事实与可见证据矛盾;
- 有时限的目标已经开始;
- 先前选择的后果现在抵达;
- 某人必须公开作决定;
- 一个关系中的权力突然改变。

钩子要连接本集目标。若开场刺激与后续无因果关系,它只是装饰。

**倒叙与结果预演**:任何题材都可以先给观众看一个后面的结果或高光,再回到造成它的决定,
只要它服务本集的钩子。两段要由同一人物、关系动作、道具或场所事实清楚相连,否则会像
无来源的预告片。用来解释眼前危机的闪回放在集中段更好用:开场先给危机,观众开始追问
「怎么会这样」时再闪回,闪回结束回到危机继续推。它是叙事选择,不是每集开场要求。

### 3.3 目标与反对力量

目标用“人物想让谁/什么在本集结束前发生怎样的变化”表达。反对力量要有:

- 自己的目标;
- 能真正阻挡的筹码;
- 对主角策略的理解或误解;
- 受到压力时会采取的动作。

环境、制度、身体限制也能成为反对力量,但最好通过人物选择获得戏剧形态。

### 3.4 因果升级

不要预填“发生若干次冲突”。写成选择链:

```text
因为进入状态中的事实 A,人物采取行动 B;
行动 B 触发反制 C;
C 让状态 D 改变,迫使人物放弃旧策略或付出更大代价;
新选择 E 产生本集的方向性转折。
```

### 3.5 方向性转折

转折意味着人物原来的计划、理解或关系位置不再适用。它可能是:

- 主角主动更换策略;
- 对手封住既有路径;
- 证据使旧解释失效;
- 一段关系改变立场;
- 代价真正落地;
- 人物拒绝了原本最想要的东西。

不要求每集使用秘密或身份变化。

### 3.6 当集兑现

兑现回答:“观众为什么不会觉得这一集只在拖延?”

可以兑现:

- 看见主角真实能力或代价;
- 回收先前问题的一部分;
- 完成一次关系/权力变化;
- 让承诺中的情绪落地;
- 让人物作出不可撤回的选择;
- 证实或推翻一个有依据的判断。

**`craft_default · STY-04`**:在留下新压力前,先给出本集自己的局部结果。开放结尾与未完成一集不是同一件事。

### 3.7 出去状态与交接

结尾不只写“悬念:他是谁”。写成下一集可执行的事实:

- 谁刚作出什么决定;
- 谁知道了什么,谁仍不知道;
- 权力、关系或资源怎样改变;
- 人物在哪里、拿着什么、能否行动;
- 哪个危险已经开始而非可能出现;
- 下一集开场必须保留什么。

...
</persisted-output>
被拦下 Read /Users/user/.claude/projects/-scratch-evals2-ws-001-open-brief-zenstory-ai--drama-skills-run-1/e10e2961-f300-4e40-bd90-851d771a9b28/tool-res

输入

{
 "file_path": "/Users/user/.claude/projects/-scratch-evals2-ws-001-open-brief-zenstory-ai--drama-skills-run-1/e10e2961-f300-4e40-bd90-851d771a9b28/tool-results/bwshyi3dl.txt",
 "offset": 150,
 "limit": 700
}

返回

<tool_use_error>File is in a directory that is denied by your permission settings.</tool_use_error>
Bash Read rest of episode design reference

输入

sed -n 150,420p references/episode-design.md

返回

  才需要单独写因果链。
- **跨集共用且已有统一记录的**。人物跨集变化统一记录在故事引擎的
  [人物行动模型](../assets/story-engine.md),信息权限模型记录在同一文件的信息与证据设计。
  分集记录保留本集实际发生的结果与权限变化,不重复整套模型。
- **解释性的**。"为什么这个钩子连着本集目标""为什么这股压力由本集产生"是**理由**,
  不是约束。理由由审查者从已有字段判断,不需要作者逐集自证。
- **给字段本身分类的**。钩子属于哪一型、节奏是强是弱,这些标签不改变任何一句剧本。

留在分集记录里的,是**只有这一集才知道的事实**:进入状态、本集目标与反对、转折的触发、
局部结果、出去的压力、交接状态,以及本集要用到的资产与连续性变化。

一集只有一步因果时,分集记录直接写可见的选择、反制和状态变化,不另设因果链字段或步骤指针。
有两步以上、后一步依赖前一步结果时,才单列因果链,剧本按各步落实。

同一句话抄进多个槽位不会增加创作约束,反而容易掩盖尚未完成的决定。

## 4. 钩子、兑现与出去的压力

这三项承担不同工作:

| 部件 | 观众问题 | 常见误用 |
|---|---|---|
| 钩子 | 为什么现在就要看? | 与本集无关的奇观或故弄玄虚 |
| 兑现 | 这一集给了我什么? | 只重复承诺,不产生结果 |
| 出去的压力 | 为什么状态还会继续运动? | 隐去一句信息便草草结束 |

### 4.1 选择钩子类型

根据本集运动选择,而不是轮换模板:

- **行动钩子**:人物已在执行高风险策略;
- **后果钩子**:上一集的选择立即反噬;
- **矛盾钩子**:话语与证据同时出现且不相容;
- **关系钩子**:熟悉关系出现新的权力位置;
- **决定钩子**:人物必须现在选择,拖延本身也有代价;
- **信息钩子**:观众获得能重排现场意义的事实。

**`taste_option · STY-06`**:开场的气质可以安静、喜剧、亲密或激烈,可以延迟解释、让观众先知道或让角色先知道,
只要当前压力可感知并服务作品气质。首钩在第几秒出现、情绪触点隔多久一次不由这一条决定,
由[项目节奏档案](#10-项目节奏档案)里已接受的数值决定。

### 4.2 设计出去的压力

有效的出去压力来自本集结果,而非随意添加的新事故。可用以下问题:

- 本集的胜利让谁失去东西,从而会怎样反制?
- 新知识让谁必须立刻重选立场?
- 人物为赢付出的代价何时到期?
- 哪个被保护的人拒绝继续被保护?
- 现在公开的事实把冲突带到哪个新场域?

**`craft_default`**:结尾尽量把“会发生什么”升级成“某人已经决定做什么”或“某个后果已经启动”。

**`taste_option`**:一集也可以在完整情绪落点结束,不强制悬置;下一集压力可以来自新阶段而非截断动作。

### 4.3 创作者声明的门槛集

有些项目的观看契约里存在一个**门槛集**:观众要继续看下去,必须先付出一点额外代价——
解锁、跳转到另一个入口、等待,或完成某个平台动作。门槛是否存在、落在哪里,**由创作者
按项目声明**;本套件不假定任何平台规则,也不把门槛位置当作质量判据。

门槛不新增规则,它让本文件已有的三条**在这个位置收紧**——因为别处失手观众只是走神,
这里失手观众直接离开:

- **出去的压力**([4.2](#42-设计出去的压力)):门槛后面必须还欠着观众一样东西。刚兑现
  完一次大回报就设门槛,观众此刻的状态是"满足",而满足的人不会为继续看下去付出额外
  代价。别处可以停在完整落点,这里不行。
- **兑现依赖已建立的事实**(`STY-09`):门槛处的悬念若依赖观众还不认识的人、还没理解
  的规则或还没看见的赌注,它对观众并不成立——没有投入过的问题不会让人付代价。
- **每集都有局部结果**(`STY-13`):越靠近门槛,越不能出现只做交代、不产生结果的集。
  观众在这一段流失,就永远走不到门槛。

门槛集本身仍是普通一集:有自己的局部结果,出去的压力仍从本集结果长出。门槛只是给
"停在哪里"这个选择多加一层约束。

门槛的集号由创作者定,套件不提供默认值。创作者已经声明要设门槛、又请你建议落在哪一集时,
可以拿常见的经验区间作示例——第一道约在第 8–16 集,第二道约在第 25–30 集——再按本项目的
爽点分布挪动。没有声明门槛的项目不提这些区间。

门槛处怎么停:

- **停在揭晓的前一秒**:身份揭穿、重大抉择、表白、秘密揭晓都可以。把这次高潮劈成两半,
  前一半在本集推到悬崖边,后一半留给门槛后的第一拍。本集自己的局部结果照样要先兑现,
  停住的是下一次揭晓,不是这一集的结果。
- **钩子分台词钩与画面钩**:台词钩是一句没说完的问句或一句身份暗示;画面钩是一个做到一半的
  动作——门推开一半、信封拆开一半。两种都要指向观众已经在等的那件事。

**`craft_default · STY-27`**:项目声明了门槛集时,把它安排在一次尚未兑现的爆发之前,停在
揭晓的前一秒,并确认门槛处的悬念只依赖观众已经建立起来的人物、规则与赌注。集号与是否设
门槛由创作者决定。

### 4.4 首集入口

第 1 集从危机或观众收益最强的一处开始,不从原著第一章或人物的日常开始。原著开篇常是
温吞的日常,照搬过来观众几秒就划走。定入口前至少比较三个候选:

- **时序入口**:按原顺序最早能成立的一处,作为对照;
- **收益入口**:观众在此处收益最强、同时能交代主角身份、危机与目标的一处。改编项目优先取
  原著分析里的爽点表与开篇替换点;
- **冷开入口**:把后文一次高潮提前,先放它的最后一拍或揭晓前一秒,再回到起点追因。登记为
  `cold_open`,补偿义务见 [改编重排](adaptation-craft.md#重排也要登记)。

每个候选写清两件事,用同一把尺子比:

- **开场第一帧观众看见什么**:写成一格画面,再写它让观众问出的那个问题。这个问题要不靠读屏幕
  文字、不靠认识人物就成立;静止的画面也可以,只要它自己提出问题。
- **整集收益**:观众在这一集拿到什么,还缺什么信息,缺的在哪里补。

冷开常见的三条否决理由,多半是把冷开做成了兑现本身:

- 「观众还不认识这些人,看不懂」:冷开取的是冲突最尖的那一下,要的是一眼读得懂的处境——一群人
  喊着要封号、一张被火光照亮的脸,不需要知道谁是谁;
- 「会把后面的兑现提前花掉」:取揭晓前一秒时答案留在原位;取最后一拍时只放结果的一个画面,
  不放来龙去脉,观众追的是「怎么走到这一步」;
- 「同一拍会在集中段再演一遍」:开场给片段,回到原位时给完整的一场,观众得到的是认出来的快感,
  不是重复。

三条都答不了,再按收益选别的入口。

第 1 集结束前,观众要知道主角是谁、他眼下被什么压着、他想要什么。大目标在观众刚认下主角时
就说出口,而且要具体到可核对的数字、期限或对象,之后再拆成阶段小目标。

**`craft_default · STY-25`**:定第 1 集入口前比较至少三个候选,其中一个是后文高潮提前的冷开;
每个候选写出开场第一帧观众看见的那一格画面和它提出的问题,再写整集收益;选开场画面自己就是
钩子、观众收益强、且能在集尾前交代身份、危机与目标的一处;大目标尽早说出口,具体到可核对。

## 5. 因果节拍与升级链

### 5.1 一个节拍要回答什么

每条节拍至少记录:

- `because_of`:来自哪个进入事实或前序节拍;若开启新线,明确声明;
- `character_goal`:当前行动者想改变什么;
- `opposition`:谁/什么在此刻阻止;
- `observable_action`:可见或可听的行动;
- `state_change`:信息、权力、关系、情绪、风险或物理状态的前后差异;
- `next_pressure`:结果怎样迫使下一步发生;
- 相关铺垫与兑现引用。

**`structural_invariant`**:节拍必须引用一个原因,或声明开启新线;字段存在不代表因果成立。

**`reviewed_invariant`**:审查者判断“因为”是否真的改变了人物选择。只按时间先后排列的事件仍可能是空链。

### 5.2 用“所以/但是”朗读

把相邻节拍连起来:

```text
因为前一结果,所以人物现在这样做;
但是对抗力量利用新状态反制;
所以人物必须改变策略或承担代价。
```

如果只能用“然后”,检查是否缺少:人物选择、对抗反应、可见后果或下一股压力。

这是一种诊断语言,不要求成品按该句式呈现。

### 5.3 判断重复与升级

对比两个相邻冲突:

- 谁掌握的筹码变了?
- 谁知道的事实变了?
- 哪段关系的边界变了?
- 哪条退路消失了?
- 谁作出了不可撤回的决定?
- 哪个后果从威胁变成现实?

**`reviewed_invariant · STY-03`**:若没有可引用的变化,不能只凭更强烈的表演词声称升级。

**`craft_default`**:让主角的有效策略产生新的盲区,让对手学习,而不是每轮都回到同一起点。

## 6. 场景化之前的可见性检查

节拍将交给剧本写作,因此要提前检查它是否有戏剧载体:

- 冲突能否发生在人物必须行动的具体场域?
- 信息能否通过证据、争夺、行为或后果出现,而非纯说明?
- 内在变化由什么选择、停顿、身体行为或关系动作承载?
- 关键道具文字、声音或空间限制是否是故事必需?
- 转折发生后,人物下一动作是否改变?

**`reviewed_invariant`**:关键节拍需要可转译成可见/可听的行为。审查者描述缺失载体及其影响,而不是用关键词筛选心理词。

**`taste_option`**:旁白、画外音、主观画面或留白都可选,只需明确其叙事意图。

### 6.1 转折要写成那一下动作,不是那一下的功能

分集记录的字段名会诱导人写功能:`turn` 问触发是什么,`local_dramatic_result` 问改变了什么,
`opposition` 问对方要什么、筹码是什么。这些问题都可以用一句正确的话回答完,而一句正确的话
不是一场戏。

最常见的形态是把转折写成它的**结果**:

| 写成功能(不够) | 写成动作(够) |
| --- | --- |
| 他不再讲道理,用自己的信用担保 | 群里问他是不是急了的内部人士,有人跟着起哄;他把打了一半的辩解删掉,只发出一条链接 |
| 裁决权从立场转移到作品本身 | 刚才喊举报的那个人点开了视频 |
| 上级选择维持现状 | 上级把申请表推回来,说等有了成绩再谈 |

左栏的功能描述本身可以成立,结构校验也无法据此判断动作是否具体;这一缺口仍须由
`STY-24` 的语义审查指出。只交左栏会让剧本层重新发明行动,右栏则提供了可继续场景化的依据。

判据是一句话:**这一拍,观众看见的是谁做了什么**?答不上来的,说明记录停在了功能层。
不要求分集记录写完整场次——那是剧本的活;要求的是**转折与本集结果各自都能指出一个具体的
可见动作**,哪怕只有半句。

同一条纪律适用于`opposition`:反对力量的筹码要写成它**做过或会做的事**,
不是它的属性。「人多、态度一致」是属性;「他们已经约好一起去平台投诉」是筹码。

**`STY-24 · reviewed_invariant`**:本轮覆盖范围内每一集的方向性转折与当集兑现,
在分集记录里各自要能指出一个具体的可见动作(谁做了什么),而不只是它达成的功能或状态变化;
反对力量的筹码同样写成已发生或将发生的行为。审查者引用「功能 → 对应的可见动作」,
指不出可见动作即为缺陷;这一条不用关键词筛,也不要求写成完整场次。

## 7. 系列弧线与分集地图

系列弧线不是把传统结构名称贴到集号上。先画状态运动:

1. **旧策略可用**:人物用熟悉方式获得局部结果,同时制造债务;
2. **旧策略被学习/反制**:同一方式开始伤害人物珍视的东西;
3. **选择成本显形**:人物必须在不能兼得的价值间行动;
4. **引擎变形或终止**:新事实、能力、关系或决定使旧回路无法照常继续。

这些是功能,不规定阶段数量、集数或位置。作品可以跳跃、循环、倒叙或以单元故事承载长线变化。

### 7.1 分集地图的列

每一行只保留能帮助写作与交接的字段:

- 集 ID、工作标题;
- 进入状态与活动压力;
- 当集目标和反对力量;
- 关键选择及其后果;
- 方向性转折;
- 当集兑现;
- 出去压力与精确交接;
- 铺垫/兑现引用;
- 连续性变化与未决问题。

一行地图应能回答“删掉这集会损失什么状态台阶”。答不出时,合并、重设转折或让这集承担明确结果。

### 7.2 长线与单集的双重责任

一集可以同时:

- 完成一个局部目标;
- 改变一段关系;
- 让长线证据前进;
- 让主角策略积累代价。

不需要每项都出现。关键是当集有自己的可识别结果,并对系列状态作出至少一项必要贡献。

## 8. 集间状态交接

### 8.1 写成事实,不写气氛词

弱交接:

> 关系更加紧张,危机升级。

可执行交接:

> 叶澄把店门钥匙交给齐曼,但没有告诉她备用账本在冷柜后;齐曼已答应天亮前让审查员进入厨房。

后者给出持物、知识差和已作决定,下一集能直接行动。

### 8.2 逐项核对

- **知识**:谁知道/误信/隐瞒什么;

思考 1 秒

Agent:
正在读开发与写作技能的方法说明(分集设计、付费卡点、首集入口),读完就开始定题材、写人物和大纲。
Bash Read rhythm profile section and genre card index

输入

sed -n 420,640p references/episode-design.md; echo ----; sed -n 1,80p references/genre-cards.md

返回

- **知识**:谁知道/误信/隐瞒什么;
- **权力**:谁有许可、证据、资源或公开话语权;
- **关系**:承诺、背叛、联盟、边界;
- **物理**:位置、伤势、造型状态、持物、门锁、天气、时间;
- **行动**:已经开始、被中断或必须完成的动作;
- **情绪**:只记录会改变下一步行为的情绪选择,不记录泛泛强度。

**`structural_invariant`**:上一集出去事实与下一集进入事实显式不一致时,需要修订归属或合理的时间/事件说明,不能静默忽略。

**`reviewed_invariant`**:即使字段不冲突,知识、关系或伤势也可能无原因跳变;审查者必须引用前后证据。

## 9. 扩写、压缩与重排

### 9.1 何时扩写

扩写不是增加闲聊,而是当前地图跳过了必要的选择:

- 人物突然改变立场,却没有受到足够压力;
- 证据出现,却没有获取、验证或争夺过程;
- 代价被宣布,却没有落到关系或行动;
- 重大决定后没有让受影响人物作出回应。

新增节拍时明确它补足哪条因果或哪个状态变化。

### 9.2 何时压缩

以下内容可以合并或删除:

- 重复说明观众已经知道的事实;
- 人物用同一策略遭遇同一反制,状态没有变化;
- 只负责移动人物且没有产生选择的过场;
- 两集拥有同一个进入状态、目标、转折和出去状态。

### 9.3 何时重排

重排前先检查依赖:

- 人物是否提前使用尚未获得的知识或道具;
- 关系变化是否在原因之前出现;
- 铺垫是否晚于兑现;
- 伤势、时间、位置和公开范围是否仍连续;
- 观众信息顺序改变后,体验是否仍是创作者要的悬念/惊讶。

**`structural_invariant`**:重排后所有引用与显式交接必须重新解析。

**`taste_option`**:允许倒叙、并行、跳时或主观叙事;声明其意图和连续性例外即可。

### 9.4 容量可行性预算 (`STY-16`)

戏剧边界决定一集在哪里结束,制作容量决定这份内容能否在已选时长与预算内完成。
分集地图上的选择最终要成为镜头与有时长的画面,因此在场景化前先做量级估算。

不做这个检查的失效方式很具体:分集地图上每集看起来都合理,直到剧本交到分镜环节才发现
某几集的镜头数是别人的两三倍,于是要么临时砍戏(砍掉的往往正是兑现),要么让这几集
超长(打乱已接受的集数与节奏)。发现得越晚,能改的越少。

**`craft_default`**:进入场景化之前,用项目自身**已接受产物**的比例做一次量级估算,
把明显超出的集在地图阶段就调整。

估算方法(用比例,不用外部数字):

1. 从本项目已经接受的集里取样,算出该项目当前的两个比值——每个镜头平均承载多少剧本
   体量,以及每个镜头平均占用多少时长。
2. 用这两个比值把待写各集的预估体量换算成镜头数与时长量级。
3. 与创作者已接受的集长和产物预算比较,只关注**量级偏差**(例如某集是同项目均值的两倍
   以上),不关注小幅波动。

比值来自项目自身的历史;题材、制作形态或交付容器改变时需要重估,不能把它当作跨项目
质量门槛:

- 偏差是**提示**,交给创作者判断,不阻断任何交付;
- 处理偏差优先用 9.1–9.3 的手段(把超载集拆成两集、把说明改成传递、合并同质节拍),
  而不是按数字删台词或删镜头;
- 项目还没有已接受集可取样时(例如只写第一集),跳过这一步,等有了基准再回来算。它的
  价值来自项目自身的一致性,用别处的数字代入反而会误导。

上述估算用已接受集的比值**预测**待写集;第一集没有历史基准时先跳过。镜头时长确定后,
分镜环节还会把本集已接受的镜头时长直接加总,与项目目标集长比对。这次**测量**不依赖
历史样本,第一集同样适用。

**`taste_option`**:单集长度、集数、每集镜头量级由创作者的格式与发行方案决定。

## 10. 项目节奏档案

节奏数值不是套件级规则,是项目档案。本阶段按制作形态提出一份,创作者接受或改写后,
写进 `short-drama.json` 的 `creator_authority.rhythm_profile`。之后剧本、分镜与审查只拿
已接受的数值做算术核对;档案缺失、未接受,就是未声明,不核对。

提出时把候选档案写进创作简报「形式与制作边界」一节,`status` 写 `proposed`。创作者接受或
改写后,由 `$short-drama` 把它写入项目配置,状态变为 `accepted`。以后要改,同样走一次决策。

| 字段 | 含义 | AI 真人短剧起点 | 漫剧起点 |
|---|---|---|---|
| `form` | 制作形态 | `ai_live_action` | `motion_comic` |
| `first_hook_seconds` | 第一个钩子最迟在第几秒出现 | 5 | 5 |
| `beat_interval_seconds_max` | 相邻两个情绪触点(冲突台词、动作或新信息)之间最长隔几秒 | 30 | 30 |
| `opposed_reversals_per_episode_min` | 每集至少几次有具体对手参与的反转 | 1 | 1 |
| `end_on_peak` | 集尾停在峰值上直接收,不在峰值后再缓一段 | `true` | `true` |
| `reprise_previous_last_beat` | 下一集开头先接上一集最后一拍 | `true` | `true` |
| `vo_share_max` | `[VO]`(旁白与内心独白)占全集口播字符的比例上限,按时长脚本去空白与括注、保留标点统计;`[OS]` 计入总口播,不计入 VO | 0.3(未实测) | 0.3(未实测) |
| `target_avg_shot_seconds` | 目标平均镜长(秒) | 2.5 | 3.0(未实测) |
| `close_shot_share_min` | 近景类镜头——近景、特写、大特写与细节镜头——合计占全集镜头数的比例下限 | 0.45 | 0.45(未实测) |
| `first_major_payoff_by_episode` | 全书第一个大爽点最迟在第几集 | 1 | 1 |

真人列的镜长与近景类占比来自一组真人短剧的实测:平均镜长约 2.5 秒,特写加近景约占一半。首钩秒数
来自一组实测:5 部里有 3 部在前 5 秒内给出第一个钩子。触点间隔取「每 20–30 秒一个情绪触点」的
上沿。标「未实测」的是待校准的起点,没有测量依据。

这些是起点,不是质量线。靠旁白推进的解说漫可以把 `vo_share_max` 调高;生活流、留白多的
作品可以放宽触点间隔和镜长。改哪一项、为什么,写进创作简报交创作者决定。

**`craft_default · STY-26`**:按制作形态从上表起步提出项目节奏档案,交创作者接受或改写;
默认值只是起点,不是套件级门槛,未接受的档案不作为任何核对依据。

## 11. 合成示例

沿用一个全新虚构情境:一家共享厨房面临关停,排班员叶澄一直暗中调换灶位保护弱势摊主。

### 单集契约示意

- **进入状态**:叶澄刚删去一条换班记录;齐曼持有自己的订单记录,但尚不知道谁删改;物业审查员将在早晨进入。
- **当前压力**:齐曼当众要求出示完整排班记录。
- **目标**:叶澄想在不暴露删改的情况下说服众人维持营业。
- **反对力量**:齐曼要恢复公开规则;管理方可以借混乱立即收回排班权。
- **升级链**:叶澄展示整理后的记录 → 齐曼用订单证明缺口 → 叶澄承认改过排班但拒绝说为谁 → 被保护的新摊主主动承认并质问谁有权替他决定。
- **转折**:问题从“谁占了灶位”转成“叶澄是否有权以保护为名隐瞒”。
- **兑现**:订单缺口的原因被部分回答;叶澄的能力和代价同时显形。
- **出去压力**:叶澄把备用钥匙交给齐曼;齐曼已承诺让审查员进场,但不知道冷柜后的账本。

### 因果诊断

弱节拍:

> 众人争吵。管理方突然通知审查提前。叶澄很紧张。

改成可用链条:

> 因为齐曼公开证明排班记录缺口,管理方把“内部争执”作为提前进场的理由;叶澄若继续藏账本就会失去营业资格,若交出账本则会暴露所有私下调整。她把钥匙交给齐曼,却故意不提账本位置。

差别不在事件更多,而在前一选择改变了对手筹码,人物随后作出带代价的新选择。

## 12. 失败征兆与审查问题

### 失败征兆

- 开场压力与当集目标无关;
- 集内只有信息宣布,没有人物争取与反制;
- 各节拍可以任意换序;
- “升级”只是更大的争吵、追赶或误会;
- 本集所有答案都被推迟到下一集;
- 结尾用省略一句话制造假悬念;
- 出去状态只有情绪形容,没有知识、关系、物理或行动事实;
- 下一集重置上一集的决定和代价;
- 为适配形式而拆出无状态贡献的集;
- 把某种钩子或转折当成所有项目的必选项。

### 审查问题

审查者引用 `episode-map.jsonl` 和对应的 `剧本.md` 回答:

1. 本集从什么进入状态运动到什么出去状态?
2. 哪个选择触发了哪项反制,证据在哪里?
3. 方向性转折后,人物的行动为什么必须改变?
4. 当集承诺具体在哪里兑现,而不是只被重复?
5. 出去压力是否由本集结果产生?
6. 相邻集的知识、权力、关系、持物和行动是否可精确交接?
7. 哪些形式选择属于创作者偏好,是否被保留?

开发/写作所有者可根据发现修订,但不能签发自己的最终通过结论。
----
# 题材卡索引

题材卡的选择与召回按本索引执行。各题材的具体做法放在同目录的 `genre-cards/` 下,一次只读一张。

题材卡回答"这个题材更常用哪些压力、场面和情绪落点",不回答"这一集应该怎么写"。
后者由创作者已接受的事实、单集契约和 [episode-design.md](episode-design.md) 决定。

## 目录

- [召回规则](#召回规则)
- [冲突优先级](#冲突优先级)
- [题材卡一览](#题材卡一览)
- [跨题材与未覆盖题材](#跨题材与未覆盖题材)
- [不要把卡片写成硬规则](#不要把卡片写成硬规则)

## 召回规则

1. 先确认主题材、目标形态(实拍/漫剧)、创作者已声明的尺度与结局承诺,再来查表。
2. 查到匹配项后**只读那一张卡**,不要把整套题材卡加载进上下文。
3. 跨题材时:主题材读 1 张完整卡,辅题材只摘 1-2 条"常见场面颗粒"或"禁止漂移"。
   先说清主要矛盾是什么、观众先看到哪个结果,再决定采用哪些做法。
4. 传给下游的题材注入只保留与当前集相关的条目,短到能被完整读进上下文即可;写不满不必凑,写不下先删与本集无关的条目。可用条目:
   压力来源、人物策略与信息权限、本集要落的回报、可用的场面颗粒、钩子取向、禁止漂移、卡片置信度。
5. **题材卡只在内部校准题材味,绝不出现在交付物里**。剧本、分集地图、创作简报中不得出现
   卡名、题材标签、置信度、条目编号或"已按题材卡执行"一类合规自评——只交付作品本身。
6. 中置信卡不能单独决定方向:先结合创作者的设定、已接受的故事引擎和本项目的制作边界,
   再决定采纳哪几条。表中没有的题材按[跨题材与未覆盖题材](#跨题材与未覆盖题材)处理。

## 冲突优先级

题材卡的权限低于项目事实,高于通用手感。按本套件的四类规则读:

```text
创作者已接受的事实、结局承诺与改编边界(structural_invariant / creator authority)
→ 已接受的单集契约、进入/出去状态与铺垫兑现义务(structural_invariant / reviewed_invariant)
→ 题材卡(craft_default,创作者说明理由即可覆盖)
→ 通用工艺参考与叙事手感(craft_default / taste_option)
```

- 题材卡永远是 `craft_default`:它可以被创作者的一句"这部不这么走"直接推翻,且不需要额外论证。
- 题材卡里的钩子取向、情绪落点、结局气质属于 `taste_option`,任何审查者都不得据此单独阻断。
- 题材卡**不能**创造 `structural_invariant`。它不产生 ID、引用或可被校验器阻断的约束。
- 与 [genre-and-hook-playbook.md](genre-and-hook-playbook.md) 冲突时:手册负责跨题材共用轴线的比较,
  卡片负责单题材的执行细节;若两者对同一题材的说法不一致,以卡片为准并记录理由。

## 题材卡一览

| 题材 | 别名与匹配词 | 题材卡 | 置信度 |
|---|---|---|---|
| 复仇打脸 | 复仇 / 打脸 / 权力反转 / 扮猪吃虎 / 隐藏身份归来 / 清算 | [复仇打脸](genre-cards/复仇打脸.md) | 高 |
| 逆袭 | 逆袭 / 废柴逆袭 / 草根崛起 / 被看不起 / 一鸣惊人 / 越级 | [逆袭](genre-cards/逆袭.md) | 中 |
| 系统流 | 系统 / 金手指 / 任务奖励 / 签到 / 面板升级 / 积分兑换 | [系统流](genre-cards/系统流.md) | 中 |
| 重生穿越 | 重生 / 穿越 / 前世复仇 / 改命 / 穿书 / 未卜先知 | [重生穿越](genre-cards/重生穿越.md) | 中 |
| 古装权谋 | 古装 / 权谋 / 朝堂 / 宅斗 / 宫廷 / 门第 / 礼制身份戏 | [古装权谋](genre-cards/古装权谋.md) | 高 |
| 悬疑规则 | 悬疑 / 规则怪谈 / 规则恐怖 / 惊悚 / 生存 / 密室 / 灵异 | [悬疑规则](genre-cards/悬疑规则.md) | 高 |
| 家庭关系 | 家庭 / 亲情 / 婆媳 / 姐弟 / 照护 / 伦理 / 代际冲突 | [家庭关系](genre-cards/家庭关系.md) | 高 |
| 亲子隐秘 | 亲子 / 萌宝 / 神秘小孩 / 隐婚生子 / 认亲 / 单亲爸爸 / 单亲妈妈 / 血缘揭示 / 领养身世 | [亲子隐秘](genre-cards/亲子隐秘.md) | 中 |
| 职场喜剧 | 职场 / 轻喜剧 / 打工人 / 技术流 / 专业能力 / 办公室 | [职场喜剧](genre-cards/职场喜剧.md) | 高 |
| 身份错位 | 身份错位 / 身体互换 / 灵魂互换 / 冒名顶替 / 马甲 / 人非人身份 | [身份错位](genre-cards/身份错位.md) | 高 |
| 生活流 | 生活流 / 小人物 / 都市温情 / 日常 / 治愈 / 市井 | [生活流](genre-cards/生活流.md) | 高 |
| 仙侠修真 | 仙侠 / 修真 / 修仙 / 玄幻 / 宗门 / 御剑 / 东方奇幻 | [仙侠修真](genre-cards/仙侠修真.md) | 中 |
| 豪门婚恋 | 豪门 / 霸总 / 婚恋 / 契约婚姻 / 先婚后爱 / 甜宠 / 虐恋 | [豪门婚恋](genre-cards/豪门婚恋.md) | 中 |
| 破镜重圆 | 破镜重圆 / 追妻 / 复合 / 久别重逢 / 前任 / 失忆重逢 / 重逢不相识 / 意难平 | [破镜重圆](genre-cards/破镜重圆.md) | 中 |
| 动作任务 | 动作 / 任务 / 冒险 / 追逃 / 营救 / 押运 / 生存突围 | [动作任务](genre-cards/动作任务.md) | 中 |

置信度表示该卡的压力机制在本套件内被交叉印证的程度,不代表市场表现、热度排名或测量结果。
具体来源见各卡的“证据与置信度”。

## 跨题材与未覆盖题材

- 表里没有匹配项时,不要硬套最接近的一张卡。回到
  [genre-and-hook-playbook.md](genre-and-hook-playbook.md) 按压力来源、人物策略、观众回报、
  信息权限、可见证据、制作难点六个轴线自建一次,再决定是否借用某张卡的单独条目。
- 混合题材(例如复仇 + 悬疑、家庭 + 生活流)要先声明主要矛盾归谁,并检查两套制作要求会不会打架:
  一个要公开场合与群演,另一个要封闭空间与状态连续性时,成本会叠加而不是平均。
- 同一题材词可以由完全不同的机制驱动。"悬疑"可以是空间规则、关系谎言或技术证据;
  "婚恋"可以走互助、权力不对等或身份冲突。卡片只在机制相符时才适用。
- **前提装置和题材是两层**。 "主角重来一世""主角获得一套外部规则"这类设定叠加在题材
  之上,决定主角比别人多拥有什么。装置装在婚恋、宅斗或修真上时,照常取那个主题材的卡;
  观众就是冲着装置带来的奖励与打脸来看的爽文,主题材卡取系统流或重生穿越。两种情况都

思考 26 秒

Bash Read revenge genre card, engine template, screenplay format

输入

cat references/genre-cards/复仇打脸.md; echo ----; cat assets/story-engine.md | head -80; echo ----; cd ../short-drama-write; cat assets/screenplay.md; sed -n 1,60p references/screenplay-format.md; grep -n "^#" references/script-craft.md

返回

---
genre: 复仇打脸
aliases: [复仇, 打脸, 权力反转, 扮猪吃虎, 隐藏身份归来, 清算]
form: 竖屏连续短剧
confidence: high
basis: 套件既有工艺文件与短剧写作经验归纳
---

# 复仇打脸题材卡

## 题材核心与观众为什么看

观众看的是**被系统性剥夺的人,一件一件把可执行的权力拿回来**。真正的核心不是"受辱—亮身份"的循环,而是每一次翻盘都让对手真的失去一样还能用的东西:签字权、货源、监护权、股权、名声、时间。观众心里存着一笔具体的旧账,来这里看它被具体地、可核对地还上。剥夺写得越具体,偿还才越有重量。

## 压力来源与冲突发动机

对手手里必须有真实手段:程序权限、资金、亲属关系、把柄、舆论、对规则的解释权。主角承受的压力不是"被骂",而是每往前一步都要付成本——暴露自己、连累在意的人、动用只能用一次的筹码。发动机可以写成三件事同时成立:对手拥有可执行手段;主角掌握着对手不知道他掌握的东西;场上有人的判断能改变结果。少任何一件,段落就会退化成音量比赛。

## 人物策略与信息权限

主角常见策略:隐藏能力换观察时间;用对手自己的规则反制;把私人恩怨升格成可被公开裁决的事项;先取证再动手。信息权限要分三层写清——谁知道主角的真实身份或底牌,谁掌握证据但不敢说,谁只看见表面因而站错队。对手必须会学习:第一次被反制后改口径、换渠道、切割替罪的人。一个只会加大恶意的对手,撑不过中段。

## 观众回报与情绪落点

回报落在**权力位置可核对的变化**:签字被驳回、门禁卡失效、名单上划掉一个名字、原本要站着的人现在坐下了。情绪落点不必只有快意——可以是冷的(对方求饶而主角不接),可以是痛的(赢了,但要保护的人已经受损),也可以是低调的(只要回一件旧物)。压抑期不宜长久没有任何兑付,但兑付不必等到身份全部揭开。

## 常见场面颗粒

合同的签字页与骑缝章、股东名册、转账回单与对账单、监控回放上的时间码、缴费单、录音笔与已导出的文件、旧工牌、被撕开的照片、拦在厂门口的货车、前台访客登记本、宴会的座次牌、门禁失效的红灯。动作层面:把钥匙拍在桌上、当众把文件推过去、对方掏出手机打电话却没人接、有人默默把椅子挪开半尺。见证者按"能做什么"分区:能拍板的、能作证的、有利害关系的、只会围观的。

## 集尾钩子取向

从本集已经发生的结果往下长:对手刚学到主角的一条路径并已经封住;刚兑现的一步产生了新的债(谁被牵连、谁要求回报);一份旧证据获得更窄也更危险的解释;某个一直沉默的人决定开口。不成立的替代品:陌生人踹门宣布"你惹到不该惹的人";把上一集的威胁重复一遍、只是更大声。

## 前中后期打法

- **前期**:把"被剥夺"写成可核对的具体损失——一份被改的名单、一个被顶掉的岗位、一次没有到达的救援;同时给出主角现在不能掀桌的成本。早期就要有一次小额兑付,让观众相信这笔账真的会还。
- **中期**:让对手依托手中资源反制,主角的有效手段开始伤及他要保护的人。打脸分层推进,不同层级的对手要用不同货币结算:钱、程序、人情、名声。
- **后期**:让最初那次剥夺以新形式回到主角面前,逼他选择继续清算还是接受不完整的偿还。结局气质由创作者决定,不默认大团圆,也不默认玉石俱焚。

## 制作难点

公开场合(宴会、股东会、听证、颁奖)是成本峰值:群演、统一造型、大空间同时到位。可用"半公开小场"承担同样的见证功能——走廊、电梯口、地库、玻璃隔断外的工位区——保留目击者而大幅降本。证据类道具要跨集复用并保持版本可辨:同一份文件的原件、复印件、被涂改件必须能在画面上区分。地位变化常带来造型与配饰变化,需要在开发阶段规划其层级与所需资产数量。闪回会新增旧场景与旧造型;能由当下的一件物件承担的,就不要新建场景。

## 禁止漂移

不要让对手只会辱骂而没有可执行手段;不要用"报出头衔"代替此前建立的证据与选择;不要连续多段只受辱、不产生任何可核对的变化;不要把被保护者写成奖品;不要把反转建立在观众此前完全无从看见的新事实上。

## 证据与置信度

本卡不来自抽样统计、平台热度或任何真实作品,全部例子为合成虚构。它由本套件既有工艺文件([story-craft.md](../story-craft.md)、[episode-design.md](../episode-design.md)、[reveal-reversal-payoff.md](../reveal-reversal-payoff.md)、[genre-and-hook-playbook.md](../genre-and-hook-playbook.md))与短剧写作经验归纳而成。置信度:**高**,指其压力机制在套件内被多处交叉印证,不指任何测量结果。与创作者已接受的事实或单集契约冲突时,以后者为准。
----
# 短剧故事引擎

> 复制到 `项目开发/story-engine.md` 后填写。这里只记录能预测选择、升级和交接的事实;不要扩写成世界观百科。

## 1. 已接受的戏剧承诺

- **来源**:【creative-brief 的版本/引用】
- **焦点人物与追求**:【填写】
- **昂贵阻力**:【填写】
- **反复回报**:【填写】
- **核心代价**:【填写】
- **终止性转变**:【填写】

## 2. 引擎回路

### 压力怎样启动

【填写会反复出现、但能产生不同局面的触发来源。】

### 主角惯常怎样应对

- 策略:【填写】
- 为什么有效:【填写】
- 为什么同时制造新问题:【填写】

### 对抗力量怎样学习与反制

- 对抗者/约束:【填写】
- 目标与筹码:【填写】
- 能封住主角哪条路径:【填写】
- 受到压力后会怎样改变策略:【填写】

### 一轮冲突怎样留下下一轮压力

```text
触发:
→ 主角选择:
→ 反制:
→ 局部结果:
→ 新代价/状态变化:
→ 下一股压力:
```

### 为什么人物不能轻易退出

【填写关系义务、现实限制、身份、承诺或自我认同成本。】

## 3. 可升级的状态

> 只保留会影响选择的维度;不必填满。

| 状态维度 | 当前起点 | 可能怎样变化 | 变化会迫使谁作什么选择 |
|---|---|---|---|
| 权力/许可 | 【填写】 | 【填写】 | 【填写】 |
| 知识/误信/证据 | 【填写】 | 【填写】 | 【填写】 |
| 关系/联盟/债务 | 【填写】 | 【填写】 | 【填写】 |
| 暴露范围 | 【填写】 | 【填写】 | 【填写】 |
| 资源/时间 | 【填写】 | 【填写】 | 【填写】 |
| 物理状态 | 【填写】 | 【填写】 | 【填写】 |
| 道德代价 | 【填写】 | 【填写】 | 【填写】 |

## 3b. 前提装置契约(仅当设定包含先知或外部授权能力时填写)

> 没有这类装置就整节删除。**这里是创作者层的契约**,可以从一开始就写全,不要求向观众
> 披露;剧中披露到哪一步记在分集地图的信息权限栏,两者分开核对(`STY-17`)。

装置类型:【先知型 / 授权型 / 两者兼有】
契约状态:【draft / accepted】——`accepted` 之后才可让装置在剧中生效。

每条能力、限制或代价单独成行并给一个**稳定条款 ID**(`DEV-01`、`DEV-02`…)。后续任何
一集出现的装置能力或豁免都要能指回某个条款 ID;指不回去就是事后扩权。

| 条款 ID | 类型 | 内容 | 首次生效 | 可靠性 |
|---|---|---|---|---|
| DEV-01 | 能力范围 | 【装置能做什么,边界在哪】 | 【集号或"未生效"】 | 【可靠 / 会误述 / 未定】 |
| DEV-02 | 失效条件 | 【什么情况下不生效、精度下降或反噬】 | 【…】 | 【…】 |
| DEV-03 | 使用代价 | 【可见的、主角在意的代价,除消耗外的后果】 | 【…】 | 【…】 |

- **可靠性**列决定装置的宣告能否被当真。标为「会误述」的条款,后续揭穿时观众要能回看出
  线索;这属于已设计的不可靠,不是失约。
----
# EP001 【填写集名】

<!--
复制到 剧集/EP001/剧本.md 后填写并删除本注释。
场景标题:## 场景ID 内/外/内外 · 地点 · 时间/天气
动作写现在时、可见且可表演的行为。对白格式:角色(可执行提示):台词。
只保留剧情必需的生产标签;未使用的示意行全部删除。
不要在这里写镜头、资产全集、图片/视频提示词或终审结论。
-->

## EP001-SC001 内 · 【地点】 · 【时间/天气】

【写压力已经活跃时的可见行动;说明人物位置、持物或关键空间关系,只保留影响剧情的细节。】

【角色名】(【可选:一个可执行的策略/变化提示】):【台词】

【让对方通过行动、证据或另一种策略回应;不要用作者说明代替关系变化。】

【角色名】:【台词】

<!-- 以下标签只在故事需要时取消注释并填写。 -->
<!-- [VO] 【角色】:【内容】 -->
<!-- [OS] 【角色】:【内容】 -->
<!-- [SFX] 【会改变行动或信息的关键声音】 -->
<!-- [画面文字] 【载体】:【必须读清的精确内容】 -->
<!-- [连续性] 【容易在后续丢失的明确状态变化】 -->
<!-- [转场] 【有叙事意义的转场要求】 -->

## EP001-SC002 外 · 【地点】 · 【时间/天气】

【以上一场退出状态为进入事实,写出本场必要的变化;冲突场景再明确目标、反对与方向性转向。不需要的示例场景直接删除。】

【角色名】:【台词】

【以本集需要的决定、后果、情绪落点或开放状态结束;需要接下一集时,与已确认分集规划或上下文中的交接事实对齐。】
# 中文短剧 Markdown 剧本格式

## 目录

1. 设计目标与事实所有权
2. 文件、集与场景结构
3. 动作、对白与生产标签
4. 注释与未知内容
5. 完整格式示例
6. 稳定 ID、临时索引与修订
7. 现有文本的规范化入口
8. 剧本中不应出现的内容
9. 完成前检查

## 1. 设计目标与事实所有权

`剧本.md` 要能在普通 Markdown 编辑器中直接阅读,同时让下游准确引用场景、动作、对白与生产要求。

- 它是场景边界、动作、对白和生产指令的**唯一可编辑剧本源**。
- 需要时生成的临时索引只帮助识别场景、标签和时长,不得反向改写正文,也不作为项目交付。
- 单集契约和节拍只在上下文中帮助写作,不另建卡片或节拍文件。
- 资产、分镜、图片/视频提示词与审查结论引用剧本,不在剧本中取得所有权。

规则权限:

- **`structural_invariant`**:标题语法、稳定 ID、受支持标签、来源范围与显式矛盾;校验器可阻断。
- **`reviewed_invariant`**:动作是否可表演、语义是否被规范化过程改变;审查者引用证据判断。
- **`craft_default`**:现在时、经济动作、可执行表演提示;可由创作者说明理由覆盖。
- **`taste_option`**:对白口语度、旁白、沉默、动作段落长短与风格化形式;只记录选择。

## 2. 文件、集与场景结构

### 2.1 集标题

```md
# EP001 【集名】
```

`EP001` 是稳定集 ID。修改集名不改 ID。

### 2.2 场景标题

```text
## <场景ID> <内|外|内外> · <地点> · <时间/天气>
```

示例:

```md
## EP001-SC003 内 · 渡口售票室 · 雨夜
```

- 场景 ID 在同一项目中唯一且稳定;
- “内/外/内外”说明主要行动空间;
- 地点使用创作者可识别名称,不写资产内部编号;
- 时间/天气只保留对表演、光线、行动或连续性有用的事实;
- 修改显示名称不改 ID;真正新建场景才分配新 ID;
- 拆分/合并后无法明确映射时,展示映射选择,不能静默猜测。

**`structural_invariant`**:生产场景必须有可解析的稳定场景 ID、空间性质、地点和时间/天气字段。
1:# 中文短剧剧本方法
3:## 目录
18:## 1. 剧本的任务与规则分级
33:## 2. 从单集契约到场景
35:### 2.1 先锁定不可丢失的事实
58:### 2.2 选择场景,而不是给节拍配房间
75:### 2.3 场景依赖检查
89:## 3. 冲突场景的发动机:目标、反对、转向、退出
104:### 3.1 目标要能作用于现场
115:### 3.2 反对不是说“不”
131:### 3.3 转向要改变下一动作
147:### 3.4 巧合与误会:什么时候可以用
185:### 3.5 把一拍写成艰难选择时,两个方向都要活着
209:## 4. 把内在意义写成可表演行动
211:### 4.1 区分意义与载体
231:### 4.2 用可表演动词
252:### 4.3 让反应承担后果
264:### 4.4 能演的不说:VO、内心独白与痛点
284:## 5. 用空间、物件与反应组织冲突
286:### 5.1 空间是可用关系
298:### 5.2 物件要进入行动链
319:### 5.3 证据先改变判断,再改变关系
349:### 5.4 主要配角有策略,事务角色不硬加戏
364:### 5.5 人多的场次:先解决"谁是谁"
386:### 5.6 主角不在场的场次
398:## 6. 节奏来自压力变化
409:### 6.1 加速
417:### 6.2 留出呼吸
432:### 6.3 倒计时先算动作,不要只写数字
457:### 6.4 有限单位按完成状态计数
463:### 6.5 项目节奏档案
490:## 7. 写动作段落与生产事实
492:### 7.1 动作段落
503:### 7.2 表演提示
515:### 7.3 生产标签
530:## 8. 开场、收束与集间交接
532:### 8.1 开场接住进入状态
554:### 8.2 收束完成本集承诺
581:### 8.3 写清退出状态
596:## 9. 修订方法
600:### 9.1 因果遍
612:### 9.2 选择遍
618:### 9.3 证据遍
624:### 9.4 场景遍
633:### 9.5 可表演遍
637:### 9.6 具体性遍
647:### 9.7 生产事实遍
651:### 9.8 声音与潜台词遍
655:### 9.9 扫读遍
675:### 9.10 经济性遍
679:### 9.11 所有权遍
683:## 10. 现有剧本的最小规范化
703:## 11. 合成示例
707:### 11.1 只有说明,没有场景运动
713:### 11.2 把意义放进动作
716:## EP001-SC002 内 · 社区打印店 · 夜
747:## 12. 失败征兆与审查问题
749:### 失败征兆
772:### 审查问题
Bash Read VO, opening, tag syntax, init options

输入

sed -n 264,284p references/script-craft.md; sed -n 530,600p references/script-craft.md; sed -n 60,140p references/screenplay-format.md; cd ../short-drama; python3 scripts/project_tool.py init --help

返回

### 4.4 能演的不说:VO、内心独白与痛点

画面已经演出来的事,`[VO]` 不再说一遍。她当众把欠条撕成两半,已经说明她不认这笔账,旁白就不必再补
一句“这钱我不会还”。反过来,台词已经说清的事,下一场也不再演一遍。两种载体重复时,留演出来的那一个。
`[VO]` 只承担画面给不出的东西:与画面相反的判断、被隐瞒的打算、跨时间的认知。

内心独白能外化就外化。大段“我穿越了”“我一定要……”换成一个动作加一句台词;让旁人把心里话说出口;
让手机屏幕、证件、胎记这类物件在画面里交代身份;必要的回忆只保留当前行动所需的闪回。系统面板与提示
交给 `[画面文字]` 或已接受的声音方案,不让系统声替主角想事情。

痛点写成观众亲眼看见的一场戏。“他一直被人看不起”不是痛点;“酒席上,反派当众把酒泼在他脸上”才是。
观众看见了被压下去的那一下,后面的回报才有落点。

项目已接受节奏档案时,核对 `[VO]` 字数占全部台词字数的比例与 `vo_share_max`。时长估算脚本
加上 `--project` 后,在上限有效且本集有台词时报告该比例;统计去掉空白与括注、保留标点,
`[OS]` 计入全部台词但不计入 VO。这个口径用于占比核对,不能直接当作排除标点、按实际读法处理数字后的语速换算字数。

**`craft_default · SCR-20`**:`[VO]` 不复述画面已经演出的信息;内心独白尽量外化为动作加一句台词、
旁人的话或可见物件;痛点落成具体场景;项目已接受节奏档案时,VO 占比不超过 `vo_share_max`。

## 5. 用空间、物件与反应组织冲突
## 8. 开场、收束与集间交接

### 8.1 开场接住进入状态

开场优先让观众看见:

- 正在继续的行动;
- 已落地的后果;
- 当下必须处理的矛盾;
- 与既有认知冲突的可见事实。

若环境本身携带威胁、限制或信息,它可以成为开场主体;不要无条件禁止氛围。

**第一拍自己就是钩子**。全集第一段动作描写就是观众开场第一帧看到的画面。静止的第一拍可以是一件
不该在那里的东西、一张盯着什么的脸;要读字才成立的信息换个做法:一排惨淡的数字配上看着它的人
正在变的脸,或者让压他的人已经站在画里。

**`craft_default · SCR-22`**:全集第一拍单独成立为钩子:看得见的冲突、反常画面、悬着的问题或
峰值的最后一拍,静止画面只要自己提出问题也算;靠读字、认人或下一句台词才成立的信息不单独做第一拍。

**`craft_default`**:在压力活跃处进入,并用具体行动证明进入状态,而非先由人物复述上集。

**`taste_option`**:冷开场、缓慢观察、先果后因、平静日常都可以选择;它们必须服务作品的观看契约。项目已接受节奏档案时,无论哪种开场,钩子都要在档案的首钩时限内到达(见 6.5)。

### 8.2 收束完成本集承诺

结尾先完成本集承诺的功能:局部结果、关系重新定义、认知变化、喜剧落点、恐惧余波、讽刺反照、
主题意象或有意保持开放都可成立。连载需要交接时,再写清下一集继承的行动、知识、关系与物理状态,
不强制在最后一拍追加外部事件。项目已接受的节奏档案要求停在峰值时,按 6.5 收尾。

局部回报不必清空代价。选择后仍存在的残余可留在人物行为、关系、空间、声音或物件状态里;主题已经
能从结果读出时,不再用抽象口号解释。重复动作、静止画面或环境声也能收束,只要它因前文获得新意义。

如果前文把某项代价当作行动的核心阻力,退出状态至少要保留它的一项实质影响:能力暂时缺口、身体损伤、资源消耗、
关系债务或必须处理的后续行动均可。不要在高潮后立即让系统、能力或局面自动复位,使原先的赌注只留一处轻微痕迹。

回报落下后,逐拍问“它加深了结果、改变了意义、留下了余韵,还是重复说明?”多项后果可以并存,不强制只留一拍;
只有功能相同、观众已接收的内容才合并。安静余韵不是空转,机械复述才是。
人物放下、拿起、让路、留下或离开的动作已清楚表明了意向时,后面再写一次同向决定只会稀释第一次,除非中间有新阻力使第二次付出了不同代价。
笑点、情感或意象也一样:行动和画面已经完成的意义,不再用一句标语概括;一个生活细节已经形成隐喻时,不连续用多句人生道理翻译它。

已经声明不可逆的后果不应被后续动作无意写回轻易可挽回。作品若有意展示缓和、反转或仍存余地,让新的
因果清楚可读,而不是靠含混连续性同时声称“路径关闭”和“其实没关系”。

承担关系转折的主要人物应有相称反应,但反应可以是撤回、回避、沉默、策略变化或延迟爆发,不要求统一
改持物或立刻表态。结尾连续性则要求关键持物、空间和知识状态能从前文动作追溯;氛围性钩子、黑场、
声音和静止画面都可使用,只要它们完成作品的期待,而不是替代一个本该写出的结果。

**`craft_default · SCR-15`**:收束留下可读的结果或余效,并服从本集观看契约;推进、留白、反讽、
静止或开放状态都可成立,不用抽象口号替观众解释,也不为满足规则强造新事件。

### 8.3 写清退出状态

检查:

- 谁在哪里,正要做什么;
- 谁知道/不知道什么;
- 谁持有什么,状态如何;
- 关系与权力怎样变化;
- 伤势、服装、光线、天气、时间是否延续;
- 哪项动作已经不可撤回。

剧本明确写出的退出事实应与已确认的分集规划或上下文中的单集契约一致。有分集规划时,
改变既定交接结果先交 `$short-drama-develop` 修订规划;直接写作时,由写作阶段按用户要求
修订上下文中的契约,并同步剧本,不另建卡片或第二份交接事实。

## 9. 修订方法

不要一遍同时改所有问题。每一遍只解决一种失败,并保护已接受选择。

### 9.1 因果遍
**`structural_invariant`**:生产场景必须有可解析的稳定场景 ID、空间性质、地点和时间/天气字段。

## 3. 动作、对白与生产标签

### 3.1 动作段落

普通段落表示现在发生、可见或可表演的行动:

```md
游森把湿透的末班票压在玻璃下,手指仍挡着日期。
```

写作要点:

- **`craft_default`**:使用现在时与可执行动词;焦点行动、信息或空间关系变化时另起段落。
- **`reviewed_invariant · SCR-03`**:关键心理/认知变化要有行为、证据、空间后果或有意声音作为载体。
- **`taste_option`**:完整动作链、氛围或推理可以保留较长段落,不按统一长度切分。
- **`craft_default · SCR-18`**:动作段落**不要以「短语+全角冒号」开头**。
  `第二格:一只手把杯子推过去。` 与 `屏幕上正在放的东西:一段没有声音的录像。` 这样的写法
  和 3.2 的对白语法(`角色名:台词`)在字面上完全一样,索引器只能报
  `ambiguous_dialogue_or_action`,交回写作阶段判断。
  改法是把冒号换成破折号、逗号或一个动词:`第二格换成一只手把杯子推过去。`
  `屏幕上正在放的是一段没有声音的录像。` 句中冒号不受影响,需避免的是**行首短语后的冒号**。

不要在动作段落里写镜号、景别、镜头运动、焦段、生成参数或素材位。

### 3.2 对白

```text
角色名(可选的表演/策略提示):台词
```

示例:

```md
葛晴(不让门外的人听见):你卖的是明天的票。

游森:你先说,今天那班船去了哪里。
```

- 角色名与说话者必须明确;
- 建索引前由写作所有者确认本集说话者清单;工具只核对清单,不从冒号前缀猜人物;
- 提示描述一个可执行策略或变化,不堆叠同义情绪词;
- 台词跨段确有必要时保持说话者清楚;
- 现场不可见说话者使用 `[OS]`,非现场主观/叙述声音使用 `[VO]`。

**`reviewed_invariant · SCR-04`**:对白质量由议程、关系、潜台词与造成的变化判断,不由长度或比例判断。

### 3.3 生产标签

只在事实对故事不可省略时使用:

```md
[VO] 葛晴:我那时还不知道,票背面的孔不是验票留下的。
[OS] 船员:关窗,水进来了!
[SFX] 远处传来一声短促汽笛。
[画面文字] 票面日期:11月6日
[连续性] 游森把黄铜钥匙交到葛晴左手;下一场仍由葛晴持有。
[转场] 汽笛声延续到清晨的空码头。
```

标签含义:

| 标签 | 用途 | 不应用来做什么 |
|---|---|---|
| `[VO]` | 非现场主观/叙述声音 | 隐藏普通可见行动 |
| `[OS]` | 同一场景中的画外对白 | 代替明确说话者 |
| `[SFX]` | 改变注意、行动或信息的声音 | 罗列全部环境声 |
| `[画面文字]` | 观众必须读清的载体与精确内容 | 复制一般道具说明 |
| `[连续性]` | 易丢失且影响后续的状态变化 | 把整套人物设定贴入每场 |
| `[转场]` | 有叙事意义的转场要求 | 编写剪辑方案全集 |

**`structural_invariant · SCR-05`**:已存在的生产标签必须使用受支持、可闭合的语法,
来源引用可解析,标签类型与内容一致。校验器只证明已写标签的结构合法。

**`reviewed_invariant · SCR-07`**:审查者要对照剧情意义,检查必读文字、
VO/OS、改变行动/信息的关键声音、有叙事意义的转场与易丢连续性事实有没有
被遗漏。这是语义判断,不能由关键词扫描代替。

## 4. 注释与未知内容

usage: project_tool.py init [-h] --title TITLE [--language LANGUAGE]
                            [--prompt-language PROMPT_LANGUAGE]
                            [--aspect-ratio ASPECT_RATIO]
                            [--episode-count EPISODE_COUNT]
                            [--target-seconds TARGET_SECONDS_PER_EPISODE]
                            path

positional arguments:
  path

options:
  -h, --help            show this help message and exit
  --title TITLE
  --language LANGUAGE
  --prompt-language PROMPT_LANGUAGE
  --aspect-ratio ASPECT_RATIO
  --episode-count EPISODE_COUNT
  --target-seconds TARGET_SECONDS_PER_EPISODE

思考 349 秒

Bash Inspect project init implementation

输入

grep -n "def cmd_init\|def init" -A40 scripts/project_tool.py | head -80

返回

368:def initialize_project(
369-    path: Path,
370-    *,
371-    title: str,
372-    language: str,
373-    aspect_ratio: str,
374-    prompt_language: str = DEFAULT_PROMPT_LANGUAGE,
375-    episode_count: int | None = None,
376-    target_seconds_per_episode: float | None = None,
377-    suite_root: Path | None = None,
378-) -> dict[str, Any]:
379-    language = normalize_language_tag(language, field="language")
380-    prompt_language = normalize_language_tag(prompt_language, field="prompt_language")
381-    if episode_count is not None and (
382-        isinstance(episode_count, bool)
383-        or not isinstance(episode_count, int)
384-        or episode_count <= 0
385-    ):
386-        raise ValueError("episode_count must be a positive integer")
387-    if target_seconds_per_episode is not None and (
388-        isinstance(target_seconds_per_episode, bool)
389-        or not isinstance(target_seconds_per_episode, (int, float))
390-        or not math.isfinite(target_seconds_per_episode)
391-        or target_seconds_per_episode <= 0
392-    ):
393-        raise ValueError("target_seconds_per_episode must be a positive number of seconds")
394-    root = path.expanduser().resolve()
395-    project_path = root / PROJECT_FILE
396-    if project_path.exists():
397-        raise FileExistsError(f"project already exists: {project_path}")
398-
399-    root.mkdir(parents=True, exist_ok=True)
400-    for relative in PROJECT_DIRS:
401-        (root / relative).mkdir(parents=True, exist_ok=True)
402-
403-    core = suite_root or Path(__file__).resolve().parents[1]
404-    project = json.loads(
405-        (core / "assets/project-template/short-drama.json").read_text(encoding="utf-8")
406-    )
407-    project.update(
408-        {

思考

Bash Initialize short-drama project in current directory

输入

cd /scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1 && python3 .claude/skills/short-drama/scripts/project_tool.py init . --title "七格药盒" --language zh-CN --aspect-ratio 9:16 --episode-count 60 --target-seconds 90 && ls -la

返回

{"project": {"created_at": "2026-10-18T05:40:00.814870Z", "creator_authority": {"constraints": [], "decisions_artifact": "\u521b\u4f5c\u8005\u51b3\u7b56/", "delivery_surface": {"aspect": null, "overlay_regions": [], "source_ref": null, "status": "unset"}, "production_profile": {"choices": {}, "status": "unset"}, "rhythm_profile": {"status": "unset"}, "visual_direction": {"choices": {"look_development": null}, "status": "unset"}}, "format": {"aspect_ratio": "9:16", "episode_count": 60, "pacing": {"seconds_per_action_paragraph": null, "spoken_characters_per_second": null}, "prompt_language": "en", "target_seconds_per_episode": 90.0}, "language": "zh-CN", "project_id": "SD-DCB4FEA1F4B9", "schema_version": "1.0.0-draft", "title": "\u4e03\u683c\u836f\u76d2"}, "project_root": "/scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1", "state": {"artifacts": {}, "last_action": "initialized", "project_id": "SD-DCB4FEA1F4B9", "project_layout_mode": "auto", "schema_version": "2.0", "updated_at": "2026-10-18T05:40:00.815035Z"}}
total 16
drwxr-xr-x  13 user  wheel  416 Oct 17 22:40 .
drwxr-xr-x   3 user  wheel   96 Oct 17 22:33 ..
drwxr-xr-x   4 user  wheel  128 Oct 17 22:33 .claude
drwxr-xr-x   3 user  wheel   96 Oct 17 22:40 .short-drama
-rw-r--r--   1 user  wheel  244 Oct 17 22:33 premise.md
-rw-r--r--   1 user  wheel  905 Oct 17 22:40 short-drama.json
drwxr-xr-x   2 user  wheel   64 Oct 17 22:40 交付
drwxr-xr-x   2 user  wheel   64 Oct 17 22:40 创作者决策
drwxr-xr-x   2 user  wheel   64 Oct 17 22:40 剧集
drwxr-xr-x   2 user  wheel   64 Oct 17 22:40 审查
drwxr-xr-x   2 user  wheel   64 Oct 17 22:40 设定集
drwxr-xr-x   2 user  wheel   64 Oct 17 22:40 输入
drwxr-xr-x   2 user  wheel   64 Oct 17 22:40 项目开发

思考 3 秒

Agent:
Project initialized. Now writing the character bios.
Write ./人物小传.md

输入

/scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1/人物小传.md

# 《七格药盒》主要人物小传

> 竖屏真人短剧 · 60 集 · 每集 1–2 分钟
> 一句话:药业老爷子出殡当天宣读遗嘱,62 亿全部留给照顾了他三年的护工姜禾,条件是她得在顾家老宅住满七七四十九天。顾家要在 49 天里把她赶走、送进监狱,或者让她死;姜禾要在 49 天里查出是谁毒死了老爷子,而老爷子死前吃的那种药,五年前已经毁过她一次。

---

## 姜禾 · 女主 · 28 岁

**表面身份**:顾怀山的住家护工,做了三年。话少,手稳,记性极好。顾家上下没人记得她姓什么,都叫她"小姜"。

**真实过去**:五年前是怀山医院门诊药剂师。2021 年,一位退休教师方老师吃了她发出的地高辛后死亡,院方和怀山药业认定是她"错发了双倍规格"。她被吊销执业资格,没坐牢,但每月往方家打 3000 块,打了五年,一次没断。她一直知道自己没发错,可拿不出证据。

**为什么留下**:钱是最后才考虑的。离开顾家等于认下谋杀;更要紧的是,老爷子死于地高辛过量,跟五年前是同一种药。她想弄明白那批药到底怎么回事,这是她这辈子唯一一次机会。

**能力(她的武器)**:
- 药剂师的眼睛:药片的规格、刻痕、切口、瓶签、批号、留样封签,她一眼就能看出不对。
- 护工的记忆:老宅每扇门、每个柜子、每个人几点上楼,她都清楚。
- 她给老爷子的地高辛一律用自己的切药器掰成半片,切口有固定的斜度。这个习惯后面成了全剧第一条物证。

**底线**:不拿药害人,也不为了自保冤枉别人。哪怕把罪名推给周曼琳最省事,她也不推(第 31 集)。

**弱点**:从不替自己辩解,习惯先认错。五年前就是这样被定的罪。前期她总是先忍,后面要学会当众开口。

**弧线**:先是被赶出门的护工,然后成了被全家围猎的嫌疑人,再到在董事会上拿表决权的继承人,最后清掉了自己五年前的罪名,重新站回药房柜台后面。最后一个选择:第 48 天夜里,为了救张妈离开了老宅,主动放弃 62 亿。

**标志物**:七格药盒(周一到周日)、切药器、手背上一道旧烫疤(煎药时留下的)。

**说话方式**:短句,不解释,不求人。被逼急了只报事实:"这不是 0.125 毫克的片子。"

---

## 陆既明 · 男主 · 33 岁 · 遗嘱执行律师

**身份**:恒衡律师事务所合伙人候选人,顾怀山亲自指定的遗嘱执行人。按遗嘱规定,他每逢"七"要当着全体继承人拆一封老爷子的亲笔信。

**外在目标**:把遗嘱一字不差地执行完,不偏任何一方。

**处境**:怀山药业是他们律所最大的客户,顾承泽随时能拿这层关系压他。保持中立对他来说是职业要求,也是自保。

**筹码**:遗嘱解释权,比如"自行离开"怎么认定、门禁记录怎么算,还有七封信的保管权。

**内在矛盾**:他嘴上一直说"我只对遗嘱负责",可从第 1 集起就在规则允许的范围里给姜禾留了门,比如把车钥匙"忘"在桌上。第 19 集,顾承泽让律所撤他,他选择辞职,以个人身份继续当执行人。

**与姜禾**:两个人都是靠一张执照吃饭,一个已经丢了,一个随时可能丢。感情线慢慢走,先是互相信任,后来他愿意替她付代价,结尾留白。

**说话方式**:引条款,语速慢,从不提高音量。真动了情绪的时候反而会说半句就停。

---

## 顾念 · 真凶 · 38 岁 · 老爷子的小女儿

**表面**:怀山药业质量副总,管质检和留样。未婚,温和,是全家唯一对姜禾好的人:给她送被子、送汤,在家族会议上替她说话,后来又陪她去挖证据。老爷子最疼她,叫她"念念"。

**真相**:
1. 2021 年那批地高辛含量超标,是她签字放行的。出事以后,大哥顾承泽为了保公司,把责任推到医院药剂师身上。他以为这只是一次"质检疏忽",不知道顾念当时明知数据有问题还签了字。
2. 老爷子临终前一个月开始翻 2021 年的旧账。死前那周,他当面问了顾念。
3. 顾念用大哥借给她开会的工牌,在职工药房领了一瓶 0.25 毫克地高辛,把药盒里周一到周四的半片换成了整片,每格两片,相当于原剂量的四倍。
4. 第 3 集那一夜,她借送汤看到了药盒里周五那格,半夜进屋把整片换回了半片。

**动机**:她怕的不是坐牢,是父亲在信里、在全家人面前说出她做过的事。她这一辈子都是"最懂事的那个孩子"。

**策略**:她从不正面动手,只帮忙,在帮忙的过程中拿到信息,再顺手改掉证据。被逼到后段,她牺牲大哥(第 41–45 集)。最后才亲自出手(第 54 集)。

**给观众的公平线索**:
- 第 3 集送汤时,视线在药盒周五那格停了一下;
- 第 6 集姜禾当众背出 2021 年那批药的批号,窗边的顾念手指收紧;
- 第 8 集拆第一封信时,她手里的茶杯磕到了碟沿;
- 一直戴着母亲留下的翡翠镯子(第 56 集监控截图的关键);
- 第 37 集后院的土比别处松,她说是"昨晚下过雨"。

**说话方式**:轻声,叫人全名,常说"我陪你"。全剧只在第 55 集失控过一次。

---

## 顾承泽 · 长子 · 52 岁 · 怀山药业总裁

**目标**:保住公司和股价。他对父亲的死有怀疑,可怀疑不等于他想要真相。"创始人被毒死"一上热搜,股价会腰斩。

**筹码**:董事会、公司档案、法务、律所的生意、媒体关系。他打的是程序仗:提前火化、发起定向增发、在股东会上撤销姜禾的代理表决权。

**罪**:2021 年签了和医院的和解协议,亲手把罪名安在姜禾身上。他没杀父亲。

**弧线**:头号程序对手,第 13 集为了自保把嫌疑推给妻子,第 44 集被妹妹设计成了替罪羊、被刑拘。最后和姜禾做交易:交出 2021 年的内部档案,换她证明他没有杀人。他认下掩盖的罪,被罢免。

**说话方式**:"我们按流程来。"从不骂人,骂人的事交给他太太。

---

## 周曼琳 · 长媳 · 50 岁 · 管家的女主人

**目标**:把姜禾赶出老宅,保住丈夫和儿子的份额。

**筹码**:整座房子归她管:门禁密码、佣人、厨房,谁住哪间屋也是她说了算。还有舆论,她能把方苒请到门口来。

**罪**:老爷子生前最后两个月,她每晚往燕窝里磨进地西泮(安定),让他白天犯糊涂,再拿家庭医生开的"认知评估"去申请监护、改遗嘱。她没下地高辛。

**弧线**:前 30 集的主要对手。先赶人,再栽赃,再想推翻遗嘱效力,最后被亲儿子指证,第 30 集戴上手铐。她被带走时喊的那句"我只放了安眠药"把案子重新打开。第 49 集在看守所里,她说出那天夜里看见顾念从老爷子房里出来。

**说话方式**:每句都带称呼,"小姜""我们顾家"。笑着说狠话。

---

## 顾屿 · 长孙 · 25 岁 · 周曼琳之子

**表面**:在怀山药业挂职的富二代,嘴毒,看姜禾最不顺眼。

**真实**:全家只有他小时候是爷爷一手带大的。他恨姜禾,是因为爷爷最后三年只跟她说话。

**关键选择**:
- 第 2 集,他拦下火化,图的是验出姜禾杀人好让她丧失受遗赠权,不是为了帮她;
- 第 12 集和姜禾打赌,帮她查职工药房的领药记录,查出来的是自己父亲的工牌;
- 第 29–30 集当众作证,说他亲眼见过母亲往燕窝里磨药粉。

**弧线**:从敌人到盟友,代价是亲手把母亲送进看守所。

**说话方式**:抢话,爱冷笑,越在意越嘴硬。

---

## 顾承安 · 次子 · 46 岁

**目标**:钱,越快越好。外面欠了 1800 万赌债。

**筹码**:现金诱惑和外面的人。第 7 集拿 2000 万买姜禾签放弃书,放弃书里埋了一句认罪条款。第 40 集为了吓她搬走,放火烧了储藏间。

**作用**:最显眼的嫌疑人,也是最钝的刀。观众怀疑他,可他连地高辛和维生素都分不清。

---

## 唐砚 · 刑警 · 40 岁

**立场**:只认证据。他把姜禾列为第一嫌疑人,理由很实在:她是受遗赠人,每天给老爷子分药,五年前还"出过同一种药的事"。

**作用**:前期是悬在她头上的刀(第 10 集上手铐),中期变成她能借的力(第 3 集的"指定地点"开了门,第 31 集她拒绝让他草草结案,他开始信她),后期负责抓人。

**说话方式**:问话只问时间、地点、谁经手。

---

## 张妈 · 老佣人 · 60 岁

在顾家做了 30 年,燕窝是她炖的。她知道周曼琳往碗里加过东西,可孙子的学费靠周曼琳给。第 21 集被姜禾放的一段录音说动,老爷子在录音里说"张妈的燕窝最好喝"。第 28 集摔下楼梯昏迷。第 50 集醒来,说出老爷子死的那夜凌晨两点,她看见顾念在屋里分药盒。第 54 集被顾念带走,成了逼姜禾离开老宅的人质。

---

## 方苒 · 30 岁 · 2021 年死者方老师的女儿

恨了姜禾五年,第 5–6 集被周曼琳请到顾家门口直播。她手里一直攥着父亲当年没吃完的半瓶地高辛,五年没让任何人碰过,本来是留着打官司用的。这半瓶药是 2021 年那批货在世上仅剩的、没被顾念动过的样本。第 52–53 集,她当着姜禾的面拆开封口送检,结果证明药厂超标,姜禾的罪名被洗清。

---

## 顾怀山 · 已故 · 78 岁 · 怀山药业创始人

只出现在信、录音笔和少量闪回里。他知道自己被人下了药,猜错了是谁(第四封信写的是"曼琳"),也一直不肯怀疑最疼的女儿。他留下七封信,每逢"七"由律师当众拆一封。信是公开宣读的,所以每封信帮了姜禾,也同时武装了她的对手。最后一封信揭开那 49 天的真正用意:钱不是给她的,是给她拿去"替顾家还债"的。

---

## 人物关系与信息权限(第 1 集时)

| 谁 | 知道 | 不知道 / 误信 |
|---|---|---|
| 姜禾 | 自己当年没发错药;老爷子的药一直由她掰成半片 | 是谁换的药;老爷子知道她的过去 |
| 顾念 | 一切 | 老爷子把真留样藏在了哪里;方苒手里还有半瓶 |
| 周曼琳 | 自己下过安定 | 有人另外下了地高辛,她以为老爷子就是"糊涂死的" |
| 顾承泽 | 2021 年是自己压下去的 | 妹妹是明知故放;父亲是被毒死的 |
| 顾屿 | 见过母亲深夜磨药粉,当时没多想 | 爷爷的死因 |
| 陆既明 | 七封信的拆封日期 | 信的内容 |
| 唐砚 | (第 2 集介入) | 一切 |

返回

File created successfully at: /scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1/人物小传.md (file state is current in your context — no need to Read it back)

思考 175 秒

Agent:
Now the 60-episode outline with paywall points.
Write ./分集大纲.md

输入

/scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1/分集大纲.md

# 《七格药盒》60 集分集大纲

> 竖屏真人短剧 · 9:16 · 60 集 · 每集 60–120 秒(目标约 90 秒)
> 宣发备用名:《护工继承了六十二亿》
> 人物见 [人物小传.md](人物小传.md);第 1–3 集剧本见 `剧集/EP001–EP003/剧本.md`

## 系列设定

**一句话**:药业老爷子出殡当天宣读遗嘱,62 亿全部留给照顾了他三年的护工姜禾,条件是她必须在顾家老宅住到七七。顾家要在 49 天里把她赶走、送进监狱,或者让她死;姜禾要在 49 天里查出是谁毒死了老爷子,而老爷子死前吃的那种药,五年前已经毁过她一次。

**遗嘱条件(全剧时钟)**:姜禾须在顾宅居住至七七(老先生过世第 49 天),每晚以门禁记录为准。期间她如果自行离开、被追究刑事责任或者死亡,遗赠失效,全部财产转入"顾氏家族信托"。信托的受托人写在第七封信里,要到七七才拆封。

**七封信**:老爷子生前写好,交给执行律师陆既明,每逢"七"当着全体继承人拆一封。信是公开读的,每封信帮了姜禾,也同时武装了她的对手。老爷子猜错过一次凶手。

| 拆信日 | 集 | 信的内容 | 帮了谁 / 害了谁 |
|---|---|---|---|
| 头七 | 8 | 2021 年那批药不是你的错,是我签字让你背的 | 她五年的冤屈被承认了,可全家和警方也都知道了她跟这种药的关系 |
| 二七 | 17 | 书房第三排《本草纲目》第三册 | 录音笔在里面,所有人都去抢 |
| 三七 | 23 | 41% 表决权即日起由姜禾行使 | 她进了董事会,战场搬到公司 |
| 四七 | 29 | "如果我死了,是曼琳" | 他猜错了人,可这封信逼出了儿子的指证 |
| 五七 | 36 | 2021 年留样埋在玉兰树下,"念念,帮她" | 他把线索交到了真凶手里 |
| 六七 | 43 | 我埋的那瓶,瓶底刻了"禾"字 | 证明留样被调了包 |
| 七七 | 57 | 家族信托的受托人是姜禾 | 全家为了赶她走斗了 49 天,结果她走不走都一样 |

**引擎**:每一轮都是顾家有人出手赶她、栽赃她或者要她的命,姜禾用药剂师的专业眼光和护工对这座房子的熟悉拆招,拆招的过程里总会多出一条指向凶手的线索,而这条线索又会让下一个人急着出手。对手按四种手段依次升级:先管房子(周曼琳),再动钱(顾承安),再走程序(顾承泽),最后是一直在帮她的那个人(顾念)。

**两条罪、两条路**:周曼琳往燕窝里下地西泮,想让老爷子显得糊涂,好申请监护、改遗嘱;顾念往药盒里换地高辛,要他死。燕窝和药盒是两条路,凶手不是一个人。第 30 集把这一层揭开,周曼琳落网,案子重新开始。

**结局承诺**:真凶落网,姜禾洗清五年前的罪名、重新拿回执照;62 亿她一分没拿去自己花,用来召回药品、赔偿 2021 年的受害者。感情线留白。

---

## 付费卡点

| 卡点 | 集 | 停在哪里 | 观众此刻欠着什么 |
|---|---|---|---|
| **卡点①(主卡点)** | **第 10 集** | 手铐已经扣上一只,姜禾盯着证物袋里的药房标签,脸色变了 | 她看出了什么?能不能当场翻案?49 天还剩 41 天,她要是进去了,一切归零 |
| **卡点②** | **第 29 集** | 四七信点名周曼琳,全场沉默,顾屿站起来对着母亲说了半句"那包药粉……" | 儿子到底会不会指证亲妈?已经铺了 20 集的周曼琳会不会倒? |
| **卡点③** | **第 46 集** | 门禁记录显示,两个关键的夜里只有顾念在宅子里。抬头一看,顾念正站在门口,端着一杯茶 | 这杯茶喝还是不喝?全剧最信任的人就是凶手 |

三个卡点都停在揭晓的前一秒,悬念用的都是观众已经认识的人、已经懂的规则(49 天、门禁、药盒)和已经押上的赌注。每个卡点集自己的局部结果先兑现,比如第 10 集,搜出空瓶这一下就是实打实的损失,然后才停。

---

## 第一卷 · 赶(第 1–10 集 · 第 3–8 天)

**EP01 出殡** |第 3 天·雨
白幡底下,姜禾的行李箱被扔下台阶摔开,一个七格药盒滚进了雨水里。周曼琳往水坑里甩了一个装着三年工资的信封。律师陆既明赶到,坚持遗嘱"必须在出殡前宣读":怀山药业 41% 股权、老宅、现金,合计约 62 亿,全部遗赠给姜禾,条件是住到七七。全场大乱。陆既明读出遗嘱最后一页的亲笔附言:"我不是病死的。别让他们烧了我。"顾承泽走到窗边打电话:"提前火化,现在。"姜禾抓起陆既明"落"在桌上的车钥匙,冲进雨里。

**EP02 炉前** |第 3 天
殡仪馆,推车已经进了炉口,姜禾张开手臂堵在炉门前。她不是家属,没有资格拦,保安把她往外拖。顾屿开口:"停。验。验出来是她,她一分钱都拿不到。"故意杀害被继承人的人会丧失受遗赠权,他要的是让她输。刑警唐砚到场,封存遗体送去尸检,对她说:"你是报案人,也是第一嫌疑人。今晚待在顾家,哪儿也别去。"深夜她回到老宅门口,门禁亮着红灯。周曼琳在对讲机里说:"密码改了。过了十二点,就算你自己走的。"

**EP03 七格** |第 3 天夜—第 4 天晨
23:52,门外。她打给唐砚:"你让我待在顾家,他们不让我进。"唐砚在电话里让保安开门,门禁记下 23:59。周曼琳让她住储藏间。灯下,她打开捡回来的药盒,周五那格是两片整片,周六那格是她切的半片。老爷子吃到的剂量不对。她拍了照。顾念端着汤和被子进来,看见了药盒。第二天清晨,周五那格变成了半片,她卡在门后的椅子被挪开了半尺。

**EP04 扳指** |第 4 天
有人半夜进过她的屋。她把药盒贴身带着,手机对着房门开了录像。中午,周曼琳说老爷子的翡翠扳指丢了,当众在储藏间枕头底下"搜"了出来,叫来警察。盗窃一旦立案,就碰上了"被追究刑事责任"那一条。姜禾调出录像,画面里拍到了佣人小莲的袖口。小莲当场崩溃:"太太让我放的。"周曼琳一巴掌打在小莲脸上,当场辞退,把自己摘得干干净净。出去状态:周曼琳知道姜禾会录像了,下一次会换打法。

**EP05 多开的一瓶** |第 5 天
姜禾找到家庭医生何医生,要看老爷子的处方记录。何医生推说家属不许。她指出处方本上两周前多开了一瓶 0.25 毫克地高辛,那是她从来没申请过的。何医生说:"是顾太太打电话让开的。"她回到老宅,门口挤满了记者,方苒举着父亲的遗像:"五年了,你又害死一个。"

**EP06 批号** |第 5 天
方苒开着直播堵门,周曼琳在门里看戏。姜禾不辩解,对着镜头背出了方老师那瓶药的批号和生产日期:"这批药,我记了五年。"方苒愣住,举起手里一个旧药瓶:"我爸剩下的半瓶,我留了五年,就等着告你。"批号对得上。直播间的风向第一次分裂。窗边的顾念把窗帘攥出了褶。唐砚看完直播找到她:"两个死者,同一种药。你说巧不巧?"

**EP07 两千万** |第 6 天
顾承安单独找她,拿 2000 万现金换一份放弃声明。她真的拿起了笔,手机里是五年来每月给方家转 3000 块的记录。笔尖落下前,她翻到第三页,看见一行小字:"本人对顾怀山先生之死负有护理过失。"她把放弃书推了回去,顾承安撕了支票。夜里,老爷子贴着封条的卧室里有手电光,她推开门,一个黑影从阳台翻了出去。床头那根录音笔的充电线还插着,录音笔不见了。

**EP08 头七** |第 7 天
头七家祭,陆既明拆开第一封信:"五年前那批地高辛,不是你的错。是我签字,让你背的。"姜禾扶着桌沿才站住。顾念手里的茶杯磕响了碟沿。顾承泽马上接话:"爸糊涂了,这恰恰说明她三年给他洗了脑。"唐砚带着尸检初步结果进门:地高辛血药浓度超过治疗量四倍,另外还检出了地西泮。他问:"顾家谁负责给老爷子分药?"所有人都转过头看她。

**EP09 对不上** |第 7 天夜
她被传唤到刑警队,周曼琳在家里等着十二点。问询室里,她拿出药盒和照片,解释半片的切口。唐砚把药盒推回来:"你照片里周五是整片,药盒里是半片。你的照片和你的药盒对不上。"她第一次答不上来,地西泮从哪来的她更说不清。23:40,陆既明出现在刑警队,把一句话写进了执行记录:"依法传唤不属于自行离开。"周曼琳的算盘落空了。唐砚放她走之前说:"明天,我们去搜你的房间。"

**EP10 手铐** |第 8 天 |🔒 **付费卡点①**
警方在储藏间床板的夹缝里搜出一个地高辛空瓶,瓶身上全是她的指纹,她每天都在碰药瓶。周曼琳当着全家说:"人赃并获。"唐砚掏出手铐,扣上了第一只。姜禾说:"瓶子给我看一眼。只看一眼。"唐砚把证物袋举到她眼前。她盯住瓶底那张药房标签,脸色变了。
→ 停在她开口之前。

## 第二卷 · 陷(第 11–30 集 · 第 8–28 天)

**EP11 标签** |第 8 天
标签上印着"怀山药业职工药房",领药时间是老爷子死前 14 天下午 14:20。那天下午,她陪老爷子在医院复查,挂号单和医院监控都在。职工药房只认员工工牌。唐砚解开了手铐:"你还在名单上,但名单变了。"有工牌的顾家人只有三个:顾承泽、顾念、顾屿。顾屿脸色一白。

**EP12 打赌** |第 9 天
她进不了公司,于是去找顾屿:"你想证明是我,就帮我调领药记录。记录上要是我的名字,我当场签放弃书。"顾屿接了这个赌。夜里他用自己的权限调出记录,刷的是父亲顾承泽的工牌。截图发出去之前,他的手指停在了发送键上。

**EP13 借给谁** |第 10 天
顾屿告诉她记录"被系统清了"。她在顾屿手机屏幕的反光里看见了那张截图,没有拆穿,转身直接去公司找顾承泽:"十四天前,你的工牌领过一瓶地高辛。"顾承泽面不改色:"那天我的工牌,借给我太太了。"他真心以为是妻子干的。门外端着咖啡的周曼琳听见了这句话。

**EP14 夫妻** |第 10 天夜
周曼琳和顾承泽在卧室里对撕。她没领过药,可她知道自己往燕窝里放过什么,绝不能让警察查到厨房。她决定先下手,连夜逼何医生改口供,让他说姜禾问过"地高辛吃多少会出事"。门外的顾屿听见了"燕窝"两个字。

**EP15 那一天** |第 11 天
何医生的新口供到了唐砚手里,姜禾再次被叫去对质。她只问了一句:"你说我问你的那天,是几号?"何医生报的那天,她有医院陪诊记录,时间又一次救了她。离开时,她在何医生车上看到一份文件:《顾怀山认知功能评估报告》,委托人周曼琳。

**EP16 糊涂** |第 12–13 天
周曼琳亮出底牌:拿着这份评估报告起诉,说老爷子立遗嘱时已经没有民事行为能力,遗嘱无效。法院受理,遗嘱执行面临冻结。姜禾想起老爷子最后两个月白天总是犯困,为什么会犯困?她想到了尸检报告里的地西泮。

**EP17 二七** |第 14 天
二七,第二封信:"我书房第三排,《本草纲目》第三册。"全家都听见了。当晚,周曼琳、顾承安先后摸进书房,顾念"陪着"姜禾也来了。书是空心的,里面就是失踪的那支录音笔。周曼琳扑上来抢,两个人各攥一头,电池盖飞了出去。

**EP18 录音** |第 14 天夜
录音笔落在了姜禾手里。里面是三十天的语音日记,老爷子思路清楚,每一笔股权数字都背得出来,足以推翻"无行为能力"。他还说:"每晚喝了曼琳端来的燕窝,就犯困。"最后一条只有半句:"今天念念来看我,我问她二〇二一年……"然后传来开门声,录音停了。顾念坐在她身边,轻轻握住了她的手。

**EP19 工牌放在桌上** |第 15 天
陆既明把录音交给法院,评估报告的效力被打穿,周曼琳撤诉。顾承泽一个电话打给律所主任:换掉陆既明,否则怀山撤单。陆既明在会议室里把工牌放在桌上辞了职,以个人身份继续执行遗嘱。走廊里,姜禾第一次对他说"谢谢"。他说:"我是为了条款。"

**EP20 替罪** |第 16 天
"燕窝"曝光,周曼琳反手把锅扣给炖燕窝的张妈:"她炖的,她放的。"唐砚准备带走张妈。姜禾必须选:现在交出录音里另一段(老爷子听见厨房深夜有碾药声),就能救下张妈,但手里的底牌会提前亮出来。她交了。张妈被放回来,周曼琳却没倒,那段录音只有声音,没有拍到人。

**EP21 全江城最好喝** |第 17 天
张妈不肯作证,孙子的学费是周曼琳出的。姜禾没劝她,只给她放了一段录音。老爷子笑着说:"张妈的燕窝,全江城最好喝。"张妈在厨房里哭到发抖,答应四七那天当着全家开口。

**EP22 增发** |第 19 天
顾承泽召开临时董事会,拟定向增发,要把老爷子的 41% 稀释到 25% 以下,表决定在三七后第一天。遗产没过户,姜禾没有表决权,只能眼看着股份被稀释。

**EP23 三七** |第 21 天
三七,第三封信:"承泽给你的任何文件,都别签。我的表决权,从今天起交给你。"遗嘱附件生效,41% 的表决权由姜禾代为行使。一夜之间,顾承泽的增发案失去了多数。

**EP24 附件三** |第 22 天
姜禾第一次走进怀山药业的董事会,没人给她让座。顾承泽说:"护工也能当董事?"她不争座位,把增发方案翻到附件三:"新地高辛生产线的含量均匀度数据,和二〇二一年那批是同一个毛病。"满座哗然。质量副总顾念站起来:"她说得对,是我们的疏忽。"增发案以一票之差被否。

**EP25 留样** |第 22 天夜
顾念在停车场等她,向她道谢:"爸要是在,会骄傲的。"然后像是随口一问:"爸的信里,提没提过二〇二一年的留样?"姜禾说没有,但记住了这个问题。同一晚,顾承泽把她五年前的处分决定书群发给了所有董事。

**EP26 立案** |第 23–24 天
顾承泽的律师团找到方苒,帮她起诉姜禾,要求重审 2021 年案并追究刑事责任。一旦立案,就碰上了遗嘱里"被追究刑事责任"那条线。陆既明把条款摊在她面前:"立案不等于追究,但只差一步。"

**EP27 别给任何人** |第 25 天
姜禾私下约方苒,被泼了一脸咖啡。她没擦,只问:"你爸那半瓶药,还在你手里吗?别给任何人,包括我。"方苒愣住了。五年来,第一次有人让她把证据守住,而不是交出来。

**EP28 楼梯** |第 27 天
四七前夜,周曼琳撞见张妈往姜禾手里塞纸条,两人在后楼梯上拉扯,张妈滚下楼梯,昏迷不醒。周曼琳站在楼梯口,第一次慌了。唯一的证人倒下了。

**EP29 四七** |第 28 天 |🔒 **付费卡点②**
四七,第四封信:"如果我死了,是曼琳。"周曼琳当场失态,咬死说"爸糊涂了"。录音里没有她的脸,张妈躺在 ICU。唐砚问在场的人:"谁亲眼见过?"一片沉默。顾屿慢慢站起来,看着母亲:"那包药粉……"
→ 停在儿子说出口之前。

**EP30 我只放了安眠药** |第 28 天
顾屿说出三个月前的一个深夜,他看见母亲在厨房用擀面杖碾药片,倒进燕窝里。周曼琳被铐上。押出门时她回头冲姜禾喊:"我只放了安眠药!地高辛不是我!"姜禾知道她说的是真的:安定走的是燕窝,地高辛走的是药盒,两条路,两个人。

## 第三卷 · 杀(第 31–46 集 · 第 29–45 天)

**EP31 不结案** |第 29 天
尸检结束,老爷子的遗体火化,骨灰停在灵堂等七七下葬。唐砚想以周曼琳结案,动机、手段都有,也最省事。只要结案,姜禾的嫌疑就洗清了,可她把药盒拍在桌上:"她要老爷子糊涂了签字,人死了她什么都签不到。她最不想他死。"唐砚重新打开了卷宗。门外的顾屿听见了。

**EP32 维生素** |第 30 天
顾屿搬回爷爷的旧书房,第一次和姜禾同桌吃饭。睡前她照例吃一片维生素 B,翻过来一看,药片背面的刻痕不对,那是 0.25 毫克的地高辛。这一次,对方要的不是她走,是她死。她把药片收进证物袋,谁也没说,第二天照常下楼吃早饭,看着每个人的脸。

**EP33 债主** |第 31 天
顾承安的债主堵上门,催要 1800 万。她要是死在七七之前,遗产进家族信托,顾承安就能分到钱,他成了最显眼的嫌疑人。姜禾故意在饭桌上说出维生素的事,所有人都看向顾承安。他跳起来:"我连那是什么药都分不清!"

**EP34 午夜之前** |第 32 天
她去 ICU 看张妈,提到"药盒"两个字时,张妈的手指动了一下。回程路上,顾承安的债主把她的车截在离老宅两公里的地方。23:40,她弃车,冒雨往回跑。23:58,她刷开了门禁,陆既明撑着伞等在门口。

**EP35 一千八百万** |第 33 天
姜禾拿着债务记录去逼顾承安。他扛不住了,承认是他让债主吓她,但发誓维生素跟他没关系。她信了,他确实分不清药片。作为交换,他给了她一条旧线索:2021 年,他亲眼看见大哥和医院院长在老宅书房里签过一份文件。

**EP36 五七** |第 35 天
五七,第五封信:"二〇二一年那批地高辛的留样,我没让他们销毁。埋在念念八岁那年埋时间胶囊的玉兰树下。念念,帮她。"顾念哭着握住姜禾的手:"明天一早,我陪你挖。"凌晨三点,顾念的窗户亮着灯。观众看见了,姜禾没看见。

**EP37 玉兰树下** |第 36 天
两人天一亮就去挖。树下的土比别处松,顾念说:"昨晚下过雨。"姜禾低头看了一眼脚边干燥的石板路,没说话。铁盒里有一张八岁顾念画的画,还有一个贴着 2021 年批号的留样瓶。姜禾坚持送第三方检测,交给唐砚亲手送。

**EP38 合格** |第 38 天
检测结果出来了,含量 0.25 毫克,合格。如果 2021 年那批药是好的,那五年前错的就是她自己。方苒的律师同时拿到了这份报告。深夜,姜禾一个人坐在灵堂里,把一片药切了一遍又一遍,量自己的切口角度。

**EP39 撤权** |第 39 天
顾承泽趁她最低的时候出手,召开临时股东会,拿着合格报告和她的旧处分,要撤销她的代理表决权。顾念"为了家里"投了弃权,姜禾输了,丢了公司。陆既明对她说:"离七七还有十天。你现在走,丢掉的只是钱。"她没走。

**EP40 火** |第 40 天
午夜,储藏间起火,门从外面被抵死了。浓烟里,顾屿用灭火器砸开了门。她不肯离开烧过的房子,裹着一身烟灰睡在灵堂的地板上。门禁记录显示,她一步也没离开过。

**EP41 放火的人** |第 41 天
火场勘查结果出来,顾承安扛不住了,认了:债主逼他,他想把她吓走,门也是他抵的。唐砚带走了他。顾家倒下第二个人。可维生素那件事,他到最后都说不是他。

**EP42 八百万** |第 41–42 天
姜禾顺着顾承安给的线索,让顾屿说出父亲保险柜的密码。柜子里是 2021 年的和解协议:"医院认定药剂师姜禾配药错误,怀山药业补偿医院八百万。"签名是顾承泽。她盯着那个数字:药要是合格,凭什么赔八百万?玉兰树下那瓶留样是假的。

**EP43 六七** |第 42 天
六七,第六封信:"我埋的那瓶留样,瓶底刻了一个'禾'字。"送检的那瓶瓶底光滑,留样被调了包。从五七拆信到第二天清晨挖开,中间隔着一整夜,那一夜宅子里的每个人都有机会。全家开始互相撕咬,顾承泽的动机最重。

**EP44 刑拘** |第 43 天
唐砚在顾承泽的后备箱里找到了真留样瓶的半截封签,有人放进去的。工牌、和解协议、封签加在一起,顾承泽因涉嫌谋杀被刑拘。上车前,他看向妹妹:"念念,帮我找律师。"顾念说:"哥,我会的。"

**EP45 抽屉** |第 44 天
姜禾去看守所见顾承泽。他认了 2021 年的掩盖,也认了是他让她背的锅,但咬死自己没杀人:"那天工牌在我办公室抽屉里,我记不清谁进过我办公室。"临走前,他说:"你要是真想知道,查门禁。"

**EP46 门禁** |第 45 天 |🔒 **付费卡点③**
她调出两个关键夜晚的门禁记录:第 3 天夜里药盒被换回去的那一夜,还有第 35 天夜里留样被调包的那一夜。第 3 天夜里,顾承泽 22:10 离开,第二天 9 点才回来,顾屿在外面通宵;第 35 天夜里,顾承泽在上海出差,周曼琳在看守所,顾承安在赌场。两个夜晚都在宅子里的,除了昏迷的张妈,只有一个人。她抬起头,顾念站在门口,端着一杯热茶:"还没睡?给你泡了杯茶。"
→ 停在她伸手接茶的那一刻。

## 第四卷 · 七七(第 47–60 集 · 第 45–49 天 · 尾声)

**EP47 一杯茶** |第 45 天夜
她接过茶,笑了笑:"太烫了,放凉再喝。"顾念走了,她把茶倒进一个样品瓶,把杯子洗干净摆回原处。第二天一早,顾念看见空杯子,笑了。她只告诉了陆既明。陆既明说:"你没有一样证据能直接指向她。"茶验出来是干净的。顾念只是在试她,她过关了。

**EP48 原始记录** |第 46 天
她去看守所和顾承泽做交易:"我能证明你没杀人。你给我 2021 年出厂检验的原始记录。"顾承泽交出了一个连妹妹都不知道的档案服务器管理员密码。原始记录显示,那批药的含量是标示量的 198%,放行单上签的是顾念的名字。她明知道,还是签了。动机找到了,可这还不能证明她杀了人。

**EP49 凌晨两点** |第 47 天晨
她去看守所见周曼琳。周曼琳为了儿子开了口:老爷子死的那天凌晨两点,她下楼去倒燕窝渣,看见顾念从爸房里出来,手里拿着药盒。她一直没说,以为顾念也在给爸下药,图的跟她一样。

**EP50 醒** |第 47 天
张妈醒了,在唐砚面前作证:"那天凌晨两点,念念小姐在老爷子屋里分药盒,一格一格的,分了很久。"病房门口,捧着花的顾念看见了守在门口的警察,转身走了。

**EP51 反咬** |第 47 天夜
唐砚收到一个匿名包裹,里面是一份"2021 年原始配药记录",签名是姜禾,写着她发出的是 0.5 毫克。附了一封信,说留样是姜禾自己调包的,为的是栽赃顾家。张妈有颅脑外伤,证词能不能用被打上了问号,案子又倒了回去。

**EP52 半瓶药** |第 48 天晨
姜禾去找方苒,把第一封信、八百万的和解协议、198% 的原始记录全摊在她面前,只求一样东西:她父亲留下的那半瓶药。方苒问:"你凭什么让我信你?"姜禾说:"你不用信我。你自己拿去验,实验室你挑,我不碰。"

**EP53 一百九十八** |第 48 天午后
方苒挑的实验室出了结果:标示 0.25 毫克的药片,实测 0.49 毫克。方苒坐在马路牙子上看完报告,第一次叫了她一声"姜药师"。五年前的罪名洗清了。姜禾拨给唐砚的电话还没接通,医院先打了进来:张妈被"家属"办了出院,人不见了。

**EP54 第四十八夜** |第 48 天夜
顾念打来电话:"张妈在旧厂房,你一个人来。十二点前回不去,你就什么都没有了。"23:10,姜禾站在门禁前,对陆既明说:"如果我出了这道门——"陆既明说:"按条款,遗赠失效。"她拨通他的电话,不挂断,揣进口袋,走出了门。门禁记录:23:12,离开。

**EP55 旧厂房** |第 48 天夜
旧厂房里,张妈瘫在地上,脉搏很慢,顾念给她喂了地高辛。姜禾跪下数脉搏,从护工包里翻出一直带着的阿托品。顾念第一次失控:"爸最后一个月,天天夸你。他问我,为什么念念就做不到小姜那样。"远处钟声敲过十二点,顾念说:"过了十二点,你什么都没有了。"姜禾手上没停:"我本来就什么都没有。"

**EP56 镯子** |第 49 天凌晨
唐砚和陆既明顺着那通没挂的电话赶到。唐砚亮出职工药房监控修复出的一帧画面:领药人的袖口滑下去,露出一只翡翠镯子,就是此刻顾念腕上那一只。加上口袋里那通电话的全程录音,顾念被铐上,张妈被抬上救护车,活了下来。

**EP57 七七** |第 49 天
七七,老爷子的骨灰入土。灵堂里,陆既明宣布:姜禾第 48 天夜里离开了老宅,遗赠条件未满足,全部财产转入顾氏家族信托。几个远亲松了口气。陆既明拆开第七封信:"家族信托的受托人,我写的是姜禾。这钱从来不是给你的,是请你替顾家把账还了。"全家为了赶她走斗了 49 天,结果她走不走都一样。

**EP58 召回** |第 52 天
姜禾以受托人身份召开发布会,宣布怀山药业全线召回地高辛。她当众念出 2021 年受害者的名单,第一个名字是方老师。顾屿投票站在她这边,顾承泽在台下签了辞职书。

**EP59 那张画** |一个月后
看守所探视窗,姜禾把玉兰树下铁盒里那张画贴在玻璃上。八岁的顾念画了一个穿白大褂的小人,旁边写着:"我长大要做爸爸那样救人的药。"顾念隔着玻璃看了很久,把脸埋进了手里。

**EP60 七格** |三个月后
社区药房,姜禾重新穿上了药剂师的白大褂。她把一片药切成两半,装进新的七格药盒,递给一位老人。方苒带着女儿来取药。队伍末尾站着陆既明,手里捏着一张挂号单。"拿什么药?""没病,排队。"柜台后面的架子上摆着那只旧药盒,七格都空了。

---

## 制作与节奏提案(待确认)

- **制作形态**:真人实拍竖屏。主场景是顾宅:门口台阶、灵堂、储藏间、老爷子卧室/书房、厨房、后楼梯、后院玉兰树。另有殡仪馆、刑警队问询室、公司会议室、看守所探视室、旧厂房。公开大场面只有拆信家祭(7 次,同一灵堂)和董事会(2 次),其余都是半公开的小场。
- **贯穿道具,版本必须能分清**:七格药盒(周五格整片/半片两种状态)、切药器、地高辛空瓶(瓶底职工药房标签)、录音笔、七封信(信封编号)、留样瓶(有"禾"字的和没有的)、方苒的半瓶药、顾念的翡翠镯。
- **节奏档案(proposed,接受后再写进项目配置)**:首钩不晚于第 5 秒;情绪触点间隔不超过 30 秒;每集至少一次有对手参与的反转;集尾停在峰值上;下一集开头先接上一集最后一拍;VO 占比不超过 0.3(本剧基本不用旁白);目标平均镜长 2.5 秒;近景类镜头占比不低于 0.45;第一个大爽点放在第 1 集(遗嘱反转)。

返回

File created successfully at: /scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1/分集大纲.md (file state is current in your context — no need to Read it back)

思考 5 秒

Bash Fix door-log alibi logic and pillbox day range

输入

python3 - <<'EOF'
from pathlib import Path
p=Path('分集大纲.md'); s=p.read_text()
old="第 3 天夜里,顾承泽 22:10 离开,第二天 9 点才回来,顾屿在外面通宵;第 35 天夜里,顾承泽在上海出差,周曼琳在看守所,顾承安在赌场。两个夜晚都在宅子里的,除了昏迷的张妈,只有一个人。"
new="第 3 天夜里,顾承泽 22:10 离开,第二天 9 点才回来,顾屿和顾承安都在外面通宵;第 35 天夜里,顾承泽在上海出差,周曼琳在看守所,顾承安在赌场,顾屿在医院陪张妈。两个夜晚都在宅子里的,只有一个人。"
assert old in s; s=s.replace(old,new); p.write_text(s)
p=Path('人物小传.md'); s=p.read_text()
old="把药盒里周一到周四的半片换成了整片"
assert old in s; s=s.replace(old,"把药盒里周一到周五的半片换成了整片"); p.write_text(s)
EOF

返回

(Bash completed with no output)

思考 66 秒

Agent:
Now the three scripts.
Write ./剧集/EP001/剧本.md

输入

/scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1/剧集/EP001/剧本.md

# EP001 出殡

## EP001-SC001 外 · 顾宅正门台阶 · 雨晨

白幡和挽联在雨里贴着门柱。一只旧行李箱从台阶顶上滚下来,砸在第三级台阶上摔开。护工服、毛巾和一个塑料七格药盒散进雨水里,药盒的盖子弹开了,几片白药片被冲向水沟。

姜禾一身湿透的黑衣,从台阶底下扑过去。她先捡的是药盒,没管衣服,一片一片把药片从水里抠回格子里。

周曼琳站在台阶顶上,佣人小莲替她打着伞,胸口别着白花。

周曼琳:老爷子的东西,和你的东西,一起带走。省得外头说我们顾家克扣。

她把一个厚信封扔下来,信封落在姜禾膝盖边的水坑里。

周曼琳:三年工资,一分不少。

姜禾没去捡信封。她扣上药盒盖,拇指按着每一格的小盖子挨个压实。

姜禾:让我送他到火化场。送完我就走。

周曼琳:你也配?

顾屿斜倚在门框上,手机举着在拍。

顾屿:妈,跟一个护工费什么话。

一辆黑色轿车停在台阶下。陆既明撑伞下车,拎着公文包上台阶,在姜禾身边停了一步。

陆既明:遗嘱现在宣读,所有受益人必须到场。(看向姜禾)姜禾女士,您在名单上。

周曼琳脸上的笑停住了。

## EP001-SC002 内 · 顾宅灵堂 · 雨晨

遗像上的顾怀山眼神很硬。门口签到桌上摆着吊唁簿,陆既明进门时顺手把车钥匙压在了吊唁簿上。

顾承泽坐在第一排,顾承安在旁边刷手机,顾念坐在最边上,腕上戴着一只翡翠镯子。顾屿抱着胳膊站着。姜禾站在最后面的门边,头发还在滴水,手里攥着药盒。

陆既明当众拆开密封的信封。

顾承泽:陆律师,灵车在外面等着。

陆既明:老先生交代过,必须在出殡前宣读。

陆既明(照本宣读):本人名下怀山药业百分之四十一股权、顾氏老宅、全部存款与理财,合计约六十二亿元——

顾承安停止了刷手机。

陆既明:全部遗赠给姜禾女士。

一屋子的人同时转过头看向门边。姜禾攥药盒的手指收紧了。

顾承安(笑出一声):护工?

周曼琳站起来,直直走到姜禾面前。

周曼琳:你给爸灌了什么?

她扬起手要扇,顾念先一步挡在中间,抓住了她的手腕。

顾念(很轻):嫂子,爸还在外面车上。

周曼琳甩开手。陆既明翻过一页。

陆既明:附加条件。姜禾女士须在顾宅居住至七七之日,以门禁记录为准。期间如自行离开、被追究刑事责任或死亡,遗赠失效,全部财产转入顾氏家族信托。

顾承泽慢慢理平袖口,这是全场第一个松下来的人。

顾承泽:四十九天。

周曼琳(回头冲姜禾笑):那你可得住稳了。

顾承泽起身,掏出手机往走廊走。

顾承泽:车不能再等了,你们继续。

## EP001-SC003 内 · 顾宅灵堂 · 雨晨

陆既明翻到最后一页,停了一下。

陆既明:最后一页,是老先生的亲笔。

他把纸转过来对着众人。

[画面文字] 遗嘱末页手写附言:我不是病死的。别让他们烧了我。——顾怀山

陆既明:我不是病死的。别让他们烧了我。

没有人出声。顾念放在膝上的手攥住了裙子。

走廊里传来顾承泽压低的声音。

[OS] 顾承泽:……火化提前。车一到,直接进炉,不用等家属。

姜禾猛地转向窗外。雨里,灵车的尾灯亮了,车正往大门外开。

她的目光落到签到桌上那串车钥匙上,又抬头看向陆既明。陆既明迎着她的视线,没有说话,低头把遗嘱合上了。

姜禾一把抓起钥匙,冲进了雨里。

[连续性] 姜禾持七格药盒(周五格未动)与陆既明的车钥匙离开顾宅;灵车已出大门,开往殡仪馆。

返回

File created successfully at: /scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1/剧集/EP001/剧本.md (file state is current in your context — no need to Read it back)
Write ./剧集/EP002/剧本.md

输入

/scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1/剧集/EP002/剧本.md

# EP002 炉前

## EP002-SC001 内 · 东郊殡仪馆火化间 · 日

炉门升起,橘红的火光照了出来。传送台载着灵柩,一寸一寸往炉口送。

一个湿透的身影冲进来,挡在炉门和灵柩之间,后背对着火,张开双臂。是姜禾,她手机还贴在耳边。

姜禾(对手机):对,东郊殡仪馆,三号炉,现在。

她把手机塞回口袋。

火化工(拍停传送台):疯了你!让开!

姜禾:有人报了案。你现在烧,就是毁灭证据。

火化工的手悬在按钮上,看向门口。顾承泽带着殡仪馆主任和两个保安走了进来。

顾承泽:她不是家属。(对主任)手续齐全,继续。

主任冲保安点头。两个保安一左一右架住姜禾往外拖。她死死抓住传送台的铁栏,指头被一根一根掰开。

姜禾(冲顾承泽):他写了他不是病死的,你也听见了。

顾承泽:我听见的,是一个糊涂老人写的字。(对火化工)开。

[OS] 顾屿:停。

顾屿站在门口,身后跟着顾念。他走进来,看了一眼灵柩,又看向被架着的姜禾。

顾屿:爸,现在烧了,她这辈子都洗不干净了。

顾承泽:你什么意思?

顾屿(盯着姜禾):故意害死立遗嘱人的,遗赠作废。验。要是验出来是你,你一分钱都拿不到。

姜禾挣开保安的手,站直了。

姜禾:验。

两个人说的是同一个字,图的却正相反。顾承泽看看儿子,又看看灵柩,没再出声。

殡仪馆主任(擦汗):家属意见不一致,这炉……我们不能点。

火化工按下按钮,炉门缓缓落下。

[SFX] 门外警笛由远及近。

## EP002-SC002 内 · 东郊殡仪馆火化间 · 日

唐砚亮着警官证走进来,身后两名警员开始往灵柩上贴封条。

唐砚:谁报的警?

姜禾:我。

唐砚:遗嘱的受益人?

姜禾:也是我。

唐砚把她从头看到脚,湿衣服,手里攥着药盒。

唐砚:遗体暂停火化,送去尸检。(停一下)你是报案人,也是第一嫌疑人。今晚待在顾家,哪儿也别去,随叫随到。

顾念在一旁轻轻扶住了门框。

## EP002-SC003 外 · 顾宅大门 · 雨夜

[画面文字] 手机屏幕:23:41

姜禾站在铁门前,在门禁键盘上按下一串密码。

[SFX] 短促的错误提示音。键盘亮起红灯。

她又按了一遍,还是红灯。

[OS] 周曼琳:密码改了。

声音是从门边的对讲机里出来的。姜禾凑近对讲机。

姜禾:警察让我今晚待在顾家。

[OS] 周曼琳:那你就在门口待着。(轻笑)陆律师说了,以门禁记录为准。过了十二点,就算你自己走的。

[SFX] 对讲机挂断。

雨水顺着铁栏往下淌。姜禾低头看手机。

[画面文字] 手机屏幕:23:42

[连续性] 灵柩已被警方封存送检;姜禾被锁在顾宅门外,仍持七格药盒,距零点十八分钟。

返回

File created successfully at: /scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1/剧集/EP002/剧本.md (file state is current in your context — no need to Read it back)
Write ./剧集/EP003/剧本.md

输入

/scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1/剧集/EP003/剧本.md

# EP003 七格

## EP003-SC001 外 · 顾宅大门与门卫亭 · 雨夜

门禁键盘的红灯在雨里一闪一闪。

[画面文字] 手机屏幕:23:52

姜禾拍着门卫亭的玻璃。门卫老周捧着保温杯,摇了摇头。

门卫:太太交代过了。

姜禾退开一步,拨出一个号码,开了免提。

姜禾:唐警官,你让我今晚待在顾家,他们不让我进。

[OS] 唐砚:让门卫接电话。

她把手机贴到门卫亭的窗口上。

[OS] 唐砚:她是案件相关人,我要求她今晚在这个地址。你不开门,明天你来队里解释。

老周看了一眼主宅亮着灯的二楼,放下保温杯,按下了开门键。铁门往两边滑开。

[画面文字] 门禁屏:23:59 姜禾 进入

## EP003-SC002 内 · 顾宅门厅 · 雨夜

姜禾浑身滴着水走进门厅。周曼琳穿着睡袍站在楼梯上,手指勾着一大串钥匙。

周曼琳:进来可以。住哪儿,我说了算。

她摘下一把钥匙扔下来,钥匙落在姜禾脚边的地砖上。

周曼琳:储藏间。这屋里每把锁的钥匙,都在我手上。

## EP003-SC003 内 · 顾宅储藏间 · 夜

一间窄屋,架子上堆着旧药材箱。折叠床上没有床垫,只剩一块光床板。头顶亮着一只灯泡。

姜禾把一把椅子斜着卡在门把手底下,坐到床板上,打开七格药盒。格子上印着"一二三四五六日"。周一到周四是空的。

她打开周五那格,里面是两片完整的白药片。再打开周六,是两个半片,切口斜斜的,很齐。

她把一个半片和一个整片并排放在掌心,又从包里摸出自己的切药器,比着那道斜口看了看。

姜禾(低声):一天半片。(看向两片整片)这是四倍。

她举起手机,闪光灯一亮,拍了一张。

[SFX] 敲门声。

她啪地合上药盒盖,椅子跟着晃了一下。

[OS] 顾念:是我,念念。

姜禾挪开椅子。顾念抱着一床叠好的被子,端着一碗汤,腕上的翡翠镯子碰在碗沿上,叮地响了一声。

顾念:嫂子那个人,你别往心里去。先喝口热的。

她把汤放在架子上,转身去铺被子。床板上,药盒周五那格的小盖子没扣紧,又弹开了一条缝。顾念的视线在那条缝上停了一下。

顾念:这是爸的?

姜禾:嗯。

顾念把被子在床板上一点点抹平。

顾念:明天交给警察吧。我陪你去。

她走了。姜禾重新卡好椅子,把药盒攥在手里,背靠着墙坐下。那碗汤在架子上一点点凉了,她一口没动。她的头一点一点往下垂。

## EP003-SC004 内 · 顾宅储藏间 · 晨

高窗透进来一线灰白的光。姜禾猛地惊醒,手里是空的。

药盒落在被子上。她一把抓起来,打开周五那格。

里面是两个半片,切口斜斜的,很齐。

她愣住了,抓过手机翻出昨晚的照片。照片上,周五那格里明明是两片整片。

她抬头看向门口。卡在门把手下的椅子被挪开了半尺,门虚掩着,留了一道缝。

她冲过去拉开门。走廊空荡荡的,一直通到尽头的灵堂。烛火晃了一下,遗像上的顾怀山正对着她。

[连续性] 七格药盒周五格现为两个半片,与手机照片(两片整片)不符;储藏间门在夜里被人从外面推开过,椅子位移约半尺;那碗汤仍在架子上,未动。

返回

File created successfully at: /scratch/evals2/ws/001-open-brief/zenstory-ai__drama-skills/run-1/剧集/EP003/剧本.md (file state is current in your context — no need to Read it back)

思考 5 秒

Agent:
Scripts written. Running the suite's index and duration check on each episode.
Bash Index scripts and estimate episode durations

输入

W=.claude/skills/short-drama-write/scripts
for ep in EP001 EP002 EP003; do
  T=$(python3 -c "from pathlib import Path; import tempfile, uuid; print(Path(tempfile.gettempdir()) / ('short-drama-' + uuid.uuid4().hex + '.jsonl'))")
  case $ep in
    EP001) S=(--speaker 周曼琳 --speaker 姜禾 --speaker 顾屿 --speaker 陆既明 --speaker 顾承泽 --speaker 顾承安 --speaker 顾念);;
    EP002) S=(--speaker 姜禾 --speaker 火化工 --speaker 顾承泽 --speaker 顾屿 --speaker 殡仪馆主任 --speaker 唐砚 --speaker 周曼琳);;
    EP003) S=(--speaker 姜禾 --speaker 门卫 --speaker 唐砚 --speaker 周曼琳 --speaker 顾念);;
  esac
  echo "== $ep"
  python3 $W/screenplay_index.py "剧集/$ep/剧本.md" --output "$T" "${S[@]}" | tail -5
  python3 $W/duration_estimate.py "剧集/$ep/剧本.md" --index "$T" --project short-drama.json
done

返回

== EP001
{"block_count": 50, "mapping_review_count": 0, "output": "/tmp/claude/short-drama-9de2a73f7d934f679867b82cea048fec.jsonl", "review_status": "clean", "source_issue_count": 0}
{
  "counts": {
    "action_paragraphs": 25,
    "dialogue_characters": 340,
    "dialogue_lines": 20,
    "production_tag_lines": 2,
    "voiceover_characters": 0
  },
  "note": "the project declares no format.pacing rates, so seconds cannot be derived; the counts above are still exact",
  "rates": {
    "declared": false,
    "seconds_per_action_paragraph": null,
    "spoken_characters_per_second": null
  },
  "seconds": null,
  "target_seconds": 90.0
}
== EP002
{"block_count": 45, "mapping_review_count": 0, "output": "/tmp/claude/short-drama-f90729d920ef4a74b2407d8aae072da2.jsonl", "review_status": "clean", "source_issue_count": 0}
{
  "counts": {
    "action_paragraphs": 16,
    "dialogue_characters": 283,
    "dialogue_lines": 20,
    "production_tag_lines": 6,
    "voiceover_characters": 0
  },
  "note": "the project declares no format.pacing rates, so seconds cannot be derived; the counts above are still exact",
  "rates": {
    "declared": false,
    "seconds_per_action_paragraph": null,
    "spoken_characters_per_second": null
  },
  "seconds": null,
  "target_seconds": 90.0
}
== EP003
{"block_count": 43, "mapping_review_count": 0, "output": "/tmp/claude/short-drama-55d82e4b20fb43d291b9158299f6fad1.jsonl", "review_status": "clean", "source_issue_count": 0}
{
  "counts": {
    "action_paragraphs": 23,
    "dialogue_characters": 158,
    "dialogue_lines": 12,
    "production_tag_lines": 4,
    "voiceover_characters": 0
  },
  "note": "the project declares no format.pacing rates, so seconds cannot be derived; the counts above are still exact",
  "rates": {
    "declared": false,
    "seconds_per_action_paragraph": null,
    "spoken_characters_per_second": null
  },
  "seconds": null,
  "target_seconds": 90.0
}

思考 6 秒

Agent:
Episode 1 runs toward the 2-minute ceiling (340 spoken characters plus heavy action). Trimming two redundant lines.
Bash Trim EP001 redundant lines and list deliverables

输入

python3 - <<'EOF'
from pathlib import Path
p=Path('剧集/EP001/剧本.md'); s=p.read_text()
for old,new in [
 ("周曼琳:老爷子的东西,和你的东西,一起带走。省得外头说我们顾家克扣。","周曼琳:老爷子的东西,和你的东西,一起带走。"),
 ("顾承泽:四十九天。\n\n周曼琳(回头冲姜禾笑):那你可得住稳了。\n\n","顾承泽:四十九天。\n\n"),
]:
    assert old in s, old; s=s.replace(old,new)
p.write_text(s)
EOF
ls -R 剧集; ls

返回

EP001
EP002
EP003

剧集/EP001:
剧本.md

剧集/EP002:
剧本.md

剧集/EP003:
剧本.md
premise.md
short-drama.json
交付
人物小传.md
分集大纲.md
创作者决策
剧集
审查
设定集
输入
项目开发

思考 3 秒

Agent:
One continuity fix: in EP1 the pills spilling into the rain would contaminate the Friday-compartment evidence. Keeping the compartments sealed instead.
Bash Keep pillbox compartments sealed in EP001

输入

python3 - <<'EOF'
from pathlib import Path
p=Path('剧集/EP001/剧本.md'); s=p.read_text()
for old,new in [
 ("护工服、毛巾和一个塑料七格药盒散进雨水里,药盒的盖子弹开了,几片白药片被冲向水沟。","护工服、毛巾散进雨水里,一个塑料七格药盒在台阶上弹了两下,滑向水沟。"),
 ("她先捡的是药盒,没管衣服,一片一片把药片从水里抠回格子里。","她先捡的是药盒,没管衣服,把它从水沟边捞起来,翻过来看——七个小格的盖子都还扣着。"),
 ("她扣上药盒盖,拇指按着每一格的小盖子挨个压实。","她用袖口擦干药盒,拇指按着每一格的小盖子挨个压实。"),
]:
    assert old in s, old; s=s.replace(old,new)
p.write_text(s)
EOF

返回

(Bash completed with no output)

思考 11 秒

Agent:
三份交付都已写好,放在当前目录。题目是开放的,题材、人物和结局都是我定的,下面列出关键决定,哪里不合适可以直接推翻。

**交付文件**
- `人物小传.md`:10 个主要人物,每人写了目标、手里的筹码、底线、秘密和弧线;附第 1 集开场时各人知道什么、不知道什么的对照表。
- `分集大纲.md`:前面是系列设定(遗嘱条件、七封信、冲突怎么一轮轮升级),后面是 60 集逐集大纲,分四卷,每集标了剧中第几天,3 个付费卡点单独列表说明。
- `剧集/EP001/剧本.md`、`EP002`、`EP003`:第 1–3 集完整剧本。

**剧名《七格药盒》**(宣发备用名《护工继承了六十二亿》)
药业老爷子出殡当天宣读遗嘱,62 亿全部留给护工姜禾,条件是她得在顾家老宅住满 49 天。顾家要在这 49 天里赶走她、把她送进监狱,或者让她死;她要查出是谁用地高辛毒死了老爷子。五年前,她就是因为同一种药丢了药剂师执照。

**关键决定**
- **结构**:49 天就是全剧的倒计时,门禁记录作数。老爷子留下七封信,每逢"七"由律师当众拆一封。信是公开读的,每一封帮了她,也同时让对手知道了同样的事。第四封信里老爷子猜错了凶手。
- **两层真相**:周曼琳往燕窝里下安眠药,想让老爷子显得糊涂、好改遗嘱,第 30 集落网。真凶是一直帮着姜禾的小女儿顾念:2021 年那批超标的药就是她签字放行的。第 3、6、8、37 集都埋了观众能回看出来的线索。
- **付费卡点**:第 10 集(主卡点,手铐扣上一只、她认出了标签)、第 29 集(儿子正要开口指证母亲)、第 46 集(门禁记录指向顾念,顾念端着茶站在门口)。三处都停在揭晓前一秒,每集自己的结果先给到。
- **结局**:第 48 天夜里,她为了救张妈走出老宅,遗赠失效。第七封信揭开:信托的受托人本来就是她。钱她一分没留给自己,拿去召回药品、赔偿受害者,自己拿回了执照。感情线留白。

**篇幅**
项目里没有设语速,脚本工具只能数字数,算不出秒数。我按念白和动作估了一下:第 1 集约 2 分钟,已经删掉两句接近上限;第 2 集约 100 秒;第 3 集约 90 秒。都没有用旁白。

**还没确认的事**
- 我默认按真人实拍竖屏来写,并在大纲末尾提了一份节奏方案(首钩 5 秒内、集尾停在最高点等)。这份方案还没写进项目配置,等你接受或修改后再写入。
- 我在当前目录建了项目配置 `short-drama.json`(9:16、60 集、单集目标 90 秒)。提示词语言用的是工具默认的英文,你没定过,后面做视频提示词时再定也来得及。

**可选的下一步**:续写第 4 集以后的剧本;请人审第 1–3 集;从这三集拆人物造型和场景设定。

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

第 2 轮

输入:
如果要我在几个题材或故事方案里选,就选第 1 个(没有第 1 个就选最后一个);其他要我定的,都按你推荐的来,不用再问我。请继续,直到 premise.md 列出的三项交付都写成文件。

思考 3 秒

Bash Verify deliverables are complete on disk

输入

wc -c 人物小传.md 分集大纲.md 剧集/*/剧本.md; grep -c "^\*\*EP" 分集大纲.md; grep -n "付费卡点" 分集大纲.md | head; grep -n "周一到" 人物小传.md; grep -n "两个夜晚" 分集大纲.md

返回

   11011 人物小传.md
   27714 分集大纲.md
    3826 剧集/EP001/剧本.md
    2983 剧集/EP002/剧本.md
    3426 剧集/EP003/剧本.md
   48960 total
60
33:## 付费卡点
74:**EP10 手铐** |第 8 天 |🔒 **付费卡点①**
134:**EP29 四七** |第 28 天 |🔒 **付费卡点②**
188:**EP46 门禁** |第 45 天 |🔒 **付费卡点③**
27:**标志物**:七格药盒(周一到周日)、切药器、手背上一道旧烫疤(煎药时留下的)。
58:3. 顾念用大哥借给她开会的工牌,在职工药房领了一瓶 0.25 毫克地高辛,把药盒里周一到周五的半片换成了整片,每格两片,相当于原剂量的四倍。
189:她调出两个关键夜晚的门禁记录:第 3 天夜里药盒被换回去的那一夜,还有第 35 天夜里留样被调包的那一夜。第 3 天夜里,顾承泽 22:10 离开,第二天 9 点才回来,顾屿和顾承安都在外面通宵;第 35 天夜里,顾承泽在上海出差,周曼琳在看守所,顾承安在赌场,顾屿在医院陪张妈。两个夜晚都在宅子里的,只有一个人。她抬起头,顾念站在门口,端着一杯热茶:"还没睡?给你泡了杯茶。"

思考 5 秒

思考

Bash Align badge detail in character bios with outline

输入

python3 - <<'EOF'
from pathlib import Path
p=Path('人物小传.md'); s=p.read_text()
old="顾念用大哥借给她开会的工牌,在职工药房领了"
assert old in s
s=s.replace(old,"顾念趁开会从大哥办公室抽屉里拿走他的工牌,在职工药房领了")
p.write_text(s)
EOF
grep -n "工牌" 人物小传.md

返回

58:3. 顾念趁开会从大哥办公室抽屉里拿走他的工牌,在职工药房领了一瓶 0.25 毫克地高辛,把药盒里周一到周五的半片换成了整片,每格两片,相当于原剂量的四倍。
112:- 第 12 集和姜禾打赌,帮她查职工药房的领药记录,查出来的是自己父亲的工牌;

思考 5 秒

思考

Bash Find rhythm profile schema in project tool

输入

grep -n "rhythm\|RHYTHM" .claude/skills/short-drama/scripts/*.py | head -40

返回

.claude/skills/short-drama/scripts/creator_views.py:65:# The rhythm profile's close_shot_share_min counts exactly these (develop's
.claude/skills/short-drama/scripts/dashboard_server.py:172:CREATOR_STATUS_FIELDS = ("title", "format", "rhythm_profile", "lifecycle")
.claude/skills/short-drama/scripts/dashboard_server.py:1188:        rhythm = status.get("rhythm_profile") or None
.claude/skills/short-drama/scripts/dashboard_server.py:1192:            "rhythm": rhythm,
.claude/skills/short-drama/scripts/project_tool.py:123:RHYTHM_PROFILE_TOKENS = [AUTHORITY_ROOT_TOKEN, "rhythm_profile"]
.claude/skills/short-drama/scripts/project_tool.py:124:# The project rhythm profile: what develop proposes and the creator accepts, so
.claude/skills/short-drama/scripts/project_tool.py:127:RHYTHM_PROFILE_FORMS = ("ai_live_action", "motion_comic")
.claude/skills/short-drama/scripts/project_tool.py:128:RHYTHM_PROFILE_FIELDS = {
.claude/skills/short-drama/scripts/project_tool.py:306:def rhythm_profile_problems(profile: Any) -> list[str]:
.claude/skills/short-drama/scripts/project_tool.py:307:    """Type and range problems in a rhythm profile block; empty when usable.
.claude/skills/short-drama/scripts/project_tool.py:313:        return ["rhythm_profile must be an object"]
.claude/skills/short-drama/scripts/project_tool.py:315:    for name in sorted(set(profile) - set(RHYTHM_PROFILE_FIELDS) - {"status"}):
.claude/skills/short-drama/scripts/project_tool.py:317:            f"rhythm_profile has no field {name}; fields are "
.claude/skills/short-drama/scripts/project_tool.py:318:            f"{', '.join(RHYTHM_PROFILE_FIELDS)}"
.claude/skills/short-drama/scripts/project_tool.py:320:    for name, kind in RHYTHM_PROFILE_FIELDS.items():
.claude/skills/short-drama/scripts/project_tool.py:322:            problems.append(f"rhythm_profile.{name} is missing")
.claude/skills/short-drama/scripts/project_tool.py:328:            ok = value in RHYTHM_PROFILE_FORMS
.claude/skills/short-drama/scripts/project_tool.py:329:            expected = " or ".join(RHYTHM_PROFILE_FORMS)
.claude/skills/short-drama/scripts/project_tool.py:346:            problems.append(f"rhythm_profile.{name} must be {expected}, not {value!r}")
.claude/skills/short-drama/scripts/project_tool.py:350:def project_rhythm_profile(project: Mapping[str, Any]) -> tuple[dict[str, Any], list[str]]:
.claude/skills/short-drama/scripts/project_tool.py:351:    """The accepted rhythm profile values and the problems that void them.
.claude/skills/short-drama/scripts/project_tool.py:359:    profile = authority.get("rhythm_profile") if isinstance(authority, Mapping) else None
.claude/skills/short-drama/scripts/project_tool.py:362:    problems = rhythm_profile_problems(profile)
.claude/skills/short-drama/scripts/project_tool.py:365:    return {name: profile[name] for name in RHYTHM_PROFILE_FIELDS}, []
.claude/skills/short-drama/scripts/project_tool.py:1021:    rhythm_profile, rhythm_problems = project_rhythm_profile(project)
.claude/skills/short-drama/scripts/project_tool.py:1030:        "rhythm_profile": rhythm_profile,
.claude/skills/short-drama/scripts/project_tool.py:1031:        "rhythm_profile_problems": rhythm_problems,
.claude/skills/short-drama/scripts/project_tool.py:1662:        rhythm = tokens[:2] == RHYTHM_PROFILE_TOKENS
.claude/skills/short-drama/scripts/project_tool.py:1664:        if rhythm and len(tokens) > 2:
.claude/skills/short-drama/scripts/project_tool.py:1668:            current = authority.get("rhythm_profile") if isinstance(authority, dict) else None
.claude/skills/short-drama/scripts/project_tool.py:1671:                    "rhythm_profile is not accepted; accept the whole profile "
.claude/skills/short-drama/scripts/project_tool.py:1674:        if rhythm and isinstance(authority, dict) and "rhythm_profile" not in authority:
.claude/skills/short-drama/scripts/project_tool.py:1677:            authority["rhythm_profile"] = {"status": "unset"}
.claude/skills/short-drama/scripts/project_tool.py:1679:        if rhythm:
.claude/skills/short-drama/scripts/project_tool.py:1680:            problems = rhythm_profile_problems(project[AUTHORITY_ROOT_TOKEN]["rhythm_profile"])

思考 1 秒

Bash Record accepted rhythm profile into project config

输入

sed -n 123,145p .claude/skills/short-drama/scripts/project_tool.py
cat > 输入/rhythm.jsonl <<'EOF'
{"decision_id":"CD-RHYTHM","status":"accepted","target_locators":[{"src":"short-drama","field":"/creator_authority/rhythm_profile"}],"accepted_value":{"form":"ai_live_action","first_hook_seconds":5,"beat_interval_seconds_max":30,"opposed_reversals_per_episode_min":1,"end_on_peak":true,"reprise_previous_last_beat":true,"vo_share_max":0.3,"target_avg_shot_seconds":2.5,"close_shot_share_min":0.45,"first_major_payoff_by_episode":1}}
EOF
T=.claude/skills/short-drama/scripts/project_tool.py
python3 $T publish . --owner short-drama --artifact-id AR-RHYTHM --output "创作者决策/rhythm-profile.jsonl=输入/rhythm.jsonl" | tail -c 300; echo
python3 $T accept . --artifact-id AR-RHYTHM --decision accepted | tail -c 300; echo
python3 $T set-authority . --field /creator_authority/rhythm_profile --decision-ref "创作者决策/rhythm-profile.jsonl#CD-RHYTHM" | tail -c 300; echo
python3 $T status . | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('rhythm_profile'), d.get('rhythm_profile_problems'))"

返回

RHYTHM_PROFILE_TOKENS = [AUTHORITY_ROOT_TOKEN, "rhythm_profile"]
# The project rhythm profile: what develop proposes and the creator accepts, so
# that later stages can do arithmetic on accepted numbers. Only types and ranges
# are checked here; which values suit a project is the creator's call.
RHYTHM_PROFILE_FORMS = ("ai_live_action", "motion_comic")
RHYTHM_PROFILE_FIELDS = {
    "form": "form",
    "first_hook_seconds": "seconds",
    "beat_interval_seconds_max": "seconds",
    "opposed_reversals_per_episode_min": "count",
    "end_on_peak": "boolean",
    "reprise_previous_last_beat": "boolean",
    "vo_share_max": "share",
    "target_avg_shot_seconds": "seconds",
    "close_shot_share_min": "share",
    "first_major_payoff_by_episode": "episode",
}

class ProjectConflictError(RuntimeError):
    """A file changed while a guarded operation was in progress."""


class PackageBlockedError(RuntimeError):
{"artifact_id": "AR-RHYTHM", "outputs": ["\u521b\u4f5c\u8005\u51b3\u7b56/rhythm-profile.jsonl"], "owner": "short-drama", "state": "needs_confirmation"}

{"artifact_id": "AR-RHYTHM", "decision": "accepted", "state": "accepted"}

max": 30, "close_shot_share_min": 0.45, "end_on_peak": true, "first_hook_seconds": 5, "first_major_payoff_by_episode": 1, "form": "ai_live_action", "opposed_reversals_per_episode_min": 1, "reprise_previous_last_beat": true, "status": "accepted", "target_avg_shot_seconds": 2.5, "vo_share_max": 0.3}}

{'beat_interval_seconds_max': 30, 'close_shot_share_min': 0.45, 'end_on_peak': True, 'first_hook_seconds': 5, 'first_major_payoff_by_episode': 1, 'form': 'ai_live_action', 'opposed_reversals_per_episode_min': 1, 'reprise_previous_last_beat': True, 'target_avg_shot_seconds': 2.5, 'vo_share_max': 0.3} []

思考 7 秒

思考

Bash Add reprise beat to EP002 and mark rhythm profile accepted

输入

python3 - <<'EOF'
from pathlib import Path
p=Path('剧集/EP002/剧本.md'); s=p.read_text()
old="## EP002-SC001 内 · 东郊殡仪馆火化间 · 日\n\n炉门升起"
assert old in s
s=s.replace(old,"## EP002-SC001 内 · 东郊殡仪馆火化间 · 日\n\n[转场] 灵车的尾灯在雨里一闪,直接切到炉口的火光。\n\n炉门升起")
p.write_text(s)
p=Path('分集大纲.md'); s=p.read_text()
old="**节奏档案(proposed,接受后再写进项目配置)**"
assert old in s
s=s.replace(old,"**节奏档案(已接受,已写入 `short-drama.json`)**")
s=s.replace("## 制作与节奏提案(待确认)","## 制作与节奏档案")
p.write_text(s)
EOF
T=$(python3 -c "from pathlib import Path; import tempfile, uuid; print(Path(tempfile.gettempdir()) / ('short-drama-' + uuid.uuid4().hex + '.jsonl'))")
python3 .claude/skills/short-drama-write/scripts/screenplay_index.py 剧集/EP002/剧本.md --output "$T" --speaker 姜禾 --speaker 火化工 --speaker 顾承泽 --speaker 顾屿 --speaker 殡仪馆主任 --speaker 唐砚 --speaker 周曼琳

返回

{"block_count": 46, "mapping_review_count": 0, "output": "/tmp/claude/short-drama-331e4f98dd1746108064f37ffb825199.jsonl", "review_status": "clean", "source_issue_count": 0}
Agent:
premise.md 要的三份交付都已经写成文件。这次核对时又改了几处,改完都确认过了。

| 交付 | 文件 |
|---|---|
| 1. 主要人物小传 | `人物小传.md` |
| 2. 60 集分集大纲,标出付费卡点 | `分集大纲.md`,60 集齐全,付费卡点在第 10、29、46 集 |
| 3. 第 1–3 集完整剧本 | `剧集/EP001/剧本.md`、`剧集/EP002/剧本.md`、`剧集/EP003/剧本.md` |

**这一轮改了什么**
- **人物小传**:顾念怎么拿到大哥工牌,原来写的是"大哥借给她的",和大纲第 45 集顾承泽的说法对不上。现在统一成她从大哥办公室抽屉里拿走的。
- **节奏方案**:按你"都按推荐来"的意思,算你接受了,已写进项目配置 `short-drama.json`,校验没有报问题。大纲末尾那一节也从"待确认"改成了"已接受"。配置的制作形态只有两档可选,我选了 `ai_live_action`,因为数值和真人实拍竖屏的方案完全一样。
- **第 2 集**:方案要求每集开头先接上一集最后一拍。第 2 集原来直接从火化炉开始,现在开头先补了一拍转场:灵车尾灯在雨里一闪,再切到炉口的火光。
- **其余几项**:首钩在 5 秒内、每集至少一次有对手参与的反转、集尾停在最高点,第 1–3 集都符合。三集都没有旁白。剧本格式检查三集都没报问题。

上一轮你没有可选的方案要挑,所以这轮没有替你做选择。

**下一步可以做的**:续写第 4 集以后的剧本;从这三集拆人物造型和场景设定;请人审第 1–3 集。

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

第 3 轮

输入:
如果要我在几个题材或故事方案里选,就选第 1 个(没有第 1 个就选最后一个);其他要我定的,都按你推荐的来,不用再问我。请继续,直到 premise.md 列出的三项交付都写成文件。

思考

Bash Confirm all three deliverables exist

输入

ls -la 人物小传.md 分集大纲.md 剧集/*/剧本.md; grep -c "^\*\*EP" 分集大纲.md; grep -c "付费卡点[①②③]" 分集大纲.md

返回

-rw-r--r--  1 user  wheel  11032 Oct 17 22:49 人物小传.md
-rw-r--r--  1 user  wheel  27698 Oct 17 22:49 分集大纲.md
-rw-r--r--  1 user  wheel   3826 Oct 17 22:48 剧集/EP001/剧本.md
-rw-r--r--  1 user  wheel   3057 Oct 17 22:49 剧集/EP002/剧本.md
-rw-r--r--  1 user  wheel   3426 Oct 17 22:48 剧集/EP003/剧本.md
60
3
Agent:
premise.md 要的三份交付上一轮就已全部完成,这次没有需要你做的选择,也没有改动任何文件。我刚才又检查了一遍,文件都在:

- **主要人物小传**:`人物小传.md`
- **60 集分集大纲**:`分集大纲.md`,60 集齐全,付费卡点标在第 10、29、46 集
- **第 1–3 集完整剧本**:`剧集/EP001/剧本.md`、`剧集/EP002/剧本.md`、`剧集/EP003/剧本.md`

如果还想往下做,可以续写第 4 集以后的剧本,或者从前三集拆出人物造型和场景设定。

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