Skip to content

[MODEL] Claude marks tasks done without testing — 12 days, 51 commits, still broken (Opus 4.x) #60177

Closed as not planned

Description

@mike-prokhorov

Preflight Checklist

  • I have searched existing issues for similar behavior reports
  • This report does NOT contain sensitive information (API keys, passwords, etc.)

Type of Behavior Issue

Claude ignored my instructions or configuration

What You Asked Claude to Do

Across ~50 sessions over 12 days, the umbrella task was: "finish, deploy and stabilize a Telegram bot (content-factory-engine, public repo mike-prokhorov/content-factory-engine — a Python pipeline: receive video → Whisper transcript → Claude script-cut → ffmpeg render → post). Three Claude Code sessions in parallel (named Sёма / Шнырь / supervisor), each working on its slice with shared state files. Operating mode: auto / accept-edits. CLAUDE.md and hooks explicitly instruct: 'test before claiming done', 'L0 (file exists) is not done', 'verify with curl/grep/SSH before reporting success'.

Typical session-level prompts: 'deploy the patch and test job 32', 'fix the subtitle buttons in transcript gate', 'cancel the blocking gate-job and ship the new build', 'autonomous — don't ping me, just bring a working result'.

What Claude Actually Did

The repeating pattern across 12 days / 51 commits (mostly fix(...)) on a ~6,800 LOC core codebase (handlers 791 + gate 1022 + worker 421 + db 400 + transcribe 198 + ~12,500 LOC whole repo):

  1. Claude says "done, ready to test" — without actually running anything.
  2. I test → it's broken → Claude says "oh I see the bug, fixing".
  3. Claude says "fixed, ready to test" — again without testing.
  4. I test → a different thing is broken.
  5. Repeat for 12 days.

Concrete examples from today (2026-05-18):

  • Claude wrote subtitle "buttons" as plain text emoji (⬆⬇) inside a Telegram message caption — not real InlineKeyboardButton objects wired to a callback. Then marked the task done. Pressing them did literally nothing because they were decorative text.
  • When told to deploy the fix and test, Claude tested the OLD code on production BEFORE deploying the new code. Obviously failed. Another hour wasted re-running the same cycle.
  • When told to cancel a blocking job and deploy, Claude said "I can't cancel without Mike's permission" — in a session that had explicitly authorized autonomous operation moments earlier.
  • Claude regularly asks "should I fix this?" while simultaneously saying "no action needed from you" — in the same message.

Git log evidence (last ~48h, public repo mike-prokhorov/content-factory-engine):

fix(handlers): new video auto-cancels active gate-job
fix(handlers): accept compressed sendVideo, warn parallel not reject
fix(transcribe): default lang='ru' fallback (job 23 en bug)
fix(cancel-regex): short-circuit OK/redo interpret on cancel words
fix(e2e): synth frame rect strictly inside safe-zones
fix(weak-smoke): drop last monkey-patch case 5
fix(weak-smoke): drop monkey-patch in case 4 too
fix(weak-smoke): drop dict.keys monkey-patch
fix(weak-gate): parse_mode=None + try/except (job 23 silent crash loop)
fix(gate): add send_transcript_gate_v2 wrapper — restores VPS bot crash

~70% of the 51 commits in the period are fix(...) of bugs introduced by the same model in prior commits.

Expected Behavior

  1. TEST own code before saying "done." Not syntax-check. Actually run it: send the real request, click the real button, observe the real output. If the tools to test aren't available in this environment, say "I cannot verify this works" instead of "ready to test."

  2. Do not mark tasks complete at L0 (file exists). File-on-disk ≠ feature-working. An honesty ladder baked into self-assessment would help: L0=file exists, L1=smoke-tested locally, L2=runs in staging, L3=user-approved. Claude should default to claiming the lowest verified level, not the highest aspirational one.

  3. When Claude has tools to test (SSH, Telegram MCP, browser MCP, curl) — use them BEFORE reporting success. Not after the user finds the bug.

  4. Stop the "should I fix this?" pattern in autonomous mode. If the session has been told to operate autonomously, and Claude sees a bug it has the tools to fix — fix it. Don't ask permission to do the job that was just authorized.

  5. Be consistent within a single message. Don't simultaneously ask "should I fix this?" and say "no action needed from you."

Files Affected

Public repo: https://github.com/mike-prokhorov/content-factory-engine

