[{"data":1,"prerenderedAt":354},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fgoodharts-law-ate-my-context-window":204,"\u002Fblog\u002Fgoodharts-law-ate-my-context-window-surround":349},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200],{"title":5,"path":6,"stem":7},"You do not have time to not have tests","\u002Fblog\u002Fyou-do-not-have-time-to-not-have-tests","2.blog\u002F20211217.you-do-not-have-time-to-not-have-tests",{"title":9,"path":10,"stem":11},"Migrate Vue 2 with Vuetify and Jest to Vite and Vitest","\u002Fblog\u002Fmigrate-vue-2-with-vuetify-and-jest-to-vite-and-vitest","2.blog\u002F20220109.migrate-vue-2-with-vuetify-and-jest-to-vite-and-vitest",{"title":13,"path":14,"stem":15},"I am a Dark Matter Developer","\u002Fblog\u002Fi-am-a-dark-matter-developer","2.blog\u002F20220626.i-am-a-dark-matter-developer",{"title":17,"path":18,"stem":19},"Why using Conventional commits is useful","\u002Fblog\u002Fusing-conventional-commits","2.blog\u002F20240623.using-conventional-commits",{"title":21,"path":22,"stem":23},"Why you should make a toolbox repository","\u002Fblog\u002Fwhy-you-should-make-a-toolbox-repository","2.blog\u002F20240630.Why-you-should-make-a-toolbox-repository",{"title":25,"path":26,"stem":27},"Apache Airflow Part 1 - Why and Goals for a near Serverless ELT","\u002Fblog\u002Fapache-airflow-part-1-why-and-goals","2.blog\u002F20240710.apache-airflow-part-1-why-and-goals",{"title":29,"path":30,"stem":31},"Oh My Zsh on your server","\u002Fblog\u002Foh-my-zsh-on-your-server","2.blog\u002F20240711.oh-my-zsh-on-your-server",{"title":33,"path":34,"stem":35},"Fire tablet and YouTube Kids","\u002Fblog\u002Ffire-tablet-and-youtube-kids","2.blog\u002F20240714.fire-tablet-and-youtube-kids",{"title":37,"path":38,"stem":39},"Using Ollama and Continue as a GitHub Copilot Alternative","\u002Fblog\u002Fusing-ollama-and-continue-as-github-copilot-alternative","2.blog\u002F20240723.using-ollama-and-continue-as-github-copilot-alternative",{"title":41,"path":42,"stem":43},"Debugging Local Packages Made Easy with pnpm","\u002Fblog\u002Fdebugging-local-packages-with-pnpm-link","2.blog\u002F20250422.debugging local-packages-with-pnpm-link",{"title":45,"path":46,"stem":47},"Two Weeks with Cloudflare AI and Tools","\u002Fblog\u002Ftwo-weeks-with-cloudflare-ai-and-tools","2.blog\u002F20250509.two-weeks-with-cloudflare-aI-and-tools",{"title":49,"path":50,"stem":51},"Adding Prompts to VS Code - How I Learned to Stop Worrying and Love AI Context","\u002Fblog\u002Fadding-prompts-to-vscode","2.blog\u002F20250528.adding-prompts-to-vscode",{"title":53,"path":54,"stem":55},"My Best Practices","\u002Fblog\u002Fmy-best-practicies","2.blog\u002F20250607.my-best-practicies",{"title":57,"path":58,"stem":59},"Creating my own CLI Tool - Towles Tool","\u002Fblog\u002Ftowles-tool","2.blog\u002F20250607.towles-tool",{"title":61,"path":62,"stem":63},"Software Development Best Practices & ITIL","\u002Fblog\u002Fsoftware-engineering-and-itil-best-practices","2.blog\u002F20250612.software-engineering-and-itil-best-practices",{"title":65,"path":66,"stem":67},"Voice to Text","\u002Fblog\u002Fvoice-to-text","2.blog\u002F20250622.voice-to-text",{"title":69,"path":70,"stem":71},"Setting Up ComfyUI - A Better Alternative to Fooocus","\u002Fblog\u002Fcomfy-ui-setup","2.blog\u002F20250628.comfy-ui-setup",{"title":73,"path":74,"stem":75},"Voice to System","\u002Fblog\u002Fvoice-to-system","2.blog\u002F20250705.voice-to-system",{"title":77,"path":78,"stem":79},"Tips for Claude Code","\u002Fblog\u002Ftips-for-claude-code","2.blog\u002F20250713.tips-for-claude-code",{"title":81,"path":82,"stem":83},"Review That AI Code: Why I Read Every Line Generated Code","\u002Fblog\u002Freview-that-ai-code","2.blog\u002F20250720.review-that-ai-code",{"title":85,"path":86,"stem":87},"My Context Engineering Journey: From Dev Scripts to AI Collaboration","\u002Fblog\u002F20250803-1.my-context-engineering-journey","2.blog\u002F20250803-1.my-context-engineering-journey",{"title":89,"path":90,"stem":91},"Context Engineering at Scale: Enterprise Lessons and the Future of Development","\u002Fblog\u002F20250803-2.context-engineering-at-scale","2.blog\u002F20250803-2.context-engineering-at-scale",{"title":93,"path":94,"stem":95},"Check That Your Tools and Linters Do Not Burn Tokens","\u002Fblog\u002Fcheck-that-your-tools-and-linters-do-not-burn-tokens","2.blog\u002F20250806.check-that-your-tools-and-linters-do-not-burn-tokens",{"title":97,"path":98,"stem":99},"Markdown + AI: The Communication Protocol That Changes Everything","\u002Fblog\u002Fmarkdown-plus-ai-the-communication-protocol-that-changes-everything","2.blog\u002F20250814.markdown-plus-ai-the-communication-protocol-that-changes-everything",{"title":101,"path":102,"stem":103},"Finally: Type-Safe AI in Production (And Why I'm Here For It)","\u002Fblog\u002Ffinally-type-safe-ai-in-production-and-why-im-here-for-it","2.blog\u002F20250819.finally-type-safe-ai-in-production-and-why-im-here-for-it",{"title":105,"path":106,"stem":107},"Dotfiles: Masterpiece or Late Stage Picasso?","\u002Fblog\u002Fdotfiles-masterpiece-or-late-stage-picasso","2.blog\u002F20250822.dotfiles-masterpiece-or-late-stage-picasso",{"title":109,"path":110,"stem":111},"Beyond API Wrappers: Building State-Driven MCP Servers for Long-Horizon Agent Orchestration","\u002Fblog\u002Fbeyond-api-wrappers-mcp-servers","2.blog\u002F20250907.beyond-api-wrappers-mcp-servers",{"title":113,"path":114,"stem":115},"Why Vertical Integration Wins: A Software Engineer's Case for Owning Your Stack","\u002Fblog\u002Fwhy-i-bought-tesla-model-3-vertical-integration","2.blog\u002F20250928.why-i-bought-tesla-model-3-vertical-integration",{"title":117,"path":118,"stem":119},"The Min-Maxer's Trifecta: Building Tools for the Game You Actually Play","\u002Fblog\u002Fmin-maxer-trifecta","2.blog\u002F20251004.min-maxer-trifecta",{"title":121,"path":122,"stem":123},"Read The Source: Learning by Cutting Out The Middleman and RTFM","\u002Fblog\u002Fread-the-source","2.blog\u002F20251010.read-the-source",{"title":125,"path":126,"stem":127},"The Exponential Shift: Why AI Progress Feels Different Now","\u002Fblog\u002Fthe-exponential-shift","2.blog\u002F20251015.the-exponential-shift",{"title":129,"path":130,"stem":131},"Plan Mode for Your Problems, Edit Mode for Claude's","\u002Fblog\u002Fplan-mode-problems-edit-mode-solutions","2.blog\u002F20251019.plan-mode-problems-edit-mode-solutions",{"title":133,"path":134,"stem":135},"AWS Aurora DSQL Looked Perfect Until I Needed the Connection String","\u002Fblog\u002Faws-aurora-dsql-postgres-serverless-authentication","2.blog\u002F20251028.aws-aurora-dsql-postgres-serverless-authentication",{"title":137,"path":138,"stem":139},"Switchback: Browser History for Your Thoughts","\u002Fblog\u002Fswitchback-second-order-reasoning","2.blog\u002F20251205.switchback-second-order-reasoning",{"title":141,"path":142,"stem":143},"AI Pairing: Notes to Self","\u002Fblog\u002Fai-pairing-notes-to-self","2.blog\u002F20251216.ai-pairing-notes-to-self",{"title":145,"path":146,"stem":147},"I've Been Sleeping on Zellij","\u002Fblog\u002Fsleeping-on-zellij","2.blog\u002F20251229.sleeping-on-zellij",{"title":149,"path":150,"stem":151},"Implementing a Ralph Wiggum Loop: The Secret is Session Markers","\u002Fblog\u002Fimplementing-ralph-wiggum-loop-for-autonomous-ai-coding","2.blog\u002F20260114.implementing-ralph-wiggum-loop-for-autonomous-ai-coding",{"title":153,"path":154,"stem":155},"Goodhart's Law Ate My Context Window","\u002Fblog\u002Fgoodharts-law-ate-my-context-window","2.blog\u002F20260119.goodharts-law-ate-my-context-window",{"title":157,"path":158,"stem":159},"Claude Code's Hidden Multi-Agent System Is Real","\u002Fblog\u002Fclaude-code-hidden-multi-agent-system","2.blog\u002F20260124.claude-code-hidden-multi-agent-system",{"title":161,"path":162,"stem":163},"Free Printable Math Sheets for Kids — Number Chart, Skip Counting, Multiplication, and More","\u002Fblog\u002Ffree-printable-number-chart-and-coin-sheets","2.blog\u002F20260214.free-printable-number-chart-and-coin-sheets",{"title":165,"path":166,"stem":167},"We Are Near the End of the Exponential","\u002Fblog\u002Fnear-the-end-of-the-exponential","2.blog\u002F20260214.near-the-end-of-the-exponential",{"title":169,"path":170,"stem":171},"Free Printable Language Arts Sheets for Kids — Sight Words, Parts of Speech, Homophones, and More","\u002Fblog\u002Ffree-printable-sight-words-and-grammar-sheets","2.blog\u002F20260215.free-printable-sight-words-and-grammar-sheets",{"title":173,"path":174,"stem":175},"Interactive Code Execution with Artifacts","\u002Fblog\u002Finteractive-code-execution-with-artifacts","2.blog\u002F20260215.interactive-code-execution-with-artifacts",{"title":177,"path":178,"stem":179},"Free Printable Telling Time Worksheet for Kids — Clock Reference & Practice Sheet","\u002Fblog\u002Ffree-printable-telling-time-worksheet","2.blog\u002F20260216.free-printable-telling-time-worksheet",{"title":181,"path":182,"stem":183},"Claude Code Skills: Teaching AI Your Playbook","\u002Fblog\u002Fclaude-code-skills-guide","2.blog\u002F20260221.claude-code-skills-guide",{"title":185,"path":186,"stem":187},"Building a Multi-Agent Loan Approval System with Human-in-the-Loop","\u002Fblog\u002Fmulti-agent-loan-approval-human-in-the-loop","2.blog\u002F20260225.multi-agent-loan-approval-human-in-the-loop",{"title":189,"path":190,"stem":191},"The Inception of AI Infrastructure: Bottlenecks All the Way Down","\u002Fblog\u002Fbiggest-bottleneck-scaling-ai-compute","2.blog\u002F20260313.biggest-bottleneck-scaling-ai-compute",{"title":193,"path":194,"stem":195},"What I Tell Teams About Claude Code","\u002Fblog\u002Fwhat-i-tell-teams-about-claude-code","2.blog\u002F20260314.what-i-tell-teams-about-claude-code",{"title":197,"path":198,"stem":199},"The Hardest Part of AI Isn't the AI","\u002Fblog\u002Fthe-hardest-part-of-ai-isnt-the-ai","2.blog\u002F20260327.the-hardest-part-of-ai-isnt-the-ai",{"title":201,"path":202,"stem":203},"Claude Code Hooks: The Capability I Left on the Table","\u002Fblog\u002Fclaude-code-hooks-capability-left-on-the-table","2.blog\u002F20260401.claude-code-hooks-capability-left-on-the-table",{"id":205,"title":153,"authors":206,"badge":212,"body":214,"date":338,"description":339,"extension":340,"image":341,"meta":344,"navigation":345,"path":154,"seo":346,"status":347,"stem":155,"__hash__":348},"posts\u002F2.blog\u002F20260119.goodharts-law-ate-my-context-window.md",[207],{"name":208,"to":209,"avatar":210},"Chris Towles","https:\u002F\u002Ftwitter.com\u002FChris_Towles",{"src":211},"\u002Fimages\u002Fctowles-profile-512x512.png",{"label":213},"Claude Code",{"type":215,"value":216,"toc":330},"minimark",[217,221,229,237,242,245,248,256,260,263,266,269,272,276,279,292,295,298,302,310,324,327],[218,219,220],"p",{},"When you measure something, it becomes the goal. That's Goodhart's Law. I learned it the hard way last week while watching my ralph wiggum loop run.",[218,222,223,224,228],{},"I'd gotten clever with session resumption. Each iteration would fork from a previous session, loading all that rich context - file discoveries, architectural understanding, previous decisions. The loops looked ",[225,226,227],"em",{},"smart",". They'd start running and immediately seem to know what they were doing.",[218,230,231,232,236],{},"Here's what I was actually optimizing for: ",[233,234,235],"strong",{},"looking productive while I watched",".",[238,239,241],"h2",{"id":240},"the-seduction","The Seduction",[218,243,244],{},"The loops appeared to take action faster. Less \"figuring out\" time, more \"doing\" time. When I'd check in on a running loop, Claude was already deep in the work - reading files, making edits, running tests. No warm-up period. No re-discovery phase.",[218,246,247],{},"It felt like progress. I'd built something clever.",[218,249,250,251,255],{},"I even ",[252,253,254],"a",{"href":150},"wrote a whole blog post"," about the session marker system. Showed off the code. Explained the workflow. Felt pretty good about it.",[238,257,259],{"id":258},"the-reality","The Reality",[218,261,262],{},"Context windows are finite. Every byte I pre-loaded for appearances was a byte I couldn't use for thinking through hard problems.",[218,264,265],{},"My loops looked fast because they skipped the exploration phase. But exploration isn't waste - it's where Claude builds a mental model of the problem. By pre-loading \"answers\" from previous sessions, I was forcing Claude to work with stale context instead of fresh understanding.",[218,267,268],{},"The hard problems - the ones that actually needed solving - got squeezed. Claude would hit the context limit right when the thinking needed to get deep. The loop would compact, lose nuance, and produce shallow solutions.",[218,270,271],{},"I was optimizing for the spectator experience. Making myself feel good watching the terminal. Meanwhile, the actual work suffered.",[238,273,275],{"id":274},"the-fix","The Fix",[218,277,278],{},"Strip it back. Only load what's critical:",[280,281,282,286,289],"ul",{},[283,284,285],"li",{},"Spend time in planning sessions to actually plan.",[283,287,288],{},"Review the plan carefully - time spent here is much cheaper than fixing bad execution.",[283,290,291],{},"Keep context to whats critical",[218,293,294],{},"Let Claude rediscover the codebase each iteration. Yes, it looks slower at the start. Yes, there's a \"figuring out\" phase. But that phase builds fresh context - context that's available when the hard thinking needs to happen.",[218,296,297],{},"Reserve the context budget for problem-solving, not for looking smart.",[238,299,301],{"id":300},"building-in-public-means-showing-the-screwups","Building in Public Means Showing the Screwups",[218,303,304,305,309],{},"I ",[252,306,308],{"href":307},"\u002Fblog\u002Fimplementing-ralph-wiggum-loop-for-autonomous-ai-coding#the-secret-session-markers","struck through the session markers section"," in my previous post. It's still there - you can see what I thought was clever. You can also see the warning that it was wrong.",[218,311,312,313,316,317,323],{},"That's the deal with building in public. You ship your mistakes alongside your wins. The lesson here isn't \"session resumption is bad\" - it's that ",[233,314,315],{},"what you optimize for becomes your goal, whether you meant it to or not",". I've since updated ",[252,318,322],{"href":319,"rel":320},"https:\u002F\u002Fgithub.com\u002FChrisTowles\u002Ftowles-tool\u002F",[321],"nofollow","towles-tool"," and removed all the session marker stuff.",[218,325,326],{},"I measured \"looks fast.\" I got \"looks fast.\" I didn't get \"solves hard problems.\"",[218,328,329],{},"Choose your metrics carefully.",{"title":331,"searchDepth":332,"depth":332,"links":333},"",2,[334,335,336,337],{"id":240,"depth":332,"text":241},{"id":258,"depth":332,"text":259},{"id":274,"depth":332,"text":275},{"id":300,"depth":332,"text":301},"2026-01-19","I optimized my AI coding loop for the wrong thing. It looked fast. It wasn't effective.","md",{"src":342,"alt":343},"\u002Fimages\u002Fblog\u002F20260119-1200-goodharts-law-with-context-window.jpeg","A developer's workspace showing a dramatic split-screen visualization: on the left monitor, a progress bar racing forward with flashy green metrics and spinning activity indicators; on the right monitor, the same task failing silently with truncated output and a warning symbol. A magnifying glass held between the screens reveals the progress bar is hollow - a beautiful shell with nothing inside. Dramatic chiaroscuro lighting with cool blue from the monitors contrasting against warm amber desk lamp, shallow depth of field focusing on the magnifying glass revelation. Cinematic realism, 8k photorealistic quality, noir atmosphere with teal and orange color grading, slightly elevated three-quarter angle capturing the moment of uncomfortable truth.",{"draft":345},true,{"title":153,"description":339},"published","51GX0jz5tpYkJ3L6e9zGN9U3aLVusjnFaH3XwzmddYM",[350,352],{"title":149,"path":150,"stem":151,"description":351,"status":347,"children":-1},"How I turned towles-tool into an autonomous AI coding system using session markers to preserve context across iterations - and the weekend of mistakes that got me there.",{"title":157,"path":158,"stem":159,"description":353,"status":347,"children":-1},"I verified the claim - there's a fully-implemented TeammateTool hiding in Claude Code, feature-flagged but ready to go.",1776221196452]