--- id: P-REINFORCE-AUTO-1FF145 title: Blog Content Rules category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Blogging Rules, Content Standards] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [writing, content, blogging, style] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: markdown framework: hugo-astro --- # Blog Content Rules ## 매 한 줄 > **"매 Great blog post = ONE clear thesis + concrete evidence + minimal friction"**. 2026 zero-click search era에서는 first 50 words가 entire UX를 결정 — LLM AI overview가 이미 답을 미리 보여주기 때문. 매 핵심: 매 reader's time 의 ruthlessly respect, 매 SEO theater 의 최소화. ## 매 핵심 ### 매 Structural rules - **One thesis per post**: 매 sub-thesis의 새 post로 split. - **Inverted pyramid**: 매 conclusion-first — TL;DR 의 top. - **Scannable hierarchy**: H2 마다 self-contained section, 매 reader 의 jump-in 가능. - **Concrete > abstract**: 매 example의 매 claim 의 precede. ### 매 Style rules - **Active voice default** — passive 매 deliberate choice. - **Sentence length variance**: short. 매 medium. 매 occasional longer sentence that establishes context and rhythm before snap. - **No hedging spirals**: "perhaps it might possibly seem that" → cut. - **Tech terms**: define on first use, 매 jargon 의 reader-respect. ### 매 응용 1. Engineering blog post (technical deep-dive, 1500-3000 words). 2. Changelog/release notes (factual, scannable, 200-500 words). 3. Tutorial (step-by-step, runnable code, copy-paste friendly). 4. Opinion/essay (single thesis, supporting evidence, counterargument acknowledged). ## 💻 패턴 ### Frontmatter template (Astro/Hugo) ```yaml --- title: "Concrete claim, not 'Thoughts on X'" description: "1-sentence value proposition under 160 chars for SERP" publishDate: 2026-05-10 updatedDate: 2026-05-10 author: "Name" tags: [primary-tag, secondary-tag] draft: false canonical: "https://blog.example.com/post-slug" ogImage: "/og/post-slug.png" --- ``` ### Lint rules (vale + textlint) ```yaml # .vale.ini StylesPath = styles MinAlertLevel = warning [*.md] BasedOnStyles = Vale, write-good, Microsoft # styles/Custom/Hedges.yml extends: existence message: "Hedge word '%s' — cut or commit." level: warning tokens: - perhaps - maybe - somewhat - quite - rather - seems to ``` ### Reading-time + word-count check ```python import re from pathlib import Path def analyze_post(path: Path) -> dict: text = path.read_text() body = re.sub(r"^---.*?---", "", text, count=1, flags=re.S) words = re.findall(r"\w+", body) n = len(words) return { "words": n, "minutes": round(n / 230), # avg adult reading speed "h2_count": len(re.findall(r"^## ", body, flags=re.M)), "code_blocks": body.count("```") // 2, "links": len(re.findall(r"\[.+?\]\(.+?\)", body)), } ``` ### TL;DR generator (Claude 4.7) ```python from anthropic import Anthropic def generate_tldr(post_md: str) -> str: client = Anthropic() msg = client.messages.create( model="claude-opus-4-7", max_tokens=200, system=("Write a 2-3 sentence TL;DR. State the thesis, the key evidence, " "and one actionable takeaway. No hedging. No 'this post discusses'."), messages=[{"role": "user", "content": post_md[:6000]}], ) return msg.content[0].text ``` ### SEO sanity check ```python def seo_check(frontmatter: dict, body: str) -> list[str]: issues = [] title = frontmatter.get("title", "") desc = frontmatter.get("description", "") if not (10 <= len(title) <= 60): issues.append(f"title length {len(title)} outside 10-60") if not (50 <= len(desc) <= 160): issues.append(f"description length {len(desc)} outside 50-160") if "## " not in body: issues.append("no H2 — flat structure hurts scannability") if body.count("](") < 2: issues.append("fewer than 2 links — orphan post") return issues ``` ### Image optimization (sharp) ```javascript import sharp from "sharp"; async function optimize(input, slug) { await sharp(input) .resize(1200, 630, { fit: "cover" }) .webp({ quality: 82 }) .toFile(`public/og/${slug}.webp`); await sharp(input) .resize(800) .webp({ quality: 80 }) .toFile(`public/img/${slug}.webp`); } ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | Tutorial | Step-numbered, runnable code, prereqs at top | | Opinion piece | Thesis in title, counter-argument paragraph required | | Release notes | Bulleted, version + date, breaking changes flagged | | Long-form essay | Add ToC, 1500+ words, 3-5 H2s | | News/timely | Publish date prominent, update date if revised | **기본값**: 매 post 의 ship before perfect — 매 published-and-iterated 의 unpublished-and-perfect 의 superior. ## 🔗 Graph - 변형: [[Technical Writing]] - 응용: [[Engineering Blog]] - Adjacent: [[SEO]] ## 🤖 LLM 활용 **언제**: TL;DR drafting, headline A/B variants, hedging-word detection, SEO description generation, outline scaffolding. **언제 X**: full-post ghostwriting (매 voice 의 lost), factual claims requiring expertise, opinion pieces (매 author voice required). ## ❌ 안티패턴 - **SEO keyword stuffing**: 매 2026 search era에 penalize됨, reader-trust 의 erode. - **Listicle without substance**: "10 ways to X" with shallow points. - **Buried lede**: 매 thesis 의 paragraph 5 — modern reader 의 already gone. - **Engagement-bait title**: "You won't believe..." — 매 trust-killer. - **Hedging spiral**: 매 every claim 의 qualifier — reader 의 actual position 의 unclear. ## 🧪 검증 / 중복 - Verified (Strunk & White; Zinsser *On Writing Well*; Google Search Quality Rater Guidelines 2025). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-04-20 | Auto-reinforced placeholder | | 2026-05-10 | Manual cleanup — full substantive content, 6 patterns |