Ultrafast 排错:连不上、点不动、跑偏了怎么办
跑 Jev Ultrafast 时出了问题,八成卡在四层之一:本地服务没起来、Chrome 没连上、模型调用被拒、决策执行碰壁。这节课把常见 jev-ultrafast 报错按「报错原文」逐个给原因和解法——先 60 秒速检,再对号入座。
所有报错原文都出自仓库源码(jev_ultrafast/model.py、agent.py、browser.py、demo.py 和 inspector 界面),逐字可搜、可复制去提问。前置课程卡住没关系,安装运行哪一步炸了都能回到这里查。
学完你能做什么
- 用 4 条命令在 60 秒内定位目录、Key、Chrome、浏览器执行层哪一环出了问题
- 把 jev-ultrafast 报错对号入座:报错原文 → 原因 → 修复步骤
- 分清三类报错的待遇:stale 类(自动模式自愈)、重试类(代码自动退避)、动手类(要你改配置或改目标)
- 看懂 inspector 状态栏的 6 种显示,知道 done 和 blocked 各自下一步做什么
- 记住不支持清单:shadow DOM、frames、canvas、上传、弹出新 tab、嵌套滚动、任意键盘组件
- 用 Export trace 导出决策证据,带最小信息去提问
你现在的困境
- Start demo 点了没反应,不知道是服务没起来、Chrome 没连上,还是 Key 没配
- 红框里的英文报错一闪而过,不知道拿哪句去搜、搜到了也看不懂是哪层的锅
- agent 状态变成 done / blocked,页面却不是想要的结果——是目标写错了,还是这个页面根本跑不了?
什么时候用这一招
当你需要:
- 修复 Ultrafast 安装运行、跑通 Google Flights、写自己的浏览器任务 里卡住的报错
- 开工前判断一个网站适不适合 Ultrafast——不支持清单先筛一遍,别硬闯
而且不想:
- 一报错就删库重装,从头再走一遍安装流程
- 分不清「页面变了要重试」和「配置坏了要修」,白改半天
🎒 开始前的准备
- 完成了 Ultrafast 安装运行(卡住没关系,本课就是解卡的)
- 仓库 clone 在本地,终端能在
jev-ultrafast/根目录执行命令 - (可选)跑过 写自己的浏览器任务——用 Agent 库时碰到的报错,同样能在这里对号入座
核心思路
先定层,再看报错。 一次 Ultrafast 任务要过四层,每层的报错长得不一样:
| 层 | 检查什么 | 典型报错 / 现象 |
|---|---|---|
| 1. 本地服务 | uv run jev 起没起、目录对不对、地址是不是 127.0.0.1 | Cannot reach local demo server / Forbidden |
| 2. Chrome 连接 | Browser Harness、远程调试授权 | 面板一直不动 |
| 3. 模型调用 | 两个 Key、网络、额度 | TYPE_TEXT needs TEXT_MODEL_API_KEY / Model provider returned HTTP 401 |
| 4. 决策与执行 | 页面变化、动作预算、页面控件边界 | Target changed or is covered / 状态变 blocked |
三类报错,三种待遇。 看到报错先归类,别急着动手:
| 类型 | 例子 | 你要做的 |
|---|---|---|
| 自愈类(stale,页面变了) | Page changed since the decision / Target changed or is covered | 什么都不用做:自动运行会重新观察再决策;手动模式点一次 Choose next |
| 重试类(服务端临时拒绝) | 429 / 529 / 503 → 代码共尝试 3 次(重试 2 次),仍失败报 Model provider returned HTTP 429/529/503 | 稍等再跑,查额度 |
| 动手类(配置 / 预算 / 边界) | 缺 Key、HTTP 401、60 动作预算、shadow DOM 不支持 | 按下面各条改配置、改目标或换页面 |
💡 inspector 状态栏对照表(app.js 原文)
| 状态栏显示 | 含义 | 你要做什么 |
|---|---|---|
| Ready to explore | 还没 Start demo | 填目标,点 Start demo |
| Page observed · ready for a decision | 页面已观察,等决策 | 点 Choose next 或 Run automatically |
| Choice ready · inspect or execute | 决策已出,待执行 | 检查概率后点 Execute choice |
| Jev reports complete · inspect the page | 模型选了 DONE | 亲自核对页面——DONE 不是成功证据 |
| Stopped · no supported next action | blocked:连续无效动作或模型选了 BLOCKED | 看 Decision trail 最后几步,对照不支持清单 |
| Paused · needs attention | 出错暂停 | 看红框里的报错原文,对号入座 |
首次排查:60 秒速检
四条命令按顺序跑,依次验证目录、Key、Chrome 连接、浏览器执行层。前提:跑 uv run jev 的终端还打印着 Jev Ultrafast: http://127.0.0.1:8766,浏览器用 127.0.0.1:8766 打开(不是 localhost,原因见下面 Forbidden 那条排错)。
# 1. 当前目录对吗?——.env 从「当前目录」读取,必须在仓库根目录跑
pwd
# 应以 jev-ultrafast 结尾;不在就先 cd jev-ultrafast
# 2. 两个 Key 都配了吗?——应看到两行(值非空才算数)
grep -E "^(TYPESAFE_API_KEY|TEXT_MODEL_API_KEY)=." .env
# 顺手 echo $TYPESAFE_API_KEY 确认 shell 里没有旧值抢先——.env 不会覆盖已 export 的变量
# 3. Chrome 连得上吗?——官方诊断命令
uv run browser-harness --doctor
# 按提示在 Chrome 里允许远程调试
# 4. 浏览器执行层正常吗?——官方开发命令,不调用模型、不花 API 费
uv run python scripts/check_guards.py
# 在本地浏览器里跑执行守卫回归;脚本自己的说明:No model calls or external websites你应该看到:第 1 条以 jev-ultrafast 结尾;第 2 条输出两行;第 3 条完成连接诊断;第 4 条结尾打印 PASS: N browser guard checks; no model calls。哪条断了就从哪条修;四条全过还报错,问题基本在模型调用或决策层——往下对号入座。
常见问题排查
启动与 Chrome 连接(连不上)
"Cannot reach local demo server"
原因:inspector 页面连不上本地服务——uv run jev 没在跑、端口被换过,或者页面是个旧标签页。这句话出现在状态栏(app.js 的 fetch 失败分支)。
解决:
- 在仓库根目录重新启动,终端应打印:
uv run jev
# Jev Ultrafast: http://127.0.0.1:8766- 浏览器打开
http://127.0.0.1:8766。换了端口的话:TYPESAFE_DEMO_PORT必须在启动前设好(demo.py 在模块导入时就读定端口),详见安装运行课的进阶技巧。
打开页面只显示 "Forbidden"
原因:用了 localhost:8766 而不是 127.0.0.1:8766。demo 服务校验 Host 头,只认 127.0.0.1:8766——这个服务只监听本机回环地址(demo.py 自称 Loopback-only inspector),POST 请求还会得到 {"error": "Local demo requests only"}。
解决:地址栏改成 http://127.0.0.1:8766,刷新即可。
Chrome 连不上、面板一直不动
原因:Browser Harness 需要 Chrome 允许远程调试,首次连接时 Chrome 会弹提示;错过或拒绝后就连不上。README 的原话:Allow remote debugging in Chrome when prompted。
解决:
- 跑官方诊断命令,在仓库根目录:
uv run browser-harness --doctor- Chrome 再弹「允许远程调试」提示时点允许。
- 诊断通过但还不动:先跑上面的
uv run python scripts/check_guards.py——它不调用模型,能单独验证浏览器执行层。
"A browser step is already running"
原因:上一步还在执行。demo 服务用一把全局锁保证同一时刻只跑一个浏览器步骤,撞锁的请求返回 409 和这句话。
解决:等当前步完成;Run automatically 运行中想停就点 Pause。
"Local demo failed; no automatic retry. Reset to recover."
原因:demo 服务把未被特殊捕获的异常统一包装成这句 500 兜底提示。最常见诱因:TYPESAFE_API_KEY 完全没设——model.py 直接读 os.environ["TYPESAFE_API_KEY"],缺了抛 KeyError,不会显示原文,只会落到这句兜底。
解决:
- 检查
.env两个 Key(60 秒速检第 2 条)。 - 按提示 Reset:点 Start demo 重开一次。
- 用 Agent 库的同学会直接看到原始 traceback(如
KeyError: 'TYPESAFE_API_KEY'),按缺哪个补哪个处理。
"Start a demo first"
原因:inspector 里还没 Start demo 就点了 Choose next / Execute choice / Run automatically——demo 服务在还没创建 agent 时拒绝这些命令。
解决:先填目标、点 Start demo,再执行控制按钮。
"Enter 1–2,000 characters"
原因:目标为空或超过 2000 字符(demo.py 的 reset 校验)。
解决:把目标写到 1–2000 字符以内。用 Agent 库传空目标会报 Supply a task(agent.py),同一个意思。
Key 与模型调用(TEXT_MODEL 报错高发区)
"TYPE_TEXT needs TEXT_MODEL_API_KEY; no text is hardcoded or guessed by the executor."
原因:.env 缺 TEXT_MODEL_API_KEY。这项检查只在操作为 TYPE_TEXT 时触发(model.py 的 field_text()),所以 demo 能启动、页面也能观察,一到「往输入框打字」才停——Flights demo 要生成城市名,躲不过去。
解决:
- 在
.env里补上文本模型的 Key(去哪拿见安装运行课第 3 步的方式 A/B/C)。 - 注意读取规则:
.env从当前目录读取,且不会覆盖 shell 里已 export 的同名变量——明明填了还报,就cd jev-ultrafast后重跑、并检查echo $TEXT_MODEL_API_KEY。
"Model provider returned HTTP 401; no action executed."
原因:模型端点返回了错误状态码,套进这句话模板(源码是 f"Model provider returned HTTP {response.status_code}; no action executed.")。401 = Key 无效。这句话 TypeSafe 和文本模型共用,先分清是哪一端:
| 什么时候报 | 是哪一端 | 查什么 |
|---|---|---|
| 第一步决策就报 | TypeSafe(决策每个周期都调用) | TYPESAFE_API_KEY |
| 跑到打字那步才报 | 文本模型(只有 TYPE_TEXT 用) | TEXT_MODEL_API_KEY 与 TEXT_MODEL_BASE_URL 是否匹配 |
解决:
- TypeSafe 侧:回 控制台 Keys 页 重抄 Key,可用 curl 验证(起步排错有完整命令)。
- 文本模型侧:确认 Key 是你配置的那个端点的(OpenRouter 的 Key 配 DeepSeek 端点就是 401)。
- 其他状态码含义(400/413/415/422 等)看 API 速查的状态码表——429/529/503 不会立刻报,见下面 "Model provider returned HTTP 429/529/503"。
"Model connection failed; no action executed."
原因:HTTP 客户端在网络层就抛了异常——连不上端点、DNS 解析失败这类,请求根本没发出去(model.py 捕获 httpx.HTTPError 后抛这句)。
解决:
- 检查网络能否访问
api.typesafe.ai和你的TEXT_MODEL_BASE_URL。 - 检查端点拼写:
TEXT_MODEL_BASE_URL常见错误是少了或多了/v1(示例值https://openrouter.ai/api/v1,DeepSeek 默认https://api.deepseek.com/v1)。
"Model provider returned HTTP 429/529/503; no action executed."(限流与过载)
原因:模型端点返回 429(限流)/ 529(过载)/ 503。这类状态码不会立刻报:代码共尝试 3 次(重试 2 次,间隔 0.5s、1s),第 3 次仍失败才套进上面的状态码模板,报出 Model provider returned HTTP 429; no action executed.(529、503 同句式)。
源码里还有一句兜底文案 "Model unavailable"(model.py L27),但按当前控制流它不可达——429/529/503 重试耗尽后走的是状态码模板,界面上看不到这句;在源码里搜到它时,对号入座到本条即可。
解决:稍等再跑一次;频繁出现就查额度——TypeSafe 侧在 控制台 rate-limits 页 看,文本模型侧看你服务商的账单页。
"Invalid TypeSafe response; no action executed."
原因:决策响应没通过本地校验(model.py 的 validate_choice():选中的选项必须在候选里、每个选项都有概率、数值都在 0–1、概率和约为 1)。这是「响应不符合契约」的守卫,不是你的配置问题。
解决:先原样重跑一次(偶发);持续出现就导出 trace(见「还是不行?」)带去反馈。
"Text helper returned no valid field value; nothing typed."
原因:文本模型的输出不符合契约——必须是只含 text 一个键的 JSON,值是非空字符串且不超过 2000 字符(model.py 的解析规则)。两种常见触发:
| 触发 | 机制 |
|---|---|
| 目标里缺必填值 | 模型指令明文规定:缺值返回 {"text": null}、绝不发明个人信息(questions.py 的 TEXT_VALUE)——null 解析失败,什么都不打 |
| 模型不守规矩 | 输出了一段注释文字而不是 JSON——官方性能报告就提到探测时拒绝过这种模型 |
解决:
- 把任务需要的值写进目标(日期、城市名这类,别让模型猜)。
- 还不行就换文本模型,并保留
TEXT_MODEL_REASONING=none(关推理的模型更少发挥)。 - 打了错的值(不是不打)也一样处理——官方探测还拒绝过把出发地和目的地写反的模型,换模型前先用小任务试。
执行中断与预算(点不动)
"Target changed or is covered. Observe again."
原因:执行前的安全复查发现目标变了:被覆盖、隐藏、禁用、移出视口,或者不再是观察时的那个节点。这是守卫在工作,不是 bug——模型输出永远只引用观察到的真实元素,执行前还会再核一遍几何位置。
解决:重新观察再决策。自动运行(不开 Slow motion)时每步走 tick,这类 stale 报错会被自动吞掉并重新观察,你根本看不到;手动逐步或开慢速时会暂停显示原文,点一次 Choose next 重新决策即可。
"Page changed since the decision. Choose again."
原因:stale 家族——决策做出后页面变了,旧决策作废。同族变体:Page changed before text generation. Choose again.(打字前页面变了)、Page changed since this decision. Observe again.(执行前复查)、Document changed during evaluation / Document is navigating(观察时页面正在变)。
解决:同上,重新观察。两个细节:
- 打字的值不会白生成:只有文本 helper 的输入完全不变时,重试才会复用上次生成的值(README 的 Reuse an interrupted text request)。
- 频繁出现说明页面动画/加载多,稍等再跑或换个稳定些的页面。
"Page did not settle"
原因:连续 10 次观察(每次间隔 20ms)页面都没稳定下来——动画不停或一直在加载。
解决:等页面消停再跑;某些重型页面(滚动动画、骨架屏常驻)可能就是不适合。
"Dropdown execution was not confirmed; inspect before retrying."
原因:原生 <select> 的执行结果没有被确认,或执行被打断(变体原文:Dropdown execution was interrupted; inspect before retrying.)。代码在这里选择保守停下,而不是盲目重试——重试可能造成重复选择。
解决:重新观察(Choose next / 重跑),让 agent 基于新页面重新决策。
"Observe and choose before acting"
原因:手动模式下没决策就点 Execute choice,或者决策出来后页面指纹变了、决策已被消费。
解决:点一次 Choose next 拿到新决策,再 Execute choice。
"Stopped at the 60-action demo budget"
原因:单次运行的硬预算用完:最多 60 个已执行动作(MAX_STEPS = 60)。决策调用数另有上限 120(MAX_STEPS × 2),到顶报 Reached the demo's model-call budget。
解决:任务太大就拆小——examples/run.py 的官方示例参数就叫 'A narrow goal',把目标写窄是官方建议。预算内没跑完,通常说明目标太泛或页面不适合(见下组)。
"This run has stopped. Start a fresh demo."
原因:状态已经是 done 或 blocked,还继续请求新决策——一次运行结束了。
解决:点 Start demo 重开一次新的运行。
状态栏显示 "Stopped · no supported next action"(blocked)
原因:两种来源:模型主动选了 BLOCKED(指令定义:没有受支持的操作能推进任务),或连续 3 个已执行动作(且都不是 WAIT)页面都没有任何变化——代码判定卡死,自动转 blocked。
解决:
- 看 Decision trail 最后 3 步:点的什么、页面为什么没变。
- 对照下面那组「不支持清单」——blocked 最常见的根因是页面里有跑不了的控件。
- 目标改窄、改具体一点,重开 demo。
结果不对与页面边界(跑偏了)
状态栏显示 "Jev reports complete · inspect the page",但页面不是想要的
原因:模型选了 DONE,但 DONE 永远不是成功证据——官方在 Evidence and limits 里写得很直白:选了 DONE 仍然要独立验证结果。界面状态栏的后半句(inspect the page)就是在提醒你亲自看。
解决:
- 重要任务加独立验证。官方范本是
examples/flights.py的verify():对结果页逐项核对单程、出发地、目的地、日期、结果可见——不信任模型的 DONE;验证不过就退出并报Final page did not satisfy the route/date checks。 - 目标里写清停止条件。官方 Flights 示例目标就以
Stop when …收尾,照这个句式写。 - 「打开某结果」类目标尤其要注意:模型指令明文规定「只找到匹配链接不算完成」。
控件点了没反应 / 元素表里根本没有它(shadow DOM、canvas、上传……)
原因:撞上 MVP 边界了。DOM reader 只认常见 HTML 和 ARIA 控件,不实现完整的 accessible-name 算法。官方 Limits 清单,以下一律不支持:
| 不支持 | 举例 |
|---|---|
| shadow roots / frames | 组件框架渲染的内部控件 |
| canvas | 地图、画布类交互 |
| 文件上传 | <input type="file"> |
| 弹出新标签页 | 点击后开新 tab 的链接 |
| 嵌套滚动 | 内部滚动容器 |
| 任意键盘组件 | 快捷键、富文本编辑器 |
解决:任务开工前先对照清单筛一遍,涉及这些控件的页面目前别硬闯(原理课第 4 步有同一份边界);换个只含常规控件的页面或任务。另外注意:agent 的 tab 共用你现有的 Chrome profile——登录状态会影响页面内容,排查「页面和预期不一样」时想想这一层。
打进去的字不对,或者该打的字没打
原因:字符串由文本 helper 从目标推断,不是 Jev 写的。字不对 = helper 模型理解偏了;不打 = 它按规则返回了 {"text": null}(目标缺必填值时拒绝发明,见上面 nothing typed 那条)。
解决:把必填值原样写进目标(「September 20, 2026」而不是「下个月」);还不行换文本模型,先用小任务探测——官方就是靠六次探测调用淘汰掉写反城市、输出注释的模型的(见性能解读)。
填完了却不提交、打完字不选建议
原因:模型指令里其实写死了这些规则:填完必填字段要提交(「填好的字段不等于已应用的搜索」)、打完字的查询还要选匹配的自动补全建议。没做到多半是时机问题——打完字后代码最多等 200ms 建议就出来,建议加载慢的站点可能没赶上下一次观察。
解决:原样重跑一次通常就过;持续卡在同一处就把目标写得更明确(要提交什么、停在哪),或换个建议加载快的页面。
还是不行?
先隔离,再收集证据,最后带证据去问。
隔离利器是仓库自带的两个脚本(都在 scripts/,出自 README 的 Development 一节):
# 只测浏览器执行层:本地页面、不调用模型、不花钱
uv run python scripts/check_guards.py
# 测完整链路:浏览器只开本地 fixture 页面,但会发起真实模型调用(产生付费 API 费用)
uv run python scripts/smoke.pycheck_guards.py 过了、smoke.py 也过了、真实网站还失败——问题多半在那个网站本身(控件边界、加载时机),对照不支持清单。
收集证据,三样就够:
| 证据 | 怎么拿 | 里边有什么 |
|---|---|---|
| 决策 trace | inspector 底部 Export trace ↓ 按钮 | 下载 typesafe-browser-trace.json:完整决策历史、概率、目标、页面 URL 和可见文本(不含截图) |
| 模型看到了什么 | 页面折叠区 What the model sees | 发给模型的完整请求体,逐字段可查 |
| 报错原文 | 红框里的那句话 | 本页所有 H4 都能对上 |
⚠️ 发出去之前过一遍
trace 里有页面 URL 和可见文本,可能包含你的账号信息;另外注意:live 示例和录制脚本都会产生付费 API 调用(README 原话),反复复现前心里有数。
去哪里问:
| 渠道 | 什么时候去 |
|---|---|
| 本课 + 安装运行 | 先自查两遍,大部分问题到不了这一步 |
| 起步排错 / API 速查 | TypeSafe API 侧的状态码问题 |
| GitHub Issues | Ultrafast 本身的缺陷:带 trace + 报错原文 + 目标和 URL |
| TypeSafe Discord | 决策 API(Jev)侧的问题,官方说坏了直接报 |
| Browser Use Cloud | 用托管版 BU Ultrafast(model: "bu-ultrafast")时的问题 |
检查点 ✅
- 60 秒速检四条命令都跑过,知道卡在哪一层
- 我能分清三类报错:stale 自愈、429/529/503 自动重试、配置/预算/边界要动手
- 状态 done 时我不会直接收工——重要任务加独立验证(flights.py 的 verify() 是范本)
- 不支持清单过目:shadow DOM、frames、canvas、上传、新 tab、嵌套滚动、键盘组件
- 提问时我会带上 typesafe-browser-trace.json、报错原文、目标和 URL
本课小结
✅ 排错先定层:本地服务 → Chrome 连接 → 模型调用 → 决策执行,每层报错长相不同。
✅ jev-ultrafast 报错原文全部出自仓库源码,逐字可搜;H4 标题就是报错原文,复制去搜、去问都行。
✅ 三类待遇:stale 类交给自动重观察,429/529/503 交给代码重试,配置/预算/边界类才需要你动手。
✅ DONE 不是成功证据、blocked 先查不支持清单、60 动作是硬预算——这三条记住了,一半的「跑偏」能提前避开。
关键信号速查:
| 信号 | 在哪一层 | 第一步 |
|---|---|---|
| Cannot reach local demo server / Forbidden | 本地服务 | 重跑 uv run jev;用 127.0.0.1:8766 打开 |
| 面板一直不动 | Chrome 连接 | uv run browser-harness --doctor,允许远程调试 |
| TYPE_TEXT needs TEXT_MODEL_API_KEY | 模型调用(文本侧) | .env 补 Key,注意 cwd 与 setdefault |
| Model provider returned HTTP 401 | 模型调用(Key 无效) | 先分清 TypeSafe 还是文本模型,再重抄 Key |
| Model provider returned HTTP 429/529/503 | 模型调用(限流/过载) | 稍等重跑,查额度 |
| Target changed or is covered | 决策执行(stale) | 重新观察;自动模式自愈 |
| Stopped at the 60-action demo budget | 决策执行(预算) | 目标写窄,任务拆小 |
| 状态 done 但结果不对 | 结果验证 | 亲自核对;加 flights.py 式的独立验证 |
| 状态 blocked | 页面边界 | 对照不支持清单,换页面或改目标 |
下一课预告
浏览器篇到此收工。下一课 Jev 1.13 踩坑手册:9 种失败模式与替代做法回到 Jev 模型本身——Ultrafast 之外,所有 Jev 应用通用。你会学到:
- 官方 jaggedness 文档的 9 种失败模式:字面理解、算术计数、日期比较、间接引用……
- 每种失败模式的替代做法:算术放代码、日期提部件、大 state 先过滤
- 这些提问习惯怎么反哺你写 Ultrafast 的目标和其他 Jev 应用
相关教程
附录:源码参考
点击展开查看源码位置
更新时间:2026-11-04(仓库 github.com/browser-use/jev-ultrafast,本地信息源 sources/jev/repo-ultrafast/)
| 功能 | 文件路径 | 关键位置 |
|---|---|---|
| 报错原文:连接/HTTP/重试 | jev_ultrafast/model.py | L15–27 post_json(L20 连接失败、L21–23 对 429/529/503 自动重试·共 3 次尝试、L25 HTTP 状态码模板、L27 Model unavailable 兜底文案·当前控制流不可达);L12 客户端 timeout=25 |
| 报错原文:决策响应校验 | jev_ultrafast/model.py | L30–45 validate_choice(L44 Invalid TypeSafe response) |
| 报错原文:文本 helper | jev_ultrafast/model.py | L160–198 field_text(L163 缺 Key 原文、L187–193 JSON 契约校验、L193 nothing typed) |
| TypeSafe 请求与 Key 读取 | jev_ultrafast/model.py | L119(api.typesafe.ai/v1/systemone + os.environ["TYPESAFE_API_KEY"],缺了抛 KeyError) |
| 报错原文:预算与状态机 | jev_ultrafast/agent.py | L74 已停止、L75–76 模型调用预算(MAX_STEPS×2=120)、L88–89 先观察再执行、L96/L107–108 stale 原文、L102–104 60 动作预算、L153–158 连续 3 次无变化→blocked |
| 报错原文:stale 与执行守卫 | jev_ultrafast/browser.py | L86 Page did not settle、L102 执行前页面变化、L130–131/L162–163 下拉框未确认/被打断、L164 目标被覆盖;L16 StalePage(ValueError) |
| 报错原文:demo 服务 | jev_ultrafast/demo.py | L16 端口(启动前设 TYPESAFE_DEMO_PORT)、L23–29 .env 读取(cwd + setdefault)、L48–52 场景与 1–2000 字符、L64–65 Start a demo first、L111–112 409 单步锁、L122–123 500 兜底 |
| inspector 状态栏与报错显示 | jev_ultrafast/static/app.js | L63 Paused · needs attention、L82–88 五种状态文案、L173–183 自动循环(tick 自愈 vs 慢速分步)、L217–235 导出 trace(去截图)、L243 Cannot reach local demo server |
| 界面按钮与折叠区 | jev_ultrafast/static/index.html | L56–59 Choose next / Execute choice / Run automatically / Pause、L126 Export trace ↓、L133 What the model sees |
| 模型指令(DONE/BLOCKED/提交/建议规则) | jev_ultrafast/questions.py | L3–14 NEXT_ACTION、L21–24 TEXT_VALUE(缺值返回 null、不发明个人信息)、L26 MAX_STEPS = 60 |
| 安装、--doctor、远程调试、不支持清单 | README.md | L53–68 Try it(含 uv run browser-harness --doctor)、L118–126 Evidence and limits(DONE 需独立验证;shadow roots/frames/canvas/上传/新 tab/嵌套滚动/键盘组件不支持;tab 共用现有 Chrome profile)、L128–138 Development(check_guards、付费提示) |
| 不支持清单(Limits 原文) | docs/performance.md | L53–55;L49 探测拒绝过的模型(写反城市/输出注释) |
| 独立验证范本 | examples/flights.py | L18–38 verify() 逐项核对、L63–64 Final page did not satisfy the route/date checks |
| 本地守卫回归脚本 | scripts/check_guards.py | L1 文档字符串(No model calls or external websites)、L133 结尾打印 PASS: N browser guard checks; no model calls |
| 本地 fixture 冒烟脚本 | scripts/smoke.py | L1 文档字符串(付费 API)、L19 --max-actions(默认 15)、L25 打印 trace 目录 |