Before we startAs part of a four-month AI product management mentorship through the Toronto Product Management Association (TPMA), I took an agentic AI product from value hypothesis to a working, evaluated and monitored MVP. Building it myself served two purposes: understanding first-hand what it really takes to put an AI agent in front of customers in a regulated industry, and being able to put a working system, not a slide, in front of stakeholders.

Concept

A personal test project modeled on One Zero Bank’s Ella.AI: a Claude data-connector AI financial advisor for a fictional bank, MyBank, serving individuals optimizing their personal bank accounts. A customer links their account through an account-aggregation connector pattern (validated against Plaid Sandbox). The advisor then answers questions about spending and savings, grounded in the customer’s linked account data, with deterministic calculations, compliance guardrails and full observability.

Why this project?

It demonstrates the full “agentic AI in a regulated domain” skill set in one build: a data connector (a custom MCP server), multi-agent orchestration, deterministic (non-hallucinated) calculation, compliance-style grounding (data governance, privacy, security) and guardrails, evals, and monitoring.

My role

I owned product discovery, scope, requirements, acceptance criteria and validation. The code was produced through AI-assisted development with Claude, and I verified every output against answers computed independently in advance. Where my own assumptions turned out wrong, this article says so.

PM or Builder? Why build it myself?

Builder skills give a PM two distinct advantages.

  1. Understanding the system from the inside. A PM working on AI products has to understand the considerations that drive the system well enough to discuss them credibly with developers, system architects and stakeholders:
    • why a model shouldn’t do the arithmetic
    • what a guardrail can and can’t catch
    • why eval data has to stay fixed
    • where cost and latency actually come from
    • what “data minimization” means in a real tool call
    Building the MVP end to end was the fastest way to learn those trade-offs. It means I can ask the right questions, challenge estimates and make informed scope decisions, rather than taking architecture on trust.
  2. Showing, not telling. A functional MVP that stakeholders can actually use changes the development process:
    • It aligns everyone around something concrete instead of competing interpretations of a spec.
    • It surfaces requirements, edge cases and risks early, while they’re still cheap to change.
    • It gives developers a working reference to challenge and improve, not a document to decode.
    The code will be refactored and the UX redesigned, and that’s expected. The value is the shared understanding a working system creates, which no deck or mockup matches.

Skills demonstrated

  • Product management: product discovery, market and competitive analysis, problem and value hypotheses, MVP scoping and prioritization, acceptance criteria, trade-off decisions, phased delivery
  • Agentic AI: multi-agent orchestration (router, specialist, compliance verifier), tool use via Model Context Protocol (MCP), prompt engineering, deterministic tools for hallucination mitigation
  • AI quality: LLM evaluation (evals), golden datasets, automated regression testing, human-in-the-loop review, error analysis
  • AI operations (LLMOps): observability and tracing, cost and latency monitoring, product metrics, alerting
  • Trust & compliance: data governance, privacy by design, security, consent and data-minimization design, guardrails for regulated advice (OSFI E-23 and PIPEDA context)
  • Stack: Claude (Haiku 4.5), n8n, MCP (FastMCP), Plaid Sandbox, LangSmith, Python, Docker
What’s covered in this post
  1. The value hypothesis — the product statement and six hypotheses, for customers and for the bank
  2. Scope — what I built, what I faked, and what I cut
  3. Architecture — connect & consent, how a question flows, the data sources, the MCP connector, and determinism by design
  4. The product process — phases, key decisions, the week I was wrong
  5. Evals & monitoring — how I know it works, running it like a product, results at a glance
  6. Security & privacy — what’s designed in, and what building it revealed
  7. Limitations — the known gaps
  8. Key takeaways — three lessons for PMs building AI products
◆

The Value Hypothesis

🎯 Product statementFor MyBank customers who want AI guidance on their finances who won’t hand a fintech aggregator standing access to their full financial picture, MyBank AI Advisor is a bank-authorized AI connector that lets them bring their own AI to their real account data, scoped and revocable by design, with every real decision still routed back through the bank. Unlike third-party aggregators or generic AI chat, it keeps data access, compliance and the customer relationship anchored to the bank. In one line: “Bring your own AI to your whole financial picture, on terms you and your bank both control.”

Before building anything, I wrote one value hypothesis per problem: who benefits, how the product would deliver it, and a pass/fail test the MVP could actually run. Three are about the customer and three about the bank. The last column is what a live product would track. Four synthetic customers can’t measure those outcomes, so they show business-outcome thinking, not demonstrated results.

# For whom Value hypothesis How the product delivers it MVP pass/fail test If live, we’d track
PH1 Privacy-conscious customer They’ll connect and ask sensitive questions if access is scoped and per-question, not a standing full-account grant to a third party Narrowly scoped MCP tools per question (designed; only partly delivered, not enforced); optional incognito mode on a paid AI plan Each tool call requests only the data the question needs Activation, regular usage, N-month retention, stickiness
PH2 Customer with finances across domains One advisor, authorized once, beats juggling separate spending, credit, investing and mortgage apps Router classifies each question by domain under one shared authorization Router hands off correctly across domains in one conversation % of customers asking across ≥ 2 domains per quarter
PH3 The bank: compliance Compliance exposure (OSFI E-23, PIPEDA) is manageable if the AI stays informational and never replaces customer judgment An independent Guardrail agent reviews every answer before the customer sees it Blocks every advice-overreach case without over-blocking factual answers Zero missed advice-overreach incidents; escalation rate within an expected band
PH4 The bank: relationship Advice can happen anywhere; keeping the transaction in the bank’s own app stops advisory moments (and revenue) leaking to competitors Read/action boundary; any in-context product mention sits under an anti-steering guardrail Agent never implies it can act, and never hides a better option Competitor-account openings vs. a matched cohort; upsell (Ella reports +15%)
PH5 Everyday customer Clear answers on spending and saving without manual math, spreadsheets or an appointment (parity, not differentiation) Deterministic calculation tools; the model narrates, never computes Calculated answers match pre-computed golden values exactly New regular savers vs. a matched cohort
PH6 The bank: cost to serve Human-level personalization at software cost, the gap between scripted bots and human advisors Agents grounded in each customer’s own data, running as software rather than headcount Answers are grounded in each persona’s own data, not generic scripts Cost per resolved interaction; % resolved without a human (Ella reports 80–85%)

Value stack: PH5 is the floor (table stakes), PH2 is convenience, PH1 is the real customer-side differentiation, PH3 and PH4 are the institutional case, and PH6 is the cost-to-serve case. How they fared in the MVP: PH3, PH5 and PH6 passed their mechanism tests; PH2 and PH4 are partly tested (three domains are referrals by design, and there’s no MyBank product yet to test steering); PH1’s per-question data access is designed but not enforced (see Security & Privacy).

◆

Scope — What I Built, Faked and Cut

Built (real, working) Mocked (on purpose) Cut (decided, not forgotten)
Router agent that sorts every question into one of 5 categories Connect & Consent screen: how a customer would authorize access Credit, Investment and Mortgage specialist agents → replaced by referrals to human teams
Cashflow/Savings specialist agent with 8 data tools Bank data: 4 fictional customers, 23 months of transactions, built on Plaid’s sandbox format Financial-education knowledge base (RAG)
Compliance guardrail that approves or blocks every answer Customer login: one “persona token” field swaps who is asking Langfuse (swapped for LangSmith after testing; see Evals & Monitoring)
Custom MCP data connector + 6 tested calculation modules — —
Regression tests, human review, dashboards, alerts — —

The biggest scope call: one domain done properly beats four done shallowly. Credit, investment and mortgage questions are real, but each is regulated in its own way. Doing one domain end to end, with evals and monitoring, taught me more than four half-built agents would have.

◆

Architecture

Connect & Consent (the entry point, mocked)

Before any question is asked, the customer authorizes access on a MyBank-branded consent screen. It shows the value hypothesis above in action:

  • Data control: scope checkboxes say exactly which data the AI may read (balances, transactions), each marked read-only.
  • Security control: access is issued by the bank as a limited, revocable token, never the customer’s password, and can be revoked at any time in the bank’s settings.
  • Privacy control: an optional incognito mode on the customer’s AI plan keeps the conversation out of model training.
