commits
ocaml-atp: add test_naming.ml for hermest/lib/naming.ml (E605)
ocaml-clcw: merge fuzz_diff.ml into fuzz_clcw.ml to fix E710
(fuzz_diff had no corresponding library module)
ocaml-retry: extract test_retry.ml module with suite tuple (E605)
Rename make_superblock → superblock, make_inode_buf → inode_buf,
make_image → image, make_key → key in squashfs and streaming-aead.
Replace Printf.sprintf with Fmt.str, Format.asprintf with Fmt.str,
Format.fprintf with Fmt.pf, and Format.formatter_of_buffer patterns
with Fmt.str "%a" across all test files.
Standardize fuzz and test conventions across 30+ packages:
- E715/E718: Add fuzz.ml runners referencing Fuzz_*.suite instead of
calling Fuzz_*.run() directly; update dune files accordingly
- E725: Fix fuzz_paseto suite name from "crowbar" to "paseto"
- E600: Create .mli interfaces for test modules (test_firmware,
test_remoteproc, test_pbkdf2, test_paseto) with single-group suites
- E605: Add missing test files (test_skills, test_monitor, test_openamp,
test_xrpc_server) with proper module extraction from inline test.ml
- E415: Add pp pretty-printer to xrpc_server type t
- E405: Add doc comment for pp_sync_action in skills.mli
- E205: Replace Printf with Fmt in fuzz_paseto and gen_corpus
- E331: Rename make_key to key in fuzz_paseto
- clcw: fold fuzz_diff.ml into main fuzz runner, remove diff/ subdir
- openamp: inline fuzz_common.with_mock into fuzz_openamp.ml, delete
fuzz_common.ml
- E715: remove hardcoded fuzz_common exception
- E005: extract helpers to shorten long functions (discover_cmd, main_cmd, fuzz suites)
- E105: replace catch-all exception handlers with Eio.Exn.Io
- E320: shorten long identifiers in fuzz_cfdp and fuzz_meross
- E330: rename main_cmd to cmd
- E340: use err_cidr helper instead of Error (Fmt.str ...)
- E405: add missing docs for unbind_matter, is_meross_device, pp_info
- E616: use failf instead of fail (Fmt.str ...) in meross tests
- 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
Add (enabled_if (= %{profile} afl)), (source_tree corpus), and
gen_corpus.exe deps to all 25 fuzz directories
E722: Convert ocaml-crc (test ...) to (executable ...) with rules
E718: Add gen_corpus.ml to ocaml-crc/fuzz
E724: Rename (alias fuzz-afl) to (alias fuzz) in 12 fuzz directories
Add seed corpus generators with representative test data for:
ocaml-aos, ocaml-block, ocaml-bloom, ocaml-bpsec, ocaml-bundle,
ocaml-cfdp, ocaml-cgr, ocaml-clcw, ocaml-cookeio, ocaml-cpio
Update E718 rule and cram tests. Fix remaining E616 fail+Fmt.str
instances. Add gen_corpus.ml helpers for fuzz directories. Clean up
monopam import module.
E722: Convert (test ...) to (executable ...) in ocaml-aos, ocaml-clcw
E724: Add (rule (alias runtest) ...) and (rule (alias fuzz-afl) ...)
to all fuzz directories: ocaml-ax25, ocaml-block, ocaml-bloom,
ocaml-bpsec, ocaml-bundle, ocaml-cbort, ocaml-cfdp, ocaml-cgr,
ocaml-cookeio, ocaml-cpio
- Restore accidentally deleted fuzz/fuzz_diff.ml
- Rename fuzz/diff/test.ml back to fuzz.ml for fuzz_ convention
- Add (modules fuzz_clcw) to parent dune to avoid conflicts
In fuzz/ directories, only fuzz.ml is a valid runner (not test.ml).
In test/ directories, only test.ml is a valid runner (not fuzz.ml).
- Walk ancestor directories to detect fuzz/ context (fixes fuzz/diff/)
- Accept both test.ml and fuzz.ml as valid runner names everywhere
- Single-file stanzas: suggest renaming to the runner
- Multi-file stanzas: check for library module name conflicts
- Remove "private library" suggestion (too heavy-handed)
- Move clcw fuzz_diff to fuzz/diff/test.ml
Move fuzz_diff from test/diff/ to fuzz/ alongside fuzz_clcw, merging
dune stanzas. Adds (modules) fields to disambiguate test executables.
Replace Printf.sprintf/printf with Fmt.str/pr across cbort, cfdp,
cgr, claudeio, clcw, conpool, cookeio, and cpio packages. Add fmt
library dependency to dune files where needed.
Rename CamelCase modules to Snake_case (StringSet → String_set,
PermissionState → Permission_state) and move clcw fuzz test from
test/diff/ to test/fuzz/ so the fuzz_ prefix is valid per E618.
Move Alcotest.run to test.ml, export suite from test_clcw.ml,
add test_clcw.mli interface.
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 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.
- Clear reserved bits (CCSDS bits 14-15, 23) during decode to match
the original implementation which zeros them per spec
- Update roundtrip tests to compare against masked input since reserved
bits are legitimately zeroed on encode
- Allow trailing single uppercase letter suffixes (e.g., _A, _B) in
merlint E310 snake_case validation for test names
Tests detection of library and test stanzas co-located in the same
non-test directory using explicit (modules ...) declarations.
Replace the 4 overlapping record codec APIs (slice-based, record-based,
decode_make, exception-based) with a single compositional Codec module
using Bunzli-style `record |+ field |> seal` combinators.
The Codec uses a GADT snoc-list to track field types through the |+
operator. At seal time, pattern-matching on the GADT applies all
constructor arguments at once (for up to 6 fields), achieving
zero-overhead decode (only the record itself is allocated) and
zero-allocation encode. For >6 fields, a chunked fallback applies
6 fields per step with ceil(n/6)-1 partial applications.
Also adds d3t codec wrappers for CLCW, Space Packet, and TM headers,
with benchmarks comparing against hand-written and original
implementations.
- License -> Licence
- color -> colour (in prose, not API/code)
- behavior -> behaviour
- analyze -> analyse
- organized -> organised
- Remove marketing buzzwords (leveraging)
- Remove emojis from prose
Convert all packages from:
(source (uri https://tangled.org/handle/repo))
to:
(source (tangled handle/repo))
This uses dune 3.21's native tangled support for cleaner source
declarations. Also removes redundant homepage/bug_reports fields
that are auto-generated from tangled sources.
Use proper git URL format: git+https://.../.git
New libraries for CCSDS (Consultative Committee for Space Data Systems)
protocols:
- ocaml-aos: AOS (Advanced Orbiting Systems) Transfer Frame (CCSDS 732.0-B-4)
- ocaml-clcw: CLCW (Communications Link Control Word) for COP-1
- ocaml-uslp: USLP (Unified Space Link Protocol) Transfer Frame
All use ocamlformat 0.28.1.
Standardize fuzz and test conventions across 30+ packages:
- E715/E718: Add fuzz.ml runners referencing Fuzz_*.suite instead of
calling Fuzz_*.run() directly; update dune files accordingly
- E725: Fix fuzz_paseto suite name from "crowbar" to "paseto"
- E600: Create .mli interfaces for test modules (test_firmware,
test_remoteproc, test_pbkdf2, test_paseto) with single-group suites
- E605: Add missing test files (test_skills, test_monitor, test_openamp,
test_xrpc_server) with proper module extraction from inline test.ml
- E415: Add pp pretty-printer to xrpc_server type t
- E405: Add doc comment for pp_sync_action in skills.mli
- E205: Replace Printf with Fmt in fuzz_paseto and gen_corpus
- E331: Rename make_key to key in fuzz_paseto
- E005: extract helpers to shorten long functions (discover_cmd, main_cmd, fuzz suites)
- E105: replace catch-all exception handlers with Eio.Exn.Io
- E320: shorten long identifiers in fuzz_cfdp and fuzz_meross
- E330: rename main_cmd to cmd
- E340: use err_cidr helper instead of Error (Fmt.str ...)
- E405: add missing docs for unbind_matter, is_meross_device, pp_info
- E616: use failf instead of fail (Fmt.str ...) in meross tests
- 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
- Walk ancestor directories to detect fuzz/ context (fixes fuzz/diff/)
- Accept both test.ml and fuzz.ml as valid runner names everywhere
- Single-file stanzas: suggest renaming to the runner
- Multi-file stanzas: check for library module name conflicts
- Remove "private library" suggestion (too heavy-handed)
- Move clcw fuzz_diff to fuzz/diff/test.ml
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 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.
- Clear reserved bits (CCSDS bits 14-15, 23) during decode to match
the original implementation which zeros them per spec
- Update roundtrip tests to compare against masked input since reserved
bits are legitimately zeroed on encode
- Allow trailing single uppercase letter suffixes (e.g., _A, _B) in
merlint E310 snake_case validation for test names
Replace the 4 overlapping record codec APIs (slice-based, record-based,
decode_make, exception-based) with a single compositional Codec module
using Bunzli-style `record |+ field |> seal` combinators.
The Codec uses a GADT snoc-list to track field types through the |+
operator. At seal time, pattern-matching on the GADT applies all
constructor arguments at once (for up to 6 fields), achieving
zero-overhead decode (only the record itself is allocated) and
zero-allocation encode. For >6 fields, a chunked fallback applies
6 fields per step with ceil(n/6)-1 partial applications.
Also adds d3t codec wrappers for CLCW, Space Packet, and TM headers,
with benchmarks comparing against hand-written and original
implementations.
New libraries for CCSDS (Consultative Committee for Space Data Systems)
protocols:
- ocaml-aos: AOS (Advanced Orbiting Systems) Transfer Frame (CCSDS 732.0-B-4)
- ocaml-clcw: CLCW (Communications Link Control Word) for COP-1
- ocaml-uslp: USLP (Unified Space Link Protocol) Transfer Frame
All use ocamlformat 0.28.1.