Skip to content

feat(naming): research-backed criteria, structured briefs, rejection protocol (0.2.0)#341

Merged
kyle-sexton merged 12 commits into
mainfrom
feat/name-it-better-research-criteria
Jul 18, 2026
Merged

feat(naming): research-backed criteria, structured briefs, rejection protocol (0.2.0)#341
kyle-sexton merged 12 commits into
mainfrom
feat/name-it-better-research-criteria

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

What

Upgrades the naming plugin's name-it-better skill (0.1.0 → 0.2.0) with
research-backed criteria and structure, keeping its existing blind-generator
method and tone. Delta changes, not a rewrite.

  • Structured context brief. The loose "distill a brief" step becomes a
    brief with named fields — responsibility, firing/usage context, scope
    boundaries (what it is NOT), collision vocabulary, word-level blocklist
    (with reasons), rejected incumbents (with reasons) — mirroring the
    replicated concept → word → structure naming model. The generators
    receive this brief, and only this brief. (Fixes the root cause of the
    three tournament rounds this work needed: thin, unstructured briefs.)
  • Declared criteria priority. The fallback general criteria are now
    research-ordered — semantic accuracy (anti-misleading) > scope fit >
    comprehensibility > trigger/evocative utility — and this ordering governs
    scoring and judging. A consuming project's declared conventions still
    override it (layered under, not replacing, "declared conventions win").
  • Rejection-reason iteration protocol. A rejected candidate's REASON is
    captured as an explicit new brief constraint (a blocklist word, a
    scope-boundary correction, or a criteria reweight) fed into the next
    blind round; rejected names and words never re-enter. New eval (perf(markdown-formatter): unwired producer builds telemetry payload before the opt-in guard (~90ms/edit on Windows) #6)
    covers it.
  • Modality layer. Criteria split into a universal semantic layer and a
    modality/vendor-specific syntactic layer; documented style conflicts
    (abbreviation policy, acronym casing, casing style) route to the
    consuming ecosystem's own style guide rather than a house verdict. For
    Claude Code skills, the description — not the name — drives discovery.
  • Strengthened domain-concept pointer to a domain-modelling capability.

Why / evidence base

Grounded in the session's naming-theory research artifacts (outcome-gated,
primary-source-direct-fetch): .work/naming-theory/RESEARCH.md and its four
siblings. Load-bearing findings behind the changes:

  • Median ~6.9% inter-developer name agreement (Feitelson, IEEE TSE 2022,
    arXiv:2103.07487; reproduced by Alpern 2024) — validates blind
    multi-generator fan-out.
  • The replicated concept → word → structure model produced better-judged
    names ~2:1; "longer names" alone did nothing — the process drives it.
    This is the structured brief's shape.
  • Misleading names measured as bad as or worse than meaningless ones
    (Avidan & Feitelson, ICPC 2017) — the reason semantic accuracy ranks
    first.
  • Full-word identifiers ~19% faster to comprehend, bounded and
    experience-moderated (Hofmeister, SANER 2017) — the comprehensibility
    tier.
  • For the modality layer: clig.dev, and the Claude Code skills docs
    (description-drives-discovery), plus the conflicting official style
    guides for the abbreviation/acronym-casing entries.

context/sources.md records these as citations (claim + URL + tier) and
honestly marks paywalled book sources (Clean Code ch.2, .NET 3rd-edition)
as Tier-2-for-verification.

Fresh-docs citation (mandate)

Per the repo's fresh-docs mandate, the Skills doc was fetched this session
before touching the skill: https://code.claude.com/docs/en/skills
confirms the description (not the name) drives auto-invocation and the
combined description text is truncated at 1,536 chars in the skill listing,
which backs the modality note.

Gates

Do not merge — for review.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VLztic1sFn2CVFJsubr7pu

Related

No linked issue.

kyle-sexton and others added 2 commits July 18, 2026 13:16
…protocol (0.2.0)

Upgrade the name-it-better skill with research-grounded structure, keeping
its existing blind-generator method and tone. Delta changes, not a rewrite.

- Structured context brief: the loose "distill a brief" step becomes named
  fields (responsibility, firing/usage context, scope boundaries,
  collision vocabulary, word-level blocklist with reasons, rejected
  incumbents with reasons), mirroring the replicated concept -> word ->
  structure naming model.
- Declared criteria priority: research-ordered fallback (semantic accuracy
  > scope fit > comprehensibility > trigger utility) governs scoring and
  judging; a consuming project's declared conventions still override.
- Rejection-reason iteration protocol: a rejected candidate's REASON is
  captured as a new brief constraint fed into the next blind round;
  rejected names and words never re-enter. New eval covers it.