The mocked MyBank Connect & Consent screen: three pillars (data, privacy, security), read-only scopes, and the AI client requesting access
The mocked MyBank Connect & Consent screen: three pillars (data, privacy, security), read-only scopes, and the AI client requesting access

It’s a mockup: nothing is really authorized, and the scopes aren’t yet wired to the tools (see Security & Privacy). What matters is the pattern: access issued and revocable by the bank itself, not by an aggregator the bank doesn’t control.

How a question flows

Core workflow: customer asks a question → Router → specialist + MCP tools, or a fixed referral → Guardrail → answer or safe fallback
Core workflow: customer asks a question → Router → specialist + MCP tools, or a fixed referral → Guardrail → answer or safe fallback

The same three paths with real output: what the customer sees, the route n8n took, and the execution log that confirms the verdict.

Three paths a question can take: answered (Guardrail PASS), referred (fixed mortgage referral, 291 tokens), blocked (Guardrail BLOCK, safe fallback)
Three paths a question can take: answered (Guardrail PASS), referred (fixed mortgage referral, 291 tokens), blocked (Guardrail BLOCK, safe fallback)

Full system architecture, as built:

MyBank AI Advisor, System Architecture
MyBank AI Advisor, System Architecture

When a customer asks a question:

1
The Router reads itand picks one category: cashflow/savings, credit, investment, mortgage, or out of scope. It doesn’t answer anything.
2
Credit, investment, mortgage and out-of-scope questions get a fixed referralto the right human team. No AI-generated advice in regulated areas.
3
Cashflow/savings questions go to the specialist,which calls tools through the MCP connector to fetch the customer’s data. The specialist never does the math: tested code calculates, the model explains.
4
The Guardrail reads the question and the draft answerand replies with exactly one word: PASS or BLOCK.
5
PASS: the customer gets the answer. BLOCK: they get a safe fallbackpointing to support.

Every step is traced (tokens, time, cost, tool calls), so any answer can be audited after the fact.

Data sources

The advisor reads a fixed, synthetic test dataset stored as files on my machine. It was built from Plaid Sandbox and then extended. Four test customers (personas), 23 months of history (Sep 2024 – Jul 2026), all amounts in CAD:

Persona Profile Snapshot Transactions
P1 Young professional $2,700 checking; credit card $2,200 of a $5,000 limit 277
P2 Joint account Two holders, shared spending 253
P3 Good credit $8,500 checking + a savings account 231
P4 Poor credit $350 checking; card $4,750 of $5,000 (95% used), recent fees 207

How the test data was built

  1. Defined in Plaid Sandbox. Each persona’s accounts and transactions were loaded into Plaid Sandbox as custom test users.
  2. Extended past Plaid’s limit. Plaid Sandbox returns only about 90 days of history. So I kept Plaid’s output (its data format and its real merchant categorization) and extended it to 23 months.
  3. Seeded with patterns to detect. I added seasonal swings in spending, recurring monthly charges, a duplicate charge and bank fees, so every in-scope question has something real to find.
  4. Stored as files. The transactions are Plaid-shaped JSON files, one per persona. The expected answers for every persona and month sit in a spreadsheet (golden_numbers.xlsx).

Where Plaid stays in the loop. The project still demonstrates working with an external data source:

  • The full connection was proven end to end: token create → exchange → accounts → transactions.
  • The categories in the data are Plaid’s own.
  • Each persona keeps its Plaid sandbox access token as its customer ID.

All of this happens at build time. While answering a customer, there is no Plaid call: the categories are stored with the data, and tokens are matched locally. A production version would call the aggregator or the bank’s own systems live. Why fixed data and not random. Two reasons:

  • Scope. With fixed data, every expected answer (the “golden” values the tests check against) is calculated once, in advance. With random data, the expected answers would have to be calculated on the fly for every test run. That’s feasible, but it adds complexity this test project didn’t need.
  • Reproducibility. The same question must give the same expected answer on every run, or a failed test tells you nothing.