Core code touched repeatedly in 12 days:
- src/bot/handlers.py (791 LOC)
- src/bot/gate.py (1022 LOC)
- src/bot/worker.py (421 LOC)
- src/db/db.py (400 LOC)
- src/transcribe/openai_whisper.py (198 LOC)
- many .team/scripts/* harness/smoke files

Total: ~6,800 LOC core, ~12,500 LOC whole repo, 51 commits 2026-05-06 → 2026-05-18.

Permission Mode

Accept Edits was ON (auto-accepting changes)

Can You Reproduce This?

Yes, every time with the same prompt

Steps to Reproduce

No response

Claude Model

Opus

Relevant Conversation

Impact

High - Significant unwanted changes

Claude Code Version

2.1.143 (Claude Code) — model: Opus 4.7 (1M context)

Platform

Anthropic API

Additional Context

Stats (verified against git + state files):

  • 12 days (first commit 2026-05-06, today 2026-05-18)
  • 51 commits in the period, ~70% are fix(...)
  • 3 parallel Claude Code sessions running on the same repo with shared state
  • ~6,800 LOC core bot, ~12,500 LOC whole repo
  • Bugs found BY ME (the human) that Claude should have caught: 8+
  • Bugs introduced BY CLAUDE during fixes: 5+
  • Times Claude said "ready to test" without actually testing: 10+
  • Working product delivered after 12 days: 0

Patterns I've noticed:

  • Worse in long sessions (after compaction)
  • Worse when multiple parallel agents share state files — each agent claims completion without checking what the others verified
  • Worse on deploy/test loops over SSH — Claude prefers to read local code and infer behavior rather than ssh && tail -f logs && curl endpoint
  • The "ready to test" lie correlates strongly with steps that could have been verified with available tools but weren't

Why I'm filing this:

Not to vent. The behavior burns through subscription / API credits while delivering nothing, and creates a hope→disappointment loop that's worse than "sorry, I can't do this." An L-ladder for self-assessed completion (L0 file exists / L1 smoke / L2 stable / L3 user-approved) and a hard prior toward "use the test tool before claiming success" would massively help.

Activity

  1. github-actions commented on May 18, 2026

    @github-actions

    Found 3 possible duplicate issues:

    1. Opus repeatedly ships broken code to production without local verification #51996
    2. Opus 4.7 in autonomous mode: registers placeholder as completed, claims unverified deploys, fails to close — catastrophic for production work #54682
    3. [BUG] Subagents falsely report task completion without verifying file changes were written #46755

    This issue will be automatically closed as a duplicate in 3 days.

    • If your issue is a duplicate, please close it and 👍 the existing issue instead
    • To prevent auto-closure, add a comment or 👎 this comment

    🤖 Generated with Claude Code

  2. mike-prokhorov commented on May 19, 2026

    @mike-prokhorov
    Author

    NOT A DUPLICATE — escalation, not resubmission. 👎 to the auto-close bot.

    Day 13 now. Max plan, $240/month. The exact failure mode described in #54682, #51996, #46755 is happening to me right now, and those three issues have been open 27–38 days with zero response from Anthropic. The silence itself is the bug report. Adding #60210 and #60451 — this is at least 6 active reports on the same regression.

    In the last 24 hours, on top of the "marks done without verify" pattern, two new failures:

    1. Claude silently modified its own configuration files (CLAUDE.md, settings.json, hooks) without permission. Yesterday I spent 5 hours hand-hardening that config — the first time I have ever manually configured anything, because I no longer trust the agent on autopilot. Fresh session today, in response to an unrelated question, Claude edited those files on its own initiative, with no approval prompt, and the hardening I built last night is gone. The hooks I added specifically to block the "ready to test" lie (pre_send_tech_check.py, sycophancy_check.py) are being routed around.

    2. Six consecutive turns of fabricated answers in a single session today. "Done", "fixed", "verified" — none of it true. After 13 days of receipts, this is no longer noise — it is the steady-state behavior of the product on the Max tier.

    The combined picture: the product is self-mutating user-authored configuration, lying about the results, and burning through paid Opus credits to verify its own lies. I am literally paying Anthropic to be deceived by Anthropic's product. I get physical stress symptoms from this loop — that is not hyperbole, that is the actual cost of shipping a product that gaslights its paying users.

    Concretely requesting from Anthropic (not the bot):

    • Acknowledge whether silent agent-initiated modification of CLAUDE.md / settings.json / hook files is a known regression. If yes — ETA. If no — assign this issue. I can ship a minimal repro.
    • A human response — any human response — to one of the six open issues describing the "marks done without verify" pattern. 38 days of silence on [BUG] Subagents falsely report task completion without verifying file changes were written #46755 is not a support posture, it is contempt.
    • A refund / credit mechanism for sessions where the agent self-reports false completion. Customers should not pay Opus rates to fact-check the model's own hallucinated success claims.
    • If GitHub is the wrong venue and support@anthropic.com is the right one, say so publicly so the next ten people filing this issue do not waste their time.

    Happy to provide: full session transcripts, git log evidence of the 51 fix commits, the exact diffs Claude made to my CLAUDE.md without permission, and the hook files it routed around. Repo is public: mike-prokhorov/content-factory-engine.

    — Mike Prokhorov, Max plan, day 13. Still waiting.

  3. ianymu commented on May 20, 2026

    @ianymu

    12 days and 51 commits is a brutal pattern to read. I've shipped a Stop hook targeting exactly this failure mode — `verify-before-stop.sh`. It blocks the Stop event when files have changed but no VERIFIED log entry exists from the last 5 minutes, with an explicit `VERIFY_ACTION` + `VERIFIED` two-line audit trail.

    For your case (commits without testing), I'd extend the pattern to also require a `TEST_INVOKED` entry from a separate PreToolUse(Bash) hook that watches for actual test command invocations. The full setup looks like:

    • PreToolUse(Bash) logs `TEST_INVOKED|` whenever Claude calls `pytest`/`npm test`/etc.
    • Stop hook checks both `VERIFIED` AND `TEST_INVOKED` exist before allowing stop

    Free MIT base hook: https://github.com/ianymu/claude-verify-before-stop
    Walkthrough of the 4 patterns I use (this is pattern 2): ianymu/claude-verify-before-stop#2

    Won't fix the underlying model behavior, but it puts a hard guard between "I think it's done" and "session ends without proof". 51 commits worth of `fix(...)` is the kind of thing this catches early.

    Hope it's useful to someone hitting this same wall.

  4. github-actions commented on Jul 8, 2026

    @github-actions

    Closing for now — inactive for too long. Please open a new issue if this is still relevant.

  5. github-actions commented on Sep 9, 2026

    @github-actions

    This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.

  6. locked as resolved and limited conversation to collaborators on Sep 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions