协调共享浏览器或桌面的编程智能体

使用 AI 辅助编写与复核。

本文目录

为共享浏览器操作单独指定负责人,并留下交接记录。两个编程任务即使使用各自的工作树,也可能仍依赖同一个可见窗口、当前聚焦的输入框,或同一条桌面输入路径。在任何一方发送下一次界面操作之前,先确定谁可以操作、它刚刚检查的是哪个目标,以及什么条件会结束这一轮。

一条关于并行计算机操作的公开功能请求提出,希望“两个智能体请求使用同一应用时,有可见的队列或锁”。这是一项被提出的协调需求。它不能证明当前智能体宿主提供哪些功能、报告中的环境现在是否仍有相同行为,也不能说明问题有多普遍。

下例使用人工协调人和无害的虚构页面。轮次标签只是笔记中的条目,不是原生租约,也不是操作系统锁。为了编写这些历史,没有操作浏览器、账户、桌面、智能体宿主或工作树。

除了代码,也要映射共享界面

虚构的 Fern 项目有两个编程任务,共用一个浏览器窗口。路径和 .invalid 地址只是示意标识,不是要打开的资源。

任务 归属工作树与分支 界面目标 要求的交付
A · 卡片间距 /fictional/fern-layout,分支 layout-gap https://layout.example.invalid/cards,横幅 FERN LAYOUT / L-17 spacing-check.md:检查指定预览中的网格叠加层
B · 空状态文案 /fictional/fern-copy,分支 empty-copy https://copy.example.invalid/empty,横幅 FERN COPY / C-08 copy-check.md:检查指定预览中的本地草稿措辞

两个任务都指向同一个界面资源 BR-1:同一虚构桌面上唯一可见的浏览器窗口。页面可以有两个标签页,但本例没有已核验的原生窗口或标签页标识,也没有已核验的工具与目标绑定。人工标签 BR-1 不会创造这些能力。

Git 的工作树手册介绍了与一个仓库关联的多个工作树,包括索引和 HEAD 等各工作树独立的状态。这确定的是代码管理边界。在本例中,浏览器使用权是另一项应用工作流决定:给 A 和 B 分配不同目录,并没有给它们分配不同的输入目标。

两个页面的示例定义足以展示一次焦点错误:

页面 初始状态 允许的本地检查
Layout L-17 Show grid 复选框未勾选 聚焦该复选框并切换一次;观察叠加层;不编辑其他控件
Copy C-08 Empty-state draft 文本区包含 Nothing here yet.,光标在末尾 仅将这份本地草稿替换为 No cards yet.;检查它;不保存、提交或发布

共享资源也包括焦点。MDN 的 keydown 参考文档说明,按键事件以当前聚焦的元素为目标,并且可以冒泡。记忆中的截图或打算操作的输入框,都不能为下一次键盘输入预留目标。

分开记录已知与未知的身份信息

交出输入操作权之前,先使用一张资源卡:

资源标签:BR-1(仅为人工笔记标签)
范围:一个共享的可见浏览器窗口及其桌面输入路径
协调人/操作者:M
候选任务:A、B

虚构设定中已知的信息:
- A 请求的 URL 与横幅:layout.example.invalid/cards;FERN LAYOUT / L-17
- B 请求的 URL 与横幅:copy.example.invalid/empty;FERN COPY / C-08
- 两者请求使用同一个窗口资源

为下一步重新检查之前仍未知的信息:
- 当前哪个页面和控件拥有焦点
- 预期的预览版本是否仍然可见
- 自上次观察后,是否有其他操作者改变过窗口

本例尚未确立的能力:
- 原生窗口/标签页 ID,或有文档依据的自动化目标绑定
- 任何原生锁、隔离桌面、租约到期或输入队列取消 API

选定的操作方式:
M 人工执行界面步骤,每次只处理一项有明确边界的请求。
A 和 B 提交请求并阅读返回的笔记;它们不发送设备输入。

URL 和横幅有助于 M 检查页面,但不能替代自动化工具的原生目标绑定。如果无法可靠识别 URL 或预期窗口,即使人工步骤也要等待。如果某个实际宿主提供适用且有文档依据的绑定,应先记录其文档规定的范围,再改变这种操作方式。本指南不声称当前 Codex 版本具备或缺少这种能力。

走完一次完整的焦点冲突历史

下面是不安全的虚构历史。它刻意允许两个智能体都发送未绑定具体目标的输入。起点是复选框未勾选,文案草稿与上文完全一致。

