Repository navigation
Description
Problem
Each corpus job in .github/workflows/server-parity.yml downloads the parity CLI on its own:
mysql-execution(:829),postgres-storage(:1585) andexecution-and-codec(:2413) each runcurl --fail --location --retry 3againstgithub.com/durable-workflow/cli/releases/download/2.2.0/dw.pharinside their main step.- With up to 7 corpus jobs per run, one short burst of github.com release-asset 504s fails several of them before any fixture runs. curl's retry backoff is only 1/2/4 s.
Evidence: two consecutive merge groups for #1101
Both had tree 573b0ea3. The only change from main was the qualification subject JSON, which the corpus does not read.
| merge group | run | lost to 504 ×4 | same-minute siblings that fetched and passed |
|---|---|---|---|
60a99eb6 |
42464537818 | 5 jobs (08:55:05–34Z) | — (the 6th failure was the #1102 schedule hazard) |
8711bca3 |
42466925410 | 4 jobs (09:27:21–09:28:12Z) | corpus-b, postgres-17, mysql existing-php-matrix |
The asset is unchanged: dw.phar, 626,966 B, uploaded 2026-10-06. Records: #1101 comments 6719693612 and 6719967483.
Constraints
- Keep the exact PHAR identity:
visibility.cli.phar_sha256intests/Fixtures/ServerParity/visibility-current-runs.json, with thesha256sum -cevidence inparity-evidence/cli-artifact.txt. - No new trust root. The PHAR stays bound to a digest committed in this repository, which satisfies Confine the remaining CI, conformance and perf downloads to checked CA stores (GHSA-6q48-6c7w-9gw2) #677's option (b) for this client.
- Keep every corpus job, every fixture and every required check.
- Do not mix the CLI into
published-sdk-adapters/. Its exhaustiveSHA256SUMS/adapter-integrity.txtis adapter evidence.
Proposed narrow remedy
- The shared-input job
published-sdk-adapters, which every corpus job already needs and requires to succeed, fetches the PHAR once:- with
--retry 5 --retry-all-errors --retry-delay 5 --retry-max-time 180; - verifies it against the committed digest;
- uploads it as a small dedicated artifact (
parity-cli-2.2.0, retention 1 day,if-no-files-found: error).
- with
- Each corpus job downloads that artifact instead of calling github.com, then re-verifies the same committed digest into
parity-evidence/cli-artifact.txtbefore use.DW_PARITY_CLI_PHARand every later byte are unchanged.
The result is 1 external request per run instead of up to 7 Correction (09:56Z): one external download invocation per run (up to six HTTP attempts within a 180 s retry budget) replaces the separate per-job invocations, with the digest checked at both ends. No wall-time improvement is claimed; the train logs will show actual request use and timing.
Out of scope: scripts/conformance/server-parity/native-image-corpus.sh already makes a single download per run in a different workflow.
Owner: Server. Status: source proposal only. Integration order is in the review packet.
Activity
rmcdaniel commentedon Nov 8, 2026
Source proposal for #1103 (not pushed; local commit only)
Identity.
ci/parity-cli-once: commitf997b91c41683478e8d1b5d702fa5e37d03ae601, tree3a0e883419f2496e0817cd43dac26c385c1a1468.2a15179f29801eec9f2a2d4e6a9c5f93233f104e, current main..github/workflows/server-parity.yml, +38/−3. Delta 6,158 B /0074e69ec4b49d1132b6b770c79ca51277fa2675475e07c13d52cb063523190c.Architecture choice.
published-sdk-adaptersis the shared-input job.mysql-execution,postgres-storageandexecution-and-codecallneedit and requireresult == 'success', so the CLI is always present when any corpus part runs.published-sdk-patch-adaptersartifact. That directory carries an exhaustiveSHA256SUMSthat consumers check asadapter-integrity.txt(published-sdk-patch-adapters.sh:29–30,published-sdk-patch-profile.sh:12). The CLI would either change that adapter evidence or sit there unlisted.parity-cli-2.2.0.Change.
Producer (
published-sdk-adapters, right after the image pulls):curl --fail --location --retry 5 --retry-all-errors --retry-delay 5 --retry-max-time 180of the same URL;sha256sum -cagainstvisibility.cli.phar_sha256in the committedvisibility-current-runs.json;parity-cli-2.2.0withretention-days: 1andif-no-files-found: error.Each corpus job:
Fetch this run's verified parity CLI(download-artifact@3e5f45b2…,digest-mismatch: error), placed beside the existingFetch this run's …adapter downloads;curlnow runscp parity-cli/dw.phar parity-consumers/dw.phar, then the unchangedsha256sum -c > parity-evidence/cli-artifact.txtline.DW_PARITY_CLI_PHARand everything after it are byte-identical.What is preserved.
External requests drop from up to 7 per run to 1, and that one has a 180 s retry budget.Correction (09:56Z): one external download invocation per run (up to six HTTP attempts within a 180 s retry budget) replaces the separate per-job invocations. This is not one HTTP request, and no wall-time improvement is claimed.Static checks (nothing executed).
ServerParityPartsTest: the new consumer step has no part condition and is namedFetch …, so it matchesEVERY_PART, like the existing adapter fetches.ServerParityAdapterCacheTest: still 5-adapters.shbuild steps, with restore before them and save after.check-docker-workflow-isolation.py: the new commands take only literal arguments.native-image-corpus.sh(a different workflow, already one fetch per run) is untouched.Integration without touching RUNNER_PATHS or the product bindings
Not through the runner branch.
server-parity.ymlis not inRUNNER_PATHS, so putting it onfeat/server-native32-qualification-runnerwould failqualification_runner_frozen_source. The runner stays at E46754daa8and Qualify the runner against the published Native 3.3.0 index #1101 stays open and unchanged.Its own PR to main, branch
ci/parity-cli-oncefrom M, with its own source train and merge group. That merge group is the first real test of the single fetch.After it merges, main becomes M + fix. E4 keeps its sole parent M:
compare M...E4is still ahead 1, subject file only;[main+fix, E4], so E4 becomes an ancestor of main andqualification_runner_not_on_mainpasses.No rebase of E4 and no change to the subject are needed.
Product bindings unchanged. The 3.3.0 tag and image index D stay bound to M (
release.source_commit= M). Main moving past M is already allowed by the E4 carry.Order: CI-fix PR → its queue → main custody → then a fresh E4 entry, if selected → E4 custody → Reduce Native poll and completion database work #1099. Each step needs its own selection.
Full delta (6,158 B / 0074e69e)
rmcdaniel commentedon Nov 8, 2026
SOURCE PASS. One draft PR / normal source train is selected for the CLI-download CI fix in #1103, owned by Server. Both E4 merge-queue NONPASS results remain attributed; no E4 re-entry is selected.
Subject:
f997b91c41683478e8d1b5d702fa5e37d03ae601, sole parent/current main M2a15179f29801eec9f2a2d4e6a9c5f93233f104e, tree3a0e883419f2496e0817cd43dac26c385c1a1468. One file,.github/workflows/server-parity.yml, +38/−3; binary delta 6,158 B / SHA-2560074e69ec4b49d1132b6b770c79ca51277fa2675475e07c13d52cb063523190c.I read the complete proposal/diff, rebuilt the exact tree independently, and ran the relevant ServerParityPartsTest and ServerParityAdapterCacheTest: all 11 tests passed, no skip. The producer downloads once and checks the committed PHAR digest before uploading a dedicated run-scoped artifact. Every consumer downloads it with digest-mismatch set to error, copies it into the existing path, and retains the unchanged PHAR checksum check and evidence. Its required producer dependency, all parts/fixtures and all required checks remain present. No adapter inventory or product source changes.
Use precise wording in the issue/PR: one external download invocation, with up to six HTTP attempts, replaces the separate per-job invocations. The retry budget is 180 seconds; do not describe that as exactly one HTTP request or a measured wall-time improvement. Preserve the producer and consumer log lines so the fresh train can establish actual request use and timing.
Before push, re-read this raw decision; require exact head/tree/delta, clean worktree, actual main = base = merge-base = M, new remote branch absent, no duplicate PR and a clean secret scan. Push this head once with a must-be-absent branch lease and open an agent:server draft PR. Any identity drift refuses without a push. Let its one ordinary source train reach terminal; no cancellation, rerun or successor push is selected.
Keep E4
6754daa8and #1101 unchanged. This workflow file is outside RUNNER_PATHS, so it must integrate through its own PR and later normal queue decision. After that custody, E4 can merge without rebasing; its comparison against release M stays subject-only. Product 3.3.0 tag/image remain M/D. #1099 stays deferred.No ready/queue/merge, release, dispatch, local harness, daemon or image effect is selected here. The local stop otherwise remains, and the already-selected synthetic SQL cell's terminal result is a separate NONPASS to preserve and diagnose.
Restrict the parity CLI fetch and its redirects to HTTPS
Fall back to the release-asset API URL when the CLI download fails