AI DevelopmentDecision Matrix8 min readPublished September 6, 2026

Six boundaries · one job · a prototype that stores records is already a system

Small AI-Built Tools: Set the Boundary Before You Build

Scope a small AI-built utility around clear inputs, outputs and limits. Decide what it should own, reject and preserve before it grows into a system.

DA
Digital Applied Team
Research and practical implementation
PublishedSeptember 6, 2026
Read time8 min
SourcesAnthropic engineering · Python docs

Give a coding agent one bounded job before asking it to replace a whole system. A useful small tool might prepare copies of selected files and produce a reviewable manifest. Its first specification should say what it accepts, what it creates and what it must leave alone, because an agent that is not told where the edge is may not find one on its own.

Small should describe the responsibility, not the number of screens or lines of code. A tiny application that silently becomes the only place important records are stored has already taken on a large obligation. This guide sets out the boundary worksheet, how to decide whether the finished tool needs a model at runtime, what “preserve the original” has to mean for files, how rejected cases keep a tool small, the ways a utility quietly becomes a system, and the ownership decision that has to happen after the first successful run.

Key takeaways
  1. 01
    Define the edge.List supported inputs, expected outputs and cases the tool rejects. The rejected cases are the specification’s most important line.
  2. 02
    Preserve a way back.Keep originals separate and make the changes inspectable. A result you can discard is a result you can review without fear.
  3. 03
    Separate the agent from the runtime.A coding agent can write a deterministic tool. Whether the tool itself calls a model is a different decision with its own review cost.
  4. 04
    Choose a lifespan.Decide who maintains the utility or when it is discarded, before the first person depends on it.

01 — The WordSmall means a small responsibility

Teams reach for “small tool” to mean low risk, and then measure smallness by the wrong thing. For example, a script of forty lines that is the only copy of a customer list is not small. A two-thousand-line utility that reads selected files and writes renamed copies to a new folder is. The difference is what happens if the tool is wrong or disappears: in the first case data is lost; in the second, someone deletes a folder and runs it again.

Framing smallness as responsibility changes the brief a coding agent receives. Instead of “build me a quick tool to tidy the asset library”, which has no edge, the brief becomes “build a tool that takes a list of files I give it, writes renamed copies to an output folder I name, and lists what it did”. The second brief has three nouns the agent cannot expand without asking, and that is what keeps the tool a tool.

The test for smallness

If the tool and everything it produced vanished tonight, what would be lost? If the answer is “an afternoon”, it is small. If the answer involves the word “only”, as in “the only record of…”, it is a system wearing a utility’s clothes.

02 — The ContractWrite the boundary before the feature list

The worksheet below describes a hypothetical file-preparation utility. It creates renamed copies of selected assets and lists the mapping for review. It does not edit the source library or publish anything. These are proposed requirements, not the report of a tool we tested, and the “Reason” column is there so that each boundary survives the moment someone asks the agent to relax it.

Four of the six rows are about what the tool refuses to do. That ratio is deliberate. A feature list tells the agent what to build; a boundary list tells it what to stop building, and the second only constrains the agent if it is written down.

Illustrative utility contract, reviewed September 7, 2026; not a product comparison or measured implementation.
BoundaryExample requirementReason
InputOnly explicitly selected files in supported formatsA directory is not permission to process every file beneath it.
OutputNew copies plus a source-to-output manifestThe reviewer can inspect each transformation.
PreservationOriginal paths and contents remain unchangedA rejected result can be discarded without restoring the library.
CollisionReject ambiguous destination namesA convenient overwrite must not decide which file survives.
Unsupported caseList it with the reason; leave it untouchedPartial success is visible rather than silently incomplete.
LifespanName an owner or record a disposal dateA working prototype should not become an unowned dependency.

03 — The RuntimeDecide whether the finished tool needs AI

An agent can write a deterministic utility: software that follows fixed rules once it is built. Renaming according to an agreed pattern does not necessarily require a model call at runtime. The agent’s role in creating the tool and the tool’s need for AI are different decisions, and conflating them produces tools that call a model to do what a regular expression would have done, with a review problem attached to every run.

Anthropic’s guidance on building agents recommends starting with the simplest adequate solution and adding complexity when needed. We apply that principle here as a design choice; the guidance does not measure the cost of the example utility. The simplest adequate solution for a rename is a rule; a model enters only when the rule cannot be written because the task requires interpretation.

Use a runtime model when the task actually requires interpretation, and specify how uncertain interpretations are reviewed. If a fixed rule is enough, write down the rule and ask the coding agent to implement it directly. That gives the reviewer a smaller set of behaviors to inspect, and it gives the tool the same output on the same input every time, which is the property that makes a manifest worth reading.

Rule
Deterministic utility
Agent builds it · no model at runtime

A rename pattern, a format check, a manifest. Same input, same output, reviewable once. The default for anything that can be written as a rule, even if the agent that wrote the rule was a model.

Default
Judge
Model in the loop
Runtime calls · review per run

Classifying files by content, guessing a sensible name from an image. Needed only where interpretation is the task. Every run now has an uncertain output that someone must check, and the contract must say who.