步骤 预期操作或中途事件 当时的可见目标 这段虚构历史中的预期后果
F1 A 检查 L-17,并聚焦 Show grid Layout L-17 复选框 A 准备按一次空格键来切换叠加层
F2 B 将共享窗口切换到 C-08,并聚焦草稿 Copy C-08 文本区,光标在末尾 A 先前对目标的观察已经过期
F3 A 未绑定具体目标的空格输入被送达 Copy C-08 文本区 草稿变为 Nothing here yet. ,末尾多一个空格;布局复选框不变
F4 A 把输入送达当成完成网格检查的证明 仍是 Copy C-08 这个结论没有依据;不存在当前的网格观察记录
F5 M 停止两个任务进一步发送界面输入,以便调查 共享资源暂停使用 保留改变后的草稿和两份操作陈述;不要再次打字来“修复”尚未确认的目标

示例的最终状态是精确的:复选框仍未勾选,文案草稿增加了一个 U+0020 空格,两个任务都没有有效完成界面检查。这里并不声称某个特定自动化产品会这样路由输入。这个过程展示的是:允许一个操作在检查后目标已改变的情况下继续,可能产生什么后果。

如果宿主能将操作绑定到特定元素或页面,应检查其文档描述的行为,不要假定这种失败同样适用。未绑定目标的输入,是本例自身的假设。

为协调人提供五种决定

这里的占用(own),指在这份人工方案下,请求下一项有明确边界的界面步骤的权限。它不是技术性的访问控制状态。在顺序历史中,M 始终是唯一的设备操作者。

决定 何时使用 继续之前必须记录什么
占用(Own) M 允许一个任务针对已识别的目标和范围进入轮次,且没有先前的人工步骤仍在进行 任务、资源、轮次标签、精确的允许操作,以及刚完成的目标检查
等待(Wait) 另一个任务占用当前轮次、身份不确定,或先前操作的去向和结果未知 缺少什么、由谁确认;等待时不发送界面输入
让出(Yield) 占用方完成工作或到达停止点 最后观察到的页面/控件、草稿变化、未完成请求,以及该轮次下不再请求后续步骤的声明
重新检查(Reinspect) 轮次开始、焦点或导航变化、人介入,或观察已过期 当前 URL/横幅/版本、聚焦控件,以及下一项操作是否仍符合范围
撤回(Revoke) 出现意外变化、操作不确定,或人接管后,M 撤回轮次 停止请求新操作,保留已知信息,将未解决操作标为未知;资源状态核清之前,不允许下一轮进入

只有 M 确认后,让出才算完成。任务说“做完了”,不能证明先前的设备命令已经停止。在这个人工版本中,M 的待办清单包含文字请求,而不是隐藏的浏览器命令队列。如果真实部署中存在在途或排队的工具操作,只能使用其文档规定的停止和观察机制;取消请求没有回应,意味着未知,而不是队列已空。

时间限制应触发停止与状态检查。A 可能仍在操作时,不应自动给 B 一个轮次。同样,撤回笔记中的轮次,也不会强制中断已经发出的操作。如果参与者或工具不遵守约定,笔记无法强制实现互斥。

从未修改的初始状态走完顺序交接

这是一段独立历史,使用原始且未改变的示例值。它没有悄悄抹掉 F3 的尾随空格。下列所有观察和结果,都是事先给定的教学预期。

步骤 协调人的决定与操作 占用方/轮次 记录的状态与下一项条件
S1 M 收到 A 的网格检查和 B 的草稿检查请求 无 两个页面均为原始值;两项界面请求都在等待
S2 M 允许 A 进入单步检查;B 等待界面使用权 A / H1 范围仅限 L-17 Show grid;B 可以继续独立的文件工作
S3 M 选择 Layout 页面,重新检查 URL、L-17 横幅及复选框焦点 A / H1 目标匹配;复选框未勾选;没有先前人工步骤仍在进行
S4 M 为 A 切换一次复选框,并观察叠加层 A / H1 复选框已勾选;文案草稿仍为 Nothing here yet.;A 的笔记记录指定版本和这项预期
S5 A 让出 H1,报告复选框已勾选,且 H1 下没有剩余请求 M 确认前仍是 A / H1 M 核清已完成的人工步骤,并记录 H1 请求已结束
S6 M 确认让出,然后允许 B 进入轮次 B / H2 H1 不再适用;B 必须在输入前检查自己的目标
S7 M 选择 Copy 页面,重新检查 URL、C-08 横幅、草稿值和焦点 B / H2 草稿仍为 Nothing here yet.;没有 Layout 操作被带入 H2
S8 M 仅替换那份本地草稿,并检查结果 B / H2 草稿变为 No cards yet.;网格仍已勾选;没有保存或提交任何内容
S9 B 让出 H2;M 核清步骤并确认 无 没有待处理的人工界面请求;最后页面为 Copy C-08
S10 M 向两个任务返回各自范围内的笔记 无 A 的网格观察与 B 的草稿观察分别记录;两者都不声称已生产发布或仓库验收

