Seventeen systems that keep arriving at the same three answers — an exact key instead of a similarity score, a boring store instead of a new one, and a human standing where the output leaves the building.

Solo builds2026Five unattended, three never ran

01Where they operate

Each of the seventeen answers the same five questions — where state lives, what is retrieved, who approves, what starts it, what happens when it breaks — and each one wrote its answers down before this page existed. Plotting the answers against the layers a system can have puts every project in one of four shapes, and the shape turns out to predict more about a system than what it is for.

Seventeen systems plotted against six layersA grid of seventeen rows and six columns. The columns are fetch, store, find, model, gate and clock. A square in a cell means the system has that layer. The rows are grouped into four bands. Five systems run on a clock and fill most of the grid; six run when asked and are missing the clock column; three have no model column filled at all, one of them having no filled cell anywhere; and three at the bottom are drawn with hollow squares because their layers are specified and have never run.FETCHSTOREFINDMODELGATECLOCKRUNS ON A CLOCKEventist IntelligenceMinutes RecordingFat Sai LifeOSVTM Agent TeamOffice Punch-ClockRUNS WHEN ASKEDVTM Content LibraryhkboatWTD Virtual KOLVTM Contacts MCPSlash V2.3findmy開心NO MODEL IN THE LOOPCareer DB pipelineBooth PlannerKMB Bus StopDESIGNED, NEVER RUNPropCheckAEO Event Platformaeoseochecker

Six layers, read off the seventeen decision records. Fetch — it goes and gets data from a source it does not own. Store — state survives between runs. Find — something is retrieved at request time. Model — a model call sits inside the loop. Gate — a human approves. Clock — it runs without a person starting it. A solid square means the layer runs; a hollow square means it is specified and never has. Two things are worth staring at. The bottom band is drawn to the same shape as the top band, which is what a system looks like before it has met a schedule. And the last row is empty: the bus-stop model has no store, no model and no clock, and it is in this chapter because the discipline is the same, not the stack.

02The decision matrix

The same five decisions, side by side. Read down a column rather than across a row: a row tells you about one system, a column tells you whether there is a person behind them or seventeen coincidences.

The five columns are not the six architecture layers repeated. They are the decisions that differ between systems: storage covers corpus and index together, selection is the layer of that name, and the human gate is where grounding stops being a schema and becomes a person.

SystemStorageSelectionHuman gateScheduleFailure
RUNS ON A CLOCK
Eventist IntelligenceSupabase Postgres; photos on local diskTrigram index + synonym expansionDB trigger on publish, unskippablelaunchd, ~13 jobs, weekly to nightlyChecks producer: banner, mail, auto-fix
Minutes RecordingDesktop text files; Postgres downstreamFilename is the key; folder is the queueAction items open as pending approvalHotkey to record; hourly watcherNext hourly run retries, dedupe by name
Fat Sai LifeOSSupabase PostgresNone — one source key per observationPending row, human flips before sendlaunchd calendar, 30 min to dailyRun row logs it, missed slots counted
VTM Agent TeamYAML config and dated JSON result filesRefetched CMS inventory, token overlapNone — on publish; escalations queue onlylaunchd, one weekly run, Monday 08:00Rollback to draft, alert mail, skip week
Office Punch-ClockOne Google Sheet, sole source of truthNone — no model, no corpusNone — the tap is input, not approvalBoth badges poll every 5 s, not pushKeeps last state, asks again in 5 s
RUNS WHEN ASKED
VTM Content LibrarySupabase Postgres index, files on diskTrigram over vision text, 3 SQL passesNoneon demand, one refresh scriptset -e halts the run, rerun idempotent
hkboatStatic bundle; progress in localStorageNone — predicate over structured fieldsContact sheet for visual QA of cropsNone — one-off batch run by handUnresolved answer drops the item
WTD Virtual KOLLocal files on disk, no database3 ref clips + 3 audio, 15 s per typeHuman sound and edit pass before publishManual, one clip per runScript exits, no retry; operator re-runs
VTM Contacts MCPEmployer Postgres, stateless serverModel picks one of three SQL filtersNoneOn demand, per assistant question401 restarts auth; logging never blocks
Slash V2.3Postgres behind one repositoryNone — whole ledger filtered in memoryUnmatched category left blank for userNone — paused since 2026-04None — nothing runs unattended
findmy開心Browser localStorage, no server stateNone — weighted draw from a seeded PRNGNoneEach app open replays elapsed daysAnalysis error falls back to a form
NO MODEL IN THE LOOP
Career DB pipelineSupabase Postgres, one career tableNone — keyed join on a bridge slugDry-run diff; --write to touch the fileNone — run by hand before a deployWrong-database guard aborts the run
Booth PlannerJSONB plan row; meshes in object storageNone — catalogue constant, picked by tabNoneNone — user-drivenNone — no unattended run to fail
KMB Bus StopNone — files in the repoNone — no model, no corpus, no queryNone — a human edits a constant, re-runsOn demand, run by handScript raises and stops; nothing written
DESIGNED, NEVER RUN
PropCheckAirtable, waitlist onlyDisplacement threshold, not builtNonePer stay, designed; nothing runsNone — pipeline never ran
AEO Event PlatformDesigned: one canonical row per eventDesigned: all precomputed, no live fetchDesigned: no approval step specifiedDesigned: scheduled crawl of sourcesUndefined — no pipeline has ever run
aeoseocheckerNone — shipped, Postgres specifiedInverted: being retrieved, not readingNoneOn demand per URL, refresh designedNone — no run path exists

