Skip to content

michel-is-coding/atrophy

Repository files navigation

atrophy

A local, private tool that mirrors your judgment vs autopilot when coding with AI agents, then helps you exercise what you still hold. Built for developers wary of AI over-reliance, cognitive offloading, and the slow erosion of critical thinking.

Offload the work, never the judgment.

License: MIT CI Python 3.9+ stdlib only Data: local & private

atrophy reads your own Claude Code transcripts (aggregates only) and shows, in one glanceable report, whether you are exercising judgment or running on autopilot with AI coding agents. It does not think for you: you decide.

Mirror, not judge. There is no score to optimize, no streak, no coach. The moment a measure becomes a target it stops measuring anything (Goodhart), so atrophy refuses to be a target. It shows you your own behavior and stays out of the way.

What you'll see

One glanceable report, aggregates only. Project names below are placeholders (core-api, billing, dotfiles), the numbers are illustrative:

atrophy end-of-day report: judgment today 77 percent with trend, steering acts, review time, challenge ratio and exposure lines, plus a per-project breakdown

Renders in your terminal from your own data: no dashboard, no upload.

Show the same report as text
  Atrophy · 2026-07-03
  ────────────────────────────────────────────────

  judgment today    77%  ███████████████░░░░░
  trend  7d 76%  30d 74%  ▅▆▆▇▆▆▆   → holding the line

  active time      4h03   across 3 project(s)
  mental window    09:02 → 19:40   (10h38)
  monitoring        12%  ██░░░░░░░░░░░░░░░░░░   22min / 3h05 runtime
  value             93%  ███████████████████░  business · 9 commits
  review           4 of 6 large outputs got review time · 2 under skim time (in-terminal)
  steering           7 acts   4 interrupts · 2 rejections · 1 plan refused
  active judgment   23%  █████░░░░░░░░░░░░░░░  11/47 prompts challenge
  exposure          86% auto-approved · 5 queued while running · 7.4x delegated volume

  projects         judgment             active  focus  commits
  ────────────────────────────────────────────────
  billing   biz    69%  ████████████░░░░░   1h05    46%     3
  core-api  biz    78%  █████████████░░░░   2h40    64%     6
  dotfiles  perso  88%  ███████████████░░  18min   100%     0

  capacity check available: atrophy.py recall   (5 min, optional)

