Repository navigation
fix(engine): unblock Opus 5.5 deep tier — valid Sonnet 5 id, fresh CLI cache, honest chain errors (#1957) - #1958
Conversation
…I cache, honest chain errors (#1957) Every pr-review that escalated to the deep tier on pr-review/v1-next failed: opus-5-5 exited rc=1 with 0 tokens, claude-sonnet-5-0 returned 404, and the Copilot fallback rejected `--deny-tool '*'`. Four defects combined: - D1: `claude-sonnet-5-0` is not a model id (404). Use `claude-sonnet-5` in engine.sh (action model; triage/deep/action chains) and the aw.sh allowlist. model-pricing.tsv gains `claude-sonnet-5` rows at the existing sonnet-5 rates (the `claude-sonnet-5-*` glob does not match the bare id). - D2: the claude-code cache key was the literal "latest", so a 2.1.138 CLI cached before the Opus 5.5 launch was reused indefinitely. Workflows that cache the CLI now resolve "latest" to the concrete npm version before the cache step; pr-review and dev-lead log the CLI version in use. - D3: `claude.*usage|usage.*claude` matched every `--output-format json` envelope, so any Claude error (404, 400, ...) was reported as throttling. The pattern is removed; _claude_chain_invoke classifies failed hops by api_error_status (429/529/402/413 throttled, 404 unavailable, 400 rejected, 5xx server error — all try the next hop with a labelled warning; anything else propagates) and writes each failed hop's output to a hop log under $RUNNER_TEMP/cascade/ (in the pr-review debug artifact). The chain returns 2 only when its last hop was throttled. - Deep chain gains claude-opus-4-8 as a known-good 2nd hop, so an Opus 5.5 failure degrades to the model it replaced instead of failing the review. - D4: Copilot triage fallback denies `shell` and `write` instead of the rejected bare `*`. Tests: new test_engine_error_class.bats (8 of 12 fail on main), updated chain and model tests for the corrected id and deep chain, pricing tests for the bare sonnet-5 id. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015fdDZDb4mhT65MU1izeA4R
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
ⓘ Qodo reviews are paused because your trial has ended. Ask your workspace admin to add credits to resume reviews. Manage billing |
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. Warning Review limit reachedNext included review available in 50 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Advanced Run ID: 📒 Files selected for processing (10)
📝 WalkthroughWalkthroughWorkflows now resolve Claude CLI versions for cache keys and installation. The engine updates Claude model identifiers and fallback behavior, classifies and logs failed hops, and changes Copilot triage tool-denial arguments. Tests cover the updated model chains and failure handling. ChangesClaude CLI cache versions
Claude engine routing and error handling
Estimated code review effort: 4 (Complex) | ~45 minutes Change: Bug fix · Severity of issue fixed: Medium 🚥 Pre-merge checks | ✅ 3 | ❌ 1 | ❓ 1❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
Full details: Linked Issues checkExplanation The changes implement the reviewable parts of Resolution Provide independent reviewable evidence that Full details: Docstring CoverageExplanation Docstring coverage is 70.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 10 functions across 7 files. (10 skipped: 10 unsupported.) ✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Dev-Lead — waiting on PR blockers (intent: review-changes)PR: #1958 |
|
Note @don-petry I reviewed this PR and no code changes were needed, but I can't mark it done yet: required check |
|
No description provided. |
|
Advisory bots were rate-limited; auto-approval is withheld until they recover. pr-review-sweep will re-review this PR after 2026-09-27T02:45:07Z. |
There was a problem hiding this comment.
Code Review
This pull request corrects the Claude Sonnet 5 model identifier from claude-sonnet-5-0 to claude-sonnet-5 across configurations, pricing tables, and tests. It also fixes a critical issue where all JSON error envelopes from Claude were misclassified as rate limits due to an overly broad regex pattern; this is resolved by introducing robust, status-code-based error classification (_claude_hop_failure_class) and detailed hop logging. Additionally, the Copilot triage fallback is fixed by replacing an invalid wildcard tool denial with explicit tool names. Feedback on these changes suggests adding defensive file checks before reading logs with head to prevent potential hangs, and tightening a test assertion in the new BATS suite to check for a specific non-zero exit code rather than any non-zero status.
CodeAnt Nitpicks1 code suggestion1. When
|
…as resolved to The resolve step keyed the cache on the concrete npm version, but a cache miss still installed `@latest`, re-resolving it. A publish between the two steps would store one CLI version under another version's key (CodeAnt review on #1958). The resolve step now also outputs `install` (the concrete version, or the requested value when npm view fails), and every install step pins CLAUDE_CODE_VERSION to it via step-level env, which takes precedence over the job-level default. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015fdDZDb4mhT65MU1izeA4R
The hop log lands in the pr-review debug artifact, so it no longer copies raw hop output (CodeAnt security review on #1958). For a JSON envelope it keeps only {is_error, api_error_status, subtype, result}; otherwise the head of stdout; plus the head of stderr — each capped at 1000 bytes and passed through the shared redact_secrets helper (scripts/lib/redact.sh, now sourced non-fatally by engine.sh). Without the helper only the header line is written. Missing stdout/stderr paths are skipped (gemini-code-assist). The envelope-pattern test asserts exit 1 rather than any non-zero. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015fdDZDb4mhT65MU1izeA4R
|
Advisory bots were rate-limited; auto-approval is withheld until they recover. pr-review-sweep will re-review this PR after 2026-09-27T02:48:13Z. |
|
Advisory bots were rate-limited; auto-approval is withheld until they recover. pr-review-sweep will re-review this PR after 2026-09-27T02:49:57Z. |
The gitleaks secret scan flagged the dummy ghp_ token the redaction test committed in beddd2c. The test now assembles it at runtime, and the two historical findings in beddd2c are fingerprinted in .gitleaksignore (the repo's convention for known test-fixture false positives). Also gives the stub-claude API-error envelope a no-jq fallback like its success branch (CodeAnt nitpick on #1958). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015fdDZDb4mhT65MU1izeA4R
|
Addressed the CodeAnt nitpick in |
|
Acknowledged — informational notice, no action needed. This reports that the Codex code-review usage limit was reached; it is a billing/quota notice about the reviewer service, not a finding against this PR's diff. No follow-up required. |
|
Acknowledged — informational notice, no action needed. Qodo reviews are paused because the workspace trial ended; this is a billing notice about the reviewer service, not a finding against this PR. No follow-up required. |
|
Acknowledged — informational. This is CodeRabbit's auto-generated PR summary/overview, a neutral description of the diff rather than an actionable finding. No change requested, no action needed. |
|
Acknowledged — informational. SonarCloud's Quality Gate passed on this PR; this is a status notice with no action required. |
|
Clarification for reviewers: the dev-lead replies posted at 01:50–01:51Z were computed against the stale head
Generated by Claude Code |
|
Generated by Claude Code |
|
Advisory bots were rate-limited; auto-approval is withheld until they recover. pr-review-sweep will re-review this PR after 2026-09-27T02:53:02Z. |
|
Evidence for the pricing AC that CodeRabbit marked inconclusive: claude-sonnet-5-* 2026-09-01 3.00 0.30 3.75 15.00
+claude-sonnet-5 2026-06-30 2.00 0.20 2.50 10.00
+claude-sonnet-5 2026-09-01 3.00 0.30 3.75 15.00
claude-haiku-4-5* 2025-10-01 1.00 0.10 1.25 5.00The rates and effective dates match the existing The docstring-coverage warning is advisory. The new functions ( Generated by Claude Code |
…p log - The resolve step requested `vars.CLAUDE_CODE_VERSION || 'latest'`, so in readme-refresh.yml (job default pinned to 2.1.138) its install output overrode the pin with latest. REQUESTED_VERSION now reads `env.CLAUDE_CODE_VERSION` first in all eight workflows, so a job-level pin is kept for both the cache key and the install (CodeRabbit, #1958). - _claude_log_hop no longer falls back to the head of raw stdout when it is not a JSON envelope — that can be a plain agent transcript, and redact_secrets only knows token formats. It writes a placeholder instead (CodeRabbit security finding, CWE-532). New bats case covers text mode; teardown tolerates unset vars. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015fdDZDb4mhT65MU1izeA4R
Auto-dismissed (#617): coderabbitai[bot] CHANGES_REQUESTED on a superseded commit. The bot re-reviews the new head automatically — a valid concern will return as a fresh review.
|
Advisory bots were rate-limited; auto-approval is withheld until they recover. pr-review-sweep will re-review this PR after 2026-09-27T03:00:30Z. |
Superseded by automated re-review at
|
|
Both findings in the cycle-1 review (which reviewed
There are no unresolved review threads on the PR. No further code change is pending from me; the next review cycle should run against Generated by Claude Code |
An early `return 0` (added to tolerate an unset hop-log path) skipped the teardown's `unset` of the stub and log variables, so they could leak between tests (graphite review on #1958). The guard is now an `if` block and the `return` is gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015fdDZDb4mhT65MU1izeA4R
|
|
Advisory bots were rate-limited; auto-approval is withheld until they recover. pr-review-sweep will re-review this PR after 2026-09-27T03:04:30Z. |
|
Acknowledged — informational. SonarCloud's Quality Gate passed on this PR; this is a status notice with no action required. |
donpetry-bot
left a comment
There was a problem hiding this comment.
Automated review — APPROVED ✓
Risk: MEDIUM
Reviewed commit: 1ad231f50cc3cc5618acf7863443c93aa5fbe448
Review mode: triage-approved (single reviewer)
Summary
Confirmation review after triage clearance and a prior fix-requested cycle (d3f1bae). Both prior findings are resolved on this head: (1) the version resolver now reads env.CLAUDE_CODE_VERSION before vars in all 8 workflows, so readme-refresh.yml's job-level 2.1.138 pin is honored for both the cache key and the install — the pin comment is accurate again; (2) _claude_log_hop no longer copies raw non-JSON stdout into the debug artifact, writing a '(non-JSON stdout omitted)' placeholder instead (CWE-532), with a new bats case pinning it and the teardown early-return fixed per the Graphite thread. The underlying #1957 fix remains sound: valid claude-sonnet-5 id, per-model hop-failure classification keyed on api_error_status (404/400/5xx labelled honestly instead of masquerading as throttling), exit-2 keyed on the LAST hop being throttled, opus-4-8 safety hop in the deep chain, fresh CLI cache keys, and bare claude-sonnet-5 pricing rows with tests.
Linked issue analysis
Closes #1957 (Phase 2 blocker under epic #1895). D1 (invalid claude-sonnet-5-0 → claude-sonnet-5) fixed in engine.sh, aw.sh, model-pricing.tsv; D2 (stale cached CLI) fixed via the resolve step + concrete-version cache key in all 8 workflows, honoring job pins; D3 (over-broad claude.*usage regex) replaced by _claude_hop_failure_class with an honest exit contract and a redacted hop log; D4 fixed (--deny-tool shell/write). AC-4 safety hop (opus-4-8) added to the deep chain. AC-5 liveness/probe runs explicitly deferred post-merge per the issue plan. Substantively addressed.
Findings
- [RESOLVED] Prior MEDIUM (readme-refresh.yml silently unpinned): REQUESTED_VERSION now reads env.CLAUDE_CODE_VERSION || vars.CLAUDE_CODE_VERSION || 'latest' and the install env falls back through the resolved output — verified at head that the job pin threads through to both cache key and install. Applied uniformly across all 8 workflows.
- [RESOLVED] Prior LOW (hop log copied raw stdout head): non-JSON stdout is now omitted with a placeholder; JSON envelopes contribute only their error fields (is_error, api_error_status, subtype, result), capped at 1000 bytes and passed through redact_secrets. New bats tests cover text mode, redaction, missing-helper, and log-off paths.
- [INFO] All 7 review threads (CodeRabbit, CodeAnt, Gemini, Graphite) are resolved on this head; CodeRabbit's earlier review is dismissed. No human reviewer raised questions — remaining bot comments are billing/quota notices, acknowledged with dispositions.
- [INFO] .gitleaksignore additions are commit-scoped to historical commit beddd2c (literal dummy ghp_ token in a test, since rewritten to runtime assembly) — consistent with the file's existing pattern; gitleaks is green on head. The run_secret_scanning MCP tool was unavailable in this run; no MCP scan performed, gitleaks CI covers the diff.
- [INFO] Chain semantics re-verified: 401/unclassified errors propagate immediately; 404/400/5xx log a named ::warning:: and advance the hop; exit 2 requires the LAST hop to be genuinely throttled, matching review-one-pr.sh's final-hop scan. Warning phrasing deliberately avoids rate-limit tokens. No workflow security smells: no new secret handling, action pins unchanged, resolver input comes from trusted vars/env.
CI status
All checks green on 1ad231f: bats, unit-tests, unit, shellcheck, actionlint, CodeQL (actions + python), SonarCloud Quality Gate passed, gitleaks, agent-shield, and all workflow-governance guards. Zero in-progress checks. CANCELLED entries (dev-lead dispatch/ci-relay/resume, superseded review/Dismiss runs) are automation jobs, not PR validation; cubic reported NEUTRAL; dependency-audit ecosystem jobs SKIPPED (none detected).
Reviewed automatically by the PR-review agent (single-reviewer mode: fable 5). Reply if you need a human review.
donpetry-bot
left a comment
There was a problem hiding this comment.
Automated review — APPROVED ✓
Risk: MEDIUM
Reviewed commit: 1ad231f50cc3cc5618acf7863443c93aa5fbe448
Review mode: triage-approved (single reviewer)
Summary
Fixes the Phase 2 deep-tier blocker (#1957): corrects the invalid claude-sonnet-5-0 model id to claude-sonnet-5 across engine chains, the aw.sh allowlist, and pricing (with bare-id rows the glob missed); makes the CLI cache key resolve latest to the concrete npm version in 8 workflows so stale CLIs stop being reused; replaces the over-broad claude.*usage rate-limit regex with per-hop classification by api_error_status (429/529/402/413 → throttled, 404 → unavailable, 400 → rejected, 5xx → server error, else propagate) plus a redacted hop log; adds claude-opus-4-8 as the deep-chain safety hop; and fixes the copilot triage --deny-tool syntax. 32 new/updated bats tests pin the behavior.
Linked issue analysis
Linked issue #1957 enumerates four defects (D1–D4) with run evidence; this PR addresses D1, D2, D3, D4 (syntax part), and AC-4 exactly as specified — the remaining PAT swap explicitly needs a maintainer and is out of scope. Substantively addressed.
Findings
- Cycle-1 findings verified fixed on the current head: all 8 workflows honour a job-level
env.CLAUDE_CODE_VERSIONpin beforevars/latest (including readme-refresh.yml), and the hop log omits non-JSON stdout. Final commit1ad231fis a test-only teardown fix. - All 7 review threads are resolved; bot nitpicks (CodeAnt jq fallback in stub-claude) were addressed in code.
.gitleaksignoreadditions are narrowly scoped to one historical commit's intentionally fake test token (now assembled at runtime); gitleaks CI passes on the head.- Workflow additions are safe: version expressions enter shell via step-level
env:(no inline interpolation), no new secret handling, actions stay SHA-pinned. run_secret_scanningMCP tool was unavailable in this run; relied on the passing gitleaks check.- Minor (non-blocking): the "trying next in chain" warning also prints when the failed hop is the last in the chain, and hop-log truncation at 1000 bytes happens before redaction, so a token split at the boundary would leave a fragment. Neither affects correctness.
CI status
All checks green on 1ad231f: shellcheck, bats, actionlint, unit-tests, CodeQL, SonarCloud Quality Gate, gitleaks, agent-shield, and all stub/permission guards pass. CANCELLED entries are superseded runs from earlier pushes on this PR; skipped audits are ecosystem-not-detected. Cubic reported NEUTRAL.
Reviewed automatically by the PR-review agent (single-reviewer mode: fable 5). Reply if you need a human review.
|
pr-review approved on PARTIAL advisory evidence: 5/7 required advisory bots reported before the gate's quiescence-timeout fallback proceeded. Recorded for the miss-rate metric (#1596). |
donpetry-bot
left a comment
There was a problem hiding this comment.
Automated review — APPROVED ✓
Risk: MEDIUM
Reviewed commit: 1ad231f50cc3cc5618acf7863443c93aa5fbe448
Review mode: triage-approved (single reviewer)
Summary
Confirmation review (triage-approved mode) of the #1957 deep-tier unblock. Four coordinated fixes: (1) the invalid claude-sonnet-5-0 model ID corrected to claude-sonnet-5 in engine.sh chains, aw.sh allowlist, and model-pricing.tsv (bare-ID rows added because the claude-sonnet-5-* glob does not match the bare ID); (2) 8 workflows resolve the literal 'latest' CLI cache key to the concrete npm version so new releases miss the cache, with a weekly-key fallback when npm is unreachable and pass-through for a pinned vars.CLAUDE_CODE_VERSION — identical implementation in all 8, actions/cache pin unchanged; (3) honest chain-error classification: the over-broad 'claude.usage' rate-limit regex removed, failed hops classified by api_error_status (429/529/402/413→throttle-and-continue, 404/400/5xx→labelled-and-continue, anything else propagates immediately), exit 2 reserved for a genuinely throttled last hop, and a redacted, size-capped hop log added to the debug artifact; (4) triage Copilot fallback uses valid --deny-tool shell/write syntax instead of the rejected ''. Deep chain gains claude-opus-4-8 as a known-good safety hop. 14 new bats tests pin the classifier (including redaction and hop-log hygiene); existing chain/dispatch/pricing tests updated consistently.
Linked issue analysis
Closes #1957 (Phase 2 blocker under epic #1895). D1 (invalid sonnet-5-0 ID), D2 (stale cached CLI 2.1.138), D3 (rate-limit regex masking every Claude error), and the syntax half of D4 (--deny-tool '*') are all substantively addressed and match the issue's own recommendations. Explicitly deferred with rationale: the D4 classic-PAT swap (needs a maintainer token change) and AC-5 liveness probes — tracked on #1899. Deferral is documented in the PR body's monitoring section.
Findings
No blocking findings.
- .gitleaksignore (scrutinized): the two new entries are SHA-scoped to historical commit beddd2c and suppress an obvious dummy fixture (ghp_ + alphabet + digits) used in a redaction test; verified the literal exists only at that commit — the current head assembles it at runtime via string concatenation. Matches the file's established suppression pattern; gitleaks CI passes at head.
- Hop log hygiene is sound: only envelope error fields, 1000-byte cap, redact_secrets applied, non-JSON stdout omitted, header-only when the redact lib is missing — each behavior covered by a dedicated test.
- Workflow edits add no new actions and keep the existing actions/cache SHA pin; secrets handling is unchanged (gh-aw-cross-org's GH_TOKEN/GOOGLE_API_KEY env forwarding predates this PR).
- Prior cycle-1 findings (readme-refresh.yml pin inconsistency and the stub-claude jq fallback) are confirmed fixed at head: all 8 workflows use the identical env||vars||latest resolution, and stub-claude's error branch has a printf fallback when jq is absent.
- The run_secret_scanning MCP tool was not available in this run; relied on the passing gitleaks check plus manual inspection of the diff — no credential material found in added content.
- Semantic note (accepted, documented in the PR's Risk section): chains now stop early on non-retryable errors (e.g. 401) that were previously masked as throttling, and a chain ending on 404/400/5xx returns 1 instead of 2 — intentional per the fix's design, covered by tests.
CI status
All required checks green at 1ad231f: SonarCloud Quality Gate passed, CodeQL, Agent Security Scan, gitleaks secret scan, actionlint, shellcheck, bats/unit tests, and all repo validation gates SUCCESS. Skipped/cancelled entries are superseded runs and inapplicable ecosystem audits. Advisory-bot gate proceeded on 5/7 quiescence-timeout (two bots billing-blocked — Codex and Qodo — not adverse findings).
Reviewed automatically by the PR-review agent (single-reviewer mode: fable 5). Reply if you need a human review.



Summary
This fixes the Phase 2 blocker (#1957) so the Opus 5.5 canary can resume. It covers AC-1 to AC-4, AC-6 (syntax part) and AC-7.
claude-sonnet-5-0becomesclaude-sonnet-5.engine.sh(the action model and the triage, deep and action chains) and in theaw.shmodel allowlist.model-pricing.tsvgetsclaude-sonnet-5rows at the existing Sonnet 5 rates. Theclaude-sonnet-5-*glob doesn't match the bare ID, so without these rows Sonnet 5 calls would go unpriced.latestkey, so a 2.1.138 install from before Opus 5.5 kept being reused.latestto the real npm version, so a new CLI release misses the cache.env:.vars.CLAUDE_CODE_VERSIONpasses through unchanged.pr-reviewanddev-leadnow always log the CLI version in use.claude.*usage|usage.*claude. Every failed call's JSON output contains the model name and ausageobject, so this pattern matched every Claude error._claude_chain_invokenow classifies each failed hop by itsapi_error_status:$RUNNER_TEMP/cascade/claude-chain-hops.log, which is uploaded with thepr-review-debug-*artifact. This is where Opus 5.5's real error will show up. Only the error fields are kept (is_error,api_error_status,subtype,result), capped at 1000 bytes and passed throughredact_secrets.review-one-pr.shdecides on fallback by scanning that last hop's output.claude-opus-5-5,claude-opus-4-8,claude-sonnet-5. If Opus 5.5 fails, the review drops to the model it replaced instead of failing. Token records already store the model actually used, so the canary report ([Phase 2] Canary go/no-go report: compare deep-tier cost, cache-read cost and latency by model from token-usage artifacts #1951) still counts only real Opus 5.5 calls.--deny-tool shell --deny-tool writeinstead of the rejected--deny-tool '*'. The classic PAT (ghp_) problem needs a maintainer to swap in a fine-grained token, so it isn't fixed here.Problem
Closes #1957; blocks #1899 and #1900 under epic #1895. Since v1.17.0 reached
pr-review/v1-next, every PR review that escalated to the deep tier failed:claude-opus-5-5exited with rc=1 and 0 tokens, and the log said "throttled";claude-sonnet-5-0returned a 404, also reported as "throttled";Invalid rule format: *.Risk
Medium. This changes fallback behaviour in the shared engine, used by pr-review, dev-lead and personas.
TOKEN_LOG_FILE) behave as before.Test plan
shellcheck --severity=warning -x scripts/engine.sh scripts/aw.sh: clean.actionlint(with shellcheck) on the 8 changed workflows: no new findings compared with main.npmfor three cases (latestresolves, npm fails, pinned version). The cache key and install version match in each, except the degraded case where npm is unreachable.tests/dev-lead/unit/test_engine_error_class.bats(14 tests) covers:engine.sh, so they reproduce the bug.test_engine_chain.bats,test_engine_new_models.batsandtest_model_dispatch.batsfor the corrected ID and deep chain. Addedclaude-sonnet-5cases tomodel_pricing.bats.test_duplicate_decl_gate.batsandpersona_runner.batspass afterengine.shstarted sourcinglib/redact.sh.test_fix_issue.bats).Rollback
Revert this PR. If a release has already been cut, move
pr-review/v1-nextback withscripts/cut-release.sh pr-review <previous> --promote --channel next --push. The only lasting side effect is new Actions cache entries.Monitoring
pr-review/v1-next(and the dev-leadnextchannel) only after Release Manager autocut cuts a release. That happens on theCanary Rolloutcron within about 4h of merge.claude-code cache version: <x.y.z>andclaude-code installed:(orcache hit:) with a version newer than 2.1.138;[claude] model claude-sonnet-5-0lines;unavailable (HTTP 404…),rejected the request (HTTP 400)) and its detail is incascade/claude-chain-hops.login thepr-review-debug-*artifact.Interaction contract
Checklist
shellcheck scripts/*.shpasses for any changed shell scripts.🤖 Generated with Claude Code
https://claude.ai/code/session_015fdDZDb4mhT65MU1izeA4R
<source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg">Summary by CodeRabbit
latest.