Files
command-center/agent/managed-skills/dankvoice-epithet-pool-audit/SKILL.md
T
Frank 8af40c402b chore(agent): commit the machine tier and the doctrine text the checkout was already running
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
2026-10-21 01:44:51 -07:00

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 never human|inhuman|nonhuman. Compounds like quartermaster, hangwoman are single tokens: token-equality checks miss them, use suffix rules.
  • woman: lexicon (queen, sister, daughter...) + tokens ending woman + an EXPLICIT -ess title list (baroness, countess, prioress, canoness, chartress, heiress, priestess...). Never a bare -ess suffix match: endless, harmless, fortress all end in "ess".
  • Possessives follow the head noun: lieutenant of the king's hull is a lieutenant → neutral commons; count's armsman is an armsman → man. Do not gender by words inside 's phrases.
  • Modern-neutral offices stay commons: hero, governor, wizard. witch/lass/bride are female-coded; warlock male-coded.
  • Regex trap for absence checks: he\b matches inside the; 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.