fix(orbit-cli): fall back to the embedded skill on 401, 403, 429 and 5xx

What does this MR do and why?

orbit skills get orbit printed nothing and exited non-zero when the skills endpoint answered with an auth error, a rate limit, or a server error and no cached copy existed. Agents got no skill at all. Now these cases print the cached copy (rate limits and server errors) or the embedded skill, with a warning on stderr (auth errors include a hint to check the token or access) and a clean stdout. Other client errors such as 400 still fail.

Relates to #1353 (closed). This covers the CLI half only. The companion server change in gitlab-org/gitlab is tracked separately, so this MR does not close the issue.

Testing

cargo test -p orbit-cli passes, including new mock-server integration tests for 401, 403, 429, 500 and 503 (with and without a cache), for the listing, and for 400 staying an error. clippy and fmt are clean.

Performance Analysis

No change on the success path.

  • This merge request does not introduce any performance regression. If a performance regression is expected, explain why.
Agent context: long-form analysis, file-by-file walkthroughs, profiler output, alternatives considered
  • resolve_remote_tree and list_skills in crates/orbit-cli/src/skill.rs both classify statuses through one degradation function: 401/403 are AuthRejected (embedded tree), 429 and >=500 are Unavailable (newest validated cache entry, otherwise embedded). The 401/403 warnings carry a short hint (glab auth status, or an access check).
  • Auth errors deliberately skip the cache: a stale cached tree would hide a bad token as well as the embedded one while looking authoritative. Query commands still fail loudly on auth.
  • Replaced the auth_errors_never_fall_back and server_error_without_cache_is_returned tests, which asserted the old behaviour.
  • Docs: updated the fallback paragraph in docs/design-documents/querying/README.md.
  • Skill requests get a 15s per-request timeout in OrbitClient::skill_response via RequestBuilder::timeout, so a blackholed host falls back quickly. Query commands keep the 300s timeout. No automated test: it would need a 15s wait.
  • mise lint:code could not install its toolchain here (the clickhouse 26.2 download 404s), so I ran cargo fmt --check and cargo clippy -D warnings directly and bypassed the lefthook pre-push hook for the same reason.
Edited by Dmitry Gruzd

Merge request reports

Loading
Loading