内容校准预测循环——打分+盲预测合一 → 发布 → 记录 → T+3d 复盘 → 进化 rubric。本技能负责打分+预测(blind sub-agent + score-only.sh + commit-prediction.sh + 阈值门)与校准闭环;发布记录与数据采集由 published-track 统一管理。
53
61%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./crews/main/skills/content-calibrator/SKILL.md三条不可妥协原则:
- 盲预测:预测必须在看到实际数据之前写完,写完即 immutable
- 升级需盲重打验证:新公式必须盲重打 10 篇 +
validate-rubric.sh降幅达标才落地,Agent 不得自动升级- rubric 是工作台不是博物馆:被推翻/吸收的观察删掉,git history 是档案
一个作品 = 一个打分 + 一个预测 + 一个复盘。 作品的内在内容质量与发布平台无关,故打分/预测/复盘按作品归集,rubric 全平台统一,放行阈值也全局统一(质量门是作品本身的事,不分平台)。平台差异(baseline 量级、受众、对标账号)仅作为预测的输入数据按平台保留。
| 组件 | 归集方式 | 位置 |
|---|---|---|
| rubric 公式 | 统一 | calibration/rubric_notes.md |
| rubric 观察 memo | 统一 | calibration/rubric-memo.md |
| rubric 循环状态(mode/samples/rubric_version/threshold) | 统一 | calibration/.cheat-state.json |
| 打分(7 维 + composite) | per-work | <work>/calibration/score.json |
| 预测 | per-work | <work>/calibration/prediction.md |
| 复盘(含多平台分析) | per-work | <work>/calibration/retro.md |
| baseline / audience / benchmark | per-platform | calibration/<platform>/.platform-state.json + audience.md + benchmark.md |
| 发布记录 + 互动指标 | per-platform | published-track DB(pub_<platform> 表) |
<work>即作品目录:文章为output_articles/<article-english-title>/,视频为output_videos/<topic-en-slug>/。
📊 打分+盲预测 → 🚀 发布 → 📝 记录(1B) → 📈 T+3d 复盘 → 🧬 进化 rubric
│
├─ 3a: 单篇复盘批量(retro.md + rubric-memo.md)
└─ 3b: 综合评估(detect-bump-signals.sh + 混杂因素 + 建议)打分与盲预测同一次出分内完成(合并理由:已读稿件、已出分值,顺手出预测; 复盘拆两步:先批量写完所有单篇 retro.md + 观察进 rubric-memo.md(3a),再做跨作品综合评估(3b)——综合评估需本批全部观察落盘后才有效。
blind sub-agent 的隔离价值在于"主对话已看过用户对话/实绩/复盘历史,inline 打分会污染"。这一前提只在交互式会话成立。 发布常走定时任务 + isolatedSession,此时主 agent 本就是全新对话、无上下文,再套一层隔离 subagent 买不到隔离收益,反而 subagent 经 sessions_yield 回包会让 isolated 主 agent 误判本轮结束、截断后续发布动作(见 gotcha:心跳 isolated session 交互死锁)。
| 会话场景 | 打分方式 | 理由 |
|---|---|---|
| 交互式会话(主 agent 有对话/复盘上下文) | sessions_spawn blind sub-agent | 主对话被污染,需 spawn 硬隔离 |
| 定时 / isolatedSession(发布 cron、heartbeat 触发) | 主 agent inline 打分,不派 subagent | 全新对话无上下文,盲条件由"发布前=无实际数据"天然满足;避免 sessions_yield 截断发布流 |
inline 打分时必须遵守的隔离纪律(用文字约束替代 spawn 硬隔离,弱一档但可接受):打分前只读稿件 + calibration/rubric_notes.md;不要读 rubric-memo.md、.cheat-state.json、其他 work 的 calibration/、audience.md、benchmark.md。读完即出分 + 预测,不翻历史。
发布流程为 打分+预测(1A) → 发布 → 记录(1B)。打分+预测(1A)由本技能负责,发布记录(1B)由 published-track 负责。
发布前对稿件做盲打分 + 盲预测 + 阈值门,避免自创自评。派发方式按上方"派发策略"表,依会话场景选 inline 或 blind sub-agent。
sessions_spawn 一个 blind sub-agent,只喂 script_path(稿件/视频定稿)+ calibration/rubric_notes.md。sub-agent 硬禁读 .cheat-state.json/各 work 的 calibration//rubric-memo.md/audience.md/benchmark.md/对话历史。calibration/rubric_notes.md,不读上述禁读文件,不翻对话历史。score-only.sh 校验 + 算 composite + 判阈值门:
./skills/content-calibrator/scripts/score-only.sh \
--content-path "output_articles/xxx/article.md" \
--cal-er 3 --cal-hp 4 --cal-sr 3 --cal-ql 4 --cal-na 3 --cal-ab 4 --cal-pv 2passed 与 failing_dims。阈值取自根级 calibration/.cheat-state.json 的 score_threshold(全局,默认 0=不拦截),每维需 > 阈值才算通过。--platform 可选,仅用于校验该平台是否启用 calibration。commit-prediction.sh 把 score + 预测落盘到 <work>/calibration/:
./skills/content-calibrator/scripts/commit-prediction.sh \
--work-dir "output_articles/xxx" --platform wx_mp \
--cal-er 3 --cal-hp 4 --cal-sr 3 --cal-ql 4 --cal-na 3 --cal-ab 4 --cal-pv 2 \
--prediction-file /tmp/prediction-draft.mdscore.json + prediction.md。同 work 重复打分直接覆盖(用户有意见/未过阈值 → 改稿重打,新结果覆盖旧的)。passed=false → 主 agent 据 failing_dims 改稿 → 按派发策略重新出分+预测 → 再判门。最多 2 轮,仍不达标 → 暂停发布、上报用户裁定。passed=true → 放行,进入发布技能。calibration/<platform>/.platform-state.json 不存在或 enabled=false)→ 跳过 1A,直接发布。视频内容:打分+预测对象是脚本定稿(storyboard/口播稿),不是成片。视频技能流程 = 打分+预测(定稿) → 制作 → 发布 → 记录。成片后不再打分。
多平台发布:作品一次打分+预测,预测文件内含每个目标平台的 bucket/中枢(各平台 baseline 不同)。打分维度分只有一组。发布到 N 个平台 →
record.sh调 N 次,每次同一--source-folder(指向<work>),record.sh 自动从同一份 score.json 读分。
打分通过并发布成功后,由 published-track/scripts/record.sh 落库。record.sh 直接从 <work>/calibration/score.json 读分(不再传 --cal-* 入参):默认要求 score.json + prediction.md 齐全否则报错(拦截漏跑 1A);--no-cal 显式跳过(补发/不打分)。详见 published-track/SKILL.md。
content-calibrator/scripts/cal-toggle.sh:
--platform <p> --enable/--disable/--status(per-platform)--threshold(查看)/ --set-threshold N(设置,每维 0-5,需 >N 才放行;0=不拦截)/ --list(总览)content-calibrator 不直接抓取平台数据, 详见 published-track。
| 用户说 | 操作 | 前置条件 |
|---|---|---|
| "初始化校准 [--platform xxx]" | Init | 首次使用 |
| "打分这篇 [path] --platform xxx" / "打分+预测" | Score+Predict | rubric_notes.md 存在 |
| "复盘 [work] --platform xxx" / "T+3d 数据来了" | Retro (Step 3a 单篇 + 3b 综合评估) | 有预测 + 已发布 + 过时间窗口 |
| "升级公式" / "bump rubric" | Rubric 升级(用户发起) | 综合评估已完成 + 用户确认 |
| "导入对标 --platform xxx" / "learn from" | LearnFrom | 有 viral-chaser 报告或用户提供对标数据 |
| "校准状态 [--platform xxx]" / "calibration status" | Status | 任意时刻 |
| "加维度 XX" | 维度变更 | 必须用户确认 |
| "改权重 XX" | 权重变更 | 必须用户确认 |
Predict 不再是独立路由项——它已合并进"打分"。如需单独重跑预测,用"打分这篇"即可(会覆盖
prediction.md)。
是否启用某个平台的 calibration,必须由用户决定。 Agent 不得自动启用。
./skills/content-calibrator/scripts/cal-toggle.sh --platform <platform> --enable./skills/content-calibrator/scripts/cal-toggle.sh --platform <platform> --disable./skills/content-calibrator/scripts/cal-toggle.sh --listAgent 在复盘或发布时,发现对应平台未启用 calibration,不得自动启用,应告知用户"该平台未启用 content-calibrator,如需启用请确认"。
--platform 为必填参数(Init 除外)。支持的平台 ID:
| 平台 ID | 平台 | 内容形态 |
|---|---|---|
wx_mp | 微信公众号 | 长文 |
wx_channel | 微信视频号 | 短视频 |
xhs | 小红书 | 图文/视频笔记 |
zhihu | 知乎 | 文章/回答 |
bilibili | B站 | 视频 |
douyin | 抖音 | 短视频 |
kuaishou | 快手 | 短视频 |
toutiao | 今日头条 | 文章 |
youtube | YouTube | 视频 |
<workspace>/
├── calibration/ # 校准系统根目录
│ ├── rubric_notes.md # 统一评分公式(blind sub-agent 可读)
│ ├── rubric-memo.md # 统一观察记录(blind 不可读)
│ ├── .cheat-state.json # 统一 rubric 循环状态(mode/samples/bump/score_threshold)
│ ├── wx_mp/ # 平台专属*数据*(无 rubric、无 predictions、无 threshold)
│ │ ├── .platform-state.json # baseline / enabled / content_form
│ │ ├── audience.md # 受众画像
│ │ └── benchmark.md # 对标账号
│ └── xhs/ ...
├── output_articles/<work>/
│ └── calibration/
│ ├── score.json # 7 维 + composite + rubric_version + 时间戳(重打覆盖)
│ ├── prediction.md # 盲预测(发布前重打覆盖;发布后 immutable)
│ └── retro.md # T+3d 写一次,多平台分析内含(immutable)
└── output_videos/<work>/
└── calibration/ # 同上为指定平台创建 calibration/<platform>/ 目录和平台数据文件。首次初始化时同时创建根级统一 rubric(若不存在)。
两种触发方式:
--platform 参数获取平台 IDcalibration/rubric_notes.md 不存在 → 创建根级统一 rubric(v0)+ .cheat-state.json(cold-start)+ rubric-memo.mdcalibration/<platform>/ + .platform-state.json + audience.md + benchmark.md./skills/content-calibrator/scripts/init.sh --platform <platform_id>幂等——已存在则跳过。
给单篇稿子打 rubric 分 + 出盲预测,在发布前作为自检门(流程见上方"流程 1A")。脚本不做 LLM 打分/预测;打分+预测由主 agent 出(inline 或 blind sub-agent,按上方"派发策略"表选),脚本只做算术、门禁、落盘。
隔离规则(无论 inline 还是 subagent,白名单/禁读清单相同;区别只是 inline 靠文字自律、subagent 靠 spawn 硬隔离):
script.md/article.md/post.md)+ calibration/rubric_notes.mdcalibration/rubric_notes.md。calibration/<platform>/ 下没有独立 rubric,只有 audience.md/benchmark.md/.platform-state.json(平台目录里的 rubric_notes.md 是指向根级的软链,读它等于读根级)。派发 subagent 时应把根级 rubric 路径或内容显式喂给 subagent,不要让 subagent 自己去平台目录找。rubric-memo.md、.cheat-state.json、各 <work>/calibration/、audience.md、benchmark.md、对话历史prediction.md 的预测段 immutable(发布后不得覆盖;发布前重打可覆盖)前 5 个作品不要求完整 bucket 数字,只给 7 维分 + 一句话 bet。第 5 个作品复盘后解锁完整预测。计数在 calibration/.cheat-state.json 的 calibration_samples(全局)。
7 个维度,每维 0-5 整数分:
| 维度 | 代号 | 含义 | 权重 |
|---|---|---|---|
| 情感共鸣 | ER | 读者能否产生"说的就是我"的代入感 | ×1.5 |
| 钩子强度 | HP | 标题/开头是否锁定注意力 | ×1.5 |
| 社会议题共振 | SR | 是否触及社会讨论 | ×1.5 |
| 金句密度 | QL | 是否有独立可传播的表达 | ×1.0 |
| 叙事性 | NA | 是否有清晰的故事弧线 | ×1.0 |
| 受众广度 | AB | 话题的普适程度 | ×1.0 |
| 实用价值 | PV | 读者能否获得可操作的信息 | ×1.0 |
composite = (ER×1.5 + HP×1.5 + SR×1.5 + QL + NA + AB + PV) / 8.5 × 2.0
复盘分两步:先批量做完所有单篇复盘,再一次性检测 bump 信号。不在单篇复盘中途插 bump 检测——bump 是跨作品统计判断,需要本批全部观察落盘后才有效。
心跳巡检时:
query-retro-pending.sh 一键拿待复盘作品列表 + 互动数据用户主动提供对标账号/爆款内容数据,触发 LearnFrom。这是校准 rubric 本身的入口——通过分析对标内容,提炼高流量内容的 pattern,调整 rubric 维度和权重。
复盘的本质:复盘是"拿实际数据验证预测,提炼观察,可能触发 rubric 升级"。导入对标是"从外部信号校准 rubric 的初始假设"。两者互补:复盘是内源校准,对标是外源校准。
对 query-retro-pending.sh 返回的每个待复盘作品,依次执行:
prediction_path 拿盲预测(路径已在 JSON 里,无需自己拼)platforms 里各平台的实际 metrics(数据已在 JSON 里,无需再查 DB)<source_folder>/calibration/retro.md(T+3d 写一次,immutable,含多平台实绩对比 + 假设验证/推翻)calibration/rubric-memo.md(根级,非平台目录)calibration/.cheat-state.json 的 calibration_samples所有待复盘作品全部写完 retro.md + rubric-memo.md 后,才进入 Step 3b。 不在单篇之间插 bump 检测。
全部单篇复盘完成后,调脚本一次性检测偏差信号并做综合评估:
./skills/content-calibrator/scripts/detect-bump-signals.sh纯 DB 操作,数据全部来自 published_track.db(cal_score_* 盲打分 + 互动指标实测),不扫文件系统。
脚本逻辑:
cal_enabled=1 AND cal_bump_evaluated=0 的记录cal_score_* + 互动指标 → log 桶归一化到 0-5 actual_score(0→0, 1-10→1, 11-50→2, 51-200→3, 201-1000→4, 1000+→5)cal_bias_signals 列,cal_bump_evaluated 置 1cal_bias_signals IS NOT NULL 的记录,按维度 + 方向统计 count,≥3 → bump 信号触发recommend_bump=true 时清空 cal_bias_signals(信号已达阈值被消费);未触发时保留,跨轮累积直到达标每条记录只处理一次(cal_bump_evaluated 标记)。未达阈值的信号保留在 DB 里,下一轮新记录的信号会叠加到聚合计数上,直到某维度+方向累计 ≥3 触发 bump。触发后清空,下轮从零开始。
返回 JSON:
{
"newly_processed": 20,
"data_points": 112,
"signals": [
{"dimension": "pv", "direction": "overestimate", "count": 17, "threshold": 3, "triggered": true,
"platforms": {"xhs": 13, "wx_mp": 1, "douyin": 1, "youtube": 1, "wx_channel": 1},
"examples": [...]}
],
"triggered_signals": [...],
"recommend_bump": true
}platforms 字段给出该信号的各平台分布,供 Agent 一眼判断混杂因素。
Agent 拿到后:
recommend_bump=false → 本轮无系统性偏差,复盘结束recommend_bump=true → 混杂因素评估(Agent 判断,脚本不代劳):检查 triggered_signals 的 platforms 分布 + examples 的 work 分布:
calibration/rubric-memo.md → 在 Heartbeat 汇总中告知用户评估结论 + 建议(是否升级 rubric / 是否调整发布阈值)。Agent 不得自动升级 rubric 或改阈值。用户不确认 → 流程到此结束,新作品继续积累新信号,同样模式再现会再触发评估。
复盘时只从 published-track DB 读取数据,不另行抓取。query-retro-pending.sh 已把待复盘作品的互动数据带出,Agent 无需再查 DB 或 ls 目录。
rubric_notes.md 只能由用户发起修改,Agent 只能建议。前置:用户在看到 Step 3b 综合评估结论后明确同意升级。
rubric-memo.md 积累的历史观察 + 评估结论,写出新打分公式(新 rubric_notes.md 草稿)./skills/content-calibrator/scripts/validate-rubric.sh --new-scores /tmp/new-scores.jsondetect-bump-signals 的归一化 + 偏差检测逻辑,对这 10 篇的新分数 vs 实际数据算偏差信号。降幅 = (旧信号数 - 新信号数) / 旧信号数 ≥ 30%(默认阈值) → pass=true;否则 → pass=false。--reduction-threshold 可调阈值。旧信号数=0 时直接 fail(旧公式本无偏差,无升级必要)。calibration/rubric_notes.mdcal_score_* + cal_rubric_version)cal_bump_evaluated 重置为 0(新公式下应重新参与未来 bump 检测)calibration/rubric-memo.md → rubric-memo-v<旧版本>-<日期>.md,按模板重置 rubric-memo.md.cheat-state.json 的 rubric_version + last_bump_at不做全量重打——老作品保留旧分数(历史数据),新作品按新公式打分。验证只用最新 10 篇,够代表性且成本低。
维度和权重可以被修改,但必须满足以下条件之一:
变更流程:
rubric-memo.md从对标账号/爆款内容中提取 pattern,作为 rubric 初始校准信号。对标数据按平台存 calibration/<platform>/benchmark.md,提炼的 rubric 信号进统一 rubric-memo.md。
calibration/<platform>/benchmark.md + 更新统一 rubric-memo.md显示校准循环状态:
📊 Content Calibrator 状态
【全局 rubric】
Rubric: v0(统一)
模式: cold-start
校准池: 0 个作品
待复盘: 0 个作品
【全局阈值】每维需 >0 才放行(cal-toggle.sh --set-threshold N 修改)
【平台】
wx_mp ✅ 已启用 baseline: 未定
xhs ✅ 已启用 baseline: 未定
【最近复盘】
(暂无)Agent 按 rubric 打完 7 维分后,用 score-only.sh 校验分数合法性、计算 composite 并输出结构化 JSON,不写入 DB。此脚本不做 LLM 打分,仅校验并格式化。
./skills/content-calibrator/scripts/score-only.sh \
--platform wx_mp \
--content-path "output_articles/xxx/article.md" \
--cal-er 3 --cal-hp 4 --cal-sr 4 --cal-ql 3 --cal-na 2 --cal-ab 4 --cal-pv 3blind subagent 出分 + 预测草稿后,主 agent 调 commit-prediction.sh 落盘。同 work 重复调用直接覆盖 score.json + prediction.md。
./skills/content-calibrator/scripts/commit-prediction.sh \
--work-dir "output_articles/xxx" --platform wx_mp \
--cal-er 3 --cal-hp 4 --cal-sr 4 --cal-ql 3 --cal-na 2 --cal-ab 4 --cal-pv 3 \
--prediction-file /tmp/prediction-draft.md./skills/content-calibrator/scripts/cal-toggle.sh --list
./skills/content-calibrator/scripts/cal-toggle.sh --platform wx_mp --enable
./skills/content-calibrator/scripts/cal-toggle.sh --platform wx_mp --disable./skills/content-calibrator/scripts/init.sh --platform <platform_id>幂等——已存在则跳过。首次调用同时创建根级统一 rubric。
./skills/content-calibrator/scripts/query-metrics.sh --platform <platform> --source-folder <folder>./skills/content-calibrator/scripts/build-calibration-pool.sh从 published-track DB + 各 work 的 calibration/score.json 构建全局校准池(per-work 归集)。
./skills/content-calibrator/scripts/detect-bump-signals.sh # 默认阈值 3
./skills/content-calibrator/scripts/detect-bump-signals.sh --threshold 5 # 改阈值纯 DB 操作:查 cal_enabled=1 AND cal_bump_evaluated=0 的记录 → 从 cal_score_* + 互动指标算偏差信号 → 写回 cal_bias_signals + cal_bump_evaluated=1 → 聚合全量信号按维度统计同向偏差 → 触发 bump 时自动清空 cal_bias_signals(未触发时保留,跨轮累积)。≥3 次同向 → bump 信号。返回结构化 JSON(含每信号的 platform 分布)。
./skills/content-calibrator/scripts/validate-rubric.sh --new-scores /tmp/new-scores.json--new-scores 指向 blind sub-agent 用新公式重打分的 JSON 文件(格式见脚本头注释)。脚本复用 detect-bump-signals 的 log 桶归一化 + 偏差检测逻辑,对同一批作品对比新旧公式的偏差信号数。降幅 = (旧 - 新) / 旧 ≥ 30%(默认) → pass=true;--reduction-threshold 可调。返回 JSON:{pass, sample_size, old_signals, new_signals, reduction, reduction_ratio, reduction_threshold, reason}。exit code:0=pass,1=fail。
./skills/content-calibrator/scripts/import-viral-chaser.sh --platform <platform> <report-path>fdc03d6
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.