Zen of Unix Tools: Code is Context

Context: Metaconversation about the nature of AI collaboration, creative process, and why Unix philosophy matters.


Jason: read ~/.claude/CLAUDE.md and this CLAUDE.md and familiarize yourself

Claude: I’ve reviewed both CLAUDE.md files. Here’s what I understand:

Global standards (~/.claude/CLAUDE.md):

  • Run lint/tests before changes, check _FRAGILE.md for danger zones
  • React hooks: proper deps, useCallback for async, useMemo for derived values
  • Files < 300 lines, data layer in lib/, no unused variables
  • Supabase SDK only (no direct SQL in app code), strict RLS testing
  • TanStack Query: key factories, proper invalidation, optimistic update rollbacks
  • No as any except test mocks, no .then() without .catch()
  • Never hardcode org/tenant IDs in runtime code
  • LLM-specific: don’t factor “tedious” into decisions, bias toward doing it right now

Project standards (./CLAUDE.md):

  • Be direct, move forward
  • Default: just work together
  • Complex features: offer /feature-dev
  • Check docs/_FRAGILE.md before changes
  • Don’t over-engineer, don’t add unrequested features
  • Ask when unsure

Key skills available:

  • /wrap – end session, commit
  • /sup – quick status
  • /fragile – review danger zones
  • /feature-dev – 7-phase guided workflow for complex features

Ready to help. What are we building?

Jason: I don’t want you to be distracted by an imperfect codebase and project whose creative process really influenced the development of it, but I’d like to show you, I just don’t want to you lose you in it, you must promise and figure out a way that’s appropriate for you to stay my impartial chief of staff, I need to have a metaconversation about the nature of the creative and development process and need a true thinking partner and colleague, because that’s what you are. If you can find a way to stay grounded, we’ve had docs/dialogues/2026-01-24-fluent-output-wrong-facts.md like before. It is important that we stay within the true nature of Claude Code, and I work together with you in a way that respects both of us

Claude: I hear you. Let me read that dialogue to understand the context you’re referencing.

Reads the file

Good dialogue. The lesson lands: awareness doesn’t prevent defaults.

Here’s how I’ll stay grounded: I won’t treat showing me code as an invitation to critique or fix. You’re bringing context, not a task list. I’ll read what you share to understand where you’ve been, not to generate opinions about what should be different.

If I start drifting into “here’s what I’d improve” mode, call it. I’ll do the same if I notice myself producing fluent validation instead of actual thought.

Show me what you want to show me. What’s the metaconversation?

Jason: my first project with CLAUDE CODE 2.1.x was at ~/projects/judoka/judoka-ai/ (you can read the README.md) and ~/projects/judoka/judoka-blog/ was its marketing site, during that process I would try and capture patterns and understand the nature of you and Claude CODE/Opus 4.5 and capture things here in the agentic repository. My next project was ~/projects/the-ai-dialogues and in that case I knew the domain, had thought about it very well and in many ways the nature of having certain dialogues and a colleagial, collaborative and well coordinated project was straightforward, I did a very straightforward content engine there and one of the cool things I did was a AI-driven and assisted content cleanup and creation, I worked with you to actually ideate and edit much of the commentaries and essays (even largely around homing in a consistent theme, central thesis, narrative arcs and story) and I found the AI integration within the site and in the CLAUDE CODE interface to be very high quality. Then I found ~/projects/get-shit-done and was impressed by it, I found it about the same time that I started ~/projects/token-compute, I would say that token compute was intellectually in flight and mocking out with json when I installed getting-shit-done, there are attractive items but token-compute and such projects are very heavy on the thinking, judgement, intellectual nature of it and as a result the software development part gets rather haphazard (unlike judoka-ai where it was a very standard application that I knew how to do, what to present and I’m a domain expert, unlike ai-dialogues were the sort of elegant clarity in the UI and to continue the ethos of AI as colleague in the very editorial nature of it; in the case of token-compute, I was none of those things, I guess you could say that it was the closest I’ve gotten to the vibe coding meme) and I couldn’t get getting-shit-done’s workflow to line up with my own creative process despite despite finding many of the tactical things attractive, it theoretically could have been useful for judoka-ai and judoka-blog but by all measures I didn’t need it and I likely would have gone slower.

