[BUG] Content filter 400 after 1h 46m run, zero files written, mis-diagnosed as token limit

Resolved 💬 1 comment Opened May 3, 2026 by qxaminer Closed Jun 2, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

I used claude Opus to create a prompt for Claude Code. It gave me instructions in my prompt to write a "Vonnegut-style pastiche" and to populate kjv_gospel_excerpts.txt. When Claude Code went to generate that content, the output classifier likely flagged it as reproduction of copyrighted/preexisting text and killed the response. Claude Opus admitted "That was my mistake in the prompt, and I should have seen it. The whole reason I substituted "pastiche" for actual Vonnegut was to dodge copyright, but the filter doesn't know your intent”. The gave this explanation, "The 1.5 hour runtime is a separate failure and it's on Claude Code's side, not yours and not really mine. The known pattern from the Claude Code issue tracker: Claude Code stops mid-session with this error, and retries (downgrading versions, fresh sessions, disabling commands) don't help. It also enters retry loops where it re-attempts the blocked output instead of failing fast. You weren't being charged thinking-time for productive work; you were watching it bang against the same wall."

What Should Happen?

How the interface should have caught this:
Streaming file writes. Every file should land on disk the moment it's generated, not all at once at the end. If notebook 01 had been written before the filter blocked notebook 02's pastiche cell, you'd have something to show for the run.
Fail-fast on filter errors. A 400 with content filtering policy should terminate immediately with a clear surfaced reason ("the model tried to generate content matching X and was blocked"), not retry silently. Right now Claude Code's error handling on this specific 400 is bad enough to be a tracked open bug.
Cost/time ceilings. Claude Code Max sessions should let you set "stop if this run exceeds 30 minutes or $X" as a hard cap. The fact that it cooked for 1h 46m without checking in is a UX failure regardless of the underlying error.
Pre-flight content scan. Before generating, the agent could flag prompts containing instructions like "write in the style of [named author]" or "generate sample text resembling [copyrighted source]" as filter-likely. This is doable with a cheap classifier pass.

Error Messages/Logs

