/web-task-agent — plain-language web task → multi-step loop
Run a web task as a multi-step browser loop on MCPs you already pay for. No new runtime, no API double-billing, no new always-on MCP. Two v1 modes: monitor (watch a page, report a grounded diff) and QA (walk a site, check CTAs/links/schema, flag mismatches).
Provenance
Adapted from browser-use (github.com/browser-use/browser-use, MIT, © 2024 Gregor Zunic) per /steal analysis (2026-06-08) — see .claude/discovery/0626-browser-use-steal-analysis.md. We lift the loop discipline (pre-done verification, soft loop nudges, action chaining, ground-every-claim) as prompt patterns. We do not import the library — the loop runs on Chrome DevTools + Firecrawl MCPs already mounted. That call is the verdict's central KILL: the library duplicates our stack and adds a second Chromium + paid LLM keys.
What this is / is not
A thin orchestration skill: it wraps existing MCPs with a disciplined loop. Client-agnostic — invoke for any engagement or Genesys-internal motion.
| Use this when |
Use something else when |
| Watch a page and report what changed |
Build/clone a site → /website-build, /website-clone |
| Walk a site checking CTAs / links / schema |
One-shot scrape of one URL → Firecrawl directly |
| A repeatable multi-step web task on existing MCPs |
LinkedIn engager/profile/job scraping → Apify skills |
|
Open-web research → Exa per exa-protocol.md |
|
Form-filling / login-walled automation → deferred to v2 |
Triggers
Invoke when the user says:
/web-task <url> <what to do>
- "monitor this page for changes" / "watch this competitor page"
- "QA the CTAs on this site" / "check every link on [url]"
- "check what changed on [url] since last time"
Do NOT invoke when:
- The job is building or cloning a site (
/website-build, /website-clone)
- A single
firecrawl_scrape answers the question (no loop needed)
- The data lives behind a login or needs form submission (v2 — refuse for now, name the reason)
- A pre-built Apify actor already covers the source (LinkedIn, job boards)
Ethics guardrails (read FIRST)
This skill drives a browser against live sites. Treat as a Gate-2 check — confirm intent before any run that touches a third party, and log the answer.
Legitimate uses: monitoring publicly-visible competitor pages; QA on a site the user owns or is engaged to work on; reading public content the site's robots policy permits.
Refuse if: the task targets login-walled or paywalled content without authorization; it scrapes a source whose ToS prohibits automated access; it impersonates a user; or it would submit forms / create accounts on a third party. When in doubt, ask before proceeding.
No credential automation in v1. The skill never logs in, never submits forms, never stores cookies.
Inputs
Required:
target_url — the page or site to act on (publicly accessible)
task — plain-language description of what to do ("watch the pricing page", "check every CTA goes somewhere live")
Recommended:
mode — monitor | qa (inferred from the task if omitted)
baseline — for monitor mode, the prior captured state to diff against (a previous run's report)
competitor-research output — for monitor mode, to know which pages matter
MCP credit gate
This skill calls Firecrawl and Chrome DevTools. Per .claude/rules/apify-credits.md (and the firecrawl analogue), state spend before running:
| Operation |
Cost |
Gate |
firecrawl_scrape (capture one page) |
low (~$0.01) |
none — run, report cost |
firecrawl_monitor_create (persistent watch) |
per-check + storage |
soft — confirm before creating a persistent monitor |
| Chrome DevTools navigate / snapshot / screenshot |
no credit cost |
none |
| Multi-page QA sweep (>10 pages) |
scales with page count |
hard — show page count + estimate, wait for yes |
Never create a persistent firecrawl_monitor or run a >10-page sweep without confirming first. Probe one page before any fan-out (per goal-driven-loops.md).
Modes (v1)
Monitor mode — watch a page, report a grounded diff
- Capture current observable state (
firecrawl_scrape markdown, or Chrome DevTools snapshot for JS-heavy pages).
- Diff against the baseline (prior run's captured state). If no baseline, this run is the baseline — capture and stop.
- Reason about what changed and why it matters ("CTA moved from 'Get started' to 'Book a demo'; a fourth pricing tier appeared at $X").
- Report only changes grounded in the two captures. No speculation about intent beyond what the text shows.
QA mode — walk a site, flag mismatches
- Get the page set (sitemap, or the URLs the user named).
- For each page: navigate (Chrome DevTools), check the named targets — CTA destinations resolve, links are live, schema/meta present.
- Screenshot any mismatch.
- Report findings as a list: page → check → pass/fail → evidence.
Deferred to v2 (do not attempt in v1)
Gated-directory harvesting, form-filling, login-walled extraction. These carry the highest flake + legal risk. Refuse with a one-line reason and point to the v2 note.
The loop discipline (the stolen core)
Every mode runs the same disciplined loop. Full protocol → the premium reference. The four load-bearing rules:
- Pre-done verification. Before declaring done: re-read the task, list every requirement, check each against what you actually observed, and confirm with evidence. Any unmet requirement → not done.
- Ground every claim in observed content. Each statement in the report traces to a specific capture (a scrape, a snapshot, a screenshot). No claim the page didn't show.
- Soft loop nudges. If the same action repeats with no new information ~3 times, or the page state is unchanged across steps, stop and change approach — don't grind.
- Action chaining. Page-changing actions (navigate, click) go last in a step; safe reads (scrape, snapshot, extract) chain freely.
Anti-hallucination guardrails
- No claim the capture didn't show. If it's not in the scrape/snapshot/screenshot, it doesn't go in the report.
- No invented diffs. A "change" requires two captures showing it. Without a baseline, report current state only — never a fabricated delta.
- No assumed intent. Report what changed, not why the competitor "must be" doing it, unless the page states it.
- No silent page drops. If a QA sweep skips pages (timeout, block), name them in the report — don't imply full coverage.
Composition with other skills
| Stage |
Skill |
Why |
| Before monitor |
/competitor-research |
Names which competitor pages are worth watching |
| After monitor |
/competitor-research |
A flagged change feeds the next competitor refresh |
| After QA |
/website-audit |
QA findings feed the broader site audit |
| Different job |
/website-clone, /website-build |
Build/clone, not watch/check |
Completion report
When done, output:
- Mode run (monitor / QA) + target
- For monitor: baseline date, current date, the grounded diff (or "no change")
- For QA: page count checked, pass/fail per check, screenshots of mismatches
- Pages skipped + why (if any)
- MCP spend incurred
1---2name: web-task-agent3description: Web Task Agent4---56# /web-task-agent — plain-language web task → multi-step loop78Run a web task as a multi-step browser loop on MCPs you already pay for. No new runtime, no API double-billing, no new always-on MCP. Two v1 modes: **monitor** (watch a page, report a grounded diff) and **QA** (walk a site, check CTAs/links/schema, flag mismatches).910## Provenance1112Adapted from browser-use (github.com/browser-use/browser-use, MIT, © 2024 Gregor Zunic) per `/steal` analysis (2026-06-08) — see [`.claude/discovery/0626-browser-use-steal-analysis.md`](../../../../discovery/0626-browser-use-steal-analysis.md). We lift the **loop discipline** (pre-done verification, soft loop nudges, action chaining, ground-every-claim) as prompt patterns. We do **not** import the library — the loop runs on Chrome DevTools + Firecrawl MCPs already mounted. That call is the verdict's central KILL: the library duplicates our stack and adds a second Chromium + paid LLM keys.1314## What this is / is not1516A thin orchestration skill: it wraps existing MCPs with a disciplined loop. Client-agnostic — invoke for any engagement or Genesys-internal motion.1718| Use this when | Use something else when |19|---|---|20| Watch a page and report what changed | Build/clone a site → `/website-build`, `/website-clone` |21| Walk a site checking CTAs / links / schema | One-shot scrape of one URL → Firecrawl directly |22| A repeatable multi-step web task on existing MCPs | LinkedIn engager/profile/job scraping → Apify skills |23| | Open-web research → Exa per exa-protocol.md |24| | Form-filling / login-walled automation → deferred to v2 |2526---2728## Triggers2930**Invoke when the user says:**31- `/web-task <url> <what to do>`32- "monitor this page for changes" / "watch this competitor page"33- "QA the CTAs on this site" / "check every link on [url]"34- "check what changed on [url] since last time"3536**Do NOT invoke when:**37- The job is building or cloning a site (`/website-build`, `/website-clone`)38- A single `firecrawl_scrape` answers the question (no loop needed)39- The data lives behind a login or needs form submission (v2 — refuse for now, name the reason)40- A pre-built Apify actor already covers the source (LinkedIn, job boards)4142---4344## Ethics guardrails (read FIRST)4546This skill drives a browser against live sites. Treat as a Gate-2 check — confirm intent before any run that touches a third party, and log the answer.4748**Legitimate uses:** monitoring publicly-visible competitor pages; QA on a site the user owns or is engaged to work on; reading public content the site's robots policy permits.4950**Refuse if:** the task targets login-walled or paywalled content without authorization; it scrapes a source whose ToS prohibits automated access; it impersonates a user; or it would submit forms / create accounts on a third party. When in doubt, ask before proceeding.5152No credential automation in v1. The skill never logs in, never submits forms, never stores cookies.5354---5556## Inputs5758**Required:**59- `target_url` — the page or site to act on (publicly accessible)60- `task` — plain-language description of what to do ("watch the pricing page", "check every CTA goes somewhere live")6162**Recommended:**63- `mode` — `monitor` | `qa` (inferred from the task if omitted)64- `baseline` — for monitor mode, the prior captured state to diff against (a previous run's report)65- `competitor-research` output — for monitor mode, to know which pages matter6667---6869## MCP credit gate7071This skill calls **Firecrawl** and **Chrome DevTools**. Per `.claude/rules/apify-credits.md` (and the firecrawl analogue), state spend before running:7273| Operation | Cost | Gate |74|---|---|---|75| `firecrawl_scrape` (capture one page) | low (~$0.01) | none — run, report cost |76| `firecrawl_monitor_create` (persistent watch) | per-check + storage | soft — confirm before creating a persistent monitor |77| Chrome DevTools navigate / snapshot / screenshot | no credit cost | none |78| Multi-page QA sweep (>10 pages) | scales with page count | hard — show page count + estimate, wait for yes |7980Never create a persistent `firecrawl_monitor` or run a >10-page sweep without confirming first. Probe one page before any fan-out (per `goal-driven-loops.md`).8182---8384## Modes (v1)8586### Monitor mode — watch a page, report a grounded diff87881. Capture current observable state (`firecrawl_scrape` markdown, or Chrome DevTools snapshot for JS-heavy pages).892. Diff against the baseline (prior run's captured state). If no baseline, this run *is* the baseline — capture and stop.903. Reason about what changed and why it matters ("CTA moved from 'Get started' to 'Book a demo'; a fourth pricing tier appeared at $X").914. Report only changes grounded in the two captures. No speculation about intent beyond what the text shows.9293### QA mode — walk a site, flag mismatches94951. Get the page set (sitemap, or the URLs the user named).962. For each page: navigate (Chrome DevTools), check the named targets — CTA destinations resolve, links are live, schema/meta present.973. Screenshot any mismatch.984. Report findings as a list: page → check → pass/fail → evidence.99100### Deferred to v2 (do not attempt in v1)101102Gated-directory harvesting, form-filling, login-walled extraction. These carry the highest flake + legal risk. Refuse with a one-line reason and point to the v2 note.103104---105106## The loop discipline (the stolen core)107108Every mode runs the same disciplined loop. Full protocol → the premium reference. The four load-bearing rules:1091101. **Pre-done verification.** Before declaring done: re-read the task, list every requirement, check each against what you actually observed, and confirm with evidence. Any unmet requirement → not done.1112. **Ground every claim in observed content.** Each statement in the report traces to a specific capture (a scrape, a snapshot, a screenshot). No claim the page didn't show.1123. **Soft loop nudges.** If the same action repeats with no new information ~3 times, or the page state is unchanged across steps, stop and change approach — don't grind.1134. **Action chaining.** Page-changing actions (navigate, click) go last in a step; safe reads (scrape, snapshot, extract) chain freely.114115---116117## Anti-hallucination guardrails1181191. **No claim the capture didn't show.** If it's not in the scrape/snapshot/screenshot, it doesn't go in the report.1202. **No invented diffs.** A "change" requires two captures showing it. Without a baseline, report current state only — never a fabricated delta.1213. **No assumed intent.** Report what changed, not why the competitor "must be" doing it, unless the page states it.1224. **No silent page drops.** If a QA sweep skips pages (timeout, block), name them in the report — don't imply full coverage.123124---125126## Composition with other skills127128| Stage | Skill | Why |129|---|---|---|130| Before monitor | `/competitor-research` | Names which competitor pages are worth watching |131| After monitor | `/competitor-research` | A flagged change feeds the next competitor refresh |132| After QA | `/website-audit` | QA findings feed the broader site audit |133| Different job | `/website-clone`, `/website-build` | Build/clone, not watch/check |134135---136137## Completion report138139When done, output:140- Mode run (monitor / QA) + target141- For monitor: baseline date, current date, the grounded diff (or "no change")142- For QA: page count checked, pass/fail per check, screenshots of mismatches143- Pages skipped + why (if any)144- MCP spend incurred145146---147