How it works, in three lines. atrophy reads ~/.claude/projects/*/*.jsonl locally, computes aggregates only (counts, durations, ratios: never a prompt, a diff, or a file name, save file basenames behind the opt-in recall --show-paths flag, display only), and renders in your terminal. It makes zero network calls, and CI enforces that with a test that fails the build if any network primitive appears in the code (tests/test_no_network.py).

What it is, and what it is not.

✅ atrophy is ❌ atrophy is not
a private mirror of your judgment a productivity score to maximize
local, aggregates only a tracker that uploads your prompts or code
a silent nightly signal a time tracker or always-on dashboard (RescueTime, WakaTime, ActivityWatch)
an indicator you interpret a verdict, or a moralizing nag
a way to exercise what you hold a coach gamifying your behavior
meant to be outgrown a crutch to optimize and keep forever

Same data, different question. Other tools read the same ~/.claude/projects transcripts to track your token spend (ccusage, Claude-Code-Usage-Monitor) or your session stats (agentsview). atrophy reads them to track your judgment instead.

Jump to: Try it · Install · What it measures · Training, not just watching · Design principles · Why judgment atrophies · Privacy

Contents

Try it in 30 seconds

The analyzer is a single stdlib-only file: if you already use Claude Code, you can see your own mirror right now, with nothing installed and nothing sent anywhere:

uv run https://raw.githubusercontent.com/michel-is-coding/atrophy/main/atrophy.py --no-log

(or git clone and python3 atrophy.py --no-log, same thing.) The report runs on the transcripts already sitting on your disk.

Requirements

  • Python 3.9+ (system Python is fine). The report, week view and practice commands run on macOS, Linux and Windows.
  • The background agents (presence sampling, nightly report at 23:30, hourly guardrail) are macOS only for now: they use launchd. Linux users get everything on demand; native scheduling is a good first issue.

Install

The installer touches only your own machine: it creates ~/.atrophy/ and registers 3 launchd agents under your user account, nothing more. Read install.sh first if you want to see exactly what it does.

git clone https://github.com/michel-is-coding/atrophy.git ~/code/atrophy
cd ~/code/atrophy && ./install.sh

Next step: just work as usual. Your first report appears tonight at 23:30, or run it now with python3 ~/code/atrophy/atrophy.py.

Daily use

  • Report on demand: python3 atrophy.py (or cat ~/.atrophy/last.txt for last night's).
  • In the evening, a 1-to-5 rating "judgment exercised today?", a single integer: bin/atrophy-rate.sh 4 (the nightly report also asks). This is the ground truth your metrics are checked against.
  • Weekly, when you feel like it: python3 atrophy.py week (the 7-day view) and python3 atrophy.py recall (5 minutes, see below).
  • Silent except alert: you are only notified when a threshold is crossed relative to your own baseline (judgment dropping vs your own 30-day distribution, boundary-less day, more than ~10h active).
  • Something looks empty? python3 atrophy.py doctor checks your setup.
  • Scripting: python3 atrophy.py --json (also week --json) emits the aggregates as JSON.

What it measures, exactly

Every number is a proxy, named honestly, so you can judge the judge. Behavioral facts (recorded events) weigh more than lexical guesses (word matching), because you cannot accidentally perform an ESC press.

Signal What it counts Kind Why it matters
judgment / fordism share of prompts that are pure acceptance, delegation of choice, or closure ("ok", "go", "you decide") lexical proxy low-judgment prompting is the assembly-line mode the fordism essay describes
steering interrupts (ESC), tool rejections, plan approvals/refusals, hand-edits of agent-written files recorded fact each one is you actively overriding the machine; the strongest judgment evidence in the data
review large agent outputs that got review time vs accepted faster than a human can skim (threshold scales with output size) timing proxy accepting without checking is the empirical core of over-reliance (Buçinça 2021; Mozannar 2024)
active judgment prompts that verify, contest, or ask for proof lexical proxy verification is where critical thinking now lives (Lee et al., CHI 2025)
exposure share of prompts under auto-approval modes, prompts queued while the agent ran, delegated volume descriptive fact context for everything above: zero rejections under full auto-approval means something different
monitoring active presence while the agent runs (macOS) presence sampling attention allocation is the automation-complacency mechanism (Parasuraman 2010)
value commits + business share of active time output proxy 18h of agent runtime is not revenue; feeling productive is not producing
ground truth your nightly 1-5 rating correlated with the measured judgment (only shown once 15+ days are rated: less is statistical noise) self-report if the felt sense and the measure diverge, the metric is theater and must be fixed. This guard is part of the tool

None of these is a score to push. Days differ legitimately: a boilerplate day should be delegated heavily. The mirror shows the pattern; you decide what it means.

Training, not just watching

Observation is layer one. What fades without use does not come back by being watched, so atrophy v0.2 adds a practice layer: opt-in, rare, self-graded, never notified, never scored. It applies the two intervention mechanisms with the strongest meta-analytic support (retrieval practice, g around .5-.6; self-explanation, g around .55) to the moments your own transcripts show you delegated the most and examined the least.

  • python3 atrophy.py recall (5 minutes, suggested weekly). Picks the week's most-delegated, least-examined moments (heaviest agent output that you never interrupted, rejected, or challenged) and asks you to answer from memory: what did that session change? why that approach? where would it break first? You self-grade each moment held / fuzzy / gone. Only the three counts are stored. The point is not the grade: it is the felt experience of discovering what is no longer in your head, while you can still do something about it.
  • python3 atrophy.py audit (suggested monthly). Proposes one unassisted rep: a small real task in your most-delegated project, done without the agent. audit --done N records the date and how it felt (1-5), nothing else. Unassisted performance is precisely what degrades under assistance (Liu et al. 2026, N=1,222) and precisely what no passive metric can see.

No streaks, no badges, no reminders beyond one dim line in the report, at most weekly, when a check is stale. Gaming these means actually knowing your codebase or actually doing a task by hand, which is the goal itself, so there is nothing to game.

Design principles

  • Mirror, not judge. Goodhart's law: "when a measure becomes a target, it ceases to be a good measure." The tool stays silent and celebrates judgment exercised.
  • Facts over words. Recorded behavior (ESC, rejections, plan verdicts, hand-edits) counts more than word-matching, and cannot be performed by changing your vocabulary.
  • Your baseline, not a universal one. Alerts compare you to your own 30-day distribution, not to an arbitrary constant.
  • The scarce asset is judgment, not time. Delegating execution is healthy; delegating strategic judgment sells off the asset that actually creates value.
  • Feeling productive is not producing. Hence the value axis (business %, commits): 18 hours of agent runtime is not revenue.
  • Closing beats accumulating (the Zeigarnik effect: an open loop keeps running in your head). One closed session beats a 14-hour open one.
  • Show uncertainty or show nothing. No correlation verdict under 15 rated days; no steering line on a day with zero acts (a quiet day is not a failure).
  • The goal is to be able to throw the tool away: internalize the reflex, not a crutch.

Why judgment atrophies

Something is quietly changing in how we think. As we hand more of our reasoning to AI agents, a trade slips by unnoticed: the work still gets done, the output still ships, but the faculty that used to produce it, judgment, is exercised less and less, and what isn't exercised fades.

The research is starting to measure it. In a randomized trial of 1,222 people, those helped by AI did better while assisted, then did sharply worse the moment the tool was taken away, and gave up faster on their own (Liu et al., 2026). A study of 666 people tied heavy AI use to lower critical-thinking scores, mediated by cognitive offloading (Gerlich, 2025). An EEG study reported weaker brain connectivity during AI-assisted writing, and participants who could not quote their own essays minutes after writing them (Kosmyna et al., 2025). In the first real-world clinical evidence of AI deskilling, experienced endoscopists' unassisted detection rates dropped measurably within months of AI-assisted practice (Budzyń et al., Lancet Gastro Hep 2025). And in the METR randomized trial, experienced developers using AI believed they were 20% faster while actually being 19% slower: the gap between felt and real is itself the phenomenon.

Here is the trap of a great "productivity session" with the machine: the deliverable looks the same, the dopamine of watching little digital workers ship for you is real, and nothing tells you your own capacity just dropped a notch. The cost never shows up in the output. It shows up only in what you can still do without the tool, which is exactly what you stop testing. atrophy tests it, gently, on your own data.

AI is commoditizing production itself, in code first, then writing, analysis, design, decisions. The one thing that stays scarce is judgment. atrophy exists to preserve it, and to make it measurable and usable, before it too is commoditized.

Config (optional)

  • Your repos are not under ~/code? export ATROPHY_REPO_BASE=~/your-dir (otherwise the value axis shows 0 commits / 0% business).
  • Business vs personal tagging: cp atrophy-projects.tsv.example ~/.atrophy/projects.tsv then edit it.
  • Data lives in ~/.atrophy/ (override with $ATROPHY_HOME): the aggregate log, ratings, recall/audit counts. Plain text files you can read, edit, or delete anytime.

Optional LLM

Run python3 atrophy.py --llm to classify your substantive prompts into strategic / technical / creative via a local model (llama.cpp, OFFLINE). With no model installed, the rest still works and this lens disables cleanly. Model: --llm-model <path.gguf>.

Privacy

Everything is local: aggregates / labels only, never a prompt, code, or client name persisted, nothing leaves the machine (the LLM included). Your data lives in ~/.atrophy/ (outside the repo). One explicit carve-out, documented here and in the code: the practice commands (recall, --llm) read transcript text in memory at question time, like every command reads the transcripts; what they display is project names, dates and sizes (file names only behind the recall --show-paths flag); what they persist is counts. Nothing raw is ever written or transmitted.

Uninstall

cd ~/code/atrophy && ./uninstall.sh

Limitations and honest caveats

  • An indicator, not a verdict. This is an honest mirror, never a moral score. The numbers inform your own judgment, they do not replace it.
  • Not a target to optimize (anti-Goodhart). The tool is silent on purpose. Gaming a judgment percentage just degrades the measure, and the thing it stands for.
  • Review is measured in-terminal only. If you review diffs in your editor or git diff in another pane and then type "ok", the review line cannot see it and will call the accept fast. Read the review line with that in mind.
  • Proxies, not ground truth. Lexical signals can be fooled, especially by someone who knows the lexicon; that is why the behavioral facts (steering, exposure) exist and weigh more. "Delegated volume" is context, not a judgment measure: the research says volume mostly reflects the task, not the thinking.
  • Local and aggregates only. Nothing leaves the machine. No prompt, code, or client name is ever persisted, which is the direct answer to "isn't this self-surveillance?".
  • macOS gets the full experience (presence, nightly report); other platforms get everything on demand. See #6.
  • Bilingual detection (FR + EN), calibrated mostly on real French. The English token set is younger and still being calibrated (see ROADMAP.md).
  • Claude Code transcripts have ~30-day retention by default: atrophy snapshots your daily aggregates into ~/.atrophy/atrophy.md so the trend survives the source expiring.

Contributing

See CONTRIBUTING.md. The "prompt fordism" framing comes from Jad1908's essay, Prompting is the New Fordism (see CREDITS.md); atrophy measures what that essay describes. See ROADMAP.md for where help is most wanted, and docs/design-v2.md for the full evidence base behind every metric.

Further reading

About

Still exercising judgment, or just accepting what the AI says? A local, private tracker of cognitive offloading and AI over-reliance, from your own transcripts. A personal proxy of the Offloading Score. Aggregates-only. Offload the work, never the judgment.

Topics

Resources

License

Contributing

Stars

1 star

Watchers

0 watching

Forks

Packages

 
 
 

Contributors