Skip to content

decrating: replay PR #56 (plan+levels+chunking absorption) onto main#70

Merged
EffortlessSteven merged 4 commits into
mainfrom
replay-pr-56-on-main
Apr 15, 2026
Merged

decrating: replay PR #56 (plan+levels+chunking absorption) onto main#70
EffortlessSteven merged 4 commits into
mainfrom
replay-pr-56-on-main

Conversation

@EffortlessSteven

Copy link
Copy Markdown
Member

Why

PR #56 (shipper-plan + shipper-levels + shipper-chunking -> shipper::plan) was merged to the wrong base branch (feature/decrating-phase1-scaffold instead of main). As a result, its content never reached main.

Downstream absorption agents are now blocked because shipper-plan still depends on shipper-cargo and shipper-execution-core on main.

Source

Cherry-pick-equivalent of branch feature/decrating-absorb-plan, specifically:

The replay was performed via git merge --no-ff origin/feature/decrating-absorb-plan and then fixing up a reference (shipper_state::CURRENT_PLAN_VERSION -> crate::state::CURRENT_PLAN_VERSION) now that main has absorbed shipper-state into shipper::state.

What's included

  • Full absorption of shipper-plan into crates/shipper/src/plan/* (with sub-modules, snapshots, tests, docs)
  • Move of levels into crates/shipper/src/plan/levels/ (with Level type in shipper-types)
  • Inlining of chunking into crates/shipper/src/plan/chunking/
  • Removal of shipper-plan, shipper-levels, shipper-chunking workspace members
  • Removal of micro-plan feature and dependencies on it
  • Removal of old shipper-plan / shipper-levels matrix entries from the mutation-testing CI workflow and docs
  • Lint + doc fix from dbbef4d

Conflict resolution summary

git merge --no-ff produced 5 conflicts; all resolved via union-of-removals per the replay playbook:

File Resolution
Cargo.toml Remove shipper-plan from workspace members (already had shipper-process/lock/store/policy/config-runtime removed on main).
crates/shipper/Cargo.toml Drop shipper-plan dep, micro-plan feature, and micro-plan from micro-parallel / micro-all. Keep main's other absorption deltas.
crates/shipper-engine-parallel/Cargo.toml Drop both shipper-plan and shipper-policy deps (union). shipper-chunking already dropped by auto-merge.
.github/workflows/mutation.yml Drop -p shipper-plan, -p shipper-levels, -p shipper-policy matrix entries.
docs/testing.md Same matrix cleanup as mutation workflow.

Post-merge fix-up: crates/shipper/src/plan/mod.rs used shipper_state::CURRENT_PLAN_VERSION; since shipper-state is now an optional dep on main and the value is mirrored in the in-crate crate::state module, the two call sites were retargeted.

Validation (local, Windows)

All green:

  • cargo check --workspace - OK (222 crates)
  • cargo test -p shipper plan - 300 passed
  • cargo test -p shipper - 1471 passed, 4 ignored
  • cargo test -p shipper-cli - 451 passed (25 suites)
  • cargo build -p shipper-cli - OK
  • cargo clippy --workspace --all-targets --all-features -- -D warnings - no issues
  • cargo fmt --all -- --check - clean
  • RUSTDOCFLAGS=-Dwarnings cargo doc --workspace --no-deps --all-features - clean

Unblocks

  • cargo absorption agent (a91d1e8b5)
  • execution-core absorption agent (ac7f8b1a7)
  • any agent that needs a clean dep graph free of shipper-plan

Test plan

  • CI: architecture-guard
  • CI: ci (all targets)
  • CI: mutation workflow smoke (after next scheduled run)

@gemini-code-assist

Copy link
Copy Markdown

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@coderabbitai

coderabbitai Bot commented Apr 15, 2026

Copy link
Copy Markdown

Warning

Rate limit exceeded

@EffortlessSteven has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 24 minutes and 37 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 24 minutes and 37 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 7179e9fa-8e39-453c-ab0c-c57687645453

📥 Commits

Reviewing files that changed from the base of the PR and between 20c8766 and 3d01e1b.

⛔ Files ignored due to path filters (54)
  • Cargo.lock is excluded by !**/*.lock
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_1000_items_by_10.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_10_items_by_5.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_13_items_by_4_with_remainder.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_5_by_2.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_6_by_3.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_7_items_by_3.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_empty.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_exact_fit.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_large_list_by_7.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_max_concurrent_1.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_max_concurrent_usize_max.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_max_concurrent_zero.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_prime_37_by_6.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_single_item.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_single_item_max_one.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_chunk_size_1_with_4_items.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/chunking/snapshots/shipper__plan__chunking__snapshot_tests__snapshot_dependency_like_items_by_2.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/levels/snapshots/shipper__plan__levels__snapshot_tests__snapshot_all_independent.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/levels/snapshots/shipper__plan__levels__snapshot_tests__snapshot_cycle_fallback.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/levels/snapshots/shipper__plan__levels__snapshot_tests__snapshot_deep_binary_tree.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/levels/snapshots/shipper__plan__levels__snapshot_tests__snapshot_diamond_dependency.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/levels/snapshots/shipper__plan__levels__snapshot_tests__snapshot_disconnected_components.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/levels/snapshots/shipper__plan__levels__snapshot_tests__snapshot_double_diamond.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/levels/snapshots/shipper__plan__levels__snapshot_tests__snapshot_empty_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/levels/snapshots/shipper__plan__levels__snapshot_tests__snapshot_linear_chain.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/levels/snapshots/shipper__plan__levels__snapshot_tests__snapshot_wide_fan_out.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__build_dep_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__deep_chain_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__dev_dep_cycle_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__diamond_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__double_diamond_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__double_diamond_selected_mid.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__empty_workspace_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__error_cycle_detection.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__error_msg_cycle_detection.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__error_msg_missing_manifest.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__error_msg_non_publishable_dep.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__error_msg_selecting_non_publishable.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__error_msg_unknown_selected_package.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__error_non_publishable_dep.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__error_selecting_non_publishable.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__error_unknown_package.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__linear_chain_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__mixed_dep_kinds_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__multi_crate_plan_with_deps.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__multi_select_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__package_selection_b.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__plan_summary_display.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__prerelease_versions_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__single_crate_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__skipped_packages_detail.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__special_names_plan.snap is excluded by !**/*.snap
  • crates/shipper/src/plan/snapshots/shipper__plan__tests__wide_flat_plan_5.snap is excluded by !**/*.snap
