jonahbeckford/ocamlearlybird · dk1-high-performance vs dk1-quick-setup · net diff 60739ee81..b118fc07c · 11 files · generated 2026-09-20 21:50Z

Branch Review: dk1-high-performance

Description

What this branch does

Stacks on the dk1-quick-setup branch. This is the High Performance branch: a tag-driven CI pipeline (distribute-1.3.yml) which requires GitHub Actions to maintain a per-ABI datastore of built objects for the 53-package closure, with the per-ABI object ids recorded in dist/any.u. A consumer fetches every opam package object prebuilt:

# preseed the datastore and then run
./dk1 restore github-l2 jonahbeckford/ocamlearlybird
./dk1 run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
  -s Release.execution_abi -m ./bin/ocamlearlybird.exe -- --help=plain

See CLO.md for the High Performance guide: publishing with prepare-version + distribute, the fast dev loop (opam venv), and the What gets cached table.

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). The ± is the sample standard deviation over the mean; the High Performance numbers are the mean over 4 runs and the Quick Setup comparison numbers the mean over 8. The right column is the dk1-quick-setup branch's Quick Setup number for the same step:

Step dk 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 each fresh checkout figure includes. Both columns are the same one command, ./dk1 run-object ... -- --help=plain, whose timed region covers the vendored launcher self-installing the engine pinned in dk.u, obtaining the 53-package locked closure and the earlybird package, and then RUNNING the produced binary. The difference is the high performance branch uses the restore command which makes available all ocamlearlybird dependencies that were prebuilt in the ocamlearlybird GitHub Actions.

What's in the diff (beyond dk1-quick-setup)

  • .github/workflows/distribute-1.3.yml: the build matrix (5 distribute slots and combine), dk engine <!--VER:dk-->2.4.3.22<!--/VER:dk-->, trust-packages: CommonsLang_OCaml CommonsBase_FileMagic
  • .github/workflows/measure-performance.yml: the High Performance timing (dk restore + three run-object runs: fetch, reconcile, warm) and the datastore-compatibility guard
  • scripts/expected-measurement.json: the slots the completeness gate requires, extended for the High Performance datastore
  • dk.u: the added CommonsBase_Std and CommonsBase_FileMagic imports the datastore path needs
  • dist/any.u: the distribution script with the 6 per-ABI object ids and per-ABI machine-type checks
  • DEMO-KEYS.md: the public demo signing keys the release chain is signed with
  • etc/dk/d/1.3.0.dist.json: the 1.3 distribution public keys
  • etc/dk/i/: the CommonsBase_FileMagic and CommonsBase_Std import records and the closure manifest
  • etc/dk/v/…/Ocamlearlybird.DevPrefix.values.jsonc: the driver behind the opam venv fast dev loop
  • CLO.md: the High Performance and Fast dev loop (opam venv) sections and the High Performance column of What gets cached

Signing caveat

The current release chain is signed with public demo keys (committed in DEMO-KEYS.md), suitable for evaluating the mechanism. A production release requires ./dk1 prepare-version --ci github 1.3 in a secure environment, replacing the dk-distribution environment secrets, and superseding the demo releases.

Changed files (open the full file on GitHub)
.github/workflows/distribute-1.3.yml ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: NotHackwaly_Ocamlearlybird@1.3.x
2
+ on:
3
+ push:
4
+ tags:
5
+ - '1.3.*' # secrets are tied to version 1.3
6
+ workflow_dispatch: # allow manual triggering from GitHub page
7
+
8
+ jobs:
9
+ # Fail fast if the checked-in opam lock/driver drifted from the imported
10
+ # CommonsLang_OCaml rule versions (the 2026-08-20 stale-driver incident):
11
+ # catch it in seconds here instead of hours into the per-package build.
12
+ refresh-check:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - name: Harden Runner
16
+ uses: step-security/harden-runner@f808768d1510423e83855289c910610ca9b43176 # v2.17.0
17
+ with: { egress-policy: audit }
18
+ - name: Checkout repository
19
+ uses: actions/checkout@v6
20
+ - name: Check opam lock/driver freshness
21
+ # THE RULE VERSION IS DISCOVERED, NEVER PINNED HERE. A hardcoded version goes
22
+ # stale the moment the imported CommonsLang_OCaml moves it (it did: @1.1.12 was
23
+ # no longer offered after a bump, so this gate failed on a version, not a real
24
+ # drift). Discover the offered OpamLock.Refresh version from the import record,
25
+ # exactly as repin-engine.yml does when it regenerates the driver.
26
+ run: |
27
+ set -eu
28
+ imp=$(ls etc/dk/i/CommonsLang_OCaml.*.values.json 2>/dev/null | head -1)
29
+ if [ -z "$imp" ]; then echo "::error::no CommonsLang_OCaml import record found"; exit 1; fi
30
+ ref=$(grep -o 'CommonsLang_OCaml\.Dk\.OpamLock\.Refresh@[0-9][0-9.]*' "$imp" | sort -uV | tail -1)
31
+ if [ -z "$ref" ]; then echo "::error::the import offers no CommonsLang_OCaml.Dk.OpamLock.Refresh rule"; exit 1; fi
32
+ echo "checking drivers against $ref"
33
+ ./dk1 --dangerously-trust-all dialog "$ref" mode=check \
34
+ 'drivers[]=etc/dk/v/NotHackwaly_Ocamlearlybird/Ocamlearlybird.Closure.values.jsonc' \
35
+ 'drivers[]=etc/dk/v/NotHackwaly_Ocamlearlybird/Ocamlearlybird.DevPrefix.values.jsonc'
36
+
37
+ distribute:
38
+ needs: refresh-check
39
+ # The secrets created by `./dk0 prepare-version --ci github VERSION`
40
+ # are tied to this environment only.
41
+ environment: dk-distribution
42
+
43
+ strategy:
44
+ fail-fast: false
45
+ matrix:
46
+ include:
47
+ # curl and build-essential are part of ubuntu-24.04 CI runner, so test with:
48
+ # docker run -v .:/work --workdir /work -it ubuntu:24.04 bash -c "apt update && apt install -y curl build-essential && sh ./dk0 distribute --actual-in-place --library NotHackwaly_Ocamlearlybird@1.3.99 part1 dist/any.u"
49
+ # docker run -v .:/work --workdir /work -it quay.io/pypa/manylinux_2_28_x86_64:2026.07.10-1 sh ./dk0 distribute --actual-in-place --library NotHackwaly_Ocamlearlybird@1.3.99 part1 dist/any.u
50
+ # Linux_x86 (32-bit) restored 2026-08-15. The lwt C-stub failure
51
+ # (container compiled stubs 64-bit while ocamlmklib linked
52
+ # -melf_i386) was the -m32 loss described below: the DkML compiler
53
+ # baked c_compiler as `gcc -m32`, and dune keeps only the program
54
+ # word of c_compiler while re-adding args through :standard, which
55
+ # lwt's src/unix/dune overrides. CommonsLang_OCaml 0.1.20260815220819
56
+ # (Apparatus@1.0.1 i686 driver shims) names the 32-bitness into a
57
+ # single-word i686-none-linux-gnu-gcc driver, so the arg can no
58
+ # longer be dropped. The i686 multilib packages in "Prepare static
59
+ # libc" are installed for this slot.
60
+ - runs-on: ubuntu-latest
61
+ distscript: dist/any.u
62
+ image: quay.io/pypa/manylinux_2_28_x86_64:2026.07.10-1
63
+ target-abi: Linux_x86
64
+ - runs-on: ubuntu-latest
65
+ distscript: dist/any.u
66
+ # RedHat only distributes date versioned manylinux images for a few
67
+ # months.
68
+ # https://quay.io/repository/pypa/manylinux_2_28_x86_64?tab=tags&tag=latest to
69
+ # get a new version.
70
+ image: quay.io/pypa/manylinux_2_28_x86_64:2026.07.10-1 # glibc 2.28 + gcc 14.2.1: old glibc is highly compatible and works with Node v24.14.0; system gcc will not be needed once GCC bootstrapped in dk0.
71
+ target-abi: Linux_x86_64
72
+ # Linux_x86_64_musl is deliberately absent. The musl DkML compiler
73
+ # binaries are musl-dynamic and need /lib/ld-musl-x86_64.so.1, which
74
+ # only exists inside CommonsLang_OCaml's own CI container, so every
75
+ # package built at the musl target ABI dies in OpamBuildWrapper with
76
+ # exit 127 (cppo is simply the first one to get there). The glibc
77
+ # Linux_x86_64 slot's relocatability and PIE issues
78
+ # (dkpkg/CommonsLang_OCaml#2 and #3) are fixed as of release
79
+ # 0.1.20260820083108, but the musl loader availability blocker is
80
+ # separate; restore this slot once the musl toolchain runs on a
81
+ # consumer host.
82
+ - runs-on: macos-latest
83
+ distscript: dist/any.u
84
+ execution-abi: Darwin_arm64
85
+ target-abi: Darwin_arm64
86
+ - runs-on: macos-latest
87
+ distscript: dist/any.u
88
+ execution-abi: Darwin_arm64
89
+ target-abi: Darwin_x86_64
90
+ - runs-on: windows-latest
91
+ distscript: dist/any.u
92
+ target-abi: Windows_x86
93
+ - runs-on: windows-latest
94
+ distscript: dist/any.u
95
+ target-abi: Windows_x86_64
96
+
97
+ runs-on: ${{ matrix.runs-on }}
98
+ container:
99
+ image: ${{ matrix.image }}
100
+
101
+ steps:
102
+ - name: Harden Runner # Optional but recommended
103
+ uses: step-security/harden-runner@f808768d1510423e83855289c910610ca9b43176 # v2.17.0
104
+ with: { egress-policy: audit }
105
+ - name: Checkout repository
106
+ uses: actions/checkout@v6
107
+
108
+ - name: Prepare static libc for the manylinux container
109
+ if: ${{ matrix.image }}
110
+ run: dnf install -y glibc-static glibc-static.i686 glibc-devel.i686 libgcc.i686
111
+
112
+ - name: Distribute Modules
113
+ uses: diskuv/dk-distribute@v4
114
+ with:
115
+ # The repo name (ocamlearlybird) is not a valid dk library id, so the
116
+ # default `id` (github repo without owner) cannot be used. Pin it to
117
+ # the real library id; the version tracks the pushed tag. (dk-distribute@v3
118
+ # names this input `id`, not `library`.)
119
+ id: NotHackwaly_Ocamlearlybird@${{ github.ref_name }}
120
+ pubkey: ${{ secrets.distribute_1_3_pubkey }}
121
+ seckey: ${{ secrets.distribute_1_3_seckey }}
122
+ options: -nosysinc
123
+ # All slots publish for restore (store: release). The cross slots
124
+ # (target-abi != execution-abi: Linux_x86, Windows_x86,
125
+ # Darwin_x86_64) were previously pinned to store: none because dk
126
+ # object value-ids did not include the resolved target ABI, so a
127
+ # store restored from a previous release could serve host-ABI
128
+ # content under a cross slot's id -- the mechanism behind
129
+ # 1.3.202608152325's mislabeled 64-bit "Linux_x86" binary and the
130
+ # 1.3.202608160911 lwt 32/64 link failure. dk0 2.4.2.323+ (engine
131
+ # fix cfe131821) now mixes the resolved target ABI into a
132
+ # cross-built object's value-id, so cross objects key distinctly
133
+ # from the host's native build and a shared/restored store can no
134
+ # longer contaminate. The consumer dk0 self-updates from the
135
+ # manifest (>= 2.4.2.325 is live), so this is now safe.
136
+ #
137
+ # Escape hatch: set the repository variable DK_STORE=none before
138
+ # pushing a tag to force a full cold build+publish, then delete it
139
+ # to restore incremental releases:
140
+ # gh variable set DK_STORE --body none
141
+ # gh variable delete DK_STORE
142
+ # Needed whenever the driver/recipe changes but the thin leaf's
143
+ # values file (and so its value-id) does not: the restored store
144
+ # serves the unchanged leaf stale, the new Closure object and the
145
+ # Pkg.*.Src bundles its build references never publish, and every
146
+ # cold High Performance fetch 404s (release 1.3.202608262345, CI
147
+ # run 33026508188). dk0 2.4.2.336+ makes such a distribute fail
148
+ # loudly instead of sealing the incomplete set.
149
+ store: ${{ vars.DK_STORE || 'release' }}
150
+ distscript: ${{ matrix.distscript }}
151
+ execution-abi: ${{ matrix.execution-abi }}
152
+ target-abi: ${{ matrix.target-abi }}
153
+ # R8 resumable CI (requires diskuv/dk-distribute >= v4, which
154
+ # forwards these to `dk0 distribute --allow-partial --deadline`).
155
+ # When the job runs out of time, dk0 publishes the objects it
156
+ # finished as a PRERELEASE (a `dk-dist/PARTIAL` marker) instead
157
+ # of failing the workflow with nothing published; a later run
158
+ # restores that prerelease, resumes, and publishes a full
159
+ # release. Keep deadline-minutes comfortably under the job's
160
+ # timeout-minutes so the runner stops itself first.
161
+ # allow-partial: true
162
+ # deadline-minutes: 300
163
+ # If your workspace imports packages other than CommonsBase_Std
164
+ # (the built-in dk trust root) and your own package, list them so
165
+ # CI can accept their producer keys (dk0 denies unknown producer
166
+ # keys by default and CI has no terminal to accept them):
167
+ # This workspace's only direct import is CommonsLang_OCaml.
168
+ # dist/any.u runs CommonsBase_FileMagic's `file` to verify each
169
+ # slot's binary is compiled for its ABI, so its producer key must
170
+ # be trusted here too.
171
+ trust-packages: 'CommonsLang_OCaml CommonsBase_FileMagic'
172
+ # Use MlFront HEAD when CI build is not from a tag
173
+ experimental-mlfront-ref: ${{ github.ref_type != 'tag' && 'HEAD' }}
174
+ # Uncomment when testing MlFront
175
+ # experimental-mlfront-ref: HEAD
176
+
177
+ combine:
178
+ needs: distribute
179
+ # The secrets created by `./dk0 prepare-version --ci github VERSION`
180
+ # are tied to this environment only. The combine job uses them to sign
181
+ # the combined distribution build payload.
182
+ environment: dk-distribution
183
+ permissions:
184
+ contents: write # for action-gh-release
185
+ id-token: write # for actions/attest-build-provenance
186
+ attestations: write # for actions/attest-build-provenance
187
+ # required but does not work in `act`! bug: https://github.com/nektos/act/issues/6025
188
+ artifact-metadata: write # for actions/attest-build-provenance
189
+
190
+ runs-on: ubuntu-latest
191
+ steps:
192
+ - name: Harden Runner # Optional but recommended
193
+ uses: step-security/harden-runner@f808768d1510423e83855289c910610ca9b43176 # v2.17.0
194
+ with: { egress-policy: audit }
195
+ - name: Checkout repository
196
+ uses: actions/checkout@v6
197
+
198
+ - name: Combine Modules
199
+ uses: diskuv/dk-distribute/combine@v4
200
+ with:
201
+ # Same library-id pin as the distribute job (combine defaults its `id`
202
+ # to the repo name too, which is not a valid dk library id here).
203
+ id: NotHackwaly_Ocamlearlybird@${{ github.ref_name }}
204
+ pubkey: ${{ secrets.distribute_1_3_pubkey }}
205
+ seckey: ${{ secrets.distribute_1_3_seckey }}
206
+
207
+ # Attests the distribution, publishes the sigstore bundle for values.json
208
+ # as a release asset, and creates the release. A consumer then fetches
209
+ # that bundle beside values.json with a plain download, so importing this
210
+ # release needs no GitHub API token.
211
+ - name: Attest and Release
212
+ uses: diskuv/dk-distribute/attest-release@v4
.github/workflows/measure-performance.yml CHANGED
@@ -1,20 +1,20 @@
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:
@@ -30,6 +30,17 @@ on:
30
  - 'true'
31
  - 'false'
32
  default: 'true'
 
 
 
 
 
 
 
 
 
 
 
33
  push:
34
  tags:
35
  - 'perf-*'
