Assign Claude model tiers to skill wrappers#34
Conversation
Give every Claude wrapper under `claude/` an explicit, alias-based model tier so routine skills stop billing at the session model: - `haiku` for script-driven pipelines (`update-copyright`, `run-build`, `api-discovery`, `check-links`) and the `dependency-audit` agent — replacing its dated `claude-haiku-4-5-20251001` pin, which would rot as consumers float to `master`. - `sonnet` for procedural edits and checklist reviews (`bump-version`, `bump-gradle`, `version-bumped`, `dependency-update`, `move-files`, `which-fixer`, and the `spine-code-review`, `review-docs`, and `gradle-review` agents). - Session model, deliberately, for deep-reasoning work (`pre-pr`, `java-to-kotlin`, `raise-coverage`, `write-docs`, and the `kotlin-engineer` agent). New wrappers extend coverage: agents for `check-links` and `gradle-review`, commands for `check-links`, `which-fixer`, `version-bumped`, and `api-discovery`. The `pre-pr` command now lists the `check-links` dispatch its skill already required. The tier convention, the alias-only rule, and the inline-by-design skills are documented in `docs/authoring-skills.md`. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR standardizes Claude Code wrapper metadata by explicitly assigning model tiers (via aliases) for commands and agents under claude/, adds missing wrappers so all skills have an intentional model decision, and documents the tiering conventions in docs/authoring-skills.md (including a pre-PR validation check).
Changes:
- Adds/updates
model:frontmatter across Claude command and agent wrappers to enforce tier choices (haiku/sonnet/inherit). - Introduces new Claude wrappers for
api-discovery,check-links,which-fixer,version-bumped, plus new reviewer agentscheck-linksandgradle-review. - Updates documentation and the
pre-prwrapper to include thecheck-linksdispatch rule and alias-only validation guidance.
Reviewed changes
Copilot reviewed 18 out of 18 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| docs/authoring-skills.md | Documents Claude wrapper tiering conventions and adds a pre-PR validation bullet for alias-only models. |
| claude/commands/which-fixer.md | New command wrapper with model: sonnet for the which-fixer skill. |
| claude/commands/version-bumped.md | New command wrapper with model: sonnet for the version-bumped skill. |
| claude/commands/update-copyright.md | Sets model: haiku to avoid inheriting the session model for routine work. |
| claude/commands/run-build.md | Sets model: haiku for deterministic build routing. |
| claude/commands/review-docs.md | Sets model: sonnet for procedural documentation review. |
| claude/commands/pre-pr.md | Extends wrapper dispatch rules to include check-links with sentinel short-circuit behavior. |
| claude/commands/move-files.md | Sets model: sonnet for procedural refactoring/rename work. |
| claude/commands/dependency-update.md | Sets model: sonnet for dependency refresh workflow. |
| claude/commands/check-links.md | New command wrapper with model: haiku for Hugo/Lychee link checking. |
| claude/commands/bump-version.md | Sets model: sonnet for version bump workflow. |
| claude/commands/bump-gradle.md | Sets model: sonnet for Gradle wrapper upgrade workflow. |
| claude/commands/api-discovery.md | New command wrapper with model: haiku for deterministic artifact source resolution. |
| claude/agents/spine-code-review.md | Sets agent wrapper model: sonnet instead of inheriting. |
| claude/agents/review-docs.md | Sets agent wrapper model: sonnet instead of inheriting. |
| claude/agents/gradle-review.md | New reviewer agent wrapper with model: sonnet. |
| claude/agents/dependency-audit.md | Replaces dated pinned model ID with alias haiku. |
| claude/agents/check-links.md | New reviewer agent wrapper with model: haiku. |
Comments suppressed due to low confidence (1)
claude/commands/check-links.md:20
- The wrapper’s not-applicable and sentinel instructions don’t match the
check-linksskill: the skill returns a specificAPPROVE — ...line and exits early without writingcheck-links.okwhen no Hugo site exists (skills/check-links/SKILL.md:58-60). Also, the sentinel is written only after running the build/serve/check pipeline (step 8), not for the not-applicable early exit.
- If no Hugo config exists under `docs/` or `site/`, report the check as
not applicable and stop — do not write a `FAIL` sentinel for that case.
- Always tear the Hugo server down (step 8), even when Lychee fails, and
write the `check-links.ok` sentinel to the repository's git directory.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Fold the new agents' description lines into `>` YAML scalars and tighten the three new command descriptions, so every added line fits the 100-char `max-line-length` from the coding guideline. - Reword the `gradle-review` wrapper to reference the skill's search recipes instead of naming ripgrep directly. - Clarify that the `check-links` command writes its sentinel only when the pipeline actually runs (not on the not-applicable early exit). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c5591d4827
ℹ️ 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".
Both commands follow tightly specified procedures — the bump policy and its deterministic guard script. They move together deliberately: `version-bumped` runs `bump-version` as its recovery path, so the guard must never sit on a lower tier than the action it embeds. The pairing rule is now recorded in docs/authoring-skills.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Let /version-bumped complete its advertised auto-recovery: drop the wrapper-level pre-commit stop and defer to the bump-version skill's documented commit policy (the git-commit permission gate still applies). - Make the check-links agent end with the reviewers' one-line verdict (APPROVE / REQUEST CHANGES) so pre-pr aggregates it uniformly. - Use the skill's exact not-applicable response line in the check-links command instead of paraphrasing it. - Fold the three overlong allowed-tools lines into `>-` block scalars (parsed value unchanged) to fit the 100-char limit. All wrapper frontmatters now pass a strict YAML parse; the pre-fold single-line gradle-review description genuinely did not (`Scope:` began a nested mapping), confirming the folded form fixed a latent bug. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The pre-PR validation bullet read as if `inherit` were valid on any wrapper; commands inherit the conversation model by omitting the field. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Fold every over-limit description and allowed-tools line in the wrappers this PR touches into `>` / `>-` block scalars, wording and parsed values unchanged. - Pre-approve `git fetch` and `git merge-base` for /bump-version — the skill's idempotency gate runs them routinely. `git commit` stays out of the allowlist deliberately: allowed-tools only pre-approves, and commits are intentionally routed through the repo's ask-gated permission prompt plus the wrapper's stop-and-ask step. Body prose over the limit that predates this PR is left to the separate frontmatter-folding follow-up, as is the untouched kotlin-engineer wrapper. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Spell out the per-entry fields (file, line, before -> after / reason) instead of the bare list names, matching the skill's Report section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The not-applicable early exit writes no sentinel, matching the skill's sequencing; the previous wording read as an unconditional final step. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Master's line-wrapping (PR #35) and this branch's model tiers crossed; the merge keeps master's wrapping style everywhere both sides only differed in wrap points, plus this branch's semantic changes. Doc reconciliation: both new sections are kept — "Claude wrappers and model tiers" (this branch) and "Claude wrapper frontmatter" (master). Master's allowed-tools bullet said folding was unverified and must be avoided; this branch has since verified equivalence (strict YAML parse over every wrapper plus live registration of folded commands), so the bullet now sanctions both the single-line and folded forms. The four new commands' short descriptions are folded per master's convention. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
What
Gives every Claude wrapper under
claude/an explicit, alias-based model tier so routine skills stop billing at the session model, and extends wrapper coverage so every skill has a deliberate model decision:haikuupdate-copyright,run-build,bump-version,version-bumped,api-discovery,check-links; agentcheck-linksanddependency-auditsonnetbump-gradle,dependency-update,move-files,review-docs,which-fixer; agentsspine-code-review,review-docs,gradle-reviewinherit)pre-pr,java-to-kotlin,raise-coverage,write-docs; agentkotlin-engineer* newly created wrapper.
The tier convention — aliases only, cheapest tier that runs the skill reliably, and which skills stay inline by design (
author-skill,co-author-docs,kotlin-jvm-tester,kotlin-engineer-as-a-skill) — is documented in a new "Claude wrappers and model tiers" section ofdocs/authoring-skills.md, with a matching pre-PR validation bullet.Why
model:inherits the conversation model, so an Opus-session developer paid top tier for formulaic work such as a copyright-header refresh.dependency-auditagent was already on Haiku but pinned to the dated IDclaude-haiku-4-5-20251001; since consumers float tomaster, a dated pin ages org-wide and breaks on model retirement. It now uses the floatinghaikualias (same model today).check-linksis dispatched bypre-pras a reviewer but had no agent definition, so it ran as an ad-hoc subagent at session price; it also was missing from thepre-prcommand's dispatch list even though the pre-pr skill requires it. Both are fixed.gradle-reviewwas the only reviewer skill without an agent definition.Notes for the reviewer
pre-pris deliberately left without a model: a command's model applies to the turn that runs it, and subagents declaringinherit(thekotlin-engineerreviewer) inherit from that turn — pinning the orchestrator would silently downgrade the deep Kotlin review. This cascade is documented in the new docs section.kotlin-engineeragent keepsinheriton purpose: it hunts coroutine/Flow subtleties where capability pays; in Sonnet sessions it costs Sonnet anyway.bump-versionandversion-bumpedsit onhaikutogether by maintainer decision: both are tightly specified procedures, and the guard (version-bumped) embeds the action (bump-version) as its recovery path, so the pair must always share a tier — recorded in the docs section.claude/layer; the agent-neutralskills/files (also consumed by Codex and Junie) are untouched.skills/<name>/SKILL.mdsources, and thereview-docsagent reviewed the Markdown diff; its findings (akotlin-engineerwrapper-status contradiction, a missingbump-gradletier example, two line-wrap widows, one phrasing nit) are already applied.grepfor dated model IDs is clean), YAML frontmatter shape check across all wrappers, and the new commands/agents registered successfully in a live Claude Code session.🤖 Generated with Claude Code