post: 30 days of agent churn kept 23.5万 of 51.8万 lines (EN + ZH)
Deploy / build (push) Successful in 56s
Deploy / build (push) Successful in 56s
The commit-churn post the owner read and approved today, published in the first-person voice he asked for. - Voice rewrite before publishing: the draft opened on "when managers or recruiters ask how productive an engineer is" and addressed the reader in the second person throughout (you/your 12 -> 2, both in the CTA; ZH 你 5 -> 2). It now reads as a log entry: "Last week I did something I almost never bother to do: I counted my own commits." Headings moved from essay titles to actions. Numbers, the 5-repo table and every claim are unchanged. - Title changed at the owner's request: "Why 500,000 Lines of Commit Churn Only Left 230,000 Lines in Production" -> "I Committed 518,000 Lines in 30 Days. Production Kept 235,000." (ZH: 30 天提交 51.8 万行,生产环境只留下 23.5 万行), pubDate 2026-10-18. - Fixed two real defects found while making the card: the draft claimed "four automated gates" and listed three; and og-gen split titles at the word-count midpoint, breaking at "…Lines in / 30 Days" — the splitter now prefers a sentence boundary near the middle and falls back to the midpoint. - og PNG regenerated for the new title, thumbs and banner WebP re-derived. Measured: card 2 title lines, overflowY 0, measure_og_banner PASS (tags 1 row, banner delta 2), build clean, /posts/ monotonic with this post on top. Also queued the post at the head of the dev.to drip (queue 69 -> 70).
This commit is contained in:
1 parent
2060aaa166
commit
0d7384224d
9 files changed
+325
-23
No files matched your search
+22
-20
@@ -176,9 +176,10 @@ the URL — the daily dev.to drip below is the first distribution channel outsid
|
||||
- [x] ✅ **dev.to cross-posting is automated (2026-10-17).** `scripts/devto-crosspost.py` in the Hermes scripts dir
|
||||
(`C:\Users\hoelee\AppData\Local\hermes\scripts\`) publishes **one queued post per day** with `canonical_url`
|
||||
pointing at the blog original, from a Hermes **no_agent cron** (`devto daily crosspost`, id `ce8fc8bd23e6`,
|
||||
`25 12 * * *`, deliver Telegram). Queue = **69 ranked titles / every live post except three** — `hello-world` (blog intro page),
|
||||
`25 12 * * *`, deliver Telegram). Queue = **70 ranked titles / every live post except two** — `hello-world` (blog intro page),
|
||||
`how-i-made-my-own-songs-with-suno-ai` (8 `<audio>` players + a lyric `<script>` that dev.to's sanitiser strips)
|
||||
and the held-for-review post — at **one per day ≈ 2.3 months**. `devto-state.json` makes it idempotent per slug;
|
||||
— at **one per day ≈ 2.3 months**. The post that had been held for review joined the queue on top on 2026-10-18,
|
||||
the day it published. `devto-state.json` makes it idempotent per slug;
|
||||
the API key lives in `~/.secrets/devto-api-key.txt`, never in the repo. **Two guards added the same day:** an
|
||||
entry is refused while its frontmatter still says `draft: true` or its blog URL is not HTTP 200 (a transient
|
||||
5xx after 3 retries aborts the whole run instead of skipping, so queue order is never reshuffled by a tunnel
|
||||
@@ -759,31 +760,32 @@ start, so publishing added no pages. The number in that message is wrong; the de
|
||||
carry **no prose links** — every post they would naturally cite is dated later, and a backdated post may only link
|
||||
backwards. Their "related posts" rows are the theme's automatic ones, which every backdated post already has.
|
||||
|
||||
**Step B2p — (unplanned) The commit-churn post, held for the read (written 2026-10-17 04:00).** 🔵
|
||||
**Step B2p — (unplanned) The commit-churn post.** ✅ Published 2026-10-18 (`55b1f08`), after the owner's read and a voice rewrite
|
||||
|
||||
| Slug | Category | `pubDate` | Source |
|
||||
|---|---|---|---|
|
||||
| `why-500000-lines-of-commit-churn-only-left-230000-in-production` | `engineering` | 2026-10-17 | Hermes session 2026-10-17 |
|
||||
| `why-500000-lines-of-commit-churn-only-left-230000-in-production` | `engineering` | 2026-10-18 | Hermes session 2026-10-17 |
|
||||
|
||||
- **What it argues:** thirty days of autonomous-agent work across five self-hosted Gitea repos = 865 commits, 518,233
|
||||
additions, 130,892 deletions — and production kept 235,000 lines. Verification gates and pruning, not generation
|
||||
speed, are what survive.
|
||||
- **State (all of it measured 2026-10-17, not carried over from the writing session):** EN + ZH written;
|
||||
og + banner generated and **measured** (`scripts/measure_og_banner.py` → OG `rows=1 overflow=0`, banner 7 rows
|
||||
`delta=2 overflow=0`); local build clean at **250 `index.html` pages** with both `dist/` pages present; the generator
|
||||
changes are **purely additive** (`git diff --numstat` 8/0 and 18/0, `node --check` OK on both).
|
||||
**Not committed, not pushed** — four files (EN + ZH `.md`, og + banner PNG, plus the generator delta) sit in the working
|
||||
tree on purpose: publication gate, the owner has not read it.
|
||||
- ⚠ **This entry is the record of that hold.** Without it the next session reads the untracked files as someone else's
|
||||
in-flight work (or as already-published) — the same failure the skill warns about.
|
||||
- **Preview for the owner:** `cd dist && python -m http.server 8899 --bind 127.0.0.1`, then
|
||||
`/posts/why-500000-lines-of-commit-churn-only-left-230000-in-production/` and its `/posts/zh/…` twin.
|
||||
- **To publish on his go-ahead:** confirm the real date (`date` + the newest `<time>` on the live `/posts/`), then
|
||||
`git add` the four explicit paths, commit, push `origin main` **and** `github main`, verify the four URLs 200 and the
|
||||
`/posts/` order still monotonic. The `TERMINALS`/`BANNERS` entries ride along (whole-file staging) and stay inert until
|
||||
that slug is generated.
|
||||
- ⚠ **Kill the 8899 preview server once he has read it** — a wedged `python -m http.server` from the writing session was
|
||||
still holding the port on 2026-10-17 and served an empty response.
|
||||
- **The owner's read changed two things (both before publishing):**
|
||||
1. **Voice.** The draft opened *"When managers or recruiters ask how productive an engineer is…"* and kept addressing
|
||||
the reader in the second person (`you have to move beyond the chat box`, `If your Git log shows…`) — it read like a
|
||||
LinkedIn think-piece rather than a log entry, and it framed the post as written *for* recruiters. Rewritten in the
|
||||
first person (EN `you/your` 12 → 2, both in the CTA; ZH 你 5 → 2), headings changed from essay titles to actions
|
||||
(`What the agents actually touch`, `What changed in how I work`). All numbers, the table and the claims are
|
||||
unchanged — this was a voice edit, not a new draft.
|
||||
2. **Title.** `Why 500,000 Lines of Commit Churn Only Left 230,000 Lines in Production` →
|
||||
**`I Committed 518,000 Lines in 30 Days. Production Kept 235,000.`** (ZH: `30 天提交 51.8 万行,生产环境只留下 23.5 万行`).
|
||||
- **Two real defects found while fixing the card:** the draft said *"four automated gates"* and then listed **three**
|
||||
(now fixed to three); and `og-gen`'s title splitter broke at the word-count midpoint, which put the break at
|
||||
`…Lines in / 30 Days` — the splitter now prefers a sentence boundary near the middle and falls back to the midpoint
|
||||
(`.og/gen` measured afterwards: 2 title lines, `overflowY 0`, `measure_og_banner.py` PASS · tags 1 row · banner delta 2).
|
||||
- **State:** EN + ZH written and rewritten; og PNG regenerated for the new title, thumbs + banner WebP re-derived
|
||||
(`optimize-images.py`), build clean, `/posts/` order monotonic with the post on top at 2026-10-18.
|
||||
- ⚠ The four files were held **untracked** for two days on purpose (publication gate). Nothing else is held now.
|
||||
|
||||
|
||||
**Step B2m — The next-session topic queue (user decision 2026-10-16).** ⬜
|
||||
|
||||
|
||||
Reference in new issue
Block a user