Engineering log · 2018 → 2026 → ∞

How we built A3.

We are UBIO. For nearly a decade we have been chasing one question: who builds the automation, and who fixes it when the website changes? Our first answer was Autopilot: people. Our second, A2 (Automated Automation), was software, five years too early. A3 stands, half-jokingly, for Automated Automation (Again). Our final try. The moonshot. This is how we got here.

Long read · illustrated · ~25 min · August 2026 · companion to The Machine That Reads the Web

HUMAN AUTHOR: people build & repair the automation MACHINE AUTHOR: software builds & repairs the automation
ERA 00 — BEFORE THE NUMBERS

The why

2013 – 2018 · the false starts

The web is the world's largest marketplace, and it has no standard interface. Everything we ever built starts from that observation, and from a consumer app that didn't work out.

THE FALSE STARTS

A universal shopping basket

UBIO began life as Universal Basket, a consumer app with a seductive promise: add anything, from any online store, to one basket, and we'll do the checkouts for you. The product went through several incarnations, and none of them found their market. But building it forced us to solve a genuinely hard problem: software that can operate any website the way a person does (search, fill forms, handle logins, pay) without the site's cooperation, because almost no shop had an API and fewer wanted to build one.

The consumer app didn't survive. The capability underneath it, automating the un-automatable, turned out to be the company.

CO UBIO · ubio.ai ORIGIN Universal Basket → pivots → B2B
THE JOB

Do what a person would do at a website, reliably, at scale

Because our roots were in checkout, our version of "web automation" was never just scraping. It was completing transactions: search this airline, hold that hotel room, enter passenger details, pay, on websites that offer no API, for businesses whose revenue depends on the answer. Reading a page is the easy half. Acting on one, with real money, real bookings, and real customer data moving through the flow, demands a different class of machine.

A scraper that fails leaves a gap in a dataset. A booking automation that fails leaves a customer without their flight. That asymmetry drove every architectural decision we've made since: auditability (what exactly did the machine do?), determinism (will it do the same thing tomorrow?), and graceful interruption (what happens when the site asks a question only a human can answer?).

THE CONSTRAINT

No creativity at 3 a.m. on attempt #40,000

Production web automation has a brutal economic profile: a run must cost close to nothing, finish in seconds, and behave identically on the ten-thousandth execution. Whatever intelligence goes into understanding a website, it cannot live inside the run loop. That single constraint is the through-line of our whole story. All three of our architectures honour it. They differ only in who supplies the intelligence, and when.

The framing questionEvery architecture we've built is an answer to one question: who builds the automation, and who fixes it when the website changes?
ERA 01 — A1 · AUTOPILOT

Humans wire the scripts

2018 – today (still in production)

Our first real answer was Autopilot, a visual programming tool that let skilled people build and maintain automation scripts, backed by the Automation Cloud, a platform that ran those scripts flawlessly at scale. Nobody called it "A1" at the time; the retronym only arrived once there was an A2. It worked: some of the biggest names in travel ran real bookings through it for years. And it scaled exactly as far as the humans did.

2018

Skyscanner asks a question

After the consumer pivots, the thing that set our direction was a question from Skyscanner: could you help us automate flight bookings? Their users compared flights on Skyscanner, then finished the purchase on an airline's website, and plenty of airlines and travel agents had no booking API to integrate with. If software could complete that booking the way a person would, the whole handoff could disappear. We said yes. That yes became the product, and the company.

The insightThe gap wasn't data. It was transactions: thousands of travel businesses sell online but cannot be integrated with, because a website is their only interface.
FIRST Skyscanner · flight bookings
THE PLATFORM

The Automation Cloud

Around that yes we built a proper transaction platform. Customers submit a job ("book this flight for these passengers"); the platform queues it, assigns it to a worker running a real browser, and executes a versioned script that encodes the target website. Every attempt is recorded step-by-step (screenshots, page snapshots, structured logs) into an audit trail you can replay in review. Jobs can pause and ask questions mid-flow (a one-time passcode, a seat preference) and resume when the answer arrives; half-finished work resumes from checkpoints on a fresh worker; personal and payment data is encrypted field-by-field with explicit access controls, because this is real customer data buying real tickets.

