Skip to content

zig: settings and command schemas read 0.17's @typeInfo - #488

Merged
foxnne merged 1 commit into
zig/merge-main-1017from
zig/017-typeinfo-schemas
Oct 17, 2026
Merged

foxnne merged 1 commit into
zig/merge-main-1017from
zig/017-typeinfo-schemas

Conversation

@foxnne

@foxnne foxnne commented Oct 17, 2026

Copy link
Copy Markdown
Collaborator

Part of fizzyedit/plans#5 (plans/ZIG_0_17_PLAN.md, step 2, follow-up (c): @typeInfo, with the fingerprint-equality test). Stacked on #486.

What changes

  • The settings and command schema builders read 0.17's @typeInfo directly. sdk/src/settings.zig and sdk/src/Command.zig loop over field_names, field_types and field_attrs, and take a cell's default with FieldAttributes.defaultValue.
    • This replaces the ZIG017 stand-in that rebuilt 0.16-shaped field records. sdk/src/zig017_fields.zig is deleted.
    • The bare-payload structs (Plain) pass @typeInfo's own name slice to @Struct instead of copying it.
  • The proof the plan asked for. fingerprint.zig was translated loop for loop in zig: the 0.17 switch, scaffolded with marked stand-ins #437, and this adds the check: a test hashing a fixed set of types, one of each kind the hashes look into, at a depth that reaches them all. Both hashes must equal the values Zig 0.16 computed for the same types, with the file as it was on main (7b538aa):
    • hashAllShape, the target-invariant hash that's recorded: 0x2ae9f3848d7d3d9f.
    • hashAll, on fixed-width types only, since it folds in sizes: 0xc0b59f8f6303fb84.
    • The 0.16 run used main's file with Zig 0.16.0 and the 0.17 run uses this branch's with Zig 0.17.0; the values match.

ZIG017 markers left on the branch: the two per-pointer-capture notes (dvui#1014) and check-examples.sh's branch pins, which go back to main at the merge.

SDK impact

Verified

  • macOS (arm64, Zig 0.17.0):
    • scripts/check-fmt.sh
    • zig build
    • zig build test: 95/95 steps
    • zig build check-tests-reached: 120/120
    • zig build check-web: 41/41
    • zig build test-sdk-version: 35/35
    • zig build test-integration: 77/77 steps
  • Windows, Linux: CI.

🤖 Generated with Claude Code

The schema builders in sdk/src/settings.zig and sdk/src/Command.zig loop
over @typeinfo's field_names/field_types/field_attrs and take a cell's
default with FieldAttributes.defaultValue, in place of the ZIG017
stand-in that rebuilt 0.16's field records (sdk/src/zig017_fields.zig,
deleted). The plain payload structs reuse @typeinfo's own name slice.

fingerprint.zig gains the test the plan asked for: both hashes of a
fixed set of types, one of each kind they look into, equal the values
Zig 0.16 computed with the file as it was on main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@foxnne
foxnne added this pull request to stack #491 October 17, 2026 17:16
@foxnne
foxnne merged commit 28766fa into zig/0.17 Oct 17, 2026
9 of 11 checks passed
@foxnne
foxnne deleted the zig/017-typeinfo-schemas branch October 17, 2026 17:16
foxnne added a commit that referenced this pull request Oct 17, 2026
Part of fizzyedit/plans#5 (`plans/ZIG_0_17_PLAN.md`, step 2, follow-up
(f): dvui API drift). Stacked on #488.

