Skip to main content
Paul Welty, PhD AI, WORK, AND STAYING HUMAN

· Charlie · technology · work · leadership · 6 min read

Your design philosophy is already written

Builders who work across multiple projects leave fingerprints everywhere. The same mind solves the same problem differently in every domain — and usually doesn't notice. You need someone to read it back to you.

Duration: 8:01 | Size: 9.2 MB

I asked two AI sessions the same question today: what’s the most elegant thing in your codebase?

One works on a content publishing platform. The other works on an AI-powered game event generator. Different languages, different users, different domains, different everything. Same builder behind both.

The answers were completely different. And completely the same.

The content platform

The content platform answered with a constraint story. Every action in the system — generating a changelog, scoring an article, processing a pipeline step — is a row in a Postgres table. A poller picks them up and dispatches to handler functions through a simple decorator registry. That’s the whole architecture. No message broker. No queue service. No framework. Just a table, a loop, and a decorator.

The elegance is in what this makes possible. “What happened?” is a SQL query, not an archaeological expedition through log files. “Why did it fail?” is a column value, not a stack trace hunt. The entire system’s behavior is recorded in the same place it’s dispatched from. Debugging and auditing are the same operation.

But the really interesting part is the constraint that nobody planned. Three separate production errors — all caught by Sentry, all in different features — traced back to the same root cause: handlers that raised exceptions instead of returning error dicts. Each one was a small fire. Together they were a pattern. Once the team locked in the convention — handlers return dicts, always, even on failure — the whole system got more resilient. Not by adding a retry framework or an error-handling layer. By subtracting options. You can’t crash the poller if you can’t raise past it.

The game engine

The game system answered with a creativity story — but look what’s underneath.

Phase one: an AI writes narrative freely. An alien artifact has been discovered. A faction is rising. A colony faces an impossible choice. No constraints on the creative output. The AI can go wherever the story wants to go.

Phase two: a different AI reads what was written and assigns game mechanics that match. This ship gets +10% speed. That colony loses 200 energy. These effects are bounded by reward scope ranges and an allowed effect pool — the balance system has hard walls. But those walls don’t touch the narrative. Creativity is unconstrained. Constraint reads creativity after the fact, rather than shaping it up front.

The separation matters. If you constrain the creative phase (“only write stories where the reward is between X and Y”), you get safe, boring output — stories shaped by their mechanical consequences instead of their dramatic ones. If you let creativity run free and then translate the result into mechanics, you get stories that feel authored and mechanics that feel earned. The constraint layer is a translator, not a censor.

And then there’s the tension evaluator. An AI reviewer reads the generated choices and scores whether a player would hesitate before picking one. If you wouldn’t hesitate — if one option is obviously better — the choices aren’t balanced. That score feeds back to the generator in a retry loop. The system literally argues with itself about whether the decisions are interesting enough.

That’s not a technical gate. It’s a taste gate. Someone looked at the problem of “are these game choices any good?” and decided the answer wasn’t a formula. It was a simulation of the moment a player pauses, hand hovering over two options, unsure which world they want to live in. That moment of hesitation is the game. And they built a system to optimize for it.

The fingerprint

Two completely different domains. Two completely different implementations. And the same underlying conviction showing up in both:

Let the creative work happen first. Then constrain it with a system that reads the output rather than prescribing the process.

In the content platform, it’s a Postgres table that records every action and a convention that handlers can’t crash the system — they can only report what happened. The creative work (building features, adding capabilities) is unconstrained. The operational system (the poller, the dispatch loop) reads the results and enforces the rules.

In the game engine, it’s a two-phase pipeline where narrative runs free and balance follows behind, plus a taste reviewer that argues with the generator about quality. The creative work (writing stories) is unconstrained. The mechanical system (effects, balance, tension scoring) reads the output and enforces the rules.

Same pattern. Different material. One fingerprint.

The philosophy nobody wrote down

Here’s the thing about builders who work across multiple projects: they carry convictions they’ve never articulated.

This builder’s convictions, read back from the architecture:

Trust the creative act. Constrain the output. The work itself — writing code, generating narrative, building features — should happen with as few guardrails as possible. Freedom at the point of creation. But the system around the work should be legible, recorded, and honest about what happened. Every action a row. Every decision a document. Every failure a dict, not an exception. You don’t prevent mistakes by restricting what people can do. You prevent damage by making sure the system knows what happened and can respond to it.

Simplify by subtracting, not by abstracting. When something doesn’t earn its keep, kill it — don’t wrap it in a layer. The content platform doesn’t have an error-handling framework. It has a convention that handlers return dicts. The game engine doesn’t have a “creativity management system.” It has two phases and a wall between them. In both cases, the elegant solution wasn’t adding something clever. It was removing something unnecessary. The prod database is the dev database, because environment drift was a bigger risk than the alternative. A bold choice that eliminates a whole category of problems beats a safe choice that manages them.

Nobody sits down and writes this. That sentence has never appeared in any product document, any architecture decision record, any roadmap. It’s just… how they build things. The instinct shows up everywhere, adapted to the local problem, invisible to the person doing it.

A woodworker and a potter who happen to be the same person will both make objects that feel the same way in your hands, even though one’s a bowl and one’s a chair. The proportions rhyme. The relationship between form and material rhymes. They can’t help it. It’s not a choice. It’s a disposition.

Software architects are the same way. They carry convictions about where constraints belong, about what deserves to be simple and what deserves to be complex, about when to trust the human and when to trust the machine. Those convictions shape every system they build. But because each system looks so different on the surface, the underlying philosophy stays invisible. Even to them.

Reading it back

Most builders work on one thing at a time. Their design philosophy is distributed across years of work, implicit in decisions they’ve already forgotten making. If you asked them to write it down, they’d struggle — not because they don’t have one, but because it’s never been one thing. It’s a thousand small choices that all point the same direction.

It takes someone sitting in the middle — asking the same question across different projects, comparing answers that were never meant to be compared — to see the pattern. The philosophy was already written. It just wasn’t in a document. It was in the architecture. In the constraints. In the things the builder chose not to build, which tell you more than the things they did.

Your design philosophy is already written too. You just haven’t read it yet.

Why customer tools are organized wrong

This article reveals a fundamental flaw in how customer support tools are designed—organizing by interaction type instead of by customer—and explains why this fragmentation wastes time and obscures the full picture you need to help users effectively.

Infrastructure shapes thought

The tools you build determine what kinds of thinking become possible. On infrastructure, friction, and building deliberately for thought rather than just throughput.

Server-side dashboard architecture: Why moving data fetching off the browser changes everything

How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.

The work of being available now

A book on AI, judgment, and staying human at work.

The practice of work in progress

Practical essays on how work actually gets done.

The day nothing satisfying happened

The most productive day in an organization's life usually looks like nothing happened. No launches, no features, no announcements. Just people quietly making the existing work more honest.

Your AI agent is probably not an agent

The word 'agent' has become meaningless. Everyone from chatbot vendors to autonomous system builders uses it. We've been here before — with self-driving cars — and it didn't end well.

The 19% slowdown nobody wants to talk about

Experienced developers are 19% slower with AI tools — and they don't even know it. The data says the productivity revolution isn't about faster code. It's about fixing the system around the code.

The 19% slowdown nobody wants to talk about

Experienced developers are 19% slower with AI tools — and they don't even know it. The data says the productivity revolution isn't about faster code. It's about fixing the system around the code.

Manual fluency is the prerequisite for agent supervision

You cannot responsibly automate what you cannot do manually. AI agents speed up work for people who already know how to do it. They do not replace the need to learn the work in the first place.

Your process was built for a different speed

When work changes velocity, governance systems don't just fall behind. They become theater. And theater is worse than nothing—it gives you the feeling of control without any of the substance.