Adam Shawa · independent engineer, Germany. Laws, tariffs, catalogues, procedures — read, compiled into rules and formulas, executed into results you can sign. The model reads. The code counts. You keep receipts.
Deterministic where it counts ✶ auditable always ✶ fast by the way ✶ Deterministic where it counts ✶ auditable always ✶ fast by the way ✶ Deterministic where it counts ✶ auditable always ✶ fast by the way ✶ Deterministic where it counts ✶ auditable always ✶ fast by the way ✶
№ 01 — THE MACHINE, DRAWN
Knowledge, operationalized.
Not “AI that reads documents”. The full loop: read the source, compile it into typed rules and formulas, execute them into results — and keep the proof. Law is the hardest case, so it’s home turf. The machine doesn’t care: tariffs, catalogues, safety codes, internal procedure.
READINTAKE
Prose, PDFs, photographed pages, mixed Arabic/Latin scripts. Cheapest method first — familiar formats never reach a model.
COMPILERULEWORKS
IF period ∈ FY26rate = 2.5%REFUSE if input missing
Typed rules and formulas — versioned, cited back to their clause, tested against values hand-derived before the code exists.
EXECUTERESULTS
0123456789.0123456789%
Fixed-precision decimal, never floats. Deterministic: same checkpoint in, bit-identical result out. Or 4,412,809.00 — at ledger scale.
PROVERECEIPTS
REPLAY ✓ BIT-IDENTICAL
Every figure answers with its rule, its input and its run. Inputs are stored; conclusions can always be produced again.
IF THE KNOWLEDGE CHANGES, THE RULES RE-COMPILE. IF A RULE CAN’T FIRE SAFELY, THE MACHINE REFUSES. REFUSAL IS A FEATURE.
№ 02 — THE POSITION
Bolting a model onto your stack is a morning’s work.
Knowing where it must never go — that’s the job.
By architecture
The boundary isn’t a guideline. In my systems the computation engine has no network, no database, no import path to a model client.
Not discipline
Rules that live in people’s heads die under deadline pressure. Rules that live in the import graph don’t care about your deadline.
Speed is a by-product
Yes, the work ships faster than it used to. It shows up in the estimate, not in the marketing.
№ 03 — A GAME YOU CAN LOSE
SCORE 0/6 — CLICK A CARD
The sorting room
Every decision in a system is either model judgment or fixed code. Sort these six. Guess wrong and you’ll see how assessments happen.
A real pipeline, station by station. The model touches exactly one station — it reads. Everything after that is ordinary code against real data. Drive it yourself:
TRIGGER
A purchase inquiry lands in the monitored mailbox. Attachments included. A run starts, keyed to the thread.
ON THE BENCH — RAW MAIL
Every station fails loudly. Unresolved lines are the normal case, not an error — they go to a person with the original text, the candidates, and the reason it stopped.
№ 05 — THE CAPABILITIES · WHAT TO HIRE ME FOR
Name the job.
Six shapes of work, in the words you would search for. All of them share one spine: deterministic where it counts, auditable always, models kept where they earn their place.
LLM integration
The model earns a seat, not the keys. Wired into your stack with a schema at every exit, a failure path for every call, and no route to a number anybody signs.
Retrieval is easy to build once and hard to keep honest. Ingestion that tracks its sources, versioned indexes, every rebuild evaluated before promotion — rollback is a pointer change.
An agent that escalates is useful. An agent that guesses is a liability. Multi-step workflows where every consequential action is validated in code or lands on a human.
Real documents are photographs of paper: rotated, stamped, bilingual, Arabic beside Latin. Typed records where every field traces to a region on a page — cheapest method first, models last.
The high-risk obligations apply since August 2026. What auditors want is what I build anyway: logging, traceability, human oversight, and a boundary you can show them.
AUDIT TRAILS · REPLAY · RISK DOCUMENTATION · AI GOVERNANCE
Rescue work
Already shipped an agent that scares you? I find every path where a model can touch a number, cut it, and make the architecture hold the line — without a rewrite.
Saudi corporate filings — Zakat and income tax — computed from ledgers into submission-ready declarations, with the proof attached. Models are used heavily. The arithmetic is untouchable. That boundary is not a policy; it is the architecture.
The boundary
The computation core is a pure function: no network, no database, no import path to a model client — verified across the full transitive import graph, not promised in a README. The last model influence is a mapping suggestion a person approved; the engine’s parameter is literally named approved_mappings.
The checkpoint
Every input freezes into a versioned checkpoint before the engine runs; replay is asserted bit-identical, and expected values are hand-derived from the regulation before the code exists. Inputs are stored, not conclusions — a corrected rule should change the answer; what you need is to know that it did.
The controls
Nineteen controls in a flat sequence with no short-circuits — twelve blocking. Several re-derive the arithmetic by a second route and compare. One gate has teeth: a filing with failing blockers cannot be exported. All math in fixed-precision decimal, converted at the boundary so nothing inherits float imprecision at birth.
The ladder
Ingestion tries the cheapest thing first: known vendor formats, deterministic column maps, a cached layout fingerprint — a familiar file is processed with zero model tokens. Twelve model call sites in total, all behind one wrapper with retries, a circuit breaker and a hard budget abort.
“A control that is right most of the time is not a control.”
Schema strictness tracks consequence: where a model’s output becomes a number a person will approve into a filing, it is forced through a schema and rejected on mismatch; where it is a suggestion a person will read, lighter validation is proportionate. Where a rule exists but isn’t implemented — earlier regulatory regimes, sectors with unimplemented brackets — the system refuses at the boundary before the engine is ever called: a pre-flight rejection is a support ticket, an approximate filing is an assessment. And the bug that proves the thesis: an extraction once silently returned 52 of 54 rows, and every ratio-based plausibility check passed — the fix was a set difference against the source, row by row, by identity, not a better prompt. Known gap, stated plainly: filings don’t yet record which engine generation produced them, so “recompute everything affected by this correction” is not yet a first-class query. That is the next piece of work.
02STEEL DISTRIBUTOR · PUBLIC REPO, MIT
Email → quote
▸ Inbox to ERP draft, six stations▸ The model reads text. Nothing else.▸ Every stage fails loudly, never silently
“If a model writes the price, nobody in the building can explain it.”
One agent with tools demos beautifully and explains nothing afterwards. So: schema-locked extraction, vector match against the live catalogue, unit math by profile weight in code, quotes assembled from validated fields only. Unmatched lines are the normal case — they arrive at a human with everything needed to resolve them in one pass. The public repository ships the pipeline, schemas and validation logic; no catalogue, no credentials, no customer data. Repository: github.com/dixichain/automated-ai-sales-assistant
03CUSTOMER ASSISTANT · PROPOSAL STAGE
The self-feeding knowledge base
▸ Second engine beside the product — reads source APIs, no write path back▸ Ingest → embed → dedupe → retire: the index tends itself▸ Every rebuild evaluated before promotion; rollback is a pointer change
“Freshness should not be hostage to a release cycle.”
An assistant is only as honest as its knowledge is fresh — and embed-once is quietly wrong within a fortnight. The design: an AI-powered curation engine running beside the main backend. On schedule, it pulls new data from the source APIs, embeds it for retrieval (RAG), and reconciles it against what is already indexed — duplicates removed, superseded facts retired, nothing stale left to be served with confidence. The cleaned result feeds the database and the main engine; the assistant queries only this layer, and nothing in it has a write path into the system of record. Every chunk carries its source and ingestion time, so any answer traces to a document and a moment. Designed and proposed rather than shipped — published because the reasoning about coupling and blast radius is the part worth reading.
№ 07 — NO RATE CARD, ONE FILTER
The terms
A published price has to assume your systems are a mess. The mechanism is fairer: pick the shape that matches how well the work is understood. One filter so nobody wastes an afternoon: minimum engagement €5,000 — regardless of duration.
Audits get shorter
Every figure arrives with its rule, its input and its replay. The auditor’s question is already answered.
New rules = config
A new filing type or tariff year is a rule set plus hand-derived tests — not a rewrite of the engine.
Small model bills
Cheapest method first: native text read as text, known layouts matched as templates. Models handle the leftovers only.
Survives my exit
Runbooks, reasoning, and a working setup on someone else’s machine before I stop. Replaceable by design.
Per deliverable
When the work is understood. Scope written down, price fixed against it, changes priced separately.
Hourly, ceilinged
When it isn’t. An agreed maximum you will not be billed past. Right for discovery and unmapped systems.
Long-term
When it doesn’t end. Retainers, embedded work, salaried roles — negotiated directly, outside the calendar.
ESTIMATES = RANGES, UPPER END NAMEDDISCOVERY: PAID, YOU OWN THE DOCCHANGES PRICED BEFORE BUILTCODE IS YOURS FROM COMMIT ONEHANDOVER: RUNBOOKS + REASONS
I’d rather be replaceable than necessary. Every system is documented to the point where someone else can extend it without me.
№ 08 — DEPARTURES
When I can start
OPEN = new engagement can start · PART = reduced scope or late start · FULL = no new project work · — = beyond the horizon. Long-term arrangements ignore this board. Last reviewed recently.
ONE ACTION. TWO LINES: WHAT IT DOES NOW, WHAT MUST BE TRUE AFTER.