Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add m4ttstack/fast-browser --skill reviewing-flowsgit clone --depth 1 https://github.com/m4ttstack/fast-browserWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/m4ttstack/fast-browser/reviewing-flows)<a href="https://agentmods.dev/skills/m4ttstack/fast-browser/reviewing-flows"><img src="https://agentmods.dev/badge/skills/m4ttstack/fast-browser/reviewing-flows/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/m4ttstack/fast-browser/reviewing-flows"><img src="https://agentmods.dev/badge/skills/m4ttstack/fast-browser/reviewing-flows.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00046 | $0.04685 |
| Opus 5.5 | $0.00018 | $0.01874 |
| Sonnet 5.5 | $0.00009 | $0.00937 |
| Haiku 4.5 | $0.00005 | $0.00468 |
Grade A, and why
reviewing-flows scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 8d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 372 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Reviewing Flows
fast-browser flows approve shows a step count, not steps. A human is asked to
trust actions they cannot read. This skill reads the queue, clears what can
never work, and puts what is left in front of them with its steps rendered.
Walk the graph; each box has its section below. A move the graph does not show goes through its off-script gate.
What this skill may and may not do
This skill may reject. It may never approve.
Approval needs a TTY this skill does not have, and that is the gate working as
designed, not an obstacle to route around. Never wrap, pipe, script, or
otherwise automate the confirm prompt, and never simulate the human's
keystrokes with a terminal-automation tool. Print the command for the human to
run in their own terminal; do not run it yourself. The graph marks the
temptation with STOP: approval needs the human's own terminal.
Everything here moves flows toward less runnable, never more. That is why one
confirmation can cover a whole batch, and why the one automatic reject covers
only a fact about a file, never an inference (the graph marks that temptation
with STOP: inferred buckets are only proposed).
The review graph
digraph review_flow_queue {
rankdir=TB;
"Trigger: the pending flow queue needs triage" [shape=ellipse];
"fast-browser flows list --json" [shape=plaintext];
"flows list result?" [shape=diamond];
"Read every pending and ready artifact" [shape=box];
"Bucket every pending flow, first match wins" [shape=box];
"Report the survey" [shape=box];
"Loopback origins dominate and the keep-list not yet asked?" [shape=diamond];
"Ask for a keep-list" [shape=box];
"Keep-list answer?" [shape=diamond];
"Any unapprovable flows?" [shape=diamond];
"STOP: inferred buckets are only proposed" [shape=octagon style=filled fillcolor=red fontcolor=white];
"Show every unapprovable name and say the ledger records it" [shape=box];
"Batch confirmation?" [shape=diamond];
"fast-browser flows reject <name>" [shape=plaintext];
"Reject result?" [shape=diamond];
"Report the failed reject and go on" [shape=box];
"Another name in the batch not yet tried?" [shape=diamond];
"Any reviewable flows?" [shape=diamond];
"STOP: approval needs the human's own terminal" [shape=octagon style=filled fillcolor=red fontcolor=white];
"Render each reviewable flow's steps" [shape=box];
"Print the approve command for each reviewable flow" [shape=box];
"Print reject commands for dead-origin and superseded" [shape=box];
"Report ready flows whose lastHealed is not null" [shape=box];
"Report the review" [shape=box];
"Trigger: the human says an approve failed" [shape=ellipse];
"Name the flow whose name collided" [shape=box];
"Off-script gate: flows list failed" [shape=box];
"Make the approved move once: flows list failed" [shape=box];
"Off-script rounds = 2: flows list failed?" [shape=diamond];
"Held: nothing moved" [shape=doublecircle];
"Handed back with what is done" [shape=doublecircle];
"Collision explained" [shape=doublecircle];
"Queue triaged and reported" [shape=doublecircle style=filled fillcolor=lightgreen];
"Trigger: the pending flow queue needs triage" -> "fast-browser flows list --json";
"fast-browser flows list --json" -> "flows list result?";
"flows list result?" -> "Read every pending and ready artifact" [label="ok"];
"flows list result?" -> "Off-script gate: flows list failed" [label="errored"];
"Read every pending and ready artifact" -> "Bucket every pending flow, first match wins";
"Bucket every pending flow, first match wins" -> "Report the survey";
"Report the survey" -> "Loopback origins dominate and the keep-list not yet asked?";
"Loopback origins dominate and the keep-list not yet asked?" -> "Ask for a keep-list" [label="yes"];
"Loopback origins dominate and the keep-list not yet asked?" -> "Any unapprovable flows?" [label="no"];
"Ask for a keep-list" -> "Keep-list answer?";
"Keep-list answer?" -> "Bucket every pending flow, first match wins" [label="origins to keep: rebucket"];
"Keep-list answer?" -> "Any unapprovable flows?" [label="none"];
"Any unapprovable flows?" -> "Show every unapprovable name and say the ledger records it" [label="yes"];
"Any unapprovable flows?" -> "Any reviewable flows?" [label="no"];
"Any unapprovable flows?" -> "STOP: inferred buckets are only proposed" [label="tempted to add dead-origin or superseded flows to the batch"];
"STOP: inferred buckets are only proposed" -> "Show every unapprovable name and say the ledger records it";
"Show every unapprovable name and say the ledger records it" -> "Batch confirmation?";
"Batch confirmation?" -> "fast-browser flows reject <name>" [label="reject them"];
"Batch confirmation?" -> "Any reviewable flows?" [label="keep them"];
"fast-browser flows reject <name>" -> "Reject result?";
"Reject result?" -> "Another name in the batch not yet tried?" [label="rejected"];
"Reject result?" -> "Report the failed reject and go on" [label="failed"];
"Report the failed reject and go on" -> "Another name in the batch not yet tried?";
"Another name in the batch not yet tried?" -> "fast-browser flows reject <name>" [label="yes"];
"Another name in the batch not yet tried?" -> "Any reviewable flows?" [label="no"];
"Any reviewable flows?" -> "Render each reviewable flow's steps" [label="yes"];
"Any reviewable flows?" -> "Print reject commands for dead-origin and superseded" [label="no"];
"Any reviewable flows?" -> "STOP: approval needs the human's own terminal" [label="tempted to run approve from this shell"];
"STOP: approval needs the human's own terminal" -> "Render each reviewable flow's steps";
"Render each reviewable flow's steps" -> "Print the approve command for each reviewable flow";
"Print the approve command for each reviewable flow" -> "Print reject commands for dead-origin and superseded";
"Print reject commands for dead-origin and superseded" -> "Report ready flows whose lastHealed is not null";
"Report ready flows whose lastHealed is not null" -> "Report the review";
"Report the review" -> "Queue triaged and reported";
"Trigger: the human says an approve failed" -> "Name the flow whose name collided";
"Name the flow whose name collided" -> "Collision explained";
"Off-script gate: flows list failed" -> "Make the approved move once: flows list failed" [label="take: read the directories directly"];
"Off-script gate: flows list failed" -> "Off-script rounds = 2: flows list failed?" [label="iterate: the human fixed the cause"];
"Off-script gate: flows list failed" -> "Held: nothing moved" [label="hold"];
"Off-script gate: flows list failed" -> "Handed back with what is done" [label="hand back"];
"Make the approved move once: flows list failed" -> "Read every pending and ready artifact";
"Off-script rounds = 2: flows list failed?" -> "fast-browser flows list --json" [label="no: list again"];
"Off-script rounds = 2: flows list failed?" -> "Handed back with what is done" [label="yes"];
}
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 8d ago Changed · +2 lines ed9c39e7cbb9
- 21d ago Changed · +208 lines c12c40e97ec3
- 1mo ago First seen · 162 lines · 46 tokens per session scan A eb243bbee81e
reviewing-flows is a skill published in the GitHub repository m4ttstack/fast-browser (0 stars, last pushed yesterday), licensed MIT. It adds 46 tokens to every session and 4,685 once invoked, about $0.0002 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
glance-test
Run E2E browser tests on any web application using Glance MCP. Use when the user says "test this page," "check this URL," "run E2E tests," "browser test," "test the login flow," "check if the site works," "visual regression," or "screenshot this page." Also use for post-deploy verification and smoke tests.
author
Use when writing a new E2E browser test from a vague user description or feature requirement. Turns exploratory browser sessions into structured, reusable test cases.
runner
Use when executing a stable E2E test case that has already been refined. Follows test steps exactly without deviation, reports pass/fail with evidence.
flow-tester
End-to-end user journey tester using Playwright. Tests multi-step flows (signup, checkout, CRUD) with screenshots at each step. Auto-generates flows from URLs or text descriptions. Use after integration work to verify complete user journeys work.
e2e-tester
Test a web app like a QA person — open it in a real browser, click through flows, and report what's broken with screenshots and code references. Works on localhost. Use when the user wants to test their app, verify a flow works, check for visual bugs, or validate changes before pushing.
playwright-tabbed-orchestration
Parent Agent uses playwright-tabbed to allocate browser tabs and partition tasks, then spawns child agents in parallel — each operating on its assigned tabid — for browser acceptance testing or automation, with a final aggregated summary. Suitable for multi-page validation, parallel module checks, and…