Landing blocker for #61 and #63: the deployment checkout is 12 commits behind and `merge --ff-only` refuses while tracked paths are dirty. Discard is not available here (workspace policy: no `checkout`/`stash` on shared state), so the dirt is committed. - `agent/APPEND_SYSTEM.md`: the point-of-use / one-work-log / PR-link doctrine, already byte-identical to `origin/main` (`cmp` against the trunk blob: no difference). No new prose — the commit exists so the trunk merge can proceed. - `agent/config.yml` and `agent/managed-skills/**`: the machine-live tier the heartbeat owns (AGENTS.md § Live-sync tiers). `ALLOW_SECRETS=1` was used, deliberately and after auditing the staged diff by hand: the only credential-shaped strings in it are two copies of `AKIA0000000000000EXAMPLE` — the inert all-zero AWS example id — and they appear inside the two skill pages that teach that exact placeholder shape. This checkout is still running the pre-#61 hook; the merged gate (value-scoped placeholder filter, `71601f7`) exempts this value, so the refusal dies with this landing. No `--no-verify` was used: the gate ran and its verdict is recorded here. Refs #61
3.2 KiB
name, description
| name | description |
|---|---|
| dankvoice-epithet-pool-audit | Grow or audit the dankvoice 1000-name epithet pool: gender classes, individual eviction, typo sweep, safe regeneration into framing.ts. |
Dankvoice epithet pool audit
Use when adding names to, reclassifying, or cleaning src/framing.ts EPITHETS_* in dank/dankvoice. The pool is law: exactly 1000 distinct names, curated at build time, never user-editable, "the commons, never the characters".
Classification rules (proven traps in parentheses)
- man: gendered lexicon (king, lord, priest, uncle...) + tokens ending
man|men|master— but neverhuman|inhuman|nonhuman. Compounds likequartermaster,hangwomanare single tokens: token-equality checks miss them, use suffix rules. - woman: lexicon (queen, sister, daughter...) + tokens ending
woman+ an EXPLICIT-esstitle list (baroness, countess, prioress, canoness, chartress, heiress, priestess...). Never a bare-esssuffix match:endless,harmless,fortressall end in "ess". - Possessives follow the head noun:
lieutenant of the king's hullis a lieutenant → neutral commons;count's armsmanis an armsman → man. Do not gender by words inside'sphrases. - Modern-neutral offices stay commons: hero, governor, wizard.
witch/lass/brideare female-coded;warlockmale-coded. - Regex trap for absence checks:
he\bmatches insidethe; token-split before matching.
Individual eviction law
Evict: named fictional/historical individuals (duke caladan, uncle toby, pyrrhus, usul, endymion, skynet, moya-born, medusa), named protagonist ships (rocinante), and real authors in universe clothing (strugatsky, niven).
Keep: species, orders, houses, orgs/companies (sardaukar, jedi, cyberdyne), places (kessel; falconer of the caladan eyries is fine — the person problem was only duke caladan), institutions (zekma, karass).
Replace each eviction with the generic office beside it, class-stable, and unique against the pool.
Invariants tests pin (breaking any of these goes red)
- 1000 names, all distinct.
- Sentinel literals must survive:
hangman of the holiday(man),high priestess of the ear moon(woman),comrade operator(other). - Pool firsts feed pool[0] probe tests — union order is MAN-first / WOMAN-first / OTHER; keep source order within classes so firsts stay:
chairman of the presidium of processors/hangwoman of the public convenience/comrade operator. - Class counts (86/15/899 as of 2026-10) may churn but must be reported; tests never pin them.
Regeneration
Pool lives as three generated arrays between markers /** Male-coded and /** The unions in src/framing.ts. Splice new arrays between those markers (python splice of a generated const NAME = [ "x", ... ] as const; block is fine; do not hand-edit 1000 lines). Then bun run build (dist pin test byte-compares), bun run typecheck, and the full bats tests/ — the class sweeps are exhaustive Math.random-cycled walks (each ~200 s; suite ~17 min; never two bats processes at once).
Fleet cutover after merge
main checkout ff-only → omp plugin upgrade omp-dankvoice → cmp ~/.omp/plugins/node_modules/omp-dankvoice/dist/index.js against merged dist/index.js.