Shipped — the system has run and the cell describes what it does. Designed — no pipeline has ever run, so the cell describes what was specified. Every cell is the answer recorded for that system; none of them is a summary of several.

03The vector store

Seventeen systems, and the answer was no seventeen times. That is not a position I set out with, and it is not a position about the technique. It is what the column says after the fact, and the two most useful entries in it are the two where I built the thing first and then watched it sit there.

Eventist Intelligence carried vector columns on three tables in its first schema; nothing ever populated them and a later migration dropped all three. Fat Sai LifeOS created an embeddings table with a cosine index on the assumption that recalling past work would need semantic search; nothing ever wrote to it and nothing ever read it. In both cases what people actually typed was a client, a venue, a year, a piece of equipment, a project key, a date — structured attributes, answerable by an index that can point at the row that matched.

The other fifteen reasons fall into three shapes. Some systems have no corpus at all, so the model sees only what the request carries: one meeting that fits a prompt whole, one CV read outward, three reference clips. Some have a corpus small and concrete enough that an exact filter beats a score: fifty-four catalogue items reached by a category tab, a 503-item question bank filtered by part and topic, one table of contact rows, thirty-eight rows frozen into an explicit bridge column, one person’s ledger that loads whole, a few thousand files described in short concrete nouns. And some have a corpus that is not documents at all: a room, differenced as a distance threshold in three-dimensional space; sixteen deterministic protocol checks; a whitelist of facts a writer is permitted to state, which is a permission rather than a recall.

The sentence that keeps recurring across the reasons is that a similarity score always returns something. For an archive whose stated rule is that ambiguous evidence returns nothing, always-something is the wrong answer, and it is wrong in the direction nobody notices.

A vector store earns its place when three things are true together: the corpus is too large or too varied to enumerate, the query is a paraphrase rather than an attribute, and the caller would rather have an approximate answer than none. None of these seventeen had all three. The largest corpus here is over 140,000 photographs, and it is retrieved by project code and a closed vocabulary of tags — because that is what people type. The day those three conditions arrive together I will reach for one. They have not yet, and pretending otherwise would have cost two of these systems a table each. It cost them a table each anyway.

04What the columns show

Postgres is the default, and every exception has one reader

Seven of the seventeen keep state in Postgres, an eighth keeps a JSONB plan row, and a ninth specifies Postgres for an engine that never shipped. The exceptions are not a different taste in databases. Two keep state in the browser because the only reader is the person who wrote it. Two keep it as plain files on disk — local clips in one, a config directory and dated result files in the other. One keeps a single Google Sheet and calls it the sole source of truth — the only system here whose database is a document. And one stores nothing at all: its output is a mesh in a repository. The pattern is not that Postgres is good, it is that the moment a second reader appears the answer stops being interesting.

The gate sits on the way out, and the one system without it paid for it

Seven systems have a human approval step, and every one of them sits on an outbound path: a database trigger on publish that cannot be skipped, a pending row a human flips before anything is sent, a dry run that needs a write flag before it touches a file, an action item that opens as a commitment awaiting approval, a sound-and-edit pass before a clip goes out, a contact sheet before crops are accepted, a category left blank rather than guessed. Ten say none, and nine of those ten never send anything outward unattended — the person pressing the button is the gate. The tenth is the one to stare at: the agent team publishes to a live site on a Monday-morning schedule with no human on the publish path, and pays for it in the failure column with deterministic gates outside the writing agent, a read-back that confirms the write, rollback to draft, an alert mail, and skipping the week rather than shipping.

Five run without being asked; twelve wait

Three run on launchd — roughly thirteen jobs from weekly to nightly, a calendar from every thirty minutes to daily, and one weekly run at Monday 08:00. A fourth is an hourly watcher over a folder. A fifth polls every five seconds, and the record says explicitly that this is a poll and not a push. Everything else is on demand, by hand, or paused, including three where the schedule exists only on paper. Running unattended is the most expensive property in the table, and it was bought five times out of seventeen.

“None” in the failure column means three different things

Where a person starts the run, failure means stop and write nothing: a script that raises and stops, a shell that halts on the first error, a wrong-database guard that aborts, a clip script that exits with no retry. The operator is the retry. Where nothing runs unattended, none means there is nothing that can fail while nobody is watching. And where no pipeline has ever run, none means the system does not exist yet — three rows say that, which is the honest reading of a chapter that also contains three finished products. Only the five systems on a clock have a failure path that recovers instead of stopping, and each recovers in its own idiom: a checks producer feeding a banner, an alert mail and an auto-fix job; a run row that logs the failure and counts the slot it missed; a rollback to draft with an alert and a skipped week; an hourly retry deduplicated by filename; a badge that keeps its last face and asks again in five seconds. Two of those rows show the same trick from different directions: the hourly watcher retries and deduplicates by filename, and the steward re-gathers its whole domain every cycle and deduplicates by source key. What makes a repeat safe in both is the key sitting in the selection column immediately to the left — which is why None in that column is so often the answer of a system that already knows what a thing is.

05The limit

The honest limit is in the same columns. Three of the seventeen have never run, and most of the rest serve one person or one team on machines I control; none has had to survive a corpus, a headcount or a load I did not choose myself. What the table does show is that I made the same call seventeen times with nobody enforcing it — reach for the boring store, buy a schedule only where the work arrives whether or not anyone asks, and stand the human at the point where being wrong is expensive. That is a smaller claim than architecture at scale, and it is the claim the evidence actually supports.

Back to Top