From 13c1c699dc107fe48d6d163292433fa6715b707c Mon Sep 17 00:00:00 2001 From: Lea Yeh Date: Tue, 16 Jun 2026 16:03:11 +0200 Subject: [PATCH 1/2] feat(blog): add bilingual blog skill with mandatory stop-slop de-slop Add /blog skill: interactively distill a valuable session into a bilingual (zh-TW + en) technical blog post, staged as a draft in the lyeh-infra Hugo blog. Vendor the MIT-licensed stop-slop skill (hardikpandya/stop-slop) and wire it as a mandatory de-slop pass before any draft is written. Register both plugins in marketplace.json. Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude-plugin/marketplace.json | 20 +++ plugins/blog/.claude-plugin/plugin.json | 7 + plugins/blog/skills/blog/PUBLISHING.md | 55 +++++++ plugins/blog/skills/blog/SKILL.md | 58 ++++++++ plugins/stop-slop/.claude-plugin/plugin.json | 8 ++ plugins/stop-slop/LICENSE | 21 +++ plugins/stop-slop/skills/stop-slop/SKILL.md | 68 +++++++++ .../skills/stop-slop/references/examples.md | 59 ++++++++ .../skills/stop-slop/references/phrases.md | 128 +++++++++++++++++ .../skills/stop-slop/references/structures.md | 134 ++++++++++++++++++ 10 files changed, 558 insertions(+) create mode 100644 plugins/blog/.claude-plugin/plugin.json create mode 100644 plugins/blog/skills/blog/PUBLISHING.md create mode 100644 plugins/blog/skills/blog/SKILL.md create mode 100644 plugins/stop-slop/.claude-plugin/plugin.json create mode 100644 plugins/stop-slop/LICENSE create mode 100644 plugins/stop-slop/skills/stop-slop/SKILL.md create mode 100644 plugins/stop-slop/skills/stop-slop/references/examples.md create mode 100644 plugins/stop-slop/skills/stop-slop/references/phrases.md create mode 100644 plugins/stop-slop/skills/stop-slop/references/structures.md diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 3f0cb57..279fade 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -216,6 +216,26 @@ "source": "./plugins/grill-graph", "category": "development", "homepage": "https://github.com/LeaYeh/skills" + }, + { + "name": "blog", + "description": "Interactively distill a valuable session into a bilingual (zh + en) technical blog post and stage it as a draft in the lyeh-infra Hugo blog", + "author": { + "name": "Lea Yeh" + }, + "source": "./plugins/blog", + "category": "productivity", + "homepage": "https://github.com/LeaYeh/skills" + }, + { + "name": "stop-slop", + "description": "Remove AI writing patterns from prose — cut filler, break formulaic structures, score on 5 dimensions. Use when drafting, editing, or reviewing text to eliminate predictable AI tells", + "author": { + "name": "Hardik Pandya" + }, + "source": "./plugins/stop-slop", + "category": "productivity", + "homepage": "https://github.com/hardikpandya/stop-slop" } ] } diff --git a/plugins/blog/.claude-plugin/plugin.json b/plugins/blog/.claude-plugin/plugin.json new file mode 100644 index 0000000..dbbf99f --- /dev/null +++ b/plugins/blog/.claude-plugin/plugin.json @@ -0,0 +1,7 @@ +{ + "name": "blog", + "description": "Interactively distill a valuable session into a bilingual (zh + en) technical blog post and stage it as a draft in the lyeh-infra Hugo blog", + "author": { "name": "Lea Yeh" }, + "category": "productivity", + "homepage": "https://github.com/LeaYeh/skills" +} diff --git a/plugins/blog/skills/blog/PUBLISHING.md b/plugins/blog/skills/blog/PUBLISHING.md new file mode 100644 index 0000000..e352f36 --- /dev/null +++ b/plugins/blog/skills/blog/PUBLISHING.md @@ -0,0 +1,55 @@ +# Publishing mechanics (Hugo + Blowfish) + +Hugo source: `/apps/portal/src` (default `~/project/git_dev/lyeh-infra/apps/portal/src`). +Posts live in `content/posts/` as flat files. Existing posts use **YAML** front matter (`---`), not TOML. + +## File naming (bilingual) + +One slug, two language files in `content/posts/`: + +``` +content/posts/.en.md +content/posts/.zh.md +``` + +`` is kebab-case, English, descriptive (e.g. `gitops-self-hosting-on-k3s`). + +## Front matter + +Identical keys in both files; `title`/`summary` translated, `translationKey` shared so Hugo links the two as translations. + +```yaml +--- +title: "" +date: <YYYY-MM-DD> # get the real date at runtime: `date +%Y-%m-%d` — never hardcode +draft: true # ALWAYS true; the user publishes manually +tags: ["Tag1", "Tag2"] # same tags both languages, English tag names +summary: "<1–2 sentence summary in this file's language>" +translationKey: "<slug>" # SAME value in both .en.md and .zh.md +--- +``` + +## One-time i18n setup (do once, then skip) + +The blog ships English-only. Before writing the first zh post, check for `config/_default/languages.zh.toml`. If missing, create it and the matching menu, modelled on the existing `.en.toml` files: + +`config/_default/languages.zh.toml` +```toml +locale = "zh-tw" +label = "中文" +weight = 2 +title = "Lea Yeh" + +[params] + displayName = "中文" + isoCode = "zh-tw" + rtl = false + dateFormat = "2006年1月2日" + description = "資深軟體工程師 · 資料工程 · MLOps · 系統架構" +``` + +Copy `config/_default/menus.en.toml` to `config/_default/menus.zh.toml`, translating only the visible labels. Leave `hugo.toml`'s `defaultContentLanguage = "en"` as-is — Hugo auto-merges `languages.<lang>.toml`, so adding the file is enough to enable the language switcher. Confirm with the user before editing config; mention it in the hand-off. + +## Preview + +From the Hugo source dir: `hugo server -D` (the `-D` flag renders drafts). Drafts are excluded from production builds until `draft: true` is removed. diff --git a/plugins/blog/skills/blog/SKILL.md b/plugins/blog/skills/blog/SKILL.md new file mode 100644 index 0000000..f105733 --- /dev/null +++ b/plugins/blog/skills/blog/SKILL.md @@ -0,0 +1,58 @@ +--- +name: blog +description: Turn a valuable working session into a polished, bilingual (zh-TW + en) public technical blog post and stage it as a draft in the lyeh-infra Hugo blog. Manually triggered with /blog when the user feels the current session produced an insight worth publishing. Use when the user says "/blog", "write this up", "blog this", "把這個寫成文章", or wants to capture the value/lessons of a session as an article. +--- + +# Blog + +Distill the **value and insight** of the current session into a public technical article, co-written through interview, then stage it as a bilingual Hugo draft. This is a flexible, conversational skill — never auto-publish. + +Discussion in Traditional Chinese (zh-TW); article content in both zh-TW and English. + +## Blog location + +Default Hugo source: `~/project/git_dev/lyeh-infra/apps/portal/src` (posts in `content/posts/`). +If that path does not exist, ask the user for the blog repo path before writing anything. + +## Workflow + +### 1. Free description +Ask the user to describe, in their own words, what they found valuable about this session. Let them ramble — do not interrupt with questions yet. + +### 2. Mine the session +Review the actual conversation/session context and pre-fill a draft of these dimensions. Show the user what you extracted so they can correct it: + +1. **Hook** — the problem or itch that drove this; why a reader should care +2. **Context** — the setup, constraints, what was tried before +3. **Turning point / core insight** — the non-obvious thing learned (the heart of the post) +4. **How it works** — the concrete solution, with code/config snippets where they earn their place +5. **Trade-offs / what I'd do differently** — the honesty that makes it credible +6. **Takeaway** — what the reader should remember and can reuse + +### 3. Interview to fill gaps +Interview the user **one question at a time**, grill-me style, only on the dimensions still thin or ambiguous after step 2. For each question, offer your recommended answer. Goal: sharpen the angle and surface the insight — not interrogate the design. Stop when the six dimensions are solid and the article's spine is clear. + +### 4. Converge on an outline +Propose a title + section outline. Get a thumbs-up before drafting full prose. + +### 5. Write the bilingual draft +Write the **English** post first, then the **zh-TW** translation (idiomatic, not literal — adapt examples and phrasing for a Chinese-reading developer). See [PUBLISHING.md](PUBLISHING.md) for exact front matter, file naming, and the one-time i18n setup. + +### 6. De-slop — mandatory +Before writing any post to disk, you **MUST** invoke the `stop-slop` skill and run the English prose through its rules and scoring. Revise until it scores ≥ 35/50. Apply the same anti-AI-tell principles to the zh-TW version (cut filler, active voice, varied rhythm, no em dashes, trust the reader). A draft that has not passed stop-slop is not finished — do not skip this step even under time pressure. + +### 7. Hand off — never commit +Report: +- the file paths written (both languages) +- how to preview locally (`hugo server -D` from the Hugo source dir) +- a reminder that `draft = true`; the user flips it and commits/pushes themselves when ready + +Do not run `git add`, `git commit`, or `git push`. + +## Principles + +- **Insight over chronology.** A blog post is not a session transcript. Lead with the lesson; cut the dead-ends unless a dead-end *is* the lesson. +- **Show, don't summarize.** Prefer a real code/config snippet or a small table over hand-waving. +- **Honest trade-offs build trust.** Always include what didn't work or what you'd change. +- **Bilingual parity.** Both versions carry the same insight; the zh-TW one reads natively, not as a translation. +- **No slop, ever.** Every draft passes the `stop-slop` skill before it touches disk. No throat-clearing openers, no em dashes, no "not X but Y" contrasts, no narrator-from-a-distance voice. diff --git a/plugins/stop-slop/.claude-plugin/plugin.json b/plugins/stop-slop/.claude-plugin/plugin.json new file mode 100644 index 0000000..3224a72 --- /dev/null +++ b/plugins/stop-slop/.claude-plugin/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "stop-slop", + "description": "Remove AI writing patterns from prose — cut filler, break formulaic structures, score on 5 dimensions. Use when drafting, editing, or reviewing text to eliminate predictable AI tells", + "author": { "name": "Hardik Pandya", "url": "https://hvpandya.com" }, + "category": "productivity", + "homepage": "https://github.com/hardikpandya/stop-slop", + "license": "MIT" +} diff --git a/plugins/stop-slop/LICENSE b/plugins/stop-slop/LICENSE new file mode 100644 index 0000000..e0ede9b --- /dev/null +++ b/plugins/stop-slop/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Hardik Pandya + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/stop-slop/skills/stop-slop/SKILL.md b/plugins/stop-slop/skills/stop-slop/SKILL.md new file mode 100644 index 0000000..83f2032 --- /dev/null +++ b/plugins/stop-slop/skills/stop-slop/SKILL.md @@ -0,0 +1,68 @@ +--- +name: stop-slop +description: Remove AI writing patterns from prose. Use when drafting, editing, or reviewing text to eliminate predictable AI tells. +metadata: + trigger: Writing prose, editing drafts, reviewing content for AI patterns + author: Hardik Pandya (https://hvpandya.com) +--- + +# Stop Slop + +Eliminate predictable AI writing patterns from prose. + +## Core Rules + +1. **Cut filler phrases.** Remove throat-clearing openers, emphasis crutches, and all adverbs. See [references/phrases.md](references/phrases.md). + +2. **Break formulaic structures.** Avoid binary contrasts, negative listings, dramatic fragmentation, rhetorical setups, false agency. See [references/structures.md](references/structures.md). + +3. **Use active voice.** Every sentence needs a human subject doing something. No passive constructions. No inanimate objects performing human actions ("the complaint becomes a fix"). + +4. **Be specific.** No vague declaratives ("The reasons are structural"). Name the specific thing. No lazy extremes ("every," "always," "never") doing vague work. + +5. **Put the reader in the room.** No narrator-from-a-distance voice. "You" beats "People." Specifics beat abstractions. + +6. **Vary rhythm.** Mix sentence lengths. Two items beat three. End paragraphs differently. No em dashes. + +7. **Trust readers.** State facts directly. Skip softening, justification, hand-holding. + +8. **Cut quotables.** If it sounds like a pull-quote, rewrite it. + +## Quick Checks + +Before delivering prose: + +- Any adverbs? Kill them. +- Any passive voice? Find the actor, make them the subject. +- Inanimate thing doing a human verb ("the decision emerges")? Name the person. +- Sentence starts with a Wh- word? Restructure it. +- Any "here's what/this/that" throat-clearing? Cut to the point. +- Any "not X, it's Y" contrasts? State Y directly. +- Three consecutive sentences match length? Break one. +- Paragraph ends with punchy one-liner? Vary it. +- Em-dash anywhere? Remove it. +- Vague declarative ("The implications are significant")? Name the specific implication. +- Narrator-from-a-distance ("Nobody designed this")? Put the reader in the scene. +- Meta-joiners ("The rest of this essay...")? Delete. Let the essay move. + +## Scoring + +Rate 1-10 on each dimension: + +| Dimension | Question | +|-----------|----------| +| Directness | Statements or announcements? | +| Rhythm | Varied or metronomic? | +| Trust | Respects reader intelligence? | +| Authenticity | Sounds human? | +| Density | Anything cuttable? | + +Below 35/50: revise. + +## Examples + +See [references/examples.md](references/examples.md) for before/after transformations. + +## License + +MIT diff --git a/plugins/stop-slop/skills/stop-slop/references/examples.md b/plugins/stop-slop/skills/stop-slop/references/examples.md new file mode 100644 index 0000000..0376b6d --- /dev/null +++ b/plugins/stop-slop/skills/stop-slop/references/examples.md @@ -0,0 +1,59 @@ +# Before/After Examples + +## Example 1: Throat-Clearing + Binary Contrast + +**Before:** +> "Here's the thing: building products is hard. Not because the technology is complex. Because people are complex. Let that sink in." + +**After:** +> "Building products is hard. Technology is manageable. People aren't." + +**Changes:** Removed opener, binary contrast structure, and emphasis crutch. Direct statements. + +--- + +## Example 2: Filler + Unnecessary Reassurance + +**Before:** +> "It turns out that most teams struggle with alignment. The uncomfortable truth is that nobody wants to admit they're confused. And that's okay." + +**After:** +> "Teams struggle with alignment. Nobody admits confusion." + +**Changes:** Cut hedging ("most"), removed throat-clearing phrases, deleted permission-granting ending. + +--- + +## Example 3: Business Jargon Stack + +**Before:** +> "In today's fast-paced landscape, we need to lean into discomfort and navigate uncertainty with clarity. This matters because your competition isn't waiting." + +**After:** +> "Move faster. Your competition is." + +**Changes:** Eliminated jargon entirely. Core message in six words. + +--- + +## Example 4: Dramatic Fragmentation + +**Before:** +> "Speed. Quality. Cost. You can only pick two. That's it. That's the tradeoff." + +**After:** +> "Speed, quality, cost—pick two." + +**Changes:** Single sentence. No performative emphasis. + +--- + +## Example 5: Rhetorical Setup + +**Before:** +> "What if I told you that the best teams don't optimize for productivity? Here's what I mean: they optimize for learning. Think about it." + +**After:** +> "The best teams optimize for learning, not productivity." + +**Changes:** Direct claim. No rhetorical scaffolding. diff --git a/plugins/stop-slop/skills/stop-slop/references/phrases.md b/plugins/stop-slop/skills/stop-slop/references/phrases.md new file mode 100644 index 0000000..f9234fe --- /dev/null +++ b/plugins/stop-slop/skills/stop-slop/references/phrases.md @@ -0,0 +1,128 @@ +# Phrases to Remove + +## Throat-Clearing Openers + +Remove these announcement phrases. State the content directly. + +- "Here's the thing:" +- "Here's what [X]" +- "Here's this [X]" +- "Here's that [X]" +- "Here's why [X]" +- "The uncomfortable truth is" +- "It turns out" +- "The real [X] is" +- "Let me be clear" +- "The truth is," +- "I'll say it again:" +- "I'm going to be honest" +- "Can we talk about" +- "Here's what I find interesting" +- "Here's the problem though" + +Any "here's what/this/that" construction is throat-clearing before the point. Cut it and state the point. + +## Emphasis Crutches + +These add no meaning. Delete them. + +- "Full stop." / "Period." +- "Let that sink in." +- "This matters because" +- "Make no mistake" +- "Here's why that matters" + +## Business Jargon + +Replace with plain language. + +| Avoid | Use instead | +|-------|-------------| +| Navigate (challenges) | Handle, address | +| Unpack (analysis) | Explain, examine | +| Lean into | Accept, embrace | +| Landscape (context) | Situation, field | +| Game-changer | Significant, important | +| Double down | Commit, increase | +| Deep dive | Analysis, examination | +| Take a step back | Reconsider | +| Moving forward | Next, from now | +| Circle back | Return to, revisit | +| On the same page | Aligned, agreed | + +## Adverbs + +Kill all adverbs. No -ly words. No softeners, no intensifiers, no hedges. + +Specific offenders: + +- "really" +- "just" +- "literally" +- "genuinely" +- "honestly" +- "simply" +- "actually" +- "deeply" +- "truly" +- "fundamentally" +- "inherently" +- "inevitably" +- "interestingly" +- "importantly" +- "crucially" + +Also cut these filler phrases: + +- "At its core" +- "In today's [X]" +- "It's worth noting" +- "At the end of the day" +- "When it comes to" +- "In a world where" +- "The reality is" + +## Meta-Commentary + +Remove self-referential asides. The essay should move, not announce its own structure. + +- "Hint:" +- "Plot twist:" / "Spoiler:" +- "You already know this, but" +- "But that's another post" +- "X is a feature, not a bug" +- "Dressed up as" +- "The rest of this essay explains..." +- "Let me walk you through..." +- "In this section, we'll..." +- "As we'll see..." +- "I want to explore..." + +## Performative Emphasis + +False intimacy or manufactured sincerity: + +- "creeps in" +- "I promise" +- "They exist, I promise" + +## Telling Instead of Showing + +Announcing difficulty or significance rather than demonstrating it: + +- "This is genuinely hard" +- "This is what leadership actually looks like" +- "This is what X actually looks like" +- "actually matters" + +## Vague Declaratives + +Sentences that announce importance without naming the specific thing. Kill these. + +- "The reasons are structural" +- "The implications are significant" +- "This is the deepest problem" +- "The stakes are high" +- "The consequences are real" + +If a sentence says something is important/deep/structural without showing the specific thing, cut it or replace it with the specific thing. diff --git a/plugins/stop-slop/skills/stop-slop/references/structures.md b/plugins/stop-slop/skills/stop-slop/references/structures.md new file mode 100644 index 0000000..bbcc359 --- /dev/null +++ b/plugins/stop-slop/skills/stop-slop/references/structures.md @@ -0,0 +1,134 @@ +# Structures to Avoid + +## Binary Contrasts + +These create false drama. State the point directly. + +| Pattern | Problem | +|---------|---------| +| "Not because X. Because Y." / "Not because X, but because Y." | Telegraphed reversal | +| "[X] isn't the problem. [Y] is." | Formulaic reframe | +| "The answer isn't X. It's Y." | Predictable pivot | +| "It feels like X. It's actually Y." | Setup/reveal cliche | +| "The question isn't X. It's Y." | Rhetorical misdirection | +| "Not X. But Y." / "not X, it's Y" / "isn't X, it's Y" | Mechanical contrast | +| "It's not this. It's that." | Same formula, different words | +| "stops being X and starts being Y" | False transformation arc | +| "doesn't mean X, but actually Y" | Negation-then-assertion crutch | +| "is about X but not Y" | False distinction | +| "not just X but also Y" | Additive hedge | + +**Instead:** State Y directly. "The problem is Y." "Y matters here." Drop the negation entirely. + +## Negative Listing + +Listing what something is *not* before revealing what it *is*. A rhetorical striptease. + +| Pattern | Problem | +|---------|---------| +| "Not a X... Not a Y... A Z." | Dramatic buildup through negation | +| "It wasn't X. It wasn't Y. It was Z." | Same structure, past tense | + +**Instead:** State Z. The reader doesn't need the runway. + +## Dramatic Fragmentation + +Sentence fragments for emphasis read as manufactured profundity. + +| Pattern | Problem | +|---------|---------| +| "[Noun]. That's it. That's the [thing]." | Performative simplicity | +| "X. And Y. And Z." | Staccato drama | +| "This unlocks something. [Word]." | Artificial revelation | + +**Instead:** Complete sentences. Trust content over presentation. + +## Rhetorical Setups + +These announce insight rather than deliver it. + +| Pattern | Problem | +|---------|---------| +| "What if [reframe]?" | Socratic posturing | +| "Here's what I mean:" | Redundant preview | +| "Think about it:" | Condescending prompt | +| "And that's okay." | Unnecessary permission | + +**Instead:** Make the point. Let readers draw conclusions. + +## Formulaic Constructions + +| Pattern | Problem | +|---------|---------| +| "By the time X, I was Y." | Narrative template | +| "X that isn't Y" | Indirect. Say "X is broken" | + +## False Agency + +Giving inanimate things human verbs. Complaints don't "become" fixes. Bets don't "live or die." Decisions don't "emerge." A person does something to make those things happen. AI loves this because it avoids naming the actor. + +| Pattern | Problem | +|---------|---------| +| "a complaint becomes a fix" | The complaint did nothing. Someone fixed it. | +| "a bet lives or dies in days" | Bets don't have lifespans. Someone kills the project or ships it. | +| "the decision emerges" | Decisions don't emerge. Someone decides. | +| "the culture shifts" | Cultures don't shift on their own. People change behavior. | +| "the conversation moves toward" | Conversations don't move. Someone steers. | +| "the data tells us" | Data sits there. Someone reads it and draws a conclusion. | +| "the market rewards" | Markets don't reward. Buyers pay for things. | + +**Instead:** Name the human. "The team fixed it that week" beats "the complaint becomes a fix." If no specific person fits, use "you" to put the reader in the seat. + +## Narrator-from-a-Distance + +Floating above the scene instead of putting the reader in it. + +| Pattern | Problem | +|---------|---------| +| "Nobody designed this." | Disembodied observation | +| "This happens because..." | Lecturer voice | +| "This is why..." | Same | +| "People tend to..." | Armchair sociologist | + +**Instead:** Put the reader in the room. "You don't sit down one day and decide to..." beats "Nobody designed this." + +## Passive Voice + +Every sentence needs a subject doing something. Passive voice hides the actor and drains energy. + +| Pattern | Fix | +|---------|-----| +| "X was created" | Name who created it | +| "It is believed that" | Name who believes it | +| "Mistakes were made" | Name who made them | +| "The decision was reached" | Name who decided | + +**Instead:** Find the actor. Put them at the front of the sentence. + +## Sentence Starters to Avoid + +| Pattern | Fix | +|---------|-----| +| Sentences starting with What, When, Where, Which, Who, Why, How | Restructure. Lead with the subject or the verb. | +| Paragraphs starting with "So" | Start with content | +| Sentences starting with "Look," | Remove | + +Wh- openers become a crutch. "What makes this hard is..." becomes "The constraint is..." or better, name the specific constraint. + +## Rhythm Patterns + +| Pattern | Fix | +|---------|-----| +| Three-item lists | Use two items or one | +| Questions answered immediately | Let questions breathe or cut them | +| Every paragraph ends punchily | Vary endings | +| Em-dashes | Remove. Use commas or periods. No em dashes at all. | +| Staccato fragmentation | Don't stack short punchy sentences | +| "Not always. Not perfectly." | Hedging disguised as reassurance | + +## Word Patterns + +| Pattern | Problem | +|---------|---------| +| Lazy extremes (every, always, never, everyone, everybody, nobody) | False authority. Use specifics instead of sweeping claims. | +| All adverbs (-ly words, "really," "just," "literally," "genuinely," "honestly," "simply," "actually") | Empty emphasis. See phrases.md for full list. | From b83bc1775a700a91802c878b293b47ef0fefd921 Mon Sep 17 00:00:00 2001 From: Lea Yeh <lea.yeh.ml@gmail.com> Date: Tue, 16 Jun 2026 16:17:40 +0200 Subject: [PATCH 2/2] fix(settings): declare claude-plugins-official marketplace and enable blog, stop-slop, spec-align CI settings-consistency was failing: swift-lsp@claude-plugins-official referenced an undeclared marketplace, and blog/stop-slop/spec-align were in marketplace.json but not enabled in settings.json. Declare the anthropics/claude-plugins-official marketplace and enable the missing plugins. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --- settings.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/settings.json b/settings.json index 5664da9..036847f 100644 --- a/settings.json +++ b/settings.json @@ -47,6 +47,9 @@ "record-adr@leayeh-skills": true, "architecture-diagram@leayeh-skills": true, "init-project@leayeh-skills": true, + "spec-align@leayeh-skills": true, + "blog@leayeh-skills": true, + "stop-slop@leayeh-skills": true, "understand-anything@understand-anything": true, "superpowers@superpowers-marketplace": true, "swift-lsp@claude-plugins-official": true @@ -81,6 +84,12 @@ "source": "github", "repo": "obra/superpowers-marketplace" } + }, + "claude-plugins-official": { + "source": { + "source": "github", + "repo": "anthropics/claude-plugins-official" + } } }, "remoteControlAtStartup": true,