Proof of concept mechanical port of ircnet/ircd to Rust as part of a bit about C being insecure for network services
0

Configure Feed

Select the types of activity you want to include in your feed.

docs(create-blogpost): retire character asides and name the voice tells

Update the series skill to match the de-asided posts and the audit
findings.

- Replace the "character asides as blockquotes" convention with an
explicit no-asides rule; both technical tangents and reaction beats
go inline in one first-person voice.
- Drop the now-obsolete blockquote clause from the hard paragraph rule.
- Expand the sound-like-a-person step with the five recurring tells the
series-wide audit surfaced, each with its fix.
- Add reaching-for-asides and the five tells to the anti-patterns.

Assisted-by: Claude Opus 4.8 via Claude Code
Signed-off-by: Xe Iaso <me@xeiaso.net>

+41 -15
+41 -15
.claude/skills/create-blogpost/SKILL.md
··· 3 3 description: Use when asked to "work on another blogpost" / "write the next post" for the docs/blog/ series narrating the ircd.rs C→Rust port. Covers picking a topic, the locked format conventions, grounding claims in real source, the hard paragraph rule, and the mandatory voice passes. 4 4 --- 5 5 6 - # Writing the next docs/blog/ post 6 + # Writing the next blog post 7 7 8 8 ## Overview 9 9 10 - `docs/blog/` is a numbered, public-facing series in **Xe Iaso's voice** narrating 10 + `docs/site/content/blog/` is a numbered, public-facing series in **Xe Iaso's voice** narrating 11 11 the strangler-fig C→Rust port of IRCnet ircd 2.11. "Work on another blogpost" 12 12 means write the next `00N-*.md`. One post = one topic, written for peers. 13 13 14 14 This is a faithful-port project, so the posts are **technically load-bearing**: 15 15 every claim must be grounded in the actual code, plan, or specs — never 16 - hand-waved. The whole series' throughline is *honesty over hype* (build the 16 + hand-waved. The whole series' throughline is _honesty over hype_ (build the 17 17 oracle first; don't round 98% up to 100%). Match that. 18 18 19 19 **Two skill invocations are mandatory** (do not skip either): 20 + 20 21 1. `/xe-writing:xe-writing-style` — before drafting (calibrates voice). 21 22 2. `/xe-writing:sound-like-a-person` — after drafting (six humanizing passes). 22 23 ··· 49 50 ### 4. Gather real source material 50 51 51 52 Ground the post in fact before drafting. Pull from: 53 + 52 54 - `PLAN.md` (the phase plan, the keystone-hazard table, locked decisions). 53 55 - `docs/superpowers/plans/` and `docs/superpowers/specs/` (the per-phase 54 56 design docs — these have the precise "why we did X not Y" reasoning). ··· 61 63 ### 5. Draft to the locked format 62 64 63 65 Frontmatter — plain markdown, no JSX imports: 66 + 64 67 ```markdown 65 68 --- 66 69 title: "..." ··· 70 73 ``` 71 74 72 75 Conventions (match the existing posts exactly): 73 - - **Character asides as blockquotes**, not `<Conv>` JSX: 74 - `> **Cadey** (coffee): …` (emotional/reaction beats), 75 - `> **Mara** (hacker): …` (technical context/tangents). 76 + 77 + - **No character asides.** The old `> **Cadey** (coffee): …` / 78 + `> **Mara** (hacker): …` blockquote device is retired — the whole back-catalog 79 + was de-asided. Write everything inline in one first-person voice: technical 80 + tangents (what Mara used to carry) and emotional/reaction beats (Cadey's job) 81 + both go in normal prose paragraphs. No second speaker, no blockquote framing. 76 82 - A **standing disclaimer** that this is an unsanctioned experiment on someone 77 83 else's code — leave the IRCNet team out of it. (Top of 001; bottom coda on the 78 84 others.) ··· 82 88 83 89 ### 6. Enforce the hard paragraph rule 84 90 85 - **No two successive prose paragraphs may start with the same letter.** Blockquote 86 - asides, headers, and code blocks don't count as paragraphs. Audit the whole draft 91 + **No two successive prose paragraphs may start with the same letter.** Headers and 92 + code blocks don't count as paragraphs. Audit the whole draft 87 93 explicitly — list each prose paragraph's opening letter in order and fix 88 94 collisions (including pairs separated only by a header). This rule bites; check it 89 95 every time, and re-check after the voice passes change openers. ··· 91 97 ### 7. Invoke sound-like-a-person 92 98 93 99 Call `/xe-writing:sound-like-a-person`. Run its six passes on the **weakest** 94 - sections — the spots that sound performed rather than lived-in. Typical offenders 95 - in these posts: balanced tricolons, em-dash reveals, wrap-up paragraphs that just 96 - restate the demo above them, and too-tidy quotable endings. Roughen pacing, cut 97 - twin clauses, prefer an imperfect ending over a bow. Then **re-run step 6** (the 98 - passes change paragraph openers) and read it aloud once. 100 + sections — the spots that sound performed rather than lived-in. A series-wide audit 101 + turned up five tells that recur in these posts; check for each by name: 102 + 103 + 1. **Balanced "not X, it's Y" / "X, not Y" antitheses.** The single most common 104 + tell — fine once per post on the strongest beat, manufactured when stacked. 105 + Keep one or two, flatten the rest into plain declaratives that don't pivot on a 106 + negation. 107 + 2. **Restate-the-point closers.** A section lands its point, then a tidy button 108 + re-states it to sound conclusive. Cut the button; let the prior sentence end it. 109 + 3. **Rule-of-three tricolons**, especially one-fragment-per-section recap triads. 110 + Collapse to two uneven clauses so the cadence stops marching. 111 + 4. **Honesty-signaling.** Narrating your own candor ("let me be honest…", "the kind 112 + of small honesty I'd rather log") instead of just stating the fact. State it and 113 + move on. 114 + 5. **Meta-narration.** Pointing at the essay's own structure ("the part worth 115 + telling is…", "this post describes…", "sit with the shape of it"). Delete the 116 + framing, lead straight into the thing. 117 + 118 + Also watch the older offenders: em-dash reveals used as a repeated tic, and too-tidy 119 + quotable endings. Roughen pacing, cut twin clauses, prefer an imperfect ending over 120 + a bow. Then **re-run step 6** (the passes change paragraph openers) and read it 121 + aloud once. 99 122 100 123 ### 8. Commit + update series state 101 124 ··· 109 132 ## Anti-patterns 110 133 111 134 - Skipping either mandatory skill invocation (style before, person after). 112 - - Emitting `<Conv>`/MDX JSX instead of the blockquote asides. 135 + - Reaching for character asides — `> **Cadey**` / `> **Mara**` blockquotes (or 136 + `<Conv>`/MDX JSX). The aside device is gone; fold every beat into plain prose. 137 + - Leaning on the five recurring voice tells in step 7 (antithesis, restate-closer, 138 + tricolon, honesty-signaling, meta-narration). 113 139 - Asserting technical claims without checking the source (this is a 114 - *verifiable-faithfulness* project — wrong claims undermine the whole point). 140 + _verifiable-faithfulness_ project — wrong claims undermine the whole point). 115 141 - Forgetting the successive-paragraph-letter audit. 116 142 - Rounding up: don't claim more is done/Rust/finished than actually is. The 117 143 series' credibility is the product.