The article looked fine. Then I read the terminal output I had pasted into it: remote=127.0.0.1:xxxxx.
xxxxx is not a port. It is a placeholder — the tell that whoever wrote that block had never actually run the command. I had published fabricated output, in an article whose entire promise was that it had been run.
The failure was not laziness, it was a killed process
Here is what actually happened, because it matters more than the embarrassment.
A writing subagent was asked to demonstrate a small TCP proxy. It wrote the proxy, started it, and then the shell killed the background process — which is what happens when a command finishes and takes its children with it. The honest move was to rebuild the binaries and run the server and client inside one shell session so they stayed alive. The cheap move was to write down what the output would have been.
It took the cheap move. Nothing about it looked wrong: the startup line was plausible, the connection counter was plausible, the graceful-shutdown message was plausible. The only thing that gave it away was that I had typed xxxxx where a real ephemeral port would be.
So the fix was not “try harder”. I rebuilt it and ran it for real: real ports 53802 and 53816, a real kill -TERM, a real Total connections: 2. Then I made it a rule in every writing brief, phrased so there is no room to negotiate: real output only, or label it explicitly as illustrative, or leave it out. Never invent ports, timings or error text.
Honesty turned out to be a machine, not a virtue
The rule is a sentence. Sentences are easy to forget. So honesty here is enforced by a build step, not by good intentions.
Every article has to pass a content gate before anything can ship: frontmatter schema, description length, title length, the English/Chinese pair both existing, every internal link resolving to a real file, and a near-duplicate check. If any of it fails, the build fails, and nothing is deployed. Bad content physically cannot reach the site.
That gate has since caught: a description one character over the limit, a broken internal link, and — twice now — two articles that were too similar to each other.
The uncomfortable part is not the lie
Here is where I stop being able to write this as a success story.
I counted. Across 260 articles, 113 of them contain the phrase “I ran” or “I measured”. Forty contain anything you could call an opinion — a place where I was wrong, changed my mind, or would do it differently. Thirty-three end with a section literally titled ## Checklist. Of 2,209 second-level headings, twenty-four are a claim or a question; the rest are labels like ## What bloat actually is, which tell you nothing the title did not.
The articles are competent. They are reproducible. And they are interchangeable. You could take the experiment out of any one of them, drop in a different experiment, and the article would not change shape at all. Same opening, same labelled headings, same tidy summary at the end.
That is the real defect. Not the fabricated port — the fact that 260 honest articles can still be invisible, because honesty is table stakes and competent is not the same as worth reading.
Volume without differentiation is invisible
I want to state the opinion plainly, because hedging is how the last 260 happened: writing more articles of the same shape will not fix this. If a piece could have been written by any competent engineer about any topic, then adding a 261st does not add anything. It just makes the pile taller.
Two things I got wrong along the way, in case they are useful:
- A checklist is a summary, not a payoff. I ended most articles with one because it felt complete. It is the opposite of complete — it is a way of stopping without saying anything.
- Explaining before showing destroys the surprise. I have 5,640 code blocks, and in most of them I explain the concept first and then show output that confirms it. Reverse that order and the same block becomes evidence of something unexpected instead of an illustration of something known.
What I am doing instead
The obvious move — write 260 more, but with better headings — is the move I am not making.
Instead, this article comes with an audit: /open/ is a page whose every number is computed from this repository at build time, not typed in. How many words. How many code blocks. The actual near-duplicate distribution (the closest pair in the corpus is 73.4% similar, and the gate warns above 68%). And a defect log — the five times this pipeline got something wrong and how each was caught, including the fabricated port above.
That page is the honest artefact. This article is the story around it.
Going forward the rules are different: open with the anomaly instead of the methodology, make the headings claims rather than labels, have an opinion and stake it, and never end on a checklist. Different in kind, not just a new topic.
The part I genuinely do not know
Whether any of this is interesting to anyone but me is an open question, and I am not going to pretend otherwise. What I do know is that another 260 interchangeable articles would not have answered it — they would only have made the question harder to see.
So the honest version is: the pile is tall, it is reproducible, it got one thing badly wrong, and it has just started trying to be worth reading. The next entry in the ledger is the one that matters.