From 6a8b7a9ba6dc636e90c1ad41eb46dca97e17c817 Mon Sep 17 00:00:00 2001 From: zizi Date: Mon, 13 Jul 2026 18:43:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A1=86=E6=9E=B6:=20B4-S2=20schema=E6=89=B9?= =?UTF-8?q?=E2=80=94=E2=80=94craft=E5=8F=8C=E6=A8=A1=E6=9D=BF(=E8=A3=85?= =?UTF-8?q?=E7=BD=AE=E5=BD=A2=E6=80=81=E6=9D=A1=E4=BB=B6=E5=BF=85=E5=A1=AB?= =?UTF-8?q?/=E7=A6=81=E5=A1=AB)+=E8=A3=85=E7=BD=AE=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E9=97=AD=E5=90=88=E6=9E=9A=E4=B8=BE=E5=88=A4=E5=AE=9A=E6=B5=8B?= =?UTF-8?q?=E8=AF=95+=E5=8E=9F=E7=90=86/=E8=A7=A6=E5=8F=91=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6/=E8=AF=BB=E8=80=85=E6=94=B6=E7=9B=8A/=E8=AE=B0?= =?UTF-8?q?=E5=BF=86=E7=BB=B4=E6=8C=81/=E8=BF=81=E7=A7=BB=E7=94=A8?= =?UTF-8?q?=E4=BE=8B=E7=AD=89=E6=96=B0=E5=AD=97=E6=AE=B5+emotion=E7=9B=AE?= =?UTF-8?q?=E6=A0=87=E6=83=85=E7=BB=AA+pacing=E5=90=AF=E7=94=A88=E5=AD=97?= =?UTF-8?q?=E6=AE=B5(=E9=BB=84=E9=87=91=E4=B8=89=E7=AB=A0/=E4=B8=8A?= =?UTF-8?q?=E6=9E=B6=E8=8A=82=E5=A5=8F);ingest=E4=B8=89=E5=AE=88=E5=8D=AB(?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E6=A0=A1=E9=AA=8C/=E6=9E=9A=E4=B8=BE?= =?UTF-8?q?=E7=A6=81=E5=A4=8D=E5=90=88/=E4=B8=93=E5=90=8D=E8=AF=8D?= =?UTF-8?q?=E5=85=B8);seed=E5=B7=B2=E9=87=8D=E8=B7=91=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skills/parse-book/scripts/parse_ingest.py | 33 +++++++++++++++++++ meta/schemas/combat.yaml | 1 + meta/schemas/craft.yaml | 21 +++++++++--- meta/schemas/emotion.yaml | 3 +- meta/schemas/pacing.yaml | 15 +++++++-- meta/schemas/scene_pattern.yaml | 1 + 6 files changed, 66 insertions(+), 8 deletions(-) diff --git a/.claude/skills/parse-book/scripts/parse_ingest.py b/.claude/skills/parse-book/scripts/parse_ingest.py index 3cdb01a..7be70ea 100644 --- a/.claude/skills/parse-book/scripts/parse_ingest.py +++ b/.claude/skills/parse-book/scripts/parse_ingest.py @@ -171,6 +171,13 @@ def patterns(work_id, chapter_order, file_): ch_id, src = chapter_of(conn, work_id, chapter_order) contracts = {t: field_contract(conn, t) for t in PATTERN_TYPES} book = conn.execute("SELECT title FROM muse_content_work WHERE id=%s", (work_id,)).fetchone()[0] + # 专名词典(B4-S2):本书 scaffold 实体名就是现成专名表——短专名泄漏 15 连字抓不到 + #(金标准抓到 4 张「海拉/千亿夸克」级泄漏),出处字段豁免(设计允许专名只进出处) + entity_names = {e.get("名称") or e.get("name") for (ents,) in conn.execute( + """SELECT entities FROM example_parse_scaffold + WHERE tenant_id=%s AND work_id=%s AND deleted=FALSE""", + (TENANT, work_id)).fetchall() for e in ents} + entity_names = {n for n in entity_names if n and len(n) >= 2} # 幂等:重跑本章 = 软删本章旧 draft。 # 但新轮 0 卡时保留旧卡——LLM 判卡有随机性,重跑「0 卡」不应清掉上轮已验证的产出 #(实测组合病:判重名录+随机性+软删 → 每次重跑都损耗卡) @@ -205,10 +212,36 @@ def patterns(work_id, chapter_order, file_): c["型"] = t = fits[0] else: reasons.append(f"字段越合同:{sorted(illegal)}") + # 守卫(B4-S2):craft 双模板条件必填/禁填 + 装置类型闭合枚举 + 禁复合标签 + if t == "craft" and not reasons: + form = (fields.get("装置形态") or "").strip() + dtype = (fields.get("装置类型") or "").strip() + if form not in ("结构装置", "场景手法"): + reasons.append(f"装置形态非法:{form!r}(须为 结构装置/场景手法)") + elif form == "结构装置": + miss = [k for k in ("埋设手法", "回收点", "记忆维持", "间隔纪律") if not fields.get(k)] + if miss: + reasons.append(f"结构装置必填缺失:{miss}") + else: # 场景手法:禁填间隔纪律(同场景闭环没有间隔,硬填必出伪纪律) + miss = [k for k in ("复用节奏", "异质化要求", "单章上限") if not fields.get(k)] + if miss: + reasons.append(f"场景手法必填缺失:{miss}") + if fields.get("间隔纪律"): + reasons.append("场景手法禁填间隔纪律(伪纪律来源)") + if dtype and t == "craft": + if any(sep in dtype for sep in ("+", "、", "/", ",")): + reasons.append(f"装置类型禁复合标签:{dtype!r}(只填最主要的一个)") + elif dtype not in ("伏笔", "契诃夫之枪", "信息差", "重复意象", "倒计时", "身份错认", "非装置"): + reasons.append(f"装置类型不在闭合枚举:{dtype!r}") texts = [c.get("名称"), c.get("一句话摘要"), *fields.values()] leak = leak_check([x for x in texts if x], src) if leak: reasons.append(f"脱敏违规(≥{NGRAM}连字重合):「{leak}」") + # 专名词典拒卡:卡文本(不含出处)命中本书实体名 → 拒 + hit_names = [n for n in entity_names + if any(n in str(x) for x in texts if x)] + if hit_names: + reasons.append(f"专名泄漏(本书实体名):{hit_names[:3]}") if reasons: rejected.append({"卡": c.get("名称") or f"#{i}", "原因": reasons}) continue diff --git a/meta/schemas/combat.yaml b/meta/schemas/combat.yaml index 944b78b..c949a5f 100644 --- a/meta/schemas/combat.yaml +++ b/meta/schemas/combat.yaml @@ -13,6 +13,7 @@ scope: entity - { key: 反转机制, 说明: 靠什么翻盘——法宝/援军/情报/环境/代价兑换, aiContext: true } - { key: 代价结构, 说明: 赢者付出什么——白赢是范式的失败, aiContext: true } - { key: 败者处理, 说明: 死/逃/收服/结仇,各自的后续钩子, aiContext: true } + - { key: 读者收益, 说明: '闭合枚举至多两值:代入/掌控/期待/打脸/意外/优越/紧张/温情——这场戏给读者什么多巴胺', aiContext: true } - { key: 例证出处, 说明: 书名+回目+一句话定位;严禁抄录原文, aiContext: [planning, detection] } 设计发现: - 2026-07-09 拆书首轮——「节拍结构」要求配比量化,古典文本给不出百分比,建议改「回合序列(定性)」(待回填) diff --git a/meta/schemas/craft.yaml b/meta/schemas/craft.yaml index 5130ab9..fecf96a 100644 --- a/meta/schemas/craft.yaml +++ b/meta/schemas/craft.yaml @@ -8,12 +8,23 @@ scope: entity 判据: 单点装置——删去它场景仍成立、读者体验变平;台账只收有跨章履约的装置 ‖ 承载整场戏→桥段三型;跨章公式→trope 实例落点: 公共面 knowledge/范式/技法/*.md;作品面 知识/技法/*.md 特有字段: - - { key: 装置类型, 说明: 伏笔/契诃夫之枪/信息差/重复意象/倒计时/身份错认, aiContext: true } - - { key: 埋设手法, 说明: 如何放得自然——挂在什么载体上不显眼又可回指, aiContext: true } - - { key: 履约方式, 说明: 何时、以什么形式兑现;兑现时如何唤起读者记忆, aiContext: true } - - { key: 间隔纪律, 说明: 埋与收的典型距离;太近廉价、太远失效, aiContext: true } + - { key: 装置形态, 说明: '闭合枚举二选一:「结构装置」=有埋点与回收点的跨章装置;「场景手法」=场景内完结的语气/走位/呈现技巧(跑梗/借道具/内心外化)。形态决定条件必填:结构装置必填[埋设手法/回收点/记忆维持/间隔纪律];场景手法必填[复用节奏/异质化要求/单章上限]且禁填间隔纪律——同场景闭环没有间隔,硬填必出伪纪律', aiContext: true } + - { key: 装置类型, 说明: '闭合枚举(带判定测试,不满足任何一类填「非装置」并转场景手法形态):伏笔[大类,预置信息后续兑现;子类:契诃夫之枪=预先可见地放置一个物件/事实且后续被引爆,一次性道具不算]/信息差[必须存在角色A知道而角色B或读者不知道的明确落差;主角对自己属性做计算不算]/重复意象[同一意象跨场景复现且含义累积]/倒计时[显式时限压迫]/身份错认[必须有人把A当成B;主角确认自己新身体不算]。禁止复合标签(如「信息差+契诃夫之枪」)——只填最主要的一个', aiContext: true } + - { key: 原理, 说明: '可迁移因果原则,固定句式「当X时做Y,因为读者会Z」——这是卡的本体;写不出因果链=不是范式', aiContext: true } + - { key: 触发条件, 说明: 什么创作场景该检索到这张卡(写到哪类戏/遇到什么问题时用), aiContext: true } + - { key: 读者收益, 说明: '闭合枚举至多两值:代入/掌控/期待/打脸/意外/优越/紧张/温情——这条给读者什么多巴胺', aiContext: true } + - { key: 埋设手法, 说明: 如何放得自然——挂在什么载体上不显眼又可回指(结构装置必填), aiContext: true } + - { key: 回收点, 说明: 兑现处长什么样——以什么形式引爆、如何唤起读者对埋点的记忆(结构装置必填), aiContext: true } + - { key: 记忆维持, 说明: 埋与收之间隔章时如何维持读者记忆——reminder 的节奏与形态;长篇伏笔的真实成本在此(结构装置必填), aiContext: true } + - { key: 间隔纪律, 说明: 埋与收的典型距离;太近廉价、太远失效。数值必须从出处章号差机械可验,数不出就只写定性方向(结构装置必填;场景手法禁填), aiContext: true } + - { key: 复用节奏, 说明: 同书内多次使用的频控与变化要求(场景手法必填), aiContext: true } + - { key: 异质化要求, 说明: 每次复用需要换什么(载体/刺激/语境)才不腻(场景手法必填), aiContext: true } + - { key: 单章上限, 说明: 一章内最多用几次;超限的后果(场景手法必填), aiContext: true } + - { key: 滥用反例, 说明: 至少一个「这样用必砸」的具体反面情形, aiContext: true } - { key: 失败模式, 说明: 这个装置最常见的用砸方式, aiContext: true } + - { key: 迁移用例, 说明: 换一个完全不同题材(都市悬疑/古装宫斗)这技法怎么用,一句话——写不出=不是范式,降级为用例不入公共库, aiContext: true } - { key: 例证出处, 说明: 书名+回目+一句话定位;严禁抄录原文, aiContext: [planning, detection] } 设计发现: - - 2026-07-09 拆书首轮——「装置类型」枚举层级不清(契诃夫之枪是伏笔的子类),建议枚举分层:大类下挂子型(待回填) + - 2026-07-09 拆书首轮——「装置类型」枚举层级不清(契诃夫之枪是伏笔的子类),建议枚举分层:大类下挂子型(已于 2026-07-13 B4 落入字段说明两级枚举) - 好字段实证:「间隔纪律(太近廉价、太远失效)」区分力五型最强——速引装置与超长线预言在此字段对比鲜明 + - 2026-07-13 B4(fable 审查+opus 金标准):加「装置形态」双模板(结构装置/场景手法条件必填)——伏笔框架硬套场景手法逼出伪纪律;加「原理/触发条件/读者收益/回收点/记忆维持/滥用反例/迁移用例」——金标准结论:失败模式才是干货位,说明重心要从剧情复述翻转到可迁移原则;装置类型闭合枚举+判定测试入字段说明(唯一源,prompt 渲染、ingest 校验)——「prompt 自立合同」漂移冤案的制度性根治。以上均为实验侧先行,待回填 design-docs 专题-06 diff --git a/meta/schemas/emotion.yaml b/meta/schemas/emotion.yaml index 9fad62b..b1a3817 100644 --- a/meta/schemas/emotion.yaml +++ b/meta/schemas/emotion.yaml @@ -12,7 +12,8 @@ scope: entity - { key: 爆发点设计, 说明: 触发物/触发言——具体的一物一言,不是氛围, aiContext: true } - { key: 克制手法, 说明: 怎么不煽情而动人(动作代情/留白/错位反应), aiContext: true } - { key: 关系后果, 说明: 这场戏后关系发生什么不可逆变化, aiContext: true } + - { key: 目标情绪, 说明: 预期读者反应,可复合(悲/惧/敬/意难平/鼻酸/燃)——情感戏的靶心是具体情绪,语义与「读者收益」多巴胺枚举不同故不共用, aiContext: true } - { key: 例证出处, 说明: 书名+回目+一句话定位;严禁抄录原文, aiContext: [planning, detection] } 设计发现: - - 2026-07-09 拆书首轮——缺「目标情绪/预期读者反应」独立字段(悲/惧/敬/意难平),复合情绪现只能挤进「情绪弧类型」(待回填) + - 2026-07-09 拆书首轮——缺「目标情绪/预期读者反应」独立字段(悲/惧/敬/意难平),复合情绪现只能挤进「情绪弧类型」(2026-07-13 B4 已补字段落地) - 好字段实证:「铺垫结构=情感欠账清单」「爆发点=具体一物一言」把情感戏逼成可清点要件,对生成与检测都友好 diff --git a/meta/schemas/pacing.yaml b/meta/schemas/pacing.yaml index a18c881..8a1463f 100644 --- a/meta/schemas/pacing.yaml +++ b/meta/schemas/pacing.yaml @@ -4,6 +4,17 @@ domain: narrative scope: work 本体分组: 画像 层次: 双层 -状态: 待启用 +状态: 启用 判据: 顺序敏感的分布,值是曲线/比率,打乱章序即毁 ‖ 单个爽点构成→craft;逐章安排→outline -启用条件: 进入卷中期、A9 质量收敛需要节奏审计时;届时补字段(张力曲线模板/爽点间隔/文戏武戏配比) +启用记录: 2026-07-13 B4 启用(创始人议题「黄金前3章/前10章/上架前后节奏」的归属型;抽取窗口=书级——全体窗级大纲+章细纲+已审核卡锚点,不回原文) +特有字段: + - { key: 黄金三章画像, 说明: 前三章逐章职责链(ch1 身份锚+钩/ch2 立冲突/ch3 首爽点)及本书实际偏离——网文开局抓人法则的本书实例, aiContext: true } + - { key: 开局策略, 说明: 前十章信息释放波次/首个大高潮位置/新角色引入密度, aiContext: true } + - { key: 上架节奏切换, 说明: 免费期 vs 付费期的爽点密度与卷末悬念强度对比——商业节奏分水岭, aiContext: true } + - { key: 张力曲线, 说明: 窗级定性序列(低/中/高)+转折章号——「打乱章序即毁」的本体, aiContext: true } + - { key: 爽点间隔, 说明: 类型化爽点(打脸/升级/获得/复仇兑现)章距——典型值+最大空窗;数字从细纲数出,机械可验, aiContext: true } + - { key: 文戏武戏配比, 说明: 窗内配比与交替模式, aiContext: true } + - { key: 钩子密度画像, 说明: 章末钩子类型分布与强钩位置, aiContext: true } + - { key: 例证出处, 说明: 书名+窗区间+定位;严禁抄录原文, aiContext: [planning, detection] } +设计发现: + - 2026-07-13 B4——作品面画像先行;公共面品类节奏范式(如「系统流开局标准节奏」)等多书画像齐+真检索需求再聚合(fable 审查「不建议做」第6条)。字段合同为实验侧先行,待回填 design-docs diff --git a/meta/schemas/scene_pattern.yaml b/meta/schemas/scene_pattern.yaml index b70adb9..5701e68 100644 --- a/meta/schemas/scene_pattern.yaml +++ b/meta/schemas/scene_pattern.yaml @@ -13,6 +13,7 @@ scope: entity - { key: 收束方式, 说明: 常见落点与"拿到但代价"的变体, aiContext: true } - { key: 信息功能, 说明: 这类场景天然适合埋什么/揭什么, aiContext: true } - { key: 角色功能位, 说明: 需要哪些位置——主导者/搅局者/围观者/裁判, aiContext: true } + - { key: 读者收益, 说明: '闭合枚举至多两值:代入/掌控/期待/打脸/意外/优越/紧张/温情——这场戏给读者什么多巴胺', aiContext: true } - { key: 例证出处, 说明: 书名+回目+一句话定位;严禁抄录原文, aiContext: [planning, detection] } 设计发现: - 2026-07-09 拆书首轮——「场景类型」需明标枚举非封闭(首轮三卡全落枚举外);与 trope 边界补判据:多场景但收束于一事=scene_pattern,开放跨章=trope;7 字段偏多可精简(待回填)