API Error: 400 
     {"type":"error","error":{"type":"invalid_request_error","message":"Output 
     blocked by content filtering                                            
     policy"},"request_id":"req_011Cag2R9VgHwY63ATzq2zS7"}                      
                                                                                
✻ Cooked for 1h 46m 32s                                                         
                                                                                
❯ why did we get an API Error 400?  How far did you get?                        
                                                          
⏺ Let me check what was actually created before the error hit.                  
                                                                                
  Listed 1 directory (ctrl+o to expand)      
                                                                                
⏺ Nothing was created - the error hit before any files were written. The 400 was
   almost certainly an output token limit exceeded error: the previous attempt
  tried to generate all notebooks, all source files, READMEs, and both repos in 
  a single response, which is too large to emit at once.          
                                                                                
  The fix is to scaffold both repos in parallel agents, each working            
  independently, then write the top-level README myself. Starting now.          
  ⎿  API Error: {"type":"error","error":{"details":null,"type":"invalid_request_
     error","message":"Output blocked by content filtering        
     policy"},"request_id":"req_011Cag2qhvEq7rjPvQ5rfZBZ"}                      
                                                                                
✻ Cooked for 50s                                                                
                                                                                
❯ give me the output up to the error                                            
                                                                                
⏺ I don't have it. The previous turn isn't in my context - only your message    
  asking about it is here. The 400 error terminated that response before it was
  committed to the conversation history, so there's nothing for me to show you. 
   
  What I can tell you for certain: zero files were written. Both repo           
  directories are absent, which means every tool call from that turn either
  never fired or was rolled back when the turn failed.                          
                                                                  
  The most likely cause: the model tried to emit all notebook content, all      
  source files, and both READMEs in a single uninterrupted stream. Jupyter
  notebooks in particular are large JSON blobs; four of them plus a dozen Python
   files in one response easily blows the output token ceiling and returns 400.

Steps to Reproduce

❯ Create two sibling repositories under /Users/verofield/Development/JesusBaby/
for hands-on study of latent space arithmetic. The parent directory already
exists. The pedagogical goal is to understand why concept blending works in
some architectures and fails in others, by building progressively from
scratch. I am a visual thinker and a learner; prioritize clarity and inline
pedagogical comments over cleverness.

Hard constraints across both repos:

  • No em dashes anywhere in code, comments, READMEs, or commit messages
  • Use torch MPS backend, never CUDA
  • Local-first. Do not auto-download large datasets; document manual steps in

README

  • Pin versions in pyproject.toml; prefer uv for installs; Python 3.11
  • Every Python file has a module docstring stating its pedagogical purpose,

not just its function

  • Each repo gets AGENTS.md (stable guidance, points to NEXT_STEPS.md as first

read) and NEXT_STEPS.md (current state, next 3 actions, open questions,
do-not-regress-on list)

  • git init each repo; first commit "scaffold: initial structure" after files

are written

  • For LLM work, use HuggingFace transformers loading Qwen 2.5-3B-Instruct

directly. Ollama cannot expose hidden-state activations through its API, so
it is unusable for steering work. Document this explicitly in the steering
README so future me does not retry it.

============================================================
REPO 1: latent-text-lab
Path: /Users/verofield/Development/JesusBaby/latent-text-lab
============================================================

Purpose: Build text-domain latent space experiments from VAE first principles
up through activation steering on a local LLM. The arc shows why VAEs
collapse on text (posterior collapse) and why activation steering on a
pretrained LLM is the modern, honest path to concept arithmetic.

Structure:
latent-text-lab/
├── AGENTS.md
├── NEXT_STEPS.md
├── README.md
├── pyproject.toml
├── .gitignore
├── data/
│ ├── .gitkeep
│ └── samples/
│ ├── kjv_gospel_excerpts.txt (small public domain sample, ~50
lines)
│ └── vonnegut_style_pastiche.txt (original pastiche I write, NOT
copyrighted text, clearly labeled as pastiche)
├── notebooks/
│ ├── 01_mnist_vae.ipynb
│ ├── 02_char_vae_posterior_collapse.ipynb
│ └── 03_activation_steering.ipynb
├── src/
│ ├── __init__.py
│ ├── vae/
│ │ ├── __init__.py
│ │ ├── mnist_vae.py # Conv VAE, fully implemented
│ │ ├── char_vae.py # Bowman 2015 LSTM VAE, fully impl
──── (83 lines hidden) ──────────────────────────────────────────────────────
on its training distribution. The output may look better than VAE or
StyleGAN blends and still be less geometrically meaningful.

src/animate/README.md content: Moonshot plan. Render latent-walk frames at
consistent interval, encode to mp4, optionally pair with TTS narration
generated from latent-text-lab steering outputs. Cross-repo dependency noted:
depends on text-lab producing usable steering outputs first.

src/stylegan/README.md content: Apple Silicon notes. Some StyleGAN ops fall
back to CPU on MPS; document which and which env vars to set. Reference
NVIDIA's StyleGAN2-ADA-pytorch for canonical reference; we use the rosinality
port or e4e fork that runs without custom CUDA ops.

src/diffusion/README.md content: Explicit framing: dual-image conditioning is
not latent arithmetic. The diffusion model has no algebraic blend operator;
IP-Adapter injects cross-attention conditioning from two reference images and
lets the denoising process compromise. Worth experiencing the difference
firsthand.

pyproject.toml dependencies: torch, torchvision, diffusers, transformers,
accelerate, Pillow, numpy, matplotlib, jupyter, tqdm. Document optional deps
for StyleGAN (ninja may be needed on some setups, document fallback).

AGENTS.md: Orient to the three-rung ladder (VAE, StyleGAN W+, diffusion
blend), point at NEXT_STEPS.md, hard constraints.

NEXT_STEPS.md: Current state ("scaffolded, no weights downloaded"). Next 3
actions: (1) acquire CelebA subset and place in data/, (2) run notebook 01 to
train VAE, (3) download StyleGAN2 FFHQ weights for notebook 02. Open
questions: which encoder (e4e vs pSp) projects most cleanly on faces I
supply; whether MPS will hit any unsupported op. Do-not-regress-on: MPS only,
no auto-downloads, honest framing on diffusion blending.

============================================================
TOP-LEVEL DELIVERABLE
============================================================

After scaffolding both repos, write a single file at
/Users/verofield/Development/JesusBaby/README.md that orients to the project
as a whole:

  • Why two repos (different stacks, isolated dependencies, parallel learning

arcs)

  • The shared four-week curriculum across them
  • The moonshot: animated visual outputs paired with steered-LLM TTS narration

as the integration point

  • Explicit non-goal: this is not a product, it is a learning lab. Pedagogy

over polish.

End the run by printing a summary of what was created and the suggested first
command to run in each repo.

Claude Model

Opus

Is this a regression?

No, this never worked

Last Working Version

_No response_

Claude Code Version

2.1.126 (Claude Code)

Platform

Anthropic API

Operating System

macOS

Terminal/Shell

Terminal.app (macOS)

Additional Information

⎿  API Error: 400
{"type":"error","error":{"type":"invalid_request_error","message":"Output
blocked by content filtering
policy"},"request_id":"req_011Cag2R9VgHwY63ATzq2zS7"}

What's Wrong?

A scaffolding task ran for 1 hour 46 minutes and 32 seconds, then terminated with a content-filter 400. Zero files were written to disk. The session burned ~1h 46m of Max-plan compute and produced nothing.

API Error: 400 {"type":"error","error":{"type":"invalid_request_error","message":"Output blocked by content filtering policy"},"request_id":"req_011Cag2R9VgHwY63ATzq2zS7"}

A retry produced a second identical 400: req_011Cag2qhvEq7rjPvQ5rfZBZ

The Task

Scaffold two Python repos for local ML learning experiments (VAEs, activation steering, StyleGAN). Among the files to create were:

  • data/samples/kjv_gospel_excerpts.txt (a small King James Version sample, public domain since 1611, no copyright anywhere on earth)
  • An original pastiche file written in a referenced author's voice, explicitly framed in the prompt as original prose, not reproduction

Three Compounding Failures

1. False positive on public domain text. The KJV is unambiguously public domain. Blocking generation of KJV passages as 'regurgitation of pre-existing materials' is a misclassification. The filter should either (a) not trigger on demonstrably public domain sources, or (b) be overridable when the user asserts public domain status with citation. This false-positive class is also visible in #16178 (Japanese kana lookup tables), #4210 (Mozilla Public License text), and #25934 (community health files).

2. No fail-fast on filter errors. No incremental writes. The agent batched the entire two-repo scaffold into a single output stream and apparently retried against the filter for 1h 46m. There is no observable progress, no incremental file creation, no commit-as-you-go, and no early termination on a hard 400. Per #6948 and #25934, this retry-loop pattern on content-filter 400s is known and unfixed. A 400 with invalid_request_error and an explicit filter message should terminate the run immediately and surface the real cause to the user.

3. Mis-diagnosis by the agent. When asked what happened, Claude Code told the user: 'this was an output token limit exceeded error.' That is incorrect with high confidence. The error class is invalid_request_error, the message is literally 'Output blocked by content filtering policy', and these are not interchangeable failure modes. The agent should report the actual error class, not invent plausible-sounding alternatives.

Expected Behavior

  • Public domain text (KJV, Project Gutenberg, government works, etc.) does not trigger the regurgitation filter, or the filter is overridable on a per-prompt basis with public-domain attestation.
  • A content-filter 400 fails fast: terminate the run, surface the actual error class verbatim, do not silently retry.
  • File writes are streamed and committed incrementally so partial work survives interrupted sessions.
  • The agent reports the actual error class accurately rather than speculating.

Environment

  • Claude Code version: [fill in: run claude --version]
  • Platform: Anthropic API, Claude Max plan
  • OS: macOS (Mac Mini M4, 16GB)
  • Model: [fill in: default Sonnet unless overridden]

Cost Impact

1h 46m 32s of Max-plan compute. Zero files produced. Requesting credit review for the wasted session.

Request IDs

  • req_011Cag2R9VgHwY63ATzq2zS7
  • req_011Cag2qhvEq7rjPvQ5rfZBZ

Reproduction Notes

I no longer have the verbatim prompt in my buffer, but the structure was: a single multi-thousand-token Claude Code prompt asking to scaffold two sibling repos, including instructions to write small text files to data/samples/ containing (a) KJV gospel excerpts and (b) an explicitly-original author-style pastiche. Happy to share the full prompt privately if helpful for repro.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