Around the core sat the operational machinery any serious automation fleet needs: managed proxy pools and IP hygiene to keep sessions plausible, secure flows for 3-D Secure payment challenges, a regression-testing harness that re-ran scripts against live sites before each release, and incident tracking wired to alerting. None of it is glamorous. All of it is why banks' fraud systems, airline websites, and our customers' auditors could all live with a robot doing the buying.

A1 architecture: a script engineer authors in Autopilot, publishes to Automation Cloud, which assigns jobs to N workers whose browsers replay the scripts against the open web. A dashed loop returns to the engineer: site changed, script broke, a human fixes it, republish.
FIG 1 · A1 / Autopilot — deterministic runtime, human authorship. The dashed line is the maintenance loop; note who is standing inside it.
What was possibleThousands of production bookings a day (real flights held, real payments made, real forms filed), each one auditable step-by-step, years before anyone said the word "agent".
CONCEPTS job · script · worker · execution OPS audit trail · human-in-the-loop · encryption
THE ENGINE

Scripts weren't code; they were trees of Actions and Pipes

An Autopilot script is not a program a developer types into an editor. It's a structured tree: contexts that match recognisable states of a website, containing actions (click, input, iterate, expect), each configured by a pipeline of composable pipes that select page elements and transform values. A visual programming language for the web, engineered for one property above all: replayable determinism.

This is what a fragment of a real pipeline looks like under the hood: query the totals, parse a price, walk up to the row, pull the room name:

{
  "pipeline": { "pipes": [
    { "type": "dom/query-all",  "selector": "span.total-price" },
    { "type": "value/set-path", "path": "/price", "pipeline": { "pipes": [
        { "type": "dom/text-content" },
        { "type": "value/parse-price", "exponent": 0 }
    ]}},
    { "type": "dom/closest",   "selector": ".row" },
    { "type": "dom/query-one", "selector": ".name-room" }
  ]}
}

Every pipe is pure and inspectable; you can freeze a run at any step and look at the element set flowing through. Keep this JSON in mind; it comes back in Era 02 as the punchline.

CONCEPTS contexts · actions · pipelines · pipes
THE COCKPIT

Autopilot: the tool we named the era after

The people doing the encoding got a serious instrument: Autopilot, a desktop application with a live browser on one side and the script tree on the other. Point at an element, build a pipeline, watch the element set change at every pipe, play the script forward action by action, rewind, fix, replay. A whole discipline grew up around it inside UBIO: script engineers who could look at a booking engine and see, in their heads, the context tree it would become.

MOCKUP · Autopilot — the script tree on the left, the selected action's pipeline with its element set narrowing at every pipe, and the live browser under playback control. (Illustrative recreation.)
TOOL Autopilot · desktop app DISCIPLINE script engineering
OPERATIONS

Watching ten thousand jobs at once

A transaction platform is only as good as its operations room. The Automation Cloud shipped with a dashboard where our team and our customers watched every job in flight: live states streaming in (processing, awaiting input, awaiting 3-D Secure, success, fail) with per-job drill-down into each execution's screenshots, page snapshots and step logs. Failure patterns rolled up into incidents: when a website's failure rate crossed a threshold, an incident opened, on-call got paged, and a script engineer went to work. The dashboard was where the maintenance treadmill was visible: a wall of green that could turn amber at any moment, one website redesign at a time.

MOCKUP · the Automation Cloud dashboard, jobs view — live job states, human-in-the-loop pauses, and the incident machinery that paged a human whenever a website changed. (Illustrative recreation.)
MONITORING live states · drill-down · replay ALERTING incidents · thresholds · on-call
THE CUSTOMERS

Skyscanner, Google, Kiwi.com, trivago

The model found its market in travel, where the long tail of "bookable but not integrable" is enormous. After Skyscanner came Google, first automating hotel bookings, and later hotel data, through our Smart Feed product: continuously harvested rates and availability, delivered as a structured feed. Kiwi.com made us a major part of their booking machinery: when their virtual-interlining engine sells a trip stitched together from carriers that don't cooperate with each other, automation completes the individual bookings. And for trivago we power Book & Go: hotel bookings completed directly with online travel agencies on the traveller's behalf, many of which have no booking API of their own, only a website.

