Case Study  ·  Power BI + AI Agents  ·  Self-Funded

Cannabis Markets
Intelligence
Platform

One view of the U.S. and Canadian cannabis market, built by one person directing a team of AI agents. A nightly GitHub Actions release captures the data every trading day and tests it before refreshing a 96-table Power BI model with 1,293 measures and an AI narrative layer that writes the plain-language read. When a release-blocking data test fails, it halts publishing. It joins 28 data-source families covering the five cannabis ETFs, the operators behind them, and the reform that moves the market. It began as a tracker for one of the market’s hardest targets, a structurally complex, swap-based cannabis ETF, and grew to cover the whole market.

A self-funded public test case with no client, chosen to prove the method. As architect and sole product owner, I set the design, the priorities, and the rules for what ships. AI agents wrote every line of code from my plain-language direction.

Power BI DAX Capital Markets Data Regulatory Tracking Automated Data Testing AI Agents AI Narrative Layer (Claude) Geospatial Mapping
The build team as it runs today
$1.26B
Net Assets · 5 ETFs · 2026-09-24
12,302
Dispensaries Geocoded
23,595
Automated Tests
1,293
DAX Measures · 96 Tables
▶  Interactive Report ●  Live · 33 pages
▶  Open the live report →
33 interactive pages · best viewed on desktop
Live Power BI: use the ‹ › bar to page through all 33 pages. Self-funded · not investment advice.
01

The Agentic Build

One person built this. A nightly GitHub Actions release captures the data every trading day, tests it, ties the flagship fund to the issuer’s file, and refreshes the model, and it halts publishing when a release-blocking data test fails. Under the hood are a 357-module Python pipeline, a 96-table Power BI model with 1,293 measures, a pipeline that joins 28 source families, and an AI narrative layer. How one person built something this size is the point of this case study. I ran it like an enterprise delivery team. AI agents built the components in parallel, and two separate reviewer agents checked the figures and audited the agents’ claims. I directed it as architect and sole product owner.

●
Parallel build agents. Five or six builders ran at once, each in its own git worktree with a fenced set of files, so pipeline, model, and report tickets moved in parallel.
●
The groundwork. Agents researched state and federal cannabis legislation, mapped each operator's regulatory status, and hunted down dispensary rosters across 40 states, D.C., and 5 Canadian provinces, each in its own format, with its own quirks. They also worked through reporting standards and edge cases, including the swap-to-direct conversions a naive day-over-day read gets wrong.
●
Live model operations. I directed agents to inspect, build, and audit the live Power BI semantic model directly, not screenshots of it.
●
A scheduled daily orchestration. Every trading day, a chain of capture stages pulls the sources in a fixed order, each checked for success and freshness. Language-model passes then write the daily read, the per-company briefs, and the weekly themes. A blocking data-test gate sits in front of publishing: if it fails, the model refresh and the publish chain are skipped.
●
Grounded language-model passes. Claude passes (Sonnet for most, Opus for Today’s Take) write the analysis: the daily read, Today's Take across five funds, the “why it moved,” per-company briefs, and the weekly themes. The briefs run as half-price batch jobs, and several passes skip themselves on an unchanged day. In Today’s Take, code fills in every figure, and commentary containing a digit the code didn't supply is rejected.
●  Pure Orchestration
I never wrote the code. The 357-module pipeline, the 96-table model, the 1,293 measures, and every visual on every page were produced by AI agents from my plain-language direction. My job was intent, architecture, and the rules the team works under. Guardrails made that hold. Hooks stop a commit to reviewed areas until its required reviewer is launched, reviewer agents check the builders’ work, and routine deploys and ticket acceptance run on standing rules I approved. Credentials, irreversible actions, and scope growth still come back to me.
●  Run Like a Product Team

I run the build with the flow metrics I built for Allstate’s Agile delivery: measure the flow, find the constraint, fix the system, measure again. I set the priorities and the rules for what ships; agents build and reviewers verify.

Live board · updated nightly
 tickets closed on the board since Jul 16