H1 和 H2 是人工轮次标签,不是隔离令牌(fencing tokens)。这个过程假定参与者合作,且有明确边界的人工步骤进行期间,没有外部操作者改变窗口。出现意外变化时,应进入撤回分支,不能为了继续走完表格而忽略它。

让未知与撤回分支真正可用

如果 M 到了 S3,却看到不同横幅,或无法确定当前哪个窗口处于活动状态,H1 不切换复选框。记录 target_unknown,让 B 继续等待,并要求重新建立目标映射。熟悉的标签页标题还不够。再次允许新轮次进入之前,新的检查必须识别预期页面和版本。

如果 H1 已获准进入后,发生意外导航或人接管,M 将 H1 记为已撤回。A 停止请求 H1 操作。已经发出但状态尚未核清的操作,仍为 outcome_unknown;M 不推断它失败,也不在新聚焦的控件上重复执行。记录已有观察,利用实际宿主文档规定的能力核对该操作状态,然后才考虑新轮次。人接管时,不应争抢焦点。

要完整让出,可以使用这样一张简短卡片:

任务/资源/轮次:A / BR-1 / H1
已完成的允许步骤:切换一次 L-17 Show grid
最后观察的 URL/横幅:layout.example.invalid/cards;FERN LAYOUT / L-17
最后观察的焦点/状态:Show grid;已勾选;叠加层可见
草稿变化:未请求也未在 Copy 页面进行任何修改
未完成的人工请求:无
未完成的设备操作:在这段事先给定的人工过程中为无
H1 下的下一项操作:无;等待 M 确认让出
如果实际有任何操作尚未核清:在此停止并记录 UNKNOWN

卡片报告的是一次观察,不会让观察永远保持最新。B 仍然需要 S7。复用 A 的坐标、截图或“窗口已就绪”说法,会跳过交接中的关键一步;正是这一步避免 B 的下一项决定依赖过期上下文。

复制这份有明确边界的协调请求

使用资源映射、焦点冲突历史 F1–F5 和顺序历史 S1–S10,
协调虚构的 Fern 任务 A 与 B。
不要打开 .invalid URL,也不要操作真实浏览器、账户或桌面。

任务 A:/fictional/fern-layout,layout-gap,Layout L-17 网格检查。
任务 B:/fictional/fern-copy,empty-copy,Copy C-08 本地草稿检查。
在这个设定下,独立工作树不能确立独立的界面目标。
BR-1 是人工共享资源标签,不是 API 标识符。

采用人工方式:M 是唯一界面操作者;智能体提交文字请求。
另一个轮次占用资源时,任何智能体都不发送全局按键、点击或窗口切换。
不接触共享界面的文件工作可以继续。
每个获准进入的轮次都有一个任务、目标版本、操作范围和结束条件。
M 确认让出后,才能允许下一轮进入;不因超时自动转交。

每个有明确边界的步骤之前,以及交接或意外变化之后,
重新检查实际目标和焦点。目标未知:等待,不猜测,也不通过打字探测。
撤回:停止新请求;保留已发出操作的未知结果,不重放。
如果存在真实工具队列,其已停止/空闲状态需要文档依据和证据。
人工确认不能证明原生锁生效,也不能证明操作已取消。

以后若要改为自动化,先确定所选宿主/版本,以及目标绑定、观察和停止
能力的官方文档。只使用实际已经确立的能力。
如果无法确立绑定或停止能力,就保留人工操作者方式,或停止界面工作。
不要编造 acquire/release/lease API,也不要宣称某项 Codex 功能。

返回填好的资源与已知/未知映射、两段完整历史、
own/wait/yield/reinspect/revoke 卡片,以及各任务独立的观察。
保留精确草稿字符串、F3 多出的尾随空格,以及另一段顺序示例
独立的原始起点。不要把预期写成实际运行。
本任务不包括真实部署、账户访问或生产操作。

这个约定用于组织合作,并不隔离浏览器配置文件、应用存储、账户或秘密信息。如果工作需要更强的技术边界,应在使用资源之前单独确立。清楚的交接仍然有用,因为它说明了下一项操作、操作所属的目标,以及允许另一个人继续之前所需的证据。