Curation Labs · The post-AI data stack

Analysis is cheap.
Agreement isn’t.

Fifteen years of data infrastructure on one canvas, after Ian Macomber’s post, and where the platform we’re building sits on it.

Source — I. Macomber,
The Shape and Feel of the Post-AI Data Stack (30 Aug 2026)
The source

Ian Macomber’s post tells fifteen years of data infrastructure
in four diagrams.

Macomber's ~2013 pre-modern data stack: two OLTP databases inside the reachable boundary, everything else outside it.
Fig. 1 · 2013Questions that fit on one server.
Macomber's ~2016 cloud data warehouse stack: the boundary now covers clickstream and a warehouse feeding BI tools.
Fig. 2 · 2016Questions across the whole business.
Macomber's ~2020 Modern Data Stack: managed ETL in, dbt in the warehouse, Reverse ETL back out to operational systems.
Fig. 3 · 2020From reporter to operator.
Macomber's ~2026 post-AI data stack: an agent harness between data stores and interfaces, fed by company context and a feedback loop.
Fig. 4 · 2026Encode data judgment as infrastructure for agents.

The dashed purple line in each one is everything you can actually query.

Source — I. Macomber, agent-readable artifacts (2026)
The picture of 2027 the post paints

In 2027 your CPO reads the dashboard
without ever opening it.

“By 2027, your CPO will learn about your team’s product launch through a subagent, deployed by an agent, that scans every product launch dashboard once a week.”Ian Macomber · 2026

Does our work show up in that paragraph, and is the paragraph right?

How to read the next twenty minutes

One question, five sources, and one dashed line.

Running question

Did Tuesday’s deploy slow checkout, and which customers noticed?

Every era, four beats
  1. walls left standing
  2. one component per wall
  3. run the question
  4. name the new walls
After — I. Macomber, fig. 1 (2026)
Act one · ~2013 · Pre-modern

In 2013 you could only ask what fit on one server.

Blocked

Did Tuesday’s deploy slow checkout, and which customers noticed?

Can

Count orders per hour from the App DB, if the DBA runs it for you.

Can’t

Join them to Billing, see latency at all, or get the answer before Monday.

Three walls: islands, one machine, and events not stored.

After — I. Macomber, fig. 2 (2026)
Act one · ~2016 · Cloud warehouse

Storage splits from compute, and all the data lands in one place.

Answerable

Did Tuesday’s deploy slow checkout, and which customers noticed?

Can

Join orders, invoices and latency events in one place. A data scientist finds the slowdown.

Can’t

Tie it to support tickets, which live in the helpdesk. Nobody else can rerun the notebook.

Three new walls: bespoke pipelines, personal definitions, and every answer ends in a slide.

After — I. Macomber, fig. 3 (2026)
Act one · ~2020 · Modern data stack

Data comes in with a click, and the answer goes back into the product.

Actionable

Did Tuesday’s deploy slow checkout, and which customers noticed?

Can

Tickets land by managed ETL, latency is defined once in dbt, affected accounts get tagged in the CRM.

Can’t

Read the incident doc or the PR, or try a new angle without someone writing SQL.

Three walls left: text goes unread, every question needs SQL, and definitions run on the honor system.

After — I. Macomber, figs. 1–3 (2026)
End of act one

Each era removed a constraint on
who could ask what of which data.

EraKnocked downLeft standing
~2013

islands · one machine · not stored

~2016

islands · one machine · not stored

bespoke · personal · ends in a slide

~2020

bespoke · personal · ends in a slide

unread · needs SQL · honor system

The next era removes two of these three, and runs straight into the third.

After — I. Macomber, fig. 4 (2026)
Act two · 2026 · Post-AI

An agent harness sits between all the data and every interface.

Agent-answerable?

Did Tuesday’s deploy slow checkout, and which customers noticed?

Can

An agent reads the incident doc, the PR and the metric definition, and answers in Slack in minutes.

Can’t

Promise the coding agent and the Slack bot use the same definition of latency. Nothing measures it.

AI made producing analysis nearly free. It did not make agreeing on reality free.

Source — I. Macomber, agent-testable consensus (2026)
The fan-out

Ask the same question through five interfaces
and five numbers come back.

Same data · same question · five definitions
The question

Did Tuesday’s deploy slow checkout, and which customers noticed?

Slack botp95 server latency · noticed = opened a ticket
Coding agentp50 client latency · noticed = abandoned a cart
Notebook assistantp95 client latency · noticed = ticket or abandoned cart
BI tool’s chatp99, timeouts count · noticed = any slow session
A coworker’s agentmean latency · noticed = churned within a week
1 2 3 4 5 412customers 1,980customers 2,241customers 6,870customers 38customers
The exec

