empiricaai/empirica/eat-the-broccoli
Claude Code and agent skill by empiricaai/empirica
- community
- ext:[{"type":"hook","description":"Pre/post lifecycle hooks"}]
Checking that the SKILL.md file is still in the repository.
Use when the user says '/eat-the-broccoli', 'eat the broccoli', 'full quality sweep', 'pre-release audit', 'run the deep tests', or asks to hunt for gaps / membrane misses / stubs / dead code / silent failures / the bugs that pass tests but are still broken. A tiered quality-and-pattern audit: deterministic tooling (lint, types, tests, deps, dead-code, silent-failure) PLUS a learned-pattern hunt for the hard, judgment-requiring failure classes that tools can't catch. Works in any repo or stack.…
Install
npx vskill@latest install empiricaai/empirica/eat-the-broccoliSemi-extensibleMentions customization, but needs skill-specific knowledge. Read the extensible skills standard
SKILL.md
Eat the Broccoli 🥦
The thorough quality sweep you run before a release, after a refactor, or when something just smells off. Two halves:
- Deterministic tooling — lint, types, tests, dependency CVEs, dead code,
silent failures. Catches the known categories.
- The pattern hunt — a checklist of the hard failure classes that pass
every test and still ship broken: races, stale caches, silent fallbacks, null-masking, deploy-staleness. Tools can't catch these; only a trained eye plus a "is this by design?" check can.
Portable by design. The deterministic half is tool-agnostic — wire in yourstack's linter / typechecker / scanner. The pattern hunt needs no tooling atall; it's a structured way of looking.
Two dials: depth × scope
| Depth | digs into | Scope | covers | |
|---|---|---|---|---|
| quick | lint + fast tests + dep-audit | changed | the diff vs your base branch | |
| standard | + dead-code, silent-failure, contract guards, pattern hunt | module | one subsystem / path | |
| deep | + full pattern hunt, docs/contract accuracy, multi-pass | repo | everything |
Pick any combination — quick × changed is a pre-commit reflex; deep × repo is a pre-release gate. State the level + scope you chose, and say what you skipped — silent truncation reads as "covered everything."
Forks & monorepos: when most of the tree is upstream/vendored,reposcope drowns in code you don't own. Default tochangedor your ownedpackages — here the scope dial is load-bearing, not optional.
Phase 1 — Deterministic tooling
Run your stack's equivalent of each. Skip what you don't have; the sweep still works.
| Dimension | Tools | |
|---|---|---|
| Lint / style | ruff, eslint, golangci-lint, clippy | |
| Types | pyright, tsc, mypy, cargo check | |
| Tests | pytest, jest, go test, cargo test | |
| Dependency CVEs | pip-audit, npm audit, cargo-audit | |
| Dead code | vulture, ts-prune, cargo-machete | |
| Silent failures | bare except: / empty catch {} / discarded Result | |
| Contract guards | your CLI / API contract tests | |
| Test freshness | mutation testing (mutmut, Stryker, cargo-mutants); or grep for assertion-free tests, tautological asserts, and hand-built fixtures whose schema has drifted from the real one |
On that last row — coverage does not cover it. Coverage asks "was this line executed?"; test freshness asks "could this test have failed?" Those come apart badly in fast iterative work, because tests written against yesterday's contract keep passing against today's code and actively guard the drift: a green assertion that the API returns 422 is indistinguishable from a green assertion that it should. Fixtures are the sharpest edge — a hand-built schema that has fallen behind the real one makes fixture and code agree with each other and disagree with production, so the suite is green precisely where it is blind. If a defect survives a green suite, the suite is a suspect, not an alibi.
Tooling by language
Concrete per-stack tool choices (Python, Rust) live in references/stacks.md — consult it when wiring a stack, not while hunting. The pattern hunt below is language-agnostic and ports verbatim across any stack.
Reading silent failures: a truly-silent swallow (except: pass, empty catch {}, let _ = fallible()) is the dangerous one. A broad catch that logs or re-raises is often deliberate degradation — flag the new ones, and any with no log and no re-raise, not the absolute count.
Phase 2 — The pattern hunt 🥦 (the part that earns the name)
Tools find known categories. These are the structural failures that pass tests and still ship broken. Each is a place where broken and by-design look identical — so each row carries the disambiguator that tells them apart.
The one meta-question: "This looks intentional — is it actually?" When you find a smell, check the intent (a comment, a test, a doc, or ask). When it resolves to "yes, by design," record that verdict (an inline annotation or a .broccoli-accept line — see below) so you don't re-litigate it next sweep.
Worked example. You spot a function returning [] on a DB timeout (fallback-masks-primary). Check the intent: does it log or raise? It logs nothing → ❌ broken — callers can't tell "no rows" from "DB down." If instead it logged a warning and returned [] as a documented degraded mode → ✅ by design: record it with the reason, move on.
A. State & timing
| Smell | ✅ by design if | ❌ broken if | |
|---|---|---|---|
| Race / shared mutable state — >1 writer to one key/file | single-writer guaranteed, or the key carries the writer's durable id | two writers share a proxy key → last-write-wins clobber | |
| Stale cache — value resolved once, reused | the value is immutable for that lifetime | it's ephemeral/locational but frozen at init (location, clock, "current X") | |
| Idempotency miss — a retried / redelivered op | dedup-key / set-semantics make replay harmless | it increments / appends / re-sends on replay | |
| Off-by-one window — a since/until, threshold, range | inclusive/exclusive matches intent | the event you need lands exactly on the excluded edge | |
| Coupled-lifecycle orphan — two things that must live/die together | bound, or a reaper cleans orphans | orphans pile up silently (a handle without its resource; a record opened, never closed) |
B. Failure visibility
| Smell | ✅ by design if | ❌ broken if | |
|---|---|---|---|
| Empty/null masking — a field empty because something broke upstream | the empty has a contract (declared nullable) | a count no longer matches its list; a .get(k, default) ate a missing key | |
| Default masks dropped intent — a param with a default, or one the interface accepts and no code reads | the default is a real sensible value, and every accepted param is consumed somewhere | it silently absorbs a value that was supplied but got dropped. Harsher variant: the arg parser advertises a flag the handler never reads — documented, accepted, discarded, no error. An advertised no-op is worse than a missing feature: the missing one fails loudly and teaches | |
| Fallback masks primary failure — a degraded path | it logs/flags that it engaged | "it works" actually means "fallback works, primary silently dead". A changelog ### Highlights block that yielded no readable bullet fell back to pasting the detail bullets it was written to replace, and printed nothing: the author's input was ignored and the output looked fine | |
| Partial success as success — a multi-step op, one rollup status | rollup is AND-of-all + per-item surfaced | a mid-step failure is swallowed by the final OK | |
| Unfalsifiable success — no distinct signal for worked-vs-failed | success and failure produce different legible output | both look the same (empty output, silence). Ask: if this failed, could I tell? | |
| Proxy read as evidence — a status, version, path or env var taken as proof of a different fact | the reading answers the question actually asked — the registry for "did it publish", a digest for "is this content current", the tool's own credential resolution for "can this run" | it answers a narrower neighbouring question and nothing says so. Four in one day: a CI job's success read as published (two channels shipped nothing behind six green ticks); CARGO_REGISTRY_TOKEN/CHOCOLATEY_API_KEY unset read as no credential exists while the token sat in credentials.toml / choco apikey; gh secret list empty read as the secret never existed when it was simply not shared with that repo; a version header read as content. A linter/formatter configured with target-version set to the floor was read as proof the tree parses on the floor: ruff parses with the newest grammar, so it rewrote an escaped quote into syntax only 3.12 accepts and passed. The proxy USUALLY agrees — that is what makes it attractive and the disagreement invisible. The reading is not noisy, it is precise and about the wrong thing | |
| Report older than the code it describes — a claim about what the code does today, sourced from a bug report, a peer's message, a ticket or an earlier artifact of your own | the claim carries the report's date and was re-checked against HEAD (git log -S<symbol> --since=<report date> -- <path it names>), or is explicitly scoped to "as of <date>" | it is stated as current. A public forecast said a startup check "assumes a Claude Code install and misreports under Codex", from a peer's report about vendored copies; the repo had skipped that check off Claude Code for three weeks, so half of a prediction was a settled fact written as a forecast. The report was true when written and is cited with the authority of a measurement. Ask: has the code it names changed since the report, and who would notice if it had? | |
| Unsatisfiable predicate — a check whose condition cannot be met on any input the producer actually emits | the check has been observed firing and not firing on real data | it matched a shape nobody produces, so it fires on everything (or nothing) forever, and its opposite branch is unreachable code. A "narrow breadth" nudge tested isinstance(v, (int,float)) against a dict-of-dicts: it warned on every transaction including ones that did the right thing, and its positive branch had never executed once. A check that cannot pass is training, not feedback — and what it trains is dismissal of every signal printed beside it | |
| Check aimed at a neighbouring claim — a test, falsifier, gate or acceptance criterion written to guard a claim | its pass/fail condition is about the same quantity the claim states, and someone who did not write the claim can evaluate it | it tests an adjacent quantity, so the claim can be false while the check passes, or true while it fails. A prediction "the next two releases are mostly fixes" carried the falsifier "fewer than a third of 78 queued defects are fixed": a release can be mostly fixes and fix none of those 78. A claim about memory growth was falsified by "above 500 MB after 24 hours", which a listener flat at 600 MB trips. A falsifier that counts internal ids no outsider can see is the same defect from the other side. Write the claim as the check's own sentence. If you cannot, they are two claims. | |
| Wrong-domain scan — an analyzer pointed at a subject it wasn't written for | the tool declares its scope and refuses (or reports NOT APPLICABLE, counted separately from passes) when the subject doesn't match | it runs happily and emits specific, plausible, entirely false findings — checks resolving their own project's symbols against another repo reported 13 dead enum values that don't exist there. Zero-files-scanned is loud; wrong-tree-scanned is silent, and the silent one is strictly worse | |
| Verb that always fails — an operation that errors on every single call | the failure is surfaced where someone acts on it | it fails loudly every time and therefore leaves no trace in the data it was meant to change — callers quietly fall back to another path, and no audit of the output can find it because nothing was ever written. A batch-resolve targeting a table that never existed was dead for its whole life across two independent installs. Ask "has this verb ever successfully written anything?" — a zero-success verb and an unused verb are identical in the code and opposite in meaning | |
| Query result treated as a cohort — rows returned together, given one diagnosis and one remedy | the query's predicate IS the class — every row needs the same fix because of what the predicate selected | the rows share only the predicate, and remediation differs per row. Five identities revoked at oauth=0 read as five broken migrations; they were three people never onbo |
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingempirica/plugins/claude-code-integration/skills/eat-the-broccoli/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Extension points
hookPre/post lifecycle hooks
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/empiricaai/empirica/eat-the-broccoli)