Adoption that depends on somebody remembering a per-machine install is adoption that stops at the person who set it up. winwright ships as a Claude Code plugin: two commands in the repository wire it, every clone is wired, and nothing is added to any path.
None of this is a defect in the tools it names. Every one of them is what a general-purpose automation library does to somebody who has to answer, at the end of a run, whether the thing they were checking was actually checked.
Assert.True(found is not null)winwright → Degraded (2)2 — a number CI can act on without anybody reading a word of the output.FindFirst(TreeScope.Children, new AndCondition(...))Window#main > Pane > Button#saveSetForegroundWindow(h); MoveTo(x, y); Click()act.Invoke(subject)Assert.Equal("Relatório mensal", label)expect.LabelsFrom(project.Language)CopyFromScreen(bounds); bmp.Save(path)capture → refused: “Toast (App.exe) covers 240×64 of the rectangle”// twenty-seven copies of one runnerwinwright run cases/report.wwx --case language-round-tripWhich is the difference between a refusal and a guess: an agent that writes a case field by field is corrected at insertion, where the fix costs a retry, rather than at run time, where it costs a red run somebody has to read.
One entry in .claude/settings.json:
Bash(winwright read:*)read is a promise, not a naming convention: a verb under it that drives the application is a defect. So this single grant removes every prompt on the inspection path — the tree, the facts, the verdict of the last run — while everything that presses a control still asks.
A hand-written harness script is the path of least resistance, and it is how every repository this framework was extracted from ended up with two of them. So a hook denies one and names the verb that replaces it — the same guard roadkeep puts in front of a governed file, pointed at the same failure mode.
It loads when a window is in play rather than on every turn, and what it says is which loop answers which question — which is the whole of what an agent needs in order to reach the right verb instead of the nearest one.
winwright is the substrate; the intelligence is the caller's. It reads trees, presses controls through their own patterns and assembles a verdict — it does not decide what is worth asserting.
It calls no LLM.
It stores none.
Clicks never become a case.
The tool never writes the test.
It drives the one you are on.
Nothing is measured or sent.