Skip to content

v1.0.2 — first-run robustness: native API fallback chain, background auto-dump, hover declaration signatures

Choose a tag to compare

@kurushimee kurushimee released this 10 Jun 17:20

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 (default true);
    also covers an unreadable explicit extensionApiPath.
  • Provenance-gated negative claims: the native DB now carries a provenance
    (Exact project-derived / Generic embedded / Absent empty). Native-rooted negative
    diagnostics — the terminal Could not find type, super-call misses, meta-base
    Cannot find member — fire only under Exact: 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 in docs/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
    class renders the member's signature through the same formatter as the call-site hover
    (statics show static in 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.