fig-sys 2.5.2

FFI bindings and native library for fig (the comment-preserving JSON/YAML/TOML/… config engine). Used by the `fig` crate.
Documentation
New module (src/fig/, following the toml/zon pattern):
- tokenizer.zig — literal-else-string sniffing, number/bare-key classification, quoted and triple-quoted string scanning (raw ''' and dedented """), and `classifyBracketCommit` (the whole-RHS commit test — see "Committed-value refinement" below).
- parser.zig — the block-layer parser: prefix-count depth via a frame stack, dotted-key/append-header/index-addressing path resolution, an intermediate mutable tree (built in a per-parse arena) converted to the immutable AST via AST.Builder, plus a recursive-descent flow-mode ([...]/{...}) parser. Covers essentially all of DESIGN.md's grammar and hard-error diagnostics, with ~30 unit tests plus a full parse of test.fig.txt.
- printer.zig — fig fmt: a correctness-first, always-nested-block house style (documented as not yet doing header-promotion/dotted-collapsing optimizations).
- fig.zig — the Language entry point (single Type.Fig grammar, mirroring ZON's pattern).

Committed-value refinement (markdown links etc. no longer forced to quote):
- The "committed values error, never fall back" rule was too coarse for `[`/`{`: a value starting with `[` (a markdown link `[text](url)`, glob `[a-z]*.md`, regex `[0-9]+`, BBCode) committed to flow-array parsing and thus had to be quoted. DESIGN.md now splits commitment by delimiter — quotes/triple commit on the first char; `[`/`{` commit to flow ONLY when the matching close is the final non-comment token of the RHS. A balanced close with trailing content was never flow → bare string, unquoted; a non-closing bracket (`[80, 443`) stays committed and errors.
- tokenizer.zig: `classifyBracketCommit(source, start) → .flow | .bare_trailing | .unclosed`, with `skipQuotedSpan` (brackets inside quoted spans don't count toward matching) and `restIsCommentOnly` (honors the `#`-after-whitespace rule). Pure, single-line scan.
- parser.zig: wired into `parseUntypedValue`, so it covers both assignments and `-` elements.
- printer.zig: mirror change in `isBareSafe` — a leading `[`/`{` is bare-safe iff `classifyBracketCommit` says `.bare_trailing`, so `fig fmt` emits these unquoted. Also closed a latent round-trip hole: a bare value containing a comment-introducing `#` (at start or after whitespace) is now quoted (bare it would truncate on re-parse).
- Not yet built: the coercion WARN for a balanced-but-trailing-junk value that looks like it wanted to be flow (`[80, 443] oops`). It's specified in DESIGN.md but belongs to the unimplemented authoring-time WARN layer (below).

Wiring: build.zig (new lang_fig gate), language.zig (Language.FIG, deliberately excluded from content-sniffing detect, matching canonical), root.zig (Fig export + test pull-in), ast/serialize_options.zig (new .fig SerializeFormat member), diagnostics.zig and c_api.zig (exhaustive-switch updates), and main.zig (the get/check CLI path now really parses/prints .fig; edit/set/insert/delete/comment still reject it since the in-place editor isn't built).

Bugs found and fixed along the way (via the test suite and then real CLI runs): an atEndOfContent mix-up that made comment-only lines hang the parser forever, an uninitialized PendingContainer in the append-header path, and a Builder leak from a missing deinit().

Verified: zig build test → green; fig get --input fig --output canonical|fig test.fig.txt round-trips the entire kitchen-sink file correctly — structure and values are byte-identical on re-parse, with only two minor comment-placement drifts in a documented edge case (dangling comments at a container boundary). The committed-value refinement is verified end-to-end: markdown links / globs / regexes parse as bare strings, `[80, 443]` still parses as a real number array, `[oops` still errors as truncation, `fig fmt` emits the links unquoted, output is idempotent, and the real Diaryx archive file (contents/links/reachable/workspace_config) now reads with zero quotes on its markdown links.

I also updated DESIGN.md and src/canonical/canonical.zig's comment to say src/fig/ (matching what you asked for) instead of the src/fig_format/ path the design doc had used, and removed the now-stale src/fig/README.md placeholder.

Known, documented gaps for follow-up: authoring-time WARN diagnostics (indent/count mismatch, coercion warnings — including the new balanced-but-trailing-junk `[…] oops` warn), fig fmt house-style heuristics (header promotion, dotted-key collapsing, flow-width budget — the latter would also collapse short scalar lists like `audience` to one inline `[…]` line), and the in-place editor.