Sigil 0.20.3
A build performance and async-correctness release. Sigil recognizes when a package has not changed and skips it outright instead of walking its inputs again, which turns a no-change rebuild from a coffee break into a pause. Under the async scheduler, tcp-connect no longer stalls every other fiber while it waits. Applications built with Sigil also report their own version and commit separately from the runtime they were built against.
Existing projects build without changes. The package cache is content-addressed and fails closed: anything it cannot account for is rebuilt.
Unchanged packages are skipped, not re-walked
A warm rebuild used to spend nearly all of its time in the package layer. Every module and native input printed CACHED, and yet each package still enumerated its inputs, checked its artifacts, handled its assets and rebuilt its context. Compilation and linking were not the problem; the bookkeeping around them was.
Sigil now computes a fingerprint for each package before building it, covering the package declaration and its source, native, asset, docs and vendor inputs, plus the normalized build configuration, target and toolchain identity, and the build mode. When the fingerprint matches a recorded manifest and the artifacts it names are present, the package is skipped entirely.
A fully unchanged Slate build for android-arm64 went from roughly 106 seconds to roughly 7 seconds, with all 15 package manifests hitting. The largest remaining cost is scanning big vendor trees, which is a later change.
The gate is deliberately conservative. A missing artifact, an unreadable input, an unknown configuration field or a schema change all miss and rebuild. A stale hit is a wrong build, so the cache prefers doing the work again over guessing.
Applications report their own version, not the runtime's
An application built with Sigil now carries its own version and workspace commit, separate from the sigil-lang version it was built against, and --version shows both. The commit includes a -dirty marker when the workspace has tracked changes at build time.
This matters for support. A bug report that says only which Sigil built the binary does not say which build of the application is running, and those are different questions.
Generated version metadata no longer disturbs the cache
Sigil writes version metadata into the build tree, which meant a package's own generated file could land inside the input set the fingerprint is computed over. A package could then look changed because of something Sigil itself had just written. Generated version metadata is now excluded from package input roots, so the fingerprint reflects your sources.
tcp-connect no longer stalls the scheduler
Under the async scheduler, tcp-connect blocked the whole thread while the TCP handshake completed. Every other fiber stopped with it, so one slow or unreachable peer paused all concurrent work, and a connect to an unresponsive host held everything for the full connection timeout.
The connect is now split into a nonblocking start and a finish. When a scheduler is running, the fiber yields while the socket is not yet writable and other fibers keep running; the connect completes when the socket is ready. Without a scheduler the behavior is unchanged, so synchronous code sees exactly what it saw before.
Upgrade notes
Nothing is required. The first build after upgrading rebuilds everything once to record the new manifests, and subsequent no-change builds hit the fast path.