Dev-Browser CLI Automation
SawyerHood/dev-browser
Browser automation with persistent named pages via the dev-browser CLI. Use when users ask to navigate websites, fill forms, take screenshots, extract web…
Increase coverage for a Meticulous project by tracing specific under-covered files back to a real UI action in the codebase, driving that action with a real recorded browser session, and validating…
$ npx skills add FlintSH/Flare --skill meticulous-increase-coverage -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install FlintSH/Flare meticulous-increase-coverage --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/FlintSH/Flare.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/meticulous-increase-coverage .claude/skills/meticulous-increase-coverage && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "meticulous-increase-coverage" agent skill from https://github.com/FlintSH/Flare/tree/main/.agents/skills/meticulous-increase-coverage into .claude/skills/meticulous-increase-coverage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "meticulous-increase-coverage", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/FlintSH/Flare/tree/main/.agents/skills/meticulous-increase-coverageType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add FlintSH/Flare --skill meticulous-increase-coverage -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install FlintSH/Flare meticulous-increase-coverage --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FlintSH/Flare.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/meticulous-increase-coverage .agents/skills/meticulous-increase-coverage && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "meticulous-increase-coverage" agent skill from https://github.com/FlintSH/Flare/tree/main/.agents/skills/meticulous-increase-coverage into .agents/skills/meticulous-increase-coverage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "meticulous-increase-coverage", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add FlintSH/Flare --skill meticulous-increase-coverage -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install FlintSH/Flare meticulous-increase-coverage --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FlintSH/Flare.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/meticulous-increase-coverage .cursor/skills/meticulous-increase-coverage && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "meticulous-increase-coverage" agent skill from https://github.com/FlintSH/Flare/tree/main/.agents/skills/meticulous-increase-coverage into .cursor/skills/meticulous-increase-coverage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "meticulous-increase-coverage", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/FlintSH/Flare.git --path .agents/skills/meticulous-increase-coverage--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add FlintSH/Flare --skill meticulous-increase-coverage -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install FlintSH/Flare meticulous-increase-coverage --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FlintSH/Flare.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/meticulous-increase-coverage .gemini/skills/meticulous-increase-coverage && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "meticulous-increase-coverage" agent skill from https://github.com/FlintSH/Flare/tree/main/.agents/skills/meticulous-increase-coverage into .gemini/skills/meticulous-increase-coverage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "meticulous-increase-coverage", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install FlintSH/Flare meticulous-increase-coverageInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add FlintSH/Flare --skill meticulous-increase-coverage -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/FlintSH/Flare.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/meticulous-increase-coverage .github/skills/meticulous-increase-coverage && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "meticulous-increase-coverage" agent skill from https://github.com/FlintSH/Flare/tree/main/.agents/skills/meticulous-increase-coverage into .github/skills/meticulous-increase-coverage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "meticulous-increase-coverage", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add FlintSH/Flare --skill meticulous-increase-coverage -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install FlintSH/Flare meticulous-increase-coverage --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FlintSH/Flare.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/meticulous-increase-coverage .opencode/skills/meticulous-increase-coverage && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "meticulous-increase-coverage" agent skill from https://github.com/FlintSH/Flare/tree/main/.agents/skills/meticulous-increase-coverage into .opencode/skills/meticulous-increase-coverage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "meticulous-increase-coverage", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
meticulous-increase-coverageIncrease coverage for a Meticulous project by tracing specific under-covered files back to a real UI action in the codebase, driving that action with a real recorded browser session, and validating…
Meticulous Increase Coverage is an agent skill from FlintSH/Flare. Increase coverage for a Meticulous project by tracing specific under-covered files back to a real UI action in the codebase, driving that action with a real recorded browser session, and validating the improvement with a clean coverage comparison. Also opens a PR proposing .meticulousignore entries for code that structurally never executes in-browser. Use when asked to "increase coverage", "find untested code", or "add .meticulousignore entries" for a project.
Its SKILL.md is about 7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/worked-example.md`).
It sits in Productivity & Automation, covering Test coverage and Browser automation. The repository describes itself as: A modern, lightning-fast file sharing platform built for self-hosting. Created with support for ShareX, KDE Spectacle, Flameshot, and easy to set up. The licence is MIT.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c910523. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Meticulous Increase Coverage loads about 7k tokens when it runs, and up to ~8.2k if it reads all its reference files. Until then it costs about 123 tokens; SKILL.md has 4,012 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from FlintSH/Flare at commit c910523, republished under its MIT licence (© FlintSH). 4,012 words, ~6,974 tokens.
.claude/skills/meticulous-increase-coverage/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Run
meticulous-cli-updatefirst if you haven't already this conversation (it also covers authentication and project selection).
Two separate outputs, both expected — neither substitutes for the other:
.meticulousignore changes. Only include paths — most
often whole directories — that you are confident are not coverable at
all. Anything you merely failed to reach in one sitting does not belong
there; leave it out and mention it in the PR description instead.main, with a clean treeEvery command below relies on the CLI resolving things from your local
checkout: js-coverage defaults to the current git HEAD, trigger-test-run
defaults to HEAD for the deployment and to the merge-base with the origin
default branch for the base. On main with a clean tree those collapse to a
single commit, which is exactly what you want — no diff, a head-only run, and
a union in Step 7 that the API will actually accept.
Off main this breaks in ways that are tedious to unpick: union coverage is
rejected unless every run executed the exact same commit, and a PR's merge
commit is recomputed whenever its base branch moves, so a run triggered
earlier against a since-advanced base no longer unions with a new one.
So: check out main, pull, and make sure git status is clean before Step 1.
Then confirm there is actually a test run to work from:
meticulous agent test-run-for-commitKeep the id it prints — Step 7 falls back to it. If it reports "No test run
found for commit …", stop and report that to the user; you cannot baseline
without it. The most common cause is the CLI pointing at the wrong project, so
suggest they check with meticulous auth get-project. meticulous auth set-project only applies for OAuth tokens; API tokens are bound to one
project (so set-project fails), and injected credentials leave no local
token to select — in those cases the fix is a different credential, not
set-project.
meticulous agent js-coverage --includeAllFiles --includeCoveragePercentage \
> /tmp/baseline-coverage.tsvIf this reports "No test run found for commit …" (it shouldn't, if the check above passed), stop and report to the user. Do not work around it by baselining against some other commit's run: Step 7's union requires your new run and the baseline to have executed the same commit.
The base run's sessions often haven't all been replayed yet, which understates
its coverage — if js-coverage says so, run meticulous agent complete-base-run (it waits by default until nothing more can be scheduled;
it can take a while, so check back or re-run rather than assuming it hung),
then re-run js-coverage. Don't expect unexecutedSessionCount to always
reach 0 — some sessions can be permanently unobtainable, and js-coverage
tolerates a small share of those rather than refusing forever.
You are looking for two different things in this file, and it helps to keep them apart:
.meticulousignore candidates — files that are uniformly at 0%
across a whole directory, which suggests they never execute in a browser at
all.Start with the ignore candidates, since they shrink the list. Break the
0%-coverage files down by top-level directory, so you are reasoning about
groups rather than 100s of individual files. The exact command depends on how
the repo is laid out — a monorepo wants the first two path segments, a
single-app repo wants something deeper. For example, in a
packages/<name>/… monorepo:
# example only — adjust the segment depth to this repo's layout
awk -F'\t' 'NR>1 && $2=="0.0" {split($1,a,"/"); print a[1]"/"a[2]}' \
/tmp/baseline-coverage.tsv | sort | uniq -c | sort -rnA directory where every single file is at 0% (not just some) is a strong
signal it never ships to the browser (backend, CLI tooling, docs, e2e test
harness). Those are your .meticulousignore candidates.
There is a second, stronger signal that doesn't depend on coverage data at all and catches individual dead files scattered inside an otherwise-live directory, which the uniformly-0% heuristic above misses entirely. For any file sitting at 0%, grep the codebase for its actual exported symbol — not just its filename:
# example only — adjust the source root and extensions to this repo
grep -rn "theActualExportedName" <src-root> --include="*.ts" --include="*.tsx"If the only match is the file's own definition, nothing imports it, so no session — however comprehensive — can ever execute it. That is proof of unreachability, not an inference from silence, and it is worth checking even when you already have a directory-level rule elsewhere in this file: dead exports accumulate inside packages that are otherwise very much alive.
Some categories are safe exclusions almost everywhere and are worth proposing without further tracing, provided the coverage data agrees they are uniformly 0%:
__tests__/, __mocks__/, *.test.*,
*.spec.**.stories.*, __stories__/, .storybook/testing/, mocks/, fixtures*.config.*,
setupTests.*, scripts directoriesNote that some of these may already be outside the coverage report entirely; check the baseline before adding a rule that does nothing.
Be suspicious of a directory showing 0% everywhere if you know it is bundled into the frontend (a shared component/utils library the main app imports). That pattern is more likely a source-map/path-attribution gap than genuinely dead code — leave it out of the ignore list and flag it as unresolved.
Now pick the coverage targets. Filter the generated/config noise out of the real app package first, then order what's left by how little of it runs — keeping the partially-covered files in, not just the 0% ones. The patterns are repo-specific; inspect the actual paths in your baseline rather than copying this verbatim:
# example only — derive the patterns from the paths this repo actually has
grep -v "/__tests__/\|\.test\.\|\.stories\.\|/testing/\|/mock" \
/tmp/baseline-coverage.tsv | sort -t$'\t' -k2 -g > /tmp/candidates.tsvGroup the candidates by feature area rather than picking the single worst files: one recorded flow usually moves a whole cluster of related files at once, so a directory sitting at 5-20% across a dozen files is a better target than an isolated 0% file behind an obscure branch.
For each candidate file, find its actual caller(s) — for example:
# example only — adjust the source root and extensions to this repo
grep -rln "<ExportedThing" <src-root> --include="*.tsx" | grep -v testRead the caller. Confirm:
<Link> instead of the app's own
navigation hook, a side-panel open instead of a full navigate). Confirm
which branch your candidate action actually hits.Any of these three drivers records correctly — verified against two different apps:
agent-browser — CDP-launched browsers, faster and
more scriptable, and reliable in every test here. The trade-off is a fresh
profile each time, so you have to sign in. agent-browser additionally
refuses a click when the target is covered by another element, naming the
covering node, which catches a class of silent mis-click the other two will
happily perform.Set a realistic viewport whichever you pick. The CDP browsers default to something small (around 1280px wide) where a real Chrome window is often twice that. Responsive layouts render different components at different widths, so the default viewport can quietly cover different code — or hide the control you were aiming for.
What matters far more than the choice of tool is the one rule below.
Only trusted events are recorded. The recorder ignores anything
synthesised in page JS, so element.click(), assigning input.value, or
dispatching your own events all drive the app convincingly and record
nothing. The page looks right, the session comes back empty. Drive
everything through the tool's real input actions.
When something doesn't take effect, find out which half is broken before changing tactics — install a capturing probe and repeat the action:
window.__ev = []
;['pointerdown', 'click', 'keydown', 'change'].forEach((t) =>
window.addEventListener(
t,
(e) => window.__ev.push({ t, trusted: e.isTrusted }),
true
)
)trusted: false → it reached the page but will not be
recorded; you are synthesising somewhereAll three look like success in the browser, which is what makes them expensive — you find out from the coverage numbers, long after the fact.
Native <select>s. Setting the value through a form-fill action, or
assigning it in JS, fires a change with isTrusted: false — the app reacts
and the value visibly updates, so it looks like it worked, but the recorder
ignores it and the sort/filter never happens on replay. Clicking the
<select> is no good either: that opens an OS-level popup the driver can't
see. What works is to focus the element and press the first letter of the
option's visible text ("p" → "Priority"), which yields a trusted keydown
and a trusted change. Repeat the letter to cycle options sharing an
initial. Verify with a change listener reading e.isTrusted — the value
updates either way, so the value alone tells you nothing.
Modifier shortcuts. Replay reproduces a modifier only if a discrete
modifier keydown was recorded and is still held. Some drivers send one only
for the base key: Claude in Chrome's cmd+k and agent-browser's
press Alt+ArrowRight both record a single keydown with the modifier flag set
and no separate modifier press, so on replay the flag is cleared and the
handler body never runs — while working perfectly live. Playwright's
press('Alt+ArrowRight') does record the discrete press and replays correctly
(verified by coverage).
So: prefer the equivalent click target where one exists, and if you must use
a chord, drive it with Playwright and confirm from coverage afterwards. If the
line holding if (… && event.metaKey) is covered but the body is not, the
keydown was delivered and the condition evaluated false — that is this.
Double-clicks. A double-click may be recorded as a single click, in which
case the replay never fires onDoubleClick and every later event in that
session targets UI that never opened — so coverage drops. Check the recorded
event count looks like two press/release pairs, and treat any
double-click-only feature as suspect until coverage confirms it.
Occasionally an interaction records cleanly and visibly works live, but the handler it's meant to trigger never fires on replay — with no error, and the affected file sitting at exactly its baseline percentage in Step 7's union. One case seen: typing a value into an input inside a dropdown's own portal-rendered content (a filter chip, a view rename behind a "..." menu). Plain clicks in the same portal, and the identical type-then-Enter sequence on an input in the main page tree, both replay fine — so this is specific to keyboard/text input inside a portal, not a driver issue.
Don't assume a typed-value target worked just because the live interaction did — check Step 7's diff. If a target only reproduces through this kind of interaction and won't move, that's a shortcoming of agent-driven recording for this flow: report it as unresolved and suggest a human drive that one flow manually, rather than continuing to pad the list with retries.
claude-in-chrome specificsgetBoundingClientRect()
centre by screenshotWidth / window.innerWidth. Re-derive after any resize,
and re-screenshot rather than reusing coordinates from an earlier page —
layout shifts, and a stale coordinate can land on the wrong element and
record an interaction you did not intend.ref immediately before clicking it, and never reuse one
across pages or tabs. Don't predict a number — read_page does not emit
them in order. Refs and coordinates are equally reliable; pick whichever is
convenient. This is not unique to claude-in-chrome — agent-browser's
snapshot refs go stale the same way, and reusing one silently clicks
whatever now occupies that ref, not what you intended. It cost a real
mistake once: a stale ref landed on a table's "Add New" affordance and
created a blank record. Take a fresh snapshot immediately before every
click when the DOM might have changed, and treat an unexpected
page/record-count change right after a click as a sign a ref just misfired,
not as an unrelated bug — clean up whatever it created before continuing.agent-browser rather than switching
selector method. Both stayed reliable throughout, including on the same
page at the same moment that Claude in Chrome was dead.document.body.innerText.includes(...)), not just a screenshot — a
tooltip appearing can look like success. Check you are still on the page
you think you are: an app that has quietly redirected you to a login screen
will absorb blind coordinate clicks into empty space and hand you a session
with zero events.Then sanity-check the recording, before you trigger anything. Wait ~10s after closing the tab, so the session is complete, and check that it captured something:
meticulous agent sessions --limit 10 --excludeSyntheticSessions \
--includeDurationSeconds --includeNumberUserEvents \
--includeNumberUrlsVisited --includeStartUrl --includeAbandonedReasonRead the row you just produced:
numberUserEvents of 0 — the recorder saw no user input. Your clicks
were not reaching the page, or were synthesised rather than trusted; go back
to the input-delivery probe above. Replaying this session is pointless.numberUrlsVisited of 1 when you navigated several times — the later
pages did not make it into this session. They either landed in their own
sessions (fine, collect those ids too) or were swallowed as an unreplayable
tail (see the hard-navigation note in Step 5).durationSeconds over 300 — everything past the 5-minute mark will be
silently trimmed on replay (Step 5). Re-record the overflowing part as its
own session rather than hoping it survives.abandonedReason — the recorder gave up on the session (see
the 10-minute cap in Step 5); it is not worth replaying.startUrl that is not the page you drove — the navigation you cared
about belongs to a different session than you assumed.A session is only complete once its tab is closed. While the tab is open
the row reflects only the chunks uploaded so far, so a low or zero
numberUserEvents there means "not flushed yet", not "the recording
failed". A session measured for this skill read 0 events with the tab open
and 12 once it was closed. Judging it early nearly caused a perfectly good
recording to be re-driven from scratch.
Events upload on a short interval (a few seconds), but anything still
unflushed at unload is only stashed in sessionStorage and re-sent on a
later page load to the same origin — so a session's tail can be delayed
until the next visit. Prefer navigating away over hard-closing the browser,
and never judge a recording immediately.
Recording several targets in one sitting? Run this check after each one, not just once at the end. Checking only at the end makes it impossible to tell which action lost a session, and you'll have to re-drive all of them just to find out which one needs redoing.
agent sessions --includeDurationSeconds gives you the number, and anything over 300 is
losing its tail.--sessionIds (Step 6). Mostly
this is fine, each piece staying under the replay cap. The trap is
navigating again too quickly: a page reached a second or two after the
previous one gets appended as the tail of that session instead of
starting its own, and tails frequently do not replay — so the page renders
perfectly while you drive it and still contributes no coverage. Give each
page you actually care about its own dwell time (~10s) before moving on,
and check in Step 6 that it shows up as a startUrl in its own right. The
same caution applies to a plain <form> submit with no wired onSubmit
handler — it triggers a real browser reload rather than an SPA transition,
and can just as easily drop the just-recorded, unflushed session if you
navigate on immediately afterward.First list what you actually recorded, newest first:
meticulous agent sessions --limit 20 --excludeSyntheticSessions \
--includeDurationSeconds --includeNumberUserEvents \
--includeNumberUrlsVisited --includeStartUrlSkip any row with numberUserEvents of 0 — it will replay as nothing and
only dilutes the run. Note any row with durationSeconds over 300: it will
replay, but only its first five minutes, so treat coverage from its tail as
absent rather than assuming the whole flow ran.
Identify your sessions by recorded-at time and startUrl. Be careful here:
other people — and other apps pointed at the same project — record too, so
never assume the newest N rows are yours. --recordedSince and
--visitedUrlFilter are the quickest way to narrow it down when the list is
busy.
Expect more sessions than pages you drove: a hard navigation usually ends
one session and starts another, so a five-page sweep can produce five ids.
Collect all of them. A page whose URL never shows up as a startUrl was
probably swallowed as the tail of the previous session and will not replay —
re-record it on its own if you need it covered.
Then trigger:
meticulous agent trigger-test-run --sessionIds "<id1>,<id2>,..."meticulous agent js-coverage --headPlusTestRunIds "<newRunId>" \
--includeAllFiles --includeCoveragePercentage > /tmp/combined-coverage.tsvThis unions your new run into the baseline run resolved from HEAD — the same
run Step 1 used — so it is baseline coverage plus your new sessions'
coverage. Commit resolution skips runs over an explicit session set, so the
run you just triggered won't be picked as the baseline. The union is needed
because --sessionIds replaced the selected set for that run rather than
adding to it, so your run on its own covers far less than the baseline and a
raw diff would read as mass regressions. Diff the union against
/tmp/baseline-coverage.tsv: you should see zero regressions, and only the
files your new flow touched improve.
Pass only your new run — a run cannot be unioned with itself.
Two signs HEAD resolved to something other than the golden-set run: it is rejected with "is the run being queried", or every file has dropped (which means you unioned into another narrow session set, not a regression). The most likely cause is a pinned-session run predating the skip. Either way, name both sides explicitly, using the baseline id from Step 0:
meticulous agent js-coverage --testRunIds "<baselineRunId>,<newRunId>" \
--includeAllFiles --includeCoveragePercentage > /tmp/combined-coverage.tsvIf the union is rejected because the runs executed different commits, that is
the main/clean-tree precondition biting — see the top of this skill.
For each traced target file: did coverage move? For each presumed-dead file
(the .meticulousignore candidates from Step 2): did it stay at 0% in the
union comparison (confirming it's genuinely unreachable)?
If a well-traced target didn't move, don't assume the recording failed —
re-check the session first (Step 4: does it exist, did it capture user events
and URL visits, is it abandoned, is its startUrl the page you drove?), then
re-check whether the click actually goes through the file you expected
(Step 3) rather than a sibling/parent component.
Report honestly if a target remains unresolved; don't claim success without
the coverage number to back it.
When you report the gains, be clear about what they are not yet: the test run proves the coverage is reachable, but the project's own coverage figure will only improve once the next session selection picks these new sessions up into the selected set. Until then nothing changes for recurring runs.
.meticulousignore PRThe second deliverable. Branch, commit the .meticulousignore change, and
open a PR.
Only propose paths you are confident are not coverable at all. The bar is "no session could ever execute this", not "I didn't get to it today". Prefer directory-level rules over long lists of individual files — a directory rule stays correct as files are added, whereas a file list silently goes stale. In practice most entries come from the safe-exclusion categories in Step 2 plus whatever whole non-browser packages the baseline showed at a uniform 0%.
Confirm before you commit: every path you are about to ignore stayed at 0% in the Step 7 union. A path your own new sessions just covered obviously does not belong in the ignore list, and that check catches it.
A common structure is "ignore everything, then un-ignore what does run in the browser" — the pattern Meticulous's own monorepo uses:
# Ignore everything except packages that are executed in the
# browser and have meaningful frontend coverage.
packages/*
!packages/<frontend-app>/
!packages/<frontend-app>/**
!packages/<shared-ui-lib>/
!packages/<shared-ui-lib>/**Note that .meticulousignore follows gitignore semantics, so a file cannot be
re-included once its parent directory is excluded — un-ignore the directories
(!some/dir/**/) as well as the files.
In the PR description, give the reasoning for each rule — why this code cannot run in a browser (it's a Node-only build script, a test harness, a backend package). The baseline can only show you that something is at 0% today, which is never proof it is unreachable, so the justification has to come from what the code actually is. Also call out explicitly:
references/worked-example.md runs the whole skill against a small app
(kanban-demo), with the real coverage deltas. Worth reading for calibration:
it has no 0% files at all, one target that gained coverage and one that
recorded cleanly and then failed to replay — and it shows how to tell the
difference from executed ranges.
© FlintSH, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in .agents/skills/meticulous-increase-coverage of FlintSH/Flare.
Open the folder on GitHubat commit c910523
Meticulous Increase Coverage next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Meticulous Increase Coverage this skillFlintSH/Flare | 135 | — | ~7k | Automated safety check: Pass | MIT | |
| Dev-Browser CLI AutomationSawyerHood/dev-browser | 6.7k | 1 repos | ~455 | Automated safety check: Pass | MIT | |
| VerifyWeZZard/jlens-qwen36 | 402 | — | ~684 | Automated safety check: Pass | Apache-2.0 | |
| QAblueberrycongee/termcanvas | 406 | — | ~830 | Automated safety check: Pass | MIT | |
| Dotnet Testingnovotnyllc/dotnet-artisan | 233 | — | ~972 | Automated safety check: Pass | MIT | |
| Test Automationrevfactory/harness-100 | 1.3k | — | ~1.7k | Automated safety check: Pass | Apache-2.0 |
SawyerHood/dev-browser
Browser automation with persistent named pages via the dev-browser CLI. Use when users ask to navigate websites, fill forms, take screenshots, extract web…
WeZZard/jlens-qwen36
Build/launch/drive recipe for verifying jlens-qwen36 UI and server changes end-to-end in a real headless browser.
blueberrycongee/termcanvas
QA testing skill with real browser automation. An agent skill from blueberrycongee/termcanvas.
novotnyllc/dotnet-artisan
Defines .NET test strategy and implementation patterns across xUnit v3 (Facts, Theories, fixtures, IAsyncLifetime), integration testing (WebApplicationFactory, Testcontainers), Aspire testing…
revfactory/harness-100
A full test automation pipeline. An agent skill from revfactory/harness-100.
vercel-labs/agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking…
FlintSH/Flare
Overview of the Meticulous CLI tool and its global options. An agent skill from FlintSH/Flare.
FlintSH/Flare
Fix the visual diffs that have been reviewed and rejected on a Meticulous test run, following their review comments if given.
FlintSH/Flare
Iterative frontend development loop using Meticulous for per-step visual validation.
FlintSH/Flare
Analyze a completed Meticulous test run — compare the diffs against the PR description to see what's expected, then focus on finding and flagging potential regressions.
FlintSH/Flare
Run a Meticulous session simulation against a live URL and analyze the visual output — either by inspecting screenshots directly (quick-check mode) or by comparing pixel and HTML diffs against a…
FlintSH/Flare
Run a Meticulous test run after implementing a frontend change, then hand off to the meticulous-review skill to classify each visual change as intended or unintended.
Categories
Increase coverage for a Meticulous project by tracing specific under-covered files back to a real UI action in the codebase, driving that action with a real recorded browser session, and validating…. Meticulous Increase Coverage is an agent skill from FlintSH/Flare. Increase coverage for a Meticulous project by tracing specific under-covered files back to a real UI action in the codebase, driving that action with a real recorded browser session, and validating the improvement with a clean coverage comparison.
Meticulous Increase Coverage fits situations like: asked to increase coverage; find untested code; add .meticulousignore entries for a project.
Run `npx skills add FlintSH/Flare --skill meticulous-increase-coverage -a claude-code`. Or copy the skill folder (.agents/skills/meticulous-increase-coverage in FlintSH/Flare) into .claude/skills/meticulous-increase-coverage in your project. Claude Code loads it when a task matches its description.
Run `npx skills add FlintSH/Flare --skill meticulous-increase-coverage -a codex`. Or copy the skill folder (.agents/skills/meticulous-increase-coverage in FlintSH/Flare) into .agents/skills/meticulous-increase-coverage in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add FlintSH/Flare --skill meticulous-increase-coverage -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/meticulous-increase-coverage, .gemini/skills/meticulous-increase-coverage, .github/skills/meticulous-increase-coverage and .opencode/skills/meticulous-increase-coverage in your project.
Going by SKILL.md and its folder, Meticulous Increase Coverage needs the command-line tools its instructions call (git).
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Meticulous Increase Coverage is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7k tokens (SKILL.md is roughly 28k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Meticulous Increase Coverage: Dev-Browser CLI Automation (SawyerHood/dev-browser, 6.7k stars), Verify (WeZZard/jlens-qwen36, 402 stars), QA (blueberrycongee/termcanvas, 406 stars) and Dotnet Testing (novotnyllc/dotnet-artisan, 233 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
FlintSH (a GitHub user) maintains it in FlintSH/Flare, which has 135 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 6, 2026.
Source: FlintSH/Flare on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.