random-words 1.0.17 → 1.0.20

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/docs/superpowers/plans/2026-10-29-who-dictionary.md +576 -0
  4. data/docs/superpowers/specs/2026-10-29-who-dictionary-design.md +118 -0
  5. data/lib/random-words/config.rb +9 -2
  6. data/lib/random-words/generator.rb +60 -9
  7. data/lib/random-words/version.rb +1 -1
  8. data/lib/random-words/words/1984/articles-singular.txt +0 -2
  9. data/lib/random-words/words/alice/articles-singular.txt +0 -2
  10. data/lib/random-words/words/bacon/articles-singular.txt +0 -2
  11. data/lib/random-words/words/corporate/articles-singular.txt +0 -2
  12. data/lib/random-words/words/doctor/articles-singular.txt +0 -2
  13. data/lib/random-words/words/english/articles-singular.txt +0 -2
  14. data/lib/random-words/words/foulmouth/articles-singular.txt +0 -2
  15. data/lib/random-words/words/hipster/articles-singular.txt +0 -2
  16. data/lib/random-words/words/veggie/articles-singular.txt +0 -2
  17. data/lib/random-words/words/walken/articles-singular.txt +0 -2
  18. data/lib/random-words/words/who/adjectives.txt +199 -0
  19. data/lib/random-words/words/who/adverbs.txt +175 -0
  20. data/lib/random-words/words/who/articles-plural.txt +10 -0
  21. data/lib/random-words/words/who/articles-singular.txt +8 -0
  22. data/lib/random-words/words/who/clauses.txt +220 -0
  23. data/lib/random-words/words/who/config.yml +4 -0
  24. data/lib/random-words/words/who/conjunctions-coordinating.txt +20 -0
  25. data/lib/random-words/words/who/conjunctions-subordinate.txt +28 -0
  26. data/lib/random-words/words/who/names.txt +90 -0
  27. data/lib/random-words/words/who/nouns-plural.txt +404 -0
  28. data/lib/random-words/words/who/nouns-singular.txt +446 -0
  29. data/lib/random-words/words/who/numbers.yml +5 -0
  30. data/lib/random-words/words/who/phrases.txt +52 -0
  31. data/lib/random-words/words/who/prepositions.txt +45 -0
  32. data/lib/random-words/words/who/terminators.txt +17 -0
  33. data/lib/random-words/words/who/verbs-passive.txt +286 -0
  34. data/lib/random-words/words/who/verbs-plural.txt +271 -0
  35. data/lib/random-words/words/who/verbs-singular.txt +271 -0
  36. data/random-words.gemspec +2 -2
  37. metadata +27 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb7dd16845d6ce75d9f10a8e5005636cf13e4060965273bf305ce34980975d95
4
- data.tar.gz: ff992ec57cc8cddcad1fa016a25929ecbc5c4d124601e6873f9f5e634c503be3
3
+ metadata.gz: 31aae44a091eeab817b59fb5caaeb0c0685d950c73c9b7d398aa715200370882
4
+ data.tar.gz: 763a94094a0c58f124e4e99386f0896ed42e66f40a4a5af291cd0cf7f61e0025
5
5
  SHA512:
6
- metadata.gz: ac1670432a510e98b3b91bca1fdcc0eb7aefa58a9d0b98b50e28a8e0d4848e93866fcc9b2f9e7c6347a66ef4bb579904db3bc71424be9baf47fcda64c4375543
7
- data.tar.gz: 61b5b0d50ca33fe03da311c69e63f318fb0585c35cb6b3a39185a3c4c149b63f2c92d5ccaecd83db86b669cb7ac3693d50e0fd596ff09fbd095ad5e526857059
6
+ metadata.gz: a4bc71bf69ad92feefdb43f9c2cad6f0a2d64b74417c2f7ba4208cd11df45d1c5dfee4674ed85f3dc8db20342f1ba406d31e6191003befee9e131cbb0484e256
7
+ data.tar.gz: 4d0cceb82352305fbae3b63e37153b31a81ac47550a339df26da87329944fc1c655e73ef63872c6263c8461bf7058b23ad8f355d0f2b0589d285f5341bb9827b
data/CHANGELOG.md CHANGED
@@ -1,3 +1,34 @@
1
+ ### 1.0.20
2
+
3
+ 2026-10-29 07:12
4
+
5
+ #### NEW
6
+
7
+ - **who** dictionary with dialog, characters, and franchise lexicon
8
+ - **triggers** who, doctorwho, and tardis for the Who source
9
+
10
+ ### 1.0.19
11
+
12
+ 2026-10-29 07:04
13
+
14
+ #### NEW
15
+
16
+ - **who** dictionary with dialog, characters, and franchise lexicon
17
+ - **triggers** who, doctorwho, and tardis for the Who source
18
+
19
+ ### 1.0.18
20
+
21
+ 2025-05-28 07:16
22
+
23
+ #### IMPROVED
24
+
25
+ - More templates for sentence structure variety
26
+
27
+ #### FIXED
28
+
29
+ - Just remove a/an from articles to avoid article disagreement
30
+ - Remove m-dash from separators as it was causing a double-space bug
31
+
1
32
  ### 1.0.17
2
33
 
3
34
  2025-05-24 10:47
@@ -0,0 +1,576 @@
1
+ # Doctor Who (`who`) Dictionary Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4
+
5
+ **Goal:** Add a large Doctor Who dictionary at `lib/random-words/words/who/` (triggers `who`, `doctorwho`, `tardis`) focused on dialog and characters, New Who–forward with a Classic sprinkle, without changing generator code.
6
+
7
+ **Architecture:** Dictionaries are plain-text word-class files plus `config.yml`, auto-discovered from `lib/random-words/words/*/`. This work only adds files under `who/`. Content follows the hybrid design: names/phrases/clauses carry dialog and characters; nouns/verbs/adjectives/adverbs supply Walken-scale franchise lexicon; structural grammar files are copied from `english`.
8
+
9
+ **Tech Stack:** Ruby gem `random-words`, RSpec, plain `.txt` / `.yml` dictionary files.
10
+
11
+ ## Global Constraints
12
+
13
+ - Directory name and `config.yml` `name` must be `who`
14
+ - Triggers must include exactly: `who`, `doctorwho`, `tardis` (do not add bare `doctor` — that is the medical dictionary)
15
+ - Do not modify `lib/random-words/words/doctor/` or any Ruby sources
16
+ - Era: mostly New Who; Classic sprinkle heavier for Fourth Doctor, Sarah Jane, UNIT, iconic monsters/catchphrases
17
+ - Quote density: medium (~50–70 phrases); bulk is themed vocabulary
18
+ - Size target: ~2500+ lines across all word `.txt` files combined
19
+ - `names.txt` must be a **single section** (no blank-line separators) so all entries become `full_names` like `alice` — multi-word labels such as `The Doctor` and `Rose Tyler` must not be split into random first+last pairs
20
+ - Prefer franchise-common terms; avoid obscure one-off props unless culturally iconic
21
+ - Keep singular/plural noun and verb pairs consistent where both files exist
22
+ - Sort word lists alphabetically (case-insensitive) within each content file unless the format forbids it (terminators, numbers.yml)
23
+ - Spec: `docs/superpowers/specs/2026-10-29-who-dictionary-design.md`
24
+
25
+ ---
26
+
27
+ ## File Structure
28
+
29
+ | Path | Responsibility |
30
+ |------|----------------|
31
+ | `lib/random-words/words/who/config.yml` | Name, description, triggers |
32
+ | `lib/random-words/words/who/names.txt` | Character full names (~80–120) |
33
+ | `lib/random-words/words/who/phrases.txt` | Iconic lines (~50–70) |
34
+ | `lib/random-words/words/who/clauses.txt` | Show-voice fragments (~180–250) |
35
+ | `lib/random-words/words/who/nouns-singular.txt` | Franchise nouns (~400–500) |
36
+ | `lib/random-words/words/who/nouns-plural.txt` | Matching plurals (~300–400) |
37
+ | `lib/random-words/words/who/verbs-singular.txt` | 3rd-person singular (~250–300) |
38
+ | `lib/random-words/words/who/verbs-plural.txt` | Base/plural verbs (~250–300) |
39
+ | `lib/random-words/words/who/verbs-passive.txt` | Passive phrases (~200–350) |
40
+ | `lib/random-words/words/who/adjectives.txt` | Themed adjectives (~130–200) |
41
+ | `lib/random-words/words/who/adverbs.txt` | Themed adverbs (~130–200) |
42
+ | `lib/random-words/words/who/articles-*.txt`, `conjunctions-*.txt`, `prepositions.txt`, `terminators.txt`, `numbers.yml` | Structural glue copied from `english` |
43
+
44
+ No Ruby file changes.
45
+
46
+ ---
47
+
48
+ ### Task 1: Scaffold directory, config, and structural files
49
+
50
+ **Files:**
51
+ - Create: `lib/random-words/words/who/config.yml`
52
+ - Create: `lib/random-words/words/who/articles-singular.txt`
53
+ - Create: `lib/random-words/words/who/articles-plural.txt`
54
+ - Create: `lib/random-words/words/who/conjunctions-coordinating.txt`
55
+ - Create: `lib/random-words/words/who/conjunctions-subordinate.txt`
56
+ - Create: `lib/random-words/words/who/prepositions.txt`
57
+ - Create: `lib/random-words/words/who/terminators.txt`
58
+ - Create: `lib/random-words/words/who/numbers.yml`
59
+ - Create (stubs for later tasks so Source can load): empty-or-minimal placeholders for remaining required files listed in Task 1 Step 3 — replace in later tasks
60
+
61
+ **Interfaces:**
62
+ - Consumes: `lib/random-words/words/english/{articles-singular,articles-plural,conjunctions-coordinating,conjunctions-subordinate,prepositions,terminators}.txt` and `numbers.yml`
63
+ - Produces: loadable `who` directory with config triggers `[who, doctorwho, tardis]`
64
+
65
+ - [ ] **Step 1: Create the directory and config**
66
+
67
+ ```bash
68
+ mkdir -p lib/random-words/words/who
69
+ ```
70
+
71
+ Write `lib/random-words/words/who/config.yml`:
72
+
73
+ ```yaml
74
+ ---
75
+ name: who
76
+ description: Doctor Who (New Who-forward, Classic sprinkle)
77
+ triggers: [who, doctorwho, tardis]
78
+ ```
79
+
80
+ - [ ] **Step 2: Copy structural files from english**
81
+
82
+ ```bash
83
+ cd /Users/ttscoff/Desktop/Code/random-words
84
+ for f in articles-singular.txt articles-plural.txt conjunctions-coordinating.txt conjunctions-subordinate.txt prepositions.txt terminators.txt numbers.yml; do
85
+ cp "lib/random-words/words/english/$f" "lib/random-words/words/who/$f"
86
+ done
87
+ ```
88
+
89
+ - [ ] **Step 3: Add minimal placeholders so Source loads**
90
+
91
+ Create these files with a single placeholder line each (later tasks replace with full content):
92
+
93
+ | File | Placeholder line |
94
+ |------|------------------|
95
+ | `names.txt` | `The Doctor` |
96
+ | `phrases.txt` | `Allons-y` |
97
+ | `clauses.txt` | `the TARDIS materializes` |
98
+ | `nouns-singular.txt` | `TARDIS` |
99
+ | `nouns-plural.txt` | `Daleks` |
100
+ | `verbs-singular.txt` | `regenerates` |
101
+ | `verbs-plural.txt` | `regenerate` |
102
+ | `verbs-passive.txt` | `was regenerated by` |
103
+ | `adjectives.txt` | `timey-wimey` |
104
+ | `adverbs.txt` | `brilliantly` |
105
+
106
+ - [ ] **Step 4: Verify the source loads**
107
+
108
+ ```bash
109
+ ruby -e '
110
+ require_relative "lib/random-words"
111
+ g = RandomWords::Generator.new(:who)
112
+ puts g.source
113
+ puts g.sources["who"].names.inspect
114
+ puts g.sentence
115
+ '
116
+ ```
117
+
118
+ Expected:
119
+ - `source` prints `who`
120
+ - `names` / triggers include `who`, `doctorwho`, `tardis`
121
+ - A sentence prints without raising
122
+
123
+ - [ ] **Step 5: Commit scaffold (only if user asked to commit)**
124
+
125
+ ```bash
126
+ git add lib/random-words/words/who docs/superpowers/specs/2026-10-29-who-dictionary-design.md docs/superpowers/plans/2026-10-29-who-dictionary.md
127
+ git commit -m "$(cat <<'EOF'
128
+ Add Doctor Who dictionary scaffold.
129
+
130
+ @new **who** dictionary directory with config triggers who, doctorwho, tardis
131
+ EOF
132
+ )"
133
+ ```
134
+
135
+ ---
136
+
137
+ ### Task 2: Character names and iconic phrases
138
+
139
+ **Files:**
140
+ - Replace: `lib/random-words/words/who/names.txt`
141
+ - Replace: `lib/random-words/words/who/phrases.txt`
142
+
143
+ **Interfaces:**
144
+ - Consumes: Task 1 scaffold
145
+ - Produces: `names.txt` with 80–120 full-name lines (no blank lines); `phrases.txt` with 50–70 iconic lines
146
+
147
+ - [ ] **Step 1: Write `names.txt` (single section, full names only)**
148
+
149
+ Replace the placeholder with ~80–120 alphabetized character labels. Required coverage:
150
+
151
+ **Doctors (even NuWho spread + Classic sprinkle):** The Doctor, War Doctor, Ninth Doctor, Tenth Doctor, Eleventh Doctor, Twelfth Doctor, Thirteenth Doctor, Fourteenth Doctor, Fifteenth Doctor, Fourth Doctor (and optionally other Classic numbers as light sprinkle)
152
+
153
+ **Companions (NuWho-heavy):** Rose Tyler, Mickey Smith, Jackie Tyler, Martha Jones, Donna Noble, Wilfred Mott, Amy Pond, Rory Williams, River Song, Clara Oswald, Bill Potts, Nardole, Yasmin Khan, Ryan Sinclair, Graham OBrien, Dan Lewis, Ruby Sunday, Belinda Chandra, Sarah Jane Smith, Jo Grant, Ace (Classic sprinkle)
154
+
155
+ **Allies / orgs:** Jack Harkness, UNIT, Kate Stewart, Brigadier Lethbridge-Stewart, K-9, Madame Vastra, Jenny Flint, Strax, Osgood
156
+
157
+ **Villains / monsters (as name-like subjects):** The Master, Missy, Dalek, Dalek Emperor, Cyberman, Cyber Leader, Weeping Angel, The Silence, The Beast, Cassandrashadow, Davros, Rassilon, Omega, Sutekh, The Toymaker, Maestro (keep to widely known figures; skip deep deep-cuts)
158
+
159
+ Style rules:
160
+ - No blank lines anywhere in the file (keeps all entries as `full_names`)
161
+ - No actor names as primary entries
162
+ - One entry per line; alphabetize case-insensitive
163
+
164
+ Minimal seed to expand from (implementer must expand to full count):
165
+
166
+ ```text
167
+ Ace
168
+ Amy Pond
169
+ Bill Potts
170
+ Brigadier Lethbridge-Stewart
171
+ Clara Oswald
172
+ Cyberman
173
+ Dalek
174
+ Dan Lewis
175
+ Davros
176
+ Donna Noble
177
+ Eleventh Doctor
178
+ Fifteenth Doctor
179
+ Fourteenth Doctor
180
+ Fourth Doctor
181
+ Graham OBrien
182
+ Jack Harkness
183
+ Jackie Tyler
184
+ Jo Grant
185
+ K-9
186
+ Kate Stewart
187
+ Martha Jones
188
+ Mickey Smith
189
+ Missy
190
+ Nardole
191
+ Ninth Doctor
192
+ Osgood
193
+ Rassilon
194
+ River Song
195
+ Rory Williams
196
+ Rose Tyler
197
+ Ruby Sunday
198
+ Sarah Jane Smith
199
+ Tenth Doctor
200
+ The Doctor
201
+ The Master
202
+ The Silence
203
+ Thirteenth Doctor
204
+ Twelfth Doctor
205
+ UNIT
206
+ War Doctor
207
+ Weeping Angel
208
+ Wilfred Mott
209
+ Yasmin Khan
210
+ ```
211
+
212
+ - [ ] **Step 2: Write `phrases.txt` (~50–70)**
213
+
214
+ Medium quote set — recognizable, not exhaustive. Include a mix of:
215
+
216
+ - Doctor catchphrases: Allons-y, Geronimo, Fantastic, I am and always will be the Optimist, wibbly-wobbly timey-wimey
217
+ - Companion beats: I was gonna be with you forever, Don't you dare
218
+ - Monster slogans: Exterminate, Delete, Are you my mummy
219
+ - Classic sprinkle: Would you like a jelly baby
220
+ - TARDIS / sonic flavor lines
221
+
222
+ One phrase per line; alphabetize; no blank lines required but allowed only if they do not break parsing (phrases file has no section split — blank lines become empty strings; prefer **no blank lines**).
223
+
224
+ Seed to expand:
225
+
226
+ ```text
227
+ Allons-y
228
+ Are you my mummy
229
+ Bow ties are cool
230
+ Delete
231
+ Don't blink
232
+ Exterminate
233
+ Fantastic
234
+ Geronimo
235
+ I am and always will be the Optimist
236
+ Would you like a jelly baby
237
+ wibbly-wobbly timey-wimey stuff
238
+ ```
239
+
240
+ Expand to 50–70 distinct phrases in the show’s voice (short enough to embed in random sentences).
241
+
242
+ - [ ] **Step 3: Verify names load as full_names**
243
+
244
+ ```bash
245
+ ruby -e '
246
+ require_relative "lib/random-words"
247
+ s = RandomWords::Generator.new(:who).sources["who"]
248
+ d = s.dictionary
249
+ puts "first=#{d[:first_names].size} last=#{d[:last_names].size} full=#{d[:full_names].size}"
250
+ puts d[:full_names].sample(5)
251
+ puts "phrases=#{d[:phrases].size}"
252
+ '
253
+ ```
254
+
255
+ Expected:
256
+ - `first=0 last=0` and `full` between 80 and 120
257
+ - `phrases` between 50 and 70
258
+ - Sample names look like characters, not `Rose Q Tyler`-style random recombinations
259
+
260
+ - [ ] **Step 4: Commit (only if user asked)**
261
+
262
+ ```bash
263
+ git add lib/random-words/words/who/names.txt lib/random-words/words/who/phrases.txt
264
+ git commit -m "$(cat <<'EOF'
265
+ Add Who dictionary names and phrases.
266
+
267
+ @new **character names** and iconic dialog phrases for the who source
268
+ EOF
269
+ )"
270
+ ```
271
+
272
+ ---
273
+
274
+ ### Task 3: Clauses (show-voice fragments)
275
+
276
+ **Files:**
277
+ - Replace: `lib/random-words/words/who/clauses.txt`
278
+
279
+ **Interfaces:**
280
+ - Consumes: Task 1–2
281
+ - Produces: 180–250 clause lines
282
+
283
+ - [ ] **Step 1: Write `clauses.txt`**
284
+
285
+ Replace placeholder with 180–250 fragments. Categories (approximate budgets):
286
+
287
+ | Category | ~Count | Examples |
288
+ |----------|--------|----------|
289
+ | TARDIS / travel | 30 | `the TARDIS materializes in a new century`, `the engines roar through the vortex` |
290
+ | Regeneration / Time Lord | 25 | `the Doctor regenerates in a blaze of light`, `two hearts beat out of sync` |
291
+ | Daleks / Cybermen / Angels | 40 | `the Daleks open fire`, `a Weeping Angel waits unblinking` |
292
+ | Companion loyalty / banter | 40 | `Rose refuses to stay behind`, `Donna saves the day again` |
293
+ | UNIT / Earth defense | 20 | `UNIT locks down the perimeter`, `the Brigadier calls for backup` |
294
+ | Timey-wimey / paradox | 25 | `a paradox tears open the timeline`, `history rewrites itself` |
295
+ | Classic sprinkle | 20 | `Sarah Jane investigates the anomaly`, `a jelly baby seals the deal` |
296
+
297
+ Voice: Walken-like mix of first person (`I trust the Doctor`) and third person (`the Master laughs in the dark`). One clause per line; no trailing periods required (match `walken`/`alice` style consistency within the file — prefer no terminal period, or all with periods; be consistent). Alphabetize if practical; category order is fine if counts are met.
298
+
299
+ - [ ] **Step 2: Verify clause count and sample sentences**
300
+
301
+ ```bash
302
+ wc -l lib/random-words/words/who/clauses.txt
303
+ ruby -e '
304
+ require_relative "lib/random-words"
305
+ g = RandomWords::Generator.new(:who)
306
+ 5.times { puts g.sentence; puts "---" }
307
+ '
308
+ ```
309
+
310
+ Expected: `wc -l` in 180–250; sentences occasionally include Who-flavored clauses/names/phrases.
311
+
312
+ - [ ] **Step 3: Commit (only if user asked)**
313
+
314
+ ```bash
315
+ git add lib/random-words/words/who/clauses.txt
316
+ git commit -m "$(cat <<'EOF'
317
+ Add Who dictionary clauses.
318
+
319
+ @new **show-voice clauses** for TARDIS, monsters, companions, and time travel
320
+ EOF
321
+ )"
322
+ ```
323
+
324
+ ---
325
+
326
+ ### Task 4: Nouns (singular and plural)
327
+
328
+ **Files:**
329
+ - Replace: `lib/random-words/words/who/nouns-singular.txt`
330
+ - Replace: `lib/random-words/words/who/nouns-plural.txt`
331
+
332
+ **Interfaces:**
333
+ - Consumes: Task 1 scaffold
334
+ - Produces: ~400–500 singular nouns; ~300–400 plural nouns; pairs consistent where both forms exist
335
+
336
+ - [ ] **Step 1: Write `nouns-singular.txt` (~400–500)**
337
+
338
+ Alphabetized franchise lexicon. Category budgets (approximate):
339
+
340
+ | Category | Examples |
341
+ |----------|----------|
342
+ | Ship / tech | TARDIS, sonic screwdriver, chameleon circuit, dematerialization circuit, psychic paper, vortex manipulator |
343
+ | Time Lord lore | regeneration, Gallifrey, Rassilon, Time Lord, matrix, hermit |
344
+ | Monsters / species | Dalek, Cyberman, Weeping Angel, Silence, Sontaran, Judoon, Ood, Auton |
345
+ | Places | Skaro, Trenzalore, Satellite Five, Cardiff, Powell Estate |
346
+ | Abstract adventure | paradox, timeline, prophecy, extinction, invasion, miracle |
347
+ | People roles | companion, companion, soldier, scientist, refugee (also ordinary adventure nouns to reach Walken scale) |
348
+
349
+ Include enough general adventure/sci-fi nouns (corridor, bunker, signal, distress call) to hit ~400–500 without inventing fake episode titles.
350
+
351
+ - [ ] **Step 2: Write `nouns-plural.txt` (~300–400)**
352
+
353
+ Matching plurals for countable nouns (`Daleks`, `Cybermen`, `Weeping Angels`, `Timelines`, `companions`). Uncountable/proper singulars need not have forced plurals. Alphabetize.
354
+
355
+ - [ ] **Step 3: Verify counts**
356
+
357
+ ```bash
358
+ wc -l lib/random-words/words/who/nouns-singular.txt lib/random-words/words/who/nouns-plural.txt
359
+ ruby -e '
360
+ require_relative "lib/random-words"
361
+ d = RandomWords::Generator.new(:who).sources["who"].dictionary
362
+ puts d[:nouns].sample(8)
363
+ puts d[:plural_nouns].sample(8)
364
+ '
365
+ ```
366
+
367
+ Expected: singular 400–500; plural 300–400; samples look Who/sci-fi themed.
368
+
369
+ - [ ] **Step 4: Commit (only if user asked)**
370
+
371
+ ```bash
372
+ git add lib/random-words/words/who/nouns-singular.txt lib/random-words/words/who/nouns-plural.txt
373
+ git commit -m "$(cat <<'EOF'
374
+ Add Who dictionary nouns.
375
+
376
+ @new **franchise nouns** covering tech, species, places, and time lore
377
+ EOF
378
+ )"
379
+ ```
380
+
381
+ ---
382
+
383
+ ### Task 5: Verbs (singular, plural, passive)
384
+
385
+ **Files:**
386
+ - Replace: `lib/random-words/words/who/verbs-singular.txt`
387
+ - Replace: `lib/random-words/words/who/verbs-plural.txt`
388
+ - Replace: `lib/random-words/words/who/verbs-passive.txt`
389
+
390
+ **Interfaces:**
391
+ - Consumes: Task 1 scaffold
392
+ - Produces: ~250–300 singular; ~250–300 plural; ~200–350 passive
393
+
394
+ - [ ] **Step 1: Write verb files**
395
+
396
+ **verbs-singular.txt** — third-person singular (`regenerates`, `dematerializes`, `exterminates`, `converts`, `warns`, `arrives`, `vanishes`, `rewrites`). Target 250–300.
397
+
398
+ **verbs-plural.txt** — base forms used with plural subjects (`regenerate`, `dematerialize`, `exterminate`, `convert`, `warn`, `arrive`). Target 250–300. Keep pairs aligned with singular where possible.
399
+
400
+ **verbs-passive.txt** — phrases like walken (`was regenerated by`, `was converted by`, `was chased by`, `was saved by`, `was rewritten by`). Target 200–350.
401
+
402
+ Tone: action, threat, wonder, rescue — not medical chart verbs.
403
+
404
+ - [ ] **Step 2: Verify**
405
+
406
+ ```bash
407
+ wc -l lib/random-words/words/who/verbs-*.txt
408
+ ruby -e '
409
+ require_relative "lib/random-words"
410
+ d = RandomWords::Generator.new(:who).sources["who"].dictionary
411
+ puts d[:verbs].sample(5)
412
+ puts d[:plural_verbs].sample(5)
413
+ puts d[:passive_verbs].sample(5)
414
+ '
415
+ ```
416
+
417
+ Expected: counts in ranges above; samples Who-flavored.
418
+
419
+ - [ ] **Step 3: Commit (only if user asked)**
420
+
421
+ ```bash
422
+ git add lib/random-words/words/who/verbs-singular.txt lib/random-words/words/who/verbs-plural.txt lib/random-words/words/who/verbs-passive.txt
423
+ git commit -m "$(cat <<'EOF'
424
+ Add Who dictionary verbs.
425
+
426
+ @new **action and passive verbs** for time travel, monsters, and rescue
427
+ EOF
428
+ )"
429
+ ```
430
+
431
+ ---
432
+
433
+ ### Task 6: Adjectives and adverbs
434
+
435
+ **Files:**
436
+ - Replace: `lib/random-words/words/who/adjectives.txt`
437
+ - Replace: `lib/random-words/words/who/adverbs.txt`
438
+
439
+ **Interfaces:**
440
+ - Consumes: Task 1 scaffold
441
+ - Produces: ~130–200 adjectives; ~130–200 adverbs
442
+
443
+ - [ ] **Step 1: Write `adjectives.txt` and `adverbs.txt`**
444
+
445
+ Adjectives: `timey-wimey`, `wibbly-wobbly`, `ancient`, `doomed`, `brilliant`, `impossible`, `gallifreyan`, `cybernetic`, `paradoxical`, `lonely`, `last`, `forbidden`, plus broad adventure descriptors to reach count.
446
+
447
+ Adverbs: `brilliantly`, `suddenly`, `bravely`, `paradoxically`, `silently`, `furiously`, `impossibly`, etc.
448
+
449
+ Alphabetize; targets 130–200 each.
450
+
451
+ - [ ] **Step 2: Verify**
452
+
453
+ ```bash
454
+ wc -l lib/random-words/words/who/adjectives.txt lib/random-words/words/who/adverbs.txt
455
+ ```
456
+
457
+ Expected: both in 130–200.
458
+
459
+ - [ ] **Step 3: Commit (only if user asked)**
460
+
461
+ ```bash
462
+ git add lib/random-words/words/who/adjectives.txt lib/random-words/words/who/adverbs.txt
463
+ git commit -m "$(cat <<'EOF'
464
+ Add Who dictionary adjectives and adverbs.
465
+
466
+ @new **themed modifiers** for timey-wimey and adventure tone
467
+ EOF
468
+ )"
469
+ ```
470
+
471
+ ---
472
+
473
+ ### Task 7: Final size check, trigger check, and sample review
474
+
475
+ **Files:**
476
+ - Modify: any `lib/random-words/words/who/*.txt` that are under target (top up lexicon)
477
+ - Test: manual ruby checks (no new RSpec file required unless counts fail unexpectedly)
478
+
479
+ **Interfaces:**
480
+ - Consumes: Tasks 1–6 complete dictionary
481
+ - Produces: ≥2500 total lines; triggers work; sample output feels Who-themed
482
+
483
+ - [ ] **Step 1: Line-count audit**
484
+
485
+ ```bash
486
+ wc -l lib/random-words/words/who/*.txt | sort -n
487
+ echo "---"
488
+ wc -l lib/random-words/words/who/*.txt | tail -1
489
+ ```
490
+
491
+ Expected per-file ranges (from spec):
492
+
493
+ | File | Target |
494
+ |------|--------|
495
+ | names | 80–120 |
496
+ | phrases | 50–70 |
497
+ | clauses | 180–250 |
498
+ | nouns-singular | 400–500 |
499
+ | nouns-plural | 300–400 |
500
+ | verbs-singular | 250–300 |
501
+ | verbs-plural | 250–300 |
502
+ | verbs-passive | 200–350 |
503
+ | adjectives | 130–200 |
504
+ | adverbs | 130–200 |
505
+ | **all .txt total** | **≥2500** |
506
+
507
+ If under 2500, expand nouns/verbs/clauses first (highest bulk), then adjectives/adverbs.
508
+
509
+ - [ ] **Step 2: Trigger alias check**
510
+
511
+ ```bash
512
+ ruby -e '
513
+ require_relative "lib/random-words"
514
+ %s[who doctorwho tardis].each do |t|
515
+ sym = t.to_s.to_source
516
+ puts "#{t} -> #{sym}"
517
+ end
518
+ g = RandomWords::Generator.new(:who)
519
+ puts g.paragraph
520
+ '
521
+ ```
522
+
523
+ Expected: each of `who`, `doctorwho`, `tardis` resolves to `:who` (or source name `who`). Paragraph prints with Who flavor. Bare `doctor` must still resolve to the medical dictionary, not `who`.
524
+
525
+ ```bash
526
+ ruby -e '
527
+ require_relative "lib/random-words"
528
+ puts "doctor".to_source
529
+ '
530
+ ```
531
+
532
+ Expected: `:doctor` (medical), not `:who`.
533
+
534
+ - [ ] **Step 3: Confirm no Ruby or medical-doctor changes**
535
+
536
+ ```bash
537
+ git status
538
+ git diff --stat
539
+ ```
540
+
541
+ Expected: only `lib/random-words/words/who/**` and docs under `docs/superpowers/` (if uncommitted). No changes to `generator.rb` or `words/doctor/`.
542
+
543
+ - [ ] **Step 4: Final commit (only if user asked)**
544
+
545
+ ```bash
546
+ git add lib/random-words/words/who docs/superpowers/specs/2026-10-29-who-dictionary-design.md docs/superpowers/plans/2026-10-29-who-dictionary.md
547
+ git commit -m "$(cat <<'EOF'
548
+ Complete Doctor Who dictionary.
549
+
550
+ @new **who** source with dialog, characters, and franchise lexicon
551
+ EOF
552
+ )"
553
+ ```
554
+
555
+ ---
556
+
557
+ ## Spec coverage checklist
558
+
559
+ | Spec requirement | Task |
560
+ |------------------|------|
561
+ | Directory `who/` + config triggers | Task 1 |
562
+ | names ~80–120, character focus | Task 2 |
563
+ | phrases ~50–70 medium quotes | Task 2 |
564
+ | clauses ~180–250 | Task 3 |
565
+ | nouns/verbs/adj/adv Walken-scale | Tasks 4–6 |
566
+ | structural files from english | Task 1 |
567
+ | ≥2500 lines; Generator.new(:who); triggers | Task 7 |
568
+ | No generator / medical doctor changes | Task 7 Step 3 |
569
+ | New Who–forward, Classic sprinkle, even NuWho Doctors | Tasks 2–3 content guidance |
570
+
571
+ ## Self-review notes
572
+
573
+ - No TBD/TODO placeholders left in tasks
574
+ - Names format explicitly constrained to alice-style full_names (avoids broken `The Q Doctor` recombinations)
575
+ - Commits gated on user request to match repo commit preference
576
+ - Content tasks specify category budgets and verification commands; implementer writes full alphabetized lists during execution (lists are too large to embed twice)