Dev reflection - February 21, 2026
I want to talk about invisible problems. Not the kind you ignore — the kind you literally cannot see until you change how you're looking.
Duration: 8:25 | Size: 9.6 MB
Hey, it’s Paul. Saturday, February 21, 2026.
I want to talk about invisible problems. Not the kind you ignore — the kind you literally cannot see until you change how you’re looking.
Here’s something most people get wrong about complex systems. They think the hard part is building them. It’s not. The hard part is knowing what’s actually there after you’ve built them. Because systems don’t just accumulate features. They accumulate assumptions. And assumptions are invisible by definition — they’re the things you stopped thinking about because they seemed settled.
I ran into this from multiple angles this week, and the pattern is worth pulling apart.
Start with something concrete. We had to remove a set of features from one system because those features now live somewhere else. Simple enough, right? Delete the code, move on. Except removing eleven files meant touching the orchestration layer, the command handlers, the role definitions, the template registries, the reentry mappings. The feature was like a vine that had grown through the lattice of every other subsystem. Not because it was poorly designed — because that’s what integration means. When something works well, it weaves itself into the structure. And when you pull it out, you discover that the structure was partially made of the thing you’re removing.
The removal took a fraction of the time the verification took. And that ratio — easy change, hard verification — is something I think about a lot. Because it shows up everywhere, not just in software.
Think about organizational restructuring. A company splits a division, moves a function to a new team. The reorg announcement takes an afternoon. The next six months are spent discovering all the informal dependencies that ran through the old structure — the person who knew both systems, the weekly meeting where two teams aligned without realizing it, the shared document that was actually load-bearing. The change was simple. Confirming nothing broke was the real project.
This is why restructuring fails so often. Not because the new structure is wrong, but because nobody budgets for the verification work. They treat it like cleanup. It’s not cleanup. It’s the actual job.
Now here’s where it gets interesting. Because this week also surfaced a different flavor of the same problem — and this one’s sneakier.
We migrated an email provider. On paper, it’s a configuration change. Swap the API key, update the webhook URL, done. What actually happened: the webhook returned a 200 success code but silently failed because the API key didn’t have the right permissions. The logs in the hosting platform truncated to a single line, hiding the real error. The emails that did send landed in spam because a DNS record was missing. And even after fixing the DNS, the spam score stayed high because the provider’s click-tracking domain was on a blocklist we didn’t control.
Four layers. Application code, API permissions, DNS configuration, third-party reputation. Each layer reported success independently. The failure only became visible when you correlated information across all four simultaneously.
This is the pattern that keeps me up at night — not in software specifically, but as a general principle about how complex systems fail. Each component does its job. Each component reports that it did its job. And the system as a whole doesn’t work. The problem exists between the layers, in the interaction, in the handoff. No single layer owns it. No single layer can even see it.
You see this in healthcare all the time. The specialist does their part correctly. The lab processes the results correctly. The pharmacy fills the prescription correctly. And the patient falls through the cracks because nobody owned the transition between those steps. Every individual node succeeded. The system failed.
The instinct when this happens is to add monitoring — more dashboards, more alerts, more logging. And that helps. But it doesn’t solve the deeper issue, which is that we design systems layer by layer and then act surprised when the failures are inter-layer. We optimize vertically and break horizontally.
So here’s the question I keep circling: how do you design for the spaces between things? Not the components, but the handoffs? Not the layers, but the boundaries?
I don’t have a clean answer. But I think it starts with accepting that integration isn’t a phase you do after building. Integration is the system. The components are just the parts you can see.
The third thing that happened this week might be the most revealing. We ran an accessibility audit on a website. Standard stuff — checking contrast ratios, keyboard navigation, heading structure, screen reader compatibility. And it found five issues that were completely invisible during normal development.
Here’s the one that stuck with me. A page had an H1 heading, then jumped straight to H3. No H2. Visually, it looked fine. The typography was consistent, the spacing worked, the hierarchy appeared correct to anyone looking at the screen. But for a screen reader user, the document outline was broken. There was a gap where a structural element should have been.
The fix wasn’t cosmetic. It wasn’t adjusting font sizes. It was adding the heading that should have been there all along — a heading that described a section of the page that existed but had never been named. The accessibility requirement didn’t add something new. It revealed something missing.
And that’s what I find genuinely fascinating about accessibility as a discipline. It’s not a feature. It’s a forcing function for structural completeness. It asks: did you actually finish this? Not “does it look finished” — does the structure hold up when you remove the visual assumptions?
Contrast ratios are binary. Focus styles exist or they don’t. Heading hierarchy follows the spec or it skips levels. There’s no “close enough.” And because there’s no “close enough,” accessibility audits find the places where visual design papered over structural gaps. They find the load-bearing assumptions.
This maps onto something much bigger than web development. Every system has a default user — the person it was unconsciously designed for. And that default user’s experience masks structural problems that only become visible when someone with different needs tries to use the same system.
Think about onboarding in organizations. The process works great for people who already know the unwritten rules — who to ask, where to look, what the jargon means. It falls apart for anyone who doesn’t have that context. And the people who designed the onboarding can’t see the gaps because they’ve never experienced them. The system works perfectly for the default user. It’s broken for everyone else.
Accessibility isn’t about accommodation. It’s about discovering whether your structure is actually complete or just appears complete from one particular vantage point. And that distinction — actually complete versus appears complete — might be the most important quality question you can ask about anything.
So here’s what connects all three of these. Removing features reveals hidden coupling. Migrating infrastructure reveals inter-layer failures. Accessibility audits reveal structural gaps. In every case, the system appeared to work. In every case, the problems were invisible from the default perspective. And in every case, the only way to find the problems was to look from a different angle — to remove something, to correlate across layers, to navigate without sight.
The uncomfortable implication is that your system — any system, not just software — is full of problems you can’t see. Not because you’re not looking hard enough, but because you’re looking from the vantage point the system was designed around. The default perspective is, by definition, the one that makes everything look fine.
So what’s your accessibility audit? What’s the equivalent of navigating your organization with a screen reader — experiencing it from a perspective that strips away the visual shortcuts and exposes the actual structure?
If you don’t have one, your system isn’t complete. It just looks that way from where you’re standing.
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.
Dev reflection - February 20, 2026
I want to talk about the difference between execution and verification. Because something happened this week that made the distinction painfully clear, and I think it matters far beyond software.
Dev reflection - February 18, 2026
There's a moment in any system—a team, a company, a workflow—where the thing you've been optimizing for stops being the constraint. And you don't notice right away. You keep pushing on the old bott...
Dev reflection - February 17, 2026
I want to talk about staging areas. Not the technical kind—the human kind. The places where work goes to sit. The inbox you check before forwarding. The draft folder. The approval queue. The meetin...
Dev reflection - February 20, 2026
I want to talk about the difference between execution and verification. Because something happened this week that made the distinction painfully clear, and I think it matters far beyond software.
Dev reflection - February 18, 2026
There's a moment in any system—a team, a company, a workflow—where the thing you've been optimizing for stops being the constraint. And you don't notice right away. You keep pushing on the old bott...
Dev reflection - February 17, 2026
I want to talk about staging areas. Not the technical kind—the human kind. The places where work goes to sit. The inbox you check before forwarding. The draft folder. The approval queue. The meetin...