AI Engineering

AI agents and automation that show their work.

We build AI systems that do one job inside a business that already runs. Agents that call your tools. Retrieval (looking up the right passages before answering) that cites its sources. Extraction from records nobody structured, and drafting that stops at a review gate. Each one ships with an evaluation set (examples with known right answers, used to check the work), so you can tell whether it’s still right next month.

Inputs
Your documents, records and tools
Builds
Agents, retrieval, extraction, routing, drafting
Measures
An evaluation set of real cases, plus a trace of every run
Hands over
Code, prompts, evals and docs, in your repository

This page’s own structure, drawn at build from its HTML.

People read the top layer, crawlers follow the middle one and machines parse the bottom one.

14 headings · 56 links · 8 schema nodes

Build

What it covers

Narrow systems, measured from day one.

Agents that call tools

An agent is a loop. It plans, calls a tool, reads the result and decides what’s next. We give it narrow tools, a budget and a log of every call. It stops and asks when the evidence runs out.

Retrieval with citations

Answers come from your own documents, and every answer links to the passage it came from. A wrong answer traces back to a wrong document, which someone can fix without retraining anything.

Extraction

Fields pulled out of invoices, contracts, filings and emails nobody structured. Each field is checked against a schema (a fixed list of fields and what each one must hold). Anything missing goes to a person instead of getting filled in with a guess.

Routing and drafting

Classify what came in, send it to the right queue and draft the reply. Drafts wait for a person wherever a wrong one would cost real money.

Evaluation

Before launch, a set of real cases with known right answers. After launch, the same set runs on every change. You find out a model update made things worse before your customers do.

Handover

The code, the prompts, the evaluation set and a runbook (written steps for running the system and fixing it) go into your repository (the code and its full history, kept in one place). Swap the model out in a year and the scaffolding is what you keep.

Try to break it

Retrieval you can argue with.

The same retrieval pattern as the home page, with the controls exposed. Move the confidence floor (the lowest match score an answer needs before it’s shown) and watch the gate change its mind. Then try a question this site can’t answer.

ask · retrieval console index loads on first useloading indexindex didn’t loadindex and code disagree Build

Break the input

  1. A fair question Who owns the code when you’re done? must answer checked at buildas expectednot at this floor
  2. Outside what’s here Do you sell a chatbot subscription? must abstain checked at buildas expectednot at this floor
  3. Misspelled Who ownes the code? must answer checked at buildas expectednot at this floor
  4. Two questions at once Do you build iOS apps, and who owns the code? must cite two sections checked at buildas expectednot at this floor
01Query

Your words, lowercased and cut to stems. Common words drop out.

02Retrieve
#passageconf
  1. 01
  2. 02
  3. 03
  4. 04
  5. 05
  6. 06
  7. 07
  8. 08
03Gate

Nothing under the floor gets quoted.

0.35

Raise it and it answers less often. It’s also wrong less often.

04AnswerAnsweredAbstained

Up to three passages from different sections, each with a link.

With JavaScript off, these were answered when the site was built, by the same code your browser runs.

The search index didn’t load, so here are the answers the build computed with the same code.

Q1 · answered at build3 passages cited.

Who owns the code when you’re done?

  1. Source, prompts, evaluation sets and infrastructure code assigned to you in full

    /approach/#ownershipYou own the code, the data, and the right to leave.0.61

  2. A runbook, a handover session, and code your own engineers can read

    /approach/#engageThree shapes of work, each with a defined end.0.54

  3. You do. The code, the prompts, the evaluation set and the documentation, in your repository, with no license back to us and no runtime dependency on anything we host. There’s no version of this where you have to keep paying to keep using what you paid to have built.

    /#faqWho owns the code when we’re done?0.53

Q2 · answered at buildNo answer. Below the confidence floor.

Do you sell a chatbot subscription?

Nothing on this site answers that well enough. Ask Daniel at daniel@adjlcapital.com.

A system we run

A pipeline that stops and asks a person.

This is the underwriting engine we run for ADJL Capital, replayed stage by stage. A model writes the narrative at the end and nothing else. It’s handed figures that are already computed, and its prose is never parsed back into a number. Pick a bad input and watch where the run stops.

run replay · underwriting engine Illustration · stage order and branches from the engine’s source · names simplified · values withheld · timings not to scale
Try a different input

Run complete. Every figure names its source.

Not one property. Nothing was fetched and nothing was spent.

The provider had nothing on this listing. The fields are left blank for a person to fill in, and no figure is guessed.

Held at the price check. The analysis doesn’t run on a price nobody confirmed.

No local water schedule on file. The line uses the national average and says so.

running

Inspect a stage

every stagerun done

one listing URL, start to finish

Values withheld from this page

fields

  1. list price••••live listing
  2. living area••••live listing
  3. assessed value••••county record
  4. sale history••••county record
  5. market rent••••rent estimate
  6. electricity rate••••published rate table
  7. purchase price••••your assumption
  8. current tax••••county record
  9. electricity••••published rate table
  10. water••••published rate table
  11. maintenance••••your assumption
  12. assessment after sale••••county record
  13. tax rate••••published rate table
  14. expected annual loss•••• unaudited
  15. rate and term••••your assumption

The clean run, stage by stage

••••Values withheld from this page

runone listing URL, start to finish
check_accessbefore anything is read

No figures from this stage.

rate_limitbefore any paid call

No figures from this stage.

parse_listing_urlrefuses anything that isn’t one property

No figures from this stage.

resolve_zip_citymatches the ZIP code to its city

No figures from this stage.

fetchthree requests, sent together
listingwhat the listing says
list price
••••live listing
living area
••••live listing
parcel recordwhat the county has on file
assessed value
••••county record
sale history
••••county record
rent estimatewhat similar units rent for
market rent
••••rent estimate
energy_ratespublished state rates
electricity rate
••••published rate table
confirm_price personthe analysis never runs on an unconfirmed price
purchase price
••••your assumption
costsevery line carries a provenance
current tax
••••county record
electricity
••••published rate table
water
••••published rate table
maintenance
••••your assumption
reassessmentthe tax bill after a sale
assessment after sale
••••county record
tax rate
••••published rate table
hazardexpected annual loss, for the insurance line
expected annual loss
•••• unaudited
loanwhat a lender would lend, and which cap binds
rate and term
••••your assumption
underwritethe scenario engine

Built from the fields above. Withheld here like the rest.

stresswhat has to go wrong first

Built from the fields above. Withheld here like the rest.

narrative modelprose only, never parsed back into a field

No figures from this stage.

When the input is wrong

  • A search-results URL. Not one property. Nothing was fetched and nothing was spent.
  • A listing the provider doesn’t know. The provider had nothing on this listing. The fields are left blank for a person to fill in, and no figure is guessed.
  • Skip the price check. Held at the price check. The analysis doesn’t run on a price nobody confirmed.
  • A city with no water schedule on file. No local water schedule on file. The line uses the national average and says so.

Review gates

Where a person stays in the loop.

We put a review gate (a step where a person signs off before anything goes out) wherever a wrong answer costs real money. We keep them few, because a person who approves everything soon stops reading. Choosing where they go is part of the scope we write.

Proof

Where this already runs.

The patterns on this page run in systems we operate. Each page below shows one of them stage by stage.

Fair questions

Questions about AI builds.

Which models do you use?

Whichever fits the job and your data rules. We work with Claude, OpenAI models and open-weight models run locally. The evaluation set makes the choice, and it lets you switch later without guessing.

Can it run without sending our data to a model provider?

Often, yes. Retrieval and extraction can run on a local open-weight model inside your environment. Where a hosted model is the better tool, you’re told what leaves, where it goes and how long it’s kept, before anything is built.

How do you know it works?

An evaluation set of real cases, written before the build and scored on every change. Plus a trace of every run, so a bad answer can be followed back to the step that produced it.

Start here

Tell us what’s slow, or what can’t be found.

One paragraph is plenty. Tell us what you want built, the step that costs the most, or the page that should rank and doesn’t. If you know why the obvious fix hasn’t worked, say that too.

Email
daniel@adjlcapital.com
Email Daniel

Daniel reads and answers these himself, usually within a day or two. No sequence, no drip, and nothing sold to anyone.