The patternEvery marquee logo had the same shape: a platform with millions of users on one side, and on the other, thousands of travel businesses whose only interface is a website. We were the adapter.
CUSTOMERS Skyscanner · Google · Kiwi.com · trivago PRODUCTS bookings · Smart Feed · Book & Go
THE COST

The maintenance treadmill

Then the bill. Every script encoded one website, and websites change without notice. A renamed element, a redesigned results grid, a new consent banner: any of them could stop a revenue-bearing flow at 2 a.m. Our incident system existed because breakage was not an exception. It was the weather.

Each new website cost us skilled human days to encode. Each redesign cost human hours to re-encode. The runtime scaled beautifully; authorship scaled linearly with headcount, and headcount that good doesn't scale at all.

The lesson Autopilot taught usThe runtime model was right: versioned scripts, job queues, audit trails. The bottleneck was never running automations. It was building and repairing them.
Interlude · 2019

So the question became unavoidable: the most expensive thing in our company was people translating websites into scripts. Websites are documents. Scripts are data. Could software do the translation?

ERA 02 — A2 · AUTOMATED AUTOMATION

Right idea, wrong decade

Oct 2019 – Apr 2020 · six months, one repo

The name said it plainly: Automated Automation: automate the act of automating. What if no human built the script at all? Point software at a page, let it work out what's there, and have it emit the automation itself. A2 was short-lived and never shipped, and it drew the blueprint we later built A3 on.

THE INSPIRATION

Wrapidity: proof that machines could learn to extract

We weren't imagining things: it had been done, at least for reading. Wrapidity, an Oxford University spin-out, had commercialised five years of ERC-funded research (the DIADEM project) into what computer science calls automated wrapper generation: software that replaces hand-coded scrapers outright. Instead of brittle extraction code keyed to a page's markup, it used "page geography" and visual cues, reading a rendered page the way a human eye does: matching input boxes to nearby labels, navigating complex forms, and parsing results into structured data on its own. Meltwater acquired it in 2017.

Wrapidity proved a machine could learn to read a website autonomously. Our question was one step harder: could a machine learn to transact, and could it emit an artifact our platform could replay deterministically at scale?

PRIOR ART Wrapidity · Oxford DIADEM FIELD automated wrapper generation EXIT acquired by Meltwater · 2017
OCT 2019

"Init": teach the page to explain itself

Our first move: stop treating a page as markup and start treating it as semantics. A2 injected an analyser into the live page that walked the document and rebuilt it as a semantic tree, classifying each element by meaning, discarding what it couldn't classify, and collapsing the wrapper elements that make real-world pages ten layers deep.

The spec we wrote reads like a compressed research paper. Four stages, three of them still recognisable in what we run today:

# SPEC.md — "Grouping algorithm for A2" (verbatim structure)
1. Preparation        # page → semantic tree, classify elements,
                      # discard unclassified, remove wrapper nodes
2. Pivot points       # semantic query: "get all prices"
3. Attachment         # ascend to common parent, query within scope,
                      # prefer the closest common parent
4. Pruning            # drop unrelated elements by proximity
APPROACH live-page analysis · semantic tree
THE ALGORITHM

Pivot points and proximity: structure from geometry

A2's core insight, the same one Wrapidity ran on, was that a results page has a shape. Find the repeated anchor (every price on the page) and call each one a pivot point. Then, for each pivot, climb the tree towards the root, at every level asking a semantic query inside that subtree: is there a room name here? A rate name? A cancellation policy? The closest common parent that answers wins; anything that shows up in implausibly large groups gets discarded. No selectors written by anyone. The page's own geometry does the grouping.

The A2 pipeline: a raw page tree is classified into a semantic tree of typed nodes (Price, RoomName, RateName, Cancellation), grouped into pivot groups of one offer each, and emitted as a replayable script that needs no analyser. A dashed note points at the classify step: it was hand-written pattern rules, a human one level up.
FIG 2 · A2 — generate once, replay forever. Every box was machine-made except the one that mattered.
THE PUNCHLINE

