Skip to content

feat: report extension failures instead of only showing them - #13

Merged
w1ne merged 1 commit into
mainfrom
feat/crash-reporter
Aug 14, 2026
Merged

w1ne merged 1 commit into
mainfrom
feat/crash-reporter

Conversation

@w1ne

@w1ne w1ne commented Aug 14, 2026

Copy link
Copy Markdown
Owner

The playground and the CLI both report failures now. The editor was the last surface where a failure reached only the person it happened to — and its failures are the ones a user is least able to describe: the Run button did nothing, F5 did nothing, the output channel scrolled past the reason.

Both binary-resolution paths report before re-throwing — F5's DAP lookup and the Run button's CLI lookup. That is where a broken release actually lands in this extension.

What leaves the machine is the same enumerated row the installer sends: surface, stage, platform, release, channel, an allowlisted error class, and a fingerprint. Never the message — in an editor extension the message is the user's workspace path or their firmware's name. The fingerprint is FNV-1a over the error type and its first stack frame's function name; paths never enter it.

host_class carries where the binary came from (bundled / PATH / downloaded), which is the field that separates "our release is broken" from "their PATH has something else on it".

Consent: VS Code's own telemetry switch governs this — if it is off, nothing is sent, without asking again in our own setting. labwired.telemetry.enabled is the separate off switch for people who leave editor telemetry on.

The pure parts live in crashFingerprint.ts so they can be unit-tested without a VS Code host: import * as vscode cannot load in plain mocha, and a fingerprint function nobody can test is one nobody should trust with "never put a path in this".

29 unit tests, tsc -p . --noEmit clean.

The playground and the CLI both report failures now. The editor was the last
surface where a failure reached only the person it happened to — and its
failures are the ones a user is least able to describe: the Run button did
nothing, F5 did nothing, and the output channel scrolled past the reason.

Both binary-resolution paths now report before re-throwing: F5's DAP lookup
and the Run button's CLI lookup. Those are where a broken release actually
lands in this extension.

What leaves the machine is the same enumerated row the installer sends —
surface, stage, platform, release, channel, an allowlisted error class and a
fingerprint. Never the message: in an editor extension the message is the
user's workspace path or their firmware's name. The fingerprint is FNV-1a
over the error type and its first stack frame's function name; paths never
enter it.

`host_class` carries where the binary came from — bundled, PATH, downloaded
— which is the field that separates "our release is broken" from "their PATH
has something else on it".

VS Code's own telemetry switch governs this: if it is off, nothing is sent,
without asking again in our own setting. `labwired.telemetry.enabled` is the
separate off switch for people who leave editor telemetry on.

The pure parts live in crashFingerprint.ts so they can be unit-tested without
a VS Code host — `import * as vscode` cannot load in plain mocha, and a
fingerprint function nobody can test is one nobody should trust with "never
put a path in this". 29 unit tests, tsc clean.
@w1ne
w1ne merged commit de92b5a into main Aug 14, 2026
2 checks passed
@w1ne
w1ne deleted the feat/crash-reporter branch August 14, 2026 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant