post: 30 days of agent churn kept 23.5万 of 51.8万 lines (EN + ZH)
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:
hoelee committed 2026-10-18 17:46:50 +08:00
1 parent 2060aaa166
commit 0d7384224d
9 files changed
+325 -23

No files matched your search

+22 -20
View File
@@ -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).** ⬜