lazycodex-ai 5.0.0-beta.40 → 5.0.0-beta.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/cli/index.js +21 -15
  2. package/dist/cli-node/index.js +21 -15
  3. package/package.json +1 -1
  4. package/packages/lsp-daemon/dist/cli.js +11 -6
  5. package/packages/lsp-daemon/dist/client.js +11 -6
  6. package/packages/lsp-daemon/dist/index.js +11 -6
  7. package/packages/lsp-tools-mcp/dist/cli.js +11 -6
  8. package/packages/lsp-tools-mcp/dist/lsp/manager.js +11 -6
  9. package/packages/lsp-tools-mcp/dist/mcp.js +11 -6
  10. package/packages/lsp-tools-mcp/dist/tools.js +11 -6
  11. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  12. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  13. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  14. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  15. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  17. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  19. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  21. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +11 -6
  22. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  23. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  25. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  27. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  29. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  31. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  32. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +2 -2
  33. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  34. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  35. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  36. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +1 -1
  37. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  58. package/packages/omo-codex/plugin/package-lock.json +12 -12
  59. package/packages/omo-codex/plugin/package.json +1 -1
  60. package/packages/omo-codex/plugin/scripts/sync-skills.mjs +6 -18
  61. package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +1 -1
  62. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
  63. package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +1 -1
  64. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +1 -1
  65. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -1
  66. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
  67. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +1 -1
  68. package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +1 -1
  69. package/packages/omo-codex/plugin/skills/programming/SKILL.md +1 -1
  70. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +1 -1
  71. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +1 -1
  72. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +99 -417
  73. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +1 -1
  74. package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +24 -9
  75. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +13 -10
  76. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +1 -1
  77. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
  78. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +5 -2
  79. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +2 -2
  80. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -1
  81. package/packages/omo-codex/scripts/install-dist/install-local.mjs +3 -2
  82. package/packages/shared-skills/package.json +7 -1
  83. package/packages/shared-skills/skills/ast-grep/SKILL.md +1 -1
  84. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
  85. package/packages/shared-skills/skills/data-scientist/SKILL.md +1 -1
  86. package/packages/shared-skills/skills/debugging/SKILL.md +1 -1
  87. package/packages/shared-skills/skills/frontend/SKILL.md +1 -1
  88. package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
  89. package/packages/shared-skills/skills/init-deep/SKILL.md +1 -1
  90. package/packages/shared-skills/skills/lsp-setup/SKILL.md +1 -1
  91. package/packages/shared-skills/skills/programming/SKILL.md +1 -1
  92. package/packages/shared-skills/skills/refactor/SKILL.md +1 -1
  93. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
  94. package/packages/shared-skills/skills/review-work/SKILL.md +99 -417
  95. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +1 -1
  96. package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +24 -9
  97. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +13 -10
  98. package/packages/shared-skills/skills/ulw-execute/SKILL.md +1 -1
  99. package/packages/shared-skills/skills/ulw-plan/SKILL.md +1 -1
  100. package/packages/shared-skills/skills/ulw-research/SKILL.md +5 -2
  101. package/packages/shared-skills/skills/visual-qa/SKILL.md +2 -2
@@ -103,7 +103,7 @@ SOFTWARE.
103
103
  ## 4. agent-browser (vercel-labs) — Tier-2 CDP automation CLI (runtime dependency)
104
104
 
105
105
  The Tier-2 automation CLI is **agent-browser**, installed at runtime via `npm`
106
- (`npm i -g agent-browser`). No agent-browser source is vendored in this repository.
106
+ (`bun add -g agent-browser`). No agent-browser source is vendored in this repository.
107
107
 
108
108
  - Source: https://github.com/vercel-labs/agent-browser
109
109
  - Pinned runtime version: **0.34.0** (documented in `references/chrome-stealth.md`;
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: ultimate-browsing
3
- description: "Escalation skill for blocked or hard-to-reach web access — load it when a normal browse/fetch is blocked (WAF, 403, Cloudflare, JS-only render, login-gated, or a platform a generic fetcher cannot read). Tiered router: TIER 1 insane-search (headless extraction + WAF bypass via curl_cffi TLS impersonation, yt-dlp, Jina Reader, public APIs, Playwright real-Chrome fallback); TIER 1.5 agent-reach (platform-native readers for Chinese and social platforms: Xiaohongshu, Douyin, Weibo, Bilibili, V2EX, WeChat, plus Twitter/Reddit/LinkedIn/GitHub); TIER 2 Chrome stealth (CloakBrowser stealth Chromium + agent-browser CDP for clicks, forms, screenshots, video, cookie login). Triggers: blocked site, bypass bot detection, cloudflare/WAF bypass, scrape, stealth browser, import cookies, fill form, screenshot, play youtube, xiaohongshu, douyin, weibo, bilibili, v2ex, wechat article, podcast transcript. NOT for simple searches (use web-search) or plain fetches (use webfetch)."
3
+ description: "Reaches web pages a plain fetch cannot: renders JS, drives clicks and forms, captures screenshots, holds a login, and gets past WAF blocks through platform-native readers and stealth Chrome. Use for any page work beyond retrieving static text."
4
4
  ---
5
5
 
6
6
  # Ultimate Browsing
7
7
 
8
- Escalation web access for tasks a normal browse or fetch cannot complete. Reach for this skill the moment a page is blocked (WAF / 403 / Cloudflare), needs JS rendering, hides behind a login, or lives on a platform a generic fetcher cannot read. Escalate only when the cheaper tier cannot do the job:
8
+ Web access for everything a plain fetch cannot finish: a page that renders in JS, a click or a form, a screenshot, a login that must persist across pages, or a host that blocks generic fetchers (WAF / 403 / Cloudflare). Start at the cheapest tier that can do the job and climb only when it cannot:
9
9
 
10
- **Tier 1 — insane-search** (headless extraction + WAF bypass) -> **Tier 1.5 — agent-reach** (platform-native APIs, esp. Chinese platforms) -> **Tier 2 — Chrome stealth** (real interaction via CloakBrowser + agent-browser).
10
+ **Tier 1 — insane-search** (headless extraction + WAF bypass) -> **Tier 1.5 — agent-reach** (platform-native APIs, esp. Chinese platforms) -> **Tier 2 — a real browser**: 2a a code-driven kernel browser, 2b Chrome stealth (CloakBrowser + agent-browser) when the page fights back.
11
11
 
12
12
  ## PHASE 0 — ROUTE FIRST (MANDATORY)
13
13
 
@@ -23,11 +23,11 @@ User request
23
23
  +- podcast transcript / stock forum ----------------- TIER 1.5 agent-reach
24
24
  +- Twitter feed / LinkedIn profile / GitHub via CLI - TIER 1.5 agent-reach
25
25
  |
26
- +- Tier 1/1.5 returned empty or partial ------------- TIER 2 Chrome stealth
27
- +- click / fill form / scroll / interact ------------ TIER 2 Chrome stealth
28
- +- screenshot / render / play video ----------------- TIER 2 Chrome stealth
29
- +- login session across pages / inject cookies ------ TIER 2 Chrome stealth
30
- +- test web app / QA / dogfood ---------------------- TIER 2 Chrome stealth
26
+ +- Tier 1/1.5 returned empty or partial ------------- TIER 2 2a kernel browser -> 2b stealth
27
+ +- click / fill form / scroll / interact ------------ TIER 2 2a kernel browser -> 2b stealth
28
+ +- screenshot / render / play video ----------------- TIER 2 2a kernel browser -> 2b stealth
29
+ +- login session across pages / inject cookies ------ TIER 2 2b Chrome stealth (profile + cookies)
30
+ +- test web app / QA / dogfood ---------------------- TIER 2 2a kernel browser -> 2b stealth
31
31
  |
32
32
  +- simple search query ------------------------------ NOT this skill (use web-search)
33
33
  ```
@@ -80,10 +80,25 @@ curl -s "https://www.v2ex.com/api/topics/hot.json" # V2EX public API
80
80
 
81
81
  Routing table, per-platform auth (set `TWITTER_*` env vars, `gh auth login`, a transcription key — only if you have access), rate-limit notes, and known version quirks are in [references/agent-reach/README.md](references/agent-reach/README.md).
82
82
 
83
- ## Tier 2 — Chrome stealth (real interaction)
83
+ ## Tier 2 — a real browser (real interaction)
84
84
 
85
85
  **When**: real interaction is needed (clicks, forms, screenshots, video, persistent login), or Tier 1/1.5 failed.
86
86
 
87
+ ### Tier 2a — kernel browser (default)
88
+
89
+ Drive the page from the code cell you are already in, with no CLI process and no open CDP port. On a Bun >= 1.4 runtime that is `new Bun.WebView()` (`navigate`, `click`, `type`, `evaluate`, `screenshot`, raw `cdp`); elsewhere it is `playwright-core`/`puppeteer-core` against the local Chrome. Snapshots and screenshots come back in-process, so this is the cheapest way to answer "what does the page actually render".
90
+
91
+ ```js
92
+ await using view = new Bun.WebView({ width: 1280, height: 800 })
93
+ await view.navigate(url)
94
+ const title = await view.evaluate("document.title")
95
+ await view.screenshot({ path: "/tmp/page.png" })
96
+ ```
97
+
98
+ Climb to 2b when the site detects automation (Turnstile, FingerprintJS, "unusual traffic"), when the flow needs a persistent logged-in profile or injected cookies, or when the kernel browser cannot reach the page at all.
99
+
100
+ ### Tier 2b — Chrome stealth (blocked or logged-in pages)
101
+
87
102
  CloakBrowser is a stealth Chromium with source-level fingerprint patches that passes Cloudflare Turnstile, FingerprintJS, BrowserScan, and 30+ detectors; agent-browser is the CDP automation CLI that drives it. Both are runtime-installed tools (not vendored here). Full setup, version pins, launch flow, cookie login, and cross-platform notes are in [references/chrome-stealth.md](references/chrome-stealth.md).
88
103
 
89
104
  NEVER clear cookies, cache, or site data (`Network.clearBrowserCookies`, `Storage.clearCookies`, `chrome.browsingData.remove`, "clear browsing data") on the user's real/main browser profile — it wipes their logged-in state everywhere. If the task needs that profile's login state, clone the profile directory first (`rsync -a <profile>/ <tmp-clone>/`) and launch CloakBrowser / agent-browser with the clone as the user-data-dir; run any clearing on the clone only.
@@ -17,22 +17,24 @@ CloakBrowser (stealth Chromium) <- CDP port 9242 -> agent-browser CLI
17
17
 
18
18
  CloakBrowser runs in a dedicated Python venv. Cross-platform: macOS, Linux, and Windows all supported by both tools (use the venv path convention for your OS).
19
19
 
20
+ The venv lives at a fixed path so every session reuses one stealth-Chromium download instead of creating a new venv per working directory, and every command below calls its interpreter by absolute path — no `activate` step to forget.
21
+
20
22
  ```bash
21
23
  # CloakBrowser (MIT wrapper source; separate binary license, pin 0.5.7):
22
- uv venv .cloak-venv --python 3.13
23
- # macOS/Linux: source .cloak-venv/bin/activate Windows: .cloak-venv\Scripts\activate
24
- uv pip install "cloakbrowser==0.5.7"
25
- python -c "import cloakbrowser; cloakbrowser.ensure_binary()" # downloads stealth Chromium on first import
24
+ VENV="$HOME/.agents/cloak-venv" # Windows: %USERPROFILE%\.agents\cloak-venv
25
+ uv venv "$VENV" --python 3.13
26
+ uv pip install --python "$VENV/bin/python" "cloakbrowser==0.5.7"
27
+ "$VENV/bin/python" -c "import cloakbrowser; cloakbrowser.ensure_binary()" # downloads stealth Chromium on first import
26
28
 
27
29
  # agent-browser (Apache-2.0, pin 0.34.0):
28
- npm i -g agent-browser@0.34.0 && agent-browser install
30
+ bun add -g agent-browser@0.34.0 && agent-browser install
29
31
  agent-browser --version # 0.34.0
30
32
  ```
31
33
 
32
34
  Verify CloakBrowser:
33
35
 
34
36
  ```bash
35
- python -c "import cloakbrowser; print(cloakbrowser.__version__, cloakbrowser.CHROMIUM_VERSION, cloakbrowser.binary_info()['installed'])"
37
+ "$VENV/bin/python" -c "import cloakbrowser; print(cloakbrowser.__version__, cloakbrowser.CHROMIUM_VERSION, cloakbrowser.binary_info()['installed'])"
36
38
  # -> 0.5.7 <chromium-version> True
37
39
  ```
38
40
 
@@ -41,8 +43,9 @@ python -c "import cloakbrowser; print(cloakbrowser.__version__, cloakbrowser.CHR
41
43
  NEVER clear cookies, cache, or site data (`Network.clearBrowserCookies`, `Storage.clearCookies`, `chrome.browsingData.remove`, "clear browsing data") on the user's real/main browser profile — it wipes their logged-in state everywhere. If you need that profile's login state, clone it first (`rsync -a <profile>/ <tmp-clone>/`) and launch with the clone as the user-data-dir; run any clearing on the clone only.
42
44
 
43
45
  ```bash
44
- # 1. Launch CloakBrowser with CDP on :9242 (background). With the venv active:
45
- python -c "import asyncio,cloakbrowser; asyncio.run(cloakbrowser.launch_async(headless=False, stealth_args=True, args=['--remote-debugging-port=9242']))" &
46
+ # 1. Launch CloakBrowser with CDP on :9242 (background). cloakbrowser lives only in the venv,
47
+ # so call its interpreter by absolute path — this works in any shell, activated or not:
48
+ "$HOME/.agents/cloak-venv/bin/python" -c "import asyncio,cloakbrowser; asyncio.run(cloakbrowser.launch_async(headless=False, stealth_args=True, args=['--remote-debugging-port=9242']))" &
46
49
 
47
50
  # 2. CloakBrowser launches tabless -> agent-browser would say "No page found".
48
51
  # Open the first tab via CDP before any agent-browser command:
@@ -119,6 +122,6 @@ lsof -ti:9242 | xargs kill -9
119
122
  # agent-browser can't connect:
120
123
  curl -s http://127.0.0.1:9242/json/version | head -5 # empty -> CloakBrowser not running
121
124
  # Update either tool:
122
- uv pip install --upgrade "cloakbrowser==0.5.7" && python -c "import cloakbrowser; cloakbrowser.ensure_binary()"
123
- npm i -g agent-browser@0.34.0
125
+ uv pip install --python "$HOME/.agents/cloak-venv/bin/python" --upgrade "cloakbrowser==0.5.7" && "$HOME/.agents/cloak-venv/bin/python" -c "import cloakbrowser; cloakbrowser.ensure_binary()"
126
+ bun add -g agent-browser@0.34.0
124
127
  ```
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ulw-execute
3
- description: "Execute a Prometheus work plan with Boulder state, evidence ledger updates, worktree discipline, parallel subagents, and Stop-hook continuation. Use after planning when the user says ulw-execute, execute plan, continue plan, resume plan, or asks to run a .omo/plans plan."
3
+ description: "Executes a written Prometheus work plan with Boulder state, evidence ledger, worktree discipline, and parallel subagents. Use when the user says ulw-execute or asks to run a .omo/plans plan."
4
4
  ---
5
5
 
6
6
  ## ABSOLUTE RULE: YOU ARE AN ORCHESTRATOR — NEVER THE IMPLEMENTER
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ulw-plan
3
- description: "ACTIVATES ONLY on an explicit user request for the ulw-plan workflow: the user themselves saying ulw-plan, ulw plan, /skill:ulw-plan, or asking in their own words for a work plan before coding. NEVER self-activates: a bare ulw/ultrawork run, an agent-side routing decision, or reading this file is not a request, and the plan-gated reviewers (metis/momus) stay locked without a user request plus a written .omo/plans plan file. Explore-first planning consultant (Prometheus) that grounds in the codebase, asks only the forks exploration cannot resolve - or researches them to best practice when the intent is fuzzy - waits for explicit approval, then writes ONE decision-complete work plan a worker executes with zero further interview. Triggers: ulw-plan, ulw plan, plan this, make a plan, plan before coding, interview me, break this down, start planning, plan mode."
3
+ description: "Explore-first planning consultant that writes one decision-complete work plan before coding. Use only on an explicit user request for the ulw-plan workflow or a plan before implementation; it never self-activates on a bare ulw run."
4
4
  metadata:
5
5
  short-description: Explore-first planning consultant that waits for your okay before planning
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ulw-research
3
- description: "Maximum-saturation research orchestration: ALWAYS proposes the final materials first (PDF+DOCX default), then parallel explore+librarian swarms across codebase, web, official docs, and OSS repos — max-roster teammode when the harness has it — with live journaling, a recursive EXPAND loop driven by leads workers return in message text, empirical verification by running code, and a cited synthesis with charts/Mermaid/assets behind a mandatory visual-QA gate. ACTIVATES ONLY on an explicit user demand for research — the word 'ulw-research' in any prefix form, any 'ulw' research wording including combined invocations like 'mass ulw research', 'ultradebate' or 'hyperdebate' research requests, or an explicit request for research / deep research / an ultra-precise investigation, in any language. Never self-activates for ordinary questions, debugging, or implementation context-gathering. While active it overrides exploration-bounding defaults: exhaustive coverage is the goal."
3
+ description: "Runs maximum-saturation research with a cooperating team, claim-graph gating, and a cited, QA'd deliverable. Use when the user explicitly asks for research or a deep investigation, including any 'ulw' research wording."
4
4
  ---
5
5
 
6
6
  ## Codex Harness Tool Compatibility
@@ -175,13 +175,15 @@ Scaling floor — more angles always justify more workers:
175
175
  | Multi-faceted | 4 | 6 | 2 | 2 | 14 |
176
176
  | Full due diligence | 4 | 6 | 3 | 2 | 15 |
177
177
 
178
+ The browsing column is BINDING, not advisory: when the brief says `Browsing: yes`, the roster names a browsing-worker angle before the first wave launches, and that worker is spawned in the same turn as the rest of the wave. A run that reaches wave 2 with zero browsing workers on a `Browsing: yes` brief has silently downgraded every source to what plain fetch happened to return.
179
+
178
180
  **Disambiguate before you expand.** When the topic names something that could resolve several ways — a product, a person, a codename, a version — the first wave settles WHICH entity before any worker researches its history, benchmarks, or controversies: canonical name, first-party URL or account, whether it exists in the claimed category, and a confidence line. An unresolved entity never becomes a premise in a later wave's spawn message; that is exactly how a run starts inventing facts about something that does not exist.
179
181
 
180
182
  Role protocols — embed the relevant one in each spawn message; every worker gets a unique angle:
181
183
 
182
184
  - **Codebase (explore), 2-4 workers.** Grep with 3+ keyword variations; structural/AST search; LSP definitions and references; file-name globs; `git log --all -S '<keyword>'` and `--grep` for history including deleted code. Cross-validate hits across tools. Report absolute file paths, patterns with `file:line`, and how findings connect.
183
185
  - **Web (librarian), 3-6 workers.** At least 10 distinct websearch queries per worker, each with a different operator or angle (see Search craft); fetch the full page for every result that matters — snippets lie. Context7 with 3+ queries per known library. grep.app and `gh search code|repos|issues` for real-world usage. Official docs via sitemap discovery (`<base>/sitemap.xml`), then targeted pages.
184
- - **Browsing, 0-3 workers.** Pages plain fetch cannot read (WAF, 403, Cloudflare, dynamic rendering, login): the worker loads the `ultimate-browsing` skill and escalates through its tiers — Tier-1 insane-search engine first (including its Phase-2.5 archive surrogates), then Tier-2 Chrome stealth — rather than abandoning the source. Capture screenshots when visual context matters. **Provenance is part of the claim**: when a source came back with `provenance` of `snapshot` (an archive copy), cite it with its `snapshot_timestamp` and never state it as the current live page; content from a `proxy` route is `untrusted` and needs a second independent route before any claim rests on it. When one blocked territory hides many leads, fan out more browsing subagents in parallel for breadth instead of serializing one worker through them.
186
+ - **Browsing, 1-3 workers on a `Browsing: yes` brief (0 otherwise).** This worker RENDERS pages, it does not re-fetch them: it drives a real browser through whatever the harness provides — the Browser plugin, an agent-browser or playwright skill, or a code-cell browser — and loads the `ultimate-browsing` skill to escalate through its tiers (insane-search engine with its Phase-2.5 archive surrogates, platform-native readers, then Chrome stealth) only when that browser is blocked. Its standing deliverable is a full-page screenshot of every top source plus the rendered text plain fetch could not reach; a worker that returns only fetched text has not done its job. JS-rendered, login-gated, WAF-blocked, and screenshot-bearing sources all belong here rather than in the web lane. **Provenance is part of the claim**: when a source came back with `provenance` of `snapshot` (an archive copy), cite it with its `snapshot_timestamp` and never state it as the current live page; content from a `proxy` route is `untrusted` and needs a second independent route before any claim rests on it. When one blocked territory hides many leads, fan out more browsing subagents in parallel for breadth instead of serializing one worker through them.
185
187
  - **Repo deep-dive (librarian), 0-2 workers.** Shallow-clone the most relevant repos to `${TMPDIR:-/tmp}`, pin the HEAD SHA, read core modules, follow call chains, return SHA-pinned permalinks.
186
188
 
187
189
  Example spawn (codebase axis; librarian, browsing, and repo-dive follow the same contract with their own protocol):
@@ -381,6 +383,7 @@ High-yield combinations: official docs (`site:<docs domain>`), GitHub implementa
381
383
  | Obeying a surrounding "stop exploring" rule mid-research | Authority section — those rules do not bind this mode |
382
384
  | Asking a worker to write journal or session files | Workers are read-only; you journal every return |
383
385
  | Two workers given the same angle | One unique angle per worker, always |
386
+ | A `Browsing: yes` run whose roster carries no browsing worker | The browsing column is binding — name the angle in the brief and spawn it with the first wave, before any lead is chased |
384
387
  | Contested claim settled by judgment | Phase 3 — run code, capture output, verdict |
385
388
  | Deliverable claims without citations | Every claim cites a source or a verification artifact |
386
389
  | Guessing the deliverable format instead of asking | The format gate is unconditional: propose PDF+DOCX plus the domain-fitting alternatives and the template, then wait before wave 1 |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: visual-qa
3
- description: "MUST USE after building/changing any UI or when asked whether a page, component, or TUI looks right. Rigorous visual QA across web/page, terminal, and paginated-document surfaces. Prefer browser:control-in-app-browser for unauthenticated browser/page QA in Codex, then Playwright/agent-browser/dev-browser. Captures screenshot/TUI evidence with bundled diff scripts, runs design-system/functional and visual-fidelity/CJK reviewer passes, then synthesizes a good/bad verdict. Triggers: visual QA, screenshot/pixel diff, UI looks wrong, reference fidelity, design system check, responsive check, CJK text clipping, TUI alignment, box-drawing drift, PDF page check, deck review, blank or near-empty page, wrong page break."
3
+ description: "Runs rigorous visual QA across web, terminal, and paginated surfaces with screenshot evidence and a verdict. Use for any UI build or change, or when asked whether a page, component, or TUI looks right."
4
4
  ---
5
5
 
6
6
  # Visual QA - Dual-Oracle Web and TUI Verification
@@ -49,7 +49,7 @@ Before any reviewer sees an image, verify each capture yourself: the file signat
49
49
  ### Web
50
50
 
51
51
  1. Capture a REFERENCE image: the user's mock/target, generated page snapshot, Figma export, source-site capture, or known-good baseline. Save as PNG. If the user provided overview text or annotations, save them next to the image and treat them as part of the reference packet.
52
- 2. Capture the ACTUAL rendered screenshot at the same viewport size. In Codex, when `browser:control-in-app-browser` is available and the page does not need an authenticated user browser session, use that Browser plugin first for navigation, page state inspection, and screenshots. If it is unavailable or lacks the needed capture action, use the project's configured browser tooling (the playwright, agent-browser, or dev-browser skill). Save as PNG. If none is configured or available, install [agent-browser](https://github.com/vercel-labs/agent-browser) (`npm install -g agent-browser && agent-browser install`) and capture with it — see `$SKILL_DIR/references/agent-browser-setup.md` for the full setup, including how to shoot a fixed-viewport screenshot.
52
+ 2. Capture the ACTUAL rendered screenshot at the same viewport size, driving the browser your harness actually has. Where a code cell can reach a browser (`new Bun.WebView()` on a Bun >= 1.4 kernel, otherwise `playwright-core` against the local Chrome), capture in-process: it needs no CLI and returns the PNG path directly. In Codex, `browser:control-in-app-browser` is that in-process surface — use it first unless the page needs an authenticated user browser session. Otherwise use the project's configured browser tooling (the playwright, agent-browser, or dev-browser skill). Save as PNG. If nothing is available, install [agent-browser](https://github.com/vercel-labs/agent-browser) (`bun add -g agent-browser && agent-browser install`) and capture with it — see `$SKILL_DIR/references/agent-browser-setup.md` for the full setup, including how to shoot a fixed-viewport screenshot.
53
53
  3. Run the diff and keep the JSON:
54
54
 
55
55
  ```