devclean-cli 0.5.0

Audit and safely remove rebuildable development artifacts
Documentation
<!doctype html>
<html lang="vi">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Xác minh báo cáo devclean và trạng thái resolve hiện tại</title>
    <link rel="stylesheet" href="/assets/report.css">
    <link rel="stylesheet" href="../../.claude/skills/html-report/assets/report.css">
</head>

<body>
    <header>
        <div class="head-inner">
            <span class="eyebrow">Independent verification · snapshot 22:39 +07</span>
            <h1>devclean — báo cáo đúng đến đâu, <em>issues đã đóng hết chưa?</em></h1>
            <p class="subtitle">Đối chiếu báo cáo 21:48 với source, diff chưa commit, test Rust/Swift,
                app bundle, scan thật ~/Dev, release GitHub và tài liệu chính thức của các công cụ so sánh.</p>
            <div class="meta">
                <span>📅 2026-07-11 22:39 +07</span>
                <span>📁 <code>/Users/justin/Dev/VibeLab/devclean</code></span>
                <span>🎯 HEAD v0.4.1 + working tree hiện tại</span>
                <span><span class="badge warn">Chưa resolve hết</span></span>
            </div>
        </div>
    </header>

    <main>
        <section class="panel ok">
            <h2>Update sau remediation</h2>
            <p class="lead"><b>Các finding trong báo cáo này đã được xử lý trong working tree.</b> CocoaPods yêu cầu
                lockfile, fuzz lock đã đồng bộ, UI copy đã sửa, performance docs dùng repeated median và báo cáo gốc
                đã được hiệu đính. Xem <a href="completion-260711-2320-devclean-all-findings-resolved.html">completion report</a>
                để biết bằng chứng gate cuối cùng.</p>
        </section>
        <section class="panel warn">
            <h2>Tóm tắt điều hành</h2>
            <p class="lead"><b>Báo cáo gốc đúng phần lớn về code, lịch sử và release, nhưng không đủ chính xác để
                    xem là audit độc lập hoàn chỉnh.</b> Các fact nội bộ quan trọng được xác minh; tuy nhiên có một fact
                so sánh sai, nhiều tuyên bố “duy nhất/không có lỗi an toàn” vượt quá bằng chứng, và điểm 8,7/10 là đánh
                giá chủ quan. Working tree hiện tại đã xử lý tốt đa số vấn đề, nhưng chưa thể nói “resolve all”.</p>

            <div class="cards">
                <div class="card ok"><span class="num">6/9</span><span class="label">Issue đóng sạch</span></div>
                <div class="card warn"><span class="num">3/9</span><span class="label">Issue mới partial</span></div>
                <div class="card info"><span class="num">66</span><span class="label">Test hiện tại pass</span></div>
                <div class="card danger"><span class="num">1</span><span class="label">Gap safety mới cần quyết định</span></div>
            </div>

            <div class="callout warn">
                <span><strong>Kết luận ngắn:</strong> chưa nên merge/release với tuyên bố “all issues resolved”. Cần chốt
                    performance evidence, cập nhật fuzz lock + text default roots, và quyết định contract cho CocoaPods
                    trước.</span>
            </div>
        </section>

        <section class="panel">
            <h2>Mục lục</h2>
            <div class="toc">
                <a href="#accuracy">1 — Độ chính xác của báo cáo gốc</a>
                <a href="#issues">2 — Ma trận resolve 9 issue</a>
                <a href="#findings">3 — Findings còn mở / mới phát hiện</a>
                <a href="#evidence">4 — Bằng chứng chạy thực tế</a>
                <a href="#sources">5 — Nguồn và giới hạn xác minh</a>
                <a href="#next">6 — Thứ tự xử lý đề xuất</a>
            </div>
        </section>

        <section id="accuracy" class="panel info">
            <h2><span class="num">1</span>Độ chính xác của báo cáo gốc</h2>
            <table class="zebra">
                <thead>
                    <tr>
                        <th>Nhóm kết luận</th>
                        <th>Phán quyết</th>
                        <th>Đối chiếu</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>Lịch sử “1 ngày, 7 commit, 6 release, 10:22→18:58”</td>
                        <td><span class="badge ok">Đúng</span></td>
                        <td><code>git rev-list</code>, tag list và timestamp commit khớp hoàn toàn.</td>
                    </tr>
                    <tr>
                        <td>Release pin SHA, attestation, notarization, checksum</td>
                        <td><span class="badge ok">Đúng</span></td>
                        <td>Workflow release dùng SHA immutable; run v0.4.1 thành công và release có app universal,
                            SBOM, SHA256SUMS cùng binary đa nền tảng.</td>
                    </tr>
                    <tr>
                        <td>Kiến trúc scan → revalidate → quarantine</td>
                        <td><span class="badge ok">Đúng</span></td>
                        <td><code>cleaner::validate_candidate</code> lặp containment/category/Git guard trước
                            quarantine; Swift chỉ truyền path và không shell.</td>
                    </tr>
                    <tr>
                        <td>41 Rust + 12 Swift test tại thời điểm báo cáo</td>
                        <td><span class="badge ok">Hợp lý theo snapshot</span></td>
                        <td>Working tree hiện đã tăng lên 52 Rust + 14 Swift. Không dùng count hiện tại để phủ định
                            count lịch sử.</td>
                    </tr>
                    <tr>
                        <td>83 candidate / 240,78 GiB trên ~/Dev</td>
                        <td><span class="badge ok">Được tái xác nhận gần sát</span></td>
                        <td>Scan hiện tại vẫn ra đúng 83 candidate / 241,23 GiB; chênh ~0,45 GiB là drift hợp lý.</td>
                    </tr>
                    <tr>
                        <td>“npkill: node_modules only”</td>
                        <td><span class="badge warn">Sai</span></td>
                        <td>node_modules là mặc định, nhưng npkill có <code>--target</code> và tài liệu chính thức cho ví
                            dụ quét <code>dist</code>, <code>vendor</code>.</td>
                    </tr>
                    <tr>
                        <td>“devclean duy nhất có …” trong bảng đối thủ</td>
                        <td><span class="badge warn">Chưa chứng minh</span></td>
                        <td>Không có citation, version pin hay source audit của đối thủ. Kondo v0.9 hiện hỗ trợ 20+ loại
                            project; CleanMyMac có lựa chọn Move to Trash ở một số module.</td>
                    </tr>
                    <tr>
                        <td>“Mọi cam kết an toàn đứng vững / không có lỗi an toàn”</td>
                        <td><span class="badge warn">Nói quá bằng chứng</span></td>
                        <td>Hai trap và test suite là bằng chứng tốt, không phải chứng minh đầy đủ. Nên viết “không phát
                            hiện lỗi trong phạm vi test đã chạy”.</td>
                    </tr>
                    <tr>
                        <td>Điểm 8,7/10 và “production-ready”</td>
                        <td><span class="badge gray">Ý kiến</span></td>
                        <td>Không sai về fact, nhưng rubric không định nghĩa trọng số/exit criteria nên không tái lập
                            được như một kết quả kiểm toán.</td>
                    </tr>
                    <tr>
                        <td>Tuân thủ format report của repo</td>
                        <td><span class="badge warn">Không đạt</span></td>
                        <td>Báo cáo gốc dùng Tailwind CDN, một block <code>&lt;style&gt;</code> tự viết và CSS được inject lúc chạy; không dùng Magazine
                            theme / stylesheet canonical như AGENTS.md yêu cầu. Nó render được khi online nhưng không
                            self-contained/offline-stable.</td>
                    </tr>
                </tbody>
            </table>
        </section>

        <section id="issues" class="panel">
            <h2><span class="num">2</span>Ma trận resolve 9 issue đã nêu</h2>
            <table class="matrix">
                <thead>
                    <tr>
                        <th>Issue</th>
                        <th>Code</th>
                        <th>Test / proof</th>
                        <th>Kết luận</th>
                    </tr>
                </thead>
                <tbody>
                    <tr><th>Category table padding</th><td class="y"></td><td class="y"></td><td class="y">Đóng</td></tr>
                    <tr><th>Epoch thô</th><td class="y">RFC3339</td><td class="y">2 cases</td><td class="y">Đóng</td></tr>
                    <tr><th>Scan performance</th><td class="p">8 workers</td><td class="n">Không ổn định</td><td class="p">Partial</td></tr>
                    <tr><th>scan --all no-op</th><td class="y">Help rõ</td><td class="y">CLI help</td><td class="y">Đóng bằng docs</td></tr>
                    <tr><th>JSONL thiếu learning</th><td class="y"></td><td class="y"></td><td class="y">Đóng</td></tr>
                    <tr><th>fs2 unmaintained</th><td class="p">Root → fs4</td><td class="n">fuzz lock stale</td><td class="p">Partial</td></tr>
                    <tr><th>Swift style gate</th><td class="y"></td><td class="y">Strict pass</td><td class="y">Đóng</td></tr>
                    <tr><th>Fuzz không chạy CI</th><td class="y">Scheduled job</td><td class="p">Chưa có run mới</td><td class="y">Đã implement</td></tr>
                    <tr><th>Documents/Codex default</th><td class="p">Core bỏ</td><td class="n">UI còn text cũ</td><td class="p">Partial</td></tr>
                </tbody>
            </table>

            <div class="callout ok">
                <span><strong>Các khuyến nghị ngoài 9 issue:</strong> App Sandbox đã được ghi vào SAFETY.md; Learning
                    Mode đã tăng từ 1 lên 4 rule; app có decoder forward-compatible và test wire name Rust↔Swift.</span>
            </div>
        </section>

        <section id="findings" class="panel danger">
            <h2><span class="num">3</span>Findings còn mở / mới phát hiện</h2>

            <h3><span class="badge warn">P1</span> Performance claim chưa tái lập, closure quá sớm</h3>
            <table class="kv">
                <tr><th>Claim mới</th><td><code>docs/PERFORMANCE.md:19</code> ghi 2m02–2m10 trên 83 candidate / ~241 GiB.</td></tr>
                <tr><th>Đo live</th><td>Working binary: 266,28s cold-ish và 143,47s warm; binary v0.4.1: 240,19s. Cùng root, cùng 83 candidate.</td></tr>
                <tr><th>Đánh giá</th><td>Worker pool có thể cải thiện, nhưng variance 143–266s quá lớn để chọn một số đẹp và gọi issue đã đóng.</td></tr>
                <tr><th>Cần làm</th><td>Cold + warm runs xen kẽ baseline/current, tối thiểu 5 lượt mỗi bên; báo median/p95 và ghi trạng thái cache/nguồn điện. Chỉ giữ claim khi improvement lặp lại &gt;5%.</td></tr>
            </table>

            <h3><span class="badge warn">P1</span> Rule CocoaPods có thể xóa dependency không tái dựng đúng phiên bản</h3>
            <table class="kv">
                <tr><th>Bằng chứng</th><td><code>src/scanner.rs:529-530</code> chỉ cần tên <code>Pods</code> + sibling <code>Podfile</code>.</td></tr>
                <tr><th>Rủi ro</th><td>Không yêu cầu <code>Podfile.lock</code>; sau khi xóa, <code>pod install</code> có thể resolve phiên bản khác. Git guard chỉ bảo vệ file tracked, không bảo vệ chỉnh sửa local/untracked trong Pods.</td></tr>
                <tr><th>Giới hạn</th><td>Đây là path được user approve, không phải auto-clean; revalidation/containment/Git guard vẫn đúng. Finding nằm ở contract “rebuildable”, không phải path escape.</td></tr>
                <tr><th>Cần làm</th><td>Yêu cầu <code>Podfile.lock</code>, hoặc hạ rule thành expensive/review-only với cảnh báo rõ ràng về reproducibility.</td></tr>
            </table>

            <h3><span class="badge info">P2</span> fs2 vẫn nằm trong fuzz lock; locked build thất bại</h3>
            <p><code>fuzz/Cargo.lock:178</code> vẫn tham chiếu <code>fs2</code>; <code>cargo check --manifest-path fuzz/Cargo.toml --locked</code>
                trả về “cannot update the lock file”. Workflow fuzz hiện không dùng <code>--locked</code> khi chạy target nên có thể tự sửa lock trên runner,
                nhưng repo không còn reproducible và claim “replaced fs2” chưa sạch tận gốc.</p>

            <h3><span class="badge info">P2</span> UI vẫn quảng bá default root đã bị bỏ</h3>
            <p><code>Views.swift:417</code> còn “~/Dev, ~/Projects and ~/Documents/Codex”, trong khi core, example config và changelog đều nói chỉ còn ~/Dev + ~/Projects.</p>
        </section>

        <section id="evidence" class="panel info">
            <h2><span class="num">4</span>Bằng chứng chạy thực tế</h2>
            <table class="zebra">
                <thead><tr><th>Gate</th><th>Kết quả</th><th>Ghi chú</th></tr></thead>
                <tbody>
                    <tr><td><code>cargo fmt --check</code></td><td><span class="badge ok">Pass</span></td><td>Không diff format.</td></tr>
                    <tr><td><code>cargo clippy ... -D warnings</code></td><td><span class="badge ok">Pass</span></td><td>All targets/features.</td></tr>
                    <tr><td>Rust tests</td><td><span class="badge ok">52/52</span></td><td>36 lib + 5 bin + 11 CLI.</td></tr>
                    <tr><td>Swift strict format + tests</td><td><span class="badge ok">14/14</span></td><td><code>swift format lint --strict</code> sạch.</td></tr>
                    <tr><td>App bundle + codesign</td><td><span class="badge ok">Pass</span></td><td>Helper v0.4.1 executable; deep/strict verify hợp lệ.</td></tr>
                    <tr><td><code>cargo package --allow-dirty --locked</code></td><td><span class="badge ok">Pass</span></td><td>51 files; verify package build pass.</td></tr>
                    <tr><td>Fuzz manifest locked</td><td><span class="badge warn">Fail</span></td><td>Stale <code>fuzz/Cargo.lock</code>.</td></tr>
                    <tr><td>Synthetic benchmark</td><td><span class="badge ok">0,18s</span></td><td>Gần số docs 0,22s; fixture không đại diện cây thật.</td></tr>
                    <tr><td>Real scan current #1</td><td><span class="badge warn">266,28s</span></td><td>83 candidate / 241,23 GiB.</td></tr>
                    <tr><td>Real scan v0.4.1</td><td><span class="badge warn">240,19s</span></td><td>Cùng cây, chạy giữa hai lượt current.</td></tr>
                    <tr><td>Real scan current #2</td><td><span class="badge info">143,47s</span></td><td>Variance cache/I/O rất lớn.</td></tr>
                    <tr><td>GitHub release v0.4.1</td><td><span class="badge ok">Success</span></td><td>Run 29151861673; assets + checksums + SBOM tồn tại.</td></tr>
                </tbody>
            </table>

            <pre><code>Snapshot diff fingerprint:
588992a50fc684bcb8bfb9ccff5cedca1cb200bf2be13b640353af12cf4d25f7

Live scan aggregate:
83 candidates · 259,015,778,304 bytes · 241.23 GiB · 1 protected Git-tracked warning</code></pre>
        </section>

        <section id="sources" class="panel">
            <h2><span class="num">5</span>Nguồn và giới hạn xác minh</h2>
            <ul>
                <li>Source/diff/tests trong workspace; báo cáo gốc tại <code>plans/reports/danh-gia-260711-2148-devclean-toan-dien.html</code>.</li>
                <li><a href="https://github.com/tuanle96/devclean/actions/runs/29151861673">GitHub Release run v0.4.1</a><a href="https://github.com/tuanle96/devclean/releases/tag/v0.4.1">release assets v0.4.1</a>.</li>
                <li><a href="https://github.com/tbillington/kondo">Kondo v0.9 official repository</a> — 20+ project types, tác giả tự mô tả là “rm -rf with a prompt”.</li>
                <li><a href="https://github.com/voidcosmos/npkill">npkill official repository</a> — node_modules mặc định, có custom target.</li>
                <li><a href="https://macpaw.com/support/cleanmymac-x/knowledgebase/large-and-old">CleanMyMac Large &amp; Old Files</a> — có Move to Trash / Remove Immediately theo module.</li>
                <li><a href="https://docs.rs/crate/fs4/latest">fs4 official crate docs</a> — fork của fs2, hỗ trợ async và thay libc bằng rustix.</li>
            </ul>
            <div class="callout warn">
                <span><strong>Giới hạn:</strong> chưa chạy fuzz 60 giây bằng nightly; chưa có GitHub Actions run cho diff chưa commit;
                    notarization chỉ được xác minh trên release v0.4.1, còn app local là ad-hoc signed. Scan performance chịu ảnh hưởng mạnh bởi filesystem cache và tải nền.</span>
            </div>
        </section>

        <section id="next" class="panel ok">
            <h2><span class="num">6</span>Thứ tự xử lý đề xuất</h2>
            <ol class="steps">
                <li>Chốt policy CocoaPods: bắt buộc <code>Podfile.lock</code> hoặc hạ mức “rebuildable”; thêm positive/negative + clean revalidation test.</li>
                <li>Cập nhật <code>fuzz/Cargo.lock</code>, chạy fuzz command thật và thêm <code>--locked</code> nếu muốn CI reproducible.</li>
                <li>Sửa text Settings bỏ <code>~/Documents/Codex</code>; thêm test hoặc centralize default-root copy để không drift lần nữa.</li>
                <li>Đo performance theo protocol nhiều lượt baseline/current, rồi sửa docs/changelog theo median thực tế.</li>
                <li>Sửa báo cáo gốc: bỏ “npkill only”, thay “duy nhất” bằng claim có version/citation, và đổi ngôn ngữ tuyệt đối về safety thành scope-bounded.</li>
            </ol>
        </section>
    </main>

    <footer>
        <div class="foot-inner">
            <span class="foot-brand"><span class="dot"></span>devclean verification</span>
            <span>Generated 2026-07-11 22:39 +07</span>
            <span>·</span>
            <span><code>HEAD 38a4ea4 + working tree</code></span>
            <span>·</span>
            <span>Không publish; không chứa raw candidate paths</span>
        </div>
    </footer>
</body>

</html>