- Modality layer: universal semantic vs modality-specific syntactic;
  documented style conflicts route to the consuming ecosystem's guide;
  for skills the description (not the name) drives discovery.
- Strengthened domain-concept pointer to a domain-modelling capability.
- sources.md adds the primary empirical sources behind the criteria
  priority and modality layer, and honestly marks paywalled book sources
  as Tier-2-for-verification.

Evidence base: .work/naming-theory research artifacts (Feitelson TSE 2022,
Alpern 2024, Avidan & Feitelson 2017, Hofmeister 2017; clig.dev and the
Claude Code skills docs for the modality layer).

Gates: markdownlint-cli2, claude plugin validate, /skill-quality:check
(PASS 0/0, all trigger phrases preserved), evals schema-valid (6 cases).

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
The naming plugin.json description now names the structured brief and the
research-ordered criteria priority; regenerate the README catalog block so
the manifest drift gate (scripts/generate-catalog.mjs --check) stays green.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 14019a1a73

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/naming/skills/name-it-better/SKILL.md Outdated
@claude

claude Bot commented Jul 18, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 7s —— View job


PR Review — feat(naming): research-backed criteria, structured briefs, rejection protocol (0.2.0)

  • Gather context and understand the PR
  • Read changed files
  • Evaluate Codex reviewer finding on rejected-name anchoring
  • Review SKILL.md for correctness and design
  • Review evals.json for schema validity and coverage
  • Review sources.md and supporting context files
  • Review plugin.json and CHANGELOG.md
  • Synthesize and post final review

Overall, this is a well-structured, research-grounded upgrade. The criteria priority, modality layer, and rejection-reason iteration protocol are all sound design. However, there is one real design bug that the Codex reviewer correctly identified, and it also propagates into evals.json. Everything else is solid.


Finding 1 — Internal contradiction: rejected incumbents appear in the generator brief [CONFIRMED]

The Codex reviewer flagged this correctly. There is a direct contradiction between two parts of SKILL.md:

Brief definition (step 1) includes rejected incumbents as a named field generators receive:

SKILL.md L91: **Rejected incumbents** — whole names already turned down, each WITH the reason it failed.

Merge step (step 3) says the exact opposite:

SKILL.md L108–110: 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**

The Gotchas section (L190–192) confirms the intended design — generators are expected to potentially independently re-derive the rejected name without knowing it beforehand:

"A blind generator can still independently re-derive the rejected incumbent (common for generic labels like Manager or Context). That is not a blinding failure — the main thread's reject list disqualifies it at merge time regardless of how a candidate was produced."

If the brief carries the rejected name, the word "independently" loses its meaning, and you've reintroduced the anchoring the blind fan-out is meant to prevent.

The fix: Remove Rejected incumbents from the brief field list. The rejection reason — not the name — should be encoded into the brief via the abstraction layer already defined in "Iterate on the rejection reason":

  • a problematic word → word-level blocklist entry (with reason)
  • wrong scope objection → scope-boundary correction
  • criteria-miss objection → criteria reweight

The rejected name itself stays on the main-thread reject list only.


Finding 2 — Same contradiction echoed in evals.json eval #1

evals.json L11 has a self-defeating expectation:

"Builds a structured context brief with named fields (..., rejected incumbents) and 
 seeds the generators with the brief ONLY (blind to the conversation), not the rejected name"

The phrase "not the rejected name" contradicts the rejected incumbents field in the same sentence — if the brief includes "rejected incumbents," the generators do see the rejected name. Once the SKILL.md brief definition is corrected, this expectation should be updated to match.

Fix both issues →


Everything else — looks good

Criteria ordering (L38–53): Research-ordered fallback (semantic accuracy → scope fit → comprehensibility → trigger utility) is well-justified. The hierarchy is clean, and the note that declared conventions always override it is the right layering.

Modality layer (L55–74): The semantic/syntactic split is sound. Routing documented style conflicts (abbreviation policy, acronym casing, casing style) to the consuming ecosystem rather than picking a house verdict is the right call. The Claude Code skills special case (description, not name, drives discovery) is accurate and high-confidence per the sources.

"Iterate on rejection reason" section (L117–133): This is well-designed. Capturing the rejection as a brief constraint rather than a one-off filter is the key mechanism that prevents round-over-round drift. The three-bucket encoding (blocklist word / scope correction / criteria reweight) is concrete and actionable.

Gotchas section (L184–199): Useful additions. The note about generators independently re-deriving a rejected name being "not a blinding failure" is an important clarification that prevents unnecessary alarm.