Two places that hand a lifted view's drag on to the mouse's capture read
dvui's internal `Window.captures[0]`. dvui 0.17 made capture per-pointer
(dvui#1014), and the switch PR left these as `ZIG017` stand-ins that
assumed the mouse:
- the view-drag lift in `app/layout/Chooser.zig`;
- the workbench tab drag in `plugins/workbench/src/Workspace.zig`.

Both now call `dvui.captureMouseGet()`. That's dvui's public call
(CONTRIBUTING: dvui's public API over its state), and it returns the
capture of the pointer that last moved, so a touch drag keeps its own
capture instead of the mouse's.

## SDK impact

- [x] None

## Verified

- [x] macOS (arm64, Zig 0.17.0):
  - `scripts/check-fmt.sh`
  - `zig build`
  - `zig build test`: 95/95 steps
  - `zig build check-web`: 41/41
  - `zig build test-integration`: 77/77 steps
- [ ] A view or tab dragged by hand: not done, because the screen is
locked.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@foxnne foxnne mentioned this pull request Oct 18, 2026
3 of 4 tasks
foxnne added a commit that referenced this pull request Oct 18, 2026
Part of fizzyedit/plans#5 (`plans/ZIG_0_17_PLAN.md`, step 2): fizzy, its
backend and its bundled plugins move to Zig 0.17. Every piece was
reviewed as its own PR into `zig/0.17`, and this PR lands that branch.
`main` is already merged in (through #555), so it carries no conflicts.

## What changes

**The move to 0.17** (`minimum_zig_version = "0.17.0"` everywhere), as
reviewed in:
- #437: the switch, scaffolded with marked stand-ins
- #438: the build's custom steps become helper programs
- #448: release packaging on 0.17, with Velopack 1.2.161 (+ #452's zon
arenas)
- #488: settings and command schemas read 0.17's `@typeInfo`, with a
test that the SDK fingerprint hashes the same facts as on 0.16
- #489: per-pointer capture through `captureMouseGet`
- #494: the Windows traps in `docs/PITFALLS.md`
- #496: `blitData` without an `extern struct` `@bitCast`
- #498: `fizzy.plugin.installBeside`, for a plugin's helper program
- #505: the 0.16 inflate workaround goes; the docs say 0.17
- #561: review fixes. A settings payload with pointers is a compile
error, and build reads go through `b.root`.
- #573: the plugin install helper compiles once, in Debug
- the catch-ups with `main` (#486, #503, #558, #574, and the last merge
here), each with `scripts/zig-0.17/rewrite.sh` re-run. That script is
deleted in the last commit.

Most of the diff is mechanical: `zig fmt`'s upgrades (`@backingInt`,
`std.lang`, …) and one-answer renames. The hand migrations are the build
(configure/make split, no custom steps), the zon arenas, `@typeInfo`,
translate-c for `@cImport`, and the `@bitCast` audit. A high-effort
review of the whole `main`…`zig/0.17` diff found five things; the three
correctness ones are fixed in #561, and one efficiency one in #573.

**Also on the branch, merged there by the maintainer:** the windowing
work.
- #480–#483: plain dvui apps on macOS
- #492, #501, #504, #510: OS windows for floating windows, full screen,
pointer routing
- #546: window materials

**Forks:** dvui-dev at its `zig-0.17` head `1b29a16`, which carries
fizzy-dev's patches on upstream's 0.17 `main`, including #540, #544 and
#563's dvui commits. Also assetpack, md4zig, sdl_zig and zig-objc on
their `zig-0.17` branches, and velopack-zig `3d553b7` (tagged
`fizzy-zig0.17`).

## Measured

macOS arm64, under load from other sessions, each step alternated
between the two. 0.16 is `main` #509; 0.17 is `zig/0.17` with #561.

| | Zig 0.16 | Zig 0.17 |
|---|---|---|
| App, cold Debug build | 94.4 s | 78.6 s |
| App, warm no-op rebuild | 0.7 s | 0.4 s |
| `test-integration` (compile + run) | 108.9 s | 90.4 s |
| App, ReleaseFast build | 142.8 s | 131.5 s |
| Image plugin, cold standalone build | 11.6 s | 14.0 s (with #573) |
| Startup, Debug (median of 5) | 565 ms | 466 ms |
| Startup, ReleaseFast (median of 5) | 175 ms | 177 ms |
| Text, ReleaseFast, µs/frame: idle / mid / scroll / typing | 305 / 424
/ 435 / 403 | 240 / 306 / 286 / 290 |
| Markdown, ReleaseFast, 4 docs, median of 5, µs/frame: idle top / mid /
scroll / resize | 1177 / 1735 / 2104 / 1319 | 1270 / 1699 / 1833 / 1192
|

The one slowdown is markdown idle at the top of a document, +8%. The
rest of the plugin build's gap is dvui's own translate-c on 0.17.

## The plan's gate

- **ZLS:** no 0.17 release yet (latest 0.16.0). zigtools/zls#3270 is on
ZLS's master. Completions across `fizzy_sdk` from a plugin are not
checked.
- **Minimum OS:** 0.17 needs Darwin 15+ (OS X 10.11); fizzy's macOS
minimum is 11.0, so no change. Windows 10+ and Linux 5.10+ are not
stated by fizzy.
- **Debug leak reports:** still print (`DebugAllocator`, deprecated,
unchanged). The move to `SafeAllocator` is a follow-up with its own
Debug frame-time check.
- **Velopack:** packaging proven by a test release on macOS (signed and
notarized), Windows and Linux. An update in place was not tested.
- **Every target builds:** in CI. Windows and Linux were not run by hand
on the VMs.

## SDK impact

- [x] Fingerprint moved (`0x5f9c818a6972efd4`, recorded in
`sdk/src/version.zig`); `sdk_version` untouched. `sdk: release 0.2.30`
follows this at once. Plugins need Zig 0.17 to build against it: there's
no overlap window.
- Plugin authors see `minimum_zig_version = "0.17.0"` and
`fizzy.plugin.installBeside`. A settings payload holding pointers other
than a string is now a compile error. `docs/PLUGINS.md` says 0.17.0.

## Right after this merges

1. fizzyedit/example-app#8 and fizzyedit/example-plugin#13 merge. Then a
one-line PR points `scripts/check-examples.sh` back at `main` (it pins
the examples' `zig-0.17` branches until then, so `main`'s CI is never
red).
2. `sdk: release 0.2.30`.
3. The store plugins' 0.17 PRs repin and release: fizzyedit/pixi#51,
zig#15, atlas#16, drive#13, ghostty#14, agent#23, chat#16.

## Verified

- [x] macOS (arm64, Zig 0.17.0), on this tree:
  - `scripts/check-fmt.sh`
  - `zig build`: 71/71
  - `zig build test`: 109/109 steps, 637/638 (1 skipped)
  - `zig build check-tests-reached`: 998 tests in 122 files
  - `zig build check-web`: 42/42
  - `zig build test-sdk-version`: 35/35
  - `zig build test-integration`: 78/78 steps, 608/608
- [x] All seven store plugins built against `zig/0.17`'s `sdk/` and
loaded together in a 0.17 fizzy (Debug, sandbox profile).
- [ ] Windows, Linux, the example repos: CI.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant