Agents do not doubt
bad data
A human pauses when a number looks wrong; an agent often keeps going. The system has to supply that missing pause: reject untrusted data, declare what the agent may do, and recheck the rules immediately before execution.
Humans hesitate, agents keep going
An analyst who sees an implausible price may stop, inspect another source, ask a domain expert, or delay a decision until the discrepancy is resolved. An agent is more likely to accept the value as an input and continue through the workflow, propagating the error confidently at machine speed into calculations, recommendations, and actions.
A human hesitates at data that looks wrong; an agent acts on it anyway.
Source soundbite · Pramod Sadalage, a Thoughtworks Distinguished Engineer leading its Data Engineering and Architecture service for North America, and Prem Chandrasekaran, a Thoughtworks Market Tech DirectorSadalage and Chandrasekaran define agent-ready data through five attributes. Each is the flip side of a job humans used to do without thinking, now pushed into the data itself. Missing one does not produce graceful degradation: “Miss one, and the agent won't degrade gracefully the way a person would. It fails confidently.”
The attributes sit in an architecture of three dependent layers. The data foundation supplies validated, contract-governed inputs. The context layer gives those inputs business meaning through domain, semantic, and capability models. The access layer exposes retrieval, real-time queries, and controlled write-back. Observability crosses all three from the beginning.
Four engineering topics build those attributes: data contracts that set a hard quality gate, traceability and governance that answer why an agent acted, context models that fix what the business means, and access patterns that move from searchable to actionable. That order is deliberate, beginning with contracts, “because a single wrong fact poisons every layer built on top of it.”
Data contracts keep bad inputs out of the workflow
Humans have a smell test for bad data; agents do not. Simon Willison, who writes widely on the failure modes of LLM applications, captures the reason: language models are gullible. They believe what they are given and act on it, so a wrong value produces a confident, wrong answer rather than a moment of hesitation.
A human adds a judgment
A sales representative might pause because institutional memory makes the price look suspicious, then check another source or confirm when it was last updated.
The error cascades silently
The agent has neither institutional memory nor the instinct that something is off. Nothing triggers a warning; the stale value flows into quotes, inventory, or payment.
Yesterday a price moved from $49.99 to $59.99, but the agent's source has not refreshed. The agent retrieves $49.99, quotes it, the customer buys, and the company loses $10 on every unit sold. Every step in the workflow was technically correct. The input was wrong.
That gap is the organizational version of the pricing agent: confident and wrong. A separate KPMG Global AI Pulse survey of 2,145 leaders points the same way, with nearly half of executives saying AI's costs now exceed its benefits. The conclusion drawn is that most enterprises remain one stale field away from the scenario above.
The answer is a data contract: schema, quality rules, and a freshness SLA written as a versioned artifact that CI/CD enforces, where a freshness SLA defines how long a dataset or index may go without a successful refresh. Treating schema as law reverses a decade of thinking that schemaless data is inherently more flexible. Loose schemas may be inconvenient for human consumers; for agents, they are dangerous.
apiVersion: v3.1.0
kind: DataContract
id: product-pricing
name: Product Pricing
version: 1.0.0
status: active
schema:
- name: product_pricing
physicalType: table
properties:
- name: price
logicalType: number
physicalType: decimal
required: true
quality:
- type: sql
description: Every price must be greater than zero
query: SELECT min({property}) FROM {object}
mustBeGreaterThan: 0
- name: currency
logicalType: string
physicalType: varchar(3)
required: true
quality:
- type: sql
description: Currency must be a supported ISO code
query: SELECT count(*) FROM {object} WHERE {property} NOT IN ('USD', 'EUR', 'GBP')
mustBe: 0
- name: ingested_at
logicalType: timestamp
physicalType: timestamp
required: true
slaProperties:
# the rule that would have caught the stale-price scenario
- property: latency
value: 24
unit: h
element: product_pricing.ingested_atEnforcement operates along three dimensions. Schema enforcement makes types and constraints explicit and checks that the data respects them. Freshness SLAs set the maximum acceptable staleness per dataset, and nightly batches are insufficient when an agent answers in real time; the SLA has to be measured from the last successful load rather than the last time a value changed, so steady data is not mislabeled as stale and a stalled pipeline cannot appear healthy. Quality gates validate contracts in CI/CD and block deployments on failure.
That prevents the pricing scenario by design. A source that has not refreshed within 24 hours violates its contract before the agent can access it, so when it is asked for the price, the agent responds I don't have current pricing data instead of confidently quoting the wrong amount. That is a better failure mode, and it is produced by the data architecture rather than the model: A better model won't rescue you from bad data.
A medallion architecture, popularized by Databricks, gives each stage a place. Bronze holds raw, immutable ingestion for audit trails and lineage. Silver holds validated, deduplicated data, with schemas applied, contracts enforced, and quarantine handled. Gold is certified and is the tier the semantic model compiles against. For agentic architectures the authors add Adaptive Gold, where agents monitor their own query patterns, identify frequently accessed combinations, and materialize optimized datasets, effectively building warehouse views from real usage.
What Apple runs in production is catalog stewardship. At DataHub's CONTEXT 2025 summit, Apple described agents acting as digital stewards of its data catalog, continuously scanning metadata, flagging gaps, and proposing updates. Apple's agents curate the catalog; Adaptive Gold applies the same pattern to the datasets. That last step is an extrapolation, but a modest one from something already running.
The same rules extend to unstructured data. Most of what agents consume is documents, wikis, PDFs, and support tickets, chunked and embedded for retrieval. The stale-price scenario has a twin: a policy document changes, the vector index is not re-embedded, and the agent answers confidently from the old version. So an SLA of 24 hours has to mean that the re-indexing job completed within the last 24 hours; if it did not, the index is stale and quarantined even when no change is visible, because a silently failed indexer is precisely the case where there is no way to tell whether anything changed.
For text, contracts move from content to metadata: every chunk must carry a source, version, timestamp, and access scope, and that metadata is also what makes retrieval traceable and governable later. Quality gates get checks suited to text, rejecting empty or truncated chunks, catching near-duplicates that distort retrieval, flagging extraction failures and OCR garbage, and watching for embedding drift. The same principle applies to a price record and an embedded paragraph: The architecture has to smell what's bad before the agent does.
85% the agent proceeds; pricing may require 90%, while an internal FAQ may accept 70%. If pricing data is three days stale against a 24 hours SLA, that violation lowers the score regardless of the model's certainty, and the agent responds I'm not confident this price is current. Routing to a human for verification. Turning several signals into one dependable score remains an open design problem, so the authors advise a hard gate first: any contract or SLA breach requires a human, whatever the other signals say.The pieces are additive, and each can reduce risk independently.
Define freshness SLAs for every dataset an agent touches
The same dataset may need different requirements per consumer: nightly pricing may suit a dashboard but not an agent quoting customers in real time.
Put quarantine gates in front of agent-accessible storage
Begin with the highest-risk datasets, such as pricing, inventory, and customer records.
Start with the Data Contract CLI
It validates against ODCS and is recommended in Thoughtworks tech radar 33. Define contracts in YAML, validate automatically in CI/CD, and block failed deployments, giving data contracts the same rigor as API contracts.
Add confidence-threshold routing
Start high, around 90%, and adjust downward as trust is built and accuracy is tracked.
An audit trail has to answer why
In the authors' second constructed scenario, an agent processes a letter of credit, checks know-your-customer data, verifies the customer is not on a sanctions list, evaluates the credit terms, and approves a $2.4 million transaction in about 30 seconds. Six months later, a regulator asks why the transaction was approved.
Conventional audit logs can identify the tables queried, the time of each query, and the service account involved. They cannot show why the sanctions list was checked before the credit terms, why the agent accepted a minor documentation discrepancy, or which alternatives it rejected. Traditional audit logs can tell you what happened, but they can't tell you why. Agentic lineage closes that gap using the distributed-systems model: one trace per end-to-end workflow, one span per step.
verifiedclearwithin limits94% confidenceThat is what a regulator needs: not that a service accessed the compliance database at a particular timestamp, but that the agent checked KYC, then sanctions, then credit terms, and approved because all three passed. Engineers already know traces and spans from distributed-tracing tools such as Jaeger and Zipkin. For agentic workloads, Langfuse, Arize Phoenix, and OpenTelemetry for AI are named as the emerging options, and the article reports where each sits on the Thoughtworks Technology Radar, the firm's periodic adoption guidance: OpenTelemetry in Adopt, Langfuse in Trial, Arize Phoenix in Assess. These are the authors' reported rings, not recommendations from this site.
Together the articles create three architectural obligations: log events across the system's lifetime in enough detail to trace its operation rather than as isolated timestamps; retain those logs for at least six months, which means long-term observability storage; and be able to reconstruct why a decision occurred, since the law requires the logs and making them answer a regulator's question is on you. For a large company, even 3% of global turnover runs into the hundreds of millions.
The judgment on scope is restrained. The EU is furthest ahead and no other jurisdiction currently has an equivalent law, but a regulator, auditor, customer disputing a decision, or internal team debugging one may all ask the same question. A system you can't explain is one you can't fully trust, defend, or fix.
Autonomy is therefore staged rather than granted in full on day one, and each stage fixes both what the human does and what must be recorded.
| Stage | Agent | Human | Monitoring |
|---|---|---|---|
| Shadow Mode | Recommends actions | Reviews recommendation and executes if appropriate | All recommendations are logged to track accuracy over time |
| Supervised | Prepares action and waits for approval | Reviews action and approves or denies | All proposed actions and human decisions are logged |
| Autonomous with guardrails | Acts within defined boundaries, best drawn by reversibility rather than transaction size | Defines guardrails | All actions logged, alerts fired on exceptions |
| Full autonomy | Carries out all actions | Spot checks | Continuous, by other agents and humans |
Their analogy is a new hire: purchase requests first, then supervised spending, and eventually a corporate card with limits. Promotion depends on evidence rather than intuition, which means testing before each step rather than only watching production. Agents are hard to test because they are nondeterministic, costly to invoke, and act through tools with real side effects, so teams mock or replay tool and model interactions to make CI tests deterministic and score decisions with evals instead of calling live services on every run. Building that harness is a discipline of its own, and beyond the scope of this article.
Once an agent earns autonomy, three patterns bound what it holds. Delegated access has the agent act with the invoking user's permissions and record whom it represents, rather than through a shared service account that can see every customer, because when a regulator asks who accessed this customer's data, the service account tells you almost nothing. Just-in-time credentials issue a short-lived token per task, so checking a sanctions list gets OFAC API read access for one customer valid for five minutes. Least privilege means processing a letter of credit does not reach into HR or marketing data.
This is Simon Willison's name for the sharpest risk in agentic systems: an agent turns dangerous the moment it has all three: access to private data, exposure to untrusted content, and a way to communicate externally. A single poisoned document or web page can then hijack it through prompt injection and quietly exfiltrate whatever it can reach. Narrow identity, short-lived credentials, and least privilege shrink that reach and break the combination. Section 08 cuts at the same problem from another direction.
Autonomy is earned in stages, so nobody expects you to grant it all at once. Observability is not staged at all. It goes in at full strength on day one, whatever the autonomy level, because retrofitting it onto a running system is painful: What you build on top can stay deliberately conservative; the instrumentation underneath cannot. The four starting points are to instrument every workflow with traces and spans using a proven tool such as OpenTelemetry, begin in shadow mode so the audit trail exists before compliance needs it, implement delegated access with short expiry windows and no persistent tokens, and design for explanation, since a trail that answers why is what lets you widen autonomy later.The context layer answers three questions: what exists, how numbers are calculated, and what the agent may do
Ask an agent What was Q3 revenue for Product X? A human analyst knows which table to query, how products join to orders and revenue, whether revenue means gross or net, and how Q3 maps to the company's fiscal calendar. The agent knows none of it, not the valid joins and not that the fiscal calendar starts in February. Without that context it either invents an answer or gives up.
A semantic layer fills part of the gap by holding declarative definitions of metrics, declared once so every consumer derives consistent results. But an agent that acts needs more than definitions of numbers. It must also know what the things in the business are and what it may do to them. Those are three separate bodies of definition.
Domain model
Says what exists: the entities, their relationships, and the meaning rules of the business. An order belongs to a customer; an active customer purchased in the last ninety days.
It is consulted, never executed, and no query path to the data runs through it.
Semantic model
Says how the numbers are computed: one versioned formula per metric, compiled to the same SQL every time and run against the analytical store.
The job is to put correctness in the compiler rather than in the model's guess.
Capability model
Says what the agent may do: a curated set of operations against live systems, some that read (check payment status, retrieve a guide) and some that write (issue a refund).
Each carries permissions and an owner, and state-changing capabilities also carry preconditions and a reversibility class.
Nouns, numbers, and verbs. What unites them is not that they are all about meaning, because the capability model plainly is not. It is that each one is a place where a guarantee is declared once, in version control, instead of being worked out afresh by the model on every request: The definitions are the layer; the interface, MCP today, is just the door.
dbt is a transformation tool whose semantic layer declares metrics as code, and its semantic_models already declare entities. The remaining boundary question is why the domain model must stay separate. The authors' answer is that entities declared inside a metrics layer remain scoped to metrics, while the capability model has to be written in the same vocabulary as the semantic one or the two drift apart: A refund acts on the same customer the revenue figure counts. One vocabulary underneath, or you get two.
All three models are code in source control. They pass code review, are tested in CI, and progress through environments before production. When the definition of revenue or the rule on refunds changes, it changes in one place and propagates everywhere. Business logic sits in the definition itself, as in revenue = order_amount - discount_amount, rather than buried in a BI tool or an ad hoc SQL view.
semantic_models:
- name: orders
model: ref('orders')
defaults:
agg_time_dimension: order_date
entities:
- name: order_id
type: primary
- name: customer_id
type: foreign
dimensions:
- name: order_date
type: time
type_params:
time_granularity: day
measures:
- name: revenue
agg: sum
expr: order_amount - discount_amount
create_metric: truedbt is migrating from measures toward a metrics-first specification; the widely used form is the one shown here, and the point holds under either. Cube.js, Snowflake, and Databricks follow similar patterns, and the tool matters less than the discipline of moving business logic into version-controlled code. The same question then produces very different SQL. Without a semantic model the agent guesses a table name, selects the wrong revenue column, omits the fiscal-calendar mapping, and misses the join.
-- Before metric definition
SELECT SUM(amount)
FROM sales_data
WHERE product = 'Product X'
AND quarter = 'Q3'With one, the query is constrained to the correct table, the net-revenue formula from the definition, the right fiscal-calendar dates, and the valid join path.
-- Constrained by metric definition
SELECT SUM(order_amount - discount_amount)
FROM orders o
JOIN products p
ON o.product_id = p.id
WHERE p.name = 'Product X'
AND o.order_date
BETWEEN '2025-07-01'
AND '2025-09-30'The semantic model doesn't make the agent smarter. It stops it from guessing. For an agent that may act on the answer without an analyst checking it first, that constraint is what matters.
dbt's semantic model can dynamically surface only the dimensions that apply to the selected metrics, which prevents plausible sounding but incorrect queries. The lineage returned in step five is the foundation for the traceability covered in section 03, so context and traceability reinforce one another.
On where to start, the warning is against modelling the whole business before shipping anything. Value is concentrated in a handful of contested metrics, the ones that mean different things to different teams; let the first agent use case set the scope, because a narrow, correct context layer beats a sprawling, half-agreed one. The four points: find the conflicting metric definitions, revenue being the classic with its gross versus net and with or without returns; pick a mainstream tool but keep the emphasis on the discipline; route agents through the layer and never the raw schema, with dbt, Cube, and AtScale all shipping MCP servers though the point is the abstraction and not the protocol; and test adversarially, since every hallucination points to a missing definition. Fix the definition, not the prompt.
How domain models, knowledge graphs, and ontologies fit together
None of this vocabulary is settled, and the words trip people up. Classic semantic-layer products, from Business Objects to LookML and Cube, bundled entities and relationships in with the metrics, so plenty of people still use semantic layer for the whole thing. Sharper lines are drawn here because agents make the distinctions matter.
The parts are called models rather than layers for two reasons: each is a body of definitions rather than a tier of infrastructure, and that is what the tools call them. dbt declares semantic_models, and the vendor-neutral specification that came out of the Open Semantic Interchange initiative, now Apache Ossie, is a semantic model specification.
The domain model goes by other names. Store its entities and relationships as a graph and you have a knowledge graph. Domain-driven design calls it a domain model, and its Bounded Context is the reminder that no single model covers the whole enterprise. Chasing one canonical model is usually a mirage; each domain has its own, governed in the federated way Data Mesh describes.
The industry term is ontology, and it refers to the same artefact, with a longer pedigree than the current wave suggests: a formal, explicit specification of a shared conceptualization, with RDF, OWL, and SHACL as the formal machinery. Strictly, an ontology describes and does not act. Two shipping products stretch it further. Palantir's Foundry Ontology pairs its objects, properties, and links with the actions an agent may take on them, and Databricks' Genie Ontology puts a living graph of a company's concepts on top of its governed metric definitions. The one real difference between Palantir's shape and this one is that it bundles the actions in; here they stay separate because the write path carries different risk from the read path and benefits from being governed on its own terms.
One practical note: none of this is usually written from scratch. The strongest implementations bootstrap from what you already have, table structures, glossaries, and how people actually query, and let humans curate on top.
2026.The division of labour stays clear. The semantic model defines the metrics; the graph carries the connections between customers, products, events, and decisions over time. Together they give agents something close to institutional memory, the kind of knowledge that would take a new hire months to absorb.
Risk rises from retrieval to write-back
An employee reports a problem with a PO, or purchase order. An ideal agent would retrieve the relevant troubleshooting guide, check whether the PO payment service is currently unavailable, and create a help desk ticket if one is needed. Traditional RAG, the pattern most organizations have deployed, does only the first: it cannot query a live monitoring system, and it cannot create a ticket in ServiceNow or Jira.
The framing comes from Microsoft's Cloud Adoption Framework for AI, which formalizes it as RAG plus MCP-Read plus MCP-Write. Retrieval covers RAG, vector search, and document lookup, where most organizations live today. Real-Time Query lets an agent inspect live systems and read databases at the time of the request. Write-Back is the most capable and most dangerous tier, where the agent creates tickets, updates records, and triggers workflows. Each step up adds capability and risk, and agentic AI requires all three rather than retrieval alone.
The note on protocol is restrained: MCP has quickly become the default way to wire the tiers up, but the mechanism matters less than the demarcation. What counts is keeping retrieval, live reads, and write-back as separate, deliberately governed levels of access, whether they are exposed through MCP or native APIs. The MCP primitives sit on the same risk gradient. Resources are read-only and safe, Prompts shape behavior, and Tools change state, which is why the safe path exposes Resources first and graduates to Tools only under governance.
| Design | Surface | What the agent has to choose among |
|---|---|---|
| Wrap every REST endpoint one-to-one | 50 tools | Names like get_po_payment_status, create_ticket_po_payment, create_ticket_po_payment_network, barely distinguished and thin on context. LLMs are bad at that, and accuracy drops sharply as the tool count climbs |
| Design business capabilities | 5–10 | check_service_status takes a service name and location, one tool for all services and locations; create_support_ticket is parameterized with category, priority, and description, with descriptions detailed enough for the LLM to know when to reach for each |
The Thoughtworks Tech Radar put naive API-to-MCP conversion on HOLD for exactly this reason. The principle is to design capabilities, not endpoints, and the authors claim that Five to ten well described business capabilities will outperform 50 thin API wrappers almost every time, presenting it as a design principle. It is also protocol-agnostic: whether an agent reaches your data through MCP, another agent, or whatever standard comes next, the properties that make it agent-ready are the same, rich descriptions, parameterized access, clear schemas.
With all three tiers in place the PO workflow runs end to end in one pass. Done manually, the employee would wait in a queue, explain the issue, have a support agent check the monitoring dashboard, and get a ticket created. The four starting points: map what your top three use cases need, retrieval, real-time query, or write-back, since most gaps live in the latter two; group existing APIs into 5–10 well-described business capabilities; start with MCP Resources, the lowest-risk entry point; and instrument from day one, logging every tool invocation, who triggered it, what was called, when, and critically on whose behalf.
Recheck permissions and conditions immediately before execution
In the authors' capability model, every capability declares the permissions required to invoke it and the owner accountable for its behavior. State-changing capabilities also declare the conditions that must be true before execution and the reversibility class of the action.
Preconditions are checked deterministically against live state at the moment of action. Facts read earlier while the agent formed its plan cannot be carried forward as authorization assumptions, because state may change between planning and execution. The agent may propose an action, but its plan never becomes authority by itself.
Reversibility provides a separate classification of operational risk, and the amount involved does not determine the class.
Internal ledger correction
The amount is larger, but there is a clear inverse operation, so it may be more suitable for autonomous execution inside guardrails.
External payment
The amount is smaller, yet the action is unrecoverable once the money leaves. An irreversible action keeps human approval whatever stage the agent has reached.
Reversibility predicts safe autonomy better than the size of the transaction.
Source soundbite · where the staged autonomy ladder keys guardrails to transaction size, the authors prefer keying them to reversibilityEvery capability already declares permissions and an owner; preconditions and reversibility add two more execution boundaries. The authors argue that reversibility is a better guide to safe autonomy than transaction size. A platform team may derive a precondition from a refund policy, contract, or compliance manual, but the model does not read that natural-language document at execution time and decide whether it grants permission. Natural-language interpretation can inform a recommendation; it cannot authorize a state-changing action.
Retrieved text may shape a recommendation, but it cannot grant permission
In the authors' design, operational rules from policies, contracts, and manuals are extracted ahead of time, reviewed by a human, and stored as declared preconditions, each with a provenance link back to the passage it came from. At execution time, only those structured rules can open the gate.
An agent may still retrieve a customer complaint, inspect contract language, or read a policy passage. That material can shape a recommendation, explain why a case appears eligible, identify missing information, and serve as evidence for a human approver. Only the structured rule, evaluated deterministically against current state, can open the execution gate.
This is described as a specific security property, and as a stronger claim than merely shrinking what a hijacked agent can reach. A poisoned document may still distort a recommendation or mislead a human approver, so this is not complete protection against prompt injection. What the boundary removes is the path where the document authorises the action directly, with nobody in between.
The provenance link is what keeps the declarations honest as the documents move underneath them, and the source is careful about what it buys. Detecting that a document changed is easy; knowing that the change invalidated a precondition derived from it is a judgement, not a diff. What the link buys is a review queue, in the same spirit as keying a freshness SLA to when the index was last rebuilt rather than to when the content last appeared to change.
Where no declaration covers the situation, the agent does not improvise from its own reading of policy. It escalates. This is the hard gate from section 02 in a different setting: an undeclared case degrades the agent to supervised, not to autonomous.
Trust the data, add context, then open write access
Contracts that make data trusted, a context layer that makes it meaningful and actionable, access patterns that let agents act on it, and observability that makes those actions auditable may look like four independently staffable work streams. Sadalage and Chandrasekaran arrange them as one dependency-ordered stack instead: they build on one another, and the order matters.
The dependencies run bottom-up. Meaning cannot be attached to data that cannot be trusted, so context sits on the foundation, and agents cannot act safely without that meaning to constrain them, so access sits on context. Skipping either leaves everything above it without footing. That's exactly why so many agentic AI programs stall. They jump straight to agent access without building the foundation underneath.
Observability is different. Rather than a fourth tier stacked on top, it runs alongside all three, and every layer has to be traceable and auditable from the moment it handles real work. The trust checks, the semantic queries, the agent's actions, all of it has to be explainable in production, not at whatever later point it gets instrumented. Retrofitting observability onto a running system is much harder than building it in from the start, so it belongs in every layer from day one.
The stack has one more dependency the diagram cannot draw. Every layer produces an artifact that has to be kept accurate, and Artifacts don't maintain themselves.
The technology is necessary, but it's the operating model that keeps it honest. The discipline that makes it work is treating data as a product: each dataset, contract, and metric has a named owner, a published contract and SLA, and a versioned lifecycle, the same way an API does. You will not always know every consumer, and for public or broadly shared data you cannot, which is precisely why the contract matters, since it is the stable promise unknown consumers build on, and a deprecation policy is how you change it without breaking them.
Ownership becomes concrete under pressure. When the product_pricing contract blocks a deployment at 2 a.m., someone is accountable for it. When finance and sales disagree on revenue, someone owns the decision. When a new agent asks for access, someone owns the scope and reviews it. These aren't infrastructure questions; they're ownership questions, and no tool answers them for you. A human consumer of an unowned, drifting dataset notices and works around it; an agent consumes it at machine speed and scale and propagates the error just as fast.
Before deciding what to build, the authors suggest locating the organization first. The table scores each attribute against signals drawn from the topics above.
| Attribute | Human-era | In Transition | Agent-ready |
|---|---|---|---|
| Trusted | Loose schemas, no freshness SLAs; quality rests on an analyst noticing when a number looks off | Contracts on a few critical datasets; quality checked but not enforced in CI/CD | Contracts enforced as code, freshness SLAs per consumer, quarantine before agent storage, agents read Gold only, tables and embeddings alike |
| Contextual | Metric definitions live in BI tools, SQL, and people's heads; humans supply the context | Some metrics defined as code, but definitions still conflict and agents may still hit the raw schema | A context layer in Git: entities and relationships in a domain model, one semantic definition per metric, and a curated set of capabilities; agents route through it, never the raw schema |
| Traceable | Logs show what a person queried and when; the why lives in the analyst's head | Traces on some agent workflows; reasoning captured inconsistently | Every agent workflow emits traces with spans, reasoning, and sources; any decision's why is reconstructable |
| Governed | People access data through their own roles; systems share broad service accounts | Agents run on scoped but long-lived, coarse credentials | Delegated per-user access, just-in-time credentials, least privilege; lethal-trifecta paths closed |
| Operational | No agent acts on the data; people read dashboards and take actions by hand | Agents retrieve via RAG; real-time reads emerging; write-back experimental or ungoverned | All three tiers via well-designed capabilities; write-back gated by staged autonomy and instrumentation |
Don't average the rows, because the stack is dependency ordered, your readiness is capped by your weakest foundational layer, a flawless context layer sitting on untrusted data is still not agent ready. The weakest row identifies where the next investment goes.Each topic came with its own starting points, which are tactical checklists for the work itself. The four below are where to start. Instrumentation comes first because it is not a build-order step; it runs alongside everything else and never stops. The other three build from the bottom of the stack up, and the authors identify the context layer as the highest-leverage single move, since context moves accuracy further than a bigger model does, but only once the data beneath it can be trusted.
Instrument from day one
This is less a step in the sequence than a constant running beneath all of them. Put traces and spans into every workflow from the start, because observability is far harder to retrofit than to build in, and you will want audit trails that answer “why” for debugging today and regulators tomorrow.
Contract everything
Freshness SLAs, strict schema enforcement, quarantine for bad data. This is the floor the rest stands on: agents can't smell bad data, so the data architecture has to smell it for them.
Context over models
In AtScale's own published text-to-SQL benchmark, accuracy rose from under 20% on the raw schema to over 92.5% with a semantic layer, on the same model. AtScale is also one of the semantic layer vendors the authors list earlier, alongside dbt and Cube.
Read before write
Start with read-only MCP Resources and graduate to write-capable Tools only with governance in place. Autonomy is earned in stages: shadow mode, then supervised, then autonomous with guardrails.
When agents become the primary consumers of your data, your data architecture becomes your AI architecture.
Pramod Sadalage · Prem Chandrasekaran · they go deeper on this in their forthcoming O'Reilly book, Data Architecture for Software Architects