Five numbers. Which one is right?

1–5each interface chose its own definition of checkout latency and of noticed · the numbers are illustrative

“Assume the models are never wrong, your context is just underspecified.”

Source — I. Macomber, agent-testable consensus (2026)
The post’s move

Consensus sounds vague.
It can be engineered, asserted and measured.

results = ask_everywhere(
    interfaces=["coworker", "coding_agent", "bi", "slack"],
    question="What was net revenue retention last quarter?",
)

assert same_metric_definition(results)
assert values_within_tolerance(results, relative=0.00001)
assert same_authorization_outcome(results)
assert required_evidence_used(results)
Ian Macomber · 2026 · pseudocode from the postSame definition, same value, same permissions, same evidence.
  1. 01Take every metric in last quarter’s board deck.
  2. 02Ask about each one through every interface and model.
  3. 03Count the distinct answers.
  4. 04One: celebrate. More than one: read the traces, fix, repeat.

A test tells you the agents disagreed. It can’t stop them disagreeing.

Source — I. Macomber, post-AI data stack (2026)
Four requirements

Four things the stack must be.
We’ll check each one against ours.

RequirementWhat it meansHow we’ll check
Agent-readable artifacts

Outputs are plain files an agent can open, not screenshots in a BI tool.

Can an agent read the output as a file?
Agent-operable tools

Everything is reachable by API or command. Nothing is UI-only.

Is there anything only a human can click?
Agent-agnostic context

Definitions live where any agent can read them, not inside one vendor.

Who owns the definitions?
Agent-testable consensus

The fan-out runs as a test and returns a number.

Does it?

The post asks for consensus you can test. We want consensus the data layer guarantees, and the test to prove it.

Act three · Today · Our platform

Same canvas, our names on the boxes, and a status on each.

built partial still to build requirement met

Answerable by one agent

Did Tuesday’s deploy slow checkout, and which customers noticed?

Can

An agent spins up a sandbox, queries the Iceberg tables with DuckDB, and hands back a Marimo notebook.

Can’t

Guarantee a second agent reads the same version, and the same definition of affected customer.

Storage and compute are the solved part. The dashed boxes are the scarce resource, and they’re ours to build.

Format · catalog · engine

Iceberg is the binding, the catalog is the index,
and DuckDB is the reader.

In a libraryIn our platformWhat it knows
The shelvesR2

Holds files. Doesn’t know what’s in them.

The bindingIceberg

Which Parquet files make this table, its schema, every version it has had.

The indexR2 Data Catalog

Which tables exist, and where their metadata lives.

The readerDuckDB

Checks the index, opens the book, reads.

That’s the 2016 split taken to its end: the storage layer has no opinion about what reads it.

Our question, today

One agent answers it end to end.
Two agents disagree, and nothing notices.

Agent A
  1. spins up a sandbox
  2. opens DuckDB, reads the catalog
  3. joins orders, latency events and tickets
  4. affected customer = opened a ticket
  5. returns a Marimo notebook: 412 customers
Agent B, same question
  1. spins up a sandbox
  2. opens DuckDB, reads the catalog
  3. joins orders, latency events and tickets
  4. affected customer = abandoned a cart
  5. returns a Marimo notebook: 1,980 customers
Readable

plain .py notebooks

Operable

no UI anywhere

Agnostic

open format, catalog, engine

OPENConsensus

no shared definitions, no versioned reads

Consensus: not guaranteed, and not yet tested.

Close · Next

Fill the dashed box, turn on the loop, and many agents work on one truth.

Consensus by design

Did Tuesday’s deploy slow checkout, and which customers noticed?

Can

Analysts run in parallel on the same committed data and definitions. A correction commits once, and every agent sees it.

Can’t

Replace the human call on what noticed means. That call is made once, then written into the semantic layer.

Many agents in parallel, one committed truth, and every correction written back once.

The task force on Tuesday’s deploy

Three analysts in parallel, one reviewer, one human call,
written back once and reused.

Agreement is a step in the loop, not a hope at the end
Lead agent

Frames the question, splits it three ways.

1
Analyst

Latency by endpoint around the deploy.

Analyst

Cart abandonment and ticket volume, same window.

Analyst

Affected accounts and their plan tier.

2
Reviewer agent

Same checkout latency? Same affected?

3 sent back: a different definition of affected 4
Human

Makes the one judgment call: what noticed means.

5
Semantic layer