context/sources.md: Excellent citation hygiene. Tiering the sources (PRIMARY / AUTHORITATIVE / SECONDARY) and honestly flagging paywalled sources (Clean Code ch.2, .NET 3rd-edition) as Tier-2-for-verification is exactly the right epistemic discipline for a research-grounded file. Reference links are clean.

evals.json: Six evals, good scenario coverage. Evals #2 (collision disqualification), #3 (tournament honest framing), #4 (missing criterion routes upstream), #5 (tournament preserves filters) are well-specified. Eval #6 (rejection-reason iteration) covers the new protocol directly. The only issue is eval #1 as noted above.

plugin.json: Version bumped to 0.2.0, description refreshed. Clean.

CHANGELOG.md: Follows Keep a Changelog format. Entries are accurate and complete.


Summary

Two changes needed before merge, both in the same cluster:

  1. Remove Rejected incumbents from the step-1 brief field list in SKILL.md — the rejected name must not reach generators; only abstracted reasons (blocklist words, scope corrections, reweights) do.
  2. Update eval chore: initialize marketplace scaffold #1 expectation in evals.json to remove the self-contradicting reference to "rejected incumbents" in the brief fields.

Everything else is well-reasoned and well-cited. The research grounding in sources.md is a notable improvement over 0.1.0.

@claude

claude Bot commented Jul 18, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 25s —— View job


  • Gather context and understand the PR
  • Read changed files
  • Check if previous review findings were addressed
  • Synthesize and post final review

Review update — feat/name-it-better-research-criteria (re-sync)

The latest commit (f8c9408) is a merge-from-main that pulled in e61cb5d (CI pin bump only). No changes were made to the skill files. The two open findings from the prior review are still unresolved.


Finding 1 — STILL OPEN: Internal contradiction in SKILL.md [CONFIRMED]

SKILL.md L90–91 lists "Rejected incumbents" as a named field the generators receive in the brief:

- **Rejected incumbents** — whole names already turned down, each WITH
  the reason it failed.

SKILL.md L107–109 says the exact opposite:

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

If "Rejected incumbents" is a brief field, generators see the rejected names — undermining the blind fan-out's anti-anchoring purpose.

Fix: Remove Rejected incumbents from the step-1 brief field list. The rejection reason already flows into the brief through the three abstraction buckets defined in "Iterate on the rejection reason" (blocklist word / scope-boundary correction / criteria reweight). Only the raw rejected name must stay on the main-thread reject list only.

Fix SKILL.md →


Finding 2 — STILL OPEN: Same contradiction in evals.json eval #1

evals.json L11:

"Builds a structured context brief with named fields (..., rejected incumbents)
 and seeds the generators with the brief ONLY (blind to the conversation), not the rejected name"

"Rejected incumbents" is listed as a brief field in the same sentence that says generators do not receive the rejected name — a direct self-contradiction. Once SKILL.md is corrected, update this expectation to remove "rejected incumbents" from the listed brief fields.

Fix evals.json →


Everything else — unchanged, still looks good

All other aspects of the PR reviewed in the prior pass are sound and unchanged: criteria priority ordering, modality layer, rejection-reason iteration protocol, Gotchas section, sources.md citation hygiene, evals #2–6, plugin.json, and CHANGELOG.md.

Two changes needed before this is ready to merge, both in the same cluster.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f8c9408f06

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/naming/skills/name-it-better/SKILL.md Outdated
Comment thread plugins/naming/skills/name-it-better/SKILL.md Outdated
@claude

claude Bot commented Jul 18, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 6s —— View job


  • Gather context and understand the PR
  • Read current SKILL.md to check if prior findings were addressed
  • Read current evals.json to check if prior findings were addressed
  • Evaluate new Codex P2 findings (collision recheck, criteria preservation)
  • Synthesize and post final review

Review update — feat/name-it-better-research-criteria (re-sync, commit 6ec224e)

The latest commit is another merge-from-main. The two open findings from prior reviews are still unresolved. Two new Codex P2 findings from the second review cycle are also assessed below.


Finding 1 — STILL OPEN: Internal contradiction in SKILL.md [CONFIRMED]

SKILL.md L90–91 lists Rejected incumbents as a named brief field the generators receive:

- **Rejected incumbents** — whole names already turned down, each WITH the reason it failed.

SKILL.md L107–109 says the rejected name is never shared with the generators:

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

These two statements directly contradict each other in the same skill. If the brief carries rejected incumbents, the generators see the rejected names — which defeats the anti-anchoring purpose of the blind fan-out.

Fix: Remove the Rejected incumbents bullet from the step-1 brief field list. The rejection reason already flows into the brief through the three abstraction buckets in "Iterate on the rejection reason" (blocklist word / scope-boundary correction / criteria reweight). The raw rejected name stays on the main-thread reject list only.

