Upstream issues: every workaround, and the issue it waits for
charter upstream shows the state of each issue the code tags (Upstream:). A row without a link is not filed. When an issue closes, do what its row says, then charter check and the soak.
| Issue | Problem | Workaround | When fixed |
|---|---|---|---|
| workers-sdk#16199 | Under cf dev, a request answered before its body was read makes the next request on the connection fail (fetch failed, a 500 from the dev server): workerd up to 1.20261013.1 closes the connection, and miniflare does not retry | charter-lib/serve reads a body the answer did not (ts/src/serve.ts) | Drop that |
| tinygo#5800 | The collector runs at every pause of a workers-go program. TinyGo 0.44 moved the threshold (gc_finalizer_common.go) and made the trigger grow with the finalizers, but still collects at a pause once it is reached | A runtime patch and an 8 MB heap (internal/cli/build) | Drop the patch |
| tinygo#5798 | Go timers stall on Cloudflare. Fixed in TinyGo 0.44 (#5818), but a Worker runs workers-go’s own copy of wasm_exec.js, which v0.36.0 has without the fix | worker/tinygo-clock.mjs | Delete it once workers-go ships TinyGo 0.44’s wasm_exec.js |
| tinygo#5684, #5888, #5889, net#106, net#95 | The official Go MCP SDK does not build with TinyGo 0.43.0: hash/maphash with Go 1.27, reflect.VisibleFields, os.OpenRoot, two net/http APIs and net.Dialer.Control | charter/mcp serves MCP itself | When all are closed, try the official SDK (mcp/mcp.go) |
| tinygo-org/net#56 | http.ServeMux has no method patterns | humaworkers routes itself | Use Huma’s adapter |
| tinygo#3599 | No reflect.StructOf | humaworkers.Config drops the Huma hook | Keep Huma’s defaults |
| tinygo#3862 | No reflect.Value.MethodByName | Uploads take multipart.Form | Use huma.MultipartFormFiles[T] |
| workers-go#97 | No WebSocket upgrade from Go | worker/websocket.mjs | Upgrade in Go |
| workers-go#220 | No Durable Object in Go | worker/hub.mjs | Write the hub in Go |
| fern#17936 | The SSE terminator matches as a substring | [end-of-stream], refused in items | Drop the item rule |
| fern#17937 | SDKs do not reconnect after a network reset | The client rule | Loop for planned ends only |
| fern#17938 | event: error is read as an item | No SSE error events | Send them |
| fern#17939 | The CLI prints json streams at the end; the terminator is not escaped | A plain-text terminator | Any terminator text would do |
| fern#17775 | The TypeScript SDK sends only one of two header schemes (Access’s two) | The tests pass both as headers | Drop the headers |
| fern#9559 | OpenAPI 3.2.0 is rejected | version: "3.1.0" in ts/src/specs.ts | Use oRPC’s default |
| fern#18316 | An enum grant_type in the OAuth token request: the Go SDK’s token client passes a *string where the enum is expected, and does not compile | grant_type is a string; the conformance servers refuse any other grant (400) | Make it an enum |
| fern#18200 | A named form-encoded OAuth request schema breaks the Go SDK’s test | The schema is inline (examples/conformance-go/api/contract.go) | Drop that RequestBody |
| huma#1132 | A RawBody beside a Body documents a binary request body the operation refuses (415), and Fern’s Go SDK takes it: an io.Reader | jsonOnly in humaworkers/humaworkers.go | Delete jsonOnly |
| typescript-sdk#3032 | MCP’s TypeScript SDK takes a schema whose root is a $ref (a named zod schema) for no object: on a 2025 connection the result is wrapped as { result } | objectRoot in ts/src/mcp.ts inlines the root’s $ref | Drop that inlining; objectRoot’s other two jobs stay |
| typescript-sdk#3033 | MCP’s TypeScript SDK client refuses authorization-server metadata without authorization_endpoint, which RFC 8414 does not ask of a server with only client credentials, so ClientCredentialsProvider cannot sign in to one | None on the server: the conformance MCP test follows the chain by hand (examples/conformance-ts/test/mcp.ts) | Sign in with ClientCredentialsProvider there |
| fern#17997 | With endpoint-security, the TypeScript SDK’s WebSocket client uses _metadata it never declares, and the SDK is not written | auth: any in every fern/generators.yml (internal/fern writes it) | Route credentials per operation |
| fern#17998 | An auth setting in fern/generators.yml marks every AsyncAPI channel as needing credentials | A TypeScript client with none passes auth: false (examples/notes-ts/test/sdk.ts, examples/notes-go/test/soak.ts) | Drop auth: false |
| fern#17996 | The CLI sends only the first credential it has (AuthStrategy::Any) | None: the CLI cannot pass Access | The CLI passes Access |
| fern#18313 | A generated TypeScript SDK’s Headers does not typecheck with @types/node 26 | Every project stays on @types/node 22 (its package.json; internal/fern proves the SDK with it) | Move to @types/node 26 |