-
Notifications
You must be signed in to change notification settings - Fork 0
feat(naming): research-backed criteria, structured briefs, rejection protocol (0.2.0) #341
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
eaec6da
14019a1
f8c9408
6ec224e
ec14658
fa1cb5d
8e47850
2940ab1
6363135
13de41b
24a0aff
a3490e6
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -33,18 +33,81 @@ its own context, never from a baked-in path: | |
| user wants that is missing from those conventions flows UP into them | ||
| (their standards change), not hardcoded into this skill. | ||
| 2. **None declared → the general criteria** grounded in | ||
| [`context/sources.md`](context/sources.md): intention-revealing and | ||
| semantically accurate to the responsibility, evolution-safe (the name | ||
| sets scope and bounds), context-sensitive, free of overloaded or | ||
| disinformative terms, and drawn from the domain's ubiquitous language. | ||
| [`context/sources.md`](context/sources.md), applied in this | ||
| research-ordered priority — a higher tier breaks ties over every tier | ||
| below it: | ||
| 1. **Semantic accuracy (anti-misleading).** The name must not lie about | ||
| what the thing does. A misleading name is empirically worse than a | ||
| vague or meaningless one, so this outranks everything below. | ||
| 2. **Scope fit.** Length and detail scale with the thing's scope and | ||
| lifetime; never repeat information the surrounding context (package, | ||
| type, module) already supplies. | ||
| 3. **Comprehensibility.** Prefer full, intention-revealing words over | ||
| abbreviations — bounded: established idioms and conventionally short | ||
| names (loop `i`, a receiver) are not penalised. | ||
| 4. **Trigger / evocative utility.** How well the name cues recall at the | ||
| moment of use — a genuine tiebreaker, but the lowest-priority one. | ||
|
|
||
| This ordering governs the scoring and judging steps. It is the fallback | ||
| only: a consuming project's declared criteria (rule 1) override it | ||
| wherever the two differ. | ||
|
|
||
| ## Semantic vs syntactic — the modality layer | ||
|
|
||
| Naming criteria split in two. The **semantic layer** — accuracy, scope | ||
| fit, no collisions, noun-for-a-thing / verb-for-an-action — carries across | ||
| every modality, and is what the generators and judges optimise. The | ||
| **syntactic layer** — casing, length budgets, separator and affix | ||
| conventions — is modality- and vendor-specific; apply it as a final | ||
| shaping pass over the semantic winners, never as a scoring axis that | ||
| overrides meaning. Shaping can change the string, so RE-RUN the full | ||
| merge-step filter set — dedupe, collision, reject-list, word-blocklist — | ||
| on the shaped forms: two distinct candidates can normalize to one string | ||
| (`SessionStore` and `session-store` → `session_store`), a normalization | ||
| can recreate an existing sibling or a rejected incumbent, and a required | ||
| affix can introduce a blocked word (`Order` → `OrderManager`) that the | ||
| pre-scoring filters could not match. | ||
|
|
||
| - **Route documented conflicts out; do not pick a side.** Where authorities | ||
| genuinely disagree — abbreviation policy, acronym casing, camelCase vs | ||
| snake_case — this skill takes no house position. Defer to the consuming | ||
| ecosystem's own style guide (rule 1's declared conventions); the | ||
| conflicting primaries are catalogued in | ||
| [`context/sources.md`](context/sources.md). | ||
| - **Claude Code skills are the sharp special case.** For a skill, the | ||
| DESCRIPTION — not the name — is what drives model-side discovery. So | ||
| optimise the name for human semantic accuracy, and put the trigger | ||
| phrases and example requests in the description, not the name. | ||
|
|
||
| ## Default pass | ||
|
|
||
| 1. **Distill a context brief.** Capture, in a few lines: the | ||
| responsibility of the thing, its scope and lifetime, hard constraints | ||
| (language casing rules, length, collisions to avoid), the existing | ||
| surrounding vocabulary, and a blocklist of overloaded terms to avoid. | ||
| This brief — NOT the conversation — is all the generators receive. | ||
| 1. **Build the structured context brief.** This brief — NOT the | ||
| conversation — is all the generators receive, so it must carry every | ||
| field they need, each captured by name: | ||
|
kyle-sexton marked this conversation as resolved.
|
||
| - **Target modality** — what KIND of thing is being named (function, | ||
| type, module, file, CLI command, skill, domain term): it fixes | ||
| noun-for-a-thing vs verb-for-an-action and tells the final shaping | ||
| pass which syntactic conventions apply. | ||
|
Comment on lines
+87
to
+90
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
For a request whose convention is not determined by the target kind (for example, a function in a Python versus JavaScript project), target modality alone cannot select casing, separators, affixes, or length limits. The replacement brief no longer includes the old hard language constraints, and generators receive only this brief, so neither they nor the final shaping pass are instructed with the consuming ecosystem's resolved syntactic convention; this can emit names in the wrong required form. Include the language/ecosystem or the resolved syntactic constraints as a brief field. Useful? React with 👍 / 👎. |
||
| - **Responsibility** — what the thing DOES, in one line. | ||
| - **Firing / usage context** — when it is reached for, and how it reads | ||
| at the call site. | ||
| - **Scope boundaries** — what it is NOT: the adjacent things it must not | ||
| be confused with or blur into. | ||
| - **Collision vocabulary** — the existing sibling names it must not | ||
| duplicate. | ||
| - **Word-level blocklist** — individual words ruled out, each WITH its | ||
| reason (overloaded, misleading, collides, already rejected). | ||
|
|
||
| Rejected incumbent NAMES deliberately stay out of the brief — the main | ||
| thread holds them as its reject list and disqualifies matches at merge | ||
| time (anti-anchoring: a generator shown a rejected name re-derives it). | ||
| Only the abstracted REASON a name failed enters the brief, as a | ||
| blocklist entry or scope-boundary correction. | ||
|
|
||
| The brief mirrors the replicated concept → word → structure naming model | ||
| (grounded in [`context/sources.md`](context/sources.md)): the named | ||
| fields fix the concepts and constraints; the generators then choose the | ||
| words per concept and arrange the structure. | ||
| 2. **Fan out blind generators.** Spawn ~3 fresh-context subagents, each | ||
| seeded ONLY with the brief (blind to this conversation and to each | ||
| other), each working a distinct lens: | ||
|
|
@@ -57,13 +120,37 @@ its own context, never from a baked-in path: | |
| 3. **Merge and score.** Pool the candidates, dedupe, and disqualify any | ||
| candidate that matches the rejected incumbent (if any) — carried by the | ||
| main thread as an explicit reject list, never shared with the | ||
| generators — or that collides with the existing vocabulary. Score every | ||
| surviving candidate against the criteria resolved above. | ||
| generators — that contains a word-level blocklist entry (a generator | ||
| can miss the brief's constraint; the merge step enforces it), or that | ||
|
kyle-sexton marked this conversation as resolved.
|
||
| collides with the existing vocabulary. Score every | ||
| surviving candidate against the criteria resolved above, breaking ties | ||
| by their declared priority order. | ||
|
kyle-sexton marked this conversation as resolved.
|
||
| 4. **Shortlist + recommend.** Present a short ranked list with a | ||
| one-line rationale per candidate and a single RECOMMENDED pick, marked | ||
| and listed first. | ||
| 5. **Human picks.** Stop and let the user choose. Do not apply the name. | ||
|
|
||
| ## Iterate on the rejection reason | ||
|
|
||
| If the human rejects the shortlist or a specific candidate, the rejection | ||
| is data, not a dead end. Capture the REASON as an explicit new constraint | ||
| and fold it into the next round's brief before regenerating: | ||
|
|
||
| - a word that drew the objection becomes a **word-level blocklist** entry, | ||
| carrying that reason; | ||
| - a "wrong scope / wrong thing" objection becomes a **scope-boundary** | ||
| correction; | ||
| - a "these all miss what matters" objection **reweights the criteria** for | ||
| the next round — but only within the space the consuming project's | ||
| declared conventions leave open. Declared conventions still win: a | ||
| rejection that contradicts them routes upstream as a proposed convention | ||
| change, never a silent local reweighting. | ||
|
|
||
| Rejected names and rejected words never re-enter — the reject list and the | ||
| word-level blocklist only grow across rounds. Each new round is a fresh | ||
| blind fan-out seeded with the corrected brief, never a patch of the last | ||
| round's candidates. | ||
|
|
||
| ## `tournament` action | ||
|
|
||
| When `$ARGUMENTS` contains `tournament`, run this in place of the default | ||
|
|
@@ -75,10 +162,11 @@ models), then run elimination rounds with independent scoring judges until | |
| one candidate remains, and present it plus the runners-up for the human | ||
| choice. | ||
|
|
||
| The reject-list and collision disqualification from the default pass's | ||
| merge step still apply: pool the widened candidates and disqualify any that | ||
| match the rejected incumbent or collide with the existing vocabulary BEFORE | ||
| the elimination rounds begin — a rejected or colliding name must never enter | ||
| The reject-list, word-level-blocklist, and collision disqualification from | ||
| the default pass's merge step still apply: pool the widened candidates and | ||
| disqualify any that match the rejected incumbent, contain a blocklisted | ||
| word, or collide with the existing vocabulary BEFORE the elimination | ||
| rounds begin — a rejected, blocklisted, or colliding name must never enter | ||
| the bracket, let alone reach the finalist. | ||
|
|
||
| HONEST FRAMING: a "naming tournament / bracket" is NOT a documented | ||
|
|
@@ -89,10 +177,13 @@ established standard. | |
|
|
||
| ## Adjacent skills — hand off, do not overlap | ||
|
|
||
| - Resolving what a domain concept IS (not just its label) → a | ||
| domain-modelling capability. Hand a settled domain term there. | ||
| - Sweeping references after a rename is decided → a rename-references | ||
| capability. This skill picks the name; that one propagates it. | ||
| - **The target is a domain concept.** Naming a domain term well depends on | ||
| first settling what the concept IS, not just its label. Route that to a | ||
| domain-modelling capability, then name the settled concept once it | ||
| returns. Pointer only — this skill does not do the domain modelling. | ||
| - **A rename is already decided.** Sweeping references after the fact → | ||
| a rename-references capability. This skill picks the name; that one | ||
| propagates it. | ||
|
|
||
| Invoke an adjacent capability through its slash command when present; | ||
| degrade to prose guidance when it is absent. | ||
|
|
@@ -106,6 +197,9 @@ degrade to prose guidance when it is absent. | |
| source of truth; missing criteria route upstream, not into the skill. | ||
| - **Does not claim tournament mode is a documented technique** — it is an | ||
| adaptation, flagged as one. | ||
| - **Does not pick a house side on documented style conflicts** — | ||
| abbreviation policy, acronym casing, and casing style route to the | ||
| consuming ecosystem's own style guide, never a baked-in verdict. | ||
|
|
||
| ## Gotchas | ||
|
|
||
|
|
@@ -118,5 +212,8 @@ degrade to prose guidance when it is absent. | |
| it at merge time regardless of how a candidate was produced. | ||
| - A candidate that scores well but collides with existing vocabulary is | ||
| disqualified, not shortlisted — collision-check before scoring. | ||
| - A rejected candidate's REASON must become a brief constraint (a blocklist | ||
| word, a scope correction, a criteria reweight) before the next round, or | ||
| the blind fan-out re-derives the same reject. | ||
| - `tournament` costs several generators plus judges; reserve it for names | ||
| that are genuinely expensive to change, not routine locals. | ||
Uh oh!
There was an error while loading. Please reload this page.