A2's output was an Autopilot script

Here is the detail that makes A2 the true ancestor of A3 rather than a curiosity: what it emitted was not a dataset but a script in our engine's own format. Machine-discovered data points became query-and-climb pipelines with measured distances; the result was a script the existing Automation Cloud could replay deterministically, at full speed, with no analyser in the loop.

From A2's script generator, machine-written and human-shaped:

// for each discovered data point: climb ×distance, select, extract
pipeline.push(fetchData('/price', [
    { type: 'dom/text-content' },
    { type: 'value/parse-price', exponent: 0 }
]));
dataPoints.forEach(dp => {
    pipeline.push(fetchData(pathFor(dp.type), [
        { count: dp.distance, type: 'dom/parent' },
        { type: 'dom/query-one', selector: dp.selector },
        { type: 'dom/text-content' }
    ]));
});

We had fully separated building from running: an expensive, clever pass that writes the artifact; a cheap, dumb loop that runs it. Hold that thought.

The idea that survivedLet the machine build the script; keep the replay deterministic. A3 is this exact sentence, with a different author.
APR 2020

Why it didn't work

Because the "understanding" was a stack of classifiers we wrote by hand. The price detector was solid. Everything else was text-matching rules, tuned per vertical, by one of us:

// the entire "intelligence" of A2, verbatim
{ classifierKind: 'text', type: 'RoomName',
  regexps: [{ source: '((premium|superior) room)|penthouse' }] },
{ classifierKind: 'text', type: 'RateName',
  regexps: [{ source: '\\w+ rate|room only|pool access|breakfast included' }] },
{ classifierKind: 'text', type: 'Cancellation',
  regexps: [{ source: 'non[-\\s]refundable', value: 'non-refundable' }] }

One supported domain (hotel room listings), and even that needed a blocklist to suppress false positives. Every new vertical meant new classifiers; every new language, new rules. We hadn't removed the human from the loop. We had promoted ourselves one level of abstraction up, where the work was harder to write and broke just as often. The repo's last commit landed on 30 April 2020. Archived.

A2 needed a component that could look at any text on any page and say what it was: a general-purpose reader. In 2019, that component did not exist at any price.

SCOPE one domain: hotel rooms EOL April 2020 · archived
Interlude II · meanwhile, we built the business · 2020–2023

So what did we do after archiving A2? We stopped trying to invent a component that did not yet exist and concentrated on the company in front of us. We scaled the booking business, deepened our relationships with customers including Google, and built other products around the same hard-won capability, most notably Smart Feed, which continuously turned live hotel websites into structured rates and availability.

Those years were not a pause in the story. Running bookings and data feeds across thousands of changing websites forced us to harden the fleet, monitoring, scheduling, retries and operational controls that A3 would later inherit. It also made the remaining problem impossible to ignore: the software could run at enormous scale, but people still had to author and repair what it ran.

Meanwhile A2 sat in an archived repo: a machine with a hole in the middle, shaped exactly like a language model. Its scaffolding (separate building from running, understand the page semantically, emit a deterministic artifact) was waiting for its missing part to be invented.

ERA 03 — BACK TO PRODUCT · THE MISSING COMPONENT SHIPS

The spark

2023 – 2025

Then we went back to the product problem. GPT-4-class and Gemini-class models arrived, and the component A2 was missing suddenly existed, rentable by the token. A model could look at a page and say what it was. Better: it could write code. For us the question was never whether to use them. It was where to put them.

2023–24

The general-purpose reader exists now

What our pattern rules had been reaching toward ("this string is a room name; that one is a cancellation policy; those two prices belong together") became a commodity. A frontier language model reads a page, a screenshot, an intercepted API response, and classifies all of it, in any language, for any vertical, with no per-domain engineering. And unlike A2's analyser, it doesn't just recognise structure. It writes code. The author A2 was waiting for had arrived.

ERA GPT-4 · Gemini · Claude UNLOCK read any page · write the script
THE DECISION

Keep the model out of the run loop

