Organisationsahrefsatde34732 ()freebsd-14.3-4.14_opam-2.5

freebsd-14.3-4.14_opam-2.5

Logs

Show full logs
2026-03-09 07:47.19: New job: test ahrefs/atd https://github.com/ahrefs/atd.git#refs/heads/martin/modules (e34732b7eecc27804791f909072a225243220372) (freebsd-x86_64:freebsd-14.3-4.14_opam-2.5)
Base: freebsd-14.3-ocaml-4.14
Opam project build

To reproduce locally:

git clone --recursive "https://github.com/ahrefs/atd.git" -b "martin/modules" && cd "atd" && git reset --hard e34732b7
cat > Dockerfile <<'END-OF-DOCKERFILE'
FROM freebsd-14.3-ocaml-4.14
# freebsd-14.3-4.14_opam-2.5
USER 1000:1000
ENV CLICOLOR_FORCE="1"
ENV OPAMCOLOR="always"
WORKDIR /src
RUN sudo ln -f /usr/local/bin/opam-2.5 /usr/local/bin/opam
RUN opam init --reinit -ni
RUN uname -rs && opam exec -- ocaml -version && opam --version
WORKDIR /src
RUN sudo chown opam /src
RUN cd ~/opam-repository && (git cat-file -e db025b90cf6b81a0e665f98ea04833f94fc9cede || git fetch origin master) && git reset -q --hard db025b90cf6b81a0e665f98ea04833f94fc9cede && git log --no-decorate -n1 --oneline && opam update -u
COPY --chown=1000:1000 atdts.opam atds.opam atdpy.opam atdml.opam atdj.opam atdgen.opam atdgen-runtime.opam atdgen-codec-runtime.opam atdd.opam atdcpp.opam atd.opam ./
RUN opam pin add -yn atdts.dev './' && \
    opam pin add -yn atds.dev './' && \
    opam pin add -yn atdpy.dev './' && \
    opam pin add -yn atdml.dev './' && \
    opam pin add -yn atdj.dev './' && \
    opam pin add -yn atdgen.dev './' && \
    opam pin add -yn atdgen-runtime.dev './' && \
    opam pin add -yn atdgen-codec-runtime.dev './' && \
    opam pin add -yn atdd.dev './' && \
    opam pin add -yn atdcpp.dev './' && \
    opam pin add -yn atd.dev './'
RUN echo '(lang dune 3.0)' > './dune-project'
ENV DEPS="alcotest.1.9.1 astring.0.8.5 base-bigarray.base base-threads.base base-unix.base biniou.1.2.2 camlp-streams.5.0.1 cmdliner.2.1.0 conf-python-3.9.0.0 cppo.1.8.0 dune.3.21.1 easy-format.1.3.4 fmt.0.11.0 fpath.0.7.3 menhir.20260209 menhirCST.20260209 menhirGLR.20260209 menhirLib.20260209 menhirSdk.20260209 ocaml.4.14.2 ocaml-base-compiler.4.14.2 ocaml-compiler-libs.v0.12.4 ocaml-config.2 ocaml-options-vanilla.1 ocaml-syntax-shims.1.0.0 ocamlbuild.0.16.1 ocamlfind.1.9.8 ppx_derivers.1.2.1 ppx_deriving.6.1.1 ppxlib.0.37.0 re.1.14.0 sexplib0.v0.17.0 stdlib-shims.0.3.0 testo.0.4.0 testo-diff.0.4.0 testo-util.0.4.0 topkg.1.1.1 uutf.1.0.4 yojson.3.0.0"
ENV CI="true"
ENV OCAMLCI="true"
RUN opam update --depexts && opam install --cli=2.5 --depext-only -y atdts.dev atds.dev atdpy.dev atdml.dev atdj.dev atdgen.dev atdgen-runtime.dev atdgen-codec-runtime.dev atdd.dev atdcpp.dev atd.dev $DEPS
RUN opam install $DEPS
COPY --chown=1000:1000 . /src
RUN opam exec -- dune build @install @check @runtest && rm -rf _build

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

2026-03-09 07:47.19: Using cache hint "ahrefs/atd-freebsd-14.3-ocaml-4.14-freebsd-14.3-4.14_opam-2.5-b5e6e6f9b3cd825fa334fc8812e3cf69"
2026-03-09 07:47.19: Using OBuilder spec:
((from freebsd-14.3-ocaml-4.14)
 (comment freebsd-14.3-4.14_opam-2.5)
 (user (uid 1000) (gid 1000))
 (env CLICOLOR_FORCE 1)
 (env OPAMCOLOR always)
 (workdir /src)
 (run (shell "sudo ln -f /usr/local/bin/opam-2.5 /usr/local/bin/opam"))
 (run (shell "opam init --reinit -ni"))
 (run (shell "uname -rs && opam exec -- ocaml -version && opam --version"))
 (workdir /src)
 (run (shell "sudo chown opam /src"))
 (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
      (network host)
      (shell "cd ~/opam-repository && (git cat-file -e db025b90cf6b81a0e665f98ea04833f94fc9cede || git fetch origin master) && git reset -q --hard db025b90cf6b81a0e665f98ea04833f94fc9cede && git log --no-decorate -n1 --oneline && opam update -u"))
 (copy (src atdts.opam atds.opam atdpy.opam atdml.opam atdj.opam atdgen.opam atdgen-runtime.opam atdgen-codec-runtime.opam atdd.opam atdcpp.opam atd.opam)
       (dst ./))
 (run (network host)
      (shell  "opam pin add -yn atdts.dev './' && \
             \nopam pin add -yn atds.dev './' && \
             \nopam pin add -yn atdpy.dev './' && \
             \nopam pin add -yn atdml.dev './' && \
             \nopam pin add -yn atdj.dev './' && \
             \nopam pin add -yn atdgen.dev './' && \
             \nopam pin add -yn atdgen-runtime.dev './' && \
             \nopam pin add -yn atdgen-codec-runtime.dev './' && \
             \nopam pin add -yn atdd.dev './' && \
             \nopam pin add -yn atdcpp.dev './' && \
             \nopam pin add -yn atd.dev './'"))
 (run (shell "echo '(lang dune 3.0)' > './dune-project'"))
 (env DEPS "alcotest.1.9.1 astring.0.8.5 base-bigarray.base base-threads.base base-unix.base biniou.1.2.2 camlp-streams.5.0.1 cmdliner.2.1.0 conf-python-3.9.0.0 cppo.1.8.0 dune.3.21.1 easy-format.1.3.4 fmt.0.11.0 fpath.0.7.3 menhir.20260209 menhirCST.20260209 menhirGLR.20260209 menhirLib.20260209 menhirSdk.20260209 ocaml.4.14.2 ocaml-base-compiler.4.14.2 ocaml-compiler-libs.v0.12.4 ocaml-config.2 ocaml-options-vanilla.1 ocaml-syntax-shims.1.0.0 ocamlbuild.0.16.1 ocamlfind.1.9.8 ppx_derivers.1.2.1 ppx_deriving.6.1.1 ppxlib.0.37.0 re.1.14.0 sexplib0.v0.17.0 stdlib-shims.0.3.0 testo.0.4.0 testo-diff.0.4.0 testo-util.0.4.0 topkg.1.1.1 uutf.1.0.4 yojson.3.0.0")
 (env CI true)
 (env OCAMLCI true)
 (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
      (network host)
      (shell "opam update --depexts && opam install --cli=2.5 --depext-only -y atdts.dev atds.dev atdpy.dev atdml.dev atdj.dev atdgen.dev atdgen-runtime.dev atdgen-codec-runtime.dev atdd.dev atdcpp.dev atd.dev $DEPS"))
 (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
      (network host)
      (shell "opam install $DEPS"))
 (copy (src .) (dst /src))
 (run (shell "opam exec -- dune build @install @check @runtest && rm -rf _build"))
)

