feat(ai): error taxonomy + fail-fast retry classification (Phase 1 · Batch 1.1)#119
Merged
Conversation
Phase 1 · Batch 1.1 (Master Prompt v1.1 engagement).
- services/ai/aiErrorTaxonomy.ts: pure classifyAiError(err) ->
{category, retryable, messageKey} across transient/rateLimit/auth/network/
offline/policy/invalidRequest/permanent (HTTP status + aiPolicy 'blocked'
markers + offline short-circuit). Table-driven tests (26).
- services/ai/aiRetry.ts: withTransientRetry now fails fast on non-retryable
errors (auth/policy/invalid-request/offline) via a shouldRetry default,
instead of backing off a doomed call. Transient/rateLimit/network still retry
(Retry-After honored). One structured ai.retry log line per decision with a
per-call correlation id (no payloads/keys). Backward compatible.
- Tests: fail-fast cases + custom shouldRetry override; logger stubbed in the
3 retry test files for deterministic output.
- Docs: living plan batch log + CHANGELOG [Unreleased].
FU-1 (plugin-worker guard restoration) SPLIT from this batch after a timeboxed
probe: the Function.prototype.constructor leak is real but its mechanism is
subtler than a symmetric defineProperty fix; documented in the living plan for a
dedicated fix. Benign (worker compiles via captured GlobalFunction).
i18n/UI mapping of messageKey deferred to Batch 1.2.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
CodeAnt AI is reviewing your PR. Thanks for using CodeAnt! 🎉We're free for open-source projects. if you're enjoying it, help us grow by sharing. Share on X · |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
CodeAnt (Minor): avoid embedding a real service hostname in test text. api.openai.com -> api.example.invalid (RFC 2606/6761 reserved). The hostname is not asserted on — classification keys off the ENOTFOUND marker — so behavior is unchanged; 26/26 still green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
CodeAnt AI finished reviewing your PR. |
CodeAnt: classifying messages containing 'aborted' as transient made user/timeout AbortController cancellations retryable. Add a non-retryable 'canceled' category: detect DOMException AbortError (name/code 20) and abort/cancel messages; remove 'aborted' from the transient regex. +4 tests (30 taxonomy / 58 total green). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.
User description
Context
Phase 1 (Reliability/Observability) of the v1.23 audit/perfection engagement, first batch.
Recon corrected the sub-baseline: the Local-AI/Voice low-end stack is already built; the real
gap is AI error handling —
withTransientRetryretried every error (a bad API key, apolicy block, a 4xx) with exponential backoff.
What this PR does (backend + tests only)
services/ai/aiErrorTaxonomy.ts— pureclassifyAiError(err)→{ category, retryable, messageKey }acrosstransient | rateLimit | auth | network | offline | policy | invalidRequest | permanent. Classifies by HTTP status, by message markers (reuses theaiPolicy.ts"blocked" strings), and short-circuits onnavigator.onLine === false. Unknown errors default to retryabletransient(preserves prior behavior).services/ai/aiRetry.ts—withTransientRetrynow fails fast on non-retryable categories (invalid key / policy / malformed request / offline) instead of backing off a doomed call. Transient/rate-limit/network still retry and honorRetry-After. Emits one structuredai.retrylog line per decision with a per-call correlation id (no payloads or keys — respectssanitizeLogContext). New optionalshouldRetrylets callers override.aiErrorTaxonomy.test.ts(table-driven over every category + offline short-circuit + status-beats-message); fail-fast +shouldRetry-override cases inaiRetry.test.ts; logger stubbed in the 3 retry test files for deterministic output.CHANGELOG.md [Unreleased].Scope notes
aiProviderService.ts:437,471) keep working; the new option is optional and unknown errors still retry.messageKeyUI/i18n mapping deferred to Batch 1.2 (avoids 11-locale churn here).Function.prototype.constructorleak is real but its mechanism is subtler than a symmetricdefinePropertyfix; it's benign (the worker compiles via the capturedGlobalFunction) and is documented indocs/AUDIT-PERFECTION-PLAN-v1.23.mdfor a dedicated fix.Verification
pnpm exec vitest runtaxonomy + all retry suites + plugin.worker → 90 passed.pnpm run lint(1312 files) +pnpm run typecheck→ clean.git diff --name-only→ only the taxonomy, retry, 3 retry tests, and 2 docs (no production source beyond aiRetry).🤖 Generated with Claude Code
CodeAnt-AI Description
Stop retrying AI calls that cannot succeed and add clear error classification
What Changed
Impact
✅ Fewer repeated failed AI calls✅ Faster errors for bad keys, policy blocks, and offline users✅ Clearer AI failure handling💡 Usage Guide
Checking Your Pull Request
Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.
Talking to CodeAnt AI
Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:
This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.
Example
Preserve Org Learnings with CodeAnt
You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:
This helps CodeAnt AI learn and adapt to your team's coding style and standards.
Example
Retrigger review
Ask CodeAnt AI to review the PR again, by typing:
Check Your Repository Health
To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.