📒 Files selected for processing (36)
  • .github/workflows/mutation.yml
  • Cargo.toml
  • crates/shipper-chunking/CLAUDE.md
  • crates/shipper-chunking/Cargo.toml
  • crates/shipper-chunking/README.md
  • crates/shipper-chunking/tests/chunking_bdd.rs
  • crates/shipper-chunking/tests/chunking_contract_integration.rs
  • crates/shipper-cli/Cargo.toml
  • crates/shipper-levels/CLAUDE.md
  • crates/shipper-levels/Cargo.toml
  • crates/shipper-levels/README.md
  • crates/shipper-plan/CLAUDE.md
  • crates/shipper-plan/Cargo.toml
  • crates/shipper-plan/README.md
  • crates/shipper-types/Cargo.toml
  • crates/shipper-types/src/lib.rs
  • crates/shipper/Cargo.toml
  • crates/shipper/src/engine/parallel/mod.rs
  • crates/shipper/src/engine/parallel/publish.rs
  • crates/shipper/src/engine/parallel/tests.rs
  • crates/shipper/src/lib.rs
  • crates/shipper/src/plan.rs
  • crates/shipper/src/plan/CLAUDE.md
  • crates/shipper/src/plan/chunking/CLAUDE.md
  • crates/shipper/src/plan/chunking/mod.rs
  • crates/shipper/src/plan/levels/CLAUDE.md
  • crates/shipper/src/plan/levels/mod.rs
  • crates/shipper/src/plan/mod.rs
  • crates/shipper/src/plan_micro.rs
  • docs/testing.md
  • fuzz/Cargo.toml
  • fuzz/fuzz_targets/engine_parallel_chunks.rs
  • fuzz/fuzz_targets/plan_builder.rs
  • fuzz/fuzz_targets/plan_levels.rs
  • fuzz/fuzz_targets/plan_ordering.rs
  • fuzz/fuzz_targets/release_levels.rs
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch replay-pr-56-on-main

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

EffortlessSteven added a commit that referenced this pull request Apr 15, 2026
Adds 5 binding rules learned from real incidents during execution:

