Skip to content
Back to skills

Adversarial Lyric Writer

ASecurity

当使用者说"帮我填词"、"按这个字数模板写歌词"、"用多Agent对抗式写词"、"这首副歌帮我想几句"时使用,前提是字数骨架和这首歌写什么都已经有了;只有主题、还没定写什么时先用 lyric-concept-builder。拿一份字数骨架和意象系统,派三个 sonnet 子代理按不同路子并行独立起草(场景派 / 口语派 / 意象派),再派一个红队子代理逐句挑毛病,主 Agent 按句裁决拼稿,最后统一辙口与意象。收敛判据卡死:字数用 lyric-doctor 的脚本对模板数、每段同辙、hook 不含陈词、主歌二对主歌一有推进。不抄现有歌词,不替使用者决定这首歌要说什么。

  • 5 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added November 7, 2026
documentationpythongobash

Works with

  • claude code

Security analysis

A100/100

Scanned November 7, 2026

npx -y skills add ChromiteCr/Skills --skill adversarial-lyric-writer --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Adversarial Lyric Writer?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Adversarial Lyric Writer
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/chromitecr-adversarial-lyric-writer/badge)](https://www.skillsdirectory.com/skills/chromitecr-adversarial-lyric-writer)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: adversarial-lyric-writer
description: 当使用者说"帮我填词"、"按这个字数模板写歌词"、"用多Agent对抗式写词"、"这首副歌帮我想几句"时使用,前提是字数骨架和这首歌写什么都已经有了;只有主题、还没定写什么时先用 lyric-concept-builder。拿一份字数骨架和意象系统,派三个 sonnet 子代理按不同路子并行独立起草(场景派 / 口语派 / 意象派),再派一个红队子代理逐句挑毛病,主 Agent 按句裁决拼稿,最后统一辙口与意象。收敛判据卡死:字数用 lyric-doctor 的脚本对模板数、每段同辙、hook 不含陈词、主歌二对主歌一有推进。不抄现有歌词,不替使用者决定这首歌要说什么。
category: songwriting/lyrics
version: 0.1.1
status: draft
priority: P1
compatible_agents:
  - claude-code
  - generic-llm-agent
display_name: 对抗式填词
outputs:
  - chat
max_rounds: 30
suggest_hint: 有字数模板和主题了?用「对抗式填词」派几个 Agent 并行起草,挑句子拼一稿
---

# 对抗式填词 / Adversarial Lyric Writer

多个子代理并行独立起草,红队逐句挑,主 Agent 按句裁决。

**为什么要对抗**:一个模型写一稿,第二段一定是第一段的同义换词,副歌 A/B 一定重复。
让三个互不可见的子代理各写一稿,句子之间才有真正的差异可挑。
主 Agent 不起草句子:新句子只来自起草子代理,主 Agent 只做骨架、派活、裁决,
能动手的只有第 4 轮那种不改意思、不换句的统一化小改。一旦主 Agent 自己下场写,
它会不自觉地把三稿往自己那版上靠,对抗就塌了。

## 词在整首歌里的位置 / What lyrics actually do

写词不是写诗,每一条约束都对应旋律里的一件事:

| 词里的东西 | 对应曲里的什么 |
|---|---|
| 每行字数 | 小节里的节拍数。字多一个就得挤进半拍,唱起来赶 |
| 行内停顿 | 换气点,也是乐句的分句 |
| 韵脚 | 旋律回到主音的落点。同辙 = 听觉上"回来了" |
| hook | 副歌的记忆点,整首歌被记住的那一句 |
| 段落长短变化 | 编曲的动态:预副收紧、副歌铺开、桥段抽空 |

所以字数不是格式要求,是节奏本身。**改字数等于改旋律**,宁可换整句说法也不要多塞一个字。

**这个技能不产出**:旋律、和弦、编曲、demo 音频。它只产出词和词的自检信息。

## 何时使用 / When to use

- 已经有字数骨架(用户给的 `xxx` 模板,或 `lyric-structure-mapper` 生成的)
- 已经知道这首歌要说什么(用户说清楚了,或 `lyric-concept-builder` 定过)
- 想让一段副歌有几个不同方向的候选

**不适用于** / Not for:

- 还不知道这首歌在讲什么 → 先用 `lyric-concept-builder`,直接开写必出套话
- 只有一个模糊念头、连结构都没有 → 先用 `lyric-structure-mapper`
- 手上已有成稿只想改 → 用 `lyric-doctor`,那是定点修改,不重写

## 开工前必须齐的三样

缺任何一样就先补,别硬写:

1. **字数骨架** —— 每段每行几个字、停顿在哪、哪几行押韵
2. **这首歌在说什么** —— 不是"疗愈"这种效果词,是具体处境:谁、在什么状况下、发生了什么变化
3. **可用的素材** —— 真实的画面、物件、时间地点、一句真话。**一样都没有的话先问**,
   没有素材的词只能靠形容词堆,那正是听起来像 AI 的原因

## 流程 / Process

### 第 1 轮:三个子代理并行起草

用 Agent 工具起三个子代理,`model: "sonnet"`,`run_in_background: false`,**同一条消息里一次发出**。

用 sonnet 而不是更强的模型,理由是这一轮要的是量和差异:三稿里大半的句子会被丢掉,
并行三份 sonnet 草稿比一份精雕细琢的稿子更有得挑。裁决和终稿一致性由主 Agent 负责。

三个子代理拿到**完全相同**的骨架、素材和黑名单,但路子不同:

| 代号 | 路子 | 硬约束 |
|---|---|---|
| A 场景派 | 只写能拍成镜头的东西 | 全稿禁止出现直接的情绪形容词(疲惫、温柔、勇敢…),情绪靠动作和物件带出来 |
| B 口语派 | 像在跟一个具体的人说话 | 允许不完整句、口语词、语气词;禁止书面语和成语 |
| C 意象派 | 一个母意象贯穿全篇 | 先定一个具体物件或场所,其余每一句都必须和它有关 |

给每个子代理的提示里必须包含:完整骨架(含每行字数与停顿)、这首歌在说什么、
可用素材、`_shared/craft-reference.md` 第 2 节的黑名单、以及它自己那条路子的硬约束。

**不要把对话历史整个塞给子代理**,也不要告诉它另外两个代理的存在 —— 知道了就会互相找平。

每个子代理返回:

```
完整初稿(按段落,每行后标 [字数])
本稿各段用的辙
我自己最不满意的三行,以及为什么
```

子代理自标的字数只作参考,字数以脚本为准。三稿收回后,主 Agent 把骨架存成 x 模板
(骨架只有表格时按每行字数和停顿写,4+5 写成 `xxxx xxxxx`),每稿去掉行尾的 [字数] 标注
(标注里的"字"也会被数进去)后存成文件,各跑一遍:

```bash
python3 ../lyric-doctor/scripts/lyric_check.py 稿1.txt --template 模板.txt
```

路径相对本 skill 目录,在仓库根下是 `skills/songwriting/lyric-doctor/scripts/lyric_check.py`。
段落名照骨架写,「主」和「主歌 1」脚本都对得上;报"模板里没有对应的段落"时先改段落名再跑。

### 第 2 轮:红队逐句挑

一个 sonnet 子代理,拿到三份稿子的正文和每稿的脚本结果(**不告诉它哪稿是谁写的**,也不给路子说明),
另给 `_shared/craft-reference.md` 第 1 节的十三辙表和"副歌用开口辙"那一条,rubric 里的开口辙、闭口音按它判。
按下面的 rubric 逐句过:

| 检查项 | 判据 |
|---|---|
| 字数 | 看脚本结果,不自己数:±1 以内算过;同段对应行必须同长 |
| 辙 | 每段是否同辙;副歌是否用了开口辙 |
| 陈词 | 命中黑名单几个;hook 里有没有 |
| 画面 | 这一行能不能拍成镜头;不能的比例多高 |
| 推进 | 主歌二相对主歌一,时间/地点/事件/视角至少变了一样吗 |
| 重复 | 副歌 A/B 是不是同义换词 |
| 倒装 | 有没有为了押韵扭曲语序 |
| 长音 | 行末字是不是闭口音 |

红队的输出是**问题清单**,不是第四稿:

```
[稿号-段落-行号] 问题类型:具体毛病。改法方向(不给成句)
```

**明确禁止红队重写整稿**。一旦它交出一份"我改好的版本",那份稿子会因为最新最完整而被默认采用,
三稿对抗的成果就白费了。

### 第 3 轮:主 Agent 按句裁决

主 Agent 自己做,不派子代理:

1. 逐行比较三稿的同位置句,挑最好的那一句;三稿都不行的行,标记为待补
2. 拼出一稿,此时它一定是拼贴感很重的
3. 待补的行,退回第 1 轮只针对这几行再派一次;主 Agent 不自己补写

裁决时的取舍顺序:**能拍成画面 > 不含陈词 > 有推进 > 押得顺 > 意思到位**。
意思到位排最后,因为三稿都是照同一个意思写的,意思本来就都到位。

### 第 4 轮:统一化

派一个 sonnet 子代理做终稿统一,任务只有四件,**不许改意思、不许换句**:

- 人称统一("你"和"我"不要混着来,除非是刻意的对话结构)
- 意象系统统一(拼贴后常出现厨房、海边、星空同时在场,删到只剩一个世界)
- 每段辙口统一(改动限制在行末字,不动整句)
- 口语程度统一(有的行文绉绉、有的行很口语,往口语那边靠)

### 第 5 轮:收敛判据

全过才能交付,任何一条不过就回到对应的轮次:

- [ ] 终稿照第 1 轮的方法跑 `lyric_check.py`,报"机械问题 0 处"(每行在骨架 ±1 内、停顿对得上、
      没有对不上模板的段落);同段对应行同长,对照脚本打出的各行字数
- [ ] 每段落押同一个辙,副歌是开口辙
- [ ] hook 只有一句,全篇出现 ≥2 次,不含黑名单词
- [ ] 主歌二相对主歌一有可以指出来的推进
- [ ] 副歌 A/B 不是同义换词
- [ ] 全篇抽象情绪词 ≤5 个
- [ ] 出声读一遍,没有卡壳和拗口

## 没有这些工具时(降级)

流程里有两样东西不是每个运行时都有:Claude Code 的子代理(Agent 工具、`model: "sonnet"`),
和能执行 Python 跑 `lyric_check.py`。缺了就按下面换,并在输出里如实标注:

- **没有子代理**:能发互不共享上下文的独立调用(新会话、单独的模型请求)时,三个起草、一个红队
  各用一次,每次只给该角色那份提示。做不到就在同一个上下文里按角色依次做:三稿一稿写完再写下一稿,
  写每稿前只重读骨架、素材和本稿的路子,不回看前一稿;再换成红队出问题清单,最后裁决。
  自检表加一行"流程 | 降级:各角色互相看得见",并告诉使用者三稿之间的差异会比并行时小。
- **能执行 Python、但找不到 `lyric_check.py`**:用下面的命令逐行数汉字,再对照模板,
  自检表的字数一行标"降级计算":

  ```bash
  python3 -c "import re,sys; [print(len(re.findall(r'[一-鿿]', l)), l.rstrip()) for l in open(sys.argv[1], encoding='utf-8') if l.strip()]" 终稿.txt
  ```

- **完全不能执行代码**:字数一行写"未验证",不用目测冒充"全部命中"。

## 输出格式 / Output

```markdown
## 歌词

主歌 1
<每行>
...

(各段照排)

## 自检

| 项 | 结果 |
|---|---|
| 字数(lyric_check.py) | 机械问题 0 处 / 第 X 段第 Y 行差 1 字(说明为什么留着) |
| 辙 | 主歌=言前 副歌=江阳 桥段=遥条 |
| hook | 「<那一句>」,出现 2 次 |
| 抽象情绪词 | 3 个:<列出来> |

## 备选句

<被否掉但还不错的句子,按位置列,供替换>

## 我妥协的地方

- <哪一行、为什么、有什么代价>
```

备选句这一段不要省。用户对某一行不满意时,有现成的候选比重跑一轮快得多。

## 边界 / Boundaries

- **不抄现有歌词**。用户说"要那首歌的感觉"时,学的是结构、辙口、句长节奏,
  不是句子。任何情况下不得复述受版权保护的歌词原文。
- **不替使用者决定这首歌要说什么**。素材和立场是他的,缺了就问,不要自己编一段人生经历填进去。
- **不编造他的真实经历**。用户说"写我奶奶",那就问奶奶的具体事;
  编一个"老屋门前的柿子树"出来,写得再好也是假的。
- **不为了押韵扭语序**。宁可这一行不押。
- **不把子代理的推理过程贴给用户**。他要的是词和候选句,不是三份完整草稿加一份评审报告。
- **不产出旋律和编曲建议**冒充完整作品。这个技能只管词。

## Token 控制 / Token discipline

- 三个起草代理必须在**同一条消息里并行发出**,串行等于三倍等待
- 给子代理的提示是自包含的短包(骨架 + 说什么 + 素材 + 黑名单 + 路子),不传对话历史
- 红队只拿三稿正文、每稿的脚本结果和第 1 节的辙表,不拿骨架说明和素材
- 主 Agent 不重贴三稿,只贴最终稿 + 备选句
- 第 4 轮统一化如果改动很少,主 Agent 自己做,别为了走流程再起一个子代理

## 变更记录 / Changelog

| 版本 | 日期 | 变更 | 类型 |
|---|---|---|---|
| 0.1.1 | 2026-09-26 | 字数改由 lyric-doctor 的 lyric_check.py 对模板数(三稿收回后和终稿各跑一次),不再靠子代理自报;红队拿脚本结果和开口辙定义;"主 Agent 不起草句子"与第 3、4 轮统一:待补行退回第 1 轮;补"没有这些工具时(降级)";description 删掉与 lyric-concept-builder 撞车的"我们在写一首关于X的歌",写明前提 | patch |
| 0.1.0 | 2026-08-11 | 初始草稿 | minor |

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.