@@ -45,18 +56,50 @@ jobs:
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: |
@@ -67,18 +110,32 @@ jobs:
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
@@ -86,9 +143,22 @@ jobs:
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
@@ -99,7 +169,7 @@ jobs:
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: |
@@ -109,7 +179,7 @@ jobs:
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 `
@@ -119,18 +189,25 @@ jobs:
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)"
@@ -140,9 +217,18 @@ jobs:
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
@@ -249,3 +335,89 @@ jobs:
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)"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  name: measure-performance
2
+ # Head-to-head opam-vs-dk timing for the High Performance tier, on the two ABIs
3
+ # it ships as prebuilt objects: Linux_x86_64 (ubuntu-latest) and Windows_x86_64
4
+ # (windows-latest). Each runner measures the host ABI natively, so the warm-run
5
+ # number is the real re-run cost a user sees. Trigger from the Actions tab
6
+ # (workflow_dispatch) or by pushing a perf-* tag; the perf workflow never runs
7
+ # on push or pull_request, so it stays off the PR status checks.
8
  #
9
+ # The dk track resolves the prebuilt object with run-object, which lazily
10
+ # fetches only the requested slot's object from the release. Every timed step
11
+ # prints `PHASE <name> ms=<n>` lines and a final SUMMARY line, comparable to the
12
+ # opam track:
13
+ # dk fresh -> binary : dk_restore_cold + dk_fetch_cold (restore the
14
+ # datastore, then lazy-fetch prebuilt + materialize)
15
  # opam fresh -> binary : (setup-ocaml step) + opam_deps + opam_build_cold
16
  # dk re-run a binary : dk_run_warm
17
  # opam re-run a binary : opam_run_warm
 
 
18
  on:
19
  workflow_dispatch:
20
  inputs:
 
30
  - 'true'
31
  - 'false'
32
  default: 'true'
33
+ profile:
34
+ description: >-
35
+ Run the fetch-profile job, which repeats the dk run-object command
36
+ under `-d perf` so every remote artifact it opens is named. Off by
37
+ default: it adds a job to an ordinary measurement run and its output
38
+ is a log rather than a PHASE line.
39
+ type: choice
40
+ options:
41
+ - 'false'
42
+ - 'true'
43
+ default: 'false'
44
  push:
45
  tags:
46
  - 'perf-*'
 
56
  - os: windows-latest
57
  slot: Release.Windows_x86_64
58
  runs-on: ${{ matrix.os }}
59
+ timeout-minutes: 30
 
 
60
  steps:
61
  - name: Checkout repository
62
  uses: actions/checkout@v7
63
  with:
64
  lfs: true
65
 
66
+ # Seed the datastore LIVE from the latest published self-distribution,
67
+ # the documented consumer flow (CLO.md: restore then run-object). The
68
+ # committed etc/dk/i self-record was removed: no workflow advanced it, so
69
+ # it froze the measured datastore at an older CommonsLang_OCaml while the
70
+ # imports moved on, and run-object then re-paid the whole closure on every
71
+ # warm re-run. Restoring live always seeds the datastore built at the
72
+ # current CommonsLang_OCaml, by construction.
73
+ # The restore is TIMED because a High Performance fresh checkout is restore
74
+ # THEN run-object, so the fresh-checkout figure is dk_restore_cold +
75
+ # dk_fetch_cold. It is also the first ./dk1 call, so it fairly pays the
76
+ # launcher self-install a fresh checkout incurs. The PHASE echo is outside
77
+ # the stopwatch (header note: a console write inside a stopwatch widened
78
+ # five of six Windows cells once).
79
+ - name: dk restore the latest self-distribution (Linux)
80
+ if: runner.os == 'Linux'
81
+ shell: bash
82
+ run: |
83
+ set -euo pipefail
84
+ a=$(date +%s%3N)
85
+ ./dk1 restore github-l2 jonahbeckford/ocamlearlybird
86
+ b=$(date +%s%3N)
87
+ echo "PHASE dk_restore_cold ms=$((b-a))"
88
+
89
+ - name: dk restore the latest self-distribution (Windows)
90
+ if: runner.os == 'Windows'
91
+ shell: pwsh
92
+ run: |
93
+ $ErrorActionPreference = 'Stop'
94
+ $sw = [System.Diagnostics.Stopwatch]::StartNew()
95
+ & .\dk1.cmd restore github-l2 jonahbeckford/ocamlearlybird
96
+ $restore = $sw.ElapsedMilliseconds
97
+ if ($LASTEXITCODE -ne 0) { throw "restore failed ($LASTEXITCODE)" }
98
+ Write-Host "PHASE dk_restore_cold ms=$restore"
99
+
100
  # Linux uses the POSIX ./dk1 launcher (curl is present) and date-based
101
  # millisecond timing.
102
+ - name: dk fetch + reconcile run + warm run (timed, Linux)
103
  if: runner.os == 'Linux'
104
  shell: bash
105
  run: |
 
110
  -s "$slot" -m ./bin/ocamlearlybird.exe -- --help=plain >/dev/null; }
111
  echo "DK MEASURE STARTED $(date -u +%H:%M:%S) slot=$slot"
112
 
113
+ # First run lazily fetches the prebuilt object and materializes the
114
+ # runtime sandbox.
115
  a=$(now); run; b=$(now)
116
+ echo "PHASE dk_fetch_cold ms=$((b-a))"
117
 
118
+ # Second run reconciles the working tree with the fetched release:
119
+ # when the tree drifted since the release was harvested (for example
120
+ # a changed Src value), dk pays a one-time local rebuild here. On an
121
+ # undrifted tree this equals the warm run.
122
  c=$(now); run; d=$(now)
123
+ echo "PHASE dk_run_reconcile ms=$((d-c))"
124
 
125
+ # Third run: the steady-state warm re-run cost. A healthy warm run
126
+ # leaves the trace store byte-identical (the engine cram's invariant),
127
+ # so hash it before and after instead of parsing progress messages.
128
+ h1=$(md5sum t/d/cts.1/trace | cut -d' ' -f1)
129
  e=$(now); run; f=$(now)
130
+ echo "PHASE dk_run_warm ms=$((f-e))"
131
+ h2=$(md5sum t/d/cts.1/trace | cut -d' ' -f1)
132
+ silent=t
133
+ [ "$h1" != "$h2" ] && silent=f
134
 
135
+ # Flag drift so a reconcile rebuild is never mistaken for warm cost.
136
+ drifted=f
137
+ if [ $((d-c)) -gt $(( (f-e) * 3 )) ]; then drifted=t; fi
138
+ echo "DK SUMMARY slot=$slot fetch_cold_ms=$((b-a)) reconcile_ms=$((d-c)) run_warm_ms=$((f-e)) tree_drifted_from_release=$drifted warm_silent=$silent"
139
  echo "DK MEASURE DONE $(date -u +%H:%M:%S)"
140
 
141
  # The same three readings, machine readable, for the gate job. Written
 
143
  # cannot move a number: an earlier repair to this workflow moved console
144
  # writes inside a stopwatch and widened five of six Windows cells.
145
  mkdir -p "$RUNNER_TEMP/dk-phases"
146
+ printf 'dk_fetch_cold=%s\ndk_run_reconcile=%s\ndk_run_warm=%s\n' \
147
  "$((b-a))" "$((d-c))" "$((f-e))" > "$RUNNER_TEMP/dk-phases/$slot.txt"
148
 
149
+ # Compatibility guard. A datastore whose baked CommonsLang_OCaml differs
150
+ # from the imported one makes run-object bind one key to two values and
151
+ # re-pay the closure on every warm run. A matched datastore emits ZERO
152
+ # such warnings; the cycle-54 mismatch emitted 40. The reconcile>3*warm
153
+ # drift check above cannot see this (both phases inflate together, so the
154
+ # ratio stays ~1). One untimed run, stderr captured, then asserted.
155
+ run 2>"$RUNNER_TEMP/compat.err" || true
156
+ if grep -q "binds one key to 2 different values" "$RUNNER_TEMP/compat.err"; then
157
+ n=$(grep -c "binds one key to 2 different values" "$RUNNER_TEMP/compat.err")
158
+ echo "::error::datastore/closure value-id mismatch: $n multi-value binding warning(s). The restored datastore was not built at the imported CommonsLang_OCaml, so the warm re-run re-pays the closure cost. Re-cut the self-distribution datastore at the current CommonsLang_OCaml."
159
+ exit 1
160
+ fi
161
+
162
  - name: Upload this slot's readings for the gate
163
  if: ${{ always() && runner.os == 'Linux' }}
164
  uses: actions/upload-artifact@v4
 
169
 
170
  # Windows uses the dk1.cmd launcher (bootstraps via PowerShell, no curl
171
  # dependency) and Stopwatch timing.
172
+ - name: dk fetch + reconcile run + warm run (timed, Windows)
173
  if: runner.os == 'Windows'
174
  shell: pwsh
175
  run: |
 
179
  # the Windows runner are expensive enough to move the numbers, so it
180
  # goes to a file and is printed after the stopwatch stops. The file
181
  # sits in the runner temp rather than the working tree, which the
182
+ # reconcile run compares against the release.
183
  $errlog = Join-Path $env:RUNNER_TEMP 'dk-run.err'
184
  function Run {
185
  & .\dk1.cmd run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 `
 
189
  Write-Host "DK MEASURE STARTED $(Get-Date -Format HH:mm:ss) slot=$slot"
190
 
191
  $sw = [System.Diagnostics.Stopwatch]::StartNew(); Run; $cold = $sw.ElapsedMilliseconds
192
+ Write-Host "PHASE dk_fetch_cold ms=$cold"
193
+
194
+ # Second run reconciles the working tree with the fetched release:
195
+ # a drifted tree pays a one-time local rebuild here. On an undrifted
196
+ # tree this equals the warm run.
197
+ $sw.Restart(); Run; $reconcile = $sw.ElapsedMilliseconds
198
+ Write-Host "PHASE dk_run_reconcile ms=$reconcile"
199
 
200
+ # Third run: the steady-state warm re-run cost. A healthy warm run
201
+ # leaves the trace store byte-identical (the engine cram's invariant),
202
+ # so hash it before and after instead of parsing progress messages.
203
+ $h1 = (Get-FileHash -Algorithm MD5 t\d\cts.1\trace).Hash
204
  $sw.Restart(); Run; $warm = $sw.ElapsedMilliseconds
205
  Write-Host "PHASE dk_run_warm ms=$warm"
206
+ $h2 = (Get-FileHash -Algorithm MD5 t\d\cts.1\trace).Hash
207
+ $silent = if ($h1 -ne $h2) { 'f' } else { 't' }
208
 
209
+ $drifted = if ($reconcile -gt (3 * $warm)) { 't' } else { 'f' }
210
+ Write-Host "DK SUMMARY slot=$slot fetch_cold_ms=$cold reconcile_ms=$reconcile run_warm_ms=$warm tree_drifted_from_release=$drifted warm_silent=$silent"
 
 
 
 
 
211
  Write-Host "DK ENGINE OUTPUT from the last timed run, printed outside the stopwatch"
212
  Get-Content $errlog
213
  Write-Host "DK MEASURE DONE $(Get-Date -Format HH:mm:ss)"
 
217
  # cannot move a number.
218
  $phaseDir = Join-Path $env:RUNNER_TEMP 'dk-phases'
219
  New-Item -ItemType Directory -Force -Path $phaseDir | Out-Null
220
+ "dk_fetch_cold=$cold`ndk_run_reconcile=$reconcile`ndk_run_warm=$warm" |
221
  Set-Content -NoNewline -Path (Join-Path $phaseDir "$slot.txt")
222
 
223
+ # Compatibility guard. A matched datastore emits zero multi-value
224
+ # bindings; the cycle-54 mismatch emitted many. $errlog holds the last
225
+ # timed run's engine stderr, so no extra run is needed here.
226
+ $hits = Select-String -Path $errlog -Pattern 'binds one key to 2 different values'
227
+ if ($hits) {
228
+ Write-Host "::error::datastore/closure value-id mismatch: $($hits.Count) multi-value binding warning(s). The restored datastore was not built at the imported CommonsLang_OCaml, so the warm re-run re-pays the closure cost. Re-cut the self-distribution datastore at the current CommonsLang_OCaml."
229
+ exit 1
230
+ }
231
+
232
  - name: Upload this slot's readings for the gate
233
  if: ${{ always() && runner.os == 'Windows' }}
234
  uses: actions/upload-artifact@v4
 
335
 
336
  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))"
337
  echo "OPAM MEASURE DONE $(date -u +%H:%M:%S)"
338
+
339
+ # NAMES WHAT A SINGLE-OBJECT FETCH OPENS, and it lives in this workflow
340
+ # rather than its own because GitHub resolves workflow_dispatch by name only
341
+ # for a workflow it already knows, and only ci.yml is on the default branch.
342
+ # A separate file would be a workflow nothing can trigger.
343
+ #
344
+ # It exists because the only attribution this repository had for the per-ABI
345
+ # fan-out was a TIMESTAMP PROXY: 98 s of a 172 s phase binned into windows
346
+ # guessed to belong to ABIs nobody asked for. BuildPerf.note_index_fetch
347
+ # emits one `index-fetch` line per artifact carrying that artifact's PATH, so
348
+ # the split becomes a grouping of named paths instead of an estimate.
349
+ #
350
+ # What it does NOT give, stated so nobody sums the wrong column: `central_sz`
351
+ # is the size of the zip CENTRAL DIRECTORY that was range-fetched. It is not
352
+ # the transferred bytes and it is not the object's own size. Summing
353
+ # announced object sizes has already produced a meaningless figure here once.
354
+ #
355
+ # It needs nothing from the dk job and the measurement gate needs nothing
356
+ # from it, so it neither blocks nor is blocked by the published measurement.
357
+ fetch-profile:
358
+ if: ${{ inputs.profile == 'true' }}
359
+ runs-on: ubuntu-latest
360
+ timeout-minutes: 60
361
+ steps:
362
+ - name: Checkout repository
363
+ uses: actions/checkout@v7
364
+ with:
365
+ lfs: true
366
+
367
+ - name: Run run-object under -d perf
368
+ shell: bash
369
+ run: |
370
+ set -euo pipefail
371
+ slot=Release.Linux_x86_64
372
+ echo "PROFILE STARTED $(date -u +%H:%M:%S) slot=$slot"
373
+
374
+ # The perf lines go to stderr. Keep stdout out of the way, and do not
375
+ # let a non-zero exit hide the log: the log IS the measurement.
376
+ set +e
377
+ ./dk1 -d perf run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
378
+ -s "$slot" -m ./bin/ocamlearlybird.exe -- --help=plain \
379
+ >/dev/null 2>perf.log
380
+ rc=$?
381
+ set -e
382
+ echo "PROFILE run_object_exit=$rc"
383
+
384
+ # PROVE THE INSTRUMENT FIRED before reading anything off it. An empty
385
+ # parse must never impersonate an answer: zero perf lines reads
386
+ # exactly like a finding of "no fan-out", and a misplaced flag is not
387
+ # a finding.
388
+ n=$(grep -c '^\[perf ' perf.log || true)
389
+ echo "PROFILE perf_lines=$n"
390
+ if [ "$n" -eq 0 ]; then
391
+ echo "PROFILE FAILED: no [perf lines in stderr." >&2
392
+ echo "Either -d perf sits in the wrong place on the command line, or this" >&2
393
+ echo "engine does not carry BuildPerf. Neither is a measurement." >&2
394
+ echo "First 40 stderr lines follow:" >&2
395
+ head -40 perf.log >&2
396
+ exit 1
397
+ fi
398
+
399
+ grep 'index-fetch' perf.log | sed 's/.* //' | sort -u > paths.txt
400
+ echo "PROFILE index_fetch_lines=$(grep -c 'index-fetch' perf.log || true)"
401
+ echo "PROFILE distinct_paths=$(wc -l < paths.txt)"
402
+
403
+ # LONGEST NAME FIRST, and each match is CONSUMED, so Linux_x86_64 is
404
+ # never counted a second time as Linux_x86. A count in this ecosystem
405
+ # was redone for exactly that reason.
406
+ for abi in Linux_x86_64_musl Linux_x86_64 Linux_x86_32 Linux_x86 \
407
+ Darwin_arm64 Darwin_x86_64 Windows_x86_64 Windows_x86_32 Windows_x86; do
408
+ c=$(grep -c "$abi" paths.txt || true)
409
+ echo "PROFILE abi=$abi distinct_paths=$c"
410
+ grep -v "$abi" paths.txt > paths.rest || true
411
+ mv paths.rest paths.txt
412
+ done
413
+ echo "PROFILE abi=none distinct_paths=$(wc -l < paths.txt)"
414
+ echo "PROFILE DONE $(date -u +%H:%M:%S)"
415
+
416
+ - name: Upload the perf log
417
+ if: always()
418
+ uses: actions/upload-artifact@v4
419
+ with:
420
+ name: fetch-profile-${{ github.run_id }}
421
+ path: perf.log
422
+ if-no-files-found: error
423
+ retention-days: 30
CLO.md CHANGED
@@ -133,7 +133,98 @@ produces the same lock. Bump the commit deliberately, then re-solve with
133
 
134
  ---
135
 
136
- <!-- The "## High Performance" section is added on the dk1-high-performance branch. -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
137
 
138
  ## Editing a file and rebuilding
139
 
@@ -154,15 +245,15 @@ 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
 
133
 
134
  ---
135
 
136
+ ## High Performance
137
+
138
+ Quick Setup builds ocamlearlybird's opam closure from source on your machine
139
+ (on top of prebuilt toolchain objects), so it compiles and links native code and
140
+ needs a system C toolchain on `PATH`. The High Performance path publishes the
141
+ project's **own** prebuilt objects in CI; on the consumer side the
142
+ whole closure is a fetch-and-run of already-built objects.
143
+
144
+ ### Publishing the project's own objects: `prepare-version` + `distribute`
145
+
146
+ The cache that pays off for a project's dependency packages is the project's
147
+ **own prior releases** (object ids embed the project namespace, so only this
148
+ project's published `Pkg.*` objects serve its fetches). Setting that up is a
149
+ two-command dk workflow, wired into CI:
150
+
151
+ **1. `prepare-version MAJOR.MINOR`** mints the distribution signing keys and
152
+ records the public halves in-tree:
153
+
154
+ ```sh
155
+ ./dk1 prepare-version --ci github 1.3
156
+ ```
157
+
158
+ It prompts for the **library id** (`NotHackwaly_Ocamlearlybird` here, the
159
+ `VendorQualifier_Unit` base the forms already use), then generates an
160
+ Ed25519-style keypair for the current version and the upcoming minor/major
161
+ versions. It **prints each secret key for you to store** (dk does not persist
162
+ secrets) and writes only the public keys to `etc/dk/d/1.3.PATCH.dist.json`;
163
+ `--ci github` scaffolds the release workflow. The license (`MIT`, from `dk.u`'s
164
+ `## License`) is recorded if not already set.
165
+
166
+ > **Key custody.** The secret keys are the project's release identity and must be
167
+ > generated in a secure environment and stored in a secret manager / GitHub
168
+ > Actions secret. They must never live in an ephemeral build container or a log.
169
+ > (For that reason the keys were **not** generated in this document's CI
170
+ > container; this section documents the workflow, and the repository owner runs
171
+ > `prepare-version` where the secrets can be custodied.)
172
+
173
+ **2. `distribute --library …@VERSION`** builds the objects on a compatible CI
174
+ builder and publishes the signed bundle (under `dk-dist/`) as a GitHub release.
175
+ `VERSION` must be a monotonically increasing patch of the prepared `MAJOR.MINOR`
176
+ (e.g. `NotHackwaly_Ocamlearlybird@1.3.YYYYMMDDhhmm`). Consumers then:
177
+
178
+ ```sh
179
+ ./dk1 restore github-l2 jonahbeckford/ocamlearlybird
180
+ ./dk1 run-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 \
181
+ -s Release.execution_abi -m ./bin/ocamlearlybird.exe -- --help
182
+ ```
183
+
184
+ (The `-m` member is `./bin/ocamlearlybird.exe`, the exact archive name,
185
+ including the `./` prefix.)
186
+
187
+ ## Fast dev loop (opam venv)
188
+
189
+ For productivity you can get incremental `dune build -w` builds and IDE support. Set up a dk-enabled opam environment once:
190
+
191
+ ```sh
192
+ ./dk1 --trust-local-package NotHackwaly_Ocamlearlybird dialog CommonsLang_OCaml.Dk.OpamLock.OpamVenv@1.1.14
193
+ ```
194
+
195
+ (`--trust-local-package` lets the dialog resolve this workspace's own
196
+ `NotHackwaly_Ocamlearlybird` forms; the venv is a maintainer inner loop against
197
+ the working tree.)
198
+
199
+ Then, in each shell:
200
+
201
+ ```powershell
202
+ . .\opam-venv\env.ps1 # Windows PowerShell (recommended)
203
+ # or: source opam-venv/env.sh # Unix / Git Bash
204
+ dune build -w # incremental; only the edited module recompiles
205
+ dune exec -- ocamlearlybird --help
206
+ ```
207
+
208
+ **Parity.** The venv resolves to the same locked dependency versions and the same
209
+ `CommonsLang_OCaml.DkML@4.14.3` compiler the reproducible dk build uses (it is
210
+ driven from `dk.opam-lock.jsonc`), so `dune -w` behavior matches the shipped
211
+ binary, and earlybird keeps debugging bytecode compiled by that same 4.14.3
212
+ compiler.
213
+
214
+ **Isolation.** `opam-venv/` and dune's `_build/` are invisible to both git and to
215
+ dk's own reproducible build: the OpamVenv dialog drops a self-ignoring
216
+ `.gitignore` and a `dune` `(dirs)` guard into `opam-venv/`, so a host
217
+ `dune build` never scans it and `dk1 run-object` produces the identical binary.
218
+
219
+ **Refresh.** After a dependency change, regenerate the drivers and re-materialize:
220
+ the zero-argument `Refresh@1.1.14` (see *Maintenance after adoption*) followed by
221
+ `OpamVenv@1.1.14`.
222
+
223
+ **Windows.** `env.ps1` imports MSVC (vcvars) automatically for native linking. If
224
+ a native relink reports `LNK1104: cannot open ... main.exe`, a previous
225
+ `ocamlearlybird` process still holds the executable open, so stop it and rebuild.
226
+ For a VS Code task, launch `code .` from an activated shell so it inherits the
227
+ environment.
228
 
229
  ## Editing a file and rebuilding
230
 
 
245
 
246
  ## What gets cached
247
 
248
+ | Piece | High Performance source |
249
  | --- | --- |
250
  | OCaml compiler toolchain (`CommonsLang_OCaml.DkML@4.14.3`) | fetched prebuilt from the `dkpkg` release |
251
  | Dune (`CommonsLang_OCaml.Dune@3.23.1`) | fetched prebuilt from the `dkpkg` release |
252
  | opam and the build utilities (coreutils, 7-Zip, GNU make) | fetched prebuilt from the `dkpkg` releases |
253
  | MSYS2 runtime (Windows slots) | fetched prebuilt from the `dkpkg` release |
254
+ | The 53 locked dependency packages (lwt, dap, menhir, ppxlib, …) | fetched prebuilt from this project's release |
255
+ | The in-tree `earlybird` package | fetched prebuilt from this project's release; rebuilt locally on source edits |
256
+ | Localized source and final executable forms | fetched prebuilt from this project's release; rebuilt locally on source edits |
257
 
258
  A dk object id is a hash of the values-file content, the `module@version`, and
259
  the slot, and the id embeds this project's namespace. A
DEMO-KEYS.md ADDED
@@ -0,0 +1,208 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Demo keys for ocamlearlybird
2
+
3
+ Do NOT use these keys for production.
4
+
5
+ From:
6
+
7
+ ```sh
8
+ ./dk1 prepare-version --ci github 1.3
9
+ ```
10
+
11
+ we recorded the Q&A session below.
12
+ Normally you would save it all as a secure note in your favorite password manager:
13
+
14
+ ```text
15
+ -----------------
16
+ Define Library Id
17
+ -----------------
18
+
19
+ The library id is the hierarchical base of all the modules that your
20
+ distributions export. It is in the three-part form `VendorQualifier_Unit`
21
+ like `FooBar_Baz` or `FooBar_FizzBizz`.
22
+
23
+ To share your modules with others and avoid naming conflicts, your library
24
+ id must be registered and have a distribution key (we'll generate one for
25
+ you later).
26
+
27
+ Good "Vendors" and "Qualifiers" relate to your domain or real name.
28
+ Reserved "Vendors" include:
29
+ `Commons`, `Std`, `Dk`, `Ml`, `Our`, `Thunk`, `Zz`
30
+
31
+ A good "Unit" is either `Std`, or is related to your product or project.
32
+
33
+ Enter library id (leave blank to quit): NotHackwaly_Ocamlearlybird
34
+ NotHackwaly_Ocamlearlybird
35
+
36
+ --------------------------------
37
+ Key Pair for current version 1.3
38
+ --------------------------------
39
+
40
+ STORE the following key pair safely (ex. secure password manager) -or-
41
+ PRINT it and store it in two or more safe places.
42
+
43
+ -- name of keypair --
44
+ NotHackwaly_Ocamlearlybird-1.3
45
+
46
+ -- public key 1.3 --
47
+ untrusted comment: NotHackwaly_Ocamlearlybird-1.3|RWS5iRatcyGHX6NTdJ3Zrv9lhpWPrw9khAMAsHbWZa3vwkaCzDJRXrXR
48
+
49
+ -- secret key 1.3 --
50
+ untrusted comment: NotHackwaly_Ocamlearlybird-1.3|RWRCSwAAAADfxp0ThqnKUqKOXq10gz+IYV1xqtw4K/25iRatcyGHX+gX7j3vYtSe5KP3PmLS95snRt8r3SX8JHCMUxGXio5zo1N0ndmu/2WGlY+vD2SEAwCwdtZlre/CRoLMMlFetdE=
51
+
52
+ Did you securely store the keypair above?
53
+
54
+ Y. Yes, I have saved the keypair
55
+ Q. Quit
56
+
57
+ Enter Y or Q: y
58
+ y
59
+
60
+ ----------------------------------------------
61
+ CI Identity Information for You (the Producer)
62
+ ----------------------------------------------
63
+
64
+ 1. (simple; most common) Enter GitHub SLSA v1 Level 2 details.
65
+ https://docs.github.com/en/actions/how-tos/secure-your-work/use-artifact-attestations/use-artifact-attestations#generating-artifact-attestations-for-your-builds
66
+ Details to attest (prove) that your builds have no tampering of values
67
+ after GitHub Actions finishes.
68
+ 2. (most secure) Enter GitHub SLSA v1 Level 3 details.
69
+ https://docs.github.com/en/actions/how-tos/secure-your-work/use-artifact-attestations/increase-security-rating
70
+ Details to attest (prove) that there will be no tampering of values
71
+ during your builds by using a known, vetted GitHub Actions script.
72
+ C. Continue without CI identity
73
+ Q. Quit
74
+
75
+ Enter 1, 2, C or Q: 1
76
+ 1
77
+
78
+ Enter GitHub repository (ex. "owner/repo"): jonahbeckford/ocamlearlybird
79
+ jonahbeckford/ocamlearlybird
80
+
81
+ --------------------------------
82
+ Define Your Distribution License
83
+ --------------------------------
84
+
85
+ 1. Enter SPDX license (ex. "Apache-2.0"). Strongly permissive licenses
86
+ like BlueOak-1.0.0, BSD-2-Clause-Patent and Apache-2.0 will not
87
+ prompt your users to accept the license.
88
+ 2. Enter plain license text
89
+ 3. Enter license text in Markdown format
90
+ Q. Quit
91
+
92
+ Enter 1, 2, 3 or Q: 1
93
+ 1
94
+ Enter SPDX license identifier (ex. "Apache-2.0"; "q" to quit): MIT
95
+ MIT
96
+
97
+ ----------------------------------------
98
+ Key Pair for next minor version bump 1.4
99
+ ----------------------------------------
100
+
101
+ STORE the following key pair safely (ex. secure password manager) -or-
102
+ PRINT it and store it in two or more safe places.
103
+
104
+ -- name of keypair --
105
+ NotHackwaly_Ocamlearlybird-1.4
106
+
107
+ -- public key 1.4 --
108
+ untrusted comment: NotHackwaly_Ocamlearlybird-1.4|RWQZzxNUJsjQ/Jvo4twU6vt8wFACHOucOBipn+i2DWBI/UyQcG6fq+Sc
109
+
110
+ -- secret key 1.4 --
111
+ untrusted comment: NotHackwaly_Ocamlearlybird-1.4|RWRCSwAAAAC0QIfcxsJyZgrg/8S1m+P3YLN0IubKOtgZzxNUJsjQ/GDDya0OsPkxeTzsill8Ow9+cw1wmhYvTgFiJ8rb7zBNm+ji3BTq+3zAUAIc65w4GKmf6LYNYEj9TJBwbp+r5Jw=
112
+
113
+ Did you securely store the keypair above?
114
+
115
+ Y. Yes, I have saved the keypair
116
+ Q. Quit
117
+
118
+ Enter Y or Q: y
119
+ y
120
+
121
+ ----------------------------------------
122
+ Key Pair for next major version bump 2.0
123
+ ----------------------------------------
124
+
125
+ STORE the following key pair safely (ex. secure password manager) -or-
126
+ PRINT it and store it in two or more safe places.
127
+
128
+ -- name of keypair --
129
+ NotHackwaly_Ocamlearlybird-2.0
130
+
131
+ -- public key 2.0 --
132
+ untrusted comment: NotHackwaly_Ocamlearlybird-2.0|RWQh+ThJhASGk+QRWB7rnF33W5z90ZfFjxkRRgLjqLhW4wg0FSMowMjI
133
+
134
+ -- secret key 2.0 --
135
+ untrusted comment: NotHackwaly_Ocamlearlybird-2.0|RWRCSwAAAABHH9nRCfY1QOPw81Y7/OD47C4BG5ehiWwh+ThJhASGk6jwqBxUbkbBCPGaEiVV37uugs1I1K0zZLVwcg4+5nhJ5BFYHuucXfdbnP3Rl8WPGRFGAuOouFbjCDQVIyjAyMg=
136
+
137
+ Did you securely store the keypair above?
138
+
139
+ Y. Yes, I have saved the keypair
140
+ Q. Quit
141
+
142
+ Enter Y or Q: y
143
+ y
144
+ {
145
+ "continuations": {
146
+ "attestation": {
147
+ "openbsd_signify": {
148
+ "signature": "untrusted comment: signed by key b98916ad7321875f\nRWS5iRatcyGHXzE+NoZhCVLSHmy7+nrpX4i3BctxIBgb5mz21Cu8JD9zd2ltJZl9z8cPyP+tAr0RGa77G0RBF/ixqJ8UcLoJTwc=\n"
149
+ }
150
+ },
151
+ "continuations_to_sign": {
152
+ "1.4": {
153
+ "application": { "name": "dk0", "version": "2.4.2+rev-313" },
154
+ "openbsd_signify": {
155
+ "public_key": "untrusted comment: NotHackwaly_Ocamlearlybird-1.4\nRWQZzxNUJsjQ/Jvo4twU6vt8wFACHOucOBipn+i2DWBI/UyQcG6fq+Sc\n"
156
+ }
157
+ },
158
+ "2.0": {
159
+ "application": { "name": "dk0", "version": "2.4.2+rev-313" },
160
+ "openbsd_signify": {
161
+ "public_key": "untrusted comment: NotHackwaly_Ocamlearlybird-2.0\nRWQh+ThJhASGk+QRWB7rnF33W5z90ZfFjxkRRgLjqLhW4wg0FSMowMjI\n"
162
+ }
163
+ }
164
+ }
165
+ },
166
+ "id": "NotHackwaly_Ocamlearlybird@1.3.0",
167
+ "license": { "spdx": "MIT" },
168
+ "producer": {
169
+ "application": { "name": "dk0", "version": "2.4.2+rev-313" },
170
+ "github_slsa_v1_l2": { "repository": "jonahbeckford/ocamlearlybird" },
171
+ "openbsd_signify": {
172
+ "public_key": "untrusted comment: NotHackwaly_Ocamlearlybird-1.3\nRWS5iRatcyGHX6NTdJ3Zrv9lhpWPrw9khAMAsHbWZa3vwkaCzDJRXrXR\n"
173
+ }
174
+ }
175
+ }
176
+ Saved etc/dk/d/1.3.0.dist.json
177
+ Saved .github/workflows/distribute-1.3.yml
178
+
179
+ ------------
180
+
181
+ Your workflow `.github/workflows/distribute-1.3.yml`
182
+ requires two GitHub secrets set in a `dk-distribution` environment
183
+ to sign the distributions:
184
+
185
+ - `distribute_1_3_pubkey` - the public key for `NotHackwaly_Ocamlearlybird-1.3`
186
+ - `distribute_1_3_seckey` - the secret key for `NotHackwaly_Ocamlearlybird-1.3`
187
+
188
+ You can set these secrets now with the GitHub CLI!
189
+ 1. Download GitHub CLI from https://cli.github.com/.
190
+
191
+ 2. Create the dk-distribution environment with:
192
+
193
+ gh api --method PUT -H "Accept: application/vnd.github+json" repos/jonahbeckford/ocamlearlybird/environments/dk-distribution
194
+
195
+ 3. Run the following, then copy and paste the text
196
+ ("untrusted comment: ...|RW...") of the PUBLIC key
197
+ `NotHackwaly_Ocamlearlybird-1.3`:
198
+
199
+ gh secret set --repo jonahbeckford/ocamlearlybird --env dk-distribution distribute_1_3_pubkey
200
+
201
+ 4. Run the following, then copy and paste the text
202
+ ("untrusted comment: ...|RW...") of the SECRET key
203
+ `NotHackwaly_Ocamlearlybird-1.3`:
204
+
205
+ gh secret set --repo jonahbeckford/ocamlearlybird --env dk-distribution distribute_1_3_seckey
206
+
207
+ Full docs at https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets#creating-secrets-for-an-environment.
208
+ ```
dist/any.u ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Distribution for NotHackwaly_Ocamlearlybird
2
+
3
+ ## ocamlearlybird debug adapter
4
+
5
+ `ocamlearlybird` is a debug adapter (DAP) for OCaml bytecode. It ships as the
6
+ single native executable `bin/ocamlearlybird.exe`, built from source as a
7
+ per-package opam closure
8
+ (`NotHackwaly_Ocamlearlybird.Ocamlearlybird.Closure`) and republished as one
9
+ executable per slot.
10
+
11
+ The object is `bin/ocamlearlybird.exe` compiled for the ABI. The `Release.target_abi`
12
+ wildcard resolves to the slot the workflow passes as `--target-abi`, so this one
13
+ script covers every shipped slot: `Linux_x86`, `Linux_x86_64`, `Darwin_x86_64`,
14
+ `Darwin_arm64`, `Windows_x86_64`, and `Windows_x86` (one abi-keyed `\dk.object`
15
+ line each below). The `Linux_x86_64_musl` slot is deferred — its from-source
16
+ toolchain does not build yet (see the `distribute-1.3.yml` matrix comments and
17
+ rotary-phone `prompts/linux-x86_64-musl-abi.md`); re-add its `\dk.object` line
18
+ once fixed.
19
+
20
+ The per-slot `\dk.object` value-ids are harvested from the first CI run (the DkML
21
+ pattern): the first `distribute` emits them as a `dk-patches/` diff that is
22
+ applied back into this script. These are reproducible
23
+ (verified byte-identical across two independent CI tags), so a re-tag matches.
24
+
25
+ $ get-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 -s Release.target_abi -d ${RUNTIME}/Ocamlearlybird-1.3.6
26
+ \test(pass)
27
+ \dk.object(abi: "Release.Darwin_arm64", value-id: "omtfpbdektkgath7i4swzhvzc5fxtderwphdlegrg4bxta5v5sl4q")
28
+ \dk.object(abi: "Release.Darwin_x86_64", value-id: "oqjlu7ktcozr4n6hhwc2bdjny5or4kuw3jrewu7sry4ffh3xuqa7q")
29
+ \dk.object(abi: "Release.Linux_x86", value-id: "oedoj4l65yoqqedzwg63ixxeq5kud4vtq5pjzcvvfr7afaxpoqqbq")
30
+ \dk.object(abi: "Release.Linux_x86_64", value-id: "ok4emdyssvgza2bkzlrdkcyi3faiae7d7p3bma6csg5a7r57ijjja")
31
+ \dk.object(abi: "Release.Windows_x86", value-id: "oowf7ga5kkh7wjpeyugumxf4sj2jldzsjempeegynrtgwu2hfwgbq")
32
+ \dk.object(abi: "Release.Windows_x86_64", value-id: "o5g7qcdhtvyxw6oa2dc6qj6ecpqf3vsvv7ob6zufs4kiwijfzi4uq")\;
33
+
34
+ ## Architecture verification
35
+
36
+ Running the OpenBSD `file`(1) tool (from `CommonsBase_FileMagic`) on the built
37
+ adapter confirms each slot's `bin/ocamlearlybird.exe` really is compiled for the
38
+ ABI it is published under. `file` runs at `Release.execution_abi` (the build
39
+ host) and inspects the `Release.target_abi` binary, so it covers the cross slots
40
+ too. The per-abi `file` output is recorded below, one `\dk.target` line per slot,
41
+ harvested from the first CI run the same way as the value-ids above.
42
+
43
+ $ run-object CommonsBase_FileMagic.File@7.8.50407 -s Release.execution_abi -m ./bin/file.exe -e bin/file.exe --
44
+ > -b $(get-object NotHackwaly_Ocamlearlybird.Ocamlearlybird@1.3.6 -s Release.target_abi -d : -e file.exe)/bin/ocamlearlybird.exe
45
+ \test(pass)
46
+ \dk.target(abi: "Darwin_arm64")[Mach-O 64-bit executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|WEAK_DEFINES|BINDS_TO_WEAK|PIE>
47
+ ]
48
+ \dk.target(abi: "Darwin_x86_64")[Mach-O 64-bit executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|WEAK_DEFINES|BINDS_TO_WEAK|PIE>
49
+ ]
50
+ \dk.target(abi: "Linux_x86")[ELF 32-bit LSB executable, Intel i386, version 1 (SYSV)
51
+ ]
52
+ \dk.target(abi: "Linux_x86_64")[ELF 64-bit LSB executable, x86-64, version 1 (SYSV)
53
+ ]
54
+ \dk.target(abi: "Windows_x86")[PE32 executable for MS Windows 6.00 (console),, 5 sections
55
+ ]
56
+ \dk.target(abi: "Windows_x86_64")[PE32+ executable for MS Windows 6.00 (console),, 7 sections
57
+ ]\;
dk.u CHANGED
@@ -52,3 +52,10 @@ them run `./dk1 update --no-imports` to refresh the recorded checksums.
52
  checksum: (blake2b-256: "f4908c307b22de34d24ae0349481f321cd46d5082cc92a89d99d18a13189d907",
53
  sha256: "54c5ccfd53e87797ea4fea161b0fd6c869ba80a45b3b3870848407c6797741a8",
54
  sha1: "b018ece3ee445cfd6414cd7f28a3c501b5469898"))\;
 
 
 
 
 
 
 
 
52
  checksum: (blake2b-256: "f4908c307b22de34d24ae0349481f321cd46d5082cc92a89d99d18a13189d907",
53
  sha256: "54c5ccfd53e87797ea4fea161b0fd6c869ba80a45b3b3870848407c6797741a8",
54
  sha1: "b018ece3ee445cfd6414cd7f28a3c501b5469898"))\;
55
+
56
+ %% import { type="github-l2", repo="dkpkg/CommonsBase_FileMagic" }
57
+ \dk.import(type: "github-l2", library: "CommonsBase_FileMagic",
58
+ version: "0.1.20260920144347",
59
+ checksum: (blake2b-256: "759fc698d8eccc6a06eb856c8292dcb4cb7818976d81da262d0d31a17e49523c",
60
+ sha256: "9795f60a23f3135597b06cf41d13983757f1488f71dc301e0a90f85834a340d7",
61
+ sha1: "6750792bad17d08e4a855295073845e139b1c985"))\;
etc/dk/d/1.3.0.dist.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "continuations": {
3
+ "attestation": {
4
+ "openbsd_signify": {
5
+ "signature": "untrusted comment: signed by key b98916ad7321875f\nRWS5iRatcyGHXzE+NoZhCVLSHmy7+nrpX4i3BctxIBgb5mz21Cu8JD9zd2ltJZl9z8cPyP+tAr0RGa77G0RBF/ixqJ8UcLoJTwc=\n"
6
+ }
7
+ },
8
+ "continuations_to_sign": {
9
+ "1.4": {
10
+ "application": { "name": "dk0", "version": "2.4.2+rev-313" },
11
+ "openbsd_signify": {
12
+ "public_key": "untrusted comment: NotHackwaly_Ocamlearlybird-1.4\nRWQZzxNUJsjQ/Jvo4twU6vt8wFACHOucOBipn+i2DWBI/UyQcG6fq+Sc\n"
13
+ }
14
+ },
15
+ "2.0": {
16
+ "application": { "name": "dk0", "version": "2.4.2+rev-313" },
17
+ "openbsd_signify": {
18
+ "public_key": "untrusted comment: NotHackwaly_Ocamlearlybird-2.0\nRWQh+ThJhASGk+QRWB7rnF33W5z90ZfFjxkRRgLjqLhW4wg0FSMowMjI\n"
19
+ }
20
+ }
21
+ }
22
+ },
23
+ "id": "NotHackwaly_Ocamlearlybird@1.3.0",
24
+ "license": { "spdx": "MIT" },
25
+ "producer": {
26
+ "application": { "name": "dk0", "version": "2.4.2+rev-313" },
27
+ "github_slsa_v1_l2": { "repository": "jonahbeckford/ocamlearlybird" },
28
+ "openbsd_signify": {
29
+ "public_key": "untrusted comment: NotHackwaly_Ocamlearlybird-1.3\nRWS5iRatcyGHX6NTdJ3Zrv9lhpWPrw9khAMAsHbWZa3vwkaCzDJRXrXR\n"
30
+ }
31
+ }
32
+ }
etc/dk/i/CommonsBase_FileMagic.0.1.20260920144347.values.json ADDED
@@ -0,0 +1,758 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bundles": [
3
+ {
4
+ "assets": [
5
+ {
6
+ "checksum": {
7
+ "blake2b256": "11b7f4ba5b78db5cf7774c592afad9038e479ae4a82b63f764a3da34bca0d431"
8
+ },
9
+ "origin": "CommonsBase_FileMagic",
10
+ "path": "CommonsBase_FileMagic-any-Darwin_arm64.distmeta.cts.1.tracestore",
11
+ "size": 45003
12
+ },
13
+ {
14
+ "checksum": {
15
+ "blake2b256": "1d741a1754855e64094523d0eee474882f87bf7e28b3f756200bdda13b1f37e8"
16
+ },
17
+ "indexes": [
18
+ {
19
+ "type": "zip",
20
+ "zip": {
21
+ "local_offset": 0,
22
+ "central_offset": 8188,
23
+ "central_size": 534,
24
+ "checksum": {
25
+ "blake2b256": "09cc3798c1b74c7f80e031bb3b8ba96c956617f51734f1018e1401a4b0d6d13c"
26
+ }
27
+ }
28
+ }
29
+ ],
30
+ "origin": "CommonsBase_FileMagic",
31
+ "path": "CommonsBase_FileMagic-any-Darwin_arm64.distmeta.manifest.zip",
32
+ "size": 8722
33
+ },
34
+ {
35
+ "checksum": {
36
+ "blake2b256": "e76756c37d7412984bb57c33e34fccec1b0f0f507c30d5ea28ed1bba6b0423eb"
37
+ },
38
+ "indexes": [
39
+ {
40
+ "type": "zip",
41
+ "zip": {
42
+ "local_offset": 0,
43
+ "central_offset": 21430,
44
+ "central_size": 308,
45
+ "checksum": {
46
+ "blake2b256": "413c99d1218f2ba72ab7a17d2e209984d2483888864a8b816552c387ddef4b79"
47
+ }
48
+ }
49
+ }
50
+ ],
51
+ "origin": "CommonsBase_FileMagic",
52
+ "path": "CommonsBase_FileMagic-any-Darwin_arm64.distmeta.valuestore.zip",
53
+ "size": 21738
54
+ },
55
+ {
56
+ "checksum": {
57
+ "blake2b256": "c1f188b19423ef8599a16a9b12eeef6e6f1f47e2d1e0fe0e8e1df95749dcce55"
58
+ },
59
+ "origin": "CommonsBase_FileMagic",
60
+ "path": "CommonsBase_FileMagic-any-Darwin_arm64.package.cts.1.tracestore",
61
+ "size": 33296
62
+ },
63
+ {
64
+ "checksum": {
65
+ "blake2b256": "4898af5e8a23d57474d502ca8dd412a9387c79249928fd78fa08603a5bfa912a"
66
+ },
67
+ "indexes": [
68
+ {
69
+ "type": "zip",
70
+ "zip": {
71
+ "local_offset": 0,
72
+ "central_offset": 223350450,
73
+ "central_size": 6083,
74
+ "checksum": {
75
+ "blake2b256": "872ea0b86e07d1dfdfc6c59de0ba3b8d3895c9fabb47eb39d89c0c7ebec26eda"
76
+ }
77
+ }
78
+ }
79
+ ],
80
+ "origin": "CommonsBase_FileMagic",
81
+ "path": "CommonsBase_FileMagic-any-Darwin_arm64.package.valuestore.zip",
82
+ "size": 223356533
83
+ },
84
+ {
85
+ "checksum": {
86
+ "blake2b256": "11b7f4ba5b78db5cf7774c592afad9038e479ae4a82b63f764a3da34bca0d431"
87
+ },
88
+ "origin": "CommonsBase_FileMagic",
89
+ "path": "CommonsBase_FileMagic-any-Darwin_x86_64.distmeta.cts.1.tracestore",
90
+ "size": 45003
91
+ },
92
+ {
93
+ "checksum": {
94
+ "blake2b256": "1d741a1754855e64094523d0eee474882f87bf7e28b3f756200bdda13b1f37e8"
95
+ },
96
+ "indexes": [
97
+ {
98
+ "type": "zip",
99
+ "zip": {
100
+ "local_offset": 0,
101
+ "central_offset": 8188,
102
+ "central_size": 534,
103
+ "checksum": {
104
+ "blake2b256": "09cc3798c1b74c7f80e031bb3b8ba96c956617f51734f1018e1401a4b0d6d13c"
105
+ }
106
+ }
107
+ }
108
+ ],
109
+ "origin": "CommonsBase_FileMagic",
110
+ "path": "CommonsBase_FileMagic-any-Darwin_x86_64.distmeta.manifest.zip",
111
+ "size": 8722
112
+ },
113
+ {
114
+ "checksum": {
115
+ "blake2b256": "e76756c37d7412984bb57c33e34fccec1b0f0f507c30d5ea28ed1bba6b0423eb"
116
+ },
117
+ "indexes": [
118
+ {
119
+ "type": "zip",
120
+ "zip": {
121
+ "local_offset": 0,
122
+ "central_offset": 21430,
123
+ "central_size": 308,
124
+ "checksum": {
125
+ "blake2b256": "413c99d1218f2ba72ab7a17d2e209984d2483888864a8b816552c387ddef4b79"
126
+ }
127
+ }
128
+ }
129
+ ],
130
+ "origin": "CommonsBase_FileMagic",
131
+ "path": "CommonsBase_FileMagic-any-Darwin_x86_64.distmeta.valuestore.zip",
132
+ "size": 21738
133
+ },
134
+ {
135
+ "checksum": {
136
+ "blake2b256": "87576788aded4add99f80ed47878e859a6b72a9bd3dd8e99caee7c85fc86e485"
137
+ },
138
+ "origin": "CommonsBase_FileMagic",
139
+ "path": "CommonsBase_FileMagic-any-Darwin_x86_64.package.cts.1.tracestore",
140
+ "size": 33301
141
+ },
142
+ {
143
+ "checksum": {
144
+ "blake2b256": "da853b849aab083011339c8b181202b886abc82b2dc98678e5c7ad860262b9cd"
145
+ },
146
+ "indexes": [
147
+ {
148
+ "type": "zip",
149
+ "zip": {
150
+ "local_offset": 0,
151
+ "central_offset": 223333412,
152
+ "central_size": 6083,
153
+ "checksum": {
154
+ "blake2b256": "12a85f9a8408346aeaa1c576d66bc43e6bd4d11253b9a2a0f0e7dd12dbc4c3f7"
155
+ }
156
+ }
157
+ }
158
+ ],
159
+ "origin": "CommonsBase_FileMagic",
160
+ "path": "CommonsBase_FileMagic-any-Darwin_x86_64.package.valuestore.zip",
161
+ "size": 223339495
162
+ },
163
+ {
164
+ "checksum": {
165
+ "blake2b256": "11b7f4ba5b78db5cf7774c592afad9038e479ae4a82b63f764a3da34bca0d431"
166
+ },
167
+ "origin": "CommonsBase_FileMagic",
168
+ "path": "CommonsBase_FileMagic-any-Linux_x86.distmeta.cts.1.tracestore",
169
+ "size": 45003
170
+ },
171
+ {
172
+ "checksum": {
173
+ "blake2b256": "1d741a1754855e64094523d0eee474882f87bf7e28b3f756200bdda13b1f37e8"
174
+ },
175
+ "indexes": [
176
+ {
177
+ "type": "zip",
178
+ "zip": {
179
+ "local_offset": 0,
180
+ "central_offset": 8188,
181
+ "central_size": 534,
182
+ "checksum": {
183
+ "blake2b256": "09cc3798c1b74c7f80e031bb3b8ba96c956617f51734f1018e1401a4b0d6d13c"
184
+ }
185
+ }
186
+ }
187
+ ],
188
+ "origin": "CommonsBase_FileMagic",
189
+ "path": "CommonsBase_FileMagic-any-Linux_x86.distmeta.manifest.zip",
190
+ "size": 8722
191
+ },
192
+ {
193
+ "checksum": {
194
+ "blake2b256": "e76756c37d7412984bb57c33e34fccec1b0f0f507c30d5ea28ed1bba6b0423eb"
195
+ },
196
+ "indexes": [
197
+ {
198
+ "type": "zip",
199
+ "zip": {
200
+ "local_offset": 0,
201
+ "central_offset": 21430,
202
+ "central_size": 308,
203
+ "checksum": {
204
+ "blake2b256": "413c99d1218f2ba72ab7a17d2e209984d2483888864a8b816552c387ddef4b79"
205
+ }
206
+ }
207
+ }
208
+ ],
209
+ "origin": "CommonsBase_FileMagic",
210
+ "path": "CommonsBase_FileMagic-any-Linux_x86.distmeta.valuestore.zip",
211
+ "size": 21738
212
+ },
213
+ {
214
+ "checksum": {
215
+ "blake2b256": "089112a39293317dd04c16eba5d502b6e48cffeab45fadadae9a56ba0bf65d5e"
216
+ },
217
+ "origin": "CommonsBase_FileMagic",
218
+ "path": "CommonsBase_FileMagic-any-Linux_x86.package.cts.1.tracestore",
219
+ "size": 33281
220
+ },
221
+ {
222
+ "checksum": {
223
+ "blake2b256": "3633193c486ae19e97ebfd7f3c2d2c87deb96445d406f36df27571396d3c8673"
224
+ },
225
+ "indexes": [
226
+ {
227
+ "type": "zip",
228
+ "zip": {
229
+ "local_offset": 0,
230
+ "central_offset": 224250332,
231
+ "central_size": 6083,
232
+ "checksum": {
233
+ "blake2b256": "bb21d6caa9fff6759976d445ced831c2931734ead318d65f321b8fb51b0c6b61"
234
+ }
235
+ }
236
+ }
237
+ ],
238
+ "origin": "CommonsBase_FileMagic",
239
+ "path": "CommonsBase_FileMagic-any-Linux_x86.package.valuestore.zip",
240
+ "size": 224256415
241
+ },
242
+ {
243
+ "checksum": {
244
+ "blake2b256": "11b7f4ba5b78db5cf7774c592afad9038e479ae4a82b63f764a3da34bca0d431"
245
+ },
246
+ "origin": "CommonsBase_FileMagic",
247
+ "path": "CommonsBase_FileMagic-any-Linux_x86_64.distmeta.cts.1.tracestore",
248
+ "size": 45003
249
+ },
250
+ {
251
+ "checksum": {
252
+ "blake2b256": "1d741a1754855e64094523d0eee474882f87bf7e28b3f756200bdda13b1f37e8"
253
+ },
254
+ "indexes": [
255
+ {
256
+ "type": "zip",
257
+ "zip": {
258
+ "local_offset": 0,
259
+ "central_offset": 8188,
260
+ "central_size": 534,
261
+ "checksum": {
262
+ "blake2b256": "09cc3798c1b74c7f80e031bb3b8ba96c956617f51734f1018e1401a4b0d6d13c"
263
+ }
264
+ }
265
+ }
266
+ ],
267
+ "origin": "CommonsBase_FileMagic",
268
+ "path": "CommonsBase_FileMagic-any-Linux_x86_64.distmeta.manifest.zip",
269
+ "size": 8722
270
+ },
271
+ {
272
+ "checksum": {
273
+ "blake2b256": "e76756c37d7412984bb57c33e34fccec1b0f0f507c30d5ea28ed1bba6b0423eb"
274
+ },
275
+ "indexes": [
276
+ {
277
+ "type": "zip",
278
+ "zip": {
279
+ "local_offset": 0,
280
+ "central_offset": 21430,
281
+ "central_size": 308,
282
+ "checksum": {
283
+ "blake2b256": "413c99d1218f2ba72ab7a17d2e209984d2483888864a8b816552c387ddef4b79"
284
+ }
285
+ }
286
+ }
287
+ ],
288
+ "origin": "CommonsBase_FileMagic",
289
+ "path": "CommonsBase_FileMagic-any-Linux_x86_64.distmeta.valuestore.zip",
290
+ "size": 21738
291
+ },
292
+ {
293
+ "checksum": {
294
+ "blake2b256": "135db6e03985af66900adedf0989bf7988b2c172f0a57c4dc5dc771160666db5"
295
+ },
296
+ "origin": "CommonsBase_FileMagic",
297
+ "path": "CommonsBase_FileMagic-any-Linux_x86_64.package.cts.1.tracestore",
298
+ "size": 33296
299
+ },
300
+ {
301
+ "checksum": {
302
+ "blake2b256": "ccd9014748214b63fcf6b27d8ec59e36004e1c88756c685848ebad82a28ce501"
303
+ },
304
+ "indexes": [
305
+ {
306
+ "type": "zip",
307
+ "zip": {
308
+ "local_offset": 0,
309
+ "central_offset": 224328554,
310
+ "central_size": 6083,
311
+ "checksum": {
312
+ "blake2b256": "f3a95fd74ef617143a7edc09add58b9040ea2a48c12e84a8e618ad05b02ae8e3"
313
+ }
314
+ }
315
+ }
316
+ ],
317
+ "origin": "CommonsBase_FileMagic",
318
+ "path": "CommonsBase_FileMagic-any-Linux_x86_64.package.valuestore.zip",
319
+ "size": 224334637
320
+ },
321
+ {
322
+ "checksum": {
323
+ "blake2b256": "11b7f4ba5b78db5cf7774c592afad9038e479ae4a82b63f764a3da34bca0d431"
324
+ },
325
+ "origin": "CommonsBase_FileMagic",
326
+ "path": "CommonsBase_FileMagic-any-Windows_arm64.distmeta.cts.1.tracestore",
327
+ "size": 45003
328
+ },
329
+ {
330
+ "checksum": {
331
+ "blake2b256": "1d741a1754855e64094523d0eee474882f87bf7e28b3f756200bdda13b1f37e8"
332
+ },
333
+ "indexes": [
334
+ {
335
+ "type": "zip",
336
+ "zip": {
337
+ "local_offset": 0,
338
+ "central_offset": 8188,
339
+ "central_size": 534,
340
+ "checksum": {
341
+ "blake2b256": "09cc3798c1b74c7f80e031bb3b8ba96c956617f51734f1018e1401a4b0d6d13c"
342
+ }
343
+ }
344
+ }
345
+ ],
346
+ "origin": "CommonsBase_FileMagic",
347
+ "path": "CommonsBase_FileMagic-any-Windows_arm64.distmeta.manifest.zip",
348
+ "size": 8722
349
+ },
350
+ {
351
+ "checksum": {
352
+ "blake2b256": "e76756c37d7412984bb57c33e34fccec1b0f0f507c30d5ea28ed1bba6b0423eb"
353
+ },
354
+ "indexes": [
355
+ {
356
+ "type": "zip",
357
+ "zip": {
358
+ "local_offset": 0,
359
+ "central_offset": 21430,
360
+ "central_size": 308,
361
+ "checksum": {
362
+ "blake2b256": "413c99d1218f2ba72ab7a17d2e209984d2483888864a8b816552c387ddef4b79"
363
+ }
364
+ }
365
+ }
366
+ ],
367
+ "origin": "CommonsBase_FileMagic",
368
+ "path": "CommonsBase_FileMagic-any-Windows_arm64.distmeta.valuestore.zip",
369
+ "size": 21738
370
+ },
371
+ {
372
+ "checksum": {
373
+ "blake2b256": "0998fb1b74b684bf537641c3145b6466ddf40c87a7854fd44989814c558c0322"
374
+ },
375
+ "origin": "CommonsBase_FileMagic",
376
+ "path": "CommonsBase_FileMagic-any-Windows_arm64.package.cts.1.tracestore",
377
+ "size": 36035
378
+ },
379
+ {
380
+ "checksum": {
381
+ "blake2b256": "ef1112ab1f00f803200cbb792393a27460d2fd9c8ef9fd536db66c3e2460fd13"
382
+ },
383
+ "indexes": [
384
+ {
385
+ "type": "zip",
386
+ "zip": {
387
+ "local_offset": 0,
388
+ "central_offset": 224167713,
389
+ "central_size": 6083,
390
+ "checksum": {
391
+ "blake2b256": "baa5928380f611a3bdc910d35daf0d217375421e0abbb32311faacfd82c24f9d"
392
+ }
393
+ }
394
+ }
395
+ ],
396
+ "origin": "CommonsBase_FileMagic",
397
+ "path": "CommonsBase_FileMagic-any-Windows_arm64.package.valuestore.zip",
398
+ "size": 224173796
399
+ },
400
+ {
401
+ "checksum": {
402
+ "blake2b256": "11b7f4ba5b78db5cf7774c592afad9038e479ae4a82b63f764a3da34bca0d431"
403
+ },
404
+ "origin": "CommonsBase_FileMagic",
405
+ "path": "CommonsBase_FileMagic-any-Windows_x86.distmeta.cts.1.tracestore",
406
+ "size": 45003
407
+ },
408
+ {
409
+ "checksum": {
410
+ "blake2b256": "1d741a1754855e64094523d0eee474882f87bf7e28b3f756200bdda13b1f37e8"
411
+ },
412
+ "indexes": [
413
+ {
414
+ "type": "zip",
415
+ "zip": {
416
+ "local_offset": 0,
417
+ "central_offset": 8188,
418
+ "central_size": 534,
419
+ "checksum": {
420
+ "blake2b256": "09cc3798c1b74c7f80e031bb3b8ba96c956617f51734f1018e1401a4b0d6d13c"
421
+ }
422
+ }
423
+ }
424
+ ],
425
+ "origin": "CommonsBase_FileMagic",
426
+ "path": "CommonsBase_FileMagic-any-Windows_x86.distmeta.manifest.zip",
427
+ "size": 8722
428
+ },
429
+ {
430
+ "checksum": {
431
+ "blake2b256": "e76756c37d7412984bb57c33e34fccec1b0f0f507c30d5ea28ed1bba6b0423eb"
432
+ },
433
+ "indexes": [
434
+ {
435
+ "type": "zip",
436
+ "zip": {
437
+ "local_offset": 0,
438
+ "central_offset": 21430,
439
+ "central_size": 308,
440
+ "checksum": {
441
+ "blake2b256": "413c99d1218f2ba72ab7a17d2e209984d2483888864a8b816552c387ddef4b79"
442
+ }
443
+ }
444
+ }
445
+ ],
446
+ "origin": "CommonsBase_FileMagic",
447
+ "path": "CommonsBase_FileMagic-any-Windows_x86.distmeta.valuestore.zip",
448
+ "size": 21738
449
+ },
450
+ {
451
+ "checksum": {
452
+ "blake2b256": "a9ce31fa818cd98447b2743eb8135ae400a64d408fb166aeecb2ad3dbd153670"
453
+ },
454
+ "origin": "CommonsBase_FileMagic",
455
+ "path": "CommonsBase_FileMagic-any-Windows_x86.package.cts.1.tracestore",
456
+ "size": 36025
457
+ },
458
+ {
459
+ "checksum": {
460
+ "blake2b256": "5a12e9b3476250ebe479a1102cc1b2c9dadcf48d03253e9b6f0a81f70195b4b7"
461
+ },
462
+ "indexes": [
463
+ {
464
+ "type": "zip",
465
+ "zip": {
466
+ "local_offset": 0,
467
+ "central_offset": 224284181,
468
+ "central_size": 6083,
469
+ "checksum": {
470
+ "blake2b256": "0d9bbaed78d10a9ea1734e6ba5d927d66f54cbcebd0761ce4b5c708b819a84ae"
471
+ }
472
+ }
473
+ }
474
+ ],
475
+ "origin": "CommonsBase_FileMagic",
476
+ "path": "CommonsBase_FileMagic-any-Windows_x86.package.valuestore.zip",
477
+ "size": 224290264
478
+ },
479
+ {
480
+ "checksum": {
481
+ "blake2b256": "11b7f4ba5b78db5cf7774c592afad9038e479ae4a82b63f764a3da34bca0d431"
482
+ },
483
+ "origin": "CommonsBase_FileMagic",
484
+ "path": "CommonsBase_FileMagic-any-Windows_x86_64.distmeta.cts.1.tracestore",
485
+ "size": 45003
486
+ },
487
+ {
488
+ "checksum": {
489
+ "blake2b256": "1d741a1754855e64094523d0eee474882f87bf7e28b3f756200bdda13b1f37e8"
490
+ },
491
+ "indexes": [
492
+ {
493
+ "type": "zip",
494
+ "zip": {
495
+ "local_offset": 0,
496
+ "central_offset": 8188,
497
+ "central_size": 534,
498
+ "checksum": {
499
+ "blake2b256": "09cc3798c1b74c7f80e031bb3b8ba96c956617f51734f1018e1401a4b0d6d13c"
500
+ }
501
+ }
502
+ }
503
+ ],
504
+ "origin": "CommonsBase_FileMagic",
505
+ "path": "CommonsBase_FileMagic-any-Windows_x86_64.distmeta.manifest.zip",
506
+ "size": 8722
507
+ },
508
+ {
509
+ "checksum": {
510
+ "blake2b256": "e76756c37d7412984bb57c33e34fccec1b0f0f507c30d5ea28ed1bba6b0423eb"
511
+ },
512
+ "indexes": [
513
+ {
514
+ "type": "zip",
515
+ "zip": {
516
+ "local_offset": 0,
517
+ "central_offset": 21430,
518
+ "central_size": 308,
519
+ "checksum": {
520
+ "blake2b256": "413c99d1218f2ba72ab7a17d2e209984d2483888864a8b816552c387ddef4b79"
521
+ }
522
+ }
523
+ }
524
+ ],
525
+ "origin": "CommonsBase_FileMagic",
526
+ "path": "CommonsBase_FileMagic-any-Windows_x86_64.distmeta.valuestore.zip",
527
+ "size": 21738
528
+ },
529
+ {
530
+ "checksum": {
531
+ "blake2b256": "6eedba40a462cb05ad2299d2d8849061c0d270587d69016d209c69c39a34586d"
532
+ },
533
+ "origin": "CommonsBase_FileMagic",
534
+ "path": "CommonsBase_FileMagic-any-Windows_x86_64.package.cts.1.tracestore",
535
+ "size": 36044
536
+ },
537
+ {
538
+ "checksum": {
539
+ "blake2b256": "79c137c76ff0198c0321eed6e466fdbdf14de511f07d7873accca054259241d7"
540
+ },
541
+ "indexes": [
542
+ {
543
+ "type": "zip",
544
+ "zip": {
545
+ "local_offset": 0,
546
+ "central_offset": 224221921,
547
+ "central_size": 6083,
548
+ "checksum": {
549
+ "blake2b256": "4ac56e690c1efb5fd336b54b1a4a450984bc975b8588a9eb52f06c12db01531b"
550
+ }
551
+ }
552
+ }
553
+ ],
554
+ "origin": "CommonsBase_FileMagic",
555
+ "path": "CommonsBase_FileMagic-any-Windows_x86_64.package.valuestore.zip",
556
+ "size": 224228004
557
+ }
558
+ ],
559
+ "id": "CommonsBase_FileMagic.Distribution@0.1.20260920144347",
560
+ "listing": {
561
+ "origins": [
562
+ {
563
+ "name": "CommonsBase_FileMagic",
564
+ "mirrors": [
565
+ "https://github.com/dkpkg/CommonsBase_FileMagic/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":"MIIHnjCCBySgAwIBAgIUZ2Yy4wPJMCIjEfSn/dn4vIEnJxMwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwOTIwMTUwNjU5WhcNMjYwOTIwMTUxNjU5WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5Mk2Z028gHIj3GELZ2rrbEb2RJaTdcCxpKibGnLHm16nT0fnz+4gPzn+EdM+XdTcjBrBStOJ0LU4dVgwJntjhqOCBkMwggY/MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUnLQ8nrV4xOwfgTMolDtoppGNEs0wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wfgYDVR0RAQH/BHQwcoZwaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX0ZpbGVNYWdpYy8uZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTAuMS55bWxAcmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NzA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMBIGCisGAQQBg78wAQIEBHB1c2gwNgYKKwYBBAGDvzABAwQoNWRkMmY3MzhmZTdjZWRhN2ZkOTgxMTc0MzE0ZWNiNzAzY2MwNWRiMDApBgorBgEEAYO/MAEEBBtDb21tb25zQmFzZV9GaWxlTWFnaWNAMC4xLngwKQYKKwYBBAGDvzABBQQbZGtwa2cvQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljMCoGCisGAQQBg78wAQYEHHJlZnMvdGFncy8wLjEuMjAyNjA5MjAxNDQzNDcwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGABgorBgEEAYO/MAEJBHIMcGh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zQmFzZV9GaWxlTWFnaWMvLmdpdGh1Yi93b3JrZmxvd3MvZGlzdHJpYnV0ZS0wLjEueW1sQHJlZnMvdGFncy8wLjEuMjAyNjA5MjAxNDQzNDcwOAYKKwYBBAGDvzABCgQqDCg1ZGQyZjczOGZlN2NlZGE3ZmQ5ODExNzQzMTRlY2I3MDNjYzA1ZGIwMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDA+BgorBgEEAYO/MAEMBDAMLmh0dHBzOi8vZ2l0aHViLmNvbS9ka3BrZy9Db21tb25zQmFzZV9GaWxlTWFnaWMwOAYKKwYBBAGDvzABDQQqDCg1ZGQyZjczOGZlN2NlZGE3ZmQ5ODExNzQzMTRlY2I3MDNjYzA1ZGIwMCwGCisGAQQBg78wAQ4EHgwccmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NzAaBgorBgEEAYO/MAEPBAwMCjEyNDAxNTc2MzMwKAYKKwYBBAGDvzABEAQaDBhodHRwczovL2dpdGh1Yi5jb20vZGtwa2cwGQYKKwYBBAGDvzABEQQLDAkyNzg5MTM1MDAwgYAGCisGAQQBg78wARIEcgxwaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX0ZpbGVNYWdpYy8uZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTAuMS55bWxAcmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NzA4BgorBgEEAYO/MAETBCoMKDVkZDJmNzM4ZmU3Y2VkYTdmZDk4MTE3NDMxNGVjYjcwM2NjMDVkYjAwFAYKKwYBBAGDvzABFAQGDARwdXNoMGIGCisGAQQBg78wARUEVAxSaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX0ZpbGVNYWdpYy9hY3Rpb25zL3J1bnMvMzU1MTgzODE3NzIvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzBRBgorBgEEAYO/MAEYBEMMQXJlcG86ZGtwa2cvQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljOnJlZjpyZWZzL3RhZ3MvMC4xLjIwMjYwOTIwMTQ0MzQ3MIGKBgorBgEEAdZ5AgQCBHwEegB4AHYA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGgv1swLAAABAMARzBFAiEA+dx+pc3y7DkfXnDgto2LgDGstkA14y/YgqQzaTcrdLECIFyBfI3GhjdS/Mymg/iChzm8fCczuS5RN3zRhu/Em1vOMAoGCCqGSM49BAMDA2gAMGUCMQDCKCWSO3QBnelI6XgJpf59NcK/34RlqePmF4YvwR67g2Q33omVhwBveX6AsH+nm4oCMDXbFx98w9ihDPB+wpyP8x0IsF/ih2XAaY0Do8RP5LYTV2p8MeK4bc3QP60EQ2kHhA=="},"tlogEntries":[{"logIndex":"2900655837","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"dsse","version":"0.0.1"},"integratedTime":"1789916819","inclusionPromise":{"signedEntryTimestamp":"MEQCIE1R8l7txDrvRN9HKLvv2v0G6hV0W19MGmaDbZ/s/bgVAiBSytqv3Hh6bVxQrh0U2AsmmgZzkhZNviBlzWfJP2G9EA=="},"inclusionProof":{"logIndex":"2778751575","rootHash":"OdhVCCh90T6ybmCB/935K3lXwHxKRbI2O/4pAD7L3tA=","treeSize":"2778751595","hashes":["7AXSmxtkYoqbtkBuzlUbJ+QAiRfMQ/z4IRWNV+wm0no=","lN5vFWRg3n8+hzc9gtV5jl0tBgQsyZ5VLSSuoowL6Lk=","XA55vxJLEgBRmbrsaV/QZafnfO/w/E2VN6FSXYNzpSI=","KQKtwMeHyFNyC8t6HGi9r7KbunRyPC9UTcRQJXRsV8k=","e8/2ZtxKCt0zE2FWSm0wRkE9RAr5+k5It0j1TtlR6UQ=","MzuBQfcrm9abE1jHdvsOSLu/L444qgcrlk/Nxc7rx8c=","TtRXBUgUdd/ylhfxcNKgfH66dh5aBEZqCdSCQcRYOck=","3g032kFIWCO7qdmEnO18kCGmrNVjSui9KHEMdmev5fs=","2BhxRJZnp2SOARJoaZuG9YAGF4M8pYsgG/Y7YnQ0qSg=","4Pu1QTwCEian9FkpkRjHR6AvAT2OEr09QWPuCRcqA2E=","uoMJ++IgguD5VRdcuqQ23KlKD9ZqrcoC6hqQDy2rPFM=","tyO4Oj1UrXex15tzrEEO6sSnE8y8obZWghZ2XixBPtE=","rjDiNJHGnboMYYUH7OSezbKWj3wMXRTHGCLa/SaZ6O4=","mfWjSdNaEfNXxDww6AAOw/NoK9e6z1yKaZm5xvmMabs=","qxzHanAzz57SDdmJe0B7bJK72NTIBbwEMGBBKvDOROw=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2778751595\nOdhVCCh90T6ybmCB/935K3lXwHxKRbI2O/4pAD7L3tA=\n\n— rekor.sigstore.dev wNI9ajBGAiEAry4wFBtBWLeVGCyWfgGmwdcrSJJCo17PPJ93SdMr59wCIQDGPOBQYg1JKkqTXgBXDTa4SuN9QMxrqGsZmefdAeCIJg==\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiMjliMDdmMjAzZTU0NjhkZTc3MzI2ZGIxMjQwZGJmOTY4OGM4NjI0MWVjNmZlODU4NGRjZWI1OGM2YTVjMzQzMSJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjQ1Yzk3NDIyOGIwYjZjMzBlYTI0NjJmNDYyMzJmMWFlMmQ1YjE5YjEwZDA4ZjcyY2I4YzBiNjc3MmU2NWY1MjMifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVVQ0lEQjAydFpUSUVWampEMkFnYmNGSTlrNklDSXEzV2l0dkJPUmR2c3I3S1RwQWlFQXdSZkFjY0dmdEtIKzJoTFhWams0bTMxb1MrczlMa0txU2VzQW45c01JUVE9IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VodWFrTkRRbmxUWjBGM1NVSkJaMGxWV2pKWmVUUjNVRXBOUTBscVJXWlRiaTlrYmpSMlNVVnVTbmhOZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwWmQwOVVTWGROVkZWM1RtcFZOVmRvWTA1TmFsbDNUMVJKZDAxVVZYaE9hbFUxVjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVTFUV3N5V2pBeU9HZElTV296UjBWTVdqSnljbUpGWWpKU1NtRlVaR05EZUhCTGFXSUtSMjVNU0cweE5tNVVNR1p1ZWlzMFoxQjZiaXRGWkUwcldHUlVZMnBDY2tKVGRFOUtNRXhWTkdSV1ozZEtiblJxYUhGUFEwSnJUWGRuWjFrdlRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVnVURkU0Q201eVZqUjRUM2RtWjFSTmIyeEVkRzl3Y0VkT1JYTXdkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMlpuV1VSV1VqQlNRVkZJTDBKSVVYZGpiMXAzWVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBUREpTY21OSGRHNU1NRTUyWWxjeGRncGliazVEV1ZoT2JGZ3dXbkJpUjFaT1dWZGtjRmw1T0hWYU1td3dZVWhXYVV3elpIWmpiWFJ0WWtjNU0yTjVPV3RoV0U0d1kyMXNhV1JZVW14TVZFRjFDazFUTlRWaVYzaEJZMjFXYldONU9UQlpWMlI2VEhwQmRVMVROSGxOUkVreVRVUnJlVTFFUlRCT1JFMHdUbnBCTlVKbmIzSkNaMFZGUVZsUEwwMUJSVUlLUWtOMGIyUklVbmRqZW05MlRETlNkbUV5Vm5WTWJVWnFaRWRzZG1KdVRYVmFNbXd3WVVoV2FXUllUbXhqYlU1MlltNVNiR0p1VVhWWk1qbDBUVUpKUndwRGFYTkhRVkZSUW1jM09IZEJVVWxGUWtoQ01XTXlaM2RPWjFsTFMzZFpRa0pCUjBSMmVrRkNRWGRSYjA1WFVtdE5iVmt6VFhwb2JWcFVaR3BhVjFKb0NrNHlXbXRQVkdkNFRWUmpNRTE2UlRCYVYwNXBUbnBCZWxreVRYZE9WMUpwVFVSQmNFSm5iM0pDWjBWRlFWbFBMMDFCUlVWQ1FuUkVZakl4ZEdJeU5Yb0tVVzFHZWxwV09VZGhWM2hzVkZkR2JtRlhUa0ZOUXpSNFRHNW5kMHRSV1V0TGQxbENRa0ZIUkhaNlFVSkNVVkZpV2tkMGQyRXlZM1pSTWpsMFlsYzVkUXBqTUVwb1l6SldabEp0YkhOYVZURm9XakpzYWsxRGIwZERhWE5IUVZGUlFtYzNPSGRCVVZsRlNFaEtiRnB1VFhaa1IwWnVZM2s0ZDB4cVJYVk5ha0Y1Q2s1cVFUVk5ha0Y0VGtSUmVrNUVZM2RQZDFsTFMzZFpRa0pCUjBSMmVrRkNRMEZSZEVSRGRHOWtTRkozWTNwdmRrd3pVblpoTWxaMVRHMUdhbVJIYkhZS1ltNU5kVm95YkRCaFNGWnBaRmhPYkdOdFRuWmlibEpzWW01UmRWa3lPWFJOU1VkQlFtZHZja0puUlVWQldVOHZUVUZGU2tKSVNVMWpSMmd3WkVoQ2VncFBhVGgyV2pKc01HRklWbWxNYlU1MllsTTVhMkV6UW5KYWVUbEVZakl4ZEdJeU5YcFJiVVo2V2xZNVIyRlhlR3hVVjBadVlWZE5ka3h0WkhCa1IyZ3hDbGxwT1ROaU0wcHlXbTE0ZG1RelRYWmFSMng2WkVoS2NGbHVWakJhVXpCM1RHcEZkV1ZYTVhOUlNFcHNXbTVOZG1SSFJtNWplVGgzVEdwRmRVMXFRWGtLVG1wQk5VMXFRWGhPUkZGNlRrUmpkMDlCV1V0TGQxbENRa0ZIUkhaNlFVSkRaMUZ4UkVObk1WcEhVWGxhYW1ONlQwZGFiRTR5VG14YVIwVXpXbTFSTlFwUFJFVjRUbnBSZWsxVVVteFpNa2t6VFVST2FsbDZRVEZhUjBsM1RVSXdSME5wYzBkQlVWRkNaemM0ZDBGUmMwVkVkM2RPV2pKc01HRklWbWxNVjJoMkNtTXpVbXhhUkVFclFtZHZja0puUlVWQldVOHZUVUZGVFVKRVFVMU1iV2d3WkVoQ2VrOXBPSFphTW13d1lVaFdhVXh0VG5aaVV6bHJZVE5DY2xwNU9VUUtZakl4ZEdJeU5YcFJiVVo2V2xZNVIyRlhlR3hVVjBadVlWZE5kMDlCV1V0TGQxbENRa0ZIUkhaNlFVSkVVVkZ4UkVObk1WcEhVWGxhYW1ONlQwZGFiQXBPTWs1c1drZEZNMXB0VVRWUFJFVjRUbnBSZWsxVVVteFpNa2t6VFVST2FsbDZRVEZhUjBsM1RVTjNSME5wYzBkQlVWRkNaemM0ZDBGUk5FVklaM2RqQ21OdFZtMWplVGt3V1Zka2VreDZRWFZOVXpSNVRVUkpNazFFYTNsTlJFVXdUa1JOTUU1NlFXRkNaMjl5UW1kRlJVRlpUeTlOUVVWUVFrRjNUVU5xUlhrS1RrUkJlRTVVWXpKTmVrMTNTMEZaUzB0M1dVSkNRVWRFZG5wQlFrVkJVV0ZFUW1odlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5XcGlNakIyV2tkMGR3cGhNbU4zUjFGWlMwdDNXVUpDUVVkRWRucEJRa1ZSVVV4RVFXdDVUbnBuTlUxVVRURk5SRUYzWjFsQlIwTnBjMGRCVVZGQ1p6YzRkMEZTU1VWalozaDNDbUZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRFd3lVbkpqUjNSdVREQk9kbUpYTVhaaWJrNURXVmhPYkZnd1duQmlSMVpPV1Zka2NGbDVPSFVLV2pKc01HRklWbWxNTTJSMlkyMTBiV0pIT1ROamVUbHJZVmhPTUdOdGJHbGtXRkpzVEZSQmRVMVROVFZpVjNoQlkyMVdiV041T1RCWlYyUjZUSHBCZFFwTlV6UjVUVVJKTWsxRWEzbE5SRVV3VGtSTk1FNTZRVFJDWjI5eVFtZEZSVUZaVHk5TlFVVlVRa052VFV0RVZtdGFSRXB0VG5wTk5GcHRWVE5aTWxackNsbFVaRzFhUkdzMFRWUkZNMDVFVFhoT1IxWnFXV3BqZDAweVRtcE5SRlpyV1dwQmQwWkJXVXRMZDFsQ1FrRkhSSFo2UVVKR1FWRkhSRUZTZDJSWVRtOEtUVWRKUjBOcGMwZEJVVkZDWnpjNGQwRlNWVVZXUVhoVFlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKU2NtTkhkRzVNTUU1MllsY3hkZ3BpYms1RFdWaE9iRmd3V25CaVIxWk9XVmRrY0ZsNU9XaFpNMUp3WWpJMWVrd3pTakZpYmsxMlRYcFZNVTFVWjNwUFJFVXpUbnBKZGxsWVVqQmFWekYzQ21SSVRYWk5WRUZYUW1kdmNrSm5SVVZCV1U4dlRVRkZWMEpCWjAxQ2JrSXhXVzE0Y0ZsNlFsSkNaMjl5UW1kRlJVRlpUeTlOUVVWWlFrVk5UVkZZU213S1kwYzRObHBIZEhkaE1tTjJVVEk1ZEdKWE9YVmpNRXBvWXpKV1psSnRiSE5hVlRGb1dqSnNhazl1U214YWFuQjVXbGRhZWt3elVtaGFNMDEyVFVNMGVBcE1ha2wzVFdwWmQwOVVTWGROVkZFd1RYcFJNMDFKUjB0Q1oyOXlRbWRGUlVGa1dqVkJaMUZEUWtoM1JXVm5RalJCU0ZsQk0xUXdkMkZ6WWtoRlZFcHFDa2RTTkdOdFYyTXpRWEZLUzFoeWFtVlFTek12YURSd2VXZERPSEEzYnpSQlFVRkhaM1l4YzNkTVFVRkJRa0ZOUVZKNlFrWkJhVVZCSzJSNEszQmpNM2tLTjBSclpsaHVSR2QwYnpKTVowUkhjM1JyUVRFMGVTOVpaM0ZSZW1GVVkzSmtURVZEU1VaNVFtWkpNMGRvYW1SVEwwMTViV2N2YVVOb2VtMDRaa05qZWdwMVV6VlNUak42VW1oMUwwVnRNWFpQVFVGdlIwTkRjVWRUVFRRNVFrRk5SRUV5WjBGTlIxVkRUVkZFUTB0RFYxTlBNMUZDYm1Wc1NUWllaMHB3WmpVNUNrNWpTeTh6TkZKc2NXVlFiVVkwV1haM1VqWTNaekpSTXpOdmJWWm9kMEoyWlZnMlFYTklLMjV0Tkc5RFRVUllZa1o0T1RoM09XbG9SRkJDSzNkd2VWQUtPSGd3U1hOR0wybG9NbGhCWVZrd1JHODRVbEExVEZsVVZqSndPRTFsU3pSaVl6TlJVRFl3UlZFeWEwaG9RVDA5Q2kwdExTMHRSVTVFSUVORlVsUkpSa2xEUVZSRkxTMHRMUzBLIn1dfX0="}],"timestampVerificationData":{}},"dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjEiLCJzdWJqZWN0IjpbeyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1EYXJ3aW5fYXJtNjQuZGlzdG1ldGEuY3RzLjEudHJhY2VzdG9yZSIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2ODQyZjQ1ZTZjYzEyYmZhNmE4YTNjZDNmMjVmZDlmNGE5YTFkMmIwZmE3MTk0Y2Y1OWQ5MjYwNzJiYzIxMjc5In19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktRGFyd2luX2FybTY0LmRpc3RtZXRhLm1hbmlmZXN0LnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2ODdiYjZkZDBiZjQwOGU3OGI1Y2Q3ZjU5NmRmODVjZDQwYzM4Yzg0MjIwZDJiMmRmYWU1ZTc4MjAwMDA3MDg4In19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktRGFyd2luX2FybTY0LmRpc3RtZXRhLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiN2YxODQzNDI0YzA1ZjFmZWMzZTUxMGViNTVmYzk4MWU4NjAyNGVhMmZmMTM1Y2Q0ODUwNWFmYWY0ZTQ0MzlhNiJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LURhcndpbl9hcm02NC5kaXN0bWV0YS52YWx1ZXN0b3JlLnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiIyZWNlYjI5M2RmOTUzYzBiMDRjOWI0NDljNTFiNGRiNmU2ZTBmN2NiMmU3NzJhMzA0MzhmY2JmMmViYWRmOGFmIn19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktRGFyd2luX2FybTY0LnBhY2thZ2UuY3RzLjEudHJhY2VzdG9yZSIsImRpZ2VzdCI6eyJzaGEyNTYiOiI4NGE2Yzc1MDBlZTNiMmY1ODFlNGI1OTBhZDQ1N2Y1ZDQ0ODcyZDA5ZGFjNTU4ZGJhMTYwMjQ1NzhmNWU5MGZiIn19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktRGFyd2luX2FybTY0LnBhY2thZ2UudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI0YzA4MDZiZGQ4MGZmOGE1MDAxNjM2MzllYTg2YzcxYmM0NTNkNzQ3MjRkYjk4OTI3ZjIxMzA1MDA2OTNlZjIxIn19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktRGFyd2luX2FybTY0LnBhY2thZ2UudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiZTg0MTI2NjI5Njc4YmNiZGFkMWVjYmE0MDA4NjJiOGRkNjA5N2JhY2YxY2Y2M2NhNTNmMTA5N2QwMjdmZGFiOCJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LURhcndpbl9hcm02NC52YWx1ZXMuanNvbiIsImRpZ2VzdCI6eyJzaGEyNTYiOiI0ZDc4ZWViNzAyNzNiMmYwODIwNWI2MjRmNDY0Mjk4MTM3ZTliYWU5OWIwMDFjMzc5YzNhOGYxZmJkZTJhYTRjIn19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktRGFyd2luX3g4Nl82NC5kaXN0bWV0YS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjY4NDJmNDVlNmNjMTJiZmE2YThhM2NkM2YyNWZkOWY0YTlhMWQyYjBmYTcxOTRjZjU5ZDkyNjA3MmJjMjEyNzkifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1EYXJ3aW5feDg2XzY0LmRpc3RtZXRhLm1hbmlmZXN0LnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2ODdiYjZkZDBiZjQwOGU3OGI1Y2Q3ZjU5NmRmODVjZDQwYzM4Yzg0MjIwZDJiMmRmYWU1ZTc4MjAwMDA3MDg4In19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktRGFyd2luX3g4Nl82NC5kaXN0bWV0YS52YWx1ZXN0b3JlLmluZGV4IiwiZGlnZXN0Ijp7InNoYTI1NiI6IjdmMTg0MzQyNGMwNWYxZmVjM2U1MTBlYjU1ZmM5ODFlODYwMjRlYTJmZjEzNWNkNDg1MDVhZmFmNGU0NDM5YTYifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1EYXJ3aW5feDg2XzY0LmRpc3RtZXRhLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjJlY2ViMjkzZGY5NTNjMGIwNGM5YjQ0OWM1MWI0ZGI2ZTZlMGY3Y2IyZTc3MmEzMDQzOGZjYmYyZWJhZGY4YWYifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1EYXJ3aW5feDg2XzY0LnBhY2thZ2UuY3RzLjEudHJhY2VzdG9yZSIsImRpZ2VzdCI6eyJzaGEyNTYiOiI0NzJhY2ZkNTYxOTdlNGM5NTY5M2ExZGVlOWEyODM1YmJiODgwODg0MTY3ZDA2ZTFkZDI0YWNmNDA1ODMwNGVmIn19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktRGFyd2luX3g4Nl82NC5wYWNrYWdlLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiMzAwY2NmNWUzZjA1MDA4YzZkZTlkNmM4MmM4N2IwY2ZjYTMxNjg2ZTM4YzE3MWU0NDFhMTMxZmJmOGM5YTAwYyJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LURhcndpbl94ODZfNjQucGFja2FnZS52YWx1ZXN0b3JlLnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI5NmU0YjVhOWQxOTkxOGVmZWU4MDA4M2Q0MzJlMDc5OTU0ZmU5NmI2Nzk1MDc1NzVkY2NjZjIxNTgwMDg1Yzc2In19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktRGFyd2luX3g4Nl82NC52YWx1ZXMuanNvbiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJhMGMwMzBlNGViODBkNzRmZDI1MDEyYTJhNDFjMzU2NTk3MDhjMmRmMmYwZWM4ZjM1ZDJjMzNhZjFkZjcwYjM1In19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktTGludXhfeDg2LmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiNjg0MmY0NWU2Y2MxMmJmYTZhOGEzY2QzZjI1ZmQ5ZjRhOWExZDJiMGZhNzE5NGNmNTlkOTI2MDcyYmMyMTI3OSJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LUxpbnV4X3g4Ni5kaXN0bWV0YS5tYW5pZmVzdC56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiNjg3YmI2ZGQwYmY0MDhlNzhiNWNkN2Y1OTZkZjg1Y2Q0MGMzOGM4NDIyMGQyYjJkZmFlNWU3ODIwMDAwNzA4OCJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LUxpbnV4X3g4Ni5kaXN0bWV0YS52YWx1ZXN0b3JlLmluZGV4IiwiZGlnZXN0Ijp7InNoYTI1NiI6IjdmMTg0MzQyNGMwNWYxZmVjM2U1MTBlYjU1ZmM5ODFlODYwMjRlYTJmZjEzNWNkNDg1MDVhZmFmNGU0NDM5YTYifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1MaW51eF94ODYuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiMmVjZWIyOTNkZjk1M2MwYjA0YzliNDQ5YzUxYjRkYjZlNmUwZjdjYjJlNzcyYTMwNDM4ZmNiZjJlYmFkZjhhZiJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LUxpbnV4X3g4Ni5wYWNrYWdlLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiNzg0MDU3NmNjMjE1MTQyZDZhZjIzNTRjYmFkZDFhMWFjMDMyNzgwM2JiMWUxZWZhZDQ3NTQwNzU4ZjZhZDBhNyJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LUxpbnV4X3g4Ni5wYWNrYWdlLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiYjcyNzU3YTA0NzM1OTExMzFkMzg1OTdiMzk0OGE5M2JhZTllMmY4ZWU5NmFhMjlhZWQwN2FmZDI5ZWM3MmRlMCJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LUxpbnV4X3g4Ni5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjA2NTBiM2JmYjQ3NmU0MGMwMjJmYmEzNTgzYmY2YzQ3YjQ2OWRjZDRkMmQyMzVkNjU1YWFhYzQ2MWVkZDk1NGEifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1MaW51eF94ODYudmFsdWVzLmpzb24iLCJkaWdlc3QiOnsic2hhMjU2IjoiN2FhNmEwYjY5NTYyMTNlMGZhNzM5M2YzNGQ4MjhkNGU4N2I5NDZiOTE0ZDhiOWFmZmVlMDY1YjBiOGJlMmFjMiJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LUxpbnV4X3g4Nl82NC5kaXN0bWV0YS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjY4NDJmNDVlNmNjMTJiZmE2YThhM2NkM2YyNWZkOWY0YTlhMWQyYjBmYTcxOTRjZjU5ZDkyNjA3MmJjMjEyNzkifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1MaW51eF94ODZfNjQuZGlzdG1ldGEubWFuaWZlc3QuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjY4N2JiNmRkMGJmNDA4ZTc4YjVjZDdmNTk2ZGY4NWNkNDBjMzhjODQyMjBkMmIyZGZhZTVlNzgyMDAwMDcwODgifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1MaW51eF94ODZfNjQuZGlzdG1ldGEudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI3ZjE4NDM0MjRjMDVmMWZlYzNlNTEwZWI1NWZjOTgxZTg2MDI0ZWEyZmYxMzVjZDQ4NTA1YWZhZjRlNDQzOWE2In19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktTGludXhfeDg2XzY0LmRpc3RtZXRhLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjJlY2ViMjkzZGY5NTNjMGIwNGM5YjQ0OWM1MWI0ZGI2ZTZlMGY3Y2IyZTc3MmEzMDQzOGZjYmYyZWJhZGY4YWYifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1MaW51eF94ODZfNjQucGFja2FnZS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjQ4YTQzNjU5NWE3NzBhZTVmNmM1NTA4MWZkYmE1NjIxNTVhM2JkMzdjYjQyMDRjMzYxNjU0ZjMxZTRlNDg4ZDUifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1MaW51eF94ODZfNjQucGFja2FnZS52YWx1ZXN0b3JlLmluZGV4IiwiZGlnZXN0Ijp7InNoYTI1NiI6IjA3YzI3NTU0YWJjZDNkMDY1MzExZjI4Yjk5NTllZDZjMmQzYTM1ODRmNDgxNmMxNGJiYmUzMGE0NTU0MTI3NDAifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1MaW51eF94ODZfNjQucGFja2FnZS52YWx1ZXN0b3JlLnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiJmODkyM2Y5YTg0OWYzMWJiYTFiYWExY2RkNDJiMjgzYjg4MDJmMTMzODBlNDEyZDFmMTYwYjE1MWY2MTczZjI2In19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktTGludXhfeDg2XzY0LnZhbHVlcy5qc29uIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImZkOTRhZTM0MWM3YzI4NzYwNjRlZDYwNjgxNmE5ODYxMjk1NGZkMzAyNDdhOGIwYTJjZWM3M2M2ZDYyYmY4MDQifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1XaW5kb3dzX2FybTY0LmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiNjg0MmY0NWU2Y2MxMmJmYTZhOGEzY2QzZjI1ZmQ5ZjRhOWExZDJiMGZhNzE5NGNmNTlkOTI2MDcyYmMyMTI3OSJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LVdpbmRvd3NfYXJtNjQuZGlzdG1ldGEubWFuaWZlc3QuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjY4N2JiNmRkMGJmNDA4ZTc4YjVjZDdmNTk2ZGY4NWNkNDBjMzhjODQyMjBkMmIyZGZhZTVlNzgyMDAwMDcwODgifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1XaW5kb3dzX2FybTY0LmRpc3RtZXRhLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiN2YxODQzNDI0YzA1ZjFmZWMzZTUxMGViNTVmYzk4MWU4NjAyNGVhMmZmMTM1Y2Q0ODUwNWFmYWY0ZTQ0MzlhNiJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LVdpbmRvd3NfYXJtNjQuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiMmVjZWIyOTNkZjk1M2MwYjA0YzliNDQ5YzUxYjRkYjZlNmUwZjdjYjJlNzcyYTMwNDM4ZmNiZjJlYmFkZjhhZiJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LVdpbmRvd3NfYXJtNjQucGFja2FnZS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImYxNjIxNWFmMTNkZmVhYWI0ZTY1ZWVjZTJkYWY0YTQ0ZmZmNGIxOGZjYzVkMGNmODYxNzhlOTgzMzgwNDAzMmMifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1XaW5kb3dzX2FybTY0LnBhY2thZ2UudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiJmODRiZTNjYjA1YTBkMDY2OTE2ZGMzNjk0Mzk0ZDA1ZmZjM2M1YmM4ZGI2OTZhMDMxY2U3ZjQ1M2Y1MGVmNmQyIn19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktV2luZG93c19hcm02NC5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6Ijg2YmJkOTFiOWM4NmEwMDE4MmRhYmJlYjc5NTM4MWNkNDQ1Mjg5YzhmOWFhZDQ2NzNhOTRkNmJhMjgyZmYxMDcifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1XaW5kb3dzX2FybTY0LnZhbHVlcy5qc29uIiwiZGlnZXN0Ijp7InNoYTI1NiI6Ijg3NDNmZTA1NzhmNWFiYTgyMjVlNzA3NzFkNDFjY2ExOWRmNDgwYzBiYWI5NTg3YmRjOWJkODkzZWFlOTI2NzcifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1XaW5kb3dzX3g4Ni5kaXN0bWV0YS5jdHMuMS50cmFjZXN0b3JlIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjY4NDJmNDVlNmNjMTJiZmE2YThhM2NkM2YyNWZkOWY0YTlhMWQyYjBmYTcxOTRjZjU5ZDkyNjA3MmJjMjEyNzkifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1XaW5kb3dzX3g4Ni5kaXN0bWV0YS5tYW5pZmVzdC56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiNjg3YmI2ZGQwYmY0MDhlNzhiNWNkN2Y1OTZkZjg1Y2Q0MGMzOGM4NDIyMGQyYjJkZmFlNWU3ODIwMDAwNzA4OCJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LVdpbmRvd3NfeDg2LmRpc3RtZXRhLnZhbHVlc3RvcmUuaW5kZXgiLCJkaWdlc3QiOnsic2hhMjU2IjoiN2YxODQzNDI0YzA1ZjFmZWMzZTUxMGViNTVmYzk4MWU4NjAyNGVhMmZmMTM1Y2Q0ODUwNWFmYWY0ZTQ0MzlhNiJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LVdpbmRvd3NfeDg2LmRpc3RtZXRhLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjJlY2ViMjkzZGY5NTNjMGIwNGM5YjQ0OWM1MWI0ZGI2ZTZlMGY3Y2IyZTc3MmEzMDQzOGZjYmYyZWJhZGY4YWYifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1XaW5kb3dzX3g4Ni5wYWNrYWdlLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiMTBmODhkYTIyYjA0OGExMjYwYTg0N2Q1ZmY0NWU1MDVmOGE4NWE5NGE2YWM4ZjY0MGRjYzU4NWY1Y2IxMmRlOSJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LVdpbmRvd3NfeDg2LnBhY2thZ2UudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiJjZGZlMzc4NmUxNjMzNzQ1NjRlMmZmMmNlNGIwZDE4ZjNlYTc5YzViOTQ3NDcyZTcwZDFjMWE4NTYyMmU2OGI2In19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktV2luZG93c194ODYucGFja2FnZS52YWx1ZXN0b3JlLnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiIyOTMxMGUxNDg4ZjhjYTMwZDk2NzRmMWIxM2U0ZDA3YzNkMDg1M2MwYmIyYzJhZTBlODk0MWQ3Y2E1Y2VjZTIwIn19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktV2luZG93c194ODYudmFsdWVzLmpzb24iLCJkaWdlc3QiOnsic2hhMjU2IjoiMmQzOWUyOGZmYmNlMDM5MWI1ZGIxZmUxY2VmMjRkMzQxZmVjYjA3YTJlNWRlMWEyYmYyMTk4ZDJhNTc5ZDZkYiJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LVdpbmRvd3NfeDg2XzY0LmRpc3RtZXRhLmN0cy4xLnRyYWNlc3RvcmUiLCJkaWdlc3QiOnsic2hhMjU2IjoiNjg0MmY0NWU2Y2MxMmJmYTZhOGEzY2QzZjI1ZmQ5ZjRhOWExZDJiMGZhNzE5NGNmNTlkOTI2MDcyYmMyMTI3OSJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LVdpbmRvd3NfeDg2XzY0LmRpc3RtZXRhLm1hbmlmZXN0LnppcCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2ODdiYjZkZDBiZjQwOGU3OGI1Y2Q3ZjU5NmRmODVjZDQwYzM4Yzg0MjIwZDJiMmRmYWU1ZTc4MjAwMDA3MDg4In19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktV2luZG93c194ODZfNjQuZGlzdG1ldGEudmFsdWVzdG9yZS5pbmRleCIsImRpZ2VzdCI6eyJzaGEyNTYiOiI3ZjE4NDM0MjRjMDVmMWZlYzNlNTEwZWI1NWZjOTgxZTg2MDI0ZWEyZmYxMzVjZDQ4NTA1YWZhZjRlNDQzOWE2In19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktV2luZG93c194ODZfNjQuZGlzdG1ldGEudmFsdWVzdG9yZS56aXAiLCJkaWdlc3QiOnsic2hhMjU2IjoiMmVjZWIyOTNkZjk1M2MwYjA0YzliNDQ5YzUxYjRkYjZlNmUwZjdjYjJlNzcyYTMwNDM4ZmNiZjJlYmFkZjhhZiJ9fSx7Im5hbWUiOiJDb21tb25zQmFzZV9GaWxlTWFnaWMtYW55LVdpbmRvd3NfeDg2XzY0LnBhY2thZ2UuY3RzLjEudHJhY2VzdG9yZSIsImRpZ2VzdCI6eyJzaGEyNTYiOiJlZjk4ODU1OThhNWVkZmE3ZTczNTcxODdiMDJmMTRkMWFjMTA1MmM4YTY0Zjg2OTkxNzY2OWJlYjU3OTk5Y2E1In19LHsibmFtZSI6IkNvbW1vbnNCYXNlX0ZpbGVNYWdpYy1hbnktV2luZG93c194ODZfNjQucGFja2FnZS52YWx1ZXN0b3JlLmluZGV4IiwiZGlnZXN0Ijp7InNoYTI1NiI6Ijk5NGFkYmU0ZTE5ZGU1ZTkzM2I1ZGZlNWU3NWJkNWFjMDZjMTNkZjEzYzNkNDgxMWE3YzYzZjVjMzQ2ZTVkNTEifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1XaW5kb3dzX3g4Nl82NC5wYWNrYWdlLnZhbHVlc3RvcmUuemlwIiwiZGlnZXN0Ijp7InNoYTI1NiI6ImJkNGRkNWI1OGY0YjMzMmEzZWE5NTY5ZDkwZDQ4NWVhODE4NmFiYTNkZTIzMjAwZmVhZWVmOGIxZDAzZGYzNmUifX0seyJuYW1lIjoiQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljLWFueS1XaW5kb3dzX3g4Nl82NC52YWx1ZXMuanNvbiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJlNmIxYmI1NjIyZDg5YjhmODBmNGFiODdlM2FhY2U3OTAwYzY4MGVhODVkZWY2MDhmMzU0Y2I5MDljYjJhZjJlIn19LHsibmFtZSI6InZhbHVlcy5qc29uIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjA0OTc4ODY0NjZkNzYwYjVlZjM4MmYzMTA0NGY5ZTk4ODU4YTZjN2MzY2MyOTM2Nzk5YmFmOTM1OGQzNWVjMTgifX1dLCJwcmVkaWNhdGVUeXBlIjoiaHR0cHM6Ly9zbHNhLmRldi9wcm92ZW5hbmNlL3YxIiwicHJlZGljYXRlIjp7ImJ1aWxkRGVmaW5pdGlvbiI6eyJidWlsZFR5cGUiOiJodHRwczovL2FjdGlvbnMuZ2l0aHViLmlvL2J1aWxkdHlwZXMvd29ya2Zsb3cvdjEiLCJleHRlcm5hbFBhcmFtZXRlcnMiOnsid29ya2Zsb3ciOnsicmVmIjoicmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NyIsInJlcG9zaXRvcnkiOiJodHRwczovL2dpdGh1Yi5jb20vZGtwa2cvQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljIiwicGF0aCI6Ii5naXRodWIvd29ya2Zsb3dzL2Rpc3RyaWJ1dGUtMC4xLnltbCJ9fSwiaW50ZXJuYWxQYXJhbWV0ZXJzIjp7ImdpdGh1YiI6eyJldmVudF9uYW1lIjoicHVzaCIsInJlcG9zaXRvcnlfaWQiOiIxMjQwMTU3NjMzIiwicmVwb3NpdG9yeV9vd25lcl9pZCI6IjI3ODkxMzUwMCIsInJ1bm5lcl9lbnZpcm9ubWVudCI6ImdpdGh1Yi1ob3N0ZWQifX0sInJlc29sdmVkRGVwZW5kZW5jaWVzIjpbeyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX0ZpbGVNYWdpY0ByZWZzL3RhZ3MvMC4xLjIwMjYwOTIwMTQ0MzQ3IiwiZGlnZXN0Ijp7ImdpdENvbW1pdCI6IjVkZDJmNzM4ZmU3Y2VkYTdmZDk4MTE3NDMxNGVjYjcwM2NjMDVkYjAifX1dfSwicnVuRGV0YWlscyI6eyJidWlsZGVyIjp7ImlkIjoiaHR0cHM6Ly9naXRodWIuY29tL2RrcGtnL0NvbW1vbnNCYXNlX0ZpbGVNYWdpYy8uZ2l0aHViL3dvcmtmbG93cy9kaXN0cmlidXRlLTAuMS55bWxAcmVmcy90YWdzLzAuMS4yMDI2MDkyMDE0NDM0NyJ9LCJtZXRhZGF0YSI6eyJpbnZvY2F0aW9uSWQiOiJodHRwczovL2dpdGh1Yi5jb20vZGtwa2cvQ29tbW9uc0Jhc2VfRmlsZU1hZ2ljL2FjdGlvbnMvcnVucy8zNTUxODM4MTc3Mi9hdHRlbXB0cy8xIn19fX0=","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MEUCIDB02tZTIEVjjD2AgbcFI9k6ICIq3WitvBORdvsr7KTpAiEAwRfAccGftKH+2hLXVjk4m31oS+s9LkKqSesAn9sMIQQ="}]}}
579
+ ] },
580
+ "github_slsa_v1_l3": {},
581
+ "openbsd_signify": {}
582
+ },
583
+ "build_to_sign": {
584
+ "bundle_canonical": "55dbbcc5a4c314d2e841634704232349341b7b8d44d0c331b4a57308e3120403",
585
+ "bundle_modver": "CommonsBase_FileMagic.Distribution@0.1.20260920144347",
586
+ "modules": [
587
+ "CommonsBase_FileMagic.Distribution@0.1.20260920144347",
588
+ "CommonsBase_FileMagic.File@7.8.50407",
589
+ "CommonsBase_FileMagic.File.Bundle@7.8.50407",
590
+ "CommonsBase_FileMagic.File.Unix@7.8.50407",
591
+ "CommonsBase_FileMagic.File.Win32@7.8.50407",
592
+ "CommonsBase_FileMagic.File.Apparatus.CompatCdefs@7.8.0",
593
+ "CommonsBase_FileMagic.File.Apparatus.CompatErr@7.8.0",
594
+ "CommonsBase_FileMagic.File.Apparatus.CompatHeader@7.8.0",
595
+ "CommonsBase_FileMagic.File.Apparatus.CompatNull@7.8.0",
596
+ "CommonsBase_FileMagic.File.Apparatus.CompatQueue@7.8.0",
597
+ "CommonsBase_FileMagic.File.Apparatus.CompatRegex@7.8.0",
598
+ "CommonsBase_FileMagic.File.Apparatus.CompatRegexSource@7.8.0",
599
+ "CommonsBase_FileMagic.File.Apparatus.CompatSource@7.8.0",
600
+ "CommonsBase_FileMagic.File.Apparatus.CompatTree@7.8.0",
601
+ "CommonsBase_FileMagic.File.Apparatus.CompatVisHeader@7.8.0",
602
+ "CommonsBase_FileMagic.File.Apparatus.CompatVisSource@7.8.0",
603
+ "CommonsBase_FileMagic.File.Apparatus.EmbeddedMagicHeader@7.8.0",
604
+ "CommonsBase_FileMagic.File.Apparatus.EmbeddedMagicSource@7.8.0",
605
+ "CommonsBase_FileMagic.File.Apparatus.MagicHeader@7.8.0",
606
+ "CommonsBase_FileMagic.File.Apparatus.MagicTestSource@7.8.0",
607
+ "CommonsBase_FileMagic.File.Apparatus.PortableMain@7.8.0",
608
+ "CommonsBase_FileMagic.File.Apparatus.PortableXmalloc@7.8.0"
609
+ ],
610
+ "producer_accepts": [],
611
+ "distmeta": {
612
+ "traces": [
613
+ {
614
+ "tag": "cts.1",
615
+ "path": "CommonsBase_FileMagic-any-Darwin_arm64.distmeta.cts.1.tracestore"
616
+ },
617
+ {
618
+ "tag": "cts.1",
619
+ "path": "CommonsBase_FileMagic-any-Darwin_x86_64.distmeta.cts.1.tracestore"
620
+ },
621
+ {
622
+ "tag": "cts.1",
623
+ "path": "CommonsBase_FileMagic-any-Linux_x86.distmeta.cts.1.tracestore"
624
+ },
625
+ {
626
+ "tag": "cts.1",
627
+ "path": "CommonsBase_FileMagic-any-Linux_x86_64.distmeta.cts.1.tracestore"
628
+ },
629
+ {
630
+ "tag": "cts.1",
631
+ "path": "CommonsBase_FileMagic-any-Windows_arm64.distmeta.cts.1.tracestore"
632
+ },
633
+ {
634
+ "tag": "cts.1",
635
+ "path": "CommonsBase_FileMagic-any-Windows_x86.distmeta.cts.1.tracestore"
636
+ },
637
+ {
638
+ "tag": "cts.1",
639
+ "path": "CommonsBase_FileMagic-any-Windows_x86_64.distmeta.cts.1.tracestore"
640
+ }
641
+ ],
642
+ "values": [
643
+ {
644
+ "path": "CommonsBase_FileMagic-any-Darwin_arm64.distmeta.valuestore.zip"
645
+ },
646
+ {
647
+ "path": "CommonsBase_FileMagic-any-Darwin_x86_64.distmeta.valuestore.zip"
648
+ },
649
+ {
650
+ "path": "CommonsBase_FileMagic-any-Linux_x86.distmeta.valuestore.zip"
651
+ },
652
+ {
653
+ "path": "CommonsBase_FileMagic-any-Linux_x86_64.distmeta.valuestore.zip"
654
+ },
655
+ {
656
+ "path": "CommonsBase_FileMagic-any-Windows_arm64.distmeta.valuestore.zip"
657
+ },
658
+ {
659
+ "path": "CommonsBase_FileMagic-any-Windows_x86.distmeta.valuestore.zip"
660
+ },
661
+ {
662
+ "path": "CommonsBase_FileMagic-any-Windows_x86_64.distmeta.valuestore.zip"
663
+ }
664
+ ]
665
+ },
666
+ "package": {
667
+ "traces": [
668
+ {
669
+ "tag": "cts.1",
670
+ "path": "CommonsBase_FileMagic-any-Darwin_arm64.package.cts.1.tracestore"
671
+ },
672
+ {
673
+ "tag": "cts.1",
674
+ "path": "CommonsBase_FileMagic-any-Darwin_x86_64.package.cts.1.tracestore"
675
+ },
676
+ {
677
+ "tag": "cts.1",
678
+ "path": "CommonsBase_FileMagic-any-Linux_x86.package.cts.1.tracestore"
679
+ },
680
+ {
681
+ "tag": "cts.1",
682
+ "path": "CommonsBase_FileMagic-any-Linux_x86_64.package.cts.1.tracestore"
683
+ },
684
+ {
685
+ "tag": "cts.1",
686
+ "path": "CommonsBase_FileMagic-any-Windows_arm64.package.cts.1.tracestore"
687
+ },
688
+ {
689
+ "tag": "cts.1",
690
+ "path": "CommonsBase_FileMagic-any-Windows_x86.package.cts.1.tracestore"
691
+ },
692
+ {
693
+ "tag": "cts.1",
694
+ "path": "CommonsBase_FileMagic-any-Windows_x86_64.package.cts.1.tracestore"
695
+ }
696
+ ],
697
+ "values": [
698
+ {
699
+ "path": "CommonsBase_FileMagic-any-Darwin_arm64.package.valuestore.zip"
700
+ },
701
+ {
702
+ "path": "CommonsBase_FileMagic-any-Darwin_x86_64.package.valuestore.zip"
703
+ },
704
+ {
705
+ "path": "CommonsBase_FileMagic-any-Linux_x86.package.valuestore.zip"
706
+ },
707
+ {
708
+ "path": "CommonsBase_FileMagic-any-Linux_x86_64.package.valuestore.zip"
709
+ },
710
+ {
711
+ "path": "CommonsBase_FileMagic-any-Windows_arm64.package.valuestore.zip"
712
+ },
713
+ {
714
+ "path": "CommonsBase_FileMagic-any-Windows_x86.package.valuestore.zip"
715
+ },
716
+ {
717
+ "path": "CommonsBase_FileMagic-any-Windows_x86_64.package.valuestore.zip"
718
+ }
719
+ ]
720
+ }
721
+ }
722
+ },
723
+ "continuations": {
724
+ "attestation": {
725
+ "openbsd_signify": {
726
+ "signature": "untrusted comment: signed by key 1fa672bdf123a65c\nRWQfpnK98SOmXMDb0+Dp9RXUoLmfRysw5kMmhjS8YvniZM79XlCRZ0Jlb5XuPvOkc3/WKBcVK6CcdduZoW/ED7+MMmdvdZxxugg=\n"
727
+ }
728
+ },
729
+ "continuations_to_sign": {
730
+ "0.2": {
731
+ "application": { "name": "dk0", "version": "2.4.2+rev-253" },
732
+ "openbsd_signify": {
733
+ "public_key": "untrusted comment: CommonsBase_FileMagic-0.2\nRWRB0Vp89rkbNX632FEr9+vpPaHR3fTuTapX5tQJ4TsdRDUKlcYdg+mI\n"
734
+ }
735
+ },
736
+ "1.0": {
737
+ "application": { "name": "dk0", "version": "2.4.2+rev-253" },
738
+ "openbsd_signify": {
739
+ "public_key": "untrusted comment: CommonsBase_FileMagic-1.0\nRWQ3sh6eKNgqFjmSX0HGaBBKHuV1TFsYbvF33uyCInae7efYyGxzf0DK\n"
740
+ }
741
+ }
742
+ }
743
+ },
744
+ "id": "CommonsBase_FileMagic@0.1.20260920144347",
745
+ "license": { "spdx": "ISC" },
746
+ "producer": {
747
+ "application": { "name": "dk0", "version": "2.4.3+rev-22" },
748
+ "github_slsa_v1_l2": { "repository": "dkpkg/CommonsBase_FileMagic" },
749
+ "openbsd_signify": {
750
+ "public_key": "untrusted comment: CommonsBase_FileMagic-0.1\nRWQfpnK98SOmXMjE8HjH44kw6lqC0aZ6D0nJp27C82PH/l+YxgrQGIaA\n"
751
+ }
752
+ },
753
+ "min_dk_version": "2.4.2.213"
754
+ }
755
+ ],
756
+ "forms": [],
757
+ "schema_version": { "major": 1, "minor": 0 }
758
+ }
etc/dk/i/dk-closure-manifest.tsv CHANGED
@@ -4,15 +4,18 @@ CommonsBase_Build 0.1.20260916234322 4843aa52a49cc9c02574562407e196893c8f786a626
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
 
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/CommonsBase_FileMagic.0.1.20260920144347.values.json
8
  CommonsBase_FileMagic 0.1.20260920144347 9795f60a23f3135597b06cf41d13983757f1488f71dc301e0a90f85834a340d7 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
9
  CommonsBase_GNU 0.1.20260913085659 9500243faab7e00ea8c604e4b6ace72f8784587fcee453f3959304934d37c5d1 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
10
  CommonsBase_GNU 0.1.20260916234322 b244854bfcba1585234befef8d966f5fce276df458829850d926c2d5869beb34 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
11
  CommonsBase_GNU 0.1.20260920144347 53e60fcbf502ffbdf433ac2faa585d8c9eff6c5b27aedd90d2f63330a7414218 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
12
  CommonsBase_LLVM 0.1.20260913085659 c51d6e04e6779799c4df31630c75ed17d95386492c7e0ddc046f3734c816e929 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
13
  CommonsBase_LLVM 0.1.20260916234322 e66256adfd231ea822bbad59bba124c3c851243082be0426af191ae18751611a etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
14
+ CommonsBase_LLVM 0.1.20260920144347 56312cd1d2868eff482798255793a35f8b2dbaf9c80a697622780d67639783fe etc/dk/i/CommonsBase_FileMagic.0.1.20260920144347.values.json
15
  CommonsBase_LLVM 0.1.20260920144347 56312cd1d2868eff482798255793a35f8b2dbaf9c80a697622780d67639783fe etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
16
  CommonsBase_Std 2.6.20260913085659 25224920a4b704b3693afe5343ce05c5cd2c0d9e19ce1641511707fb5af59887 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
17
  CommonsBase_Std 2.6.20260916234322 eafd48ee3331a4be2fee20055a7d2f88c33b53989c2dcc7f9a6b5ac51349f250 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
18
+ CommonsBase_Std 2.6.20260920144347 b3c67724e09942596d8af32635b585698f931047e74332bc011a532a430d5438 etc/dk/i/CommonsBase_FileMagic.0.1.20260920144347.values.json
19
  CommonsBase_Std 2.6.20260920144347 b3c67724e09942596d8af32635b585698f931047e74332bc011a532a430d5438 etc/dk/i/CommonsBase_Std.2.6.20260920144347.values.json
20
  CommonsBase_Std 2.6.20260920144347 b3c67724e09942596d8af32635b585698f931047e74332bc011a532a430d5438 etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
21
  CommonsBase_Win32 0.1.20260913085659 3bf82182b61b0800bcbb7cf8f6c6fb270228e78fab9120a0ac9e169d12a451af etc/dk/i/CommonsLang_OCaml.0.1.20260920144347.values.json
etc/dk/v/NotHackwaly_Ocamlearlybird/Ocamlearlybird.DevPrefix.values.jsonc ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 formid=NotHackwaly_Ocamlearlybird.Ocamlearlybird.DevPrefix@1.3.6 root=earlybird skiplocal=t mergedprefix=t
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
+ "root": "earlybird",
22
+ "formid": "NotHackwaly_Ocamlearlybird.Ocamlearlybird.DevPrefix@1.3.6",
23
+ "pkgpath": "NotHackwaly_Ocamlearlybird.Ocamlearlybird",
24
+ "version": "1.3.6",
25
+ "skiplocal": "t",
26
+ "mergedprefix": "t",
27
+ "parallel": "t"
28
+ },
29
+ "forms": [
30
+ {
31
+ "id": "NotHackwaly_Ocamlearlybird.Ocamlearlybird.DevPrefix@1.3.6",
32
+ "precommands": {
33
+ "sequential": false,
34
+ "private": [
35
+ "run-function CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedClosure@1.0.29 -d built modver=NotHackwaly_Ocamlearlybird.Ocamlearlybird.DevPrefix.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 skiplocal=t mergedprefix=t"
36
+ ]
37
+ },
38
+ "function": {
39
+ "commands": [
40
+ [
41
+ "$(get-object CommonsBase_Std.Coreutils@0.8.0 -s ${SLOTNAME.Release.execution_abi} -m ./coreutils.exe -f coreutils.exe -e '*')",
42
+ "cp", "built/prefix.zip", "${SLOT.request}/prefix.zip"
43
+ ]
44
+ ]
45
+ },
46
+ "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": ["prefix.zip"] } ] }
47
+ }
48
+ ]
49
+ }
scripts/expected-measurement.json CHANGED
@@ -2,14 +2,13 @@
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
  }
 
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
  "slots": [
6
  "Release.Linux_x86_64",
7
  "Release.Windows_x86_64"
8
  ],
9
  "phases": [
10
+ "dk_fetch_cold",
11
+ "dk_run_reconcile",
12
+ "dk_run_warm"
13
  ]
14
  }