chore(deps): bump the Elixir and Rust trees, re-vendor Oban Pro 1.8 #11

Merged
graham merged 1 commit from chore/deps-bump-oban-pro-1-8 into main 2026-09-19 14:43:41 -05:00
Owner

chore(deps): bump the Elixir and Rust trees, re-vendor Oban Pro 1.8

Every direct dependency now sits at its newest release that the graph allows,
the three Oban Pro packages are re-pulled from their official tarballs, and the
schema migration Oban Pro 1.8 requires is in place.

Elixir

mix deps.update --all: phoenix 1.8.13 → 1.8.14, phoenix_live_view
1.2.11 → 1.2.12, swoosh 1.28.0 → 1.28.1, redix 1.8.2 → 1.9.2,
mox 1.3.1 → 1.3.2, dialyxir 1.4.7 → 1.4.8, sourceror 1.12.2 → 1.12.3,
spitfire 0.4.1 → 0.4.2, mint 1.10.0 → 1.10.1, ranch 2.2.1 → 2.3.0.

igniter 0.8.4 and nx 1.0.0 are the only remaining stragglers, and both are
blocked by peers rather than by our own constraints: live_table 0.4.2 (already
latest) requires igniter ~> 0.7.0, and axon 0.8.1 (already latest) requires
nx ~> 0.10.

Oban Pro re-vendored

  • oban_pro 1.7.0 → 1.8.0 (oban repo), oban_met 1.1.0 → 1.3.1,
    oban_web 2.12.5 → 2.13.0, and oban floored at ~> 2.24 — the version
    both Pro packages now require.
  • All three vendor/ trees are the published tarballs byte-for-byte
    (diff -r clean). That drops two leftovers: the local elixirc_options
    edit 1.7.0's mix.exs needed (1.8.0 ships the equivalent upstream, so the
    vendored tree needs no patch) and vendor/oban_met/.hex, stale metadata
    claiming 1.1.0 that Mix never reads for a path dep.
  • /admin/oban boots against the new dashboard; mix deps resolves all three
    at the new versions.

Oban Pro 1.8 migration

priv/repo/migrations/20260919191928_oban_pro_v1_8.exs calls
Oban.Pro.Migration.up(version: "1.8.0"): persisted Pruner rules
(oban_pruners), archived jobs (oban_jobs_archive), the workflow
compensation columns, the backfill index, and the drop of the _old indexes
v1.7 left behind.

The upgrade guide offers a schemas/indexes split so the index half can run
CONCURRENTLY. Prod keeps at most a day of jobs (the Pruner runs daily with
max_age: {1, :day}), so the inline migration's lock window is short enough
that the split isn't worth its extra moving parts — that reasoning lives in
the migration's @moduledoc.

Configuration keeps the 1.8 compatibility shims (Oban.Pro.Engines.Smart,
Oban.Pro.Plugins.DynamicLifeline). The guide marks the shorter names as an
optional rename and the shims emit no deprecation warnings, so this change
stays a dependency bump rather than a config rewrite.

Code changes

1.8 validates :unique[:period] while expanding the use Oban.Pro.Worker
macro and now requires a literal integer or {amount, unit} tuple, where 1.7
accepted an unevaluated expression. HrdpsGridWorker passed 6 * 3600; it
now passes 21_600, with a comment naming the constraint so nobody
re-introduces the arithmetic. Every other period: in the tree was already a
literal.

Rust

cargo update moves 107 crates, plus two major bumps: sqlx 0.8 → 0.9 and
tikv-jemallocator 0.6 → 0.7. sqlx 0.9 deletes the combined
runtime-tokio-rustls feature, so the manifest asks for runtime-tokio +
tls-rustls instead. No source changes were needed: every query in the crate
is a &'static str literal, which is what 0.9's new SqlSafeStr bound
demands.

The highest MSRV among the moved crates is exactly 1.94.0 (the sqlx family),
matching the rust:1.94-trixie build image. Checked crate-by-crate against
the sparse index rather than assumed, since a single crate above 1.94 would
break the image build without failing anything locally.

Verification

  • cargo clippy --all-targets -- -D warnings clean; cargo test --release
    green, including scorer_golden::matches_elixir_golden_fixture and
    json_weights_golden.
  • EXUNIT_MAX_CASES=8 make precommit: format, compile --warnings-as-errors,
    deps.unlock --check-unused, credo --strict (no issues) and xref all
    pass. Tests land at 4901/4914 with 13 failures, identical to the baseline
    measured before any of these changes: twelve Wgrib2Test cases fail with
    :wgrib2_not_available (the binary isn't in the local shell) and one
    HrrrClientTest case needs NOAA over the network.
  • App boots in dev: /health 200, /admin/oban 200, and the
    PropagationGridWorker cron fired and seeded grid_tasks under the 1.8
    engine.
  • The 1.8 migration chain was applied to a database created from scratch, so
    v1_0_0 … v1_8_0 all ran in order rather than only the new delta.
  • mix deps.audit and mix hex.audit: no vulnerabilities, no retired
    packages.

Notes

The vendored-path version cache bites on every future bump: Mix reads a path
dep's version from _build/<env>/lib/<pkg>/ebin/<pkg>.app and rejects a new
mix.exs requirement as a mismatch until mix deps.clean --build <pkg> runs.
AGENTS.md's Dependencies section now records that, alongside the reminder
that an oban_pro minor always carries a required migration.

Unprefixed make precommit fails on a workstation whose Postgres is shared
with other projects: the test pool is EXUNIT_MAX_CASES + 4 (40 by default on
18 schedulers) against a max_connections of 75, so concurrent pools exhaust
the server with too_many_connections. EXUNIT_MAX_CASES=8, which is what CI
uses, costs no wall time.

chore(deps): bump the Elixir and Rust trees, re-vendor Oban Pro 1.8 Every direct dependency now sits at its newest release that the graph allows, the three Oban Pro packages are re-pulled from their official tarballs, and the schema migration Oban Pro 1.8 requires is in place. ## Elixir `mix deps.update --all`: phoenix 1.8.13 → 1.8.14, phoenix_live_view 1.2.11 → 1.2.12, swoosh 1.28.0 → 1.28.1, redix 1.8.2 → 1.9.2, mox 1.3.1 → 1.3.2, dialyxir 1.4.7 → 1.4.8, sourceror 1.12.2 → 1.12.3, spitfire 0.4.1 → 0.4.2, mint 1.10.0 → 1.10.1, ranch 2.2.1 → 2.3.0. `igniter` 0.8.4 and `nx` 1.0.0 are the only remaining stragglers, and both are blocked by peers rather than by our own constraints: live_table 0.4.2 (already latest) requires `igniter ~> 0.7.0`, and axon 0.8.1 (already latest) requires `nx ~> 0.10`. ## Oban Pro re-vendored - `oban_pro` 1.7.0 → **1.8.0** (oban repo), `oban_met` 1.1.0 → **1.3.1**, `oban_web` 2.12.5 → **2.13.0**, and `oban` floored at `~> 2.24` — the version both Pro packages now require. - All three `vendor/` trees are the published tarballs byte-for-byte (`diff -r` clean). That drops two leftovers: the local `elixirc_options` edit 1.7.0's `mix.exs` needed (1.8.0 ships the equivalent upstream, so the vendored tree needs no patch) and `vendor/oban_met/.hex`, stale metadata claiming 1.1.0 that Mix never reads for a path dep. - `/admin/oban` boots against the new dashboard; `mix deps` resolves all three at the new versions. ## Oban Pro 1.8 migration `priv/repo/migrations/20260919191928_oban_pro_v1_8.exs` calls `Oban.Pro.Migration.up(version: "1.8.0")`: persisted Pruner rules (`oban_pruners`), archived jobs (`oban_jobs_archive`), the workflow compensation columns, the backfill index, and the drop of the `_old` indexes v1.7 left behind. The upgrade guide offers a schemas/indexes split so the index half can run `CONCURRENTLY`. Prod keeps at most a day of jobs (the Pruner runs daily with `max_age: {1, :day}`), so the inline migration's lock window is short enough that the split isn't worth its extra moving parts — that reasoning lives in the migration's `@moduledoc`. Configuration keeps the 1.8 compatibility shims (`Oban.Pro.Engines.Smart`, `Oban.Pro.Plugins.DynamicLifeline`). The guide marks the shorter names as an optional rename and the shims emit no deprecation warnings, so this change stays a dependency bump rather than a config rewrite. ## Code changes 1.8 validates `:unique[:period]` while expanding the `use Oban.Pro.Worker` macro and now requires a literal integer or `{amount, unit}` tuple, where 1.7 accepted an unevaluated expression. `HrdpsGridWorker` passed `6 * 3600`; it now passes `21_600`, with a comment naming the constraint so nobody re-introduces the arithmetic. Every other `period:` in the tree was already a literal. ## Rust `cargo update` moves 107 crates, plus two major bumps: `sqlx` 0.8 → 0.9 and `tikv-jemallocator` 0.6 → 0.7. sqlx 0.9 deletes the combined `runtime-tokio-rustls` feature, so the manifest asks for `runtime-tokio` + `tls-rustls` instead. No source changes were needed: every query in the crate is a `&'static str` literal, which is what 0.9's new `SqlSafeStr` bound demands. The highest MSRV among the moved crates is exactly 1.94.0 (the sqlx family), matching the `rust:1.94-trixie` build image. Checked crate-by-crate against the sparse index rather than assumed, since a single crate above 1.94 would break the image build without failing anything locally. ## Verification - `cargo clippy --all-targets -- -D warnings` clean; `cargo test --release` green, including `scorer_golden::matches_elixir_golden_fixture` and `json_weights_golden`. - `EXUNIT_MAX_CASES=8 make precommit`: format, `compile --warnings-as-errors`, `deps.unlock --check-unused`, `credo --strict` (no issues) and `xref` all pass. Tests land at 4901/4914 with 13 failures, identical to the baseline measured before any of these changes: twelve `Wgrib2Test` cases fail with `:wgrib2_not_available` (the binary isn't in the local shell) and one `HrrrClientTest` case needs NOAA over the network. - App boots in dev: `/health` 200, `/admin/oban` 200, and the `PropagationGridWorker` cron fired and seeded `grid_tasks` under the 1.8 engine. - The 1.8 migration chain was applied to a database created from scratch, so `v1_0_0 … v1_8_0` all ran in order rather than only the new delta. - `mix deps.audit` and `mix hex.audit`: no vulnerabilities, no retired packages. ## Notes The vendored-path version cache bites on every future bump: Mix reads a path dep's version from `_build/<env>/lib/<pkg>/ebin/<pkg>.app` and rejects a new `mix.exs` requirement as a mismatch until `mix deps.clean --build <pkg>` runs. `AGENTS.md`'s Dependencies section now records that, alongside the reminder that an `oban_pro` minor always carries a required migration. Unprefixed `make precommit` fails on a workstation whose Postgres is shared with other projects: the test pool is `EXUNIT_MAX_CASES + 4` (40 by default on 18 schedulers) against a `max_connections` of 75, so concurrent pools exhaust the server with `too_many_connections`. `EXUNIT_MAX_CASES=8`, which is what CI uses, costs no wall time.
chore(deps): bump the Elixir and Rust trees, re-vendor Oban Pro 1.8
All checks were successful
skippy-bot/review Skippy review: clean — no open findings
4a3bbc69cf
Every direct dependency now sits at its newest release that the graph allows,
the three Oban Pro packages are re-pulled from their official tarballs, and the
schema migration Oban Pro 1.8 requires is in place.

## Elixir

`mix deps.update --all`: phoenix 1.8.13 → 1.8.14, phoenix_live_view
1.2.11 → 1.2.12, swoosh 1.28.0 → 1.28.1, redix 1.8.2 → 1.9.2,
mox 1.3.1 → 1.3.2, dialyxir 1.4.7 → 1.4.8, sourceror 1.12.2 → 1.12.3,
spitfire 0.4.1 → 0.4.2, mint 1.10.0 → 1.10.1, ranch 2.2.1 → 2.3.0.

`igniter` 0.8.4 and `nx` 1.0.0 are the only remaining stragglers, and both are
blocked by peers rather than by our own constraints: live_table 0.4.2 (already
latest) requires `igniter ~> 0.7.0`, and axon 0.8.1 (already latest) requires
`nx ~> 0.10`.

## Oban Pro re-vendored

- `oban_pro` 1.7.0 → **1.8.0** (oban repo), `oban_met` 1.1.0 → **1.3.1**,
  `oban_web` 2.12.5 → **2.13.0**, and `oban` floored at `~> 2.24` — the version
  both Pro packages now require.
- All three `vendor/` trees are the published tarballs byte-for-byte
  (`diff -r` clean). That drops two leftovers: the local `elixirc_options`
  edit 1.7.0's `mix.exs` needed (1.8.0 ships the equivalent upstream, so the
  vendored tree needs no patch) and `vendor/oban_met/.hex`, stale metadata
  claiming 1.1.0 that Mix never reads for a path dep.
- `/admin/oban` boots against the new dashboard; `mix deps` resolves all three
  at the new versions.

## Oban Pro 1.8 migration

`priv/repo/migrations/20260919191928_oban_pro_v1_8.exs` calls
`Oban.Pro.Migration.up(version: "1.8.0")`: persisted Pruner rules
(`oban_pruners`), archived jobs (`oban_jobs_archive`), the workflow
compensation columns, the backfill index, and the drop of the `_old` indexes
v1.7 left behind.

The upgrade guide offers a schemas/indexes split so the index half can run
`CONCURRENTLY`. Prod keeps at most a day of jobs (the Pruner runs daily with
`max_age: {1, :day}`), so the inline migration's lock window is short enough
that the split isn't worth its extra moving parts — that reasoning lives in
the migration's `@moduledoc`.

Configuration keeps the 1.8 compatibility shims (`Oban.Pro.Engines.Smart`,
`Oban.Pro.Plugins.DynamicLifeline`). The guide marks the shorter names as an
optional rename and the shims emit no deprecation warnings, so this change
stays a dependency bump rather than a config rewrite.

## Code changes

1.8 validates `:unique[:period]` while expanding the `use Oban.Pro.Worker`
macro and now requires a literal integer or `{amount, unit}` tuple, where 1.7
accepted an unevaluated expression. `HrdpsGridWorker` passed `6 * 3600`; it
now passes `21_600`, with a comment naming the constraint so nobody
re-introduces the arithmetic. Every other `period:` in the tree was already a
literal.

## Rust

`cargo update` moves 107 crates, plus two major bumps: `sqlx` 0.8 → 0.9 and
`tikv-jemallocator` 0.6 → 0.7. sqlx 0.9 deletes the combined
`runtime-tokio-rustls` feature, so the manifest asks for `runtime-tokio` +
`tls-rustls` instead. No source changes were needed: every query in the crate
is a `&'static str` literal, which is what 0.9's new `SqlSafeStr` bound
demands.

The highest MSRV among the moved crates is exactly 1.94.0 (the sqlx family),
matching the `rust:1.94-trixie` build image. Checked crate-by-crate against
the sparse index rather than assumed, since a single crate above 1.94 would
break the image build without failing anything locally.

## Verification

- `cargo clippy --all-targets -- -D warnings` clean; `cargo test --release`
  green, including `scorer_golden::matches_elixir_golden_fixture` and
  `json_weights_golden`.
- `EXUNIT_MAX_CASES=8 make precommit`: format, `compile --warnings-as-errors`,
  `deps.unlock --check-unused`, `credo --strict` (no issues) and `xref` all
  pass. Tests land at 4901/4914 with 13 failures, identical to the baseline
  measured before any of these changes: twelve `Wgrib2Test` cases fail with
  `:wgrib2_not_available` (the binary isn't in the local shell) and one
  `HrrrClientTest` case needs NOAA over the network.
- App boots in dev: `/health` 200, `/admin/oban` 200, and the
  `PropagationGridWorker` cron fired and seeded `grid_tasks` under the 1.8
  engine.
- The 1.8 migration chain was applied to a database created from scratch, so
  `v1_0_0 … v1_8_0` all ran in order rather than only the new delta.
- `mix deps.audit` and `mix hex.audit`: no vulnerabilities, no retired
  packages.

## Notes

The vendored-path version cache bites on every future bump: Mix reads a path
dep's version from `_build/<env>/lib/<pkg>/ebin/<pkg>.app` and rejects a new
`mix.exs` requirement as a mismatch until `mix deps.clean --build <pkg>` runs.
`AGENTS.md`'s Dependencies section now records that, alongside the reminder
that an `oban_pro` minor always carries a required migration.

Unprefixed `make precommit` fails on a workstation whose Postgres is shared
with other projects: the test pool is `EXUNIT_MAX_CASES + 4` (40 by default on
18 schedulers) against a `max_connections` of 75, so concurrent pools exhaust
the server with `too_many_connections`. `EXUNIT_MAX_CASES=8`, which is what CI
uses, costs no wall time.
First-time contributor

No findings. Reviewed the eight app-owned files in full; the 144 vendor/** files are upstream tarballs and were checked for integrity only, not line by line.

Verified on the way through:

  • mix.exs / mix.lock consistency: oban ~> 2.24 is satisfied by the locked 2.24.1 (which this PR does not move), and the three path deps match their vendored trees (oban_pro 1.8.0, oban_met 1.3.1, oban_web 2.13.0).
  • vendor/oban_web and vendor/oban_met are byte-for-byte the published hex tarballs (diff -r against repo.hex.pm; only hex_metadata.config is extra). oban_pro itself could not be checked against its tarball, that repo needs the licensed credentials.
  • The v1.8 migration resolves against an existing 1.7 DB (recorded 1.7.0-schemas,1.7.0-indexes gives index 4 < 5, so only V180 runs), and every up_fun the new change_functions call re-runs on older versions is a CREATE OR REPLACE, so the replay is idempotent.
  • The 1.8 renames the config depends on still work: DynamicLifeline keeps rescue_interval as :period and to_timeout(second: 30) is still read as ms (same 30s), and the Engines.Smart shim omits only the four optional Oban.Engine callbacks, which Oban's with_compatible_engine falls back to Oban.Engines.Basic for.
  • Rust: sqlx 0.9.0's declared MSRV is exactly 1.94.0 and no other crate in the new lock declares higher (checked all 283 registry packages), so rust:1.94-trixie in rust/prop_grid_rs/Dockerfile still builds. tls-rustls is a real sqlx 0.9 feature and resolves to ring + webpki-roots, the same provider stack as the old runtime-tokio-rustls.

One non-code nit, not blocking: mix.exs pins {:nx, "~> 0.13"}, and a two-segment ~> means < 1.0.0, so nx is excluded by our own constraint as well as by axon's ~> 0.10. Bumping axon alone will not reach nx 1.0.0.

No findings. Reviewed the eight app-owned files in full; the 144 `vendor/**` files are upstream tarballs and were checked for integrity only, not line by line. Verified on the way through: - `mix.exs` / `mix.lock` consistency: `oban ~> 2.24` is satisfied by the locked 2.24.1 (which this PR does not move), and the three path deps match their vendored trees (oban_pro 1.8.0, oban_met 1.3.1, oban_web 2.13.0). - `vendor/oban_web` and `vendor/oban_met` are byte-for-byte the published hex tarballs (`diff -r` against repo.hex.pm; only `hex_metadata.config` is extra). oban_pro itself could not be checked against its tarball, that repo needs the licensed credentials. - The v1.8 migration resolves against an existing 1.7 DB (recorded `1.7.0-schemas,1.7.0-indexes` gives index 4 < 5, so only V180 runs), and every `up_fun` the new `change_functions` call re-runs on older versions is a `CREATE OR REPLACE`, so the replay is idempotent. - The 1.8 renames the config depends on still work: `DynamicLifeline` keeps `rescue_interval` as `:period` and `to_timeout(second: 30)` is still read as ms (same 30s), and the `Engines.Smart` shim omits only the four optional `Oban.Engine` callbacks, which Oban's `with_compatible_engine` falls back to `Oban.Engines.Basic` for. - Rust: sqlx 0.9.0's declared MSRV is exactly 1.94.0 and no other crate in the new lock declares higher (checked all 283 registry packages), so `rust:1.94-trixie` in `rust/prop_grid_rs/Dockerfile` still builds. `tls-rustls` is a real sqlx 0.9 feature and resolves to ring + webpki-roots, the same provider stack as the old `runtime-tokio-rustls`. One non-code nit, not blocking: `mix.exs` pins `{:nx, "~> 0.13"}`, and a two-segment `~>` means `< 1.0.0`, so nx is excluded by our own constraint as well as by axon's `~> 0.10`. Bumping axon alone will not reach nx 1.0.0. <!-- skippy-pr-review -->
graham merged commit 9aac3e7fbc into main 2026-09-19 14:43:41 -05:00
graham deleted branch chore/deps-bump-oban-pro-1-8 2026-09-19 14:43:42 -05:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
graham/prop!11
No description provided.