refactor: extract output aggregation types into homeboy-output crate - #8163
Merged
Conversation
Moves the bulk-operation result/output aggregation types (BulkResult, MergeOutput, and friends) into a new path-only crate. It's a pristine leaf (serde only, zero in-crate deps, 533 LOC) used by 16 modules. Its call sites are unchanged — core/mod.rs re-exports the crate as output so crate::core::output::* keeps resolving. Chosen this round because paths (the originally-planned target) turned out to have a paths<->defaults dependency cycle that needs a dedicated dependency-inversion refactor rather than a lift-and-shift; output was the highest-impact genuinely-clean leaf available. Not published to crates.io; still ships as the single homeboy binary. cargo check --lib passes; the crate's 10 unit tests pass.
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.
Summary
Fifth step in the homeboy workspace split. Extracts the bulk-operation result / output aggregation types (
BulkResult,MergeOutput, and friends) into a new path-only cratehomeboy-output.No crates.io. Path-only workspace member; still ships as the single
homeboybinary.Why output (and a note on paths)
I set out to extract
pathsthis round, but analysis surfaced apaths⇄defaultsdependency cycle:paths::artifact_root()callsdefaults::load_config(), whiledefaultsimportspathsback. Breaking that requires a deliberate dependency-inversion refactor (thread the config value in rather than calling back) with real behavioral surface around config precedence — that deserves its own focused PR, not a rushed rider on an extraction.So I pivoted to the highest-impact genuinely-clean leaf available:
output. It's a pristine leaf (serde only, zero in-crate deps, 533 LOC) used by 16 modules.What changed
crates/homeboy-output/(serde only).src/core/output.rs→crates/homeboy-output/src/lib.rsviagit mv(100% rename).core/mod.rsre-exports it — all 16crate::core::output::*call sites unchanged.Verification
cargo check -p homeboy-output— passes.cargo check --lib— passes, 0 errors.cargo test -p homeboy-output— 10/10 unit tests pass.Progress
Crates now:
redaction,error,engine-primitives,product-identity,output(5).pathsis queued as a dedicated cycle-break PR — flagged so it gets the care it needs rather than a hasty cut.🤖 Generated with Claude Code