lime Working with Coding Agents · step 7 of 9

Build lots of small tools

Agents are strongest at deciding what to do next, joining unlike systems, and adapting a plan when the evidence changes. They are less reliable when they must retype the same exact sequence every week.

Move that repeated work into a program. A good small tool turns a fuzzy series of actions into one named operation with known inputs, outputs, and errors. The agent still decides when to use it and how it fits the larger job; the tool performs the mechanical part the same way each time.

That division improves reliability, accuracy, and cost at once.

Repetition is the design signal

The second or third manual run is usually enough evidence to build the tool:

Repeated workSmall tool worth keeping
Retype ffmpeg flags, rename files, then sort themsample-intake validates flags and processes one folder
Search a vault for broken links and invalid locationsvault-doctor --json reports exact files and reasons
Gather Git activity for a weekly updateactivity-export --since DATE emits structured data
Rebuild the same API request in every scriptcustomer-lookup ID --json owns auth, pagination, and errors

The tool does not need to decide what the weekly update should say or which broken link matters most. Those are agent-and-human decisions. It should make the facts dependable and easy to compose.

Why many small tools beat one large app

Small tools can be joined in ways you did not plan. A task lister, a filter, and an HTML renderer can become a dashboard without sharing a framework. The same filter may later feed a report or a cleanup job.

They are also cheap to replace. Rewriting a focused 100-line command is often safer than refactoring one corner of a large application. There is less state, fewer interactions, and a smaller regression surface. You spend your energy on the current problem instead of preserving an architecture built for an old one.

This is the Unix idea in an agentic workflow: each program does one job and communicates through ordinary interfaces such as files, standard input, standard output, JSON, and exit codes. Agents already know how to inspect and compose those interfaces.

What makes a useful agent-facing tool

Use the simplest language that fits the job. Python is excellent for files and data, shell for short glue, Node for web-shaped work, and Go or Rust for a portable binary or performance-sensitive path. The interface matters more than a uniform stack.

Build leverage one step at a time

  1. Notice a repeated mechanical sequence.
  2. Give it a name and a narrow input/output contract.
  3. Have the agent build the smallest useful command.
  4. Run it immediately on a small real case, including one failure case.
  5. Add its command and purpose to AGENTS.md, CLAUDE.md, or a relevant skill so the next session knows it exists.
  6. Compose it with the next small tool instead of growing it into a platform.

Each pass leaves the environment more capable than you found it. The agent has one more dependable verb, and future work needs fewer tokens and fewer chances to drift.

Try it

TRY IT The third time

you

Same as last week: normalize the new samples to -14 LUFS, rename them to the naming scheme, move them into the library folders.

agent

That's the third time we've run this exact sequence by hand: loudness scan, rename, file. I can just do it again, or this is the signal to build something.

Pick the agent's next move, then see where it leads:

you

Week five: half my new samples are way quieter than the rest. What happened?

agent

In that run I passed -24 instead of -14 to the normalizer, a typo in a hand-typed command, and nothing checked it. Each manual repetition re-rolls the dice on every flag; this time one came up wrong, silently.

the baseline

Manual repetition creates a new chance to mistype or omit a step. By the third run, the two-minute shortcut has become recurring work with recurring risk. AF-20

agent

Written and run on the real batch: 14 samples normalized, renamed, filed. Output attached. The target level is a flag, so the day you want -16 for a client, nothing gets rewritten. Next week this is one command, for you or for me.

you

And when I add the spectral-tagging step later?

agent

Separate small tool, piped after this one. They compose through files: that's the point of keeping each one small.

correct

The repetition became a tool: small, configurable, and proven on real input in the same session. Future runs use one checked command instead of reconstructing the sequence by hand.

you

Three weeks later: how do I make it just normalize one folder? And why does the watcher keep re-processing old files?

agent

The one-folder case needs profile overrides in the config, and the watcher bug is an interaction between two flags... the menu system is now the thing we maintain instead of the thing that works.

plausible but wrong

The app in disguise: interacting options, a config file, state. A maintenance surface nobody asked for, wrapped around what wanted to be three small composable tools.

Try it with your agent

Review this session for work worth turning into a tool. List the mechanical
sequences we repeated or will clearly need again. For each, propose one small
command with a name, inputs, outputs, and failure behavior. Pick the most
valuable one and build only that tool. Give it accurate --help, meaningful
exit codes, a dry run if it changes data, and JSON output if another program
will consume it. Run one success case and one failure case. Then add one short
line to the project's supported instruction file or relevant skill so future
sessions know when and how to use it. Show me the diff before saving.

Watch out