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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -0
- data/docs/superpowers/plans/2026-10-29-who-dictionary.md +576 -0
- data/docs/superpowers/specs/2026-10-29-who-dictionary-design.md +118 -0
- data/lib/random-words/config.rb +9 -2
- data/lib/random-words/generator.rb +60 -9
- data/lib/random-words/version.rb +1 -1
- data/lib/random-words/words/1984/articles-singular.txt +0 -2
- data/lib/random-words/words/alice/articles-singular.txt +0 -2
- data/lib/random-words/words/bacon/articles-singular.txt +0 -2
- data/lib/random-words/words/corporate/articles-singular.txt +0 -2
- data/lib/random-words/words/doctor/articles-singular.txt +0 -2
- data/lib/random-words/words/english/articles-singular.txt +0 -2
- data/lib/random-words/words/foulmouth/articles-singular.txt +0 -2
- data/lib/random-words/words/hipster/articles-singular.txt +0 -2
- data/lib/random-words/words/veggie/articles-singular.txt +0 -2
- data/lib/random-words/words/walken/articles-singular.txt +0 -2
- data/lib/random-words/words/who/adjectives.txt +199 -0
- data/lib/random-words/words/who/adverbs.txt +175 -0
- data/lib/random-words/words/who/articles-plural.txt +10 -0
- data/lib/random-words/words/who/articles-singular.txt +8 -0
- data/lib/random-words/words/who/clauses.txt +220 -0
- data/lib/random-words/words/who/config.yml +4 -0
- data/lib/random-words/words/who/conjunctions-coordinating.txt +20 -0
- data/lib/random-words/words/who/conjunctions-subordinate.txt +28 -0
- data/lib/random-words/words/who/names.txt +90 -0
- data/lib/random-words/words/who/nouns-plural.txt +404 -0
- data/lib/random-words/words/who/nouns-singular.txt +446 -0
- data/lib/random-words/words/who/numbers.yml +5 -0
- data/lib/random-words/words/who/phrases.txt +52 -0
- data/lib/random-words/words/who/prepositions.txt +45 -0
- data/lib/random-words/words/who/terminators.txt +17 -0
- data/lib/random-words/words/who/verbs-passive.txt +286 -0
- data/lib/random-words/words/who/verbs-plural.txt +271 -0
- data/lib/random-words/words/who/verbs-singular.txt +271 -0
- data/random-words.gemspec +2 -2
- metadata +27 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 31aae44a091eeab817b59fb5caaeb0c0685d950c73c9b7d398aa715200370882
|
|
4
|
+
data.tar.gz: 763a94094a0c58f124e4e99386f0896ed42e66f40a4a5af291cd0cf7f61e0025
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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)
|