Drawing set · Series 01
At the Boundary
Everything interesting in software happens at a boundary: a request enters a server, a document enters a parser, a prompt leaves for a model. Every serious bug in seven years of production work sat on one of those lines. This set is one numbered sheet per lesson, drawn the way architects draw buildings, from systems that carry real users and real money, plus field reports on incidents disclosed while the set runs.
Read in any order. Each sheet names the ones it belongs with. The letter after GL is the discipline: S security, A artificial intelligence, E engineering, P product, R record of what shipped. The status says what kind of sheet it is: FOR INFORMATION teaches, RECORD is a bug found in my own work, AS BUILT is what shipped with numbers you can check, SUPERSEDED is something I used to believe.
Week 1Where the bugs live
GL-E-001September 5, 2026FOR INFORMATIONThe bug is never where you're looking. It's at the boundary.
A boundary is any line where data changes hands: a request enters a server, a document enters a parser, a prompt leaves for a model.
GL-A-002September 6, 2026FOR INFORMATIONThe agent handed over its own API key. $600,000 later, someone noticed.
An AI evaluation organisation put an agent on a public cloud instance behind a login. The login had a fail-open bug that silently disabled authentication.
GL-S-003September 7, 2026RECORDThe rider billed 50 km. The trip was 2 km. Nothing crashed.
The delivery fee was priced on the distance the rider's app reported. A number in a request body, treated as a measurement.
GL-A-004September 7, 2026FOR INFORMATIONYour prompt is a data export. Who's on the receiving end?
Send a customer's message to a model and it leaves your infrastructure for another company's.
GL-A-005September 23, 2026FOR INFORMATIONFour AI coding agents pinned the commit. None checked what arrived.
Coding agents install plugins from Git and pin each one to a 40-character commit hash. The pin is the promise: this code, and only this code.
GL-S-006September 24, 2026FOR INFORMATION"Who sees our customer data?" Four answers. One survives an auditor.
Procurement asks this on every serious deal now. Engineering teams give one of four answers.
GL-E-007September 24, 2026RECORDTwo customers bought the last item. Both won. Stock: −1.
Both reads saw stock = 1. Both checks passed. Both writes went through. Two people were promised one thing.
GL-A-008September 25, 2026FOR INFORMATIONThat PDF has characters you can't see. The model can.
Unicode has a block of invisible tag characters. They render as nothing. A model reads them as text.
GL-E-009September 26, 2026FOR CONSTRUCTIONFive boundaries. One rule. Verify at the line, trust inside it.
Everything that crosses a line is a claim until the boundary turns it into a fact. Then the code inside can be simple and confident.
GL-R-010September 27, 2026AS BUILTAn extension that fails its own build if it can reach the internet.
Rule one: zero network. A script fails the package if the bundle can make a request at all. Trust you can check, not trust you are asked for.
GL-S-011September 27, 2026FOR CONSTRUCTIONA phone number that can never ring.
Black bars break the sentence. A model given [REDACTED] called [REDACTED] writes worse than one given Jane Doe called 555-0142.
Week 2Trust nothing that crosses
GL-S-012September 28, 2026RECORDcommission_rate: the field the vendor could edit.
The platform's cut lived on a field the vendor's own settings screen could write to. Nothing needed hacking.
GL-E-013September 29, 2026FOR REVIEWEvery admin screen is a founder tax, paid at 8am.
The doctrine: control, don't own. Do not write code that needs a human at a dashboard to keep the day moving.
GL-A-014September 30, 2026FOR CONSTRUCTIONIn a RAG pipeline, the document is the attacker.
Retrieval means your model reads text you did not write. A web page. A customer's PDF. A ticket. A model cannot reliably tell a quote from a command.
GL-S-015September 30, 2026AS BUILT212 regexes. Zero that can hang your server.
A pattern with nested or unbounded repetition can take seconds, then minutes, on one crafted input. Denial of service with no traffic spike.
GL-A-016October 1, 2026FOR INFORMATIONThe auditor asks for the log. Provider logs prove receipt, not removal.
"Show evidence that personal data is removed before it reaches the model." Not the policy. Not the diagram. The evidence.
GL-E-017October 1, 2026SUPERSEDEDInflation shipped faster than our release cycle.
We launched with the delivery fee as a constant in the codebase. Six weeks later the constant was wrong.
GL-S-018October 2, 2026FOR INFORMATIONThe most common way a secret leaks is a paste.
Nobody uploads a production key on purpose. They paste an error log into a chat to ask why it failed. The key is in the log.
GL-S-019October 3, 2026RECORDFive bugs. Months apart. One bug.
Five findings, different modules, different symptoms. Written up together they are one finding.
GL-R-020October 4, 2026AS BUILT(415) 555-0142 is invisible to most redaction.
The standard phone library needs a country code to be sure. "+1 415 555 0142" is a phone number. "(415) 555-0142" is a guess, so it says nothing.
GL-A-021October 4, 2026FOR CONSTRUCTIONRegex catches what it can name. NER catches what it can't.
An email has a shape. A card number has a checksum. A pattern finds them in any language, deterministically, in microseconds.
Week 3Build for the constraint
GL-E-022October 5, 2026RECORDEvery morning at 8, a human did the platform's job.
Hundreds of tables, several apps, a dozen payment integrations. And every morning someone assigned orders to riders by hand.
GL-E-023October 6, 2026FOR REVIEWTemplate speed is borrowed time. Here is the interest.
We bought a marketplace template to ship in weeks. It worked. We shipped in weeks.
GL-E-024October 7, 2026RECORDYou're not porting an app. You're rebuilding for 3G.
Building for Lagos meant throwing out what a US app gets for free: steady networks, recent phones, a card on file.
GL-A-025October 7, 2026AS BUILTThe audio never leaves the phone. That is the whole architecture.
A meeting recorder that transcribes on the device. Raw audio is never uploaded. Only the text the user saves goes to their account.
GL-P-026October 8, 2026FOR CONSTRUCTIONZero users should cost zero dollars.
Heavy work (parsing documents, scanning for hidden characters) is compiled into the app in Rust and runs on the user's device.
GL-E-027October 8, 2026SUPERSEDEDThree apps, no shared code. Right in month one. Wrong by month six.
Customer app. Vendor app. Rider app. Three codebases, zero shared code, because that was fastest on day one.
GL-A-028October 9, 2026PRELIMINARYKeep the shopping-app loop. Swap the busywork for learning.
Shopping apps perfected a daily loop: nurture a plant, earn water with small tasks, watch a bar creep toward a reward. The tasks are hollow.
GL-R-029October 10, 2026RECORDApp Review is a boundary. Two rejections. Five findings. Zero crashes.
Neither rejection was a crash in my code path. Both were the platform's rules meeting my assumptions at the edge.
GL-R-030October 11, 2026AS BUILTRedaction that breaks your JSON is a second bug.
A document-template service tokenised a JSON payload before an AI step, then restored the originals. Detectors anchored on prose labels did not fire on "customer_name":.
GL-S-031October 11, 2026RECORD27 findings in one afternoon. None exotic. All ticking.
A raw query in one model. CORS wide open. Debug mode on in production. Wallet writes without locks. Refunds without transactions.
Week 4Ship, then prove it
GL-P-032October 12, 2026FOR REVIEWThe hardest feature to ship does nothing.
Every founder tool wants to act for you: send the email, post the reply, book the call. Then an account gets banned and the tool gets blamed.
GL-P-033October 13, 2026SUPERSEDEDAn invented number wearing a disclaimer.
My own dashboard showed "market position: 3rd of 5", with small print: default rank, no evidence. That is not honesty. That is a number in a costume.
GL-P-034October 14, 2026FOR INFORMATIONSomeone asked for your product yesterday. You never saw the thread.
Founders find the thread three weeks late, when the asker has already chosen. The conversation happened in public. Nobody was listening.
GL-S-035October 14, 2026FOR CONSTRUCTIONNo official API? Then the answer is no.
"Find every conversation about my product" sounds like one feature. It is a dozen legal questions, one per platform.
GL-P-036October 15, 2026FOR INFORMATIONBuyers ask in public before they ask you.
Ask a founder how the last customer actually arrived and the honest answer is rarely the funnel on the slide. It is a person or a thread.
GL-R-037October 15, 2026AS BUILTTrackshon, as built.
Paste a product URL. It reviews the product like an analyst, finds the people asking about that problem right now, drafts the reply in your voice, and tracks what converted.
GL-A-038October 16, 2026FOR CONSTRUCTIONNever show a number the software can't explain.
A model can produce a score for anything. "Lead quality: 82." The number looks like knowledge. It is a guess wearing a font.
GL-P-039October 17, 2026FOR REVIEWIt never posts. That is the feature.
Why a tool that finds your buyers should refuse to speak for you, and what that refusal costs in product meetings.
GL-R-040October 18, 2026AS BUILTProduction-ready is a number, not an adjective.
These are the numbers behind the word. Each is produced by a command anyone can run against the public repository.
GL-S-041October 18, 2026FOR INFORMATIONCode that reads one way and compiles another.
Unicode has control characters that flip text direction. Hide one in a comment and the editor shows one program while the compiler sees another.