Article: AI Changes the Data Interface, Not the Query Engine A disaster-recovery analysis prototype that stored thirty-second service metrics as Parquet in S3-compatible object storage and used DuckDB for deterministic aggregation worked without a shared lakehouse, but only because the query engine became an embedded component inside the AI agent workflow rather than disappearing. The architecture separates deterministic computation from probabilistic reasoning: engines filter, aggregate and join while agents interpret evidence and communicate conclusions, with agent-generated SQL validated against an allowlist of datasets and operations and executed in a sandboxed runtime. An embedded engine such as DuckDB suffices when data volume is moderate, the primary consumer is the agent workflow and writes are controlled, while a managed lakehouse is justified by multiple independent consumers, joins with large shared datasets, concurrent writes or organization-wide governance. Key Takeaways - An AI agent that reads Parquet still depends on an execution engine; AI changes the analytical interface and interpretation layer, not the need for precise computation. - Separate deterministic computation from probabilistic reasoning. Engines should filter, aggregate, and join, while agents should interpret evidence and communicate conclusions. - An embedded engine such as DuckDB can be sufficient when the data volume is moderate, the primary consumer is the agent workflow, and writes are controlled. - A managed lakehouse becomes valuable when data has multiple independent consumers, must join with large shared datasets, requires concurrent writes, or needs organization-wide governance. - Production-grade agent analytics should retain the source data, configuration, derived facts, and model outputs so that every report can be validated and replayed. AI agents can now generate analytical code, read files from object storage, and turn operational data into structured reports. Does that make data lakes, lakehouses, and SQL engines obsolete? We encountered this question while automating the analysis of a large disaster-recovery exercise. Our first working design stored thirty-second service metrics as Parquet in S3-compatible object storage, used DuckDB for deterministic aggregation, and asked an AI agent to classify failover outcomes and explain the evidence. The prototype worked without a shared lakehouse, but not because the query engine disappeared. Instead, the engine became an embedded component inside the agent workflow. This article explains the architecture, introduces a practical separation between deterministic computation and probabilistic reasoning, and presents four signals for deciding when an embedded engine is sufficient and when a managed lakehouse is justified. The Question That Appeared After the Prototype Worked The question did not come from a whiteboard exercise. It appeared after a real workflow successfully produced its first report. We were analyzing a disaster-recovery DR islanding exercise. During the exercise, one region was intentionally isolated, and traffic was expected to fail over to surviving regions. For every service, we needed to answer three questions: - Did the surviving region absorb the traffic that left the isolated region? - After absorbing the traffic, did the service remain available? - Did latency remain within an acceptable range, or did the additional load create sustained degradation? We exported service metrics at thirty-second resolution, wrote them as Parquet files to S3-compatible object storage, and let an AI agent generate a structured analysis report. Once the workflow ran end to end, an attractive idea emerged: If the agent can read files from object storage and produce the answer, why do we need tables, a catalog, a lakehouse, or SQL at all? The question sounds reasonable because the user-facing experience has changed. Instead of opening a dashboard or writing a query, an engineer asks the agent to analyze the exercise. The agent identifies the relevant data, generates DuckDB SQL or Python as needed, executes the analysis through deterministic tools, and explains what happened. For example, to verify whether traffic shifted from Region A to Region B during failover, the agent may generate a read-only DuckDB query over a predefined set of tables and time ranges. Before execution, the query is validated against an allowlist of accessible datasets and operations, then executed in a sandboxed analysis runtime. The runtime returns structured query results, which deterministic application code normalizes into a fact packet containing fields such as traffic volume by region, timestamps, and percentage changes. A simplified implementation looks like this query: generated sql = """ SELECT region, SUM request count AS requests FROM traffic metrics WHERE ts BETWEEN :start time AND :end time GROUP BY region """ validate sql generated sql, allowed tables={"traffic metrics"}, allowed operations={"SELECT"}, rows = sandbox.execute generated sql, params={ "start time": exercise start, "end time": exercise end, }, fact packet = { "metric": "request count", "window": exercise start, exercise end , "by region": { row "region" : row "requests" for row in rows }, } In this simplified example, the agent generates only the analytical query. A deterministic validation layer rejects access to non-allowlisted tables or non-read-only operations before execution. The query then runs in a sandboxed runtime and the returned rows are converted by application code into a structured fact packet. The model receives this packet for example, request counts for Regions A and B rather than inventing or directly estimating those values. Why DR Analysis Is More Than Scanning Metrics The difficult part of DR analysis is not retrieving a time series. It is deciding what the time series means. Suppose Region A is isolated and Region B remains active. A healthy failover should produce a recognizable sequence: - QPS decreases in Region A. - QPS increases in Region B by a corresponding amount. - The success rate in Region B remains above the service objective. - Tail latency may rise briefly, but it should not remain elevated. Each statement requires context. A QPS increase is not automatically a successful failover. It may be too small to account for the traffic lost in the isolated region. A lower success rate is not automatically a DR failure if the metric includes expected business rejections. A latency spike at the cutover boundary may be harmless if the system quickly returns to a steady state. We therefore used two baselines and a steady-state window: - Historical baseline. the same time window on the previous day, which captures normal time-of-day behavior. - Immediate baseline, the hour before the exercise, which captures the most recent service state. - Steady-state window, a post-cutover interval that excludes the short transition period and focuses on sustained behavior. The analysis collected four core signal families: - qps - err qps - success rate - latency pNN, including tail latency such as p99 For each service, deterministic code calculated facts such as traffic absorption ratio, SLO violations, latency change, and the duration of sustained degradation. The agent then interpreted those facts in the context of the service, the exercise configuration, and the available evidence. This distinction is fundamental. The hard part is often the judgment, but the judgment is only trustworthy when the facts underneath it are deterministic. Architecture: Object Storage, an Embedded Engine, and an Agent The workflow used three logical layers: data preparation, deterministic computation, and agent-driven interpretation, with reproducibility treated as a cross-cutting requirement. The data-preparation layer used reusable DuckDB build logic, which was generated once and then reused, to transform raw metrics into self-describing assets in object storage. For each analysis request, the agent selected the relevant inputs, generated constrained SQL or Python, and orchestrated deterministic execution in DuckDB/Python. The resulting structured fact packets were then interpreted by the agent to produce the final report. Throughout the workflow, the input data, configuration, reusable build logic, deterministic facts, and agent execution metadata were retained so that the analysis could later be reconstructed, replayed, and evaluated. Figure 1. The AI agent initiates and orchestrates the analysis, deterministic tools compute the facts, and the agent interprets the resulting fact packet. Source: Authors’ own illustration, created with assistance from ChatGPT. Storage and Self-Description The physical data lived in S3-compatible object storage. Each exercise had a self-describing directory: s3://