Winning Writing — mode-aware
Source: Rachel Konrad's GSB guest lectures, Heidi Roizen's rules, 25 model letters, live student critiques. Rule library is in rules/catalog.json; mode definitions in rules/modes.json. Full playbook in references/cold_outreach_playbook.md.
Invocation
/winning-writing <mode> "paste draft here"
Where <mode> is one of: cold-email, memo, essay, profile, readme, linkedin-post, or default.
If no mode is given, defaults to default (every rule in the catalog fires). The mode arg filters the catalog to rules tagged with that mode, applies any per-mode severity overrides from modes.json, and applies the mode's target-length check if one is set.
What this skill does on every invocation
- Read
rules/modes.json to get the active mode's definition (label, description, target length, severity overrides).
- Read
rules/catalog.json and filter to rules whose modes array includes the active mode (or the active mode is default).
- Apply per-mode severity overrides to the filtered rules.
- Critique the draft against the filtered list. For each rule, name the rule, quote the failing span, give the suggested rewrite, and cite the rule id so the user can look it up.
- Apply the length check if the active mode declares a
target_words value.
- Return a structured critique with critical issues first, then issues, then warns. End with a clean rewrite of the draft.
Output format (unchanged from prior versions)
## Mode
<mode label> — <one-sentence mode description>
## Flags
### Critical
- <rule id>: <one-sentence why this fires> ("<quoted span>")
Suggested: "<rewrite>"
### Issue
...
### Warn
...
## Length
<word count> / <target> [if mode has target_words]
## Rewrite
<full clean rewrite>
## What changed (3 bullets)
- ...
If no flags fire, say so explicitly: "No flags from the catalog. The draft is clean against the rules; verify the substance separately."
How mode filtering works
Each rule in catalog.json carries a modes array like ["cold-email", "memo", "linkedin-post"]. When you invoke with --mode cold-email, only rules whose modes array includes cold-email fire. The default mode is a catch-all: every rule in the catalog applies.
Severity for a fired rule comes from the rule's severity field, unless the active mode declares an override in severity_overrides. For example: em-dash has base severity issue. In mode cold-email, the override bumps it to critical. In mode essay, no override, so it stays issue.
How to add or edit a rule
- Open
rules/catalog.json.
- Append a new object to
rules[] with id (kebab-case, unique), name, description (the rule itself, plain English), modes (the modes it applies to), severity (critical | issue | warn), and 1-3 examples of before / after.
- To retire a rule, set
"retired": true rather than deleting it. Historical eval runs depend on a stable rule set.
- To make a rule fire harder in a specific mode, add an entry to
modes[<mode>].severity_overrides in modes.json.
How to add a new mode
- Open
rules/modes.json.
- Add a new key under
modes with label, description, target_words (or null), and any severity_overrides.
- Tag the relevant rules in
catalog.json with the new mode name.
Relationship to other skills
- For cold outreach specifically, this skill is usually invoked from the
cold-email orchestrator, which pulls in alex-profile (who is sending) and recipient-research (who is receiving). The rules here apply to the language and structure; the other two skills provide the raw material.
- For PRDs and exec memos, this skill works alongside the
pm-evaluation-framework skills (pm-prd-drafter, pm-evaluator).
- Surgical-edit subskills like
style-tells, vividness, compression (in the public kalyvask/winning-writing repo) do single-pass rewrites for one cluster of rules at a time, picked via the skill's own --target or --mode arg. This skill is the multi-rule critic.
The 10 rules of cold outreach (reference)
The catalog encodes these as individual rules. Read the originals here for context:
- Know something about them and exploit it — encoded as
generic-opener, flattery-opener.
- Begin with something they do not know — encoded as
ai-template-opener, flattery-opener.
- Subject line that cannot be ignored — encoded as
weak-subject.
- Find a mutual contact and name them — discovery, not a rule. The
cold-email orchestrator handles this.
- The "like you" move — encoded as
self-diminishing.
- Tell a story — encoded as
show-dont-tell.
- Pick a lane — encoded as
picks-too-many-lanes.
- Confident but humble — judgment call, not encoded.
- Short with a small, easy ask — encoded as
length-200, vague-ask.
- Offer something in return — encoded as
missing-offer.
Pre-send checklist (cold-email mode only)
Run after the critique passes:
- Subject line: would this person actually open it?
- First sentence: tells them something they don't know?
- "Like you": genuine, specific comparison, not generic?
- Story: one vivid scene with sensory detail?
- How you help them: specifically what you can do for them, not what you want?
- Secret about the future: one insight or thesis they haven't heard?
- Ask: small, specific, easy to say yes to? Door open for no?
- Offer: giving something, not just taking?
- Length: under 200 words?
- Jargon: leverage, align, synergize, drive, impact, strategize, empower, enable all cut?
- Names and details: firm name, spelling, title all checked twice?
- Read aloud: sounds like you, not a ChatGPT template?
- Right person: not jobs@ or pitches@ — actual human?
- Sign-off: has personality (not "Best" or "Sincerely")?
Condensation discipline
When the task is to shorten existing text (not draft new), the move is subtract, not rewrite. Each bad sentence has 1-2 specific cancers — a hedge, a throat-clearer, a euphemism, a presumption. The exercise: identify, excise, stop. Reaching for new fragments, em-dashes, or "helpful" additions after the cut refills the space you just opened. After you cut, don't refill.
Three failure modes to watch for when condensing:
- Register drift. The shortest version isn't the right version if you've moved the reader from a business room to a Slack room. "Want help?" is shorter than "May I help?" but matches a different reader. The catalog rule is
register-mismatch.
- Soft-cope substitution. Stripping "to secure our future" from a layoff sentence is right; replacing it with "to survive" or "to keep the company alive" is the same sin in shorter form. Verb + object. Trust the reader to supply context. The catalog rule is
soft-cope-substitution.
- Presumptive next-step. "Interested?" beats "Interested? I'll send times." The follow-up sentence forces a structure on a reader who hasn't said yes. The catalog rule is
presumptive-next-step.
If you can't condense without restructuring, the original sentence's problem isn't length — it's that the wrong verb is doing the work. Find the working verb, lead with it, stop.
When you finish
Hand back: (a) the structured critique in the format above, (b) a clean rewrite, (c) a flag for any factual claim the user needs to verify before sending.
Full playbook with all examples, critiques, and commentary: references/cold_outreach_playbook.md.
1---2name: winning-writing3description: Mode-aware writing critic. Distilled from Rachel Konrad's Stanford GSB "Winning Writing" course (spring 2026), the 10 rules of cold outreach, Heidi Roizen's mailing rules, and live class critiques. Loads a rule catalog (rules/catalog.json) and a mode definition (rules/modes.json) at invocation. Use whenever drafting or critiquing a cold email, outreach message, LinkedIn intro, exec memo, personal essay, bio, README, or LinkedIn post. Pass a mode argument to filter which rules apply.4---56# Winning Writing — mode-aware78Source: Rachel Konrad's GSB guest lectures, Heidi Roizen's rules, 25 model letters, live student critiques. Rule library is in `rules/catalog.json`; mode definitions in `rules/modes.json`. Full playbook in `references/cold_outreach_playbook.md`.910## Invocation1112```13/winning-writing <mode> "paste draft here"14```1516Where `<mode>` is one of: `cold-email`, `memo`, `essay`, `profile`, `readme`, `linkedin-post`, or `default`.1718If no mode is given, defaults to `default` (every rule in the catalog fires). The mode arg filters the catalog to rules tagged with that mode, applies any per-mode severity overrides from `modes.json`, and applies the mode's target-length check if one is set.1920## What this skill does on every invocation21221. **Read `rules/modes.json`** to get the active mode's definition (label, description, target length, severity overrides).232. **Read `rules/catalog.json`** and filter to rules whose `modes` array includes the active mode (or the active mode is `default`).243. **Apply per-mode severity overrides** to the filtered rules.254. **Critique the draft** against the filtered list. For each rule, name the rule, quote the failing span, give the suggested rewrite, and cite the rule id so the user can look it up.265. **Apply the length check** if the active mode declares a `target_words` value.276. **Return** a structured critique with critical issues first, then issues, then warns. End with a clean rewrite of the draft.2829## Output format (unchanged from prior versions)3031```32## Mode33<mode label> — <one-sentence mode description>3435## Flags3637### Critical38- <rule id>: <one-sentence why this fires> ("<quoted span>")39 Suggested: "<rewrite>"4041### Issue42...4344### Warn45...4647## Length48<word count> / <target> [if mode has target_words]4950## Rewrite51<full clean rewrite>5253## What changed (3 bullets)54- ...55```5657If no flags fire, say so explicitly: *"No flags from the <mode> catalog. The draft is clean against the rules; verify the substance separately."*5859## How mode filtering works6061Each rule in `catalog.json` carries a `modes` array like `["cold-email", "memo", "linkedin-post"]`. When you invoke with `--mode cold-email`, only rules whose modes array includes `cold-email` fire. The `default` mode is a catch-all: every rule in the catalog applies.6263Severity for a fired rule comes from the rule's `severity` field, unless the active mode declares an override in `severity_overrides`. For example: `em-dash` has base severity `issue`. In mode `cold-email`, the override bumps it to `critical`. In mode `essay`, no override, so it stays `issue`.6465## How to add or edit a rule66671. Open `rules/catalog.json`.682. Append a new object to `rules[]` with `id` (kebab-case, unique), `name`, `description` (the rule itself, plain English), `modes` (the modes it applies to), `severity` (`critical` | `issue` | `warn`), and 1-3 `examples` of before / after.693. To retire a rule, set `"retired": true` rather than deleting it. Historical eval runs depend on a stable rule set.704. To make a rule fire harder in a specific mode, add an entry to `modes[<mode>].severity_overrides` in `modes.json`.7172## How to add a new mode73741. Open `rules/modes.json`.752. Add a new key under `modes` with `label`, `description`, `target_words` (or null), and any `severity_overrides`.763. Tag the relevant rules in `catalog.json` with the new mode name.7778## Relationship to other skills7980- For cold outreach specifically, this skill is usually invoked from the `cold-email` orchestrator, which pulls in `alex-profile` (who is sending) and `recipient-research` (who is receiving). The rules here apply to the language and structure; the other two skills provide the raw material.81- For PRDs and exec memos, this skill works alongside the `pm-evaluation-framework` skills (`pm-prd-drafter`, `pm-evaluator`).82- Surgical-edit subskills like `style-tells`, `vividness`, `compression` (in the public `kalyvask/winning-writing` repo) do single-pass rewrites for one cluster of rules at a time, picked via the skill's own `--target` or `--mode` arg. This skill is the multi-rule critic.8384## The 10 rules of cold outreach (reference)8586The catalog encodes these as individual rules. Read the originals here for context:87881. **Know something about them and exploit it** — encoded as `generic-opener`, `flattery-opener`.892. **Begin with something they do not know** — encoded as `ai-template-opener`, `flattery-opener`.903. **Subject line that cannot be ignored** — encoded as `weak-subject`.914. **Find a mutual contact and name them** — discovery, not a rule. The `cold-email` orchestrator handles this.925. **The "like you" move** — encoded as `self-diminishing`.936. **Tell a story** — encoded as `show-dont-tell`.947. **Pick a lane** — encoded as `picks-too-many-lanes`.958. **Confident but humble** — judgment call, not encoded.969. **Short with a small, easy ask** — encoded as `length-200`, `vague-ask`.9710. **Offer something in return** — encoded as `missing-offer`.9899## Pre-send checklist (cold-email mode only)100101Run after the critique passes:102103- Subject line: would this person actually open it?104- First sentence: tells them something they don't know?105- "Like you": genuine, specific comparison, not generic?106- Story: one vivid scene with sensory detail?107- How you help them: specifically what you can do for them, not what you want?108- Secret about the future: one insight or thesis they haven't heard?109- Ask: small, specific, easy to say yes to? Door open for no?110- Offer: giving something, not just taking?111- Length: under 200 words?112- Jargon: leverage, align, synergize, drive, impact, strategize, empower, enable all cut?113- Names and details: firm name, spelling, title all checked twice?114- Read aloud: sounds like you, not a ChatGPT template?115- Right person: not jobs@ or pitches@ — actual human?116- Sign-off: has personality (not "Best" or "Sincerely")?117118## Condensation discipline119120When the task is to shorten existing text (not draft new), the move is **subtract, not rewrite**. Each bad sentence has 1-2 specific cancers — a hedge, a throat-clearer, a euphemism, a presumption. The exercise: identify, excise, stop. Reaching for new fragments, em-dashes, or "helpful" additions after the cut refills the space you just opened. **After you cut, don't refill.**121122Three failure modes to watch for when condensing:123124- **Register drift.** The shortest version isn't the right version if you've moved the reader from a business room to a Slack room. "Want help?" is shorter than "May I help?" but matches a different reader. The catalog rule is `register-mismatch`.125- **Soft-cope substitution.** Stripping "to secure our future" from a layoff sentence is right; replacing it with "to survive" or "to keep the company alive" is the same sin in shorter form. Verb + object. Trust the reader to supply context. The catalog rule is `soft-cope-substitution`.126- **Presumptive next-step.** "Interested?" beats "Interested? I'll send times." The follow-up sentence forces a structure on a reader who hasn't said yes. The catalog rule is `presumptive-next-step`.127128If you can't condense without restructuring, the original sentence's problem isn't length — it's that the wrong verb is doing the work. Find the working verb, lead with it, stop.129130## When you finish131132Hand back: (a) the structured critique in the format above, (b) a clean rewrite, (c) a flag for any factual claim the user needs to verify before sending.133134Full playbook with all examples, critiques, and commentary: `references/cold_outreach_playbook.md`.