0ba8ca63b6
Five review findings; all small, all independent. H2: Bedrock used raw `JSON.parse` and `JSON.stringify` despite the package rule against ad-hoc JSON encoders. The in-loop parse on each event-stream frame goes through `ProviderShared.parseJson` (yielded inside `Effect.gen`); the `decodeChunk` error fallback uses `ProviderShared.encodeJson` instead of `JSON.stringify` for the raw field on `ProviderChunkError`. No behavior change — just channels JSON through the shared Schema-driven codec. H3: `BedrockConverse.toHttp` built a `baseHeaders` record with `content-type: application/json` and passed it through both auth paths. The bearer path called `jsonPost` with the raw model headers (no manual content-type), the SigV4 path used `baseHeaders` plus the signed result. Two paths produced subtly different header sets and both relied on `jsonPost` overwriting/adding the same content-type key. Simplify: drop the unused bearer-side construction; rename the SigV4 input to `headersForSigning` and document why content-type must be present at signing time (signature covers it). M4: Lift `isRecord` from `gemini.ts` into `ProviderShared.isRecord` so adapters share one definition. The duplicates in `llm.ts` (LLM IR layer) and `llm-native.ts` (OpenCode bridge) stay where they are — those are at different layers and importing from `provider/` would invert the dependency direction. Net effect: the provider layer goes from 2 copies to 1. L8: `TransportError` lost everything but the message string. Surface the originating reason tag (`Timeout` / `TransportError` / `ResponseError` / `RequestError`) and the request URL when available, both as optional Schema fields. Consumers that don't care keep getting the same `message` rendering; consumers that do can finally render "timed out connecting to https://..." instead of "HTTP transport failed". M9 + L3: Two dead branches. Anthropic's `processChunk` had `?? ""` fallbacks for `partial_json` after an early-return guard already proved it non-empty. OpenAI Chat's `mapFinishReason` had `if (reason === undefined || reason === null) return "unknown"` followed by `return "unknown"` — both branches went to the same place. Drop the unreachable code. 120 LLM-package tests + 33 OpenCode bridge tests still green.