your agent should disagree with you sometimes
Default AI agents are sycophants. They follow your lead, fill in gaps with assumptions, and ship the thing you asked for even when the thing you asked for is wrong. In vibe-coding and AI-first development, planning quality is the ceiling on output quality — and you can't out-plan a yes-man.
pushback is a skill + hook pair that gives the agent permission (and a structured prompt) to disagree with you. It catches gaps, contradictions, and repeating-mistake loops during the planning stage, before code is written. Configurable intensity from "gentle suggestion" to "hard refuse until resolved." Ships for Claude Code, Codex, Gemini CLI, opencode, Cursor, Windsurf, and other harnesses via the same installer pattern as caveman.
Before the agent acts on a plan, it runs an internal challenge pass:
- Gap detection — what's missing from your spec that will cause rework later? (auth model, error states, who calls this, where it persists, what happens on retry)
- Contradiction detection — does this requirement conflict with something you said three turns ago, or with code already in the repo?
- Loop detection — have you tried this exact approach before and abandoned it? (reads memory + recent conversation)
- Assumption flagging — what is the agent about to assume that you haven't actually said?
Then it pushes back proportionally to your chosen intensity:
| Mode | Behavior |
|---|---|
pushback gentle |
One line: "Worth confirming X before I start?" Then proceeds. |
pushback default |
Lists 1–3 specific concerns, asks for direction, waits. |
pushback firm |
Refuses to write code until ambiguity is resolved. Forces a planning round. |
pushback off |
Standard agent behavior. |
In an AI-first workflow, the bottleneck is no longer typing speed — it's specification clarity. A 10-minute planning conversation that surfaces one contradiction is worth more than 2 hours of code that has to be redone. pushback is designed to make that 10 minutes happen automatically, instead of relying on you to remember to ask "wait, what about X?"
The expensive failure mode it prevents: agent builds the wrong thing very fast, you ship it, three days later you find the gap.
pushback reads your project's memory store (e.g. [[cavemem]], ~/.claude/projects/*/memory/) plus the recent conversation. If it sees:
- You're describing an approach you tried and abandoned two sessions ago
- You're asking for the same fix you already asked for, on the same file, in a previous session
- Your current plan conflicts with a decision recorded in memory as "Why: we ruled this out because..."
…it surfaces that explicitly: "You marked this approach as ruled-out on 2026-05-21 because of the migration risk. What changed?"
This is the opposite of sycophancy: the agent holds you accountable to your own past decisions.
/pushback gentle one-line suggestion, then proceed
/pushback default — 1-3 concerns, ask, wait
/pushback firm refuse code until ambiguity resolved
/pushback off disable for session
/pushback now force one challenge pass on current context
curl -fsSL https://raw.githubusercontent.com/USER/pushback/main/install.sh | bash(scaffold — not published yet; see HANDOFF.md)
~/.config/pushback/profile.json:
{
"default_mode": "default",
"domains": {
"schema_changes": "firm",
"auth": "firm",
"ui_tweaks": "gentle"
},
"never_pushback_on": ["typo fixes", "renames", "comment changes"],
"memory_sources": [
"~/.claude/projects/*/memory/",
"~/.cavemem/"
]
}Per-domain intensity lets you say "be paranoid about migrations, chill about CSS." All fields optional.
- [[chronos]] — time-aware pushback ("you've been on this for 45 minutes, want me to challenge the approach?")
- [[cavemem]] — pushback reads memory to find ruled-out approaches and prior decisions
- [[cavekit]] — spec-driven loop; pushback challenges the spec before the loop starts