
你的代理说完成了。它从未观察过运行。让AI代理看到UI录制:区域变化、闪烁、动作冻结。CLI + MCP + 技能。
概览
客服写出他们从未见过移动的界面。他们看不了视频,所以闪烁、冻结的动画和布局都被自信地说“看起来不错!”后就被抛弃了。4K捕捉会把录像变成代理能看到的东西,所以它会先发现自己的界面bug。 21秒的bug复制,作为一张图片。红色框标记了变化。在#7处,用户删除了“买牛奶”,但“给妈妈打电话”却消失了。 一位经纪人制作了一个循环盆景动画,然后就完成了。它并没有在看: “动画”是静态图像(像素移动的0.5%)。代理重建了它,再次用4K帧运行,树中有3帧带有15%运动的关键帧。这就是循环: - 每动作一帧,屏幕稳定后:是点击的结果,而非每一个字母都被按。跳过空白淡入,长时间录制均匀覆盖。- 60帧扫描找到持续一帧并回放的闪光,标记为闪烁。模型采样1帧每秒时会漏掉这些闪烁。
概述(AI 翻译)
你的经纪人说“完成✅”了。它从未看过它运行。
代理们写出他们从未见过移动的界面。他们看不到视频,所以闪烁, 冻结动画和布局都像是自信地说“看起来很棒!”。 被捕捉在4K中,是把录音变成代理能看到的东西,所以它被捕捉到了 它自己的UI漏洞先会有。
21秒的漏洞复制图,作为一张图片。红色方框标记了变化。在#7处 用户删除了“买牛奶”,但“打电话给妈妈”却消失了。
经纪人如何使用它
- 记录用户界面:错误复刻、Loom,或代理自身的变更运行。
- 客服打电话给
watch_video,拿到表格和时间线 改变了,发生了什么,发生了什么。 - 它会放大任何可疑内容,使用
zoom_video,修复代码,并且 看了一段新的录像以确认修复方法。
它的作用
- 选择重要的帧。 屏幕稳定后,每个动作一帧: 是点击的结果,不是每个字母都打出。空白淡入被跳过, 而长时间录音则保持均匀覆盖。
- 捕捉闪烁。 60帧扫描找到最后一帧的闪光并迅速回放,
并标记为
FLICKER。以1帧每秒采样视频的模型会错过它们。
本页由 AI 翻译,技术细节请以原文为准。
README
以下为原文 README 节选,完整内容请查看原文。
caught-in-4k
Your agent said “done ✅”. It never watched it run.
Agents write UI they’ve never seen move. They can’t watch video, so flicker, frozen animations and layout jumps ship with a confident “looks good!”. caught-in-4k turns a recording into something an agent can see, so it catches its own UI bugs before you do.
21 seconds of a bug repro, as one image. Red boxes mark what changed. At #7 the user deletes “Buy milk”, but “Call mom” disappears instead.
$ npx caught-in-4k demo-bug.mp4
8 keyframes, 1 sheet(s) in 1.0s
read this first: .caught-in-4k/demo-bug/index.md
How an agent uses it
- Record the UI: a bug repro, a Loom, or the agent’s own change running.
- The agent calls
watch_videoand gets the sheets plus a timeline of what changed, where, and what was said. - It zooms into anything suspicious with
zoom_video, fixes the code, and watches a fresh recording to confirm the fix.
What it does
- Picks the frames that matter. One frame per action, once the screen settles: the result of a click, not every letter typed on the way. Blank fade-ins are skipped, and long recordings stay evenly covered.
- Catches flicker. A 60 fps pass finds flashes that last one frame and snap back,
and marks them
FLICKER. A model sampling video at 1 fps misses them. - Boxes what changed since the previous frame, so the agent knows where to look. Mouse jitter and full-screen cuts are left unboxed.
- Sharp crops on big screens. On a Retina recording, the changed areas are cut from the full-resolution frame, so small UI text stays readable.
- Lines up speech with the frames, using whisper.cpp word timing.
- Zoom. Dense frames across any time range, or one full-resolution frame.
- Cheap. A 21-second repro fits in one image, about 2k tokens.
Everything runs locally. Nothing is uploaded.
Give it to your agent
MCP (tools watch_video and zoom_video, images come back inline):
claude mcp add caught-in-4k -- npx -y caught-in-4k mcp
Codex (~/.codex/config.toml):
[mcp_servers.caught-in-4k]
command = "npx"
args = ["-y", "caught-in-4k", "mcp"]
Cursor and others (mcp.json):
{ "mcpServers": { "caught-in-4k": { "command": "npx", "args": ["-y", "caught-in-4k", "mcp"] } } }
Skill: copy SKILL.md to ~/.claude/skills/caught-in-4k/SKILL.md
(or your agent’s skills folder). The agent then runs it whenever there’s a video.
By hand:
npx caught-in-4k bug.mov # .caught-in-4k/bug/index.md + sheets
npx caught-in-4k zoom bug.mov --from 0:13.8 --to 0:15
npx caught-in-4k zoom bug.mov --from 14.8 --count 1
Does it work?
We ran a blind test on 6 public bug-report recordings from Excalidraw, Zed and
安装
npx -y caught-in-4k mcp配置
{ "mcpServers": { "caught-in-4k": { "command": "npx", "args": ["-y", "caught-in-4k", "mcp"] } } }