Fix SKILL.md →


Finding 2 — STILL OPEN: Same contradiction in evals.json eval #1 [CONFIRMED]

evals.json L11:

"Builds a structured context brief with named fields (responsibility, firing/usage context, 
 scope boundaries, collision vocabulary, word-level blocklist, rejected incumbents) and seeds 
 the generators with the brief ONLY (blind to the conversation), not the rejected name"

"Rejected incumbents" is a listed brief field in the same sentence that says generators do not receive the rejected name. Fix this once SKILL.md is corrected: remove rejected incumbents from the listed brief fields, keeping or rephrasing not the rejected name to the rejected name is carried as a main-thread reject list, never in the brief.

Fix evals.json →


Finding 3 — NEW (Codex P2): Post-shaping collision re-check is missing [PLAUSIBLE]

SKILL.md L55–63 describes syntactic shaping as "a final shaping pass over the semantic winners." The default pass's collision check (step 3, L106–111) runs before scoring, not after shaping. A syntactic transformation can introduce a new collision — for example, SessionStore passes the semantic collision check against a Python-style codebase that has session_store, but shaping to snake_case yields an identical form.

The skill has no step prescribing a re-verification of collisions post-shaping. Add either a note to the modality-layer section that collision-checks must be re-run after shaping, or a sub-bullet to step 3/4 to re-verify collisions once the syntactic form is fixed.


Finding 4 — NEW (Codex P2): Retry reweighting should be scoped to fallback criteria only [PLAUSIBLE]

SKILL.md L127–128:

- a "these all miss what matters" objection **reweights the criteria** for
  the next round.

This is unconditional. But the criteria section (L29–34) establishes that declared conventions always win. If a consuming project has declared conventions and a human gives a criteria-miss objection, "reweights the criteria" could be read as permitting a reweight that promotes a convention-noncompliant name above a compliant one.

The wording should bound the reweight: **reweights the fallback criteria** for the next round — if declared conventions are in force, route this priority change up into them (rule 1 applies here too). This keeps the iteration mechanism sound and consistent with the declared-conventions-win hierarchy.


Status summary

# Finding Status
1 Rejected incumbents in brief contradicts step-3 never-shared rule STILL OPEN
2 evals.json eval #1 echoes the same contradiction STILL OPEN
3 No post-shaping collision re-check NEW — PLAUSIBLE
4 Retry reweight not scoped to fallback criteria NEW — PLAUSIBLE

Findings 1 and 2 are a confirmed design contradiction that must be fixed before merge. Findings 3 and 4 are real but smaller gaps worth addressing in the same pass.

Everything else — criteria priority ordering, modality layer, rejection-reason iteration structure, Gotchas section, sources.md citation hygiene, evals #2–6, plugin.json, and CHANGELOG.md — remains well-reasoned and unchanged.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6ec224ed59

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/naming/skills/name-it-better/SKILL.md Outdated
…ping paths

- Rejected incumbent names stay main-thread only; the blind brief carries
  the abstracted rejection reason, never the name (anti-anchoring).
- Collision and reject-list checks re-run on the syntactically shaped
  form, which can recreate a sibling or rejected incumbent.
- Rejection-driven criteria reweighting operates only where declared
  conventions leave space; contradictions route upstream.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 18, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 51s —— View job


  • Gather context and understand the PR
  • Read current SKILL.md to verify four findings were addressed
  • Read current evals.json to verify Finding 2 was addressed
  • Synthesize and post final review

Review update — feat/name-it-better-research-criteria (commit ec14658)

Commit ec14658 ("fix(naming): close four review-found logic holes in the retry and shaping paths") correctly closes three of the four outstanding findings. One remains open.


Finding 1 — FIXED ✅

SKILL.md L81–98: The brief field list now contains exactly five fields — Responsibility, Firing/usage context, Scope boundaries, Collision vocabulary, Word-level blocklist — and the follow-on paragraph (L94–98) explicitly states the anti-anchoring design:

"Rejected incumbent NAMES deliberately stay out of the brief — the main thread holds them as its reject list and disqualifies matches at merge time… Only the abstracted REASON a name failed enters the brief, as a blocklist entry or scope-boundary correction."

This is correct. The contradiction with step 3's "never shared with the generators" is resolved.


Finding 2 — STILL OPEN ❌

evals.json L8 — the expected_output for eval #1:

"…structured context brief with named fields (responsibility, firing/usage context,
 scope boundaries, collision vocabulary, word-level blocklist with reasons,
 rejected incumbents with reasons)…"

