SC

skyblanket/caught-in-4k

开发工具

本页由 AI 翻译,技术细节请以原文为准。 查看原文

0 stars 0 forks 质量 80 趋势 14MIT

你的代理说完成了。它从未观察过运行。让AI代理看到UI录制:区域变化、闪烁、动作冻结。CLI + MCP + 技能。

概览

客服写出他们从未见过移动的界面。他们看不了视频,所以闪烁、冻结的动画和布局都被自信地说“看起来不错!”后就被抛弃了。4K捕捉会把录像变成代理能看到的东西,所以它会先发现自己的界面bug。 21秒的bug复制,作为一张图片。红色框标记了变化。在#7处,用户删除了“买牛奶”,但“给妈妈打电话”却消失了。 一位经纪人制作了一个循环盆景动画,然后就完成了。它并没有在看: “动画”是静态图像(像素移动的0.5%)。代理重建了它,再次用4K帧运行,树中有3帧带有15%运动的关键帧。这就是循环: - 每动作一帧,屏幕稳定后:是点击的结果,而非每一个字母都被按。跳过空白淡入,长时间录制均匀覆盖。- 60帧扫描找到持续一帧并回放的闪光,标记为闪烁。模型采样1帧每秒时会漏掉这些闪烁。

概述(AI 翻译)

你的经纪人说“完成✅”了。它从未看过它运行。

代理们写出他们从未见过移动的界面。他们看不到视频,所以闪烁, 冻结动画和布局都像是自信地说“看起来很棒!”。 被捕捉在4K中,是把录音变成代理能看到的东西,所以它被捕捉到了 它自己的UI漏洞先会有。

21秒的漏洞复制图,作为一张图片。红色方框标记了变化。在#7处 用户删除了“买牛奶”,但“打电话给妈妈”却消失了。

经纪人如何使用它

  1. 记录用户界面:错误复刻、Loom,或代理自身的变更运行。
  2. 客服打电话给watch_video,拿到表格和时间线 改变了,发生了什么,发生了什么。
  3. 它会放大任何可疑内容,使用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

  1. Record the UI: a bug repro, a Loom, or the agent’s own change running.
  2. The agent calls watch_video and gets the sheets plus a timeline of what changed, where, and what was said.
  3. 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

在 GitHub 查看完整 README

安装

npx -y caught-in-4k mcp
新手?先看 mcpskill.org 教程 →

配置

{ "mcpServers": { "caught-in-4k": { "command": "npx", "args": ["-y", "caught-in-4k", "mcp"] } } }