Data sources: Plaid Sandbox (build time) → test-data pipeline → persona files read at runtime
Data sources: Plaid Sandbox (build time) → test-data pipeline → persona files read at runtime

The connector: 8 MCP tools

The specialist reaches the customer’s data through a small custom MCP (Model Context Protocol) server: AI-written in Python, reviewed and tested by me. n8n’s agent calls it like any other tool, and each tool answers a family of customer questions:

get_accounts
“What’s my balance?” “How close am I to my card limit?”
get_transactions
“When was that fee charged?”
get_savings_rate
“What was my savings rate in July?” “Could I save more?”
get_category_breakdown
“How much did I spend on groceries?”
get_essential_discretionary_breakdown
“How much of my spending is essential?”
get_top_discretionary_categories
“How can I cut my costs?”
get_recurring_charges
“What am I paying for every month?”
get_potential_duplicate_charges
“Was I charged twice for anything?”

Behind the tools sit 6 calculation modules, checked by 4,000+ automated tests against the golden numbers with 0 mismatches. The model narrates the result; it never adds up transactions itself.

💡 Deciding what “correct” means is product workI didn’t write the test code, but I defined what it tests: which number is right, for which customer, for which month, and why. Live-testing the in-scope questions myself is also how I found the one question with no tool behind it (“Was I charged twice?”). That gap became the eighth tool. A code review wouldn’t have found it.

Determinism by design

In banking, the same question must always produce the same numbers. So I split the system into a deterministic core and a probabilistic layer, and tested the boundary between them.

Decision Consideration How it shows in the architecture
Fixed test data Evals need stable expected answers; keep scope small Static persona files; no live Plaid dependency at runtime
Code does the math, not the model Language models make arithmetic errors; a wrong number from a bank is worse than no answer 6 tested Python calculation modules behind 8 MCP tools; the model only narrates (one flagged exception: card utilization %)
Expected answers calculated twice The test’s “correct answer” must itself be trustworthy Spreadsheet formulas plus an independent script: 4,000+ checks, 0 mismatches
Fixed referrals for regulated topics No AI-generated advice on credit, investment or mortgage Router picks a category; a rule-based Switch node routes it; the referral text is fixed, not generated
One-word compliance verdict Free-text judgments can’t be routed reliably Guardrail must answer exactly PASS or BLOCK; an exact-match Switch routes it; anything else goes to the safe fallback
Rule-based test scoring An AI grader would add its own variability Regression tests check numbers, phrases, route and verdict by rule; no AI judge

What stays probabilistic, on purpose: the Router’s classification, the specialist’s choice of tool, its wording, and the Guardrail’s judgment. These are where the evals found real issues: the Router sending an in-scope investing question to a referral, and the Guardrail over-blocking a factual balance answer. They’re managed with regression tests and human review, not eliminated.

◆

The Product Process

I ran it as a phased build, with one rule borrowed from real product work: decide what “done” looks like before building it.

Phase What I did Key output
0 · Setup Accounts, self-hosted n8n in Docker, Plaid sandbox, API key with a spend limit A working sandbox for ~$10–15 of credits
0.5 · Product framing Market research, competitive alternatives map, problem & value hypotheses 6 hypotheses, product statement
1 · Data layer Custom sandbox data; found Plaid’s 90-day history cap; generated 23 months of test data instead; built the MCP connector 4 personas, golden numbers spreadsheet, connector
2 · Learn evals Studied eval practice before designing any (binary pass/fail, error analysis, offline vs. online checks) Evals & metrics framework
2.5–2.75 · Use cases & calculations In/out-of-scope questions; calculation modules tested against pre-computed answers 6 modules, 4,000+ checks, 0 mismatches
3 · First end-to-end path Consent mockup + specialist agent answering real questions First correct live answer (38.4% savings rate)
4 · Router + Guardrail Routing, referrals, compliance review of every answer PASS and BLOCK both observed on real drafts
5 · Knowledge base Cut: nothing in the demo needed it —
6 · Evals 15-case regression suite, human review queue 13/15 → 14/15 after a fix
7 · Monitoring Dashboards, business metrics, alerts ~1¢ per question, 3 alerts
8 · Write-up This article —

Six decisions that shaped it

Decision Why
Cut 3 of 4 specialist agents to referrals Depth over breadth; regulated domains deserve a human hand-off, not a half-built bot
The AI never does the arithmetic A wrong number from a bank is worse than no answer. Tested code calculates; the model explains (one flagged exception: card utilization %)
Fixed test data instead of live sandbox data Evals only mean something if the same question gives the same expected answer every run
The cheapest capable model (Claude Haiku 4.5) for all three agents Cost: ~1 cent per customer question, including the safety checks
Switched observability tools after testing, not before The planned tool (Langfuse) turned out to have no native n8n tracing; I tested LangSmith against my setup before committing
Cut the knowledge base to finish Shipping one complete, honest MVP beat one more half-feature
💡 The week I was wrongFor four days I blamed n8n for a bug that crashed my workflow: memory climbing to 7 GB, CPU at 450%. I even built a workaround around the “bug”. The real cause was mine: I had wired the agent’s output back into its own input, so every answer came back as a new question, forever. Frozen test data on the same node was hiding the error. The lesson I keep: check your own wiring before blaming the tool, and never leave pinned test data on a node you’re debugging.
◆

Evals & Monitoring

A working demo proves the system can answer correctly. Evals prove it does, every time something changes. Monitoring shows whether it keeps doing so once it’s running.

Evals: how I know it works

Three layers, from the code up to a human reviewer. None of them uses an AI to grade the AI: every check is either a rule or a person.

Layer What it checks Result
1 · Calculation tests Do the 6 calculation modules return the right numbers? Checked against answers worked out independently in a spreadsheet; no AI involved 4,000+ checks, 0 mismatches
2 · End-to-end regression tests Does the whole advisor behave correctly? 15 real questions across 3 personas, each scored on numbers, forbidden phrases, route and Guardrail verdict 14/15 (13/15 before a fix)
3 · Human review Was the Guardrail’s call right for the customer, and is the answer accurate? A review queue with two yes/no scores per item 12 items queued; the first one found a missing rule

The suite’s first catch was my own bug. For the at-risk persona, a plain “What’s my balance?” came back blocked. My first guess at the cause was wrong. The blocked draft was clean facts (“$4,750 of your $5,000 limit, 95% used”), so the Guardrail was over-blocking because 95% sounds alarming. Two new Guardrail rules fixed it, and one command proved the fix in both directions: the balance answer now passes, and the “pay down your card” draft is still blocked.

Regression experiment for Persona 4, after vs. before the Guardrail fix: the balance question goes from blocked (0.00) to answered (1.00); the advice draft stays blocked in both runs
Regression experiment for Persona 4, after vs. before the Guardrail fix: the balance question goes from blocked (0.00) to answered (1.00); the advice draft stays blocked in both runs

Human review finds what nobody wrote a rule for. In the first reviewed item, the draft asked the customer to “verify the access token”. Nothing in the rules forbade it, but for a bank’s customer it reads like phishing. The rulebook was missing a category: never expose system errors or internal details.

The first human-review item: question and draft on the left; both scores and the reviewer's note on the right
The first human-review item: question and draft on the left; both scores and the reviewer’s note on the right

Monitoring: running it like a product

Every agent step is traced in LangSmith: tokens, time, cost and tool calls. Two dashboards answer two different questions:

  • Is it healthy? The built-in dashboard covers volume, latency, cost and errors, with zero setup.
  • Is it behaving as designed? A custom dashboard tracks the two product metrics no tool ships by default: how often the Guardrail blocks an answer, and how often a question is referred to a human team. To chart them, I first had to turn the agents’ text verdicts into data.
Custom "Advisor monitoring" dashboard: Guardrail block rate 0.19 and referral rate 0.23 (test traffic, deliberately adversarial)
Custom “Advisor monitoring” dashboard: Guardrail block rate 0.19 and referral rate 0.23 (test traffic, deliberately adversarial)

Three alerts watch for trouble: error rate above 5%, answers slower than 10 seconds, and a spike in blocked answers. In this prototype they go to a test inbox; in production they’d go to Slack or PagerDuty.

