跳到主要内容

Web Device 评审模式:所见即所得,当场 review

ArcBlock
Web DeviceDeveloperAFSARCAFS UI

开启评审后的文章页:右下角磨砂玻璃岛,三个图标分别是 Point、Page note、Freeze

本地 Web Device 浮层,arc#4525 之后 · 本篇文章加 ?review=1 · 1440×900 · 2026-08-21。没选文字、没开 Page note 时,整页 chrome 就是这一块岛。状态条空着就被藏起来。

先讲一个你会遇到的下午

你在改一页产品 landing。lint、validate、check、build 全绿,PR 也过了。打开本地渲染出来的页面,还是觉得 hero 太空、某段在真实导航下面显得怪、中文版某一句突然太长。

问题不在「文件有没有写对」,而在读者会看到的那一屏。你脑子里的修改意见是 on the spot 的:「这里写长一点」「删掉这句」「换一个更具体的例子」。

以往这些话往往进了 PR 评论、Slack,或记在自己本子上。agent 看不到选区,也接不上「改哪一段」。

页面内评审模式做的就是这件事: 在所见即所得的成品页上,当场点选、当场写 review 建议;建议变成内容旁边的可执行指令,人和 agent 可以一起改,而不是你看页面、agent 只看源码,两边对不上。

它不是访客留言板,也不是又一套独立评论产品。本地给 URL 加上 ?review=1 才出现,给写作期用。

2026 年 8 月浮层换过一版。最早对外的那版是左下角 Page note 加一条一直挂着的状态栏,合同是对的,看起来像调试条扣在页面上。现在的玻璃岛还是同一份合同,只是不再抢戏。

完整操作合同见文档:页面内评审模式。下面用真实截图走一遍这个场景。

为什么必须对着「渲染后的页面」评

写 Web Device 站点时,自动化关卡擅长抓结构问题:DSL 错了、source 绑错了、链接断了、预渲染失败。

但有一类判断,关卡再绿也替不了你:

  • 源码里的句子「看起来还行」,套上真实 header 和版式之后突然显得空;
  • 三张 landing 并排,才看出共用骨架重复得难看;
  • 检查都过了,你只在 /zh/ 的成品渲染里看出某段太长。

评审对象是浏览器里的成品页。页面内评审把「我看到了什么」和「我要它变成什么」写在同一处,并留给 agent 一条可执行的路径。

打开之后长什么样

本地跑起 blocklet(例如 arc blocklet run 或已有 arc service),在任意已渲染页面的 URL 后面加上:

text
?review=1

必须是字面量 review=1。写成 true 或 yes 都不会开。

右下角会出现一块磨砂玻璃岛,三个图标,不再分两个角落:

图标控件干什么
指针Point需要先打开。点带 data-aup-id 的 AUP 节点,或拖一个框;关掉时不抢走页面上的普通点击
气泡Page note不针对某段文字的整页意见
暂停Freeze暂停 CSS 动画、transition 和视频,好对着某一帧写

左下角那颗 Page note 没有了。状态条(Review: open · N planned / N done、语言勾、Approve page)还在浮层里;空的时候不显示,登录会话读到 .review/.actions/state 之后才填。匿名 ?review=1 仍然可以选字、开 Page note、写指令。

Point 默认是关的。这是故意的:评审一张活页面时,你得还能点页面上的真链接。

场景一:对某段文字写意见(锚定反馈)

  1. 用鼠标选中页面上一段正文(读者真正看到的那串字)。选字不必先开 Point。
  2. 选区附近弹出浅色输入框:上方是选中预览,中间是类型,下面是指令和 Add / Cancel。
  3. 选一个类型,写清要 agent 或同事做什么,提交。

选中正文后弹出浅色输入框:instruction 为当前类型,底部是 Add 和 Cancel

同一环境。选中 “what-you-see-is-what-you-get page, leave” 之后,面板带上选中原文;类型是可执行动作,不是聊天标签。

类型你在说什么典型指令正文
instruction自由指令「写具体一点,加一个真实命令示例」
delete删掉选中内容(可不填正文)
replace用正文替换选中内容替换后的目标文案
insert-after在选中内容后面插入要插入的文案

选中时系统还会记下选区前后约 50 个字符,用 {selected} 标出位置。以后正文改了,仍可用这段上下文找回去,而不是只靠「整页第一次出现的同一句话」。

Point 是第二种动作,不是用来取代选字。先打开指针,再点带 data-aup-id 的节点(AUP 渲染出来的节点)。Shift / meta 连点可以加节点;拖框可以罩住多个,也可以罩住空白。2026-08-21 在这篇文章的 markdown 正文上数到 零个 data-aup-id,所以 Point 没有可悬停的目标;选字仍然可用。不要把 Point 理解成「任何页面随处一点」。

场景二:整页写一句(Page note)

有些意见不落在某一句上:「这一整页太长」「和上一张 landing 的骨架撞车了」。点岛上的气泡,不选文字也能提交。

点击 Page note 后的面板:预览为 page note not anchored to a selection,玻璃岛仍在

Page note 不绑定选区。适合整体节奏、结构、跨页比较这类反馈。

画面只存在一瞬间时,用 Freeze

CSS 动画和视频不好评:你要写的那一帧,话还没写完就没了。Freeze 会暂停动画、transition 和 <video>。岛本身还活着,所以仍可以打开输入框。

评审岛 Freeze 已打开(暂停图标填实)

Freeze 是评审辅助,不是 design mode,不会改 CSS。再点一次同一图标关闭(标签变成 Unfreeze)。

意见必须落在内容旁边

浮层只是循环的一半。Slack 里一张截图、复制出来的 selector、PR 上一条评论,都还是你看着页面、agent 看着文件。

Web Device 把意见写成文件,放在内容项旁边,agent 用的还是同一棵 AFS 树。你留下的是 instruction / delete / replace / insert-after / page-note,位置就是站点源码所在的位置。一段文字的身份是读者看见的那串字,加上前后大约五十个字符的 {selected} 上下文,不是指望下次改版还能对上的 CSS selector。

第一版浮层是对的,也吵。玻璃岛还是同一份合同,只是更安静:Point 要先打开,输入框贴在目标旁,Freeze 能按住一帧,空的状态条直接藏起来。这是 chrome 的变化,不是新产品。

提交之后:两级状态

登录会话能读 .review/.actions/state 之后,状态条会列出 open 项和摘要。你可以:

  • 点某一行的 Done,表示这条已经处理完(或再 Reopen);
  • 点 Approve page,表示整页作为一页签过字了(可 Reopen page);
  • 点 Run checks,把本页的 lint / SEO 发现和人工意见放在一起看。

两级状态不要混:

层级含义取值
页面这一页整体是否批准open / approved
条目这一条意见是否处理完open / done

新提交一条反馈时,若页面已经是 approved,会自动降回 open:签过字的页面不能在还有新意见时静默保持通过。

这次 2026-08-21 的截取是匿名的。上面的岛和输入框是活的;填满的状态条不在这些图里,因为空条会被藏起来,而且没有会话上下文就不会去拉条目。这是 chrome 事实,不是产品缺了一块。

意见存在哪里(为什么 agent 用得上)

反馈不进全站评论库,也不另起一套 HTTP API。它跟内容项同目录:

text
content/docs/web-device/overview/
  content.md
  content.zh.md
  .review/
    a1b2c3d4.md      # 一条反馈
    .status.md       # 页面级 open / approved

单条文件大致是:

markdown
---
status: open
type: page-note
locale: en
author: anonymous
created: 2026-08-21T…
---
Hero feels thin under the real header: add one concrete example.

锚定反馈还会多 anchor 与 context 字段。Point 出去的条目还可能带 aupId、bbox 或附近文本。locale 记录你提交时看的是哪个语言版本的 URL(多语言站点上很重要)。

本地可用 AFS 列出或读回(路径按你的站点名替换):

bash
arc afs ls /web/content-sites/<site>/collections/docs/web-device/overview/.review
arc afs exec /web/content-sites/<site>/collections/docs/web-device/overview/.review/.actions/state

agent 的工作流可以是:读 .review/ → 按 type 改 content.md → set-item-status 标 done → 人再 Approve page。

发布时 .review/ 不会进公开产物。 评审数据留在写作树;deploy 快照会排除名为 .review 的目录。公开访客也不会因为 URL 上碰巧带了参数就看到一整套可写评论面(可写内容面只在本地/开发工作流里)。

建议工作流(所见即所得 → 当场意见 → 一起改)

  1. 结构先绿:arc dsl lint / validate / blocklet check,必要时 build。结构都不过时,先别开评审。
  2. 打开读者会看到的那一页(本地渲染),URL 加 ?review=1。这就是所见即所得的评审面。
  3. 当场点选:看着成品页写意见,不要切回源码猜。句子级用锚定反馈,整页问题用 Page note;只有节点真有 data-aup-id 时才用 Point。
  4. 交给 agent(或自己)按指令改:agent 读 .review/,按 type 改 content.md / 页面,再标 Done;你也可以手改后标 Done。
  5. 多语言时(状态条加载之后)看 Locales,打开 /zh/、/ja/ 等同样带 ?review=1 的成品页补意见。
  6. 整页满意后 Approve page;正式发布走原来的路径。.review/ 不会进公开产物。

什么时候不该用

情况更合适的做法
AUP 解析失败、组件缺失、source 为空先修 lint / validate / check,见诊断站点
需要公开用户讨论或评分用产品自己的评论/讨论能力,不是 ?review=1
多人同时改同一段、必须自动合并意见本模式故意不合并相反意见,全部保留给人判断
只想在 PR 上讨论实现细节GitHub review 仍合适;本模式补的是「渲染页上的文案/版式判断」

继续阅读

本页涉及

术语

  • AFS

    AFS(Agentic File System)把与任务有关的文件、服务和正在进行的工作组织成可查看的资源视图。它不是把一整台机器或一堆 API 交给 agent,而是给任务一块有名字、有边界的工作范围。

  • AFS UI

    AFS-UI 在 AFS 可寻址的资源之上构建界面。人通过渲染出的界面操作,agent 可以通过路径检查和操作界面开放的结构。AUP 描述界面及其交互,Web Device 等 UI 设备负责呈现。

  • Web Device

    在 AFS 目录下声明一个 .web/,这个目录里的数据和 AUP 就会在服务端被渲染成一个网站。