[{"data":1,"prerenderedAt":583},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fswitchback-second-order-reasoning":204,"\u002Fblog\u002Fswitchback-second-order-reasoning-surround":578},[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":137,"authors":206,"badge":212,"body":214,"date":567,"description":568,"extension":569,"image":570,"meta":573,"navigation":574,"path":138,"seo":575,"status":576,"stem":139,"__hash__":577},"posts\u002F2.blog\u002F20251205.switchback-second-order-reasoning.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},"Development",{"type":215,"value":216,"toc":557},"minimark",[217,226,229,234,237,248,251,255,258,405,408,411,415,418,421,424,427,430,434,437,440,443,446,449,452,456,459,475,478,482,485,488,502,505,509,512,515,518,522,525,528,531,534,537,543,550,553],[218,219,220,221,225],"p",{},"I just had one of those ideas that feels simultaneously obvious and novel. An app called ",[222,223,224],"strong",{},"Switchback"," - like browser history, but for chains of reasoning.",[218,227,228],{},"The core concept: a doubly linked list where each node is a thought, and you can navigate forward and backward through the chain. World of Goo meets mindmap meets TODO list.",[230,231,233],"h2",{"id":232},"the-meta-part","The Meta Part",[218,235,236],{},"Writing this post IS the first use case. Here's the actual reasoning chain that led here:",[238,239,244],"pre",{"className":240,"code":242,"language":243},[241],"language-text","\"I need a new project folder\"\n  ↓\n\"I should improve my project folder creation\"\n  ↓\n\"Add it to my towles-tool CLI\"\n  ↓\n\"Wait, make a Claude plugin instead\"\n  ↓\n\"Easier to share - skill or command?\"\n  ↓\n\"Make \u002Ftt:one-off that creates one-offs\u002F2025\u002F2025-12-05\"\n  ↓\n\"Actually, this pattern is the real project\"\n  ↓\n\"Call it Switchback\"\n  ↓\n\"Write a blog post to think through it\"\n","text",[245,246,242],"code",{"__ignoreMap":247},"",[218,249,250],{},"Each arrow is a context switch. Each node is a perfectly-sized task for an AI agent. The chain gives full context.",[230,252,254],{"id":253},"why-doubly-linked-lists","Why Doubly Linked Lists?",[218,256,257],{},"This is the data structure I never had a good excuse for.",[238,259,263],{"className":260,"code":261,"language":262,"meta":247,"style":247},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","interface ReasonNode {\n  id: string;\n  content: string;\n  prev: ReasonNode | null;\n  next: ReasonNode | null;\n  timestamp: Date;\n  chain: 'work' | 'dad' | 'house' | string;\n}\n","typescript",[245,264,265,282,298,310,328,344,357,399],{"__ignoreMap":247},[266,267,270,274,278],"span",{"class":268,"line":269},"line",1,[266,271,273],{"class":272},"spNyl","interface",[266,275,277],{"class":276},"sBMFI"," ReasonNode",[266,279,281],{"class":280},"sMK4o"," {\n",[266,283,285,289,292,295],{"class":268,"line":284},2,[266,286,288],{"class":287},"swJcz","  id",[266,290,291],{"class":280},":",[266,293,294],{"class":276}," string",[266,296,297],{"class":280},";\n",[266,299,301,304,306,308],{"class":268,"line":300},3,[266,302,303],{"class":287},"  content",[266,305,291],{"class":280},[266,307,294],{"class":276},[266,309,297],{"class":280},[266,311,313,316,318,320,323,326],{"class":268,"line":312},4,[266,314,315],{"class":287},"  prev",[266,317,291],{"class":280},[266,319,277],{"class":276},[266,321,322],{"class":280}," |",[266,324,325],{"class":276}," null",[266,327,297],{"class":280},[266,329,331,334,336,338,340,342],{"class":268,"line":330},5,[266,332,333],{"class":287},"  next",[266,335,291],{"class":280},[266,337,277],{"class":276},[266,339,322],{"class":280},[266,341,325],{"class":276},[266,343,297],{"class":280},[266,345,347,350,352,355],{"class":268,"line":346},6,[266,348,349],{"class":287},"  timestamp",[266,351,291],{"class":280},[266,353,354],{"class":276}," Date",[266,356,297],{"class":280},[266,358,360,363,365,368,372,375,377,379,382,384,386,388,391,393,395,397],{"class":268,"line":359},7,[266,361,362],{"class":287},"  chain",[266,364,291],{"class":280},[266,366,367],{"class":280}," '",[266,369,371],{"class":370},"sfazB","work",[266,373,374],{"class":280},"'",[266,376,322],{"class":280},[266,378,367],{"class":280},[266,380,381],{"class":370},"dad",[266,383,374],{"class":280},[266,385,322],{"class":280},[266,387,367],{"class":280},[266,389,390],{"class":370},"house",[266,392,374],{"class":280},[266,394,322],{"class":280},[266,396,294],{"class":276},[266,398,297],{"class":280},[266,400,402],{"class":268,"line":401},8,[266,403,404],{"class":280},"}\n",[218,406,407],{},"Navigate forward: \"What did this lead to?\"\nNavigate backward: \"Why was I thinking about this?\"",[218,409,410],{},"I'm wondering if I could build a minimal web app around this structure. Simple UI to add nodes, navigate chains, tag them.",[230,412,414],{"id":413},"multiple-chains","Multiple Chains",[218,416,417],{},"The killer feature: multiple independent chains running simultaneously.",[218,419,420],{},"My work chain might be: \"Fix bug → Review PR → Deploy → Monitor metrics\"",[218,422,423],{},"My dad chain: \"Soccer practice → Buy cleats → Register for spring league\"",[218,425,426],{},"My house chain: \"Leaky faucet → YouTube tutorial → Hardware store → Actually call plumber\"",[218,428,429],{},"Each chain is isolated. No mixing contexts. No overwhelming single TODO list.",[230,431,433],{"id":432},"stream-of-consciousness-capture","Stream of Consciousness Capture",[218,435,436],{},"The hardest part of task management isn't doing tasks. It's capturing them without breaking flow.",[218,438,439],{},"Switchback would let me dump thoughts rapid-fire:",[218,441,442],{},"\"Need to update DNS\"\n→ New node, work chain",[218,444,445],{},"\"Kids need new backpacks\"\n→ New node, dad chain",[218,447,448],{},"\"Blog post idea about reasoning chains\"\n→ New node, meta chain",[218,450,451],{},"The chain structure preserves context automatically. Each node knows why it exists.",[230,453,455],{"id":454},"from-thought-to-task","From Thought to Task",[218,457,458],{},"Here's where it gets practical. Each node in the chain could become:",[460,461,462,466,469,472],"ul",{},[463,464,465],"li",{},"A task for an AI agent (with full context from the chain)",[463,467,468],{},"A calendar event",[463,470,471],{},"A note to my future self",[463,473,474],{},"Nothing - just a recorded thought",[218,476,477],{},"The chain itself tells the story. The agent can traverse backward to understand \"why\" before executing \"what.\"",[230,479,481],{"id":480},"what-i-dont-know-yet","What I Don't Know Yet",[218,483,484],{},"This is conceptual. I haven't built it. I'm thinking out loud.",[218,486,487],{},"Open questions:",[460,489,490,493,496,499],{},[463,491,492],{},"How do chains merge or split?",[463,494,495],{},"What happens to abandoned chains?",[463,497,498],{},"Do chains need tagging beyond just the name?",[463,500,501],{},"Is this just a fancy linked list that nobody needs?",[218,503,504],{},"Writing this post is part of figuring it out.",[230,506,508],{"id":507},"why-this-might-matter","Why This Might Matter",[218,510,511],{},"Most task apps assume tasks are independent units. They're not. Tasks have context chains.",[218,513,514],{},"Most note apps assume notes are documents. They're not. They're nodes in reasoning graphs.",[218,516,517],{},"Switchback sits in the middle. Lightweight enough to capture thoughts. Structured enough to become action.",[230,519,521],{"id":520},"next-steps","Next Steps",[218,523,524],{},"I might build this. I might not.",[218,526,527],{},"But I'll definitely use the reasoning chain from this post. That chain is already valuable - it captured the evolution from \"I need a folder\" to \"I need an app.\"",[218,529,530],{},"The doubly linked list preserved the context. I can navigate back to any decision point and ask \"why did I think this?\"",[218,532,533],{},"That's the test. If the tool helps me understand my own thinking better, it's worth building.",[535,536],"hr",{},[218,538,539,540],{},"The project folder for this idea? ",[245,541,542],{},"one-offs\u002F2025\u002F2025-12-05\u002Fswitchback",[218,544,545,546,549],{},"Created automatically by the ",[245,547,548],{},"\u002Ftt:one-off"," command I built while thinking about this problem.",[218,551,552],{},"Meta all the way down.",[554,555,556],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":247,"searchDepth":284,"depth":284,"links":558},[559,560,561,562,563,564,565,566],{"id":232,"depth":284,"text":233},{"id":253,"depth":284,"text":254},{"id":413,"depth":284,"text":414},{"id":432,"depth":284,"text":433},{"id":454,"depth":284,"text":455},{"id":480,"depth":284,"text":481},{"id":507,"depth":284,"text":508},{"id":520,"depth":284,"text":521},"2025-12-05","Designing a doubly linked list app to navigate chains of reasoning - and how writing this post became the first use case.","md",{"src":571,"alt":572},"\u002Fimages\u002Fblog\u002F20251205-1830-switchback-reasoning-tracker.png","Switchback reasoning tracker concept",{},true,{"title":137,"description":568},"published","JqMasMslYugItJwJcPU0JVjWK6ywTyGC0fPbqXyjKUM",[579,581],{"title":133,"path":134,"stem":135,"description":580,"status":576,"children":-1},"I researched unsupported features, checked pricing, deployed the stack—then discovered IAM-only auth means 15-minute tokens. Here's why that killed it for my Cloudflare Workers deployment.",{"title":141,"path":142,"stem":143,"description":582,"status":576,"children":-1},"My ever-evolving tips for pairing with AI - not rules, just habits I keep forgetting",1776221196452]