Make recursive release component-aware and atomic - #176
Merged
Conversation
plx
marked this pull request as ready for review
August 4, 2026 17:38
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #112
Scope
Recursive release previously enumerated outside a transaction and committed one deletion at a time. This change resolves the target once, builds one component-aware batch plan inside an IMMEDIATE transaction, executes every selected deletion in that transaction, and commits only after the full batch succeeds. Exact and recursive release now share tag selection, path-safety, dry-run planning, execution, and output handling.
The planner applies default all-tag, exact-tag, and untagged-only semantics at every selected path. Documentation now records component-aware matching, atomicity, writer serialization, and dry-run behavior.
Stack
3bff053586fc8691fd59315fa5fa035bb240cdb8Red-before-fix evidence
cargo test -p trop-cli --test release_command test_release_recursive_deletion_is_atomic --all-features -- --exactexited 101 before the implementation: the injected later delete failure left the earlier parent deletion committed, triggeringan earlier recursive deletion committed despite a later failure.The component-prefix, dry-run selection, and tag-mode regressions were already green on the vulnerable revision because earlier path and exact-release work had supplied those pieces; the confirmed remaining defect was transaction ownership.
Validation
cargo test -p trop-cli --test release_command --all-features— 34 passedcargo test -p trop operations::release --all-features— 20 passedcargo test -p trop-cli commands::release::tests::recursive_release_serializes_addition_and_refresh_after_planning --all-features -- --exact— passedcargo test -p trop --test concurrent_operations test_concurrent_recursive_release_serializes_with_reserve_processes --all-features -- --exact— passed across three race iterationscargo test --workspace --all-targets --all-features --locked— passedcargo clippy --workspace --all-targets --all-features --locked -- -D warnings— passedcargo build --release --workspace --all-targets --all-features --locked— passedRUSTDOCFLAGS="-D warnings" cargo doc --workspace --all-features --no-deps --locked— passedcargo fmt --all -- --checkandgit diff --check— passedjust test-production-readiness-selector— 61 passedagentic-navigation-guide checkandagentic-navigation-guide verify— passedAcceptance criteria
/work/abwhen selecting/work/a.Residual risks
None identified.