# False Green Tests

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

- Repository: https://github.com/reticlehq/reticle (1299 stars)
- Category: Testing
- License: Apache-2.0
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add reticlehq/reticle --skill false-green-tests -g -a claude-code -y`
Codex: `npx skills add reticlehq/reticle --skill false-green-tests -g -a codex -y`
Cursor: `npx skills add reticlehq/reticle --skill false-green-tests -g -a cursor -y`
Gemini CLI: `npx skills add reticlehq/reticle --skill false-green-tests -g -a gemini-cli -y`
Claude Code plugin marketplace: `/plugin marketplace add reticlehq/reticle`

## Description

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.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# 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`](https://github.com/reticlehq/reticle/blob/main/skills/reticle/SKILL.md) 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 })
```

The rest: https://github.com/reticlehq/reticle/blob/HEAD/skills/false-green-tests/SKILL.md
