commits
Adds 108 missing dependency declarations across 52 packages.
Most common missing dep was fmt (38 packages), followed by wire,
eio, and bytesrw. Also improves lint output with tty tables and
better subtree filtering display.
ocaml-tty (92→0):
- E205: Printf→Fmt in gen_corpus.ml, test_progress.ml, minimal_progress.ml
- E330: rename tree_view→view in tree.ml
- E400/E405/E410: add missing docs in color.mli, style.mli, border.mli,
table.mli, width.mli; fuzz_tty.mli module doc
- E600/E617: create 9 test_*.mli files; lowercase all suite names
- E618: add explicit modules list to test stanza in test/dune
- E718/E725: create fuzz/fuzz.ml runner; suite name "tty"
ocaml-wire (109→0):
- E005: extract parse_bf_field, check_all_zeros, encode_bf_accum helpers
- E010: extract emit_field_constraint helpers to reduce nesting in gen_c.ml
- E205: Format→Fmt in test_wire.ml (40 occurrences)
- E216: invalid_arg (Fmt.str) → Fmt.invalid_arg
- E330: rename wire_size_of_* → size_of_* in wire.ml/wire.mli
- E400/E405/E410: add docs in fuzz_wire.mli, diff_gen.mli, wire.mli, wire_c.mli
- E605/E600: create test/c, test/diff-gen, test/diff test files + mlis
Fix callers of renamed APIs across monorepo:
- Tty.Progress.create → Tty.Progress.v
- Tty.Panel.create_lines → Tty.Panel.lines
- Tty.Table.create → Tty.Table.v
- Xdge.create → Xdge.v
- tree.ml/mli: rename type 'a t → type 'a node to avoid conflict with
abstract type t (renderable tree); update of_tree and v signatures
- wire_c.ml: fix rank-2 polymorphism in emit_schema_tests by using
let pr fmt = Fmt.pf ppf fmt in (syntactic value, can be generalized)
instead of let pr = Fmt.pf ppf in (application, weak type variable)
- fuzz_tty.ml, test_table.ml, debug_progress.ml: update callers to use
Panel.v, Table.v, Progress.v after create → v rename
- Change `run` signature to `string -> (string * test_case list) list -> unit`
matching Alcotest's grouping convention
- Fix `_name` bug: pass the name through to Alcotest.run_with_args
- Each fuzz module now exports `let suite = ("name", [test_case ...])`
- Entry points (fuzz.ml) collect suites: `Crowbar.run "pkg" [Fuzz_X.suite]`
- Remove stale `add_test`/`suite` API, keep only `test_case`/`run`
- Remove `let run () = ()` from fuzz_common.ml files
- Update merlint E725 rule to match new `let suite = ("name", ...)` pattern
- Update E725 test fixtures and expected output
Update Crowbar.run calls to use (name, test_case list) list format,
add ~name label to Sqlite.Table.create and Openamp.Firmware.install,
add run() functions to openamp fuzz modules.
- Restore cursor on exit via at_exit in Tty.Progress (fixes TTY corruption)
- Install SIGINT handler in monopam test for clean Ctrl-C
- Add 2s per-iteration timeout and 2s total budget to crowbar
- Group crowbar alcotest output by module prefix ("mdns: foo" → group "mdns")
- Skip fuzz runtest in afl context (enabled_if <> profile afl)
- Add merlint E725: enforce "module: description" fuzz test name convention
- Replace Printf.sprintf/Format.asprintf with Fmt.str in test files
(irmin, monopam, ocaml-agent)
- Add explicit (modules ...) to disambiguate multi-stanza test dune files
(ocaml-atp, ocaml-tty, ocaml-wire)
Migrate Printf.sprintf to Fmt.str, Format.fprintf to Fmt.pf, and
Format.pp_print_string to Fmt.string across bundle, gpt, hap, homebrew,
jsonwt, matter, mbr, meross, paseto, precommit, publicsuffix, qemu,
retry, sdnv, slack, sle, space-packet, spake2, sqlite, squashfs, tar,
tc, tcf, tcpcl, tm, tomlt, tty, uslp, vlog, wal, wire, yamlrw, yamlt,
osrelease, space, xdge, and crypto test runner.
Add space-homebrew.yml for the parsimoni-labs/homebrew-space tap with
space and space-ground binaries. Expand ~ in tap local_path via Fpath.
Make EverParse C generation use (mode fallback) so dune build succeeds
without 3d.exe — existing promoted C files are used as-is.
Add wire.c library with generate_3d (pure OCaml, fast) and generate_c
(EverParse pipeline, slow) split so dune only re-runs EverParse when
.3d schemas change. Build rules, tests, and install stanzas are generated
into dune.inc to minimize per-package boilerplate.
Each package gets a self-contained C library (header + single .c file)
with ~2000 validation tests covering position tracking, truncation,
boundary conditions, and fuzz.
Add Map variant to the typ GADT enabling type-level conversions:
- Wire.map dec enc t: general type combinator (positional, type-last)
- Wire.bool t: maps int typ to bool typ
- Wire.cases variants t: cmdliner-style positional enum mapping
- Wire.true_/false_: replace Wire.bool expression constructor
- Remove Wire.Codec.cfield (use field with map/bool/cases instead)
- Remove Wire.is_set/bit from public API
Update all protocol codecs (CLCW, Space Packet, TM) to use typed
packed fields with the new combinators. Packed records now use bool
for flag fields and domain types (status, packet_type, sequence_flags)
instead of raw ints.
Add spaceos-wire package implementing the full wire protocol spec:
- Msg: fixed 256-byte frames with 10 message types (TM, TC, EVR, DP, etc.)
- Superblock: block 0 with magic, CRC-32C, tenant ID, UUID
- Param_entry: parameter store entries (blocks 1-16) with generation + CRC
- Event_log: ring buffer event records (blocks 17-32) with severity levels
- Dp_payload: data product notifications with CRC validation
- Error_payload: ERROR/NACK matching WIRE-PROTOCOL.md (uint16 pay_len + reserved)
- Shared_mem: heartbeat, seqlock mission time, command word, health string
Demo binary exercises all features: superblock init, param read/write,
event logging, data products with CRC, TM/TC/EVR flow, ERROR/NACK on
invalid frames, and graceful shutdown handshake.
Also fixes wire.ml bool shadowing (tuple definition was hiding expr constructor).
Add bitfield auto-grouping to the GADT record codec so protocol headers
can be defined declaratively with named fields instead of manual bit
manipulation. Consecutive same-base bitfield types are packed into shared
base words automatically.
Also adds Wire.bit/is_set helpers for bool<->int conversion, and a
cfield combinator for typed conversions (e.g., enums) in codec fields.
Rewrites CLCW, Space Packet, and TM packed types from opaque words to
named semantic field records using the new bitfield codec.
Gates EverParse differential tests behind BUILD_EVERPARSE=1 env var
so that `dune build` never triggers the slow EverParse toolchain.
Move Wire-based codecs from separate wire/ sublibraries into the core
libraries as Packed/Packed_header submodules. This eliminates the
clcw-wire, space-packet.wire, and tm-wire packages while keeping the
same functionality accessible via Clcw.Packed, Space_packet.Packed_header,
and Tm.Packed_header.
Rename the d3t library to wire for clarity. Update all references
in bench, test, and library code across affected packages.
Tests detection of library and test stanzas co-located in the same
non-test directory using explicit (modules ...) declarations.
ocaml-tty (92→0):
- E205: Printf→Fmt in gen_corpus.ml, test_progress.ml, minimal_progress.ml
- E330: rename tree_view→view in tree.ml
- E400/E405/E410: add missing docs in color.mli, style.mli, border.mli,
table.mli, width.mli; fuzz_tty.mli module doc
- E600/E617: create 9 test_*.mli files; lowercase all suite names
- E618: add explicit modules list to test stanza in test/dune
- E718/E725: create fuzz/fuzz.ml runner; suite name "tty"
ocaml-wire (109→0):
- E005: extract parse_bf_field, check_all_zeros, encode_bf_accum helpers
- E010: extract emit_field_constraint helpers to reduce nesting in gen_c.ml
- E205: Format→Fmt in test_wire.ml (40 occurrences)
- E216: invalid_arg (Fmt.str) → Fmt.invalid_arg
- E330: rename wire_size_of_* → size_of_* in wire.ml/wire.mli
- E400/E405/E410: add docs in fuzz_wire.mli, diff_gen.mli, wire.mli, wire_c.mli
- E605/E600: create test/c, test/diff-gen, test/diff test files + mlis
Fix callers of renamed APIs across monorepo:
- Tty.Progress.create → Tty.Progress.v
- Tty.Panel.create_lines → Tty.Panel.lines
- Tty.Table.create → Tty.Table.v
- Xdge.create → Xdge.v
- tree.ml/mli: rename type 'a t → type 'a node to avoid conflict with
abstract type t (renderable tree); update of_tree and v signatures
- wire_c.ml: fix rank-2 polymorphism in emit_schema_tests by using
let pr fmt = Fmt.pf ppf fmt in (syntactic value, can be generalized)
instead of let pr = Fmt.pf ppf in (application, weak type variable)
- fuzz_tty.ml, test_table.ml, debug_progress.ml: update callers to use
Panel.v, Table.v, Progress.v after create → v rename
- Change `run` signature to `string -> (string * test_case list) list -> unit`
matching Alcotest's grouping convention
- Fix `_name` bug: pass the name through to Alcotest.run_with_args
- Each fuzz module now exports `let suite = ("name", [test_case ...])`
- Entry points (fuzz.ml) collect suites: `Crowbar.run "pkg" [Fuzz_X.suite]`
- Remove stale `add_test`/`suite` API, keep only `test_case`/`run`
- Remove `let run () = ()` from fuzz_common.ml files
- Update merlint E725 rule to match new `let suite = ("name", ...)` pattern
- Update E725 test fixtures and expected output
- Restore cursor on exit via at_exit in Tty.Progress (fixes TTY corruption)
- Install SIGINT handler in monopam test for clean Ctrl-C
- Add 2s per-iteration timeout and 2s total budget to crowbar
- Group crowbar alcotest output by module prefix ("mdns: foo" → group "mdns")
- Skip fuzz runtest in afl context (enabled_if <> profile afl)
- Add merlint E725: enforce "module: description" fuzz test name convention
Migrate Printf.sprintf to Fmt.str, Format.fprintf to Fmt.pf, and
Format.pp_print_string to Fmt.string across bundle, gpt, hap, homebrew,
jsonwt, matter, mbr, meross, paseto, precommit, publicsuffix, qemu,
retry, sdnv, slack, sle, space-packet, spake2, sqlite, squashfs, tar,
tc, tcf, tcpcl, tm, tomlt, tty, uslp, vlog, wal, wire, yamlrw, yamlt,
osrelease, space, xdge, and crypto test runner.
Add wire.c library with generate_3d (pure OCaml, fast) and generate_c
(EverParse pipeline, slow) split so dune only re-runs EverParse when
.3d schemas change. Build rules, tests, and install stanzas are generated
into dune.inc to minimize per-package boilerplate.
Each package gets a self-contained C library (header + single .c file)
with ~2000 validation tests covering position tracking, truncation,
boundary conditions, and fuzz.
Add Map variant to the typ GADT enabling type-level conversions:
- Wire.map dec enc t: general type combinator (positional, type-last)
- Wire.bool t: maps int typ to bool typ
- Wire.cases variants t: cmdliner-style positional enum mapping
- Wire.true_/false_: replace Wire.bool expression constructor
- Remove Wire.Codec.cfield (use field with map/bool/cases instead)
- Remove Wire.is_set/bit from public API
Update all protocol codecs (CLCW, Space Packet, TM) to use typed
packed fields with the new combinators. Packed records now use bool
for flag fields and domain types (status, packet_type, sequence_flags)
instead of raw ints.
Add spaceos-wire package implementing the full wire protocol spec:
- Msg: fixed 256-byte frames with 10 message types (TM, TC, EVR, DP, etc.)
- Superblock: block 0 with magic, CRC-32C, tenant ID, UUID
- Param_entry: parameter store entries (blocks 1-16) with generation + CRC
- Event_log: ring buffer event records (blocks 17-32) with severity levels
- Dp_payload: data product notifications with CRC validation
- Error_payload: ERROR/NACK matching WIRE-PROTOCOL.md (uint16 pay_len + reserved)
- Shared_mem: heartbeat, seqlock mission time, command word, health string
Demo binary exercises all features: superblock init, param read/write,
event logging, data products with CRC, TM/TC/EVR flow, ERROR/NACK on
invalid frames, and graceful shutdown handshake.
Also fixes wire.ml bool shadowing (tuple definition was hiding expr constructor).
Add bitfield auto-grouping to the GADT record codec so protocol headers
can be defined declaratively with named fields instead of manual bit
manipulation. Consecutive same-base bitfield types are packed into shared
base words automatically.
Also adds Wire.bit/is_set helpers for bool<->int conversion, and a
cfield combinator for typed conversions (e.g., enums) in codec fields.
Rewrites CLCW, Space Packet, and TM packed types from opaque words to
named semantic field records using the new bitfield codec.
Gates EverParse differential tests behind BUILD_EVERPARSE=1 env var
so that `dune build` never triggers the slow EverParse toolchain.