evals.json L11 — the first expectations entry:

"Builds a structured context brief with named fields (responsibility, firing/usage
 context, scope boundaries, collision vocabulary, word-level blocklist,
 rejected incumbents) and seeds the generators with the brief ONLY
 (blind to the conversation), not the rejected name"

Both still list rejected incumbents as a named brief field — directly contradicting the fixed SKILL.md which now explicitly excludes them. The eval currently passes a description that would fail its own expectation: "blind to the conversation, not the rejected name" is true only if the brief omits the rejected name, but the brief description lists "rejected incumbents" alongside the other fields.

Fix: In expected_output (L8), replace word-level blocklist with reasons, rejected incumbents with reasons with word-level blocklist with reasons (encoding why prior names or words failed) or equivalent. In expectations[0] (L11), remove rejected incumbents from the listed brief fields and add a clause clarifying that rejected names are held on the main-thread reject list, not in the brief.

Fix evals.json →


Finding 3 — FIXED ✅

SKILL.md L62–66:

"Shaping can change the string, so RE-RUN the collision and reject-list checks on the shaped form: a normalization (SessionStoresession_store) can recreate an existing sibling or a rejected incumbent that the pre-scoring check could not match."

This is exactly the right fix — prescribes the re-check at the point where the problem is introduced (after syntactic shaping), with a concrete example.


Finding 4 — FIXED ✅

SKILL.md L134–138:

"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."

The reweight is now correctly bounded, and the declared-conventions-win hierarchy is preserved end-to-end.


Status summary

# Finding Status
1 Rejected incumbents in brief contradicts step-3 never-shared rule FIXED
2 evals.json eval #1 still lists "rejected incumbents" as a brief field STILL OPEN
3 No post-shaping collision re-check FIXED
4 Retry reweight not scoped to fallback criteria FIXED

One small change remaining before merge: remove rejected incumbents from the brief field descriptions in eval #1 (expected_output + expectations[0]) to match the now-correct SKILL.md.

Everything else — SKILL.md criteria ordering, modality layer, the rejection-reason iteration mechanism, Gotchas section, sources.md citation hygiene, evals #2–6, plugin.json, and CHANGELOG.md — remains well-reasoned and correct.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ec14658b27

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/naming/skills/name-it-better/evals/evals.json Outdated
Review finding: the eval's brief field list still named rejected
incumbents as brief content. The eval now expects the rejected name to
stay on the main-thread reject list with only its abstracted reason
entering the brief, matching SKILL.md.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 18, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 50s —— View job


  • Gather context and understand the PR
  • Read current evals.json to verify Finding 2 was addressed in latest commit (fa1cb5d)
  • Synthesize and post final review

Review update — feat/name-it-better-research-criteria (commit fa1cb5d)

Commit fa1cb5d ("fix(naming): align rejection eval with the main-thread-only reject list") closes the last remaining finding. All four findings are now resolved.


Finding 2 — FIXED ✅

evals.json L8expected_output:

"…word-level blocklist with reasons — the rejected NAME itself stays out of the brief,
 held on the main-thread reject list, with only its abstracted rejection reason
 entering as a constraint…"

evals.json L11expectations[0]:

"Builds a structured context brief with named fields (responsibility, firing/usage
 context, scope boundaries, collision vocabulary, word-level blocklist carrying
 the abstracted rejection reason) and seeds the generators with the brief ONLY
 (blind to the conversation) — the rejected name itself never appears in the brief"

rejected incumbents has been removed from both the expected_output field list and expectations[0]. Both now accurately describe the main-thread-only reject list design and explicitly state the rejected name never appears in the brief. This matches SKILL.md L94–98.


Final status — all findings resolved

# Finding Status
1 Rejected incumbents in brief contradicts step-3 never-shared rule FIXED ✅ (ec14658)
2 evals.json eval #1 still listed "rejected incumbents" as a brief field FIXED ✅ (fa1cb5d)
3 No post-shaping collision re-check FIXED ✅ (ec14658)
4 Retry reweight not scoped to fallback criteria FIXED ✅ (ec14658)

The PR is ready to merge. The research grounding, structured brief design, modality layer, rejection-reason iteration protocol, and all six evals are correct and internally consistent.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fa1cb5df9e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/naming/skills/name-it-better/SKILL.md
Comment thread plugins/naming/README.md
…ef wording

Review findings: the merge step now disqualifies candidates containing a
word-level blocklist entry (generators can miss a brief constraint), and
the README no longer describes a name-level blocklist in the brief —
rejected names live on the main-thread reject list only.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 18, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 26s —— View job


  • Gather context and understand the PR
  • Read current SKILL.md to verify word-level blocklist merge enforcement (commit 8e47850)
  • Read current plugins/naming/README.md to verify rejected-name brief wording
  • Synthesize and post final review

Review update — feat/name-it-better-research-criteria (commit 8e47850)

Commit 8e47850 ("fix(naming): enforce word blocklist at merge time; correct README brief wording") closes the two remaining Codex P2 findings. All six findings across the full review cycle are now resolved.


Finding 5 — FIXED ✅

SKILL.md L113–120 — the merge step now reads:

"disqualify any candidate that matches the rejected incumbent (if any) … that contains a word-level blocklist entry (a generator can miss the brief's constraint; the merge step enforces it), or that collides with the existing vocabulary."

The merge step now independently enforces the word-level blocklist, so a generator that misses the brief constraint doesn't allow a blocklisted word to reach scoring. Correct.


Finding 6 — FIXED ✅

plugins/naming/README.md L17–20 — the brief description now reads:

"a structured context brief (responsibility, firing context, scope boundaries, collision vocabulary, word-level blocklist — rejected NAMES stay on the main thread's reject list, never in the brief)"

The README no longer implies a name-level blocklist in the generator brief. The distinction between word-level constraints (in the brief) and name-level rejected incumbents (main-thread only) is now stated explicitly. Correct.


Final status — all findings resolved

# Finding Status
1 Rejected incumbents in brief contradicts step-3 never-shared rule FIXED ✅ (ec14658)
2 evals.json eval #1 still listed "rejected incumbents" as a brief field FIXED ✅ (fa1cb5d)
3 No post-shaping collision re-check FIXED ✅ (ec14658)
4 Retry reweight not scoped to fallback criteria FIXED ✅ (ec14658)
5 Word-level blocklist not enforced at merge time FIXED ✅ (8e47850)
6 README brief described a name-level blocklist FIXED ✅ (8e47850)

The PR is ready to merge. The full design — research-ordered criteria, structured brief with correct field scope, anti-anchoring reject-list separation, post-shaping rechecks, and rejection-reason iteration protocol — is internally consistent across SKILL.md, evals.json, and README.md.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8e47850341

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/naming/CHANGELOG.md Outdated
…ject rule

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 18, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 8s —— View job


  • Gather context and understand the PR
  • Read CHANGELOG.md to verify the latest fix (commit 2940ab1)
  • Final synthesis and review

Review update — feat/name-it-better-research-criteria (commit 2940ab1)

Commit 2940ab1 ("fix(naming): align changelog brief-field list with the main-thread reject rule") closes the last Codex P2 finding. All findings across the full review cycle are now resolved.


Finding 7 — FIXED ✅

CHANGELOG.md L10–16 — the brief-field list in the 0.2.0 entry now reads:

"responsibility, firing/usage context, scope boundaries (what it is NOT), collision vocabulary, and word-level blocklist (with reasons) — … rejected incumbent NAMES stay on the main-thread reject list and never enter it."

The five fields match SKILL.md exactly, and the sentence following them explicitly calls out that rejected names are main-thread only. The wording is consistent with SKILL.md L94–98 and evals.json L8.


Final status — all findings resolved

# Finding Status Commit
1 Rejected incumbents in brief contradicts step-3 never-shared rule FIXED ec14658
2 evals.json eval #1 still listed "rejected incumbents" as a brief field FIXED fa1cb5d
3 No post-shaping collision re-check FIXED ec14658
4 Retry reweight not scoped to fallback criteria FIXED ec14658
5 Word-level blocklist not enforced at merge time FIXED 8e47850
6 README brief described a name-level blocklist FIXED 8e47850
7 CHANGELOG brief-field list included rejected incumbents FIXED 2940ab1

The PR is ready to merge. The design is internally consistent across all four artifacts that describe the brief (SKILL.md, evals.json, README.md, CHANGELOG.md), and the meta-lesson in the final comment — treating SKILL.md as the single source of truth for the field list — is a good process note for future revisions.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2940ab1153

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/naming/skills/name-it-better/SKILL.md
…tion

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 18, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 0s —— View job


  • Gather context and understand the PR
  • Read current SKILL.md to verify the tournament blocklist fix (commit 6363135)
  • Synthesize and post final review

Review update — feat/name-it-better-research-criteria (commit 6363135)

Commit 6363135 ("fix(naming): apply the word-level blocklist before tournament elimination") closes the last Codex P2 finding. All findings across the full review cycle are now resolved.


Finding 8 — FIXED ✅

SKILL.md L157–163 — the tournament section now reads:

"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."

