[BUG] Restore persistent file read visibility - current lack of observability causes non-deterministic debugging nightmares

Resolved 💬 4 comments Opened Jan 31, 2026 by njoyedevs Closed Feb 4, 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?

<html>
<body>
<!--StartFragment--><p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Problem: There is currently <strong>no reliable way to see which files Claude Code is reading</strong> during operation. The <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">Ctrl+O</code> verbose toggle doesn't persist between sessions (see #3217, #7012), and there's no <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">settings.json</code> option to enable this permanently (#11173).</p>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">This isn't a nice-to-have feature—it's critical for understanding why Claude Code behaves inconsistently.</p>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Why This Matters</h2>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">Without file read visibility:</p>
<ol class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3">
<li class="whitespace-normal break-words pl-2"><strong>Debugging becomes impossible.</strong> When Claude produces incorrect output, I can't tell if it read the wrong file, skipped a file, or read a stale cached version. I'm left guessing.</li>
<li class="whitespace-normal break-words pl-2"><strong>Behavior is non-deterministic.</strong> Claude sometimes reads files fully, sometimes samples them with grep, sometimes skips them entirely—and I have no way to know which happened. Same prompt, same codebase, different results. This is documented in #7533 where Claude turns 4 Read operations into 30+ fragmented calls after context compaction.</li>
<li class="whitespace-normal break-words pl-2"><strong>Trust erodes.</strong> I can't verify Claude followed my instructions. If I say "read config.yaml before proceeding" and Claude silently skips it, I only discover this after wasted time debugging downstream errors.</li>
<li class="whitespace-normal break-words pl-2"><strong>The Tool is Unusable for Serious Work.</strong> Professional development requires reproducibility. "Claude randomly decided not to read that file" is not an acceptable failure mode.</li>
</ol>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">What I Expected</h2>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">When I started using Claude Code, file reads were visible in the output. I could see exactly which files were accessed and confirm Claude had the context it needed. <strong>This observability was removed or broken in recent updates.</strong></p>
<p class="font-claude-response-body break-words whitespace-normal leading-[1.7]">I expected at minimum:</p>
<ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3">
<li class="whitespace-normal break-words pl-2">A persistent setting (not session-only) to show all file reads</li>
<li class="whitespace-normal break-words pl-2">Clear indication when files are skipped or partially read</li>
<li class="whitespace-normal break-words pl-2">Visibility into sub-agent/Task tool file access (#3978)</li>
</ul>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Current Workarounds (All Inadequate)</h2>
<div class="overflow-x-auto w-full px-2 mb-6">
Workaround | Problem
-- | --
claude --verbose | Doesn't persist; must remember every launch
Ctrl+O toggle | Resets every session (bug)
Shell alias | Breaks IDE integrations and scripts
--debug flag | Too noisy, outputs to wrong stream (#4859)

</div>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Requested Solution</h2>
<ol class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3">
<li class="whitespace-normal break-words pl-2"><strong>Add a persistent <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">verbose</code> or <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">showFileReads</code> setting</strong> in <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">~/.claude/settings.json</code> that survives sessions</li>
<li class="whitespace-normal break-words pl-2"><strong>Fix the <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">Ctrl+O</code> toggle</strong> so it actually persists</li>
<li class="whitespace-normal break-words pl-2"><strong>Show file reads by default</strong> (or at least make it a first-run prompt choice)</li>
<li class="whitespace-normal break-words pl-2"><strong>Expose Task tool / sub-agent file access</strong> - the current "black box" behavior (#1921) is unacceptable</li>
</ol>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Environment</h2>
<ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3">
<li class="whitespace-normal break-words pl-2">Claude Code version: [your version]</li>
<li class="whitespace-normal break-words pl-2">OS: [your OS]</li>
<li class="whitespace-normal break-words pl-2">Shell: [your shell]</li>
</ul>
<h2 class="text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold">Related Issues</h2>
<ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3">
<li class="whitespace-normal break-words pl-2">#3978 - Task tool lacks transparency</li>
<li class="whitespace-normal break-words pl-2">#7533 - Claude prioritizes context preservation over correctness</li>
<li class="whitespace-normal break-words pl-2">#2595 - Need a way to enforce entire file reading</li>
<li class="whitespace-normal break-words pl-2">#1921 - Missing progress feedback in SDK mode</li>
<li class="whitespace-normal break-words pl-2">#6308 - No granular verbosity controls</li>
<li class="whitespace-normal break-words pl-2">#11173 - Request for settings.json verbose key</li></ul><!--EndFragment-->
</body>
</html>

What Should Happen?

When I started using Claude Code, file reads were visible in the output. I could see exactly which files were accessed and confirm Claude had the context it needed. This observability was removed or broken in recent updates.
I expected at minimum:

A persistent setting (not session-only) to show all file reads
Clear indication when files are skipped or partially read
Visibility into sub-agent/Task tool file access (#3978)

Error Messages/Logs

Steps to Reproduce

Just make a call to read several documents.

Claude Model

None

Is this a regression?

Yes, this worked in a previous version

Last Working Version

_No response_

Claude Code Version

2.1.29 (Claude Code)

Platform

Anthropic API

Operating System

Ubuntu/Debian Linux

Terminal/Shell

Windows Terminal

Additional Information

_No response_

View original on GitHub ↗

This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