A Loop Is Seven Things
Thirty-two automated jobs run underneath my days, I wrote every one of them, and I could not hold the system in my head. The problem was never my memory. It was a word. "Loop" was one word doing the work of seven.
Thirty-two automated jobs run underneath my days. They pull my calendar into a repository, watch my money, build my dashboards, mirror my notes to my phone, and I wrote every one of them, one at a time, each on the day I needed it. In theory nobody on earth understands this system better than I do. In practice I could not hold it in my head. I would sit down to reason about the whole and it would slide out of focus, and the more of it I built, the worse the sliding got.
I kept blaming my memory. The problem was a word.
I called all of them loops. The job that pulls the calendar in, a loop. The job that reads a folder and writes a summary, a loop. The job that pushes a file back out to a surface I look at, the job that checks whether the sync is healthy, the job that carries data between two machines, the job whose entire purpose is to run the other jobs in order. Loop, loop, loop. And a single word is a promise that the things underneath it are the same kind of thing. These were not. I was holding one category that was secretly seven, with no name for any of the seven. That is not a memory problem. That is fog, and it was being manufactured at the vocabulary layer, upstream of anything my memory could do about it.
The seven
The sorting took one question. Not what is this loop, which invites a story, but what does this loop do to data, which forces an answer. Asked that way, thirty-two jobs fell into seven kinds, cleanly, with almost no argument at the edges.
Ingest pulls the world into the repository. Calendar, reminders, the things that live out there and have to come in. The world is not always reachable, so an ingest loop has one governing fact of life: its source will be down someday, and it has to shrug rather than crash.
Transform takes data already in the repository and makes more data in the repository. Read a folder, extract, derive, assemble. Nothing enters, nothing leaves. Fourteen of my thirty-two are transforms, which surprised me. Most of the system is the system talking to itself.
Emit pushes the repository back out into the world. A file becomes a calendar event, a mirror on another machine, something that shows up somewhere without my hands on it. An emit writes to the world, so it has to be safe to run twice, because someday it will run twice.
Report writes a snapshot for me to read. A status page, a summary, the thing I open with coffee. For months I filed these as emits, and the split turned out to matter more than any other line I drew. A report has no blast radius. Nothing leaves the machine, nothing downstream fires, and I can regenerate it a hundred times at no cost. Emit and report look identical from a distance. One can hurt me and one cannot, and a typology that cannot tell those apart is not finished.
Watch reads the state of the system and returns a verdict. Is the sync healthy. Is the money system green or red. Not data, judgment. And the sharpest rule in the whole grammar belongs here: a watch must never write data. The moment a watcher starts producing data it stops being the thing that tells me the truth and becomes one more thing I need the truth about.
Transport moves data between machines. Two of these. No transformation, no opinion, just carrying.
Orchestrate fires the others in the right order. There is exactly one, and its product is not data at all. Its product is sequence.
Ingest, transform, emit, report, watch, transport, orchestrate. The whole zoo, and not one loop among the thirty-two needed a story to place it.
Why the fog lifted
A word as vague as "loop" cannot carry rules. It told me nothing about how any job was allowed to behave, so there were no rules, so every job was a special case I had to remember individually, and thirty-two special cases is past what I can remember. That was the fog. Not too many things. Too many things with no grammar.
A type carries rules the way "loop" never could. Say "this is an emit" and idempotence arrives with the word. Say "this is a watch" and never-writes-data arrives with the word. I did not get better at remembering my system. I stopped needing to remember it, because the knowledge moved out of my memory and into the vocabulary, and vocabulary does not get tired. The full set of contracts, and the one rule no type hands you for free, grew into its own essay.
The types also caught a second overloaded word, and this one stung, because I had built it myself. Each loop carried a field called its tier, and the tiers had never cohered no matter how I rearranged them. Typing the loops showed me why. Some tier values described what a loop was for. Others described how much it hurts when the loop fails. Two different questions, one slot. It was "loop" all over again, a single word quietly doing the work of two, and the repair was the same repair. Split the axes. What it does. How loudly it fails. What clock it runs on. Whether it is a loop I drive or a loop that drives me, because biology and money-weather run on their own schedules and I only get to observe and align. Four plain fields, and a frustration I had carried for months dissolved without any code changing at all.
Naming is not the paperwork you do after the thinking. Naming is the thinking. Both times, the confusion was never in the loops. It was in the words I had draped over them.
What the types were waiting to show me
Typing each loop made it legible alone. It did not show me the shape of all of them together, and the shape is where the real payoff was waiting: drawn as a graph, the pile I had feared as a tangle turned out to be a short critical chain with one load-bearing root, which is a different essay. It also turned out that none of this territory was uncharted, that I had reinvented a known discipline by hand, and that the discovery was a relief rather than an embarrassment. That is a different essay too.
What belongs here is the part I keep turning over. The seven types were not imposed. They were extracted. They had been in the loops the whole time, latent in what each script actually did, and sorting by behavior did not create the typology, it uncovered one that was already true. That is the same move I make when I map any domain: go into a territory that will not resolve, find the structure that was already there under the noise, and draw it. The only difference is where the territory was. This time it was my own machine, built by my own hands, and it still needed charting, which tells you something about how little "I built it" has to do with "I can see it."
So now I have a diagnostic I expect to use for the rest of my life. When a pile of things you understand individually refuses to cohere as a whole, stop studying the things. Go find the word that is secretly plural. The fog is almost never in the system. It is in a name, holding seven kinds of thing in one syllable, waiting for you to ask what each one actually does.