Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…anic Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…lorMode import Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
RevealInFinder and MoveToTrash were never built by any caller — the context menu performs both inline. Removing them makes the dispatch match exhaustive, so a future variant fails to compile instead of being silently swallowed by the catch-all arm. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- cleanup_selected pruning: collect-to-Vec then remove-in-loop is HashSet::retain, one line instead of twelve - Option::is_some_and replaces map_or(false, ..) in two predicates - collapse the nested hover-detection if into one condition Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Delete / empty-trash / batch-delete each hand-built the same modal: hidden title bar, center anchor, heading + detail label, right-aligned danger+ghost pair. Extracted to ui::widgets::confirm_dialog returning Option<bool> (None = undecided, Some = chose), next to the buttons it uses. Also flattens the Option<Option<_>> result plumbing into plain Option<NodeId> / Option<Vec<NodeId>> / bool. Only visual change: the single-delete dialog now uses the same 320/360 width as the other two. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…tart_scan Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…an Done branch Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ot-owned) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…-uploaded files) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… parent Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…uping Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ror in status_message Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…Caches, .gradle Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…TRY=1 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ally happened Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
remove_node and clear_descendants each had their own walk marking descendants dead — one recursive with a per-directory children clone, one iterative. Both now share the iterative version (no clone, no recursion depth limit). Also drop a dead `let new_id = …; let _ = new_id;` in graft_under. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Six copies of the same four-line f64-rect → egui::Rect conversion in treemap_view collapse to a single helper. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ogressInfo Cmd+1/2/3 were three copies of the same three-statement body; now one loop over (key, mode). ScanProgressInfo's zeroed literal was written out twice — derive Default and spread it. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…/parent checks Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This branch has not been deployed
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.
Sweep summary
Product: mac-dir-stat Branch: sweep/2026-09-22 Cycles: 3 Commits: 34 Tests: 7 → 35
3-cycle Red→Green→Refactor sweep. All 34 commits were built with
cargo testpassing after each one.Findings table
dir_tree.rs:190,treemap_view.rs:438)app_open/scan_completedoff-taxonomy → KPI buckets permanently zerocollect_files().len()every frame (full recursive walk + Vec alloc per frame)is_alive()panics on out-of-range NodeId (stale-id guard was itself unsafe)start_scandidn't clearpartial_refresh_receiver→ stale graft panic after rescantelemetry.txtabsent → default opted-in;page_viewfires before first UI frameset_telemetry_opt_outdiscarded write error silentlyfeedback_sent = trueeven when telemetry off (no send happened)feedback_textcleared unconditionally, wiping unsent textcleanup.rs:91path-suffix match not component-bounded (MyLibrary/CachesmatchedLibrary/Caches)targetbare-name rule matched any directory, including~/Documents/target.Trash/.Trashesoffered as cleanup candidates (nonsensical + root-owned)Library/Containers/com.apple.iCloud.iCloudDrivedescribed as safe to evict (data loss).m2/.gradlerules gave no warning about credential files (settings.xml,gradle.properties)move_to_trashfailure eprintln-only, no UI feedbackempty_trashblocked UI thread with synchronous.status()empty_trashfailure not surfaced instatus_messagestart_scanleftpending_action,hovered_dir,cleanup_candidatesstalepoll_scanDone didn't clearpending_action,hovered_dir,scroll_dir_tree_torecompute_sizes_upwardwrote into dead nodesPendingAction::RevealInFinder/MoveToTrashnever constructed (dead variants)children_sorted,node_count,StrRef::EMPTYdead codeBAR_FILLunused color constant;ext_listredundant branch; unused ColorMode importTests added
test_classify_cargo_target— Cargo.toml-sibling checktest_classify_non_cargo_target— no Cargo.toml → not classifiedtest_classify_library_caches— Library/Caches pathtest_classify_gradle_warning— .gradle warning in descriptiontest_no_telemetry_env_var_opts_out—MACDIRSTAT_NO_TELEMETRY=1pathRefactors
confirm_dialogwidget replacing three copy-pasted modal dialogsHashSet::retainreplacing manual loop;Option::is_some_andformap_or(false, …)predicatesPendingActionvariants removed, making the dispatch match exhaustivemark_descendants_deadreplacing two divergent recursive/iterative walksto_screen()helper eliminating 6 copies of the same rect-conversion in treemap_viewScanProgressInfoderivesDefaultNot fixed (scope/risk)
src/scanner/tree.rs:127—node()/node_mut()still index without bounds check (changing return type toOptionwould require touching ~40 call sites;is_aliveis now safe so callers can guard before calling)src/flywheel.rs:109—/dev/urandomfallback entropy (uuid quality only matters for analytics dedup; low impact)src/scanner/tree.rs:33—u32arena offset overflow (4 GiB of interned strings is not a realistic concern)dir_tree.rs(require dirty-tracking/caching refactor)🤖 Generated with Claude Code