@iceinvein/agent-skills 0.1.19 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,314 @@
1
+ ---
2
+ name: cover-letter-audit
3
+ description: >
4
+ Score a cover letter on a 100-point scale across four categories: content and
5
+ fit (35), structure (20), voice and humanness (25), correctness (20). Detects
6
+ AI-generated-content signals (burstiness, known AI phrase list, vocabulary
7
+ diversity, em-dash count), checks that every claim aligns with the resume,
8
+ validates job-description coverage without keyword stuffing, flags filler
9
+ openers, and produces a prioritized fix list. Works with markdown, DOCX, PDF,
10
+ or pasted letter text. Use when the user says "audit cover letter", "score
11
+ cover letter", "review cover letter", "check cover letter for AI", "does this
12
+ cover letter sound human", "rate my cover letter", "is this cover letter any
13
+ good", or shares a finished letter and asks for feedback.
14
+ argument-hint: "<letter-file-or-text> [--resume <file>] [--jd <file|url|text>] [--format md|json|table]"
15
+ ---
16
+
17
+ # Cover Letter Auditor
18
+
19
+ Score a cover letter and return prioritized fixes. The score combines four
20
+ categories to 100 points. A letter at 85+ is publishable; below 75 needs
21
+ targeted rework; below 60 should be rewritten.
22
+
23
+ ## Inputs
24
+
25
+ Required:
26
+
27
+ - **Letter**: path to `.md`, `.mdx`, `.docx`, `.pdf`, or pasted text.
28
+
29
+ Optional but strongly recommended:
30
+
31
+ - **Resume** (`--resume <file>`): enables evidence-alignment check. Without it,
32
+ skip that subcheck and note this in the report.
33
+ - **Job description** (`--jd <file|url|text>`): enables coverage check. Without
34
+ it, skip that subcheck and note this in the report.
35
+
36
+ Flags:
37
+
38
+ - `--format md|json|table` (default md)
39
+ - `--strict` (tighter thresholds; see "Strict mode" below)
40
+
41
+ ## Parsing
42
+
43
+ Same extraction tools as `cover-letter-write`. If the letter is a DOCX or PDF,
44
+ convert to markdown first via pandoc or pdftotext.
45
+
46
+ ## Scoring rubric
47
+
48
+ Total: 100 points, grouped into four categories. Each check reports points
49
+ earned, max, and a short note.
50
+
51
+ ### 1. Content and Fit (35)
52
+
53
+ | Check | Points | Pass criteria |
54
+ |-------|--------|--------------|
55
+ | Specificity | 8 | Company name and role both present; at least one concrete detail about the company or team (product, mission, tech, recent news) appears in the opening |
56
+ | Evidence alignment (requires resume) | 10 | Every factual claim about the applicant maps to a resume bullet. Minus 2 per unsupported claim. |
57
+ | Evidence quality | 7 | Claims are specific and quantified: numbers, tools, outcomes. Vague claims ("strong communicator") cost 1 point each up to 7. |
58
+ | JD coverage (requires JD) | 6 | Three to five of the top must-haves are covered with real evidence. Fewer than 3 covered costs half. Keyword stuffing (every must-have jammed in) costs 3. |
59
+ | Motivation | 4 | Motivation section names something specific: a product, a problem, a value. Generic enthusiasm earns 0 or 1. |
60
+
61
+ If resume is missing, redistribute the 10 evidence-alignment points: 5 to
62
+ specificity, 5 to evidence quality. If JD is missing, redistribute the 6
63
+ coverage points: 3 to specificity, 3 to motivation.
64
+
65
+ ### 2. Structure (20)
66
+
67
+ | Check | Points | Pass criteria |
68
+ |-------|--------|--------------|
69
+ | Sections present | 5 | Opening hook, fit/evidence, motivation, close all identifiable |
70
+ | Opening | 5 | First sentence is specific and not on the filler-opener list. Generic opener costs all 5 points. |
71
+ | Close | 3 | Two sentences max, no "do not hesitate to contact me", plain sign-off |
72
+ | Length | 4 | Word count within target band (default 250-400, or persona band) |
73
+ | Formatting | 3 | No stray markdown headings, no bullet lists, no tables, no code blocks. Letter reads as prose. |
74
+
75
+ ### 3. Voice and Humanness (25)
76
+
77
+ | Check | Points | Pass criteria |
78
+ |-------|--------|--------------|
79
+ | Burstiness | 7 | Sentence length standard deviation >= 5 words; at least one sentence under 10 words and one over 20 per paragraph |
80
+ | AI phrase count | 6 | Zero phrases from the AI phrase list below. Minus 1 per phrase, down to 0. |
81
+ | Vocabulary diversity (TTR) | 4 | Type-Token Ratio >= 0.5 for letters over 200 words. Below 0.4 earns 0. |
82
+ | Contraction/formality match | 3 | Contraction frequency within persona band (default 0.3-0.6). If no persona, accept 0.2-0.7. |
83
+ | Em-dash count | 2 | Zero em-dashes. Em-dashes are a strong AI-output signal; each one costs both points. |
84
+ | Passive voice | 3 | At most 10% of clauses in passive voice (or persona cap) |
85
+
86
+ #### AI phrase list
87
+
88
+ Flag any occurrence of these, case-insensitive. Extends the blog-analyze list
89
+ with cover-letter-specific killers:
90
+
91
+ Cover-letter specific:
92
+
93
+ 1. "I am writing to express"
94
+ 2. "I am writing to apply"
95
+ 3. "Please accept this letter"
96
+ 4. "It is with great enthusiasm"
97
+ 5. "I believe I would be a great fit"
98
+ 6. "I would be a valuable asset"
99
+ 7. "proven track record"
100
+ 8. "dynamic team"
101
+ 9. "fast-paced environment"
102
+ 10. "hit the ground running"
103
+ 11. "team player"
104
+ 12. "results-driven"
105
+ 13. "detail-oriented"
106
+ 14. "passionate about"
107
+ 15. "excited about the opportunity"
108
+ 16. "hope this message finds you well"
109
+ 17. "do not hesitate to contact me"
110
+ 18. "please do not hesitate"
111
+ 19. "eagerly await your response"
112
+ 20. "look forward to hearing from you"
113
+
114
+ Sentimental cliches (corny / Hallmark-card tells):
115
+
116
+ 21. "hit close to home" / "struck close to home"
117
+ 22. "struck a chord"
118
+ 23. "resonated with me"
119
+ 24. "spoke to me"
120
+ 25. "a dream come true"
121
+ 26. "right up my alley"
122
+ 27. "a perfect fit"
123
+ 28. "meant to be"
124
+ 29. "the stars aligned"
125
+ 30. "at the end of the day"
126
+ 31. "wearing my heart on my sleeve"
127
+ 32. "music to my ears"
128
+
129
+ General AI prose tells:
130
+
131
+ 33. "It's important to note"
132
+ 34. "In today's [adjective] landscape"
133
+ 35. "Delve into"
134
+ 36. "Navigating the complexities"
135
+ 37. "Let's explore"
136
+ 38. "Furthermore"
137
+ 39. "In conclusion"
138
+ 40. "Embark on"
139
+ 41. "Cutting-edge"
140
+ 42. "Leverage" (as a verb)
141
+ 43. "Game-changer"
142
+ 44. "Revolutionize"
143
+ 45. "Streamline"
144
+ 46. "Harness the power"
145
+ 47. "Unlock the potential"
146
+ 48. "World-class"
147
+ 49. "Next-generation"
148
+ 50. "Holistic approach"
149
+ 51. "Spearheaded"
150
+ 52. "Synergies" / "Synergize"
151
+
152
+ ### 4. Correctness (20)
153
+
154
+ | Check | Points | Pass criteria |
155
+ |-------|--------|--------------|
156
+ | No fabrications (requires resume) | 8 | Every specific claim (tool, company, number, duration) traces to the resume. Any invented detail is a critical bug and costs all 8. |
157
+ | No contradictions (requires resume) | 4 | No claim contradicts the resume (wrong dates, wrong employer, wrong role). Any contradiction costs all 4. |
158
+ | Grammar and spelling | 4 | No grammatical errors, no typos. Minus 1 per error up to 4. |
159
+ | Pronoun and tense consistency | 2 | First-person consistent; past roles in past tense; current role in present tense. |
160
+ | Recipient and addressee | 2 | If hiring manager name is provided or discoverable, used correctly. If not, "Dear Hiring Team" or similar. Never "To whom it may concern" unless the JD literally says no name available. |
161
+
162
+ If resume is missing, redistribute the 12 no-fabrication/no-contradiction
163
+ points: 6 to grammar (cap), 4 to pronoun consistency, 2 to addressee.
164
+
165
+ ## Burstiness, TTR, passive voice
166
+
167
+ Compute these from the letter body (exclude the date header, address block,
168
+ and sign-off).
169
+
170
+ - **Burstiness**: standard deviation of sentence lengths in words. Split on
171
+ `.`, `!`, `?`; ignore abbreviations like "Dr.", "Mr.", "Inc.".
172
+ - **TTR**: unique words / total words, lowercased, with punctuation stripped.
173
+ Filter filler words optional but not required.
174
+ - **Passive voice**: count clauses where the main verb is a form of "to be" +
175
+ past participle (was written, is managed, will be built). Express as a
176
+ percentage of total sentences.
177
+
178
+ Report each as a number in the output.
179
+
180
+ ## Strict mode
181
+
182
+ With `--strict`:
183
+
184
+ - Length band tightens to 220-340 words.
185
+ - TTR threshold raises to 0.55.
186
+ - Passive voice cap drops to 7%.
187
+ - Any AI phrase is a critical issue, not a point deduction alone.
188
+ - Em-dash count is critical, not just a point deduction.
189
+
190
+ ## Rating table
191
+
192
+ | Score | Rating | Action |
193
+ |-------|--------|--------|
194
+ | 90-100 | Exceptional | Send as-is |
195
+ | 80-89 | Strong | Light polish on one or two items |
196
+ | 70-79 | Acceptable | Targeted rewrite on lowest-scoring category |
197
+ | 60-69 | Weak | Rewrite recommended; see critical issues first |
198
+ | < 60 | Rewrite | Too many fundamental issues; start from the `cover-letter-write` workflow |
199
+
200
+ ## Report format (default markdown)
201
+
202
+ ```
203
+ ## Cover Letter Audit: [filename or "pasted letter"]
204
+
205
+ **Score: [X]/100 - [Rating]**
206
+
207
+ ### Category breakdown
208
+ | Category | Score | Max | Summary |
209
+ |----------|-------|-----|---------|
210
+ | Content and Fit | X | 35 | [1 line] |
211
+ | Structure | X | 20 | [1 line] |
212
+ | Voice and Humanness | X | 25 | [1 line] |
213
+ | Correctness | X | 20 | [1 line] |
214
+
215
+ ### AI content signals
216
+ - Burstiness (sentence length std dev): [X] ([low/medium/high])
217
+ - AI phrases detected: [N] - [list if any]
218
+ - Vocabulary diversity (TTR): [X] ([below/at/above threshold])
219
+ - Em-dashes: [N] ([pass/fail])
220
+ - Passive voice: [X]% ([within/over cap])
221
+ - **AI probability estimate**: [Low/Medium/High] based on combined signals
222
+
223
+ ### Evidence alignment
224
+ [List of claims and their resume mapping; flag any unsupported]
225
+
226
+ ### JD coverage
227
+ - Must-haves present: [N/N listed]
228
+ - Keyword stuffing detected: [yes/no]
229
+
230
+ ### Issues (ordered by severity)
231
+
232
+ #### Critical
233
+ - [ ] [Specific issue with location and fix]
234
+
235
+ #### High
236
+ - [ ] [...]
237
+
238
+ #### Medium
239
+ - [ ] [...]
240
+
241
+ #### Low
242
+ - [ ] [...]
243
+
244
+ ### Recommended next step
245
+ [One of: "Send as-is", "Apply the Critical fixes then send",
246
+ "Run /cover-letter rewrite <file> --focus <category>", or
247
+ "Run /cover-letter write from scratch"]
248
+ ```
249
+
250
+ ## JSON format (--format json)
251
+
252
+ ```json
253
+ {
254
+ "file": "acme-senior-fe-2026-04-24.md",
255
+ "score": 82,
256
+ "rating": "Strong",
257
+ "categories": {
258
+ "content_fit": { "score": 29, "max": 35 },
259
+ "structure": { "score": 18, "max": 20 },
260
+ "voice_humanness": { "score": 20, "max": 25 },
261
+ "correctness": { "score": 15, "max": 20 }
262
+ },
263
+ "signals": {
264
+ "burstiness": 6.4,
265
+ "ai_phrases": ["proven track record", "passionate about"],
266
+ "ttr": 0.52,
267
+ "em_dashes": 0,
268
+ "passive_voice_pct": 8.1,
269
+ "ai_probability": "low"
270
+ },
271
+ "issues": {
272
+ "critical": [],
273
+ "high": ["Opening sentence is generic"],
274
+ "medium": ["Two AI phrases detected"],
275
+ "low": []
276
+ },
277
+ "recommended_next": "rewrite --focus humanize"
278
+ }
279
+ ```
280
+
281
+ ## Table format (--format table)
282
+
283
+ One-liner for quick triage, useful in batch mode.
284
+
285
+ ```
286
+ File | Score | Rating | Content | Struct | Voice | Correct | AI signals
287
+ acme-senior-fe-2026-04-24.md | 82 | Strong | 29/35 | 18/20 | 20/25 | 15/20 | 2 phrases, TTR 0.52
288
+ ```
289
+
290
+ ## Batch mode
291
+
292
+ When pointed at a directory, audit every `.md`, `.mdx`, `.docx`, `.pdf` file
293
+ in it. Sort by score ascending (worst first). Useful for comparing several
294
+ draft letters before sending.
295
+
296
+ ## How to weigh signals into "AI probability"
297
+
298
+ No single signal is decisive. Combine:
299
+
300
+ - **High risk**: burstiness under 3, TTR under 0.4, three or more AI phrases,
301
+ any em-dashes, generic opener. Three or more of these hits = High.
302
+ - **Medium risk**: one or two of the above hits.
303
+ - **Low risk**: none or one minor.
304
+
305
+ Report High/Medium/Low, not a fake percentage.
306
+
307
+ ## What this skill does not do
308
+
309
+ - Does not rewrite the letter. Route the user to `cover-letter-rewrite` after
310
+ the audit if fixes are needed.
311
+ - Does not infer resume content from the letter. If a resume is not supplied,
312
+ say so explicitly rather than guessing whether a claim is fabricated.
313
+ - Does not check external facts about the company (e.g., whether a named
314
+ product actually exists). The user owns factual accuracy about the employer.
@@ -0,0 +1,231 @@
1
+ ---
2
+ name: cover-letter-persona
3
+ description: >
4
+ Create and manage writing personas for cover letters using the NNGroup 4-dimension
5
+ tone framework (funny-serious, formal-casual, respectful-irreverent, enthusiastic-
6
+ matter-of-fact) adapted for professional correspondence. Personas define readability
7
+ target, sentence length distribution, contraction frequency, passive voice cap, and
8
+ do/don't lists. Used by cover-letter-write and cover-letter-rewrite to enforce a
9
+ consistent voice across all applications. Use when the user says "persona",
10
+ "voice", "tone", "writing style", "make it sound more formal", "more casual",
11
+ "create persona", "use persona", or asks how to tune the voice of their letters.
12
+ argument-hint: "[create|list|use|show|delete] [persona-name]"
13
+ ---
14
+
15
+ # Cover Letter Persona
16
+
17
+ Manage reusable voice profiles. A persona locks in tone, sentence style, and
18
+ vocabulary so every letter the user writes sounds like the same person applied.
19
+
20
+ Default (no persona active) is a mid-formal professional voice. For most
21
+ applicants that is fine; personas matter more for people applying to several
22
+ companies with different cultures, or for writers with a strong distinctive voice
23
+ (creative roles, founders, senior leaders).
24
+
25
+ ## State location
26
+
27
+ Personas live at `~/.config/cover-letter/personas/<name>.json`. Active persona
28
+ is recorded at `~/.config/cover-letter/active-persona` (plain text, one line).
29
+
30
+ Create the directory on first run. Use kebab-case filenames (e.g.,
31
+ `formal-exec.json`, `casual-startup.json`, `technical-deep.json`).
32
+
33
+ ## Commands
34
+
35
+ | Command | Purpose |
36
+ |---------|---------|
37
+ | `/cover-letter persona create [name]` | Interactive interview; writes a new persona file |
38
+ | `/cover-letter persona list` | Show all saved personas |
39
+ | `/cover-letter persona use <name>` | Set the active persona for this session |
40
+ | `/cover-letter persona show <name>` | Print full persona profile |
41
+ | `/cover-letter persona delete <name>` | Remove a persona file (ask to confirm) |
42
+
43
+ ## Create workflow
44
+
45
+ Six steps. Ask each, wait for the answer, move on. Keep the interview short:
46
+ the whole thing should take a minute or two.
47
+
48
+ ### Step 1: Basics
49
+
50
+ Ask:
51
+
52
+ - **Persona name** (kebab-case; suggest one if user gives a description)
53
+ - **Who is this for?** (one sentence: "applying to early-stage startups",
54
+ "applying to law firms", "my default voice for senior eng roles")
55
+ - **What is the applicant's career stage?** (early, mid, senior, exec, changer)
56
+
57
+ ### Step 2: Tone dimensions
58
+
59
+ Present each dimension as 0.0 to 1.0. Explain both ends with cover-letter examples.
60
+
61
+ | Dimension | 0.0 | 1.0 | 0.0 example | 1.0 example |
62
+ |-----------|-----|-----|-------------|-------------|
63
+ | funny_serious | Funny | Serious | "I've spent the last three years trying to make Postgres go fast. Mostly succeeded." | "I have spent three years leading performance initiatives in relational database systems." |
64
+ | formal_casual | Formal | Casual | "I hope this finds you well." | "Hey team," |
65
+ | respectful_irreverent | Respectful | Irreverent | "I admire your commitment to craft." | "Your stack is a mess, and that's exactly why I want the job." |
66
+ | enthusiastic_matter_of_fact | Enthusiastic | Matter-of-fact | "This role is exactly what I've been looking for!" | "This role fits the work I'm already doing." |
67
+
68
+ Defaults if the user is unsure:
69
+
70
+ | Stage | Defaults |
71
+ |-------|----------|
72
+ | Early career | 0.5, 0.5, 0.2, 0.5 |
73
+ | Mid / default | 0.7, 0.55, 0.2, 0.55 |
74
+ | Senior | 0.75, 0.45, 0.25, 0.45 |
75
+ | Exec | 0.85, 0.3, 0.15, 0.4 |
76
+ | Creative / founder | 0.5, 0.7, 0.4, 0.6 |
77
+
78
+ ### Step 3: Writing rules
79
+
80
+ Ask:
81
+
82
+ | Setting | Default | Notes |
83
+ |---------|---------|-------|
84
+ | Readability band | Flesch grade 8-10 | Raise for technical roles (10-12), lower for consumer/creative (7-9) |
85
+ | Target sentence length mean | 16 words | |
86
+ | Sentence length std dev | 8 | Higher std dev = more burstiness = more human |
87
+ | Contraction frequency | 0.4 | 0.0 = never use contractions; 0.8 = use them freely |
88
+ | Passive voice cap | 10% | Only lower this if user has strong preference |
89
+
90
+ ### Step 4: Do's and don'ts (short lists)
91
+
92
+ Ask for three to five items per list. Offer starters based on the tone
93
+ dimensions already chosen. These become hard rules the writer enforces.
94
+
95
+ Example do's:
96
+
97
+ - "Open with a specific observation, never a greeting about the company's mission in the abstract"
98
+ - "Name at least one product, team, or post by the company"
99
+ - "Use numbers in at least two sentences"
100
+ - "Sign off with a single-word closing"
101
+
102
+ Example don'ts:
103
+
104
+ - "Do not use 'passionate' or 'driven'"
105
+ - "Do not start sentences with 'I am'"
106
+ - "Do not mention years of experience as a standalone claim"
107
+ - "Do not use bullet points or section headings"
108
+
109
+ ### Step 5: Signature block
110
+
111
+ Ask for the applicant's preferred:
112
+
113
+ - Closing word ("Sincerely", "Best", "Regards", "Thanks", or custom)
114
+ - Name format ("Alex Chen", "Alexandra Chen, PhD", etc.)
115
+ - Contact line preference (email only, email + phone, email + portfolio URL)
116
+
117
+ These go into every letter unchanged.
118
+
119
+ ### Step 6: Voice sample (optional)
120
+
121
+ Ask if the user has one to three samples of writing that sounds like the
122
+ voice they want. Accept URLs, pasted text, or filepaths. For each, extract:
123
+
124
+ - Average sentence length
125
+ - Contraction frequency
126
+ - Tone dimension estimate (rough: funny/serious, formal/casual, etc.)
127
+
128
+ Compare to the persona settings and flag any large mismatches. Example:
129
+ "Your sample has sentence length mean 22, but you set the target to 14. Which
130
+ should I go with?"
131
+
132
+ ## Persona file schema
133
+
134
+ ```json
135
+ {
136
+ "name": "senior-eng-default",
137
+ "description": "Mid-to-senior engineering roles at tech companies",
138
+ "stage": "senior",
139
+ "tone_dimensions": {
140
+ "funny_serious": 0.75,
141
+ "formal_casual": 0.45,
142
+ "respectful_irreverent": 0.25,
143
+ "enthusiastic_matter_of_fact": 0.45
144
+ },
145
+ "readability": {
146
+ "flesch_grade_min": 9,
147
+ "flesch_grade_max": 11
148
+ },
149
+ "style": {
150
+ "sentence_length_mean": 17,
151
+ "sentence_length_std": 8,
152
+ "contraction_frequency": 0.4,
153
+ "passive_voice_max_pct": 10
154
+ },
155
+ "signature": {
156
+ "closing": "Best",
157
+ "name": "Alex Chen",
158
+ "contact_line": "alex@example.com | portfolio.example.com"
159
+ },
160
+ "do": [
161
+ "Open with a specific observation about the company's product or post",
162
+ "Name at least one tool, system, or outcome",
163
+ "Use numbers in at least two sentences"
164
+ ],
165
+ "dont": [
166
+ "Do not use 'passionate' or 'driven'",
167
+ "Do not start with 'I am writing'",
168
+ "Do not use bullet points or section headings"
169
+ ],
170
+ "voice_samples": []
171
+ }
172
+ ```
173
+
174
+ ## List command
175
+
176
+ Glob `~/.config/cover-letter/personas/*.json` and render:
177
+
178
+ | Persona | Stage | Tone hint | Last used |
179
+ |---------|-------|-----------|-----------|
180
+ | senior-eng-default | senior | serious, mid-formal | 2026-04-20 |
181
+ | casual-startup | senior | serious, casual | 2026-04-24 |
182
+
183
+ If no personas exist, prompt to create one.
184
+
185
+ ## Use command
186
+
187
+ Read the named persona JSON. Write its name to
188
+ `~/.config/cover-letter/active-persona`. Print a short confirmation:
189
+
190
+ ```
191
+ Active persona: senior-eng-default
192
+ - Tone: serious (0.75), mid-formal (0.45), respectful (0.25), matter-of-fact (0.45)
193
+ - Sentence length target: 17 words ± 8
194
+ - Contractions: 40%; passive cap: 10%
195
+ - Signature: "Best,\nAlex Chen\nalex@example.com | portfolio.example.com"
196
+ ```
197
+
198
+ `cover-letter-write` and `cover-letter-rewrite` read this file before
199
+ generating.
200
+
201
+ ## Show command
202
+
203
+ Pretty-print the JSON with section headers and readable do/don't lists.
204
+
205
+ ## Delete command
206
+
207
+ Ask the user to confirm, then remove the file. If the deleted persona was
208
+ active, also clear `~/.config/cover-letter/active-persona`.
209
+
210
+ ## Error handling
211
+
212
+ - **Invalid tone values**: clamp to [0.0, 1.0] and warn.
213
+ - **Name conflict on create**: ask whether to overwrite or pick a new name.
214
+ - **Missing persona on use/show/delete**: list available personas and ask
215
+ which one the user meant.
216
+ - **Corrupted persona file**: report the error and offer to rebuild it from
217
+ the interview.
218
+
219
+ ## When a persona is probably overkill
220
+
221
+ - Applying to one job: skip the persona, let the writer use JD-based defaults.
222
+ - First-time user: suggest they run `/cover-letter write` once with defaults,
223
+ then decide whether they want to encode that voice.
224
+
225
+ ## When a persona is worth it
226
+
227
+ - Applying to multiple jobs in the same batch.
228
+ - Applicant has a distinctive voice and existing professional content that
229
+ proves it (blog, talks, prior letters).
230
+ - Applying across very different cultures (legal + startup) and wanting
231
+ different personas per batch.