Organisationsocurrentocaml-docs-ci19a447 ()(lint-fmt)

(lint-fmt)

Logs

Show full logs
2026-01-24 21:03.52: New job: test ocurrent/ocaml-docs-ci https://github.com/ocurrent/ocaml-docs-ci.git#refs/heads/staging (19a4476677e158208ff76f4ae1983549b3dd3160) (linux-x86_64:(lint-fmt))
Base: ocaml/opam:debian-13-ocaml-4.08@sha256:7cdc2a1943ac1462f548be7816c6d02f14e605659f225027208abe04795ea500
ocamlformat version: version 0.27.0 (from opam)

To reproduce locally:

git clone --recursive "https://github.com/ocurrent/ocaml-docs-ci.git" -b "staging" && cd "ocaml-docs-ci" && git reset --hard 19a44766
cat > Dockerfile <<'END-OF-DOCKERFILE'
FROM ocaml/opam:debian-13-ocaml-4.08@sha256:7cdc2a1943ac1462f548be7816c6d02f14e605659f225027208abe04795ea500
USER 1000:1000
RUN cd ~/opam-repository && (git cat-file -e 873cb18c37b308713d11ad3894c4bb78d73fb3e7 || git fetch origin master) && git reset -q --hard 873cb18c37b308713d11ad3894c4bb78d73fb3e7 && git log --no-decorate -n1 --oneline && opam update -u
RUN opam depext -i dune
WORKDIR /src
RUN opam depext -i ocamlformat=0.27.0
COPY --chown=1000:1000 . /src/
RUN opam exec -- dune build @fmt --ignore-promoted-rules || (echo "dune build @fmt failed"; exit 2)

END-OF-DOCKERFILE
docker build .
END-REPRO-BLOCK

2026-01-24 21:03.52: Using cache hint "ocurrent/ocaml-docs-ci-ocaml/opam:debian-13-ocaml-4.08@sha256:7cdc2a1943ac1462f548be7816c6d02f14e605659f225027208abe04795ea500-debian-13-4.08_opam-2.5-ocamlformat-873cb18c37b308713d11ad3894c4bb78d73fb3e7"
2026-01-24 21:03.52: Using OBuilder spec:
((from ocaml/opam:debian-13-ocaml-4.08@sha256:7cdc2a1943ac1462f548be7816c6d02f14e605659f225027208abe04795ea500)
 (user (uid 1000) (gid 1000))
 (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
      (network host)
      (shell "cd ~/opam-repository && (git cat-file -e 873cb18c37b308713d11ad3894c4bb78d73fb3e7 || git fetch origin master) && git reset -q --hard 873cb18c37b308713d11ad3894c4bb78d73fb3e7 && git log --no-decorate -n1 --oneline && opam update -u"))
 (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
      (network host)
      (shell "opam depext -i dune"))
 (workdir /src)
 (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
      (network host)
      (shell "opam depext -i ocamlformat=0.27.0"))
 (copy (src .) (dst /src/))
 (run (shell "opam exec -- dune build @fmt --ignore-promoted-rules || (echo \"dune build @fmt failed\"; exit 2)"))
)

2026-01-24 21:03.52: Waiting for resource in pool OCluster
2026-01-24 21:03.52: Waiting for worker…
2026-01-24 21:03.54: Got resource from pool OCluster
Building on odawa.caelum.ci.dev
All commits already cached
HEAD is now at 19a4476 Update storage dockerfile

(from ocaml/opam:debian-13-ocaml-4.08@sha256:7cdc2a1943ac1462f548be7816c6d02f14e605659f225027208abe04795ea500)
2026-01-24 21:03.56 ---> using "4c1f60dc0cc5644c6a4c05cf3315bdbf9cc478b70e443b212a1220385bab8bba" from cache

/: (user (uid 1000) (gid 1000))

/: (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
        (network host)
        (shell "cd ~/opam-repository && (git cat-file -e 873cb18c37b308713d11ad3894c4bb78d73fb3e7 || git fetch origin master) && git reset -q --hard 873cb18c37b308713d11ad3894c4bb78d73fb3e7 && git log --no-decorate -n1 --oneline && opam update -u"))
From https://github.com/ocaml/opam-repository
 * branch                  master     -> FETCH_HEAD
   a6b2f19780..8e1b9a49e8  master     -> origin/master
873cb18c37 Merge pull request #29216 from shonfeder/release-dune-3.21.0

<><> Updating package repositories ><><><><><><><><><><><><><><><><><><><><><><>
[default] Initialised
default (at git+file:///home/opam/opam-repository): 
    [INFO] opam 2.1 and 2.2 include many performance and security improvements over 2.0; please consider upgrading (https://opam.ocaml.org/doc/Install.html)


Everything as up-to-date as possible (run with --verbose to show unavailable upgrades).
However, you may "opam upgrade" these packages explicitly, which will ask permission to downgrade or uninstall the conflicting packages.
Nothing to do.
# Run eval $(opam env) to update the current shell environment
2026-01-24 21:03.56 ---> using "72a7cd495abee3d0659c15140c96fff42d035222fc9b794ad453f1a5292cd6f1" from cache

/: (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
        (network host)
        (shell "opam depext -i dune"))
# Detecting depexts using vars: arch=x86_64, os=linux, os-distribution=debian, os-family=debian
# No extra OS packages requirements found.
# All required OS packages found.
# Now letting opam install the packages
The following actions will be performed:
  - install dune 3.21.0

<><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
[dune.3.21.0] found in cache

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> installed dune.3.21.0
Done.
# Run eval $(opam env) to update the current shell environment
2026-01-24 21:03.56 ---> using "3b5aee51bb4636e6dab95deb6944478b896d0b06f021712424b773f7d70073ac" from cache

/: (workdir /src)

/src: (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
           (network host)
           (shell "opam depext -i ocamlformat=0.27.0"))
# Detecting depexts using vars: arch=x86_64, os=linux, os-distribution=debian, os-family=debian
# No extra OS packages requirements found.
# All required OS packages found.
# Now letting opam install the packages
The following actions will be performed:
  - install sexplib0          v0.14.0  [required by base]
  - install ocamlbuild        0.16.1   [required by fpath, astring, uuseg]
  - install cmdliner          1.3.0    [required by ocamlformat]
  - install either            1.0.0    [required by ocamlformat-lib]
  - install menhirLib         20250912 [required by ocamlformat-lib]
  - install csexp             1.5.2    [required by ocamlformat]
  - install dune-build-info   3.21.0   [required by ocamlformat-lib]
  - install camlp-streams     5.0.1    [required by ocamlformat-lib]
  - install seq               base     [required by re]
  - install menhirSdk         20250912 [required by ocamlformat-lib]
  - install fix               20250919 [required by ocamlformat-lib]
  - install menhirCST         20250912 [required by menhir]
  - install ocamlfind         1.9.8    [required by ocp-indent, astring, fpath, uuseg]
  - install ocaml-version     4.0.3    [required by ocamlformat-lib]
  - install dune-configurator 3.21.0   [required by base]
  - install re                1.11.0   [required by ocamlformat]
  - install menhir            20250912 [required by ocamlformat-lib]
  - install topkg             1.1.1    [required by fpath, astring, uuseg]
  - install ocp-indent        1.9.0    [required by ocamlformat-lib]
  - install base              v0.14.3  [required by ocamlformat-lib]
  - install uutf              1.0.4    [required by ocamlformat-lib]
  - install astring           0.8.5    [required by ocamlformat-lib]
  - install stdio             v0.14.0  [required by ocamlformat-lib]
  - install uucp              15.0.0   [required by uuseg]
  - install fpath             0.7.3    [required by ocamlformat-lib]
  - install uuseg             15.0.0   [required by ocamlformat-lib]
  - install ocamlformat-lib   0.27.0   [required by ocamlformat]
  - install ocamlformat       0.27.0
===== 28 to install =====

<><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
[astring.0.8.5] found in cache
[base.v0.14.3] found in cache
[camlp-streams.5.0.1] found in cache
[cmdliner.1.3.0] found in cache
[csexp.1.5.2] found in cache
[dune-build-info.3.21.0] found in cache
[dune-configurator.3.21.0] found in cache
[either.1.0.0] found in cache
[fix.20250919] found in cache
[fpath.0.7.3] found in cache
[menhir.20250912] found in cache
[menhirCST.20250912] found in cache
[menhirLib.20250912] found in cache
[menhirSdk.20250912] found in cache
[ocaml-version.4.0.3] found in cache
[ocamlbuild.0.16.1] found in cache
[ocamlfind.1.9.8] found in cache
[ocamlformat.0.27.0] found in cache
[ocamlformat-lib.0.27.0] found in cache
[ocp-indent.1.9.0] found in cache
[re.1.11.0] found in cache
[sexplib0.v0.14.0] found in cache
[stdio.v0.14.0] found in cache
[topkg.1.1.1] found in cache
[uucp.15.0.0] found in cache
[uuseg.15.0.0] found in cache
[uutf.1.0.4] found in cache

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> installed seq.base
-> installed camlp-streams.5.0.1
-> installed cmdliner.1.3.0
-> installed csexp.1.5.2
-> installed either.1.0.0
-> installed fix.20250919
-> installed menhirCST.20250912
-> installed menhirLib.20250912
-> installed menhirSdk.20250912
-> installed ocaml-version.4.0.3
-> installed sexplib0.v0.14.0
-> installed re.1.11.0
-> installed dune-build-info.3.21.0
-> installed ocamlfind.1.9.8
-> installed dune-configurator.3.21.0
-> installed ocamlbuild.0.16.1
-> installed ocp-indent.1.9.0
-> installed base.v0.14.3
-> installed topkg.1.1.1
-> installed stdio.v0.14.0
-> installed menhir.20250912
-> installed uutf.1.0.4
-> installed astring.0.8.5
-> installed fpath.0.7.3
-> installed uucp.15.0.0
-> installed uuseg.15.0.0
-> installed ocamlformat-lib.0.27.0
-> installed ocamlformat.0.27.0
Done.

<><> ocp-indent.1.9.0 installed successfully ><><><><><><><><><><><><><><><><><>
=> This package requires additional configuration for use in editors. Install package 'user-setup', or manually:

   * for Emacs, add these lines to ~/.emacs:
     (add-to-list 'load-path "/home/opam/.opam/4.08/share/emacs/site-lisp")
     (require 'ocp-indent)

   * for Vim, add this line to ~/.vimrc:
     set rtp^="/home/opam/.opam/4.08/share/ocp-indent/vim"
# Run eval $(opam env) to update the current shell environment
2026-01-24 21:04.42 ---> saved as "2ae43ae662b95641fa2bf73d980051b9145f20314d85ad107c6a3257b77df4e6"

/src: (copy (src .) (dst /src/))
2026-01-24 21:04.42 ---> saved as "8a35a2c0b1d266f22f8e8a1b26f23002d5ec4b77b8ad3418a875bc97651beadc"

/src: (run (shell "opam exec -- dune build @fmt --ignore-promoted-rules || (echo \"dune build @fmt failed\"; exit 2)"))
File "src/solver/solver.mli", line 1, characters 0-0:
diff --git a/_build/default/src/solver/solver.mli b/_build/default/src/solver/.formatted/solver.mli
index 14734ad..a9f7034 100644
--- a/_build/default/src/solver/solver.mli
+++ b/_build/default/src/solver/.formatted/solver.mli
@@ -11,7 +11,8 @@ val test_fake : unit -> unit
 (** [test_fake ()] runs a test with fake packages, no git needed. *)
 
 val test_real : string -> unit
-(** [test_real repo_path] runs a test with the real opam-repository at [repo_path]. *)
+(** [test_real repo_path] runs a test with the real opam-repository at
+    [repo_path]. *)
 
 val main : Git_unix.Store.Hash.t -> unit
 (** [main hash] runs a worker process that reads requests from stdin and writes
File "src/solver/opam_repository.ml", line 1, characters 0-0:
diff --git a/_build/default/src/solver/opam_repository.ml b/_build/default/src/solver/.formatted/opam_repository.ml
index 05e9f3a..4492e3e 100644
--- a/_build/default/src/solver/opam_repository.ml
+++ b/_build/default/src/solver/.formatted/opam_repository.ml
@@ -21,7 +21,8 @@ let open_store_at path =
   Git_unix.Store.v ~dotgit fpath >|= function
   | Ok x -> x
   | Error e ->
-      Fmt.failwith "Failed to open opam-repository at %s: %a" path Store.pp_error e
+      Fmt.failwith "Failed to open opam-repository at %s: %a" path
+        Store.pp_error e
 
 let clone () =
   match Unix.lstat clone_path with
File "src/solver/main.ml", line 1, characters 0-0:
diff --git a/_build/default/src/solver/main.ml b/_build/default/src/solver/.formatted/main.ml
index d791ee1..fb6d7f5 100644
--- a/_build/default/src/solver/main.ml
+++ b/_build/default/src/solver/.formatted/main.ml
@@ -79,10 +79,8 @@ let () =
   | [| _prog; "test" |] ->
       Solver.test
         (Git_unix.Store.Hash.of_hex "ac01ad6037c0bdcca9f67fe49cd54475b585f9b2")
-  | [| _prog; "test-fake" |] ->
-      Solver.test_fake ()
-  | [| _prog; "test-real"; repo_path |] ->
-      Solver.test_real repo_path
+  | [| _prog; "test-fake" |] -> Solver.test_fake ()
+  | [| _prog; "test-real"; repo_path |] -> Solver.test_real repo_path
   | args ->
       Fmt.failwith "Usage: ocaml-ci-solver (got %a)"
         Fmt.(array (quote string))
File "src/solver/git_context.ml", line 1, characters 0-0:
diff --git a/_build/default/src/solver/git_context.ml b/_build/default/src/solver/.formatted/git_context.ml
index e805f22..728e10f 100644
--- a/_build/default/src/solver/git_context.ml
+++ b/_build/default/src/solver/.formatted/git_context.ml
@@ -160,6 +160,6 @@ let read_packages store commit =
                OpamPackage.Name.Map.empty)
 
 let create ?(test = OpamPackage.Name.Set.empty)
-    ?(pins = OpamPackage.Name.Map.empty) ?(doc = false)
-    ~constraints ~env ~packages () =
+    ?(pins = OpamPackage.Name.Map.empty) ?(doc = false) ~constraints ~env
+    ~packages () =
   { env; packages; pins; constraints; test; doc }
File "src/lib/config.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/config.ml b/_build/default/src/lib/.formatted/config.ml
index 0a45c63..ad17dcb 100644
--- a/_build/default/src/lib/config.ml
+++ b/_build/default/src/lib/.formatted/config.ml
@@ -3,7 +3,8 @@ open Cmdliner
 let random =
   In_channel.with_open_bin "/dev/urandom" (fun ch ->
       let str =
-        String.init 4 (fun _ -> In_channel.input_byte ch |> Option.get |> Char.chr)
+        String.init 4 (fun _ ->
+            In_channel.input_byte ch |> Option.get |> Char.chr)
       in
       Base64.encode_exn str)
 
File "src/lib/voodoo.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/voodoo.ml b/_build/default/src/lib/.formatted/voodoo.ml
index 7a32bcb..abf31f8 100644
--- a/_build/default/src/lib/voodoo.ml
+++ b/_build/default/src/lib/.formatted/voodoo.ml
@@ -58,10 +58,12 @@ module OdocDriver = struct
            @@ Misc.Cmd.list
                 [
                   "sudo apt-get update";
-                  Fmt.str "opam pin -ny sherlodoc.dev %s --with-version 3.1.0" sherlodoc_pin;
+                  Fmt.str "opam pin -ny sherlodoc.dev %s --with-version 3.1.0"
+                    sherlodoc_pin;
                   Fmt.str
-                    "opam pin -ny odoc-parser.dev --with-version 3.1.0 %s && opam pin -ny \
-                     odoc-md.dev %s --with-version 3.1.0 &&  opam pin -ny odoc.dev %s --with-version 3.1.0"
+                    "opam pin -ny odoc-parser.dev --with-version 3.1.0 %s && \
+                     opam pin -ny odoc-md.dev %s --with-version 3.1.0 &&  opam \
+                     pin -ny odoc.dev %s --with-version 3.1.0"
                     odoc_pin odoc_pin odoc_pin;
                   "opam install -y odoc-md";
                   "opam install -y odoc-driver sherlodoc";
File "src/lib/valid_packages.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/valid_packages.ml b/_build/default/src/lib/.formatted/valid_packages.ml
index e0fde28..bc555d9 100644
--- a/_build/default/src/lib/valid_packages.ml
+++ b/_build/default/src/lib/.formatted/valid_packages.ml
@@ -11,12 +11,15 @@ module Op = struct
 
   module Value = struct
     type t = Package.Set.t
+
     let digest v =
       let b = Buffer.create 1000000 in
-      Package.Set.elements v |> List.iter (fun p ->
-        Buffer.add_string b (Package.universe p |> Package.Universe.hash);
-        Buffer.add_string b (Package.opam p |> OpamPackage.name_to_string);
-        Buffer.add_string b (Package.opam p |> OpamPackage.version_to_string));
+      Package.Set.elements v
+      |> List.iter (fun p ->
+             Buffer.add_string b (Package.universe p |> Package.Universe.hash);
+             Buffer.add_string b (Package.opam p |> OpamPackage.name_to_string);
+             Buffer.add_string b
+               (Package.opam p |> OpamPackage.version_to_string));
       Digest.string (Buffer.contents b)
   end
 
File "src/lib/package.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/package.ml b/_build/default/src/lib/.formatted/package.ml
index 507c299..1d28214 100644
--- a/_build/default/src/lib/package.ml
+++ b/_build/default/src/lib/.formatted/package.ml
@@ -117,12 +117,15 @@ end = struct
     let memo = ref OpamPackage.Map.empty in
     let package_deps = OpamPackage.Map.of_list compile_deps in
     let rec obtain ~visiting package =
-      if OpamPackage.Set.mem package visiting then begin
+      if OpamPackage.Set.mem package visiting then (
         Printf.eprintf "CYCLE DETECTED: %s\n%!" (OpamPackage.to_string package);
         Printf.eprintf "  Visiting stack: %s\n%!"
-          (OpamPackage.Set.elements visiting |> List.map OpamPackage.to_string |> String.concat " -> ");
-        failwith (Printf.sprintf "Dependency cycle detected at %s" (OpamPackage.to_string package))
-      end;
+          (OpamPackage.Set.elements visiting
+          |> List.map OpamPackage.to_string
+          |> String.concat " -> ");
+        failwith
+          (Printf.sprintf "Dependency cycle detected at %s"
+             (OpamPackage.to_string package)));
       match OpamPackage.Map.find_opt package !memo with
       | Some package -> package
       | None ->
File "src/solver/solver.ml", line 1, characters 0-0:
diff --git a/_build/default/src/solver/solver.ml b/_build/default/src/solver/.formatted/solver.ml
index bc93853..f28e5ba 100644
--- a/_build/default/src/solver/solver.ml
+++ b/_build/default/src/solver/.formatted/solver.ml
@@ -13,8 +13,10 @@ let env (vars : Worker.Vars.t) =
 
 let get_names = OpamFormula.fold_left (fun a (name, _) -> name :: a) []
 
-let universes ?(post = false) ?(doc = false) ~packages (resolutions : OpamPackage.t list) =
-  Printf.eprintf "DEBUG universes: post=%b doc=%b resolutions=%d\n%!" post doc (List.length resolutions);
+let universes ?(post = false) ?(doc = false) ~packages
+    (resolutions : OpamPackage.t list) =
+  Printf.eprintf "DEBUG universes: post=%b doc=%b resolutions=%d\n%!" post doc
+    (List.length resolutions);
   let aux root =
     let name, version = (OpamPackage.name root, OpamPackage.version root) in
     let opamfile : OpamFile.OPAM.t =
@@ -23,15 +25,16 @@ let universes ?(post = false) ?(doc = false) ~packages (resolutions : OpamPackag
         |> OpamPackage.Name.Map.find name
         |> OpamPackage.Version.Map.find version
       with Not_found ->
-        Printf.eprintf "DEBUG: Package not found in packages map: %s\n%!" (OpamPackage.to_string root);
+        Printf.eprintf "DEBUG: Package not found in packages map: %s\n%!"
+          (OpamPackage.to_string root);
         raise Not_found
     in
     let deps =
       opamfile
       |> OpamFile.OPAM.depends
       |> OpamFilter.partial_filter_formula
-           (OpamFilter.deps_var_env ~build:true ~post ~test:false
-              ~doc ~dev_setup:false ~dev:false)
+           (OpamFilter.deps_var_env ~build:true ~post ~test:false ~doc
+              ~dev_setup:false ~dev:false)
       |> get_names
       |> OpamPackage.Name.Set.of_list
     in
@@ -39,8 +42,8 @@ let universes ?(post = false) ?(doc = false) ~packages (resolutions : OpamPackag
       opamfile
       |> OpamFile.OPAM.depopts
       |> OpamFilter.partial_filter_formula
-           (OpamFilter.deps_var_env ~build:true ~post ~test:false
-              ~doc ~dev_setup:false ~dev:false)
+           (OpamFilter.deps_var_env ~build:true ~post ~test:false ~doc
+              ~dev_setup:false ~dev:false)
       |> get_names
       |> OpamPackage.Name.Set.of_list
     in
@@ -113,11 +116,15 @@ let solve ~packages ~constraints ~root_pkgs (vars : Worker.Vars.t) =
          on odoc/documentation tools that create cycles (e.g., camlp-streams -> odoc -> odoc-parser -> camlp-streams) *)
       Printf.eprintf "DEBUG: Computing compile_universes...\n%!";
       let compile_universes = universes ~post:false ~doc:false ~packages pkgs in
-      Printf.eprintf "DEBUG: compile_universes done (%d entries)\n%!" (List.length compile_universes);
+      Printf.eprintf "DEBUG: compile_universes done (%d entries)\n%!"
+        (List.length compile_universes);
       (* link_universes: use extended packages, include all deps *)
       Printf.eprintf "DEBUG: Computing link_universes...\n%!";
-      let link_universes = universes ~post:true ~doc:true ~packages:extended pkgs in
-      Printf.eprintf "DEBUG: link_universes done (%d entries)\n%!" (List.length link_universes);
+      let link_universes =
+        universes ~post:true ~doc:true ~packages:extended pkgs
+      in
+      Printf.eprintf "DEBUG: link_universes done (%d entries)\n%!"
+        (List.length link_universes);
       let map_universes univs =
         List.map
           (fun (pkg, str, univ) ->
@@ -232,7 +239,8 @@ let main commit =
 (* Test with fake packages - no git needed *)
 let test_fake () =
   (* Helper to create a simple opam with unfiltered depends *)
-  let make_opam ?(depends = []) ?(doc_depends = []) ?(x_extra_doc_deps = []) () =
+  let make_opam ?(depends = []) ?(doc_depends = []) ?(x_extra_doc_deps = []) ()
+      =
     let empty = OpamFile.OPAM.empty in
     let mk_dep name =
       let name = OpamPackage.Name.of_string name in
@@ -245,7 +253,9 @@ let test_fake () =
       List.map
         (fun name ->
           let name = OpamPackage.Name.of_string name in
-          let filter = OpamTypes.FIdent ([], OpamVariable.of_string "with-doc", None) in
+          let filter =
+            OpamTypes.FIdent ([], OpamVariable.of_string "with-doc", None)
+          in
           OpamFormula.Atom (name, OpamFormula.Atom (OpamTypes.Filter filter)))
         doc_depends
       |> OpamFormula.ands
@@ -258,7 +268,10 @@ let test_fake () =
     if x_extra_doc_deps = [] then opam
     else
       let ext_value =
-        let deps_str = String.concat " & " (List.map (fun s -> "\"" ^ s ^ "\"") x_extra_doc_deps) in
+        let deps_str =
+          String.concat " & "
+            (List.map (fun s -> "\"" ^ s ^ "\"") x_extra_doc_deps)
+        in
         OpamParser.FullPos.value_from_string deps_str "<test>"
       in
       let extensions =
@@ -295,19 +308,18 @@ let test_fake () =
         ("base", "2.0", make_opam ());
         ("doc-helper", "1.0", make_opam ());
         ("extra-helper", "1.0", make_opam ());
-        ( "mylib", "1.0",
-          make_opam
-            ~depends:[ "base" ]
-            ~doc_depends:[ "doc-helper" ]
-            ~x_extra_doc_deps:[ "extra-helper" ]
-            () );
+        ( "mylib",
+          "1.0",
+          make_opam ~depends:[ "base" ] ~doc_depends:[ "doc-helper" ]
+            ~x_extra_doc_deps:[ "extra-helper" ] () );
       ]
   in
   let constraints = OpamPackage.Name.Map.empty in
   let root_pkgs = [ OpamPackage.Name.of_string "mylib" ] in
 
   Printf.printf "=== Testing two-phase solve with fake packages ===\n%!";
-  Printf.printf "Testing both {with-doc} filtered deps AND x-extra-doc-deps extension\n%!";
+  Printf.printf
+    "Testing both {with-doc} filtered deps AND x-extra-doc-deps extension\n%!";
 
   (* First solve: no doc deps *)
   let context =
@@ -318,7 +330,7 @@ let test_fake () =
   | Error e ->
       Printf.printf "First solve failed: %s\n" (Solver.diagnostics e);
       exit 1
-  | Ok sels ->
+  | Ok sels -> (
       let pkgs = Solver.packages_of_result sels in
       Printf.printf "\n[1] First solve (no with-doc deps):\n%!";
       List.iter (fun p -> Printf.printf "  %s\n" (OpamPackage.to_string p)) pkgs;
@@ -334,10 +346,13 @@ let test_fake () =
         List.exists (fun p -> OpamPackage.name_to_string p = "doc-helper") pkgs
       in
       let has_extra_helper =
-        List.exists (fun p -> OpamPackage.name_to_string p = "extra-helper") pkgs
+        List.exists
+          (fun p -> OpamPackage.name_to_string p = "extra-helper")
+          pkgs
       in
       if has_doc_helper || has_extra_helper then (
-        Printf.printf "FAILURE: First solve should not include doc/extra helpers\n%!";
+        Printf.printf
+          "FAILURE: First solve should not include doc/extra helpers\n%!";
         exit 1);
 
       (* Use extended packages (processes x-extra-doc-deps) *)
@@ -361,21 +376,23 @@ let test_fake () =
           ~constraints ~pins ~doc:true
       in
       let extended_result = Solver.solve extended_context root_pkgs in
-      (match extended_result with
+      match extended_result with
       | Error e ->
-          Printf.printf "Extended solve failed: %s\n%!"
-            (Solver.diagnostics e);
+          Printf.printf "Extended solve failed: %s\n%!" (Solver.diagnostics e);
           exit 1
       | Ok extended_sels ->
           let extended_pkgs = Solver.packages_of_result extended_sels in
-          Printf.printf "\n[2] Extended solve (doc=true, post=true, with pins):\n%!";
+          Printf.printf
+            "\n[2] Extended solve (doc=true, post=true, with pins):\n%!";
           List.iter
             (fun p -> Printf.printf "  %s\n" (OpamPackage.to_string p))
             extended_pkgs;
 
           (* Verify base version is still the same (pinned) *)
           let extended_base_pkg =
-            List.find (fun p -> OpamPackage.name_to_string p = "base") extended_pkgs
+            List.find
+              (fun p -> OpamPackage.name_to_string p = "base")
+              extended_pkgs
           in
           let base_version_preserved =
             OpamPackage.Version.equal
@@ -392,16 +409,23 @@ let test_fake () =
             extra;
 
           let has_doc_helper =
-            List.exists (fun p -> OpamPackage.name_to_string p = "doc-helper") extra
+            List.exists
+              (fun p -> OpamPackage.name_to_string p = "doc-helper")
+              extra
           in
           let has_extra_helper =
-            List.exists (fun p -> OpamPackage.name_to_string p = "extra-helper") extra
+            List.exists
+              (fun p -> OpamPackage.name_to_string p = "extra-helper")
+              extra
           in
 
           Printf.printf "\n[4] Results:\n%!";
-          Printf.printf "  Base version preserved (pinning works): %b\n%!" base_version_preserved;
-          Printf.printf "  doc-helper added ({doc} filter works): %b\n%!" has_doc_helper;
-          Printf.printf "  extra-helper added (x-extra-doc-deps works): %b\n%!" has_extra_helper;
+          Printf.printf "  Base version preserved (pinning works): %b\n%!"
+            base_version_preserved;
+          Printf.printf "  doc-helper added ({doc} filter works): %b\n%!"
+            has_doc_helper;
+          Printf.printf "  extra-helper added (x-extra-doc-deps works): %b\n%!"
+            has_extra_helper;
 
           if base_version_preserved && has_doc_helper && has_extra_helper then (
             Printf.printf "\nSUCCESS: Both mechanisms work!\n%!";
@@ -435,9 +459,7 @@ let test_real repo_path =
     (OpamPackage.Name.Map.cardinal packages);
 
   (* Test with odoc.3.1.0 which has x-extra-doc-deps *)
-  let root_pkgs =
-    List.map OpamPackage.Name.of_string [ "odoc" ]
-  in
+  let root_pkgs = List.map OpamPackage.Name.of_string [ "odoc" ] in
   let constraints =
     [ ("odoc", `Eq, "3.1.0"); ("ocaml", `Geq, "5.2.0") ]
     |> List.map (fun (name, rel, version) ->
@@ -468,7 +490,9 @@ let test_real repo_path =
           result.compile_universes
       in
       let link_pkgs =
-        List.find_opt (fun (name, _, _) -> name = "odoc.3.1.0") result.link_universes
+        List.find_opt
+          (fun (name, _, _) -> name = "odoc.3.1.0")
+          result.link_universes
       in
       (match compile_pkgs with
       | Some (_, _, deps) ->
@@ -492,17 +516,31 @@ let test_real repo_path =
       let extra_in_link =
         List.filter
           (fun name ->
-            List.exists (fun dep -> String.sub dep 0 (min (String.length name) (String.length dep)) = name) link_deps
-            && not (List.exists (fun dep -> String.sub dep 0 (min (String.length name) (String.length dep)) = name) compile_deps))
+            List.exists
+              (fun dep ->
+                String.sub dep 0 (min (String.length name) (String.length dep))
+                = name)
+              link_deps
+            && not
+                 (List.exists
+                    (fun dep ->
+                      String.sub dep 0
+                        (min (String.length name) (String.length dep))
+                      = name)
+                    compile_deps))
           expected_extra
       in
-      Printf.printf "\nExtra packages in link but not compile (from x-extra-doc-deps):\n%!";
+      Printf.printf
+        "\nExtra packages in link but not compile (from x-extra-doc-deps):\n%!";
       List.iter (fun p -> Printf.printf "  %s\n%!" p) extra_in_link;
 
       if List.length extra_in_link >= 2 then (
-        Printf.printf "\nSUCCESS: x-extra-doc-deps packages found in link universe!\n%!";
+        Printf.printf
+          "\nSUCCESS: x-extra-doc-deps packages found in link universe!\n%!";
         exit 0)
       else (
-        Printf.printf "\nNote: Some x-extra-doc-deps packages may not be available.\n%!";
-        Printf.printf "Check if odoc-driver, sherlodoc, odig exist in the repo.\n%!";
+        Printf.printf
+          "\nNote: Some x-extra-doc-deps packages may not be available.\n%!";
+        Printf.printf
+          "Check if odoc-driver, sherlodoc, odig exist in the repo.\n%!";
         exit 0)
File "src/lib/prep.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/prep.ml b/_build/default/src/lib/.formatted/prep.ml
index 89e1c0b..a6793be 100644
--- a/_build/default/src/lib/prep.ml
+++ b/_build/default/src/lib/.formatted/prep.ml
@@ -496,7 +496,9 @@ module Prep = struct
         in
         Hashtbl.hash (Buffer.contents buf)
       in
-      let tools_digest = Spec.to_spec tools_base |> Digest.string |> Digest.to_hex in
+      let tools_digest =
+        Spec.to_spec tools_base |> Digest.string |> Digest.to_hex
+      in
       Fmt.str "%s\n%s\n%s\n%s\n%d\n" prep_version (Package.digest prep)
         (Package.digest prep) tools_digest opamfiles_hash
   end
dune build @fmt failed
"/usr/bin/env" "bash" "-c" "opam exec -- dune build @fmt --ignore-promoted-rules || (echo "dune build @fmt failed"; exit 2)" failed with exit status 2
2026-01-24 21:04.43: Job failed: Failed: Build failed