The obvious 2024 move was to put a model inside the loop: screenshot, think, click, repeat. Astonishing demos; hopeless economics for production work. Per-step inference is slow, priced per token, and non-deterministic exactly where a booking must not be. Years of running Autopilot scripts in production had made our requirements non-negotiable: runs must be cheap, fast, auditable, repeatable.

So A3's founding decision is a refusal: the model never drives production traffic. The model is the author. It learns a site once (expensively, thoughtfully, with a real browser in hand) and writes an artifact. The artifact runs a million times, for nothing, deterministically. Intelligence at the edges of the lifecycle; clockwork in the middle.

The A3 equationA1's runtime discipline + A2's authorship architecture + an author that finally works = AI at learn-time and fix-time, zero AI at run-time.
ERA 04 — A3 · AUTOMATED AUTOMATION (AGAIN)

The moonshot

2024 → today

We named it honestly: A3 stands, half-jokingly, for Automated Automation (Again). Our final try. It started life as the stage-based toolchain at athree.dev, and grew into a platform: AI agents that learn websites in a live browser and write real code; an immutable publish pipeline; a fleet that replays the result with no model in the loop; and a sentinel that notices breakage and dispatches a repair agent before we do.

THE UNIT

Stages: one recognisable state, one module

Autopilot's contexts return, reborn as code. A stage owns exactly one recognisable state of a website: a landing page, a results grid, a confirmation modal. Its match() answers "is this me?" with no side effects; its run() acts. Stages live in folders per site; a workflow binds the objective to typed input and output schemas. The contract is the same one A1 proved: small, matchable, replayable units, except now they're ordinary TypeScript driving a standard browser-automation framework, and their author is an agent.

export default defineStage({
    title: 'Extract Rooms and Rates',
    success: true,
    match: async (ctx) => {
        if (!new URL(ctx.page.url()).pathname.includes('/hotel/')) return false;
        return await ctx.page.locator('[data-rates-grid]').first().isVisible();
    },
    run: async (ctx) => {
        // prefer the intercepted availability JSON; fall back to the page
        const hit = ctx.networkResources.find(r =>
            r.request.url.includes('getProductAvailability'));
        ctx.outputs.results = hit ? normalizeRooms(hit) : await scrapeGrid(ctx);
    },
});

A project declares its workflows and schemas in config; each site folder holds that site's stage files, next to playbooks/: notes the agent writes to itself about how a site behaves. Publishing a project creates an immutable version; production jobs always run a published version, never a moving draft.

CONCEPTS workflow · site · stage · playbook FORM TypeScript · typed schemas · real browser
THE IDE

Learning sessions: teach a site, don't program it

Adding a site is no longer an encoding project; it's a conversation. An operator opens an interactive session, a full development environment in the browser, purpose-built for teaching. On the left, the project's files and the workflow's stages with their live match status. In the middle, a thread with the Learning Agent: you state the objective, and the agent navigates the real site, inspects the page and its network traffic, writes stage files, runs them, and iterates until the workflow's outputs validate against the schema, narrating each step as tool calls you can expand and audit. On the right, the live browser it's working in, plus the structured inputs and outputs. You can interrupt, correct, take over the browser, or replay any run step-by-step. The human's job has changed from author to reviewer: watch the diff, spot-check the run, publish.

MOCKUP · an A3 learning session — the agent writes and tests stage files against the live site while the operator supervises. (Illustrative recreation.)
AGENTS Learning · Dataset · Repair HUMAN ROLE author → reviewer
EXECUTION

Deterministic replay, with one narrow escape hatch

Production jobs run published versions on the worker fleet with no model in the loop, exactly as A1 taught us. But scraped text is messy: "Free cancellation until 48h before arrival" is not a schema field. So the runtime offers stages a single, disciplined opening: ctx.classify(), an AI-backed transform with an aggressive twist. The first time it sees a text shape, a model writes the parsing function; the numbers, dates and category words in the text are turned into parameters and the resulting function is cached. Every later occurrence of that shape is parsed by cached code: no model calls, no nondeterminism introduced.

What became possibleA2's dream, upgraded: the model doesn't just build the automation once; even its runtime "reads" compile down to cached, deterministic functions.
API ctx.classify({ text, schema }) TRICK parse once → cache the function
JOBS

