Slide 0 — the hero

Sentry meetup · 15 minutes

I built a software factory and an agentic automation product at the same time.

One developer. One $100/month plan. 108 days. I did not write the code.

793commits · 767 agent-authored
4,529written decisions
110kwords of judgment
671planning documents
334issues · 9 workstreams
99dispatch events
70agent worktrees
2,564tests
The hero states the claim and the key proves it, but a stat grid is a lot to absorb in the first fifteen seconds of a talk. Two deliveries: put it up in silence and let them read it, which is confident but burns ten seconds of goodwill; or say the hero line aloud first and bring the grid up underneath it as you finish, so the numbers land as evidence for a sentence they already heard. I prefer the second. Which do you want, and is any stat in the grid one you would swap out?

Slide 0a — who I am

Before the numbers

I have spent six years selling and supporting the tools that test the web.

Cypress · Replay.io · Checkly · now Resolve AI. Solutions engineering, then Head of Solutions for North America.

  • I did not come to agents from research. I came from six years of watching deterministic tests fail in production.
  • Built InterIntel in 2023 — one of the first agentic coding tools.
  • Before all of it: founder, UX consultant, therapist, chef.
Jon Canales
projectJanus
started2026-05-09
team size1
budget$100 / month

Every line on every slide in this deck is editable — click it and type.

Slide notes
  1. Thirty seconds. The credibility is the four logos, not the CV — you have spent your whole career in the room's problem space.
  2. The line that earns the talk: "I came from watching deterministic tests fail in production for six years." Say it and move.
  3. "Therapist, chef" is the human beat. One second, no explanation, it will land.
I have led on the six years across Cypress, Replay, Checkly and Resolve rather than on titles, because for this room the fact that you sold and supported testing tools before building an agent harness is the whole reason to listen. The Modern Sapiens founder years and the Head of Solutions title are both dropped for time — say them if asked. The gamble is the last bullet, "this project is the first time I built the thing instead of supporting it," which is honest and slightly vulnerable and I think makes the rest land. Keep it, or cut it?

Slide 0b — what Janus is

Named once, then never explained again

You don’t write tests. You write guides.

You don’t write tests. You write guides. A guide is a deterministic script that carries enough intent that when a step breaks, an agent takes the wheel, drives from the failed step, and either finishes the job or returns a real failure — not “couldn’t click the thing.”

A Chrome extension and a CLI over one substrate. Three verbs.

janus runreplay a guide, agent recovers on a miss
janus communedrive a tab from natural language
janus auspexjudge the trace it produced
Automation for the AI SDLC. — PROJECT-GUIDANCE.md

That is the last time this talk explains the product. Everything after it is evidence about the factory that built it.

Slide notes
  1. Forty-five seconds, then drop it. The room does not need to care about browser automation for the rest of the talk to work — Janus is the evidence, not the subject.
  2. If you only say one line, say “you don’t write tests, you write guides”. It is the one that makes people ask afterwards.
  3. Do not say “self-healing” — PROJECT-GUIDANCE.md explicitly rejects that framing.
Three are live in the repo and they promise different talks. “Automation for the AI SDLC” is the positioning line and it tells a Sentry room exactly where the product sits, but it is abstract. “You don’t write tests, you write guides” is concrete and provocative to a room full of people who write tests — it risks starting an argument about testing that the talk then abandons. “The browser, with two faces” is the most memorable and the least informative. I have led with the positioning line and put the two-faces line in the pull quote. Do you want them swapped?

Slide 0c — the surface area

Why any of this machinery exists

Complexity doesn’t add entropy. It multiplies it.

Hosts

  • Chrome extension
  • Element picker
  • Chromium via CDP
  • Docker image

Processes

  • Go daemon
  • Native messaging
  • WebSocket relay
  • CLI · 17 commands
  • MCP · 8 tools

AI at runtime

  • 23 live-DOM tools
  • 2 LLM providers
  • Shadow-piercing
  • Mid-replay handoff
  • A model judges it

Substrate

  • .janus.zip trace
  • Two writers
  • Network capture
  • Trace viewer UI
  • 2,564 tests
56,284 lines TypeScript 52,868 Go 8,094 Python 2,564 tests 1 developer

