Tool contracts
Every action the agent can take becomes a typed function with declared scope, side effects, an idempotency key and a rollback path — tested like ordinary backend code, so a failure repeats.
Typed tool layerAI & data
We build single-purpose agents that take a request, call your systems, and finish the task — or stop and hand it to a named human with the full reasoning attached.
An agent is a program that decides what to do next. You give it a goal, a set of tools it may call, and a boundary it may not cross; it plans, calls, observes the result, and either continues or stops. The interesting engineering is almost never the prompt — it is the tool boundary. What the agent is allowed to reach, under whose credentials, and what happens to the record when a call half-succeeds.
Getting an agent to work once is a weekend. Getting it to work on the tail — the malformed order, the customer who already has an open case, the API that returns 200 with an empty body — is the project. Most of our build time goes into what happens when the world does not match the happy path: what the agent retries, what it refuses, and what it escalates instead of guessing.
| What is true of this work | What it forces | What we do about it |
|---|---|---|
| Retrieved text can carry instructions | Treat all context as untrusted | Allowlisted tools, no arbitrary execution |
| Tool calls have real side effects | Retries must not double-charge | Idempotency keys and rollback paths |
| Some actions cannot be undone | Autonomy must stop before them | Named approver gates irreversible writes |
| Loops can burn budget silently | Cost is unbounded by default | Per-task ceilings trip a breaker |
| Model behaviour drifts across versions | Yesterday’s fix can regress today | Graded eval suite blocks merges |
Every action the agent can take becomes a typed function with declared scope, side effects, an idempotency key and a rollback path — tested like ordinary backend code, so a failure repeats.
Typed tool layerThe agent reads your policies, tickets and records rather than reciting from training. We build the chunking, ranking and freshness rules, and make it cite the passage it acted on.
Cited retrieval indexA confidence and risk policy decides which tasks the agent finishes alone and which land in a human queue with a proposed action, its trace, and one-click approve or correct.
Human approval queueA graded set of real tasks with expected trajectories, re-run on every change to prompts, tools or model version. It reports completion, wrong-tool rate and cost per task, and blocks regressions.
Graded eval setLong tasks checkpoint at each completed step, so a crash, a rate limit or an overnight approval resumes instead of restarting. Idempotency keys stop a retry refunding the same customer twice.
Checkpointed run storeEvery run is stored as a replayable trace: input, retrieved context, each tool call, tokens and cost. Per-task and per-tenant ceilings trip a breaker before a retry loop becomes an invoice.
Replayable trace storeWe record how the people doing the job today handle real cases: what they open, what they decide, where they hesitate. That transcript becomes the agent’s scope, its tool list and the first eval set.
You getScoped task spec and eval set
Before any agent code, we build and test the tools against your systems: read paths first, then writes behind an approval gate. Each gets a scoped credential, so blast radius is bounded by design, not prompt.
You getTyped tool layer with scoped credentials
We wire the loop, retrieval and stop conditions, then replay the recorded cases until it clears the anchor set. Fourteen days in you see it running on your systems, with the remaining failures named.
You getWorking agent on your data
The agent runs alongside the team without acting — it proposes, a human decides, we score every disagreement. Autonomy then switches on task class by task class. Release hands you dashboards, alerts, runbook and repo walkthrough.
You getLive agent, runbook and repo
Build only where the decision logic is your own
Vendors already solve meeting notes and first-line FAQ deflection, and they integrate the common systems. What they cannot encode is your underwriting rules, your triage policy, your pricing exceptions. The test: would you be embarrassed if a competitor bought the identical tool?
We’d choose otherwise whenthe workflow is standard, a vendor covers it, and the budget is better spent on integration
Default to the fixed workflow; free planning is the exception
If you can draw the steps on a whiteboard, encode them as a state machine and use the model only where judgement is genuinely needed — classification, extraction, drafting. Free planning costs more, fails less predictably, and is much harder to evaluate.
We’d choose otherwise whenthe branch count is large and unknowable — open-ended research, diagnosis, anything you cannot enumerate
Almost never at the start — fix the context first
When an agent behaves badly the cause is usually retrieval or an ambiguous tool description, and fine-tuning bakes that mistake in at greater cost. Every tune also pins you to one provider and adds a re-training step to every change.
We’d choose otherwise whenone narrow, high-volume step has a stable output shape and a smaller model cuts spend
None it has not earned in a shadow run
We ship read and draft autonomy immediately, then release write actions one task class at a time as measured agreement clears a threshold you set. Autonomy is a permission granted per action type, not a switch flipped at launch.
We’d choose otherwise whenthe work is reversible and low-value — tagging, routing, enrichment — where waiting on a human costs more
Price is driven by how many systems the agent must touch and how hard they are to reach, not by the agent itself. We quote a fixed scope after a one-week exercise. Two clean REST APIs and one document source is a small build; six systems, one a mainframe without an API, is a different project priced separately.
Running cost is per completed task, and a task costs many times a single chat reply, because the agent reads, calls several tools and re-reads every result. The multiple depends on your task, so we instrument cost per task from the first week and set hard ceilings per task and per tenant.
You do — source code, prompts, tool definitions, eval sets and traces transfer to your organisation on final payment, with no runtime licence retained. The repository lives under your GitHub or GitLab account from day one, not ours. Your data is used to build and evaluate your agent and nothing else; we do not pool it or train on it.
Every run leaves a replayable trace, so the first step is to reproduce the decision rather than argue about it. A wrong action is rolled back through that tool’s rollback path, the case becomes a permanent eval case, and the fix ships behind the same gate as any code change. During the 30-day warranty that work is ours, not billable.
We treat every piece of retrieved text as untrusted input, not as instruction — the same posture you take with user-supplied SQL. Injection cannot be fully prevented at the model layer today, so the control is containment: scoped credentials, an allowlist of tools, no arbitrary code or query execution, and human approval in front of anything irreversible.
Thirty minutes with the engineers who would build it. You leave with a scope, a timeline and a fixed price — or an honest no, and the reason why.