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
- Rename Log_store.create → v, Dtn_bridge.create → v (E332)
- Replace Printf.fprintf/sprintf with Fmt.str (E205)
- Add docs for Dtn_bridge.v, on_uplink, engine (E405)
- Create test_log_store.mli, test_dtn_bridge.ml/mli (E600/E605)
- Fix catch-all exception → Scanf.Scan_failure | Failure (E105)
- Extract parse_since, format_timestamp, print_entry, discover_partitions,
poll_new_lines, follow_logs, filter_entries, wait_for_partitions, run_logs,
run_space, binary_path_of_init, push_partition, resolve_kernels from long
functions (E001/E005/E010)
- Add type log_flags = { follow : bool; json : bool } for run_logs (E350)
- Add missing .ocamlformat to ocaml-linkedin and ocaml-qemu
- Lowercase test suite names in prune: Cache→cache, Locate→locate,
Module alias parsing, Warning.parse
- Fix space-block suite name: storage→space_block
- Fix space/test_build suite name: initramfs→build
The unix variant is not needed as a root dependency.
Add READMEs for: ocaml-fdir, ocaml-initramfs, ocaml-jailhouse,
ocaml-linkedin, ocaml-openamp, ocaml-pid1, ocaml-rpmsg, ocaml-sbom,
ocaml-slack, ocaml-vz, ocaml-zephyr, space, space-block, space-ground,
space-net, space-sim, space-test, space-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.
- E605: Split monolithic test_irmin.ml into 10 per-module test files
(test_hash, test_tree, test_backend, test_store, test_codec, test_link,
test_proof, test_commit, test_git_interop, test_subtree)
- E410: Fix doc arg count for any_algorithm, any_to_bytes, any_to_hex
- E415: Add Proof.pp pretty-printer
- Tidy irmin bin commands (cmd_checkout, cmd_import, cmd_info)
- Tidy irmin lib (backend, codec, link) and add irmin.mli
- Fix merlint E331 rule, dune fmt across space-dtn
- E340: Extract err_unexpected_message helper in tcpcl_adapter
- E105: Replace catch-all exception handlers with specific exceptions
(Eio.Io in tcpcl close, Invalid_argument/Failure in wire decoders)
- Refactor tcpcl_adapter recv_message into smaller functions
- dune fmt formatting fixes
- E332: rename make/create to v (cla, store, engine, daemon + callers)
- E405: add docs for pp_contact, pp_query, pp_response in admin.mli
- E410: fix doc style for cla.mli
- E415: add pp to engine and tcpcl_adapter (.ml + .mli)
- E505: create config.mli and daemon.mli
- E600: convert test suites to (name, tests) pairs, add .mli files
- E605: add test stubs for action, eid_pattern, predicate, temporal,
bundle_id, cla, tcpcl_adapter, daemon, ground (51 tests total)
Add Push module implementing the OCI Distribution push protocol (blob
upload via POST/PUT, manifest PUT) with WWW-Authenticate token
discovery for registry-agnostic auth. Wire into oci.ml/oci.mli API and
add `image push` CLI command. Add `space push` subcommand to push init
binaries as OCI artifacts from build config.
Adds the space-test package: a standalone E2E test runner that validates
the full SpaceOS pipeline (build, boot headless, verify IPC frames, clean
shutdown). Includes 17 unit tests for pure logic and adds the tool to the
Homebrew tap config.
Headless mode suppresses interactive output and skips the ground
dashboard, returning a machine-readable exit code (0 = clean, 1 = crash).
Timeout triggers automatic shutdown after N seconds. Both are needed
for space-test E2E harness and CI.
Wire the service config from build.yml through to pid1:
- Add Content entry type to initramfs for inline data
- Add merge_services, topo_sort_services, codegen_plan to Config
- Build generates per-partition Plan module (OCaml data structure)
and recompiles pid1 with services compiled in — no runtime parsing
- pid1 logs the static service plan on boot
Extract ground station into library and embed in space run:
- New space-ground library with Ground.start (no unix dep, uses eio+ptime)
- space run auto-starts the dashboard as a daemon fiber
- bin/main.ml is now a thin cmdliner wrapper
Also adds log_store for per-partition console log capture.
Config schema changes:
- Per-partition kernel override (build_partition.kernel : string option)
- Unified service type shared by build and run configs:
{ name; image; isolation; depends_on }
- artifacts.kernel → artifacts.kernels (assoc list)
- artifacts_of_build takes ~resolve_kernel instead of ~kernel
Build/run changes:
- Build.all resolves per-partition kernels with deduplication
- spawn_partition looks up kernel by partition name
- verify_artifacts checks per-partition kernel paths
- auto_build uses resolve_kernel, checks all kernel paths exist
- Removed legacy Run.vm; exposed Run.verify_artifacts
Tests: 10 cases (3 new: per-partition kernel, build services
with depends_on, run services with isolation + Auto default)
Route uplink frames through the full CCSDS/BPv7 protocol stack instead
of writing raw wire frames directly to the ground socket. A new
Dtn_bridge module wraps frames as CCSDS Space Packets, encapsulates
them in BPv7 bundles, and processes them through the DTN forwarding
engine before extracting the raw frame for ground delivery.
Also fix the sbom discover test that compared ref_ against the metadata
name instead of the actual kernel image reference.
Add dune alias rule to codesign the space binary with vz.entitlements,
required for macOS Virtualization.framework access.
Fix naming: sbom_source -> source, build_partition -> partition,
make_initramfs -> initramfs. Extract helpers to shorten sbom_cmd and
discover. Add type annotations for record field disambiguation.
Add OCI attestation extraction to SBOM pipeline: generate pulls SPDX
documents from in-toto attestation layers when a local OCI cache is
available, falling back to config metadata otherwise.
Fix Astring.String.is_prefix usage in test_intoto.
Rewrite space sbom to discover components from build config and
dune-project metadata. Output SPDX 2.3 JSON or human-readable text.
Rename internal APIs for clarity: Run.run -> start, Cross.find ->
resolve, Cross.find_p0 -> p0, cross_init_path -> linux_init_path,
build_initramfs -> make_initramfs.
Add in-toto predicate type annotation and Intoto module to ocaml-oci.
Add .mli interfaces, split tests into per-module files (13 tests),
incremental per-partition rebuild skipping up-to-date artifacts,
SIGINT/SIGTERM graceful VM shutdown, ground station reconnect loop,
enriched SBOM table, and homebrew entries for space + space-ground.
Split hardcoded two-partition layout into build.yml / run.yml configs,
mirroring Docker's build-time vs run-time separation. No config file
present falls back to built-in defaults (identical to previous behavior).
- Add space/lib/config.ml with split build/run types, Jsont codecs,
Yamlt loaders, defaults, and artifacts_of_build helper
- Add Cross.resolve_init dispatcher for config-driven init resolution
- Build.all now accepts Config.build, returns Config.artifacts
- Run.run now accepts Config.artifacts + Config.run
- CLI uses positional FILE arg per subcommand; --kernel/--output override
- Remove --init, --memory, --config flags (values come from YAML)
Embed a space-net switch inside `space run` so P1 can send telemetry
frames back to the ground station through a dedicated virtio-serial
channel. P1 sends a "boot:complete" TM frame (APID 0x030 -> 0x100)
after storage init, which the switch routes via uplink to ground_flow.
Reduce log spam in space-ground by only printing the "Waiting for ..."
message once instead of on every reconnect attempt. Add startup banner
with socket path and dashboard URL.
Update space CLI man pages to describe the two-terminal workflow
(space run + space-ground) and add a hint in run.ml pointing users to
the ground station dashboard.
Add chardev/channel/socket-serial support to ocaml-qemu so QEMU VMs
can expose virtio-serial IPC ports and redirect consoles to Unix
sockets. Update pid1 init to read IPC frames from P0 and store them
as events in the block device. Add Block.of_file ?sectors override
for Linux block devices that report st_size=0. Wire up space build
and run commands for the two-partition (P0 flight + P1 SpaceOS) demo
with Docker cross-compilation of both binaries.
Decouple the ground station from the VMM relay following Xen dom0
disaggregation principles. The VMM now creates server sockets for
P0 IPC, P1 IPC, and ground, with QEMU connecting as client. A new
space-ground package provides a standalone web dashboard that connects
to the ground socket and streams frames via SSE to a Tailwind CSS UI.
Also adds the space-sim P0 flight simulator package with diverse frame
types (TM, HEALTH, EVR, ERROR) to exercise the ground dashboard.
Init binary now opens the block device, validates the superblock, reads
all parameters, writes a boot event, and increments boot_count. Build
pipeline seeds initial params (boot_count=0, mode=nominal) into the
disk image.
Add Uniboot.Source module for resolving components (kernel, init) from
local files, directories, or OCI registries with XDG caching. Refactor
space build to use uniboot for GPT disk images instead of raw disk.
Update pid1 init to try /dev/vda1 (GPT partition) before /dev/vda.
- Update Space_block.create -> Space_block.v in build.ml
- Fix Docker executable path resolution for Eio.Process.run
- Fix opam file path for monorepo (./ocaml-pid1/pid1.opam)
- Add -p pid1 flag for package-scoped dune build
- Add error handling with helpful Docker daemon hint
Extract initramfs building into a standalone package with Dir, File, and
Tree entry types. Replaces duplicated cpio logic in space/lib/build.ml
and uniboot/lib/uniboot.ml.
Adds the `space` package with build/run/sbom subcommands:
- `space build`: assembles initramfs (cpio) + SpaceOS disk image
- `space run`: boots QEMU aarch64 VM with kernel + initramfs + virtio-blk
- `space sbom`: prints software bill of materials
Init binary (ocaml-pid1) is always built via Docker with Alpine/musl
for static linking, with --platform linux/arm64 on macOS for
cross-compilation.
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
- Rename Log_store.create → v, Dtn_bridge.create → v (E332)
- Replace Printf.fprintf/sprintf with Fmt.str (E205)
- Add docs for Dtn_bridge.v, on_uplink, engine (E405)
- Create test_log_store.mli, test_dtn_bridge.ml/mli (E600/E605)
- Fix catch-all exception → Scanf.Scan_failure | Failure (E105)
- Extract parse_since, format_timestamp, print_entry, discover_partitions,
poll_new_lines, follow_logs, filter_entries, wait_for_partitions, run_logs,
run_space, binary_path_of_init, push_partition, resolve_kernels from long
functions (E001/E005/E010)
- Add type log_flags = { follow : bool; json : bool } for run_logs (E350)
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.
- E605: Split monolithic test_irmin.ml into 10 per-module test files
(test_hash, test_tree, test_backend, test_store, test_codec, test_link,
test_proof, test_commit, test_git_interop, test_subtree)
- E410: Fix doc arg count for any_algorithm, any_to_bytes, any_to_hex
- E415: Add Proof.pp pretty-printer
- Tidy irmin bin commands (cmd_checkout, cmd_import, cmd_info)
- Tidy irmin lib (backend, codec, link) and add irmin.mli
- Fix merlint E331 rule, dune fmt across space-dtn
- E332: rename make/create to v (cla, store, engine, daemon + callers)
- E405: add docs for pp_contact, pp_query, pp_response in admin.mli
- E410: fix doc style for cla.mli
- E415: add pp to engine and tcpcl_adapter (.ml + .mli)
- E505: create config.mli and daemon.mli
- E600: convert test suites to (name, tests) pairs, add .mli files
- E605: add test stubs for action, eid_pattern, predicate, temporal,
bundle_id, cla, tcpcl_adapter, daemon, ground (51 tests total)
Add Push module implementing the OCI Distribution push protocol (blob
upload via POST/PUT, manifest PUT) with WWW-Authenticate token
discovery for registry-agnostic auth. Wire into oci.ml/oci.mli API and
add `image push` CLI command. Add `space push` subcommand to push init
binaries as OCI artifacts from build config.
Wire the service config from build.yml through to pid1:
- Add Content entry type to initramfs for inline data
- Add merge_services, topo_sort_services, codegen_plan to Config
- Build generates per-partition Plan module (OCaml data structure)
and recompiles pid1 with services compiled in — no runtime parsing
- pid1 logs the static service plan on boot
Extract ground station into library and embed in space run:
- New space-ground library with Ground.start (no unix dep, uses eio+ptime)
- space run auto-starts the dashboard as a daemon fiber
- bin/main.ml is now a thin cmdliner wrapper
Also adds log_store for per-partition console log capture.
Config schema changes:
- Per-partition kernel override (build_partition.kernel : string option)
- Unified service type shared by build and run configs:
{ name; image; isolation; depends_on }
- artifacts.kernel → artifacts.kernels (assoc list)
- artifacts_of_build takes ~resolve_kernel instead of ~kernel
Build/run changes:
- Build.all resolves per-partition kernels with deduplication
- spawn_partition looks up kernel by partition name
- verify_artifacts checks per-partition kernel paths
- auto_build uses resolve_kernel, checks all kernel paths exist
- Removed legacy Run.vm; exposed Run.verify_artifacts
Tests: 10 cases (3 new: per-partition kernel, build services
with depends_on, run services with isolation + Auto default)
Route uplink frames through the full CCSDS/BPv7 protocol stack instead
of writing raw wire frames directly to the ground socket. A new
Dtn_bridge module wraps frames as CCSDS Space Packets, encapsulates
them in BPv7 bundles, and processes them through the DTN forwarding
engine before extracting the raw frame for ground delivery.
Also fix the sbom discover test that compared ref_ against the metadata
name instead of the actual kernel image reference.
Fix naming: sbom_source -> source, build_partition -> partition,
make_initramfs -> initramfs. Extract helpers to shorten sbom_cmd and
discover. Add type annotations for record field disambiguation.
Add OCI attestation extraction to SBOM pipeline: generate pulls SPDX
documents from in-toto attestation layers when a local OCI cache is
available, falling back to config metadata otherwise.
Fix Astring.String.is_prefix usage in test_intoto.
Rewrite space sbom to discover components from build config and
dune-project metadata. Output SPDX 2.3 JSON or human-readable text.
Rename internal APIs for clarity: Run.run -> start, Cross.find ->
resolve, Cross.find_p0 -> p0, cross_init_path -> linux_init_path,
build_initramfs -> make_initramfs.
Add in-toto predicate type annotation and Intoto module to ocaml-oci.
Split hardcoded two-partition layout into build.yml / run.yml configs,
mirroring Docker's build-time vs run-time separation. No config file
present falls back to built-in defaults (identical to previous behavior).
- Add space/lib/config.ml with split build/run types, Jsont codecs,
Yamlt loaders, defaults, and artifacts_of_build helper
- Add Cross.resolve_init dispatcher for config-driven init resolution
- Build.all now accepts Config.build, returns Config.artifacts
- Run.run now accepts Config.artifacts + Config.run
- CLI uses positional FILE arg per subcommand; --kernel/--output override
- Remove --init, --memory, --config flags (values come from YAML)
Reduce log spam in space-ground by only printing the "Waiting for ..."
message once instead of on every reconnect attempt. Add startup banner
with socket path and dashboard URL.
Update space CLI man pages to describe the two-terminal workflow
(space run + space-ground) and add a hint in run.ml pointing users to
the ground station dashboard.
Add chardev/channel/socket-serial support to ocaml-qemu so QEMU VMs
can expose virtio-serial IPC ports and redirect consoles to Unix
sockets. Update pid1 init to read IPC frames from P0 and store them
as events in the block device. Add Block.of_file ?sectors override
for Linux block devices that report st_size=0. Wire up space build
and run commands for the two-partition (P0 flight + P1 SpaceOS) demo
with Docker cross-compilation of both binaries.
Decouple the ground station from the VMM relay following Xen dom0
disaggregation principles. The VMM now creates server sockets for
P0 IPC, P1 IPC, and ground, with QEMU connecting as client. A new
space-ground package provides a standalone web dashboard that connects
to the ground socket and streams frames via SSE to a Tailwind CSS UI.
Also adds the space-sim P0 flight simulator package with diverse frame
types (TM, HEALTH, EVR, ERROR) to exercise the ground dashboard.
Adds the `space` package with build/run/sbom subcommands:
- `space build`: assembles initramfs (cpio) + SpaceOS disk image
- `space run`: boots QEMU aarch64 VM with kernel + initramfs + virtio-blk
- `space sbom`: prints software bill of materials
Init binary (ocaml-pid1) is always built via Docker with Alpine/musl
for static linking, with --platform linux/arm64 on macOS for
cross-compilation.