Every line above is a seam two agents can disagree across, and not one of them fails loudly. That is the argument for a harness — not discipline, surface area.

Slide notes
  1. Do not read the list. Let it land as a wall, name three things off it, move on. The slide is an argument about scale, not a feature tour.
  2. The line that matters: none of these boundaries fail loudly. A wrong CSS selector, a trace field the Go writer emits and the TS reader ignores, a tool that silently returns nothing — all green, all wrong.
  3. This is the setup for the whole talk. Every mechanism on the timeline was bought by one of these seams biting.
The risk with a laundry list is that a Sentry room reads it as a product pitch and stops listening. Two things are meant to prevent that: the headline frames it as multiplication rather than addition, and the footer converts the list into the argument for the harness before you leave the slide. If it still reads as a tour, the fix is to cut the fourth column (Substrate) and keep three — the trace details are the least legible to a room that has not used the product. Cut to three columns, or keep four?

Slide 1 — the timeline (hero image)

May 9 – August 26, 2026 · one developer

Throughput went up. The machinery required to keep it honest went up faster.

commits / weekdebugging builtenforcement mechanismsMayJunJulAugnow1170
May 9–12
1vision docs · chat·engine log·DOM snapshot · pick export
May 20–22
·agent debug log·survey snapshot
Jun 9
·network inspector·query_network
Aug 1–2
2parallel, one tree3workstreams·beads rejected·PRDs + tracker4roles
5factoryAug 22

14 enforcement mechanisms, all built between Aug 2 and Aug 22. None in the first twelve weeks.

Slide notes
  1. Debug tooling landed in three waves and every one of them predates the harness: May 9–12 (engine log, DOM snapshot, pick export, DEBUG.md), May 20–22 (agent debug log, survey snapshot), June 9 (network inspector, query_network). On a narrow screen the two later groups collapse — read them from here.
  2. Then nothing for eleven weeks, and 14 enforcement mechanisms between Aug 2 and Aug 22.
The red line is the finding: flat at zero for twelve weeks, then near-vertical in the last three. I have kept the axes almost bare — one commit tick and month labels — because the shape is the argument and numbers invite the room to read rather than listen. The counter-case is that a Sentry audience trusts a chart with real axes and distrusts one without. Separately, five nodes bunch into the final three weeks, which is honest but crowded; I could give August its own expanded band, at the cost of the compression that makes the point. Bare axes or full ones, and do you want August expanded?

Slide 2 — five days

Two commits, five days apart

Every capability adds a failure. Every failure adds machinery. The overhead never comes back down.

The capability

08-01

Workstreams shipped — issues.json, 9 parallel tracks, a nested planning repo.

The machinery it forced

08-06

Agents kept drifting into the nested repo with no source in it. scripts/tracker — 10 lines of fix — stopped it.

"It is documented in agent memory … and being documented did not stop it." — scripts/tracker, line 25

Right now 08-01 is carrying two stories: workstreams arriving and beads being rejected in 64 seconds. Both are strong and they happened the same night, but crammed together neither gets to land, and beads is arguably the single most quotable node on the timeline. I could split it into its own slide between 1 and 2, which costs about forty seconds. Or leave it compressed here on the grounds that the whole point of that night is how much happened at once. Split, or leave?

Slide 3 — the six

What the numbers taught, numbered to the timeline
1

Always attribute your guidance and rules

2

Never take an agent's report of its work as evidence

3

Never let an agent casually add a word to your lexicon

4

Subagent context must be intentional

5

The cost of order never comes down

6

Rules aren’t meant to be broken. Enforce them.

Slide notes
  1. 19 of 34 rules in CLAUDE.md have nothing mechanical behind them. The file requires every new rule to name its enforcer — nothing enforces that. And the whole rule set is gitignored, so no rule has history, blame, or rollback.
  2. Three workers report a red Go test. The landing session cannot reproduce it and dismisses it twice as local. All 11 committed guides were broken at HEAD; a dirty tree was masking it. Two days. fail-first CI exists because a test titled “regression guard” passed on the unfixed code.
  3. Renamed nouns kept coming back — janus chat, intervention, golden. vocab_lint.py is 285 lines whose only job is refusing dead names. golden took five commits over fifteen days and still has live occurrences at HEAD.
  4. Told HANDOFF.md in the brief: 74 of 77 complied (96%). Not told: 11 of 148 (7%). They had the rule in context either way — subagents load CLAUDE.md. Only the prompt differed.
  5. Workstreams land 2026-08-01. The wrapper that stops them stranding the session lands 08-06, five days later. 14 enforcement mechanisms in 20 days after twelve weeks of none — and 82 dispatches still produced only 57 handoffs.
All five at once means the room photographs the slide and takes it home, which is the highest-value thing they can leave with — but you then talk over text they are already reading. Revealing them one at a time keeps their attention where you want it and lets each date land, at the cost of the photograph. A hybrid exists: build them one by one, then show all five together for a beat at the end so the camera gets its shot. That is my preference. Also — is 'commandments' still the word, now that they are numbered and evidenced rather than declaimed?

Slide 4 — the inventory

What it cost

The harness is small. It is also 84% bookkeeping.

More test code than product code. And the part that actually dispatches, verifies and lands work is the thin slice.

tests57,700
product src/54,100
harness7,304
6,162 doc & tracker Python — bookkeeping 1,142 shell orchestration + 220 agent roles
This slide has two findings and only one can be the headline. The pie's 84% is the more surprising number and it is genuinely useful — it tells the room that most of what they will build is record-keeping, not orchestration. The bar chart's 'more test code than product code' is the more relatable one for a Sentry room and gets a nod of recognition. The headline I wrote leads with the pie. Do you want it flipped, or the slide split so each gets its own beat?

Slide 5 — the leak

252 issues closed · 80 of them dispatched to a subagent

90% of dispatches got recorded. 0% of the changelog did.

A dispatch hands one issue to a subagent working in its own git worktree. A brief goes in; a handoff record — what it changed, what it verified — comes out. The worktree is then deleted, so the record is the only thing that survives.

99dispatch events 80distinct issues 19 re-dispatched 72 handoff recorded 8 with no exit record

A commit-msg hook blocks any commit naming a dispatched issue until its handoff exists. Nothing guards the changelog — 183 fragments still unmerged.

As drawn, one number leaks and the shape carries it without a label. I had planned to overlay the 163 unmerged changelog fragments as a second leaking stream, which doubles the evidence but also doubles what the eye has to parse in about four seconds. My instinct is that one clean gap is stronger and the fragments belong in what you say over it, not in the picture. Do you want the second stream drawn, and should the 25 branch be labelled on the slide or left for you to name aloud?

Slide 6 — what agents actually read

225 subagent runs · one rule · measured, then re-run independently

They had the rule in context. It governed them 7% of the time.

96%

Rule pasted into the brief.
74 of 77 complied.

7%

Rule only in CLAUDE.md.
11 of 148 complied.

Same rule. Same repo. Same agents. Loaded both times — subagents receive every level of the CLAUDE.md hierarchy; only the built-in Explore and Plan agents skip it. The only variable was how close the rule sat to the prompt.

Your CLAUDE.md is not configuration. It is a suggestion with roughly 1-in-14 odds. The brief is the instrument that works.

Slide notes
  1. The rule. Every dispatched agent leaves a handoff record before its work is landed. It is in CLAUDE.md, it is in the agent definitions, and it exists because knowledge kept dying in deleted worktrees.
  2. The numbers. 225 subagent runs. In 77 the dispatcher happened to paste the rule into the brief; in 148 they did not. Nobody designed this as an experiment — that is just how the briefs got written.
  3. The turn. Every gate I built points at the agents. dispatch gates them going in, the verifier sweeps their output, fail-first reverts the fix and demands their test go red. Nothing pointed at me — and merging is authoring. On 2026-08-22 a conflict I resolved by hand shipped select_option unreachable; six tests caught it, and the fix was invented during the merge. "It was mutated and proved, but only because the orchestrator chose to. Nothing required it, and nothing would have noticed."scripts/post-fold-audit. Sets up slide 8; do not spend a slide on it.
The finding is fully cited and it is the most actionable thing in the deck. The extra half-beat available is that my own verifier.md asserts the opposite — 'background agents do not load CLAUDE.md' — a belief that shaped every brief I wrote for weeks and that nothing in the repo could check. Including it makes the slide about me being wrong rather than about tooling being surprising, which I think is what stops it reading as a vendor complaint. It also means standing on stage and saying your own agent config was wrong. In or out?

Slide 7 — what I actually chose

The turn

None of this was falling behind. It was a decision I made on purpose.

Work I would never fully own. Not fix — own.

  • 183changelog entries for landed commits that never reached the record
  • 19tasks dispatched twice — first result lost or wrong
  • 4,167judgment calls across 528 documents, all mine
  • 17 · 13 · 70PRDs, build reports, planning docs — one author, one reviewer
  • 252issues closed, filed and reviewed by whoever was awake
  • 3manual QA sessions left on disk. I deleted the rest.

A team pushes this to other people. Specialists, reviewers, a QA function, someone who owns the changelog. I had me.

Slide notes
  1. This is a ledger, not a confession. Every line is real and every line was a choice to let something stay imperfect so the thing could keep moving.
  2. It works here because the room has just watched a mechanism run at 90% capture — so they already know the answer was never "build a better mechanism."
These six all have hard numbers behind them, but the set could be shorter. Six reads as considered and gives the sense of accumulation; four would hit harder and lose that. Separately the pivot word is "own" rather than "fix" — the claim being that you could have fixed any one of these, and what you could not do was carry all of them at once. If that verb is wrong the slide tilts. Which six, and is "own" right?

Slide 8 — the close

The close

An agent takes you as far as you can judge.
Not as far as it can write.

Vygotsky's zone of proximal development is the gap between what you can do alone and what you can do with help from someone who knows more than you. The scaffolding comes from above.

There is nobody above you here. An agent does not know more than you. It knows differently, and faster, and it cannot exceed your ability to check its work.

Three identical Spider-Men pointing at each other
What you build is a reflection of whoever built it.

I was the only reviewer in the system, and the only component with no gate in front of it.

Slide notes
  1. Name the inversion. Vygotsky assumes a more capable other. Using it for a tool that is not one is a deliberate reversal, not a misreading — say so, or someone in the room who teaches will say it for you.
  2. The Spider-Man point. The factory has the shape of my attention, my taste and my blind spots — and so does everything it produced. Which is why "how good can this get" was never a question about the model.
  3. Then hand off: "So here is the whole thing again."
I drew the beat rather than embedding the meme, for two reasons: the deck is self-contained with no image assets and I cannot fetch one, and the Marvel panel is somebody's copyright on a recorded talk. The drawn version also lets the two figures be labelled me and what I built, which states your claim directly instead of relying on the room getting the reference. If you want the real panel it is one file — drop it anywhere in the repo, tell me the path, and I will embed it as a data URI and keep the labels. Drawn, or send me the image?

Slide 9 — the timeline, again

Where we started

The line never comes back down.

commits / weekdebugging builtenforcement mechanismsMayJunJulAugnow1170
May 9–12
1vision docs · chat·engine log·DOM snapshot · pick export
May 20–22
·agent debug log·survey snapshot
Jun 9
·network inspector·query_network
Aug 1–2
2parallel, one tree3workstreams·beads rejected·PRDs + tracker4roles
5factoryAug 22

One developer. One $100/month plan. 108 days. I did not write the code.

Slide notes
  1. Say nothing for a beat. They have seen this picture before and now know what the rising line is made of — a wrapper written five days after the thing it protects, a hook that refuses a commit, 14 mechanisms in 20 days.
  2. Last line, then stop. "One developer, one $100 plan, 108 days. The model was never the constraint."
Slide notes
  1. Debug tooling landed in three waves and every one of them predates the harness: May 9–12 (engine log, DOM snapshot, pick export, DEBUG.md), May 20–22 (agent debug log, survey snapshot), June 9 (network inspector, query_network). On a narrow screen the two later groups collapse — read them from here.
  2. Then nothing for eleven weeks, and 14 enforcement mechanisms between Aug 2 and Aug 22.
"The model was never the constraint" closes the loop on the Vygotsky point and on the 96%/7% finding, and it is the sentence most likely to get repeated. The risk is that it reads as a swipe at the tooling in a room full of people who like the tooling, when the actual claim is the opposite — the constraint was you. An alternative that keeps the meaning and loses the edge: "The model was never what I ran out of." Which one do you say?
Unsaved changes…