xbuilderlab--cheat-on-content
338 行
27 KiB
Markdown
338 行
27 KiB
Markdown
# Changelog
|
||
|
||
All notable changes to cheat-on-content will be documented here.
|
||
|
||
格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [SemVer](https://semver.org/lang/zh-CN/)。
|
||
|
||
---
|
||
|
||
## [Unreleased]
|
||
|
||
### Added — xhs-explore adapter: 公开页兜底、正文/图片归档、账号汇总
|
||
|
||
- 融合 [xhs-analytics](https://github.com/SingularGuyLeBorn/xhs-analytics) 的公开页解析能力:
|
||
- `crawler.fetch_public_note()` 无登录解析 `window.__INITIAL_STATE__`,补全正文、图片 URL、标签。
|
||
- `crawler.fetch_public_comments()` 当前台 API 拿不到评论时,用公开页 top 评论兜底(通常 ~10 条)。
|
||
- `crawler.download_image()` 异步下载笔记图片。
|
||
- `review.py` 新增子命令:
|
||
- `archive <notes.json> [output_root] [limit]`:批量归档已发布笔记正文与图片。
|
||
- `summarize [out_dir]`:基于创作者中心最近 50 条 + 公开页标签生成账号级汇总。
|
||
- `review.py note` 支持环境变量 `XHS_DOWNLOAD_IMAGES=1` 下载图片到 `videos/<...>/images/`。
|
||
- `renderer.py` 在 `report.md` 中新增「正文 + 标签」与「图片」块。
|
||
- `requirements.txt` 增加 `requests>=2.28`。
|
||
- `Session.open()` 在未下载 Playwright Chromium 时自动 fallback 到系统 Chrome(`channel="chrome"`)。
|
||
|
||
### Added — 受众画像 persona(cheat-persona skill + audience.md)
|
||
|
||
**动机**:用户选题 / 写稿时缺一个清晰的"谁在看"的镜子。新增受众画像功能——从复盘评论数据聚类出账号真实受众。
|
||
|
||
**设计**:persona 是和 rubric **平行**的第二个派生物:
|
||
|
||
```
|
||
复盘数据(评论 + 完播 + 转粉)
|
||
├──→ rubric 进化(cheat-bump) —— "怎么打分"
|
||
└──→ 受众画像(cheat-persona) —— "谁在看"
|
||
```
|
||
|
||
- **新 skill `/cheat-persona`**(第 15 个子 skill)—— 扫 `predictions/*.md` 复盘段评论,按"自我认同 / 情绪寄存 / 反驳点 / 语言"四维聚类,写 `audience.md`
|
||
- **新文件 `audience.md`** + `templates/audience.template.md` —— 受众画像 reference,和 `benchmark.md` 同级。强制每条"验证特征"带评论证据 + 条数;验证 / 假设 / 反画像三分;强制写"反画像"防 persona 变成讨好自己的虚构
|
||
- **⚠️ 污染隔离**:`audience.md` 从评论派生 = 含实绩信号。`cheat-score-blind` hard refusal list 加 `audience.md`,refusal_code `blocked_audience`。persona 影响 cheat-seed **写什么**(creative),不影响 cheat-predict **怎么打分**(blind sub-agent 永不读 audience.md)
|
||
- **cheat-seed 接线**:Phase 0 读 audience.md 作为"这个 persona 会在乎吗"的镜子(Confidence 🟡 以上才当检验视角;不进粗打分)
|
||
- **cheat-init 接线**:Phase 3 脚手架创建空 `audience.md`;导了 benchmark 的用户提示可 `/cheat-persona — seed-from-benchmark`
|
||
- **Confidence 分级**:🔴 无数据 / 🟠 benchmark-seed 未验证 / 🟡 1-2 篇复盘 / 🟢 3-5 篇 / 🔵 6+
|
||
- **零 schema 变化**:persona 元数据全放 audience.md header(version / last_rebuilt / 数据基础 / Confidence),不动 `.cheat-state.json`
|
||
|
||
**Phase 1 范围**(本次):上述。**Phase 2 路线**(未做):cheat-recommend persona-fit 排序 / cheat-status 新鲜度 nag / cheat-retro 自动 flag。
|
||
|
||
**Known limitations**(写进 cheat-persona/SKILL.md):评论 ≠ 全部受众(偏向会评论的活跃少数);评论可被水军污染;persona 滞后于真实受众变化;不替用户做"想要的受众 vs 实际受众"的战略决策。
|
||
|
||
### Fixed — cheat-seed draft 写成字幕格式(一句一行)
|
||
|
||
**问题**:用户反馈 cheat-seed 写的 draft 正文是"一句话一行"的字幕格式,而不是段落版。根因不是文档缺失——"不要字幕格式"的指令在 4 个文件里都有,但**全是散文指令**。生成 draft 那一刻,模型"video script = 提词器短行"的训练先验压过了埋在 Phase 4 散文里的一句话。
|
||
|
||
**修复**(两手):
|
||
- **A — 生成时压先验**:Phase 4 draft 模板块加 ❌字幕格式 / ✅段落版 的**具象并排对照**,就放在正文占位符旁边——generation 那一刻眼睛在示例上,先验被锚点压住
|
||
- **B — 落盘后确定性兜底**:新增 Phase 4.5a line-format 自检——算正文 `avg_chars_per_line`,`< 15 字 且 行数 ≥ 8` → 判定字幕格式 → 自动重排为 3-6 段段落版。不靠模型自觉,靠 `awk` 判定
|
||
- Phase 4.5 顺序固定:**先 4.5a 修版式,再 4.5b humanizer**(humanizer 处理散文,喂碎行会乱)
|
||
- batch 模式的 N 份 draft 同样走 Phase 4 格式 + Phase 4.5 自检
|
||
|
||
### Added — cheat-seed Phase 4.5:humanizer 自检 pass(去 AI 味)
|
||
|
||
**问题**:Claude 自己写的 cheat-seed 初稿天然带 AI 写作 tells——em-dash 滥用、rule of three、inflated 词汇、空泛归因、-ing 浅层分析。用户拿到的起点"机器味"重。
|
||
|
||
**改动**:draft 写完落盘后、展示给用户前,新增 Phase 4.5——用 [`humanizer`](https://github.com/blader/humanizer) skill(MIT,外部项目,18k stars)过一遍去掉 AI tells。
|
||
- 只 humanize **正文**,不动 header 的"必须改写"警告(那是有意的脚手架标记)
|
||
- **voice calibration**:有历史脚本 / `script_patterns.md` 时作为参考样本一起传——往"用户的声音"靠,不是"通用人声"
|
||
- 报告修了哪些 tell,Phase 5 输出展示
|
||
- `HUMANIZE_DRAFT = on` 默认;humanizer 未装时优雅跳过 + 提示如何启用
|
||
- **不污染校准**:cheat-seed draft 不是被预测/发布的东西——cheat-predict 打分的是用户最终稿,humanize 初稿只是给更干净的起点
|
||
- **不替用户改写**:humanizer 去 AI 味 ≠ 变成用户的声音,"必须改写"警告依然成立
|
||
|
||
humanizer **不打包**进 cheat-on-content——用户自己 `git clone` 到 `~/.claude/skills/humanizer/`。
|
||
|
||
### Fixed — douyin-session 运行时路径隐私漏洞(@level5Ninja [#16](https://github.com/XBuilderLAB/cheat-on-content/pull/16))
|
||
|
||
**问题**:douyin-session adapter 把 `.auth/`(**含抖音登录 cookie**)、debug 截图、report 写进 **skill 源码目录** 而不是用户内容项目——symlink 安装时,用户的会话凭据会落在 cheat-on-content repo 里,有被 commit 的风险。meta-logging hook 还把每条 user prompt 前 120 字存进 `usage.jsonl`,采集过度。
|
||
|
||
**修复**:
|
||
- 新增 `adapters/perf-data/douyin-session/paths.py` —— 运行时路径 helper(`runtime_project_root` / `auth_dir` / `debug_dir` / `videos_dir`),用 `CHEAT_PROJECT_ROOT` env var + cwd fallback
|
||
- `.auth/` → 用户内容项目根;debug 产物 → `.cheat-cache/douyin-session-debug/`;report/script → 用户项目 `videos/`(不再散落在 skill 源码树)
|
||
- `run.sh` export `CHEAT_PROJECT_ROOT`
|
||
- meta-logging hook 不再存 prompt 摘要——改成只记 `prompt_present`(bool)+ `prompt_chars`(长度)
|
||
- docs(adapter README + state-management.md)同步
|
||
|
||
### Fixed — cheat-shoot DIFF_METRIC 在口语化场景的 v2 误触发(**BREAKING for v2-trigger-logic**)
|
||
|
||
**问题**:cheat-shoot Phase 3b 用 line-level unified diff 算 `diff_pct = (added + removed) * 100 / orig_lines`。但**创作者真实场景**——draft 是 markdown 长句(一行 ~50 字),拍摄稿是 whisper 转录的口语化短断句(每行 ~5-10 字)——同样的内容会 inflate diff_pct 到 100-200%,触发本不该的 v2 重判。
|
||
|
||
**实测复现**(use clone PR pre-fix):
|
||
- draft markdown 63 行 / ~380 字
|
||
- 拍摄转录 100 行 / 同 ~380 字
|
||
- 内容几乎完全保留(审稿人原句一字不差 + 5 年前反应概念 + 升维段所有金句)
|
||
- 唯一新增:1 句 brand 锚定 "全面拥抱 AI"
|
||
- **line-level diff_pct = 198%** ⚠️ v2 错误触发
|
||
- 语义内容真实 diff ≈ 15-25%
|
||
|
||
**修复**:拆 metric。
|
||
- **DIFF_METRIC=char_levenshtein_normalized**(新默认)—— [tools/diff_pct.py](tools/diff_pct.py) 先 normalize(去 markdown header / 分隔线 / 列表标记 / 装饰标点 / 折叠所有空白),再算 char-level Levenshtein / max(len_a, len_b)
|
||
- backend 优先级:`rapidfuzz`(C-backed,~ms 级;需 `pip install rapidfuzz`) → `difflib.SequenceMatcher`(stdlib,永远可用,~10ms 级)
|
||
- **V2_TRIGGER_THRESHOLD = 0.30** 保持不动(阈值经验合理)
|
||
- legacy line-level 保留为终极 fallback(只在 python3 + tools/diff_pct.py 都不可达时降级)
|
||
|
||
**测试**:3 fixture × 2 backend = 6 case,全过:
|
||
|
||
| Case | 内容 | 期望范围 | difflib | rapidfuzz |
|
||
|---|---|---|---|---|
|
||
| 1 | markdown 长句 vs 转录短断句(内容同) | < 30 | 7 | 12 |
|
||
| 2 | 完全不同主题 | ≥ 60 | 88 | 97 |
|
||
| 3 | 加 20% outro/CTA | 10-30 | 14 | 25 |
|
||
|
||
跑 `bash tools/diff_pct_test.sh` 复现。
|
||
|
||
**已知局限**:
|
||
- 历史 v2 prediction 文件保留 line-level 数字作 audit trail——不重新走过去的 prediction
|
||
- normalize 是启发式(中文标点)——对其他语言 / 非典型 markdown 可能需调整 regex
|
||
|
||
### Fixed — `rubric_notes.md` 实绩泄漏漏洞(**BREAKING for blind channel integrity**)
|
||
|
||
**问题**:PR #11 引入的 cheat-score-blind sub-agent 承诺只读 `scripts/<id>.md` + `rubric_notes.md` 两个文件。但 cheat-bump Phase 5 把升级 Memo(含真实视频名 + 实绩 + 派生证据)写进了 `rubric_notes.md`——sub-agent 通过白名单读到了本不该看的实绩,盲打分变成"看过实绩的事后合理化"。实测复现:5 条已发视频里 2 条 sub-agent 自动标 `any_contamination_signal: true`(refusal=`non_blind_warning`,所有维度 confidence 降 medium)。
|
||
|
||
**修复**(拆 file):
|
||
- **新增 `rubric-memo.md`**——升级 Memo 累积档案。cheat-bump Phase 5 写**这里**,**不**写 rubric_notes.md。append 模式累积多次 bump
|
||
- **`rubric_notes.md` 严格收窄**——只放公式 + 通用语言维度定义 + bucket 边界 + 顶部 metadata 指向 rubric-memo.md。**绝不**含真实视频名 / 实绩 / 派生证据带命名锚
|
||
- **`cheat-score-blind` 硬禁读 `rubric-memo.md`**——refusal_code `blocked_rubric_memo`;同时加白名单文件**兜底自检**(grep 命中实绩 pattern → 标 `non_blind_warning`)
|
||
- **`cheat-bump` Phase 5 leak guard**——写完 rubric_notes.md 后 grep 自检,命中违禁 pattern → abort + 回滚
|
||
- **`shared-references/observation-lifecycle.md` 加约束**——任何 skill 写 rubric_notes.md 都不许含实绩 pattern(防止将来再犯)
|
||
|
||
**老用户必跑**:v0.x 任何已有 `rubric_notes.md` 含 bump Memo 的项目,git pull 后**必须**跑 `/cheat-migrate` 把 rubric_notes.md 拆分为两份文件。不跑 → blind sub-agent 仍泄漏。详见 [migrations/1.3-to-1.4.md](migrations/1.3-to-1.4.md)。
|
||
|
||
### Changed — schema 1.3 → 1.4(MINOR but BREAKING for blind channel)
|
||
|
||
- state 字段**无变化**——`schema_version` bump 仅标识"老用户须跑文件层拆分迁移"
|
||
- [migrations/1.3-to-1.4.md](migrations/1.3-to-1.4.md) 7 步标准流程(备份 → 扫描 → 抽离 → 写 rubric-memo.md → 清理 rubric_notes.md → 自检 → bump schema)
|
||
- cheat-init, SessionStart hook LATEST_SCHEMA, registry.md 三处同步
|
||
|
||
### Added — Blind scoring sub-agent(channel B 隔离)
|
||
|
||
**问题**:cheat-on-content 的 7/9 维打分原本在主对话 inline 完成——但主 Claude 已经看过用户对话、实绩数据、复盘段历史,打分被污染。`/cheat-bump` Phase 2 校准池重打分时尤其严重——rank 一致性可能 overfit 而非真信号。
|
||
|
||
**改动**:引入 [skills/cheat-score-blind](skills/cheat-score-blind/SKILL.md) 作为 **channel B** 隔离打分 sub-agent。三 channel 模型:
|
||
- **A** = 主对话:决策 / 写 retro / 跟用户交互
|
||
- **B** = blind sub-agent (新):只接收 `script_path` + `rubric_notes_path`,硬拒绝读 state file / predictions/ / videos/,输出严格 JSON 9 维分 + per-dim confidence
|
||
- **C** = 跨模型 audit(qwen-max via `mcp__llm-chat__chat`,已有):bump 终局 sanity check
|
||
|
||
具体落地:
|
||
- **`cheat-score` Step 3** 改为 Task tool delegate 到 cheat-score-blind(不再 inline 打分;cheat-score 无 `--skip-blind` 因为是轻量探索)
|
||
- **`cheat-predict` Phase 2** 默认 delegate;新 **Phase 2.5** 做 disagreement detection——blind 与主 Claude 自估 |delta| ≥ 2 弹用户裁定(选 a/b/c);header 新增 `BlindScored By` + `BlindScore Disagreement` 字段(**所有维度必记**,delta=0 也记,作为复盘分析素材)
|
||
- **`cheat-predict --skip-blind`** flag 是 escape hatch:触发 `state.last_prediction_self_scored=true` + `last_self_scored_at` 时间戳,cheat-status / SessionStart hook 持续 nag 至下次正常调用清回
|
||
- **`cheat-bump` Phase 2** **强制** sub-agent,**不接受任何 fallback**——Task tool 不可用 → abort bump,不接受"自审";每条 prediction 的 `Re-scored under vN` 行额外标 `blind: true`
|
||
- **SessionStart hook** 检测 `last_prediction_self_scored && days_since >= 7` 输出红色警告
|
||
- **install.sh / uninstall.sh** 加 `cheat-score-blind` 到 SKILLS 数组(14 个子 skill)
|
||
|
||
### Changed — schema 1.2 → 1.3(MINOR)
|
||
|
||
- 新增 `last_prediction_self_scored: bool`(默认 false)+ `last_self_scored_at: ISO 8601 / null`
|
||
- [migrations/1.2-to-1.3.md](migrations/1.2-to-1.3.md) 含 4 段标准格式(WHAT/WHY/HOW/Manual fallback)
|
||
- 老 state 跑 `/cheat-migrate` 升级;不跑也兼容(skills 用 `state.get(field, default)` 兜底)
|
||
|
||
### Known limitations(写进 cheat-score-blind/SKILL.md)
|
||
|
||
1. **sub-agent ≠ 真独立** —— 同 Claude 模型,RLHF priors 共享;新 context 不等于另一个判分体系
|
||
2. **不解决 rubric 设计 bias** —— 用户自己写的 rubric 自然让自己内容显得好。这层 bias 由 channel C 跨模型 audit 和定期 bump 验证解决
|
||
3. **不解决 review 阶段的覆盖** —— 主 Claude 拿到 blind 分后,可能在 Phase 2.5 被实绩诱导覆盖。disagreement detection + 用户裁定减轻但不消除
|
||
|
||
### Changed — README / cheat-init voice 重塑(递归宿命感)
|
||
|
||
- **README tagline 改递归宿命版**:"你正在读这段话——这个 skill 预测过了。... 你停下来思考'这是不是真的'——也在它的预测里。" 替代原"凭感觉发是猜,这套让你算"框架
|
||
- **新增 🌀 起源段**:创作者本人视频脚本精华(一阶宿命 → 二阶宿命的觉醒)作为 README 中段叙事 hook
|
||
- **closing tagline 加 callback**:"你看到这一行——也是它预测的"——首尾呼应把读者卡进预测循环
|
||
- **cheat-init Phase 1 首屏同步**:从 "做内容本质上就是作弊" 改成 "你的下一条内容已经在改写 3 个月后的你。规律是客观存在的,区别是你看见还是没看见。这套让你看见。"
|
||
- **GitHub repo description** 同步递归版
|
||
|
||
### Changed — 多语言 README 拆分
|
||
|
||
- `README.md` 现为**英文默认**——国际用户首屏
|
||
- `docs/README_CN.md` 为简体中文(原 README 内容 + 宿命感重塑)
|
||
- 两份顶部加 language switcher(QuantDinger 风格)
|
||
- logo 路径 + 内部链接按相对路径调整
|
||
|
||
### Added — Star History 图表
|
||
|
||
两份 README 末尾加 [star-history.com](https://star-history.com) 图表,社区可视化项目热度。
|
||
|
||
### Changed — 弱化 Claude Code 强调
|
||
|
||
README 安装段从"### Claude Code"+"### Codex"双标题,改为"默认 + supported agents 列表"——把 skill 包装成跨 agent 的工作流而不是 Claude Code 专属。日常用法段同步换成 "skill-compatible agent" 泛称。
|
||
|
||
### Added — Terminal-style logo SVG
|
||
|
||
- `docs/logo.svg`(1.9KB 原生 SVG,无图片资源依赖)
|
||
- 终端窗口 + traffic lights + `$ fatesnail` 命令行 + 5 阶段循环 + `// cheat on content` 注释
|
||
- README hero 居中嵌入
|
||
|
||
### Added — cheat-seed Mode 重构 + 双热点工具集成
|
||
|
||
**问题**:原 Mode B 给"a/b/c 三种例子"让用户讲经历——但同样的话术对**有方向但抽象的用户**("想做职场")和**完全没想法的用户**("帮我想")一视同仁,前者其实有真动机不需要 AI 列举,后者需要的是外部素材而不是 prompt。
|
||
|
||
**改动**:
|
||
|
||
- **Mode B 改成单问"为什么想做这个主题?"** —— 用户内省窗口,**不调任何热点工具**。3 类回答:含具体经历→转 Mode A;空动机→反问最多 2 轮;真没想法→转 Mode C
|
||
- **Mode C 整合外部素材**:按 `content_form` 路由热点工具——AI 类形态调 [aihot](adapters/trend-sources/aihot.md),文化/社会形态调 [trendradar-mcp](adapters/trend-sources/trendradar-mcp.md),混合两个都调;用户挑一条后**回到内省**问"你为啥对这条最有感觉",再转 Mode A 深挖
|
||
- **Mode A 灰色场景**(用户给了时事话题):Phase 2A.5 询问"要不要拉外部数据作参考"——**不主动调**,避免外部信息带偏用户视角
|
||
- **聊经历三选项移到 Mode C 兜底**:仅当用户拒绝外部素材或外部都不感兴趣时呈现
|
||
|
||
### Added — 两个一等公民 trend source
|
||
|
||
- **[aihot](adapters/trend-sources/aihot.md)**(Claude skill):[aihot.virxact.com](https://aihot.virxact.com) 的中文 AI 行业每日精选,5 类(模型/产品/行业/论文/技巧)。无 auth,curl 公开 API,rate limit 600/min
|
||
- **[trendradar-mcp](adapters/trend-sources/trendradar-mcp.md)**(MCP server):[TrendRadar](https://github.com/sansan0/TrendRadar)(57k stars,GPL-3.0 通过 MCP 调用不构成 linking)。25+ MCP 工具——除 `get_latest_news` 外还有 `analyze_topic_trend`(爆火/衰退判定)、`compare_periods`(周环比)、`analyze_sentiment`
|
||
|
||
### Added — `shared-references/data-source-routing.md`
|
||
|
||
热点工具的触发与路由协议——单一来源记录:"何时调"(5 个入口的触发矩阵)+ "调哪个"(content_form → adapter 路由表)+ "不调时怎么办"(失败降级链)+ Token 成本意识。
|
||
|
||
### 哲学保持不变
|
||
|
||
> 热点工具是"前置素材库",不是"主菜单"——AI 给材料,用户决定 angle。
|
||
|
||
cheat-seed 的核心论点"好内容来自用户的真实经历,AI 不凭空 brainstorm"完全保留。新设计只是让"完全没想法"这条 cold-cold-start 路径不再死锁。
|
||
|
||
### Added — v2 预测重判系统(拍后改稿场景)
|
||
|
||
- **append-only v2 prediction**:cheat-shoot 检测拍摄稿与 `scripts/<id>.md` 行级 diff ≥ 30%(`V2_TRIGGER_THRESHOLD`)→ 自动调用 `/cheat-predict — mode: v2 — prediction-file: <path>` → 在原 prediction 文件 `## 复盘` 之前 append `## 预测 v2 (replaces v1)` 段。**v1 段绝不修改**(hook 物理强制),v2 才进 cheat-retro 的偏差计算
|
||
- **immutability hook awk 升级**:单个 `## 预测` 改为可识别多个 `## 预测 vN` 段(v1 / v2 / 任意 vN 一起锁),同时兼容 v0.1.0 的 legacy 裸 `## 预测` 写法。端到端 5 场景验证通过(编辑 v1 / 编辑 v2 / 编辑 legacy 都 BLOCK;append 新段、改 ## 复盘 都 ALLOW)
|
||
- **cheat-predict 加 Phase 0.7 模式判定**:检测目标 prediction 文件已含 `## 预测...` 段 → 自动切 v2 模式(Edit 在 `## 复盘` 边界 append,不 Write 覆盖)
|
||
- **cheat-retro 升级**:识别多个 `## 预测 vN`,取最后一段作校准依据;预测段哈希校验扩展为"全部 v? 段合并哈希",任一被改即报错回滚
|
||
- **prediction header 新字段 `Prediction Basis`**:`pre_shoot`(v1 默认)/ `post_shoot_pre_publish`(v2)。score-curve 与 cheat-bump 据此区分两条数据线避免混样
|
||
- **shoots[] 项 schema 扩展**:新增 `scripts_path` / `script_consistency` / `script_diff_pct` / `v2_prediction_written` / `script_hash_at_shoot`(详见 [migrations/1.1-to-1.2.md](migrations/1.1-to-1.2.md))
|
||
|
||
### Changed — schema 1.1 → 1.2(MINOR)
|
||
|
||
- 升级 [migrations/registry.md](migrations/registry.md) `LATEST_SCHEMA` 标记 + 版本链表
|
||
- cheat-init 新建 state 写 `"schema_version": "1.2"`
|
||
- SessionStart hook `LATEST_SCHEMA="1.2"` —— 老用户 git pull + 跑会话 → hook 提示 schema mismatch → 用户跑 `/cheat-migrate` 5 秒升上来。MINOR 兼容,不强制(skills 用 `state.get(field, default)` 兜底)
|
||
|
||
### Why now
|
||
|
||
用户实际工作流:写完草稿 → **常常拍摄时即兴改文案** → 草稿和实际播出版本脱节。原"拍前预测,拍后只登记"的严格盲预测让"预测对的稿子"与"实际播出的稿子"不是同一份——校准失真。
|
||
|
||
v2 系统让"拍后改稿"成为一等公民:v1 留作档案,v2 基于实际拍摄稿重判,diff(v1, v2) 本身成为 rubric 升级的强证据(用户改稿改高了 ER → 工具学到这个用户的 ER 阈值跟当前公式不一致)。盲预测原则保留:v2 仍在发布前完成,没有播放数据可"作弊"。
|
||
|
||
### Added — Codex 安装兼容(@songth1ef [#6](https://github.com/XBuilderLAB/cheat-on-content/pull/6))
|
||
|
||
- **`install.sh --codex`**:安装根路由 skill `cheat-on-content` 和 13 个子 skill 到 `~/.codex/skills/`
|
||
- **`install.sh --all`**:同时安装 Claude Code 和 Codex skill
|
||
- **`uninstall.sh --codex` / `--all`**:对称卸载 Codex 或双端安装
|
||
- **Codex 路由说明**:Codex 用自然语言触发同一套流程,不依赖 Claude Code 的 `/cheat-*` slash-command harness
|
||
|
||
### Added — Migration 系统(让长期迭代不打断老用户)
|
||
|
||
- **`/cheat-migrate` skill**:把老用户 `.cheat-state.json` 从旧 `schema_version` 升级到当前 `LATEST_SCHEMA`。幂等、不跳版、失败停在断点
|
||
- **`migrations/` 目录**:版本演进单一来源
|
||
- `registry.md`:`LATEST_SCHEMA` 标记 + 完整版本链表
|
||
- `<from>-to-<to>.md`:每步迁移 4 段(WHAT changed / WHY / HOW Claude steps / Manual fallback)
|
||
- **`shared-references/migration-protocol.md`**:演进哲学 + maintainer checklist(bump schema 必做的 4 件事)
|
||
- **SessionStart hook 增强**:检测 `state.schema_version != LATEST_SCHEMA` → 输出非阻塞警告,建议跑 `/cheat-migrate`
|
||
- **`install.sh --reinstall-hooks <project>`**:git pull 后重写用户项目 `.cheat-hooks/` 的脚本(不动 state / rubric / predictions)
|
||
- **state-management.md 升级**:所有 schema 升级文档指向 cheat-migrate;明确 MINOR / MAJOR 边界
|
||
|
||
### Why now
|
||
|
||
v0.1.0 用户的 state 是 schema 1.1。后续如果改字段语义、删字段、重命名等 → 没有迁移系统的话老用户 git pull 后会卡住。这套系统让"长期迭代不打断老用户"成为常态。
|
||
|
||
### Fixed
|
||
|
||
- **cheat-init `content_form` 存成字母 bug**:Phase 3 state JSON 模板用 `<Q1>` 抽象占位,导致 Claude 字面把 `"a"` 写进 state 文件而不是 enum `"opinion-video"`。修复:Q1/Q3/Q4/Q5 各加明确字母→enum 映射表 + Phase 3 模板加粗 warning。同时补全 7 个缺失的 `last_*` init 字段(之前靠 `state.get(field, default)` 兜底)+ `enabled_perf_adapters` 派生 + 强制 `initialized_at` 用本地 `+08:00` 时区不用 UTC `Z`
|
||
|
||
### Changed — README 重写(v0.1.0 ship 后的定位调整)
|
||
|
||
- 标题:英文 `Cheat on Content`,副标 `网红外挂`(之前 `网红作弊器`)
|
||
- Tagline 直面"作弊"框架:「做内容本质上就是作弊——谁先看穿规律,谁就拿走流量」
|
||
- 新增"那 ChatGPT / 豆包 / DeepSeek 不是也能干这个?"段——核心定位为"你自己的运营专家 + 自动进化"
|
||
- 删早期产品警示段(badge + 本 CHANGELOG 已经在传达,重复就是不自信)
|
||
- 砍 ARIS attribution(保留多 adapter 设计思路,去掉外部归功)
|
||
- README 总长 330 行 → 90 行
|
||
- cheat-init Phase 1 首屏文案同步重写:删方法论哲学,2 条 caveats(早期不准 + 强烈建议导对标)
|
||
|
||
### 余项
|
||
|
||
- Step B:软化更多硬编码规则
|
||
- 完整 reference-implementation 脱敏快照
|
||
|
||
---
|
||
|
||
## [0.1.0] — 2026-05-05
|
||
|
||
> ⚠️ **早期产品(v0.x)—— state schema 仍可能 breaking**
|
||
>
|
||
> 在 v1.0 之前,每次升级可能改变 `.cheat-state.json` 的字段结构。**升级前建议 backup 你的整个 `<your-channel>/` 目录**。重大 breaking 改动会在本 CHANGELOG 标 `BREAKING`,并在可能的情况下给手动迁移步骤。
|
||
|
||
### Added
|
||
|
||
- **方法论 + 12 个子 skill**:完整闭环 init → learn-from → seed → score → predict → shoot → publish → retro → bump,加 status / recommend / trends 辅助
|
||
- **3 条不可妥协原则**:盲预测 + 升级=全量重打 + rubric 是工作台不是博物馆(详见 `shared-references/`)
|
||
- **`/cheat-learn-from` 对标账号导入**:5-10 条对标样本派生 base rubric 信号 + script patterns。两种 input 方式(粘文本 默认 / whisper 转录)+ 两种 data 方式(手填 / adapter 自动抓)
|
||
- **Buffer 警戒系统**(cadence-protocol):按发布频率派生颜色阈值,断更预警
|
||
- **统一预测格式 + confidence 等级**:所有阶段同一 7 组件预测,header 显示 🔴/🟠/🟡/🟢/🔵 信心等级
|
||
- **prediction-immutability hook**:harness 层强制原则 #1(端到端验证 5/5 通过)
|
||
- **SessionStart auto-report hook**:每次开会话自动渲染状态报告
|
||
- **跨模型 bump 审核**(mcp__llm-chat__chat):rubric 升级时调外部 LLM 独立判定
|
||
- **douyin-session adapter**(Playwright):自动抓抖音视频 + 评论数据
|
||
- **whisper adapter**:转录视频文件为 transcript
|
||
- **9 份 templates** + **2 份 starter rubrics**(opinion-video v2 校准 / opinion-video-zero v0 等权)
|
||
- **score-curve.py**:预测精度收敛曲线诊断工具
|
||
|
||
### 软规则(Claude 判断为主,非死磕门槛)
|
||
|
||
下面规则**有默认参考值**但 Claude 可基于强信号软违反:
|
||
|
||
- bump 触发样本数(默认 ≥5,可基于强反例破例)
|
||
- 同向偏差触发(默认连续 ≥3 次,可基于 1 次极端偏差破例)
|
||
- benchmark 影响淡出(默认 calibration_samples ≥10,可基于"用户数据 vs benchmark 差异度"破例)
|
||
- observation 升格门槛(默认 ≥2 样本,可基于强信号破例)
|
||
|
||
软违反时 Claude 必须显式标注 `judgment-driven` 让用户审视。
|
||
|
||
### 硬约束(不可软违反)
|
||
|
||
- bump 验证 `THRESHOLD = 4/5`(统计刚性)
|
||
- prediction immutability hook(binary)
|
||
- `RETRO_WINDOW_DAYS = 3` 默认(用户可配置 1/7)
|
||
- 必须有 ≥3 条 benchmark 样本才能拆 pattern
|
||
- 必须 ≥20 top 评论才能完成 manual paste 复盘
|
||
|
||
### 已知 limitations
|
||
|
||
- **v0.x 无自动 migration**:升级时若 state schema 变了,老用户需手动 wipe + 重 init
|
||
- **adapter fragility**:抖音 / 小红书 adapter 依赖反爬绕过,平台改版时可能 break,需要持续维护
|
||
- **whisper 中文准确度**:medium 模型够用,long-form 准确度一般,关键稿子建议 manual review
|
||
|
||
---
|
||
|
||
## 升级指南(pre-v1.0)
|
||
|
||
每次 git pull 之后:
|
||
|
||
1. **Symlink 模式装(推荐)**:直接生效,无需重装
|
||
2. **Copy 模式装**:重跑 `bash install.sh --copy`
|
||
3. **如果 CHANGELOG 标了 `BREAKING`**:照 manual migration steps 操作。无 steps 时建议 wipe + 重 init
|