Skip to content

Commit 69e2bbf

Browse files
committed
bundler: run 50 ledger
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011f9aeT9x11EQzYoLSpY2qH
1 parent 14f24a0 commit 69e2bbf

2 files changed

Lines changed: 48 additions & 6 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
[agent] 2026-10-28: Bundler (RubyGems) bug-hunt run
2+
3+
**Tested:** main `b787454` (#1648, "vendor hosted patches directly from lockfiles", plus one dep bump since `4654b7c`) and latest release v5.0.1. Linux, Ruby 3.3.6, Bundler 4.0.18 and 2.5.22. Everything ran through scratch tests in `e2e_redirect_gem_build.rs` (real `gem build` / `bundle install`, wiremock API with `mount_vendored_grant`), reverted afterwards.
4+
5+
**Re-triage**
6+
- #1749: claimed, draft PR #1750 not merged yet, so I didn't re-run it.
7+
- #1109 (`agent:needs-human`): unchanged. No human replies on #316.
8+
9+
**Cells (#1648 plain `vendor` eject, which has no gem tests in that PR)**
10+
11+
| Cell | Result |
12+
| --- | --- |
13+
| Eject, top-level decl, converged lock, fresh checkout (nothing installed) → frozen install → `vendor --revert` → frozen install | pass (patched bytes, byte-clean revert), 4.0.18 |
14+
| Eject with a `.socket/manifest.json` naming another uuid + a manifest-only gem | pass (hosted uuid vendored, manifest byte-identical, manifest-only gem not vendored), 4.0.18 |
15+
| Eject, `gems.rb` twin (CHECKSUMS), dry run and wet run | pass (both refuse `gemfile_not_loaded`, untouched), 4.0.18 |
16+
| **Eject, decl in a `group` block: `vendor --dry-run` vs `vendor`** | **fail #1761** on 4.0.18 (CHECKSUMS lock and install-converged lock) and 2.5.22; dry run says `eject_planned`, exit 0; wet run refuses `gemfile_declaration_not_editable`, rolls back, exit 1 |
17+
| Eject on an unconverged (Gemfile-only) hosted pin | `noManifest`, exit 0, nothing done (documented: Gemfile-only pins aren't references, CLI_CONTRACT "Lockless pins") |
18+
19+
**Filed / commented / closed**
20+
- Filed #1761 (https://github.com/SocketDev/socket-patch/issues/1761). `run_eject`'s preview (`vendor.rs:1840`) relies on the gem backend's dry run, which skips the declaration gate, and never calls `gem_takeover_refusals_for`. The behaviour is the same at `8244b94`, but #1648 added the "backend refusals are previewed" promise.
21+
22+
**Ruled out**
23+
- A re-run of `vendor` after an eject with a manifest present falls back to manifest-driven vendoring and fails on my synthetic manifest. That's the documented legacy fallback, not a bug.
24+
25+
**Next**
26+
1. Re-run #1749 when #1750 merges, and #1109 / #1761 when fixed.
27+
2. Eject on a Bundler ≤ 2.1 merged lock with two hosted gems (does it hit #1749's attribution gap?).
28+
3. Eject with a `BUNDLE_GEMFILE` dual boot / `eval_gemfile` direct dep (dry run vs wet run parity, as in #1761).
29+
4. The full gem suites on 1.17.3 / Ruby 3.1.6, plus the stale-install suite without `--ignored`.
30+
5. Vendored supersede that changes runtime deps; the macOS / Windows probe backlog.

‎state/bundler.md‎

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[agent] Progress ledger for the scheduled Bundler (RubyGems) bug-hunt routine (label pm:bundler).
22

3-
Last updated: 2026-10-27 (run 49), main `4654b7c`, latest release v5.0.1 (npm; no git tags). Newest Bundler: 4.0.23 stable, 4.1.0.beta2 (no newer release). Gem redirect and vendor suites pass on 4.0.23 at `4654b7c` (run 49). Ruby 3.1.6 is now in the sandbox (`/opt/rbenv/versions/3.1.6/bin`), so Bundler 1.17.3 runs.
3+
Last updated: 2026-10-28 (run 50), main `b787454`, latest release v5.0.1 (npm; no git tags). Newest Bundler: 4.0.23 stable, 4.1.0.beta2 (no newer release). Gem redirect and vendor suites pass on 4.0.23 at `4654b7c` (run 49). Ruby 3.1.6 is now in the sandbox (`/opt/rbenv/versions/3.1.6/bin`), so Bundler 1.17.3 runs.
44

55
## Coverage matrix
66

@@ -438,6 +438,16 @@ Also on 4.0.17: BOM `Gemfile` passes; symlinked `Gemfile` / lock is refused (pas
438438
| Unwind after a superseding rescan with the gen-2 archive in `vendor/cache` → `upstream_gem_stale_cache` | pass | pass | pass |
439439
| Unwind in the unconverged (no-CHECKSUMS) supersede window → consistent pair | **fail #1626** | **fail #1626** | **fail #1626** |
440440

441+
### Run 50 (main `b787454`, v5.0.1; Linux Ruby 3.3.6; #1648 plain `vendor` eject, scratch tests in `e2e_redirect_gem_build.rs`, real `bundle install`)
442+
443+
| Cell | 4.0.18 | 2.5.22 |
444+
| --- | --- | --- |
445+
| Eject, top-level decl, fresh checkout → frozen install → `vendor --revert` → frozen install | pass | — |
446+
| Eject with a stale `.socket/manifest.json` (other uuid + manifest-only gem) | pass (manifest ignored, byte-identical) | — |
447+
| Eject, `gems.rb` twin, dry run and wet run | pass (both `gemfile_not_loaded`) | — |
448+
| Eject, `group`-block decl: dry run vs wet run parity | **fail #1761** | **fail #1761** |
449+
| Eject on an unconverged Gemfile-only pin | no-op `noManifest` (documented) | — |
450+
441451
### Run 49 (main `4654b7c`, v5.0.1; Linux; scratch tests in `e2e_redirect_gem_build.rs`, real `bundle install` / `bundle exec`)
442452

443453
| Cell | 1.17.3 (Ruby 3.1.6) | 2.1.4 | 2.5.22 | 4.0.18 | 4.0.23 |
@@ -482,11 +492,11 @@ Also on 4.0.17: BOM `Gemfile` passes; symlinked `Gemfile` / lock is refused (pas
482492

483493
## Backlog
484494

485-
1. Re-run #1749 and #1109 (`agent:needs-human`) when fixes merge. #985, #1235, #1594, #1626 and #1688 are fixed; they were spot-checked in run 49 (#985 merged pins, #1688 single-gem supersede).
486-
2. #1749 follow-up: a lock that started merged on 2.1, then converged under Bundler 2.2+ / 4.x (does the upgraded lock stay merged and hit #1749?).
487-
3. The full gem suites on Bundler 1.17.3 / Ruby 3.1.6 (now possible in the sandbox), plus `e2e_redirect_gem_stale_install` (its tests aren't `#[ignore]`d, so run it without `--ignored`).
488-
4. Vendored superseding patch that changes the gem's runtime deps (the PATH `specs:` must follow the new stub gemspec).
489-
5. Windows / macOS probe backlog (#952, #1092, #1260). Re-run the gem suites on 4.1.0 final when it ships.
495+
1. Re-run #1749 when #1750 merges, and #1109 (`agent:needs-human`) / #1761 when fixed.
496+
2. Eject (#1648) on a Bundler ≤ 2.1 merged lock with two hosted gems (#1749 interplay), and on a `BUNDLE_GEMFILE` dual boot / `eval_gemfile` direct dep (dry run vs wet run parity).
497+
3. #1749 follow-up: a lock that started merged on 2.1, then converged under Bundler 2.2+ / 4.x.
498+
4. The full gem suites on Bundler 1.17.3 / Ruby 3.1.6, plus `e2e_redirect_gem_stale_install` (its tests aren't `#[ignore]`d, so run it without `--ignored`).
499+
5. Vendored superseding patch that changes the gem's runtime deps; the Windows / macOS probe backlog (#952, #1092, #1260); the gem suites on 4.1.0 final when it ships.
490500

491501
## Known non-bugs
492502

@@ -622,3 +632,5 @@ Also on 4.0.17: BOM `Gemfile` passes; symlinked `Gemfile` / lock is refused (pas
622632
- The #1646 user-patch consent gate has no gem evidence (CLI_CONTRACT.md's detection table lists no Bundler mechanism). That's documented scope (run 49).
623633
- Bundler 2.5 / 2.6 never merge a gemspec dev dep into a later Gemfile `gem` line (they only merge dev + dev). 2.7 is the right boundary for `bundler_merges_dev_dependencies` (checked in the 2.5.23 / 2.6.9 / 2.7.0 `dsl.rb`, run 49).
624634
- Manifestless `vex` in the redirect harness needs `--api-url`, `--org`, `--api-token` and `--patch-server-url <mock>`, or every Bundler version reads `manifest_not_found` (run 49).
635+
- Plain `vendor` on a hosted gem whose lock isn't converged yet (Gemfile-only wiring, before the first unfrozen `bundle install`) finds no hosted pins and exits 0 with `noManifest`. That's documented: Gemfile-only pins aren't references (CLI_CONTRACT "Lockless pins") (run 50).
636+
- After an eject (#1648), a later plain `vendor` with a `.socket/manifest.json` present falls back to manifest-driven vendoring, because no hosted pins are left. That's the documented legacy fallback (run 50).

0 commit comments

Comments
 (0)