Modernize CC setup for the Claude 5 era: Fable in CI reviews, agents, and settings#325
Merged
Merged
Conversation
… and settings From a 37-agent adversarially-verified staleness audit (31 confirmed findings) plus the two suggestions deferred from #324: CI / review wiring: - claude-code-review.yml: --model opus → fable (most capable GA model; ~2x Opus pricing, bounded per-PR run; fall back to opus if Fable's cyber classifiers ever refuse a security-heavy diff); add concurrency group with cancel-in-progress so rapid pushes stop billing overlapping full-model reviews of stale commits - claude.yml: pin --model fable (was silently tracking the CC default, which changed to Sonnet 5 under our feet in v2.1.197) - claude-review.md prompt: the mandated submission flow (cat > file, sed -i, VAR=$(...)) prefix-matched none of the allowed tools, so every review had to improvise — rewritten as bare gh pr view + single gh api --input - heredoc with literal SHA; add behavioral-guard live-validation bullet (repo-agnostic) - dotfiles.yml: apt-get update before zsh install; drop redundant shellcheck/jq installs (preinstalled on ubuntu-latest) Models: - agents: audit-* (5), rfc-* (2), improve-workflow → model: fable; status-report stays haiku, summarize-work stays sonnet - settings.json: opus[1m] → fable (1M context is Fable's default; the [1m] suffix is auto-stripped). fastMode kept — inert on Fable, active again if the model is ever flipped back to opus - summarize skill: claude-sonnet-4-6 → claude-sonnet-5 (5 refs); mcp-builder eval script/docs: claude-3-x → claude-sonnet-5 Stale tool references: - work.md: mcp__github__get_issue → issue_read(method: "get") - pr-review.md: get_pull_request_comments/reviews → pull_request_read(method: ...); Task( → Agent( spawn examples - settings.json: drop code-simplifier plugin (redundant with built-in /simplify since v2.1.154) - bootstrap.sh: GitHub MCP via deprecated npx @modelcontextprotocol/server-github → official remote HTTP server with ${GITHUB_TOKEN} header expanded by CC at request time Docs/skills sync: - hook-authoring skill: trigger list, lifecycle, input-field table, and example refs now cover all 10 registered hooks (was 5), pointing at hooks/README.md as source of truth - hooks/README.md: enforce-insight step 3 matches the content-aware wait actually implemented (#316) - catppuccin skill: correct yazi (flavor package via ya pkg) and bat (vendor submodule) rows; rust-async skill: native async fn in traits (Rust 1.75+) as the default, async-trait for dyn/Send cases Deferred #324 suggestions: - notification.sh: permission padlock matches raw input, not the truncated display message (+ regression test) - test-hooks.sh: document the mock-jq byte-vs-codepoint truncation coverage boundary; fix stop_hook_active test running under mock jq (passed vacuously — now uses real jq like its siblings) Skipped pending live-payload verification on a real machine: statusline stdin repo/PR fields + used_percentage, SessionStart sessionTitle. Validated: make check green (101 hook + 35 bootstrap tests), new hook behavior re-exercised against real jq with a stubbed zellij. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DrBLzQixo3zx8wSHVSGUXS
- Pin the CLI assumption the bound relies on: --limit is applied after --exclude (PEEKED_COUNT is a post-exclusion count), consistently between peek and consume — documented at the consume site so a CLI flag-semantics change can't silently reopen the loss window - New multi-event test: one directed + one ambient peeked → consume --limit must equal 2, locking the bound to the actual peeked count rather than a coincidental 1 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DrBLzQixo3zx8wSHVSGUXS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
From a 37-agent adversarially-verified staleness audit (31 confirmed findings, 0 refuted outright), plus the two suggestions deferred from #324 and the two follow-up suggestions from #317's approval.
CI / review wiring
--model opus→--model fable(most capable GA model; ~2× Opus pricing, bounded per-PR run; fall back toopusif Fable's cyber classifiers ever refuse a security-heavy diff). Adds aconcurrencygroup withcancel-in-progressso rapid pushes stop billing overlapping full-model reviews of stale commits.--model fable— previously unpinned, so its effective model changed underfoot when Sonnet 5 became the CC default (v2.1.197).cat > file,sed -i,VAR=$(...)) prefix-matched none of the allowed tools, so every review had to improvise around permission denials — rewritten as baregh pr view+ a singlegh api --input -heredoc with literal SHA. New repo-agnostic bullet: behavioral-guard PRs need live-validation evidence.apt-get updatebefore the zsh install; drop redundant shellcheck/jq installs (preinstalled on ubuntu-latest).Models
audit-*(5),rfc-*(2),improve-workflow→model: fable;status-reportstays haiku,summarize-workstays sonnet.opus[1m]→fable(1M context is Fable's default; the[1m]suffix is auto-stripped).fastModekept — inert on Fable, active again if the model is ever flipped back to opus. Note: this trades fast mode's 2.5× interactive speed for Fable's quality — one-line revert if unwanted.summarizeskill →claude-sonnet-5(5 refs);mcp-buildereval script/docs →claude-sonnet-5.Stale wiring
work.md:mcp__github__get_issue→issue_read(method: "get");pr-review.md:get_pull_request_comments/reviews→pull_request_read(method: ...);Task(→Agent(spawn examples.code-simplifierplugin (redundant with built-in/simplifysince v2.1.154).@modelcontextprotocol/server-githubnpx package → official remote HTTP server with${GITHUB_TOKEN}header expanded by CC at request time.Docs/skills sync
hook-authoringskill: trigger list, lifecycle, input-field table, and example refs now cover all registered hooks (was 5 of 10+), pointing at hooks/README.md as source of truth.async fnin traits since Rust 1.75 as the default).Deferred suggestions folded in
stop_hook_activetest now uses real jq.--limit-after---excludeCLI assumption at the drain's bounded consume; multi-event test locking the consume bound to the actual peeked count.Skipped pending live-payload verification on a real machine
Statusline stdin repo/PR fields +
used_percentage, SessionStartsessionTitle— flagged for a local session rather than guessing schemas.Validation
make checkgreen after rebasing over #322 and #317: 112/112 hook tests, 39/39 bootstrap, shellcheck clean.Note for the review check: this PR edits
claude*.yml, and the claude-code-action requires those files to match main — its check may complain about the workflow-file mismatch; that's the documented action behavior, not a real failure.Post-merge:
./bootstrap.sh -flocally.🤖 Generated with Claude Code
https://claude.ai/code/session_01DrBLzQixo3zx8wSHVSGUXS
Generated by Claude Code