Skip to content

Modernize CC setup for the Claude 5 era: Fable in CI reviews, agents, and settings#325

Merged
evansenter merged 2 commits into
mainfrom
claude/cc-workflow-review-jlp1gq
Jul 20, 2026
Merged

Modernize CC setup for the Claude 5 era: Fable in CI reviews, agents, and settings#325
evansenter merged 2 commits into
mainfrom
claude/cc-workflow-review-jlp1gq

Conversation

@evansenter

Copy link
Copy Markdown
Owner

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

  • claude-code-review.yml: --model opus--model fable (most capable GA model; ~2× Opus pricing, bounded per-PR run; fall back to opus if Fable's cyber classifiers ever refuse a security-heavy diff). Adds a concurrency group with cancel-in-progress so rapid pushes stop billing overlapping full-model reviews of stale commits.
  • claude.yml: pins --model fable — previously unpinned, so its effective model changed underfoot when Sonnet 5 became the CC default (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 around permission denials — rewritten as bare gh pr view + a single gh api --input - heredoc with literal SHA. New repo-agnostic bullet: behavioral-guard PRs need live-validation evidence.
  • dotfiles.yml: apt-get update before the zsh install; drop redundant shellcheck/jq installs (preinstalled on ubuntu-latest).

Models

  • Agents: audit-* (5), rfc-* (2), improve-workflowmodel: 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. Note: this trades fast mode's 2.5× interactive speed for Fable's quality — one-line revert if unwanted.
  • summarize skill → claude-sonnet-5 (5 refs); mcp-builder eval script/docs → claude-sonnet-5.

Stale wiring

  • work.md: mcp__github__get_issueissue_read(method: "get"); pr-review.md: get_pull_request_comments/reviewspull_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 @modelcontextprotocol/server-github npx package → 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 registered hooks (was 5 of 10+), pointing at hooks/README.md as source of truth.
  • hooks/README.md: enforce-insight step 3 matches the content-aware wait implemented in hooks: content-aware transcript wait in enforce-insight-publish (race fix + test) #316.
  • catppuccin (yazi flavor package, bat vendor theme), rust-async (native async fn in traits since Rust 1.75 as the default).

Deferred suggestions folded in

Skipped pending live-payload verification on a real machine

Statusline stdin repo/PR fields + used_percentage, SessionStart sessionTitle — flagged for a local session rather than guessing schemas.

Validation

make check green 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 -f locally.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DrBLzQixo3zx8wSHVSGUXS


Generated by Claude Code

claude added 2 commits July 20, 2026 02:16
… 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
@evansenter
evansenter merged commit cbe9b2d into main Jul 20, 2026
5 checks passed
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.

2 participants