Rate limits, actionable errors, adapter fixes, onboarding nudges - #831
Merged
Merged
Conversation
- REST engine: a 429 (or a 503 with Retry-After) gets at most one more attempt, after the API's Retry-After when it is 3 s or less, after ~1 s when there is none, and none when it asks for longer. Retrying 429s three times multiplied load on APIs that were already limiting us. - Errors for a missing variable or a never-authorized OAuth connector link to the connector's page; a host that does not resolve is reported as 'Host not found' instead of 'SSRF guard: cannot resolve'. - Error hints for Telegram (wrong bot token, unreachable chat) and Lexware (overdue cannot be combined with other statuses); Lexware list_vouchers marks voucherType and voucherStatus required; api-football healthPath typo fixed. - Onboarding drip: reminders depend on the workspace having no connector (a teammate's counts), not on the Skip flag of /welcome. A user who connected Claude/ChatGPT to an empty workspace gets the first nudge 2 h later, naming the client. New server-only event ai_client_connected.
This was referenced Oct 3, 2026
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
Block A of the connector/onboarding plan (analysis of the first 48 h after the Claude directory listing).
Rate limits (
rest.engine.ts). A 429, or a 503 that carriesRetry-After, gets at most one more attempt: afterRetry-Afterwhen it is 3 s or less, after about a second when there is none, and none at all when the API asks for longer. Other transient errors keep the 300/900/2500 ms schedule. Retrying a 429 three times in 3.7 s turned one workspace's ~54k rejections into ~216k requests against an API that had asked for fewer. The model still gets the status and theretry-afterheader in the error.Errors a person can act on
assertNoUnresolvedPlaceholders) and a never-authorized OAuth connector now include the connector's dashboard link (connectorPageUrl, fromFRONTEND_URL), so Claude can hand it to the user.SsrfBlockedError, andextractSsrfBlockedHostnamereads both spellings, so the self-hosted allowlist hint keeps working.error-hints.ts): Telegram 404/401 means a wrong bot token; "chat not found" and friends explain how a bot reaches a chat; Lexware'soverduecannot be combined with other statuses.Adapters: Lexware
list_vouchersmarksvoucherTypeandvoucherStatusrequired and saysoverduegoes alone; api-football'shealthPathtypo is nowhealthcheckPath.Onboarding drip (
onboarding-cron.service.ts)onboardingCompletedAt, which the Skip button on /welcome also sets.ai_client_connected(metadata.client), written when a client is connected for the first time.Checked against production before opening this: the first cron run after deploy would send about 199 first reminders (142 of them to users who connected Claude to an empty workspace, 56 to users who had pressed Skip) and 2 second reminders. One-off; afterwards it is the normal flow.
Tests: retry policy (429 without/with short/long Retry-After, 503 with Retry-After,
parseRetryAfterMs), link in the placeholder error,connectorPageUrl, the "Host not found" wording, Telegram/Lexware hints, the grant event (new vs re-grant) and four onboarding cases (AI client, waiting 24 h, after Skip, teammate's connector). Full backend suite passes locally (6412), typecheck and lint clean.