zig-knowledge-patch

Installation
SKILL.md

Zig Knowledge Patch

Claude's baseline knowledge covers Zig through 0.12.x. This skill provides breaking changes and new features in 0.13.0 and 0.14.0.

Breaking Changes Quick Reference

Version Change Impact Details
0.13.0 ComptimeStringMap -> StaticStringMap API rename + new init pattern stdlib-changes
0.13.0 zig-cache -> .zig-cache Update .gitignore stdlib-changes
0.13.0 std.Progress rework Pass Node by value, new init API stdlib-changes
0.14.0 std.builtin.Type fields lowercased .Int -> .int, .Struct -> .@"struct" language-changes
0.14.0 @setCold removed Use @branchHint(.cold) language-changes
0.14.0 @fence removed Use stronger atomic orderings language-changes
0.14.0 @export takes pointer Add & operator language-changes
0.14.0 CallingConvention overhauled Tagged union, .C -> .c language-changes
0.14.0 Anonymous struct types removed Tuples unified, structural equivalence language-changes
0.14.0 GeneralPurposeAllocator -> DebugAllocator New init pattern stdlib-changes
0.14.0 ArrayList deprecated Use ArrayListUnmanaged, pass allocator stdlib-changes
0.14.0 std.mem.page_size removed Use std.heap.pageSize() stdlib-changes
0.14.0 Build API: root_module addExecutable takes root_module build-system
0.14.0 Package hash format changed New format includes name/version/fingerprint build-system

New Language Features (0.14.0)

Labeled Switch

Switch statements can be labeled and targeted by continue for state machines:

foo: switch (@as(u8, 1)) {
    1 => continue :foo 2, // jump to case 2
    2 => continue :foo 3,
    3 => return,
    else => unreachable,
}

Generates optimized branch prediction code. Also supports break from labeled switch.

Decl Literals

.foo syntax resolves to declarations on the target type (not just enum variants):

const S = struct {
    x: u32,
    const default: S = .{ .x = 123 };
    fn init(val: u32) S {
        return .{ .x = val + 1 };
    }
};
const a: S = .default; // S.default
const b: S = .init(100); // S.init(100)

Key pattern: Unmanaged containers use .empty instead of .{}:

var list: std.ArrayListUnmanaged(u32) = .empty;
foo: std.ArrayListUnmanaged(u32) = .empty, // as struct field default

Fields and declarations in the same container cannot share names.

@branchHint

Replaces @setCold. Must be first statement in block:

@branchHint(.unlikely);  // .none, .likely, .unlikely, .cold, .unpredictable

@FieldType Builtin

comptime assert(@FieldType(MyStruct, "field_name") == u32);

@splat for Arrays

var pixels: [W][H]Rgba = @splat(@splat(.black));

See references/language-changes.md for full details.

Standard Library (0.14.0)

Allocator Changes

// DebugAllocator (replaces GeneralPurposeAllocator)
var debug_allocator: std.heap.DebugAllocator(.{}) = .init;
const gpa = debug_allocator.allocator();
defer _ = debug_allocator.deinit();

// SmpAllocator (for ReleaseFast, competitive with glibc)
const allocator = std.heap.smp_allocator;

New remap on Allocator.VTable enables relocation during resize (uses mremap on Linux).

Unmanaged Containers (managed versions deprecated)

var list: std.ArrayListUnmanaged(i32) = .empty;
defer list.deinit(gpa);
try list.append(gpa, 1234);  // allocator passed to methods

Same for ArrayHashMapUnmanaged. popOrNull renamed to pop.

ZON Support

Runtime: std.zon.parse.fromSlice(T, allocator, zon_bytes, .{}). Compile-time: const cfg: Config = @import("config.zon");.

Runtime Page Size

std.heap.pageSize() (runtime, memoized). Comptime bounds: page_size_min, page_size_max.

See references/stdlib-changes.md for full details.

Build System (0.14.0)

File System Watching

zig build --watch                # rebuilds on source changes
zig build --watch --debounce 100 # custom debounce (default 50ms)

Module-First API

const mod = b.createModule(.{
    .root_source_file = b.path("src/main.zig"),
    .target = target,
    .optimize = optimize,
});
const exe = b.addExecutable(.{ .name = "hello", .root_module = mod });
// Reuse same module for tests:
const tests = b.addTest(.{ .name = "hello-test", .root_module = mod });

Incremental Compilation (opt-in)

zig build -Dno-bin -fincremental --watch  # fast error-checking loop

x86 Backend

98% behavior test pass rate. Select with -fno-llvm. Expected default for debug mode in 0.15.0.

See references/build-system.md for full details.

Major Deprecation Removals (0.14.0)

Now compile errors: std.mem.tokenize (use tokenizeAny/tokenizeSequence/tokenizeScalar), std.mem.split (use splitSequence/splitAny/splitScalar), std.rand (use std.Random), std.TailQueue (use std.DoublyLinkedList), std.zig.CrossTarget (use std.Target.Query), std.fs.MAX_PATH_BYTES (use max_path_bytes).

Reference Files

File Contents
language-changes.md Labeled switch, decl literals, @branchHint, @fence removal, CallingConvention, type field renames, packed struct changes, tuple unification
stdlib-changes.md DebugAllocator, SmpAllocator, remap API, unmanaged containers, ZON, runtime page size, StaticStringMap, Progress rework, deprecations
build-system.md --watch, root_module API, addLibrary, package hash format, incremental compilation, fuzzer, WriteFile/RemoveDir changes
Related skills
Installs
3
GitHub Stars
19
First Seen
Apr 7, 2026