This post covers Kit v2026.7.6. The notes below come from the release tag history and the project changelog.
Kit 2026.7.6 is a large release that sweeps across performance, correctness, and code
health. The compiler and interpreter replace linear scans with comptime dispatch maps, the emitted
runtime gets faster sorts and a real allocator, arithmetic is now overflow-safe end to end, and a
long list of memory leaks and ownership bugs are fixed. Several oversized source files were split
and duplicated logic was consolidated, and the standard library picked up new CLI, Base64/Hex,
TOML, and compression helpers.
Release Snapshot
- Release: v2026.7.6
- Date: July 6, 2026
- Changelog entries since v2026.7.4: 85
- Primary areas: performance, correctness, memory safety, emitted runtime, standard library, refactoring
What Changed
Performance work runs through the whole toolchain. Builtin dispatch in the interpreter and codegen
now uses comptime StaticStringMap lookups instead of long string-compare chains and
linear registry scans, the type checker indexes constructor lookups and skips redundant free-var
scans, and the formatter drops its O(n2) line and matching-if scans. Frontend
node sizes shrank as well — Token from 48 to 32 bytes and Expr from 224 to
72 bytes — and the LSP hot paths coalesce didChange events, cache tokens and the line
index, and buffer stdin.
The emitted runtime is both faster and sturdier. It now uses smp_allocator in release
builds instead of the debug allocator, replaces O(n2) insertion sorts with O(n log n)
sorts and O(1) StringBuilder appends, allocates runtime strings from the heap rather
than a fixed 1 MiB ring pool, and runs filter predicates exactly once per element.
A broad set of correctness and memory-safety fixes landed: overflow-checked arithmetic in the bytecode VM and the emitted math wrappers, guards against float-to-int and factorial/fibonacci overflow, integer-wrap prevention in the binary deserializer, closed-form civil-date math so pre-1970 dates no longer clamp to the epoch, an end to channel operations busy-spinning at 100% CPU, single-ownership HTTP client response building, resource-pool bounds enforcement, and numerous plugged leaks across the SQL generators, LSP server, and lint config.
The standard library gained several features and cleanups: a -- end-of-options
separator and short options in Cli, Result-returning Base64/Hex decode variants, typed
TOML getters to match JSON, unified gzip/zlib/deflate file paths with structured error
classification, and structured error codes for script and parallel failures instead of English
substring matching. Large source files were split into per-command, per-ExprKind, and
per-subcommand handlers, the AST became arena-owned (removing manual recursive free machinery), and
duplicated Value, formatter, and diagnostic-printer logic was consolidated.
The website package docs were regenerated for this release, and the playground WASM binary was
rebuilt so kit version reports 2026.7.6.
Release Highlights
- Replace linear builtin dispatch and registry scans with comptime
StaticStringMaplookups across the interpreter and codegen. - Use
smp_allocatorin release runtime builds; O(n log n) sorts and O(1)StringBuilderappends. - Shrink
Token(48→32 bytes) andExpr(224→72 bytes); make the AST arena-owned. - Overflow-safe arithmetic in the bytecode VM and emitted math wrappers; guard float-to-int and factorial/fibonacci overflow.
- Closed-form civil-date math so pre-1970 dates no longer clamp to the epoch.
- Stop blocking channel operations from busy-spinning at 100% CPU.
- Add
--end-of-options and short options toCli, Result-returning Base64/Hex decoders, and typed TOML getters. - Regenerate package docs and rebuild the playground WASM binary for
2026.7.6.
Release Commits
The list below uses the v2026.7.4..v2026.7.6 changelog range, with each short SHA linked to the
corresponding GitLab commit in kit-lang.
- fix: keep sibling example imports in failed-example parity reruns (32e5b569)
- fix: exact i64 comparisons, checked arithmetic, and closure bounds in bytecode VM (13fa0f44)
- perf: reuse cached tokens result_hash in queryAst instead of re-hashing (5a4a1bf2)
- fix: make incremental cache writes atomic and lock rdeps read-modify-write (13554eea)
- perf: memoize dependency content hashes for the lifetime of a check session (4a464d97)
- fix: remove double deinit and plug sql leak in db param generators (01f37774)
- fix: guard float-to-int math builtins and factorial/fibonacci overflow (dfa4cb6a)
- fix: widen mixed signed/unsigned comparisons to i64 instead of @intCast (dc081be1)
- fix: allocate runtime strings from the heap instead of a 1 MiB ring pool (0f65d2ed)
- feat: use smp_allocator in release builds of the emitted runtime (111b748c)
- fix: prevent length-check integer wrap in binary deserializer (16a84888)
- fix: run filter predicates exactly once per element in emitted runtime (d30215f1)
- perf: O(n log n) sorts and O(1) StringBuilder append in emitted runtime (9f705895)
- fix: closed-form civil-date math; pre-1970 dates no longer clamp to epoch (30d23a69)
- fix: stop blocking channel operations from busy-spinning at 100% CPU (494cbf7b)
- fix: single-ownership response building in HTTP client; free bodies (c0c1efca)
- fix: lift 2048-digit BigInt formatting cap; delete dead O(n^2) bigIntToString (71aa6f4b)
- refactor: dedupe Value compare/display ladders and fixed_width copies (ea738f2c)
- fix: delegate emitted math wrappers to overflow-checked runtime builtins (24569f82)
- refactor: LSP method dispatch map, respond helper, single URI dupe (11109344)
- fix: stop LSP server leaking request-scoped memory on every message (a2cb0b46)
- perf: LSP hot paths - coalesce didChange, cached tokens/line index, buffered stdin (79cfe9e6)
- refactor: dedupe Either.flip via swap and make partition a single fold (763b3311)
- fix: unify min/max/clamp on one Ordering-based comparison convention (f2352cf0)
- fix: replace quadratic string building in list Show/Debug and CLI positionals (bd7dc628)
- fix: strengthen Option and list hash mixing in Types.Traits (769ba300)
- feat: support -- end-of-options separator and short options in Cli (1156e3d5)
- feat: add Result-returning Base64/Hex decode variants; drop dead helpers (65b3dd4a)
- feat: add TOML typed getters and share the assoc-list lookup helper (917fbd18)
- refactor: share one non-empty-message fallback helper across stdlib (b79da6fa)
- fix: structured event JSON fields and chainable merging with-context (9c9805c4)
- fix: align copy-with-path precheck with the write it performs (834a7840)
- feat: unify gzip/zlib/deflate file paths, naming, and error classification (fcb2ed28)
- docs: document the Concurrent/Concurrency namespace split prominently (20a754fd)
- fix: move shared non-empty-or-default helper into Types.NonEmpty (7efa6844)
- fix: classify script and parallel errors by structured codes, not prose (2d5d80da)
- fix: enforce resource pool bounds in the manager actor and release leaked slots (afe2a929)
- fix: alias zlib/deflate module file helpers where builtin names collide (51f51dae)
- docs: document interpreter never-reclaims-values limitation (99bdffbb)
- perf: remove four hot-loop costs from the interpreter instruction loop (1f97676e)
- perf: replace callBuiltin string-compare chain with comptime dispatch map (b8cb1bf3)
- perf: replace linear builtin-registry scans with comptime StaticStringMaps (41276461)
- perf: replace unrolled capability requirement scan with comptime StaticStringMap (a83252b8)
- fix: free lint config ignore_codes at all production call sites (904eda65)
- fix: allocate wasm output name instead of fixed 256-byte buffer (3efc5b6b)
- refactor: single severity-parameterized diagnostic printer in errors.zig (b45d77ac)
- refactor: single compile/cache tail in pipeline instead of duplicated catch-block copies (b1f75c52)
- fix: propagate allocation failure from TypeEnv.clone instead of catch unreachable (b9a77528)
- fix: allocate checker substitutions from the type arena, not the session allocator (be55db71)
- perf: add no-op fast paths to Substitution.apply and in-place composition (40483130)
- perf: skip environment free-var scans for closed schemes in generalize (ac1232cd)
- perf: index constructor lookups and avoid all-pairs field matching (cff1764a)
- fix: report call-site type conflicts at the conflicting argument with expected/got types (cc94b3d0)
- fix: stop counting zero-arity constructor patterns as unused bindings (bbb05ff1)
- refactor: split mainWithArgs into per-subcommand handlers with one capability-flag parser (de8ac9bf)
- test: assert the typed T002 message in the nominal Ptr alias test (5e9eb05d)
- perf: resolve selective imports via per-module export maps (3ec6461b)
- fix: propagate OOM at semantic state-recording sites in lowering and checking (32a5b27c)
- fix: link libc on the native direct-exe final-link path (ed852a63)
- refactor: delete dead code in types and lexer (acd7b228)
- fix: reject oversized, malformed, and empty integer literals with a real parse error (72f02be9)
- fix: suppress stray diagnostics in binding probes and skip impossible probes (3a370a90)
- perf: skip macro expansion for macro-free programs and stop re-walking per expansion (f3bc8b9c)
- perf: remove O(n^2) getLineNumber and findMatchingIf scans in formatter (9553f534)
- perf: reserve known container capacities on hot paths (7798825c)
- refactor: collapse triplicated formatter multi-line machinery; sortImports toOwnedSlice (207dab02)
- refactor: canonical Pattern deep-clone in ast.zig; split oversized parse functions (0961e842)
- fix: remove hardcoded retry-library constructor allowlist from parser init (0797d8e3)
- perf: format emitFmt straight into the output buffer and batch per-byte emit primitives (e98af6d4)
- perf: dispatch builtin calls by namespace prefix instead of scanning all emitter modules (a9cf32f2)
- refactor: comptime-generate the ten fixed-width builtin emitters from type descriptors (a0a23985)
- fix: hash-suffix overlong sanitized names instead of silently truncating (5a5a1338)
- refactor: comptime-generate the interpreter's ten fixed-width builtin families (310e7428)
- refactor: split package/commands.zig into per-command modules (cc229b4b)
- refactor: extract CheckSession concerns from incremental/mod.zig (aafb9bfa)
- refactor: split inferExprWithExpected into per-ExprKind handlers (515eda94)
- refactor: split lowerExpr into per-ExprKind handlers (e1111e51)
- perf: transfer generated source via toOwnedSlice and presize suppress pass (5917b0cc)
- fix: propagate OOM from markStateMachineVarAvailable instead of swallowing it (3ccc39fa)
- refactor: fold emitInstrValueOnlyWithInlineNullaryVars into emitInstrValueOnly (cae4ca51)
- refactor: make ExprPool arena-owned; delete manual recursive AST free machinery (8e126eeb)
- perf: shrink Expr node 224->72 bytes by boxing fat ExprKind variants (a6de10a7)
- fix: teach check-builtins guardrail about comptime-generated fixed-width families (e3d601b8)
- perf: drive partition-global declarations off emitter-tracked structures (3c10795c)
- perf: shrink Token from 48 to 32 bytes by narrowing offset fields to u32 (86112519)
Related links: