jonahbeckford/ocamlearlybird · dk1-quick-setup vs master · net diff 1f77823fb..60739ee81 · 28 files · generated 2026-09-20 21:50Z

Branch Review: dk1-quick-setup

Description

What this branch does

Adds dk, a Windows-friendly, incremental, remote cacheable build system, as a build path for ocamlearlybird. This is the Quick Setup branch: a from-source build of the full opam dependency closure. The OCaml toolchain (compiler, Dune, opam, build utilities) is prebuilt, and ocamlearlybird's own 53-package closure (lwt, dap, menhir, ppxlib, …) plus the in-tree earlybird package compile locally, each as its own cached dk object.

After cloning, a user needs one command (the vendored launcher self-installs):

./dk1 run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
  -s Release.execution_abi -m bin/ocamlearlybird.exe -- --help=plain

See CLO.md for the fully worked adoption guide (Users and Maintainers), including the six-command adoption sequence, the pin table delta, and the reason dap is held at {>= "1.0.6" & < "1.1.0"} on the 4.14.3 toolchain.

Provenance

The dk packages this build depends on have been 100% AI generated and maintained since June 2026, and the dk build tool itself was hand built but AI assisted since June 2026.

Performance

Performance was measured on GitHub Actions runners with dk 2.4.3.22 and opam 2.5.2 (.github/workflows/measure-performance.yml, which also measures a conventional opam switch create + opam install . --deps-only + dune build on the same runners, compiler install included). The ± is the sample standard deviation over the mean; the dk numbers are the mean over 8 runs, and each opam and High Performance number the mean over 4:

Step dk Quick Setup opam nocache + dune (desktop) opam cache + dune
Linux: fresh checkout to a runnable binary ~2 m 55 s ±6% ~5 m 12 s ±10% ~2 m 53 s ±3%
Linux: re-run the built binary ~5 s ±17% ~0.1 s ±10% ~0.1 s ±10%
Linux: edit one file, rebuild ~20 s ±12% ~0.2 s ±8% ~0.2 s ±8%
Windows: fresh checkout to a runnable binary ~8 m 35 s ±9% ~13 m 7 s ±15% ~6 m 32 s ±3%
Windows: re-run the built binary ~10 s ±9% ~1.0 s ±19% ~1.0 s ±19%
Windows: edit one file, rebuild ~45 s ±11% ~1.2 s ±18% ~1.2 s ±18%

What each fresh checkout figure includes. The columns reach a runnable binary through different work, and they also stop in different places, so the numbers are comparable only once both are named. The dk figure is one command, ./dk1 run-object ... -- --help=plain, and its timed region covers the vendored launcher self-installing the engine pinned in dk.u, the lazy fetch of the prebuilt toolchain objects, the build of the 53-package locked closure and the earlybird package, and then RUNNING the produced binary. Both opam figures run from a stamp taken after checkout, through setup-ocaml (switch create and compiler install) and opam install . --deps-only, to the end of dune build @install.

setup-ocaml has a cache: true mode (the default) which caches a portion of the opam state in a GitHub Actions cache. The nocache measurements disable the GitHub Actions cache, mimicking desktops that also do not have access to that cache.

The four rows that are not a fresh checkout repeat across both opam columns, and are pooled over all eight runs. The cache holds the compiler and the switch, not this project's dependencies, so opam install . --deps-only costs about the same either way. Splitting those rows would publish noise as a distinction. The dk1-high-performance branch stacks on this one and requires GitHub Actions to maintain a per-ABI datastore of built objects for the 53-package closure, so a consumer fetches every opam package object prebuilt:

Step dk High Performance (dk1-high-performance) Quick Setup, for comparison
Linux: fresh checkout to a runnable binary ~1 m 31 s ±20% ~2 m 55 s ±6%
Linux: re-run the built binary ~5 s ±12% ~5 s ±17%
Windows: fresh checkout to a runnable binary ~2 m 31 s ±13% ~8 m 35 s ±9%
Windows: re-run the built binary ~12 s ±6% ~10 s ±9%

What's in the diff

  • dk0/dk1/dk0.cmd/dk1.cmd: vendored self-installing launchers, pinned to dk engine 2.4.3.22
  • dk.u: workspace script with the pinned CommonsLang_OCaml toolchain import and source-tree asset checksums
  • dune-project, earlybird.opam: the build inputs the dk recipe consumes
  • dk-opam-pins.txt, dk.opam-lock.jsonc: the solver pin table and the solved per-slot dependency lock
  • dk-src/dune-workspace: the dune workspace root marker staged into the assembled source
  • src/adapter/state_initialized.ml: the one source adjustment the build needs
  • etc/dk/v/NotHackwaly_Ocamlearlybird/*.values.jsonc: the generated localized-source form, the generated one-line closure driver (OpamBuild F_BuildLockedClosure), and the generated thin final form exposing bin/ocamlearlybird
  • etc/dk/t/: trust records (acceptances and capability grants) recorded by the quickstart from the recipe's declared trust statements
  • etc/dk/i/: verified import records and the closure manifest
  • .github/workflows/measure-performance.yml: the dk-and-opam timing matrix behind the table above
  • .github/workflows/repin-engine.yml: repins the engine and CommonsLang_OCaml on a hosted runner
  • scripts/check-measurement-complete.mjs, scripts/expected-measurement.json: the gate that fails the workflow if any expected slot's measurement is missing
  • .gitattributes: LF policy on the dk assets. dk hashes raw bytes, so a CRLF checkout on Windows would break asset verification.
  • CLO.md: the adoption guide

The change is additive. The existing dune/opam/esy workflows continue to work unchanged.

Changed files (open the full file on GitHub)
.gitattributes CHANGED
@@ -1,2 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  *.webp filter=lfs diff=lfs merge=lfs -text
2
  *.gif filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Line-ending policy.
2
+ #
3
+ # Every workspace asset (the dune files, the
4
+ # src/ tree, the opam lock, the *.u scripts) is hashed by its raw bytes and that
5
+ # hash is pinned in dk.u and etc/dk. The hashes are computed with LF endings, so
6
+ # the working tree must check out LF on every platform. Without this file a
7
+ # Windows checkout with core.autocrlf=true rewrites the assets to CRLF and
8
+ # `dk1 run-object` fails asset verification (unexpected SHA256). The Windows
9
+ # launchers (*.cmd/*.bat/*.ps1) must stay CRLF.
10
+
11
+ # Normalize text in the repository; native endings on checkout unless overridden.
12
+ * text=auto
13
+
14
+ # Git LFS media.
15
  *.webp filter=lfs diff=lfs merge=lfs -text
16
  *.gif filter=lfs diff=lfs merge=lfs -text
17
+
18
+ # Always LF on checkout: the dk-hashed assets plus OCaml/dune sources.
19
+ dune text eol=lf
20
+ dune-project text eol=lf
21
+ dune-workspace text eol=lf
22
+ *.dune text eol=lf
23
+ *.ml text eol=lf
24
+ *.mli text eol=lf
25
+ *.mll text eol=lf
26
+ *.mly text eol=lf
27
+ opam text eol=lf
28
+ *.opam text eol=lf
29
+ *.opam.template text eol=lf
30
+ *.json text eol=lf
31
+ *.jsonc text eol=lf
32
+ *.u text eol=lf
33
+ *.t text eol=lf
34
+ *.sh text eol=lf
35
+ *.patch text eol=lf
36
+ *.sexp text eol=lf
37
+ *.pub text eol=lf
38
+ *.sec text eol=lf
39
+ *.sig text eol=lf
40
+ dk text eol=lf
41
+ dk0 text eol=lf
42
+ dk1 text eol=lf
43
+ configure text eol=lf
44
+ Makefile text eol=lf
45
+
46
+ # Always CRLF on checkout: Windows launchers/scripts.
47
+ *.bat text eol=crlf
48
+ *.cmd text eol=crlf
49
+ *.ps1 text working-tree-encoding=UTF-8 eol=crlf
50
+ *.psm1 text working-tree-encoding=UTF-8 eol=crlf
51
+ *.sln text eol=crlf
.github/workflows/measure-performance.yml ADDED
@@ -0,0 +1,251 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: measure-performance
2
+ # Head-to-head opam-vs-dk timing for the Quick Setup tier, which builds the
3
+ # dependency closure from source, on Linux_x86_64 (ubuntu-latest) and
4
+ # Windows_x86_64 (windows-latest). Each runner measures the host ABI natively.
5
+ # Trigger from the Actions tab (workflow_dispatch) or by pushing a perf-* tag;
6
+ # the perf workflow never runs on push or pull_request, so it stays off the PR
7
+ # status checks.
8
+ #
9
+ # Every timed step prints `PHASE <name> ms=<n>` lines and a final SUMMARY line.
10
+ # The dk track and the opam track produce the same runnable binary, so their
11
+ # SUMMARY lines are directly comparable:
12
+ # dk fresh -> binary : dk_build_cold (compiles the whole closure)
13
+ # opam fresh -> binary : (setup-ocaml step) + opam_deps + opam_build_cold
14
+ # dk re-run a binary : dk_run_warm
15
+ # opam re-run a binary : opam_run_warm
16
+ # dk edit one file : dk_run_edit (rebuilds the leaf package object)
17
+ # opam edit one file : opam_build_edit (dune's file-level incremental)
18
+ on:
19
+ workflow_dispatch:
20
+ inputs:
21
+ opam_cache:
22
+ description: >-
23
+ Whether setup-ocaml may restore its opam switch from the Actions cache.
24
+ Leave it at true for an ordinary run. Set it to false to measure the
25
+ cold-cache side of the opam track: this input is the only thing that
26
+ separates the two modes, and the published fresh checkout figure differs
27
+ by roughly a factor of two between them.
28
+ type: choice
29
+ options:
30
+ - 'true'
31
+ - 'false'
32
+ default: 'true'
33
+ push:
34
+ tags:
35
+ - 'perf-*'
36
+
37
+ jobs:
38
+ dk:
39
+ strategy:
40
+ fail-fast: false
41
+ matrix:
42
+ include:
43
+ - os: ubuntu-latest
44
+ slot: Release.Linux_x86_64
45
+ - os: windows-latest
46
+ slot: Release.Windows_x86_64
47
+ runs-on: ${{ matrix.os }}
48
+ # A cold from-source closure build plus native compilation; give the job
49
+ # generous headroom over the default and the ci.yml jobs.
50
+ timeout-minutes: 90
51
+ steps:
52
+ - name: Checkout repository
53
+ uses: actions/checkout@v7
54
+ with:
55
+ lfs: true
56
+
57
+ # Linux uses the POSIX ./dk1 launcher (curl is present) and date-based
58
+ # millisecond timing.
59
+ - name: dk cold build + warm run + edit rebuild (timed, Linux)
60
+ if: runner.os == 'Linux'
61
+ shell: bash
62
+ run: |
63
+ set -euo pipefail
64
+ now() { date +%s%3N; }
65
+ slot='${{ matrix.slot }}'
66
+ run() { ./dk1 run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
67
+ -s "$slot" -m ./bin/ocamlearlybird.exe -- --help=plain >/dev/null; }
68
+ echo "DK MEASURE STARTED $(date -u +%H:%M:%S) slot=$slot"
69
+
70
+ a=$(now); run; b=$(now)
71
+ echo "PHASE dk_build_cold ms=$((b-a))"
72
+
73
+ c=$(now); run; d=$(now)
74
+ echo "PHASE dk_run_warm ms=$((d-c))"
75
+
76
+ printf '\n(* perf measurement touch *)\n' >> src/main/main.ml
77
+ ./dk1 update --no-imports
78
+ e=$(now); run; f=$(now)
79
+ echo "PHASE dk_run_edit ms=$((f-e))"
80
+
81
+ echo "DK SUMMARY slot=$slot build_cold_ms=$((b-a)) run_warm_ms=$((d-c)) run_edit_ms=$((f-e))"
82
+ echo "DK MEASURE DONE $(date -u +%H:%M:%S)"
83
+
84
+ # The same three readings, machine readable, for the gate job. Written
85
+ # AFTER every stopwatch has stopped and outside the working tree, so it
86
+ # cannot move a number: an earlier repair to this workflow moved console
87
+ # writes inside a stopwatch and widened five of six Windows cells.
88
+ mkdir -p "$RUNNER_TEMP/dk-phases"
89
+ printf 'dk_build_cold=%s\ndk_run_warm=%s\ndk_run_edit=%s\n' \
90
+ "$((b-a))" "$((d-c))" "$((f-e))" > "$RUNNER_TEMP/dk-phases/$slot.txt"
91
+
92
+ - name: Upload this slot's readings for the gate
93
+ if: ${{ always() && runner.os == 'Linux' }}
94
+ uses: actions/upload-artifact@v4
95
+ with:
96
+ name: dk-phases-${{ matrix.slot }}
97
+ path: ${{ runner.temp }}/dk-phases
98
+ if-no-files-found: ignore
99
+
100
+ # Windows uses the dk1.cmd launcher (bootstraps via PowerShell, no curl
101
+ # dependency) and Stopwatch timing.
102
+ - name: dk cold build + warm run + edit rebuild (timed, Windows)
103
+ if: runner.os == 'Windows'
104
+ shell: pwsh
105
+ run: |
106
+ $ErrorActionPreference = 'Stop'
107
+ $slot = '${{ matrix.slot }}'
108
+ # The engine writes its progress stream to stderr. Console writes on
109
+ # the Windows runner are expensive enough to move the numbers, so it
110
+ # goes to a file and is printed after the stopwatch stops. The file
111
+ # sits in the runner temp rather than the working tree, which the
112
+ # edit rebuild measures a change to.
113
+ $errlog = Join-Path $env:RUNNER_TEMP 'dk-run.err'
114
+ function Run {
115
+ & .\dk1.cmd run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 `
116
+ -s $slot -m ./bin/ocamlearlybird.exe -- --help=plain 2> $errlog > $null
117
+ if ($LASTEXITCODE -ne 0) { Get-Content $errlog; throw "run-object failed ($LASTEXITCODE)" }
118
+ }
119
+ Write-Host "DK MEASURE STARTED $(Get-Date -Format HH:mm:ss) slot=$slot"
120
+
121
+ $sw = [System.Diagnostics.Stopwatch]::StartNew(); Run; $cold = $sw.ElapsedMilliseconds
122
+ Write-Host "PHASE dk_build_cold ms=$cold"
123
+
124
+ $sw.Restart(); Run; $warm = $sw.ElapsedMilliseconds
125
+ Write-Host "PHASE dk_run_warm ms=$warm"
126
+
127
+ Add-Content -Path src/main/main.ml -Value "`n(* perf measurement touch *)`n"
128
+ & .\dk1.cmd update --no-imports
129
+ if ($LASTEXITCODE -ne 0) { throw "update failed ($LASTEXITCODE)" }
130
+ $sw.Restart(); Run; $edit = $sw.ElapsedMilliseconds
131
+ Write-Host "PHASE dk_run_edit ms=$edit"
132
+
133
+ Write-Host "DK SUMMARY slot=$slot build_cold_ms=$cold run_warm_ms=$warm run_edit_ms=$edit"
134
+ Write-Host "DK ENGINE OUTPUT from the last timed run, printed outside the stopwatch"
135
+ Get-Content $errlog
136
+ Write-Host "DK MEASURE DONE $(Get-Date -Format HH:mm:ss)"
137
+
138
+ # The same three readings, machine readable, for the gate job. Written
139
+ # AFTER every stopwatch has stopped and outside the working tree, so it
140
+ # cannot move a number.
141
+ $phaseDir = Join-Path $env:RUNNER_TEMP 'dk-phases'
142
+ New-Item -ItemType Directory -Force -Path $phaseDir | Out-Null
143
+ "dk_build_cold=$cold`ndk_run_warm=$warm`ndk_run_edit=$edit" |
144
+ Set-Content -NoNewline -Path (Join-Path $phaseDir "$slot.txt")
145
+
146
+ - name: Upload this slot's readings for the gate
147
+ if: ${{ always() && runner.os == 'Windows' }}
148
+ uses: actions/upload-artifact@v4
149
+ with:
150
+ name: dk-phases-${{ matrix.slot }}
151
+ path: ${{ runner.temp }}/dk-phases
152
+ if-no-files-found: ignore
153
+
154
+ # THE MEASUREMENT COVERED EVERY SLOT IT CLAIMS TO COVER, OR THIS FAILS.
155
+ #
156
+ # The dk matrix runs fail-fast: false, so a dead leg does not stop the others and
157
+ # the workflow can finish carrying numbers for only some slots. Those numbers then
158
+ # refresh CLO.md and both PR descriptions while describing a slot nobody measured.
159
+ # `needs: dk` with `if: always()` is what makes this reachable when a leg failed,
160
+ # which is the case it exists for.
161
+ measurement-gate:
162
+ needs: dk
163
+ if: ${{ always() }}
164
+ runs-on: ubuntu-latest
165
+ steps:
166
+ - name: Checkout repository
167
+ uses: actions/checkout@v7
168
+
169
+ - name: Download every slot's readings
170
+ uses: actions/download-artifact@v4
171
+ with:
172
+ pattern: dk-phases-*
173
+ merge-multiple: true
174
+ path: collected
175
+
176
+ # A check that has only ever been observed passing is evidence about the run
177
+ # and not about the check. This proves it rejects a missing slot, a missing
178
+ # phase and a zero reading BEFORE its verdict on real data is believed.
179
+ - name: Prove the gate fires
180
+ run: node scripts/check-measurement-complete.mjs --selftest
181
+
182
+ - name: Every declared slot reported every declared phase
183
+ run: node scripts/check-measurement-complete.mjs --dir collected
184
+
185
+ opam:
186
+ strategy:
187
+ fail-fast: false
188
+ matrix:
189
+ os:
190
+ - ubuntu-latest
191
+ - windows-latest
192
+ runs-on: ${{ matrix.os }}
193
+ steps:
194
+ - name: Checkout repository
195
+ uses: actions/checkout@v7
196
+ with:
197
+ lfs: true
198
+
199
+ # T0 is stamped after checkout but before switch create, so the opam
200
+ # fresh-to-binary number includes switch create + compiler install
201
+ # (setup-ocaml), the fair counterpart to dk fetching its toolchain.
202
+ - name: Stamp opam start time (before switch create)
203
+ shell: bash
204
+ run: echo "OPAM_T0=$(date +%s%3N)" >> "$GITHUB_ENV"
205
+
206
+ # Matches the dk-locked compiler (CommonsLang_OCaml.DkML@4.14.3001) so the
207
+ # opam and dk tracks build the same package set with the same compiler.
208
+ - name: Set up OCaml 4.14 (switch create + compiler install)
209
+ uses: ocaml/setup-ocaml@v3
210
+ with:
211
+ ocaml-compiler: 4.14.x
212
+ # Stated explicitly so the two cache modes are selectable. setup-ocaml's own
213
+ # default is true, which the run logs echo as `cache: true`, so an ordinary
214
+ # dispatch measures exactly what it measured before this input existed and the
215
+ # existing cache-mode samples stay valid. A tag-triggered run carries no inputs,
216
+ # so the expression falls back to 'true' rather than to an empty string.
217
+ cache: ${{ inputs.opam_cache || 'true' }}
218
+
219
+ - name: opam setup + deps + dune build cold/warm/edit (timed)
220
+ shell: bash
221
+ run: |
222
+ set -euo pipefail
223
+ now() { date +%s%3N; }
224
+ t0="$OPAM_T0"
225
+ echo "OPAM MEASURE STARTED $(date -u +%H:%M:%S) os=${{ matrix.os }}"
226
+
227
+ a=$(now)
228
+ echo "PHASE opam_setup ms=$((a-t0))"
229
+
230
+ opam install . --deps-only -y; b=$(now)
231
+ echo "PHASE opam_deps ms=$((b-a))"
232
+
233
+ # @install builds the library + executable (the shipped artifacts) and
234
+ # skips the test rules, which spawn the debugger and time out on the
235
+ # Windows runner. This measures the same deliverable the dk track runs.
236
+ c=$(now); opam exec -- dune build @install; d=$(now)
237
+ echo "PHASE opam_build_cold ms=$((d-c))"
238
+ echo "PHASE opam_fresh_to_binary ms=$((d-t0))"
239
+
240
+ e=$(now); opam exec -- dune build @install; f=$(now)
241
+ echo "PHASE opam_build_warm ms=$((f-e))"
242
+
243
+ g=$(now); opam exec -- dune exec -- ocamlearlybird --help=plain >/dev/null; h=$(now)
244
+ echo "PHASE opam_run_warm ms=$((h-g))"
245
+
246
+ printf '\n(* perf measurement touch *)\n' >> src/main/main.ml
247
+ i=$(now); opam exec -- dune build @install; j=$(now)
248
+ echo "PHASE opam_build_edit ms=$((j-i))"
249
+
250
+ echo "OPAM SUMMARY os=${{ matrix.os }} fresh_to_binary_ms=$((d-t0)) setup_ms=$((a-t0)) deps_ms=$((b-a)) build_cold_ms=$((d-c)) build_warm_ms=$((f-e)) run_warm_ms=$((h-g)) build_edit_ms=$((j-i))"
251
+ echo "OPAM MEASURE DONE $(date -u +%H:%M:%S)"
.github/workflows/repin-engine.yml ADDED
@@ -0,0 +1,303 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: repin-engine
2
+ # Repin dk.u to a chosen engine and CommonsLang_OCaml release ON A HOSTED RUNNER,
3
+ # regenerate etc/dk/i with the launcher's own update, and regenerate the etc/dk/v
4
+ # closure driver so it names rules the new import actually offers.
5
+ #
6
+ # SPLIT OUT OF measure-performance.yml at cycle 40. That file held this job and the
7
+ # timed measurement jobs behind mutually exclusive `if:` conditions, so a dispatch
8
+ # ran one half and skipped the other while the workflow's name promised a
9
+ # measurement either way. Two costs came with that. A reader could not tell from a
10
+ # run's name whether any figure had been produced, which cost a round of confusion
11
+ # when three jobs reported SKIPPED and no numbers changed. And every edit to this
12
+ # repin path touched the file holding the timed steps, which
13
+ # skills/update-ocamlearlybird-measurements says invalidates the measurement
14
+ # cohort: "samples taken before it describe a workflow that no longer exists".
15
+ #
16
+ # It does NOT commit unless asked. The first dispatch produces the diff as an
17
+ # artifact so it can be READ before anything is pushed; a second dispatch with
18
+ # commit=true lands it. The diff is the point rather than a formality.
19
+ on:
20
+ workflow_dispatch:
21
+ inputs:
22
+ engine_version:
23
+ description: >-
24
+ The dk actual_version to repin to. 2.4.3.9 is the earliest published
25
+ engine clearing the F_BuildLockedClosure object-form floor, and
26
+ 2.4.3.8 itself is 404, so nothing below 2.4.3.9 is a valid choice.
27
+ type: string
28
+ default: '2.4.3.15'
29
+ clo_version:
30
+ description: >-
31
+ The CommonsLang_OCaml tag to import. It must match the release that
32
+ any CommonsBase_Dk object this build imports was itself built
33
+ against, which is the pin-guard rule in skills/bump-version-train.
34
+ type: string
35
+ default: '0.1.20260902235611'
36
+ commit:
37
+ description: >-
38
+ Commit the regenerated material back to this branch. Leave false on
39
+ the first dispatch so the diff is read before anything lands.
40
+ type: choice
41
+ options:
42
+ - 'false'
43
+ - 'true'
44
+ default: 'false'
45
+
46
+ jobs:
47
+ repin:
48
+ runs-on: ubuntu-latest
49
+ timeout-minutes: 60
50
+ permissions:
51
+ contents: write
52
+ steps:
53
+ - name: Checkout repository
54
+ uses: actions/checkout@v7
55
+ with:
56
+ lfs: true
57
+
58
+ - name: Record what is pinned before anything is touched
59
+ run: |
60
+ set -eu
61
+ mkdir -p .regen
62
+ echo "--- dk.u pins BEFORE ---"
63
+ grep -n 'actual_version' dk.u || true
64
+ grep -n 'CommonsLang_OCaml' dk.u || true
65
+ echo "--- etc/dk/i BEFORE ---"
66
+ ls -1 etc/dk/i/
67
+ cp -a etc/dk/i .regen/i-before
68
+ cp dk.u .regen/dk.u.before
69
+ # The CLO tag before the repin, for the values.json diff after regeneration.
70
+ sed -n 's/.*repo="dkpkg\/CommonsLang_OCaml", tag="\([^"]*\)".*/\1/p' dk.u | head -1 > .regen/old_clo
71
+
72
+ - name: Repin dk.u to the requested engine and CommonsLang_OCaml
73
+ env:
74
+ ENGINE: ${{ inputs.engine_version }}
75
+ CLO: ${{ inputs.clo_version }}
76
+ run: |
77
+ set -eu
78
+ test -n "$ENGINE" && test -n "$CLO" || { echo "::error::engine_version and clo_version must both be non-empty"; exit 1; }
79
+ echo "repinning: engine -> $ENGINE, CommonsLang_OCaml -> $CLO"
80
+ # Repin THROUGH THE ENGINE, never by text-editing dk.u. self-update rewrites
81
+ # the %% actual_version command and its regenerated output pair; add upserts
82
+ # the CommonsLang_OCaml import by repo IDENTITY (the tag is excluded from the
83
+ # match, so a wave timestamp shared by sibling imports is irrelevant) and
84
+ # clears its output block, so the update step below re-fetches and rewrites
85
+ # the version + checksums + etc/dk/i. Both are idempotent: re-running at the
86
+ # same engine/tag is a no-op-safe upsert, so no refresh flag and no
87
+ # version-uniqueness guard are needed (the old text edit needed both, and
88
+ # broke when sibling imports shared a wave release timestamp).
89
+ ./dk1 self-update "$ENGINE"
90
+ ./dk1 add github-l2 dkpkg/CommonsLang_OCaml@"$CLO"
91
+ echo "--- dk.u diff ---"
92
+ git --no-pager diff -- dk.u
93
+
94
+ - name: Run the launcher's update on this runner
95
+ run: |
96
+ set -eu
97
+ # KEEP THE EVIDENCE. A sibling step in this workflow once discarded a
98
+ # failing run's output and the engine's own error was unreadable.
99
+ # tee, so a failure is diagnosable from the log alone.
100
+ set +e
101
+ ./dk1 update 2>&1 | tee .regen/update.log
102
+ rc=${PIPESTATUS[0]}
103
+ set -e
104
+ echo "update exit code: $rc"
105
+ if [ "$rc" -ne 0 ]; then
106
+ echo "::error::./dk1 update failed with exit code $rc; the log above is the evidence"
107
+ exit "$rc"
108
+ fi
109
+
110
+ - name: Regenerate the closure driver so it matches the rules the import offers
111
+ # WHY THIS STEP EXISTS. Repinning the import rewrites etc/dk/i and leaves
112
+ # etc/dk/v alone, and etc/dk/v holds a GENERATED driver that names a rule
113
+ # by version. On 2026-09-06 that cost a whole measurement: the driver named
114
+ # the CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedClosure rule at a stale
115
+ # version, while the newly imported CommonsLang_OCaml offered only a newer
116
+ # one, and
117
+ # both dk legs died with "Could not get rule ... does not exist" after the
118
+ # 90-minute matrix had already been dispatched.
119
+ #
120
+ # The driver is NOT hand-edited from one version to the other. Its own
121
+ # header says regenerate rather than hand-edit, the generator itself moved
122
+ # @1.1.16 to @1.1.20 between those releases, and nothing here can verify the
123
+ # two rule versions take the same parameters. A silently different build
124
+ # would corrupt the very number this workflow exists to produce.
125
+ env:
126
+ CLO: ${{ inputs.clo_version }}
127
+ run: |
128
+ set -eu
129
+ imp="etc/dk/i/CommonsLang_OCaml.${CLO}.values.json"
130
+ if [ ! -s "$imp" ]; then
131
+ echo "::error::$imp is missing or empty, so there is nothing to regenerate against"
132
+ exit 1
133
+ fi
134
+
135
+ # THE RULE VERSION IS DISCOVERED, NEVER PINNED HERE. Writing a literal
136
+ # would reintroduce exactly the defect this step removes: a checked-in
137
+ # reference to a version the import may no longer offer.
138
+ ref=$(grep -o 'CommonsLang_OCaml\.Dk\.OpamLock\.Refresh@[0-9][0-9.]*' "$imp" | sort -uV | tail -1)
139
+ if [ -z "$ref" ]; then
140
+ echo "::error::the import offers no CommonsLang_OCaml.Dk.OpamLock.Refresh rule, so the driver cannot be regenerated from it"
141
+ exit 1
142
+ fi
143
+ echo "regenerating with $ref"
144
+
145
+ # PROVE THE CHECK FIRES BEFORE TRUSTING THAT IT PASSES. CLO.md:194
146
+ # documents mode=check as read-only and nonzero when a driver is stale,
147
+ # so it must go RED here and GREEN below, in this same run. A check only
148
+ # ever observed passing is evidence about the run, not about the check.
149
+ set +e
150
+ ./dk1 dialog "$ref" mode=check > .regen/driver-check-before.log 2>&1
151
+ before=$?
152
+ set -e
153
+ echo "driver staleness BEFORE regeneration: exit $before"
154
+ cat .regen/driver-check-before.log || true
155
+ if [ "$before" -eq 0 ]; then
156
+ echo "NOTE: the driver was already current for this import, so this run does not exercise the stale path."
157
+ fi
158
+
159
+ ./dk1 dialog "$ref" 2>&1 | tee .regen/driver-refresh.log
160
+
161
+ # KEEP THE EVIDENCE, and fail loudly. A sibling step in this workflow once
162
+ # discarded a failing run's output and the engine's own error was unreadable.
163
+ set +e
164
+ ./dk1 dialog "$ref" mode=check > .regen/driver-check-after.log 2>&1
165
+ after=$?
166
+ set -e
167
+ echo "driver staleness AFTER regeneration: exit $after"
168
+ cat .regen/driver-check-after.log || true
169
+ if [ "$after" -ne 0 ]; then
170
+ echo "::error::the driver is STILL stale after regenerating it; the log above is the evidence"
171
+ exit "$after"
172
+ fi
173
+
174
+ # Refresh regenerates ONLY the GenerateDriver (closure/DevPrefix) family.
175
+ # The Src and Final drivers are owned by the separate GenerateSrc and
176
+ # GenerateFinal rules; a CLO rule-version bump moves those too, and the
177
+ # closure refresh-check cannot see it, so they go stale undetected (the
178
+ # 2026-09-14 measurement hit exactly this). Regenerate both here,
179
+ # discovering the rule version from the same import and the root package
180
+ # id from the drivers. GenerateSrc/GenerateFinal self-discover the lock
181
+ # root from pkg=, so no root=/roots[]= is needed here.
182
+ srcref=$(grep -o 'CommonsLang_OCaml\.Dk\.OpamLock\.GenerateSrc@[0-9][0-9.]*' "$imp" | sort -uV | tail -1)
183
+ finalref=$(grep -o 'CommonsLang_OCaml\.Dk\.OpamLock\.GenerateFinal@[0-9][0-9.]*' "$imp" | sort -uV | tail -1)
184
+ pkgid=$(grep -ohE 'NotHackwaly_Ocamlearlybird\.Ocamlearlybird@[0-9][0-9.]*' etc/dk/v/NotHackwaly_Ocamlearlybird/*.values.jsonc | sort -uV | tail -1)
185
+ if [ -z "$srcref" ] || [ -z "$finalref" ] || [ -z "$pkgid" ]; then
186
+ echo "::error::could not discover GenerateSrc/GenerateFinal rule version or the earlybird pkg id"
187
+ exit 1
188
+ fi
189
+ echo "regenerating Src with $srcref and Final with $finalref for $pkgid"
190
+ ./dk1 dialog "$srcref" pkg="$pkgid"
191
+ ./dk1 dialog "$finalref" pkg="$pkgid"
192
+
193
+ echo "--- etc/dk/v diff ---"
194
+ git --no-pager diff -- etc/dk/v/ || true
195
+
196
+ - name: Every rule the driver names must exist in the import
197
+ # The guard that turns a 90-minute failure into a seconds-long one. It is a
198
+ # SEPARATE step from the regeneration above on purpose: presence and effect
199
+ # need separate reports, and this one still fires when the regeneration
200
+ # silently no-ops.
201
+ env:
202
+ CLO: ${{ inputs.clo_version }}
203
+ run: |
204
+ set -eu
205
+ imp="etc/dk/i/CommonsLang_OCaml.${CLO}.values.json"
206
+ drv=etc/dk/v/NotHackwaly_Ocamlearlybird/Ocamlearlybird.Closure.values.jsonc
207
+ if [ ! -s "$drv" ]; then
208
+ echo "::error::$drv is missing or empty after regeneration"
209
+ exit 1
210
+ fi
211
+
212
+ named=$(grep -o 'CommonsLang_OCaml\.[A-Za-z0-9_.]*@[0-9][0-9.]*' "$drv" | sort -u)
213
+ # An empty result must never impersonate a real answer: a driver naming no
214
+ # CommonsLang_OCaml rule at all would otherwise read as "nothing missing".
215
+ if [ -z "$named" ]; then
216
+ echo "::error::the driver names no CommonsLang_OCaml rule at all, which cannot be right"
217
+ exit 1
218
+ fi
219
+
220
+ missing=0
221
+ total=0
222
+ for r in $named; do
223
+ total=$((total + 1))
224
+ if grep -qF "\"$r\"" "$imp"; then
225
+ echo " OK $r"
226
+ else
227
+ echo " MISSING $r"
228
+ missing=$((missing + 1))
229
+ fi
230
+ done
231
+ echo "checked $total rule(s) named by the driver against $imp"
232
+ if [ "$missing" -ne 0 ]; then
233
+ echo "::error::$missing of $total rule(s) named by the driver are absent from the import. This is the 2026-09-06 failure, caught before the measurement instead of after it."
234
+ exit 1
235
+ fi
236
+
237
+ - name: The regeneration must have produced something
238
+ env:
239
+ CLO: ${{ inputs.clo_version }}
240
+ run: |
241
+ set -eu
242
+ want="etc/dk/i/CommonsLang_OCaml.${CLO}.values.json"
243
+ echo "--- etc/dk/i AFTER ---"
244
+ ls -1 etc/dk/i/
245
+ # An empty result must never impersonate a real answer.
246
+ if [ ! -s "$want" ]; then
247
+ echo "::error::$want is missing or empty after update; the regeneration produced nothing"
248
+ exit 1
249
+ fi
250
+ echo "PRESENT $want ($(wc -c < "$want") bytes)"
251
+ old=$(cat .regen/old_clo)
252
+ oldf=".regen/i-before/CommonsLang_OCaml.${old}.values.json"
253
+ echo "--- values.json: ${old} -> ${CLO} ---"
254
+ if [ -s "$oldf" ]; then
255
+ # diff exits 1 when the files differ, which is the expected case.
256
+ diff -u "$oldf" "$want" > .regen/values.diff || true
257
+ echo "diff lines: $(wc -l < .regen/values.diff)"
258
+ cat .regen/values.diff
259
+ else
260
+ echo "no prior values.json at $oldf to diff against"
261
+ echo "no prior values.json to diff" > .regen/values.diff
262
+ fi
263
+ echo "--- every change in the working tree ---"
264
+ git status --porcelain
265
+ git --no-pager diff --stat
266
+
267
+ - name: Upload the regenerated material so the diff can be read before it lands
268
+ uses: actions/upload-artifact@v4
269
+ with:
270
+ name: regenerated-import
271
+ path: |
272
+ dk.u
273
+ etc/dk/i/**
274
+ etc/dk/v/**
275
+ .regen/values.diff
276
+ .regen/update.log
277
+ .regen/driver-refresh.log
278
+ .regen/driver-check-before.log
279
+ .regen/driver-check-after.log
280
+ if-no-files-found: error
281
+
282
+ - name: Commit and push, only when asked
283
+ if: ${{ inputs.commit == 'true' }}
284
+ env:
285
+ ENGINE: ${{ inputs.engine_version }}
286
+ CLO: ${{ inputs.clo_version }}
287
+ run: |
288
+ set -eu
289
+ rm -rf .regen
290
+ if [ -z "$(git status --porcelain)" ]; then
291
+ echo "::error::commit was requested but the tree is clean; nothing was regenerated"
292
+ exit 1
293
+ fi
294
+ git config user.name "github-actions[bot]"
295
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
296
+ git add dk.u etc/dk/i etc/dk/v
297
+ git commit \
298
+ -m "Regenerate the import on a hosted runner" \
299
+ -m "+ repin the engine to ${ENGINE}" \
300
+ -m "+ repin CommonsLang_OCaml to ${CLO}" \
301
+ -m "+ regenerate etc/dk/i with ./dk1 update" \
302
+ -m "+ regenerate the etc/dk/v closure driver with the OpamLock.Refresh dialog"
303
+ git push origin "HEAD:${GITHUB_REF_NAME}"
.gitignore CHANGED
@@ -2,3 +2,8 @@
2
  node_modules
3
  /_build
4
  .merlin
 
 
 
 
 
 
2
  node_modules
3
  /_build
4
  .merlin
5
+
6
+ # dk transient state (see CLO.md). dk writes self-ignoring .gitignore files
7
+ # into the other directories it creates (dk-dist/, opam-venv/, the etc/dk/i
8
+ # scratch download), so only the local store needs an entry here.
9
+ /t/
CLO.md ADDED
@@ -0,0 +1,207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Building ocamlearlybird with the dk build tool
2
+
3
+ This document explains how to build the `ocamlearlybird` OCaml debug adapter
4
+ with [dk](https://diskuv.com/dk), a Windows-friendly, incremental, remote
5
+ cacheable build system. It is
6
+ written for two audiences, people who just want the binary (**Users**) and
7
+ people who maintain this repository's dk integration (**Maintainers**), and it
8
+ is meant to double as a worked, replayable example of adopting dk for an
9
+ existing opam/dune project.
10
+
11
+ ## Provenance
12
+
13
+ The dk packages this build depends on have been **100% AI generated and
14
+ maintained since June 2026**, and the dk build tool itself was **hand built but
15
+ AI assisted since June 2026**.
16
+
17
+ ---
18
+
19
+ ## Quick Setup
20
+
21
+ The Quick Setup path builds ocamlearlybird from source once on your machine,
22
+ on top of a prebuilt toolchain: the OCaml compiler, Dune, opam, and the
23
+ supporting build utilities arrive as prebuilt
24
+ objects that dk lazily range-fetches from published Diskuv
25
+ package releases. An existing CI-backed dk package (here
26
+ `dkpkg/CommonsLang_OCaml`, which publishes the OCaml toolchain objects) gives
27
+ you that partial caching for free.
28
+
29
+ What you build locally in Quick Setup is ocamlearlybird's own opam dependency
30
+ closure (lwt, dap, menhir, ppxlib, …) plus ocamlearlybird itself, each as its
31
+ own cached dk object.
32
+
33
+ ### Quick Setup for Users
34
+
35
+ You need two things: install dk1, then run one object.
36
+
37
+ **1. Install dk1** (installs both `dk0` and `dk1` into `~/.local/bin`, verified
38
+ with signify + SHA-256):
39
+
40
+ ```sh
41
+ curl -fsSL https://diskuv.com/dk/install.sh | sh
42
+ # Windows PowerShell: irm https://diskuv.com/dk/install.ps1 | iex
43
+ ```
44
+
45
+ (If you cloned this repository you can skip the install entirely and use the
46
+ vendored `./dk1` launcher, which self-installs the pinned version on first run.)
47
+
48
+ **2. Build and run the debug adapter** as a single object:
49
+
50
+ ```sh
51
+ ./dk1 run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
52
+ -s Release.execution_abi \
53
+ -m bin/ocamlearlybird.exe \
54
+ -- --help
55
+ ```
56
+
57
+ - `-s Release.execution_abi` selects the object built for the host you are on, so the
58
+ same command works on Linux, macOS and Windows without editing the slot.
59
+ - `-m bin/ocamlearlybird.exe` selects the member of the built object to execute.
60
+ - everything after `--` is passed to the debug adapter.
61
+
62
+ ### Quick Setup for Maintainers
63
+
64
+ Adopting dk for an existing opam/dune project is the command sequence below,
65
+ shown for Linux. On macOS swap the slot in step 6 (`Release.Darwin_arm64`); on
66
+ Windows use PowerShell, `irm https://diskuv.com/dk/vendor.ps1 | iex` for step 1,
67
+ and `.\dk1.cmd` for the rest.
68
+
69
+ ```sh
70
+ # 1. vendor the dk0/dk1 launchers into the repo
71
+ curl -fsSL https://diskuv.com/dk/vendor.sh | sh
72
+ # 2. scaffold dk.u, seed the pin table and .gitattributes, record the
73
+ # quickstart's declared trust statements, and import the toolchain
74
+ ./dk1 quickstart ocaml opam414
75
+ # 3. fetch and verify the toolchain import
76
+ ./dk1 update
77
+ # 4. adopt: solve the lock, generate the build forms, register the assets
78
+ ./dk1 dialog CommonsLang_OCaml.Dk.OpamLock.Adopt@1.1.14 version=1.3.6 unit=Ocamlearlybird ns=NotHackwaly_Ocamlearlybird
79
+ # 5. recompute the checksums of the registered workspace assets
80
+ ./dk1 update
81
+ # 6. build and run the debug adapter
82
+ ./dk1 run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
83
+ -s Release.execution_abi -m ./bin/ocamlearlybird.exe -- --help
84
+ ```
85
+
86
+ `ns=` keeps this fork's committed third-party namespace; a maintainer adopting
87
+ their own project omits it and gets a namespace derived from the repository.
88
+
89
+ What the above sequence of commands produces:
90
+
91
+ | File | Role |
92
+ |---|---|
93
+ | `dk0`, `dk1`, `dk0.cmd`, `dk1.cmd` | vendored self-installing launchers (step 1) |
94
+ | `etc/dk/t/acceptances.json`, `etc/dk/t/capabilities.json` | trust records from the quickstart's declared trust statements (step 2) |
95
+ | `dk.u` | workspace script: pinned imports + registered asset declarations (steps 2, 4, 5) |
96
+ | `dk-opam-pins.txt` | opam solve pin table, seeded by the quickstart (see below) |
97
+ | `dk-src/dune-workspace` | dune workspace root marker staged into the assembled source |
98
+ | `dk.opam-lock.jsonc` | the solved, checked-in per-slot dependency lock (step 4) |
99
+ | `etc/dk/v/…/Ocamlearlybird.Src.values.jsonc` | generated localized-source form (step 4) |
100
+ | `etc/dk/v/…/Ocamlearlybird.Closure.values.jsonc` | generated one-line closure driver (step 4) |
101
+ | `etc/dk/v/…/Ocamlearlybird.values.jsonc` | generated thin final form exposing `bin/ocamlearlybird` (step 4) |
102
+ | `etc/dk/i/*.values.json`, `etc/dk/i/dk-closure-manifest.tsv` | verified import records (steps 2, 3) |
103
+
104
+ **Maintenance after adoption.** After a repin or a dependency change, the
105
+ zero-argument `Refresh` regenerates the committed driver from the stamped
106
+ parameters, and `mode=check` validates it read-only (CI-friendly):
107
+
108
+ ```sh
109
+ ./dk1 dialog CommonsLang_OCaml.Dk.OpamLock.Refresh@1.1.14 # regenerate the driver
110
+ ./dk1 dialog CommonsLang_OCaml.Dk.OpamLock.Refresh@1.1.14 mode=solve # re-solve the lock, then the driver
111
+ ./dk1 dialog CommonsLang_OCaml.Dk.OpamLock.Refresh@1.1.14 mode=check # read-only; nonzero if a driver is stale
112
+ ./dk1 dialog CommonsLang_OCaml.Dk.OpamLock.Refresh@1.1.14 version=1.3.7 # bump earlybird across the coupled ids
113
+ ```
114
+
115
+ After editing any workspace asset (`dune`, `dune-project`, `earlybird.opam`,
116
+ `src/`, or the lock) run `./dk1 update --no-imports` to refresh the recorded
117
+ checksums in `dk.u`, then rebuild, see *Editing a file and rebuilding*.
118
+
119
+ #### The pin table (`dk-opam-pins.txt`)
120
+
121
+ The quickstart seeds the pin table, and the
122
+ [dk for opam users guide](https://diskuv.com/dk/docs/OPAM/) explains its line
123
+ forms and purpose. This repository makes one change to the seeded table: the
124
+ `repo default` line pins the opam-repository to a single commit,
125
+
126
+ ```
127
+ repo default git+https://github.com/ocaml/opam-repository.git#4f41495f12b15921ce982ac208c41b257d295515
128
+ ```
129
+
130
+ so every maintainer and every CI run solves against the same package index and
131
+ produces the same lock. Bump the commit deliberately, then re-solve with
132
+ `Refresh mode=solve`.
133
+
134
+ ---
135
+
136
+ <!-- The "## High Performance" section is added on the dk1-high-performance branch. -->
137
+
138
+ ## Editing a file and rebuilding
139
+
140
+ The supported flow after editing a source file:
141
+
142
+ ```sh
143
+ # edit e.g. src/main/main.ml, then:
144
+ ./dk1 update --no-imports # recompute workspace-asset checksums in dk.u
145
+ ./dk1 run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
146
+ -s Release.execution_abi -m bin/ocamlearlybird.exe -- --help
147
+ ```
148
+
149
+ dk0/dk1 re-checksum workspace assets **only on `update`**, so `dk1 update` is what
150
+ turns a working-tree edit into a new content hash, so only the objects whose
151
+ inputs actually changed rebuild, here
152
+ the localized-source object and the local `earlybird` package object, while every
153
+ external package object stays cached and is reused untouched.
154
+
155
+ ## What gets cached
156
+
157
+ | Piece | Quick Setup source |
158
+ | --- | --- |
159
+ | OCaml compiler toolchain (`CommonsLang_OCaml.DkML@4.14.3`) | fetched prebuilt from the `dkpkg` release |
160
+ | Dune (`CommonsLang_OCaml.Dune@3.23.1`) | fetched prebuilt from the `dkpkg` release |
161
+ | opam and the build utilities (coreutils, 7-Zip, GNU make) | fetched prebuilt from the `dkpkg` releases |
162
+ | MSYS2 runtime (Windows slots) | fetched prebuilt from the `dkpkg` release |
163
+ | The 53 locked dependency packages (lwt, dap, menhir, ppxlib, …) | built locally once, then cached |
164
+ | The in-tree `earlybird` package | built locally, rebuilt on source edits |
165
+ | Localized source and final executable forms | built locally (copy and archive steps) |
166
+
167
+ A dk object id is a hash of the values-file content, the `module@version`, and
168
+ the slot, and the id embeds this project's namespace. A
169
+ project's own prior releases are the cache that pays off for the dependency
170
+ packages, which is what the High Performance CI path sets up.
171
+
172
+ ## Supported OCaml versions
173
+
174
+ This build compiles ocamlearlybird with OCaml 4.14.3 (the
175
+ `CommonsLang_OCaml.DkML@4.14.3` toolchain). A bytecode debugger must be built
176
+ with the same compiler version as the program it debugs, so this build debugs
177
+ programs compiled with OCaml 4.14.x.
178
+
179
+ To debug a program compiled with a different OCaml version, build ocamlearlybird
180
+ with that compiler using upstream's opam instructions; the dk pipeline here
181
+ builds with 4.14.3.
182
+
183
+ ### Why `dap` is held at `{>= "1.0.6" & < "1.1.0"}`
184
+
185
+ Upstream ocamlearlybird bumped `earlybird.opam` / `dune-project` to `dap {>= "1.1.0"}`
186
+ (the "dap 1.71 spec" change) and set the RunInTerminal field
187
+ `args_can_be_interpreted_by_shell`. **Do not re-bump `dap` here** while the build
188
+ targets the 4.14.3 toolchain: `dap` 1.1.0's dependency closure does not solve
189
+ against it. The `< "1.1.0"` upper bound is load-bearing on its own: this
190
+ branch's source does not set the RunInTerminal field that `dap` 1.1.0's record
191
+ type requires, so a plain `opam install` that selects `dap` 1.1.0 (which current
192
+ opam-repository permits on many compilers) fails to compile
193
+ (`Some record fields are undefined: args_can_be_interpreted_by_shell`). The
194
+ bound makes the opam metadata state what the source can actually build against.
195
+ Solving the closure per pinned OCaml gives:
196
+
197
+ | Pinned solve | Result |
198
+ | --- | --- |
199
+ | `ocaml 4.14.3` | no solution; the closure requires `ocaml (< 4.14.3 \| >= 5.0)` |
200
+ | `ocaml 5.5.0` | no solution; the closure requires `ocaml < 5.4` |
201
+ | `dap 1.1.0` on `ocaml 4.14.3` | no `dap` satisfies |
202
+
203
+ So the feasible OCaml window for `dap` 1.1.0 is `< 4.14.3` or `[5.0, 5.4)`, and
204
+ `CommonsLang_OCaml` ships compiler objects only at 4.14.3 / 5.4.1 / 5.5.0. The
205
+ `args_can_be_interpreted_by_shell` field is DAP-optional and was set to `None`
206
+ (the absent/default behaviour), so keeping `dap` at 1.0.6 and dropping that one
207
+ field is behaviour-neutral.
dk-opam-pins.txt ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Pin table for CommonsLang_OCaml.Dk.OpamLock.Solve (see CLO.md "Quick Setup
2
+ # for Maintainers"). Every line below is explained in that section.
3
+ #
4
+ # Line forms:
5
+ # repo NAME URL opam repository for the solve (pin a commit with #COMMIT)
6
+ # pin NAME VERSION hard version lock for one opam package
7
+ # float NAME remove a pin inherited from an existing switch
8
+ # archexclude NAME ARCH exclude a package on one architecture
9
+ #
10
+ # --- repositories ---
11
+ # Pin ocaml/opam-repository to a single commit so the solved closure is
12
+ # reproducible run-to-run (master on 2026-08-08):
13
+ repo default git+https://github.com/ocaml/opam-repository.git#4f41495f12b15921ce982ac208c41b257d295515
14
+ #
15
+ # --- version locks ---
16
+ # Lock the OCaml compiler to 4.14.3. The per-package build rule
17
+ # (CommonsLang_OCaml.Dk.OpamBuild) compiles every package with the relocatable
18
+ # CommonsLang_OCaml.DkML@4.14.3 toolchain, so the lock MUST resolve the 4.14.x
19
+ # dependency closure. Without this pin the solver picks the newest OCaml (5.x)
20
+ # and selects 5.x-only package versions that would not compile under 4.14.3.
21
+ pin ocaml 4.14.3
22
+ pin ocaml-base-compiler 4.14.3
23
+ #
24
+ # Lock dune to 3.23.1, the version the toolchain provides
25
+ # (CommonsLang_OCaml.Dune@3.23.1). The toolchain lags opam-repository master, so
26
+ # an unpinned solve pulls packages (e.g. dune-configurator 3.24.x) that declare
27
+ # "dune" {>= "3.24"} and ship `(lang dune 3.24)`, which the provided Dune 3.23.1
28
+ # refuses ("Version 3.24 of the dune language is not supported"). Pinning dune to
29
+ # the provided version makes the solver pick dune-3.23-compatible package
30
+ # versions. GENERAL RULE: pin every toolchain-provided tool (ocaml, dune) to the
31
+ # exact version dk ships, so the solved closure matches what actually builds it.
32
+ pin dune 3.23.1
dk-src/dune-workspace ADDED
@@ -0,0 +1 @@
 
 
1
+ (lang dune 2.8)
dk.opam-lock.jsonc ADDED
@@ -0,0 +1,2256 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "https://diskuv.com/dk/schema/dk-opam-lock-1.0.json",
3
+ "generated": {
4
+ "opam_version": "2.5.1",
5
+ "tool": "CommonsLang_OCaml.Dk.OpamLock@1.1.0"
6
+ },
7
+ "opam_repositories": [
8
+ {
9
+ "commit": null,
10
+ "name": "default",
11
+ "url": "git+https://github.com/ocaml/opam-repository.git#4f41495f12b15921ce982ac208c41b257d295515"
12
+ }
13
+ ],
14
+ "packages": {
15
+ "angstrom-lwt-unix.0.16.1": {
16
+ "build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"runtest\" \"-p\" name \"-j\" jobs] {with-test}",
17
+ "depends": [
18
+ "ocaml",
19
+ "dune",
20
+ "angstrom",
21
+ "lwt",
22
+ "base-unix"
23
+ ],
24
+ "depends_raw": "\"ocaml\" {>= \"4.03.0\"} \"dune\" {>= \"1.8\"} \"angstrom\" \"lwt\" \"base-unix\"",
25
+ "install": null,
26
+ "name": "angstrom-lwt-unix",
27
+ "source": {
28
+ "archive": "tgz",
29
+ "checksums": [
30
+ "md5=a9e096b4b2b8e4e3bb17d472bbccaad0",
31
+ "sha256=143536fb4d049574c539b9990840615e078ed3dd94e1d24888293f68349a100b"
32
+ ],
33
+ "size": 117544,
34
+ "url": "https://github.com/inhabitedtype/angstrom/archive/0.16.1.tar.gz"
35
+ },
36
+ "version": "0.16.1"
37
+ },
38
+ "angstrom.0.16.1": {
39
+ "build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"runtest\" \"-p\" name \"-j\" jobs] {with-test}",
40
+ "depends": [
41
+ "ocaml",
42
+ "dune",
43
+ "bigstringaf",
44
+ "ocaml-syntax-shims"
45
+ ],
46
+ "depends_raw": "\"ocaml\" {>= \"4.04.0\"}\n\"dune\" {>= \"1.8\"}\n\"alcotest\" {with-test & >= \"0.8.1\"}\n\"bigstringaf\"\n\"ppx_let\" {with-test & >= \"v0.14.0\"}\n\"ocaml-syntax-shims\" {build}",
47
+ "install": null,
48
+ "name": "angstrom",
49
+ "source": {
50
+ "archive": "tgz",
51
+ "checksums": [
52
+ "md5=a9e096b4b2b8e4e3bb17d472bbccaad0",
53
+ "sha256=143536fb4d049574c539b9990840615e078ed3dd94e1d24888293f68349a100b"
54
+ ],
55
+ "size": 117544,
56
+ "url": "https://github.com/inhabitedtype/angstrom/archive/0.16.1.tar.gz"
57
+ },
58
+ "version": "0.16.1"
59
+ },
60
+ "arch-x86_64.1": {
61
+ "build": null,
62
+ "depends": [
63
+ "ocaml-base-compiler",
64
+ "host-arch-x86_64"
65
+ ],
66
+ "depends_raw": "(\"ocaml-base-compiler\" {post & >= \"4.13.0~\"} |\n \"ocaml-variants\" {post & >= \"4.13.0~\"})\n\"host-arch-x86_64\" {post}",
67
+ "install": null,
68
+ "name": "arch-x86_64",
69
+ "source": null,
70
+ "version": "1"
71
+ },
72
+ "base-bigarray.base": {
73
+ "build": null,
74
+ "depends": [],
75
+ "depends_raw": null,
76
+ "install": null,
77
+ "name": "base-bigarray",
78
+ "source": null,
79
+ "version": "base"
80
+ },
81
+ "base-bytes.base": {
82
+ "build": null,
83
+ "depends": [
84
+ "ocaml",
85
+ "ocamlfind"
86
+ ],
87
+ "depends_raw": "\"ocaml\" {>= \"4.02.0\"} \"ocamlfind\" {>= \"1.5.3\"}",
88
+ "install": null,
89
+ "name": "base-bytes",
90
+ "source": null,
91
+ "version": "base"
92
+ },
93
+ "base-threads.base": {
94
+ "build": null,
95
+ "depends": [],
96
+ "depends_raw": null,
97
+ "install": null,
98
+ "name": "base-threads",
99
+ "source": null,
100
+ "version": "base"
101
+ },
102
+ "base-unix.base": {
103
+ "build": null,
104
+ "depends": [],
105
+ "depends_raw": null,
106
+ "install": null,
107
+ "name": "base-unix",
108
+ "source": null,
109
+ "version": "base"
110
+ },
111
+ "base.v0.16.5": {
112
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
113
+ "depends": [
114
+ "ocaml",
115
+ "sexplib0",
116
+ "dune",
117
+ "dune-configurator"
118
+ ],
119
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"sexplib0\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"dune-configurator\"",
120
+ "install": null,
121
+ "name": "base",
122
+ "source": {
123
+ "archive": "tgz",
124
+ "checksums": [
125
+ "md5=109456ad2350671ad3159cbbca993e3e",
126
+ "sha512=445d08b965e0d559e4046b874f611c8f36de47fa5c23a047146f48ee638588c1b73789a7adb5ead235c0ad2f44b56fd513a6d60bcb8b6c9f11566d32fd7760f2",
127
+ "sha256=e34b3e18b404b5b71db599a35fcf32da463b759867981839670aff8b9e8813bc"
128
+ ],
129
+ "size": 442654,
130
+ "url": "https://github.com/janestreet/base/archive/refs/tags/v0.16.5.tar.gz"
131
+ },
132
+ "version": "v0.16.5"
133
+ },
134
+ "bigstringaf.0.10.0": {
135
+ "build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
136
+ "depends": [
137
+ "dune",
138
+ "dune-configurator",
139
+ "ocaml"
140
+ ],
141
+ "depends_raw": "\"dune\" {>= \"3.0\"}\n\"dune-configurator\" {>= \"3.0\"}\n\"alcotest\" {with-test}\n\"ocaml\" {>= \"4.08.0\"}",
142
+ "install": null,
143
+ "name": "bigstringaf",
144
+ "source": {
145
+ "archive": "tgz",
146
+ "checksums": [
147
+ "sha512=b51c756925d7016ffd7eac49e69393a1897391ca2685a8c30c7b6e3917b4d66c9400b49e8986d0f03329197b95ad52e096ff83dea5e03571cb5bc3d9a5170602",
148
+ "sha256=ed92f5b05fbc11b9defcec734d59b1068f3717a9ae4f9705c16c7f7ac3729f28",
149
+ "md5=be0a44416840852777651150757a0a3b"
150
+ ],
151
+ "size": 12175,
152
+ "url": "https://github.com/inhabitedtype/bigstringaf/archive/0.10.0.tar.gz"
153
+ },
154
+ "version": "0.10.0"
155
+ },
156
+ "cmdliner.2.1.1": {
157
+ "build": "make \"all\" \"PREFIX=%{prefix}%\"",
158
+ "depends": [
159
+ "ocaml"
160
+ ],
161
+ "depends_raw": "\"ocaml\" {>= \"4.08.0\"}",
162
+ "install": "[\n make\n \"install\"\n \"BINDIR=%{_:bin}%\"\n \"LIBDIR=%{_:lib}%\"\n \"DOCDIR=%{_:doc}%\"\n \"SHAREDIR=%{share}%\"\n \"MANDIR=%{man}%\"\n]\n[\n make\n \"install-doc\"\n \"LIBDIR=%{_:lib}%\"\n \"DOCDIR=%{_:doc}%\"\n \"SHAREDIR=%{share}%\"\n \"MANDIR=%{man}%\"\n]",
163
+ "name": "cmdliner",
164
+ "source": {
165
+ "archive": "tbz",
166
+ "checksums": [
167
+ "sha512=cdc338ae2e56a72b7c75dae9564c57cca4e1fbfac454aabbf8303fcb612346284aede5984dfde7e8a7a496cc870bbd57ddf28cab3a38667279b31657f85c15dd",
168
+ "sha256=05b938d1def4f54c478178f1982822834510431ed98f2ac67cb4d90aa120d6b6"
169
+ ],
170
+ "size": 98754,
171
+ "url": "https://erratique.ch/software/cmdliner/releases/cmdliner-2.1.1.tbz"
172
+ },
173
+ "version": "2.1.1"
174
+ },
175
+ "conf-mingw-w64-gcc-i686.1": {
176
+ "build": "[\"i686-w64-mingw32-gcc\" \"--version\"]\n[\n \"sh\"\n \"./install-shim.sh\"\n name\n \"mingw64-i686-binutils mingw64-i686-gcc-core\"\n bin\n \"i686-w64-mingw32-gcc\"\n \"_shim\"\n \"cygpath\" {host-arch-x86_32:installed}\n] {os = \"win32\" & os-distribution = \"cygwin\" & mingw-w64-shims:installed}",
177
+ "depends": [
178
+ "host-arch-x86_64",
179
+ "host-arch-x86_32"
180
+ ],
181
+ "depends_raw": "\"msys2\" {os-distribution = \"msys2\"}\n\"msys2-mingw32\" {os-distribution = \"msys2\"}\n(\"host-arch-x86_64\" | \"host-arch-x86_32\")",
182
+ "install": null,
183
+ "name": "conf-mingw-w64-gcc-i686",
184
+ "source": {
185
+ "archive": "tgz",
186
+ "checksums": [
187
+ "sha256=d29e6141f02500f13534b6a0d77c290f2987c534c660a4f90cdb01618be32507",
188
+ "sha512=892c4b5d7eaab6ce846fe8fe2756f23c61c654605b6c3bf8698db392725b3be81d015536230dc8305e7d17eb451beae5c21f705237523c79cc11e99c17cbed95"
189
+ ],
190
+ "size": 7749,
191
+ "url": "https://github.com/dra27/mingw-w64-shims/archive/refs/tags/1.0.1.tar.gz"
192
+ },
193
+ "version": "1"
194
+ },
195
+ "conf-mingw-w64-gcc-x86_64.1": {
196
+ "build": "[\"x86_64-w64-mingw32-gcc\" \"--version\"]\n[\n \"sh\"\n \"./install-shim.sh\"\n name\n \"mingw64-x86_64-binutils mingw64-x86_64-gcc-core\"\n bin\n \"x86_64-w64-mingw32-gcc\"\n \"shim\"\n \"cygpath\" {host-arch-x86_64:installed}\n] {os = \"win32\" & os-distribution = \"cygwin\" & mingw-w64-shims:installed}",
197
+ "depends": [
198
+ "host-arch-x86_64",
199
+ "host-arch-x86_32"
200
+ ],
201
+ "depends_raw": "\"msys2\" {os-distribution = \"msys2\"}\n\"msys2-mingw64\" {os-distribution = \"msys2\"}\n(\"host-arch-x86_64\" | \"host-arch-x86_32\")",
202
+ "install": null,
203
+ "name": "conf-mingw-w64-gcc-x86_64",
204
+ "source": {
205
+ "archive": "tgz",
206
+ "checksums": [
207
+ "sha256=d29e6141f02500f13534b6a0d77c290f2987c534c660a4f90cdb01618be32507",
208
+ "sha512=892c4b5d7eaab6ce846fe8fe2756f23c61c654605b6c3bf8698db392725b3be81d015536230dc8305e7d17eb451beae5c21f705237523c79cc11e99c17cbed95"
209
+ ],
210
+ "size": 7749,
211
+ "url": "https://github.com/dra27/mingw-w64-shims/archive/refs/tags/1.0.1.tar.gz"
212
+ },
213
+ "version": "1"
214
+ },
215
+ "cppo.1.8.0": {
216
+ "build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test & dune:version < \"3.24\"}\n \"@doc\" {with-doc}\n]",
217
+ "depends": [
218
+ "ocaml",
219
+ "dune",
220
+ "base-unix"
221
+ ],
222
+ "depends_raw": "\"ocaml\" {>= \"4.02.3\"} \"dune\" {>= \"2.0\"} \"base-unix\"",
223
+ "install": null,
224
+ "name": "cppo",
225
+ "source": {
226
+ "archive": "tgz",
227
+ "checksums": [
228
+ "md5=a197cb393b84f6b30e0ff55080ac429b",
229
+ "sha512=3840725b767a0300bdc48f11d26d798bdcae0a764ed6798df3a08dfc8cc76fe124b14a19d47c9b5ea8e229d68b0311510afce77c0e4d9131fbda5116dc2689a2",
230
+ "sha256=6e62a8ee0217c9cc38d5860110eb18eb8d89c05c420353d298e1431fe8bac00f"
231
+ ],
232
+ "size": 43588,
233
+ "url": "https://github.com/ocaml-community/cppo/archive/v1.8.0.tar.gz"
234
+ },
235
+ "version": "1.8.0"
236
+ },
237
+ "csexp.1.5.2": {
238
+ "build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs \"@install\" \"@doc\" {with-doc}]",
239
+ "depends": [
240
+ "dune",
241
+ "ocaml"
242
+ ],
243
+ "depends_raw": "\"dune\" {>= \"3.4\"} \"ocaml\" {>= \"4.03.0\"} \"odoc\" {with-doc}",
244
+ "install": null,
245
+ "name": "csexp",
246
+ "source": {
247
+ "archive": "tbz",
248
+ "checksums": [
249
+ "sha256=1a14dd04bb4379a41990248550628c77913a9c07f3c35c1370b6960e697787ff",
250
+ "sha512=be281018bcfc20d4db14894ef51c4b836d6338d2fdfe22e63d46f405f8dea7349e16f1c0ecd65f73d4c85a2a80e618cdbb8c9dafcbb9f229f04f1adca5b1973c"
251
+ ],
252
+ "size": 11447,
253
+ "url": "https://github.com/ocaml-dune/csexp/releases/download/1.5.2/csexp-1.5.2.tbz"
254
+ },
255
+ "version": "1.5.2"
256
+ },
257
+ "dap.1.0.6": {
258
+ "build": "[\"dune\" \"subst\"] {dev} [\"dune\" \"build\" \"-p\" name \"-j\" jobs]",
259
+ "depends": [
260
+ "ocaml",
261
+ "dune",
262
+ "yojson",
263
+ "ppx_here",
264
+ "ppx_deriving",
265
+ "ppx_deriving_yojson",
266
+ "ppx_expect",
267
+ "lwt",
268
+ "lwt_ppx",
269
+ "lwt_react",
270
+ "react",
271
+ "angstrom",
272
+ "angstrom-lwt-unix",
273
+ "logs"
274
+ ],
275
+ "depends_raw": "\"ocaml\" {>= \"4.08\"}\n\"dune\" {>= \"2.7\"}\n\"yojson\"\n\"ppx_here\"\n\"ppx_deriving\"\n\"ppx_deriving_yojson\"\n\"ppx_expect\"\n\"lwt\"\n\"lwt_ppx\" {>= \"2.0.1\"}\n\"lwt_react\"\n\"react\"\n\"angstrom\"\n\"angstrom-lwt-unix\"\n\"logs\"",
276
+ "install": null,
277
+ "name": "dap",
278
+ "source": {
279
+ "archive": "tbz",
280
+ "checksums": [
281
+ "sha256=e0b249a3e7382125402ad15d71f4924eef60cfcec326383a5168d424087200ff",
282
+ "sha512=97805a383ad03ba24f1dabe20798c139678f958dfa2aed1664098f444aaeefd56d6dd7ff3650800eaefe5b17e09098427b78500316699e7267eb1fef233d6a99"
283
+ ],
284
+ "size": 58908,
285
+ "url": "https://github.com/hackwaly/ocaml-dap/releases/download/1.0.6/dap-1.0.6.tbz"
286
+ },
287
+ "version": "1.0.6"
288
+ },
289
+ "dune-configurator.3.23.1": {
290
+ "build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs \"@install\" \"@doc\" {with-doc}]",
291
+ "depends": [
292
+ "dune",
293
+ "ocaml",
294
+ "base-unix",
295
+ "csexp"
296
+ ],
297
+ "depends_raw": "\"dune\" {>= \"3.23\"}\n\"ocaml\" {>= \"4.14.0\"}\n\"base-unix\"\n\"csexp\" {>= \"1.5.0\"}\n\"odoc\" {with-doc}",
298
+ "install": null,
299
+ "name": "dune-configurator",
300
+ "source": {
301
+ "archive": "tbz",
302
+ "checksums": [
303
+ "sha256=93b4e7157f6ba8feb61cfc5f86008efd2c59037ba78a017d92b4abf30632348f",
304
+ "sha512=e5566bedc651292ae54d47ba1cdbcfff48962012c1436d0f9ece49a71aa10a674affc092058b0edee56ab2a2405c545b78fde1c472c0b4704c8f58570a2f46cd"
305
+ ],
306
+ "size": 2930222,
307
+ "url": "https://github.com/ocaml/dune/releases/download/3.23.1/dune-3.23.1.tbz"
308
+ },
309
+ "version": "3.23.1"
310
+ },
311
+ "dune.3.23.1": {
312
+ "build": "[\"ocaml\" \"boot/bootstrap.ml\" \"-j\" jobs]\n[\n \"./_boot/dune.exe\"\n \"build\"\n \"dune.install\"\n \"--release\"\n \"--profile\"\n \"dune-bootstrap\"\n \"-j\"\n jobs\n]",
313
+ "depends": [
314
+ "ocaml",
315
+ "base-unix",
316
+ "base-threads"
317
+ ],
318
+ "depends_raw": "(\"ocaml\" {>= \"4.14\"} |\n (\"ocaml\" {>= \"4.02\" & < \"4.14~~\"} & \"ocamlfind-secondary\" &\n \"ocaml-secondary-compiler\" {>= \"4.14\"}))\n\"base-unix\"\n\"base-threads\"\n\"lwt\" {with-dev-setup & os != \"win32\"}\n\"cinaps\" {with-dev-setup}\n\"csexp\" {with-dev-setup & >= \"1.3.0\"}\n\"js_of_ocaml\" {with-dev-setup & >= \"6.1.0\" & os != \"win32\"}\n\"js_of_ocaml-compiler\" {with-dev-setup & >= \"6.1.0\" & os != \"win32\"}\n\"mdx\" {with-dev-setup & >= \"2.3.0\" & os != \"win32\"}\n\"menhir\" {with-dev-setup & os != \"win32\"}\n\"ocamlfind\" {with-dev-setup & os != \"win32\"}\n\"odoc\" {with-dev-setup & >= \"2.4.0\" & os != \"win32\"}\n\"ppx_expect\" {with-dev-setup & >= \"v0.17\" & os != \"win32\"}\n\"spawn\" {with-dev-setup}\n\"ppx_inline_test\" {with-dev-setup & os != \"win32\"}\n\"ppxlib\" {with-dev-setup & >= \"0.37.0\" & os != \"win32\"}\n\"ctypes\" {with-dev-setup & os != \"win32\"}\n\"utop\" {with-dev-setup & >= \"2.6.0\" & os != \"win32\"}\n\"melange\" {with-dev-setup & >= \"5.1.0-51\" & os != \"win32\"}\n\"uutf\" {with-dev-setup}\n\"conf-git-daemon\" {with-test}",
319
+ "install": null,
320
+ "name": "dune",
321
+ "source": {
322
+ "archive": "tbz",
323
+ "checksums": [
324
+ "sha256=93b4e7157f6ba8feb61cfc5f86008efd2c59037ba78a017d92b4abf30632348f",
325
+ "sha512=e5566bedc651292ae54d47ba1cdbcfff48962012c1436d0f9ece49a71aa10a674affc092058b0edee56ab2a2405c545b78fde1c472c0b4704c8f58570a2f46cd"
326
+ ],
327
+ "size": 2930222,
328
+ "url": "https://github.com/ocaml/dune/releases/download/3.23.1/dune-3.23.1.tbz"
329
+ },
330
+ "version": "3.23.1"
331
+ },
332
+ "earlybird.1.3.6": {
333
+ "build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
334
+ "depends": [
335
+ "dune",
336
+ "ocaml",
337
+ "ppx_deriving",
338
+ "ppx_deriving_yojson",
339
+ "menhir",
340
+ "menhirLib",
341
+ "ocaml-compiler-libs",
342
+ "ppx_optcomp",
343
+ "iter",
344
+ "lwt",
345
+ "lwt_ppx",
346
+ "lwt_react",
347
+ "cmdliner",
348
+ "logs",
349
+ "fmt",
350
+ "path_glob",
351
+ "sexplib",
352
+ "csexp",
353
+ "lru",
354
+ "dap"
355
+ ],
356
+ "depends_raw": "\"dune\" {>= \"3.7\"}\n\"ocaml\" {>= \"4.12.0\"}\n\"ppx_deriving\" {>= \"5.1\"}\n\"ppx_deriving_yojson\" {>= \"3.6.1\"}\n\"menhir\" {>= \"20201216\" & build}\n\"menhirLib\" {>= \"20201216\"}\n\"ocaml-compiler-libs\" {>= \"v0.12.3\"}\n\"ppx_optcomp\" {>= \"v0.11\"}\n\"iter\" {>= \"1.2.1\"}\n\"lwt\" {>= \"5.4.0\"}\n\"lwt_ppx\" {>= \"2.0.1\"}\n\"lwt_react\" {>= \"1.1.3\"}\n\"cmdliner\" {>= \"1.1.0\"}\n\"logs\" {>= \"0.7.0\"}\n\"fmt\" {>= \"0.8.9\"}\n\"path_glob\" {>= \"0.2\"}\n\"sexplib\" {>= \"v0.14.0\"}\n\"csexp\" {>= \"1.3.2\"}\n\"lru\" {>= \"0.3.0\"}\n\"dap\" {>= \"1.0.6\" & < \"1.1.0\"}\n\"odoc\" {with-doc}",
357
+ "install": null,
358
+ "local": "t",
359
+ "name": "earlybird",
360
+ "source": null,
361
+ "version": "1.3.6"
362
+ },
363
+ "flexdll.0.44": {
364
+ "build": null,
365
+ "depends": [],
366
+ "depends_raw": null,
367
+ "install": null,
368
+ "name": "flexdll",
369
+ "source": {
370
+ "archive": "tgz",
371
+ "checksums": [
372
+ "sha256=b7c6a92286f1f3065324d51083dcb16eec436a4e6e3b8df7cf836b6d7a8b9491",
373
+ "sha512=87c5e38810dcf4bba43472e6c4e2ea25081a92664e37269f782ef9412e81d37d53edbbeb0acbf5eb821cc5105085a99337b30e55409057121a68472eb51db7c8"
374
+ ],
375
+ "size": 74690,
376
+ "url": "https://github.com/ocaml/flexdll/archive/refs/tags/0.44.tar.gz"
377
+ },
378
+ "version": "0.44"
379
+ },
380
+ "fmt.0.11.0": {
381
+ "build": "\"ocaml\"\n\"pkg/pkg.ml\"\n\"build\"\n\"--dev-pkg\"\n\"%{dev}%\"\n\"--with-base-unix\"\n\"%{base-unix:installed}%\"\n\"--with-cmdliner\"\n\"%{cmdliner:installed}%\"",
382
+ "depends": [
383
+ "ocaml",
384
+ "ocamlfind",
385
+ "ocamlbuild",
386
+ "topkg",
387
+ "base-unix",
388
+ "cmdliner"
389
+ ],
390
+ "depends_raw": "\"ocaml\" {>= \"4.08.0\"}\n\"ocamlfind\" {build}\n\"ocamlbuild\" {build}\n\"topkg\" {build & >= \"1.1.0\"}",
391
+ "install": null,
392
+ "name": "fmt",
393
+ "source": {
394
+ "archive": "tbz",
395
+ "checksums": [
396
+ "sha512=3f40155fc6a7315202e410585964307d63416c8001fd243667ed9d8d1a02b67deecacb25e9c2feb409c537bbdfb7817d91168de4ddd643532ff51d6c1c696a4a",
397
+ "sha256=857cfd47a54b52429cd9b3e2665e44173cd1bd3b435bece7172f984ad5376a1b"
398
+ ],
399
+ "size": 23336,
400
+ "url": "https://erratique.ch/software/fmt/releases/fmt-0.11.0.tbz"
401
+ },
402
+ "version": "0.11.0"
403
+ },
404
+ "host-arch-x86_32.1": {
405
+ "build": null,
406
+ "depends": [],
407
+ "depends_raw": null,
408
+ "install": null,
409
+ "name": "host-arch-x86_32",
410
+ "source": null,
411
+ "version": "1"
412
+ },
413
+ "host-arch-x86_64.1": {
414
+ "build": null,
415
+ "depends": [],
416
+ "depends_raw": null,
417
+ "install": null,
418
+ "name": "host-arch-x86_64",
419
+ "source": null,
420
+ "version": "1"
421
+ },
422
+ "host-system-mingw.1": {
423
+ "build": null,
424
+ "depends": [],
425
+ "depends_raw": null,
426
+ "install": null,
427
+ "name": "host-system-mingw",
428
+ "source": null,
429
+ "version": "1"
430
+ },
431
+ "iter.1.9": {
432
+ "build": "[\"dune\" \"build\" \"@install\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"build\" \"@doc\" \"-p\" name \"-j\" jobs] {with-doc}\n[\"dune\" \"runtest\" \"-p\" name \"-j\" jobs]\n {with-test & arch != \"arm32\" & arch != \"x86_32\"}",
433
+ "depends": [
434
+ "ocaml",
435
+ "dune",
436
+ "base-bigarray"
437
+ ],
438
+ "depends_raw": "\"ocaml\" {>= \"4.08.0\"}\n\"dune\" {>= \"2.0\"}\n\"qcheck-core\" {with-test}\n\"ounit2\" {with-test}\n\"mdx\" {with-test & >= \"1.3\"}\n\"odoc\" {with-doc}",
439
+ "install": null,
440
+ "name": "iter",
441
+ "source": {
442
+ "archive": "tbz",
443
+ "checksums": [
444
+ "sha256=dba9e5bb152e0d0db0054c36b2a9476747a284a7738f15f1195a3e2035c7e968",
445
+ "sha512=6c8e0fd57ebca9db642ef6105cb23353fb4f4aa2a37b49ceb61adc9881d0d42e0212326efddea183fae7e27313321680036c3932863004b1853b5fbf37c521de"
446
+ ],
447
+ "size": 34177,
448
+ "url": "https://github.com/c-cube/iter/releases/download/v1.9/iter-1.9.tbz"
449
+ },
450
+ "version": "1.9"
451
+ },
452
+ "jane-street-headers.v0.16.0": {
453
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
454
+ "depends": [
455
+ "ocaml",
456
+ "dune"
457
+ ],
458
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"} \"dune\" {>= \"2.0.0\"}",
459
+ "install": null,
460
+ "name": "jane-street-headers",
461
+ "source": {
462
+ "archive": "tgz",
463
+ "checksums": [
464
+ "sha256=876d409feeb495487b10010fb601c64829d2aa15f1b156b704ec141337d360ea"
465
+ ],
466
+ "size": 4844,
467
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/jane-street-headers-v0.16.0.tar.gz"
468
+ },
469
+ "version": "v0.16.0"
470
+ },
471
+ "jst-config.v0.16.0": {
472
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
473
+ "depends": [
474
+ "ocaml",
475
+ "base",
476
+ "ppx_assert",
477
+ "dune",
478
+ "dune-configurator"
479
+ ],
480
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_assert\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"dune-configurator\"",
481
+ "install": null,
482
+ "name": "jst-config",
483
+ "source": {
484
+ "archive": "tgz",
485
+ "checksums": [
486
+ "sha256=faead56d8582868cdc099ad54f9bae059cc48710b724600cc64013e73c14d95b"
487
+ ],
488
+ "size": 4886,
489
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/jst-config-v0.16.0.tar.gz"
490
+ },
491
+ "version": "v0.16.0"
492
+ },
493
+ "logs.0.10.0": {
494
+ "build": "\"ocaml\"\n\"pkg/pkg.ml\"\n\"build\"\n\"--dev-pkg\"\n\"%{dev}%\"\n\"--with-js_of_ocaml-compiler\"\n\"%{js_of_ocaml-compiler:installed}%\"\n\"--with-fmt\"\n\"%{fmt:installed}%\"\n\"--with-cmdliner\"\n\"%{cmdliner:installed}%\"\n\"--with-lwt\"\n\"%{lwt:installed}%\"\n\"--with-base-threads\"\n\"%{base-threads:installed}%\"",
495
+ "depends": [
496
+ "ocaml",
497
+ "ocamlfind",
498
+ "ocamlbuild",
499
+ "topkg",
500
+ "cmdliner",
501
+ "fmt",
502
+ "lwt",
503
+ "base-threads"
504
+ ],
505
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"ocamlfind\" {build}\n\"ocamlbuild\" {build}\n\"topkg\" {build & >= \"1.1.0\"}\n\"mtime\" {with-test}",
506
+ "install": null,
507
+ "name": "logs",
508
+ "source": {
509
+ "archive": "tbz",
510
+ "checksums": [
511
+ "sha512=122b7a77bd07aee1e0cb8e07e82b195a12528cf015e72fa0dd5afaae26ce04bad9b29f32a6d3bd3547fe522b8a036608785e8adb900e31580a0d555719bbb7e7",
512
+ "sha256=760ec291c128d75b74826091337764f925b5ca414b02e2d336a0b37bf30df4ea"
513
+ ],
514
+ "size": 20044,
515
+ "url": "https://erratique.ch/software/logs/releases/logs-0.10.0.tbz"
516
+ },
517
+ "version": "0.10.0"
518
+ },
519
+ "lru.0.3.1": {
520
+ "build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"runtest\" \"-p\" name] {with-test & ocaml:version >= \"4.07.0\"}",
521
+ "depends": [
522
+ "ocaml",
523
+ "dune",
524
+ "psq"
525
+ ],
526
+ "depends_raw": "\"ocaml\" {>= \"4.03.0\"}\n\"dune\" {>= \"1.7\"}\n\"psq\" {>= \"0.2.0\"}\n\"qcheck-core\" {with-test}\n\"qcheck-alcotest\" {with-test}\n\"alcotest\" {with-test}",
527
+ "install": null,
528
+ "name": "lru",
529
+ "source": {
530
+ "archive": "tbz",
531
+ "checksums": [
532
+ "sha256=6cbe23d27a7d5b244f869c0b88140d47f70f413a6462ef35c0009325d4b236fd",
533
+ "sha512=81144e258d6e488d4677ade91132401b6f8871c72aadf2f1c190c4dee918c71c5df10c4e690c5bf1ab0f364d87989d44aec3695310a3477f6473eb17c1261734"
534
+ ],
535
+ "size": 10201,
536
+ "url": "https://github.com/pqwy/lru/releases/download/v0.3.1/lru-0.3.1.tbz"
537
+ },
538
+ "version": "0.3.1"
539
+ },
540
+ "lwt.5.10.1": {
541
+ "build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"exec\"\n \"-p\"\n name\n \"src/unix/config/discover.exe\"\n \"--\"\n \"--save\"\n \"--use-libev\"\n \"%{conf-libev:installed}%\"\n]\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
542
+ "depends": [
543
+ "dune",
544
+ "ocaml",
545
+ "cppo",
546
+ "ocamlfind",
547
+ "dune-configurator",
548
+ "ocplib-endian",
549
+ "base-threads",
550
+ "base-unix"
551
+ ],
552
+ "depends_raw": "\"dune\" {>= \"3.15\"}\n\"ocaml\" {>= \"4.08\"}\n\"cppo\" {build & >= \"1.1\"}\n\"ocamlfind\" {dev & >= \"1.7.3-1\"}\n\"odoc\" {with-doc & >= \"2.3\"}\n\"dune-configurator\"\n\"ocplib-endian\"",
553
+ "install": null,
554
+ "name": "lwt",
555
+ "source": {
556
+ "archive": "tgz",
557
+ "checksums": [
558
+ "md5=3550f2448bf94379ecd3d480eb8cb070",
559
+ "sha512=361b4fe8b1613683a0cd89fea08d9ae1615f84e771363ba97843c2dda5c3f45b4a4b6c048c8d79fa58d609c45a7e1dfa2b3e9873d02bac82934fd892f8f4fce1",
560
+ "sha256=0086b73b57710a6b80deacb6256daee1cf56e24dcb56eb5a49ce4a4516e1b040"
561
+ ],
562
+ "size": 312834,
563
+ "url": "https://github.com/ocsigen/lwt/archive/refs/tags/5.10.1.tar.gz"
564
+ },
565
+ "version": "5.10.1"
566
+ },
567
+ "lwt_ppx.5.9.1": {
568
+ "build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
569
+ "depends": [
570
+ "dune",
571
+ "ocaml",
572
+ "ppxlib",
573
+ "lwt"
574
+ ],
575
+ "depends_raw": "\"dune\" {>= \"2.7\"}\n\"ocaml\" {>= \"4.08\"}\n\"ppxlib\" {>= \"0.16.0\" & < \"0.36\"}\n\"ppx_let\" {with-test}\n\"lwt\" {>= \"5.7.0\" & < \"6.0.0\"}\n\"odoc\" {with-doc}",
576
+ "install": null,
577
+ "name": "lwt_ppx",
578
+ "source": {
579
+ "archive": "tgz",
580
+ "checksums": [
581
+ "md5=18742da8b8fe3618e3fa700b7a884fe7",
582
+ "sha512=1c51fdb4d0856c89e2df08a1c0095ef28ebd0f613b07b03d0f66501ca5486515562071291e6d0932e57587ed0c9362c8b92c5c9eddb4d2bb2f5e129986b484a7",
583
+ "sha256=03bf4bae6908a947582485c2a0b8f96428f39f97efd540573a613632be56ad2a"
584
+ ],
585
+ "size": 312306,
586
+ "url": "https://github.com/ocsigen/lwt/archive/refs/tags/5.9.1.tar.gz"
587
+ },
588
+ "version": "5.9.1"
589
+ },
590
+ "lwt_react.1.2.0": {
591
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
592
+ "depends": [
593
+ "dune",
594
+ "lwt",
595
+ "ocaml",
596
+ "react",
597
+ "cppo"
598
+ ],
599
+ "depends_raw": "\"dune\" {>= \"1.8.0\"}\n\"lwt\" {>= \"3.0.0\"}\n\"ocaml\" {>= \"4.08\"}\n\"react\" {>= \"1.0.0\"}\n\"cppo\" {build & >= \"1.1.0\"}",
600
+ "install": null,
601
+ "name": "lwt_react",
602
+ "source": {
603
+ "archive": "tgz",
604
+ "checksums": [
605
+ "md5=e63979ee40a80d5b9e9e5545f33323b4",
606
+ "sha512=d616389bc9e0da11f25843ab7541ac2d40c9543700a89455f14115b339bbe58cef2b8acf0ae97fd54e15a4cb93149cfe1ebfda301aa93933045f76b7d9344160",
607
+ "sha256=1bd4ef42e3c98af4581e53553e42bea0f01c560b9959496949a2d95ca9e4e5e1"
608
+ ],
609
+ "size": 315425,
610
+ "url": "https://github.com/ocsigen/lwt/archive/5.6.0.tar.gz"
611
+ },
612
+ "version": "1.2.0"
613
+ },
614
+ "menhir.20260209": {
615
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
616
+ "depends": [
617
+ "ocaml",
618
+ "dune",
619
+ "menhirLib",
620
+ "menhirSdk",
621
+ "menhirCST",
622
+ "menhirGLR"
623
+ ],
624
+ "depends_raw": "\"ocaml\" {>= \"4.08\"}\n\"dune\" {>= \"2.8.0\"}\n\"menhirLib\" {= version}\n\"menhirSdk\" {= version}\n\"menhirCST\" {= version}\n\"menhirGLR\" {= version}",
625
+ "install": null,
626
+ "name": "menhir",
627
+ "source": {
628
+ "archive": "tgz",
629
+ "checksums": [
630
+ "md5=e993231085db95ab011ffe0cd606d9dd",
631
+ "sha512=aafad186f328ae8dd4cc69af0f30c1a0b208cf5148a7a94c150099be03838503c5ec12918de26cd7f794b5a72f114bc1bae8d81058bd0ea10372a3b06818687e",
632
+ "sha256=69f0414b047d1d5b3507eb8277cd328a60d430bdff51de912b47adb2c25de4f3"
633
+ ],
634
+ "size": 1612814,
635
+ "url": "https://gitlab.inria.fr/fpottier/menhir/-/archive/20260209/archive.tar.gz"
636
+ },
637
+ "version": "20260209"
638
+ },
639
+ "menhirCST.20260209": {
640
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
641
+ "depends": [
642
+ "ocaml",
643
+ "dune"
644
+ ],
645
+ "depends_raw": "\"ocaml\" {>= \"4.08\"} \"dune\" {>= \"2.8.0\"}",
646
+ "install": null,
647
+ "name": "menhirCST",
648
+ "source": {
649
+ "archive": "tgz",
650
+ "checksums": [
651
+ "md5=e993231085db95ab011ffe0cd606d9dd",
652
+ "sha512=aafad186f328ae8dd4cc69af0f30c1a0b208cf5148a7a94c150099be03838503c5ec12918de26cd7f794b5a72f114bc1bae8d81058bd0ea10372a3b06818687e",
653
+ "sha256=69f0414b047d1d5b3507eb8277cd328a60d430bdff51de912b47adb2c25de4f3"
654
+ ],
655
+ "size": 1612814,
656
+ "url": "https://gitlab.inria.fr/fpottier/menhir/-/archive/20260209/archive.tar.gz"
657
+ },
658
+ "version": "20260209"
659
+ },
660
+ "menhirGLR.20260209": {
661
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
662
+ "depends": [
663
+ "ocaml",
664
+ "dune"
665
+ ],
666
+ "depends_raw": "\"ocaml\" {>= \"4.08\"} \"dune\" {>= \"2.8.0\"}",
667
+ "install": null,
668
+ "name": "menhirGLR",
669
+ "source": {
670
+ "archive": "tgz",
671
+ "checksums": [
672
+ "md5=e993231085db95ab011ffe0cd606d9dd",
673
+ "sha512=aafad186f328ae8dd4cc69af0f30c1a0b208cf5148a7a94c150099be03838503c5ec12918de26cd7f794b5a72f114bc1bae8d81058bd0ea10372a3b06818687e",
674
+ "sha256=69f0414b047d1d5b3507eb8277cd328a60d430bdff51de912b47adb2c25de4f3"
675
+ ],
676
+ "size": 1612814,
677
+ "url": "https://gitlab.inria.fr/fpottier/menhir/-/archive/20260209/archive.tar.gz"
678
+ },
679
+ "version": "20260209"
680
+ },
681
+ "menhirLib.20260209": {
682
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
683
+ "depends": [
684
+ "ocaml",
685
+ "dune"
686
+ ],
687
+ "depends_raw": "\"ocaml\" {>= \"4.08\"} \"dune\" {>= \"2.8.0\"}",
688
+ "install": null,
689
+ "name": "menhirLib",
690
+ "source": {
691
+ "archive": "tgz",
692
+ "checksums": [
693
+ "md5=e993231085db95ab011ffe0cd606d9dd",
694
+ "sha512=aafad186f328ae8dd4cc69af0f30c1a0b208cf5148a7a94c150099be03838503c5ec12918de26cd7f794b5a72f114bc1bae8d81058bd0ea10372a3b06818687e",
695
+ "sha256=69f0414b047d1d5b3507eb8277cd328a60d430bdff51de912b47adb2c25de4f3"
696
+ ],
697
+ "size": 1612814,
698
+ "url": "https://gitlab.inria.fr/fpottier/menhir/-/archive/20260209/archive.tar.gz"
699
+ },
700
+ "version": "20260209"
701
+ },
702
+ "menhirSdk.20260209": {
703
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
704
+ "depends": [
705
+ "ocaml",
706
+ "dune"
707
+ ],
708
+ "depends_raw": "\"ocaml\" {>= \"4.08\"} \"dune\" {>= \"2.8.0\"}",
709
+ "install": null,
710
+ "name": "menhirSdk",
711
+ "source": {
712
+ "archive": "tgz",
713
+ "checksums": [
714
+ "md5=e993231085db95ab011ffe0cd606d9dd",
715
+ "sha512=aafad186f328ae8dd4cc69af0f30c1a0b208cf5148a7a94c150099be03838503c5ec12918de26cd7f794b5a72f114bc1bae8d81058bd0ea10372a3b06818687e",
716
+ "sha256=69f0414b047d1d5b3507eb8277cd328a60d430bdff51de912b47adb2c25de4f3"
717
+ ],
718
+ "size": 1612814,
719
+ "url": "https://gitlab.inria.fr/fpottier/menhir/-/archive/20260209/archive.tar.gz"
720
+ },
721
+ "version": "20260209"
722
+ },
723
+ "num.1.6": {
724
+ "build": "[\n make\n \"PROFILE=release\"\n \"opam-legacy\" {!ocaml:preinstalled & ocaml:version < \"5.0.0~~\"}\n \"opam-modern\" {ocaml:preinstalled | ocaml:version >= \"5.0.0~~\"}\n]\n[make \"test\"] {with-test}",
725
+ "depends": [
726
+ "ocaml"
727
+ ],
728
+ "depends_raw": "\"ocaml\" {>= \"4.06.0\"}",
729
+ "install": null,
730
+ "name": "num",
731
+ "source": {
732
+ "archive": "tgz",
733
+ "checksums": [
734
+ "sha256=b5cce325449aac746d5ca963d84688a627cca5b38d41e636cf71c68b60495b3e",
735
+ "sha512=5cb32dfa9a9f0ad375bfd89079e9b1422979f3c089f61ef2300ad9cc64fb1fc25ed1f86b0267eb017f12ae41a574a959df5bfa39ab22c2be2f1ac84c3c671bdf"
736
+ ],
737
+ "size": 67748,
738
+ "url": "https://github.com/ocaml/num/archive/refs/tags/v1.6.tar.gz"
739
+ },
740
+ "version": "1.6"
741
+ },
742
+ "ocaml-base-compiler.4.14.3": {
743
+ "build": "[\n \"./configure\"\n \"--host=x86_64-pc-windows\" {system-msvc:installed & arch-x86_64:installed}\n \"--host=x86_64-w64-mingw32\"\n {os-distribution = \"cygwin\" & system-mingw:installed &\n arch-x86_64:installed}\n \"--host=i686-pc-windows\" {system-msvc:installed & arch-x86_32:installed}\n \"--host=i686-w64-mingw32\"\n {os-distribution = \"cygwin\" & system-mingw:installed &\n arch-x86_32:installed}\n \"--prefix=%{prefix}%\"\n \"--docdir=%{doc}%/ocaml\"\n \"--with-flexdll=%{flexdll:share}%\" {os = \"win32\" & flexdll:installed}\n \"-C\"\n \"CC=cc\" {os = \"openbsd\" | os = \"macos\"}\n \"ASPP=cc -c\" {os = \"openbsd\" | os = \"macos\"}\n]\n[make \"-j%{jobs}%\"]",
744
+ "depends": [
745
+ "ocaml",
746
+ "base-unix",
747
+ "base-bigarray",
748
+ "base-threads",
749
+ "arch-x86_64",
750
+ "system-mingw",
751
+ "ocaml-options-vanilla",
752
+ "flexdll"
753
+ ],
754
+ "depends_raw": "\"ocaml\" {= \"4.14.3\" & post}\n\"base-unix\" {post}\n\"base-bigarray\" {post}\n\"base-threads\" {post}\n((\"arch-x86_64\" {os = \"win32\" & arch = \"x86_64\"} &\n (\"system-mingw\" | \"system-msvc\")) |\n (\"arch-x86_32\" {os = \"win32\"} & (\"system-mingw\" | \"system-msvc\")) |\n \"base-unix\" {os != \"win32\" & post})\n\"ocaml-options-vanilla\" {post}\n\"flexdll\" {>= \"0.36\" & os = \"win32\"}",
755
+ "install": "make \"install\"",
756
+ "name": "ocaml-base-compiler",
757
+ "source": {
758
+ "archive": "tgz",
759
+ "checksums": [
760
+ "sha256=e510689183b2d62b0a7513ea7e47be80ddb9173377a2df436dbc1ca927a64689"
761
+ ],
762
+ "size": 5513909,
763
+ "url": "https://github.com/ocaml/ocaml/archive/4.14.3.tar.gz"
764
+ },
765
+ "version": "4.14.3"
766
+ },
767
+ "ocaml-compiler-libs.v0.12.4": {
768
+ "build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
769
+ "depends": [
770
+ "dune",
771
+ "ocaml"
772
+ ],
773
+ "depends_raw": "\"dune\" {>= \"2.8\"} \"ocaml\" {>= \"4.04.1\" & < \"5.2.0\"} \"odoc\" {with-doc}",
774
+ "install": null,
775
+ "name": "ocaml-compiler-libs",
776
+ "source": {
777
+ "archive": "tbz",
778
+ "checksums": [
779
+ "sha256=4ec9c9ec35cc45c18c7a143761154ef1d7663036a29297f80381f47981a07760",
780
+ "sha512=978dba8dfa61f98fa24fda7a9c26c2e837081f37d1685fe636dc19cfc3278a940cf01a10293504b185c406706bc1008bc54313d50f023bcdea6d5ac6c0788b35"
781
+ ],
782
+ "size": 5160,
783
+ "url": "https://github.com/janestreet/ocaml-compiler-libs/releases/download/v0.12.4/ocaml-compiler-libs-v0.12.4.tbz"
784
+ },
785
+ "version": "v0.12.4"
786
+ },
787
+ "ocaml-config.2": {
788
+ "build": null,
789
+ "depends": [
790
+ "ocaml-base-compiler"
791
+ ],
792
+ "depends_raw": "\"ocaml-base-compiler\" {>= \"4.12.0~\"} | \"ocaml-variants\" {>= \"4.12.0~\"} |\n\"ocaml-system\" {>= \"4.12.0~\"}",
793
+ "install": null,
794
+ "name": "ocaml-config",
795
+ "source": null,
796
+ "version": "2"
797
+ },
798
+ "ocaml-config.3": {
799
+ "build": null,
800
+ "depends": [
801
+ "ocaml-base-compiler"
802
+ ],
803
+ "depends_raw": "\"ocaml-base-compiler\" {>= \"5.0.0~\" | os = \"win32\"} |\n\"ocaml-variants\" {>= \"5.0.0~\" | os = \"win32\"} |\n\"ocaml-system\" {>= \"5.0.0~\" | os = \"win32\"} |\n\"dkml-base-compiler\" {>= \"4.12.0~\"}",
804
+ "install": null,
805
+ "name": "ocaml-config",
806
+ "source": null,
807
+ "version": "3"
808
+ },
809
+ "ocaml-env-mingw32.1": {
810
+ "build": null,
811
+ "depends": [
812
+ "host-system-mingw",
813
+ "host-arch-x86_32",
814
+ "conf-mingw-w64-gcc-i686"
815
+ ],
816
+ "depends_raw": "\"host-system-mingw\"\n\"host-arch-x86_32\"\n\"conf-mingw-w64-gcc-i686\"\n\"mingw-w64-shims\" {os-distribution = \"cygwin\"}",
817
+ "install": null,
818
+ "name": "ocaml-env-mingw32",
819
+ "source": null,
820
+ "version": "1"
821
+ },
822
+ "ocaml-env-mingw64.1": {
823
+ "build": null,
824
+ "depends": [
825
+ "host-system-mingw",
826
+ "host-arch-x86_64",
827
+ "conf-mingw-w64-gcc-x86_64"
828
+ ],
829
+ "depends_raw": "\"host-system-mingw\"\n\"host-arch-x86_64\"\n\"conf-mingw-w64-gcc-x86_64\"\n\"mingw-w64-shims\" {os-distribution = \"cygwin\"}",
830
+ "install": null,
831
+ "name": "ocaml-env-mingw64",
832
+ "source": null,
833
+ "version": "1"
834
+ },
835
+ "ocaml-options-vanilla.1": {
836
+ "build": null,
837
+ "depends": [
838
+ "ocaml-base-compiler"
839
+ ],
840
+ "depends_raw": "\"ocaml-base-compiler\" {post} | \"ocaml-system\" {post} |\n\"ocaml-variants\" {post & >= \"4.12.0~\"}",
841
+ "install": null,
842
+ "name": "ocaml-options-vanilla",
843
+ "source": null,
844
+ "version": "1"
845
+ },
846
+ "ocaml-syntax-shims.1.0.0": {
847
+ "build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
848
+ "depends": [
849
+ "dune",
850
+ "ocaml"
851
+ ],
852
+ "depends_raw": "\"dune\" {>= \"2.0\"} \"ocaml\" {>= \"4.02.3\"}",
853
+ "install": null,
854
+ "name": "ocaml-syntax-shims",
855
+ "source": {
856
+ "archive": "tbz",
857
+ "checksums": [
858
+ "sha256=89b2e193e90a0c168b6ec5ddf6fef09033681bdcb64e11913c97440a2722e8c8",
859
+ "sha512=75c4c6b0bfa1267a8a49a82ba494d08cf0823fc8350863d6d3d4971528cb09e5a2a29e2981d04c75e76ad0f49360b05a432c9efeff9a4fbc1ec6b28960399852"
860
+ ],
861
+ "size": 5435,
862
+ "url": "https://github.com/ocaml-ppx/ocaml-syntax-shims/releases/download/1.0.0/ocaml-syntax-shims-1.0.0.tbz"
863
+ },
864
+ "version": "1.0.0"
865
+ },
866
+ "ocaml.4.14.3": {
867
+ "build": "\"ocaml\" \"%{ocaml-config:share}%/gen_ocaml_config.ml\" _:version _:name",
868
+ "depends": [
869
+ "ocaml-config",
870
+ "ocaml-base-compiler",
871
+ "ocaml-env-mingw64",
872
+ "ocaml-env-mingw32"
873
+ ],
874
+ "depends_raw": "\"ocaml-config\" {>= \"2\"}\n\"ocaml-base-compiler\" {>= \"4.14.3~\" & < \"4.14.4~\"} |\n\"ocaml-variants\" {>= \"4.14.3~\" & < \"4.14.4~\"} |\n\"ocaml-system\" {>= \"4.14.3\" & < \"4.14.4~\"} |\n\"dkml-base-compiler\" {>= \"4.14.3~\" & < \"4.14.4~\"}\n(\"ocaml-env-mingw64\" {os = \"win32\"} | \"ocaml-env-mingw32\" {os = \"win32\"} |\n \"ocaml-env-msvc64\" {os = \"win32\"} |\n \"ocaml-env-msvc32\" {os = \"win32\"})",
875
+ "install": null,
876
+ "name": "ocaml",
877
+ "source": null,
878
+ "version": "4.14.3"
879
+ },
880
+ "ocamlbuild.0.16.1": {
881
+ "build": "[\n make\n \"-f\"\n \"configure.make\"\n \"all\"\n \"OCAMLBUILD_PREFIX=%{prefix}%\"\n \"OCAMLBUILD_BINDIR=%{bin}%\"\n \"OCAMLBUILD_LIBDIR=%{lib}%\"\n \"OCAMLBUILD_MANDIR=%{man}%\"\n \"OCAML_NATIVE=%{ocaml:native}%\"\n \"OCAML_NATIVE_TOOLS=%{ocaml:native}%\"\n]\n[make \"check-if-preinstalled\" \"all\" \"opam-install\"]",
882
+ "depends": [
883
+ "ocaml"
884
+ ],
885
+ "depends_raw": "\"ocaml\" {>= \"4.08\"} \"ocamlfind\" {with-test} \"menhirLib\" {with-test}",
886
+ "install": null,
887
+ "name": "ocamlbuild",
888
+ "source": {
889
+ "archive": "tgz",
890
+ "checksums": [
891
+ "sha512=e918b9a0081f271e507c7a4f4d5d5a7cdf818ca51c52acec1bac85ddad5f6cad078cb3c568252fbcf5401c2d75323ed8f50fdd881bda1c9632840320408393ae",
892
+ "sha256=2ba6857f2991b7f69368e8db818b163d31cf5a367f15f5953bf8f01a77b3d4fc"
893
+ ],
894
+ "size": 202416,
895
+ "url": "https://github.com/ocaml/ocamlbuild/archive/refs/tags/0.16.1.tar.gz"
896
+ },
897
+ "version": "0.16.1"
898
+ },
899
+ "ocamlfind.1.9.8": {
900
+ "build": "[\n \"./configure\"\n \"-bindir\"\n bin\n \"-sitelib\"\n lib\n \"-mandir\"\n man\n \"-config\"\n \"%{lib}%/findlib.conf\"\n \"-no-custom\"\n \"-no-camlp4\" {!ocaml:preinstalled & ocaml:version >= \"4.02.0\"}\n \"-no-topfind\" {ocaml:preinstalled}\n]\n[make \"all\"]\n[make \"opt\"] {ocaml:native}",
901
+ "depends": [
902
+ "ocaml"
903
+ ],
904
+ "depends_raw": "\"ocaml\"\n {>= \"3.08.0\" & (os != \"cygwin\" & os-distribution != \"msys2\" | < \"5.0\") &\n < \"5.5.0~\"}",
905
+ "install": "[make \"install\"]\n[\"install\" \"-m\" \"0755\" \"ocaml-stub\" \"%{bin}%/ocaml\"] {ocaml:preinstalled}",
906
+ "name": "ocamlfind",
907
+ "source": {
908
+ "archive": "tgz",
909
+ "checksums": [
910
+ "md5=ca770e5806032a96131b670f6e07f146",
911
+ "sha512=8967986de2ab4ec5993f437b0a4206742adf37aa7a292a3bba0a04438d78539b84d001191e60b2d5bde98a695b38cba2593b7051f7749adbdb964a0df3c4b661",
912
+ "sha256=d6899935ccabf67f067a9af3f3f88d94e310075d13c648fa03ff498769ce039d"
913
+ ],
914
+ "size": 169953,
915
+ "url": "https://github.com/ocaml/ocamlfind/archive/refs/tags/findlib-1.9.8.tar.gz"
916
+ },
917
+ "version": "1.9.8"
918
+ },
919
+ "ocplib-endian.1.2": {
920
+ "build": "\"dune\"\n\"build\"\n\"-p\"\nname\n\"-j\"\njobs\n\"@install\"\n\"@runtest\" {with-test}\n\"@doc\" {with-doc}",
921
+ "depends": [
922
+ "base-bytes",
923
+ "ocaml",
924
+ "cppo",
925
+ "dune"
926
+ ],
927
+ "depends_raw": "\"base-bytes\"\n\"ocaml\" {>= \"4.03.0\"}\n\"cppo\" {>= \"1.1.0\" & build}\n\"dune\" {>= \"1.0\"}",
928
+ "install": null,
929
+ "name": "ocplib-endian",
930
+ "source": {
931
+ "archive": "tgz",
932
+ "checksums": [
933
+ "md5=8d5492eeb7c6815ade72a7415ea30949",
934
+ "sha512=2e70be5f3d6e377485c60664a0e235c3b9b24a8d6b6a03895d092c6e40d53810bfe1f292ee69e5181ce6daa8a582bfe3d59f3af889f417134f658812be5b8b85",
935
+ "sha256=97ae74e8aeead46a0475df14af637ce78e2372c07258619ad8967506f2d4b320"
936
+ ],
937
+ "size": 18061,
938
+ "url": "https://github.com/OCamlPro/ocplib-endian/archive/refs/tags/1.2.tar.gz"
939
+ },
940
+ "version": "1.2"
941
+ },
942
+ "parsexp.v0.16.0": {
943
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
944
+ "depends": [
945
+ "ocaml",
946
+ "sexplib0",
947
+ "dune"
948
+ ],
949
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"} \"sexplib0\" {>= \"v0.16\" & < \"v0.17\"} \"dune\" {>= \"2.0.0\"}",
950
+ "install": null,
951
+ "name": "parsexp",
952
+ "source": {
953
+ "archive": "tgz",
954
+ "checksums": [
955
+ "sha256=b6e2572c8e6191a85cb8f9c3276ed87fe00522c81ba7a268179fb08185e55e12"
956
+ ],
957
+ "size": 56796,
958
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/parsexp-v0.16.0.tar.gz"
959
+ },
960
+ "version": "v0.16.0"
961
+ },
962
+ "path_glob.0.3": {
963
+ "build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
964
+ "depends": [
965
+ "ocaml",
966
+ "dune"
967
+ ],
968
+ "depends_raw": "\"ocaml\" {>= \"4.03\"} \"dune\" {>= \"2.7\"} \"odoc\" {with-doc}",
969
+ "install": null,
970
+ "name": "path_glob",
971
+ "source": {
972
+ "archive": "tgz",
973
+ "checksums": [
974
+ "sha256=332dae23b700fa050d1fd6e4f3d2e24b8dd1db2c8ea4f76c54e2e54851c9d226",
975
+ "sha512=205b0bbdf0d36b21e978603e4df264a0b185f3c1e3a20764fb254368977977d076a5b9c53b88110b721651d43a782e45742b14891412460101fb5fa8a5986173"
976
+ ],
977
+ "size": 18313,
978
+ "url": "https://gasche.gitlab.io/path_glob/releases/path_glob-0.3.tgz"
979
+ },
980
+ "version": "0.3"
981
+ },
982
+ "ppx_assert.v0.16.0": {
983
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
984
+ "depends": [
985
+ "ocaml",
986
+ "base",
987
+ "ppx_cold",
988
+ "ppx_compare",
989
+ "ppx_here",
990
+ "ppx_sexp_conv",
991
+ "dune",
992
+ "ppxlib"
993
+ ],
994
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_cold\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_compare\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_here\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_sexp_conv\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
995
+ "install": null,
996
+ "name": "ppx_assert",
997
+ "source": {
998
+ "archive": "tgz",
999
+ "checksums": [
1000
+ "sha256=57dc6e241827eb1d5112c958f2f682ddd0addf5a8e9d589f5361ec2669883fd5"
1001
+ ],
1002
+ "size": 7342,
1003
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_assert-v0.16.0.tar.gz"
1004
+ },
1005
+ "version": "v0.16.0"
1006
+ },
1007
+ "ppx_base.v0.16.0": {
1008
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1009
+ "depends": [
1010
+ "ocaml",
1011
+ "ppx_cold",
1012
+ "ppx_compare",
1013
+ "ppx_enumerate",
1014
+ "ppx_globalize",
1015
+ "ppx_hash",
1016
+ "ppx_sexp_conv",
1017
+ "dune",
1018
+ "ppxlib"
1019
+ ],
1020
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"ppx_cold\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_compare\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_enumerate\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_globalize\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_hash\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_sexp_conv\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
1021
+ "install": null,
1022
+ "name": "ppx_base",
1023
+ "source": {
1024
+ "archive": "tgz",
1025
+ "checksums": [
1026
+ "sha256=64835763153d3262a2fa56cf307a351ebfd10cedf504c488ab3bb93f3d9569a3"
1027
+ ],
1028
+ "size": 2928,
1029
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_base-v0.16.0.tar.gz"
1030
+ },
1031
+ "version": "v0.16.0"
1032
+ },
1033
+ "ppx_cold.v0.16.0": {
1034
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1035
+ "depends": [
1036
+ "ocaml",
1037
+ "base",
1038
+ "dune",
1039
+ "ppxlib"
1040
+ ],
1041
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
1042
+ "install": null,
1043
+ "name": "ppx_cold",
1044
+ "source": {
1045
+ "archive": "tgz",
1046
+ "checksums": [
1047
+ "sha256=803bdb583b501aa246d8ae34be0c16b892d8ae96852bb593f3e355232e6aa4da"
1048
+ ],
1049
+ "size": 3749,
1050
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_cold-v0.16.0.tar.gz"
1051
+ },
1052
+ "version": "v0.16.0"
1053
+ },
1054
+ "ppx_compare.v0.16.0": {
1055
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1056
+ "depends": [
1057
+ "ocaml",
1058
+ "base",
1059
+ "dune",
1060
+ "ppxlib"
1061
+ ],
1062
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
1063
+ "install": null,
1064
+ "name": "ppx_compare",
1065
+ "source": {
1066
+ "archive": "tgz",
1067
+ "checksums": [
1068
+ "sha256=7ac1dd852e62de6c4b6a879b8bd962c0167db822c39e8c972c8a6af4c48f26aa"
1069
+ ],
1070
+ "size": 13953,
1071
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_compare-v0.16.0.tar.gz"
1072
+ },
1073
+ "version": "v0.16.0"
1074
+ },
1075
+ "ppx_derivers.1.2.1": {
1076
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1077
+ "depends": [
1078
+ "ocaml",
1079
+ "dune"
1080
+ ],
1081
+ "depends_raw": "\"ocaml\" \"dune\"",
1082
+ "install": null,
1083
+ "name": "ppx_derivers",
1084
+ "source": {
1085
+ "archive": "tgz",
1086
+ "checksums": [
1087
+ "sha256=b6595ee187dea792b31fc54a0e1524ab1e48bc6068d3066c45215a138cc73b95",
1088
+ "md5=5dc2bf130c1db3c731fe0fffc5648b41"
1089
+ ],
1090
+ "size": 2530,
1091
+ "url": "https://github.com/ocaml-ppx/ppx_derivers/archive/1.2.1.tar.gz"
1092
+ },
1093
+ "version": "1.2.1"
1094
+ },
1095
+ "ppx_deriving.6.0.3": {
1096
+ "build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"runtest\" \"-p\" name \"-j\" jobs] {with-test}\n[\"dune\" \"build\" \"@doc\" \"-p\" name \"-j\" jobs] {with-doc}",
1097
+ "depends": [
1098
+ "ocaml",
1099
+ "dune",
1100
+ "cppo",
1101
+ "ocamlfind",
1102
+ "ppx_derivers",
1103
+ "ppxlib"
1104
+ ],
1105
+ "depends_raw": "\"ocaml\" {>= \"4.05.0\" & < \"5.4\"}\n\"dune\" {>= \"1.6.3\"}\n\"cppo\" {>= \"1.1.0\" & build}\n\"ocamlfind\"\n\"ppx_derivers\"\n\"ppxlib\" {>= \"0.32.0\" & < \"0.36.0\"}\n\"ounit2\" {with-test}",
1106
+ "install": null,
1107
+ "name": "ppx_deriving",
1108
+ "source": {
1109
+ "archive": "tbz",
1110
+ "checksums": [
1111
+ "sha256=374aa97b32c5e01c09a97810a48bfa218c213b5b649e4452101455ac19c94a6d",
1112
+ "sha512=971443a5df0acbdad577360deed8c9af137695bec6d826ef517a382941371f3546aef53456dda7c89d0ed30fefadf45d5dae2a8b1940a75aee7f7382c68cedb0"
1113
+ ],
1114
+ "size": 42216,
1115
+ "url": "https://github.com/ocaml-ppx/ppx_deriving/releases/download/v6.0.3/ppx_deriving-6.0.3.tbz"
1116
+ },
1117
+ "version": "6.0.3"
1118
+ },
1119
+ "ppx_deriving_yojson.3.9.1": {
1120
+ "build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"runtest\" \"-p\" name \"-j\" jobs] {with-test}",
1121
+ "depends": [
1122
+ "ocaml",
1123
+ "dune",
1124
+ "yojson",
1125
+ "ppx_deriving",
1126
+ "ppxlib"
1127
+ ],
1128
+ "depends_raw": "\"ocaml\" {>= \"4.05.0\"}\n\"dune\" {>= \"1.0\"}\n\"yojson\" {>= \"1.6.0\"}\n\"yojson\" {with-test & < \"3\"}\n\"ppx_deriving\" {>= \"5.1\"}\n\"ppxlib\" {>= \"0.30.0\" & < \"0.36.0\"}\n\"ounit2\" {with-test}",
1129
+ "install": null,
1130
+ "name": "ppx_deriving_yojson",
1131
+ "source": {
1132
+ "archive": "tbz",
1133
+ "checksums": [
1134
+ "sha256=6a3ef7c7bb381f57448853f2a6d2287cf623628162a979587d1e8f7502114f4d",
1135
+ "sha512=df919be7c023cb9ff1b832de333f8d158e88746b4cc33ea5dcf511c64aba186628015b6ca29a0310642531e0640d79834d64b99d542a624168154a11736489a0"
1136
+ ],
1137
+ "size": 20091,
1138
+ "url": "https://github.com/ocaml-ppx/ppx_deriving_yojson/releases/download/v3.9.1/ppx_deriving_yojson-3.9.1.tbz"
1139
+ },
1140
+ "version": "3.9.1"
1141
+ },
1142
+ "ppx_enumerate.v0.16.0": {
1143
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1144
+ "depends": [
1145
+ "ocaml",
1146
+ "base",
1147
+ "dune",
1148
+ "ppxlib"
1149
+ ],
1150
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
1151
+ "install": null,
1152
+ "name": "ppx_enumerate",
1153
+ "source": {
1154
+ "archive": "tgz",
1155
+ "checksums": [
1156
+ "sha256=2832635d6d9ac4c63d48ed51d72745cd8a548e226a6110909d5a412d40ef9953"
1157
+ ],
1158
+ "size": 9339,
1159
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_enumerate-v0.16.0.tar.gz"
1160
+ },
1161
+ "version": "v0.16.0"
1162
+ },
1163
+ "ppx_expect.v0.16.0": {
1164
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1165
+ "depends": [
1166
+ "ocaml",
1167
+ "base",
1168
+ "ppx_here",
1169
+ "ppx_inline_test",
1170
+ "stdio",
1171
+ "dune",
1172
+ "ppxlib",
1173
+ "re"
1174
+ ],
1175
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_here\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_inline_test\" {>= \"v0.16\" & < \"v0.17\"}\n\"stdio\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\" & < \"0.36.0\"}\n\"re\" {>= \"1.8.0\"}",
1176
+ "install": null,
1177
+ "name": "ppx_expect",
1178
+ "source": {
1179
+ "archive": "tgz",
1180
+ "checksums": [
1181
+ "sha256=e0795a0ae2d576758aaaa685440951b28fe75d072d88f5c6bf415fb1a44e423c"
1182
+ ],
1183
+ "size": 48328,
1184
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_expect-v0.16.0.tar.gz"
1185
+ },
1186
+ "version": "v0.16.0"
1187
+ },
1188
+ "ppx_expect.v0.16.2": {
1189
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1190
+ "depends": [
1191
+ "ocaml",
1192
+ "base",
1193
+ "ppx_here",
1194
+ "ppx_inline_test",
1195
+ "stdio",
1196
+ "dune",
1197
+ "ppxlib",
1198
+ "re"
1199
+ ],
1200
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_here\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_inline_test\" {>= \"v0.16\" & < \"v0.17\"}\n\"stdio\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}\n\"re\" {>= \"1.8.0\"}",
1201
+ "install": null,
1202
+ "name": "ppx_expect",
1203
+ "source": {
1204
+ "archive": "tgz",
1205
+ "checksums": [
1206
+ "md5=99759b6592f5f3e6207af78884b1f3e5",
1207
+ "sha512=1f1adf2bea04da27e6a2b1b3d2fe07773aed7043f83008018e724fc2c0334ac0e3c962f43fca53394e7954f40083539ad5108ac5aa945d2d6b65f99c7a4ee513",
1208
+ "sha256=1fc15e3842d7544e35a54a902520b146ef299cfee8956db4c300dadbfa71c706"
1209
+ ],
1210
+ "size": 48495,
1211
+ "url": "https://github.com/janestreet/ppx_expect/archive/refs/tags/v0.16.2.tar.gz"
1212
+ },
1213
+ "version": "v0.16.2"
1214
+ },
1215
+ "ppx_globalize.v0.16.0": {
1216
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1217
+ "depends": [
1218
+ "ocaml",
1219
+ "base",
1220
+ "dune",
1221
+ "ppxlib"
1222
+ ],
1223
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\" & < \"0.36.0\"}",
1224
+ "install": null,
1225
+ "name": "ppx_globalize",
1226
+ "source": {
1227
+ "archive": "tgz",
1228
+ "checksums": [
1229
+ "sha256=9068d7b4b765112974b17dd354cadf007f044afb11d2f99cd45b2e3b99ab491b"
1230
+ ],
1231
+ "size": 8266,
1232
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_globalize-v0.16.0.tar.gz"
1233
+ },
1234
+ "version": "v0.16.0"
1235
+ },
1236
+ "ppx_hash.v0.16.0": {
1237
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1238
+ "depends": [
1239
+ "ocaml",
1240
+ "base",
1241
+ "ppx_compare",
1242
+ "ppx_sexp_conv",
1243
+ "dune",
1244
+ "ppxlib"
1245
+ ],
1246
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_compare\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_sexp_conv\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
1247
+ "install": null,
1248
+ "name": "ppx_hash",
1249
+ "source": {
1250
+ "archive": "tgz",
1251
+ "checksums": [
1252
+ "sha256=9b012546b7b9278bfd536f802fb6da88a11ebb5340d8aa47e9bf49acbf13b6e5"
1253
+ ],
1254
+ "size": 28570,
1255
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_hash-v0.16.0.tar.gz"
1256
+ },
1257
+ "version": "v0.16.0"
1258
+ },
1259
+ "ppx_here.v0.16.0": {
1260
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1261
+ "depends": [
1262
+ "ocaml",
1263
+ "base",
1264
+ "dune",
1265
+ "ppxlib"
1266
+ ],
1267
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\"}",
1268
+ "install": null,
1269
+ "name": "ppx_here",
1270
+ "source": {
1271
+ "archive": "tgz",
1272
+ "checksums": [
1273
+ "sha256=278198b92500c306fab3411e3dede264d678f203eb3295dd8dd79b70ed9273f0"
1274
+ ],
1275
+ "size": 4964,
1276
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_here-v0.16.0.tar.gz"
1277
+ },
1278
+ "version": "v0.16.0"
1279
+ },
1280
+ "ppx_inline_test.v0.16.0": {
1281
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1282
+ "depends": [
1283
+ "ocaml",
1284
+ "base",
1285
+ "time_now",
1286
+ "dune",
1287
+ "ppxlib"
1288
+ ],
1289
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"time_now\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\" & < \"0.36.0\"}",
1290
+ "install": null,
1291
+ "name": "ppx_inline_test",
1292
+ "source": {
1293
+ "archive": "tgz",
1294
+ "checksums": [
1295
+ "sha256=216462f8fe988587d1e90f4a10aeb38664facb6eaeb3df60a32e9fb1a6bfbc67"
1296
+ ],
1297
+ "size": 21826,
1298
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_inline_test-v0.16.0.tar.gz"
1299
+ },
1300
+ "version": "v0.16.0"
1301
+ },
1302
+ "ppx_inline_test.v0.16.1": {
1303
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1304
+ "depends": [
1305
+ "ocaml",
1306
+ "base",
1307
+ "time_now",
1308
+ "dune",
1309
+ "ppxlib"
1310
+ ],
1311
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"time_now\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"3.11.1\"}\n\"ppxlib\" {>= \"0.28.0\" & < \"0.36.0\"}",
1312
+ "install": null,
1313
+ "name": "ppx_inline_test",
1314
+ "source": {
1315
+ "archive": "tgz",
1316
+ "checksums": [
1317
+ "md5=470acc022eb7015862307dad8fe9bcba",
1318
+ "sha512=f82d6d9fe6d84b837d69eb35cc92e2a0b6d0802079437e291aa350b89af1df54a996d6c7843019d488a3afe1e635da070f7ca80595dfdfd8257b2d0722725bf9",
1319
+ "sha256=ea4e61e50529d76774904752f642e18eaf21dfe11844a084b133ccbc41e4295d"
1320
+ ],
1321
+ "size": 21965,
1322
+ "url": "https://github.com/janestreet/ppx_inline_test/archive/refs/tags/v0.16.1.tar.gz"
1323
+ },
1324
+ "version": "v0.16.1"
1325
+ },
1326
+ "ppx_optcomp.v0.16.0": {
1327
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1328
+ "depends": [
1329
+ "ocaml",
1330
+ "base",
1331
+ "stdio",
1332
+ "dune",
1333
+ "ppxlib"
1334
+ ],
1335
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"stdio\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\" & < \"0.36.0\"}",
1336
+ "install": null,
1337
+ "name": "ppx_optcomp",
1338
+ "source": {
1339
+ "archive": "tgz",
1340
+ "checksums": [
1341
+ "sha256=99b209084a5375dafce4c6b128979661ab2ab6bf898a6872d596e65ded590ba2"
1342
+ ],
1343
+ "size": 16720,
1344
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_optcomp-v0.16.0.tar.gz"
1345
+ },
1346
+ "version": "v0.16.0"
1347
+ },
1348
+ "ppx_sexp_conv.v0.16.0": {
1349
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1350
+ "depends": [
1351
+ "ocaml",
1352
+ "base",
1353
+ "sexplib0",
1354
+ "dune",
1355
+ "ppxlib"
1356
+ ],
1357
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"sexplib0\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"ppxlib\" {>= \"0.28.0\" & < \"0.36.0\"}",
1358
+ "install": null,
1359
+ "name": "ppx_sexp_conv",
1360
+ "source": {
1361
+ "archive": "tgz",
1362
+ "checksums": [
1363
+ "sha256=41bcb7a3b33bdf50428408bfaf1dbcede528a488ac8c436ce710681bcd91200d"
1364
+ ],
1365
+ "size": 66899,
1366
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/ppx_sexp_conv-v0.16.0.tar.gz"
1367
+ },
1368
+ "version": "v0.16.0"
1369
+ },
1370
+ "ppxlib.0.35.0": {
1371
+ "build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
1372
+ "depends": [
1373
+ "dune",
1374
+ "ocaml",
1375
+ "ocaml-compiler-libs",
1376
+ "ppx_derivers",
1377
+ "sexplib0",
1378
+ "stdlib-shims"
1379
+ ],
1380
+ "depends_raw": "\"dune\" {>= \"3.8\"}\n\"ocaml\" {>= \"4.08.0\" & < \"5.4.0\"}\n\"ocaml-compiler-libs\" {>= \"v0.11.0\"}\n\"ppx_derivers\" {>= \"1.0\"}\n\"sexplib0\" {>= \"v0.12\"}\n\"sexplib0\" {with-test & >= \"v0.15\"}\n\"stdlib-shims\"\n\"ocamlfind\" {with-test}\n\"re\" {with-test & >= \"1.9.0\"}\n\"cinaps\" {with-test & >= \"v0.12.1\"}\n\"ocamlformat\" {with-dev-setup & = \"0.26.2\"}\n\"odoc\" {with-doc}",
1381
+ "install": null,
1382
+ "name": "ppxlib",
1383
+ "source": {
1384
+ "archive": "tbz",
1385
+ "checksums": [
1386
+ "sha256=d9d959fc9f84260487e45684dc741898a92fc5506b61a7f5cac65d21832db925",
1387
+ "sha512=e428b1e3b89261c7efdaa18016264d1afbf067cb9b0d41124b04796c2487ac7ca8ee9a24a60d56f20d1774cb44aaa9ecf1512f17455812ba8d62d4ef93616ee7"
1388
+ ],
1389
+ "size": 390303,
1390
+ "url": "https://github.com/ocaml-ppx/ppxlib/releases/download/0.35.0/ppxlib-0.35.0.tbz"
1391
+ },
1392
+ "version": "0.35.0"
1393
+ },
1394
+ "psq.0.2.1": {
1395
+ "build": "[\"dune\" \"subst\"] {dev}\n[\"dune\" \"build\" \"-p\" name \"-j\" jobs]\n[\"dune\" \"runtest\" \"-p\" name] {with-test & ocaml:version >= \"4.07.0\"}",
1396
+ "depends": [
1397
+ "ocaml",
1398
+ "dune",
1399
+ "seq"
1400
+ ],
1401
+ "depends_raw": "\"ocaml\" {>= \"4.03.0\"}\n\"dune\" {>= \"1.7\"}\n\"seq\"\n\"qcheck-core\" {with-test}\n\"qcheck-alcotest\" {with-test}\n\"alcotest\" {with-test}",
1402
+ "install": null,
1403
+ "name": "psq",
1404
+ "source": {
1405
+ "archive": "tbz",
1406
+ "checksums": [
1407
+ "sha256=42005f533eabe74b1799ee32b8905654cd66a22bed4af2bd266b28d8462cd344",
1408
+ "sha512=8a8dfe20dc77e1cf38a7b1a7fc76f815c71a4ffe04627151b855feaba8f1ae742594739d1b7a45580b5b24a2cd99b58516f6b5c8d858aa314201f4a6422101ee"
1409
+ ],
1410
+ "size": 11341,
1411
+ "url": "https://github.com/pqwy/psq/releases/download/v0.2.1/psq-0.2.1.tbz"
1412
+ },
1413
+ "version": "0.2.1"
1414
+ },
1415
+ "re.1.14.0": {
1416
+ "build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
1417
+ "depends": [
1418
+ "dune",
1419
+ "ocaml"
1420
+ ],
1421
+ "depends_raw": "\"dune\" {>= \"3.17\"}\n\"ocaml\" {>= \"4.13.0\"}\n\"ppx_expect\" {with-test}\n\"ounit2\" {with-test}\n\"js_of_ocaml\" {with-test}\n\"conf-npm\" {with-test}\n\"odoc\" {with-doc}",
1422
+ "install": null,
1423
+ "name": "re",
1424
+ "source": {
1425
+ "archive": "tgz",
1426
+ "checksums": [
1427
+ "md5=03f4a83100cb9229a796b85c698076e1",
1428
+ "sha512=cd2cc39f951ca6b7be631bbb5531ed13bc040e629842671bf6fef3911b20ef1653fa9a1f0aa23b094d252cffc9a9efe7ffca69e50d362ab935bc0cc447548124",
1429
+ "sha256=e32eb4c6f319ff74241da9e1b00032f990241347271baf3adb468faaaa616147"
1430
+ ],
1431
+ "size": 110936,
1432
+ "url": "https://github.com/ocaml/ocaml-re/archive/refs/tags/1.14.0.tar.gz"
1433
+ },
1434
+ "version": "1.14.0"
1435
+ },
1436
+ "react.1.2.2": {
1437
+ "build": "\"ocaml\" \"pkg/pkg.ml\" \"build\" \"--dev-pkg\" \"%{dev}%\"",
1438
+ "depends": [
1439
+ "ocaml",
1440
+ "ocamlfind",
1441
+ "ocamlbuild",
1442
+ "topkg"
1443
+ ],
1444
+ "depends_raw": "\"ocaml\" {>= \"4.08.0\"}\n\"ocamlfind\" {build}\n\"ocamlbuild\" {build}\n\"topkg\" {build & >= \"1.0.3\"}",
1445
+ "install": null,
1446
+ "name": "react",
1447
+ "source": {
1448
+ "archive": "tbz",
1449
+ "checksums": [
1450
+ "sha512=18cdd544d484222ba02db6bd9351571516532e7a1c107b59bbe39193837298f5c745eab6754f8bc6ff125b387be7018c6d6e6ac99f91925a5e4f53af688522b1",
1451
+ "sha256=c4add315d6f1f153d115ee7ca8dd60c1265ff4d408c266125fcb5124fd228f99"
1452
+ ],
1453
+ "size": 40013,
1454
+ "url": "https://erratique.ch/software/react/releases/react-1.2.2.tbz"
1455
+ },
1456
+ "version": "1.2.2"
1457
+ },
1458
+ "seq.base": {
1459
+ "build": null,
1460
+ "depends": [
1461
+ "ocaml"
1462
+ ],
1463
+ "depends_raw": "\"ocaml\" {>= \"4.07.0\"}",
1464
+ "install": null,
1465
+ "name": "seq",
1466
+ "source": null,
1467
+ "version": "base"
1468
+ },
1469
+ "sexplib.v0.16.0": {
1470
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1471
+ "depends": [
1472
+ "ocaml",
1473
+ "parsexp",
1474
+ "sexplib0",
1475
+ "dune",
1476
+ "num"
1477
+ ],
1478
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"parsexp\" {>= \"v0.16\" & < \"v0.17\"}\n\"sexplib0\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}\n\"num\"",
1479
+ "install": null,
1480
+ "name": "sexplib",
1481
+ "source": {
1482
+ "archive": "tgz",
1483
+ "checksums": [
1484
+ "sha256=e564d5d1ca157314ba5fd64b4e89fa12c6cba8efee3becf6d09d7d9dda21ac5b"
1485
+ ],
1486
+ "size": 54920,
1487
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/sexplib-v0.16.0.tar.gz"
1488
+ },
1489
+ "version": "v0.16.0"
1490
+ },
1491
+ "sexplib0.v0.16.0": {
1492
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1493
+ "depends": [
1494
+ "ocaml",
1495
+ "dune"
1496
+ ],
1497
+ "depends_raw": "\"ocaml\" {>= \"4.08.0\"} \"dune\" {>= \"2.0.0\"}",
1498
+ "install": null,
1499
+ "name": "sexplib0",
1500
+ "source": {
1501
+ "archive": "tgz",
1502
+ "checksums": [
1503
+ "sha256=86dba26468194512f789f2fb709063515a9cb4e5c4461c021c239a369590701d"
1504
+ ],
1505
+ "size": 22101,
1506
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/sexplib0-v0.16.0.tar.gz"
1507
+ },
1508
+ "version": "v0.16.0"
1509
+ },
1510
+ "stdio.v0.16.0": {
1511
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1512
+ "depends": [
1513
+ "ocaml",
1514
+ "base",
1515
+ "dune"
1516
+ ],
1517
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"} \"base\" {>= \"v0.16\" & < \"v0.17\"} \"dune\" {>= \"2.0.0\"}",
1518
+ "install": null,
1519
+ "name": "stdio",
1520
+ "source": {
1521
+ "archive": "tgz",
1522
+ "checksums": [
1523
+ "sha256=61f0b75950614ac5378c6ec0d822cce6463402d919d5810b736fc46522b3a73e"
1524
+ ],
1525
+ "size": 7779,
1526
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/stdio-v0.16.0.tar.gz"
1527
+ },
1528
+ "version": "v0.16.0"
1529
+ },
1530
+ "stdlib-shims.0.3.0": {
1531
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1532
+ "depends": [
1533
+ "dune",
1534
+ "ocaml"
1535
+ ],
1536
+ "depends_raw": "\"dune\" \"ocaml\" {>= \"4.02.3\"}",
1537
+ "install": null,
1538
+ "name": "stdlib-shims",
1539
+ "source": {
1540
+ "archive": "tbz",
1541
+ "checksums": [
1542
+ "sha256=babf72d3917b86f707885f0c5528e36c63fccb698f4b46cf2bab5c7ccdd6d84a",
1543
+ "sha512=1151d7edc8923516e9a36995a3f8938d323aaade759ad349ed15d6d8501db61ffbe63277e97c4d86149cf371306ac23df0f581ec7e02611f58335126e1870980"
1544
+ ],
1545
+ "size": 10163,
1546
+ "url": "https://github.com/ocaml/stdlib-shims/releases/download/0.3.0/stdlib-shims-0.3.0.tbz"
1547
+ },
1548
+ "version": "0.3.0"
1549
+ },
1550
+ "system-mingw.1": {
1551
+ "build": null,
1552
+ "depends": [
1553
+ "ocaml-base-compiler",
1554
+ "ocaml-env-mingw32",
1555
+ "ocaml-env-mingw64"
1556
+ ],
1557
+ "depends_raw": "(\"ocaml-base-compiler\" {post & >= \"4.13.0~\"} |\n \"ocaml-variants\" {post & >= \"4.13.0~\"})\n(\"ocaml-env-mingw32\" | \"ocaml-env-mingw64\")",
1558
+ "install": null,
1559
+ "name": "system-mingw",
1560
+ "source": null,
1561
+ "version": "1"
1562
+ },
1563
+ "time_now.v0.16.0": {
1564
+ "build": "\"dune\" \"build\" \"-p\" name \"-j\" jobs",
1565
+ "depends": [
1566
+ "ocaml",
1567
+ "base",
1568
+ "jane-street-headers",
1569
+ "jst-config",
1570
+ "ppx_base",
1571
+ "ppx_optcomp",
1572
+ "dune"
1573
+ ],
1574
+ "depends_raw": "\"ocaml\" {>= \"4.14.0\"}\n\"base\" {>= \"v0.16\" & < \"v0.17\"}\n\"jane-street-headers\" {>= \"v0.16\" & < \"v0.17\"}\n\"jst-config\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_base\" {>= \"v0.16\" & < \"v0.17\"}\n\"ppx_optcomp\" {>= \"v0.16\" & < \"v0.17\"}\n\"dune\" {>= \"2.0.0\"}",
1575
+ "install": null,
1576
+ "name": "time_now",
1577
+ "source": {
1578
+ "archive": "tgz",
1579
+ "checksums": [
1580
+ "sha256=5fa084aadee6aaedbb8976e4a2bc0c1dfe69eecdd0576ff901f21eedd46dc3a1"
1581
+ ],
1582
+ "size": 3668,
1583
+ "url": "https://ocaml.janestreet.com/ocaml-core/v0.16/files/time_now-v0.16.0.tar.gz"
1584
+ },
1585
+ "version": "v0.16.0"
1586
+ },
1587
+ "topkg.1.1.1": {
1588
+ "build": "\"ocaml\" \"pkg/pkg.ml\" \"build\" \"--pkg-name\" name \"--dev-pkg\" \"%{dev}%\"",
1589
+ "depends": [
1590
+ "ocaml",
1591
+ "ocamlfind",
1592
+ "ocamlbuild"
1593
+ ],
1594
+ "depends_raw": "\"ocaml\" {>= \"4.08.0\"} \"ocamlfind\" {build & >= \"1.6.1\"} \"ocamlbuild\"",
1595
+ "install": null,
1596
+ "name": "topkg",
1597
+ "source": {
1598
+ "archive": "tbz",
1599
+ "checksums": [
1600
+ "sha512=c36c549a362ddf5b7fe3f6ff91c79b7ab531c43633bb9737576370bcbd69db7e1625d247c278a869b503d45a175e9753231ccf595e5bfa4e3b7e2602ac3d3b42",
1601
+ "sha256=20da062dc9cea21b5c728f22c986ed3e3d57310e643260160a802d559712f6fc"
1602
+ ],
1603
+ "size": 96571,
1604
+ "url": "https://erratique.ch/software/topkg/releases/topkg-1.1.1.tbz"
1605
+ },
1606
+ "version": "1.1.1"
1607
+ },
1608
+ "yojson.3.0.0": {
1609
+ "build": "[\"dune\" \"subst\"] {dev}\n[\n \"dune\"\n \"build\"\n \"-p\"\n name\n \"-j\"\n jobs\n \"@install\"\n \"@runtest\" {with-test}\n \"@doc\" {with-doc}\n]",
1610
+ "depends": [
1611
+ "dune",
1612
+ "ocaml"
1613
+ ],
1614
+ "depends_raw": "\"dune\" {>= \"2.7\"}\n\"ocaml\" {>= \"4.08\"}\n\"alcotest\" {with-test & >= \"0.8.5\"}\n\"odoc\" {with-doc}",
1615
+ "install": null,
1616
+ "name": "yojson",
1617
+ "source": {
1618
+ "archive": "tbz",
1619
+ "checksums": [
1620
+ "sha256=99414da7609b92a02474ef4b49ecda15edc8cbba5229341b124e7e4695c39610",
1621
+ "sha512=896d0ea829a36ccadba6628800369c1a3ab9e7c64dbda8b76331889c9db481cd64e137f467481ae80a8dd5fca45d748bfa71f58641806cc1bb1a007f8291789f"
1622
+ ],
1623
+ "size": 44166,
1624
+ "url": "https://github.com/ocaml-community/yojson/releases/download/3.0.0/yojson-3.0.0.tbz"
1625
+ },
1626
+ "version": "3.0.0"
1627
+ }
1628
+ },
1629
+ "schema_version": {
1630
+ "major": 1,
1631
+ "minor": 0
1632
+ },
1633
+ "slots": {
1634
+ "Release.Darwin_arm64": {
1635
+ "opam_vars": {
1636
+ "arch": "arm64",
1637
+ "os": "macos"
1638
+ },
1639
+ "solution": [
1640
+ "angstrom-lwt-unix.0.16.1",
1641
+ "angstrom.0.16.1",
1642
+ "base-bigarray.base",
1643
+ "base-bytes.base",
1644
+ "base-threads.base",
1645
+ "base-unix.base",
1646
+ "base.v0.16.5",
1647
+ "bigstringaf.0.10.0",
1648
+ "cmdliner.2.1.1",
1649
+ "cppo.1.8.0",
1650
+ "csexp.1.5.2",
1651
+ "dap.1.0.6",
1652
+ "dune-configurator.3.23.1",
1653
+ "dune.3.23.1",
1654
+ "earlybird.1.3.6",
1655
+ "fmt.0.11.0",
1656
+ "iter.1.9",
1657
+ "jane-street-headers.v0.16.0",
1658
+ "jst-config.v0.16.0",
1659
+ "logs.0.10.0",
1660
+ "lru.0.3.1",
1661
+ "lwt.5.10.1",
1662
+ "lwt_ppx.5.9.1",
1663
+ "lwt_react.1.2.0",
1664
+ "menhir.20260209",
1665
+ "menhirCST.20260209",
1666
+ "menhirGLR.20260209",
1667
+ "menhirLib.20260209",
1668
+ "menhirSdk.20260209",
1669
+ "num.1.6",
1670
+ "ocaml-base-compiler.4.14.3",
1671
+ "ocaml-compiler-libs.v0.12.4",
1672
+ "ocaml-config.2",
1673
+ "ocaml-options-vanilla.1",
1674
+ "ocaml-syntax-shims.1.0.0",
1675
+ "ocaml.4.14.3",
1676
+ "ocamlbuild.0.16.1",
1677
+ "ocamlfind.1.9.8",
1678
+ "ocplib-endian.1.2",
1679
+ "parsexp.v0.16.0",
1680
+ "path_glob.0.3",
1681
+ "ppx_assert.v0.16.0",
1682
+ "ppx_base.v0.16.0",
1683
+ "ppx_cold.v0.16.0",
1684
+ "ppx_compare.v0.16.0",
1685
+ "ppx_derivers.1.2.1",
1686
+ "ppx_deriving.6.0.3",
1687
+ "ppx_deriving_yojson.3.9.1",
1688
+ "ppx_enumerate.v0.16.0",
1689
+ "ppx_expect.v0.16.2",
1690
+ "ppx_globalize.v0.16.0",
1691
+ "ppx_hash.v0.16.0",
1692
+ "ppx_here.v0.16.0",
1693
+ "ppx_inline_test.v0.16.1",
1694
+ "ppx_optcomp.v0.16.0",
1695
+ "ppx_sexp_conv.v0.16.0",
1696
+ "ppxlib.0.35.0",
1697
+ "psq.0.2.1",
1698
+ "re.1.14.0",
1699
+ "react.1.2.2",
1700
+ "seq.base",
1701
+ "sexplib.v0.16.0",
1702
+ "sexplib0.v0.16.0",
1703
+ "stdio.v0.16.0",
1704
+ "stdlib-shims.0.3.0",
1705
+ "time_now.v0.16.0",
1706
+ "topkg.1.1.1",
1707
+ "yojson.3.0.0"
1708
+ ]
1709
+ },
1710
+ "Release.Darwin_x86_64": {
1711
+ "opam_vars": {
1712
+ "arch": "x86_64",
1713
+ "os": "macos"
1714
+ },
1715
+ "solution": [
1716
+ "angstrom-lwt-unix.0.16.1",
1717
+ "angstrom.0.16.1",
1718
+ "base-bigarray.base",
1719
+ "base-bytes.base",
1720
+ "base-threads.base",
1721
+ "base-unix.base",
1722
+ "base.v0.16.5",
1723
+ "bigstringaf.0.10.0",
1724
+ "cmdliner.2.1.1",
1725
+ "cppo.1.8.0",
1726
+ "csexp.1.5.2",
1727
+ "dap.1.0.6",
1728
+ "dune-configurator.3.23.1",
1729
+ "dune.3.23.1",
1730
+ "earlybird.1.3.6",
1731
+ "fmt.0.11.0",
1732
+ "iter.1.9",
1733
+ "jane-street-headers.v0.16.0",
1734
+ "jst-config.v0.16.0",
1735
+ "logs.0.10.0",
1736
+ "lru.0.3.1",
1737
+ "lwt.5.10.1",
1738
+ "lwt_ppx.5.9.1",
1739
+ "lwt_react.1.2.0",
1740
+ "menhir.20260209",
1741
+ "menhirCST.20260209",
1742
+ "menhirGLR.20260209",
1743
+ "menhirLib.20260209",
1744
+ "menhirSdk.20260209",
1745
+ "num.1.6",
1746
+ "ocaml-base-compiler.4.14.3",
1747
+ "ocaml-compiler-libs.v0.12.4",
1748
+ "ocaml-config.2",
1749
+ "ocaml-options-vanilla.1",
1750
+ "ocaml-syntax-shims.1.0.0",
1751
+ "ocaml.4.14.3",
1752
+ "ocamlbuild.0.16.1",
1753
+ "ocamlfind.1.9.8",
1754
+ "ocplib-endian.1.2",
1755
+ "parsexp.v0.16.0",
1756
+ "path_glob.0.3",
1757
+ "ppx_assert.v0.16.0",
1758
+ "ppx_base.v0.16.0",
1759
+ "ppx_cold.v0.16.0",
1760
+ "ppx_compare.v0.16.0",
1761
+ "ppx_derivers.1.2.1",
1762
+ "ppx_deriving.6.0.3",
1763
+ "ppx_deriving_yojson.3.9.1",
1764
+ "ppx_enumerate.v0.16.0",
1765
+ "ppx_expect.v0.16.2",
1766
+ "ppx_globalize.v0.16.0",
1767
+ "ppx_hash.v0.16.0",
1768
+ "ppx_here.v0.16.0",
1769
+ "ppx_inline_test.v0.16.1",
1770
+ "ppx_optcomp.v0.16.0",
1771
+ "ppx_sexp_conv.v0.16.0",
1772
+ "ppxlib.0.35.0",
1773
+ "psq.0.2.1",
1774
+ "re.1.14.0",
1775
+ "react.1.2.2",
1776
+ "seq.base",
1777
+ "sexplib.v0.16.0",
1778
+ "sexplib0.v0.16.0",
1779
+ "stdio.v0.16.0",
1780
+ "stdlib-shims.0.3.0",
1781
+ "time_now.v0.16.0",
1782
+ "topkg.1.1.1",
1783
+ "yojson.3.0.0"
1784
+ ]
1785
+ },
1786
+ "Release.Linux_arm64": {
1787
+ "opam_vars": {
1788
+ "arch": "arm64",
1789
+ "os": "linux"
1790
+ },
1791
+ "solution": [
1792
+ "angstrom-lwt-unix.0.16.1",
1793
+ "angstrom.0.16.1",
1794
+ "base-bigarray.base",
1795
+ "base-bytes.base",
1796
+ "base-threads.base",
1797
+ "base-unix.base",
1798
+ "base.v0.16.5",
1799
+ "bigstringaf.0.10.0",
1800
+ "cmdliner.2.1.1",
1801
+ "cppo.1.8.0",
1802
+ "csexp.1.5.2",
1803
+ "dap.1.0.6",
1804
+ "dune-configurator.3.23.1",
1805
+ "dune.3.23.1",
1806
+ "earlybird.1.3.6",
1807
+ "fmt.0.11.0",
1808
+ "iter.1.9",
1809
+ "jane-street-headers.v0.16.0",
1810
+ "jst-config.v0.16.0",
1811
+ "logs.0.10.0",
1812
+ "lru.0.3.1",
1813
+ "lwt.5.10.1",
1814
+ "lwt_ppx.5.9.1",
1815
+ "lwt_react.1.2.0",
1816
+ "menhir.20260209",
1817
+ "menhirCST.20260209",
1818
+ "menhirGLR.20260209",
1819
+ "menhirLib.20260209",
1820
+ "menhirSdk.20260209",
1821
+ "num.1.6",
1822
+ "ocaml-base-compiler.4.14.3",
1823
+ "ocaml-compiler-libs.v0.12.4",
1824
+ "ocaml-config.2",
1825
+ "ocaml-options-vanilla.1",
1826
+ "ocaml-syntax-shims.1.0.0",
1827
+ "ocaml.4.14.3",
1828
+ "ocamlbuild.0.16.1",
1829
+ "ocamlfind.1.9.8",
1830
+ "ocplib-endian.1.2",
1831
+ "parsexp.v0.16.0",
1832
+ "path_glob.0.3",
1833
+ "ppx_assert.v0.16.0",
1834
+ "ppx_base.v0.16.0",
1835
+ "ppx_cold.v0.16.0",
1836
+ "ppx_compare.v0.16.0",
1837
+ "ppx_derivers.1.2.1",
1838
+ "ppx_deriving.6.0.3",
1839
+ "ppx_deriving_yojson.3.9.1",
1840
+ "ppx_enumerate.v0.16.0",
1841
+ "ppx_expect.v0.16.2",
1842
+ "ppx_globalize.v0.16.0",
1843
+ "ppx_hash.v0.16.0",
1844
+ "ppx_here.v0.16.0",
1845
+ "ppx_inline_test.v0.16.1",
1846
+ "ppx_optcomp.v0.16.0",
1847
+ "ppx_sexp_conv.v0.16.0",
1848
+ "ppxlib.0.35.0",
1849
+ "psq.0.2.1",
1850
+ "re.1.14.0",
1851
+ "react.1.2.2",
1852
+ "seq.base",
1853
+ "sexplib.v0.16.0",
1854
+ "sexplib0.v0.16.0",
1855
+ "stdio.v0.16.0",
1856
+ "stdlib-shims.0.3.0",
1857
+ "time_now.v0.16.0",
1858
+ "topkg.1.1.1",
1859
+ "yojson.3.0.0"
1860
+ ]
1861
+ },
1862
+ "Release.Linux_x86": {
1863
+ "opam_vars": {
1864
+ "arch": "x86_32",
1865
+ "os": "linux"
1866
+ },
1867
+ "solution": [
1868
+ "angstrom-lwt-unix.0.16.1",
1869
+ "angstrom.0.16.1",
1870
+ "base-bigarray.base",
1871
+ "base-bytes.base",
1872
+ "base-threads.base",
1873
+ "base-unix.base",
1874
+ "base.v0.16.5",
1875
+ "bigstringaf.0.10.0",
1876
+ "cmdliner.2.1.1",
1877
+ "cppo.1.8.0",
1878
+ "csexp.1.5.2",
1879
+ "dap.1.0.6",
1880
+ "dune-configurator.3.23.1",
1881
+ "dune.3.23.1",
1882
+ "earlybird.1.3.6",
1883
+ "fmt.0.11.0",
1884
+ "iter.1.9",
1885
+ "jane-street-headers.v0.16.0",
1886
+ "jst-config.v0.16.0",
1887
+ "logs.0.10.0",
1888
+ "lru.0.3.1",
1889
+ "lwt.5.10.1",
1890
+ "lwt_ppx.5.9.1",
1891
+ "lwt_react.1.2.0",
1892
+ "menhir.20260209",
1893
+ "menhirCST.20260209",
1894
+ "menhirGLR.20260209",
1895
+ "menhirLib.20260209",
1896
+ "menhirSdk.20260209",
1897
+ "num.1.6",
1898
+ "ocaml-base-compiler.4.14.3",
1899
+ "ocaml-compiler-libs.v0.12.4",
1900
+ "ocaml-config.2",
1901
+ "ocaml-options-vanilla.1",
1902
+ "ocaml-syntax-shims.1.0.0",
1903
+ "ocaml.4.14.3",
1904
+ "ocamlbuild.0.16.1",
1905
+ "ocamlfind.1.9.8",
1906
+ "ocplib-endian.1.2",
1907
+ "parsexp.v0.16.0",
1908
+ "path_glob.0.3",
1909
+ "ppx_assert.v0.16.0",
1910
+ "ppx_base.v0.16.0",
1911
+ "ppx_cold.v0.16.0",
1912
+ "ppx_compare.v0.16.0",
1913
+ "ppx_derivers.1.2.1",
1914
+ "ppx_deriving.6.0.3",
1915
+ "ppx_deriving_yojson.3.9.1",
1916
+ "ppx_enumerate.v0.16.0",
1917
+ "ppx_expect.v0.16.0",
1918
+ "ppx_globalize.v0.16.0",
1919
+ "ppx_hash.v0.16.0",
1920
+ "ppx_here.v0.16.0",
1921
+ "ppx_inline_test.v0.16.0",
1922
+ "ppx_optcomp.v0.16.0",
1923
+ "ppx_sexp_conv.v0.16.0",
1924
+ "ppxlib.0.35.0",
1925
+ "psq.0.2.1",
1926
+ "re.1.14.0",
1927
+ "react.1.2.2",
1928
+ "seq.base",
1929
+ "sexplib.v0.16.0",
1930
+ "sexplib0.v0.16.0",
1931
+ "stdio.v0.16.0",
1932
+ "stdlib-shims.0.3.0",
1933
+ "time_now.v0.16.0",
1934
+ "topkg.1.1.1",
1935
+ "yojson.3.0.0"
1936
+ ]
1937
+ },
1938
+ "Release.Linux_x86_64": {
1939
+ "opam_vars": {
1940
+ "arch": "x86_64",
1941
+ "os": "linux"
1942
+ },
1943
+ "solution": [
1944
+ "angstrom-lwt-unix.0.16.1",
1945
+ "angstrom.0.16.1",
1946
+ "base-bigarray.base",
1947
+ "base-bytes.base",
1948
+ "base-threads.base",
1949
+ "base-unix.base",
1950
+ "base.v0.16.5",
1951
+ "bigstringaf.0.10.0",
1952
+ "cmdliner.2.1.1",
1953
+ "cppo.1.8.0",
1954
+ "csexp.1.5.2",
1955
+ "dap.1.0.6",
1956
+ "dune-configurator.3.23.1",
1957
+ "dune.3.23.1",
1958
+ "earlybird.1.3.6",
1959
+ "fmt.0.11.0",
1960
+ "iter.1.9",
1961
+ "jane-street-headers.v0.16.0",
1962
+ "jst-config.v0.16.0",
1963
+ "logs.0.10.0",
1964
+ "lru.0.3.1",
1965
+ "lwt.5.10.1",
1966
+ "lwt_ppx.5.9.1",
1967
+ "lwt_react.1.2.0",
1968
+ "menhir.20260209",
1969
+ "menhirCST.20260209",
1970
+ "menhirGLR.20260209",
1971
+ "menhirLib.20260209",
1972
+ "menhirSdk.20260209",
1973
+ "num.1.6",
1974
+ "ocaml-base-compiler.4.14.3",
1975
+ "ocaml-compiler-libs.v0.12.4",
1976
+ "ocaml-config.2",
1977
+ "ocaml-options-vanilla.1",
1978
+ "ocaml-syntax-shims.1.0.0",
1979
+ "ocaml.4.14.3",
1980
+ "ocamlbuild.0.16.1",
1981
+ "ocamlfind.1.9.8",
1982
+ "ocplib-endian.1.2",
1983
+ "parsexp.v0.16.0",
1984
+ "path_glob.0.3",
1985
+ "ppx_assert.v0.16.0",
1986
+ "ppx_base.v0.16.0",
1987
+ "ppx_cold.v0.16.0",
1988
+ "ppx_compare.v0.16.0",
1989
+ "ppx_derivers.1.2.1",
1990
+ "ppx_deriving.6.0.3",
1991
+ "ppx_deriving_yojson.3.9.1",
1992
+ "ppx_enumerate.v0.16.0",
1993
+ "ppx_expect.v0.16.2",
1994
+ "ppx_globalize.v0.16.0",
1995
+ "ppx_hash.v0.16.0",
1996
+ "ppx_here.v0.16.0",
1997
+ "ppx_inline_test.v0.16.1",
1998
+ "ppx_optcomp.v0.16.0",
1999
+ "ppx_sexp_conv.v0.16.0",
2000
+ "ppxlib.0.35.0",
2001
+ "psq.0.2.1",
2002
+ "re.1.14.0",
2003
+ "react.1.2.2",
2004
+ "seq.base",
2005
+ "sexplib.v0.16.0",
2006
+ "sexplib0.v0.16.0",
2007
+ "stdio.v0.16.0",
2008
+ "stdlib-shims.0.3.0",
2009
+ "time_now.v0.16.0",
2010
+ "topkg.1.1.1",
2011
+ "yojson.3.0.0"
2012
+ ]
2013
+ },
2014
+ "Release.Linux_x86_64_musl": {
2015
+ "opam_vars": {
2016
+ "arch": "x86_64",
2017
+ "os": "linux"
2018
+ },
2019
+ "solution": [
2020
+ "angstrom-lwt-unix.0.16.1",
2021
+ "angstrom.0.16.1",
2022
+ "base-bigarray.base",
2023
+ "base-bytes.base",
2024
+ "base-threads.base",
2025
+ "base-unix.base",
2026
+ "base.v0.16.5",
2027
+ "bigstringaf.0.10.0",
2028
+ "cmdliner.2.1.1",
2029
+ "cppo.1.8.0",
2030
+ "csexp.1.5.2",
2031
+ "dap.1.0.6",
2032
+ "dune-configurator.3.23.1",
2033
+ "dune.3.23.1",
2034
+ "earlybird.1.3.6",
2035
+ "fmt.0.11.0",
2036
+ "iter.1.9",
2037
+ "jane-street-headers.v0.16.0",
2038
+ "jst-config.v0.16.0",
2039
+ "logs.0.10.0",
2040
+ "lru.0.3.1",
2041
+ "lwt.5.10.1",
2042
+ "lwt_ppx.5.9.1",
2043
+ "lwt_react.1.2.0",
2044
+ "menhir.20260209",
2045
+ "menhirCST.20260209",
2046
+ "menhirGLR.20260209",
2047
+ "menhirLib.20260209",
2048
+ "menhirSdk.20260209",
2049
+ "num.1.6",
2050
+ "ocaml-base-compiler.4.14.3",
2051
+ "ocaml-compiler-libs.v0.12.4",
2052
+ "ocaml-config.2",
2053
+ "ocaml-options-vanilla.1",
2054
+ "ocaml-syntax-shims.1.0.0",
2055
+ "ocaml.4.14.3",
2056
+ "ocamlbuild.0.16.1",
2057
+ "ocamlfind.1.9.8",
2058
+ "ocplib-endian.1.2",
2059
+ "parsexp.v0.16.0",
2060
+ "path_glob.0.3",
2061
+ "ppx_assert.v0.16.0",
2062
+ "ppx_base.v0.16.0",
2063
+ "ppx_cold.v0.16.0",
2064
+ "ppx_compare.v0.16.0",
2065
+ "ppx_derivers.1.2.1",
2066
+ "ppx_deriving.6.0.3",
2067
+ "ppx_deriving_yojson.3.9.1",
2068
+ "ppx_enumerate.v0.16.0",
2069
+ "ppx_expect.v0.16.2",
2070
+ "ppx_globalize.v0.16.0",
2071
+ "ppx_hash.v0.16.0",
2072
+ "ppx_here.v0.16.0",
2073
+ "ppx_inline_test.v0.16.1",
2074
+ "ppx_optcomp.v0.16.0",
2075
+ "ppx_sexp_conv.v0.16.0",
2076
+ "ppxlib.0.35.0",
2077
+ "psq.0.2.1",
2078
+ "re.1.14.0",
2079
+ "react.1.2.2",
2080
+ "seq.base",
2081
+ "sexplib.v0.16.0",
2082
+ "sexplib0.v0.16.0",
2083
+ "stdio.v0.16.0",
2084
+ "stdlib-shims.0.3.0",
2085
+ "time_now.v0.16.0",
2086
+ "topkg.1.1.1",
2087
+ "yojson.3.0.0"
2088
+ ]
2089
+ },
2090
+ "Release.Windows_x86": {
2091
+ "opam_vars": {
2092
+ "arch": "x86_32",
2093
+ "os": "win32"
2094
+ },
2095
+ "solution": [
2096
+ "angstrom-lwt-unix.0.16.1",
2097
+ "angstrom.0.16.1",
2098
+ "base-bigarray.base",
2099
+ "base-bytes.base",
2100
+ "base-threads.base",
2101
+ "base-unix.base",
2102
+ "base.v0.16.5",
2103
+ "bigstringaf.0.10.0",
2104
+ "cmdliner.2.1.1",
2105
+ "conf-mingw-w64-gcc-i686.1",
2106
+ "cppo.1.8.0",
2107
+ "csexp.1.5.2",
2108
+ "dap.1.0.6",
2109
+ "dune-configurator.3.23.1",
2110
+ "dune.3.23.1",
2111
+ "earlybird.1.3.6",
2112
+ "flexdll.0.44",
2113
+ "fmt.0.11.0",
2114
+ "host-arch-x86_32.1",
2115
+ "host-system-mingw.1",
2116
+ "iter.1.9",
2117
+ "jane-street-headers.v0.16.0",
2118
+ "jst-config.v0.16.0",
2119
+ "logs.0.10.0",
2120
+ "lru.0.3.1",
2121
+ "lwt.5.10.1",
2122
+ "lwt_ppx.5.9.1",
2123
+ "lwt_react.1.2.0",
2124
+ "menhir.20260209",
2125
+ "menhirCST.20260209",
2126
+ "menhirGLR.20260209",
2127
+ "menhirLib.20260209",
2128
+ "menhirSdk.20260209",
2129
+ "num.1.6",
2130
+ "ocaml-base-compiler.4.14.3",
2131
+ "ocaml-compiler-libs.v0.12.4",
2132
+ "ocaml-config.3",
2133
+ "ocaml-env-mingw32.1",
2134
+ "ocaml-options-vanilla.1",
2135
+ "ocaml-syntax-shims.1.0.0",
2136
+ "ocaml.4.14.3",
2137
+ "ocamlbuild.0.16.1",
2138
+ "ocamlfind.1.9.8",
2139
+ "ocplib-endian.1.2",
2140
+ "parsexp.v0.16.0",
2141
+ "path_glob.0.3",
2142
+ "ppx_assert.v0.16.0",
2143
+ "ppx_base.v0.16.0",
2144
+ "ppx_cold.v0.16.0",
2145
+ "ppx_compare.v0.16.0",
2146
+ "ppx_derivers.1.2.1",
2147
+ "ppx_deriving.6.0.3",
2148
+ "ppx_deriving_yojson.3.9.1",
2149
+ "ppx_enumerate.v0.16.0",
2150
+ "ppx_expect.v0.16.0",
2151
+ "ppx_globalize.v0.16.0",
2152
+ "ppx_hash.v0.16.0",
2153
+ "ppx_here.v0.16.0",
2154
+ "ppx_inline_test.v0.16.0",
2155
+ "ppx_optcomp.v0.16.0",
2156
+ "ppx_sexp_conv.v0.16.0",
2157
+ "ppxlib.0.35.0",
2158
+ "psq.0.2.1",
2159
+ "re.1.14.0",
2160
+ "react.1.2.2",
2161
+ "seq.base",
2162
+ "sexplib.v0.16.0",
2163
+ "sexplib0.v0.16.0",
2164
+ "stdio.v0.16.0",
2165
+ "stdlib-shims.0.3.0",
2166
+ "system-mingw.1",
2167
+ "time_now.v0.16.0",
2168
+ "topkg.1.1.1",
2169
+ "yojson.3.0.0"
2170
+ ]
2171
+ },
2172
+ "Release.Windows_x86_64": {
2173
+ "opam_vars": {
2174
+ "arch": "x86_64",
2175
+ "os": "win32"
2176
+ },
2177
+ "solution": [
2178
+ "angstrom-lwt-unix.0.16.1",
2179
+ "angstrom.0.16.1",
2180
+ "arch-x86_64.1",
2181
+ "base-bigarray.base",
2182
+ "base-bytes.base",
2183
+ "base-threads.base",
2184
+ "base-unix.base",
2185
+ "base.v0.16.5",
2186
+ "bigstringaf.0.10.0",
2187
+ "cmdliner.2.1.1",
2188
+ "conf-mingw-w64-gcc-x86_64.1",
2189
+ "cppo.1.8.0",
2190
+ "csexp.1.5.2",
2191
+ "dap.1.0.6",
2192
+ "dune-configurator.3.23.1",
2193
+ "dune.3.23.1",
2194
+ "earlybird.1.3.6",
2195
+ "flexdll.0.44",
2196
+ "fmt.0.11.0",
2197
+ "host-arch-x86_64.1",
2198
+ "host-system-mingw.1",
2199
+ "iter.1.9",
2200
+ "jane-street-headers.v0.16.0",
2201
+ "jst-config.v0.16.0",
2202
+ "logs.0.10.0",
2203
+ "lru.0.3.1",
2204
+ "lwt.5.10.1",
2205
+ "lwt_ppx.5.9.1",
2206
+ "lwt_react.1.2.0",
2207
+ "menhir.20260209",
2208
+ "menhirCST.20260209",
2209
+ "menhirGLR.20260209",
2210
+ "menhirLib.20260209",
2211
+ "menhirSdk.20260209",
2212
+ "num.1.6",
2213
+ "ocaml-base-compiler.4.14.3",
2214
+ "ocaml-compiler-libs.v0.12.4",
2215
+ "ocaml-config.3",
2216
+ "ocaml-env-mingw64.1",
2217
+ "ocaml-options-vanilla.1",
2218
+ "ocaml-syntax-shims.1.0.0",
2219
+ "ocaml.4.14.3",
2220
+ "ocamlbuild.0.16.1",
2221
+ "ocamlfind.1.9.8",
2222
+ "ocplib-endian.1.2",
2223
+ "parsexp.v0.16.0",
2224
+ "path_glob.0.3",
2225
+ "ppx_assert.v0.16.0",
2226
+ "ppx_base.v0.16.0",
2227
+ "ppx_cold.v0.16.0",
2228
+ "ppx_compare.v0.16.0",
2229
+ "ppx_derivers.1.2.1",
2230
+ "ppx_deriving.6.0.3",
2231
+ "ppx_deriving_yojson.3.9.1",
2232
+ "ppx_enumerate.v0.16.0",
2233
+ "ppx_expect.v0.16.2",
2234
+ "ppx_globalize.v0.16.0",
2235
+ "ppx_hash.v0.16.0",
2236
+ "ppx_here.v0.16.0",
2237
+ "ppx_inline_test.v0.16.1",
2238
+ "ppx_optcomp.v0.16.0",
2239
+ "ppx_sexp_conv.v0.16.0",
2240
+ "ppxlib.0.35.0",
2241
+ "psq.0.2.1",
2242
+ "re.1.14.0",
2243
+ "react.1.2.2",
2244
+ "seq.base",
2245
+ "sexplib.v0.16.0",
2246
+ "sexplib0.v0.16.0",
2247
+ "stdio.v0.16.0",
2248
+ "stdlib-shims.0.3.0",
2249
+ "system-mingw.1",
2250
+ "time_now.v0.16.0",
2251
+ "topkg.1.1.1",
2252
+ "yojson.3.0.0"
2253
+ ]
2254
+ }
2255
+ }
2256
+ }
dk.u ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # NotHackwaly_Ocamlearlybird
2
+
3
+ ## Overview
4
+
5
+ Builds the [ocamlearlybird](https://github.com/hackwaly/ocamlearlybird) OCaml
6
+ debug adapter with the dk build system. See CLO.md for setup instructions.
7
+
8
+ ## License
9
+
10
+ MIT
11
+
12
+ ## workspace
13
+
14
+ %% actual_version("2.4.3.22")
15
+ 'actual_version'
16
+ '2.4.3.22'
17
+
18
+ The workspace assets below are the inputs of the dk build: the dune project
19
+ files, the `src/` tree, and the checked-in opam lock. After editing any of
20
+ them run `./dk1 update --no-imports` to refresh the recorded checksums.
21
+
22
+ ### NotHackwaly_Ocamlearlybird.Apparatus@1.3.6
23
+
24
+ % unified.asset { name="DuneRoot", file="dune" }
25
+ \dk.asset(byteSize: "83", checksum: (sha256: "9a38938be58029f13436cf66d626b20b4fa14ecb32428efe123f93b36df96bac"))\;
26
+
27
+ % unified.asset { name="DuneWorkspace", file="dk-src/dune-workspace" }
28
+ \dk.asset(byteSize: "16", checksum: (sha256: "6dff6804e49533fc19ea7b0fbe988213a210fa7b9a2d5fd5f5b89eed6e380e53"))\;
29
+
30
+ % unified.asset { name="DuneProject", file="dune-project" }
31
+ \dk.asset(byteSize: "780", checksum: (sha256: "919033718df7d4b1546ef485a7b35d0bcd23a5b97dad73d9f70826d04951e714"))\;
32
+
33
+ % unified.asset { name="Opam", file="earlybird.opam" }
34
+ \dk.asset(byteSize: "1124", checksum: (sha256: "786504fe6aa5991f03cfa72e5fb830112044f5c76cb42945f51d72ad3f1566f2"))\;
35
+
36
+ % unified.asset { name="Src", dir="src" }
37
+ \dk.asset(byteSize: "51509", checksum: (sha256: "ca452ef1920f6c630882b146796b3adfbf44bb91f7eeda8a41e2e1656fcd1e1d"))\;
38
+
39
+ % unified.asset { name="Lock", file="dk.opam-lock.jsonc" }
40
+ \dk.asset(byteSize: "83240", checksum: (sha256: "8b0cbeeb0d8a11845f3cadc288bf4cb22cad3623c0673892d0b85f5256f0d967"))\;
41
+
42
+ %% import { type="github-l2", repo="dkpkg/CommonsBase_Std" }
43
+ \dk.import(type: "github-l2", library: "CommonsBase_Std",
44
+ version: "2.6.20260920144347",
45
+ checksum: (blake2b-256: "8f7d86924c66f6d1778c08214b1adab001f75677cb141c376b837ee6e39f57fa",
46
+ sha256: "b3c67724e09942596d8af32635b585698f931047e74332bc011a532a430d5438",
47
+ sha1: "f1d0701257aa61a5fbd480833e464263422a4135"))\;
48
+
49
+ %% import { type="github-l2", repo="dkpkg/CommonsLang_OCaml", tag="0.1.20260920144347" }
50
+ \dk.import(type: "github-l2", library: "CommonsLang_OCaml",
51
+ version: "0.1.20260920144347",
52
+ checksum: (blake2b-256: "f4908c307b22de34d24ae0349481f321cd46d5082cc92a89d99d18a13189d907",
53
+ sha256: "54c5ccfd53e87797ea4fea161b0fd6c869ba80a45b3b3870848407c6797741a8",
54
+ sha1: "b018ece3ee445cfd6414cd7f28a3c501b5469898"))\;
dk0 ADDED
@@ -0,0 +1,864 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/sh
2
+ ##########################################################################
3
+ # File: mlfront/dk0 #
4
+ # #
5
+ # Copyright 2025 Diskuv, Inc. #
6
+ # #
7
+ # Licensed under the Open Software License version 3.0 #
8
+ # (the "License"); you may not use this file except in compliance #
9
+ # with the License. You may obtain a copy of the License at #
10
+ # #
11
+ # https://opensource.org/license/osl-3-0-php/ #
12
+ # #
13
+ ##########################################################################
14
+
15
+ # Recommendation: Place this file in source control.
16
+ #
17
+ # Invoking: ./dk0
18
+ # That works in Powershell on Windows, and in Unix. Copy-and-paste works!
19
+ #
20
+ # Purpose: Install dk0 if not present. Then invoke dk0.
21
+
22
+ # The cksum_signify_* constants below are read indirectly, through the dynamic
23
+ # eval lookup in dk_verify_manifest that builds the variable name from the host
24
+ # ABI; that reference is invisible to the linter, so the file-wide directive on
25
+ # the next line turns off its unused-variable warning.
26
+ # shellcheck disable=SC2034
27
+ set -euf
28
+
29
+ # ===== BAKED TRUST ROOT (rotates rarely; updated only on key/verifier rotation) =====
30
+ # The dk0 version is NOT baked here. It is pinned per project by a
31
+ # %% actual_version("X.Y.Z.W")
32
+ # line in dk.u's `## workspace` section (or the latest signed manifest if absent).
33
+ # dk0 and its checksum come from a signify-signed manifest verified at runtime:
34
+ # 1. download the pinned mlfront-signify verifier from its GitLab package (by
35
+ # the baked version below), check it against the SHA-256 baked below (the
36
+ # anchor -- not the manifest, so no circularity);
37
+ # 2. verify the signify signature over the manifest (manifest.txt) with the
38
+ # baked public key;
39
+ # 3. only then read the manifest's per-arch dk0 SHA-256.
40
+ # This file never rewrites itself (Windows batch/exe safety); `dk0 --self-update`
41
+ # edits only the dk.u actual_version line, and key rotation is followed at
42
+ # verify-time via the manifest's continuation chain.
43
+ SIGNIFY_PUBKEY_B64="RWTMq/GqeeJ06ACy7By/H05vvtpc3ZPEKlbnDm9fIQxpkgTV92is6YHD"
44
+ # The verifier is pinned by version+checksum and fetched from GitLab (a direct
45
+ # package download, not the throttled listing API); the site serves only the
46
+ # signed manifest and the wrappers.
47
+ signify_pkg_ver="2.4.2.271"
48
+ cksum_signify_linux_x86_64="9701ed5821ea57114890f2d54381ee29742b45292ea0c8a259b0d4187c728a4d"
49
+ cksum_signify_linux_x86="533ec71ef0c6081c57850c840d29df5ca8efd3c2722b54dc77c14224dda0c418"
50
+ cksum_signify_darwin_arm64="89513c94add01ef5e15fa4c3a171755cd3eb783f552b9d4a3dedd009fa89a062"
51
+ cksum_signify_darwin_x86_64="875ba2f6840bb705ed2346c9c3a165ee5fdfde559df4b9adfa0c6f915043eade"
52
+ cksum_signify_windows_x86_64="ebe1aa87a3eb87ed6769782a31916fab72bbdf0ced22d6ddd9a7a455e23e2c68"
53
+ # windows_x86 (32-bit) mlfront-signify is not published at signify_pkg_ver yet.
54
+ # Keep the slot maintained: the __ placeholder trips the not-provisioned guard
55
+ # in dk_verify_manifest until a real checksum is baked here (and dk0.cmd carries
56
+ # the matching x86 slot), so ./dk0 and .\dk0.cmd light up together.
57
+ cksum_signify_windows_x86="__CKSUM_SIGNIFY_WINDOWS_X86__"
58
+ DK_BASE_URL="${DK0_BASE_URL:-https://diskuv.com/dk}"
59
+ # ====================================================================================
60
+
61
+ dk_pwd=$PWD
62
+
63
+ # Get the dk project tree
64
+ DK_PROJECT_DIR=$(dirname "$0")
65
+ DK_PROJECT_DIR=$(cd "$DK_PROJECT_DIR" && pwd)
66
+
67
+ # --- Windows ---
68
+ # There is no shunt to dk0.cmd here. The block that used to live here required
69
+ # [ -x /usr/bin/cmd ], and no MSYS2, Cygwin, or Git Bash layout ships a `cmd` in
70
+ # /usr/bin, so it never fired on any host. This script handles Windows directly
71
+ # instead: autodetect_buildhost_arch resolves windows_x86_64 / windows_x86 via
72
+ # is_unixy_windows_build_machine, dk_extexe adds the .exe suffix, the data home
73
+ # below shares dk0.cmd's store, and MSYS converts POSIX paths in argv when
74
+ # exec'ing the native dk0.exe. A shunt could not be the whole answer anyway: a
75
+ # global install.sh install ships no dk0.cmd to shunt to.
76
+
77
+ # --- Quiet mode detection ---
78
+ DKCODER_QUIET=0
79
+ _DKEXE_OPTIONS=
80
+ run_maybe_quiet() {
81
+ "$@" >&2 # Always redirect stdout to stderr in this script
82
+ }
83
+ printf_maybe_quiet() {
84
+ # shellcheck disable=SC2059
85
+ printf "$@" >&2
86
+ }
87
+
88
+ # --- Launcher helpers (not from crossplatform-functions.sh) ---
89
+
90
+ # [dk_prog_path NAME] prints the path to NAME, or nothing when it is not
91
+ # installed. Absolute locations first, so the hardened Linux/macOS behavior is
92
+ # unchanged, then PATH. Git Bash (Git for Windows) ships curl at
93
+ # /mingw64/bin/curl and has no /usr/bin/curl or /bin/curl, so without the PATH
94
+ # fallback the launcher finds no downloader at all and every fetch fails.
95
+ # ci/dist/install.sh already resolves curl/wget through PATH for the same reason.
96
+ # This does not weaken the trust model: the mlfront-signify verifier is pinned by
97
+ # the SHA-256 baked above, the manifest is signify-verified, and every binary is
98
+ # checked against a signed checksum, so a hostile PATH curl can deny service but
99
+ # cannot substitute an artifact.
100
+ # The `|| true` matters under `set -e`: `command -v` exits nonzero for a missing
101
+ # program, and a bare assignment would propagate that status and abort the script.
102
+ dk_prog_path() {
103
+ if [ -x "/usr/bin/$1" ]; then printf '%s' "/usr/bin/$1"
104
+ elif [ -x "/bin/$1" ]; then printf '%s' "/bin/$1"
105
+ else command -v "$1" 2>/dev/null || true
106
+ fi
107
+ }
108
+
109
+ # Every download path funnels here when neither curl nor wget resolved. Name what
110
+ # was searched and the escape hatch; a bare "not available" leaves the reader with
111
+ # nothing to act on.
112
+ dk_no_downloader() {
113
+ echo "FATAL: no curl or wget found (searched /usr/bin, /bin, then PATH)" >&2
114
+ echo " ...: install curl or wget, or set DKMLSYS_CURL=/full/path/to/curl" >&2
115
+ exit 107
116
+ }
117
+
118
+ # --- Imports of dkml-runtime-common's crossplatform-functions.sh ---
119
+ # Changes:
120
+ # 1. In download_file() use [ "${DKCODER_QUIET:-}" -eq 1 ]
121
+ # 2. In log_trace() replace non-FATAL `printf ... >&2` with `printf_maybe_quiet ...`
122
+ # 3. In sha256check() all shasum/* use --quiet option (this should be upstreamed)
123
+ # 4. In autodetect_system_binaries() curl and wget resolve through dk_prog_path
124
+ # (above), which falls back to PATH when the absolute locations miss
125
+
126
+ # Get standard locations of Unix system binaries like `/usr/bin/mv` (or `/bin/mv`).
127
+ #
128
+ # Will not return anything in `/usr/local/bin` or `/usr/sbin`. Use when you do not
129
+ # know whether the PATH has been set correctly, or when you do not know if the
130
+ # system binary exists.
131
+ #
132
+ # At some point in the future, this function will error out if the required system binaries
133
+ # do not exist. Most system binaries are common to all Unix/Linux/macOS installations but
134
+ # some (like `comm`) may need to be installed for proper functioning of DKML.
135
+ #
136
+ # Outputs:
137
+ # - env:DKMLSYS_MV - Location of `mv`
138
+ # - env:DKMLSYS_CHMOD - Location of `chmod`
139
+ # - env:DKMLSYS_UNAME - Location of `uname`
140
+ # - env:DKMLSYS_ENV - Location of `env`
141
+ # - env:DKMLSYS_AWK - Location of `awk`
142
+ # - env:DKMLSYS_SED - Location of `sed`
143
+ # - env:DKMLSYS_COMM - Location of `comm`
144
+ # - env:DKMLSYS_INSTALL - Location of `install`
145
+ # - env:DKMLSYS_RM - Location of `rm`
146
+ # - env:DKMLSYS_SORT - Location of `sort`
147
+ # - env:DKMLSYS_CAT - Location of `cat`
148
+ # - env:DKMLSYS_STAT - Location of `stat`
149
+ # - env:DKMLSYS_GREP - Location of `grep`
150
+ # - env:DKMLSYS_CURL - Location of `curl` (empty if not found)
151
+ # - env:DKMLSYS_WGET - Location of `wget` (empty if not found)
152
+ # - env:DKMLSYS_TR - Location of `tr`
153
+ autodetect_system_binaries() {
154
+ if [ -z "${DKMLSYS_MV:-}" ]; then
155
+ if [ -x /usr/bin/mv ]; then
156
+ DKMLSYS_MV=/usr/bin/mv
157
+ else
158
+ DKMLSYS_MV=/bin/mv
159
+ fi
160
+ fi
161
+ if [ -z "${DKMLSYS_CHMOD:-}" ]; then
162
+ if [ -x /usr/bin/chmod ]; then
163
+ DKMLSYS_CHMOD=/usr/bin/chmod
164
+ else
165
+ DKMLSYS_CHMOD=/bin/chmod
166
+ fi
167
+ fi
168
+ if [ -z "${DKMLSYS_UNAME:-}" ]; then
169
+ if [ -x /usr/bin/uname ]; then
170
+ DKMLSYS_UNAME=/usr/bin/uname
171
+ else
172
+ DKMLSYS_UNAME=/bin/uname
173
+ fi
174
+ fi
175
+ if [ -z "${DKMLSYS_ENV:-}" ]; then
176
+ if [ -x /usr/bin/env ]; then
177
+ DKMLSYS_ENV=/usr/bin/env
178
+ else
179
+ DKMLSYS_ENV=/bin/env
180
+ fi
181
+ fi
182
+ if [ -z "${DKMLSYS_AWK:-}" ]; then
183
+ if [ -x /usr/bin/awk ]; then
184
+ DKMLSYS_AWK=/usr/bin/awk
185
+ else
186
+ DKMLSYS_AWK=/bin/awk
187
+ fi
188
+ fi
189
+ if [ -z "${DKMLSYS_SED:-}" ]; then
190
+ if [ -x /usr/bin/sed ]; then
191
+ DKMLSYS_SED=/usr/bin/sed
192
+ else
193
+ DKMLSYS_SED=/bin/sed
194
+ fi
195
+ fi
196
+ if [ -z "${DKMLSYS_COMM:-}" ]; then
197
+ if [ -x /usr/bin/comm ]; then
198
+ DKMLSYS_COMM=/usr/bin/comm
199
+ else
200
+ DKMLSYS_COMM=/bin/comm
201
+ fi
202
+ fi
203
+ if [ -z "${DKMLSYS_INSTALL:-}" ]; then
204
+ if [ -x /usr/bin/install ]; then
205
+ DKMLSYS_INSTALL=/usr/bin/install
206
+ else
207
+ DKMLSYS_INSTALL=/bin/install
208
+ fi
209
+ fi
210
+ if [ -z "${DKMLSYS_RM:-}" ]; then
211
+ if [ -x /usr/bin/rm ]; then
212
+ DKMLSYS_RM=/usr/bin/rm
213
+ else
214
+ DKMLSYS_RM=/bin/rm
215
+ fi
216
+ fi
217
+ if [ -z "${DKMLSYS_SORT:-}" ]; then
218
+ if [ -x /usr/bin/sort ]; then
219
+ DKMLSYS_SORT=/usr/bin/sort
220
+ else
221
+ DKMLSYS_SORT=/bin/sort
222
+ fi
223
+ fi
224
+ if [ -z "${DKMLSYS_CAT:-}" ]; then
225
+ if [ -x /usr/bin/cat ]; then
226
+ DKMLSYS_CAT=/usr/bin/cat
227
+ else
228
+ DKMLSYS_CAT=/bin/cat
229
+ fi
230
+ fi
231
+ if [ -z "${DKMLSYS_STAT:-}" ]; then
232
+ if [ -x /usr/bin/stat ]; then
233
+ DKMLSYS_STAT=/usr/bin/stat
234
+ else
235
+ DKMLSYS_STAT=/bin/stat
236
+ fi
237
+ fi
238
+ if [ -z "${DKMLSYS_GREP:-}" ]; then
239
+ if [ -x /usr/bin/grep ]; then
240
+ DKMLSYS_GREP=/usr/bin/grep
241
+ else
242
+ DKMLSYS_GREP=/bin/grep
243
+ fi
244
+ fi
245
+ if [ -z "${DKMLSYS_CURL:-}" ]; then DKMLSYS_CURL=$(dk_prog_path curl); fi
246
+ if [ -z "${DKMLSYS_WGET:-}" ]; then DKMLSYS_WGET=$(dk_prog_path wget); fi
247
+ if [ -z "${DKMLSYS_TR:-}" ]; then
248
+ if [ -x /usr/bin/tr ]; then
249
+ DKMLSYS_TR=/usr/bin/tr
250
+ else
251
+ DKMLSYS_TR=/bin/tr
252
+ fi
253
+ fi
254
+ export DKMLSYS_MV DKMLSYS_CHMOD DKMLSYS_UNAME DKMLSYS_ENV DKMLSYS_AWK DKMLSYS_SED DKMLSYS_COMM DKMLSYS_INSTALL
255
+ export DKMLSYS_RM DKMLSYS_SORT DKMLSYS_CAT DKMLSYS_STAT DKMLSYS_GREP DKMLSYS_CURL DKMLSYS_WGET DKMLSYS_TR
256
+ }
257
+
258
+ # Is a Windows build machine if we are in a MSYS2 or Cygwin environment.
259
+ #
260
+ # Better alternatives
261
+ # -------------------
262
+ #
263
+ # 1. If you are checking to see if you should do a cygpath, then just guard it
264
+ # like so:
265
+ # if [ -x /usr/bin/cygpath ]; then
266
+ # do_something $(/usr/bin/cygpath ...) ...
267
+ # fi
268
+ # This clearly guards what you are about to do (cygpath) with what you will
269
+ # need (cygpath).
270
+ # 2. is_arg_windows_platform
271
+ is_unixy_windows_build_machine() {
272
+ if is_msys2_msys_build_machine || is_cygwin_build_machine; then
273
+ return 0
274
+ fi
275
+ return 1
276
+ }
277
+
278
+ # Is a MSYS2 environment with the MSYS or MINGW64 subsystem?
279
+ # * MSYS2 can also do MinGW 32-bit and 64-bit subsystems. Used by Diskuv OCaml
280
+ # * MINGW64 used by Git Bash (aka. GitHub Actions `shell: bash`)
281
+ # https://www.msys2.org/docs/environments/
282
+ is_msys2_msys_build_machine() {
283
+ if [ -e /usr/bin/msys-2.0.dll ] && {
284
+ [ "${MSYSTEM:-}" = "MSYS" ] || [ "${MSYSTEM:-}" = "MINGW64" ] || [ "${MSYSTEM:-}" = "UCRT64" ] || [ "${MSYSTEM:-}" = "CLANG64" ] || [ "${MSYSTEM:-}" = "MINGW32" ] || [ "${MSYSTEM:-}" = "CLANG32" ] || [ "${MSYSTEM:-}" = "CLANGARM64" ]
285
+ }; then
286
+ return 0
287
+ fi
288
+ return 1
289
+ }
290
+
291
+ is_cygwin_build_machine() {
292
+ if [ -e /usr/bin/cygwin1.dll ]; then
293
+ return 0
294
+ fi
295
+ return 1
296
+ }
297
+
298
+ # Tries to find the host ABI.
299
+ #
300
+ # Beware: This function uses `uname` probing may be inaccurate for dual-arch
301
+ # CPUs like Apple Silicon with Rosetta.
302
+ #
303
+ # Inputs:
304
+ # - env:DKML_HOST_ABI - Optional but recommended. If set, then BUILDHOST_ARCH will be set to the same.
305
+ #
306
+ # Outputs:
307
+ # - env:BUILDHOST_ARCH will contain the host ABI.
308
+ autodetect_buildhost_arch() {
309
+ if [ -n "${DKML_HOST_ABI:-}" ]; then
310
+ BUILDHOST_ARCH=$DKML_HOST_ABI
311
+ else
312
+ # Set DKMLSYS_*
313
+ autodetect_system_binaries
314
+
315
+ autodetect_buildhost_arch_SYSTEM=$("$DKMLSYS_UNAME" -s)
316
+ autodetect_buildhost_arch_MACHINE=$("$DKMLSYS_UNAME" -m)
317
+ # list from https://en.wikipedia.org/wiki/Uname and https://stackoverflow.com/questions/45125516/possible-values-for-uname-m
318
+ case "${autodetect_buildhost_arch_SYSTEM}-${autodetect_buildhost_arch_MACHINE}" in
319
+ Linux-armv7*)
320
+ BUILDHOST_ARCH=linux_arm32v7;;
321
+ Linux-armv6* | Linux-arm)
322
+ BUILDHOST_ARCH=linux_arm32v6;;
323
+ Linux-aarch64 | Linux-arm64 | Linux-armv8*)
324
+ BUILDHOST_ARCH=linux_arm64;;
325
+ Linux-i386 | Linux-i686)
326
+ BUILDHOST_ARCH=linux_x86;;
327
+ Linux-x86_64)
328
+ BUILDHOST_ARCH=linux_x86_64
329
+ # uname -m reports the KERNEL machine, so a 32-bit userland on
330
+ # a 64-bit kernel (ex. an i386 container on an amd64 host)
331
+ # still says x86_64 -- but a 64-bit dk0 cannot run there. The
332
+ # userland's own ELF class is the truth: byte 5 of /bin/sh is
333
+ # 1 for ELFCLASS32. od(1) is POSIX but not guaranteed present;
334
+ # without it, or on a 64-bit userland, the kernel's answer
335
+ # stands. test's numeric -eq tolerates od's leading
336
+ # whitespace; the redirected test guards non-numeric output.
337
+ autodetect_buildhost_arch_ELFCLASS=
338
+ if command -v od >/dev/null 2>&1; then
339
+ autodetect_buildhost_arch_ELFCLASS=$(od -An -td1 -j4 -N1 /bin/sh 2>/dev/null)
340
+ fi
341
+ if [ "${autodetect_buildhost_arch_ELFCLASS:-2}" -eq 1 ] 2>/dev/null; then
342
+ BUILDHOST_ARCH=linux_x86
343
+ # musl-based Linux (ex. alpine) is not a supported dk0 ABI yet;
344
+ # there is no musl dk0 build. Fail fast with a clear message
345
+ # instead of reaching a confusing "not provisioned" error later.
346
+ # A user who knows better can still force DKML_HOST_ABI. The musl
347
+ # dynamic loader path is the reliable marker; musl's ldd
348
+ # identifying itself is the fallback.
349
+ elif [ -e /lib/ld-musl-x86_64.so.1 ] \
350
+ || { ldd --version 2>&1 | grep -qi musl; } 2>/dev/null; then
351
+ printf "%s\n" "FATAL: musl-based Linux (e.g. Alpine) is not supported yet; dk0 needs a glibc-based distro" >&2
352
+ exit 1
353
+ fi
354
+ ;;
355
+ Darwin-arm64)
356
+ BUILDHOST_ARCH=darwin_arm64;;
357
+ Darwin-x86_64)
358
+ BUILDHOST_ARCH=darwin_x86_64;;
359
+ *-i386 | *-i686)
360
+ if is_unixy_windows_build_machine; then
361
+ BUILDHOST_ARCH=windows_x86
362
+ else
363
+ printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
364
+ exit 1
365
+ fi
366
+ ;;
367
+ *-x86_64)
368
+ if is_unixy_windows_build_machine; then
369
+ BUILDHOST_ARCH=windows_x86_64
370
+ else
371
+ printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
372
+ exit 1
373
+ fi
374
+ ;;
375
+ *)
376
+ # Since:
377
+ # 1) MSYS2 does not run on ARM/ARM64 (https://www.msys2.org/docs/environments/)
378
+ # 2) MSVC does not use ARM/ARM64 as host machine (https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-160)
379
+ # we do not support Windows ARM/ARM64 as a build machine
380
+ printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
381
+ exit 1
382
+ ;;
383
+ esac
384
+ fi
385
+ }
386
+
387
+ # A function that will try to print an ISO8601 timestamp, but will fallback to
388
+ # the system default. Always uses UTC timezone.
389
+ try_iso8601_timestamp() {
390
+ date -u -Iseconds 2>/dev/null || TZ=UTC date
391
+ }
392
+
393
+ # A function that will print the command and possibly time it (if and only if it uses a full path to
394
+ # an executable, so that 'time' does not fail on internal shell functions).
395
+ # If --return-error-code is the first argument or LOG_TRACE_RETURN_ERROR_CODE=ON, then instead of exiting the
396
+ # function will return the error code.
397
+ log_trace() {
398
+ log_trace_RETURN=${LOG_TRACE_RETURN_ERROR_CODE:-OFF}
399
+
400
+ log_trace_1="$1"
401
+ if [ "$log_trace_1" = "--return-error-code" ]; then
402
+ shift
403
+ log_trace_RETURN=ON
404
+ fi
405
+
406
+ if [ "${DKML_BUILD_TRACE:-OFF}" = ON ]; then
407
+ printf_maybe_quiet "[%s] %s\n" "$(try_iso8601_timestamp)" "+ $*"
408
+ if [ -x "$1" ]; then
409
+ time "$@"
410
+ else
411
+ "$@"
412
+ fi
413
+ else
414
+ # use judgement so we essentially have log at an INFO level
415
+ case "$1" in
416
+ rm|cp)
417
+ # debug level. only show when DKML_BUILD_TRACE=ON
418
+ ;;
419
+ git|make|ocaml_configure|ocaml_make|make_host|make_target)
420
+ # info level. and can show entire command without polluting the screen
421
+ printf_maybe_quiet "[%s] %s\n" "$(try_iso8601_timestamp)" "$*"
422
+ ;;
423
+ *) printf_maybe_quiet "[%s] %s\n" "$(try_iso8601_timestamp)" "$1"
424
+ esac
425
+ "$@"
426
+ fi
427
+ log_trace_ec="$?"
428
+ if [ "$log_trace_ec" -ne 0 ]; then
429
+ if [ "$log_trace_RETURN" = ON ]; then
430
+ return "$log_trace_ec"
431
+ else
432
+ printf "FATAL: Command failed with exit code %s: %s\n" "$log_trace_ec" "$*" >&2
433
+ exit "$log_trace_ec"
434
+ fi
435
+ fi
436
+ }
437
+
438
+ # [sha256compute FILE] writes the SHA256 checksum (hex encoded) of file FILE to the standard output.
439
+ sha256compute() {
440
+ sha256compute_FILE="$1"
441
+ shift
442
+ # For reasons unclear doing the following in MSYS2:
443
+ # sha256sum 'Z:\source\README.md'
444
+ # will produce a backslash like:
445
+ # \5518c76ed7234a153941fb7bc94b6e91d9cb8f1c4e22daf169a59b5878c3fc8a *Z:\\source\\README.md
446
+ # So always cygpath the filename if available
447
+ if [ -x /usr/bin/cygpath ]; then
448
+ sha256compute_FILE=$(/usr/bin/cygpath -a "$sha256compute_FILE")
449
+ fi
450
+
451
+ autodetect_system_binaries
452
+ if [ -x /usr/bin/shasum ]; then # macOS, OpenBSD, Debian
453
+ # CODESITE #1 (duplicates elsewhere).
454
+ # On Debian shasum is a perl script, and perl needs locale settings or it will complain.
455
+ # Confer: https://www.thomas-krenn.com/en/wiki/Perl_warning_Setting_locale_failed_in_Debian
456
+ # Confer: https://stackoverflow.com/a/52004330/21513816
457
+ # shellcheck disable=SC2016
458
+ LC_ALL=C /usr/bin/shasum -a 256 "$sha256compute_FILE" | "$DKMLSYS_AWK" '{print $1}'
459
+ elif [ -x /usr/bin/sha256sum ]; then # Linux, MSYS2
460
+ # shellcheck disable=SC2016
461
+ /usr/bin/sha256sum "$sha256compute_FILE" | "$DKMLSYS_AWK" '{print $1}'
462
+ elif [ -x /sbin/sha256 ]; then # FreeBSD
463
+ # shellcheck disable=SC2016
464
+ /sbin/sha256 -r "$sha256compute_FILE" | "$DKMLSYS_AWK" '{print $1}'
465
+ else
466
+ printf "FATAL: %s\n" "No sha256 checksum utility found" >&2
467
+ exit 107
468
+ fi
469
+ }
470
+
471
+ # [sha256check FILE SUM] checks that the file FILE has a SHA256 checksum (hex encoded) of SUM.
472
+ # The function will return nonzero (and exit with failure if `set -e` is enabled) if the checksum does not match.
473
+ sha256check() {
474
+ sha256check_FILE="$1"
475
+ shift
476
+ sha256check_SUM="$1"
477
+ shift
478
+
479
+ if [ -x /usr/bin/shasum ]; then # macOS, OpenBSD, Debian
480
+ # CODESITE #1 (duplicates elsewhere).
481
+ # On Debian shasum is a perl script, and perl needs locale settings or it will complain.
482
+ # Confer: https://www.thomas-krenn.com/en/wiki/Perl_warning_Setting_locale_failed_in_Debian
483
+ # Confer: https://stackoverflow.com/a/52004330/21513816
484
+ # Note: shasum 5.96 (ex. conanio/gcc7:1.64.1) has no --quiet option.
485
+ # shellcheck disable=SC2016
486
+ printf "%s %s" "$sha256check_SUM" "$sha256check_FILE" | LC_ALL=C /usr/bin/shasum -a 256 -c >&2
487
+ elif [ -x /usr/bin/sha256sum ]; then # Linux, MSYS2
488
+ # Note: BusyBox v1.35.0 sha256sum has no --quiet option.
489
+ printf "%s %s" "$sha256check_SUM" "$sha256check_FILE" | /usr/bin/sha256sum -c >&2
490
+ elif [ -x /sbin/sha256 ]; then # FreeBSD
491
+ /sbin/sha256 --quiet -c "$sha256check_SUM" "$sha256check_FILE" >&2
492
+ else
493
+ printf "FATAL: %s\n" "No sha256 checksum utility found" >&2
494
+
495
+ # REMOVEME!
496
+ if [ -d /sbin ]; then printf "/sbin:\n" >&2; ls /sbin >&2; fi
497
+ if [ -d /usr/sbin ]; then printf "/usr/sbin:\n" >&2; ls /usr/sbin >&2; fi
498
+ if [ -d /bin ]; then printf "/bin:\n" >&2; ls /bin >&2; fi
499
+ if [ -d /usr/bin ]; then printf "/usr/bin:\n" >&2; ls /usr/bin >&2; fi
500
+
501
+ exit 107
502
+ fi
503
+ }
504
+
505
+ # Echo --https-only if this wget supports it (BusyBox wget does not), so a
506
+ # redirect cannot downgrade the transfer off HTTPS wherever the option exists.
507
+ dk_wget_https_only() {
508
+ if "$DKMLSYS_WGET" --help 2>&1 | grep -q -- --https-only; then printf '%s' '--https-only'; fi
509
+ }
510
+
511
+ # [downloadfile URL FILE SUM] downloads from URL into FILE and verifies the SHA256 checksum of SUM.
512
+ # If the FILE already exists with the correct checksum it is not redownloaded.
513
+ # The function will exit with failure if the checksum does not match.
514
+ # curl pins HTTPS end to end (--proto '=https' + --proto-redir '=https') with a
515
+ # TLS 1.2 floor, and -f fails on an HTTP error page instead of saving it.
516
+ downloadfile() {
517
+ downloadfile_URL="$1"
518
+ shift
519
+ downloadfile_FILE="$1"
520
+ shift
521
+ downloadfile_SUM="$1"
522
+ shift
523
+
524
+ # Set DKMLSYS_*
525
+ autodetect_system_binaries
526
+
527
+ # Quick exit if exists and checksum verified. Do not display
528
+ # anything (even the checksum output) since this is the normal scenario
529
+ # that can run a billion times. The checksum verification for the
530
+ # download (if this fails) will not be silenced.
531
+ if [ -e "$downloadfile_FILE" ]; then
532
+ if sha256check "$downloadfile_FILE" "$downloadfile_SUM" > /dev/null 2>&1; then
533
+ return 0
534
+ else
535
+ $DKMLSYS_RM -f "$downloadfile_FILE"
536
+ fi
537
+ fi
538
+
539
+ printf_maybe_quiet "... %s %s\n" "Downloading" "$downloadfile_URL"
540
+ if [ "${CI:-}" = true ] || [ "${DKCODER_QUIET:-}" -eq 1 ]; then
541
+ if [ -n "$DKMLSYS_CURL" ]; then
542
+ log_trace "$DKMLSYS_CURL" --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL "$downloadfile_URL" -o "$downloadfile_FILE".tmp
543
+ elif [ -n "$DKMLSYS_WGET" ]; then
544
+ # shellcheck disable=SC2046 # prints one flag or nothing; must expand to zero words
545
+ log_trace "$DKMLSYS_WGET" $(dk_wget_https_only) -q -O "$downloadfile_FILE".tmp "$downloadfile_URL"
546
+ else
547
+ dk_no_downloader
548
+ fi
549
+ else
550
+ if [ -n "$DKMLSYS_CURL" ]; then
551
+ log_trace "$DKMLSYS_CURL" --proto '=https' --proto-redir '=https' --tlsv1.2 -fL "$downloadfile_URL" -o "$downloadfile_FILE".tmp
552
+ elif [ -n "$DKMLSYS_WGET" ]; then
553
+ # shellcheck disable=SC2046 # prints one flag or nothing; must expand to zero words
554
+ log_trace "$DKMLSYS_WGET" $(dk_wget_https_only) -O "$downloadfile_FILE".tmp "$downloadfile_URL"
555
+ else
556
+ dk_no_downloader
557
+ fi
558
+ fi
559
+ printf_maybe_quiet "\n... %s %s\n" "Verifying" "$downloadfile_URL"
560
+ if ! sha256check "$downloadfile_FILE".tmp "$downloadfile_SUM"; then
561
+ printf "%s\n" "FATAL: Encountered a corrupted or compromised download from $downloadfile_URL" >&2
562
+ exit 1
563
+ fi
564
+ printf_maybe_quiet "\n"
565
+ $DKMLSYS_MV "$downloadfile_FILE".tmp "$downloadfile_FILE"
566
+ }
567
+
568
+ # End import
569
+ # ---------------------------------------------------------------------------
570
+
571
+ # --- Environment detection ---
572
+
573
+ # Set DKMLSYS_*
574
+ autodetect_system_binaries
575
+
576
+ # Find host ABI. Set in BUILDHOST_ARCH
577
+ autodetect_buildhost_arch
578
+
579
+ # --- data home ---
580
+
581
+ tools_dir=
582
+ tools_name=dk0
583
+ # 1. Check DKCODER_DATA_HOME environment variable.
584
+ if [ -z "$tools_dir" ] && [ -n "${DKCODER_DATA_HOME:-}" ]; then
585
+ install -d "$DKCODER_DATA_HOME"
586
+ tools_dir="$DKCODER_DATA_HOME"
587
+ fi
588
+ # 2. Check if CI since many CI providers can only cache content in a subdirectory
589
+ # of the project.
590
+ if [ -z "$tools_dir" ] && [ "${CI:-}" = true ]; then
591
+ install -d "$DK_PROJECT_DIR/.z-dk/tools"
592
+ tools_dir="$DK_PROJECT_DIR/.z-dk/tools"
593
+ fi
594
+ # 2b. On Windows (Git Bash / MSYS2 / Cygwin) use the SAME store as dk0.cmd,
595
+ # %LOCALAPPDATA%\Programs\dk0, so a project driven from both PowerShell and
596
+ # a POSIX shell shares one cache instead of downloading every build twice.
597
+ # This sits after the CI check on purpose: dk0.cmd has no CI branch, but a
598
+ # Windows CI job driving ./dk0 from bash still wants the in-project cache.
599
+ # LOCALAPPDATA holds a native Windows path (MSYS does not convert
600
+ # environment variables), so cygpath it; needing cygpath also scopes this
601
+ # to MSYS/Cygwin.
602
+ if [ -z "$tools_dir" ] && [ -n "${COMSPEC:-}" ] && [ -n "${LOCALAPPDATA:-}" ] && [ -x /usr/bin/cygpath ]; then
603
+ tools_dir_LOCALAPPDATA=$(/usr/bin/cygpath -au "$LOCALAPPDATA")
604
+ if [ -w "$tools_dir_LOCALAPPDATA" ]; then
605
+ install -d "$tools_dir_LOCALAPPDATA/Programs/$tools_name"
606
+ tools_dir="$tools_dir_LOCALAPPDATA/Programs/$tools_name"
607
+ fi
608
+ fi
609
+ # 3. Check in locations rooted under /opt/diskuv
610
+ # We look under a /opt/diskuv early because
611
+ # - Especially important for WSL2 to use a pure Linux filesystem (ext4) for
612
+ # best performance.
613
+ # - Using a canonical location (especially /opt/diskuv/usr/share) makes
614
+ # it easy to use CMake presets for non-Windows hosts.
615
+ if [ -z "$tools_dir" ] && [ -n "${XDG_DATA_HOME:-}" ] && [ -w "/opt/diskuv/$XDG_DATA_HOME" ]; then
616
+ install -d "/opt/diskuv/$XDG_DATA_HOME/$tools_name"
617
+ tools_dir="/opt/diskuv/$XDG_DATA_HOME/$tools_name"
618
+ fi
619
+ if [ -z "$tools_dir" ] && [ -n "${HOME:-}" ] && [ -w "/opt/diskuv/$HOME" ]; then
620
+ install -d "/opt/diskuv/$HOME/.local/share/$tools_name"
621
+ tools_dir="/opt/diskuv/$HOME/.local/share/$tools_name"
622
+ fi
623
+ if [ -z "$tools_dir" ] && [ -w "/opt/diskuv/usr/share" ]; then
624
+ install -d "/opt/diskuv/usr/share/$tools_name"
625
+ tools_dir="/opt/diskuv/usr/share/$tools_name"
626
+ fi
627
+ # 4. Check in the conventional locations rooted under /
628
+ if [ -z "$tools_dir" ] && [ -n "${XDG_DATA_HOME:-}" ] && [ -w "$XDG_DATA_HOME" ]; then
629
+ install -d "$XDG_DATA_HOME/$tools_name"
630
+ tools_dir="$XDG_DATA_HOME/$tools_name"
631
+ fi
632
+ if [ -z "$tools_dir" ] && [ -n "${HOME:-}" ] && [ -w "$HOME" ]; then
633
+ install -d "$HOME/.local/share/$tools_name"
634
+ tools_dir="$HOME/.local/share/$tools_name"
635
+ fi
636
+ # 5. Validate
637
+ if [ -z "$tools_dir" ]; then
638
+ echo "FATAL: Could not find a location to install DkCoder." >&2
639
+ echo " ...: Make sure you have a home directory and that it is write-able, or define" >&2
640
+ echo " ...: the environment variable XDG_DATA_HOME in a shell profile script after" >&2
641
+ echo " ...: creating the \$XDG_DATA_HOME directory." >&2
642
+ exit 2
643
+ fi
644
+
645
+ # --- Tool downloads and installs ---
646
+
647
+ # PREREQS
648
+ # -------
649
+
650
+ install_linux_prog() {
651
+ install_linux_prog_NAME=$1
652
+ shift
653
+ install_linux_prog_PKG=$1
654
+ shift
655
+ install_linux_prog_ALPINE_PKG=$1
656
+ shift
657
+ if [ -x "/usr/bin/$install_linux_prog_NAME" ]; then
658
+ export DK_PROG_INSTALLED_LOCATION="/usr/bin/$install_linux_prog_NAME"
659
+ elif [ -x "/bin/$install_linux_prog_NAME" ]; then
660
+ export DK_PROG_INSTALLED_LOCATION="/bin/$install_linux_prog_NAME"
661
+ else
662
+ if [ -x /sbin/apk ]; then
663
+ if [ "$(id -u)" -eq 0 ]; then
664
+ run_maybe_quiet /sbin/apk add --quiet --no-progress "$install_linux_prog_ALPINE_PKG"
665
+ else
666
+ echo "Running: sudo /sbin/apk add --quiet --no-progress $install_linux_prog_ALPINE_PKG" >&2
667
+ sudo /sbin/apk add --quiet --no-progress "$install_linux_prog_ALPINE_PKG"
668
+ fi
669
+ elif command -v yum > /dev/null 2> /dev/null; then
670
+ if [ "$(id -u)" -eq 0 ]; then
671
+ run_maybe_quiet yum install -q -y "$install_linux_prog_PKG"
672
+ else
673
+ echo "Running: sudo yum install -q -y $install_linux_prog_PKG" >&2
674
+ sudo yum install -q -y "$install_linux_prog_PKG"
675
+ fi
676
+ else
677
+ if [ "$(id -u)" -eq 0 ]; then
678
+ run_maybe_quiet apt-get -qq install -y --no-install-suggests "$install_linux_prog_PKG"
679
+ else
680
+ echo "Running: sudo apt-get -qq install -y --no-install-suggests $install_linux_prog_PKG" >&2
681
+ sudo apt-get -qq install -y --no-install-suggests "$install_linux_prog_PKG"
682
+ fi
683
+ fi
684
+ DK_PROG_INSTALLED_LOCATION=$(command -v "$install_linux_prog_NAME")
685
+ export DK_PROG_INSTALLED_LOCATION
686
+ fi
687
+ }
688
+
689
+ case "$BUILDHOST_ARCH" in
690
+ linux_*)
691
+ # Need either [wget] or [curl] for [downloadfile]
692
+ if [ ! -x /usr/bin/wget ] && [ ! -x /bin/wget ] && [ ! -x /usr/bin/curl ] && [ ! -x /bin/curl ]; then
693
+ install_linux_prog wget wget wget || install_linux_prog curl curl curl
694
+ fi
695
+ ;;
696
+ esac
697
+
698
+ # -----
699
+ # resolve version + verify the signed manifest
700
+ # -----
701
+
702
+ # A checksum-less fetch (the manifest is trusted by SIGNATURE, not a pre-known
703
+ # checksum). curl or wget, matching downloadfile's tool detection.
704
+ dk_fetch() {
705
+ # shellcheck disable=SC2046 # prints one flag or nothing; must expand to zero words
706
+ if [ -n "$DKMLSYS_CURL" ]; then "$DKMLSYS_CURL" --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL "$1" -o "$2"
707
+ elif [ -n "$DKMLSYS_WGET" ]; then "$DKMLSYS_WGET" $(dk_wget_https_only) -q -O "$2" "$1"
708
+ else dk_no_downloader; fi
709
+ }
710
+
711
+ # Read `%% actual_version("X.Y.Z.W")` from dk.u's workspace section (the pin).
712
+ # The `[(]?` tolerates the parenthesized call form dk0 writes (the workspace Lua
713
+ # grammar rejects the bare `actual_version "X"` string-call sugar); the version
714
+ # is the first double-quoted field either way.
715
+ dk_read_actual_version() {
716
+ [ -f "$DK_PROJECT_DIR/dk.u" ] || return 0
717
+ "$DKMLSYS_GREP" -oE '%%[[:space:]]*actual_version[[:space:]]*[(]?[[:space:]]*"[^"]+"' "$DK_PROJECT_DIR/dk.u" 2>/dev/null \
718
+ | head -1 | "$DKMLSYS_SED" 's/.*"\([^"]*\)".*/\1/'
719
+ }
720
+
721
+ # Read a plain key=value field from a verified manifest.
722
+ dk_manifest_str() {
723
+ "$DKMLSYS_GREP" "^$2=" "$1" | head -1 | cut -d= -f2
724
+ }
725
+
726
+ # Defense-in-depth: the dk0 download URL comes from the signify-verified manifest,
727
+ # but still restrict it to known hosts so a signed-but-malicious manifest cannot
728
+ # redirect the fetch off github.com/dkpkg or the legacy GitLab package host.
729
+ dk_allow_host() {
730
+ case "$1" in
731
+ https://github.com/dkpkg/*) return 0 ;;
732
+ https://gitlab.com/api/v4/projects/60486861/*) return 0 ;;
733
+ *) return 1 ;;
734
+ esac
735
+ }
736
+
737
+ # On Windows the published dk0 + mlfront-signify binaries carry a `.exe`
738
+ # extension; other platforms have none. Mirrors gen-manifest.sh's extexe.
739
+ dk_extexe() { case "$BUILDHOST_ARCH" in windows_*) printf '.exe' ;; esac; }
740
+
741
+ # Fetch + signify-verify the manifest into $1. $2 is the pinned version ("" =
742
+ # latest). Aborts on any verification failure. Trust anchor = the baked
743
+ # mlfront-signify SHA-256, then the baked public key over the manifest.
744
+ dk_verify_manifest() {
745
+ dvm_out=$1; dvm_ver=$2
746
+ dvm_sigarch=$BUILDHOST_ARCH
747
+ eval "dvm_pin=\${cksum_signify_${dvm_sigarch}:-}"
748
+ # Empty = the arch was never provisioned; a value still starting with `__` is
749
+ # a maintained-but-unbaked placeholder (e.g. windows_x86 until its signify job
750
+ # ships). Both are "not provisioned" -- refuse rather than fetch and trust an
751
+ # unverifiable verifier.
752
+ # shellcheck disable=SC2154 # dvm_pin is assigned by the eval above
753
+ case "$dvm_pin" in
754
+ '' | __*) echo "FATAL: no pinned mlfront-signify checksum for $BUILDHOST_ARCH (launcher not provisioned)" >&2; exit 3 ;;
755
+ esac
756
+ install -d "$tools_dir/verifier"
757
+ dvm_exe=$(dk_extexe)
758
+ dvm_signify="$tools_dir/verifier/mlfront-signify-$dvm_pin$dvm_exe"
759
+ downloadfile "https://gitlab.com/api/v4/projects/60486861/packages/generic/mlfront-signify/$signify_pkg_ver/mlfront-signify-$dvm_sigarch$dvm_exe" "$dvm_signify" "$dvm_pin"
760
+ chmod +x "$dvm_signify"
761
+ if [ -n "$dvm_ver" ]; then dvm_url="$DK_BASE_URL/manifest-$dvm_ver.txt"; else dvm_url="$DK_BASE_URL/manifest.txt"; fi
762
+ dk_fetch "$dvm_url" "$dvm_out"
763
+ dk_fetch "$dvm_url.sig" "$dvm_out.sig"
764
+ printf 'untrusted comment: dk0 signify public key\n%s\n' "$SIGNIFY_PUBKEY_B64" > "$tools_dir/verifier/dk0.pub"
765
+ "$dvm_signify" -V -q -p "$tools_dir/verifier/dk0.pub" -m "$dvm_out" -x "$dvm_out.sig" \
766
+ || { echo "FATAL: manifest signature INVALID for $dvm_url -- refusing to continue" >&2; exit 1; }
767
+ }
768
+
769
+ # Resolve the version. `--self-update` ignores the pin and uses the LATEST dk0,
770
+ # which rewrites the dk.u actual_version to its own version -- dk0.exe edits dk.u
771
+ # safely, so this launcher never does file surgery (and stays batch-safe on the
772
+ # Windows side too). Otherwise use the dk.u pin, else the latest.
773
+ dk_selfupdate=0
774
+ [ "${1:-}" = "--self-update" ] && dk_selfupdate=1
775
+ if [ "$dk_selfupdate" = 1 ]; then
776
+ majminpat_ver=
777
+ else
778
+ majminpat_ver=$(dk_read_actual_version)
779
+ fi
780
+ dk_manifest="$tools_dir/verifier/manifest"
781
+ dk_verify_manifest "$dk_manifest" "$majminpat_ver"
782
+ if [ -z "$majminpat_ver" ]; then
783
+ majminpat_ver=$(dk_manifest_str "$dk_manifest" version)
784
+ [ "$dk_selfupdate" = 0 ] && echo "dk0: no '%% actual_version' pin in dk.u; using latest $majminpat_ver (run './dk0 --self-update' to pin)" >&2
785
+ fi
786
+ [ -n "$majminpat_ver" ] || { echo "FATAL: could not resolve a dk0 version" >&2; exit 1; }
787
+ dk0_cksum=$(dk_manifest_str "$dk_manifest" "dk0_${BUILDHOST_ARCH}")
788
+ [ -n "$dk0_cksum" ] || { echo "FATAL: manifest has no dk0 build for $BUILDHOST_ARCH (version $majminpat_ver)" >&2; exit 3; }
789
+ dk0_url_template=$(dk_manifest_str "$dk_manifest" "dk0_url_template")
790
+ [ -n "$dk0_url_template" ] || { echo "FATAL: manifest has no dk0_url_template (version $majminpat_ver)" >&2; exit 1; }
791
+
792
+ # -----
793
+ # single binary executable
794
+ # -----
795
+
796
+ DK_EXE=
797
+
798
+ destdir=$tools_dir/dk0exe-$majminpat_ver-$BUILDHOST_ARCH
799
+ install -d "$destdir"
800
+ dk0_exe="$destdir/dk0$(dk_extexe)"
801
+ download_helper() {
802
+ download_helper_CKSUM=$1; shift
803
+ # Resolve {version}/{arch}/{exe} in the verified manifest's dk0_url_template,
804
+ # then allowlist the host before fetching.
805
+ download_helper_URL=$(printf '%s' "$dk0_url_template" | "$DKMLSYS_SED" \
806
+ -e "s|{version}|$majminpat_ver|g" -e "s|{arch}|$BUILDHOST_ARCH|g" -e "s|{exe}|$(dk_extexe)|g")
807
+ dk_allow_host "$download_helper_URL" \
808
+ || { echo "FATAL: dk0 download host not allowlisted: $download_helper_URL" >&2; exit 1; }
809
+ downloadfile "$download_helper_URL" "$dk0_exe" "$download_helper_CKSUM"
810
+ }
811
+ download_dk() {
812
+ # dk0 checksum comes from the signify-verified manifest, not a baked value.
813
+ download_helper "$dk0_cksum"
814
+ }
815
+ # downloadfile skips the download when the cached dk0 already matches the manifest
816
+ # checksum, so this is a no-op on the common (already-cached) path. (A `--version`
817
+ # comparison would not work: dk0 prints "X.Y.Z+rev-W" but the pin is "X.Y.Z.W".)
818
+ download_dk
819
+ chmod +x "$dk0_exe"
820
+
821
+ # Set DK_EXE
822
+ DK_EXE="$dk0_exe"
823
+
824
+ # -----
825
+ # launcher store GC
826
+ # -----
827
+
828
+ # Every dk0 version installs into its own $tools_dir/dk0exe-* directory and
829
+ # old versions accumulate forever. Mark the pinned version as used, then
830
+ # remove version directories (and superseded verifier binaries) that no
831
+ # launcher has used in 30 days. Everything here re-downloads on demand from
832
+ # its signed manifest, so deletion is always safe; pruning must never break
833
+ # the launch, hence the blanket error suppression and the [find] guard
834
+ # (skip pruning entirely on systems without [find]).
835
+ touch "$destdir" "$dvm_signify" 2>/dev/null || true
836
+ if command -v find >/dev/null 2>&1; then
837
+ find "$tools_dir" -maxdepth 1 -type d -name 'dk0exe-*' -mtime +30 \
838
+ -exec "$DKMLSYS_RM" -rf {} + 2>/dev/null || true
839
+ find "$tools_dir/verifier" -maxdepth 1 -type f -name 'mlfront-signify-*' \
840
+ -mtime +30 -exec "$DKMLSYS_RM" -f {} + 2>/dev/null || true
841
+ fi
842
+
843
+ # --- Run executable ---
844
+
845
+ # We already changed to DK_PROJECT_DIR earlier. Change back.
846
+ cd "$dk_pwd"
847
+
848
+ export DKCODER_ARG0="$0"
849
+ export DKCODER_PWD="$dk_pwd"
850
+ export DK_PROJECT_DIR
851
+ # Tell the dk0 binary the real execution host. dkml-c-probe bakes the ABI of
852
+ # the C compiler that built the binary, so a musl dk0 cross-built on glibc
853
+ # would otherwise self-identify as linux_x86_64 and resolve the glibc
854
+ # toolchain on a musl host. BUILDHOST_ARCH is the launcher's own host
855
+ # detection (honors a pre-set DKML_HOST_ABI, else uname + the musl loader
856
+ # probe above), so propagate it as DKML_HOST_ABI which the binary honors.
857
+ export DKML_HOST_ABI="$BUILDHOST_ARCH"
858
+ # shellcheck disable=SC2086
859
+ if [ "$dk_selfupdate" = 1 ]; then
860
+ # dk0.exe repins the dk.u actual_version line to the resolved (latest) version.
861
+ exec "$DK_EXE" -isystem "$DK_PROJECT_DIR/etc/dk/i" $_DKEXE_OPTIONS self-update "$majminpat_ver"
862
+ else
863
+ exec "$DK_EXE" -isystem "$DK_PROJECT_DIR/etc/dk/i" $_DKEXE_OPTIONS "$@"
864
+ fi
dk0.cmd ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @ECHO OFF
2
+ REM ##########################################################################
3
+ REM # File: dk\dk0.cmd #
4
+ REM # #
5
+ REM # Copyright 2025 Diskuv, Inc. #
6
+ REM # #
7
+ REM # Licensed under the Open Software License version 3.0 #
8
+ REM # (the "License"); you may not use this file except in compliance #
9
+ REM # with the License. You may obtain a copy of the License at #
10
+ REM # #
11
+ REM # https://opensource.org/license/osl-3-0-php/ #
12
+ REM # #
13
+ REM ##########################################################################
14
+
15
+ REM Recommendation: Place this file in source control.
16
+ REM
17
+ REM Manifest-driven, self-updating dk0 launcher for Windows. Pure batch on the
18
+ REM hot path -- PowerShell is used only as a last-resort download fallback (after
19
+ REM curl and BITSADMIN), never for logic -- so it runs on locked-down machines.
20
+ REM 1. download the pinned mlfront-signify verifier, check it against the
21
+ REM SHA-256 baked below (the anchor -- not the manifest, so no circularity);
22
+ REM 2. verify the signify signature over the manifest with the baked pubkey;
23
+ REM 3. read the manifest's dk0 SHA-256 (plain key=value, no JSON), download and
24
+ REM cache dk0.exe, then exec it.
25
+ REM This file never rewrites itself.
26
+
27
+ SETLOCAL ENABLEDELAYEDEXPANSION
28
+
29
+ SET "DK_PROJECT_DIR=%~dp0"
30
+ SET "DKCODER_PWD=%CD%"
31
+
32
+ REM ===== BAKED TRUST ROOT (rotates rarely; updated only on key/verifier rotation) =====
33
+ SET "SIGNIFY_PUBKEY_B64=RWTMq/GqeeJ06ACy7By/H05vvtpc3ZPEKlbnDm9fIQxpkgTV92is6YHD"
34
+ SET "DK_CKSUM_SIGNIFY_WINDOWS_X86_64=ebe1aa87a3eb87ed6769782a31916fab72bbdf0ced22d6ddd9a7a455e23e2c68"
35
+ REM windows_x86 (32-bit) mlfront-signify is not published at SIGNIFY_PKG_VER yet;
36
+ REM the __ placeholder trips the not-provisioned guard below until a real checksum
37
+ REM is baked here (matching the ci/dist/dk0 shell slot) so .\dk0.cmd and ./dk0
38
+ REM light up together.
39
+ SET "DK_CKSUM_SIGNIFY_WINDOWS_X86=__CKSUM_SIGNIFY_WINDOWS_X86__"
40
+ REM The verifier is pinned by version+checksum and fetched from its GitLab package
41
+ REM (a direct download, not the throttled listing API); the site serves only the
42
+ REM signed manifest and the wrappers.
43
+ SET "SIGNIFY_PKG_VER=2.4.2.271"
44
+ IF "%DK0_BASE_URL%"=="" (SET "DK_BASE_URL=https://diskuv.com/dk") ELSE (SET "DK_BASE_URL=%DK0_BASE_URL%")
45
+ REM ====================================================================================
46
+
47
+ REM Detect the Windows architecture (WOW64-aware) and select its pinned verifier.
48
+ REM A 32-bit process on 64-bit Windows reports PROCESSOR_ARCHITECTURE=x86 but has
49
+ REM PROCESSOR_ARCHITEW6432 defined; genuine 32-bit Windows does not.
50
+ SET "DK_ARCH=windows_x86_64"
51
+ SET "DK_CKSUM_SIGNIFY=%DK_CKSUM_SIGNIFY_WINDOWS_X86_64%"
52
+ IF /I "%PROCESSOR_ARCHITECTURE%"=="x86" IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
53
+ SET "DK_ARCH=windows_x86"
54
+ SET "DK_CKSUM_SIGNIFY=%DK_CKSUM_SIGNIFY_WINDOWS_X86%"
55
+ )
56
+ IF "!DK_CKSUM_SIGNIFY:~0,2!"=="__" (
57
+ ECHO dk0: no pinned mlfront-signify checksum for !DK_ARCH! ^(launcher not provisioned^) 1>&2
58
+ EXIT /B 3
59
+ )
60
+
61
+ IF "%DKCODER_DATA_HOME%"=="" (SET "DK_DATA_HOME=%LOCALAPPDATA%\Programs\dk0") ELSE (SET "DK_DATA_HOME=%DKCODER_DATA_HOME%")
62
+ SET "DK_VDIR=%DK_DATA_HOME%\verifier"
63
+ IF NOT EXIST "%DK_VDIR%" MKDIR "%DK_VDIR%" >NUL 2>&1
64
+
65
+ REM 1. Pinned verifier from GitLab, checked against the baked SHA-256 (the anchor).
66
+ SET "DK_SIGNIFY=%DK_VDIR%\mlfront-signify-%DK_CKSUM_SIGNIFY%.exe"
67
+ IF NOT EXIST "%DK_SIGNIFY%" (
68
+ CALL :fetch "https://gitlab.com/api/v4/projects/60486861/packages/generic/mlfront-signify/%SIGNIFY_PKG_VER%/mlfront-signify-!DK_ARCH!.exe" "%DK_SIGNIFY%"
69
+ IF !ERRORLEVEL! NEQ 0 EXIT /B 1
70
+ )
71
+ CALL :sha256 "%DK_SIGNIFY%" DK_SIG_ACTUAL
72
+ IF /I NOT "!DK_SIG_ACTUAL!"=="%DK_CKSUM_SIGNIFY%" (
73
+ ECHO dk0: mlfront-signify checksum mismatch ^(verifier not trusted^) 1>&2
74
+ EXIT /B 1
75
+ )
76
+
77
+ REM 2. Write the baked public key (pure batch; signify accepts the CRLF form).
78
+ > "%DK_VDIR%\dk0.pub" ECHO untrusted comment: dk0 signify public key
79
+ >> "%DK_VDIR%\dk0.pub" ECHO %SIGNIFY_PUBKEY_B64%
80
+
81
+ REM 3. Read the dk.u pin: the version between quotes on the actual_version line.
82
+ SET "DK_PIN="
83
+ IF EXIST "%DK_PROJECT_DIR%dk.u" CALL :readpin
84
+
85
+ REM --self-update handled by dk0.exe (it edits dk.u safely); see below after resolve.
86
+ SET "DK_SELFUPDATE=0"
87
+ IF "%~1"=="--self-update" SET "DK_SELFUPDATE=1"
88
+
89
+ REM 4. Verify the manifest and resolve the version + dk0 checksum. Self-update and
90
+ REM an unpinned project both use the latest manifest.
91
+ IF "%DK_SELFUPDATE%"=="1" (SET "DK_WANT=") ELSE (SET "DK_WANT=%DK_PIN%")
92
+ CALL :getmanifest "%DK_WANT%"
93
+ IF !ERRORLEVEL! NEQ 0 EXIT /B 1
94
+ IF "%DK_WANT%"=="" (
95
+ CALL :mval version DK_VER
96
+ IF "%DK_SELFUPDATE%"=="0" IF "%DK_PIN%"=="" ECHO dk0: no actual_version pin in dk.u; using latest !DK_VER! ^(run "dk0 --self-update" to pin^) 1>&2
97
+ ) ELSE (
98
+ SET "DK_VER=%DK_PIN%"
99
+ )
100
+ IF "!DK_VER!"=="" (ECHO dk0: could not resolve a dk0 version 1>&2 & EXIT /B 1)
101
+ CALL :mval dk0_!DK_ARCH! DK_CKSUM
102
+ IF "!DK_CKSUM!"=="" (ECHO dk0: manifest has no dk0 build for !DK_ARCH! ^(version !DK_VER!^) 1>&2 & EXIT /B 3)
103
+ CALL :mval dk0_url_template DK_TMPL
104
+ IF "!DK_TMPL!"=="" (ECHO dk0: manifest has no dk0_url_template ^(version !DK_VER!^) 1>&2 & EXIT /B 1)
105
+
106
+ REM 5. Cache + download dk0.exe (version-keyed dir; never overwrite a running exe).
107
+ SET "DK_EXEDIR=%DK_DATA_HOME%\dk0exe-!DK_VER!-!DK_ARCH!"
108
+ IF NOT EXIST "!DK_EXEDIR!" MKDIR "!DK_EXEDIR!" >NUL 2>&1
109
+ SET "DK_EXE=!DK_EXEDIR!\dk0.exe"
110
+ SET "DK_NEED_EXE=1"
111
+ IF EXIST "!DK_EXE!" (
112
+ CALL :sha256 "!DK_EXE!" DK_EXE_ACTUAL
113
+ IF /I "!DK_EXE_ACTUAL!"=="!DK_CKSUM!" SET "DK_NEED_EXE=0"
114
+ )
115
+ IF !DK_NEED_EXE! EQU 1 (
116
+ REM Resolve {version}/{arch}/{exe} in the verified dk0_url_template, then
117
+ REM allowlist the host before downloading.
118
+ SET "DK_URL=!DK_TMPL!"
119
+ SET "DK_URL=!DK_URL:{version}=%DK_VER%!"
120
+ SET "DK_URL=!DK_URL:{arch}=%DK_ARCH%!"
121
+ SET "DK_URL=!DK_URL:{exe}=.exe!"
122
+ CALL :allowhost "!DK_URL!"
123
+ IF !ERRORLEVEL! NEQ 0 (ECHO dk0: download host not allowlisted: !DK_URL! 1>&2 & EXIT /B 1)
124
+ CALL :fetch "!DK_URL!" "!DK_EXE!"
125
+ IF !ERRORLEVEL! NEQ 0 EXIT /B 1
126
+ CALL :sha256 "!DK_EXE!" DK_EXE_ACTUAL
127
+ IF /I NOT "!DK_EXE_ACTUAL!"=="!DK_CKSUM!" (ECHO dk0: dk0.exe checksum mismatch 1>&2 & EXIT /B 1)
128
+ )
129
+
130
+ REM 6. Launcher store GC. Every dk0 version installs into its own dk0exe-*
131
+ REM directory and old versions accumulate forever. Mark the pinned version
132
+ REM (and the current verifier) as used, then remove version directories and
133
+ REM superseded verifier binaries no launcher has used in 30 days. Everything
134
+ REM here re-downloads on demand from its signed manifest, so deletion is
135
+ REM always safe; pruning must never break the launch, so every step
136
+ REM suppresses errors. Pure batch: the mtime bump is a create+delete of a
137
+ REM marker file (updates the directory timestamp), the verifier bump is the
138
+ REM batch copy-touch idiom, and the age test is FORFILES /D.
139
+ >"!DK_EXEDIR!\.dk0-touch" ECHO OK
140
+ DEL /Q "!DK_EXEDIR!\.dk0-touch" >NUL 2>&1
141
+ COPY /B "%DK_SIGNIFY%"+,, "%DK_SIGNIFY%" >NUL 2>&1
142
+ FORFILES /P "%DK_DATA_HOME%" /M dk0exe-* /D -30 /C "cmd /c if @isdir==TRUE rd /s /q @path" >NUL 2>&1
143
+ FORFILES /P "%DK_VDIR%" /M mlfront-signify-*.exe /D -30 /C "cmd /c del /q @path" >NUL 2>&1
144
+
145
+ REM 7. Run it (same contract as the POSIX wrapper). dk0 --self-update rewrites the
146
+ REM dk.u actual_version line itself (dk0.exe edits dk.u safely; this launcher
147
+ REM never does file surgery on dk.u).
148
+ SET "DKCODER_ARG0=dk0"
149
+ IF "%DK_SELFUPDATE%"=="1" (
150
+ REM dk0.exe repins the dk.u actual_version line to the resolved (latest) version.
151
+ "!DK_EXE!" -isystem "%DK_PROJECT_DIR%etc\dk\i" self-update !DK_VER!
152
+ ) ELSE (
153
+ "!DK_EXE!" -isystem "%DK_PROJECT_DIR%etc\dk\i" %*
154
+ )
155
+ EXIT /B %ERRORLEVEL%
156
+
157
+ REM ================= subroutines =================
158
+
159
+ REM :fetch URL DEST -- download without a checksum (the manifest is verified by
160
+ REM signature). curl first, then BITSADMIN, then PowerShell -- so no PowerShell
161
+ REM dependency on machines that ship curl (Windows 10 1803+).
162
+ :fetch
163
+ IF EXIST "%SystemRoot%\System32\curl.exe" (
164
+ "%SystemRoot%\System32\curl.exe" -fsSL "%~1" -o "%~2" && EXIT /B 0
165
+ )
166
+ BITSADMIN /TRANSFER dk0fetch /DOWNLOAD /PRIORITY FOREGROUND "%~1" "%~2" >NUL 2>&1 && EXIT /B 0
167
+ powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "$ProgressPreference='SilentlyContinue'; Invoke-WebRequest -UseBasicParsing -Uri '%~1' -OutFile '%~2'" >NUL 2>&1 && EXIT /B 0
168
+ ECHO dk0: could not download %~1 1>&2
169
+ EXIT /B 1
170
+
171
+ REM :sha256 FILE OUTVAR -- set OUTVAR to the lowercased SHA-256 of FILE.
172
+ :sha256
173
+ SET "%~2="
174
+ FOR /F "usebackq tokens=* delims=" %%H IN (`certutil -hashfile "%~1" SHA256 ^| findstr /R "^[0-9a-fA-F][0-9a-fA-F]*$"`) DO (
175
+ IF NOT DEFINED %~2 SET "%~2=%%H"
176
+ )
177
+ IF DEFINED %~2 SET "%~2=!%~2: =!"
178
+ EXIT /B 0
179
+
180
+ REM :getmanifest VER -- fetch manifest[-VER].txt + .sig into %DK_VDIR%, signify-verify.
181
+ :getmanifest
182
+ IF "%~1"=="" (SET "DK_MURL=%DK_BASE_URL%/manifest.txt") ELSE (SET "DK_MURL=%DK_BASE_URL%/manifest-%~1.txt")
183
+ CALL :fetch "!DK_MURL!" "%DK_VDIR%\manifest"
184
+ IF !ERRORLEVEL! NEQ 0 EXIT /B 1
185
+ CALL :fetch "!DK_MURL!.sig" "%DK_VDIR%\manifest.sig"
186
+ IF !ERRORLEVEL! NEQ 0 EXIT /B 1
187
+ "%DK_SIGNIFY%" -V -q -p "%DK_VDIR%\dk0.pub" -m "%DK_VDIR%\manifest" -x "%DK_VDIR%\manifest.sig"
188
+ IF !ERRORLEVEL! NEQ 0 (ECHO dk0: manifest signature INVALID for !DK_MURL! -- refusing to continue 1>&2 & EXIT /B 1)
189
+ EXIT /B 0
190
+
191
+ REM :mval KEY OUTVAR -- read key=value from the verified %DK_VDIR%\manifest.
192
+ :mval
193
+ SET "%~2="
194
+ FOR /F "usebackq tokens=1,* delims==" %%A IN ("%DK_VDIR%\manifest") DO (
195
+ IF /I "%%A"=="%~1" SET "%~2=%%B"
196
+ )
197
+ EXIT /B 0
198
+
199
+ REM :allowhost URL -- EXIT /B 0 if URL starts with an allowlisted host prefix,
200
+ REM else 1. Defense-in-depth over the signify-verified template (a signed-but-
201
+ REM malicious manifest still cannot redirect the download off a known host).
202
+ :allowhost
203
+ ECHO %~1| findstr /B /L /C:"https://github.com/dkpkg/" /C:"https://gitlab.com/api/v4/projects/60486861/" >NUL 2>&1
204
+ EXIT /B !ERRORLEVEL!
205
+
206
+ REM :readpin -- set DK_PIN to the version between the quotes on the dk.u
207
+ REM actual_version line. The caret-escaped FOR options are how batch uses a
208
+ REM double-quote as a delimiter (a quoted "delims=^"" options string does not work).
209
+ :readpin
210
+ FOR /F usebackq^ tokens^=2^ delims^=^" %%V IN (`findstr /L /C:"actual_version" "%DK_PROJECT_DIR%dk.u"`) DO SET "DK_PIN=%%V"
211
+ EXIT /B 0
dk1 ADDED
@@ -0,0 +1,864 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/sh
2
+ ##########################################################################
3
+ # File: mlfront/dk1 #
4
+ # #
5
+ # Copyright 2025 Diskuv, Inc. #
6
+ # #
7
+ # Licensed under the Open Software License version 3.0 #
8
+ # (the "License"); you may not use this file except in compliance #
9
+ # with the License. You may obtain a copy of the License at #
10
+ # #
11
+ # https://opensource.org/license/osl-3-0-php/ #
12
+ # #
13
+ ##########################################################################
14
+
15
+ # Recommendation: Place this file in source control.
16
+ #
17
+ # Invoking: ./dk1
18
+ # That works in Powershell on Windows, and in Unix. Copy-and-paste works!
19
+ #
20
+ # Purpose: Install dk1 if not present. Then invoke dk1.
21
+
22
+ # The cksum_signify_* constants below are read indirectly, through the dynamic
23
+ # eval lookup in dk_verify_manifest that builds the variable name from the host
24
+ # ABI; that reference is invisible to the linter, so the file-wide directive on
25
+ # the next line turns off its unused-variable warning.
26
+ # shellcheck disable=SC2034
27
+ set -euf
28
+
29
+ # ===== BAKED TRUST ROOT (rotates rarely; updated only on key/verifier rotation) =====
30
+ # The dk1 version is NOT baked here. It is pinned per project by a
31
+ # %% actual_version("X.Y.Z.W")
32
+ # line in dk.u's `## workspace` section (or the latest signed manifest if absent).
33
+ # dk1 and its checksum come from a signify-signed manifest verified at runtime:
34
+ # 1. download the pinned mlfront-signify verifier from its GitLab package (by
35
+ # the baked version below), check it against the SHA-256 baked below (the
36
+ # anchor -- not the manifest, so no circularity);
37
+ # 2. verify the signify signature over the manifest (manifest.txt) with the
38
+ # baked public key;
39
+ # 3. only then read the manifest's per-arch dk1 SHA-256.
40
+ # This file never rewrites itself (Windows batch/exe safety); `dk1 --self-update`
41
+ # edits only the dk.u actual_version line, and key rotation is followed at
42
+ # verify-time via the manifest's continuation chain.
43
+ SIGNIFY_PUBKEY_B64="RWTMq/GqeeJ06ACy7By/H05vvtpc3ZPEKlbnDm9fIQxpkgTV92is6YHD"
44
+ # The verifier is pinned by version+checksum and fetched from GitLab (a direct
45
+ # package download, not the throttled listing API); the site serves only the
46
+ # signed manifest and the wrappers.
47
+ signify_pkg_ver="2.4.2.271"
48
+ cksum_signify_linux_x86_64="9701ed5821ea57114890f2d54381ee29742b45292ea0c8a259b0d4187c728a4d"
49
+ cksum_signify_linux_x86="533ec71ef0c6081c57850c840d29df5ca8efd3c2722b54dc77c14224dda0c418"
50
+ cksum_signify_darwin_arm64="89513c94add01ef5e15fa4c3a171755cd3eb783f552b9d4a3dedd009fa89a062"
51
+ cksum_signify_darwin_x86_64="875ba2f6840bb705ed2346c9c3a165ee5fdfde559df4b9adfa0c6f915043eade"
52
+ cksum_signify_windows_x86_64="ebe1aa87a3eb87ed6769782a31916fab72bbdf0ced22d6ddd9a7a455e23e2c68"
53
+ # windows_x86 (32-bit) mlfront-signify is not published at signify_pkg_ver yet.
54
+ # Keep the slot maintained: the __ placeholder trips the not-provisioned guard
55
+ # in dk_verify_manifest until a real checksum is baked here (and dk1.cmd carries
56
+ # the matching x86 slot), so ./dk1 and .\dk1.cmd light up together.
57
+ cksum_signify_windows_x86="__CKSUM_SIGNIFY_WINDOWS_X86__"
58
+ DK_BASE_URL="${DK1_BASE_URL:-https://diskuv.com/dk}"
59
+ # ====================================================================================
60
+
61
+ dk_pwd=$PWD
62
+
63
+ # Get the dk project tree
64
+ DK_PROJECT_DIR=$(dirname "$0")
65
+ DK_PROJECT_DIR=$(cd "$DK_PROJECT_DIR" && pwd)
66
+
67
+ # --- Windows ---
68
+ # There is no shunt to dk1.cmd here. The block that used to live here required
69
+ # [ -x /usr/bin/cmd ], and no MSYS2, Cygwin, or Git Bash layout ships a `cmd` in
70
+ # /usr/bin, so it never fired on any host. This script handles Windows directly
71
+ # instead: autodetect_buildhost_arch resolves windows_x86_64 / windows_x86 via
72
+ # is_unixy_windows_build_machine, dk_extexe adds the .exe suffix, the data home
73
+ # below shares dk1.cmd's store, and MSYS converts POSIX paths in argv when
74
+ # exec'ing the native dk1.exe. A shunt could not be the whole answer anyway: a
75
+ # global install.sh install ships no dk1.cmd to shunt to.
76
+
77
+ # --- Quiet mode detection ---
78
+ DKCODER_QUIET=0
79
+ _DKEXE_OPTIONS=
80
+ run_maybe_quiet() {
81
+ "$@" >&2 # Always redirect stdout to stderr in this script
82
+ }
83
+ printf_maybe_quiet() {
84
+ # shellcheck disable=SC2059
85
+ printf "$@" >&2
86
+ }
87
+
88
+ # --- Launcher helpers (not from crossplatform-functions.sh) ---
89
+
90
+ # [dk_prog_path NAME] prints the path to NAME, or nothing when it is not
91
+ # installed. Absolute locations first, so the hardened Linux/macOS behavior is
92
+ # unchanged, then PATH. Git Bash (Git for Windows) ships curl at
93
+ # /mingw64/bin/curl and has no /usr/bin/curl or /bin/curl, so without the PATH
94
+ # fallback the launcher finds no downloader at all and every fetch fails.
95
+ # ci/dist/install.sh already resolves curl/wget through PATH for the same reason.
96
+ # This does not weaken the trust model: the mlfront-signify verifier is pinned by
97
+ # the SHA-256 baked above, the manifest is signify-verified, and every binary is
98
+ # checked against a signed checksum, so a hostile PATH curl can deny service but
99
+ # cannot substitute an artifact.
100
+ # The `|| true` matters under `set -e`: `command -v` exits nonzero for a missing
101
+ # program, and a bare assignment would propagate that status and abort the script.
102
+ dk_prog_path() {
103
+ if [ -x "/usr/bin/$1" ]; then printf '%s' "/usr/bin/$1"
104
+ elif [ -x "/bin/$1" ]; then printf '%s' "/bin/$1"
105
+ else command -v "$1" 2>/dev/null || true
106
+ fi
107
+ }
108
+
109
+ # Every download path funnels here when neither curl nor wget resolved. Name what
110
+ # was searched and the escape hatch; a bare "not available" leaves the reader with
111
+ # nothing to act on.
112
+ dk_no_downloader() {
113
+ echo "FATAL: no curl or wget found (searched /usr/bin, /bin, then PATH)" >&2
114
+ echo " ...: install curl or wget, or set DKMLSYS_CURL=/full/path/to/curl" >&2
115
+ exit 107
116
+ }
117
+
118
+ # --- Imports of dkml-runtime-common's crossplatform-functions.sh ---
119
+ # Changes:
120
+ # 1. In download_file() use [ "${DKCODER_QUIET:-}" -eq 1 ]
121
+ # 2. In log_trace() replace non-FATAL `printf ... >&2` with `printf_maybe_quiet ...`
122
+ # 3. In sha256check() all shasum/* use --quiet option (this should be upstreamed)
123
+ # 4. In autodetect_system_binaries() curl and wget resolve through dk_prog_path
124
+ # (above), which falls back to PATH when the absolute locations miss
125
+
126
+ # Get standard locations of Unix system binaries like `/usr/bin/mv` (or `/bin/mv`).
127
+ #
128
+ # Will not return anything in `/usr/local/bin` or `/usr/sbin`. Use when you do not
129
+ # know whether the PATH has been set correctly, or when you do not know if the
130
+ # system binary exists.
131
+ #
132
+ # At some point in the future, this function will error out if the required system binaries
133
+ # do not exist. Most system binaries are common to all Unix/Linux/macOS installations but
134
+ # some (like `comm`) may need to be installed for proper functioning of DKML.
135
+ #
136
+ # Outputs:
137
+ # - env:DKMLSYS_MV - Location of `mv`
138
+ # - env:DKMLSYS_CHMOD - Location of `chmod`
139
+ # - env:DKMLSYS_UNAME - Location of `uname`
140
+ # - env:DKMLSYS_ENV - Location of `env`
141
+ # - env:DKMLSYS_AWK - Location of `awk`
142
+ # - env:DKMLSYS_SED - Location of `sed`
143
+ # - env:DKMLSYS_COMM - Location of `comm`
144
+ # - env:DKMLSYS_INSTALL - Location of `install`
145
+ # - env:DKMLSYS_RM - Location of `rm`
146
+ # - env:DKMLSYS_SORT - Location of `sort`
147
+ # - env:DKMLSYS_CAT - Location of `cat`
148
+ # - env:DKMLSYS_STAT - Location of `stat`
149
+ # - env:DKMLSYS_GREP - Location of `grep`
150
+ # - env:DKMLSYS_CURL - Location of `curl` (empty if not found)
151
+ # - env:DKMLSYS_WGET - Location of `wget` (empty if not found)
152
+ # - env:DKMLSYS_TR - Location of `tr`
153
+ autodetect_system_binaries() {
154
+ if [ -z "${DKMLSYS_MV:-}" ]; then
155
+ if [ -x /usr/bin/mv ]; then
156
+ DKMLSYS_MV=/usr/bin/mv
157
+ else
158
+ DKMLSYS_MV=/bin/mv
159
+ fi
160
+ fi
161
+ if [ -z "${DKMLSYS_CHMOD:-}" ]; then
162
+ if [ -x /usr/bin/chmod ]; then
163
+ DKMLSYS_CHMOD=/usr/bin/chmod
164
+ else
165
+ DKMLSYS_CHMOD=/bin/chmod
166
+ fi
167
+ fi
168
+ if [ -z "${DKMLSYS_UNAME:-}" ]; then
169
+ if [ -x /usr/bin/uname ]; then
170
+ DKMLSYS_UNAME=/usr/bin/uname
171
+ else
172
+ DKMLSYS_UNAME=/bin/uname
173
+ fi
174
+ fi
175
+ if [ -z "${DKMLSYS_ENV:-}" ]; then
176
+ if [ -x /usr/bin/env ]; then
177
+ DKMLSYS_ENV=/usr/bin/env
178
+ else
179
+ DKMLSYS_ENV=/bin/env
180
+ fi
181
+ fi
182
+ if [ -z "${DKMLSYS_AWK:-}" ]; then
183
+ if [ -x /usr/bin/awk ]; then
184
+ DKMLSYS_AWK=/usr/bin/awk
185
+ else
186
+ DKMLSYS_AWK=/bin/awk
187
+ fi
188
+ fi
189
+ if [ -z "${DKMLSYS_SED:-}" ]; then
190
+ if [ -x /usr/bin/sed ]; then
191
+ DKMLSYS_SED=/usr/bin/sed
192
+ else
193
+ DKMLSYS_SED=/bin/sed
194
+ fi
195
+ fi
196
+ if [ -z "${DKMLSYS_COMM:-}" ]; then
197
+ if [ -x /usr/bin/comm ]; then
198
+ DKMLSYS_COMM=/usr/bin/comm
199
+ else
200
+ DKMLSYS_COMM=/bin/comm
201
+ fi
202
+ fi
203
+ if [ -z "${DKMLSYS_INSTALL:-}" ]; then
204
+ if [ -x /usr/bin/install ]; then
205
+ DKMLSYS_INSTALL=/usr/bin/install
206
+ else
207
+ DKMLSYS_INSTALL=/bin/install
208
+ fi
209
+ fi
210
+ if [ -z "${DKMLSYS_RM:-}" ]; then
211
+ if [ -x /usr/bin/rm ]; then
212
+ DKMLSYS_RM=/usr/bin/rm
213
+ else
214
+ DKMLSYS_RM=/bin/rm
215
+ fi
216
+ fi
217
+ if [ -z "${DKMLSYS_SORT:-}" ]; then
218
+ if [ -x /usr/bin/sort ]; then
219
+ DKMLSYS_SORT=/usr/bin/sort
220
+ else
221
+ DKMLSYS_SORT=/bin/sort
222
+ fi
223
+ fi
224
+ if [ -z "${DKMLSYS_CAT:-}" ]; then
225
+ if [ -x /usr/bin/cat ]; then
226
+ DKMLSYS_CAT=/usr/bin/cat
227
+ else
228
+ DKMLSYS_CAT=/bin/cat
229
+ fi
230
+ fi
231
+ if [ -z "${DKMLSYS_STAT:-}" ]; then
232
+ if [ -x /usr/bin/stat ]; then
233
+ DKMLSYS_STAT=/usr/bin/stat
234
+ else
235
+ DKMLSYS_STAT=/bin/stat
236
+ fi
237
+ fi
238
+ if [ -z "${DKMLSYS_GREP:-}" ]; then
239
+ if [ -x /usr/bin/grep ]; then
240
+ DKMLSYS_GREP=/usr/bin/grep
241
+ else
242
+ DKMLSYS_GREP=/bin/grep
243
+ fi
244
+ fi
245
+ if [ -z "${DKMLSYS_CURL:-}" ]; then DKMLSYS_CURL=$(dk_prog_path curl); fi
246
+ if [ -z "${DKMLSYS_WGET:-}" ]; then DKMLSYS_WGET=$(dk_prog_path wget); fi
247
+ if [ -z "${DKMLSYS_TR:-}" ]; then
248
+ if [ -x /usr/bin/tr ]; then
249
+ DKMLSYS_TR=/usr/bin/tr
250
+ else
251
+ DKMLSYS_TR=/bin/tr
252
+ fi
253
+ fi
254
+ export DKMLSYS_MV DKMLSYS_CHMOD DKMLSYS_UNAME DKMLSYS_ENV DKMLSYS_AWK DKMLSYS_SED DKMLSYS_COMM DKMLSYS_INSTALL
255
+ export DKMLSYS_RM DKMLSYS_SORT DKMLSYS_CAT DKMLSYS_STAT DKMLSYS_GREP DKMLSYS_CURL DKMLSYS_WGET DKMLSYS_TR
256
+ }
257
+
258
+ # Is a Windows build machine if we are in a MSYS2 or Cygwin environment.
259
+ #
260
+ # Better alternatives
261
+ # -------------------
262
+ #
263
+ # 1. If you are checking to see if you should do a cygpath, then just guard it
264
+ # like so:
265
+ # if [ -x /usr/bin/cygpath ]; then
266
+ # do_something $(/usr/bin/cygpath ...) ...
267
+ # fi
268
+ # This clearly guards what you are about to do (cygpath) with what you will
269
+ # need (cygpath).
270
+ # 2. is_arg_windows_platform
271
+ is_unixy_windows_build_machine() {
272
+ if is_msys2_msys_build_machine || is_cygwin_build_machine; then
273
+ return 0
274
+ fi
275
+ return 1
276
+ }
277
+
278
+ # Is a MSYS2 environment with the MSYS or MINGW64 subsystem?
279
+ # * MSYS2 can also do MinGW 32-bit and 64-bit subsystems. Used by Diskuv OCaml
280
+ # * MINGW64 used by Git Bash (aka. GitHub Actions `shell: bash`)
281
+ # https://www.msys2.org/docs/environments/
282
+ is_msys2_msys_build_machine() {
283
+ if [ -e /usr/bin/msys-2.0.dll ] && {
284
+ [ "${MSYSTEM:-}" = "MSYS" ] || [ "${MSYSTEM:-}" = "MINGW64" ] || [ "${MSYSTEM:-}" = "UCRT64" ] || [ "${MSYSTEM:-}" = "CLANG64" ] || [ "${MSYSTEM:-}" = "MINGW32" ] || [ "${MSYSTEM:-}" = "CLANG32" ] || [ "${MSYSTEM:-}" = "CLANGARM64" ]
285
+ }; then
286
+ return 0
287
+ fi
288
+ return 1
289
+ }
290
+
291
+ is_cygwin_build_machine() {
292
+ if [ -e /usr/bin/cygwin1.dll ]; then
293
+ return 0
294
+ fi
295
+ return 1
296
+ }
297
+
298
+ # Tries to find the host ABI.
299
+ #
300
+ # Beware: This function uses `uname` probing may be inaccurate for dual-arch
301
+ # CPUs like Apple Silicon with Rosetta.
302
+ #
303
+ # Inputs:
304
+ # - env:DKML_HOST_ABI - Optional but recommended. If set, then BUILDHOST_ARCH will be set to the same.
305
+ #
306
+ # Outputs:
307
+ # - env:BUILDHOST_ARCH will contain the host ABI.
308
+ autodetect_buildhost_arch() {
309
+ if [ -n "${DKML_HOST_ABI:-}" ]; then
310
+ BUILDHOST_ARCH=$DKML_HOST_ABI
311
+ else
312
+ # Set DKMLSYS_*
313
+ autodetect_system_binaries
314
+
315
+ autodetect_buildhost_arch_SYSTEM=$("$DKMLSYS_UNAME" -s)
316
+ autodetect_buildhost_arch_MACHINE=$("$DKMLSYS_UNAME" -m)
317
+ # list from https://en.wikipedia.org/wiki/Uname and https://stackoverflow.com/questions/45125516/possible-values-for-uname-m
318
+ case "${autodetect_buildhost_arch_SYSTEM}-${autodetect_buildhost_arch_MACHINE}" in
319
+ Linux-armv7*)
320
+ BUILDHOST_ARCH=linux_arm32v7;;
321
+ Linux-armv6* | Linux-arm)
322
+ BUILDHOST_ARCH=linux_arm32v6;;
323
+ Linux-aarch64 | Linux-arm64 | Linux-armv8*)
324
+ BUILDHOST_ARCH=linux_arm64;;
325
+ Linux-i386 | Linux-i686)
326
+ BUILDHOST_ARCH=linux_x86;;
327
+ Linux-x86_64)
328
+ BUILDHOST_ARCH=linux_x86_64
329
+ # uname -m reports the KERNEL machine, so a 32-bit userland on
330
+ # a 64-bit kernel (ex. an i386 container on an amd64 host)
331
+ # still says x86_64 -- but a 64-bit dk1 cannot run there. The
332
+ # userland's own ELF class is the truth: byte 5 of /bin/sh is
333
+ # 1 for ELFCLASS32. od(1) is POSIX but not guaranteed present;
334
+ # without it, or on a 64-bit userland, the kernel's answer
335
+ # stands. test's numeric -eq tolerates od's leading
336
+ # whitespace; the redirected test guards non-numeric output.
337
+ autodetect_buildhost_arch_ELFCLASS=
338
+ if command -v od >/dev/null 2>&1; then
339
+ autodetect_buildhost_arch_ELFCLASS=$(od -An -td1 -j4 -N1 /bin/sh 2>/dev/null)
340
+ fi
341
+ if [ "${autodetect_buildhost_arch_ELFCLASS:-2}" -eq 1 ] 2>/dev/null; then
342
+ BUILDHOST_ARCH=linux_x86
343
+ # musl-based Linux (ex. alpine) is not a supported dk1 ABI yet;
344
+ # there is no musl dk1 build. Fail fast with a clear message
345
+ # instead of reaching a confusing "not provisioned" error later.
346
+ # A user who knows better can still force DKML_HOST_ABI. The musl
347
+ # dynamic loader path is the reliable marker; musl's ldd
348
+ # identifying itself is the fallback.
349
+ elif [ -e /lib/ld-musl-x86_64.so.1 ] \
350
+ || { ldd --version 2>&1 | grep -qi musl; } 2>/dev/null; then
351
+ printf "%s\n" "FATAL: musl-based Linux (e.g. Alpine) is not supported yet; dk1 needs a glibc-based distro" >&2
352
+ exit 1
353
+ fi
354
+ ;;
355
+ Darwin-arm64)
356
+ BUILDHOST_ARCH=darwin_arm64;;
357
+ Darwin-x86_64)
358
+ BUILDHOST_ARCH=darwin_x86_64;;
359
+ *-i386 | *-i686)
360
+ if is_unixy_windows_build_machine; then
361
+ BUILDHOST_ARCH=windows_x86
362
+ else
363
+ printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
364
+ exit 1
365
+ fi
366
+ ;;
367
+ *-x86_64)
368
+ if is_unixy_windows_build_machine; then
369
+ BUILDHOST_ARCH=windows_x86_64
370
+ else
371
+ printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
372
+ exit 1
373
+ fi
374
+ ;;
375
+ *)
376
+ # Since:
377
+ # 1) MSYS2 does not run on ARM/ARM64 (https://www.msys2.org/docs/environments/)
378
+ # 2) MSVC does not use ARM/ARM64 as host machine (https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-160)
379
+ # we do not support Windows ARM/ARM64 as a build machine
380
+ printf "%s\n" "FATAL: Unsupported build machine type obtained from 'uname -s' and 'uname -m': $autodetect_buildhost_arch_SYSTEM and $autodetect_buildhost_arch_MACHINE" >&2
381
+ exit 1
382
+ ;;
383
+ esac
384
+ fi
385
+ }
386
+
387
+ # A function that will try to print an ISO8601 timestamp, but will fallback to
388
+ # the system default. Always uses UTC timezone.
389
+ try_iso8601_timestamp() {
390
+ date -u -Iseconds 2>/dev/null || TZ=UTC date
391
+ }
392
+
393
+ # A function that will print the command and possibly time it (if and only if it uses a full path to
394
+ # an executable, so that 'time' does not fail on internal shell functions).
395
+ # If --return-error-code is the first argument or LOG_TRACE_RETURN_ERROR_CODE=ON, then instead of exiting the
396
+ # function will return the error code.
397
+ log_trace() {
398
+ log_trace_RETURN=${LOG_TRACE_RETURN_ERROR_CODE:-OFF}
399
+
400
+ log_trace_1="$1"
401
+ if [ "$log_trace_1" = "--return-error-code" ]; then
402
+ shift
403
+ log_trace_RETURN=ON
404
+ fi
405
+
406
+ if [ "${DKML_BUILD_TRACE:-OFF}" = ON ]; then
407
+ printf_maybe_quiet "[%s] %s\n" "$(try_iso8601_timestamp)" "+ $*"
408
+ if [ -x "$1" ]; then
409
+ time "$@"
410
+ else
411
+ "$@"
412
+ fi
413
+ else
414
+ # use judgement so we essentially have log at an INFO level
415
+ case "$1" in
416
+ rm|cp)
417
+ # debug level. only show when DKML_BUILD_TRACE=ON
418
+ ;;
419
+ git|make|ocaml_configure|ocaml_make|make_host|make_target)
420
+ # info level. and can show entire command without polluting the screen
421
+ printf_maybe_quiet "[%s] %s\n" "$(try_iso8601_timestamp)" "$*"
422
+ ;;
423
+ *) printf_maybe_quiet "[%s] %s\n" "$(try_iso8601_timestamp)" "$1"
424
+ esac
425
+ "$@"
426
+ fi
427
+ log_trace_ec="$?"
428
+ if [ "$log_trace_ec" -ne 0 ]; then
429
+ if [ "$log_trace_RETURN" = ON ]; then
430
+ return "$log_trace_ec"
431
+ else
432
+ printf "FATAL: Command failed with exit code %s: %s\n" "$log_trace_ec" "$*" >&2
433
+ exit "$log_trace_ec"
434
+ fi
435
+ fi
436
+ }
437
+
438
+ # [sha256compute FILE] writes the SHA256 checksum (hex encoded) of file FILE to the standard output.
439
+ sha256compute() {
440
+ sha256compute_FILE="$1"
441
+ shift
442
+ # For reasons unclear doing the following in MSYS2:
443
+ # sha256sum 'Z:\source\README.md'
444
+ # will produce a backslash like:
445
+ # \5518c76ed7234a153941fb7bc94b6e91d9cb8f1c4e22daf169a59b5878c3fc8a *Z:\\source\\README.md
446
+ # So always cygpath the filename if available
447
+ if [ -x /usr/bin/cygpath ]; then
448
+ sha256compute_FILE=$(/usr/bin/cygpath -a "$sha256compute_FILE")
449
+ fi
450
+
451
+ autodetect_system_binaries
452
+ if [ -x /usr/bin/shasum ]; then # macOS, OpenBSD, Debian
453
+ # CODESITE #1 (duplicates elsewhere).
454
+ # On Debian shasum is a perl script, and perl needs locale settings or it will complain.
455
+ # Confer: https://www.thomas-krenn.com/en/wiki/Perl_warning_Setting_locale_failed_in_Debian
456
+ # Confer: https://stackoverflow.com/a/52004330/21513816
457
+ # shellcheck disable=SC2016
458
+ LC_ALL=C /usr/bin/shasum -a 256 "$sha256compute_FILE" | "$DKMLSYS_AWK" '{print $1}'
459
+ elif [ -x /usr/bin/sha256sum ]; then # Linux, MSYS2
460
+ # shellcheck disable=SC2016
461
+ /usr/bin/sha256sum "$sha256compute_FILE" | "$DKMLSYS_AWK" '{print $1}'
462
+ elif [ -x /sbin/sha256 ]; then # FreeBSD
463
+ # shellcheck disable=SC2016
464
+ /sbin/sha256 -r "$sha256compute_FILE" | "$DKMLSYS_AWK" '{print $1}'
465
+ else
466
+ printf "FATAL: %s\n" "No sha256 checksum utility found" >&2
467
+ exit 107
468
+ fi
469
+ }
470
+
471
+ # [sha256check FILE SUM] checks that the file FILE has a SHA256 checksum (hex encoded) of SUM.
472
+ # The function will return nonzero (and exit with failure if `set -e` is enabled) if the checksum does not match.
473
+ sha256check() {
474
+ sha256check_FILE="$1"
475
+ shift
476
+ sha256check_SUM="$1"
477
+ shift
478
+
479
+ if [ -x /usr/bin/shasum ]; then # macOS, OpenBSD, Debian
480
+ # CODESITE #1 (duplicates elsewhere).
481
+ # On Debian shasum is a perl script, and perl needs locale settings or it will complain.
482
+ # Confer: https://www.thomas-krenn.com/en/wiki/Perl_warning_Setting_locale_failed_in_Debian
483
+ # Confer: https://stackoverflow.com/a/52004330/21513816
484
+ # Note: shasum 5.96 (ex. conanio/gcc7:1.64.1) has no --quiet option.
485
+ # shellcheck disable=SC2016
486
+ printf "%s %s" "$sha256check_SUM" "$sha256check_FILE" | LC_ALL=C /usr/bin/shasum -a 256 -c >&2
487
+ elif [ -x /usr/bin/sha256sum ]; then # Linux, MSYS2
488
+ # Note: BusyBox v1.35.0 sha256sum has no --quiet option.
489
+ printf "%s %s" "$sha256check_SUM" "$sha256check_FILE" | /usr/bin/sha256sum -c >&2
490
+ elif [ -x /sbin/sha256 ]; then # FreeBSD
491
+ /sbin/sha256 --quiet -c "$sha256check_SUM" "$sha256check_FILE" >&2
492
+ else
493
+ printf "FATAL: %s\n" "No sha256 checksum utility found" >&2
494
+
495
+ # REMOVEME!
496
+ if [ -d /sbin ]; then printf "/sbin:\n" >&2; ls /sbin >&2; fi
497
+ if [ -d /usr/sbin ]; then printf "/usr/sbin:\n" >&2; ls /usr/sbin >&2; fi
498
+ if [ -d /bin ]; then printf "/bin:\n" >&2; ls /bin >&2; fi
499
+ if [ -d /usr/bin ]; then printf "/usr/bin:\n" >&2; ls /usr/bin >&2; fi
500
+
501
+ exit 107
502
+ fi
503
+ }
504
+
505
+ # Echo --https-only if this wget supports it (BusyBox wget does not), so a
506
+ # redirect cannot downgrade the transfer off HTTPS wherever the option exists.
507
+ dk_wget_https_only() {
508
+ if "$DKMLSYS_WGET" --help 2>&1 | grep -q -- --https-only; then printf '%s' '--https-only'; fi
509
+ }
510
+
511
+ # [downloadfile URL FILE SUM] downloads from URL into FILE and verifies the SHA256 checksum of SUM.
512
+ # If the FILE already exists with the correct checksum it is not redownloaded.
513
+ # The function will exit with failure if the checksum does not match.
514
+ # curl pins HTTPS end to end (--proto '=https' + --proto-redir '=https') with a
515
+ # TLS 1.2 floor, and -f fails on an HTTP error page instead of saving it.
516
+ downloadfile() {
517
+ downloadfile_URL="$1"
518
+ shift
519
+ downloadfile_FILE="$1"
520
+ shift
521
+ downloadfile_SUM="$1"
522
+ shift
523
+
524
+ # Set DKMLSYS_*
525
+ autodetect_system_binaries
526
+
527
+ # Quick exit if exists and checksum verified. Do not display
528
+ # anything (even the checksum output) since this is the normal scenario
529
+ # that can run a billion times. The checksum verification for the
530
+ # download (if this fails) will not be silenced.
531
+ if [ -e "$downloadfile_FILE" ]; then
532
+ if sha256check "$downloadfile_FILE" "$downloadfile_SUM" > /dev/null 2>&1; then
533
+ return 0
534
+ else
535
+ $DKMLSYS_RM -f "$downloadfile_FILE"
536
+ fi
537
+ fi
538
+
539
+ printf_maybe_quiet "... %s %s\n" "Downloading" "$downloadfile_URL"
540
+ if [ "${CI:-}" = true ] || [ "${DKCODER_QUIET:-}" -eq 1 ]; then
541
+ if [ -n "$DKMLSYS_CURL" ]; then
542
+ log_trace "$DKMLSYS_CURL" --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL "$downloadfile_URL" -o "$downloadfile_FILE".tmp
543
+ elif [ -n "$DKMLSYS_WGET" ]; then
544
+ # shellcheck disable=SC2046 # prints one flag or nothing; must expand to zero words
545
+ log_trace "$DKMLSYS_WGET" $(dk_wget_https_only) -q -O "$downloadfile_FILE".tmp "$downloadfile_URL"
546
+ else
547
+ dk_no_downloader
548
+ fi
549
+ else
550
+ if [ -n "$DKMLSYS_CURL" ]; then
551
+ log_trace "$DKMLSYS_CURL" --proto '=https' --proto-redir '=https' --tlsv1.2 -fL "$downloadfile_URL" -o "$downloadfile_FILE".tmp
552
+ elif [ -n "$DKMLSYS_WGET" ]; then
553
+ # shellcheck disable=SC2046 # prints one flag or nothing; must expand to zero words
554
+ log_trace "$DKMLSYS_WGET" $(dk_wget_https_only) -O "$downloadfile_FILE".tmp "$downloadfile_URL"
555
+ else
556
+ dk_no_downloader
557
+ fi
558
+ fi
559
+ printf_maybe_quiet "\n... %s %s\n" "Verifying" "$downloadfile_URL"
560
+ if ! sha256check "$downloadfile_FILE".tmp "$downloadfile_SUM"; then
561
+ printf "%s\n" "FATAL: Encountered a corrupted or compromised download from $downloadfile_URL" >&2
562
+ exit 1
563
+ fi
564
+ printf_maybe_quiet "\n"
565
+ $DKMLSYS_MV "$downloadfile_FILE".tmp "$downloadfile_FILE"
566
+ }
567
+
568
+ # End import
569
+ # ---------------------------------------------------------------------------
570
+
571
+ # --- Environment detection ---
572
+
573
+ # Set DKMLSYS_*
574
+ autodetect_system_binaries
575
+
576
+ # Find host ABI. Set in BUILDHOST_ARCH
577
+ autodetect_buildhost_arch
578
+
579
+ # --- data home ---
580
+
581
+ tools_dir=
582
+ tools_name=dk1
583
+ # 1. Check DKCODER_DATA_HOME environment variable.
584
+ if [ -z "$tools_dir" ] && [ -n "${DKCODER_DATA_HOME:-}" ]; then
585
+ install -d "$DKCODER_DATA_HOME"
586
+ tools_dir="$DKCODER_DATA_HOME"
587
+ fi
588
+ # 2. Check if CI since many CI providers can only cache content in a subdirectory
589
+ # of the project.
590
+ if [ -z "$tools_dir" ] && [ "${CI:-}" = true ]; then
591
+ install -d "$DK_PROJECT_DIR/.z-dk/tools"
592
+ tools_dir="$DK_PROJECT_DIR/.z-dk/tools"
593
+ fi
594
+ # 2b. On Windows (Git Bash / MSYS2 / Cygwin) use the SAME store as dk1.cmd,
595
+ # %LOCALAPPDATA%\Programs\dk1, so a project driven from both PowerShell and
596
+ # a POSIX shell shares one cache instead of downloading every build twice.
597
+ # This sits after the CI check on purpose: dk1.cmd has no CI branch, but a
598
+ # Windows CI job driving ./dk1 from bash still wants the in-project cache.
599
+ # LOCALAPPDATA holds a native Windows path (MSYS does not convert
600
+ # environment variables), so cygpath it; needing cygpath also scopes this
601
+ # to MSYS/Cygwin.
602
+ if [ -z "$tools_dir" ] && [ -n "${COMSPEC:-}" ] && [ -n "${LOCALAPPDATA:-}" ] && [ -x /usr/bin/cygpath ]; then
603
+ tools_dir_LOCALAPPDATA=$(/usr/bin/cygpath -au "$LOCALAPPDATA")
604
+ if [ -w "$tools_dir_LOCALAPPDATA" ]; then
605
+ install -d "$tools_dir_LOCALAPPDATA/Programs/$tools_name"
606
+ tools_dir="$tools_dir_LOCALAPPDATA/Programs/$tools_name"
607
+ fi
608
+ fi
609
+ # 3. Check in locations rooted under /opt/diskuv
610
+ # We look under a /opt/diskuv early because
611
+ # - Especially important for WSL2 to use a pure Linux filesystem (ext4) for
612
+ # best performance.
613
+ # - Using a canonical location (especially /opt/diskuv/usr/share) makes
614
+ # it easy to use CMake presets for non-Windows hosts.
615
+ if [ -z "$tools_dir" ] && [ -n "${XDG_DATA_HOME:-}" ] && [ -w "/opt/diskuv/$XDG_DATA_HOME" ]; then
616
+ install -d "/opt/diskuv/$XDG_DATA_HOME/$tools_name"
617
+ tools_dir="/opt/diskuv/$XDG_DATA_HOME/$tools_name"
618
+ fi
619
+ if [ -z "$tools_dir" ] && [ -n "${HOME:-}" ] && [ -w "/opt/diskuv/$HOME" ]; then
620
+ install -d "/opt/diskuv/$HOME/.local/share/$tools_name"
621
+ tools_dir="/opt/diskuv/$HOME/.local/share/$tools_name"
622
+ fi
623
+ if [ -z "$tools_dir" ] && [ -w "/opt/diskuv/usr/share" ]; then
624
+ install -d "/opt/diskuv/usr/share/$tools_name"
625
+ tools_dir="/opt/diskuv/usr/share/$tools_name"
626
+ fi
627
+ # 4. Check in the conventional locations rooted under /
628
+ if [ -z "$tools_dir" ] && [ -n "${XDG_DATA_HOME:-}" ] && [ -w "$XDG_DATA_HOME" ]; then
629
+ install -d "$XDG_DATA_HOME/$tools_name"
630
+ tools_dir="$XDG_DATA_HOME/$tools_name"
631
+ fi
632
+ if [ -z "$tools_dir" ] && [ -n "${HOME:-}" ] && [ -w "$HOME" ]; then
633
+ install -d "$HOME/.local/share/$tools_name"
634
+ tools_dir="$HOME/.local/share/$tools_name"
635
+ fi
636
+ # 5. Validate
637
+ if [ -z "$tools_dir" ]; then
638
+ echo "FATAL: Could not find a location to install DkCoder." >&2
639
+ echo " ...: Make sure you have a home directory and that it is write-able, or define" >&2
640
+ echo " ...: the environment variable XDG_DATA_HOME in a shell profile script after" >&2
641
+ echo " ...: creating the \$XDG_DATA_HOME directory." >&2
642
+ exit 2
643
+ fi
644
+
645
+ # --- Tool downloads and installs ---
646
+
647
+ # PREREQS
648
+ # -------
649
+
650
+ install_linux_prog() {
651
+ install_linux_prog_NAME=$1
652
+ shift
653
+ install_linux_prog_PKG=$1
654
+ shift
655
+ install_linux_prog_ALPINE_PKG=$1
656
+ shift
657
+ if [ -x "/usr/bin/$install_linux_prog_NAME" ]; then
658
+ export DK_PROG_INSTALLED_LOCATION="/usr/bin/$install_linux_prog_NAME"
659
+ elif [ -x "/bin/$install_linux_prog_NAME" ]; then
660
+ export DK_PROG_INSTALLED_LOCATION="/bin/$install_linux_prog_NAME"
661
+ else
662
+ if [ -x /sbin/apk ]; then
663
+ if [ "$(id -u)" -eq 0 ]; then
664
+ run_maybe_quiet /sbin/apk add --quiet --no-progress "$install_linux_prog_ALPINE_PKG"
665
+ else
666
+ echo "Running: sudo /sbin/apk add --quiet --no-progress $install_linux_prog_ALPINE_PKG" >&2
667
+ sudo /sbin/apk add --quiet --no-progress "$install_linux_prog_ALPINE_PKG"
668
+ fi
669
+ elif command -v yum > /dev/null 2> /dev/null; then
670
+ if [ "$(id -u)" -eq 0 ]; then
671
+ run_maybe_quiet yum install -q -y "$install_linux_prog_PKG"
672
+ else
673
+ echo "Running: sudo yum install -q -y $install_linux_prog_PKG" >&2
674
+ sudo yum install -q -y "$install_linux_prog_PKG"
675
+ fi
676
+ else
677
+ if [ "$(id -u)" -eq 0 ]; then
678
+ run_maybe_quiet apt-get -qq install -y --no-install-suggests "$install_linux_prog_PKG"
679
+ else
680
+ echo "Running: sudo apt-get -qq install -y --no-install-suggests $install_linux_prog_PKG" >&2
681
+ sudo apt-get -qq install -y --no-install-suggests "$install_linux_prog_PKG"
682
+ fi
683
+ fi
684
+ DK_PROG_INSTALLED_LOCATION=$(command -v "$install_linux_prog_NAME")
685
+ export DK_PROG_INSTALLED_LOCATION
686
+ fi
687
+ }
688
+
689
+ case "$BUILDHOST_ARCH" in
690
+ linux_*)
691
+ # Need either [wget] or [curl] for [downloadfile]
692
+ if [ ! -x /usr/bin/wget ] && [ ! -x /bin/wget ] && [ ! -x /usr/bin/curl ] && [ ! -x /bin/curl ]; then
693
+ install_linux_prog wget wget wget || install_linux_prog curl curl curl
694
+ fi
695
+ ;;
696
+ esac
697
+
698
+ # -----
699
+ # resolve version + verify the signed manifest
700
+ # -----
701
+
702
+ # A checksum-less fetch (the manifest is trusted by SIGNATURE, not a pre-known
703
+ # checksum). curl or wget, matching downloadfile's tool detection.
704
+ dk_fetch() {
705
+ # shellcheck disable=SC2046 # prints one flag or nothing; must expand to zero words
706
+ if [ -n "$DKMLSYS_CURL" ]; then "$DKMLSYS_CURL" --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL "$1" -o "$2"
707
+ elif [ -n "$DKMLSYS_WGET" ]; then "$DKMLSYS_WGET" $(dk_wget_https_only) -q -O "$2" "$1"
708
+ else dk_no_downloader; fi
709
+ }
710
+
711
+ # Read `%% actual_version("X.Y.Z.W")` from dk.u's workspace section (the pin).
712
+ # The `[(]?` tolerates the parenthesized call form dk1 writes (the workspace Lua
713
+ # grammar rejects the bare `actual_version "X"` string-call sugar); the version
714
+ # is the first double-quoted field either way.
715
+ dk_read_actual_version() {
716
+ [ -f "$DK_PROJECT_DIR/dk.u" ] || return 0
717
+ "$DKMLSYS_GREP" -oE '%%[[:space:]]*actual_version[[:space:]]*[(]?[[:space:]]*"[^"]+"' "$DK_PROJECT_DIR/dk.u" 2>/dev/null \
718
+ | head -1 | "$DKMLSYS_SED" 's/.*"\([^"]*\)".*/\1/'
719
+ }
720
+
721
+ # Read a plain key=value field from a verified manifest.
722
+ dk_manifest_str() {
723
+ "$DKMLSYS_GREP" "^$2=" "$1" | head -1 | cut -d= -f2
724
+ }
725
+
726
+ # Defense-in-depth: the dk1 download URL comes from the signify-verified manifest,
727
+ # but still restrict it to known hosts so a signed-but-malicious manifest cannot
728
+ # redirect the fetch off github.com/dkpkg or the legacy GitLab package host.
729
+ dk_allow_host() {
730
+ case "$1" in
731
+ https://github.com/dkpkg/*) return 0 ;;
732
+ https://gitlab.com/api/v4/projects/60486861/*) return 0 ;;
733
+ *) return 1 ;;
734
+ esac
735
+ }
736
+
737
+ # On Windows the published dk1 + mlfront-signify binaries carry a `.exe`
738
+ # extension; other platforms have none. Mirrors gen-manifest.sh's extexe.
739
+ dk_extexe() { case "$BUILDHOST_ARCH" in windows_*) printf '.exe' ;; esac; }
740
+
741
+ # Fetch + signify-verify the manifest into $1. $2 is the pinned version ("" =
742
+ # latest). Aborts on any verification failure. Trust anchor = the baked
743
+ # mlfront-signify SHA-256, then the baked public key over the manifest.
744
+ dk_verify_manifest() {
745
+ dvm_out=$1; dvm_ver=$2
746
+ dvm_sigarch=$BUILDHOST_ARCH
747
+ eval "dvm_pin=\${cksum_signify_${dvm_sigarch}:-}"
748
+ # Empty = the arch was never provisioned; a value still starting with `__` is
749
+ # a maintained-but-unbaked placeholder (e.g. windows_x86 until its signify job
750
+ # ships). Both are "not provisioned" -- refuse rather than fetch and trust an
751
+ # unverifiable verifier.
752
+ # shellcheck disable=SC2154 # dvm_pin is assigned by the eval above
753
+ case "$dvm_pin" in
754
+ '' | __*) echo "FATAL: no pinned mlfront-signify checksum for $BUILDHOST_ARCH (launcher not provisioned)" >&2; exit 3 ;;
755
+ esac
756
+ install -d "$tools_dir/verifier"
757
+ dvm_exe=$(dk_extexe)
758
+ dvm_signify="$tools_dir/verifier/mlfront-signify-$dvm_pin$dvm_exe"
759
+ downloadfile "https://gitlab.com/api/v4/projects/60486861/packages/generic/mlfront-signify/$signify_pkg_ver/mlfront-signify-$dvm_sigarch$dvm_exe" "$dvm_signify" "$dvm_pin"
760
+ chmod +x "$dvm_signify"
761
+ if [ -n "$dvm_ver" ]; then dvm_url="$DK_BASE_URL/manifest-$dvm_ver.txt"; else dvm_url="$DK_BASE_URL/manifest.txt"; fi
762
+ dk_fetch "$dvm_url" "$dvm_out"
763
+ dk_fetch "$dvm_url.sig" "$dvm_out.sig"
764
+ printf 'untrusted comment: dk1 signify public key\n%s\n' "$SIGNIFY_PUBKEY_B64" > "$tools_dir/verifier/dk1.pub"
765
+ "$dvm_signify" -V -q -p "$tools_dir/verifier/dk1.pub" -m "$dvm_out" -x "$dvm_out.sig" \
766
+ || { echo "FATAL: manifest signature INVALID for $dvm_url -- refusing to continue" >&2; exit 1; }
767
+ }
768
+
769
+ # Resolve the version. `--self-update` ignores the pin and uses the LATEST dk1,
770
+ # which rewrites the dk.u actual_version to its own version -- dk1.exe edits dk.u
771
+ # safely, so this launcher never does file surgery (and stays batch-safe on the
772
+ # Windows side too). Otherwise use the dk.u pin, else the latest.
773
+ dk_selfupdate=0
774
+ [ "${1:-}" = "--self-update" ] && dk_selfupdate=1
775
+ if [ "$dk_selfupdate" = 1 ]; then
776
+ majminpat_ver=
777
+ else
778
+ majminpat_ver=$(dk_read_actual_version)
779
+ fi
780
+ dk_manifest="$tools_dir/verifier/manifest"
781
+ dk_verify_manifest "$dk_manifest" "$majminpat_ver"
782
+ if [ -z "$majminpat_ver" ]; then
783
+ majminpat_ver=$(dk_manifest_str "$dk_manifest" version)
784
+ [ "$dk_selfupdate" = 0 ] && echo "dk1: no '%% actual_version' pin in dk.u; using latest $majminpat_ver (run './dk1 --self-update' to pin)" >&2
785
+ fi
786
+ [ -n "$majminpat_ver" ] || { echo "FATAL: could not resolve a dk1 version" >&2; exit 1; }
787
+ dk1_cksum=$(dk_manifest_str "$dk_manifest" "dk1_${BUILDHOST_ARCH}")
788
+ [ -n "$dk1_cksum" ] || { echo "FATAL: manifest has no dk1 build for $BUILDHOST_ARCH (version $majminpat_ver)" >&2; exit 3; }
789
+ dk1_url_template=$(dk_manifest_str "$dk_manifest" "dk1_url_template")
790
+ [ -n "$dk1_url_template" ] || { echo "FATAL: manifest has no dk1_url_template (version $majminpat_ver)" >&2; exit 1; }
791
+
792
+ # -----
793
+ # single binary executable
794
+ # -----
795
+
796
+ DK_EXE=
797
+
798
+ destdir=$tools_dir/dk1exe-$majminpat_ver-$BUILDHOST_ARCH
799
+ install -d "$destdir"
800
+ dk1_exe="$destdir/dk1$(dk_extexe)"
801
+ download_helper() {
802
+ download_helper_CKSUM=$1; shift
803
+ # Resolve {version}/{arch}/{exe} in the verified manifest's dk1_url_template,
804
+ # then allowlist the host before fetching.
805
+ download_helper_URL=$(printf '%s' "$dk1_url_template" | "$DKMLSYS_SED" \
806
+ -e "s|{version}|$majminpat_ver|g" -e "s|{arch}|$BUILDHOST_ARCH|g" -e "s|{exe}|$(dk_extexe)|g")
807
+ dk_allow_host "$download_helper_URL" \
808
+ || { echo "FATAL: dk1 download host not allowlisted: $download_helper_URL" >&2; exit 1; }
809
+ downloadfile "$download_helper_URL" "$dk1_exe" "$download_helper_CKSUM"
810
+ }
811
+ download_dk() {
812
+ # dk1 checksum comes from the signify-verified manifest, not a baked value.
813
+ download_helper "$dk1_cksum"
814
+ }
815
+ # downloadfile skips the download when the cached dk1 already matches the manifest
816
+ # checksum, so this is a no-op on the common (already-cached) path. (A `--version`
817
+ # comparison would not work: dk1 prints "X.Y.Z+rev-W" but the pin is "X.Y.Z.W".)
818
+ download_dk
819
+ chmod +x "$dk1_exe"
820
+
821
+ # Set DK_EXE
822
+ DK_EXE="$dk1_exe"
823
+
824
+ # -----
825
+ # launcher store GC
826
+ # -----
827
+
828
+ # Every dk1 version installs into its own $tools_dir/dk1exe-* directory and
829
+ # old versions accumulate forever. Mark the pinned version as used, then
830
+ # remove version directories (and superseded verifier binaries) that no
831
+ # launcher has used in 30 days. Everything here re-downloads on demand from
832
+ # its signed manifest, so deletion is always safe; pruning must never break
833
+ # the launch, hence the blanket error suppression and the [find] guard
834
+ # (skip pruning entirely on systems without [find]).
835
+ touch "$destdir" "$dvm_signify" 2>/dev/null || true
836
+ if command -v find >/dev/null 2>&1; then
837
+ find "$tools_dir" -maxdepth 1 -type d -name 'dk1exe-*' -mtime +30 \
838
+ -exec "$DKMLSYS_RM" -rf {} + 2>/dev/null || true
839
+ find "$tools_dir/verifier" -maxdepth 1 -type f -name 'mlfront-signify-*' \
840
+ -mtime +30 -exec "$DKMLSYS_RM" -f {} + 2>/dev/null || true
841
+ fi
842
+
843
+ # --- Run executable ---
844
+
845
+ # We already changed to DK_PROJECT_DIR earlier. Change back.
846
+ cd "$dk_pwd"
847
+
848
+ export DKCODER_ARG0="$0"
849
+ export DKCODER_PWD="$dk_pwd"
850
+ export DK_PROJECT_DIR
851
+ # Tell the dk1 binary the real execution host. dkml-c-probe bakes the ABI of
852
+ # the C compiler that built the binary, so a musl dk1 cross-built on glibc
853
+ # would otherwise self-identify as linux_x86_64 and resolve the glibc
854
+ # toolchain on a musl host. BUILDHOST_ARCH is the launcher's own host
855
+ # detection (honors a pre-set DKML_HOST_ABI, else uname + the musl loader
856
+ # probe above), so propagate it as DKML_HOST_ABI which the binary honors.
857
+ export DKML_HOST_ABI="$BUILDHOST_ARCH"
858
+ # shellcheck disable=SC2086
859
+ if [ "$dk_selfupdate" = 1 ]; then
860
+ # dk1.exe repins the dk.u actual_version line to the resolved (latest) version.
861
+ exec "$DK_EXE" -isystem "$DK_PROJECT_DIR/etc/dk/i" $_DKEXE_OPTIONS self-update "$majminpat_ver"
862
+ else
863
+ exec "$DK_EXE" -isystem "$DK_PROJECT_DIR/etc/dk/i" $_DKEXE_OPTIONS "$@"
864
+ fi
dk1.cmd ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @ECHO OFF
2
+ REM ##########################################################################
3
+ REM # File: dk\dk1.cmd #
4
+ REM # #
5
+ REM # Copyright 2025 Diskuv, Inc. #
6
+ REM # #
7
+ REM # Licensed under the Open Software License version 3.0 #
8
+ REM # (the "License"); you may not use this file except in compliance #
9
+ REM # with the License. You may obtain a copy of the License at #
10
+ REM # #
11
+ REM # https://opensource.org/license/osl-3-0-php/ #
12
+ REM # #
13
+ REM ##########################################################################
14
+
15
+ REM Recommendation: Place this file in source control.
16
+ REM
17
+ REM Manifest-driven, self-updating dk1 launcher for Windows. Pure batch on the
18
+ REM hot path -- PowerShell is used only as a last-resort download fallback (after
19
+ REM curl and BITSADMIN), never for logic -- so it runs on locked-down machines.
20
+ REM 1. download the pinned mlfront-signify verifier, check it against the
21
+ REM SHA-256 baked below (the anchor -- not the manifest, so no circularity);
22
+ REM 2. verify the signify signature over the manifest with the baked pubkey;
23
+ REM 3. read the manifest's dk1 SHA-256 (plain key=value, no JSON), download and
24
+ REM cache dk1.exe, then exec it.
25
+ REM This file never rewrites itself.
26
+
27
+ SETLOCAL ENABLEDELAYEDEXPANSION
28
+
29
+ SET "DK_PROJECT_DIR=%~dp0"
30
+ SET "DKCODER_PWD=%CD%"
31
+
32
+ REM ===== BAKED TRUST ROOT (rotates rarely; updated only on key/verifier rotation) =====
33
+ SET "SIGNIFY_PUBKEY_B64=RWTMq/GqeeJ06ACy7By/H05vvtpc3ZPEKlbnDm9fIQxpkgTV92is6YHD"
34
+ SET "DK_CKSUM_SIGNIFY_WINDOWS_X86_64=ebe1aa87a3eb87ed6769782a31916fab72bbdf0ced22d6ddd9a7a455e23e2c68"
35
+ REM windows_x86 (32-bit) mlfront-signify is not published at SIGNIFY_PKG_VER yet;
36
+ REM the __ placeholder trips the not-provisioned guard below until a real checksum
37
+ REM is baked here (matching the ci/dist/dk1 shell slot) so .\dk1.cmd and ./dk1
38
+ REM light up together.
39
+ SET "DK_CKSUM_SIGNIFY_WINDOWS_X86=__CKSUM_SIGNIFY_WINDOWS_X86__"
40
+ REM The verifier is pinned by version+checksum and fetched from its GitLab package
41
+ REM (a direct download, not the throttled listing API); the site serves only the
42
+ REM signed manifest and the wrappers.
43
+ SET "SIGNIFY_PKG_VER=2.4.2.271"
44
+ IF "%DK1_BASE_URL%"=="" (SET "DK_BASE_URL=https://diskuv.com/dk") ELSE (SET "DK_BASE_URL=%DK1_BASE_URL%")
45
+ REM ====================================================================================
46
+
47
+ REM Detect the Windows architecture (WOW64-aware) and select its pinned verifier.
48
+ REM A 32-bit process on 64-bit Windows reports PROCESSOR_ARCHITECTURE=x86 but has
49
+ REM PROCESSOR_ARCHITEW6432 defined; genuine 32-bit Windows does not.
50
+ SET "DK_ARCH=windows_x86_64"
51
+ SET "DK_CKSUM_SIGNIFY=%DK_CKSUM_SIGNIFY_WINDOWS_X86_64%"
52
+ IF /I "%PROCESSOR_ARCHITECTURE%"=="x86" IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
53
+ SET "DK_ARCH=windows_x86"
54
+ SET "DK_CKSUM_SIGNIFY=%DK_CKSUM_SIGNIFY_WINDOWS_X86%"
55
+ )
56
+ IF "!DK_CKSUM_SIGNIFY:~0,2!"=="__" (
57
+ ECHO dk1: no pinned mlfront-signify checksum for !DK_ARCH! ^(launcher not provisioned^) 1>&2
58
+ EXIT /B 3
59
+ )
60
+
61
+ IF "%DKCODER_DATA_HOME%"=="" (SET "DK_DATA_HOME=%LOCALAPPDATA%\Programs\dk1") ELSE (SET "DK_DATA_HOME=%DKCODER_DATA_HOME%")
62
+ SET "DK_VDIR=%DK_DATA_HOME%\verifier"
63
+ IF NOT EXIST "%DK_VDIR%" MKDIR "%DK_VDIR%" >NUL 2>&1
64
+
65
+ REM 1. Pinned verifier from GitLab, checked against the baked SHA-256 (the anchor).
66
+ SET "DK_SIGNIFY=%DK_VDIR%\mlfront-signify-%DK_CKSUM_SIGNIFY%.exe"
67
+ IF NOT EXIST "%DK_SIGNIFY%" (
68
+ CALL :fetch "https://gitlab.com/api/v4/projects/60486861/packages/generic/mlfront-signify/%SIGNIFY_PKG_VER%/mlfront-signify-!DK_ARCH!.exe" "%DK_SIGNIFY%"
69
+ IF !ERRORLEVEL! NEQ 0 EXIT /B 1
70
+ )
71
+ CALL :sha256 "%DK_SIGNIFY%" DK_SIG_ACTUAL
72
+ IF /I NOT "!DK_SIG_ACTUAL!"=="%DK_CKSUM_SIGNIFY%" (
73
+ ECHO dk1: mlfront-signify checksum mismatch ^(verifier not trusted^) 1>&2
74
+ EXIT /B 1
75
+ )
76
+
77
+ REM 2. Write the baked public key (pure batch; signify accepts the CRLF form).
78
+ > "%DK_VDIR%\dk1.pub" ECHO untrusted comment: dk1 signify public key
79
+ >> "%DK_VDIR%\dk1.pub" ECHO %SIGNIFY_PUBKEY_B64%
80
+
81
+ REM 3. Read the dk.u pin: the version between quotes on the actual_version line.
82
+ SET "DK_PIN="
83
+ IF EXIST "%DK_PROJECT_DIR%dk.u" CALL :readpin
84
+
85
+ REM --self-update handled by dk1.exe (it edits dk.u safely); see below after resolve.
86
+ SET "DK_SELFUPDATE=0"
87
+ IF "%~1"=="--self-update" SET "DK_SELFUPDATE=1"
88
+
89
+ REM 4. Verify the manifest and resolve the version + dk1 checksum. Self-update and
90
+ REM an unpinned project both use the latest manifest.
91
+ IF "%DK_SELFUPDATE%"=="1" (SET "DK_WANT=") ELSE (SET "DK_WANT=%DK_PIN%")
92
+ CALL :getmanifest "%DK_WANT%"
93
+ IF !ERRORLEVEL! NEQ 0 EXIT /B 1
94
+ IF "%DK_WANT%"=="" (
95
+ CALL :mval version DK_VER
96
+ IF "%DK_SELFUPDATE%"=="0" IF "%DK_PIN%"=="" ECHO dk1: no actual_version pin in dk.u; using latest !DK_VER! ^(run "dk1 --self-update" to pin^) 1>&2
97
+ ) ELSE (
98
+ SET "DK_VER=%DK_PIN%"
99
+ )
100
+ IF "!DK_VER!"=="" (ECHO dk1: could not resolve a dk1 version 1>&2 & EXIT /B 1)
101
+ CALL :mval dk1_!DK_ARCH! DK_CKSUM
102
+ IF "!DK_CKSUM!"=="" (ECHO dk1: manifest has no dk1 build for !DK_ARCH! ^(version !DK_VER!^) 1>&2 & EXIT /B 3)
103
+ CALL :mval dk1_url_template DK_TMPL
104
+ IF "!DK_TMPL!"=="" (ECHO dk1: manifest has no dk1_url_template ^(version !DK_VER!^) 1>&2 & EXIT /B 1)
105
+
106
+ REM 5. Cache + download dk1.exe (version-keyed dir; never overwrite a running exe).
107
+ SET "DK_EXEDIR=%DK_DATA_HOME%\dk1exe-!DK_VER!-!DK_ARCH!"
108
+ IF NOT EXIST "!DK_EXEDIR!" MKDIR "!DK_EXEDIR!" >NUL 2>&1
109
+ SET "DK_EXE=!DK_EXEDIR!\dk1.exe"
110
+ SET "DK_NEED_EXE=1"
111
+ IF EXIST "!DK_EXE!" (
112
+ CALL :sha256 "!DK_EXE!" DK_EXE_ACTUAL
113
+ IF /I "!DK_EXE_ACTUAL!"=="!DK_CKSUM!" SET "DK_NEED_EXE=0"
114
+ )
115
+ IF !DK_NEED_EXE! EQU 1 (
116
+ REM Resolve {version}/{arch}/{exe} in the verified dk1_url_template, then
117
+ REM allowlist the host before downloading.
118
+ SET "DK_URL=!DK_TMPL!"
119
+ SET "DK_URL=!DK_URL:{version}=%DK_VER%!"
120
+ SET "DK_URL=!DK_URL:{arch}=%DK_ARCH%!"
121
+ SET "DK_URL=!DK_URL:{exe}=.exe!"
122
+ CALL :allowhost "!DK_URL!"
123
+ IF !ERRORLEVEL! NEQ 0 (ECHO dk1: download host not allowlisted: !DK_URL! 1>&2 & EXIT /B 1)
124
+ CALL :fetch "!DK_URL!" "!DK_EXE!"
125
+ IF !ERRORLEVEL! NEQ 0 EXIT /B 1
126
+ CALL :sha256 "!DK_EXE!" DK_EXE_ACTUAL
127
+ IF /I NOT "!DK_EXE_ACTUAL!"=="!DK_CKSUM!" (ECHO dk1: dk1.exe checksum mismatch 1>&2 & EXIT /B 1)
128
+ )
129
+
130
+ REM 6. Launcher store GC. Every dk1 version installs into its own dk1exe-*
131
+ REM directory and old versions accumulate forever. Mark the pinned version
132
+ REM (and the current verifier) as used, then remove version directories and
133
+ REM superseded verifier binaries no launcher has used in 30 days. Everything
134
+ REM here re-downloads on demand from its signed manifest, so deletion is
135
+ REM always safe; pruning must never break the launch, so every step
136
+ REM suppresses errors. Pure batch: the mtime bump is a create+delete of a
137
+ REM marker file (updates the directory timestamp), the verifier bump is the
138
+ REM batch copy-touch idiom, and the age test is FORFILES /D.
139
+ >"!DK_EXEDIR!\.dk1-touch" ECHO OK
140
+ DEL /Q "!DK_EXEDIR!\.dk1-touch" >NUL 2>&1
141
+ COPY /B "%DK_SIGNIFY%"+,, "%DK_SIGNIFY%" >NUL 2>&1
142
+ FORFILES /P "%DK_DATA_HOME%" /M dk1exe-* /D -30 /C "cmd /c if @isdir==TRUE rd /s /q @path" >NUL 2>&1
143
+ FORFILES /P "%DK_VDIR%" /M mlfront-signify-*.exe /D -30 /C "cmd /c del /q @path" >NUL 2>&1
144
+
145
+ REM 7. Run it (same contract as the POSIX wrapper). dk1 --self-update rewrites the
146
+ REM dk.u actual_version line itself (dk1.exe edits dk.u safely; this launcher
147
+ REM never does file surgery on dk.u).
148
+ SET "DKCODER_ARG0=dk1"
149
+ IF "%DK_SELFUPDATE%"=="1" (
150
+ REM dk1.exe repins the dk.u actual_version line to the resolved (latest) version.
151
+ "!DK_EXE!" -isystem "%DK_PROJECT_DIR%etc\dk\i" self-update !DK_VER!
152
+ ) ELSE (
153
+ "!DK_EXE!" -isystem "%DK_PROJECT_DIR%etc\dk\i" %*
154
+ )
155
+ EXIT /B %ERRORLEVEL%
156
+
157
+ REM ================= subroutines =================
158
+
159
+ REM :fetch URL DEST -- download without a checksum (the manifest is verified by
160
+ REM signature). curl first, then BITSADMIN, then PowerShell -- so no PowerShell
161
+ REM dependency on machines that ship curl (Windows 10 1803+).
162
+ :fetch
163
+ IF EXIST "%SystemRoot%\System32\curl.exe" (
164
+ "%SystemRoot%\System32\curl.exe" -fsSL "%~1" -o "%~2" && EXIT /B 0
165
+ )
166
+ BITSADMIN /TRANSFER dk1fetch /DOWNLOAD /PRIORITY FOREGROUND "%~1" "%~2" >NUL 2>&1 && EXIT /B 0
167
+ powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "$ProgressPreference='SilentlyContinue'; Invoke-WebRequest -UseBasicParsing -Uri '%~1' -OutFile '%~2'" >NUL 2>&1 && EXIT /B 0
168
+ ECHO dk1: could not download %~1 1>&2
169
+ EXIT /B 1
170
+
171
+ REM :sha256 FILE OUTVAR -- set OUTVAR to the lowercased SHA-256 of FILE.
172
+ :sha256
173
+ SET "%~2="
174
+ FOR /F "usebackq tokens=* delims=" %%H IN (`certutil -hashfile "%~1" SHA256 ^| findstr /R "^[0-9a-fA-F][0-9a-fA-F]*$"`) DO (
175
+ IF NOT DEFINED %~2 SET "%~2=%%H"
176
+ )
177
+ IF DEFINED %~2 SET "%~2=!%~2: =!"
178
+ EXIT /B 0
179
+
180
+ REM :getmanifest VER -- fetch manifest[-VER].txt + .sig into %DK_VDIR%, signify-verify.
181
+ :getmanifest
182
+ IF "%~1"=="" (SET "DK_MURL=%DK_BASE_URL%/manifest.txt") ELSE (SET "DK_MURL=%DK_BASE_URL%/manifest-%~1.txt")
183
+ CALL :fetch "!DK_MURL!" "%DK_VDIR%\manifest"
184
+ IF !ERRORLEVEL! NEQ 0 EXIT /B 1
185
+ CALL :fetch "!DK_MURL!.sig" "%DK_VDIR%\manifest.sig"
186
+ IF !ERRORLEVEL! NEQ 0 EXIT /B 1
187
+ "%DK_SIGNIFY%" -V -q -p "%DK_VDIR%\dk1.pub" -m "%DK_VDIR%\manifest" -x "%DK_VDIR%\manifest.sig"
188
+ IF !ERRORLEVEL! NEQ 0 (ECHO dk1: manifest signature INVALID for !DK_MURL! -- refusing to continue 1>&2 & EXIT /B 1)
189
+ EXIT /B 0
190
+
191
+ REM :mval KEY OUTVAR -- read key=value from the verified %DK_VDIR%\manifest.
192
+ :mval
193
+ SET "%~2="
194
+ FOR /F "usebackq tokens=1,* delims==" %%A IN ("%DK_VDIR%\manifest") DO (
195
+ IF /I "%%A"=="%~1" SET "%~2=%%B"
196
+ )
197
+ EXIT /B 0
198
+
199
+ REM :allowhost URL -- EXIT /B 0 if URL starts with an allowlisted host prefix,
200
+ REM else 1. Defense-in-depth over the signify-verified template (a signed-but-
201
+ REM malicious manifest still cannot redirect the download off a known host).
202
+ :allowhost
203
+ ECHO %~1| findstr /B /L /C:"https://github.com/dkpkg/" /C:"https://gitlab.com/api/v4/projects/60486861/" >NUL 2>&1
204
+ EXIT /B !ERRORLEVEL!
205
+
206
+ REM :readpin -- set DK_PIN to the version between the quotes on the dk.u
207
+ REM actual_version line. The caret-escaped FOR options are how batch uses a
208
+ REM double-quote as a delimiter (a quoted "delims=^"" options string does not work).
209
+ :readpin
210
+ FOR /F usebackq^ tokens^=2^ delims^=^" %%V IN (`findstr /L /C:"actual_version" "%DK_PROJECT_DIR%dk.u"`) DO SET "DK_PIN=%%V"
211
+ EXIT /B 0
dune-project CHANGED
@@ -32,4 +32,4 @@
32
  (sexplib (>= v0.14.0))
33
  (csexp (>= 1.3.2))
34
  (lru (>= 0.3.0))
35
- (dap (>= 1.1.0))))
 
32
  (sexplib (>= v0.14.0))
33
  (csexp (>= 1.3.2))
34
  (lru (>= 0.3.0))
35
+ (dap (and (>= 1.0.6) (< 1.1.0)))))
earlybird.opam CHANGED
@@ -26,7 +26,7 @@ depends: [
26
  "sexplib" {>= "v0.14.0"}
27
  "csexp" {>= "1.3.2"}
28
  "lru" {>= "0.3.0"}
29
- "dap" {>= "1.1.0"}
30
  "odoc" {with-doc}
31
  ]
32
  build: [
 
26
  "sexplib" {>= "v0.14.0"}
27
  "csexp" {>= "1.3.2"}
28
  "lru" {>= "0.3.0"}
29
+ "dap" {>= "1.0.6" & < "1.1.0"}
30
  "odoc" {with-doc}
31
  ]
32
  build: [
etc/dk/i/.gitignore ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # Written by dk0. values.unattested.json is a scratch download; do not
2
+ # commit it. The <LIB>.<VER>.values.json import pins and
3
+ # dk-closure-manifest.tsv ARE committed so a fresh clone verifies imports
4
+ # without refetching.
5
+ values.unattested.json
etc/dk/i/CommonsBase_Std.2.6.20260920144347.values.json ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bundles": [
3
+ {
4
+ "assets": [
5
+ {
6
+ "checksum": {
7
+ "blake2b256": "1471a9db069f2e4bb198ea1a1f9eec7804f1dc893f809411cd0396aac96ed91f"
8
+ },
9
+ "origin": "CommonsBase_Std",
10
+ "path": "CommonsBase_Std-dist-win32.distmeta.cts.1.tracestore",
11
+ "size": 5394
12
+ },
13
+ {
14
+ "checksum": {
15
+ "blake2b256": "621e0f49e1d74e269b69af8696b1289f75fdf731b73b9a51eeb863d933ed933c"
16
+ },
17
+ "indexes": [
18
+ {
19
+ "type": "zip",
20
+ "zip": {
21
+ "local_offset": 0,
22
+ "central_offset": 26077,
23
+ "central_size": 1657,
24
+ "checksum": {
25
+ "blake2b256": "81a7b18d26a163a27f921fcf62cfe43c9b20e578e41a4b7a0ffc8fb59d57c7ef"
26
+ }
27
+ }
28
+ }
29
+ ],
30
+ "origin": "CommonsBase_Std",
31
+ "path": "CommonsBase_Std-dist-win32.distmeta.manifest.zip",
32
+ "size": 27734
33
+ },
34
+ {
35
+ "checksum": {
36
+ "blake2b256": "664a6b7c88d2577f5139b65dc3e91c6c630a00728840f9e604f07aaf944bc186"
37
+ },
38
+ "indexes": [
39
+ {
40
+ "type": "zip",
41
+ "zip": {
42
+ "local_offset": 0,
43
+ "central_offset": 23730,
44
+ "central_size": 728,
45
+ "checksum": {
46
+ "blake2b256": "d71646da54933429062d0ac841c02636384f04c2a699ad56711dac3ff6e9f1d3"
47
+ }
48
+ }
49
+ }
50
+ ],
51
+ "origin": "CommonsBase_Std",
52
+ "path": "CommonsBase_Std-dist-win32.distmeta.valuestore.zip",
53
+ "size": 24458
54
+ },
55
+ {
56
+ "checksum": {
57
+ "blake2b256": "c05555daf99672e6a6564b642bcc848595b2939846c8d91955af495b6031d661"
58
+ },
59
+ "origin": "CommonsBase_Std",
60
+ "path": "CommonsBase_Std-dist-win32.package.cts.1.tracestore",
61
+ "size": 133822
62
+ },
63
+ {
64
+ "checksum": {
65
+ "blake2b256": "73594f34f3f14dc20a5b10441936e4f6c226bc2c40975368a37914bfc92d9e6b"
66
+ },
67
+ "indexes": [
68
+ {
69
+ "type": "zip",
70
+ "zip": {
71
+ "local_offset": 0,
72
+ "central_offset": 286109832,
73
+ "central_size": 13538,
74
+ "checksum": {
75
+ "blake2b256": "74c1af5a71b8f7bc3155d3e9e6d3a782349c82846cce12a718bffed1338f17ff"
76
+ }
77
+ }
78
+ }
79
+ ],
80
+ "origin": "CommonsBase_Std",
81
+ "path": "CommonsBase_Std-dist-win32.package.valuestore.zip",
82
+ "size": 286123370
83
+ }
84
+ ],
85
+ "id": "CommonsBase_Std.Distribution@2.6.20260920144347",
86
+ "listing": {
87
+ "origins": [
88
+ {
89
+ "name": "CommonsBase_Std",
90
+ "mirrors": [
91
+ "https://github.com/dkpkg/CommonsBase_Std/releases/download/2.6.20260920144347"
92
+ ]
93
+ }
94
+ ]
95
+ }
96
+ }
97
+ ],
98
+ "distributions": [
99
+ {
100
+ "build": {
101
+ "attestation": {
102
+ "github_slsa_v1_l2": {
103
+ "docs": [
104
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHmTCCBx6gAwIBAgIUQnuqZOeL/PYX2qKb7DZs5BrMm8swCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwOTIwMTQ0NjQ4WhcNMjYwOTIwMTQ1NjQ4WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEle1klWfjzlMi6Z86cJq+nMOgM1gP4NmGWyOctHUUWh4mnTlVm3jZgzxZzUoYR0AOS63hbWc038BGwUE3DGxc+6OCBj0wggY5MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU4jidOxLEdZgy2J+eCtWS5pA+fn4wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8weAYDVR0RAQH/BG4wbIZqaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX1N0ZC8uZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTIuNi55bWxAcmVmcy90YWdzLzIuNi4yMDI2MDkyMDE0NDM0NzA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMBIGCisGAQQBg78wAQIEBHB1c2gwNgYKKwYBBAGDvzABAwQoNzEwMDg3NzQ5YTIzNmZjMWRkYmE4MTI4Yzg5ZTEwOTQyZmNiZjQ1YTAyBgorBgEEAYO/MAEEBCQuZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTIuNi55bWwwIwYKKwYBBAGDvzABBQQVZGtwa2cvQ29tbW9uc0Jhc2VfU3RkMCoGCisGAQQBg78wAQYEHHJlZnMvdGFncy8yLjYuMjAyNjA5MjAxNDQzNDcwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMHoGCisGAQQBg78wAQkEbAxqaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX1N0ZC8uZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTIuNi55bWxAcmVmcy90YWdzLzIuNi4yMDI2MDkyMDE0NDM0NzA4BgorBgEEAYO/MAEKBCoMKDcxMDA4Nzc0OWEyMzZmYzFkZGJhODEyOGM4OWUxMDk0MmZjYmY0NWEwHQYKKwYBBAGDvzABCwQPDA1naXRodWItaG9zdGVkMDgGCisGAQQBg78wAQwEKgwoaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX1N0ZDA4BgorBgEEAYO/MAENBCoMKDcxMDA4Nzc0OWEyMzZmYzFkZGJhODEyOGM4OWUxMDk0MmZjYmY0NWEwLAYKKwYBBAGDvzABDgQeDBxyZWZzL3RhZ3MvMi42LjIwMjYwOTIwMTQ0MzQ3MBoGCisGAQQBg78wAQ8EDAwKMTIyMTEzMjIxNDAoBgorBgEEAYO/MAEQBBoMGGh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZzAZBgorBgEEAYO/MAERBAsMCTI3ODkxMzUwMDB6BgorBgEEAYO/MAESBGwMamh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zQmFzZV9TdGQvLmdpdGh1Yi93b3JrZmxvd3MvZGlzdHJpYnV0ZS0yLjYueW1sQHJlZnMvdGFncy8yLjYuMjAyNjA5MjAxNDQzNDcwOAYKKwYBBAGDvzABEwQqDCg3MTAwODc3NDlhMjM2ZmMxZGRiYTgxMjhjODllMTA5NDJmY2JmNDVhMBQGCisGAQQBg78wARQEBgwEcHVzaDBcBgorBgEEAYO/MAEVBE4MTGh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zQmFzZV9TdGQvYWN0aW9ucy9ydW5zLzM1NTE3NDI3MzQxL2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwHwYKKwYBBAGDvzABFwQRDA9kay1kaXN0cmlidXRpb24wRgYKKwYBBAGDvzABGAQ4DDZyZXBvOmRrcGtnL0NvbW1vbnNCYXNlX1N0ZDplbnZpcm9ubWVudDpkay1kaXN0cmlidXRpb24wgYsGCisGAQQB1nkCBAIEfQR7AHkAdwDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAaC/SLfNAAAEAwBIMEYCIQDcSmUidwkBi6osfs9IYltZL9LtvnH6uxRNaZzOKiJt8gIhAN35rxyG+HDtaxG90reCULys0AfAJhJCH3DpZBTyUCo9MAoGCCqGSM49BAMDA2kAMGYCMQDUKeibdIOPBnP8WJwxoQgvsYnVJmpcgLFa+rC8CRoRj3hWCS9nccAUGGFzirqi+U8CMQC8b+Td8u524XlXnAGFOlNMRajf4JfafLZyTe0E3pDL5qmmDWi94JImuYUKpZ1T02E="},"tlogEntries":[{"logIndex":"2900405607","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"dsse","version":"0.0.1"},"integratedTime":"1789915609","inclusionPromise":{"signedEntryTimestamp":"MEUCIDiSAOthsVhc5JyBTLuyCxEjr4MNjGG031gEZuHuTzVuAiEAxmgU2hif2N5gRbbN/vCJQI653nR6QlOS/yMkcvZeRjw="},"inclusionProof":{"logIndex":"2778501345","rootHash":"54yfGQwxpSthbq9d4FGernIJslifTmaJG1TH9lKc+8c=","treeSize":"2778501418","hashes":["6U/Pa3fGSR1hLlnnbVLTi8g1kLqENkut+zGmJndE3NY=","yRgxpMWEXNq5Kp0ExUjioDeMeXwdZk9mnUeEJTniKVI=","hfmOv2gIMBfwbfZ3eFCbEylnD9mt2cQcrhu5b0fPr24=","6WAXl1Pl8B+tYrO5uyeQojpflwGJh6xtRdejfqy7bxI=","NloroRFCp7tUB/jEcazPL0ybyV8zNN0r5xfSAUL9TBs=","Q3SulITUMKHmWKyMvqHsBX6jY9YKYeTkvUkWhObpKpk=","nubMK8dmaAJBamEgpdy2Iwd06mJ17Tl05S/v74jzoEM=","ahfyyd1/jcofWAA6D+pKm9Zg/U/+zvE/QoEVI7ndhYg=","3vWw04XKnNvL/sBSq8Q5q3lU8f7gIYQlY3+4xVmhee0=","87Ij1gpJcc3Dp7oJzHcX6oajiNB5RR0RPUZ3FeBbrhU=","Gh+QmpRczgbt96IrwgbeeD5+XuqMEBW/ImxCK9EOGlA=","OKp70ZrFKEgLWvx9PPC4vZ2nc8ks/D5Pzcg037k0s2Y=","nj9u53dsHqNA5WYl3GQfuWmkxEYjimgFk/RfYqW839Q=","LdA825SeiwdHnEsuLTGEtQ248AUBYlr6G719py1dHeM=","tyO4Oj1UrXex15tzrEEO6sSnE8y8obZWghZ2XixBPtE=","rjDiNJHGnboMYYUH7OSezbKWj3wMXRTHGCLa/SaZ6O4=","mfWjSdNaEfNXxDww6AAOw/NoK9e6z1yKaZm5xvmMabs=","qxzHanAzz57SDdmJe0B7bJK72NTIBbwEMGBBKvDOROw=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2778501418\n54yfGQwxpSthbq9d4FGernIJslifTmaJG1TH9lKc+8c=\n\n— rekor.sigstore.dev wNI9ajBFAiEAlipzrqmrk2akmXpZX1Nw0skiMzwrcEtTsLeAk0gJb+UCIAp7AWLKaOLRUoNA/qEtUHIYpvvpJq2enOQLb4MbtRNu\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiZjRiNWEwNDkxMzcxNTEzZTRiMTM0NzJhZTI2ZGI1ZWRiYzk1NmVhMWYyZWFhMGZkMjkzOTc0MTFjMzk1YTczMyJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6Ijc0ZGM3ZTRjNmM4YjM0ZTYzODdjMTVhOGQ2NzdlMWVkMzQzNGRjOWRiZDAyYjE0MGY2NmMzMWUxNmE5MWM4ZDcifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVRQ0lCdDBpL2ZVMXR3Y3Vqc29TR0JqQWFNcnFwSFp5a3I2aFRDd1NrZ2VJVXpYQWlBM1JrNjVja0VqakVTZnVNdVdVWXpUS0wvNkxmUW9vL2RjTnB0TVdYMjhLUT09IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VodFZFTkRRbmcyWjBGM1NVSkJaMGxWVVc1MWNWcFBaVXd2VUZsWU1uRkxZamRFV25NMVFuSk5iVGh6ZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwWmQwOVVTWGROVkZFd1RtcFJORmRvWTA1TmFsbDNUMVJKZDAxVVVURk9hbEUwVjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVnNaVEZyYkZkbWFucHNUV2syV2pnMlkwcHhLMjVOVDJkTk1XZFFORTV0UjFkNVQyTUtkRWhWVlZkb05HMXVWR3hXYlROcVdtZDZlRnA2Vlc5WlVqQkJUMU0yTTJoaVYyTXdNemhDUjNkVlJUTkVSM2hqS3paUFEwSnFNSGRuWjFrMVRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVTBhbWxrQ2s5NFRFVmtXbWQ1TWtvclpVTjBWMU0xY0VFclptNDBkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMlZCV1VSV1VqQlNRVkZJTDBKSE5IZGlTVnB4WVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREpTY21OSGRHNU1NRTUyWWxjeGRncGliazVEV1ZoT2JGZ3hUakJhUXpoMVdqSnNNR0ZJVm1sTU0yUjJZMjEwYldKSE9UTmplVGxyWVZoT01HTnRiR2xrV0ZKc1RGUkpkVTVwTlRWaVYzaEJDbU50Vm0xamVUa3dXVmRrZWt4NlNYVk9hVFI1VFVSSk1rMUVhM2xOUkVVd1RrUk5NRTU2UVRWQ1oyOXlRbWRGUlVGWlR5OU5RVVZDUWtOMGIyUklVbmNLWTNwdmRrd3pVblpoTWxaMVRHMUdhbVJIYkhaaWJrMTFXakpzTUdGSVZtbGtXRTVzWTIxT2RtSnVVbXhpYmxGMVdUSTVkRTFDU1VkRGFYTkhRVkZSUWdwbk56aDNRVkZKUlVKSVFqRmpNbWQzVG1kWlMwdDNXVUpDUVVkRWRucEJRa0YzVVc5T2VrVjNUVVJuTTA1NlVUVlpWRWw2VG0xYWFrMVhVbXRaYlVVMENrMVVTVFJaZW1jMVdsUkZkMDlVVVhsYWJVNXBXbXBSTVZsVVFYbENaMjl5UW1kRlJVRlpUeTlOUVVWRlFrTlJkVm95YkRCaFNGWnBURE5rZG1OdGRHMEtZa2M1TTJONU9XdGhXRTR3WTIxc2FXUllVbXhNVkVsMVRtazFOV0pYZDNkSmQxbExTM2RaUWtKQlIwUjJla0ZDUWxGUlZscEhkSGRoTW1OMlVUSTVkQXBpVnpsMVl6QkthR015Vm1aVk0xSnJUVU52UjBOcGMwZEJVVkZDWnpjNGQwRlJXVVZJU0Vwc1dtNU5kbVJIUm01amVUaDVUR3BaZFUxcVFYbE9ha0UxQ2sxcVFYaE9SRkY2VGtSamQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUliMGREYVhOSFFWRlJRbWMzT0hkQlVXdEZZa0Y0Y1dGSVVqQmpTRTAyVEhrNWJncGhXRkp2WkZkSmRWa3lPWFJNTWxKeVkwZDBia3d3VG5aaVZ6RjJZbTVPUTFsWVRteFlNVTR3V2tNNGRWb3liREJoU0ZacFRETmtkbU50ZEcxaVJ6a3pDbU41T1d0aFdFNHdZMjFzYVdSWVVteE1WRWwxVG1rMU5XSlhlRUZqYlZadFkzazVNRmxYWkhwTWVrbDFUbWswZVUxRVNUSk5SR3Q1VFVSRk1FNUVUVEFLVG5wQk5FSm5iM0pDWjBWRlFWbFBMMDFCUlV0Q1EyOU5TMFJqZUUxRVFUUk9lbU13VDFkRmVVMTZXbTFaZWtacldrZEthRTlFUlhsUFIwMDBUMWRWZUFwTlJHc3dUVzFhYWxsdFdUQk9WMFYzU0ZGWlMwdDNXVUpDUVVkRWRucEJRa04zVVZCRVFURnVZVmhTYjJSWFNYUmhSemw2WkVkV2EwMUVaMGREYVhOSENrRlJVVUpuTnpoM1FWRjNSVXRuZDI5aFNGSXdZMGhOTmt4NU9XNWhXRkp2WkZkSmRWa3lPWFJNTWxKeVkwZDBia3d3VG5aaVZ6RjJZbTVPUTFsWVRtd0tXREZPTUZwRVFUUkNaMjl5UW1kRlJVRlpUeTlOUVVWT1FrTnZUVXRFWTNoTlJFRTBUbnBqTUU5WFJYbE5lbHB0V1hwR2ExcEhTbWhQUkVWNVQwZE5OQXBQVjFWNFRVUnJNRTF0V21wWmJWa3dUbGRGZDB4QldVdExkMWxDUWtGSFJIWjZRVUpFWjFGbFJFSjRlVnBYV25wTU0xSm9Xak5OZGsxcE5ESk1ha2wzQ2sxcVdYZFBWRWwzVFZSUk1FMTZVVE5OUW05SFEybHpSMEZSVVVKbk56aDNRVkU0UlVSQmQwdE5WRWw1VFZSRmVrMXFTWGhPUkVGdlFtZHZja0puUlVVS1FWbFBMMDFCUlZGQ1FtOU5SMGRvTUdSSVFucFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVhMkV6UW5KYWVrRmFRbWR2Y2tKblJVVkJXVTh2VFVGRlVncENRWE5OUTFSSk0wOUVhM2hOZWxWM1RVUkNOa0puYjNKQ1owVkZRVmxQTDAxQlJWTkNSM2ROWVcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJDbUpUT1d0aE0wSnlXbms1UkdJeU1YUmlNalY2VVcxR2VscFdPVlJrUjFGMlRHMWtjR1JIYURGWmFUa3pZak5LY2xwdGVIWmtNMDEyV2tkc2VtUklTbkFLV1c1V01GcFRNSGxNYWxsMVpWY3hjMUZJU214YWJrMTJaRWRHYm1ONU9IbE1hbGwxVFdwQmVVNXFRVFZOYWtGNFRrUlJlazVFWTNkUFFWbExTM2RaUWdwQ1FVZEVkbnBCUWtWM1VYRkVRMmN6VFZSQmQwOUVZek5PUkd4b1RXcE5NbHB0VFhoYVIxSnBXVlJuZUUxcWFHcFBSR3hzVFZSQk5VNUVTbTFaTWtwdENrNUVWbWhOUWxGSFEybHpSMEZSVVVKbk56aDNRVkpSUlVKbmQwVmpTRlo2WVVSQ1kwSm5iM0pDWjBWRlFWbFBMMDFCUlZaQ1JUUk5WRWRvTUdSSVFub0tUMms0ZGxveWJEQmhTRlpwVEcxT2RtSlRPV3RoTTBKeVduazVSR0l5TVhSaU1qVjZVVzFHZWxwV09WUmtSMUYyV1ZkT01HRlhPWFZqZVRsNVpGYzFlZ3BNZWsweFRsUkZNMDVFU1ROTmVsRjRUREpHTUdSSFZuUmpTRko2VEhwRmQwWm5XVXRMZDFsQ1FrRkhSSFo2UVVKR1oxRkpSRUZhZDJSWFNuTmhWMDEzQ2toM1dVdExkMWxDUWtGSFJIWjZRVUpHZDFGU1JFRTVhMkY1TVd0aFdFNHdZMjFzYVdSWVVuQmlNalIzVW1kWlMwdDNXVUpDUVVkRWRucEJRa2RCVVRRS1JFUmFlVnBZUW5aUGJWSnlZMGQwYmt3d1RuWmlWekYyWW01T1ExbFlUbXhZTVU0d1drUndiR0p1V25CamJUbDFZbGRXZFdSRWNHdGhlVEZyWVZoT01BcGpiV3hwWkZoU2NHSXlOSGRuV1hOSFEybHpSMEZSVVVJeGJtdERRa0ZKUldaUlVqZEJTR3RCWkhkRVpGQlVRbkY0YzJOU1RXMU5Xa2hvZVZwYWVtTkRDbTlyY0dWMVRqUTRjbVlyU0dsdVMwRk1lVzUxYW1kQlFVRmhReTlUVEdaT1FVRkJSVUYzUWtsTlJWbERTVkZFWTFOdFZXbGtkMnRDYVRadmMyWnpPVWtLV1d4MFdrdzVUSFIyYmtnMmRYaFNUbUZhZWs5TGFVcDBPR2RKYUVGT016VnllSGxISzBoRWRHRjRSemt3Y21WRFZVeDVjekJCWmtGS2FFcERTRE5FY0FwYVFsUjVWVU52T1UxQmIwZERRM0ZIVTAwME9VSkJUVVJCTW10QlRVZFpRMDFSUkZWTFpXbGlaRWxQVUVKdVVEaFhTbmQ0YjFGbmRuTlpibFpLYlhCakNtZE1SbUVyY2tNNFExSnZVbW96YUZkRFV6bHVZMk5CVlVkSFJucHBjbkZwSzFVNFEwMVJRemhpSzFSa09IVTFNalJZYkZodVFVZEdUMnhPVFZKaGFtWUtORXBtWVdaTVdubFVaVEJGTTNCRVREVnhiVzFFVjJrNU5FcEpiWFZaVlV0d1dqRlVNREpGUFFvdExTMHRMVVZPUkNCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2c9PSJ9XX19"}],"timestampVerificationData":{}},"dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjEiLCJzdWJqZWN0IjpbeyJuYW1lIjoiLmdpdGlnbm9yZSIsImRpZ2VzdCI6eyJzaGEyNTYiOiJjZGJjYWUxNTEwNWQ2Yjc4MWU2MjA4MTNjNzljN2U4Njg3NDBkNGU5Y2M1M2NlNmY1ZmNiYmMxMjM4N2FkZjRiIn19LHsibmFtZSI6IkNvbW1vbnNCYXNlX1N0ZC1kaXN0LXdpbjMyLmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiNDFjM2FiZDAwYWVmYTJkYTBiNTlhNDI1ZDk4NzFhNzVmYTdhNDc5OTE0YmVmOTg4OTFhY2MyNzdiMmUyZDRmZSJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9TdGQtZGlzdC13aW4zMi5kaXN0bWV0YS5tYW5pZmVzdC56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiM2Q3N2QxMjA2MjRlNDJkNTg0NjkwNjgyMDI4ZDJjMzVmYmQwYTZkZDZkZGE2YTRjZGZlOWY0N2IwOThjOGQxOSJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9TdGQtZGlzdC13aW4zMi5kaXN0bWV0YS52YWx1ZXN0b3JlLmluZGV4IiwiZGlnZXN0Ijp7InNoYTI1NiI6IjA3NjFiZTI0ZTg5N2U5OGMwYzMyZDc2OGNjYzJkNWNjZmQ2ZjMwYzY4Y2U3MWY1MTMyYTY0NmQxZjVjMWU0YzYifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfU3RkLWRpc3Qtd2luMzIuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiNzk3NDViMTJiODI2YzI4YmNhZjY4YWQ3NGQ0YWEzZTAyYWYzMDg5YTNkMmRkMDMxMTk5NGMxOWM2ZDk4Y2U3MiJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9TdGQtZGlzdC13aW4zMi5wYWNrYWdlLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiOTRhNmIxYWEzYjUyOTRkZDA1OGVlMjc2MmI4Y2JiZjQ2ZWM4MmFjZWFjN2I5ZWU4M2FkNDI5NGRkMmExMjhmOCJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9TdGQtZGlzdC13aW4zMi5wYWNrYWdlLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiN2U1NGIzZTRjZWExOTFmNjNmYTg5MWZkMDcyOGVjNjVjNThkOGQ4M2EzMjc5MjM4NDI3MGNhYjkyMDUxZmYzMCJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9TdGQtZGlzdC13aW4zMi5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjQyYjQzOTdkOTg5MTA4ZWE2YzE0OTAzZjE1NzViODFmMmVmNjAwOTMwOWRmM2ZmZGY4MDdjMDNiNDU5Y2IwODMifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfU3RkLWRpc3Qtd2luMzIudmFsdWVzLmpzb24iLCJkaWdlc3QiOnsic2hhMjU2IjoiMDEwYTQ1NGRjN2M4OTM3ZGIxZTk2MDlhYmE0NDM5YjRmYzliN2IyNDVjOTI2NDg2M2MxODU1OTA4MzUzMWU0NyJ9fSx7Im5hbWUiOiJ2YWx1ZXMuanNvbiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJhNDJlYmE4MzRiMDRjZDY1MDY5ZTVkMzUxNmMzZDY4OGQ0YWE2Y2U4MDAxMjM1NjE4ODYxZmUwMjdmM2VlZTFjIn19XSwicHJlZGljYXRlVHlwZSI6Imh0dHBzOi8vc2xzYS5kZXYvcHJvdmVuYW5jZS92MSIsInByZWRpY2F0ZSI6eyJidWlsZERlZmluaXRpb24iOnsiYnVpbGRUeXBlIjoiaHR0cHM6Ly9hY3Rpb25zLmdpdGh1Yi5pby9idWlsZHR5cGVzL3dvcmtmbG93L3YxIiwiZXh0ZXJuYWxQYXJhbWV0ZXJzIjp7IndvcmtmbG93Ijp7InJlZiI6InJlZnMvdGFncy8yLjYuMjAyNjA5MjAxNDQzNDciLCJyZXBvc2l0b3J5IjoiaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX1N0ZCIsInBhdGgiOiIuZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTIuNi55bWwifX0sImludGVybmFsUGFyYW1ldGVycyI6eyJnaXRodWIiOnsiZXZlbnRfbmFtZSI6InB1c2giLCJyZXBvc2l0b3J5X2lkIjoiMTIyMTEzMjIxNCIsInJlcG9zaXRvcnlfb3duZXJfaWQiOiIyNzg5MTM1MDAiLCJydW5uZXJfZW52aXJvbm1lbnQiOiJnaXRodWItaG9zdGVkIn19LCJyZXNvbHZlZERlcGVuZGVuY2llcyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zQmFzZV9TdGRAcmVmcy90YWdzLzIuNi4yMDI2MDkyMDE0NDM0NyIsImRpZ2VzdCI6eyJnaXRDb21taXQiOiI3MTAwODc3NDlhMjM2ZmMxZGRiYTgxMjhjODllMTA5NDJmY2JmNDVhIn19XX0sInJ1bkRldGFpbHMiOnsiYnVpbGRlciI6eyJpZCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zQmFzZV9TdGQvLmdpdGh1Yi93b3JrZmxvd3MvZGlzdHJpYnV0ZS0yLjYueW1sQHJlZnMvdGFncy8yLjYuMjAyNjA5MjAxNDQzNDcifSwibWV0YWRhdGEiOnsiaW52b2NhdGlvbklkIjoiaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX1N0ZC9hY3Rpb25zL3J1bnMvMzU1MTc0MjczNDEvYXR0ZW1wdHMvMSJ9fX19","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MEQCIBt0i/fU1twcujsoSGBjAaMrqpHZykr6hTCwSkgeIUzXAiA3Rk65ckEjjESfuMuWUYzTKL/6LfQoo/dcNptMWX28KQ=="}]}}
105
+ ] },
106
+ "github_slsa_v1_l3": {},
107
+ "openbsd_signify": {
108
+ "signature": "untrusted comment: signed by key f012f39422d61ed2\nRWTwEvOUItYe0tfCgKd/tlW9sEzphV1poCzJ5lFcNpeSHZ8YuxrYsKx8GQlTB32tlaMsmKgueNAF+nSzdPLhlEkattW45QfFcgM=\n"
109
+ }
110
+ },
111
+ "build_to_sign": {
112
+ "bundle_canonical": "b2de006a2e13c31a1b930e9b028dbb9f5a00de20b91d0b5244bab6c55122641a",
113
+ "bundle_modver": "CommonsBase_Std.Distribution@2.6.20260920144347",
114
+ "modules": [
115
+ "CommonsBase_Std.Coreutils@0.6.0",
116
+ "CommonsBase_Std.Coreutils@0.8.0",
117
+ "CommonsBase_Std.Distribution@2.6.20260920144347",
118
+ "CommonsBase_Std.Fd@10.3.0", "CommonsBase_Std.S7z@25.1.0",
119
+ "CommonsBase_Std.Toybox@0.8.9",
120
+ "CommonsBase_Std.Apparatus.Nano@0.1.0",
121
+ "CommonsBase_Std.Apparatus.NanoTbz@0.1.0",
122
+ "CommonsBase_Std.Apparatus.NanoZst@0.1.0",
123
+ "CommonsBase_Std.Assets.RustAbi@0.1.0",
124
+ "CommonsBase_Std.Coreutils.Bundle@0.6.0",
125
+ "CommonsBase_Std.Coreutils.Bundle@0.8.0",
126
+ "CommonsBase_Std.Coreutils.Exe@0.6.0",
127
+ "CommonsBase_Std.Coreutils.Exe@0.8.0",
128
+ "CommonsBase_Std.Coreutils.Tar@0.8.0",
129
+ "CommonsBase_Std.Extract.F_TarToZip@0.1.0",
130
+ "CommonsBase_Std.Extract.F_TarToZip@0.1.1",
131
+ "CommonsBase_Std.Extract.F_TarToZip@0.2.0",
132
+ "CommonsBase_Std.Extract.F_TarToZip@0.2.1",
133
+ "CommonsBase_Std.Extract.F_TarToZip@0.3.0",
134
+ "CommonsBase_Std.Extract.F_TarToZip@0.3.1",
135
+ "CommonsBase_Std.Extract.F_Untar@0.1.0",
136
+ "CommonsBase_Std.Extract.F_Untar@0.1.1",
137
+ "CommonsBase_Std.Extract.F_Untar@0.2.0",
138
+ "CommonsBase_Std.Extract.F_Untar@0.2.1",
139
+ "CommonsBase_Std.Extract.F_Untar@0.3.0",
140
+ "CommonsBase_Std.Extract.F_Untar@0.3.1",
141
+ "CommonsBase_Std.Fd.Bundle@10.3.0",
142
+ "CommonsBase_Std.Fd.Tar@10.3.0",
143
+ "CommonsBase_Std.Fd.Tar.Darwin_arm64@10.3.0",
144
+ "CommonsBase_Std.Fd.Tar.Darwin_x86_64@10.3.0",
145
+ "CommonsBase_Std.Fd.Tar.Linux_arm64@10.3.0",
146
+ "CommonsBase_Std.Fd.Tar.Linux_x86@10.3.0",
147
+ "CommonsBase_Std.Fd.Tar.Linux_x86_64@10.3.0",
148
+ "CommonsBase_Std.S7z.Bundle@25.1.0",
149
+ "CommonsBase_Std.S7z.MacLinux7zExe@25.1.0",
150
+ "CommonsBase_Std.S7z.MacLinux7zTar@25.1.0",
151
+ "CommonsBase_Std.S7z.S7zr@25.1.0",
152
+ "CommonsBase_Std.S7z.Windows7zExe@25.1.0"
153
+ ],
154
+ "producer_accepts": [],
155
+ "distmeta": {
156
+ "traces": [
157
+ {
158
+ "tag": "cts.1",
159
+ "path": "CommonsBase_Std-dist-win32.distmeta.cts.1.tracestore"
160
+ }
161
+ ],
162
+ "values": [
163
+ {
164
+ "path": "CommonsBase_Std-dist-win32.distmeta.valuestore.zip"
165
+ }
166
+ ]
167
+ },
168
+ "package": {
169
+ "traces": [
170
+ {
171
+ "tag": "cts.1",
172
+ "path": "CommonsBase_Std-dist-win32.package.cts.1.tracestore"
173
+ }
174
+ ],
175
+ "values": [
176
+ { "path": "CommonsBase_Std-dist-win32.package.valuestore.zip" }
177
+ ]
178
+ },
179
+ "script_module_sha256s": [
180
+ "3198432003cb0a0ebb2da7f8d3f50729d0a1b5657fa10a907fcefba2d2b1c03c",
181
+ "42dbd74c950125640171023de44408ee70f3f4b232371d285562eb582cbda410",
182
+ "86defb1b6656d796b7bac298df650533cced4c0d9a39b71c84d5d9b52b84a303",
183
+ "a9bbaa427f7639ed0fa7ee977a8c936984fd99731425c54d9923b054db9a9149",
184
+ "d7de396df11530cf6d76ca4bb2842592298eaad440a06835509eaedb2533b18a",
185
+ "e10eb30ef2a9ffe80fa47e8f929bcf40f59fa4d02902cfc6bfa5c805c336094d"
186
+ ]
187
+ }
188
+ },
189
+ "continuations": {
190
+ "attestation": {
191
+ "openbsd_signify": {
192
+ "signature": "untrusted comment: signed by key f012f39422d61ed2\nRWTwEvOUItYe0gzpAbJQl2uQHm6a/ru/M6czxUmSNJFozpqA1f6FUP0mjdnyZg7DwC5w3LqcEo1VtkW3KjuypmVTskl3hBr2jQk=\n"
193
+ }
194
+ },
195
+ "continuations_to_sign": {
196
+ "2.7": {
197
+ "application": { "name": "dk0", "version": "2.4.2+rev-233" },
198
+ "openbsd_signify": {
199
+ "public_key": "untrusted comment: CommonsBase_Std-2.7\nRWSesfERD4t0CfZXffufCrILIaAbo1MAkv71wC4pAb5zY5BnOkzq3yB5\n"
200
+ }
201
+ },
202
+ "2.8": {
203
+ "application": { "name": "dk0", "version": "2.4.2+rev-233" },
204
+ "openbsd_signify": {
205
+ "public_key": "untrusted comment: CommonsBase_Std-2.8\nRWTooNFcmKODlGshCH/ckDm33SWya+8Xfp/B4jc6mGNtN5v6N8gMtU0X\n"
206
+ }
207
+ },
208
+ "3.0": {
209
+ "openbsd_signify": {
210
+ "public_key": "untrusted comment: CommonsBase_Std-3.0\nRWTzxNnZQeugZoU4+2DgxxktaEJKGlEprALP67bac7HPQxAK4ee1WCxk\n"
211
+ }
212
+ }
213
+ }
214
+ },
215
+ "id": "CommonsBase_Std@2.6.20260920144347",
216
+ "license": { "spdx": "Apache-2.0" },
217
+ "producer": {
218
+ "application": { "name": "dk0", "version": "2.4.3+rev-22" },
219
+ "github_slsa_v1_l2": { "repository": "dkpkg/CommonsBase_Std" },
220
+ "openbsd_signify": {
221
+ "public_key": "untrusted comment: CommonsBase_Std-2.6\nRWTwEvOUItYe0u6ALvOER15EmRBMzwb9DEEJrCiJ25gMRzqHhpxtxa5a\n"
222
+ }
223
+ },
224
+ "min_dk_version": "2.4.2.213"
225
+ }
226
+ ],
227
+ "forms": [],
228
+ "schema_version": { "major": 1, "minor": 0 }
229
+ }
etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json ADDED
@@ -0,0 +1,815 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bundles": [
3
+ {
4
+ "assets": [
5
+ {
6
+ "checksum": {
7
+ "blake2b256": "1819ec510943ecfd42b950d41995a05d2d7c827f786e592cc6f3b26639f6150a"
8
+ },
9
+ "origin": "CommonsLang_OCaml",
10
+ "path": "CommonsLang_OCaml-Darwin_arm64.distmeta.cts.1.tracestore",
11
+ "size": 259717
12
+ },
13
+ {
14
+ "checksum": {
15
+ "blake2b256": "6ac1e00affe868a6059af96381e03bc8a7ad50c7ac671a352b6abc4bff05308a"
16
+ },
17
+ "indexes": [
18
+ {
19
+ "type": "zip",
20
+ "zip": {
21
+ "local_offset": 0,
22
+ "central_offset": 419972,
23
+ "central_size": 1200,
24
+ "checksum": {
25
+ "blake2b256": "19f43aa1755ed3a9564a626dd2847574aa5d77f4971e232f959d58608c69e07d"
26
+ }
27
+ }
28
+ }
29
+ ],
30
+ "origin": "CommonsLang_OCaml",
31
+ "path": "CommonsLang_OCaml-Darwin_arm64.distmeta.manifest.zip",
32
+ "size": 421172
33
+ },
34
+ {
35
+ "checksum": {
36
+ "blake2b256": "e2f61225e166ad84a07e184f419558fac20a8e9b243976c90639ff6095f6e868"
37
+ },
38
+ "indexes": [
39
+ {
40
+ "type": "zip",
41
+ "zip": {
42
+ "local_offset": 0,
43
+ "central_offset": 182312,
44
+ "central_size": 1253,
45
+ "checksum": {
46
+ "blake2b256": "19fcb54c52583457923662d4de743cee18a7a6c4b6c13517221b4077e2589be5"
47
+ }
48
+ }
49
+ }
50
+ ],
51
+ "origin": "CommonsLang_OCaml",
52
+ "path": "CommonsLang_OCaml-Darwin_arm64.distmeta.valuestore.zip",
53
+ "size": 183565
54
+ },
55
+ {
56
+ "checksum": {
57
+ "blake2b256": "9d98f3ffa0617a5d45a53213df0593e2bbfc050fb66ac0b47b25ce9a2a45bdbb"
58
+ },
59
+ "origin": "CommonsLang_OCaml",
60
+ "path": "CommonsLang_OCaml-Darwin_arm64.package.cts.1.tracestore",
61
+ "size": 294213
62
+ },
63
+ {
64
+ "checksum": {
65
+ "blake2b256": "720fa29247171726b1893163a2c82d4e1b5c7bd418efd33317e5f641798826c9"
66
+ },
67
+ "indexes": [
68
+ {
69
+ "type": "zip",
70
+ "zip": {
71
+ "local_offset": 0,
72
+ "central_offset": 706117231,
73
+ "central_size": 14063,
74
+ "checksum": {
75
+ "blake2b256": "4c19275a9385d31deb72ded871357fbda893c39274bd96d106d9745e9db98c25"
76
+ }
77
+ }
78
+ }
79
+ ],
80
+ "origin": "CommonsLang_OCaml",
81
+ "path": "CommonsLang_OCaml-Darwin_arm64.package.valuestore.zip",
82
+ "size": 706131294
83
+ },
84
+ {
85
+ "checksum": {
86
+ "blake2b256": "77d2b4f7fad963206489ad9137addd5fbd9bdb65cf8499e36f04265926c0a21e"
87
+ },
88
+ "origin": "CommonsLang_OCaml",
89
+ "path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.distmeta.cts.1.tracestore",
90
+ "size": 219088
91
+ },
92
+ {
93
+ "checksum": {
94
+ "blake2b256": "86aaf2c8982272b6966038e4a91a4f3de4c569f8a3588753b3507f4f795baff9"
95
+ },
96
+ "indexes": [
97
+ {
98
+ "type": "zip",
99
+ "zip": {
100
+ "local_offset": 0,
101
+ "central_offset": 419962,
102
+ "central_size": 1201,
103
+ "checksum": {
104
+ "blake2b256": "d90a680719ffa0f9946c4833b842222a996f9df08a9bd523c73ddf45a476d3e9"
105
+ }
106
+ }
107
+ }
108
+ ],
109
+ "origin": "CommonsLang_OCaml",
110
+ "path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.distmeta.manifest.zip",
111
+ "size": 421163
112
+ },
113
+ {
114
+ "checksum": {
115
+ "blake2b256": "b505989c29d44ecb7b22d98e4f2ebfe1acfd9f1c2ec8cf0510e6e16f829a3027"
116
+ },
117
+ "indexes": [
118
+ {
119
+ "type": "zip",
120
+ "zip": {
121
+ "local_offset": 0,
122
+ "central_offset": 166877,
123
+ "central_size": 1148,
124
+ "checksum": {
125
+ "blake2b256": "913884385abe8d577e19753e58412e698f768fe72bbd907ebd9621896774182c"
126
+ }
127
+ }
128
+ }
129
+ ],
130
+ "origin": "CommonsLang_OCaml",
131
+ "path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.distmeta.valuestore.zip",
132
+ "size": 168025
133
+ },
134
+ {
135
+ "checksum": {
136
+ "blake2b256": "f001aa16d2d8c42ce3f4424452d3bfff6d09f779975d063d7ceba0d73a64d372"
137
+ },
138
+ "origin": "CommonsLang_OCaml",
139
+ "path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.package.cts.1.tracestore",
140
+ "size": 263406
141
+ },
142
+ {
143
+ "checksum": {
144
+ "blake2b256": "ce2ddb6fc236c65acc5f79d85544641a7f1445dc47bb6af0a9be222300cce1b0"
145
+ },
146
+ "indexes": [
147
+ {
148
+ "type": "zip",
149
+ "zip": {
150
+ "local_offset": 0,
151
+ "central_offset": 694548893,
152
+ "central_size": 10703,
153
+ "checksum": {
154
+ "blake2b256": "e9cb5f71fc7a150500ab4a401b227e9271126e50d523831bf3084ccd4b9416cd"
155
+ }
156
+ }
157
+ }
158
+ ],
159
+ "origin": "CommonsLang_OCaml",
160
+ "path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.package.valuestore.zip",
161
+ "size": 694559596
162
+ },
163
+ {
164
+ "checksum": {
165
+ "blake2b256": "77d2b4f7fad963206489ad9137addd5fbd9bdb65cf8499e36f04265926c0a21e"
166
+ },
167
+ "origin": "CommonsLang_OCaml",
168
+ "path": "CommonsLang_OCaml-Linux_x86-Linux_x86.distmeta.cts.1.tracestore",
169
+ "size": 219088
170
+ },
171
+ {
172
+ "checksum": {
173
+ "blake2b256": "1b7d1344c187acd1b6159a73aec5d65d5287f0ebf18bde4d0ce62e97875d7a0c"
174
+ },
175
+ "indexes": [
176
+ {
177
+ "type": "zip",
178
+ "zip": {
179
+ "local_offset": 0,
180
+ "central_offset": 419883,
181
+ "central_size": 1197,
182
+ "checksum": {
183
+ "blake2b256": "d58a6909967392060a6713e6d313ec8722fc77d8a169c5ac044ea786caac0e93"
184
+ }
185
+ }
186
+ }
187
+ ],
188
+ "origin": "CommonsLang_OCaml",
189
+ "path": "CommonsLang_OCaml-Linux_x86-Linux_x86.distmeta.manifest.zip",
190
+ "size": 421080
191
+ },
192
+ {
193
+ "checksum": {
194
+ "blake2b256": "b505989c29d44ecb7b22d98e4f2ebfe1acfd9f1c2ec8cf0510e6e16f829a3027"
195
+ },
196
+ "indexes": [
197
+ {
198
+ "type": "zip",
199
+ "zip": {
200
+ "local_offset": 0,
201
+ "central_offset": 166877,
202
+ "central_size": 1148,
203
+ "checksum": {
204
+ "blake2b256": "913884385abe8d577e19753e58412e698f768fe72bbd907ebd9621896774182c"
205
+ }
206
+ }
207
+ }
208
+ ],
209
+ "origin": "CommonsLang_OCaml",
210
+ "path": "CommonsLang_OCaml-Linux_x86-Linux_x86.distmeta.valuestore.zip",
211
+ "size": 168025
212
+ },
213
+ {
214
+ "checksum": {
215
+ "blake2b256": "5fad041933c42408a4e88f5cf89cf97ce0da9a09292781c088b66a7908a31020"
216
+ },
217
+ "origin": "CommonsLang_OCaml",
218
+ "path": "CommonsLang_OCaml-Linux_x86-Linux_x86.package.cts.1.tracestore",
219
+ "size": 260591
220
+ },
221
+ {
222
+ "checksum": {
223
+ "blake2b256": "f2bd8030e571d7e9ade9cd55f6d35bb7ab2d3c6818756c11fed57de4c2771055"
224
+ },
225
+ "indexes": [
226
+ {
227
+ "type": "zip",
228
+ "zip": {
229
+ "local_offset": 0,
230
+ "central_offset": 471842706,
231
+ "central_size": 10283,
232
+ "checksum": {
233
+ "blake2b256": "7bfb18b31e52ec73a4038ab4d019a03fdf85d4b4299c9887ce857a2deacfa718"
234
+ }
235
+ }
236
+ }
237
+ ],
238
+ "origin": "CommonsLang_OCaml",
239
+ "path": "CommonsLang_OCaml-Linux_x86-Linux_x86.package.valuestore.zip",
240
+ "size": 471852989
241
+ },
242
+ {
243
+ "checksum": {
244
+ "blake2b256": "ef79ef0c6a885b8a1dbd699d11aa74ac2c407789c6d025f2909d3fa1f80f0e6f"
245
+ },
246
+ "origin": "CommonsLang_OCaml",
247
+ "path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.distmeta.cts.1.tracestore",
248
+ "size": 760178
249
+ },
250
+ {
251
+ "checksum": {
252
+ "blake2b256": "21dc901bebc0a21693805b1379f4abbf3d8303c46a3aeaff9b22dc9cf290c501"
253
+ },
254
+ "indexes": [
255
+ {
256
+ "type": "zip",
257
+ "zip": {
258
+ "local_offset": 0,
259
+ "central_offset": 420590,
260
+ "central_size": 1200,
261
+ "checksum": {
262
+ "blake2b256": "145431b17faf5d21beecd727112e89b9d38a4513328fc527966cf51efc94bcc2"
263
+ }
264
+ }
265
+ }
266
+ ],
267
+ "origin": "CommonsLang_OCaml",
268
+ "path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.distmeta.manifest.zip",
269
+ "size": 421790
270
+ },
271
+ {
272
+ "checksum": {
273
+ "blake2b256": "8e9bca44b73c17c71666a28454dbd90c14002faf744a0af88735e02ecb5f364a"
274
+ },
275
+ "indexes": [
276
+ {
277
+ "type": "zip",
278
+ "zip": {
279
+ "local_offset": 0,
280
+ "central_offset": 387796,
281
+ "central_size": 3038,
282
+ "checksum": {
283
+ "blake2b256": "cf8ce4e6178400617f347cc8375d7735aa6d50fd1468adcb12a51858388bb6e6"
284
+ }
285
+ }
286
+ }
287
+ ],
288
+ "origin": "CommonsLang_OCaml",
289
+ "path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.distmeta.valuestore.zip",
290
+ "size": 390834
291
+ },
292
+ {
293
+ "checksum": {
294
+ "blake2b256": "449f90ca31d7eee2594bcc55558c553495d90bf0340c4ec6d0a12cd628c3f494"
295
+ },
296
+ "origin": "CommonsLang_OCaml",
297
+ "path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.package.cts.1.tracestore",
298
+ "size": 321796
299
+ },
300
+ {
301
+ "checksum": {
302
+ "blake2b256": "8bf420e35bb0dc27d3a576b96a5ac2eea6c211d0844d3f4e797f8069a3cc5c71"
303
+ },
304
+ "indexes": [
305
+ {
306
+ "type": "zip",
307
+ "zip": {
308
+ "local_offset": 0,
309
+ "central_offset": 828855353,
310
+ "central_size": 17108,
311
+ "checksum": {
312
+ "blake2b256": "b4a89f16781fb42d5fa8696d0ac88c50b1599b217a505c8d65d8a741ca05fd07"
313
+ }
314
+ }
315
+ }
316
+ ],
317
+ "origin": "CommonsLang_OCaml",
318
+ "path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.package.valuestore.zip",
319
+ "size": 828872461
320
+ },
321
+ {
322
+ "checksum": {
323
+ "blake2b256": "77d2b4f7fad963206489ad9137addd5fbd9bdb65cf8499e36f04265926c0a21e"
324
+ },
325
+ "origin": "CommonsLang_OCaml",
326
+ "path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.distmeta.cts.1.tracestore",
327
+ "size": 219088
328
+ },
329
+ {
330
+ "checksum": {
331
+ "blake2b256": "7c7174f9d2fefc6b9bb31641912c114649a9d1c3b7c6336159b8078001cec2ee"
332
+ },
333
+ "indexes": [
334
+ {
335
+ "type": "zip",
336
+ "zip": {
337
+ "local_offset": 0,
338
+ "central_offset": 420681,
339
+ "central_size": 1205,
340
+ "checksum": {
341
+ "blake2b256": "c24178998535d51de29d8732da3c18526272d09279cc928cfe5569d00d7d0431"
342
+ }
343
+ }
344
+ }
345
+ ],
346
+ "origin": "CommonsLang_OCaml",
347
+ "path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.distmeta.manifest.zip",
348
+ "size": 421886
349
+ },
350
+ {
351
+ "checksum": {
352
+ "blake2b256": "b505989c29d44ecb7b22d98e4f2ebfe1acfd9f1c2ec8cf0510e6e16f829a3027"
353
+ },
354
+ "indexes": [
355
+ {
356
+ "type": "zip",
357
+ "zip": {
358
+ "local_offset": 0,
359
+ "central_offset": 166877,
360
+ "central_size": 1148,
361
+ "checksum": {
362
+ "blake2b256": "913884385abe8d577e19753e58412e698f768fe72bbd907ebd9621896774182c"
363
+ }
364
+ }
365
+ }
366
+ ],
367
+ "origin": "CommonsLang_OCaml",
368
+ "path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.distmeta.valuestore.zip",
369
+ "size": 168025
370
+ },
371
+ {
372
+ "checksum": {
373
+ "blake2b256": "59293a3f844134ddf9adcbe4f8332e152bebaa9032b7f9f355fcc2c5f34a8b0a"
374
+ },
375
+ "origin": "CommonsLang_OCaml",
376
+ "path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.package.cts.1.tracestore",
377
+ "size": 259146
378
+ },
379
+ {
380
+ "checksum": {
381
+ "blake2b256": "a2e53b5f254d1e077dd919c4ed2264ecabcfc9581cee23bac8f9fc4af7775ad4"
382
+ },
383
+ "indexes": [
384
+ {
385
+ "type": "zip",
386
+ "zip": {
387
+ "local_offset": 0,
388
+ "central_offset": 839537604,
389
+ "central_size": 10073,
390
+ "checksum": {
391
+ "blake2b256": "abc7c04528c6ba9bf45374a2ff6880ddebfb14ae61b0459718ef1f50314dce8e"
392
+ }
393
+ }
394
+ }
395
+ ],
396
+ "origin": "CommonsLang_OCaml",
397
+ "path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.package.valuestore.zip",
398
+ "size": 839547677
399
+ },
400
+ {
401
+ "checksum": {
402
+ "blake2b256": "6c2daa6e8fefc06739c4bc4d70c12e2f76de462f7b050234f6d0d8f346b7b3ea"
403
+ },
404
+ "origin": "CommonsLang_OCaml",
405
+ "path": "CommonsLang_OCaml-Windows_x86-Windows_x86.distmeta.cts.1.tracestore",
406
+ "size": 219088
407
+ },
408
+ {
409
+ "checksum": {
410
+ "blake2b256": "cffbacede7443430dc4a3e5435569d769fc9089531cc46ca10d068b39a58e174"
411
+ },
412
+ "indexes": [
413
+ {
414
+ "type": "zip",
415
+ "zip": {
416
+ "local_offset": 0,
417
+ "central_offset": 419958,
418
+ "central_size": 1199,
419
+ "checksum": {
420
+ "blake2b256": "29b053a164888eb781c570abd6e1915560073b35cb9a56d7f6b147b8d21ba597"
421
+ }
422
+ }
423
+ }
424
+ ],
425
+ "origin": "CommonsLang_OCaml",
426
+ "path": "CommonsLang_OCaml-Windows_x86-Windows_x86.distmeta.manifest.zip",
427
+ "size": 421157
428
+ },
429
+ {
430
+ "checksum": {
431
+ "blake2b256": "b505989c29d44ecb7b22d98e4f2ebfe1acfd9f1c2ec8cf0510e6e16f829a3027"
432
+ },
433
+ "indexes": [
434
+ {
435
+ "type": "zip",
436
+ "zip": {
437
+ "local_offset": 0,
438
+ "central_offset": 166877,
439
+ "central_size": 1148,
440
+ "checksum": {
441
+ "blake2b256": "913884385abe8d577e19753e58412e698f768fe72bbd907ebd9621896774182c"
442
+ }
443
+ }
444
+ }
445
+ ],
446
+ "origin": "CommonsLang_OCaml",
447
+ "path": "CommonsLang_OCaml-Windows_x86-Windows_x86.distmeta.valuestore.zip",
448
+ "size": 168025
449
+ },
450
+ {
451
+ "checksum": {
452
+ "blake2b256": "46435e89f8bd21f0f921ce0e7a5f41fd94804306cb1e3a9b4f3251d69b6003b7"
453
+ },
454
+ "origin": "CommonsLang_OCaml",
455
+ "path": "CommonsLang_OCaml-Windows_x86-Windows_x86.package.cts.1.tracestore",
456
+ "size": 266983
457
+ },
458
+ {
459
+ "checksum": {
460
+ "blake2b256": "ac7299edec63d358ed929968d6aada92a7dced91c0451f693dd7586023af8eb6"
461
+ },
462
+ "indexes": [
463
+ {
464
+ "type": "zip",
465
+ "zip": {
466
+ "local_offset": 0,
467
+ "central_offset": 261334823,
468
+ "central_size": 10493,
469
+ "checksum": {
470
+ "blake2b256": "eb3fa2f933f804545cbafeafb376d3da3f0c9d31625f625cf82a578b8a84a69f"
471
+ }
472
+ }
473
+ }
474
+ ],
475
+ "origin": "CommonsLang_OCaml",
476
+ "path": "CommonsLang_OCaml-Windows_x86-Windows_x86.package.valuestore.zip",
477
+ "size": 261345316
478
+ },
479
+ {
480
+ "checksum": {
481
+ "blake2b256": "ef79ef0c6a885b8a1dbd699d11aa74ac2c407789c6d025f2909d3fa1f80f0e6f"
482
+ },
483
+ "origin": "CommonsLang_OCaml",
484
+ "path": "CommonsLang_OCaml-Windows_x86_64.distmeta.cts.1.tracestore",
485
+ "size": 760178
486
+ },
487
+ {
488
+ "checksum": {
489
+ "blake2b256": "8a66fb9d0efb567fc46051713c2316eb62082de50b900e59c85dc1451b7c220c"
490
+ },
491
+ "indexes": [
492
+ {
493
+ "type": "zip",
494
+ "zip": {
495
+ "local_offset": 0,
496
+ "central_offset": 420134,
497
+ "central_size": 1202,
498
+ "checksum": {
499
+ "blake2b256": "185e7de7d66191596495a49aa9ef5e00778437d8b77367e4520af35992e6eba9"
500
+ }
501
+ }
502
+ }
503
+ ],
504
+ "origin": "CommonsLang_OCaml",
505
+ "path": "CommonsLang_OCaml-Windows_x86_64.distmeta.manifest.zip",
506
+ "size": 421336
507
+ },
508
+ {
509
+ "checksum": {
510
+ "blake2b256": "8e9bca44b73c17c71666a28454dbd90c14002faf744a0af88735e02ecb5f364a"
511
+ },
512
+ "indexes": [
513
+ {
514
+ "type": "zip",
515
+ "zip": {
516
+ "local_offset": 0,
517
+ "central_offset": 387796,
518
+ "central_size": 3038,
519
+ "checksum": {
520
+ "blake2b256": "cf8ce4e6178400617f347cc8375d7735aa6d50fd1468adcb12a51858388bb6e6"
521
+ }
522
+ }
523
+ }
524
+ ],
525
+ "origin": "CommonsLang_OCaml",
526
+ "path": "CommonsLang_OCaml-Windows_x86_64.distmeta.valuestore.zip",
527
+ "size": 390834
528
+ },
529
+ {
530
+ "checksum": {
531
+ "blake2b256": "19b64874498de16248bfbe6b614b7e4860a7b4561d540f262690de4309633e7a"
532
+ },
533
+ "origin": "CommonsLang_OCaml",
534
+ "path": "CommonsLang_OCaml-Windows_x86_64.package.cts.1.tracestore",
535
+ "size": 382661
536
+ },
537
+ {
538
+ "checksum": {
539
+ "blake2b256": "d257c78dd27503631d73b46f6ec3fa9421b660370540bc1ea79521d994805325"
540
+ },
541
+ "indexes": [
542
+ {
543
+ "type": "zip",
544
+ "zip": {
545
+ "local_offset": 0,
546
+ "central_offset": 873766957,
547
+ "central_size": 19418,
548
+ "checksum": {
549
+ "blake2b256": "4d3080718723003fbaff083cd0136c2ec7ee8293e2f5b72fc249a764abfff76d"
550
+ }
551
+ }
552
+ }
553
+ ],
554
+ "origin": "CommonsLang_OCaml",
555
+ "path": "CommonsLang_OCaml-Windows_x86_64.package.valuestore.zip",
556
+ "size": 873786375
557
+ }
558
+ ],
559
+ "id": "CommonsLang_OCaml.Distribution@0.1.20260920144347",
560
+ "listing": {
561
+ "origins": [
562
+ {
563
+ "name": "CommonsLang_OCaml",
564
+ "mirrors": [
565
+ "https://github.com/dkpkg/CommonsLang_OCaml/releases/download/0.1.20260920144347"
566
+ ]
567
+ }
568
+ ]
569
+ }
570
+ }
571
+ ],
572
+ "distributions": [
573
+ {
574
+ "build": {
575
+ "attestation": {
576
+ "github_slsa_v1_l2": {
577
+ "docs": [
578
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHiTCCBw+gAwIBAgIUTdEGvjV/+RPctkSyPrhGxU4J6RcwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwOTIwMTg1MDAxWhcNMjYwOTIwMTkwMDAxWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUV408k88Q1R/wBHXiyaiMf4fQrnQTJ79zSY1bq4yT+k4doQy1GTqyP+/ORqBo9uT5AQfS0f/owsPqz79918l56OCBi4wggYqMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUXjI+L4VOqPnc1UtEG+huxOjHdpgwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wegYDVR0RAQH/BHAwboZsaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNMYW5nX09DYW1sLy5naXRodWIvd29ya2Zsb3dzL2Rpc3RyaWJ1dGUtMC4xLnltbEByZWZzL3RhZ3MvMC4xLjIwMjYwOTIwMTQ0MzQ3MDkGCisGAQQBg78wAQEEK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20wEgYKKwYBBAGDvzABAgQEcHVzaDA2BgorBgEEAYO/MAEDBCgzZDg1ZWNjNDI0ZGI1ZWVmNzBjNzUwOWZmMzJhNzhjODE5ODI0ZGFiMDIGCisGAQQBg78wAQQEJC5naXRodWIvd29ya2Zsb3dzL2Rpc3RyaWJ1dGUtMC4xLnltbDAlBgorBgEEAYO/MAEFBBdka3BrZy9Db21tb25zTGFuZ19PQ2FtbDAqBgorBgEEAYO/MAEGBBxyZWZzL3RhZ3MvMC4xLjIwMjYwOTIwMTQ0MzQ3MDsGCisGAQQBg78wAQgELQwraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTB8BgorBgEEAYO/MAEJBG4MbGh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zTGFuZ19PQ2FtbC8uZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTAuMS55bWxAcmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NzA4BgorBgEEAYO/MAEKBCoMKDNkODVlY2M0MjRkYjVlZWY3MGM3NTA5ZmYzMmE3OGM4MTk4MjRkYWIwHQYKKwYBBAGDvzABCwQPDA1naXRodWItaG9zdGVkMDoGCisGAQQBg78wAQwELAwqaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNMYW5nX09DYW1sMDgGCisGAQQBg78wAQ0EKgwoM2Q4NWVjYzQyNGRiNWVlZjcwYzc1MDlmZjMyYTc4YzgxOTgyNGRhYjAsBgorBgEEAYO/MAEOBB4MHHJlZnMvdGFncy8wLjEuMjAyNjA5MjAxNDQzNDcwGgYKKwYBBAGDvzABDwQMDAoxMjIyODc0MTc5MCgGCisGAQQBg78wARAEGgwYaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnMBkGCisGAQQBg78wAREECwwJMjc4OTEzNTAwMHwGCisGAQQBg78wARIEbgxsaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNMYW5nX09DYW1sLy5naXRodWIvd29ya2Zsb3dzL2Rpc3RyaWJ1dGUtMC4xLnltbEByZWZzL3RhZ3MvMC4xLjIwMjYwOTIwMTQ0MzQ3MDgGCisGAQQBg78wARMEKgwoM2Q4NWVjYzQyNGRiNWVlZjcwYzc1MDlmZjMyYTc4YzgxOTgyNGRhYjAUBgorBgEEAYO/MAEUBAYMBHB1c2gwXgYKKwYBBAGDvzABFQRQDE5odHRwczovL2dpdGh1Yi5jb20vZGtwa2cvQ29tbW9uc0xhbmdfT0NhbWwvYWN0aW9ucy9ydW5zLzM1NTI3OTU2OTI4L2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwTQYKKwYBBAGDvzABGAQ/DD1yZXBvOmRrcGtnL0NvbW1vbnNMYW5nX09DYW1sOnJlZjpyZWZzL3RhZ3MvMC4xLjIwMjYwOTIwMTQ0MzQ3MIGKBgorBgEEAdZ5AgQCBHwEegB4AHYA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGgwCdgTgAABAMARzBFAiAkad7IivzCkVQhZn4ij/dKMtUdLQsRJBYos3B5RFj4ngIhAN0anD3VWnplhbQnnh+zjzbXkEf6bSDSaW0DWFVkf8YnMAoGCCqGSM49BAMDA2gAMGUCMQD3vnXU49SXYwN+W3TJNQOEvHWC7Gpwl08GY6zUQyfkI5QvaM30EhAPOwNr+ecu78YCMCZTYn+LlRJkXv68Aifzpl+eDSUniVjLW5cgi6VX1t5ySQVWf4sipAlg+Ixt7eQKOg=="},"tlogEntries":[{"logIndex":"2902425149","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"dsse","version":"0.0.1"},"integratedTime":"1789930201","inclusionPromise":{"signedEntryTimestamp":"MEQCID9wGWkL4tTmmOP0WUGLpZ7GkNm/yrchvnWG5Ncw061WAiAroCo5WU8+NYnHO5kmA6a6NJvpqnaE/r7yIpKAU8VgAA=="},"inclusionProof":{"logIndex":"2780520887","rootHash":"x2BTQSt4+BqsCNz48Q/nUDKtVb8X+diVFRmakLhuOC0=","treeSize":"2780520911","hashes":["e47HAPBzl11vfzrSCme3iRIx1NddLhtmUOYHfxQJ35o=","v1DFwi3ROozDOl0dwgpTCweJlP4OypyWEfDa+LtieRc=","IDNCdXCfW/ovvseVdwQyp4KOfjpyGoJDv26jOIm0/+g=","FnNK5UM4YRD4lErAa2ZPOTKHt2pSNhjgx48wM5cbLns=","uTe723lDVNOWU19MS3JgRR3mslxyWTbx0XrCX2W5ML4=","yY3FALo38nlmLkBNuSSzz60NproC+KPq9rUkd3gUx5c=","2g9fji7TNrrWTvMGt57t09+Ry1nDfmW24q3vvY04Ii0=","zm71OIt9beLJ9h/6upMGUpyxpBupJWlGDgOPBOb6o3E=","PnI2d6STSUpsciVs3VH7NpEW8t7iBVaPIIevHGHlMfU=","lhDjYMzedp2RxYBmScsDEtlxuxmtdy7KgwyecAOg3pc=","NHzw2hdxvOoGMsTeU1u997ZhMrU+TK08Ou4Xyz15Tsg=","tXOpGcIJdut1+PYUwhU09yqIExI/sVCDRukM1lZjtuM=","wpaR6ERJhaQBBFEtcUF9PZlw8/pqoS3Z0gDu1wYVLII=","7RcxS0pJxcmGtmMbmh8yAX4q9ikAuy1Yal2AdoW88VQ=","QKbPp61YvxgFORfHJl0dJ7SVftZR6WHgASgOUJ6J2aU=","uoMJ++IgguD5VRdcuqQ23KlKD9ZqrcoC6hqQDy2rPFM=","tyO4Oj1UrXex15tzrEEO6sSnE8y8obZWghZ2XixBPtE=","rjDiNJHGnboMYYUH7OSezbKWj3wMXRTHGCLa/SaZ6O4=","mfWjSdNaEfNXxDww6AAOw/NoK9e6z1yKaZm5xvmMabs=","qxzHanAzz57SDdmJe0B7bJK72NTIBbwEMGBBKvDOROw=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2780520911\nx2BTQSt4+BqsCNz48Q/nUDKtVb8X+diVFRmakLhuOC0=\n\n— rekor.sigstore.dev wNI9ajBFAiB4InmMvUJ55gNYTlY76imGfMcyYV/A/YCYOX2L//LfxQIhAMrdwzzp80lqtXr2zgMvwhRguWSy6jC0AvVA+0vG03D7\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiYzQwNDNiN2UzZDUyZGQ0Mzc5YjUyZjRmZTNiY2UxZDlhMGVlNmZhZjY5ZTVkNjMyY2I0ZDNlMjVhNzAwNmE5MyJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjY1YTVhM2VhOGFmM2Q1OTcwOTdhODlmNjIxYjUwN2ZiOWY1ODBlNjAxY2Y1NWE1Yjc3NWE5NWQzN2Q0NmQzN2YifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVVQ0lRQzErNG5pQlNCblNHd2UvcUFzZEt2VGtFVkVpYnlJMndqRUc2dU52S1loRndJZ0VUYVJaTGxxbXdIMUZ1QngzZ0dsUk5xK1ByVmVML3drUFRTT0hYZnhBcUE9IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VocFZFTkRRbmNyWjBGM1NVSkJaMGxWVkdSRlIzWnFWaThyVWxCamRHdFRlVkJ5YUVkNFZUUktObEpqZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwWmQwOVVTWGROVkdjeFRVUkJlRmRvWTA1TmFsbDNUMVJKZDAxVWEzZE5SRUY0VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVlZWalF3T0dzNE9GRXhVaTkzUWtoWWFYbGhhVTFtTkdaUmNtNVJWRW8zT1hwVFdURUtZbkUwZVZRcmF6UmtiMUY1TVVkVWNYbFFLeTlQVW5GQ2J6bDFWRFZCVVdaVE1HWXZiM2R6VUhGNk56azVNVGhzTlRaUFEwSnBOSGRuWjFseFRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVllha2tyQ2t3MFZrOXhVRzVqTVZWMFJVY3JhSFY0VDJwSVpIQm5kMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMlZuV1VSV1VqQlNRVkZJTDBKSVFYZGliMXB6WVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREpTY21OSGRHNU1NRTUyWWxjeGRncGliazVOV1ZjMWJsZ3dPVVJaVnpGelRIazFibUZZVW05a1YwbDJaREk1ZVdFeVduTmlNMlI2VERKU2NHTXpVbmxoVjBveFpFZFZkRTFETkhoTWJteDBDbUpGUW5sYVYxcDZURE5TYUZvelRYWk5RelI0VEdwSmQwMXFXWGRQVkVsM1RWUlJNRTE2VVROTlJHdEhRMmx6UjBGUlVVSm5OemgzUVZGRlJVc3lhREFLWkVoQ2VrOXBPSFprUnpseVdsYzBkVmxYVGpCaFZ6bDFZM2sxYm1GWVVtOWtWMG94WXpKV2VWa3lPWFZrUjFaMVpFTTFhbUl5TUhkRloxbExTM2RaUWdwQ1FVZEVkbnBCUWtGblVVVmpTRlo2WVVSQk1rSm5iM0pDWjBWRlFWbFBMMDFCUlVSQ1EyZDZXa1JuTVZwWFRtcE9SRWt3V2tkSk1WcFhWbTFPZWtKcUNrNTZWWGRQVjFwdFRYcEthRTU2YUdwUFJFVTFUMFJKTUZwSFJtbE5SRWxIUTJselIwRlJVVUpuTnpoM1FWRlJSVXBETlc1aFdGSnZaRmRKZG1ReU9Ya0tZVEphYzJJelpIcE1NbEp3WXpOU2VXRlhTakZrUjFWMFRVTTBlRXh1YkhSaVJFRnNRbWR2Y2tKblJVVkJXVTh2VFVGRlJrSkNaR3RoTTBKeVduazVSQXBpTWpGMFlqSTFlbFJIUm5WYU1UbFFVVEpHZEdKRVFYRkNaMjl5UW1kRlJVRlpUeTlOUVVWSFFrSjRlVnBYV25wTU0xSm9Xak5OZGsxRE5IaE1ha2wzQ2sxcVdYZFBWRWwzVFZSUk1FMTZVVE5OUkhOSFEybHpSMEZSVVVKbk56aDNRVkZuUlV4UmQzSmhTRkl3WTBoTk5reDVPVEJpTW5Sc1ltazFhRmt6VW5BS1lqSTFla3h0WkhCa1IyZ3hXVzVXZWxwWVNtcGlNalV3V2xjMU1FeHRUblppVkVJNFFtZHZja0puUlVWQldVOHZUVUZGU2tKSE5FMWlSMmd3WkVoQ2VncFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVhMkV6UW5KYWVUbEVZakl4ZEdJeU5YcFVSMFoxV2pFNVVGRXlSblJpUXpoMVdqSnNNR0ZJVm1sTU0yUjJDbU50ZEcxaVJ6a3pZM2s1YTJGWVRqQmpiV3hwWkZoU2JFeFVRWFZOVXpVMVlsZDRRV050Vm0xamVUa3dXVmRrZWt4NlFYVk5VelI1VFVSSk1rMUVhM2tLVFVSRk1FNUVUVEJPZWtFMFFtZHZja0puUlVWQldVOHZUVUZGUzBKRGIwMUxSRTVyVDBSV2JGa3lUVEJOYWxKcldXcFdiRnBYV1ROTlIwMHpUbFJCTlFwYWJWbDZUVzFGTTA5SFRUUk5WR3MwVFdwU2ExbFhTWGRJVVZsTFMzZFpRa0pCUjBSMmVrRkNRM2RSVUVSQk1XNWhXRkp2WkZkSmRHRkhPWHBrUjFackNrMUViMGREYVhOSFFWRlJRbWMzT0hkQlVYZEZURUYzY1dGSVVqQmpTRTAyVEhrNWJtRllVbTlrVjBsMVdUSTVkRXd5VW5KalIzUnVUREJPZG1KWE1YWUtZbTVPVFZsWE5XNVlNRGxFV1ZjeGMwMUVaMGREYVhOSFFWRlJRbWMzT0hkQlVUQkZTMmQzYjAweVVUUk9WMVpxV1hwUmVVNUhVbWxPVjFac1dtcGpkd3BaZW1NeFRVUnNiVnBxVFhsWlZHTTBXWHBuZUU5VVozbE9SMUpvV1dwQmMwSm5iM0pDWjBWRlFWbFBMMDFCUlU5Q1FqUk5TRWhLYkZwdVRYWmtSMFp1Q21ONU9IZE1ha1YxVFdwQmVVNXFRVFZOYWtGNFRrUlJlazVFWTNkSFoxbExTM2RaUWtKQlIwUjJla0ZDUkhkUlRVUkJiM2hOYWtsNVQwUmpNRTFVWXpVS1RVTm5SME5wYzBkQlVWRkNaemM0ZDBGU1FVVkhaM2RaWVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREpTY21OSGRHNU5RbXRIUTJselJ3cEJVVkZDWnpjNGQwRlNSVVZEZDNkS1RXcGpORTlVUlhwT1ZFRjNUVWgzUjBOcGMwZEJVVkZDWnpjNGQwRlNTVVZpWjNoellVaFNNR05JVFRaTWVUbHVDbUZZVW05a1YwbDFXVEk1ZEV3eVVuSmpSM1J1VERCT2RtSlhNWFppYms1TldWYzFibGd3T1VSWlZ6RnpUSGsxYm1GWVVtOWtWMGwyWkRJNWVXRXlXbk1LWWpOa2Vrd3lVbkJqTTFKNVlWZEtNV1JIVlhSTlF6UjRURzVzZEdKRlFubGFWMXA2VEROU2FGb3pUWFpOUXpSNFRHcEpkMDFxV1hkUFZFbDNUVlJSTUFwTmVsRXpUVVJuUjBOcGMwZEJVVkZDWnpjNGQwRlNUVVZMWjNkdlRUSlJORTVYVm1wWmVsRjVUa2RTYVU1WFZteGFhbU4zV1hwak1VMUViRzFhYWsxNUNsbFVZelJaZW1kNFQxUm5lVTVIVW1oWmFrRlZRbWR2Y2tKblJVVkJXVTh2VFVGRlZVSkJXVTFDU0VJeFl6Sm5kMWhuV1V0TGQxbENRa0ZIUkhaNlFVSUtSbEZTVVVSRk5XOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaYVIzUjNZVEpqZGxFeU9YUmlWemwxWXpCNGFHSnRaR1pVTUU1b1lsZDNkZ3BaVjA0d1lWYzVkV041T1hsa1Z6VjZUSHBOTVU1VVNUTlBWRlV5VDFSSk5Fd3lSakJrUjFaMFkwaFNla3g2UlhkR1oxbExTM2RaUWtKQlIwUjJla0ZDQ2tablVVbEVRVnAzWkZkS2MyRlhUWGRVVVZsTFMzZFpRa0pCUjBSMmVrRkNSMEZSTDBSRU1YbGFXRUoyVDIxU2NtTkhkRzVNTUU1MllsY3hkbUp1VGswS1dWYzFibGd3T1VSWlZ6RnpUMjVLYkZwcWNIbGFWMXA2VEROU2FGb3pUWFpOUXpSNFRHcEpkMDFxV1hkUFZFbDNUVlJSTUUxNlVUTk5TVWRMUW1kdmNncENaMFZGUVdSYU5VRm5VVU5DU0hkRlpXZENORUZJV1VFelZEQjNZWE5pU0VWVVNtcEhValJqYlZkak0wRnhTa3RZY21wbFVFc3pMMmcwY0hsblF6aHdDamR2TkVGQlFVZG5kME5rWjFSblFVRkNRVTFCVW5wQ1JrRnBRV3RoWkRkSmFYWjZRMnRXVVdoYWJqUnBhaTlrUzAxMFZXUk1VWE5TU2tKWmIzTXpRalVLVWtacU5HNW5TV2hCVGpCaGJrUXpWbGR1Y0d4b1lsRnVibWdyZW1wNllsaHJSV1kyWWxORVUyRlhNRVJYUmxaclpqaFpiazFCYjBkRFEzRkhVMDAwT1FwQ1FVMUVRVEpuUVUxSFZVTk5VVVF6ZG01WVZUUTVVMWhaZDA0clZ6TlVTazVSVDBWMlNGZEROMGR3ZDJ3d09FZFpObnBWVVhsbWEwazFVWFpoVFRNd0NrVm9RVkJQZDA1eUsyVmpkVGM0V1VOTlExcFVXVzRyVEd4U1NtdFlkalk0UVdsbWVuQnNLMlZFVTFWdWFWWnFURmMxWTJkcE5sWllNWFExZVZOUlZsY0taalJ6YVhCQmJHY3JTWGgwTjJWUlMwOW5QVDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In1dfX0="}],"timestampVerificationData":{}},"dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjEiLCJzdWJqZWN0IjpbeyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX2FybTY0LmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiMjYyYTQzOGFmYTgxNGNlYjU0NjM5ZTBhMjFkMDllMDhhMjdiN2JiNTkzNzU2Njg5OWExNzIyNTM5NDM4Nzc5YyJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1EYXJ3aW5fYXJtNjQuZGlzdG1ldGEubWFuaWZlc3QuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6Ijc2NTY3Yjc2NTcwOWUxODA5NGZlYTFmNDk4MDBiNTY2ZmQyZWEyOWE5NmE5YTRlNTgyZDUxMmM5OGQ5OGVjMTAifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX2FybTY0LmRpc3RtZXRhLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiNGJjYmQyMzY1Y2MzYWI0MWNlNGJhMTcwYThhMTIwZGEzNTRmNjJkNmYwMmQ2OGI0ZTdjYWUwOWZmZWJmM2I0YSJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1EYXJ3aW5fYXJtNjQuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiNTBlYzhlNTQ0ODRmNTlkMDM3N2ZjOTZiMjIxMTI5MjY3ZWIxZTcyMDZlZThmMzM3MGUxZTdhMGJjYmQ2ZDY1MyJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1EYXJ3aW5fYXJtNjQucGFja2FnZS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImMzNzhkNjgxMTg0MWY2Y2RjMWE3Yjg5M2VjMWRhZGM2N2Y3MzU1NmEyNjNjMDZhZmI0NDZhNDIxYTNkNjgxNDkifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX2FybTY0LnBhY2thZ2UudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiIyNDFkZmIwOGE3Y2IwODQ2ZDA4ZDQxNzcwMzFlYjRiY2IxODY5MDkxM2E5ZWVjOGU5YjAxYmU0YzI2NTE3ZGVhIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLURhcndpbl9hcm02NC5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImVmY2U3YmJiNTkxYTlhZTA1NjNlMTNkMzA4MTgyYjkyZDQ0ZGE4NmI3OTU1NTE3MjhmOTE2YzZlNWRkMWIzM2MifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX2FybTY0LnZhbHVlcy5qc29uIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImNlZTAzODJjYWNlZWZhYTJmZGNjN2U5Yjk3OWMzOWFlYjU2ZTdhNTY3MDU3YTIzMDU3MzFjOTU2ZjM5NDAzY2IifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX3g4Nl82NC1EYXJ3aW5feDg2XzY0LmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiNDAyYTkzZTIwOGVjNTU3ZmYxMTJkZjE4YzY4YzU0NzRhODNhMjg4ZjM4NjMzZmMxODY4MTEzZWI0MTBiNDhhMCJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1EYXJ3aW5feDg2XzY0LURhcndpbl94ODZfNjQuZGlzdG1ldGEubWFuaWZlc3QuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImVjOGRkNjhkMDA1MTQ3ZWQ3NzUxNjBiNjFlMGY4NWQ4YWVhMWRkZGY5ZjkzOTI5NDhlM2U1NDllOTFjOTY1NDUifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX3g4Nl82NC1EYXJ3aW5feDg2XzY0LmRpc3RtZXRhLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiNjE0MTcxZDk1ZTJhOTlhY2JmYzBjNDkyZDFhOWQ5NTNlZjE0ODY2Njk4OGQ3ZWU4M2Y3N2Y2MjM0NDMyNTQyYiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1EYXJ3aW5feDg2XzY0LURhcndpbl94ODZfNjQuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiMDYwNTkxNTE1Y2I4MWNhZjFlZTFiYWVlNTcwYjZhZDM3NTMzOTJkY2Y1NTk0ZGU3ZDExMDljYzQyYzdiNmVjNiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1EYXJ3aW5feDg2XzY0LURhcndpbl94ODZfNjQucGFja2FnZS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjIzODY4ZWIwY2EyMTYxZDZhMDBlOTY5YTBlNjIyZTcyNDFmOTFlNDQxOGVkOGNmMGYyNjIxNDYyMjcwNTIxZGMifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX3g4Nl82NC1EYXJ3aW5feDg2XzY0LnBhY2thZ2UudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiJhZDJkMzU4NjBkNWFhYmU4MDBkNDYwNTkwYjQ1MjkwZDNhNjYyMDhmNTIwMmNiMjFmN2M0MjI1MDBjMjdlNWU0In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLURhcndpbl94ODZfNjQtRGFyd2luX3g4Nl82NC5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjA3MzRhYTBjYmU3Njc4YTdhMTA2ZWQ0YTljOTMyYzNkMDE3YzNmMzVkOGFhZmU1ZmU0MzRlODA2M2E0M2Q5MTgifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtRGFyd2luX3g4Nl82NC1EYXJ3aW5feDg2XzY0LnZhbHVlcy5qc29uIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImFlYmUyNmM0YTIzOTQ2MDAwOTQyYzNhMjY2NmU3NjlmMDZjYmZiNTczY2NlODY2NTA1YmEzYjY3OGM1NjlhMmUifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2LUxpbnV4X3g4Ni5kaXN0bWV0YS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjQwMmE5M2UyMDhlYzU1N2ZmMTEyZGYxOGM2OGM1NDc0YTgzYTI4OGYzODYzM2ZjMTg2ODExM2ViNDEwYjQ4YTAifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2LUxpbnV4X3g4Ni5kaXN0bWV0YS5tYW5pZmVzdC56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiZjI0YjY4Y2JjZGY0NTIzMDdiZmIxNzU2OTk5NDVkMzE1N2ZkM2U5NDg3ZDBkNGRhNDM0ZGIyMWFmNjE3MmJjNSJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODYtTGludXhfeDg2LmRpc3RtZXRhLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiNjE0MTcxZDk1ZTJhOTlhY2JmYzBjNDkyZDFhOWQ5NTNlZjE0ODY2Njk4OGQ3ZWU4M2Y3N2Y2MjM0NDMyNTQyYiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODYtTGludXhfeDg2LmRpc3RtZXRhLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjA2MDU5MTUxNWNiODFjYWYxZWUxYmFlZTU3MGI2YWQzNzUzMzkyZGNmNTU5NGRlN2QxMTA5Y2M0MmM3YjZlYzYifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2LUxpbnV4X3g4Ni5wYWNrYWdlLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiNjFlYjNkNGM0NWU0NjBhNzU4NmQxMzMyYTRhNzE0MDZhNWQ2MDg0MmFjM2E1MWZkNjk3NzQxYTVkMTQ4YWU0NCJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODYtTGludXhfeDg2LnBhY2thZ2UudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiIyM2VlOTdhMjQ3OTY5YTM4NmJiZWRmNDU5MTIzM2M1MWQ5OTE2Y2Q1MTRmYTNmMzI4N2MwMzIyMTU5ZmI3Yzk2In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLUxpbnV4X3g4Ni1MaW51eF94ODYucGFja2FnZS52YWx1ZXN0b3JlLnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiJmZDkxODNkMDZhYmQ5OTc0MDIxNmYzM2M2Njk1ZDkzNjI1YjAyMmRkNzY2NDVmODYxOGRhZjgwNDdmODMxM2Y1In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLUxpbnV4X3g4Ni1MaW51eF94ODYudmFsdWVzLmpzb24iLCJkaWdlc3QiOnsic2hhMjU2IjoiNmZhNzgxNGY5NThiNzk2YTllZGZiMGM5OTExNjNlOTBkNWJlYzVhNzU4OGVlYWVmMzY4NWIzM2RmNTRkMzIxOSJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjQtTGludXhfeDg2XzY0LmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiYjI1NGI4NzNkZjQwYjhmYmIxNTIwNGY1MTczOTUzMzE4NDBlOTFhYzQzYWViM2U1ODUwN2ExNGVmYmUyMGRkOCJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjQtTGludXhfeDg2XzY0LmRpc3RtZXRhLm1hbmlmZXN0LnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiIxOGZmMTU2ZmI2NzRmMWUyMmY2ZWM1MGE3ZjlkZWZhZjEyMzAxZWJkZWZjMGYzODk3OGU1NjE2Mzk2OWI5ODY0In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLUxpbnV4X3g4Nl82NC1MaW51eF94ODZfNjQuZGlzdG1ldGEudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI3Y2I0NzdiZjhlZjY0NDVmMWYyYzZjYmFjYWYwNWE5NWY3ZTEwM2EwYjQyM2Q2ZTdlODg2OWFkNzY1NDRlYzg2In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLUxpbnV4X3g4Nl82NC1MaW51eF94ODZfNjQuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiOTczNmZhYjQxZjU4YmNlZDQ1ZmJjNGEwODY3MzYwOTFlZDcxYzNmOTZhOWY2NmRlNDUyOTMxYWQ0ZjkzMTQ0NSJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjQtTGludXhfeDg2XzY0LnBhY2thZ2UuY3RzLjEudHJhY2VzdG9yZSIsImRpZ2VzdCI6eyJzaGEyNTYiOiIwOTFlNTllNTdkMjUyMGVlOTVmNDRiMDNhMDFlNzYwNjA2NjBjNjU2NGM5Njg5MDM1YmU2NDhjOTZjODYxYTUyIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLUxpbnV4X3g4Nl82NC1MaW51eF94ODZfNjQucGFja2FnZS52YWx1ZXN0b3JlLmluZGV4IiwiZGlnZXN0Ijp7InNoYTI1NiI6ImM5Yjk2MjVmM2YyMDM0ZGFlOTMzMWI4YWQ4YTI5ZTVlZWQ5MDgyZDk2YmE4ZjhkYTgxOTIxYzkxZjA0MTVlM2EifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2XzY0LUxpbnV4X3g4Nl82NC5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjQ2Y2Q3ZGIyMzAyNzZjYjQyNTM1MzA4MDIyODkyNDMzMTY3MWNkMzFiNmU2ZjJlNGI0ZjBjMmVlODM5Yjg5MWMifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2XzY0LUxpbnV4X3g4Nl82NC52YWx1ZXMuanNvbiIsImRpZ2VzdCI6eyJzaGEyNTYiOiIzNjhhOGI2YWNiMjk3NjBjYjU4ODFhMjBiMGQzZGQ2NWE3YzAwMzc3NzNjMGM4NDljMzQ4ZTMwMWM4OWUzYzMxIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLUxpbnV4X3g4Nl82NF9tdXNsLUxpbnV4X3g4Nl82NF9tdXNsLmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiNDAyYTkzZTIwOGVjNTU3ZmYxMTJkZjE4YzY4YzU0NzRhODNhMjg4ZjM4NjMzZmMxODY4MTEzZWI0MTBiNDhhMCJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjRfbXVzbC1MaW51eF94ODZfNjRfbXVzbC5kaXN0bWV0YS5tYW5pZmVzdC56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiYTMxNDgxOGJiYmMxYWNhN2E5YjQwY2FiMjY4NTRmNjhkNTJiMzczNzRkZTM2M2FiZTVhYzlkODNjNzBhOWNkOSJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjRfbXVzbC1MaW51eF94ODZfNjRfbXVzbC5kaXN0bWV0YS52YWx1ZXN0b3JlLmluZGV4IiwiZGlnZXN0Ijp7InNoYTI1NiI6IjYxNDE3MWQ5NWUyYTk5YWNiZmMwYzQ5MmQxYTlkOTUzZWYxNDg2NjY5ODhkN2VlODNmNzdmNjIzNDQzMjU0MmIifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2XzY0X211c2wtTGludXhfeDg2XzY0X211c2wuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiMDYwNTkxNTE1Y2I4MWNhZjFlZTFiYWVlNTcwYjZhZDM3NTMzOTJkY2Y1NTk0ZGU3ZDExMDljYzQyYzdiNmVjNiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjRfbXVzbC1MaW51eF94ODZfNjRfbXVzbC5wYWNrYWdlLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiYzU2OWIwZDQ4NDMxYTY1YzYzN2VlODA5MGU2MmNlNjA0NDEyZTYyZjRmYTdmZWRlNGExOWQ0YWI1Yjc4MmQxYyJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjRfbXVzbC1MaW51eF94ODZfNjRfbXVzbC5wYWNrYWdlLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiZjM2ODdmNzgzOWYyN2QyNzk2YzQzMTdkZmY4MjI3OTBmZDE5OTQ3Y2NhNTlmZTgxMDE5MGNlYmYwN2NlMTY2MyJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1MaW51eF94ODZfNjRfbXVzbC1MaW51eF94ODZfNjRfbXVzbC5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImM1Y2VlZTdkMGZkNDJkNTA4MzBiZWExNWZmYjJkZGE4ZDI1ZjZmNDcxMzY1MjFjOTUxZmIyYzg3ZDQ5YjUzZGQifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtTGludXhfeDg2XzY0X211c2wtTGludXhfeDg2XzY0X211c2wudmFsdWVzLmpzb24iLCJkaWdlc3QiOnsic2hhMjU2IjoiZTE4MmM0ZjY0ZjliNjkyYWUwMzNiYzEzYzJmZWI1MDA2MzRiOWU4NDZiYzU5NjQyMTYzMWEwMDYwNDdlYzkyZiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1XaW5kb3dzX3g4Ni1XaW5kb3dzX3g4Ni5kaXN0bWV0YS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjZkZjRiNTBlODc0Mjk1MzU4MzgyMWQzMjljNjNhYTI0Y2M0NWMzNDgwN2Q4MGY0NGNhODk2NDZlMjUwNDRhY2YifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtV2luZG93c194ODYtV2luZG93c194ODYuZGlzdG1ldGEubWFuaWZlc3QuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjczYmZiOThhMjgxYTJjMzU3NjZjMmQ2Njc2NzgzZDk3M2I3MGJkZTUyMzNiNjY1YTc5YjhjMmUyMTUwMDk0Y2QifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtV2luZG93c194ODYtV2luZG93c194ODYuZGlzdG1ldGEudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2MTQxNzFkOTVlMmE5OWFjYmZjMGM0OTJkMWE5ZDk1M2VmMTQ4NjY2OTg4ZDdlZTgzZjc3ZjYyMzQ0MzI1NDJiIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2LVdpbmRvd3NfeDg2LmRpc3RtZXRhLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjA2MDU5MTUxNWNiODFjYWYxZWUxYmFlZTU3MGI2YWQzNzUzMzkyZGNmNTU5NGRlN2QxMTA5Y2M0MmM3YjZlYzYifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtV2luZG93c194ODYtV2luZG93c194ODYucGFja2FnZS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjFiYTQwMTdlNzdkOGNiOTA0MWU4YTgzMDM2OGIyNWQ2Zjk1YzhjYzE5Nzc0YjEyYzljYjJhMDUwZDU4ZWY2NDUifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtV2luZG93c194ODYtV2luZG93c194ODYucGFja2FnZS52YWx1ZXN0b3JlLmluZGV4IiwiZGlnZXN0Ijp7InNoYTI1NiI6IjMyNDc1MGIwNmNhMTFmZjIyYmM0N2E1YzBlNGViYmM0YjlmNGU4NWUzNzMyZTE0Zjg4NjNjMzEyZTcxY2ExMDEifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtV2luZG93c194ODYtV2luZG93c194ODYucGFja2FnZS52YWx1ZXN0b3JlLnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiIxMjBhNWVkMzk2MmJkNDA4Y2I5MTM4ODg4ODJlZDdiMjA1N2IxMmJiY2NmYTUyN2RiZjMzNjUwZTY2ZjNhMWRjIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2LVdpbmRvd3NfeDg2LnZhbHVlcy5qc29uIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImY3M2EyZjdkOTFhNjViYWExNjg5MmNhZWM3N2E4YmNiYzM3ZTBiZTJmZGE3MzQ4N2JlNjdhODQzZTFhYzU4ZDUifX0seyJuYW1lIjoiQ29tbW9uc0xhbmdfT0NhbWwtV2luZG93c194ODZfNjQuZGlzdG1ldGEuY3RzLjEudHJhY2VzdG9yZSIsImRpZ2VzdCI6eyJzaGEyNTYiOiJiMjU0Yjg3M2RmNDBiOGZiYjE1MjA0ZjUxNzM5NTMzMTg0MGU5MWFjNDNhZWIzZTU4NTA3YTE0ZWZiZTIwZGQ4In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2XzY0LmRpc3RtZXRhLm1hbmlmZXN0LnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiJkOWJlMjYzNmMyOGIxOTIyYTE3OTAzMjI3ZmVlMmM1ZjFjZGU2MDJiZDMzYTFhMjExYWNjZTc5ZjhlZjJhNjJjIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2XzY0LmRpc3RtZXRhLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiN2NiNDc3YmY4ZWY2NDQ1ZjFmMmM2Y2JhY2FmMDVhOTVmN2UxMDNhMGI0MjNkNmU3ZTg4NjlhZDc2NTQ0ZWM4NiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1XaW5kb3dzX3g4Nl82NC5kaXN0bWV0YS52YWx1ZXN0b3JlLnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI5NzM2ZmFiNDFmNThiY2VkNDVmYmM0YTA4NjczNjA5MWVkNzFjM2Y5NmE5ZjY2ZGU0NTI5MzFhZDRmOTMxNDQ1In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2XzY0LnBhY2thZ2UuY3RzLjEudHJhY2VzdG9yZSIsImRpZ2VzdCI6eyJzaGEyNTYiOiJhNDZlY2RiYzQ4NDQ0NDU2ZTlkYjA4MzU1NGM0ZTEzNzVkODMyZTJhZGU0ODQ3NGM2ZTBhNTNlNmQzNGRjMjRhIn19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2XzY0LnBhY2thZ2UudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2YWI1Zjc1Yjc1MDg3Y2U2ODNiYmEwOTI3MWFhNzY5MWNhNWIyZTgwMmQ0ODVhOTZhYmIyYjhkMWM2OWVhOTY3In19LHsibmFtZSI6IkNvbW1vbnNMYW5nX09DYW1sLVdpbmRvd3NfeDg2XzY0LnBhY2thZ2UudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiZWNjM2Y0NjE4ZjE0MzUyODEzNThiZmMzMDM0M2YzN2NhNWJkNTIyMzJlNzA3NGY4MzlkOGMwZmNlMWEyNmIwZiJ9fSx7Im5hbWUiOiJDb21tb25zTGFuZ19PQ2FtbC1XaW5kb3dzX3g4Nl82NC52YWx1ZXMuanNvbiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJkMDk0MGUyMzEyNDU0YzYxZjBkN2Q2OTVlZDkyYjIxNDFmYzFkYzEyYzVmNWNjOTRlNmFkZmViYjQ3MTEzZmU1In19LHsibmFtZSI6InZhbHVlcy5qc29uIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjczMmFhMGFlMDVhZDYzOWI3OWRkNWViZWVmMDY2MTc4OGE5MTEwZGMwZDdiZjllNDAyNWE5ODdkMjIwOGYzOTEifX1dLCJwcmVkaWNhdGVUeXBlIjoiaHR0cHM6Ly9zbHNhLmRldi9wcm92ZW5hbmNlL3YxIiwicHJlZGljYXRlIjp7ImJ1aWxkRGVmaW5pdGlvbiI6eyJidWlsZFR5cGUiOiJodHRwczovL2FjdGlvbnMuZ2l0aHViLmlvL2J1aWxkdHlwZXMvd29ya2Zsb3cvdjEiLCJleHRlcm5hbFBhcmFtZXRlcnMiOnsid29ya2Zsb3ciOnsicmVmIjoicmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NyIsInJlcG9zaXRvcnkiOiJodHRwczovL2dpdGh1Yi5jb20vZGtwa2cvQ29tbW9uc0xhbmdfT0NhbWwiLCJwYXRoIjoiLmdpdGh1Yi93b3JrZmxvd3MvZGlzdHJpYnV0ZS0wLjEueW1sIn19LCJpbnRlcm5hbFBhcmFtZXRlcnMiOnsiZ2l0aHViIjp7ImV2ZW50X25hbWUiOiJwdXNoIiwicmVwb3NpdG9yeV9pZCI6IjEyMjI4NzQxNzkiLCJyZXBvc2l0b3J5X293bmVyX2lkIjoiMjc4OTEzNTAwIiwicnVubmVyX2Vudmlyb25tZW50IjoiZ2l0aHViLWhvc3RlZCJ9fSwicmVzb2x2ZWREZXBlbmRlbmNpZXMiOlt7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vZGtwa2cvQ29tbW9uc0xhbmdfT0NhbWxAcmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NyIsImRpZ2VzdCI6eyJnaXRDb21taXQiOiIzZDg1ZWNjNDI0ZGI1ZWVmNzBjNzUwOWZmMzJhNzhjODE5ODI0ZGFiIn19XX0sInJ1bkRldGFpbHMiOnsiYnVpbGRlciI6eyJpZCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zTGFuZ19PQ2FtbC8uZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTAuMS55bWxAcmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NyJ9LCJtZXRhZGF0YSI6eyJpbnZvY2F0aW9uSWQiOiJodHRwczovL2dpdGh1Yi5jb20vZGtwa2cvQ29tbW9uc0xhbmdfT0NhbWwvYWN0aW9ucy9ydW5zLzM1NTI3OTU2OTI4L2F0dGVtcHRzLzEifX19fQ==","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MEUCIQC1+4niBSBnSGwe/qAsdKvTkEVEibyI2wjEG6uNvKYhFwIgETaRZLlqmwH1FuBx3gGlRNq+PrVeL/wkPTSOHXfxAqA="}]}}
579
+ ] },
580
+ "github_slsa_v1_l3": {},
581
+ "openbsd_signify": {}
582
+ },
583
+ "build_to_sign": {
584
+ "bundle_canonical": "e642f7f8d391d3051b99aee6cf7d803e213bcc41b861965a1d993bbcd9dff79b",
585
+ "bundle_modver": "CommonsLang_OCaml.Distribution@0.1.20260920144347",
586
+ "modules": [
587
+ "CommonsLang_OCaml.Base@5.5.0",
588
+ "CommonsLang_OCaml.Distribution@0.1.20260916151007",
589
+ "CommonsLang_OCaml.Distribution@0.1.20260916234322",
590
+ "CommonsLang_OCaml.Distribution@0.1.20260920144347",
591
+ "CommonsLang_OCaml.DkML@4.14.3001",
592
+ "CommonsLang_OCaml.Dune@3.23.2",
593
+ "CommonsLang_OCaml.MSYS2@2026.6.11",
594
+ "CommonsLang_OCaml.Opam@2.5.2",
595
+ "CommonsLang_OCaml.Apparatus.DkMLCleanupSlot@1.0.1",
596
+ "CommonsLang_OCaml.Apparatus.DkMLDetectVsEnvBat@1.0.1",
597
+ "CommonsLang_OCaml.Apparatus.DkMLGlibcEnv@1.0.1",
598
+ "CommonsLang_OCaml.Apparatus.DkMLMuslBuildHost@1.0.1",
599
+ "CommonsLang_OCaml.Apparatus.DkMLMuslEnv@1.0.13",
600
+ "CommonsLang_OCaml.Apparatus.DkMLMuslWrap@1.0.1",
601
+ "CommonsLang_OCaml.Apparatus.DkMLPatchRelocatableVersion@1.0.1",
602
+ "CommonsLang_OCaml.Apparatus.DkMLPatchStandardCompilerEnvWv18@1.0.1",
603
+ "CommonsLang_OCaml.Apparatus.DkMLPieCheck@1.0.1",
604
+ "CommonsLang_OCaml.Apparatus.DkMLRoot@1.0.1",
605
+ "CommonsLang_OCaml.Apparatus.DkMLRunBuildHost@1.0.1",
606
+ "CommonsLang_OCaml.Apparatus.DkMLX86BuildHost@1.0.1",
607
+ "CommonsLang_OCaml.Apparatus.DkMLX86Env@1.0.13",
608
+ "CommonsLang_OCaml.Apparatus.DkMLX86Wrap@1.0.1",
609
+ "CommonsLang_OCaml.Apparatus.DuneBootstrapMsvc@1.0.1",
610
+ "CommonsLang_OCaml.Apparatus.OpamBuildSeqMeta@1.0.1",
611
+ "CommonsLang_OCaml.Apparatus.OpamBuildWin@1.0.1",
612
+ "CommonsLang_OCaml.Apparatus.OpamBuildWinVcvars@1.0.1",
613
+ "CommonsLang_OCaml.Apparatus.OpamBuildWrapper@1.0.12",
614
+ "CommonsLang_OCaml.Apparatus.OpamFileFormat@1.0.1",
615
+ "CommonsLang_OCaml.Apparatus.OpamLockHelper@1.0.19",
616
+ "CommonsLang_OCaml.Apparatus.OpamMccsGlpkStub@1.0.1",
617
+ "CommonsLang_OCaml.Apparatus.OpamMsvsDetectStub@1.0.1",
618
+ "CommonsLang_OCaml.Apparatus.Patches@1.0.1",
619
+ "CommonsLang_OCaml.Apparatus.Scripts@1.0.1",
620
+ "CommonsLang_OCaml.Apparatus.Tables@1.0.1",
621
+ "CommonsLang_OCaml.Apparatus.WineHostShim@1.0.1",
622
+ "CommonsLang_OCaml.Base.Bundle@5.5.0",
623
+ "CommonsLang_OCaml.Base.Unix@5.5.0",
624
+ "CommonsLang_OCaml.Base.Win32@5.5.0",
625
+ "CommonsLang_OCaml.Dk.OpamBuild.Export@1.0.0",
626
+ "CommonsLang_OCaml.Dk.OpamBuild.Export@1.0.29",
627
+ "CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedClosure@1.0.29",
628
+ "CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedPackage@1.0.29",
629
+ "CommonsLang_OCaml.Dk.OpamLock.Adopt@1.1.22",
630
+ "CommonsLang_OCaml.Dk.OpamLock.Export@1.1.22",
631
+ "CommonsLang_OCaml.Dk.OpamLock.GenerateDriver@1.1.22",
632
+ "CommonsLang_OCaml.Dk.OpamLock.GenerateFinal@1.1.22",
633
+ "CommonsLang_OCaml.Dk.OpamLock.GenerateForms@1.1.22",
634
+ "CommonsLang_OCaml.Dk.OpamLock.GenerateSrc@1.1.22",
635
+ "CommonsLang_OCaml.Dk.OpamLock.OpamVenv@1.1.22",
636
+ "CommonsLang_OCaml.Dk.OpamLock.Refresh@1.1.22",
637
+ "CommonsLang_OCaml.Dk.OpamLock.Solve@1.1.22",
638
+ "CommonsLang_OCaml.DkML.Bundle@4.14.3001",
639
+ "CommonsLang_OCaml.DkML.FlexdllSourceTree@0.43.0",
640
+ "CommonsLang_OCaml.DkML.OCamlSourceTree@4.14.3001",
641
+ "CommonsLang_OCaml.DkML.Unix@4.14.3001",
642
+ "CommonsLang_OCaml.DkML.Win32@4.14.3001",
643
+ "CommonsLang_OCaml.DkML.RuntimeCommon.Bundle@2.4.2-26",
644
+ "CommonsLang_OCaml.Dune.Bundle@3.23.1",
645
+ "CommonsLang_OCaml.Dune.Unix@3.23.2",
646
+ "CommonsLang_OCaml.Dune.Win32@3.23.2",
647
+ "CommonsLang_OCaml.MSYS2.Bundle@2026.6.11",
648
+ "CommonsLang_OCaml.MSYS2.Zip.Base@2026.6.11",
649
+ "CommonsLang_OCaml.MSYS2.Zip.Diffutils@2026.6.11",
650
+ "CommonsLang_OCaml.MSYS2.Zip.Dos2unix@2026.6.11",
651
+ "CommonsLang_OCaml.MSYS2.Zip.Libxxhash@2026.6.11",
652
+ "CommonsLang_OCaml.MSYS2.Zip.Patch@2026.6.11",
653
+ "CommonsLang_OCaml.MSYS2.Zip.Popt@2026.6.11",
654
+ "CommonsLang_OCaml.MSYS2.Zip.Rsync@2026.6.11",
655
+ "CommonsLang_OCaml.MSYS2.Zip.Unzip@2026.6.11",
656
+ "CommonsLang_OCaml.MuslCC.Bundle@11.2.1",
657
+ "CommonsLang_OCaml.Opam.Bundle@2.5.1",
658
+ "CommonsLang_OCaml.Opam.Unix@2.5.2",
659
+ "CommonsLang_OCaml.Opam.Menhir.Bundle@2025.9.3",
660
+ "CommonsLang_OCaml.Opam.Win32.X64@2.5.2",
661
+ "CommonsLang_OCaml.Opam.Win32.X86@2.5.2"
662
+ ],
663
+ "producer_accepts": [],
664
+ "distmeta": {
665
+ "traces": [
666
+ {
667
+ "tag": "cts.1",
668
+ "path": "CommonsLang_OCaml-Darwin_arm64.distmeta.cts.1.tracestore"
669
+ },
670
+ {
671
+ "tag": "cts.1",
672
+ "path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.distmeta.cts.1.tracestore"
673
+ },
674
+ {
675
+ "tag": "cts.1",
676
+ "path": "CommonsLang_OCaml-Linux_x86-Linux_x86.distmeta.cts.1.tracestore"
677
+ },
678
+ {
679
+ "tag": "cts.1",
680
+ "path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.distmeta.cts.1.tracestore"
681
+ },
682
+ {
683
+ "tag": "cts.1",
684
+ "path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.distmeta.cts.1.tracestore"
685
+ },
686
+ {
687
+ "tag": "cts.1",
688
+ "path": "CommonsLang_OCaml-Windows_x86-Windows_x86.distmeta.cts.1.tracestore"
689
+ },
690
+ {
691
+ "tag": "cts.1",
692
+ "path": "CommonsLang_OCaml-Windows_x86_64.distmeta.cts.1.tracestore"
693
+ }
694
+ ],
695
+ "values": [
696
+ {
697
+ "path": "CommonsLang_OCaml-Darwin_arm64.distmeta.valuestore.zip"
698
+ },
699
+ {
700
+ "path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.distmeta.valuestore.zip"
701
+ },
702
+ {
703
+ "path": "CommonsLang_OCaml-Linux_x86-Linux_x86.distmeta.valuestore.zip"
704
+ },
705
+ {
706
+ "path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.distmeta.valuestore.zip"
707
+ },
708
+ {
709
+ "path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.distmeta.valuestore.zip"
710
+ },
711
+ {
712
+ "path": "CommonsLang_OCaml-Windows_x86-Windows_x86.distmeta.valuestore.zip"
713
+ },
714
+ {
715
+ "path": "CommonsLang_OCaml-Windows_x86_64.distmeta.valuestore.zip"
716
+ }
717
+ ]
718
+ },
719
+ "package": {
720
+ "traces": [
721
+ {
722
+ "tag": "cts.1",
723
+ "path": "CommonsLang_OCaml-Darwin_arm64.package.cts.1.tracestore"
724
+ },
725
+ {
726
+ "tag": "cts.1",
727
+ "path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.package.cts.1.tracestore"
728
+ },
729
+ {
730
+ "tag": "cts.1",
731
+ "path": "CommonsLang_OCaml-Linux_x86-Linux_x86.package.cts.1.tracestore"
732
+ },
733
+ {
734
+ "tag": "cts.1",
735
+ "path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.package.cts.1.tracestore"
736
+ },
737
+ {
738
+ "tag": "cts.1",
739
+ "path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.package.cts.1.tracestore"
740
+ },
741
+ {
742
+ "tag": "cts.1",
743
+ "path": "CommonsLang_OCaml-Windows_x86-Windows_x86.package.cts.1.tracestore"
744
+ },
745
+ {
746
+ "tag": "cts.1",
747
+ "path": "CommonsLang_OCaml-Windows_x86_64.package.cts.1.tracestore"
748
+ }
749
+ ],
750
+ "values": [
751
+ {
752
+ "path": "CommonsLang_OCaml-Darwin_arm64.package.valuestore.zip"
753
+ },
754
+ {
755
+ "path": "CommonsLang_OCaml-Darwin_x86_64-Darwin_x86_64.package.valuestore.zip"
756
+ },
757
+ {
758
+ "path": "CommonsLang_OCaml-Linux_x86-Linux_x86.package.valuestore.zip"
759
+ },
760
+ {
761
+ "path": "CommonsLang_OCaml-Linux_x86_64-Linux_x86_64.package.valuestore.zip"
762
+ },
763
+ {
764
+ "path": "CommonsLang_OCaml-Linux_x86_64_musl-Linux_x86_64_musl.package.valuestore.zip"
765
+ },
766
+ {
767
+ "path": "CommonsLang_OCaml-Windows_x86-Windows_x86.package.valuestore.zip"
768
+ },
769
+ {
770
+ "path": "CommonsLang_OCaml-Windows_x86_64.package.valuestore.zip"
771
+ }
772
+ ]
773
+ },
774
+ "script_module_sha256s": [
775
+ "2c008b1284de7c17ccda33e6fff84766276b5f412ee1ba66f6b4ec1ed1e375ff",
776
+ "c30e27473d1542c87d82b67f81d15a62f0d42189a4e4230f79398e87bbc66d1d"
777
+ ]
778
+ }
779
+ },
780
+ "continuations": {
781
+ "attestation": {
782
+ "openbsd_signify": {
783
+ "signature": "untrusted comment: signed by key 2b19619c380dd657\nRWQrGWGcOA3WV/SC5szyffbUIzdMAOjD33Y9fQe9ngEw7QoRVn5420I7hpPpiOR1WF4pLrxV5L0AHe3zRd7zAHSOjc/0d8TwsAU=\n"
784
+ }
785
+ },
786
+ "continuations_to_sign": {
787
+ "0.2": {
788
+ "application": { "name": "dk0", "version": "2.4.2+rev-253" },
789
+ "openbsd_signify": {
790
+ "public_key": "untrusted comment: CommonsLang_OCaml-0.2\nRWRnKsyKvFT87Z/voU2a8RFDBjdtzKzfcFgCn+eTXCTheCs3Nd2BGz0H\n"
791
+ }
792
+ },
793
+ "1.0": {
794
+ "application": { "name": "dk0", "version": "2.4.2+rev-253" },
795
+ "openbsd_signify": {
796
+ "public_key": "untrusted comment: CommonsLang_OCaml-1.0\nRWRLh0MTaL/vE2fN07NUPRSEHBMs2FZpBBSCi++qsCUY3vHSttJWh66e\n"
797
+ }
798
+ }
799
+ }
800
+ },
801
+ "id": "CommonsLang_OCaml@0.1.20260920144347",
802
+ "license": { "spdx": "Apache-2.0" },
803
+ "producer": {
804
+ "application": { "name": "dk0", "version": "2.4.3+rev-22" },
805
+ "github_slsa_v1_l2": { "repository": "dkpkg/CommonsLang_OCaml" },
806
+ "openbsd_signify": {
807
+ "public_key": "untrusted comment: CommonsLang_OCaml-0.1\nRWQrGWGcOA3WV93QbuXdm8aAWjDkYvCM5jgFAanfDRiW9n3PzSvLESmR\n"
808
+ }
809
+ },
810
+ "min_dk_version": "2.4.2.213"
811
+ }
812
+ ],
813
+ "forms": [],
814
+ "schema_version": { "major": 1, "minor": 0 }
815
+ }
etc/dk/i/dk-closure-manifest.tsv ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # dk closure manifest v1: library version values_file_sha256 source
2
+ CommonsBase_Build 0.1.20260913085659 12b5a47d353d5abe52580ec47ff3c309107aee4594e6d52544a76b447216ed65 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
3
+ CommonsBase_Build 0.1.20260916234322 4843aa52a49cc9c02574562407e196893c8f786a62674574de028b86b6fac751 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
4
+ CommonsBase_Build 0.1.20260920144347 eb05f811a4e114f46ab25b978a3728467d00149023b83cc6267021ffc5ac67af etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
5
+ CommonsBase_FileMagic 0.1.20260913085659 ac662bb7e78faddf667b007df133157d9f588fb635e5edbfdccc830a8823abdb etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
6
+ CommonsBase_FileMagic 0.1.20260916234322 bdd8c70111bffdd6666e7dc2ff74bd92ce62faa64b2542fe217f321094a1c668 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
7
+ CommonsBase_FileMagic 0.1.20260920144347 9795f60a23f3135597b06cf41d13983757f1488f71dc301e0a90f85834a340d7 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
8
+ CommonsBase_GNU 0.1.20260913085659 9500243faab7e00ea8c604e4b6ace72f8784587fcee453f3959304934d37c5d1 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
9
+ CommonsBase_GNU 0.1.20260916234322 b244854bfcba1585234befef8d966f5fce276df458829850d926c2d5869beb34 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
10
+ CommonsBase_GNU 0.1.20260920144347 53e60fcbf502ffbdf433ac2faa585d8c9eff6c5b27aedd90d2f63330a7414218 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
11
+ CommonsBase_LLVM 0.1.20260913085659 c51d6e04e6779799c4df31630c75ed17d95386492c7e0ddc046f3734c816e929 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
12
+ CommonsBase_LLVM 0.1.20260916234322 e66256adfd231ea822bbad59bba124c3c851243082be0426af191ae18751611a etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
13
+ CommonsBase_LLVM 0.1.20260920144347 56312cd1d2868eff482798255793a35f8b2dbaf9c80a697622780d67639783fe etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
14
+ CommonsBase_Std 2.6.20260913085659 25224920a4b704b3693afe5343ce05c5cd2c0d9e19ce1641511707fb5af59887 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
15
+ CommonsBase_Std 2.6.20260916234322 eafd48ee3331a4be2fee20055a7d2f88c33b53989c2dcc7f9a6b5ac51349f250 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
16
+ CommonsBase_Std 2.6.20260920144347 b3c67724e09942596d8af32635b585698f931047e74332bc011a532a430d5438 etc/dk/i/CommonsBase_Std.2.6.20260920144347.values.json
17
+ CommonsBase_Std 2.6.20260920144347 b3c67724e09942596d8af32635b585698f931047e74332bc011a532a430d5438 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
18
+ CommonsBase_Win32 0.1.20260913085659 3bf82182b61b0800bcbb7cf8f6c6fb270228e78fab9120a0ac9e169d12a451af etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
19
+ CommonsBase_Win32 0.1.20260916234322 2c26c7595a79bd6e88bb5665dcbb552d3b72c828ebe7385315c4e8f64a8ed7ce etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
20
+ CommonsBase_Win32 0.1.20260920144347 4c1ae11415083c10650bdecf2b02c22ba5dce75362eb9b4139dd2575efe608e5 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
21
+ CommonsLang_OCaml 0.1.20260916151007 eec79d51d9e8906d861310f9d9fb04a251e0208caf6cae46f8e6ded13a498132 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
22
+ CommonsLang_OCaml 0.1.20260916234322 bbd0879f0808f8fbe230df44ba1d9a9804ce6773eb8ecda93af47d1a765a00e3 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
23
+ CommonsLang_OCaml 0.1.20260920144347 54c5ccfd53e87797ea4fea161b0fd6c869ba80a45b3b3870848407c6797741a8 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
24
+ NotMatveevKondratyev_Libinotify 0.1.20260913085659 994c3d7ae357b88c19e0cd330186a97a6078f37b1601c46fef06491756535b77 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
25
+ NotMatveevKondratyev_Libinotify 0.1.20260916234322 68849e07e20594dd003d052415ce2d181c1c00c65ba614ceb25ba970ba108976 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
26
+ NotMatveevKondratyev_Libinotify 0.1.20260920144347 33f86058acc7b9f1ca512237477d867926748f4ed3ff0d9174f14d200b649560 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
27
+ NotMitEdu_Kerberos 0.1.20260913085659 bac376f7b4b3f09a2a2e877fbce59c80e17b0661d5bd3c8d8d9c506fd47d3653 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
28
+ NotMitEdu_Kerberos 0.1.20260916234322 c208ebae1ecb09dc590b8d6f9df7cbee1c4edb83fbe4150ff50a903040f7842a etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
29
+ NotMitEdu_Kerberos 0.1.20260920144347 85cd3dd87bb48561bbcc75a624764d1214f7f07b78df7c8e751cd21e1e2757b8 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
etc/dk/t/.gitignore ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # Written by dk0. The values.json copies and the imports.json ledger are
2
+ # machine-written verification records for THIS workspace; do not commit.
3
+ # capabilities.json (explicit human authorization grants) is committable.
4
+ *.values.json
5
+ imports.json
etc/dk/t/acceptances.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "version": 1,
3
+ "acceptances": [
4
+ {
5
+ "package": "CommonsLang_OCaml",
6
+ "pubkey_base64": "RWQrGWGcOA3WV93QbuXdm8aAWjDkYvCM5jgFAanfDRiW9n3PzSvLESmR"
7
+ }
8
+ ]
9
+ }
etc/dk/t/capabilities.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "version": 1,
3
+ "grants": [
4
+ {
5
+ "package": "CommonsLang_OCaml",
6
+ "pubkey_base64": "RWQrGWGcOA3WV93QbuXdm8aAWjDkYvCM5jgFAanfDRiW9n3PzSvLESmR",
7
+ "capabilities": [ "run", "write" ]
8
+ }
9
+ ]
10
+ }
etc/dk/v/NotHackwaly_Ocamlearlybird/Ocamlearlybird.Closure.values.jsonc ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Driver for the opam build of `earlybird`: ONE run-function precommand
2
+ // instantiates the closure build rule, which reads the lock once and registers
3
+ // every per-package build form (each still its own content-addressed dk object,
4
+ // so an interrupted build resumes) plus the aggregate `.Built` output form.
5
+ //
6
+ // GENERATED by the CommonsLang_OCaml.Dk.OpamLock.GenerateDriver dialog from
7
+ // `dk.opam-lock.jsonc`. Regenerate (do not hand-edit) when the lock changes.
8
+ //
9
+ // Regenerate with:
10
+ // dk0 dialog CommonsLang_OCaml.Dk.OpamLock.GenerateDriver@1.1.22 pkg=NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 roots[]=earlybird
11
+ {
12
+ "$schema": "https://diskuv.com/dk/schema/dk-value-1.0.json",
13
+ "schema_version": { "major": 1, "minor": 0 },
14
+ "generated": {
15
+ "tool": "CommonsLang_OCaml.Dk.OpamLock.GenerateDriver@1.1.22",
16
+ "rulefn": "CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedClosure@1.0.29",
17
+ "lock": "dk.opam-lock.jsonc",
18
+ "lock-sha256": "8b0cbeeb0d8a11845f3cadc288bf4cb22cad3623c0673892d0b85f5256f0d967",
19
+ "localsrc": "NotHackwaly_Ocamlearlybird.Ocamlearlybird.Src@1.3.6",
20
+ "locksrcpath": "./dk-opam-lock.jsonc",
21
+ "roots": ["earlybird"],
22
+ "formid": "NotHackwaly_Ocamlearlybird.Ocamlearlybird.Closure@1.3.6",
23
+ "pkgpath": "NotHackwaly_Ocamlearlybird.Ocamlearlybird",
24
+ "version": "1.3.6",
25
+ "parallel": "t"
26
+ },
27
+ "forms": [
28
+ {
29
+ "id": "NotHackwaly_Ocamlearlybird.Ocamlearlybird.Closure@1.3.6",
30
+ "precommands": {
31
+ "sequential": false,
32
+ "private": [
33
+ "run-function CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedClosure@1.0.29 -d built modver=NotHackwaly_Ocamlearlybird.Ocamlearlybird.Closure.Built@1.3.6 pkgpath=NotHackwaly_Ocamlearlybird.Ocamlearlybird version=1.3.6 root=earlybird localsrc=NotHackwaly_Ocamlearlybird.Ocamlearlybird.Src@1.3.6 locksrcpath=./dk-opam-lock.jsonc targetabi=Release.target_abi ocaml=CommonsLang_OCaml.DkML@4.14.3001"
34
+ ]
35
+ },
36
+ "function": {
37
+ "commands": [
38
+ [
39
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')",
40
+ "cp", "built/install.zip", "${SLOT.request}/install.zip"
41
+ ]
42
+ ]
43
+ },
44
+ "outputs": { "assets": [ { "slots": ["Release.Windows_x86_64", "Release.Windows_x86", "Release.Linux_x86_64", "Release.Linux_x86_64_musl", "Release.Linux_x86", "Release.Linux_arm64", "Release.Darwin_x86_64", "Release.Darwin_arm64"], "paths": ["install.zip"] } ] }
45
+ }
46
+ ]
47
+ }
etc/dk/v/NotHackwaly_Ocamlearlybird/Ocamlearlybird.Src.values.jsonc ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // NotHackwaly_Ocamlearlybird.Ocamlearlybird.Src@1.3.6 -- the localized working tree as one
2
+ // content-addressed object (output.zip + dk-opam-lock.jsonc) that the generic
3
+ // OpamBuild rule stages via localsrc= as the source for the one local package.
4
+ //
5
+ // GENERATED by the CommonsLang_OCaml.Dk.OpamLock.GenerateSrc dialog. Regenerate
6
+ // (do not hand-edit) when the source tree or lock changes.
7
+ //
8
+ // Regenerate with:
9
+ // dk0 dialog CommonsLang_OCaml.Dk.OpamLock.GenerateSrc@1.1.22 pkg=NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6
10
+ {
11
+ "$schema": "https://diskuv.com/dk/schema/dk-value-1.0.json",
12
+ "schema_version": { "major": 1, "minor": 0 },
13
+ "generated": {
14
+ "tool": "CommonsLang_OCaml.Dk.OpamLock.GenerateSrc@1.1.22",
15
+ "pkg": "NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6",
16
+ "root": "earlybird",
17
+ "srcdirs": ["src"],
18
+ "rootfiles": ["dune", "dune-project", "earlybird.opam"]
19
+ },
20
+ "forms": [
21
+ {
22
+ "id": "NotHackwaly_Ocamlearlybird.Ocamlearlybird.Src@1.3.6",
23
+ "precommands": {
24
+ "private": [
25
+ "get-asset NotHackwaly_Ocamlearlybird.Apparatus.Src@1.3.6 -p src -d earlybird-1.3.6"
26
+ ]
27
+ },
28
+ "function": {
29
+ "commands": [
30
+ [
31
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "mkdir", "-p", "${SLOT.request}"
32
+ ],
33
+ [
34
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp",
35
+ "$(get-asset NotHackwaly_Ocamlearlybird.Apparatus.DuneWorkspace@1.3.6 -p dk-src/dune-workspace -f dune-workspace)",
36
+ "earlybird-1.3.6/dune-workspace"
37
+ ],
38
+ [
39
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp",
40
+ "$(get-asset NotHackwaly_Ocamlearlybird.Apparatus.DuneRoot@1.3.6 -p dune -f dune)",
41
+ "earlybird-1.3.6/dune"
42
+ ],
43
+ [
44
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp",
45
+ "$(get-asset NotHackwaly_Ocamlearlybird.Apparatus.DuneProject@1.3.6 -p dune-project -f dune-project)",
46
+ "earlybird-1.3.6/dune-project"
47
+ ],
48
+ [
49
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp",
50
+ "$(get-asset NotHackwaly_Ocamlearlybird.Apparatus.Opam@1.3.6 -p earlybird.opam -f earlybird.opam)",
51
+ "earlybird-1.3.6/earlybird.opam"
52
+ ],
53
+ [
54
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp",
55
+ "$(get-asset NotHackwaly_Ocamlearlybird.Apparatus.Lock@1.3.6 -p dk.opam-lock.jsonc -f lock.jsonc)",
56
+ "${SLOT.request}/dk-opam-lock.jsonc"
57
+ ],
58
+ [
59
+ "--zip", "${SLOT.request}/output.zip", "earlybird-1.3.6"
60
+ ]
61
+ ]
62
+ },
63
+ "outputs": { "assets": [ { "slots": ["Release.Windows_x86_64", "Release.Windows_x86", "Release.Linux_x86_64", "Release.Linux_x86_64_musl", "Release.Linux_x86", "Release.Linux_arm64", "Release.Darwin_x86_64", "Release.Darwin_arm64"], "paths": ["output.zip", "dk-opam-lock.jsonc"] } ] }
64
+ }
65
+ ]
66
+ }
etc/dk/v/NotHackwaly_Ocamlearlybird/Ocamlearlybird.values.jsonc ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 -- the final per-slot executable(s).
2
+ //
3
+ // Republishes the NotHackwaly_Ocamlearlybird.Ocamlearlybird.Closure@1.3.6 install prefix's
4
+ // executable(s) as bin/<exe>.exe. GENERATED by the
5
+ // CommonsLang_OCaml.Dk.OpamLock.GenerateFinal dialog; regenerate (do not
6
+ // hand-edit) when the exe set changes.
7
+ //
8
+ // Regenerate with:
9
+ // dk0 dialog CommonsLang_OCaml.Dk.OpamLock.GenerateFinal@1.1.22 pkg=NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6
10
+ {
11
+ "$schema": "https://diskuv.com/dk/schema/dk-value-1.0.json",
12
+ "schema_version": { "major": 1, "minor": 0 },
13
+ "generated": {
14
+ "tool": "CommonsLang_OCaml.Dk.OpamLock.GenerateFinal@1.1.22",
15
+ "pkg": "NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6",
16
+ "exes": ["ocamlearlybird"]
17
+ },
18
+ "forms": [
19
+ {
20
+ "id": "NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6",
21
+ "precommands": {
22
+ "private": [
23
+ "get-object NotHackwaly_Ocamlearlybird.Ocamlearlybird.Closure@1.3.6 -s ${SLOTNAME.request} -m ./install.zip -d ip"
24
+ ]
25
+ },
26
+ "function": {
27
+ "commands": [
28
+ [
29
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "mkdir", "-p", "${SLOT.request}/bin"
30
+ ],
31
+ [
32
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Windows_x86_64}", "--",
33
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird.exe", "${SLOT.request}/bin/ocamlearlybird.exe"
34
+ ],
35
+ [
36
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Windows_x86}", "--",
37
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird.exe", "${SLOT.request}/bin/ocamlearlybird.exe"
38
+ ],
39
+ [
40
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Linux_x86_64}", "--",
41
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird", "${SLOT.request}/bin/ocamlearlybird.exe"
42
+ ],
43
+ [
44
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Linux_x86_64_musl}", "--",
45
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird", "${SLOT.request}/bin/ocamlearlybird.exe"
46
+ ],
47
+ [
48
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Linux_x86}", "--",
49
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird", "${SLOT.request}/bin/ocamlearlybird.exe"
50
+ ],
51
+ [
52
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Linux_arm64}", "--",
53
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird", "${SLOT.request}/bin/ocamlearlybird.exe"
54
+ ],
55
+ [
56
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Darwin_x86_64}", "--",
57
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird", "${SLOT.request}/bin/ocamlearlybird.exe"
58
+ ],
59
+ [
60
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "env", "-u", "${SLOT.Release.Darwin_arm64}", "--",
61
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')", "cp", "ip/bin/ocamlearlybird", "${SLOT.request}/bin/ocamlearlybird.exe"
62
+ ]
63
+ ]
64
+ },
65
+ "outputs": { "assets": [
66
+ { "slots": ["Release.Windows_x86_64"], "paths": ["bin/ocamlearlybird.exe"] },
67
+ { "slots": ["Release.Windows_x86"], "paths": ["bin/ocamlearlybird.exe"] },
68
+ { "slots": ["Release.Linux_x86_64"], "paths": ["bin/ocamlearlybird.exe"] },
69
+ { "slots": ["Release.Linux_x86_64_musl"], "paths": ["bin/ocamlearlybird.exe"] },
70
+ { "slots": ["Release.Linux_x86"], "paths": ["bin/ocamlearlybird.exe"] },
71
+ { "slots": ["Release.Linux_arm64"], "paths": ["bin/ocamlearlybird.exe"] },
72
+ { "slots": ["Release.Darwin_x86_64"], "paths": ["bin/ocamlearlybird.exe"] },
73
+ { "slots": ["Release.Darwin_arm64"], "paths": ["bin/ocamlearlybird.exe"] }
74
+ ] }
75
+ }
76
+ ]
77
+ }
scripts/check-measurement-complete.mjs ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // THE MEASUREMENT COVERED EVERY SLOT IT CLAIMS TO COVER, OR THIS FAILS.
2
+ //
3
+ // WHY THIS EXISTS. The dk matrix in measure-performance.yml runs `fail-fast: false`,
4
+ // so one leg can die while the others finish and the workflow still completes with
5
+ // numbers. Those numbers then refresh CLO.md and both PR descriptions while silently
6
+ // describing a slot nobody measured. Nothing noticed that before this file.
7
+ //
8
+ // WHY IT IS NOT A TIMING THRESHOLD. Repeated runs at one pin put 6 of the 12 dk cells
9
+ // at or above 10 percent coefficient of variation, and the two cells quiet enough to
10
+ // carry a threshold were not the same two before and after an unrelated workflow
11
+ // repair. A threshold chosen on either sample rests on a property the next fix moves.
12
+ // A MISSING or FAILED measurement has no such dependence, and it is the failure that
13
+ // actually happened: the one real regression on record did not run slower, it did not
14
+ // build at all.
15
+ //
16
+ // WHAT IT ASSERTS. Every slot named in scripts/expected-measurement.json reported
17
+ // every phase named there, with a numeric millisecond value greater than zero.
18
+ //
19
+ // IT PROVES ITSELF BEFORE IT IS TRUSTED. `--selftest` builds a complete fixture and a
20
+ // damaged one and requires this file to accept the first and reject the second. The
21
+ // gate job runs that before applying the check to real data, because a check that has
22
+ // only ever been observed passing is evidence about the run and not about the check.
23
+
24
+ import fs from "node:fs";
25
+ import path from "node:path";
26
+ import os from "node:os";
27
+
28
+ const argv = process.argv.slice(2);
29
+ const KNOWN = new Set(["--expected", "--dir", "--selftest", "--help"]);
30
+ for (const a of argv) {
31
+ if (a.startsWith("--") && !KNOWN.has(a)) {
32
+ console.error(`FAIL unknown flag ${a}. Known flags: ${[...KNOWN].join(", ")}`);
33
+ process.exit(2);
34
+ }
35
+ }
36
+ const opt = (name, dflt) => {
37
+ const i = argv.indexOf(name);
38
+ return i >= 0 && argv[i + 1] && !argv[i + 1].startsWith("--") ? argv[i + 1] : dflt;
39
+ };
40
+
41
+ // A millisecond reading, without a backslash class. Digits only, at least one, and a
42
+ // value above zero. A phase that reported 0 ms did not run.
43
+ const isPositiveInteger = (s) => {
44
+ if (typeof s !== "string" || s.length === 0) return false;
45
+ for (const ch of s) {
46
+ const c = ch.codePointAt(0);
47
+ if (c < 0x30 || c > 0x39) return false;
48
+ }
49
+ return Number(s) > 0;
50
+ };
51
+
52
+ function readPhases(file) {
53
+ const out = {};
54
+ for (const line of fs.readFileSync(file, "utf8").split(/\r?\n/)) {
55
+ const t = line.trim();
56
+ if (!t) continue;
57
+ const eq = t.indexOf("=");
58
+ if (eq <= 0) continue;
59
+ out[t.slice(0, eq).trim()] = t.slice(eq + 1).trim();
60
+ }
61
+ return out;
62
+ }
63
+
64
+ function check(expectedFile, dir) {
65
+ const spec = JSON.parse(fs.readFileSync(expectedFile, "utf8"));
66
+ const slots = spec.slots ?? [];
67
+ const phases = spec.phases ?? [];
68
+ if (!slots.length || !phases.length) {
69
+ return { failures: [`${expectedFile} declares ${slots.length} slot(s) and ${phases.length} phase(s); a declaration that expects nothing cannot be violated, so it is refused rather than passed`], checked: 0 };
70
+ }
71
+ const failures = [];
72
+ let checked = 0;
73
+ for (const slot of slots) {
74
+ const file = path.join(dir, `${slot}.txt`);
75
+ if (!fs.existsSync(file)) {
76
+ failures.push(`slot ${slot} reported NO measurement at all: ${path.basename(file)} is absent. Its leg failed, was skipped, or was dropped from the matrix while this branch still claims to cover it.`);
77
+ continue;
78
+ }
79
+ const got = readPhases(file);
80
+ for (const p of phases) {
81
+ checked += 1;
82
+ if (!(p in got)) {
83
+ failures.push(`slot ${slot} is MISSING phase ${p}: the leg ran and produced no reading for it.`);
84
+ } else if (!isPositiveInteger(got[p])) {
85
+ failures.push(`slot ${slot} phase ${p} is ${JSON.stringify(got[p])}, which is not a positive whole number of milliseconds.`);
86
+ }
87
+ }
88
+ }
89
+ return { failures, checked };
90
+ }
91
+
92
+ // ---------------------------------------------------------------- selftest
93
+ if (argv.includes("--selftest")) {
94
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "measgate-"));
95
+ const expected = path.join(root, "expected.json");
96
+ fs.writeFileSync(expected, JSON.stringify({ slots: ["A", "B"], phases: ["p1", "p2"] }));
97
+
98
+ const good = path.join(root, "good");
99
+ fs.mkdirSync(good);
100
+ fs.writeFileSync(path.join(good, "A.txt"), "p1=10\np2=20\n");
101
+ fs.writeFileSync(path.join(good, "B.txt"), "p1=30\np2=40\n");
102
+
103
+ const missingSlot = path.join(root, "missing-slot");
104
+ fs.mkdirSync(missingSlot);
105
+ fs.writeFileSync(path.join(missingSlot, "A.txt"), "p1=10\np2=20\n");
106
+
107
+ const missingPhase = path.join(root, "missing-phase");
108
+ fs.mkdirSync(missingPhase);
109
+ fs.writeFileSync(path.join(missingPhase, "A.txt"), "p1=10\n");
110
+ fs.writeFileSync(path.join(missingPhase, "B.txt"), "p1=30\np2=40\n");
111
+
112
+ const zero = path.join(root, "zero");
113
+ fs.mkdirSync(zero);
114
+ fs.writeFileSync(path.join(zero, "A.txt"), "p1=0\np2=20\n");
115
+ fs.writeFileSync(path.join(zero, "B.txt"), "p1=30\np2=40\n");
116
+
117
+ const cases = [
118
+ ["a complete measurement is ACCEPTED", good, 0],
119
+ ["a slot that reported nothing is REJECTED", missingSlot, 1],
120
+ ["a slot missing one phase is REJECTED", missingPhase, 1],
121
+ ["a phase reporting 0 ms is REJECTED", zero, 1],
122
+ ];
123
+ let bad = 0;
124
+ for (const [name, dir, want] of cases) {
125
+ const { failures } = check(expected, dir);
126
+ const got = failures.length ? 1 : 0;
127
+ const ok = got === want;
128
+ if (!ok) bad += 1;
129
+ console.log(` ${ok ? "PASS" : "FAIL"} selftest: ${name} (expected exit ${want}, got ${got})`);
130
+ for (const f of failures) console.log(` ${f}`);
131
+ }
132
+ fs.rmSync(root, { recursive: true, force: true });
133
+ if (bad) {
134
+ console.error(`FAIL measurement_gate_selftest ${bad} of ${cases.length} selftest case(s) behaved wrongly. The check is NOT trustworthy and the real result below must not be believed.`);
135
+ process.exit(1);
136
+ }
137
+ console.log(`PASS measurement_gate_selftest ${cases.length} case(s): it accepts a complete measurement and rejects a missing slot, a missing phase and a zero reading.`);
138
+ process.exit(0);
139
+ }
140
+
141
+ // ---------------------------------------------------------------- the check
142
+ const expectedFile = opt("--expected", "scripts/expected-measurement.json");
143
+ const dir = opt("--dir", null);
144
+ if (!dir) {
145
+ console.error("usage: check-measurement-complete.mjs --dir <phases-dir> [--expected <file>]");
146
+ console.error(" check-measurement-complete.mjs --selftest");
147
+ process.exit(2);
148
+ }
149
+ if (!fs.existsSync(dir)) {
150
+ console.error(`FAIL measurement_complete the phases directory ${dir} does not exist, so NOTHING was collected. That is not the same as a measurement that passed.`);
151
+ process.exit(1);
152
+ }
153
+
154
+ const { failures, checked } = check(expectedFile, dir);
155
+ for (const f of failures) console.log(` FAIL ${f}`);
156
+ if (failures.length) {
157
+ console.error(`FAIL measurement_complete ${failures.length} problem(s). This branch declares its coverage in ${expectedFile}; either a leg did not report, or the declaration is stale. Fix the run or move the declaration in the same commit that changes the matrix.`);
158
+ process.exit(1);
159
+ }
160
+ console.log(`PASS measurement_complete every declared slot reported every declared phase (${checked} reading(s) checked).`);
scripts/expected-measurement.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$what": "What THIS branch claims measure-performance.yml covers. The gate job compares it against what the dk matrix actually reported, and fails when they disagree.",
3
+ "$why_a_declaration_and_not_the_matrix": "Reading the coverage back out of the matrix would make the check agree with whatever the matrix says, including after a slot is quietly dropped. A separate declaration is the thing a dropped slot can DISAGREE with, which is the whole point. When a slot is added or removed on purpose, this file moves in the same commit.",
4
+ "$why_it_matters": "The dk matrix runs fail-fast: false, so one leg can die while the others publish numbers and the workflow still finishes. Those numbers then refresh CLO.md and both PR bodies while describing a slot nobody measured. That is the failure this gate exists for: a MISSING measurement, not a slower one.",
5
+ "$phases_differ_by_branch": "This branch measures build_cold, run_warm and run_edit. The high-performance branch measures fetch_cold, run_reconcile and run_warm, because it consumes a prebuilt object rather than building one. The two declarations are therefore NOT interchangeable, and copying one over the other would make each branch's gate check for phases its workflow never emits.",
6
+ "slots": [
7
+ "Release.Linux_x86_64",
8
+ "Release.Windows_x86_64"
9
+ ],
10
+ "phases": [
11
+ "dk_build_cold",
12
+ "dk_run_warm",
13
+ "dk_run_edit"
14
+ ]
15
+ }
src/adapter/state_initialized.ml CHANGED
@@ -50,8 +50,7 @@ let spawn_terminal ~kind ~rpc ?name ?env ?cwd prog args =
50
  Debug_rpc.exec_command rpc
51
  (module Run_in_terminal_command)
52
  Run_in_terminal_command.Arguments.
53
- { kind = Some kind; title = name; cwd; env; args = prog :: args;
54
- args_can_be_interpreted_by_shell = None }
55
  in
56
  Lwt.return ());
57
  Lwt.return ()
 
50
  Debug_rpc.exec_command rpc
51
  (module Run_in_terminal_command)
52
  Run_in_terminal_command.Arguments.
53
+ { kind = Some kind; title = name; cwd; env; args = prog :: args }
 
54
  in
55
  Lwt.return ());
56
  Lwt.return ()