Repository navigation
Unblock the Dependabot queue: four CI failures and an MSRV decision #358
Description
Problem
Every open Dependabot PR here has red CI, and none can merge. This is the oldest PR in the queue:
- Build(deps): Bump postgresql_embedded from 0.20.4 to 0.21.0 #207 (
postgresql_embedded0.21.0, opened 27 July).
The rest are:
- Build(deps): Bump postgresql_archive from 0.20.4 to 0.21.0 #269 (
postgresql_archive0.21.0); - Build(deps): Bump the github-actions group across 1 directory with 9 updates #245 (github-actions group);
- Build(deps): Bump the shared-actions group across 1 directory with 6 updates #336 (shared-actions group);
- Build(deps): Bump the minor-and-patch group with 5 updates #354 (minor-and-patch group);
- Build(deps): Bump rust-toolchain from nightly-2026-04-25 to nightly-2026-10-23 #357 (rust-toolchain to nightly-2026-10-23).
Main's last recorded green run was Coverage (main) on 11 October (99cbad9).
The failures have four separate causes, plus an upstream MSRV change that needs a decision. Each is listed below with its evidence (logs read on 23 October).
1. New nightly lints (#357, the toolchain bump)
-D warnings turns two new nightly diagnostics into errors.
- Linux (job):
use of deprecated method std::sync::atomic::Atomic::<usize>::fetch_update: renamed to try_updateatsrc/worker_process/privileges.rs:240. - macOS (job):
trailing semicolon in macro used in expression positionattests/bootstrap_overrides.rs:111and:112. Those are thecolor_eyre::eyre::bail!(...)match arms. - Windows:
Build binariesfails the same way.
Fix:
- Replace
fetch_updatewithtry_update. - Wrap each
bail!arm in a block (or usereturn Err(eyre!(...))). - Fix any other new lints that
make lintreports on the new toolchain. Fix the code; don't add#[allow].
Dependabot PRs don't get CodeRabbit reviews, so do this on a leynos branch with the bump included. The PR says "Supersedes #357", and #357 is closed once it merges.
2. Deprecated makefile_lossless API (#354, the minor-and-patch group)
The group bumps makefile-lossless, which deprecates Parse::ok. The error is use of deprecated method makefile_lossless::Parse::<T>::ok: use is_ok instead, at tests/makefile_version_guard.rs:18 (job).
Fix: use is_ok(), and check the group's other four updates for further deprecations. Like #357, this needs a superseding leynos-branch PR.
3. A hard-coded install-whitaker pin (#336, the shared-actions group)
tests/whitaker_install_pin.rs:126 asserts that install-whitaker is pinned to exactly 6cec89bac47a21cf756d68d638a9a510998e57f8, so any shared-actions bump fails it (job):
install-whitaker must pin the revision QG-002 lists as compliant
left: "e693d81d176d2305e2b736a0be0f9038085dec7f"
right: "6cec89bac47a21cf756d68d638a9a510998e57f8"
QG-002 no longer approves a single revision. Since leynos/concordat#324 (23 October), compliant_install_whitaker_refs lists 77 approved commits, up to d5fded1107ee6822fdbf9539d81ff18ce6ce073a, which installs whitaker-installer 0.2.10.
Fix: the test should check that the pin is a full 40-character SHA and belongs to that list. A local copy of the list is acceptable if a comment names its source and the test fails clearly when the pin isn't on it. Every routine shared-actions bump should then pass. Prove it with a mutation: set the pin to a SHA that isn't on the list, and show the test fails.
4. invalid value for parameter "TimeZone": "UTC" (#351 and possibly others)
tests/password_reuse_e2e.rs:115 (a_second_bootstrap_adopts_a_password_that_authenticates) fails with the adopted password did not log in: invalid value for parameter "TimeZone": "UTC" (job, 21 October).
This is the same error as leynos/mxd#665, where mxd's Postgres coverage lane began failing after 12 October. That makes it a property of the embedded PostgreSQL bundle or its runtime environment, not of mxd. Ruled out on mxd: the runner has /usr/share/zoneinfo/UTC, and setting TZ or TZDIR makes no difference.
Probes, in order:
- The bundle's timezone data. PostgreSQL reads its own compiled-in
share/timezonedirectory, notTZDIR, unless it was built with--with-system-tzdata. Listshare/timezonein the installation thatpostgresql_embeddedunpacks, and record the PostgreSQL version and the bundle's release date. A missing or pruned timezone directory, or a new upstream bundle published after 12 October, would explain the error. - Which PostgreSQL version resolves. Find out whether
postgresql_embeddedpicks the newest bundle matching its version requirement at runtime. If so, a new upstream binary release changes behaviour without any lockfile change. Compare a passing run (before 12 October) with a failing one. - The server's own log from a failing run.
Fix: depends on what the probes find.
- If the bundle lacks timezone data: pin the bundle version, fall back to
timezone = 'UTC'with system tzdata, or report it upstream. Reporting upstream needs the user's approval, because it means posting outside leynos/. - Add a regression test that starts a cluster and runs
SET TimeZone = 'UTC'.
The fix should go out in a pg-embed-setup-unpriv release, because mxd's migration (leynos/mxd#667) depends on it.
5. Upstream raised its MSRV to 1.94 (#207 and #269)
postgresql_embedded and postgresql_archive 0.20.3 and later, including 0.21.0 and 0.22.0 (released 21 October), declare rust-version = 1.94. This crate declares rust-version = "1.92" and holds both at ^0.20.2 deliberately: see the Cargo.toml comment and the 29 September 0.6.1 regression. So the Build at the declared rust-version job fails on both PRs.
Decision for the user: either keep 1.92 and ignore these updates (an ignore entry in .github/dependabot.yml for >= 0.20.3, with the reason in a comment), or raise rust-version to 1.94 in a minor release and take 0.22.0.
Known consumers: axinite (0.6.3) and mxd (0.5.2, migrating). Check each consumer's toolchain before raising it.
#207 and #245 also conflict with main. Recreate them or close them once their replacements land.
Order of work
- Probe 4 first, because it blocks the mxd migration and may be what makes Run Dependabot pull requests on GitHub-hosted runners #351 red.
- Then fixes 3, 1 and 2, each as its own leynos-branch PR. Each PR names the Dependabot PR it supersedes; that PR is closed after the merge.
- Then put decision 5 to the user.
Once main is green, re-run #351 (Dependabot pull requests on GitHub-hosted runners).
Constraints
- Gate every commit sequentially:
make check-fmt,make lint,make testandmake markdownlint. - Merge only on a CodeRabbit review at the exact head with no ❌ rows.
- Releases and crates.io publishes are the user's.
- Leave Align Dependabot coverage and add the dev-fast build fragment #216 (an August draft) alone.
Done when
- Main CI is green on Linux (root and unprivileged), macOS and Windows.
- Every Dependabot PR listed above is merged, superseded and closed, or ignored with a recorded reason.
- The TimeZone failure has a confirmed cause and a regression test.
Activity
coderabbitai commentedon Oct 23, 2026
🔗 Related PRs
leynos/podbot#267 - Run Dependabot pull requests on GitHub-hosted runners [open]
leynos/cuprum#646 - Run Dependabot pull requests on GitHub-hosted runners [open]
leynos/repovec-appliance#187 - Run Dependabot pull requests on GitHub-hosted runners [open]
#351 - Run Dependabot pull requests on GitHub-hosted runners [open]
📝 Issue Planner
Check the box below or use the
@coderabbitai plancommand to generate an implementation plan and prompts that you can use with your favorite coding assistant.🧪 Issue enrichment is currently in open beta.
You can configure auto-planning by selecting labels in the issue_enrichment configuration.
To disable automatic issue enrichment, add the following to your
.coderabbit.yaml:💬 Have feedback or questions? Drop into our discord!
leynos commentedon Oct 23, 2026
@CodeRabbit plan
coderabbitai commentedon Oct 23, 2026
Coding Plan
Summary
18.6.1bundle and the hard-link skip inpostgresql_archiveversions before 0.22.0.PG_VERSION_REQoverride, and make installation inference honour the requirement.Design Choices
Design Choice 1: How to fix the TimeZone failure while decision 5 is open
Options Considered:
=18.6.0whenPG_VERSION_REQis unset. Keep thePG_VERSION_REQoverride.rust-versionto 1.94.timezone = 'UTC'in the server configuration. This does not work because clients such as Diesel still sendSET TIME ZONE 'UTC', and every other hard-linked zone (for exampleEurope/London) stays missing.Chosen Option: 1
Rationale: Use Option 1 now, with Option 2 as the recommendation for decision 5. The full upstream fix (
postgresql_archive0.22.0) needs MSRV 1.94, and the ticket reserves that decision for the user. Main must still turn green. The pin is MSRV-neutral, deterministic and reversible. It also prevents cache and installation-directory reuse of broken18.6.1trees.Design Choice 2: Where to keep the QG-002 approved list
Options Considered:
leynos/concordatcommitf46a4848ad5e62cfd170360074cddc3a792f3ea7and therule.yamlpath.Chosen Option: 1
Rationale: Option 1. The ticket permits it, the tests stay hermetic, and the test fails clearly when the pin is not on the list.
Design Choice 3: How to replace `fetch_update` without breaking MSRV 1.92
Options Considered:
try_update.compare_exchangeloop.Chosen Option: 1
Rationale:
try_updatecan be newer than Rust 1.92. Use Option 1 ifmake msrvpasses at the declaredrust-version. Otherwise use Option 2. Both remove the deprecated call without#[allow].💡 User Tips
Regenerate the plan with different choices with
@coderabbitai <feedback>.Implementation Steps
Phase 1: TimeZone failure — probe, confirm, regression test, interim fix
This phase comes first because it blocks the mxd migration (
#667). It also turns every other PR red. The regression test also serves as the probe: it gathers safe diagnostics before cleanup.Task 1: Task 1.1: Add a live-cluster TimeZone regression test with safe diagnostics
Add a test that reproduces the failure and records the evidence that the probes need.
tests/timezone_regression.rs. Follow thetests/password_reuse_e2e.rspattern:TestSandbox,env_without_timezone()andTestCluster::new_split().cluster_skip_message.PgConnection.SET TimeZone = '<zone>'and thenSHOW TimeZonefor each ofUTC,Etc/UTCandEurope/London. These are all hard-linked aliases in18.6.1. Use an rstest case table that iterates inside the single cluster.SELECT version()output, if a connection exists;handle.settings().installation_dir;share/timezone,share/timezone/UCTandshare/timezone/UTCexist, and their file types;<data_dir>/start.log.Settings, passwords, connection URLs or unrestricted command-debug logs.Task 2: Task 1.2: Run the probes and record the confirmed cause
Confirm the cause with run evidence, not with release dates.
find_matching_cached_versiontracing;share/timezoneevidence;start.logtail.tar -tvzfoffline on the18.6.0and18.6.1assets for each CI target, including Windows and macOS. Confirm the hard-link entries and the tzdata configuration.18.6.1was published on 18 October. Check whether mxd's 0.5.2 resolution or another cause explains the earlier failures. Do not claim the cause for those runs without evidence..github/workflows/forPG_VERSION_REQ,PG_RUNTIME_DIRand any PostgreSQL cache steps. A preset requirement or a persisted cache changes what the pin affects.Task 3: Task 1.3: Pin the default PostgreSQL bundle
Stop runtime drift to the broken bundle while MSRV stays at 1.92.
apply_versioninsrc/lib.rs. WhenPG_VERSION_REQis unset, setsettings.versionto a named constant with the value=18.6.0.postgresql_archive0.22.0 fix.PG_VERSION_REQas the override. Update the variable documentation insrc/main.rs:16–24.18.6.0asset, choose the nearest working exact version for that platform. Document the choice.apply_versiontests. It asserts the default requirement and the override precedence.Task 4: Task 1.4: Make installation inference honour the requested version
Prevent the root path from selecting a stale
18.6.1directory under a reused installation root.src/cluster/installation.rs(~174–218). Filter the candidate subdirectories with the settings'VersionReqbefore you select the highest version.18.6.0/binand18.6.1/bin, and assert that=18.6.0selects18.6.0.Task 5: Task 1.5: Document the fix and stale installations
Tell consumers what changed and how to recover.
CHANGELOG.md. It must cover:PG_VERSION_REQoverride;18.6.1trees fromPG_BINARY_CACHE_DIRand from installation roots. Cache lookup accepts these trees without validation.docs/cache.md.make check-fmt,make lint,make test,make markdownlint. Merge only after a CodeRabbit review at the exact head with no ❌ rows. Ask the user to release, because mxd#667depends on this fix.🤖 Prompt for AI agents
Phase 2: QG-002 install-whitaker pin (supersedes
#336)Change the Whitaker contract from one exact SHA to membership of the approved list. Include the shared-actions bump in the same branch.
Task 1: Task 2.1: Replace the exact-SHA assertion with list membership
tests/whitaker_install_pin.rs(~15–23, 113–130), add a local constant with the 77 approved SHAs.leynos/concordatcommitf46a4848ad5e62cfd170360074cddc3a792f3ea7(PR#324) and the pathplatform-standards/canon/lint-rules/whitaker-provisioning/rule.yaml.These follow the explicit-count pattern in
tests/build_standard_contract.rs.0.2.9;cargo installandcargo binstallcommands.Task 2: Task 2.2: Apply the shared-actions bump and prove it with a mutation
#336group revisions to.github/workflows/*.yml. The new install-whitaker revisione693d81d176d2305e2b736a0be0f9038085dec7fis on the list..github/workflows/ci.yml:90to an off-list SHA, run the test, record the failure output, and revert the change. Put the output in the PR description.docs/developers-guide.md:219–229. Describe the list-membership policy and how to refresh the local copy from concordat.#336". Gate the PR, get the review, merge, and then close#336.🤖 Prompt for AI agents
Phase 3: New nightly lints (supersedes
#357)Move to
nightly-2026-10-23and fix the new diagnostics in the code.Task 1: Task 3.1: Bump the toolchain and fix the reported lints
rust-toolchain.tomltonightly-2026-10-23.fetch_updateinsrc/worker_process/privileges.rs:238–251as decided in Assumption 3. Keep these properties:SeqCstordering;The existing serial nested-guard tests must still pass.
tests/bootstrap_overrides.rs:98–113, wrap eachbail!arm in a block. Both unexpected outcomes must still fail.Task 2: Task 3.2: Remove the remaining new-toolchain fallout
make lintandmake teston the new nightly. Fix every new warning in the code. Do not add#[allow]..stderrsnapshots for the new compiler diagnostics. Review each diff.make msrv. This confirms that the fixes still compile on the declaredrust-version.Build binariessteps pass. Title the PR "Supersedes#357", merge it, and close#357.🤖 Prompt for AI agents
Phase 4: Minor-and-patch group (supersedes
#354)Apply the Dependabot minor-and-patch group and fix the deprecations.
Task 4.1: Apply the group and fix the deprecations
serde_jsonto 1.0.154;sha2to 0.11.1;makefile-losslessto 0.4.8;proptestto 1.12.0;trybuildto 1.0.122.tests/makefile_version_guard.rs:13–22, replaceParse::okwithis_ok(). Keep the strict no-recovery check and thepositioned_errors()report.make --dry-run VERSION= lintsubprocess contract unchanged.make msrv. Title the PR "Supersedes#354", merge it, and close#354.🤖 Prompt for AI agents
Phase 5: MSRV decision and queue cleanup
Put decision 5 to the user with evidence. Then carry out the chosen option.
Task 1: Task 5.1: Present the decision to the user
0553ee5:rust-version = "1.95", stable CI, requirement^0.6.3;da9c7da: norust-version, toolchainnightly-2026-03-26, requirement0.5.2and migrating.rust-versionto 1.94 in a minor release and take 0.22.0.Task 2: Task 5.2: Option B — raise MSRV to 1.94 and take 0.22.0
Cargo.toml, setpostgresql_embeddedandpostgresql_archiveto0.22.0, and setrust-versionto1.94;Cargo.toml:145–152.src/test_support/bootstrap_retry/tests.rsin particular.CHANGELOG.mdthat records the deliberate MSRV raise.18.6.1. If it passes, remove or relax the default pin. Keep it if the user prefers reproducible bundles.make msrvagainst 1.94. Close#207and#269as superseded.Task 3: Task 5.3: Option A — keep 1.92 and ignore the updates
ignoreentries to.github/dependabot.ymlforpostgresql_embeddedandpostgresql_archivewith>= 0.20.3. Add a comment that cites the 1.94 MSRV, the 0.6.1 regression, and the dependency of the TimeZone pin on this choice.#207and#269with the recorded reason. The Phase 1 pin stays in place.Task 4: Task 5.4: Clear the rest of the queue
@dependabot recreateon#245. Merge it after a green run and a review.#351on GitHub-hosted runners.#216.🤖 Prompt for AI agents
Research
Ticket Summary
Unblock the Dependabot queue. Fix four CI failure causes and put the MSRV decision to the user. The four causes are new nightly lints (
#357), a deprecatedmakefile_losslessAPI (#354), an exact install-whitaker pin assertion (#336), and the PostgreSQLinvalid value for parameter "TimeZone": "UTC"failure. Confirm the TimeZone cause with evidence. Add a regression test. Ship the fix in a release that the user publishes.Codebase Summary
pg-embed-setup-unprivbootstraps embedded PostgreSQL throughpostgresql_embeddedandpostgresql_archive. Both have the requirement0.20.2and resolve to0.20.4in the lockfile.src/lib.rs(apply_version,apply_paths) mapsPG_*environment variables onto upstreamSettings. WhenPG_VERSION_REQis unset, the upstream version isVersionReq::STAR. This requirement resolves to the newest Theseus release at install time.src/cluster/startup.rsrunscache_integration::try_use_binary_cachebefore setup. Cache lookup insrc/cache/operations/lookup.rsrequires only.completeandbin/.src/cluster/installation.rs(refresh_worker_installation_dir) picks the highest versioned subdirectory. It does not filter by the requirement. Upstreampg_ctl startwrites the server log to<data_dir>/start.log. Upstream drop deletes that directory whentemporary=true.Investigation established these facts:
18.6.1was published on 18 October 2026. It bundlesshare/timezone. It was built without--with-system-tzdata.UTC,Etc/UTCand 255 other zones are tar hard links.postgresql_archive0.20.2,0.20.4and0.21.0skip hard links.0.22.0extracts hard links but declaresrust-version = 1.94.0.18.6.0uses system tzdata at/usr/share/zoneinfo.Diesel's
PgConnection::establishissuesSET TIME ZONE 'UTC'. For this reason, the error appears as a login failure.Supporting contracts:
tests/whitaker_install_pin.rsasserts one exact SHA for install-whitaker.tests/makefile_version_guard.rsusesParse::ok.src/worker_process/privileges.rsusesfetch_update.tests/bootstrap_overrides.rshasbail!match arms.make msrv(scripts/msrv_check.py) checks a fresh resolution on the declaredrust-version.File-level Change Summary
tests/timezone_regression.rs(new): live-clusterSET TimeZonetest with allowlisted diagnostics.src/lib.rs: default exact bundle requirement inapply_version; unit test.src/main.rs: document the default and thePG_VERSION_REQoverride.src/cluster/installation.rs: filter inferred installation directories byVersionReq; tests.CHANGELOG.md,docs/cache.md: TimeZone cause, stale-tree recovery, and later the MSRV entry.tests/whitaker_install_pin.rs: membership of the QG-002 list, list guards, negative cases..github/workflows/*.yml: shared-actions group revisions (#336).docs/developers-guide.md: QG-002 list policy and refresh procedure.rust-toolchain.toml:nightly-2026-10-23.src/worker_process/privileges.rs: replacefetch_updateand keep its semantics.tests/bootstrap_overrides.rs: put thebail!arms in blocks.tests/makefile_version_guard.rs: replaceParse::okwithis_ok().Cargo.toml,Cargo.lock: group bumps; Option B: 0.22.0 andrust-version = "1.94"..github/dependabot.yml: Option A only:ignoreentries with the reason.Follow-up Agent Prompts
🚀 Next Steps
🤖 All AI agent prompts combined
💡 Iterate on the plan with:
@coderabbitai <feedback>Start Coding →
leynos commentedon Oct 24, 2026
Independent reproduction of the hard-link cause
mxd (leynos/mxd#665) reproduced this from the bundle side while preparing its
0.6.3migration, and the result matches the evidence in the Coding Plan here.18.6.1Linux asset contains 257 tar hard links, includingshare/timezone/UTC -> share/timezone/UCTandEtc/UTC -> UCT.postgresql_archivebefore0.22.0has no hard-link branch in its tarextractor, so those entries are skipped silently and
share/timezone/UTCnever exists.
18.6.1with hard links skipped and starting that tree reproducesERROR: invalid value for parameter "TimeZone": "UTC"verbatim;SHOW timezonereportsEurope/Copenhagen. The intact tree acceptsSET TIME ZONE 'UTC'.18.6.0asset was created and last updated on 2026-08-15, so itwas not replaced in the October wave. It was built
--with-system-tzdata=/usr/share/zoneinfo, ships noshare/timezone, has nohard links, and accepts the setting.
18.6.1asset was published 2026-10-18 and mxd's failuresattributed to this cause start 2026-10-19. mxd's 2026-10-14 and 2026-10-16
coverage failures are
codescene_uploader_contractand are not evidence forthis cause.
One correction to the interim-fix framing, for whoever implements it: an exact
pin is required, not a range.
PG_VERSION_REQis parsed straight into aVersionReqand release selection takes the highest matching semver across allpages, so
^18.6.0or~18.6.0would still resolve to18.6.1. mxd is usingPG_VERSION_REQ="=18.6.0"and it makes the PostgreSQL lane pass on the current0.5.2harness.Also worth recording on the MSRV question: the fix is not reachable from any
published release even ignoring MSRV.
pg-embed-setup-unpriv0.6.3requirespostgresql_embedded0.20.2, which requirespostgresql_archive ^0.20.4,and no
0.20.xrelease carries the hard-link extraction. Reaching0.22.0needs both a
postgresql_embeddedbump and the Rust 1.94 floor.Repair CI and retain Rust 1.92 (#358)
Address review of dependency queue fixes (#358)
Simplify review test scenarios (#358)
Document internal setup contracts (#358)
Clarify and verify version selection (#358)