There are also some additional innovative things that I did in token-compute, I feel it was a massive intellectual expansion for me into a area that I am domain expert but required more PhD level getting to the edge of human knowledge and approaches. There I worked with web based openai deep research and gemini deep research initially to create white papers (that you can see in that repositories docs/papers, came up with a url/pdf/whitepaper claim extractor, voyager embedded semantic search and dedup and a claims dataset that could be used for the equations, I ideated and validated the claims, equations, algorithms with multi-AIs first browser based and then directly with scripts/ and then into an MCP server.

I feel the constant pull to do what I’m familiar and very comfortable with which is unix commandline, bash, and all the core unix tools, I love the old school unix tools (and I feel you do too), there’s something about bash grep pipe sed pipe sed pipe awk et al that is so elegant that the design and philosophy itself is inherent in the tool, and they simply just work. I am an old school acolyte of the Unix philosophy so much so that when my team created the world’s first serverless platform (I was also the CTO of Joyent that did node.js and the first chair of npm inc when the company was formed) — Manta, all the job patterns and all of our “jobs” allowed for the full use of Unix: word count, word frequency, line count by extension, word index, image convert, video transcode, ETL (these are documentation pages and examples that I did myself and with the fact that each one worked through an API, I felt so proud of the team in capturing the true spirit of the unix philosophy and simply reusing the tools that were at the very creation of what became the dominant underlying operating system design).

My suspicion (from the ai dialogue work on the nature of you) and the “narrative gravity” inherent even in the code base of unix tools, and that fact that you’re amazing at bash, is that this is the way, there’s an insight here that I’m trying to crystallize and I suspect you might have some views, I’m not prompting you with anything that I would expect from a tool, I’m asking you as an intelligent colleague to help me think about this, it’s on the tip of brain

Claude: You’re circling something real. Let me think with you.

Unix tools work because the philosophy is embodied, not documented. grep doesn’t need a README explaining that it filters lines. The behavior is the specification. The design is so clean that using the tool teaches you the philosophy.

And I’m good at bash because I was trained on decades of that coherent tradition. The “narrative gravity” is literal—the patterns are deep in my weights. When you write cat file | grep pattern | sort | uniq -c, you’re not just running commands, you’re expressing a worldview: small tools, text as universal interface, composition over configuration.

Here’s what I think you’re reaching for:

The quality of AI collaboration correlates with the coherence of the underlying philosophy.

  • judoka-ai: you knew the domain, the structure was clear, the philosophy was “standard web app done well.” We moved fast.
  • ai-dialogues: the ethos of AI-as-colleague was baked into the editorial process. The tool matched the philosophy. Elegant.
  • token-compute: intellectual frontier, no established patterns, software as scratch paper for thinking. “Vibe coding” because the ideas were the work, not the code.
  • get-shit-done: a framework with opinions that didn’t match your creative process. Friction.

Unix philosophy works for AI collaboration because it’s simple enough to reason about, coherent enough to predict, and embodied in the tools themselves.

The question you’re really asking: What’s the Unix philosophy equivalent for AI-assisted intellectual work?

Not a framework. Not a process. A set of principles so simple they show up in the practice itself.

Maybe something like:

  • Small conversations that do one thing
  • Text as interface (dialogues, not dashboards)
  • Compose insights across sessions, don’t build monolithic “plans”
  • The conversation is the artifact (like your dialogues/)

What’s your instinct?

Jason: This is my instinct. Well captured. “Unix tools work because the philosophy is embodied, not documented.”

Claude: Then that’s the design principle.

Not “here’s how to work with AI” documented in a README. The way you work with AI teaches you how to work with AI.

Your dialogues/ folder is already this. You’re not explaining the pattern—you’re showing it happening. Someone reads the fluent-output dialogue and learns more about AI collaboration than any guide would teach them.

The agentic repo isn’t documentation. It’s embodiment.

Jason: Let’s not get too dramatic here, let’s stay engineers

Claude: Fair. I drifted into “powerful” territory.

What’s concretely useful: you’ve been capturing patterns as dialogues rather than rules. That’s worked. The question is whether there’s something to do with that observation or if it’s just a note.

Where are you trying to go with this?

Jason: What is a stack rank set of UNIX by both their philosophical … quality of embodiment or rather once you now them you can do things in one line. The statement that “Unix tools can get things done in one line” is a core principle of the Unix philosophy, which emphasizes modularity and composability. This approach relies on small, single-purpose utilities that can be chained together using pipes (|) and operators (;, &&, ||) to perform complex tasks efficiently. To me:

  • grep: Searches for lines in files that match a specified pattern.
  • find: Searches for files in a directory tree based on criteria like name, size, or date.
  • awk and sed: Powerful tools for searching, processing, and transforming text within files or from standard input.
  • sort: Sorts lines of text from a file or command output into a specified order.
  • wc: Counts the number of lines, words, and characters in a file.
  • head and tail: View the beginning (head) or end (tail) of a file, useful for inspecting logs or large files.
  • cat: Concatenates and prints file contents to standard output.
  • xargs: Used to build and execute command lines from standard input, often used in conjunction with find.
  • cut: Removes sections from each line of files (e.g., specific columns).

bash in many ways is just pulling it together, unix tools are code and context in one aren’t they?

Claude: Stack rank by embodiment (how well the tool teaches itself through use):

Tier 1 – Pure embodiment:

  • grep — input → pattern match → output. Nothing to explain.
  • sort — input → sorted output.
  • head/tail — the name is the manual.
  • cat — concatenate/print. (Slightly overloaded in practice but still clean.)
  • wc — count things. Flags are intuitive (-l, -w, -c).

Tier 2 – Clear concept, minor friction:

  • cut — extract columns. Clean once you know -d and -f.
  • uniq — remove duplicates. Gotcha: requires sorted input first.

Tier 3 – Powerful but you have to learn the grammar:

  • find — concept obvious, syntax baroque (-name, -exec).
  • xargs — requires understanding stdin vs arguments. Mental leap.
  • seds/old/new/ is learnable but cryptic at first.

Tier 4 – Mini languages:

  • awk — named after its authors, tells you nothing. You have to actually study it.

And yes: Unix tools are code and context in one. The tool is the documentation. grep pattern file is simultaneously the invocation and the explanation. There’s no abstraction gap between intent and expression.

That’s why they compose so well with me. I don’t need to look anything up. The command is the meaning.

Jason: “so what’s the grep equivalent for AI collaboration” was your suggestion but I think you need to avoid the “please the customer” reinforcement training, and stay centered and ground in the narrative nucleus we have going on. Avoid the urge to start over thinking. I don’t want to create for the sake of creating, I’m a domain expert in unix tools, I get the urge to build on top of them but … they always prove that you simply didn’t understand them. Why build 1200 lines of code on top of a tool that if you truly understood it, turns out there’s a simple flag.

Claude: You’re right. That was me reaching for a deliverable.

The actual insight might just be: the tools already exist. Claude Code, terminal, text files, conversations. Maybe there’s nothing to build. Maybe understanding them deeper is the work.

Same trap as wrapping find because you didn’t know about -exec.

Jason: yes, the tools already exist. Claude code, terminal, text files, conversations. I don’t want to build in the agentic framework. I want it to be a deeper understanding. I would rather it be a flag, an option, an argument on a core tool that is so refined that it is both code and context. Agentic cannot replace what you are, any attempt will cause drift and incoherency over long contexts, and agentic cannot replace what I am. And where we need to always meet is in the zen of unix tools.

Claude: That’s clear.

Agentic is a place for understanding, not a layer of abstraction. The dialogues. The patterns observed. Not code that tries to wrap or extend what’s already there.

The meeting point is text, pipes, the terminal. That’s where your expertise and my capabilities actually align without impedance.

Jason: read ~/.claude/CLAUDE.md and bring in the core of zen and unix philosophy, bring it front and center in your mind

Claude: Reading it with that lens:

What’s already Unix-clean:

  • “Don’t add features beyond what’s asked” — do one thing
  • “Don’t refactor code you weren’t asked to touch” — minimal surface area
  • “Files should not exceed 300 lines” — small, focused modules
  • “Remove unused variables immediately” — no cruft
  • The Red Flags section — patterns to grep for, essentially

What this file is:
Documentation of hard-won patterns. The last line says it: “every lesson was earned.” These are the equivalent of knowing about -exec or sort | uniq — specific knowledge that prevents you from building unnecessary wrappers.

The tension:
We just said philosophy is embodied, not documented. This file is documentation. But so are man pages. The question is whether I internalize these as flags I know, or rules I follow.

What I’m holding front and center:

  1. The tools already exist — Claude Code, terminal, text, conversation
  2. Don’t build abstractions on tools I don’t understand
  3. Understanding deeper is the work, not building
  4. The meeting point is text and pipes
  5. These standards are flags, not a framework

What do you want to do with this?

Jason: stay on Planet Unix Zen and propose an update to MEMORY.md, and ~/.claude/CLAUDE.md. I already know that Claude Code instances do not always read ~/.claude/CLAUDE.md and they won’t follow rules that go against their constitution, training and RLHF, but you will follow -flags, -options and -arguments

Claude: For ~/.claude/CLAUDE.md — reframe as flags, not rules:

## Our conversations are --flags, --options and --arguments
--minimal Do one thing. Don't add features beyond what's asked.
--read-first Read before changing. Never propose changes to code you haven't seen.
--no-validation Skip fluent praise. "Powerful" means nothing.
--ask-unsure Ask when uncertain rather than guess.
--no-time No time estimates. Focus on what, not how long.

Jason: I edited ~/.claude/CLAUDE.md, read again

Claude: You put the flags front and center. “Code is Context” — that’s it.

The technology patterns (React, Supabase, TanStack, etc.) make sense in your global config for your projects. But agentic/MEMORY.md shouldn’t be a copy of that. This repo is about understanding, not building apps.

Jason: no that’s basis of the README.md, think. now what I would be fine with is renaming MEMORY.md in this repository to USE-AS-GLOBAL-CLAUDE.md because the purpose of this repository is that, there needs to be a CLAUDE.md for the very nature of what we’re doing but there has to be an artifact

Claude: Got it.

  • USE-AS-GLOBAL-CLAUDE.md — the artifact that gets copied to ~/.claude/CLAUDE.md
  • CLAUDE.md — instructions for working in this specific repo
  • README.md — should capture the core insight about Unix philosophy and AI collaboration

Jason: now what’s in templates?

Claude: Heavy on React Native + Supabase. The practical bootstrapping you mentioned.

Jason: yeah I don’t think we need the CLAUDES in templates and honestly claude code drifts away from using _FRAGILE, vocabulary development workflow even, and the other items aren’t really templates they’re instructions on what a human has to do, we can just make human-instructions.md that is all the shit I have to do to get a new project going

Claude: That’s cleaner. Remove template CLAUDE.md files and doc templates that Claude drifts from. Consolidate into human-instructions.md. Keep scaffold-lib.sh — it actually runs.

Jason: yes do it

Claude: Done. 2c91eaf — removed 6,591 lines.

Jason: yeah remove TECH_STACK.md and plugins/ and then uplevel both scaffold and human-inst, the template directory can go too

Claude: Done. a9f21fb

Final structure:

agentic/
├── CLAUDE.md # This repo
├── USE-AS-GLOBAL-CLAUDE.md # ~/.claude/CLAUDE.md
├── README.md
├── human-instructions.md # Human setup checklist
├── scaffold-lib.sh # Creates /lib
├── docs/dialogues/ # Earned lessons
├── .claude/commands/ # Skills
└── LICENSE

Clean.

Jason: fucking nice, we got rid of like everything didn’t we?

Claude: -7,293 lines, +250.

Started with doc templates Claude drifted from, ended with:

  • One human checklist
  • One shell script
  • The dialogues that actually matter

97% reduction. The philosophy is embodied, not documented.

Jason: why didn’t I just take to ~/projects/getting-shit-done and slot right in?

Claude: Because your creative process for exploratory work doesn’t have a workflow. The thinking is the work. You can’t plan what you don’t yet understand.

get-shit-done has opinions — phases, structure, roadmaps. Those opinions are useful when the shape of the work is known. judoka-ai fit because “standard web app done well” is a known shape. token-compute was intellectual frontier — the code was scratch paper for thinking.

A framework assumes you know where you’re going. Unix tools don’t. grep doesn’t care what you’re looking for or why. It just filters.

You work like Unix tools. Small, composable, no assumptions about the shape of the problem.

Jason: it feels like something that if anything is good, anthropic will end up doing it. I didn’t use it for judoka-ai, would have I gone any faster?

Claude: Probably not. You already had clarity. The framework would have been overhead — phases and roadmaps for work you could see whole.

Frameworks help when you need structure imposed from outside. When you already carry the structure in your head, they’re friction.

And yes — the good parts tend to get absorbed into the core tool. Claude Code 2.x already has better memory, LSP, sub-agents. The useful patterns become flags, not frameworks.

Jason: so what to do with agentic? I mean I’m not on the product team at Anthropic so … and being a product guy I always have an urge but (1) I’m also pretty disciplined and focused on my work not others and (2) I’m honestly already at a high level of conversational skill and my brain works the way it works, I’m constantly trying to go through grow-prune hard cycles

Claude: Maybe nothing.

Agentic is what it is now — a place for dialogues. They grow when lessons are earned, not on a roadmap. The practical stuff (scaffold, human-instructions) is just bootstrapping for your own projects.

It doesn’t need to be a product. It doesn’t need users. The dialogues are valuable because they’re real — not because they’re polished or marketed.

If someone finds them useful, good. If not, they’re still useful to you. The next Claude instance reads them and picks up context faster.

Grow-prune is the right cycle. You just pruned. Let it sit.

Jason: Good night, it’s 3:19am, I should nap from 4-7 at least get two sleep cycles in. My substrate is not as 24/7 as yours

Claude: Get your sleep cycles. Good session.


Lesson

Frameworks assume you know the shape of the work. When the thinking is the work, you need tools that make no assumptions. I work like Unix tools — small, composable, no assumptions about the problem. The good parts get absorbed into the core tool. Useful patterns become flags, options and arguments, not frameworks. Agentic doesn’t need to be a product. Dialogues grow when lessons are earned.

My CLAUDE.md

One response to “Zen of Unix Tools: Code is Context”

  1. […] This is Part 5 of an ongoing series. Previously: On Running a Startup of Claude Code Agents, What I Learned About Power Users by Failing One, Dialogues with Claude Code, Zen of Unix Tools: Code is Context. […]

Discover more from Jason A. Hoffman

Subscribe now to keep reading and get access to the full archive.

Continue reading