Your own AI enabled data stack, built in weeks. Owned by you.
Human engineers collaborating with AI build your modern data solutions together, side by side, from end to end. Not a black box service full of features you do not need: ordinary code, in your cloud, that any engineer can review and maintain. The data and AI transformation project that can take a year, without the year.
Most of a long engagement is weighted towards coordination over execution: discovery workshops, handoffs, status decks. Light on the real deliverables, heavy on the fluff. We start engineering the foundations from day one, so the feedback loops are fast and the iteration is rapid while discovery and refinement happen alongside.
THE TYPICAL PITCH 6 to 12 months
DiscoveryDesignBuildHandover
DYAD DATA weeks
ScopeBuildYours
Illustrative. Real timelines depend on scope; we fix it in writing before we start.
An engineer and an AI build it together, start to finish.
From the first profiling of your data and architecture to a pipeline running in production, serving reporting, dashboards, AI agents and the critical systems and processes that run your business. The AI brings speed. The engineer brings the real-world expertise to make the calls, and signs off on the solution. That engineer can be ours, your in-house team, or both, with a human in the loop at every decision that matters. You decide with them at the points that count: the plan, the review and the ship.
---
01
Intake and profile
Point us at your existing data and tools. Read-only, safe by construction. The AI profiles structure, types, volume and velocity, and surfaces the critical components and gaps. The engineer talks to your people and judges what matters. No values kept.
AI + engineer
02
Plan
A brief and a plan: what is new, what you already have, the open questions, and any extra instructions or context.
✋ you approve
03
Build
Data ingestion, integrations, data models, reporting, tests and documentation, written on one branch by the AI and the engineer, running locally first and kept in sync.
AI + engineer
04
Check and review
Automated gates and independent reviewers, each covering only their own area. The reviewers and the engineer read every line, and the engineer decides.
✋ you decide
05
Ship
Merged to your codebase under your rules and applied to your cloud only when approved, after passing through a separate end-to-end QA environment you own.
✋ you approve
06
Run
Scheduling, monitoring and alerting, with run order and freshness gates built in.
AI + alerts
Two parties, working as peers.
Neither is a tool for the other. Each does the part the other cannot do alone.
Engineer
Judgement, context and the final call
Gathers requirements and plans. Analyses the current state, talks to your people, and plans the future one.
Owns the architecture and every trade-off that comes with it.
Reads the code that ships, and is accountable for it.
Decides what is good enough, and what is not.
Signs off every merge.
AI pair
Speed, breadth and stamina
Profiles your whole estate. Structure, types, volume and velocity across every source, with gaps and critical components flagged.
Drafts the build at machine speed: scaffolding, models, tests and migrations.
Documents as it goes. Docs, lineage and decision records written with the code, never after.
Keeps watch. Run order, freshness gates and alerts, plus independent reviewers that each check one area.
Never merges its own work.
Together One branch, one codebase, one standard. We work code first, with industry-standard tooling that needs no special licence, specialised platform or other vendor, so any engineer and any AI can pick it up and carry on: ours, your in-house team, or a contractor you bring in later.
Every change lands as a pull request in your code repository, whether it is a pipeline, a report, a small app, or your own internal AI-agent-powered tool. The AI drafts at speed. An engineer has all the oversight: they pull the same branch, add, remove or change code in their own editor alongside the AI, catch what it got wrong and decide what merges. You can see who did what, line by line.
No black boxes.Every line of code, every report and every endpoint is visible. Not as a special feature, but as a standard design principle.
ltv never negative ✓one row per customer ✓docs regenerated ✓
E
Engineer pushed a fix from their editor
Lifetime value before refunds flatters the numbers. Net them out so finance and product see the same figure.
A
AI picked it up and built on it
Refunds netted out of ltv, with a test that it is never negative. Docs regenerated.
tests passing
docs generated
approved by an engineer
merged to your main
PR #19 · Run order for the daily refresh6 lines by AI · 2 by engineer
feature/daily-run-order
Adrafts
Epulls it, codes locally, pushes
Abuilds on it
merged by a person
A+pipeline: daily_refresh
A+steps:
A+ a: ingest orders
A+ b: build customer_ltv
A+ after: a
A+ c: refresh revenue_overview
A- after: a
E+ after: b
E+ gate: orders fresh within 26h
Run ordergenerated from the file above · sample pipeline
E
Engineer pushed a fix from their editor
The report would have refreshed from a half-built model. The order is a, then b, then c, and c waits for a fresh load, so nobody reads yesterday as today.
A
AI picked it up and built on it
Dependency fixed and the freshness gate added. The run order graph rebuilds from this file.
tests passing
docs generated
approved by an engineer
merged to your main
PR #23 · Analyst read access2 lines by AI · 2 by engineer
feature/analyst-access
Adrafts
Epulls it, codes locally, pushes
Abuilds on it
merged by a person
A+grant:
A+ role: analyst
A- privileges: [all]
E+ privileges: [select]
E+ schema: marts
Accessplan for review · nothing applied yet
rolerawstagingmarts
analystnonenoneSELECT
developerSELECTwritewrite
businessnonenoneSELECT
E
Engineer pushed a fix from their editor
ALL on an analyst role is how audits go badly. Read-only, marts only. The plan is reviewed by a person before anything is applied.
A
AI picked it up and built on it
Narrowed to SELECT on MARTS. Plan attached for your review before anything applies.
tests passing
docs generated
approved by an engineer
merged to your main
PR #27 · Revenue overview report7 lines by AI · 2 by engineer
feature/revenue-overview
Adrafts
Epulls it, codes locally, pushes
Abuilds on it
merged by a person
A+report: revenue_overview
A+measure:
A- revenue: sum(order_amount)
E+ net_revenue: sum(order_amount - refund_amount)
E+ description: Revenue after refunds, by order month
A+visual:
A+ type: bar
A+ x: order_month
A+ y: net_revenue
A+expose: [report, api, mcp]
Net revenue by monthgenerated from the file above · sample data
Same code, served three waysfrom net_revenue
Report
for the people who look
revenue_overview
API
the same measure, read-only
GET /v1/measures/net_revenue
MCP tool
for an AI assistant
net_revenue(by="order_month")
E
Engineer pushed a fix from their editor
Revenue before refunds is not the number finance uses. The definition lives here, in code, so the report, the data dictionary and any question asked of the data all agree.
A
AI picked it up and built on it
Measure and description updated. The report rebuilds from this file.
tests passing
docs generated
approved by an engineer
merged to your main
PR #31 · Let people ask about revenue4 lines by AI · 2 by engineer
feature/ask-revenue
Adrafts
Epulls it, codes locally, pushes
Abuilds on it
merged by a person
A+ask:
A+ measure: net_revenue
A+ slice_by: [region, order_month]
A- run_as: shared_account
E+ run_as: asking_user
E+ show: [definition, query]
A+expose: [chat, api, mcp]
Asksample conversation · governed measures only
Net revenue last quarter, by region?
North led last quarter at 1.42M net revenue, ahead of West (1.17M) and South (0.98M).
North1.42M
West1.17M
South0.98M
net_revenuelast quarterview query
Ask about revenue…↵
Same code, served three waysfrom ask: net_revenue
Chat
for the people who ask
Net revenue last quarter, by region?
API
governed answers for other tools
POST /v1/ask {"measure": "net_revenue"}
MCP tool
so an assistant asks the same way
ask(measure="net_revenue", by="region")
E
Engineer pushed a fix from their editor
A shared account would let everyone see every region. Run it as the person asking so their data permissions apply, and show the definition and query with every answer.
A
AI picked it up and built on it
Switched to the asking user and added the definition and query to every answer. Permission tests pass.
tests passing
docs generated
approved by an engineer
merged to your main
PR #34 · Discount planner app7 lines by AI · 2 by engineer
feature/discount-planner
Adrafts
Epulls it, codes locally, pushes
Abuilds on it
merged by a person
A+@app(title="Discount planner")
A+def planner(user):
A+ base = read("net_revenue", ["region", "net_revenue"])
Integrationgenerated from the file above · sample data
scenariosapproved →pricing_sync→ pushes new rowspricing system
3 approved · 3 new · idempotency key set · logged in lineage
Same code, sent three waysto approved scenarios
API call
to the system you already run
POST /v2/prices
Webhook
or an event for it to listen to
scenario.approved
MCP tool
or a tool an AI assistant can call
pricing.apply_discounts(run_id)
E
Engineer pushed a fix from their editor
Pushing everything again on a retry would apply a price change twice. Send only what is new, with an idempotency key, so a rerun is safe.
A
AI picked it up and built on it
Only new approvals are sent, with an idempotency key, and every sync is logged. A failed run can be retried safely.
tests passing
docs generated
approved by an engineer
merged to your main
+ Around the code
Everything around the code is visible.
The code, the access, the pipelines, the lineage and the documentation are visible and built in from day one. Around them sits the tooling that keeps your platform documented, explainable, reviewed and safe to change, and it travels with the repo.
04.1
Local development, built in
The whole platform runs on a laptop. Identity, warehouse, reports, source APIs and the AI provider are emulated with small local servers, so any engineer can clone the repo, run the stack and test it end to end with no accounts and no spend. A local model can stand in for the AI. Infrastructure changes are planned and reviewed by a person before anything touches your cloud.
$ stack up --local
identity emulated real signed tokens
warehouse local database
reports emulated
AI scripted or a local model
source API demo server
$ test --end-to-end
every seam exercised, no accounts, no spendcloud: planned, reviewed, then applied
04.2
Documentation that writes itself and stays true
Every column carries its description and where it came from. Write it once upstream and it flows downstream, wherever the lineage is exact. A person's wording always beats a machine's, and nothing is overwritten silently. Descriptions sync into your reports as a pull request.
Unique customer id, shared across all sales channels.
04.3
Full lineage and blast radius
Column-level lineage from source to report, in one graph. Before anything changes you can see exactly what it touches: which models, which reports, which people to warn. Tickets, plans and deployments join the same graph, so the reason for a change is one click from the change.
Different work gets different treatment, declared in one reviewed file. A documentation fix needs no model time. A new mart runs assess, plan, implement. An access request goes straight to a person. Routing is deterministic, every change passes the same automated gates, and the line stops for a human where a human belongs.
Point it at an API or at tables already in your warehouse. It probes and profiles the source automatically, read-only, with structure and types sampled and values never kept. It tells you what is new, what you already ingest and what is already modelled. Then the engineer and the AI build the integration together, pipeline, tests, documentation and run order, while you approve the plan and review the result.
$ probe /v2/orders read-only
14 fields sampled, types inferred
key candidate: order_id (unique in sample)
no values kept
brief
orders new
customers already modelled read by 2 reports
refunds already a sourceplan approved by engineerbuild AI drafts ingest · tests · docs · run orderreview pull request waiting for a person
04.6
Bring your own AI
Your provider, your account, your key. Route different jobs to different models, or run a local one. Every request is capped and counted against a budget, usage is logged without ever storing a prompt or a reply, and nothing is tied to a single vendor, so switching is a config change.
ai
provider your own account, or a local model
key a reference, never in code
route planning → strong model
summaries → small model
budget capped per request and per run
log usage counted, prompts never kept
04.7
An independent review agent, with separated concerns
Each pull request is reviewed by narrow reviewers that each own certain files, carry only their own rules, and are told what is out of scope. One checks data models, one checks infrastructure and security, one checks reports. Merging is decided by scanners, code owners and checks, never by a model's comment.
Security reviewerinfra/**least privilege, no secrets
Report reviewerbi/**measures documented, no credentials
merge is decided by scanners · code owners · checks
04.8
Guardrails you control
Who can do what, how much the AI can spend, what can leave the building, and which optional capabilities are on. Roles come from your identity provider, spend has limits and a kill switch, administrative changes are audited, outbound calls are restricted, and the AI works inside a boundary you can see.