Skip to content

Repository files navigation

[English](./README.en.md) | 简体中文
DecayWatch — 能力衰变哨兵

面向长 agent 运营者的能力衰变哨兵:用机器可校验的逐步成功信号从早期 turn 基线每类能力成功率,并在某类能力随上下文增长而衰变时拉响早停预警——全程离线、不调模型、数据不出境。

某个能力在 turn 200 悄悄挂了 150 轮、agent 没停也没吭声——DecayWatch 在它跨过基线的几分钟内拉响早停。

license release ci python signal stat

架构

架构:Transcript → Ingest → Baseline+Decay → Report

单进程、单二进制,无服务端、无后台守护。成功信号就是 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 友好)

Demo

demo

在一条真实结构的 Claude Code transcript 上跑 decaywatch watchexec 类(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 细化(如跑 pytesttest-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 噱头,停。

License

MIT — 见 LICENSE。提 issue 或 PR 直接在 Issues

分享

DecayWatch — 长 agent 运行的能力衰变哨兵。用 is_error 信号从早期 turn 基线每类成功率,Wilson 区间拉响早停。离线、不调模型、数据不出境。https://github.com/SuperMarioYL/decaywatch

MIT © 2026 SuperMarioYL

About

能力衰变哨兵 DecayWatch — 长 agent 运行中按能力类目基线成功率并预警中途衰变

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages