[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7BKASFJSQ40K551RW48YWWV":3,"skill-same:01M7BKASFJSQ40K551RW48YWWV":54},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":27,"commitSha":28,"skillDirectory":29,"forksCount":30,"repositoryHtmlUrl":31,"repositoryHomepageUrl":6,"ownerHtmlUrl":32,"ownerBlogUrl":6,"ownerDescription":33,"updatedAt":34,"install":35,"resources":47},"01M7BKASFJSQ40K551RW48YWWV","blog-brand",null,"Establish durable brand and voice context for cross-skill consumption. Generates BRAND.md (audience, positioning, do\u002Fdon't editorial rules, taboo phrases, competitor differentiation) and VOICE.md (existing persona JSON re-expressed as readable prose), both written to the project root. When present, all blog sub-skills auto-load these files before writing or reviewing. Pairs with blog-persona, which manages the structured persona JSON. Use when user says \"blog brand\", \"create brand context\", \"brand voice doc\", \"BRAND.md\", \"VOICE.md\", \"establish editorial brand\", \"brand guidelines for blog\".","om-scogo\u002Fskillsh-scraper","om-scogo","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F160466840?v=4","01M79AWB6DFVCQ7RK70CS34B96","Om Achrekar","01M79AWB6ZM9SKR8KDH1WSSM22",0,"MIT","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fagricidaniel-claude-blog\u002Fblog-brand\u002FSkill.md",[],[],"2026-11-15 14:19:17",false,"---\nname: blog-brand\ndescription: >\n  Establish durable brand and voice context for cross-skill consumption.\n  Generates BRAND.md (audience, positioning, do\u002Fdon't editorial rules, taboo\n  phrases, competitor differentiation) and VOICE.md (existing persona JSON\n  re-expressed as readable prose), both written to the project root. When\n  present, all blog sub-skills auto-load these files before writing or\n  reviewing. Pairs with blog-persona, which manages the structured persona\n  JSON. Use when user says \"blog brand\", \"create brand context\", \"brand\n  voice doc\", \"BRAND.md\", \"VOICE.md\", \"establish editorial brand\",\n  \"brand guidelines for blog\".\nuser-invokable: true\nargument-hint: \"[init|show|update]\"\nlicense: MIT\n---\n\n# Blog Brand: Durable Editorial Context\n\nGenerates two project-root files that every blog sub-skill auto-loads when present:\n\n- `BRAND.md`: who the audience is, what the brand stands for, what to never say\n- `VOICE.md`: how the brand sounds, structurally and lexically\n\nThese are the editorial equivalent of impeccable's PRODUCT.md \u002F DESIGN.md pattern: persistent context that survives across sessions and propagates to every command.\n\n## Why this exists\n\nToday, persona JSON (from `blog-persona`) is loaded by some skills and not others. Topic-cluster context lives inside cluster vaults. Competitor positioning lives nowhere. Each blog command re-derives \"what is the brand\" from whatever context it has.\n\n`BRAND.md` and `VOICE.md` fix this: one canonical source, loaded by the `blog` orchestrator at the start of every command.\n\nWhen neither file exists, behavior is unchanged from v1.7.1. Backward compatible.\n\n## Commands\n\n| Command | Purpose |\n|---|---|\n| `\u002Fblog brand init` | Interactive interview, writes BRAND.md and VOICE.md to project root |\n| `\u002Fblog brand show` | Display current contents (or report missing) |\n| `\u002Fblog brand update` | Re-run the interview with current values as defaults |\n\n## Init Workflow\n\nRun the 5-step interactive interview. Ask each step, wait for response, then proceed. If `blog-persona` JSON already exists, pre-fill voice answers from it.\n\n### Step 1: Audience\n\nAsk:\n- **Primary audience role** (e.g. \"head of marketing at a 50-500 person B2B SaaS\")\n- **Secondary audience** (optional)\n- **Reader expertise level**: beginner \u002F intermediate \u002F advanced \u002F mixed\n- **Problems the reader is actively trying to solve** (3 to 5 bullets)\n- **Common misconceptions the audience holds** (used to anchor information gain)\n\n### Step 2: Positioning\n\nAsk:\n- **One-sentence brand mission** (what the brand helps people do)\n- **Distinctive point of view** (the contrarian or non-obvious belief that shapes content)\n- **What this brand is NOT** (anti-positioning, what to never be confused with)\n- **Top 3 direct competitors** with the one-line differentiator vs each\n\n### Step 3: Editorial rules\n\nAsk:\n- **Do list** (3 to 7 things the blog will always do; e.g. \"cite primary sources only,\" \"name the practitioner not the product\")\n- **Don't list** (3 to 7 things the blog will never do; e.g. \"no clickbait titles,\" \"no listicle filler\")\n- **Taboo phrases** (specific words or phrases this brand never uses; complements but is separate from the AI-detection blocklist)\n- **Required disclosures** (e.g. affiliate disclosure, AI-content disclosure, conflict-of-interest patterns)\n\n### Step 4: Topic boundaries\n\nAsk:\n- **Topics fully in scope** (core content pillars)\n- **Topics partially in scope** (adjacent; covered only with original angle)\n- **Topics out of scope** (will not cover; redirect to partner content)\n- **Recurring formats \u002F column names** if any (e.g. \"Monthly Field Notes,\" \"Reader Q&A\")\n\n### Step 5: Voice (auto-fill from blog-persona if present)\n\nAsk:\n- **Pronoun stance**: first-person (we \u002F I), second-person (you), third-person (the team), or mixed\n- **Acceptable contractions**: full \u002F partial \u002F none\n- **Sentence ceiling**: max words per sentence as a hard cap\n- **Paragraph ceiling**: max words per paragraph (default 150)\n- **Headline patterns to favor**: numbered \u002F question \u002F promise \u002F statement\n- **Headline patterns to avoid**: any patterns banned for this brand\n- **Summary box label**: from blog-persona, or pick one\n\n## Output Files\n\n### BRAND.md template\n\nWrite to project root as:\n\n```markdown\n# Brand Context\n\n> This file is auto-loaded by all blog sub-skills. Last updated: YYYY-MM-DD.\n\n## Audience\n\n- **Primary**: [role + context]\n- **Secondary**: [if any]\n- **Expertise**: [level]\n- **Active problems**:\n  - [problem 1]\n  - [problem 2]\n  - [problem 3]\n- **Common misconceptions**:\n  - [misconception 1]\n  - [misconception 2]\n\n## Positioning\n\n- **Mission**: [one sentence]\n- **Distinctive POV**: [contrarian or non-obvious belief]\n- **What we are NOT**: [anti-positioning]\n- **Competitors**:\n  - [Competitor A]: [our one-line differentiator]\n  - [Competitor B]: [our one-line differentiator]\n  - [Competitor C]: [our one-line differentiator]\n\n## Editorial Rules\n\n### Always do\n- [rule 1]\n- [rule 2]\n- [rule 3]\n\n### Never do\n- [rule 1]\n- [rule 2]\n- [rule 3]\n\n### Taboo phrases\n- [phrase 1]\n- [phrase 2]\n\n### Required disclosures\n- [disclosure rule]\n\n## Topic Scope\n\n- **In scope**: [pillars]\n- **Partial scope**: [adjacent topics]\n- **Out of scope**: [topics to refuse]\n- **Recurring formats**: [if any]\n```\n\n### VOICE.md template\n\nWrite to project root as:\n\n```markdown\n# Voice Context\n\n> This file is auto-loaded by all blog sub-skills. Last updated: YYYY-MM-DD.\n\n## Pronoun stance\n[first-person \u002F second-person \u002F third-person \u002F mixed]\n\n## Lexical rules\n- **Contractions**: [full \u002F partial \u002F none]\n- **Sentence ceiling**: [N words max]\n- **Paragraph ceiling**: [N words max, default 150]\n- **Summary label**: [Key Takeaways \u002F TL;DR \u002F etc.]\n\n## Headline patterns\n- **Favor**: [list]\n- **Avoid**: [list]\n\n## Voice fingerprint (from blog-persona)\n- Funny vs serious: [0.0 to 1.0]\n- Formal vs casual: [0.0 to 1.0]\n- Respectful vs irreverent: [0.0 to 1.0]\n- Enthusiastic vs matter-of-fact: [0.0 to 1.0]\n\n## Readability target\n- Audience tier: [consumer \u002F professional \u002F technical]\n- Flesch Grade: [range]\n- Flesch Ease: [range]\n\n## Reference samples\n- [URL 1] (extracted patterns: [summary])\n- [URL 2] (extracted patterns: [summary])\n```\n\n## Show Workflow\n\n1. Check for `BRAND.md` and `VOICE.md` at project root.\n2. If both exist, print a summary table (key sections only) and the file paths.\n3. If one or both are missing, print which are missing and suggest `\u002Fblog brand init`.\n\n## Update Workflow\n\nSame as Init, but pre-fills every answer with the current value. The user can press enter to accept or type a new value. After collecting all answers, overwrite both files with the new contents and update the `Last updated:` line.\n\n## Integration with the blog orchestrator\n\nWhen `\u002Fblog write`, `\u002Fblog rewrite`, `\u002Fblog brief`, `\u002Fblog outline`, `\u002Fblog calendar`, or `\u002Fblog strategy` runs, the orchestrator (`skills\u002Fblog\u002FSKILL.md`) checks for `BRAND.md` and `VOICE.md` at the project root. If present, the contents are injected into the system prompt for downstream agents (`blog-researcher`, `blog-writer`, `blog-seo`, `blog-reviewer`).\n\nIf absent, behavior is unchanged. The orchestrator does not prompt the user to create them; they are opt-in context.\n\n## Relationship to blog-persona\n\n| Concern | blog-persona | blog-brand |\n|---|---|---|\n| Structured persona JSON for programmatic use | Yes | No |\n| Readable brand context for cross-skill prompts | No | Yes |\n| Audience and positioning | No | Yes |\n| Taboo phrases and editorial don'ts | Partial (don't list) | Full (taboo + disclosures + scope) |\n| Competitor differentiation | No | Yes |\n| Topic boundaries | No | Yes |\n| Voice fingerprint (tone sliders) | Yes (canonical) | Mirror (read-only) |\n\n`blog-brand` does not replace `blog-persona`; it consumes it. The persona JSON remains the source of truth for tone dimensions, sentence-length distribution, and contraction frequency. `VOICE.md` mirrors the readable parts so prompts are self-contained.\n\nIf no persona exists when `\u002Fblog brand init` runs, the voice questions still produce a `VOICE.md`. Users who want programmatic enforcement can run `\u002Fblog persona create` after.\n\n## Error Handling\n\n- **Project root unclear**: ask the user where to write the files. Default is the current working directory.\n- **Files already exist on init**: ask whether to overwrite or run update instead.\n- **Persona referenced but missing**: ask whether to leave the persona reference blank or create one.\n- **Reader provides minimal answers**: prompt for at least 2 audience bullets and 3 editorial rules; refuse to write skeletons.\n","# Blog Brand: Durable Editorial Context\n\nGenerates two project-root files that every blog sub-skill auto-loads when present:\n\n- `BRAND.md`: who the audience is, what the brand stands for, what to never say\n- `VOICE.md`: how the brand sounds, structurally and lexically\n\nThese are the editorial equivalent of impeccable's PRODUCT.md \u002F DESIGN.md pattern: persistent context that survives across sessions and propagates to every command.\n\n## Why this exists\n\nToday, persona JSON (from `blog-persona`) is loaded by some skills and not others. Topic-cluster context lives inside cluster vaults. Competitor positioning lives nowhere. Each blog command re-derives \"what is the brand\" from whatever context it has.\n\n`BRAND.md` and `VOICE.md` fix this: one canonical source, loaded by the `blog` orchestrator at the start of every command.\n\nWhen neither file exists, behavior is unchanged from v1.7.1. Backward compatible.\n\n## Commands\n\n| Command | Purpose |\n|---|---|\n| `\u002Fblog brand init` | Interactive interview, writes BRAND.md and VOICE.md to project root |\n| `\u002Fblog brand show` | Display current contents (or report missing) |\n| `\u002Fblog brand update` | Re-run the interview with current values as defaults |\n\n## Init Workflow\n\nRun the 5-step interactive interview. Ask each step, wait for response, then proceed. If `blog-persona` JSON already exists, pre-fill voice answers from it.\n\n### Step 1: Audience\n\nAsk:\n- **Primary audience role** (e.g. \"head of marketing at a 50-500 person B2B SaaS\")\n- **Secondary audience** (optional)\n- **Reader expertise level**: beginner \u002F intermediate \u002F advanced \u002F mixed\n- **Problems the reader is actively trying to solve** (3 to 5 bullets)\n- **Common misconceptions the audience holds** (used to anchor information gain)\n\n### Step 2: Positioning\n\nAsk:\n- **One-sentence brand mission** (what the brand helps people do)\n- **Distinctive point of view** (the contrarian or non-obvious belief that shapes content)\n- **What this brand is NOT** (anti-positioning, what to never be confused with)\n- **Top 3 direct competitors** with the one-line differentiator vs each\n\n### Step 3: Editorial rules\n\nAsk:\n- **Do list** (3 to 7 things the blog will always do; e.g. \"cite primary sources only,\" \"name the practitioner not the product\")\n- **Don't list** (3 to 7 things the blog will never do; e.g. \"no clickbait titles,\" \"no listicle filler\")\n- **Taboo phrases** (specific words or phrases this brand never uses; complements but is separate from the AI-detection blocklist)\n- **Required disclosures** (e.g. affiliate disclosure, AI-content disclosure, conflict-of-interest patterns)\n\n### Step 4: Topic boundaries\n\nAsk:\n- **Topics fully in scope** (core content pillars)\n- **Topics partially in scope** (adjacent; covered only with original angle)\n- **Topics out of scope** (will not cover; redirect to partner content)\n- **Recurring formats \u002F column names** if any (e.g. \"Monthly Field Notes,\" \"Reader Q&A\")\n\n### Step 5: Voice (auto-fill from blog-persona if present)\n\nAsk:\n- **Pronoun stance**: first-person (we \u002F I), second-person (you), third-person (the team), or mixed\n- **Acceptable contractions**: full \u002F partial \u002F none\n- **Sentence ceiling**: max words per sentence as a hard cap\n- **Paragraph ceiling**: max words per paragraph (default 150)\n- **Headline patterns to favor**: numbered \u002F question \u002F promise \u002F statement\n- **Headline patterns to avoid**: any patterns banned for this brand\n- **Summary box label**: from blog-persona, or pick one\n\n## Output Files\n\n### BRAND.md template\n\nWrite to project root as:\n\n```markdown\n# Brand Context\n\n> This file is auto-loaded by all blog sub-skills. Last updated: YYYY-MM-DD.\n\n## Audience\n\n- **Primary**: [role + context]\n- **Secondary**: [if any]\n- **Expertise**: [level]\n- **Active problems**:\n  - [problem 1]\n  - [problem 2]\n  - [problem 3]\n- **Common misconceptions**:\n  - [misconception 1]\n  - [misconception 2]\n\n## Positioning\n\n- **Mission**: [one sentence]\n- **Distinctive POV**: [contrarian or non-obvious belief]\n- **What we are NOT**: [anti-positioning]\n- **Competitors**:\n  - [Competitor A]: [our one-line differentiator]\n  - [Competitor B]: [our one-line differentiator]\n  - [Competitor C]: [our one-line differentiator]\n\n## Editorial Rules\n\n### Always do\n- [rule 1]\n- [rule 2]\n- [rule 3]\n\n### Never do\n- [rule 1]\n- [rule 2]\n- [rule 3]\n\n### Taboo phrases\n- [phrase 1]\n- [phrase 2]\n\n### Required disclosures\n- [disclosure rule]\n\n## Topic Scope\n\n- **In scope**: [pillars]\n- **Partial scope**: [adjacent topics]\n- **Out of scope**: [topics to refuse]\n- **Recurring formats**: [if any]\n```\n\n### VOICE.md template\n\nWrite to project root as:\n\n```markdown\n# Voice Context\n\n> This file is auto-loaded by all blog sub-skills. Last updated: YYYY-MM-DD.\n\n## Pronoun stance\n[first-person \u002F second-person \u002F third-person \u002F mixed]\n\n## Lexical rules\n- **Contractions**: [full \u002F partial \u002F none]\n- **Sentence ceiling**: [N words max]\n- **Paragraph ceiling**: [N words max, default 150]\n- **Summary label**: [Key Takeaways \u002F TL;DR \u002F etc.]\n\n## Headline patterns\n- **Favor**: [list]\n- **Avoid**: [list]\n\n## Voice fingerprint (from blog-persona)\n- Funny vs serious: [0.0 to 1.0]\n- Formal vs casual: [0.0 to 1.0]\n- Respectful vs irreverent: [0.0 to 1.0]\n- Enthusiastic vs matter-of-fact: [0.0 to 1.0]\n\n## Readability target\n- Audience tier: [consumer \u002F professional \u002F technical]\n- Flesch Grade: [range]\n- Flesch Ease: [range]\n\n## Reference samples\n- [URL 1] (extracted patterns: [summary])\n- [URL 2] (extracted patterns: [summary])\n```\n\n## Show Workflow\n\n1. Check for `BRAND.md` and `VOICE.md` at project root.\n2. If both exist, print a summary table (key sections only) and the file paths.\n3. If one or both are missing, print which are missing and suggest `\u002Fblog brand init`.\n\n## Update Workflow\n\nSame as Init, but pre-fills every answer with the current value. The user can press enter to accept or type a new value. After collecting all answers, overwrite both files with the new contents and update the `Last updated:` line.\n\n## Integration with the blog orchestrator\n\nWhen `\u002Fblog write`, `\u002Fblog rewrite`, `\u002Fblog brief`, `\u002Fblog outline`, `\u002Fblog calendar`, or `\u002Fblog strategy` runs, the orchestrator (`skills\u002Fblog\u002FSKILL.md`) checks for `BRAND.md` and `VOICE.md` at the project root. If present, the contents are injected into the system prompt for downstream agents (`blog-researcher`, `blog-writer`, `blog-seo`, `blog-reviewer`).\n\nIf absent, behavior is unchanged. The orchestrator does not prompt the user to create them; they are opt-in context.\n\n## Relationship to blog-persona\n\n| Concern | blog-persona | blog-brand |\n|---|---|---|\n| Structured persona JSON for programmatic use | Yes | No |\n| Readable brand context for cross-skill prompts | No | Yes |\n| Audience and positioning | No | Yes |\n| Taboo phrases and editorial don'ts | Partial (don't list) | Full (taboo + disclosures + scope) |\n| Competitor differentiation | No | Yes |\n| Topic boundaries | No | Yes |\n| Voice fingerprint (tone sliders) | Yes (canonical) | Mirror (read-only) |\n\n`blog-brand` does not replace `blog-persona`; it consumes it. The persona JSON remains the source of truth for tone dimensions, sentence-length distribution, and contraction frequency. `VOICE.md` mirrors the readable parts so prompts are self-contained.\n\nIf no persona exists when `\u002Fblog brand init` runs, the voice questions still produce a `VOICE.md`. Users who want programmatic enforcement can run `\u002Fblog persona create` after.\n\n## Error Handling\n\n- **Project root unclear**: ask the user where to write the files. Default is the current working directory.\n- **Files already exist on init**: ask whether to overwrite or run update instead.\n- **Persona referenced but missing**: ask whether to leave the persona reference blank or create one.\n- **Reader provides minimal answers**: prompt for at least 2 audience bullets and 3 editorial rules; refuse to write skeletons.\n",{"name":5,"license":15,"description":24,"argument-hint":25,"user-invokable":26},"Establish durable brand and voice context for cross-skill consumption. Generates BRAND.md (audience, positioning, do\u002Fdon't editorial rules, taboo phrases, competitor differentiation) and VOICE.md (existing persona JSON re-expressed as readable prose), both written to the project root. When present, all blog sub-skills auto-load these files before writing or reviewing. Pairs with blog-persona, which manages the structured persona JSON. Use when user says \"blog brand\", \"create brand context\", \"brand voice doc\", \"BRAND.md\", \"VOICE.md\", \"establish editorial brand\", \"brand guidelines for blog\".\n","[init|show|update]",true,"main","8859218955d9504cd18b59e7892100718039d3b4","data\u002Fskills\u002Fagricidaniel-claude-blog\u002Fblog-brand",1,"https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper","https:\u002F\u002Fgithub.com\u002Fom-scogo","SDE-1 @ Scogo ","2026-07-18 12:22:46",{"source":8,"skillName":5,"commands":36,"prompt":46,"zipAvailable":26},[37,40,43],{"tool":38,"command":39},"npx","npx skills add om-scogo\u002Fskillsh-scraper --skill blog-brand",{"tool":41,"command":42},"bunx","bunx skills add om-scogo\u002Fskillsh-scraper --skill blog-brand",{"tool":44,"command":45},"pnpm","pnpm dlx skills add om-scogo\u002Fskillsh-scraper --skill blog-brand","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fagricidaniel-claude-blog\u002Fblog-brand\u002FSkill.md",[48],{"path":49,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":52,"sourceHtmlUrl":53},"metadata.json","REFERENCE","参考文档",444,"https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fagricidaniel-claude-blog\u002Fblog-brand\u002Fmetadata.json",[55,62,67,74,79,86],{"skillNo":56,"name":57,"nameZh":6,"description":58,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":59,"categories":60,"keywords":61,"publishedAt":19},"01M7D6MC9FAAEV4CMNYX8W7JTG","arxiv-search","Search arXiv physics, math, and computer science preprints using natural language queries. Powered by Valyu semantic search.","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fyorkeccak-scientific-skills\u002Farxiv-search\u002Fskills\u002Farxiv-search\u002FSKILL.md",[],[],{"skillNo":63,"name":57,"nameZh":6,"description":58,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":19},"01M7D6M85CKKN87TA98VCQV4H7","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fyorkeccak-scientific-skills\u002Farxiv-search\u002FSkill.md",[],[],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":19},"01M7D4ZTCS4DR3CE4JY06X84T2","working-with-legacy-code","Safely change and test untested codebases using Feathers' \"Working Effectively with Legacy Code\". Use when the user mentions \"legacy code\", \"no tests\", \"untested codebase\", \"how do I test this\", \"seams\", \"characterization tests\", \"golden master\", \"sprout method\", \"afraid to change this code\", \"monster method\", \"dependency breaking\", or \"inherited a messy codebase\". Also trigger when changing code without tests safely, getting a class under test when constructors, statics, or singletons block it, adding features to tangled modules, or planning incremental test coverage for an old codebase. Covers the legacy-code change algorithm, seams, characterization tests, sprout\u002Fwrap, and dependency-breaking techniques. For refactoring code that already has tests, see refactoring-patterns. For day-to-day code quality, see clean-code.","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fworking-with-legacy-code\u002Fworking-with-legacy-code\u002FSKILL.md",[],[],{"skillNo":75,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":19},"01M7D4ZHZKJD2RSNGAF63V14P4","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fworking-with-legacy-code\u002FSkill.md",[],[],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":19},"01M7D4ZB4CJBFW5JE67CPH2QRV","web-typography","Select, pair, and implement typefaces for web projects. Use when the user mentions \"font pairing\", \"which typeface\", \"line height\", \"responsive typography\", \"web font loading\", \"type hierarchy\", \"variable fonts\", \"FOUT\u002FFOIT\", \"typographic scale\", or \"the text is hard to read\". Also trigger when choosing between system fonts and web fonts, optimizing font-loading performance, or designing readable long-form content. Covers readability evaluation, CSS implementation, and performance optimization. For overall UI design systems, see refactoring-ui. For dramatic typographic experiences, see top-design.","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fweb-typography\u002Fweb-typography\u002FSKILL.md",[],[],{"skillNo":87,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":19},"01M7D4Z4MVYVY3NMJ18BNV6WNA","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fweb-typography\u002FSkill.md",[],[]]