| name | web-pro-second-opinion |
| description | 在重要决策点 / 儿童可见内容审查时,用 owner 的两个付费网页大模型(ChatGPT web
Extended/Pro + claude.ai Max)做"双模型辩证合成"第二意见,经 CDP 直连专用 Chrome
profile 驱动,advisory-only 交 owner/工厂 gate。用于 PRD-brief / PRD / epic / 架构 /
合并方案 / 计划 等高风险决策,以及 PAOS 题包/画像/学习内容上生产前的 web-pro 门。
Make sure to use this skill whenever the user mentions "web pro"、"第二意见"、
"双模型辩证"、"两个网页模型出方案"、"ChatGPT + claude.ai 评估"、"web-pro 双审"、
"题目过 web-pro"、"dialectic synthesis"、"second opinion from web models",即使没明说
"skill"。
|
Web-Pro 双模型辩证第二意见(CDP 直连,稳定可复用)
单一真相源:正典 = ironrules skills/web-pro-second-opinion/;
~/.claude/skills/web-pro-second-opinion/ 是同步副本。改进先改正典 → 同步副本;
用前可跑 scripts/drift_check.py 核对两份一致(漂移退码 2)。
把 owner 付费但无 API 的两个网页档(ChatGPT web Extended/Pro + claude.ai
Max)当决策点的两位资深评审,经 CDP 直连(不是 Claude-in-Chrome MCP、不是任何 MCP
browser)驱动,产出辩证合成第二意见。旧法"Claude-in-Chrome MCP + deviceId 手选"
已废弃;双审 lane = ChatGPT + claude.ai(owner 2026-07-08 确认),Gemini 只是
driver 里保留的可选 lane,不属于 web-pro 门。
实机验证:专用 profile + open -na 启动隔夜持久;ChatGPT 与 claude.ai 往返均
实证取回 token(2026-07-07/08)。
硬边界(不可越)
- advisory_only:产出是给 owner/工厂 gate 的建议,绝不自动执行/签批(HP-1)。
- 发送前必过 secret-scan:任何要发给网页模型的上下文,先
scripts/secret_scan.py,
命中即 fail-closed。绝不把密钥/凭证/儿童 PII/作答流发到外部网页模型;capsule 只含
题内容(prompt/答案/rubric/concept 人类可读名)。
- 驱动 owner 自己的登录态(专用 profile 从主 profile 复制 cookie)。不创建账号、
不输密码、不点授权类不可逆控件;遇登录墙/验证码 → 停下交回 owner。
- 如实标
synthesis_mode:dual_dialectic(两 lane 都成 + 已辩证合成)/
single_degraded(只一 lane 成,明示哪个失败、未交叉验证)/ failed(两 lane 都失败,
不返回假 ok)/ manual_paste(链路整体不可用,owner 手工)。不许把降级当满血。
绝不 fallback 到 headless/CLI 模型冒充 web-pro。
- claude.ai lane 是产品级第二意见,不是铁律 5 的跨族对抗审查:驱动方若也是
Claude(如本 CLI),claude.ai 产出不能充当"另一 vendor lane"证据;跨族审查仍按
项目四 lane 规则走。web-pro 是 owner 定义的决策/内容门,两者互补不互替。
稳定运行环境(一次性建立,之后复用)
- 专用 profile(绝对路径,不用 $HOME):
/Users/evanmacmini4/.chrome-webpro
- CDP 端口:9222
- 解释器:需
websocket-client。本机只有 /opt/homebrew/bin/python3 装了
(PAOS venv 与 /usr/bin/python3 都没有)。调用一律用 /opt/homebrew/bin/python3。
- 登录复制(driver
sync-login,幂等):从主 profile
/Users/evanmacmini4/Library/Application Support/Google/Chrome 复制 Local State +
Default/{Cookies,Network/Cookies,Preferences} + Default/Local Storage/leveldb/。
同用户同 Keychain 才能解密。cookie 刷新后必须 restart(重启专用实例)才生效——
运行中 Chrome 不重读 Cookies 文件(2026-07-08 实证:重启后 claude.ai 登录态生效)。
- 启动命令(driver
ensure 幂等封装,launchd 托管,实测隔夜持久):
open -na "Google Chrome" --args --remote-debugging-port=9222 --remote-allow-origins=* --user-data-dir=/Users/evanmacmini4/.chrome-webpro --no-first-run --no-default-browser-check
(Chrome 对专用 profile 必须带 --remote-allow-origins=* 才开端口。)
- tab 自愈:Chrome 自动升级重启会丢 tab;
ensure 用 Target.createTarget 自动开
chatgpt.com / claude.ai/new(同步登录态直接开出已登录页)。
- restart 子命令:只 kill
pgrep -f "user-data-dir=/Users/evanmacmini4/.chrome-webpro"
的实例(绝不碰 owner 主 Chrome)→ 重启 → ensure_tabs。
执行流程(直接调用 driver)
0. 先自检链路活
/opt/homebrew/bin/python3 scripts/webpro_cdp.py selfcheck
逐 lane 报告 chatgpt: OK / claude: OK = 双 lane 通,可正式跑。单 lane FAIL 不阻塞
(降级模式);两个都 FAIL → 按顺序排查:ensure → sync-login + restart → 仍不行
交 owner(登录/额度)。
1. 造上下文胶囊 + secret-scan(硬门)
把"要评估什么 + 必要背景 + 要的产出形态"收敛成自包含胶囊(两模型喂完全相同
上下文,保证可比)。写 scratchpad 临时文件,跑
/opt/homebrew/bin/python3 scripts/secret_scan.py <capsule>,退码 0 才继续。
2. 双审 + 合成(driver 一条命令)
/opt/homebrew/bin/python3 scripts/webpro_cdp.py review --capsule <f> --rubric <f> --out <verdict.json>
driver 对 ChatGPT 和 claude.ai 各投喂同一胶囊+rubric,抓回评审并合成:
- 两 lane 成:任一判 p0→
p0;都 ok→ok;分歧→p1;synthesis_mode=dual_dialectic。
- 只一 lane 成:取成功 lane 的 verdict,
synthesis_mode=single_degraded + degraded_reason。
- rubric 要求模型末尾输出一行
WEBPRO_VERDICT: ok|p0|p1 + 理由,driver 解析。
证据落 .audit/reviews/webpro/<run-id>/(capsule + 各模型 raw + 合成 verdict + metadata,
metadata 含 model_observed)。
3. 交回 + 留痕
回报 owner:合成结论 + synthesis_mode + 哪些 lane 真成 + 各模型档位是否核实;诚实标
advisory_only。PAOS 题包场景:verdict 经内容发布门 ledger,p0 触发撤回、p1 家长预警、
ok 放行(见 PAOS 内容发布门 / ADR-G-033)。
已验证的 DOM 交互(driver 内部封装,勿手改;仅页面改版失效时参考)
- ChatGPT(2026-07-07 实证):输入
#prompt-textarea(ProseMirror,CDP
Input.insertText 灌,JS 设 value 无效)→ 点 [data-testid="send-button"] → 轮询
[data-message-author-role="assistant"](assistant 计数守卫 before+1 防抓旧消息)
连续 3 次稳定 → scrape。
- claude.ai(2026-07-08 实证):
- 输入:composer 是 Tiptap,
div[contenteditable="true"] 元素上有 .editor:
e.editor.commands.setContent(''); e.editor.commands.insertContent(prompt);落地确认读
e.editor.state.doc.textContent。
- 提交 = Enter 键(CDP dispatchKeyEvent rawKeyDown+keyUp, vk=13;先
e.focus()+editor.commands.focus('end'))。不要点发送按钮:后台窗口下按钮持续
显示 "Use voice mode"(window.focus 无效),点它会进 stuck 态(历史教训)。
- idle 门控:提交前后都以
aria-label 匹配 /stop/i 的按钮("Stop response")
判生成态;等它消失再抓。
- 抓答案:最后一个非空
[data-is-streaming="false"](innerText 含
"Claude responded:" 无障碍前缀噪声,verdict 解析不受影响);回退 .font-claude-message。
- 档位旁证:
button[data-testid="model-selector-dropdown"] aria-label(实证
"Model: Sonnet 4.6 Max")记 model_observed。
- 额度墙:"reached your limit"/"Buy usage credits" → fail-loud,不重试,交 owner。
- Gemini(可选 lane,不在 web-pro 门;2026-07-07 实证存档):清空必须
replaceChildren()(Trusted Types 拦 innerHTML);先等空闲(无 "Stop response");
按钮 Send message/发送消息 双 locale,Enter 不提交;抓 .model-response-text
避开裸 model-response 的 "Gemini said" 噪声;会不定期服务端卡 pending → 90s 超时
fail-loud。
已知限制(诚实)
- 依赖 owner 登录态 + 付费额度:cookie 过期→
sync-login+restart;额度墙 →
ABANDONED_QUOTA_OR_AUTH 交 owner,不伪造。claude.ai 当前登录账号 = Miranda(Max
plan);ChatGPT 档位网页 UI 不一定能确认,不能确认记 model_unverified,不谎称满血。
- 同族提醒:见硬边界 5——web-pro 不替代跨族四 lane 对抗审查。
- 合成质量无对照实验:本 skill 只落地 owner 定义的"双模型辩证",不证明优于单模型。
- 页面改版:ChatGPT/claude.ai DOM 改了 driver 会失效 → selfcheck 先抓到;按
"已验证 DOM 交互"更新选择器,回写本 skill + 提 PR 上游。
持续自我改进(自愈回路)
未来任一次运行踩新卡点(选择器失效、登录、额度、Trusted Types、locale、流式完成判定、
页面改版):当轮主动解决(不硬刚服务端问题、不单次失败就降级)→ 把机制回写 driver +
本 skill → 通用 driving lesson 提 PR 推回上游 ai-coding-ironrules
(续 docs/lessons-from-multi-vendor-dogfood-runs.md)。目标:同一卡点全网只踩一次。