Ian MackinnonSheet set · Builds · 6 drawings

Builds

Things I've built, drawn as the systems they are, with what I learned building each one.

B-01 · Oversight Shift

Oversight Shift

How a shift runs · select a part
  1. work queueThe untrusted model's work arrives as cards: answers, file changes, agent actions, and agent teams. Each card shows the task, the rules on file, and what the model did.
  2. control toolsControl tools gather the evidence: a trusted monitor that shows its margin of error, fact check, scope check, resample, an untrusted monitor, and a human audit that's always right but scarce.
  3. decisionYou approve the work or defer it to a weaker trusted model. Defer everything and you miss the quota; approve too much and harm builds.
  4. usefulnessWork that ships counts toward the day's quota, and usefulness above the quota becomes funding, spent between days.
  5. harmSabotage that gets approved becomes harm. Each incident report quotes the bad line and names the tell.
  6. insightA failed run earns Insight for a research tree that carries into the next run.

I built it for Mangrove’s Game Night hackathon (September 25 to 27, 2026) in about 11 hours with Claude Code. Claude wrote the code and drafted most of the text; I directed the design, playtested, and made the calls.

You read the work, spend a few scarce control tools (set to their real-world accuracy) where they count, and decide what ships. The week escalates through sycophancy and false claims, prompt injection, reward hacking, data exfiltration, collusion between agents, sandbagging, and a model that behaves differently when it thinks no one is watching. Each threat is tied to a real paper or incident, cited in the game.

It’s also a roguelike: a hidden adversary personality, events, clients, and upgrades change from run to run, and there are 3 difficulties, 4 labs, 5 model versions, and a daily shared run. For learning, it has tours of each screen, hover definitions for every technical term, a field guide to research approaches and their tradeoffs, and a short field test after a run. It’s Vite and TypeScript with no framework, and every visual is SVG drawn in code.

Drawing
Oversight Shift
What it is
A browser game where you run the AI-control protocol for a lab deploying a model smarter than the tools watching it.
Built for
Mangrove's Game Night hackathon, Sep 2026
Stack
TypeScript · Vite · SVG
Status
live
Link
Play it
Sheet
B-01

B-02 · fleet-pm

fleet-pm

How a backlog becomes merged code · select a part
  1. backlogfleet-pm starts from a backlog of feature specs for a software project, one spec per feature.
  2. dispatchIt dispatches Claude Code workers in parallel, each one on its own feature.
  3. worktreeEach worker runs in its own git worktree, so parallel agents never edit the same checkout.
  4. validateEvery result is checked before it can merge.
  5. mergeValidated work is merged, conflicts are resolved, and failures are recorded so later runs can avoid them.

I’ve used it to direct AI-assisted development of more than 10 applications, in fitness, research, education, accounting, legal and compliance, cybersecurity, and marketing.

Drawing
fleet-pm
What it is
An orchestrator that takes a backlog of feature specs, dispatches Claude Code workers in parallel, and validates and merges what they produce.
Used for
10+ applications
Stack
Python · Claude Code · git worktrees
Status
private
Sheet
B-02

B-03 · Alloybase

Alloybase

OPTIMADEdatabasedatabasedatabasedatasetv1, v2, v3pandasJupyter

OPTIMADE gives many materials databases the same query language, so one search can cover several of them. The hard part is everything after the search: keeping track of which database each row came from, versioning a dataset so a paper can cite it, and getting it into pandas or Jupyter. When a database is slow or down, Alloybase shows the results it has and says which sources are missing.

Drawing
Alloybase
What it is
A materials-science research tool that searches across materials databases through the OPTIMADE standard and builds versioned, citable datasets.
Stack
FastAPI · PostgreSQL · Flutter
Status
live
Link
alloybase.app
Sheet
B-03

B-04 · Member RAG chatbot

Member RAG chatbot

10,000members the chatbot serves

intent modelroutes each questioncommunity contentrecipesarticlescustomer supportproduct knowledgeanswer10,000 members, one dot each
An illustration of how a question flows, not live traffic.

I took over my company’s chatbot when our full-stack developer left and started over in Langflow and custom Python. We’ve since shipped tailored versions for two product launches.

The main thing I learned is where the model should and should not sit. My first version was an all-in-one agent that made decisions and ran the retrieval flows itself, and it burned through tokens and gave a mediocre experience. Now a structured-output model identifies the intent, code runs the retrieval that intent needs, and every AI feature has a defined failure mode instead of a guess.

Prompts are versioned and tested against a fixed bank of common member questions, and I think that maintenance process matters as much as the first build.

Drawing
Member RAG chatbot
What it is
A production RAG chatbot and personalization experience for a 10,000-member health and wellness community.
Serves
10,000 members
Stack
Python · Langflow · RAG
Status
in production, private
Sheet
B-04

B-05 · Adaptive Athlete

Adaptive Athlete

athleteagentagentagentprompt packversionedA/B testsin the database

Coaching runs through a multi-agent language-model pipeline. Prompts ship as versioned prompt packs, and A/B tests between versions are stored in the database, so two versions of a prompt can be compared directly. It has subscription billing and runs on DigitalOcean.

Drawing
Adaptive Athlete
What it is
An AI fitness-coaching app I co-founded with family partners.
Stack
FastAPI · PostgreSQL · Docker · Caddy
Status
alpha, private
Sheet
B-05

B-06 · Launch and content automation

Launch and content automation

Launch setup

80 → 1person-hours to set up our most complex launch

BEFORE · about 80 person-hours

AFTER · about 1 hour

Creating every workflow and task for our most complex product launch went from about 80 person-hours to about one hour over three iterations (a workflow redesign, a helper script, then a Google Apps Script orchestrator).

~600 → ~7.5person-hours a year of launch setup, about 590 hours of average projected yearly savings

BEFORE · about 600 person-hours a year

15 rows = 15 launches · 40 squares = 40 person-hours each

AFTER · about 7.5 hours

Projected from an average year of about 15 launches at about 40 person-hours each, at the same reduction as the most complex launch.

Docuseries drafting

100+hours saved drafting a docuseries

sourcemateriallocal AI pipelineruns locallydraftscripts

each dot is one hour handed back to the team

Local AI pipelines drafted the scripts for a 2025 docuseries and saved the team over 100 hours.

Both are internal tools I built at my day job, so there is nothing public to link. Launch setup went through three iterations: a workflow redesign around project phases, a helper script, then a full Google Apps Script orchestrator.

Drawing
Launch and content automation
What it is
Internal AI and automation tooling for project, launch, and content teams at my day job.
Stack
Google Apps Script · Python · local models
Status
in use, private
Sheet
B-06

Built with Astro and developed with Claude Code. All copy reviewed and approved by Ian.