- R-PR-1: Always pass --base main explicitly to gh pr create.
  Real incident: PR #56 merged to feature/decrating-phase1-scaffold
  instead of main. Content never reached main. Cargo + execution-core
  absorptions silently broke against the stale main. Recovery required
  PR #70 (replay of #56 onto main).

- R-PR-2: Verify branch state at session start (worktree HEAD switching).

- R-PR-3: Use forward-slash absolute paths in Edit/Write on Windows
  (backslash paths silently fail to persist).

- R-PR-4: Pre-flight grep for cross-crate deps before absorbing.

- R-PR-5: Type-promotion fallback when cascade is too tangled for
  global reorder (per PR #56's pattern).

These rules are now binding for all remaining agent prompts.
…to shipper::plan

Move shipper-plan (3492 LOC), shipper-levels (1450 LOC), and
shipper-chunking (814 LOC) into crates/shipper/src/plan/ as crate-private
modules. plan/mod.rs absorbs shipper-plan; plan/levels/ absorbs
shipper-levels; plan/chunking/ absorbs shipper-chunking.

Delete the stale 1584-LOC duplicate at crates/shipper/src/plan.rs and the
1-LOC re-export shim at plan_micro.rs. Remove all three standalone crates
from workspace members and shipper's deps. Drop the micro-plan feature.

build_plan, PlannedWorkspace, and SkippedPackage stay publicly reachable
(public library API). Other plan internals become pub(crate). Since
shipper-engine-parallel and shipper-types sit below shipper in the
dependency graph, move the shared domain types (PlannedWorkspace,
SkippedPackage) into shipper-types; add a crate-public
group_packages_by_levels algorithm to shipper-types to replace the
absorbed shipper-levels dependency; inline chunk_by_max_concurrent into
shipper-engine-parallel for the same reason. Update fuzz targets to
consume the absorbed APIs via shipper::plan and shipper_types.

All three absorbed in one PR because they share creation of the new
crates/shipper/src/plan/ layer dir (Rust can't have both plan.rs and
plan/mod.rs simultaneously).
- Reorder `pub use` after `use` in `crates/shipper/src/plan/mod.rs` to
  satisfy `cargo fmt --check` (import grouping rule).
- Fix broken intra-doc links `[ReleasePlan]` and `[PlannedWorkspace]`
  in the `plan` module-level docs by using disambiguated paths
  `[`ReleasePlan`](shipper_types::ReleasePlan)` and
  `[`PlannedWorkspace`](shipper_types::PlannedWorkspace)`. The bare
  links failed under `-D rustdoc::broken-intra-doc-links` because
  neither name is in scope at doc-resolution time for the module.

CI logs:
- https://github.com/EffortlessMetrics/shipper/actions/runs/24437331983/job/71394343775
- https://github.com/EffortlessMetrics/shipper/actions/runs/24437331983/job/71394343790
After rebasing PR #70 (plan+levels+chunking absorption replay) onto
current main (which has PR #64's engine_parallel absorption), three
drift corrections are needed:

- engine::parallel::{mod,publish,tests}.rs: `shipper_plan::PlannedWorkspace`
  -> `crate::plan::PlannedWorkspace`; `shipper_chunking::chunk_by_max_concurrent`
  -> `crate::plan::chunking::chunk_by_max_concurrent`. The parallel engine
  was absorbed into shipper itself (PR #64), so it references sibling modules
  directly instead of the former microcrates.
- engine::parallel::run_publish_parallel: drop the shipper_plan reconstruction
  dance (both sides use the same shipper_types::PlannedWorkspace) and forward
  the host ws directly to run_publish_parallel_inner.
- plan::mod.rs: `crate::state::CURRENT_PLAN_VERSION` -> `crate::state::execution_state::CURRENT_PLAN_VERSION`
  (the const is re-exported from shipper-state via state::execution_state).
- plan::chunking::chunk_by_max_concurrent: promote `pub(crate)` to `pub` so
  the integration BDD test (`tests/engine_parallel_chunking_bdd.rs`) and the
  engine::parallel re-export can reach it.
- engine::parallel::mod.rs: `pub use crate::plan::chunking::chunk_by_max_concurrent`
  preserves the former `shipper::engine::parallel::chunk_by_max_concurrent`
  public surface for consumers.
@EffortlessSteven EffortlessSteven merged commit 95cc84f into main Apr 15, 2026
9 of 15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant