Skip to content

📄 补充 Agent 自主操作边界、指令冲突裁决与人类可读写作规范 - #1728

Merged
CodFrm merged 1 commit into
scriptscat:mainfrom
cyfung1031:claude/agent-autonomy-contract
Sep 7, 2026
Merged

📄 补充 Agent 自主操作边界、指令冲突裁决与人类可读写作规范#1728
CodFrm merged 1 commit into
scriptscat:mainfrom
cyfung1031:claude/agent-autonomy-contract

Conversation

@cyfung1031

@cyfung1031 cyfung1031 commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

N/A — 不对应单个 issue;尚无人工复核。Changes tested 指文档验证,不是产品测试,见「验证」。

背景

我们的 agent 文档把「改动要达到什么质量」写得很全,但漏了三件事,而这三件事恰好决定 agent 用起来舒不舒服。

一、文档从没把 agent 写成决策者。 decide 的每一处主语都是别的东西:

git grep -nE 'decide[sd]? by|decides whether' -- AGENTS.md docs/
#   AGENTS.md:53   … is decided by the classification table in …
#   AGENTS.md:142  The root-cause principle decides whether …

proceed 也一样,要么是许可,要么是限制。整套文档是约束语料,从未授予判断权,所以 agent 遇到自己完全能解决的
判断题时会写成「建议」交回来——把活推回给人。本 PR 前两版自己就这样:发现 PR 模板缺 checklist 诚实性提示,
却写成「应由维护者决定,不属于本 PR 范围」。那不是审慎,是把一行可回滚的编辑推给别人。本版直接做掉了。

二、写给人看的东西该怎么写,全套文档一个字都没有。 develop.md 的 Language Conventions 只管用哪种语言。
pull-request.md 给的是九级标题骨架 + 七项决策链 + 十行证据表——一张表格。Agent 会把表格填满,
于是产出前三版这份 PR 描述那样的东西:两百行、四个表格、同一件事在五个章节里各说一遍。人读起来很累。

三、几个具体的分歧点,都能在 main 上 grep 复核。material 是决定「要不要写七段 rationale chain、
要不要风险段、能不能算 ready」的门槛词,被引用九次、从未定义,而且 pull-request.md:77
“needs only the material parts” 用的还是另一个意思。测试失败的例外在常驻的 AGENTS.md 里只有两条,
owner 的分类表实际有六种处置,其中 Flaky 和 Misclassified integration 两种不在例外里——
「popup.test.ts flaky,修稳定」按常驻文件读要改生产代码,按 owner 读多半是修测试隔离。
路由表是一次性分类,跨边界的重命名做到一半发现该读架构文档时,没有规则叫你回去。
执行期没有冲突裁决规则(DOC-MAINTENANCE.md 那套是给改文档的人用的),agent 只能静默选边。
「人工指令能覆盖什么」也没写——面对「先 as any 顶一下」,手上是三块互不衔接的文本。

本次改动

给 agent 判断权,同时把边界写清楚。AGENTS.md## Autonomous operation 改成「acting as much as the
bounds on it」,并新增两条:Decide inside the scope you were given 区分三种被混为一谈的情况——不知道就去查
(自己能回答的不算问题)、还不可知就取最省的合理读法并写明假设、无权决定才是升级;难度、歧义、
一般风险不是授权问题。Hand a decision back only with its owner and its blocker named 要求升级时指名谁拥有该决定、
只有他们能提供什么、没回音时你的默认动作;顺带发现的事,任务确实需要就做掉,只是恰好在旁边就记 follow-up,
边界是 scope discipline 而不是你打开了哪些文件。把本可做完的事写成「建议」不是更轻的选项,是更小的交付物。

新增 ## Writing for a human reader:写到读者的下一个决定为止;散文是默认,结构要自己挣来位置;
每件事只说一次;靠取舍变短而不是靠省略——查过的检查、限制、不确定性一个都不能删。
配套把 pull-request.md 的结构说明改成「待考虑项,不是待填表格」,并点明描述比 diff 还长通常已经帮倒忙。