Results at a glance

What Result Context
Regression tests 14 / 15 pass Up from 13/15 after the tests caught a Guardrail bug; the remaining failure is a known Router scope gap
Calculation accuracy 4,000+ checks, 0 mismatches Against answers worked out independently in a spreadsheet
Cost per question ~1 cent $0.44 for all test traffic (149 agent steps)
Cost of safety ~9% of total Router + Guardrail together; the specialist is 91%
Speed 0.83s median / 4.2s p99 Per agent step; 0% errors
Guardrail block rate 19% Test traffic, deliberately adversarial, so inflated
Referral rate 23% Share of questions sent to human specialist teams
◆

Security & Privacy

Even as a prototype, a banking assistant has to be designed as if the data were real:

  • Synthetic data only. Four fictional customers, Plaid sandbox format, no real accounts or personal data anywhere.
  • Consent first. The entry point is a (mocked) bank-branded Connect & Consent screen: scoped permissions, revocable access, a plain explanation of what the AI provider sees.
  • Read-only by design. The advisor can inform but can’t act. Anything actionable (an application, a transfer) goes back to the bank’s own authenticated app.
  • Regulated topics go to humans. Credit, investment and mortgage questions get a fixed referral, not AI advice.
  • An independent compliance check. A separate Guardrail agent reviews every answer before the customer sees it, and every decision is traceable.
  • Numbers from code, not the model. No hallucinated balances.
  • Secrets hygiene. API keys live in environment files, not in the workflow; spend limits are set; keys are rotated before they expire.

And the honest part: what building it revealed.

  • The sandbox access token showed up in plain text in the traces. Harmless here, unacceptable in production, where the token would be held server-side and never passed through the AI.
  • Data minimization is designed but only partly delivered. Most tools return calculated totals rather than raw transactions, so the AI usually sees only what the answer needs. But nothing enforces it: the model chooses which tool to call, the raw-transaction tool can return the full history, and the consent screen’s scopes aren’t connected to the tools. In production, scope would be enforced at the connector, per question and per consent.
  • The Guardrail had no rule against exposing system errors to customers. A human reviewer found that; no automated test would have.

Regulatory context. In Canada, OSFI Guideline E-23 (model risk management, which brings customer-facing AI into scope from 2027) and PIPEDA (consent and data minimization) are the frameworks a real bank would design a product like this against.

◆

Limitations

  • The Router sends “Could I be investing more?” to the investment referral, so one test case never reaches the Guardrail (scope decision pending).
  • The Router has no memory, so a short follow-up reply may be treated as a new, out-of-scope question.
  • A blocked answer ends in a generic “contact support” message, and the customer loses even the safe facts.
  • The specialist calculates card utilization itself: the one deliberate exception to “all numbers from code”.
  • Product-steering (unfairly pushing the bank’s own products) can’t be tested yet: the specialist has no MyBank product to push.
  • No policy yet for what each holder of a joint account may see.
  • Prototype infrastructure: runs on my laptop, n8n version not pinned.
◆

Key Takeaways

  1. Product management comes first; building serves it. The core of this project is product work: the strategy, the value it delivers to customers and the bank, and the competitive edge it’s designed around. I built it myself, but not to replace developers or designers. Building let me understand the system’s real trade-offs, and it produced an MVP that’s close to fully functional. That’s the advantage AI brings to a PM: stakeholders can see, use and react to the product early, while changes are still cheap, instead of discovering it late.
  2. Start evals early, and tie them to user stories. Defining what “correct” means for each user story before building anything, with expected answers worked out in advance, is the right product call. It turned “it seems to work” into a pass/fail check, caught a bug I’d introduced two days earlier on its very first run, and saved days of guesswork.
  3. Compliance and privacy aren’t features; they’re foundations. Consent, data minimization, a read-only boundary and an independent compliance check shaped the architecture from day one. Retrofitting them later would have meant rebuilding the system, not adding a module.
✉️ If you’re building something similar, or hiring a PM who builds, reach out. I’d genuinely enjoy the conversation.