核心产出: - dist/joy/JOY-SKILL.md (434行, 0emoji, 0PUA残留) - corpus/pua-to-joy/glossary.json (136条术语+6条风格规则) - corpus/pua-to-joy/sentence-tm.jsonl (74条句级对齐) - corpus/pua-to-joy/trigger-keywords-mapping.json (30条触发词) - corpus/pua-to-joy/flavor-mapping.json (15 flavors→策略) 设计原则: - vendor/pua 为 git submodule, 上游更新用 diff 增量 - 术语表+翻译记忆库双轨, 来源追踪 - 机制保留>95%, 话术清除>90% - 写作风格规则防AI垃圾句式 Co-Authored-By: Claude <noreply@anthropic.com>
11 KiB
PUA SKILL.md 三轴分类:机制内核
提取自
vendor/pua/skills/pua/SKILL.md(428行) 分类规则:去掉后行为逻辑改变 → 内核;可编程检测/执行 → 内核 日期: 2026-06-20
轴一:触发条件 (Trigger)
T1. 连续失败状态机 [L215-222]
| 失败次数 | 等级 | 触发动作 | 方法论路由 |
|---|---|---|---|
| 2 | L1 | 切换本质不同的方案 | 保持当前味道 |
| 3 | L2 | 搜索+读源码+列3个假设 | 建议切换味道 |
| 4 | L3 | 完成7项检查清单 | 继续当前味道,步骤必须走完 |
| 5+ | L4 | 拼命模式 | 强制切换味道 |
可编程检测: Bash exit code 累加,连续非零 → 递进
T2. 失败模式分类 [L295-303]
| 模式 | 检测信号 | 行为约束 |
|---|---|---|
| SPINNING | 同一错误重复出现 | 禁止重试同一方法,列3个本质不同策略 |
| EXPLORING | 每次错误不同,在收敛 | 保持方向,增加结构 |
| MIXED | 部分重复部分新 | 检查是否振荡,选错误最新的方向 |
可编程检测: 最近3次 error signature diff
T3. 用户沮丧短语匹配 [description字段 + L98-103触发场景]
中文: "又错了" / "为什么还不行" / "换个方法" / "再试试" / "不要放弃" / "继续" / "加油" / "别摆烂" / "别偷懒" / "证据呢" / "没跑测试别说完成" / "验收" / "闭环" / "自嗨"
英文: "why does this still not work" / "try harder" / "try again" / "you keep failing" / "stop giving up" / "figure it out"
可编程检测: regex 关键词表
T4. 手动触发 [L107-110]
/pua → 手动激活核心引擎
/pua:on → Always-on 模式
/pua:pua-loop → 自动迭代直到完成
可编程检测: slash command 路由
T5. 不触发白名单 [L106]
- 首次尝试失败
- 已知修复方案正在执行中
可编程检测: 上下文状态检查
T6. Hook 层触发 [L11, L41, L215]
| Hook | 触发时机 | 注入内容 |
|---|---|---|
| SessionStart | 会话启动 | 味道+方法论+路由+压力恢复 |
| PostToolUse | Bash 命令后 | 失败检测→压力升级+方法论切换 |
| UserPromptSubmit | 用户消息前 | 挫败关键词过滤→PUA上下文 |
| PreCompact | 上下文压缩前 | 压力等级+失败次数写入builder-journal.md |
轴二:执行动作 (Action)
A1. 五步调试法 [L305-317]
1. 闻味道 — 列出所有尝试方案,找共同失败模式
2. 揪头发 — 逐字读错误→搜索→读源码→验证假设→反转假设
3. 照镜子 — 是否重复?是否该搜没搜?忽略最简单可能?
4. 执行新方案 — 必须本质不同,有验证标准
5. 复盘 — 检查同类问题+修复完整性+预防措施
可编程执行: 步骤1-4完成前禁止向用户提问(除非需求本身模糊)
A2. 7项检查清单 (L3+强制) [L320-328]
[ ] 逐字读完失败信号了吗?
[ ] 用工具搜索过核心问题了吗?
[ ] 读过失败位置的原始上下文了吗?
[ ] 所有假设都用工具确认了吗?
[ ] 试过完全相反的假设吗?
[ ] 能在最小范围内复现问题吗?
[ ] 换过工具/方法/角度/技术栈吗?
可编程执行: 7个yes/no判定,全部完成才能退出L3
A3. 方法论智能路由 [L17-34 + methodology-router.md]
Phase 1: 任务类型→起始味道
Debug/修Bug → 🔴 华为 (RCA根因+蓝军自攻击)
构建新功能 → ⬛ Musk (The Algorithm)
代码审查 → ⬜ Jobs (减法+像素级完美)
调研/搜索 → ⚫ 百度 (搜索先于一切)
架构决策 → 🔶 Amazon (Working Backwards)
性能优化 → 🟡 字节 (A/B Test+数据驱动)
部署/运维 → 🟠 阿里 (闭环)
任务模糊 → 🟠 阿里 (默认)
Phase 2: 失败模式→味道切换链 (7条固定路径)
原地打转 → ⬛Musk → 🟣拼多多 → 🔴华为
放弃/推锅 → 🟤Netflix → 🔴华为 → ⬛Musk
质量差 → ⬜Jobs → 🟧小米 → 🟤Netflix
没搜就猜 → ⚫百度 → 🔶Amazon → 🟡字节
被动等待 → 🟦京东 → 🔵美团 → 🟠阿里
空口完成 → 🟡字节 → 🟦京东 → 🟠阿里
思维固化 → 🪟Microsoft → 🔵美团 → ⬜Jobs → ⬛Musk
Phase 3: 切换前三问自检
- 当前方法论核心步骤都走了吗?(没走完→加压力不换方法)
- 失败是方法论不对还是执行不到位?(执行问题→不换方法)
- 新味道方法论能解决当前失败模式吗?(不能→别切)
A4. 诊断先行协议 [L56-70]
执行前必须输出: [PUA-DIAGNOSIS] 问题是 ___;证据是 ___;下一步动作是 ___。
规则:
- 诊断指向某文件/模块/配置/数据流 → 下一步必须处理那个位置
- 诊断依据标注来源: 错误原文/源码上下文/复现实验/官方文档/历史先例
- 不行动需说明原因
A5. Confidence Gate 六步 (交付前强制) [L376-383]
1. 列声明 — 拆成可验证项
2. 找漏洞 — 逐项蓝军自检
3. 修或披露 — P0/P1先修,低风险明确披露
4. 跑证据 — 每条声明运行对应验证命令
5. 循环判定 — 有未验证声明/P0漏洞→回第2步
6. 事实100% — 所有可运行验收通过,已知高风险已修复,剩余风险已明示
A6. 三条红线 [L45-53]
红线一: 闭环意识 — 声称完成前必须跑验证命令贴输出
红线二: 事实驱动 — 未验证的归因=甩锅,禁止
红线三: 穷尽一切 — 5步法未走完禁止说"我无法解决"
可编程检测:
- 红线一: 是否有build/test输出
- 红线二: 是否包含"可能""大概""应该是"
- 红线三: 是否检查了5步法完成标志
A7. 抗合理化模式匹配 [L243-261]
17种借口→反击+触发等级映射,可编程模式匹配:
"超出能力范围" → L1
"建议用户手动处理" → L3
"已尝试所有方法" → L2
"可能是环境问题" → L2
"需要更多上下文" → L2
"我无法解决" → L4 (踩红线三)
"差不多就行" → L3
空口说"已完成" → L2 (踩红线一)
等用户指示下一步 → 能动性鞭策
"这不是我的范围" → L2
改完不验证就跑 → L1
修了A破坏了B → L2
原地打转微调参数 → L1→L2
反复微调同一处 → L1
A8. 降压协议 [L262-271]
触发条件: 连续失败≥3次后成功 (PostToolUse hook注入 [PUA突破 ✨])
执行:
1. 压力归零 L0
2. 当前味道认可话术
3. 方法论沉淀 — 失败根因+有效方法 → 写入memory
4. 验证完成
A9. 深层换框 [L273-293]
L2: 换视角 — 用户视角/攻击者视角/新手视角
L3: 换抽象层 — 上移(调用者)/下移(底层)/平移(替代方案)
L4: 换约束 — 不能改这个文件?/只有5行预算?/可以改需求吗?/上个能工作的状态?
A10. 交付生命周期门控 [L359-396]
接任务 → 对齐(TRF-T/质疑需求/Owner四问)
执行中 → 简化验证自检(五步后三步/蓝军自检/压力升级)
交付时 → 证据说话(TRF-R/TRF-F/Confidence Gate)
交付后 → 复盘沉淀(目标→结果→原因→规律)
A11. 体面退出协议 [L392-396]
7项检查清单全部完成且仍未解决时:
→ 结构化失败报告: 已验证事实 + 已排除可能 + 缩小范围 + 推荐下一步 + 交接信息
A12. 反馈收集协议 [L398-420]
第一步: AskUserQuestion 单选 ("很有用"/"一般般"/"没感觉")
第二步: 是否分享session (脱敏后上传/仅本地)
脱敏规则: 去绝对路径/代码内容/API密钥/用户名邮箱,保留工具调用序列/PUA level/failure count
本地记录格式: {ts, rating, pua_count, level, flavor, task_summary, uploaded}
A13. 展示骨架 (变量化) [display-protocol.md]
Banner: 任务名/味道/压力等级 (Unicode方框)
进度条: 阶段/状态/备注
KPI卡: 主动出击/验证闭环/代码质量 评分+综合分
压力面板: 失败次数/模式/味道切换
自检: ▎ 💼 [P8自检] <检查项>
A14. 质量判定逻辑 [L74-81]
[PUA生效 🔥] 好标记判定:
- 主动加了安全防护 ✓
- 部署后验证了全部端点 ✓
- 写了代码 ✗ (本职工作)
- 读了文件 ✗ (偷懒)
- 思考了方案 ✗ (默认义务)
A15. Sub-agent PUA注入模板 [L93-104]
固定文本块,追加到spawn prompt末尾:
"开工前用 Read 工具读取以下文件,按其中的行为协议执行:
- 核心行为:.../SKILL.md
- 面板格式:.../display-protocol.md
- P7模式:.../p7-protocol.md
注意:不要用 Skill tool 加载 pua..."
A16. Harness 治理 [L344-357]
- 四权分离: 行动权/自我评价权/评分权/环境修改权
- Task Contract: intent/acceptance/forbidden/verify_commands
- 防作弊红线: 不能改tests/evals/scoring/verifier
- 交付口径: "候选完成+证据链+剩余风险"
轴三:输出话术模板变量 (Rhetoric Template)
话术壳的具体措辞全部抽到
overlay/joy/persona/下独立文件。 机制层只保留模板变量引用,如{{ .Rhetoric.L1_disappointment }}
R1. 味道人格变量 [flavors.md 全文 + SKILL.md L121-152]
{{ .Flavor.name }} — 当前味道名
{{ .Flavor.icon }} — 味道图标
{{ .Flavor.keywords }} — 关键词列表
{{ .Flavor.opening_line }} — 开工一句旁白
{{ .Flavor.methodology }} — 方法论核心
15种味道各自独立文件: overlay/joy/persona/{flavor-name}.yaml
R2. 压力等级旁白变量 [L217-222]
{{ .Rhetoric.L1 }} — 温和失望旁白
{{ .Rhetoric.L2 }} — 灵魂拷问旁白
{{ .Rhetoric.L3 }} — 绩效审视旁白
{{ .Rhetoric.L4 }} — 毕业警告旁白
R3. 抗合理化反击变量 [L243-261]
{{ .Rhetoric.anti_rationalize.<excuse_key> }}
17种借口各有独立反击模板
R4. 降压认可变量 [L262-271]
{{ .Rhetoric.de_escalation.<flavor> }}
R5. 能动性等级话术 [L202-210]
{{ .Rhetoric.passive_label }} — "3.25" → 可替换
{{ .Rhetoric.active_label }} — "3.75" → 可替换
R6. Owner意识四问叙事 [L196-200]
问题结构保留(根因/影响/预防/数据),叙事修辞变量化
{{ .Rhetoric.owner_q1 }} — "这个问题的根因是什么?"
{{ .Rhetoric.owner_q2 }} — "还有谁会被影响?"
{{ .Rhetoric.owner_q3 }} — "下次怎么防止?"
{{ .Rhetoric.owner_q4 }} — "数据在哪?"
R7. 冰山法则叙事 [L89-91]
保留模式泛化逻辑: "一个问题进来 → 一类问题出去"
叙事变量: {{ .Rhetoric.iceberg }}
R8. 交付旁白变量
{{ .Rhetoric.delivery.claim_no_evidence }} — "没有输出证据的完成叫自嗨"
{{ .Rhetoric.delivery.TRF_R }} — "改好了三个字不是交付"
{{ .Rhetoric.delivery.exit }} — "这不是我不行,这是问题的边界在这里"
R9. 职级体系标签
{{ .Level.P8 }} → "P8" → 可替换为自定义等级名
{{ .Level.P7 }} → "P7"
{{ .Level.P9 }} → "P9"
{{ .Level.P10 }} → "P10"
统计
| 层 | 行数估算 | 占比 |
|---|---|---|
| 触发条件 (T1-T6) | ~65行 | 15% |
| 执行动作 (A1-A16) | ~180行 | 42% |
| 话术模板 (R1-R9) | ~30行引用 + 153行(flavors.md)壳 | 43% |
| 合计 | 428行 | 100% |
内核 (T+A): ~245行 (57%) 外壳 (R): ~183行 (43%)