microsoft/typescript-go · critical · Error

Expected positive fixint or uint8 marker, received: 0x${tb.t

Error message

Expected positive fixint or uint8 marker, received: 0x${tb.toString(16)}

What it means

The message-type element inside a tuple did not start with a positive-fixint (<=0x7f) or the uint8 marker (0xcc). Like error 83 this is a framing desynchronization: bytes are being interpreted at the wrong offset.

Source

Thrown at _packages/native-preview/src/api/syncChannel.ts:460

    private readTuple(): void {
        // Fixed 3-element array marker
        const marker = this.readByte();
        if (marker !== MSGPACK_FIXARRAY3) {
            throw new Error(
                `Expected fixed 3-element array (0x93), received: 0x${marker.toString(16)}`,
            );
        }

        // Message type – positive fixint or uint8
        const tb = this.readByte();
        if (tb <= 0x7f) {
            this._msgType = tb;
        }
        else if (tb === MSGPACK_UINT8) {
            this._msgType = this.readByte();
        }
        else {
            throw new Error(
                `Expected positive fixint or uint8 marker, received: 0x${tb.toString(16)}`,
            );
        }

        this._msgName = this.readBin();
        this._msgPayload = this.readBin();
    }

    /**
     * Read a MessagePack bin field.
     */
    private readBin(): Buffer {
        const marker = this.readByte();
        let size: number;
        switch (marker) {
            case MSGPACK_BIN8:
                size = this.readByte();
                break;

View on GitHub (pinned to 1bcfa18d79)

Solutions

  1. Same remediation as the fixarray error: eliminate non-protocol writes on the child's stdout
  2. Restart the child and re-establish the channel; do not attempt to resync mid-stream
  3. Pin host and child to identical versions
  4. Enable child stderr logging to find what it printed right before the corruption
Defensive patterns

Strategy: fallback

Try / catch

try { /* channel request */ } catch (e) { if (/positive fixint or uint8 marker/.test(e.message)) { /* unrecoverable desync: respawn child and retry once */ } throw e; }

Prevention

When it happens

Trigger: Stream misalignment caused by stray stdout output, a length-prefix bug, or reading garbage after a child crash; the parser lands mid-payload and reads a non-int marker byte where the type was expected.

Common situations: Same class as 0x93 mismatch: unlogged child prints to stdout, mismatched binary versions, or a partially-written frame observed after OOM/kill of the child process.

Related errors


AI-assisted analysis of microsoft/typescript-go@1bcfa18d79 (2026-08-16). Data as JSON: /api/errors/4d1863cbaa1c9359. Report an issue: GitHub.