empiricaai/empirica/eat-the-broccoli

Claude Code and agent skill by empiricaai/empirica

Trust tier 2
  • community
  • ext:[{"type":"hook","description":"Pre/post lifecycle hooks"}]
LLM review pending
Source check pending

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-broccoli

Semi-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:

  1. Deterministic tooling — lint, types, tests, dependency CVEs, dead code,

silent failures. Catches the known categories.

  1. 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 your
stack's linter / typechecker / scanner. The pattern hunt needs no tooling at
all; it's a structured way of looking.

Two dials: depth × scope

Depthdigs intoScopecovers
quicklint + fast tests + dep-auditchangedthe diff vs your base branch
standard+ dead-code, silent-failure, contract guards, pattern huntmoduleone subsystem / path
deep+ full pattern hunt, docs/contract accuracy, multi-passrepoeverything

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, repo
scope drowns in code you don't own. Default to changed or your owned
packages — 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.

DimensionTools
Lint / styleruff, eslint, golangci-lint, clippy
Typespyright, tsc, mypy, cargo check
Testspytest, jest, go test, cargo test
Dependency CVEspip-audit, npm audit, cargo-audit
Dead codevulture, ts-prune, cargo-machete
Silent failuresbare except: / empty catch {} / discarded Result
Contract guardsyour CLI / API contract tests
Test freshnessmutation 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/filesingle-writer guaranteed, or the key carries the writer's durable idtwo writers share a proxy key → last-write-wins clobber
Stale cache — value resolved once, reusedthe value is immutable for that lifetimeit's ephemeral/locational but frozen at init (location, clock, "current X")
Idempotency miss — a retried / redelivered opdedup-key / set-semantics make replay harmlessit increments / appends / re-sends on replay
Off-by-one window — a since/until, threshold, rangeinclusive/exclusive matches intentthe event you need lands exactly on the excluded edge
Coupled-lifecycle orphan — two things that must live/die togetherbound, or a reaper cleans orphansorphans 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 upstreamthe 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 readsthe default is a real sensible value, and every accepted param is consumed somewhereit 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 pathit 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 statusrollup is AND-of-all + per-item surfaceda mid-step failure is swallowed by the final OK
Unfalsifiable success — no distinct signal for worked-vs-failedsuccess and failure produce different legible outputboth 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 factthe 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 ownthe 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 emitsthe check has been observed firing and not firing on real datait 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 claimits pass/fail condition is about the same quantity the claim states, and someone who did not write the claim can evaluate itit 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 forthe tool declares its scope and refuses (or reports NOT APPLICABLE, counted separately from passes) when the subject doesn't matchit 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 callthe failure is surfaced where someone acts on itit 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 remedythe query's predicate IS the class — every row needs the same fix because of what the predicate selectedthe 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

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
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/empiricaai/empirica/eat-the-broccoli/badge)](https://verified-skill.com/skills/empiricaai/empirica/eat-the-broccoli)

Something wrong with this skill or its page? Tell us.