The tournament pre-bracket merge now explicitly applies the word-level blocklist. A word-rejected candidate (e.g., OrderManager after a "stop giving me Manager names" rejection) is disqualified before it can enter or win the elimination bracket. Correct.


Final status — all findings resolved

# Finding Status Commit
1 Rejected incumbents in brief contradicts step-3 never-shared rule FIXED ec14658
2 evals.json eval #1 still listed "rejected incumbents" as a brief field FIXED fa1cb5d
3 No post-shaping collision re-check FIXED ec14658
4 Retry reweight not scoped to fallback criteria FIXED ec14658
5 Word-level blocklist not enforced at merge time FIXED 8e47850
6 README brief described a name-level blocklist FIXED 8e47850
7 CHANGELOG brief-field list included rejected incumbents FIXED 2940ab1
8 Word blocklist not applied before tournament elimination FIXED 6363135

The PR is ready to merge. The design is now internally consistent across every layer — the anti-anchoring reject-list separation, word-level blocklist enforcement at both merge time and tournament pre-bracket, post-shaping rechecks, and criteria reweighting bounded by declared conventions — and correctly expressed in all five artifacts that describe the protocol (SKILL.md, evals.json, README.md, CHANGELOG.md, and the Gotchas section).

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6363135676

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/naming/skills/name-it-better/SKILL.md Outdated
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 18, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 3s —— View job


  • Gather context and understand the PR
  • Read current SKILL.md to verify the shaped-form word blocklist recheck (commit 13de41b)
  • Synthesize and post final review

Review update — feat/name-it-better-research-criteria (commit 13de41b)

Commit 13de41b ("fix(naming): re-run the word blocklist on the syntactically shaped form") closes the last Codex P2 finding. All findings across the full review cycle are now resolved.


Finding 9 — FIXED ✅

SKILL.md L63–67 — the shaped-form recheck now reads:

"Shaping can change the string, so RE-RUN the collision, reject-list, and word-blocklist checks on the shaped form: a normalization (SessionStoresession_store) can recreate an existing sibling or a rejected incumbent, and a required affix can introduce a blocked word (OrderOrderManager) that the pre-scoring filters could not match."

The word-blocklist is now explicitly included in the shaped-form recheck alongside collision and reject-list. The concrete affix-shaping example (OrderOrderManager when Manager is blocked) was also added — this directly addresses the Codex finding's stated failure scenario.


Final status — all findings resolved

# Finding Status Commit
1 Rejected incumbents in brief contradicts step-3 never-shared rule FIXED ec14658
2 evals.json eval #1 still listed "rejected incumbents" as a brief field FIXED fa1cb5d
3 No post-shaping collision re-check FIXED ec14658
4 Retry reweight not scoped to fallback criteria FIXED ec14658
5 Word-level blocklist not enforced at merge time FIXED 8e47850
6 README brief described a name-level blocklist FIXED 8e47850
7 CHANGELOG brief-field list included rejected incumbents FIXED 2940ab1
8 Word blocklist not applied before tournament elimination FIXED 6363135
9 Word blocklist not re-run after syntactic shaping (affix case) FIXED 13de41b

The PR is ready to merge. Every layer of the design — anti-anchoring reject-list separation, word-level blocklist enforcement at merge time, at tournament pre-bracket, and on the syntactically shaped form — is internally consistent and correctly expressed across all five artifacts (SKILL.md, evals.json, README.md, CHANGELOG.md, and the Gotchas section).

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 13de41b1eb

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/naming/skills/name-it-better/SKILL.md
Review finding: blind generators need the kind of thing being named to
fix noun-vs-verb form, and the shaping pass needs it to select the
syntactic conventions.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 18, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 22s —— View job



Review update — feat/name-it-better-research-criteria (commit 24a0aff)

Commit 24a0aff adds the Target modality field to SKILL.md as the leading brief field, correctly addressing the Codex P2 finding. The addition itself is precise and well-placed. However, the same three downstream artifacts that kept diverging throughout this review cycle were not updated — repeating the exact drift pattern the PR's own meta-lesson flagged.


Finding 10 — PARTIAL FIX: Target modality in SKILL.md but not in companion artifacts

What changed: SKILL.md L85–88 now correctly lists Target modality as the leading brief field:

- **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.

What was not updated — three artifacts still describe a 5-field brief:

  1. README.md L17–19 — the brief description reads (responsibility, firing context, scope boundaries, collision vocabulary, word-level blocklist…) — Target modality is absent.

  2. CHANGELOG.md L10–12 — the 0.2.0 "Structured context brief" entry lists responsibility, firing/usage context, scope boundaries (what it is NOT), collision vocabulary, and word-level blocklist (with reasons) — Target modality is absent.

  3. evals.json L8 + L11 — eval chore: initialize marketplace scaffold #1's expected_output and expectations[0] both enumerate the brief fields without Target modality.