The jobs floor: every run, and what broke it

The org dashboard's Jobs view is the A3 counterpart of the old operations room, with one structural upgrade. Every job shows its target (site, workflow, and the exact published version it ran), its owner (a person, an API caller, or the dataset that spawned it), and its full execution log. But when a job fails, the platform doesn't just say failed; it says whose fault: a script failure (the code no longer matches the website) or an environment failure (network trouble, a bot wall, an unreachable site). Environment failures retry quietly. Script failures accumulate into per-site health, and that distinction is what turns a monitoring page into the trigger for self-repair.

MOCKUP · A3 jobs view — every failure is classified: script failures feed the self-healing sentinel, environment failures just retry. (Illustrative recreation.)
SPLIT script failure ≠ environment failure TRACE version-stamped runs · full logs
SELF-HEALING

The treadmill, automated: the loop finally closes

This is the feature the previous eight years were building towards. Script failures feed a per-(workflow, site) sentinel. When thresholds trip (an absolute count, or a failure rate over a recent window), the platform first probes the site (no point blaming the code for an outage), then starts a Repair Agent: locked to the broken workflow's files, told to make the smallest possible change, capped in steps and in dollars.

Then the part that matters: we don't trust the agent's claims. The platform independently re-runs the workflow against the failing inputs plus known-good samples, and only a verified fix is published, through the normal publish pipeline, stamped as an automated fix. Publishing resets the health counters by definition. The 2 a.m. incident from Era 01 now usually resolves itself before anyone's pager fires.

sentinel: {
    enabled: true,
    failureThreshold: 3,      // absolute script failures per (workflow, site)
    failureRatePercent: 10,   // … or relative, over a recency window
    autoPublish: true,        // false → verified fix waits for human review
    maxAttemptsPerDay: 2,
    cooldownHours: 6,
    maxCostPerFix: 5,         // hard $ cap on the repair agent's model spend
    verifyEnvironment: true,  // probe the site before blaming the code
}
The A3 lifecycle loop: an agent learns and writes stages, the result is published as an immutable version, then run N times deterministically with no AI. Failures are classified as script or environment; environment failures just retry, while a tripped sentinel dispatches a repair agent making a minimal, cost-capped diff, which the platform verifies by re-running before auto-publishing.
FIG 3 · The loop that closes itself — in A1, the bottom row of this diagram was one of us. That is the entire difference, and it is everything.
What became possibleBreakage stopped being an interrupt for our team and became a background process of the platform: detected by health counters, fixed by an agent, proven by replay, shipped by the publish pipeline.
PIPELINE sentinel → probe → repair → verify → publish GUARDS cooldowns · attempt caps · cost caps
DATASETS

Datasets: the mill keeps running

Most real-world scraping isn't one page; it's a whole catalog, kept fresh forever. This is Smart Feed's lineage, rebuilt as a platform feature. Declare a dataset (which listing workflow to sweep, which sites, which detail workflow to run per item) and the platform owns everything we used to hand-orchestrate: fanning out detail jobs, de-duplicating items per site, detecting changes, keeping an append-only history of every revision, marking delisted items, budgeting retries, stopping early when pages stop yielding anything new, and firing on a schedule. The dashboard's Datasets view shows each catalog's size, freshness, and run history, with every scraped item queryable alongside its full change history.

MOCKUP · A3 datasets view — declared catalogs with fan-out, change detection, revision history and scheduling owned by the platform. (Illustrative recreation.)
MODEL listing → fan-out → detail → revisions OPS dedupe · delisting · early stop · schedules
THE PLANT

Two planes, because agents write the code they run

An agent that writes code means a platform that runs machine-written programs as a matter of routine, so our infrastructure assumes hostility. A trusted control plane holds state, scheduling and secrets. An untrusted workload plane holds the workers: each one claims a job with a narrowly-scoped credential and spawns a runtime that can see exactly one session, one project, and nothing else: no databases, no platform secrets. Browsers come from a separate pool of managed, disposable browser hosts. The worker fleet autoscales with demand, keeping a warm pool so paid workloads never wait for capacity.