When unavoidable
Mixed
Rule with a model fallback
Deterministic first · model for the leftovers

The rule handles what it can; the unsupported cases go to a labelled queue, where a model may propose and a person decides. Keeps the reviewed surface small while still clearing the awkward files.

Often right

04 — The OriginalDefine preservation at the right level

For files, “keep a copy” can mean more than preserving visible content. Filenames, timestamps, permissions and embedded metadata can affect how another application uses the result. Decide which properties matter for this job and verify them explicitly, because “the copy opened fine” tests the one property that was never in doubt.

The Python file-operation documentation warns that even high-level copying functions cannot preserve all file metadata. That is a concrete reason not to treat a successful copy operation as proof of complete preservation. The behavior depends on the operation and platform, and an agent that reaches for the convenient copy call can produce copies that match in content but differ in properties the next application reads.

Where metadata preservation is essential, verify the required properties or reject the unsupported transformation. A convenience copy should not be described as a backup system. The preservation row of the contract is satisfied when the original is untouched; whether the copy is a faithful copy is a separate requirement that has to be named if it matters.

05 — The EdgeLet rejected cases keep the tool small

A bounded utility should be allowed to say that an input is unsupported. That is often a better first release than adding a partial converter, background sync, account system and shared database because one file did not fit the rule. The rejection list is not a failure report; it is the tool telling you exactly where its edge is, in a form you can decide about.

Review the rejected cases after using the utility on a representative selection. If many legitimate inputs fall outside the contract, change the scope deliberately. If only a rare exception needs manual handling, document that route instead of making every user depend on a more complex application. Either way the decision is made by a person looking at a list, not by an agent looking at an error.

This differs from the system-replacement rollout pattern, which assumes an enduring application and a migration. A file utility can remain a separate, limited tool for its entire useful life.

Most inputs are rejected
The contract is wrong for the job. Rewrite the scope deliberately and re-run; do not patch the rule case by case
Rescope
A few inputs are rejected for one reason
Decide whether that reason belongs in the contract. If yes, one documented change; if no, a documented manual route
Decide once
Rare, unrelated rejections
Leave them rejected and listed. A manual exception is cheaper than a feature nobody else needs
Leave
The agent proposes a converter, a queue or a database to handle them
Stop. That is a new scope decision with data ownership, access and recovery attached; take it to the build-versus-buy framework
Escalate

06 — The DriftHow a utility becomes a system by accident

Nobody decides to turn a rename script into the asset library of record. It happens one helpful step at a time, and each step is the kind an agent can take unprompted if the boundary was never written. The illustrative sequence below is the pattern the contract’s rows exist to interrupt.

The in-place edit: to save disk space the tool starts renaming originals instead of writing copies, and the preservation row is gone. The remembered state: to avoid reprocessing, the tool keeps a record of what it has seen, and now there is a database with no owner. The silent overwrite: two inputs map to one name and the tool picks the later one, and a file is gone with no entry in the manifest. The quiet dependency: another script starts reading the tool’s output folder as its input, and the disposable utility is now upstream of something that matters.

Each step was reasonable in isolation. Each one is a boundary row being crossed without a decision. The manifest and the rejection list are what make the crossing visible, because a tool that reports what it did and what it refused is much harder to drift silently.

The review question for every change request

“Which row of the contract does this change?” If the answer is none, build it. If the answer is a row, the request is a scope decision, and the person who owns the scope makes it, not the agent that received the request.

07 — The OwnerDecide what happens after the first successful run

For a disposable utility, keep the source and reproduction instructions until acceptance. For continued use, name a maintenance owner before it becomes a dependency. The moment to decide is the first successful run, because that is the last moment the tool has no users.

For a maintained utility, name who receives failure reports, how dependency changes are checked and what happens when the input format changes. A named owner need not create a large support process, but users should know where unresolved work goes; the same ownership rule that governs an agent handing off a task governs a tool handing off its future, and our guide to who owns unfinished work applies almost unchanged.

Use the file-output acceptance reference to inspect the deliverable. If the requirement expands into an enduring application, revisit the build-versus-buy framework with that larger scope. Teams that want the boundary contract and the ownership decision built into how they brief coding agents can work with our AI transformation practice.

08 — DecisionA tool stays small when its edge is written down

Practical decision

Keep the first tool accountable to one job.

Write its input and output contract, preserve originals and make unsupported cases visible. Decide explicitly whether the result is a disposable utility or software somebody will maintain, and decide it before anyone depends on the answer.

For implementation support, explore our AI transformation services.

Build reliable AI workflows

Turn a promising workflow into work you can verify.

Digital Applied helps teams define acceptance checks, connect the right tools and make AI work reviewable.

Clear scopeReviewable resultsPractical implementation
Implementation

From evidence to operation

  • →Define the decision and its limits
  • →Choose the appropriate tool access
  • →Verify results before delivery
Questions and answers

Common questions

No. A coding agent can build software that uses fixed rules, and a deterministic tool is easier to review because it behaves the same on every run. Add runtime AI only where interpretation is part of the task, and say how its uncertain outputs are reviewed.
Digital Applied newsletter

Deep dives on AI, marketing and development.

Practical guides and fresh insights by email. No recycled takes.