DL-276
The forge rate-limit error surface carries the reset hint so ForgeCallError.retry_after_ms (structurally always 0 before this) is populated: a dedicated *forge.RateLimitError{RetryAfter time.Duration} in go/internal/forge/provider.go REPLACES the bare ErrBudgetExhausted sentinel wrap at every emission site and Unwrap()s to it, so every existing errors.Is(err, ErrBudgetExhausted) site (the poll-driver skip contract, the server resource_exhausted arm, all tests) keeps matching while errors.As recovers the hint at mapForgeError. The value is a time.Duration computed CLIENT-side at error construction via the injectable clock (the server has none), so the server conversion to ms is clockless clamped [0, MaxUint32] arithmetic; both providers set it (GitHub from Retry-After/X-RateLimit-Reset, Linear from its rate-limit headers).
Status: Active (Matt, 2026-08-30)