Tickets closedWeek in progress

    Counts start Jul 16, when the ticket board was created. The project began May 23, with work tracked first in the roadmap and then in a single backlog list, so those weeks aren’t counted, and tickets moved onto the board already finished are left out. Some weeks include bulk closes, such as a sweep of stale tickets and catch-up sign-offs.

    02

    Tying It Together

    It starts with basic, public data, the kind anyone can pull: ETF holdings files, SEC filings, market and short-interest data, dispensary rosters across 40 states, D.C., and 5 Canadian provinces, a hand-built federal and state legalization timeline, congressional roll-call and cosponsorship records, and newswires. That adds up to 28 source families, none of them built to agree. The value is in joining all of it into one model, where a plain holdings file becomes a complete, day-over-day view of the market.

    ■  ETF Holdings & Facts
    The daily holdings file for each of the five cannabis ETFs, plus published fund facts: the anchor the other sources are joined to. Every fund publishes its holdings daily; MSOS’s file is overwritten each day, so the platform’s own dated archive is its only history.
    ■  SEC Filings
    N-PORT monthly portfolios, 13F institutional holdings, XBRL company fundamentals, and 8-K / 10-K / 6-K / 40-F event feeds, pulled straight from EDGAR.
    ■  Market & Short Interest
    Underlying and benchmark prices and quotes, plus FINRA short interest and Reg SHO daily short volume in the U.S. and CIRO short positions in Canada.
    ■  News & Sentiment
    Three newswires (GlobeNewswire, PR Newswire, and Newswire.ca), each covering different holdings, plus a sentiment feed: the catalysts behind the moves.
    ■  Dispensary Registries · U.S. & Canada
    Rosters from separate regulators in 40 states, D.C., and four Canadian provinces, plus Ontario’s major chains, each scraped on its own and arriving as JSON, CSV, HTML, and even PDF, then geocoded and normalized into one mapped universe of 13,226 licensed locations, of which 12,302 are geocoded store-by-store. It is a deliberate lower bound, since not every jurisdiction publishes a usable store roster.
    ■  Congress & Cannabis Votes
    Congressional roll-call votes on cannabis from the U.S. House Clerk (four landmark House votes, 2019–2022), mapped to the members who cast them, with cosponsorship history and an explicit coverage flag for members who have never had a floor vote.
    ■  Legal Sales, §280E & Reform
    State-by-state legal-sales figures, a hand-built legalization timeline, and a §280E scenario model anchored on operators’ reported SEC XBRL tax figures: the policy forces priced into the market.
    ■  Reference & Synthesis
    Wikidata company demographics, historical shares outstanding recovered via the Internet Archive's Wayback Machine, and a Claude synthesis layer that may cite only figures the code supplies.
    ●  Where the Work Is
    None of these were built to agree. The hard part is joining them: matching a swap leg to its equity leg, resolving CUSIP and issuer identity across sources, and tying each fund’s holdings back to the issuer’s own file (MSOS to the cent, the other funds within tolerance). The checks that exist, and the gaps, are published.
    03

    The Discipline

    The platform is built on the controls a finance team expects, applied to AI-built work.

    ●
    A repeatable pipeline. Re-run it against unchanged source data and it produces identical output, so a change in the numbers is a real change in the data, never an artifact of the pipeline itself.
    ●
    23,595 automated tests. Parsing, classification, and tie-out rules are guarded by tests (23,468 passing, 123 skipped, 4 not green), so a change in upstream behavior surfaces as a failing test rather than a silent error in the numbers. The scorecard is published exactly as the gate writes it, red rows included.
    ●
    Audit-drift tracking, reported honestly. The live model is reconciled against its specification and the drift is counted, published, and carried on the record rather than closed out. The DAX-layer comparison needs a live desktop session, so it is run deliberately, not continuously.
    ●
    Ambiguous cases are flagged, not guessed. Where a classifier cannot decide, it raises a review flag instead of forcing a label.
    ●
    Defensive parsing. When an upstream file format shifts, the pipeline flags the drift instead of quietly mis-reading it.
    ●
    Two separate reviewers. A purpose-built validator re-checks numbers, names, colors and formats across pages against ground truth and returns a go/no-go. Its charter limits it to redlining; fixes go back to the builders. It is required on every change that touches a measure, a projection, a curated file, a headline number or a layout, because the rule it exists to enforce is that the implementer never certifies its own work. A second reviewer agent audits the agents’ claims.
    ●
    120 audit modules and a 13-layer test plan. Capture, parsing, classification, source reconciliation, cross-file checks, fund-facts identities, and the headline numbers are each tested, and a release-blocking data test holds the publish chain.
    ●
    A freshness tripwire. Each file's capture time, server timestamp, and internal as-of date are recorded, and stale or misdated sources are flagged before they can poison a day. Its known blind spot is on the record too: a Friday-evening or weekend miss isn't surfaced until Monday.
    ●
    The check is public. The platform's own Trust & Proof section publishes the live scorecard (23,595 tests, 99.5% passing, 120 audit modules, 28 source families), so the claim that this output is checked is something a visitor can inspect rather than take on faith. The checks themselves are deterministic tests, not an AI opinion.
    04

    The Product & What It Surfaces

    A 33-page Power BI analytics platform, version-controlled and refreshed by a nightly release that halts publishing when a release-blocking data test fails. Its five sections move from the market down to the mechanics: The Industry (with The Organized Opposition), The Vehicle, The Companies, Smart Money, and Trust & Proof, all opening from one Home page. Its flagship lane is still the hardest one: a structurally complex, swap-based ETF whose true position is disclosed only as a self-overwriting daily file and dozens of filings. Now it is one section of a much larger picture.

    ●
    The Industry. Where the law stands and where the stores are: a store-by-store map of 12,302 geocoded dispensaries, drawn from a mapped universe of 13,226 licensed locations and published as a lower bound because not every jurisdiction publishes a usable roster, legal status across all 51 US jurisdictions (25 adult-use), state-by-state legal sales of roughly $29.6B in 2024, and a “what reform unlocks” model for the day §280E is lifted.
    ●
    The Vehicle. How the money actually reaches cannabis, across all five ETFs: total-return swaps vs. directly-held shares, the swap counterparties, the cash position, and every swap-to-direct conversion as it happens (12.26M shares across 6 clean conversion events, plus 5 more where a conversion and a trade landed on the same day and are labeled as such), the exact event a naive day-over-day read gets wrong. MSOS alone runs 71% swap to 29% directly-held, and its holdings reconcile to the cent with the issuer’s own daily file. Issuer-reported net assets: $1.02B.
    ●
    The Companies. The operators behind the tickers: $10.13B in combined annual revenue (25 SEC filers, each at its latest filed fiscal year), a scale-vs-profitability scatter, corporate-ownership trees, MSOS-vs-S&P performance, and the multi-state operators whose stores are mapped one by one.
    ●
    Smart Money. Who's buying and selling: 148 insiders on record selling, 10b5-1 pre-scheduled selling plans tracked to the share, the 13F institutional holder base, and how the House has voted on cannabis (four landmark votes, 2019–2022; 1,090 yea to 572 nay), with members who have never had a floor vote flagged rather than assumed.
    ●
    Trust & Proof. The differentiator, made inspectable: a live scorecard of 23,595 automated tests (99.5% passing, and the ones that aren’t are shown too), 120 audit modules, 28 source families. The product publishes its own checks, gaps included.
    ●
    The daily written read. Each day Claude turns the pipeline’s numbers into a plain-language take on what moved and why. It runs through every section as Today's Take, per-company briefs, and weekly themes. It cites its sources, and any draft containing a digit the code didn't supply is rejected.
    05

    Why This Market

    I built this for a market I invest in. I own MSOS, and the questions that pulled me in are ones the whole sector shares: where the money actually goes, which operators are uplisting or changing exchanges, and what the broader U.S. cannabis market is doing day to day. Those questions surface constantly, with no single good source for the answers, so I built the platform I wanted, and made it sector-wide.

    It's also one of the hardest reporting targets I could find. For years these operators were federally illegal under Schedule I, which kept them off major U.S. exchanges and out of U.S. custodians’ reach. That is only starting to change: medical marijuana moved to Schedule III in April 2026, and Trulieve listed on the NYSE in June. The ETFs reach them through a mix of total-return swaps and directly-held shares. MSOS discloses all of it, every day, but it lands as a spreadsheet that overwrites itself with no history, where the same company can appear in a swap line and an equity line at once. The raw truth is public; what's missing is a way to see it. A naive day-over-day read of that file misreads a swap-to-direct conversion as two trades that never happened.

    What the platform gives you is the picture the disclosures don't: how a dollar travels, from your account, into a fund, through the swap or the shares, and out to the operators behind the tickers. And it's a moving target: as rescheduling progresses and these operators become custody-eligible, the funds convert swaps into directly-held shares, name by name, and every conversion is tracked as it happens.

    ●  The Point
    I built this because I wanted it to exist: real transparency on a market I invest in, where the questions are only getting louder. It was also where I learned to direct AI agents to build Power BI at this depth. It shows the method holding up on a hard reporting target.
    06

    Why This Matters

    The same method applies to your team’s reporting.

    I can stand up trustworthy, automated reporting for your team or your business, quickly and to a standard you'd be comfortable putting your name on, because I deliver with AI agents and the governance to keep them honest.

    Book a Call →