Skills

False Green Tests

Find out why the tests pass but the app is broken.

Install

npx skills add reticlehq/reticle --skill false-green-tests -g -a claude-code -y
Repository
reticlehq/reticle1.3k
Category
Testing
Updated
3d ago
License
Apache-2.0
Context cost
Lightabout 946 tokens
Runs scripts
No, instructions only

What it does

Find out why the tests pass but the app is broken. Catches false greens: a green suite over a feature that does not work, a mocked API standing in for a real one, an assertion that holds no matter what the app does, a click handler wired to nothing. Use when the suite is green and the user says it is broken, when a test never fails, when coverage looks fine but bugs still ship, or before trusting a passing run you did not watch.

The suite is green and the app is broken

A green test is evidence about the test, not about the app. This skill separates the two by running the real app and comparing what it does against what the test claims.

It uses Reticle, which observes the running app from the inside: DOM, network, console, routing, and framework state. Not set up? Follow the reticle skill: it installs Reticle, asks the user before init changes the app's files, and proves one flow.

The five shapes, in the order they are worth checking

1. The assertion cannot fail. Read the test the user trusts. If it only asserts absence (no console error, no thrown exception, no rejected promise) it passes on a control wired to nothing. A dead button throws nothing, fires nothing, and changes nothing. Prove it in the app instead:

reticle_act_and_wait({ sessionId, ref, action: "click", until: { kind: "allOf", predicates: [
  { kind: "net",    method: "POST", urlContains: "/api/...", status: 200 },
  { kind: "signal", name: "..." },
]}})

A verdict of no here, against a green suite, is the false green.

2. The test drove a mock and the app drives an API. Compare what the app actually requested with what the test stubbed:

reticle_observe({ action: "network", sessionId, since })

No request where the test asserted one means the suite verified a fixture. A stale client cache is the same failure with no request at all to look at, which is why registering TanStack Query matters: the cache is the only witness.

3. The UI moved and the state did not. The strongest false green, and invisible to any DOM or screenshot check:

reticle_look({ action: "state", sessionId, store, path })
Read the whole SKILL.md on GitHub

More in Testing