A3 topology: humans in the dashboard and IDE, plus external agents over MCP, both talk to a trusted control plane holding the API, scheduling, events and background services. The control plane hands work down to an untrusted workload plane of session runtimes that run agent-written code with no secrets, which leases disposable browsers from a browser pool. An autoscaler scales the fleet.
FIG 4 · A3 topology — the runtime pods execute machine-written code, so we treat them as radioactive: narrow credentials, no secrets, disposable browsers.
BOUNDARY trusted control · untrusted workload SCALE autoscaled workers · browser pool
MCP

The platform publishes itself for agents

The Machine That Reads the Web ends with an inversion: sites exposing themselves to agents instead of fighting them. We built A3 on that side of history. Every surface (run jobs, edit project files, query datasets, org operations) is exposed over MCP, the open protocol that lets AI assistants call tools, and the Copilot chat on our dashboard uses the exact same tools as any external agent connecting over the wire. Claude, Cursor, a customer's own bot: identical capabilities, the user's own permissions, confirmation gates where actions have consequences.

The inversion, livedA1 fought its way into websites built for humans. A3 does that too, and then turns around and publishes itself as a structured surface for the next generation of readers.
SURFACES jobs · projects · datasets · org CLIENTS dashboard copilot ≡ external agents
Interlude · the lineage in one sentence

A3 is A1's runtime (versioned artifacts, job queues, audit trails) running A2's architecture (machine authors, deterministic replay) powered by the component neither of them had: a reader that actually reads.

ERA 05 — WHAT EIGHT YEARS TAUGHT US

The lessons

2018 → 2026 → ∞

Six things we'd tell anyone building automation platforms, each one paid for with at least one rewrite of our own.

Lesson 01

Determinism is non-negotiable

It survived all three of our architectures untouched. Whatever is intelligent about your system, production runs must be cheap, fast, repeatable, and auditable. The model earns its keep at the edges (building, repairing), never in the hot loop.

Lesson 02

The bottleneck is authorship

Autopilot ran flawlessly for years and still couldn't scale, because every website cost us human days. Ask where the human hours actually go. In web automation the answer was never "running"; it was building and fixing.

Lesson 03

Being early ≈ being wrong, but keep the blueprint

A2 failed in six months and was still the most important thing we ever wrote: it fixed the shape of the solution years before the parts existed. When the missing component shipped, we didn't have to design A3; we had to assemble it.

Lesson 04

Never trust the agent's claims

Our Repair Agent doesn't decide it fixed the automation; replay decides. Verification by independent re-run, health tracked per website, hard cost caps on every repair: agents get autonomy exactly as far as the evidence reaches.

Lesson 05

Treat machine-written code as radioactive

The moment software writes software, your fleet is running machine-generated programs as a matter of routine. Separate the trusted and untrusted planes, scope every credential to one job, keep secrets out of reach, before the first incident, not after.

Lesson 06

Build for the inversion

The web is splitting into surfaces built for agents and walls built against them. A platform that consumes the messy side should publish the clean side: every A3 capability is exposed to AI agents as a structured tool, because the next users of our platform won't all be people.

The through-line

From a script engineer hand-wiring pipelines in a desktop cockpit, to pattern rules guessing which string is a room name, to an agent that reads the page and writes the code: it was always one idea: the automation stays deterministic; the only question was who builds it. Autopilot said: people. A2 said: software, and was five years early. A3 (Automated Automation, again) says: a model that reads, a platform that verifies, and a loop that closes itself. The web still changes without notice. It's just no longer our pager that rings.

Sources & artifacts

Written from the primary sources: our own codebases and their commit history (August 2026). Product screens are illustrative recreations, not live data.

· the Automation Cloud platform & dashboard — in production since 2018 · Autopilot — the visual script builder · A2 — the Automated Automation prototype · archived 2020 · the A3 platform — learning, jobs, datasets, self-healing · athree.dev — the A3 toolchain · travel.ubio.ai — Smart Feed, hotel data at scale · TechCrunch — Meltwater acquires Wrapidity (2017) · Meltwater — Oxford data-extraction spinout · A3 concepts — workflows, stages, sites, playbooks · The Machine That Reads the Web — the wider history · ubio.ai — us
back to A3 website