commits
This reverts commit aec06451d4aeff9262c902a4a270756055e5689f.
Found via [prune clean]. The [type origin = Local | Opam] tag plus the
[origin] and [is_virtual_implementation] queries had no callers — neither
in production nor tests. Removing them cascaded into the [pkg_origin]
hashtable and the [register/registered] scaffolding inside [scan_pkg_dir]
that only existed to populate it.
E605 (Missing Test File) was flagging lib/index/monopam_info_index.ml.
Cover the public API by building an index over an empty temp directory
and asserting the package/library/module lookups all return empty.
monopam lint: the [(mdx ...)] stanza's own [(libraries ...)] field now
surfaces as test-scope library use, alongside the existing detection of
the [mdx] stanza itself. Without this, libraries that exist solely to
satisfy README mdx blocks were flagged as unused.
Then declare the freshly-required [:with-test] dependencies across the
packages whose mdx blocks pull in extra libraries (eio_main, fmt,
requests, nox-tls, nox-csv, nox-git, nox-http, cstruct, etc.).
Add the [(<lib> :with-test)] entries that the new monopam test-scope
lint check flagged as missing -- packages where a [test] stanza
referenced a library but the corresponding opam dep wasn't declared.
Local builds worked because dune sees the union of all deps;
[opam install --with-test] from a fresh switch would fail.
This batch:
- ca-certs add vlog (test/test.ml uses Vlog.setup_test); also
drop the stale [(nox-tls :with-test)] flagged as
unused.
- dupfind add alcotest (test runner).
- monopam add alcotest, astring, merge3 (used in test/).
- monopam-info add alcotest; drop the stale [(fmt :with-test)]
flagged as unused.
Each verified by [dune build] + [dune runtest] before moving on.
Remaining packages with [missing :with-test] reports follow in
subsequent batches; none of them are subtleties, just mechanical
sweeps of the ~40 packages whose tests reference libraries that
weren't declared with the right scope.
Per-package removal of opam runtime [depends] entries that
[monopam lint] flagged as unused -- packages declared as runtime deps
but referenced by no library [(libraries ...)] stanza in any of the
package's main lib/exec dune files (and not pulled in transitively
via META).
Verified each removal by running [dune build] (and [dune test] for
packages with a test suite) before moving on. No code changes -- only
dune-project [(depends ...)] lists.
Packages touched:
- ca-certs drop nox-crypto
- dupfind drop bos
- merlint drop nox-json (still pulled in via nox-opam.bytesrw)
- monopam drop bytesrw, requests
- monopam-info drop nox-loc, nox-sexp
- ocaml-agent drop nox-tty
- ocaml-atproto-oauth drop did-plc, did-web
- ocaml-auth drop nox-json
- ocaml-cam drop ptime
- ocaml-claude drop nox-loc
- ocaml-cop1 drop logs
- ocaml-did drop bytesrw
- ocaml-ewah drop bytesrw
- ocaml-freebox drop ipaddr
- ocaml-gauth drop base64, ptime
- ocaml-gdocs drop oauth
- ocaml-gsheets drop oauth
- ocaml-gslides drop oauth
- ocaml-hap drop nox-crypto-rng
- ocaml-jailhouse drop fmt
Generated [.opam] files updated by dune accordingly.
Remaining unused warnings ([ocaml-jwt], [ocaml-meross], [ocaml-oci],
[ocaml-pid1], [ocaml-publicsuffix], [ocaml-punycode], [ocaml-pus],
[ocaml-qemu], [ocaml-rego], [ocaml-requests], [ocaml-sbom],
[ocaml-scc], [ocaml-sdls], [ocaml-sigstore], [ocaml-sle],
[ocaml-spacedata], [ocaml-stix], [ocaml-vz], [prune], plus the
[ocaml-ccsds] meta-package and a handful of others) will follow in a
later pass once each is verified against its tests; this commit
covers only the ones I built and tested in this session.
New package [nox-xdg], replacing the prior split between dune's
internal [xdg] library (META description: "[Internal] XDG base
directories specification implementation") and the standalone
[nox-xdge] Eio wrapper.
The fork was driven by two needs:
- dune's [xdg] is marked [Internal] in its META; dune doesn't promise
to keep it stable across releases. Building credential-handling
CLIs ([gdocs], [gsheets], [gslides], [gauth.Local_store]) on top of
a build-tool internal is a stability risk.
- The split layout had [nox-xdge] (Eio wrapper) depending on dune's
[xdg] (pure spec) by their shared library name [xdg], blocking any
attempt to give the wrapper a cleaner name.
Merging into one package solves both. The package provides two
libraries from one [ocaml-xdg/] source tree:
- [nox-xdg] (module [Xdg]) -- pure spec, no Eio dep.
lib/xdg.ml + xdg_stubs.c
- [nox-xdg.eio] (module [Xdg_eio]) -- Eio backend on top of the
resolver. lib/xdg_eio.ml
The pure spec is a Unix+Windows-faithful fork of dune's
[otherlibs/xdg/xdg.ml] and [xdg_stubs.c]. Original code by Jane
Street (MIT); LICENSE.md keeps both copyright lines. The C symbol
[dune_xdg__get_known_folder_path] is renamed to
[nox_xdg__get_known_folder_path] so a downstream binary that links
both this package and dune's internal xdg doesn't hit duplicate
symbols.
One small divergence from upstream: the [make] helper in xdg.ml
defers calling the C stub until the env-var override misses, instead
of computing it eagerly. Identical behaviour on Windows; lets the
test suite exercise the [~win32:true] code path from a non-Windows
host as long as every XDG_*_HOME is set. Documented inline.
Tests:
- [test/test_xdg.ml] (22 cases) -- spec-anchored: every default,
every env-var override, relative/empty/missing values per §4,
HOME interpretation, snapshot semantics at create-time, and the
full Windows extension.
- [test/eio/test_xdg_eio.ml] (5 cases) -- carried over from the old
xdge package, now driving the [Xdg_eio] module.
- [test/eio/cram/] -- the old xdge cram tests, against the renamed
module.
The previous [xdge/] subtree is removed; its [nox-xdge.opam] is
gone. Consumer migration (gauth, gdocs, gsheets, gslides, requests,
cookie, agent, atp, slack, linkedin, oci, uniboot, monopam) lands
in the next commit.
Also fixes an unrelated build break in [monopam-info/lib/index]: the
[Dune.Package.Library.codec] API was removed from [nox-dune] in
favour of the higher-level [Dune.Package.libraries] decoder; switch
to the new entry point and drop the now-unused [nox-sexp] dep.
The dead-lib detection in monopam read dune-package files inline,
duplicating ad-hoc Sexp pattern matching that already had a typed
codec in nox-sexp.codecs.dune.Dune_package. Move that logic into a
new sublib monopam-info.index, which:
- builds the (library -> exposed modules) index from
_opam/lib/<pkg>/dune-package (preferred) and a *.cmi-listing
fallback for packages without dune-package metadata;
- tracks which libraries implement a virtual library so callers can
whitelist them as link-time live.
monopam.lint now consumes the typed Monopam_info_index API instead of
peeking at Sexp values, and monopam-info gains eio/fpath/nox-loc/nox-sexp
deps.
The READMEs all share the standard install/overlay snippet, but the
sh blocks lacked the "<!-- $MDX skip -->" directive. `dune test`
would shell out to `opam install` against the live switch, which
either prompts interactively or fails with a package conflict —
either way diffing as a test failure.
Bulk-add skip directives in front of every install/overlay block.
Also collapse the doubled "non-deterministic + skip" stack on three
READMEs (memtrace, ocaml-dpop, ocaml-pid1, ocaml-yaml, merlint) where
`skip` already implies the runtime is bypassed.
38 subtrees lacked a (source ...) stanza in their dune-project, so
their generated .opam files had no dev-repo: field. That broke
downstream tooling that uses dev-repo to identify the subtree
(notably the root.opam external-dep filter, which couldn't tell
internal packages from external ones).
Add (source (tangled gazagnaire.org/<subtree>)) to each, matching
the URL configured in sources.toml. dune regenerates dev-repo:,
homepage: and bug-reports: in every affected .opam.
Pure formatting changes from `dune fmt`: doc comment placement moves
from above the binding to below it for `type`s, multi-line `match`
expressions collapse onto one line where they fit, and infix operator
applications pick up spaces (`Soup.($?)` -> `Soup.( $? )`). No
semantic changes.
Warning 69 (unused-field, mutable-never-assigned). Four independent
record fields were flagged as mutable but the code only mutates their
referents in place, never rebinds the record slot itself:
- ocaml-wal/lib/wal.ml: [t.file] (the Eio file resource; methods call
Eio.File.pwrite_all etc., the slot is set once at open time).
- ocaml-block/lib/block.ml: [Memory.state.data] (the backing bytes,
written via Bytes.blit_string; [Bytes.t] is already mutable).
- ocaml-sse/lib/sse.ml: [Parser.t.data_buf] (a Buffer.t, written via
Buffer.add_*; the slot never changes).
- ocaml-zephyr/lib/zephyr.ml: drop [mode : Read | Write] entirely —
set at open-time, read nowhere. The open_read / open_write
constructors already distinguish the two call shapes, so mode
tracking was redundant.
Previously the eight git-x subcommands sat flat at top level (split,
check, fix, verify, filter-paths, split-commit, drop-commit, reword),
with 'split' ambiguous between the subtree split and the per-directory
commit split.
Regrouped into two namespaces that mirror the object they act on:
git-x tree
split (was: git-x split)
add (new — inject a standalone history under a prefix)
drop (was: git-x filter-paths)
check (was: git-x check)
fix (was: git-x fix)
verify (was: git-x verify)
git-x commit
split (was: git-x split-commit)
drop (was: git-x drop-commit)
reword (was: git-x reword)
Each subcommand lives in cmd_<group>_<verb>.{ml,mli}; cmd_tree.ml and
cmd_commit.ml are the Cmd.group wrappers. git_x.ml registers just the
two groups.
'tree add' is a thin wrapper over Git.Subtree.add, which already
existed in the library but had no CLI exposure. It accepts a ref (e.g.
FETCH_HEAD after 'git fetch URL REF') and a --prefix, then builds a
subtree-merge commit with the current user's git config identity.
Log source names are updated to match (git-x.tree.split,
git-x.tree.fix). The cram test under test/cram/tree_split.t is
updated to use the new 'git-x tree split' invocation throughout.
Moves package metadata into dune-project for kdf, monopam-info,
ocaml-ax25, ocaml-collision, ocaml-crypto (4 subpackages), ocaml-csv,
ocaml-respond, ocaml-sdnv, ocaml-tls (2 subpackages), ocaml-vec3, and
ocaml-x509, and flags each .opam with the generated-by-dune header.
Running dune build after the ocaml-toml build break is resolved will
regenerate the .opam files from dune-project and reveal any
canonical-form drift in a separate commit.
Drops the "t" suffix and follows the value/codec/toml/core pattern
(jsont.json_base style). The internal raw TOML module moves from
[Toml] to [Value] (file: lib/value.ml, was lib/toml.ml) to make room
for the top-level Toml facade (file: lib/toml.ml, was lib/tomlt.ml).
External callers now reach the raw AST through [Toml.Value.X] instead
of [Tomlt.Toml.X]. Every downstream reference updated in lockstep.
Generate .opam.template files with x-quality-* fields based on
detected package features:
- x-quality-build: has lib/ with .ml files
- x-quality-test: has test/ with .ml files
- x-quality-fuzz: has fuzz/ with .ml files
- x-quality-interop: has test/interop/ directory
- x-quality-cram: has test/*.t/ directories
These fields are picked up by dune's opam generation and will be
checked by merlint E910 for consistency.
Also: add fmt dep to ocaml-sse/lib/dune (Fmt.pf used without dep).
monopam (399 tests, 0.26s):
- Pure modules: opam_transform, mono_lock, changes, changes_aggregated,
import, forks, cross_status, doctor, diff, fork_join, verse
- I/O modules: ctx, git_cli, opam_repo, feature, progress helpers
ocaml-claudeio (246 tests, 0.03s):
- Codec roundtrips: model, tool_input, err, permissions, control,
sdk_control, structured_output, content_block, message, incoming
- Builder patterns: options (17 with_* builders), hooks (4 event types)
- Pure helpers: handler dispatch, mcp_server, server_info, response
ocaml-tls (91 new tests, 0.05s):
- RFC 8446 test vectors: TLS 1.3 key schedule (early/handshake/master
secrets, traffic keys, finished keys, HKDF-Expand-Label)
- RFC 5246: TLS 1.2 PRF output length, label sensitivity, finished
computation (12 bytes per Section 7.4.9)
- Ciphersuite params: key/nonce lengths, hash mappings, forward secrecy
- Handshake validation: client_hello construction, server_hello_valid,
extension checks, ALPN negotiation, signature algorithm filtering
- Utils: List_set operations, sub_equal, init_and_last, first_match
E410: Fix documentation style in 14 .mli files — add [name args] format,
correct function names (create→v, scrypt_kdf→scrypt), fix arg counts
for tuple params and pp functions, add trailing periods.
E400/E600: Add per-module log sources (ca-certs), restructure kdf and
monopam tests to use suite convention with proper .mli files, add
missing .mli files for monopam command modules.
Extract helpers in irmin/lib/git_interop.ml (E005), add module and value
docs (E400/E405), flatten test suites to single tuples (E600), add missing
test files and .mli exports (E605), fix Fpath type in e610.ml.
- Rename directory: ocaml-build-info -> monopam-info
- Rename module: Mono_info -> Monopam_info
- Rename package: ocaml-build-info -> monopam-info
- Update all consumers to use new module name
- Remove "Skipping pull" log noise from push output
Found via [prune clean]. The [type origin = Local | Opam] tag plus the
[origin] and [is_virtual_implementation] queries had no callers — neither
in production nor tests. Removing them cascaded into the [pkg_origin]
hashtable and the [register/registered] scaffolding inside [scan_pkg_dir]
that only existed to populate it.
monopam lint: the [(mdx ...)] stanza's own [(libraries ...)] field now
surfaces as test-scope library use, alongside the existing detection of
the [mdx] stanza itself. Without this, libraries that exist solely to
satisfy README mdx blocks were flagged as unused.
Then declare the freshly-required [:with-test] dependencies across the
packages whose mdx blocks pull in extra libraries (eio_main, fmt,
requests, nox-tls, nox-csv, nox-git, nox-http, cstruct, etc.).
Add the [(<lib> :with-test)] entries that the new monopam test-scope
lint check flagged as missing -- packages where a [test] stanza
referenced a library but the corresponding opam dep wasn't declared.
Local builds worked because dune sees the union of all deps;
[opam install --with-test] from a fresh switch would fail.
This batch:
- ca-certs add vlog (test/test.ml uses Vlog.setup_test); also
drop the stale [(nox-tls :with-test)] flagged as
unused.
- dupfind add alcotest (test runner).
- monopam add alcotest, astring, merge3 (used in test/).
- monopam-info add alcotest; drop the stale [(fmt :with-test)]
flagged as unused.
Each verified by [dune build] + [dune runtest] before moving on.
Remaining packages with [missing :with-test] reports follow in
subsequent batches; none of them are subtleties, just mechanical
sweeps of the ~40 packages whose tests reference libraries that
weren't declared with the right scope.
Per-package removal of opam runtime [depends] entries that
[monopam lint] flagged as unused -- packages declared as runtime deps
but referenced by no library [(libraries ...)] stanza in any of the
package's main lib/exec dune files (and not pulled in transitively
via META).
Verified each removal by running [dune build] (and [dune test] for
packages with a test suite) before moving on. No code changes -- only
dune-project [(depends ...)] lists.
Packages touched:
- ca-certs drop nox-crypto
- dupfind drop bos
- merlint drop nox-json (still pulled in via nox-opam.bytesrw)
- monopam drop bytesrw, requests
- monopam-info drop nox-loc, nox-sexp
- ocaml-agent drop nox-tty
- ocaml-atproto-oauth drop did-plc, did-web
- ocaml-auth drop nox-json
- ocaml-cam drop ptime
- ocaml-claude drop nox-loc
- ocaml-cop1 drop logs
- ocaml-did drop bytesrw
- ocaml-ewah drop bytesrw
- ocaml-freebox drop ipaddr
- ocaml-gauth drop base64, ptime
- ocaml-gdocs drop oauth
- ocaml-gsheets drop oauth
- ocaml-gslides drop oauth
- ocaml-hap drop nox-crypto-rng
- ocaml-jailhouse drop fmt
Generated [.opam] files updated by dune accordingly.
Remaining unused warnings ([ocaml-jwt], [ocaml-meross], [ocaml-oci],
[ocaml-pid1], [ocaml-publicsuffix], [ocaml-punycode], [ocaml-pus],
[ocaml-qemu], [ocaml-rego], [ocaml-requests], [ocaml-sbom],
[ocaml-scc], [ocaml-sdls], [ocaml-sigstore], [ocaml-sle],
[ocaml-spacedata], [ocaml-stix], [ocaml-vz], [prune], plus the
[ocaml-ccsds] meta-package and a handful of others) will follow in a
later pass once each is verified against its tests; this commit
covers only the ones I built and tested in this session.
New package [nox-xdg], replacing the prior split between dune's
internal [xdg] library (META description: "[Internal] XDG base
directories specification implementation") and the standalone
[nox-xdge] Eio wrapper.
The fork was driven by two needs:
- dune's [xdg] is marked [Internal] in its META; dune doesn't promise
to keep it stable across releases. Building credential-handling
CLIs ([gdocs], [gsheets], [gslides], [gauth.Local_store]) on top of
a build-tool internal is a stability risk.
- The split layout had [nox-xdge] (Eio wrapper) depending on dune's
[xdg] (pure spec) by their shared library name [xdg], blocking any
attempt to give the wrapper a cleaner name.
Merging into one package solves both. The package provides two
libraries from one [ocaml-xdg/] source tree:
- [nox-xdg] (module [Xdg]) -- pure spec, no Eio dep.
lib/xdg.ml + xdg_stubs.c
- [nox-xdg.eio] (module [Xdg_eio]) -- Eio backend on top of the
resolver. lib/xdg_eio.ml
The pure spec is a Unix+Windows-faithful fork of dune's
[otherlibs/xdg/xdg.ml] and [xdg_stubs.c]. Original code by Jane
Street (MIT); LICENSE.md keeps both copyright lines. The C symbol
[dune_xdg__get_known_folder_path] is renamed to
[nox_xdg__get_known_folder_path] so a downstream binary that links
both this package and dune's internal xdg doesn't hit duplicate
symbols.
One small divergence from upstream: the [make] helper in xdg.ml
defers calling the C stub until the env-var override misses, instead
of computing it eagerly. Identical behaviour on Windows; lets the
test suite exercise the [~win32:true] code path from a non-Windows
host as long as every XDG_*_HOME is set. Documented inline.
Tests:
- [test/test_xdg.ml] (22 cases) -- spec-anchored: every default,
every env-var override, relative/empty/missing values per §4,
HOME interpretation, snapshot semantics at create-time, and the
full Windows extension.
- [test/eio/test_xdg_eio.ml] (5 cases) -- carried over from the old
xdge package, now driving the [Xdg_eio] module.
- [test/eio/cram/] -- the old xdge cram tests, against the renamed
module.
The previous [xdge/] subtree is removed; its [nox-xdge.opam] is
gone. Consumer migration (gauth, gdocs, gsheets, gslides, requests,
cookie, agent, atp, slack, linkedin, oci, uniboot, monopam) lands
in the next commit.
Also fixes an unrelated build break in [monopam-info/lib/index]: the
[Dune.Package.Library.codec] API was removed from [nox-dune] in
favour of the higher-level [Dune.Package.libraries] decoder; switch
to the new entry point and drop the now-unused [nox-sexp] dep.
The dead-lib detection in monopam read dune-package files inline,
duplicating ad-hoc Sexp pattern matching that already had a typed
codec in nox-sexp.codecs.dune.Dune_package. Move that logic into a
new sublib monopam-info.index, which:
- builds the (library -> exposed modules) index from
_opam/lib/<pkg>/dune-package (preferred) and a *.cmi-listing
fallback for packages without dune-package metadata;
- tracks which libraries implement a virtual library so callers can
whitelist them as link-time live.
monopam.lint now consumes the typed Monopam_info_index API instead of
peeking at Sexp values, and monopam-info gains eio/fpath/nox-loc/nox-sexp
deps.
The READMEs all share the standard install/overlay snippet, but the
sh blocks lacked the "<!-- $MDX skip -->" directive. `dune test`
would shell out to `opam install` against the live switch, which
either prompts interactively or fails with a package conflict —
either way diffing as a test failure.
Bulk-add skip directives in front of every install/overlay block.
Also collapse the doubled "non-deterministic + skip" stack on three
READMEs (memtrace, ocaml-dpop, ocaml-pid1, ocaml-yaml, merlint) where
`skip` already implies the runtime is bypassed.
38 subtrees lacked a (source ...) stanza in their dune-project, so
their generated .opam files had no dev-repo: field. That broke
downstream tooling that uses dev-repo to identify the subtree
(notably the root.opam external-dep filter, which couldn't tell
internal packages from external ones).
Add (source (tangled gazagnaire.org/<subtree>)) to each, matching
the URL configured in sources.toml. dune regenerates dev-repo:,
homepage: and bug-reports: in every affected .opam.
Warning 69 (unused-field, mutable-never-assigned). Four independent
record fields were flagged as mutable but the code only mutates their
referents in place, never rebinds the record slot itself:
- ocaml-wal/lib/wal.ml: [t.file] (the Eio file resource; methods call
Eio.File.pwrite_all etc., the slot is set once at open time).
- ocaml-block/lib/block.ml: [Memory.state.data] (the backing bytes,
written via Bytes.blit_string; [Bytes.t] is already mutable).
- ocaml-sse/lib/sse.ml: [Parser.t.data_buf] (a Buffer.t, written via
Buffer.add_*; the slot never changes).
- ocaml-zephyr/lib/zephyr.ml: drop [mode : Read | Write] entirely —
set at open-time, read nowhere. The open_read / open_write
constructors already distinguish the two call shapes, so mode
tracking was redundant.
Previously the eight git-x subcommands sat flat at top level (split,
check, fix, verify, filter-paths, split-commit, drop-commit, reword),
with 'split' ambiguous between the subtree split and the per-directory
commit split.
Regrouped into two namespaces that mirror the object they act on:
git-x tree
split (was: git-x split)
add (new — inject a standalone history under a prefix)
drop (was: git-x filter-paths)
check (was: git-x check)
fix (was: git-x fix)
verify (was: git-x verify)
git-x commit
split (was: git-x split-commit)
drop (was: git-x drop-commit)
reword (was: git-x reword)
Each subcommand lives in cmd_<group>_<verb>.{ml,mli}; cmd_tree.ml and
cmd_commit.ml are the Cmd.group wrappers. git_x.ml registers just the
two groups.
'tree add' is a thin wrapper over Git.Subtree.add, which already
existed in the library but had no CLI exposure. It accepts a ref (e.g.
FETCH_HEAD after 'git fetch URL REF') and a --prefix, then builds a
subtree-merge commit with the current user's git config identity.
Log source names are updated to match (git-x.tree.split,
git-x.tree.fix). The cram test under test/cram/tree_split.t is
updated to use the new 'git-x tree split' invocation throughout.
Moves package metadata into dune-project for kdf, monopam-info,
ocaml-ax25, ocaml-collision, ocaml-crypto (4 subpackages), ocaml-csv,
ocaml-respond, ocaml-sdnv, ocaml-tls (2 subpackages), ocaml-vec3, and
ocaml-x509, and flags each .opam with the generated-by-dune header.
Running dune build after the ocaml-toml build break is resolved will
regenerate the .opam files from dune-project and reveal any
canonical-form drift in a separate commit.
Drops the "t" suffix and follows the value/codec/toml/core pattern
(jsont.json_base style). The internal raw TOML module moves from
[Toml] to [Value] (file: lib/value.ml, was lib/toml.ml) to make room
for the top-level Toml facade (file: lib/toml.ml, was lib/tomlt.ml).
External callers now reach the raw AST through [Toml.Value.X] instead
of [Tomlt.Toml.X]. Every downstream reference updated in lockstep.
Generate .opam.template files with x-quality-* fields based on
detected package features:
- x-quality-build: has lib/ with .ml files
- x-quality-test: has test/ with .ml files
- x-quality-fuzz: has fuzz/ with .ml files
- x-quality-interop: has test/interop/ directory
- x-quality-cram: has test/*.t/ directories
These fields are picked up by dune's opam generation and will be
checked by merlint E910 for consistency.
Also: add fmt dep to ocaml-sse/lib/dune (Fmt.pf used without dep).
monopam (399 tests, 0.26s):
- Pure modules: opam_transform, mono_lock, changes, changes_aggregated,
import, forks, cross_status, doctor, diff, fork_join, verse
- I/O modules: ctx, git_cli, opam_repo, feature, progress helpers
ocaml-claudeio (246 tests, 0.03s):
- Codec roundtrips: model, tool_input, err, permissions, control,
sdk_control, structured_output, content_block, message, incoming
- Builder patterns: options (17 with_* builders), hooks (4 event types)
- Pure helpers: handler dispatch, mcp_server, server_info, response
ocaml-tls (91 new tests, 0.05s):
- RFC 8446 test vectors: TLS 1.3 key schedule (early/handshake/master
secrets, traffic keys, finished keys, HKDF-Expand-Label)
- RFC 5246: TLS 1.2 PRF output length, label sensitivity, finished
computation (12 bytes per Section 7.4.9)
- Ciphersuite params: key/nonce lengths, hash mappings, forward secrecy
- Handshake validation: client_hello construction, server_hello_valid,
extension checks, ALPN negotiation, signature algorithm filtering
- Utils: List_set operations, sub_equal, init_and_last, first_match
E410: Fix documentation style in 14 .mli files — add [name args] format,
correct function names (create→v, scrypt_kdf→scrypt), fix arg counts
for tuple params and pp functions, add trailing periods.
E400/E600: Add per-module log sources (ca-certs), restructure kdf and
monopam tests to use suite convention with proper .mli files, add
missing .mli files for monopam command modules.