其余是修正已有规则:前言补指令冲突裁决与人工指令的覆盖边界(可豁免 preference,不满足写成禁止的规则;
说明一次,被重申则执行并记为具名的已接受偏离);路由改成持续的;测试失败例外整体交给 owner 分类表裁决,
链接改指 #cleaning-up-tests-safelypull-request.md:77 一处 materialrelevant 消除一词两义。
新增 material 的可操作定义、声明范围与最终 diff 的绑定、不稳定检查结果的报告口径
(绿色重跑不撤销红色运行)、临时性修复必须自我披露、禁止自造 oracle,以及 DOC-MAINTENANCE.md
Instruction budget(约束以后往这套文档里加规则,也约束本 PR 自己)。

.github/pull_request_template.md 加了三行不渲染的注释:只有真做了才勾、Code reviewed by human 指人
而不是作者自己的 agent、不适用就留空并写一行 N/A — whypull-request.md 要求模板保持 lightweight
并保留 Checklist,两条都守住了——去掉全部 HTML 注释后模板输出与改前逐字节相同。它是唯一能触达
不读 AGENTS.md 的外部 agent 的位置。若认为模板一个字符都不该动,删掉这三行即可。

已知限制

这是静态审查。上面每条都能在 main 上 grep 复核,属可验证的文本事实;但「改完之后真实模型行为会变好」
本 PR 不提供证据。我用任务 trace 走查了这些分歧点(flaky 测试、as any 豁免请求、跨边界重命名、
一行修复的 materiality、owner 间冲突、以及本 PR 自己的 deferral 和这份描述本身),trace 用于定位文本缺陷,
不构成验收依据——本 PR 新增的规则之一就是禁止把自造评分当 oracle,所以这里没有分数。

material 的定义放在 AGENTS.md(shared contract),pull-request.md 靠常驻加载继承。
若认为该由 pull-request.md 拥有,位置可以调,但不该两处各写一份。

建议审查重点

  1. Decide inside the scope you were given 的三分法是不是你们要的升级门槛。
  2. Hand a decision back 与 scope discipline 的边界:现在切在「任务确实需要就做,只是在旁边就记 follow-up」。
  3. ## Writing for a human reader 会不会和 pull-request.md 的证据要求打架——写的是「靠取舍变短,
    不靠省略」,查过的检查和限制不许删,请确认这个防线够不够。
  4. 测试失败规则改交 owner 分类表后,AGENTS.md 是否仍保住足够强的非可协商部分。
  5. PR 模板那三行注释是否接受。

验证

只改 Markdown。pnpm run lint 的 prettier 只覆盖 **/*.{ts,tsx,js,jsx,mjs},Markdown 不在其内,
所以跑的是 pull-request.md#documentation-only-prs 要求的文档验证。

base 61164f6920e736fd3a03b269fb907e7aa7975432 → head 017872bf2b8c4a33ba6bf4b30861c4f665d9fa55

git diff --numstat        .github/pull_request_template.md  +4/-0
                          AGENTS.md                        +101/-5
                          docs/DOC-MAINTENANCE.md           +10/-0
                          docs/develop.md                    +6/-0
                          docs/pull-request.md              +10/-2
                          5 files changed, 131 insertions(+), 7 deletions(-)

链接完整性   DOC-MAINTENANCE.md 的 one-shot 脚本,HEAD 全部 tracked Markdown → 0 BROKEN
锚点         #cleaning-up-tests-safely / #revision-scope-and-publication-binding /
             #decision-evidence-and-readiness → 各 1 命中
重复标题     ## Autonomous operation、## Writing for a human reader 仅在 AGENTS.md;
             ## Instruction budget 仅在 DOC-MAINTENANCE.md
模板渲染     去掉全部 HTML 注释后与改前逐字节相同,Checklist 三项与顺序未动
政策一致性   绝对语气 grep 命中 6 处,逐条确认为有意的 non-negotiable
术语         'material' 在 pull-request.md 的第二种含义已改为 "the relevant parts"
隐私扫描     clean
行宽         新增行均 ≤120 列

未跑 pnpm test / pnpm run lint / pnpm run build:不触及产品代码、测试、生成文件或翻译,
且本 worktree 无 node_modules,Markdown 也不在这些检查范围内。无 UI 变更。

🤖 Generated with Claude Code

@cyfung1031
cyfung1031 force-pushed the claude/agent-autonomy-contract branch from 1b8f0de to e402b18 Compare September 5, 2026 05:09
@cyfung1031 cyfung1031 changed the title 📄 补充 Agent 自主操作边界与指令预算 📄 补充 Agent 自主操作边界、指令冲突裁决与关键术语定义 Sep 5, 2026
@cyfung1031
cyfung1031 force-pushed the claude/agent-autonomy-contract branch from e402b18 to e6cfaa7 Compare September 5, 2026 05:16
现有 agent 文档规定了改动的质量门槛,但缺三层:agent 在两次人工决策之间可以自行做什么、
指令冲突如何裁决、以及写给人看的东西该怎么写。静态审查的依据:
整套文档没有一处把 agent 写成决策者(`decide` 的主语全是分类表或原则),因而产出「建议生成器」;
`material` 作为门槛术语被引用九次却从未定义,且在 pull-request.md 内有两种含义;
测试失败例外在 AGENTS.md 概括成两条而 owner 定义了六种;路由表是一次性分类;
人工指令能覆盖什么没有成文;以及全套文档没有任何一条关于行文的规范,
而 pull-request.md 提供的九级标题骨架会被当成表格来填。

本次补齐:范围内自行决策、交还决定须指名归属与阻塞点、不写可查证却不查的保留意见、
指令冲突裁决与人工指令覆盖边界、连续路由、`material` 定义、测试失败例外改交 owner 裁决、
自主操作边界、不稳定结果报告口径、面向人类读者的写作原则、文档集自身的指令预算。
PR 模板补一条不渲染注释;pull-request.md 明确其结构是待考虑项而非待填表格。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@cyfung1031
cyfung1031 force-pushed the claude/agent-autonomy-contract branch from e6cfaa7 to 017872b Compare September 5, 2026 05:22
@cyfung1031 cyfung1031 added the P1 🔥 重要但是不紧急的内容 label Sep 5, 2026
@cyfung1031 cyfung1031 changed the title 📄 补充 Agent 自主操作边界、指令冲突裁决与关键术语定义 📄 补充 Agent 自主操作边界、指令冲突裁决与人类可读写作规范 Sep 5, 2026
@cyfung1031

cyfung1031 commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator Author

@CodFrm 你 agent 提交的那些还没合并的 PR,建议先把这个 PR 合并掉,然后再基于最新代码重做一下那些 PR。

Comment thread AGENTS.md
entity — read that owner then, before continuing. For tasks matching none, inspect `docs/README.md` and nearby
implementation/tests before inventing a rule or abstraction.

## DeepWiki Context

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

没有使用了,清理掉相关的内容好了,并不是所有人都用这个工具

Comment thread AGENTS.md
useful location, and actionable contract to restore; do not turn an unverified repository assumption into a
finding.

## Autonomous operation

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

能否收进docs里面的文档,agents.md 和 相关的文档又开始膨胀了

@CodFrm

CodFrm commented Sep 7, 2026

Copy link
Copy Markdown
Member

能否收进docs里面的文档,agents.md 和 相关的文档又开始膨胀了,或者精简/优化之类,agent pr的时候也要求pr的内容精简准确,不然一大段话也难读

不过我认可你这个pr的价值,我后续的pr可以看看效果,我先合了

@CodFrm
CodFrm merged commit 58391fb into scriptscat:main Sep 7, 2026
9 of 10 checks passed
CodFrm added a commit that referenced this pull request Sep 7, 2026
* 🐛 restore ScriptCat registration health checks (#1724)

* 🐛 修复 @run-at context-menu:设置覆写不生效、菜单注册不上、脚本体自己的菜单被屏蔽 (#1718)

* 🐛 修复设置面板覆写运行时机在重新注册后失效

restoreJSCodeFromCompiledResource 用脚本自带 metadata 选择编译分支,
而设置面板改运行时机/early-start 只写 selfMetadata,导致全量重新注册
(扩展更新、切换启用脚本、改黑名单等)后覆写被丢弃:context-menu 脚本
恢复自动执行且不注册菜单项,early-start 退化为普通注入。

pushValueUpdate 判断 early-start 时同样只看自带 metadata,覆写而来的
early-start 脚本在 GM 值变更后不会重新编译,预注入代码里的值会过期。

close #1649

* 🐛 修复 GM API 权限校验忽略用户覆写的运行时机

GMApi.parseRequest 直接把 scriptDAO 里的原始 Script 放进 GMApiRequest,
metadata 没有合并 selfMetadata。PermissionVerify 对 context-menu 脚本的
GM_registerMenuCommand 免 @grant 豁免因此判不出来,浏览器里表现为
verify error {"api":"GM_registerMenuCommand","error":"permission not requested"},
菜单项注册不上 —— 即 #1649 里「上下文菜单中没有出现执行选项」。

真实浏览器验证记录见 e2e/scratch/run-at-override/report.md(未入库)。

* 🐛 context-menu 包装不再屏蔽脚本体自己的 GM_registerMenuCommand

@run-at context-menu 的包装把脚本体塞进菜单回调时,回调开头把
GM_registerMenuCommand 连同 window./GM. 上的引用一起置为 undefined。
于是任何在脚本体里注册菜单的脚本,点菜单执行就会
TypeError: GM_registerMenuCommand is not a function 当场中断,
它自己的菜单项也永远注册不上——用户看到的是「GM_registerMenu 的菜单显示不出来」。
该置空还会污染页面 window 与该脚本的 GM 物件,且是持久的。

去掉这行,脚本体里的菜单注册照常工作。代价是脚本体每次被点执行都会重新注册
一次,内部条目累积(显示层按 groupKey 去重,不会出现重复菜单项,但同名项的
回调会被触发多次)。

真实浏览器验证记录见 e2e/scratch/ctx-menu-{display,fix}/(未入库)。

* ✨ 统一 example/tests 测试结果与人工验证反馈 (#1717)

* ✨ 统一 example/tests 测试结果与人工验证反馈

* 🔒 固定 sctest CDN 引用到框架提交

* 🎨 统一 userscript 诊断面板与测试描述

* 🔒 固定 sctest CDN 引用到最新框架提交

* Update sctest.js

* 🔒 固定 sctest CDN 引用到最新框架提交

* ✨ 增强统一测试诊断与面板反馈

* 🔒 固定 sctest CDN 引用到最终框架提交

* ✨ 优化 sctest 诊断面板与 frame 反馈

* 🔒 固定 sctest CDN 依赖版本

* ♿ 优化 sctest 面板可访问性反馈

* 🔒 重新固定 sctest CDN 引用

* 🎨 优化 sctest 面板指标与布局

* 🔒 固定指标优化后的 sctest CDN 引用

* 🐛 固定 sctest 耗时显示宽度

* ✅ 加固 UI 异步断言与 E2E 保存结果观察 (#1727)

* test: stabilize heavy network rules UI cases

* test: isolate UI files and await observable state

* ✅ 保留 UI 测试原有隔离配置

* ✅ harden async test observations

* 🐛 align E2E save expectations with failure cases

* 🔍 tighten test guard binding and toast observation

* 📄 补充 Agent 自主操作边界、指令冲突裁决与人类可读写作规范 (#1728)

现有 agent 文档规定了改动的质量门槛,但缺三层:agent 在两次人工决策之间可以自行做什么、
指令冲突如何裁决、以及写给人看的东西该怎么写。静态审查的依据:
整套文档没有一处把 agent 写成决策者(`decide` 的主语全是分类表或原则),因而产出「建议生成器」;
`material` 作为门槛术语被引用九次却从未定义,且在 pull-request.md 内有两种含义;
测试失败例外在 AGENTS.md 概括成两条而 owner 定义了六种;路由表是一次性分类;
人工指令能覆盖什么没有成文;以及全套文档没有任何一条关于行文的规范,
而 pull-request.md 提供的九级标题骨架会被当成表格来填。

本次补齐:范围内自行决策、交还决定须指名归属与阻塞点、不写可查证却不查的保留意见、
指令冲突裁决与人工指令覆盖边界、连续路由、`material` 定义、测试失败例外改交 owner 裁决、
自主操作边界、不稳定结果报告口径、面向人类读者的写作原则、文档集自身的指令预算。
PR 模板补一条不渲染注释;pull-request.md 明确其结构是待考虑项而非待填表格。

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* 🐛 批量更新页打开更新详情复用检查缓存并挡住重复点击 (#1719)

* 🐛 批量更新页打开更新详情复用检查缓存并挡住重复点击

点击脚本名查看更新时,openUpdatePageByUUID 会重新 fetch 一次脚本代码,
而这份新版代码在检查更新阶段已经存进 scriptUpdateCheck 的记录缓存里
(行内「更新」按钮装的就是它)。用户因此要为每次点击白等一次网络往返,
期间页面又没有任何反馈,连点几下就会开出多个安装页。

- SW: 拆出 prepareUpdateOrInstallPage,openUpdatePage 命中缓存代码时
  跳过 fetchScriptBody;openUpdatePageByUUID 改为回报 boolean
- 页面: 打开期间行内转圈并同步挡住重复点击,失败弹 toast,
  点击脚本名同样取消自动关闭倒计时

* 🐛 更新页与安装页补齐骨架屏与异步中间态,失败不再被渲染成成功 (#1721)

* 🐛 打开更新详情区分静默更新,忽略动作补齐逐条回执

页面此前无从判断服务端到底做了什么:openUpdatePageByUUID 在命中静默更新时
不开安装页却同样返回 true,用户点完脚本名只看到转一圈、什么都没发生;
IGNORE 分支根本没有返回值,页面只能 fire-and-forget。

- openUpdatePageByUUID / openUpdatePage 返回 "opened" | "silent" | "failed"
- IGNORE 逐条回报结果。忽略写的是脚本自身的 ignoreVersion,与检查缓存无关,
  因此缓存随 Service Worker 回收后忽略照样生效,这里如实回报而不是谎报失效
- checkScriptUpdate 的结果收敛成 TCheckScriptUpdateResult 并用 reason 区分
  「已有检查在跑」与真正的失败,页面才能分别提示

* 🐛 安装页补齐加载分档、代码骨架与提交忙态

从批量更新页点脚本名进来的必然是「更新」,加载屏却把上下文 chip 写死成
「脚本安装」,几百毫秒后再闪成「脚本更新」;描述写着「正在从来源下载」,
但这条入口的代码 Service Worker 早已备好,根本不下载。

- 状态屏按来路分档,未确知场景不渲染 chip(不猜),并补一条与就绪态操作栏
  等高的底部占位,避免就绪瞬间内容区高度再跳一次
- 暂存代码被定时清理回收时落到专属终态,出口换成「重新检查更新」——
  原来的「重试」在这个最常见的失败原因下重试多少次都是同一结果
- Monaco 实例就绪前渲染代码骨架,替代此前 340px 的纯空白
- toggleWatch / rejectExternalAccess 补忙态,install 加重入守卫:
  这两个动作全程不置忙态,连点会发出两次安装/两次决定

* 🐛 批量更新页补齐取数失败、检查空窗期与忽略/批量的中间态

取数失败时记录仍是空的,页面直接走到空态,把一次加载失败渲染成
「所有脚本均为最新(已检查 0 个脚本)」这条与事实相反的成功终态;
点「检查更新」到服务端广播回来之间页面完全静止,期间可以连点。

- 取数失败落错误终态:等宽 detail 框 + 重试 / 脚本列表出口
- 主动检查由本地 pending 立刻接管忙态,并把服务端的「正忙」「结果够新已跳过」
  「通道异常」三条回执分别说出来;跳过时就地清掉待反馈标记,
  否则会在下一次后台检查完成时冒出一条用户没点过的 toast
- 忽略复用与更新相同的行级阶段(working → success → 退场),不再 fire-and-forget
- 批量进行中互斥(行内勾选、两个批量按钮、全部恢复),避免两条进度互相覆盖;
  被「结果失效」中断时保留已完成条数,不把汇总抹掉
- 骨架补齐工具条(桌面)与顶部选择栏/底部操作栏(移动)占位,消除数据到达时的
  布局跳动,并加 role="status" / aria-busy;空态下重新检查不再整页闪回骨架
- 脚本名改用 aria-disabled + onClick 早退:disabled 会让浏览器不派发指针事件,
  正好在名字被截断、最需要看全名时把 tooltip 一起关掉,键盘触发后焦点还会掉到 body

---------

Co-authored-by: wangyizhi <yz@ggnb.top>
Co-authored-by: cyfung1031 <44498510+cyfung1031@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P1 🔥 重要但是不紧急的内容

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants