OpenRouter discipline: stream errors surfaced, keep-alives skipped, request lifetimes reviewed, retry policy checked, and deliberate model pins identified.
| Severity | Check | Catches |
|---|---|---|
| warning | midstream-error-ignored |
A streamed response consumed without checking for mid-stream errors |
| warning | sse-comment-parse-crash |
A hand-rolled SSE reader that feeds keep-alive comments to JSON.parse |
| info | missing-abort-signal |
A proven native or supported client request with no established caller cancellation signal |
| info | retry-after-ignored |
A response-dependent raw retry loop with no corresponding Retry-After consultation |
| info | hardcoded-dated-model-slug |
A concrete version-looking model pin selected in a supported request |
Blind spots (the short version)
- Calls, aliases, bounded templates, ordered options and property paths are resolved structurally; formatting and line wrapping do not change the answer.
- Stream checks cover supported chat-completion reader transformations in one file. Cross-module handlers and custom parsers are not executed.
- Mutation, opaque transfers, unresolved choices, callbacks and conditional header consultation narrow the affected check. SDK-managed retry behavior is outside the raw retry claim.
- Reading Retry-After does not prove correct waiting, and signal presence does not prove that a caller aborts or that every provider stops billing.
- Cost/token accounting is deliberately not checked. Default
.mts,.cts,.cjs, generated and test exclusions remain.
The full list prints in every report this doctor appears in.