v1.0.2 — first-run robustness: native API fallback chain, background auto-dump, hover declaration signatures
The first-run robustness release. The first real-world Claude Code plugin session on a fresh
Windows machine hit three failures at once: the synchronous extension_api.json auto-dump
wedged for its full 60 s timeout before the first request was answered, the timed-out dump left
the whole session on an empty native DB — so every native annotation in every file errored
Could not find type "X" in the current scope. — and hover on declarations rendered the opaque
<Script #N> placeholder. v1.0.2 makes the first run converge to the same behavior as every
later run, with no false positives at any point in between. (#24, #25, #26)
Native API resolution (#24)
- Embedded stock fallback: a gzipped stock 4.6.3 no-docs
extension_api.json(0.4 MB) ships
inside the binary as the last resolution step — builtins (Node,Timer, …) always resolve
on a fresh install with no Godot anywhere. Kill switch:embeddedApiFallback(defaulttrue);
also covers an unreadable explicitextensionApiPath. - Provenance-gated negative claims: the native DB now carries a provenance
(Exactproject-derived /Genericembedded /Absentempty). Native-rooted negative
diagnostics — the terminalCould not find type, super-call misses, meta-base
Cannot find member— fire only underExact: a generic surface can prove what exists,
never what doesn't (a custom engine build's class is indistinguishable from a typo).
Documented as a deliberate deviation indocs/02§11b.
Auto-dump lifecycle (#25)
- The dump runs on a background thread and is adopted mid-session (reload native DB →
republish open buffers → refresh the warm-start cache). The first request never queues behind
a Godot boot; first-run diagnostics converge the moment the dump lands. - Child stdout/stderr are drained concurrently — a chatty engine boot could fill the 64 KB pipe
and ride the whole dump into the timeout. - "The artifact decides" now covers the timeout path: a deadline-killed Godot that already wrote
a complete dump is adopted (parse-validated; torn files quarantine and fall through). - Mid-session reload stability: a reload resolving strictly worse than the live DB (torn read of
a mid-write dump) keeps the live DB; identical content (the post-adoption watcher echo) skips
the re-analyze. Edits also refresh open dependents' diagnostics immediately.
Hover (#26)
- Declaration-site signatures: hover on the name of a
func/var/const/signal/inner
classrenders the member's signature through the same formatter as the call-site hover
(statics showstaticin both). Inner-class members resolve through their interface scope. - Human type labels: script-typed values render their
class_name(or file basename) —
the<Script #N>/<Class>placeholders never reach hover output. Untyped members with an
inferred initializer append the resolved type.
Validation
Conformance ratchets hold at parser 186/186 + analyzer 300/300; differential oracle vs
stock Godot 4.6.3 all-1.0; full suite + clippy + fmt green on Linux and native Windows.
Diagnostics sweeps: Pixelorama (243 files) 0 error-files; a 2,338-script production project
on a custom engine build: first response ~3.2 s on a fully cold start (previously ~60 s),
0 false positives at every stage — the background dump (1,261 classes, GDExtension classes
included) adopted at ~6.7 s mid-session — and the sweep's error-file set is a strict subset of
the v1.0.1 baseline (3 files fixed, 0 new).
Install
cargo install --git https://github.com/kurushimee/gdls --tag v1.0.2 gd_server(or omit --tag for the default branch build, as in the README)
or grab a prebuilt binary below — SHA256SUMS covers both archives.
Known issues — fixed in v1.0.3: 19 declared warning codes never emitted (#29); @warning_ignore missed multi-line targets (#28); definition on dotted method calls, cross-file incomingCalls, and prepareCallHierarchy on a call-site callee returned nothing or the wrong target.