2026-03-09 07:47.19: Waiting for resource in pool OCluster
2026-03-09 07:47.19: Waiting for worker…
2026-03-09 07:47.19: Got resource from pool OCluster
Building on rosemary
All commits already cached
HEAD is now at e34732b Update docs and changelog for import statement support

(from freebsd-14.3-ocaml-4.14)
2026-03-09 07:42.17 ---> using "7e5247e9853d1c2fb95ef9ffdfdb895ef70516f48155f08a9b10db936cb8c6c6" from cache

/: (comment freebsd-14.3-4.14_opam-2.5)

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

/: (env CLICOLOR_FORCE 1)

/: (env OPAMCOLOR always)

/: (workdir /src)

/src: (run (shell "sudo ln -f /usr/local/bin/opam-2.5 /usr/local/bin/opam"))
2026-03-09 07:42.17 ---> using "cc65ce37998b2d98fc767b9dc7c3b5c83138e1952bec339ac27a7bb4d9d920d3" from cache

/src: (run (shell "opam init --reinit -ni"))
No configuration file found, using built-in defaults.
Checking for available remotes: rsync and local, git.
  - you won't be able to use mercurial repositories unless you install the hg command on your system.
  - you won't be able to use darcs repositories unless you install the darcs command on your system.

This version of opam requires an update to the layout of /home/opam/.opam from version 2.1 to version 2.2, which can't be reverted.
You may want to back it up before going further.

Continue? [Y/n] y
[NOTE] The 'jobs' option was reset, its value was 1 and its new value will vary according to the current number of cores on your machine. You can restore the fixed value using:
           opam option jobs=1 --global
Format upgrade done.

<><> Updating repositories ><><><><><><><><><><><><><><><><><><><><><><><><><><>
[default] no changes from git+file:///home/opam/opam-repository
2026-03-09 07:42.18 ---> using "87889fea7d09081125d96054d270a07df14f9b2a5c081c0c9434b9f215ecc218" from cache

/src: (run (shell "uname -rs && opam exec -- ocaml -version && opam --version"))
FreeBSD 14.3-RELEASE-p3
The OCaml toplevel, version 4.14.2
2.5.0
2026-03-09 07:42.18 ---> using "4a6e16f39bb2fab11842c96050ea21902749c68aefdffcd64774b8b7640a3492" from cache

/src: (workdir /src)

/src: (run (shell "sudo chown opam /src"))
2026-03-09 07:42.18 ---> using "ca1b89b4fcfce73b3b6ab80b797b154eda5f870ad814c498da3e18daf8f4b36f" from cache

/src: (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
           (network host)
           (shell "cd ~/opam-repository && (git cat-file -e db025b90cf6b81a0e665f98ea04833f94fc9cede || git fetch origin master) && git reset -q --hard db025b90cf6b81a0e665f98ea04833f94fc9cede && git log --no-decorate -n1 --oneline && opam update -u"))
From https://github.com/ocaml/opam-repository
 * branch                  master     -> FETCH_HEAD
   71325ac6ed..b48adbf3fd  master     -> origin/master
db025b90cf Merge pull request #29509 from mjambon/release-testo-0.4.0

<><> Updating package repositories ><><><><><><><><><><><><><><><><><><><><><><>
[default] synchronised from git+file:///home/opam/opam-repository

Everything as up-to-date as possible

The following packages are not being upgraded because the new versions conflict with other installed packages:
  - ocaml.5.5.0
  - ocaml-config.3
However, you may "opam upgrade" these packages explicitly at these versions (e.g. "opam upgrade ocaml.5.5.0"), which will ask permission to downgrade or uninstall the conflicting packages.
Nothing to do.
2026-03-09 07:42.18 ---> using "6dd8e6a99c1bc616e7429c3b37e9c1addb5530a8d096e02c777efb7eea1a48ac" from cache

/src: (copy (src atdts.opam atds.opam atdpy.opam atdml.opam atdj.opam atdgen.opam atdgen-runtime.opam atdgen-codec-runtime.opam atdd.opam atdcpp.opam atd.opam)
            (dst ./))
2026-03-09 07:42.18 ---> using "2f92fd2ba120d5b0ae10fbe8bbaa6e3b999c36605316bf14141e6e413be91df5" from cache

/src: (run (network host)
           (shell  "opam pin add -yn atdts.dev './' && \
                  \nopam pin add -yn atds.dev './' && \
                  \nopam pin add -yn atdpy.dev './' && \
                  \nopam pin add -yn atdml.dev './' && \
                  \nopam pin add -yn atdj.dev './' && \
                  \nopam pin add -yn atdgen.dev './' && \
                  \nopam pin add -yn atdgen-runtime.dev './' && \
                  \nopam pin add -yn atdgen-codec-runtime.dev './' && \
                  \nopam pin add -yn atdd.dev './' && \
                  \nopam pin add -yn atdcpp.dev './' && \
                  \nopam pin add -yn atd.dev './'"))
[atdts.dev] synchronised (file:///src)
atdts is now pinned to file:///src (version dev)
[atds.dev] synchronised (file:///src)
atds is now pinned to file:///src (version dev)
[atdpy.dev] synchronised (file:///src)
atdpy is now pinned to file:///src (version dev)
[NOTE] Package atdml does not exist in opam repositories registered in the current switch.
[atdml.dev] synchronised (file:///src)
atdml is now pinned to file:///src (version dev)
[atdj.dev] synchronised (file:///src)
atdj is now pinned to file:///src (version dev)
[atdgen.dev] synchronised (file:///src)
atdgen is now pinned to file:///src (version dev)
[atdgen-runtime.dev] synchronised (file:///src)
atdgen-runtime is now pinned to file:///src (version dev)
[atdgen-codec-runtime.dev] synchronised (file:///src)
atdgen-codec-runtime is now pinned to file:///src (version dev)
[atdd.dev] synchronised (file:///src)
atdd is now pinned to file:///src (version dev)
[atdcpp.dev] synchronised (file:///src)
atdcpp is now pinned to file:///src (version dev)
[atd.dev] synchronised (file:///src)
atd is now pinned to file:///src (version dev)
2026-03-09 07:42.19 ---> using "083d837be7a1f733718c1ab9932082a5168b766cbc5a086ee16cb5fea9e3962d" from cache

/src: (run (shell "echo '(lang dune 3.0)' > './dune-project'"))
2026-03-09 07:42.19 ---> using "8498fcaf1ca23b4d5600a460f116cc3d0ed12347609944adb8ea9f4ce8251117" from cache

/src: (env DEPS "alcotest.1.9.1 astring.0.8.5 base-bigarray.base base-threads.base base-unix.base biniou.1.2.2 camlp-streams.5.0.1 cmdliner.2.1.0 conf-python-3.9.0.0 cppo.1.8.0 dune.3.21.1 easy-format.1.3.4 fmt.0.11.0 fpath.0.7.3 menhir.20260209 menhirCST.20260209 menhirGLR.20260209 menhirLib.20260209 menhirSdk.20260209 ocaml.4.14.2 ocaml-base-compiler.4.14.2 ocaml-compiler-libs.v0.12.4 ocaml-config.2 ocaml-options-vanilla.1 ocaml-syntax-shims.1.0.0 ocamlbuild.0.16.1 ocamlfind.1.9.8 ppx_derivers.1.2.1 ppx_deriving.6.1.1 ppxlib.0.37.0 re.1.14.0 sexplib0.v0.17.0 stdlib-shims.0.3.0 testo.0.4.0 testo-diff.0.4.0 testo-util.0.4.0 topkg.1.1.1 uutf.1.0.4 yojson.3.0.0")

/src: (env CI true)

/src: (env OCAMLCI true)

/src: (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
           (network host)
           (shell "opam update --depexts && opam install --cli=2.5 --depext-only -y atdts.dev atds.dev atdpy.dev atdml.dev atdj.dev atdgen.dev atdgen-runtime.dev atdgen-codec-runtime.dev atdd.dev atdcpp.dev atd.dev $DEPS"))
[WARNING] Unknown update command for bsd, skipping system update

<><> Synchronising pinned packages ><><><><><><><><><><><><><><><><><><><><><><>
[atdd.dev] synchronised (file:///src)
[atdcpp.dev] synchronised (file:///src)
[atd.dev] synchronised (file:///src)
[atdgen.dev] synchronised (file:///src)
[atdgen-codec-runtime.dev] synchronised (file:///src)
[atdgen-runtime.dev] synchronised (file:///src)
[atdj.dev] synchronised (file:///src)
[atdml.dev] synchronised (file:///src)
[atdpy.dev] synchronised (file:///src)
[atds.dev] synchronised (file:///src)
[atdts.dev] synchronised (file:///src)

[NOTE] Package ocaml-options-vanilla is already installed (current version is 1).
[NOTE] Package ocaml-config is already installed (current version is 2).
[NOTE] Package ocaml-base-compiler is already installed (current version is 4.14.2).
[NOTE] Package ocaml is already installed (current version is 4.14.2).
[NOTE] Package base-unix is already installed (current version is base).
[NOTE] Package base-threads is already installed (current version is base).
[NOTE] Package base-bigarray is already installed (current version is base).

The following system packages will first need to be installed:
    python3

<><> Handling external dependencies <><><><><><><><><><><><><><><><><><><><><><>

+ /usr/local/bin/sudo "pkg" "install" "-y" "python3"
- Updating FreeBSD repository catalogue...
- [rosemary] Fetching data.pkg: 
- .
- ....
- ..... done
- Processing entries: 
- ...
- ...
- ..
- .
- . done
- FreeBSD repository update completed. 36544 packages processed.
- Updating FreeBSD-kmods repository catalogue...
- [rosemary] Fetching data.pkg: .......... done
- Processing entries: .......... done
- FreeBSD-kmods repository update completed. 245 packages processed.
- All repositories are up to date.
- New version of pkg detected; it needs to be installed first.
- The following 1 package(s) will be affected (of 0 checked):
- 
- Installed packages to be UPGRADED:
- 	pkg: 2.4.2 -> 2.5.1 [FreeBSD]
- 
- Number of packages to be upgraded: 1
- 
- The operation will free 24 MiB.
- 6 MiB to be downloaded.
- [rosemary] [1/1] Fetching pkg-2.5.1~75e3b55743.pkg: ....
- ...... done
- Checking integrity... done (0 conflicting)
- [rosemary] [1/1] Upgrading pkg from 2.4.2 to 2.5.1...
- [rosemary] [1/1] Extracting pkg-2.5.1: .......... done
- Updating FreeBSD repository catalogue...
- FreeBSD repository is up to date.
- Updating FreeBSD-kmods repository catalogue...
- FreeBSD-kmods repository is up to date.
- All repositories are up to date.
- The following 1 package(s) will be affected (of 0 checked):
- 
- New packages to be INSTALLED:
- 	python3: 3_4 [FreeBSD]
- 
- Number of packages to be installed: 1
- 
- 1 KiB to be downloaded.
- [rosemary] [1/1] Fetching python3-3_4: . done
- Checking integrity... done (0 conflicting)
- [rosemary] [1/1] Installing python3-3_4...
- [rosemary] [1/1] Extracting python3-3_4: ....... done
2026-03-09 07:42.19 ---> using "511118e3e6072ba7df3458b7a33b615636c59388659f4073b815d5b8501250f0" from cache

/src: (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
           (network host)
           (shell "opam install $DEPS"))
[NOTE] Package ocaml-options-vanilla is already installed (current version is 1).
[NOTE] Package ocaml-config is already installed (current version is 2).
[NOTE] Package ocaml-base-compiler is already installed (current version is 4.14.2).
[NOTE] Package ocaml is already installed (current version is 4.14.2).
[NOTE] Package base-unix is already installed (current version is base).
[NOTE] Package base-threads is already installed (current version is base).
[NOTE] Package base-bigarray is already installed (current version is base).
The following actions will be performed:
=== install 32 packages
   alcotest            1.9.1
   astring             0.8.5
   biniou              1.2.2
   camlp-streams       5.0.1
   cmdliner            2.1.0
   conf-python-3       9.0.0
   cppo                1.8.0
   dune                3.21.1
   easy-format         1.3.4
   fmt                 0.11.0
   fpath               0.7.3
   menhir              20260209
   menhirCST           20260209
   menhirGLR           20260209
   menhirLib           20260209
   menhirSdk           20260209
   ocaml-compiler-libs v0.12.4
   ocaml-syntax-shims  1.0.0
   ocamlbuild          0.16.1
   ocamlfind           1.9.8
   ppx_derivers        1.2.1
   ppx_deriving        6.1.1
   ppxlib              0.37.0
   re                  1.14.0
   sexplib0            v0.17.0
   stdlib-shims        0.3.0
   testo               0.4.0
   testo-diff          0.4.0
   testo-util          0.4.0
   topkg               1.1.1
   uutf                1.0.4
   yojson              3.0.0

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
 retrieved biniou.1.2.2  (cached)
 retrieved astring.0.8.5  (cached)
 retrieved camlp-streams.5.0.1  (cached)
 retrieved conf-python-3.9.0.0  (cached)
 retrieved alcotest.1.9.1  (cached)
 installed conf-python-3.9.0.0
 retrieved cppo.1.8.0  (cached)
 retrieved cmdliner.2.1.0  (cached)
 retrieved fmt.0.11.0  (cached)
 retrieved easy-format.1.3.4  (cached)
 retrieved fpath.0.7.3  (cached)
 retrieved ocaml-compiler-libs.v0.12.4  (cached)
 retrieved ocaml-syntax-shims.1.0.0  (cached)
 retrieved ocamlbuild.0.16.1  (cached)
 retrieved ocamlfind.1.9.8  (cached)
 retrieved ppx_derivers.1.2.1  (cached)
 retrieved menhir.20260209, menhirCST.20260209, menhirGLR.20260209, menhirLib.20260209, menhirSdk.20260209  (cached)
 retrieved ppx_deriving.6.1.1  (cached)
 retrieved re.1.14.0  (cached)
 retrieved sexplib0.v0.17.0  (cached)
 retrieved stdlib-shims.0.3.0  (cached)
 retrieved ppxlib.0.37.0  (cached)
 retrieved dune.3.21.1  (cached)
 retrieved uutf.1.0.4  (cached)
 retrieved topkg.1.1.1  (cached)
 retrieved yojson.3.0.0  (cached)
 retrieved testo.0.4.0, testo-diff.0.4.0, testo-util.0.4.0  (cached)
 installed cmdliner.2.1.0
 installed ocamlfind.1.9.8
 installed ocamlbuild.0.16.1
 installed topkg.1.1.1
 installed uutf.1.0.4
 installed fmt.0.11.0
 installed astring.0.8.5
 installed fpath.0.7.3
 installed dune.3.21.1
 installed menhirCST.20260209
 installed easy-format.1.3.4
 installed camlp-streams.5.0.1
 installed ppx_derivers.1.2.1
 installed stdlib-shims.0.3.0
 installed menhirGLR.20260209
 installed ocaml-syntax-shims.1.0.0
 installed menhirLib.20260209
 installed ocaml-compiler-libs.v0.12.4
 installed menhirSdk.20260209
 installed biniou.1.2.2
 installed sexplib0.v0.17.0
 installed cppo.1.8.0
 installed re.1.14.0
 installed yojson.3.0.0
 installed alcotest.1.9.1
 installed menhir.20260209
 installed ppxlib.0.37.0
 installed ppx_deriving.6.1.1
 installed testo-diff.0.4.0
 installed testo-util.0.4.0
 installed testo.0.4.0
Done.
2026-03-09 07:42.19 ---> using "447adc3f4d3444607ad2814c6256c1e34a1d731234c7b74576fd705b84376e32" from cache

/src: (copy (src .) (dst /src))
2026-03-09 07:42.20 ---> saved as "8d4bedad309527c6f89e9dd7839c13cf2370be34819eb15fc011a0d656c9fc7c"

/src: (run (shell "opam exec -- dune build @install @check @runtest && rm -rf _build"))
(cd _build/default && /home/opam/.opam/4.14.2/bin/ocamldep.opt -modules -impl doc/atdgen-tutorial-data/config-file/config_atd.ml) > _build/default/doc/atdgen-tutorial-data/config-file/.config.eobjs/dune__exe__Config_atd.impl.d
File "doc/atdgen-tutorial-data/config-file/config_atd.ml", line 7, characters 18-21:
7 |     <ocaml valid="fun l ->
                      ^^^
Error: Syntax error
File "atdcat/test/test.unwrap.expected.atd", line 1, characters 0-0:
/usr/local/bin/git --no-pager diff --no-index --color=always -u _build/default/atdcat/test/test.unwrap.expected.atd _build/default/atdcat/test/test.unwrap.atd
diff --git a/_build/default/atdcat/test/test.unwrap.expected.atd b/_build/default/atdcat/test/test.unwrap.atd
index 02d3e25..c15ed85 100644
--- a/_build/default/atdcat/test/test.unwrap.expected.atd
+++ b/_build/default/atdcat/test/test.unwrap.atd
@@ -1,4 +1,6 @@
 <doc html="<p>This <b>is</b> a test.</p>" text="This is a test.">
+import a <ocaml name="Aha">
+import a.b <ocaml name="AB"> as c <python name="cc">
 type test_string_syntax =
   int
     <a b="\"">
@@ -78,4 +80,4 @@ type 'a recur = { cyc: 'a recur option }
 type 'a ta = [ Ta of 'a ] <ta f2="xyz" f1>
 type int_ta = int ta <ta f1="false" f3="abc">
 type int_ta2 = int ta <ta f1="false" f3="abc"> <ocaml repr="classic">
-type timestamp = string
+type timestamp = string wrap <ocaml module="Timestamp">
File "atdcat/test/test.expected.atd", line 1, characters 0-0:
/usr/local/bin/git --no-pager diff --no-index --color=always -u _build/default/atdcat/test/test.expected.atd _build/default/atdcat/test/test.out.atd
diff --git a/_build/default/atdcat/test/test.expected.atd b/_build/default/atdcat/test/test.out.atd
index f1b2259..c15ed85 100644
--- a/_build/default/atdcat/test/test.expected.atd
+++ b/_build/default/atdcat/test/test.out.atd
@@ -1,4 +1,6 @@
 <doc html="<p>This <b>is</b> a test.</p>" text="This is a test.">
+import a <ocaml name="Aha">
+import a.b <ocaml name="AB"> as c <python name="cc">
 type test_string_syntax =
   int
     <a b="\"">
File "atdcat/test/dune", lines 57-87, characters 0-907:
57 | (rule
58 |  (alias runtest)
59 |  (deps
....
85 |    )
86 |  )
87 | )
(cd _build/default/atdcat/test && /usr/local/bin/python3 -m jsonschema schema.json -i data.json)
/usr/local/bin/python3: No module named jsonschema
(cd _build/default/atdgen/test && ../../../install/default/bin/atdgen -json -o test2j -open Test,Test2,Testj -ntd test2.atd)
Warning: option "-json" is deprecated.
(cd _build/default/atdgen/test && ../../../install/default/bin/atdgen -json -j-gen-modules -o test_ambiguous_record_j -open Test_ambiguous_record_t -ntd test_ambiguous_record.atd)
Warning: option "-json" is deprecated.
(cd _build/default/atdgen/test && ../../../install/default/bin/atdgen -json -j-gen-modules -o test_polymorphic_wrap_j test_polymorphic_wrap.atd)
Warning: option "-json" is deprecated.
(cd _build/default/atdgen/test && ../../../install/default/bin/atdgen -extend Test test.atd -json -o testjstd_j)
Warning: option "-json" is deprecated.
(cd _build/default/atdgen/test && ../../../install/default/bin/atdgen -validate -extend Test test.atd -o testv)
Warning: option "-validate" is deprecated.
(cd _build/default/atdgen/test && ../../../install/default/bin/atdgen -json -extend Test -j-custom-fields 'fun loc s -> Printf.eprintf "Warning: skipping field %s (def: %s)
" s loc' test.atd -o testj)
Warning: option "-json" is deprecated.
File "atdd/test/dlang-tests/dune", lines 17-26, characters 0-141:
17 | (rule
18 |  (alias runtest)
19 |  (package atdd)
20 |  (deps
21 |   (glob_files *.d))
22 |  (action
23 |   (progn
24 |    (bash "ldc2 %{deps} --of test")
25 |    (bash ./test)
26 |   )))
(cd _build/default/atdd/test/dlang-tests && /usr/local/bin/bash -e -u -o pipefail -c 'ldc2 everything_atd.d test_atdd.d --of test')
/usr/local/bin/bash: line 1: ldc2: command not found
File "atdcpp/test/cpp-tests/dune", lines 19-28, characters 0-183:
19 | (rule
20 |  (alias runtest)
21 |  (package atdcpp)
22 |  (deps
23 |   (glob_files *.cpp))
24 |  (action
25 |   (progn
26 |    (bash "g++ -I../../lib/rapidjson/include -std=c++17 %{deps} -o test")
27 |    (bash ./test)
28 |   )))
(cd _build/default/atdcpp/test/cpp-tests && /usr/local/bin/bash -e -u -o pipefail -c 'g++ -I../../lib/rapidjson/include -std=c++17 everything_atd.cpp test_atdd.cpp -o test')
/usr/local/bin/bash: line 1: g++: command not found
(cd _build/default/atdpy/src/test && ./Main.exe)
Testing `atdpy'.
This run has ID `7O0THZAU'.


Full test results in `/src/_build/default/atdpy/src/test/_build/_tests/atdpy'.
Test Successful in 0.000s. 0 test run.
File "atdgen/test/melange/melangespec_mel.expected.ml", line 1, characters 0-0:
/usr/local/bin/git --no-pager diff --no-index --color=always -u _build/default/atdgen/test/melange/melangespec_mel.expected.ml _build/default/atdgen/test/melange/melangespec_mel.ml
diff --git a/_build/default/atdgen/test/melange/melangespec_mel.expected.ml b/_build/default/atdgen/test/melange/melangespec_mel.ml
index 744d15f..8c67475 100644
--- a/_build/default/atdgen/test/melange/melangespec_mel.expected.ml
+++ b/_build/default/atdgen/test/melange/melangespec_mel.ml
@@ -663,7 +663,7 @@ let read_point = (
     )
 )
 let write_param_similar write__a = (
-  Atdgen_codec_runtime.Encode.make (fun (t : 'a param_similar) ->
+  Atdgen_codec_runtime.Encode.make (fun (t : _ param_similar) ->
     (
     Atdgen_codec_runtime.Encode.obj
       [
@@ -700,12 +700,12 @@ let read_param_similar read__a = (
               Atdgen_codec_runtime.Decode.int
               |> Atdgen_codec_runtime.Decode.field "something"
             ) json;
-      } : 'a param_similar)
+      } : _ param_similar)
     )
   )
 )
 let write_param write__a = (
-  Atdgen_codec_runtime.Encode.make (fun (t : 'a param) ->
+  Atdgen_codec_runtime.Encode.make (fun (t : _ param) ->
     (
     Atdgen_codec_runtime.Encode.obj
       [
@@ -742,12 +742,12 @@ let read_param read__a = (
               Atdgen_codec_runtime.Decode.unit
               |> Atdgen_codec_runtime.Decode.field "nothing"
             ) json;
-      } : 'a param)
+      } : _ param)
     )
   )
 )
 let write_pair write__a write__b = (
-  Atdgen_codec_runtime.Encode.make (fun (t : ('a, 'b) pair) ->
+  Atdgen_codec_runtime.Encode.make (fun (t : (_, _) pair) ->
     (
     Atdgen_codec_runtime.Encode.obj
       [
@@ -784,7 +784,7 @@ let read_pair read__a read__b = (
               read__b
               |> Atdgen_codec_runtime.Decode.field "right"
             ) json;
-      } : ('a, 'b) pair)
+      } : (_, _) pair)
     )
   )
 )
(cd _build/default/atdts/src/test && ./Main.exe)
Testing `atdts'.
This run has ID `8SM0CC98'.


Full test results in `/src/_build/default/atdts/src/test/_build/_tests/atdts'.
Test Successful in 0.000s. 0 test run.
(cd _build/default/atd/test && ./unit_tests.exe)
Testing `atd'.
This run has ID `JAOKIPEE'.

  [OK]          Annot                0   valid.
  [OK]          Annot                1   invalid1.
  [OK]          Annot                2   invalid2.
  [OK]          Annot                3   invalid3.
  [OK]          Annot                4   invalid4.
  [OK]          Annot                5   invalid5.
  [OK]          Annot                6   invalid6.
  [OK]          Annot                7   invalid7.
  [OK]          Annot                8   invalid8.
  [OK]          Annot                9   invalid9.
  [OK]          Sort                 0   sort.
  [OK]          Unique_name          0   reserved identifiers.
  [OK]          Unique_name          1   reserved prefixes.
  [OK]          Unique_name          2   identifier creation.
  [OK]          Doc                  0   normalize "".
  [OK]          Doc                  1   normalize "a".
  [OK]          Doc                  2   normalize "a b".
  [OK]          Doc                  3   normalize "a\nb".
  [OK]          Doc                  4   normalize "a  b".
  [OK]          Doc                  5   normalize "a \n b".
  [OK]          Doc                  6   normalize "a \n\n b".
  [OK]          Doc                  7   normalize "  a  ".
  [OK]          Doc                  8   normalize "\n\na\n\n".
  [OK]          Doc                  9   normalize "{{}}".
  [OK]          Doc                 10   normalize "{{a}}".
  [OK]          Doc                 11   normalize "{{  a  b\n\nc\n }}".
  [OK]          Doc                 12   normalize "{{ {a} }}".
  [OK]          Doc                 13   normalize "{{{}}}".
  [OK]          Doc                 14   normalize "{{{a}}}".
  [OK]          Doc                 15   normalize "{{{ }}}".
  [OK]          Doc                 16   normalize "{{{ {{a}} }}}".
  [OK]          Doc                 17   normalize "{{{ a\n\n  b }}}".

Full test results in `/src/_build/default/atd/test/_build/_tests/atd'.
Test Successful in 0.003s. 32 tests run.
File "atds/test/dune", lines 13-22, characters 0-177:
13 | (rule
14 |  (alias runtest)
15 |  (package atds)
16 |  (deps
17 |   AtdsTest.scala
18 |   argonaut_2.11-6.2.2.jar
19 |   argonaut_2.12-6.2.2.jar
20 |   junit-4.8.2.jar
21 |   test.scala)
22 |  (action (run ./run_test.sh)))
(cd _build/default/atds/test && ./run_test.sh)
./run_test.sh: scalac: not found
File "atdgen/test/melange/melangespec_j.expected.ml", line 1, characters 0-0:
/usr/local/bin/git --no-pager diff --no-index --color=always -u _build/default/atdgen/test/melange/melangespec_j.expected.ml _build/default/atdgen/test/melange/melangespec_j.ml
diff --git a/_build/default/atdgen/test/melange/melangespec_j.expected.ml b/_build/default/atdgen/test/melange/melangespec_j.ml
index ef4d482..04f553c 100644
--- a/_build/default/atdgen/test/melange/melangespec_j.expected.ml
+++ b/_build/default/atdgen/test/melange/melangespec_j.ml
@@ -1464,8 +1464,8 @@ let read_point = (
 )
 let point_of_string s =
   read_point (Yojson.Safe.init_lexer ()) (Lexing.from_string s)
-let write_param_similar write__a : _ -> 'a param_similar -> _ = (
-  fun ob (x : 'a param_similar) ->
+let write_param_similar write__a : _ -> _ param_similar -> _ = (
+  fun ob (x : _ param_similar) ->
     Buffer.add_char ob '{';
     let is_first = ref true in
     if !is_first then
@@ -1612,13 +1612,13 @@ let read_param_similar read__a = (
             data = (match !field_data with Some x -> x | None -> Atdgen_runtime.Oj_run.missing_field p "data");
             something = (match !field_something with Some x -> x | None -> Atdgen_runtime.Oj_run.missing_field p "something");
           }
-         : 'a param_similar)
+         : _ param_similar)
       )
 )
 let param_similar_of_string read__a s =
   read_param_similar read__a (Yojson.Safe.init_lexer ()) (Lexing.from_string s)
-let write_param write__a : _ -> 'a param -> _ = (
-  fun ob (x : 'a param) ->
+let write_param write__a : _ -> _ param -> _ = (
+  fun ob (x : _ param) ->
     Buffer.add_char ob '{';
     let is_first = ref true in
     if !is_first then
@@ -1765,13 +1765,13 @@ let read_param read__a = (
             data = (match !field_data with Some x -> x | None -> Atdgen_runtime.Oj_run.missing_field p "data");
             nothing = (match !field_nothing with Some x -> x | None -> Atdgen_runtime.Oj_run.missing_field p "nothing");
           }
-         : 'a param)
+         : _ param)
       )
 )
 let param_of_string read__a s =
   read_param read__a (Yojson.Safe.init_lexer ()) (Lexing.from_string s)
-let write_pair write__a write__b : _ -> ('a, 'b) pair -> _ = (
-  fun ob (x : ('a, 'b) pair) ->
+let write_pair write__a write__b : _ -> (_, _) pair -> _ = (
+  fun ob (x : (_, _) pair) ->
     Buffer.add_char ob '{';
     let is_first = ref true in
     if !is_first then
@@ -1918,7 +1918,7 @@ let read_pair read__a read__b = (
             left = (match !field_left with Some x -> x | None -> Atdgen_runtime.Oj_run.missing_field p "left");
             right = (match !field_right with Some x -> x | None -> Atdgen_runtime.Oj_run.missing_field p "right");
           }
-         : ('a, 'b) pair)
+         : (_, _) pair)
       )
 )
 let pair_of_string read__a read__b s =
File "atdj/test/dune", lines 53-61, characters 0-160:
53 | (rule
54 |  (alias runtest)
55 |  (package atdj)
56 |  (deps
57 |   AtdjTest.java
58 |   json.jar
59 |   junit-4.8.2.jar
60 |   (glob_files com/mylife/test/*.java))
61 |  (action (run ./run_test.sh)))
(cd _build/default/atdj/test && ./run_test.sh)
./run_test.sh: javac: not found
./run_test.sh: javac: not found
./run_test.sh: javadoc: not found
./run_test.sh: java: not found
File "atdgen/test/test.expected.ml", line 1, characters 0-0:
/usr/local/bin/git --no-pager diff --no-index --color=always -u _build/default/atdgen/test/test.expected.ml _build/default/atdgen/test/test.ml
diff --git a/_build/default/atdgen/test/test.expected.ml b/_build/default/atdgen/test/test.ml
index 77ff462..f08e720 100644
--- a/_build/default/atdgen/test/test.expected.ml
+++ b/_build/default/atdgen/test/test.ml
@@ -194,7 +194,7 @@ let read__a_list get__a_reader read__a = (
 let _a_list_of_string get__a_reader read__a ?pos s =
   read__a_list get__a_reader read__a (Bi_inbuf.from_string ?pos s)
 let rec p'_tag = Bi_io.variant_tag
-and write_untagged_p' _a_tag write_untagged__a write__a : Bi_outbuf.t -> 'a p' -> unit = (
+and write_untagged_p' _a_tag write_untagged__a write__a : Bi_outbuf.t -> _ p' -> unit = (
   fun ob x ->
     match x with
       | A -> Bi_outbuf.add_char4 ob '\000' '\000' '\000' 'A'
@@ -222,17 +222,17 @@ let rec get_p'_reader get__a_reader read__a = (
       fun ib ->
         Bi_io.read_hashtag ib (fun ib h has_arg ->
           match h, has_arg with
-            | 65, false -> (A : 'a p')
+            | 65, false -> (A : _ p')
             | 14816, true -> (Bb (
                 (
                   read_p' get__a_reader read__a
                 ) ib
-              ) : 'a p')
+              ) : _ p')
             | -711691517, true -> (Ccccc (
                 (
                   read__a
                 ) ib
-              ) : 'a p')
+              ) : _ p')
             | _ -> Atdgen_runtime.Ob_run.unsupported_variant h has_arg
         )
 )
@@ -241,17 +241,17 @@ and read_p' get__a_reader read__a = (
     if Bi_io.read_tag ib <> 23 then Atdgen_runtime.Ob_run.read_error_at ib;
     Bi_io.read_hashtag ib (fun ib h has_arg ->
       match h, has_arg with
-        | 65, false -> (A : 'a p')
+        | 65, false -> (A : _ p')
         | 14816, true -> (Bb (
             (
               read_p' get__a_reader read__a
             ) ib
-          ) : 'a p')
+          ) : _ p')
         | -711691517, true -> (Ccccc (
             (
               read__a
             ) ib
-          ) : 'a p')
+          ) : _ p')
         | _ -> Atdgen_runtime.Ob_run.unsupported_variant h has_arg
     )
 )
@@ -604,7 +604,7 @@ and string_of__a_b_poly_option _a_tag write_untagged__a write__a _b_tag write_un
   write__a_b_poly_option _a_tag write_untagged__a write__a _b_tag write_untagged__b write__b ob x;
   Bi_outbuf.contents ob
 and poly_tag = Bi_io.record_tag
-and write_untagged_poly _x_tag write_untagged__x write__x _y_tag write_untagged__y write__y : Bi_outbuf.t -> ('x, 'y) poly -> unit = (
+and write_untagged_poly _x_tag write_untagged__x write__x _y_tag write_untagged__y write__y : Bi_outbuf.t -> (_, _) poly -> unit = (
   fun ob x ->
     Bi_vint.write_uvint ob 2;
     Bi_outbuf.add_char4 ob '\128' 'M' '\202' '\135';
@@ -686,7 +686,7 @@ and get_poly_reader get__x_reader read__x get__y_reader read__y = (
             fst = !field_fst;
             snd = !field_snd;
           }
-         : ('x, 'y) poly)
+         : (_, _) poly)
 )
 and read_poly get__x_reader read__x get__y_reader read__y = (
   fun ib ->
@@ -719,7 +719,7 @@ and read_poly get__x_reader read__x get__y_reader read__y = (
         fst = !field_fst;
         snd = !field_snd;
       }
-     : ('x, 'y) poly)
+     : (_, _) poly)
 )
 and poly_of_string get__x_reader read__x get__y_reader read__y ?pos s =
   read_poly get__x_reader read__x get__y_reader read__y (Bi_inbuf.from_string ?pos s)
@@ -3906,7 +3906,7 @@ let read_hello = (
 let hello_of_string ?pos s =
   read_hello (Bi_inbuf.from_string ?pos s)
 let generic_tag = Bi_io.record_tag
-let write_untagged_generic _a_tag write_untagged__a write__a : Bi_outbuf.t -> 'a generic -> unit = (
+let write_untagged_generic _a_tag write_untagged__a write__a : Bi_outbuf.t -> _ generic -> unit = (
   fun ob x ->
     Bi_vint.write_uvint ob 1;
     Bi_outbuf.add_char4 ob '\240' 'G' '\003' '\130';
@@ -3944,7 +3944,7 @@ let get_generic_reader get__a_reader read__a = (
           {
             x294623 = !field_x294623;
           }
-         : 'a generic)
+         : _ generic)
 )
 let read_generic get__a_reader read__a = (
   fun ib ->
@@ -3968,7 +3968,7 @@ let read_generic get__a_reader read__a = (
       {
         x294623 = !field_x294623;
       }
-     : 'a generic)
+     : _ generic)
 )
 let generic_of_string get__a_reader read__a ?pos s =
   read_generic get__a_reader read__a (Bi_inbuf.from_string ?pos s)
File "atdgen/test/testv.expected.ml", line 1, characters 0-0:
/usr/local/bin/git --no-pager diff --no-index --color=always -u _build/default/atdgen/test/testv.expected.ml _build/default/atdgen/test/testv.ml
diff --git a/_build/default/atdgen/test/testv.expected.ml b/_build/default/atdgen/test/testv.ml
index de48083..96cdf73 100644
--- a/_build/default/atdgen/test/testv.expected.ml
+++ b/_build/default/atdgen/test/testv.ml
@@ -162,7 +162,7 @@ let validate__a_list validate__a = (
     validate__a
   )
 )
-let rec validate_p' validate__a : _ -> 'a p' -> _ = (
+let rec validate_p' validate__a : _ -> _ p' -> _ = (
   fun path x ->
     match x with
       | A -> None
@@ -218,7 +218,7 @@ let rec validate__a_b_poly_option validate__a validate__b path x = (
     validate_poly validate__a validate__b
   )
 ) path x
-and validate_poly validate__x validate__y : _ -> ('x, 'y) poly -> _ = (
+and validate_poly validate__x validate__y : _ -> (_, _) poly -> _ = (
   fun path x ->
     match
       (
@@ -446,7 +446,7 @@ let validate_int32 = (
 let validate_hello = (
   fun _ _ -> None
 )
-let validate_generic validate__a : _ -> 'a generic -> _ = (
+let validate_generic validate__a : _ -> _ generic -> _ = (
   fun _ _ -> None
 )
 let validate_floats : _ -> floats -> _ = (
File "atdgen/test/testjstd_j.expected.ml", line 1, characters 0-0:
/usr/local/bin/git --no-pager diff --no-index --color=always -u _build/default/atdgen/test/testjstd_j.expected.ml _build/default/atdgen/test/testjstd_j.ml
diff --git a/_build/default/atdgen/test/testjstd_j.expected.ml b/_build/default/atdgen/test/testjstd_j.ml
index 5540346..9ac76b5 100644
--- a/_build/default/atdgen/test/testjstd_j.expected.ml
+++ b/_build/default/atdgen/test/testjstd_j.ml
@@ -173,8 +173,8 @@ let read__a_list read__a = (
 )
 let _a_list_of_string read__a s =
   read__a_list read__a (Yojson.Safe.init_lexer ()) (Lexing.from_string s)
-let rec write_p' write__a : _ -> 'a p' -> _ = (
-  fun ob (x : 'a p') ->
+let rec write_p' write__a : _ -> _ p' -> _ = (
+  fun ob (x : _ p') ->
     match x with
       | A -> Buffer.add_string ob "\"A\""
       | Bb x ->
@@ -201,7 +201,7 @@ let rec read_p' read__a = (
       | `Double_quote -> (
           match Yojson.Safe.finish_string p lb with
             | "A" ->
-              (A : 'a p')
+              (A : _ p')
             | x ->
               Atdgen_runtime.Oj_run.invalid_variant_tag p x
         )
@@ -217,7 +217,7 @@ let rec read_p' read__a = (
               in
               Yojson.Safe.read_space p lb;
               Yojson.Safe.read_rbr p lb;
-              (Bb x : 'a p')
+              (Bb x : _ p')
             | "Ccccc" ->
               Yojson.Safe.read_space p lb;
               Yojson.Safe.read_comma p lb;
@@ -228,7 +228,7 @@ let rec read_p' read__a = (
               in
               Yojson.Safe.read_space p lb;
               Yojson.Safe.read_rbr p lb;
-              (Ccccc x : 'a p')
+              (Ccccc x : _ p')
             | x ->
               Atdgen_runtime.Oj_run.invalid_variant_tag p x
         )
@@ -625,8 +625,8 @@ and string_of__a_b_poly_option write__a write__b ?(len = 1024) x =
   let ob = Buffer.create len in
   write__a_b_poly_option write__a write__b ob x;
   Buffer.contents ob
-and write_poly write__x write__y : _ -> ('x, 'y) poly -> _ = (
-  fun ob (x : ('x, 'y) poly) ->
+and write_poly write__x write__y : _ -> (_, _) poly -> _ = (
+  fun ob (x : (_, _) poly) ->
     Buffer.add_char ob '{';
     let is_first = ref true in
     if !is_first then
@@ -813,7 +813,7 @@ and read_poly read__x read__y = (
             fst = (match !field_fst with Some x -> x | None -> Atdgen_runtime.Oj_run.missing_field p "fst");
             snd = (match !field_snd with Some x -> x | None -> Atdgen_runtime.Oj_run.missing_field p "snd");
           }
-         : ('x, 'y) poly)
+         : (_, _) poly)
       )
 )
 and poly_of_string read__x read__y s =
@@ -3722,8 +3722,8 @@ let read_hello = (
 )
 let hello_of_string s =
   read_hello (Yojson.Safe.init_lexer ()) (Lexing.from_string s)
-let write_generic write__a : _ -> 'a generic -> _ = (
-  fun ob (x : 'a generic) ->
+let write_generic write__a : _ -> _ generic -> _ = (
+  fun ob (x : _ generic) ->
     Buffer.add_char ob '{';
     let is_first = ref true in
     if !is_first then
@@ -3815,7 +3815,7 @@ let read_generic read__a = (
           {
             x294623 = (match !field_x294623 with Some x -> x | None -> Atdgen_runtime.Oj_run.missing_field p "x294623");
           }
-         : 'a generic)
+         : _ generic)
       )
 )
 let generic_of_string read__a s =
File "atdgen/test/testj.expected.ml", line 1, characters 0-0:
/usr/local/bin/git --no-pager diff --no-index --color=always -u _build/default/atdgen/test/testj.expected.ml _build/default/atdgen/test/testj.ml
diff --git a/_build/default/atdgen/test/testj.expected.ml b/_build/default/atdgen/test/testj.ml
index 5f93184..bc2e342 100644
--- a/_build/default/atdgen/test/testj.expected.ml
+++ b/_build/default/atdgen/test/testj.ml
@@ -173,8 +173,8 @@ let read__a_list read__a = (
 )
 let _a_list_of_string read__a s =
   read__a_list read__a (Yojson.Safe.init_lexer ()) (Lexing.from_string s)
-let rec write_p' write__a : _ -> 'a p' -> _ = (
-  fun ob (x : 'a p') ->
+let rec write_p' write__a : _ -> _ p' -> _ = (
+  fun ob (x : _ p') ->
     match x with
       | A -> Buffer.add_string ob "\"A\""
       | Bb x ->
@@ -201,7 +201,7 @@ let rec read_p' read__a = (
       | `Double_quote -> (
           match Yojson.Safe.finish_string p lb with
             | "A" ->
-              (A : 'a p')
+              (A : _ p')
             | x ->
               Atdgen_runtime.Oj_run.invalid_variant_tag p x
         )
@@ -217,7 +217,7 @@ let rec read_p' read__a = (
               in
               Yojson.Safe.read_space p lb;
               Yojson.Safe.read_rbr p lb;
-              (Bb x : 'a p')
+              (Bb x : _ p')
             | "Ccccc" ->
               Yojson.Safe.read_space p lb;
               Yojson.Safe.read_comma p lb;
@@ -228,7 +228,7 @@ let rec read_p' read__a = (
               in
               Yojson.Safe.read_space p lb;
               Yojson.Safe.read_rbr p lb;
-              (Ccccc x : 'a p')
+              (Ccccc x : _ p')
             | x ->
               Atdgen_runtime.Oj_run.invalid_variant_tag p x
         )
@@ -629,8 +629,8 @@ and string_of__a_b_poly_option write__a write__b ?(len = 1024) x =
   let ob = Buffer.create len in
   write__a_b_poly_option write__a write__b ob x;
   Buffer.contents ob
-and write_poly write__x write__y : _ -> ('x, 'y) poly -> _ = (
-  fun ob (x : ('x, 'y) poly) ->
+and write_poly write__x write__y : _ -> (_, _) poly -> _ = (
+  fun ob (x : (_, _) poly) ->
     Buffer.add_char ob '{';
     let is_first = ref true in
     if !is_first then
@@ -825,7 +825,7 @@ and read_poly read__x read__y = (
             fst = (match !field_fst with Some x -> x | None -> Atdgen_runtime.Oj_run.missing_field p "fst");
             snd = (match !field_snd with Some x -> x | None -> Atdgen_runtime.Oj_run.missing_field p "snd");
           }
-         : ('x, 'y) poly)
+         : (_, _) poly)
       )
 )
 and poly_of_string read__x read__y s =
@@ -3778,8 +3778,8 @@ let read_hello = (
 )
 let hello_of_string s =
   read_hello (Yojson.Safe.init_lexer ()) (Lexing.from_string s)
-let write_generic write__a : _ -> 'a generic -> _ = (
-  fun ob (x : 'a generic) ->
+let write_generic write__a : _ -> _ generic -> _ = (
+  fun ob (x : _ generic) ->
     Buffer.add_char ob '{';
     let is_first = ref true in
     if !is_first then
@@ -3873,7 +3873,7 @@ let read_generic read__a = (
           {
             x294623 = (match !field_x294623 with Some x -> x | None -> Atdgen_runtime.Oj_run.missing_field p "x294623");
           }
-         : 'a generic)
+         : _ generic)
       )
 )
 let generic_of_string read__a s =
File "atdpy/test/python-tests/dune", lines 23-35, characters 0-217:
23 | (rule
24 |  (alias runtest)
25 |  (package atdpy)
....
33 |    (run python3 -m flake8 .)
34 |    (run python3 -m mypy --strict .)
35 |    (run python3 -m pytest .))))
(cd _build/default/atdpy/test/python-tests && /usr/local/bin/python3 -m flake8 .)
/usr/local/bin/python3: No module named flake8
File "atdgen/test/dune", lines 423-426, characters 0-80:
423 | (rule
424 |  (alias runtest)
425 |  (package atdgen)
426 |  (action (run ./test_atdgen_main.exe)))
(cd _build/default/atdgen/test && ./test_atdgen_main.exe)
Testing `atdgen'.
This run has ID `TC75ALOY'.

  [OK]          atdgen          0   ocaml internals.
  [OK]          atdgen          1   biniou missing record fields.
  [OK]          atdgen          2   biniou missing tuple fields.
  [OK]          atdgen          3   biniou read/write unit.
  [OK]          atdgen          4   json missing record fields.
  [OK]          atdgen          5   json missing tuple fields.
  [OK]          atdgen          6   json extra field warning.
  [OK]          atdgen          7   json association list.
  [OK]          atdgen          8   json association array.
  [OK]          atdgen          9   json ints derived from ocaml floats.
  [OK]          atdgen         10   biniou correctness.
  [OK]          atdgen         11   json correctness.
  [OK]          atdgen         12   json space.
  [OK]          atdgen         13   validators0.
  [OK]          atdgen         14   validators1.
  [OK]          atdgen         15   validators2.
  [OK]          atdgen         16   validators3.
  [OK]          atdgen         17   validators4.
  [OK]          atdgen         18   json files.
  [OK]          atdgen         19   json streams.
  [OK]          atdgen         20   raw JSON.
  [OK]          atdgen         21   ocaml wrapping - ints.
  [OK]          atdgen         22   ocaml wrapping - double wrapping.
  [OK]          atdgen         23   ocaml wrapping - with validation.
  [OK]          atdgen         24   ocaml wrapping - wrap constructor without...
  [OK]          atdgen         25   check length of floats serialized as floa...
  [OK]          atdgen         26   print JSON floats with maximum number of ...
  [OK]          atdgen         27   read json record with null fields meaning...
  [OK]          atdgen         28   read and write a variant represented as a...
  [OK]          atdgen         29   read and write a variant represented as a...
  [OK]          atdgen         30   test variants represented with single-fie...
  [OK]          atdgen         31   emulate the retired tag_field feature.
  [OK]          atdgen         32   emulate the retired tag_field feature, wi...
  [OK]          atdgen         33   test <json open_enum>.
  [OK]          atdgen         34   test ambiguous record with json adapters.
  [OK]          atdgen         35   test ambiguous classic variants with json...
  [OK]          atdgen         36   test wrapping of polymorphic types.
  [OK]          atdgen         37   json encoding int.
  [OK]          atdgen         38   json encoding & decoding int.
  [FAIL]        atdgen         39   json encoding int with string representat...
  [OK]          atdgen         40   json encoding & decoding int with string ...
  [OK]          atdgen         41   abstract types.
  [OK]          atdgen         42   untyped json.
  [FAIL]        atdgen         43   generic.
  [OK]          atdgen         44   inline-records.

┌──────────────────────────────────────────────────────────────────────────────┐
[FAIL]        atdgen         39   json encoding int with string represen...
└──────────────────────────────────────────────────────────────────────────────┘
ASSERT true
FAIL true

   Expected: `true'
   Received: `false'

Raised at Alcotest_engine__Test.check in file "src/alcotest-engine/test.ml", line 216, characters 4-261
Called from Dune__exe__Test_atdgen_main.check in file "atdgen/test/test_atdgen_main.ml" (inlined), line 12, characters 2-43
Called from Dune__exe__Test_atdgen_main.test_encoding_int_with_string_repr in file "atdgen/test/test_atdgen_main.ml", line 636, characters 2-39
Called from Alcotest_engine__Core.Make.protect_test.(fun) in file "src/alcotest-engine/core.ml", line 186, characters 17-23
Called from Alcotest_engine__Monad.Identity.catch in file "src/alcotest-engine/monad.ml", line 24, characters 31-35

Logs saved to `/src/_build/default/atdgen/test/_build/_tests/atdgen/atdgen.039.output'.
 ──────────────────────────────────────────────────────────────────────────────


┌──────────────────────────────────────────────────────────────────────────────┐
[FAIL]        atdgen         43   generic.
└──────────────────────────────────────────────────────────────────────────────┘
ASSERT involution-abstract_j
ASSERT involution-test_int_with_string_repr_j.Afloat
File "atdgen/test/test_atdgen_main.ml", line 678, character 2:
FAIL involution-test_int_with_string_repr_j.Afloat

   Expected: `"\"42\""'
   Received: `"42"'

Raised at Alcotest_engine__Test.check in file "src/alcotest-engine/test.ml", line 216, characters 4-261
Called from Dune__exe__Test_atdgen_main.test_generic in file "atdgen/test/test_atdgen_main.ml", line 678, characters 2-107
Called from Alcotest_engine__Core.Make.protect_test.(fun) in file "src/alcotest-engine/core.ml", line 186, characters 17-23
Called from Alcotest_engine__Monad.Identity.catch in file "src/alcotest-engine/monad.ml", line 24, characters 31-35

Logs saved to `/src/_build/default/atdgen/test/_build/_tests/atdgen/atdgen.043.output'.
 ──────────────────────────────────────────────────────────────────────────────

Full test results in `/src/_build/default/atdgen/test/_build/_tests/atdgen'.
2 failures! in 0.011s. 45 tests run.
jail: /usr/bin/su -l opam -c cd '/src' && env OCAMLCI='true' CI='true' DEPS='alcotest.1.9.1 astring.0.8.5 base-bigarray.base base-threads.base base-unix.base biniou.1.2.2 camlp-streams.5.0.1 cmdliner.2.1.0 conf-python-3.9.0.0 cppo.1.8.0 dune.3.21.1 easy-format.1.3.4 fmt.0.11.0 fpath.0.7.3 menhir.20260209 menhirCST.20260209 menhirGLR.20260209 menhirLib.20260209 menhirSdk.20260209 ocaml.4.14.2 ocaml-base-compiler.4.14.2 ocaml-compiler-libs.v0.12.4 ocaml-config.2 ocaml-options-vanilla.1 ocaml-syntax-shims.1.0.0 ocamlbuild.0.16.1 ocamlfind.1.9.8 ppx_derivers.1.2.1 ppx_deriving.6.1.1 ppxlib.0.37.0 re.1.14.0 sexplib0.v0.17.0 stdlib-shims.0.3.0 testo.0.4.0 testo-diff.0.4.0 testo-util.0.4.0 topkg.1.1.1 uutf.1.0.4 yojson.3.0.0' OPAMCOLOR='always' CLICOLOR_FORCE='1' '/usr/bin/env' 'bash' '-c' 'opam exec -- dune build @install @check @runtest && rm -rf _build': failed
"jail" "-c" "name=obuilder_1974_43498" "mount.devfs" "path=/obuilder/result/5d8a933ba13cbb2b530f9d2cb5ff79163420940fc735273849cb84427c2a524e/rootfs" "vnet" "exec.start=/sbin/ifconfig lo0 127.0.0.1/8" "command=/usr/bin/su" "-l" "opam" "-c" "cd '/src' && env OCAMLCI='true' CI='true' DEPS='alcotest.1.9.1 astring.0.8.5 base-bigarray.base base-threads.base base-unix.base biniou.1.2.2 camlp-streams.5.0.1 cmdliner.2.1.0 conf-python-3.9.0.0 cppo.1.8.0 dune.3.21.1 easy-format.1.3.4 fmt.0.11.0 fpath.0.7.3 menhir.20260209 menhirCST.20260209 menhirGLR.20260209 menhirLib.20260209 menhirSdk.20260209 ocaml.4.14.2 ocaml-base-compiler.4.14.2 ocaml-compiler-libs.v0.12.4 ocaml-config.2 ocaml-options-vanilla.1 ocaml-syntax-shims.1.0.0 ocamlbuild.0.16.1 ocamlfind.1.9.8 ppx_derivers.1.2.1 ppx_deriving.6.1.1 ppxlib.0.37.0 re.1.14.0 sexplib0.v0.17.0 stdlib-shims.0.3.0 testo.0.4.0 testo-diff.0.4.0 testo-util.0.4.0 topkg.1.1.1 uutf.1.0.4 yojson.3.0.0' OPAMCOLOR='always' CLICOLOR_FORCE='1' '/usr/bin/env' 'bash' '-c' 'opam exec -- dune build @install @check @runtest && rm -rf _build'" failed with exit status 1
2026-03-09 07:47.29: Job failed: Failed: Build failed