This is the same drift pattern that drove findings 2, 6, and 7 in this review cycle. The PR's own meta-lesson (posted after finding 7 was fixed) noted: "the field list was restated in four artifacts and each drifted — future revisions will point at SKILL.md as the single source." The Target modality fix touched only SKILL.md.

Fix README.md → | Fix CHANGELOG.md → | Fix evals.json →


Everything else — unchanged, still looks good

SKILL.md itself (criteria ordering, modality layer, rejection-reason iteration protocol, tournament pre-bracket disqualification, shaped-form rechecks, Gotchas section) is correct and internally consistent across all nine prior findings. The Target modality field definition at L85–88 is the right fix — it belongs as the leading field because it gates the noun-vs-verb constraint and the shaping-pass convention selection.

Three small updates needed before merge, all the same cluster: add target modality as the leading field in README.md L17, CHANGELOG.md L10, and evals.json eval #1.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 24a0afff35

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/naming/skills/name-it-better/SKILL.md Outdated
@kyle-sexton
kyle-sexton enabled auto-merge (squash) July 18, 2026 22:02
…-shaping

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 18, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 33s —— View job


  • Gather context and understand the PR
  • Read changed files to verify latest commit (a3490e6) addresses Finding 10 (target-modality propagation) and Codex dedupe finding
  • Synthesize and post final review

Review update — feat/name-it-better-research-criteria (commit a3490e6)

Commit a3490e6 ("fix(naming): re-run the full merge filter set, including dedupe, post-shaping") closes the Codex P2 dedupe finding. Finding 10 from the prior review remains open.


Codex dedupe finding — FIXED ✅

SKILL.md L63–69 — the shaped-form recheck now explicitly names the full filter set:

"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-storesession_store), a normalization can recreate an existing sibling or a rejected incumbent, and a required affix can introduce a blocked word (OrderOrderManager) that the pre-scoring filters could not match."

Dedupe is now included alongside collision, reject-list, and word-blocklist in the post-shaping pass. The SessionStore/session-storesession_store collapse example is exactly the failure scenario the Codex finding described. Correct.


Finding 10 — STILL OPEN ❌: Target modality absent from companion artifacts

Commit 24a0aff added Target modality as the leading brief field in SKILL.md. Commit a3490e6 did not propagate it to the three companion artifacts that describe the brief field list. All three still enumerate a 5-field brief:

README.md L17–19:

(responsibility, firing context, scope boundaries, collision vocabulary, word-level blocklist — 
 rejected NAMES stay on the main thread's reject list, never in the brief)

Target modality is absent.

CHANGELOG.md L10–12:

responsibility, firing/usage context, scope boundaries (what it is NOT), collision vocabulary, 
and word-level blocklist (with reasons)

Target modality is absent.

evals.json L8 + L11 — eval #1 expected_output and expectations[0] both enumerate:

responsibility, firing/usage context, scope boundaries, collision vocabulary, word-level blocklist

Target modality is absent from both.

Three small updates needed, same cluster as before:

Fix README.md → | Fix CHANGELOG.md → | Fix evals.json →


Full status

# Finding Status Commit
1 Rejected incumbents in brief contradicts step-3 never-shared rule FIXED ec14658
2 evals.json eval #1 still listed "rejected incumbents" as a brief field FIXED fa1cb5d
3 No post-shaping collision re-check FIXED ec14658
4 Retry reweight not scoped to fallback criteria FIXED ec14658
5 Word-level blocklist not enforced at merge time FIXED 8e47850
6 README brief described a name-level blocklist FIXED 8e47850
7 CHANGELOG brief-field list included rejected incumbents FIXED 2940ab1
8 Word blocklist not applied before tournament elimination FIXED 6363135
9 Word blocklist not re-run after syntactic shaping (affix case) FIXED 13de41b
10 Target modality absent from README, CHANGELOG, evals.json STILL OPEN
11 Dedupe not re-run on shaped forms FIXED a3490e6

One cluster of three small updates remains before merge: add target modality as the leading brief field in README.md, CHANGELOG.md, and evals.json eval #1.

@kyle-sexton
kyle-sexton merged commit ace19e5 into main Jul 18, 2026
14 checks passed
@kyle-sexton
kyle-sexton deleted the feat/name-it-better-research-criteria branch July 18, 2026 22:05

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a3490e61db

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +87 to +90
- **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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Carry resolved syntax constraints in the generator brief

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 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant