diff --git a/clients/README.md b/clients/README.md
index f1929a2..2926ea9 100644
--- a/clients/README.md
+++ b/clients/README.md
@@ -21,7 +21,7 @@ fails if they drift from the source or the live dataclass.
 |---|---|---|---|
 | Python | `mgf.common.observability.LogRecord` (native) | `tests/unit/observability/test_log_record_conformance.py` | ✅ in mgf-common CI |
 | TypeScript | `clients/typescript/logRecord.ts` | `clients/typescript/conformance.test.ts` | ✅ in mgf-common CI (Node ≥ 22) |
-| Zig | `clients/zig/log_record.zig` | `test` block in the same file | ⏳ in **mgf-hrb** CI (no Zig toolchain in mgf-common CI) |
+| Zig | `clients/zig/log_record.zig` | `test` block in the same file | ⏳ in **mgf-hrb** CI (Zig 0.16; no Zig toolchain in mgf-common CI) |
 
 Each client's conformance test loads the golden fixture and asserts its emitter
 reproduces every line **byte-for-byte**, then re-emits the parsed record and
@@ -37,7 +37,7 @@ uv run pytest tests/unit/observability/test_log_record_conformance.py
 # TypeScript (no deps — Node's built-in test runner + type stripping)
 node --experimental-strip-types --test clients/typescript/conformance.test.ts
 
-# Zig (compiled where the toolchain lives — mgf-hrb vendors this module)
+# Zig 0.16 (compiled where the toolchain lives — mgf-hrb vendors this module)
 zig test clients/zig/log_record.zig
 ```
 
diff --git a/clients/zig/log_record.zig b/clients/zig/log_record.zig
index 7ea035f..c5af114 100644
--- a/clients/zig/log_record.zig
+++ b/clients/zig/log_record.zig
@@ -152,11 +152,11 @@ pub fn writeJsonObject(rec: LogRecord, w: anytype) !void {
 
 /// Render one JSONL line (object + trailing newline). Caller owns the memory.
 pub fn toJsonlAlloc(allocator: std.mem.Allocator, rec: LogRecord) ![]u8 {
-    var buf = std.ArrayList(u8).init(allocator);
-    errdefer buf.deinit();
-    try writeJsonObject(rec, buf.writer());
-    try buf.append('\n');
-    return buf.toOwnedSlice();
+    var aw: std.Io.Writer.Allocating = .init(allocator);
+    errdefer aw.deinit();
+    try writeJsonObject(rec, &aw.writer);
+    try aw.writer.writeByte('\n');
+    return aw.toOwnedSlice();
 }
 
 // --------------------------------------------------------------------------- //
@@ -257,9 +257,9 @@ test "emitter reproduces every golden fixture line" {
     var it = std.mem.splitScalar(u8, fixture, '\n');
     for (recs) |rec| {
         const expected = it.next() orelse return error.FixtureTooShort;
-        var buf = std.ArrayList(u8).init(std.testing.allocator);
-        defer buf.deinit();
-        try writeJsonObject(rec, buf.writer());
-        try std.testing.expectEqualStrings(expected, buf.items);
+        var obuf: [4096]u8 = undefined;
+        var w = std.Io.Writer.fixed(&obuf);
+        try writeJsonObject(rec, &w);
+        try std.testing.expectEqualStrings(expected, w.buffered());
     }
 }
