Thinking
An engineering publication about AI systems that have to work.
Failures, architecture and experiments from building in production — with the evidence and the limits written down.
Every one of these started with something breaking.
13 Claude Skills I pulled out of building this site
Each one started as something that broke here: a fake crawler, an unused vector index, an API key that ran dry. The checklists I wrote while fixing them are now free downloads.
Most of the value is the order of the checks and the things to stop doing, not the scripts.
ReadSeries · 01
The AI Failure Files
Real failures from AI-assisted systems: what broke, why nobody noticed, and the gate that catches it now.
- 01Three bugs that shipped in AI-assisted code, and the gates that catch them nowA hook after an early return, a silent embedding wipe, a reranker that vanished with a dead key. None of them were caught by reading the code.
- 02Reindexing has to be triggered, not assumedAlex OS only re-embeds content when the CMS calls its config-refresh route — a seed script that writes straight to the CMS's MySQL database has to call it manually.
Series · 02
Agent Reality Check
Where agents earn their place, where a deterministic workflow is the better engineering call, and how to tell.
Series · 03
Inside the Architecture
System decomposition, the trade-offs behind it, and what each decision cost.
- 01Content fields are data, not codeBecause content_type_fields and content_items.fields_json are schemaless, adding a field to an existing type never touches existing records.
- 02The CMS keeps the facts, pgvector keeps an optional indexThe CMS's MySQL database is the system of record. pgvector lives in Alex OS's own PostgreSQL database, holds only derived embeddings, and is optional: without it retrieval degrades to keyword scoring.
Series · 04
Things I Would Build Differently
Retrospectives on design, complexity and delivery: the decisions I would now make the other way.
All
Every article
13 Claude Skills I pulled out of building this site
Each one started as something that broke here: a fake crawler, an unused vector index, an API key that ran dry. The checklists I wrote while fixing them are now free downloads.
Three bugs that shipped in AI-assisted code, and the gates that catch them now
A hook after an early return, a silent embedding wipe, a reranker that vanished with a dead key. None of them were caught by reading the code.
Twenty-two buttons is the same as no guidance
The first in-editor AI panel had 22 equally weighted actions. Generating features is cheap now; deciding which one to lead with is the work.
What I let Claude Code do, and what I don't
AI as a pair changes what one person can build. It doesn't change who owns the architecture, the review, or the decision to ship.
Reindexing has to be triggered, not assumed
Alex OS only re-embeds content when the CMS calls its config-refresh route — a seed script that writes straight to the CMS's MySQL database has to call it manually.
The CMS keeps the facts, pgvector keeps an optional index
The CMS's MySQL database is the system of record. pgvector lives in Alex OS's own PostgreSQL database, holds only derived embeddings, and is optional: without it retrieval degrades to keyword scoring.
Content fields are data, not code
Because content_type_fields and content_items.fields_json are schemaless, adding a field to an existing type never touches existing records.