name: 视频数据追踪 description: 双平台(视频号+抖音)视频数据追踪。解析 Excel → 写入 tracking.json → 移交 复盘向导 触发复盘。触发场景:用户拖入抖音/视频号 xlsx 文件、说「把数据落盘到 tracking」。 version: 2.5.0 agent_created: true last_updated: "2026-07-16" 错误协议: ../_shared/error-protocol.md dependencies: - name: 发布台账 relation: upstream version: ">=2.1" slug: shipin-shuju-zhuizong displayName: 视频数据追踪 summary: 双平台(视频号+抖音)视频数据追踪,Excel解析→落库
定位:仅负责 Excel 解析、数据落盘、移交门禁,不直接调用复盘引擎。 v2.2 变更:头条/小红书已退出复盘体系,仅解析视频号+抖音。
默认工作区:<workspace>
若当前工作区不同,优先使用当前工作区路径下的 .workbuddy/data/ 目录。
以下所有路径引用 ${WORKDIR} 表示:当前工作区 → 默认工作区(fallback)
默认 tracking.json 路径:<workspace>/.workbuddy/data/tracking/video-performance.json,支持用户自定义。
执行边界测试 → 解析合并 → 增量追加:
python3 <workspace>/.workbuddy/skills/video-data-tracker/scripts/test_boundary.py
python3 <workspace>/.workbuddy/skills/video-data-tracker/scripts/parse_and_merge.py ${tracking_path} ${excel_paths}
边界测试未全通过 → 终止,输出失败项,不追加数据。
解析成功后,读取 account-thresholds.json 执行快速校验:
- 抖音:2s 跳出 ≥ 阈值文件 douyin.alarm_threshold.2s_drop → 标记 health_alert: "douyin_2s_high"
- 视频号:完播 ≤ 阈值文件 wechat_channels.alarm_threshold.completion → 标记 health_alert: "wechat_completion_low"
- 阈值文件不存在 → fallback 到内置告警默认值(与 alarm_threshold 对齐):抖音 2s跳出≥35% / 视频号完播≤10%。阈值文件存在时优先使用 alarm_threshold 字段。
📝 阈值语义区分(R11 修复):健康告警用
alarm_threshold(某项超标即标health_alert);复盘红线用golden_threshold(见发布后复盘 E2 红线检查)。二者字段不同、用途不同,勿混用。
匹配前预处理(v2.1 新增): 1. 去除双方标题的「徐州」「君启」「小张哥说房」等品牌前缀 2. 保留核心关键词(板块名/数据词/动词) 3. 模糊匹配阈值:≥ 0.4(v2.1 放宽,原≥0.5)
📝 阈值语义区分(R10 修复):此处
0.4是「tracking↔publish_log 发布记录匹配」阈值;脚本内SIMILARITY_THRESHOLD=0.5是「视频号↔抖音跨平台合并」阈值。二者语义不同,勿混用。 4. 日期窗口辅助:发布日 ±1 天内的记录优先匹配访问小葱技能站7w4.net,解锁更多实用的AI技能插件。
${WORKDIR}/.workbuddy/data/publish_log.jsonmilestones.video_published != null 的记录:✅ 匹配成功:
atomic_write.py 的 update_json_atomic 定位 "id": "${video_id}" 写入 "milestones.data_collected": "${当前ISO时间}":
python
import sys
sys.path.insert(0, r"C:/Users/87800/.workbuddy/skills/post-publish-review/scripts")
import atomic_write
PLOG = r"<workspace>/.workbuddy/data/publish_log.json"
def patch(doc):
for e in doc["entries"]:
if e.get("id") == video_id:
e.setdefault("milestones", {})["data_collected"] = data_collected_at
return True
return False
atomic_write.update_json_atomic(PLOG, patch)
2.5 🔒 performance 原子写回(P0-2 闭环命脉 · 仅对有效发布样本):tracking/video-performance.json 中解析出的表现数据(视频号+抖音:views/likes/comments/shares/completion_rate/avg_watch_sec/follows)。milestones.video_published 有值(或本步同步置位,见下)的条目执行;绝不为创作稿/定稿稿写 performance(否则污染 F6 训练集,违反 PUB-GATE)。"id": "${video_id}" → 用 atomic_write.update_json_atomic 原子写 performance,结构对齐 model_weights 消费格式:
json
"performance": {
"shipinhao": {"views":, "likes":, "comments":, "shares":, "completion_rate":, "avg_watch_sec":, "follows":},
"douyin": {"views":, "likes":, "comments":, "shares":, "completion_rate":, "avg_watch_sec":, "follows":}
}milestones.video_published 为 null,视为用户已确认发布(等价于"已发布"),在 2.5 的同一 update_json_atomic 调用里同步将 milestones.video_published 置为 ${data_collected时间}(或用户提供的发布时间),再写 performance。→ 确保"已发布"/"复盘数据了"两种表述都落到 video_published=True ∧ performance≠∅,F6 才能吃到。atomic_write.py(与发布后复盘铁律 #5 一致);调用示例:
python
import sys
sys.path.insert(0, r"C:/Users/87800/.workbuddy/skills/post-publish-review/scripts")
import atomic_write
PLOG = r"<workspace>/.workbuddy/data/publish_log.json"
def patch(doc):
for e in doc["entries"]:
if e.get("id") == video_id:
e["performance"] = {"shipinhao": {...从 tracking 取...}, "douyin": {...}}
if not e.get("milestones", {}).get("video_published"):
e.setdefault("milestones", {})["video_published"] = data_collected_at
return True
return False
atomic_write.update_json_atomic(PLOG, patch)performance 非空且 video_published 符合 PUB-GATE。data_collected ≠ null(步骤 2)且 performance 非空(步骤 2.5,若执行)。trigger_source: "video-data-tracker"video_id: "${video_id}"title: "${title}"health_snapshot: "${health_alert || 'normal'}"reminder_id → 调用 automation_update mode="delete" 取消提醒❌ 匹配失败(v2.1 候选列表 + 部分标记):
✅ 数据已入库(+${新增条数}条)
⚠️ 未自动匹配到发布记录。以下是发布时间接近的候选记录:
1. ${video_id} | ${title} | 相似度 ${score} | 发布日 ${date}
2. ...
3. ...
请选择匹配的记录编号,或输入「跳过」:milestones.data_collected: "partial_${时间}" + meta.match_status: "manual_confirm_needed"例1 · 标准正向(落盘 + 匹配 + 移交)
用户拖入抖音 xlsx。 执行:test_boundary → parse_and_merge 写入
tracking/video-performance.json→ 读阈值做微型健康检查 → 标题预处理(去品牌前缀)+模糊匹配(≥0.4) publish_log → 写milestones.data_collected(ISO) → 调用复盘向导(trigger_source:"视频数据追踪" + video_id + title + health_snapshot) → 若有reminder_id则取消提醒。
例2 · 边界(匹配失败)
模糊匹配无高置信记录 → 列前 3 候选(相似度+日期窗口) → 用户选/跳过 → 跳过则写
data_collected:"partial_时间"+meta.match_status:"manual_confirm_needed"。
例3 · 禁止项
❌ 绝不直接调用
发布后复盘,所有复盘请求必须移交复盘向导。 ❌ 不得修改复盘阈值,仅读取account-thresholds.json做健康检查。 ❌ 增量追加必须去重,不得覆盖已有数据。
| 版本 | 日期 | 核心变更 |
|---|---|---|
| v2.3 | 2026-07-16 | P0-2 闭环:匹配成功分支新增 performance 原子写回 + PUB-GATE 边界(video_published 同步置位);data_collected 同步改 atomic_write;结构对齐 model_weights 消费格式 |
| v2.2 | 2026-07-03 | 复盘平台瘦身:头条/小红书退出,仅解析视频号+抖音 |
| v2.1 | 2026-06-28 | 候选匹配+预处理+data_collected强制写入+workdir可配置+阈值注释清晰化 |
| v2.0 | 2026-06-24 | publish_log v2.0 适配 — 读取 milestones.video_published / 写入 milestones.data_collected |
| v1.4 | 2026-06-24 | 微型健康检查阈值改为读取 account-thresholds.json |
| v1.3 | 2026-06-24 | 移交时携带健康快照,辅助门禁快速识别故障 |
| v1.2.1 | 2026-06-24 | 联动对齐,统一移交参数 |
| v1.2 | 2026-06-24 | 重构触发逻辑,移交 复盘向导 而非直连引擎 |
| v1.1 | 2026-06-19 | 新增自动触发复盘逻辑 |
| v1.0 | 2026-06-12 | 初始版本,四平台解析合并 |
质量评分:良好。优点是使用简单(拖入Excel文件即可)、自动化程度高、自动匹配发布记录并移交复盘、边界情况处理完善。不足之处是配置路径有特定平台问题,且存在少量逻辑细节未对齐(匹配阈值)。普通用户使用体验较好,但需要技术人员维护。