The call, written once.

6
1the lead splits the question
2three notebooks go to review
3one is sent back
4the judgment call goes to a human
5written into the semantic layer
6every next question starts from it

Without the dashed box, this is three agents producing three numbers faster.

Next · Consensus by default

Every agent reads the same committed version,
so parallel work adds up to one answer.

Every read resolves to a committed version · every result names the version it used
Analyst 1latency by endpoint
Analyst 2abandonment, tickets
Analyst 3affected accounts
Data layerone committed history
v41 Tuesday’s data reads v41 1 v42 late tickets land reads v42 reads v42 2 commits the fix def v8 internal accounts excluded 3 × on def v7: rejected re-reads def v8 v43 affected-accounts table reads v43 reads v43
notebook · v43 · def v8
notebook · v43 · def v8
notebook · v43 · def v8
4
One answerv43 · def v8
Without the guarantee
1readers see half the batch
2the fix stays in one notebook
3the last writer wins
4three numbers for the reviewer to catch

A test tells you agents diverged. The data layer keeps them from diverging.

Source — I. Macomber, the last line of the post (2026)
Back to 2027

“…your CPO will learn about your team’s product launch through a subagent, deployed by an agent…”

The job of the post-AI data scientist is to make sure the meaning survives the edit.Ian Macomber · 2026
Three asks

Put agreement in the data layer,
and keep testing that it holds.

01 · every team

Write down what your data means

A page per team: what the tables mean, what the metrics mean, the known traps. It becomes the first version of our shared definitions.

Agents can only agree on what’s written down.
02 · the platform

Make every change a commit

Data, definitions and corrections land as one new version that every agent reads next. Every result records the version it used.

Parallel work adds up instead of drifting apart.
03 · every release

Keep the fan-out as the proof

The five metrics leadership reads weekly, asked through every interface we have. More than one number means a guarantee has a crack.

The proof, not the guarantee.

Agents shouldn’t have to negotiate the truth. They should be able to read it.

Appendix · Questions

Likely questions, short answers.

Why not a warehouse?

We’d get the 2016 boxes with a vendor’s opinion attached to both. Iceberg plus DuckDB gives the same separation with no lock-in: requirement three.

Why DuckDB, not Spark?

One engine per agent, no cluster to schedule, no shared failure. At our data sizes in-process is faster and simpler. If one table outgrows one container, that’s the day to revisit.

Why Marimo, not Jupyter?

Jupyter notebooks are JSON with hidden execution order. Marimo files are plain Python that run the same way every time, so agents can read them and people can review them.

Isn’t a semantic layer just docs?

Partly, and that’s the point: written-down definitions are the infrastructure. The other part is the evals that check agents against them.

Why not a reviewer agent?

A reviewer catches divergence after the work is done, and the work gets redone. The data layer stops it at the read and the write. Keep the reviewer for judgment calls.

When are we done?

When every read and write goes through committed versions and shared definitions, and the fan-out keeps returning one answer after we change something.

Appendix · How each era kept agreement

How each era kept everyone on the same numbers.

EraHow agreement was keptWhere it cracks
~2013

By bottleneck. The DBA ran every query, so there was one reading of the data.

Nobody else could ask. Questions waited in a queue.

~2016

By one person. A data scientist’s notebook held the definition and the analysis.

Nobody else could rerun it, and the next person defined it differently.

~2020

By scarcity. Metrics in dbt, dashboards in folders that matched the org chart.

Anyone who skipped the docs, person or tool, could diverge unnoticed.

2026

By testing. Ask every interface, count the answers, fix the context.

A test finds divergence after it happens, one question at a time.

Today

By working alone. One agent is consistent with itself.

A second agent reads its own version and its own definition.

Next

By construction. Every read resolves to a committed version and a shared definition.

Only the judgment calls, and those stay with a human.

Appendix · Where divergence gets in

Six cracks that parallel agents open, and what closes each.

CrackWithout a guaranteeWith the data layer
Stale read

An agent works from a copy it pulled an hour ago.

Every read resolves to the latest committed version.

Half-written table

A reader sees part of another agent’s write.

Commits are all or nothing. Readers never see a partial write.

Concurrent writes

The last writer silently wins, and one agent’s work vanishes.

A write built on an old version is rejected, then re-read and retried.

Forked definition

Each agent keeps its own “affected customer”.

One versioned definition. Changing it is a commit.

A fix that stays put

The correction lives in one notebook.

The correction commits once, and every agent’s next read uses it.

An orphan number

Nobody can say which data produced it.

Every result records the version and definition it used.