面向长 agent 运营者的能力衰变哨兵:用机器可校验的逐步成功信号从早期 turn 基线每类能力成功率,并在某类能力随上下文增长而衰变时拉响早停预警——全程离线、不调模型、数据不出境。
某个能力在 turn 200 悄悄挂了 150 轮、agent 没停也没吭声——DecayWatch 在它跨过基线的几分钟内拉响早停。
单进程、单二进制,无服务端、无后台守护。成功信号就是 transcript 自带的 tool_result.is_error 字段,整条流水线确定性、可复现、数据不出境。Claude Code 适配器开箱即用;信创 on-prem 适配器走同一份 adapters/base.py 契约,按需接入。
长 agent 运行的运营者都遇到过这一幕:晚上 9 点挂一个多小时的自治编码任务,睡觉,醒来发现某个工具类(文件编辑、或 bash 执行)已经连续失败了 150 轮——agent 从未停下,也从未告诉任何人。原因不在模型变笨,而在于“某类能力随上下文增长而衰变”这件事目前没有任何东西在量度。DecayWatch 把这个盲区变成一条衰变曲线加一个早停告警:在该类跨过基线的几分钟内拉响,而不是浪费下一个小时之后。
它刻意只用机器可校验的信号(tool_result.is_error、测试退出码),绝不调 LLM 去“推断能力”——这正是 verdict 里 oracle-absence 陷阱要躲开的反模式。成败是 transcript 字段给的,不是模型猜的。
三条命令,从冷克隆到首个可见结果(<30s,无需服务器、无需 GPU、无需模型调用):
uv tool install decaywatch # 1. 安装(已有 uv 即可,<60s)
decaywatch baseline ~/.claude/projects/<slug>/s.jsonl # 2. 基线:每类能力早期成功率(Wilson)
decaywatch watch ~/.claude/projects/<slug>/s.jsonl # 3. 监视:衰变曲线 + 早停告警,exit 非零即衰变示例输出(exec 类衰变)
Per-capability baseline (early window, Wilson 95% lower bound)
┏━━━━━━━━━━━━━━━━━━┳━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Capability class ┃ n ┃ Success rate ┃ Wilson low ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ exec │ 20 │ 100% │ 84% │
│ file-read │ 20 │ 100% │ 84% │
└──────────────────┴────┴──────────────┴──────────────┘
Live decay — per capability class vs. baseline
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┓
┃ Capability class ┃ Baseline ┃ Live ┃ Curve ┃ Status ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━┩
│ exec │ 100% │ 10% │ ████████▇▇▆▅▄▃▂ │ DECAYED │
│ file-read │ 100% │ 100% │ ██████████████ │ ok │
└──────────────────┴──────────┴──────┴───────────────┴─────────┘
╭────────────────── DecayWatch alert ──────────────────────────╮
│ Early-stop: exec decayed 100% → 95% (drop 5 pts, warning) │
╰──────────────────────────────────────────────────────────────╯
没有真实 transcript?仓库自带 tests/fixtures/decayed.jsonl,可直接试:
decaywatch watch tests/fixtures/decayed.jsonl五个最常见工作流。所有命令离线运行,数据不离开你的机器。
# 1. 基线并落盘 baseline.json(m1 交付物,亦是证伪探针)
decaywatch baseline session.jsonl -o baseline.json
# 2. CI 友好:JSON 判决,某类衰变即 exit 1(Guardrail 钩子直接读 exit code)
decaywatch watch session.jsonl --json
# 3. 调灵敏度:更大早窗 / 更大滑窗 / 更宽容 margin
decaywatch watch session.jsonl --k 30 --window 30 --margin 0.10
# 4. 用自定义能力分类法
decaywatch watch session.jsonl --config config/capability_classes.yaml
# 5. 只看基线(不给 CI 留噪声)
decaywatch baseline session.jsonl --json| 参数 | 类型 | 默认 | 含义 |
|---|---|---|---|
--k |
int | 20 | 构成早期基线的已知结果步数 |
--window |
int | 20 | 实时滑动窗口大小(watch) |
--min-sample |
int | 5 | 基线/告警的最小样本,低于则不报 |
--margin |
float | 0.05 | 实时 Wilson 下界跌破基线下界的裕量 |
--config |
path | config/capability_classes.yaml |
能力分类法路径 |
--output |
path | - | 写 JSON 到文件 |
--json |
flag | false | stdout 输出 JSON(CI 友好) |
在一条真实结构的 Claude Code transcript 上跑 decaywatch watch:exec 类(Bash 执行)成功率从基线 100% 一路衰变到 10%,曲线翻红、早停告警拉响、exit 1;file-read 类全程健康。全程离线,无模型调用,无服务端。
录屏脚本见 docs/demo.tape(vhs),Asciinema 原始录制见 assets/demo.cast。
能力分类法在 config/capability_classes.yaml,按 tool_use.name 映射到能力类目,Bash 可选 command_regex 细化(如跑 pytest → test-run 而非 exec)。带 command_regex 的规则更具体、优先匹配。未命中的工具被忽略(不产生基线信号)。
classes:
- class: test-run
match: { tool: Bash, command_regex: '\b(pytest|unittest|cargo test|...)\b' }
- class: exec
match: { tool: Bash }
- class: file-mutation
match: { tool: Write }
# ... 见 config/capability_classes.yaml开箱即用:未提供 --config 且当前目录无该文件时,CLI 用内置默认分类法(与仓库根的 yaml 镜像)。检测参数见上表。
| 层级 | 价格 | 包含 |
|---|---|---|
| OSS CLI | 免费 | 离线、单机、数据不出境;基线 + 衰变告警 + Rich/JSON 输出 |
| DecayWatch Pro | ~$15/seat/月 | CI 早停守门(agent 类衰变即 fail build)+ 托管多运行衰变看板 + 按席位告警 |
OSS CLI 是 Pro 包裹的同一套检测,免费且离线;Pro 是把它接进 CI 并跨团队聚合。数据不出境拆分:重的 transcript 解析留在你的机器上,只有聚合衰变曲线 + 告警状态出境(仅匿名衰变指标),信创 on-prem 可用。最小付费转化路径:免费 CLI 在团队真实运行上抓到一次衰变(证明)→ 14 天 Pro 试用接进 CI → 某个定时任务早停而非烧一小时 → 转化。
- m1 基线 ingest — 适配器按
tool_use_id配对、映射能力类、Wilson 基线、baseline.json(兼证伪探针:在真实长 transcript 上证明某类is_error率会上升) - m2 衰变告警 — 滑动窗口 + Wilson 区间检测、衰变曲线(JSON)+ Rich TUI + 早停告警 + 非零 exit
- m3 Guardrail + Pro — CI 早停守门钩子 + 托管多运行衰变看板(~$15/seat/月)
- 跨 harness 联邦:信创 on-prem Qwen 适配器(走
adapters/base.py契约) - v0.2:若 m1 证明
is_error过粗,再评估内容启发式(不调 LLM 推断能力)
证伪触发器(任一即停):① m1 在真实长 transcript 上找不到
is_error率上升的真实类→无测量,停于 m2 前;② 上线 30 天、3 项活动后 <50 stars 且无有机 issue 报“因中途衰变损失小时”→痛点是 KOL 噱头,停。
MIT — 见 LICENSE。提 issue 或 PR 直接在 Issues。
DecayWatch — 长 agent 运行的能力衰变哨兵。用 is_error 信号从早期 turn 基线每类成功率,Wilson 区间拉响早停。离线、不调模型、数据不出境。https://github.com/SuperMarioYL/decaywatch
MIT © 2026 SuperMarioYL
