Skip to content

feat: revalidate developer artifact cleanup - #171

Merged
seonghobae merged 12 commits into
mainfrom
feat/dev-artifact-revalidation-v1
Aug 11, 2026
Merged

feat: revalidate developer artifact cleanup#171
seonghobae merged 12 commits into
mainfrom
feat/dev-artifact-revalidation-v1

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Summary

  • bind developer-artifact cleanup to a bounded metadata-only manifest
  • bind the reviewed root to a platform filesystem-object identity (Unix device/inode, Windows volume/file index)
  • atomically stage the exact object in a private sibling directory, re-check identity, then pass only that staged object to the OS trash
  • reject stale, recreated, incomplete, unreadable, or replaced candidates before trashing

Safety

  • no permanent-delete path added; cleanup still uses the OS trash and journal
  • file contents are never read for the fingerprint
  • cloud copy, source eviction, cache deletion, and worktree prune/remove were not executed

Validation

  • cargo test --locked --quiet --lib (542 passed, 1 ignored)
  • focused replacement-identity regression passed
  • npm run check (0 errors, 0 warnings)
  • npm test -- --run (81 passed)
  • npm run build (success)

Base: current main 7b81efd43c48439d7a4a5508f6d09ac15f141546; final head fd11e8ccab93d644ce81459fc78c0415bc903431.

Summary by CodeRabbit

  • 새 기능
    • 개발 아티팩트를 메타데이터와 스캔 상태 확인 후 안전하게 휴지통으로 이동합니다.
    • 경로, 용량, 파일 수, 지문 및 스캔 상태를 정리 화면에서 확인할 수 있습니다.
    • 회수 계획에서 선택적으로 활성 사용 중인 프로세스 정보를 확인할 수 있습니다.
  • 개선 사항
    • 변경·교체되었거나 읽을 수 없고, 스캔이 완료되지 않은 항목은 제외됩니다.
    • macOS 클라우드 폴더 확인의 안정성이 향상되었습니다.
    • iCloud 동기화 스냅샷의 과도한 파일 크기를 제한합니다.
  • 안전성
    • 정리 직전 파일 변경 및 교체 여부를 확인해 잘못된 삭제를 방지합니다.
    • 모든 파괴적 작업의 처리 내역을 기록합니다.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a54334f1-5dd8-497e-88cb-37d5277c7e98

📥 Commits

Reviewing files that changed from the base of the PR and between ac79ffd and 19f7880.

📒 Files selected for processing (5)
  • docs/superpowers/specs/2026-07-21-apfs-reclaim-evidence-design.md
  • src-tauri/src/git_worktree.rs
  • src-tauri/src/lib.rs
  • src-tauri/src/reclaim.rs
  • src/lib/Cleanup.svelte
🚧 Files skipped from review as they are similar to previous changes (4)
  • docs/superpowers/specs/2026-07-21-apfs-reclaim-evidence-design.md
  • src-tauri/src/lib.rs
  • src/lib/Cleanup.svelte
  • src-tauri/src/reclaim.rs

📝 Walkthrough

Walkthrough

개발 아티팩트에 bounded metadata manifest, fingerprint, 파일시스템 객체 식별자 검증을 추가했습니다. 정리 명령과 UI는 검증된 항목만 처리합니다. macOS 클라우드 열거, iCloud 스냅샷 크기, reclaim active-use 증거에도 제한을 추가했습니다.

Changes

개발 아티팩트 정리

Layer / File(s) Summary
Bounded manifest와 fingerprint 생성
src-tauri/src/dev_artifacts.rs, src/lib/api.ts
manifest가 통계, scan 상태, object ID, BLAKE3 fingerprint를 생성합니다. 프론트엔드 계약이 새 필드를 반영합니다.
객체 식별자와 원자적 staging
src-tauri/src/safety.rs, src-tauri/Cargo.toml
플랫폼별 object ID를 생성합니다. 검증된 객체를 private staging 디렉터리를 거쳐 휴지통으로 이동합니다.
Fingerprint 검증과 정리 명령
src-tauri/src/commands.rs, src-tauri/src/lib.rs
Tauri 명령이 현재 manifest, fingerprint, scan 상태, object ID를 검증합니다. 변경된 아티팩트는 정리하지 않습니다.
프론트엔드 계약과 정리 UI
src/lib/Cleanup.svelte, src/lib/api.ts, README.md
UI가 완료된 아티팩트만 선택합니다. 정리 API를 호출하고 안전성 절차를 문서화합니다.

macOS 클라우드 디렉터리 probe

Layer / File(s) Summary
제한된 클라우드 디렉터리 열거
src-tauri/src/cloud.rs
macOS에서 bounded /usr/bin/find probe를 사용합니다. 시간 초과, 출력 초과, 실행 오류와 자식 경로 파싱을 처리합니다.

iCloud 스냅샷 소스 크기 제한

Layer / File(s) Summary
스냅샷 소스 크기 검증
src-tauri/src/icloud_sync_health.rs
client.db와 WAL 파일이 각각 512MiB를 초과하면 지정된 오류를 반환합니다. 초과 크기 테스트를 추가했습니다.

Reclaim active-use 증거

Layer / File(s) Summary
Active-use 옵션과 계획 생성
src-tauri/src/reclaim.rs, src-tauri/src/git_worktree.rs, src-tauri/src/bin/disksage-reclaim-plan.rs, docs/superpowers/specs/*
--check-active-use가 선택적 probe를 활성화합니다. 계획 결과에 제한된 active-use 증거를 포함합니다. 기본 출력은 기존 동작을 유지합니다.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant CleanupUI
  participant cleanDevArtifacts
  participant clean_dev_artifacts_inner
  participant artifact_manifest
  participant trash_delete_if_identity
  participant FileSystem

  CleanupUI->>cleanDevArtifacts: 선택된 DevArtifact 전달
  cleanDevArtifacts->>clean_dev_artifacts_inner: Tauri 명령 호출
  clean_dev_artifacts_inner->>artifact_manifest: 현재 아티팩트 재스캔
  artifact_manifest->>FileSystem: bounded metadata 조회
  FileSystem-->>artifact_manifest: 통계와 fingerprint 반환
  artifact_manifest-->>clean_dev_artifacts_inner: 현재 manifest 반환
  clean_dev_artifacts_inner->>trash_delete_if_identity: expected object ID 전달
  trash_delete_if_identity->>FileSystem: staging 이동과 identity 재검증
  FileSystem-->>trash_delete_if_identity: 휴지통 이동 결과
  trash_delete_if_identity-->>CleanupUI: 정리 결과 반환
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 개발자 아티팩트 정리의 재검증을 추가한 PR의 주요 변경 사항을 정확하고 간결하게 설명합니다.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/dev-artifact-revalidation-v1

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src-tauri/src/dev_artifacts.rs`:
- Around line 91-125: The fingerprint currently identifies paths only by
metadata, allowing replaced filesystem objects to pass validation and be deleted
later via a fresh path lookup. In src-tauri/src/dev_artifacts.rs#L91-L125,
update the manifest records produced by the directory scan to include a
non-reusable filesystem object identifier for each relevant entry. In
src-tauri/src/commands.rs#L149-L174, replace post-validation request.path
resolution with platform-specific operations that verify the recorded object
identifier and move that same object atomically, eliminating the race between
verification and trashing.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 12011899-a781-4cdb-8a58-e1739bbc4361

📥 Commits

Reviewing files that changed from the base of the PR and between 7b81efd and 8177527.

📒 Files selected for processing (32)
  • src-tauri/src/bin/disksage-reclaim-plan.rs
  • src-tauri/src/commands.rs
  • src-tauri/src/dataset_metadata.rs
  • src-tauri/src/dev_artifacts.rs
  • src-tauri/src/dupes.rs
  • src-tauri/src/inventory.rs
  • src-tauri/src/lib.rs
  • src-tauri/src/llm/backend.rs
  • src-tauri/src/llm/engine.rs
  • src-tauri/src/llm/installed_model.rs
  • src-tauri/src/llm/installed_model_io_tests.rs
  • src-tauri/src/llm/mod.rs
  • src-tauri/src/llm/model.rs
  • src-tauri/src/llm/model_concurrency_tests.rs
  • src-tauri/src/llm/parse.rs
  • src-tauri/src/llm/prompt.rs
  • src-tauri/src/llm/verdict.rs
  • src-tauri/src/ontology.rs
  • src-tauri/src/organize.rs
  • src-tauri/src/reasoning.rs
  • src-tauri/src/rules.rs
  • src-tauri/src/safety.rs
  • src-tauri/src/scanner.rs
  • src-tauri/src/settings.rs
  • src-tauri/src/userrules.rs
  • src-tauri/src/web/mod.rs
  • src-tauri/tests/cloud_transfer_coverage_contract.rs
  • src-tauri/tests/cloud_transfer_tenant_authority_gate.rs
  • src-tauri/tests/icloud_local_eviction_batch_documentation_test.rs
  • src-tauri/tests/package_metadata_contract.rs
  • src/lib/Cleanup.svelte
  • src/lib/api.ts

Comment thread src-tauri/src/dev_artifacts.rs Outdated
@seonghobae
seonghobae force-pushed the feat/dev-artifact-revalidation-v1 branch from 8177527 to 943bf63 Compare August 11, 2026 09:56
@seonghobae

Copy link
Copy Markdown
Contributor Author

Addressed in e0af8a1: developer-artifact manifests now include platform object identity (Unix device/inode; Windows volume/file index). Cleanup verifies the identity before staging, atomically renames the reviewed object into a private sibling staging directory, verifies the staged identity again, and only then passes that exact staged path to the OS trash. A replacement is rejected and never trashed; regression tests cover stable identity and replaced-object rejection.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Follow-up hardening in fd11e8c: the staging directory is created under the canonical parent with restrictive permissions, rename failures clean up the staging directory, and Windows object identity requires both volume serial and file index. Focused identity regression remains green.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Follow-up on the Windows build failure: a827637 removes the unstable std::os::windows::fs::MetadataExt calls and uses winapi-util to read the live handle's volume serial and file index. cargo test --locked --lib remains 542 passed / 1 ignored; the new Windows build is still running.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Follow-up safety hardening in e09738f:

  • macOS File Provider root discovery now uses a validated /usr/bin/find helper with a 3s timeout and 256 KiB output cap. A stalled provider root is reported as read-dir-timeout and does not freeze the planner.
  • Cloud root revalidation uses the same bounded probe.
  • iCloud sync health refuses copy-on-write snapshots when client.db or its WAL exceeds 512 MiB, falling back to the immutable bounded probe path.
  • Local validation: cargo test --locked --quiet --lib = 543 passed, 1 ignored; cloud tests = 46 passed; cloud-plan CLI tests = 18 passed.
  • Live macOS --inspect-roots completed in 3.23s and isolated GoogleDrive-sam.bae@edu-poly.com with read-dir-timeout; Naruon readiness export completed without mutation and reported iCloud admission blocked.

No cloud write, source eviction, cache purge, or worktree removal was performed.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (2)
src-tauri/src/icloud_sync_health.rs (1)

901-916: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

client.db-wal의 제한 초과 경로도 테스트하세요.

현재 테스트는 client.db만 1바이트 초과하는 경우를 검증합니다. client.db가 제한 이하이고 client.db-walMAX_SNAPSHOT_SOURCE_BYTES + 1인 경우에도 icloud-sync-health-snapshot-source-too-large를 반환하는지 확인하세요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src-tauri/src/icloud_sync_health.rs` around lines 901 - 916, Extend
oversized_cloud_docs_database_fails_closed_before_snapshot_copy to also create a
within-limit client.db and an oversized client.db-wal, then verify
clone_client_database_snapshot returns the existing
"icloud-sync-health-snapshot-source-too-large" error.
src-tauri/src/commands.rs (1)

150-195: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

flat_mapmap으로 단순화하십시오.

각 분기가 정확히 한 개 원소를 가진 Vec을 반환합니다. map을 사용하면 중간 Vec 할당이 사라지고 의도가 명확해집니다.

♻️ 제안 리팩터링
-        .flat_map(|request| {
+        .map(|request| {
             let matches = current.iter().find(|candidate| {
             if matches.is_none() {
-                return vec![CleanResult {
+                return CleanResult {
                     path: request.path.clone(),
                     ok: false,
                     error: "개발 아티팩트가 변경되었거나 메타데이터 스캔이 불완전합니다. 정리 전에 다시 스캔하세요".into(),
-                }];
+                };
             }
-                Ok(()) => vec![CleanResult {
+                Ok(()) => CleanResult {
                     path: request.path.clone(),
                     ok: true,
                     error: String::new(),
-                }],
-                Err(error) => vec![CleanResult {
+                },
+                Err(error) => CleanResult {
                     path: request.path.clone(),
                     ok: false,
                     error: error.to_string(),
-                }],
+                },
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src-tauri/src/commands.rs` around lines 150 - 195, Update the iterator in the
request-processing flow to use map instead of flat_map, since each branch
currently returns exactly one CleanResult wrapped in a Vec. Return a single
CleanResult directly from the matches and trash_delete_if_identity branches,
preserving their existing success and error behavior, then collect the mapped
results.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src-tauri/src/cloud.rs`:
- Around line 375-387: Restrict the macOS branch in directory_access_issue to
all(not(coverage), target_os = "macos") so it only calls run_bounded_find when
that helper is compiled; let coverage builds use the existing read_dir fallback.

In `@src-tauri/src/commands.rs`:
- Around line 149-167: Update the artifact matching predicate in the requests
iteration to compare age_days monotonically: replace the candidate.age_days
equality check with candidate.age_days >= request.age_days, while preserving all
other matching conditions.

In `@src-tauri/src/icloud_sync_health.rs`:
- Around line 413-425: Update the snapshot copy routine invoked by the
surrounding health-check flow, including clone_snapshot_file, to enforce
MAX_SNAPSHOT_SOURCE_BYTES during copying rather than only in the
before_db/before_wal checks. Stop immediately when the source exceeds the limit,
clean up any partial destination files, and return the existing
icloud-sync-health-snapshot-source-too-large error without allowing oversized
data to remain in the temporary directory.

In `@src-tauri/src/safety.rs`:
- Around line 365-374: Update restore_staged_if_source_absent so every failed
restoration is surfaced with the staged path: handle both the source-reappeared
case and std::fs::rename failure, and include staged in the returned error or
journal entry. Preserve cleanup only after a successful rename, and do not
silently discard restoration errors.
- Around line 439-446: Preserve the OS-trash undo contract in the safety.rs flow
around trash::delete by keeping staging_dir available for restoration, or
restore the object to its original path before trashing it; document the chosen
tradeoff in the nearby comment and do not treat necessary staging cleanup as a
successful undo-preserving operation. After the behavior is finalized, update
README.md line 30 so “journaled and undoable” accurately describes the supported
reversal scope.
- Around line 134-140: Update the comment in the filesystem_object_id fallback
to reference the actual winapi-util crate used by the implementation and
Cargo.toml, replacing the incorrect same-file reference while preserving the
explanation of the Windows identity behavior.
- Around line 148-170: Wrap the filesystem metadata fallback in
filesystem_object_id with #[cfg(not(windows))] so Windows builds exclude the
code after the Windows-specific return and avoid unreachable_code warnings. Keep
the existing winapi-util Windows implementation and API usage unchanged.

---

Nitpick comments:
In `@src-tauri/src/commands.rs`:
- Around line 150-195: Update the iterator in the request-processing flow to use
map instead of flat_map, since each branch currently returns exactly one
CleanResult wrapped in a Vec. Return a single CleanResult directly from the
matches and trash_delete_if_identity branches, preserving their existing success
and error behavior, then collect the mapped results.

In `@src-tauri/src/icloud_sync_health.rs`:
- Around line 901-916: Extend
oversized_cloud_docs_database_fails_closed_before_snapshot_copy to also create a
within-limit client.db and an oversized client.db-wal, then verify
clone_client_database_snapshot returns the existing
"icloud-sync-health-snapshot-source-too-large" error.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 57e6b033-0c5e-4d82-a2ec-f284e267593a

📥 Commits

Reviewing files that changed from the base of the PR and between 8177527 and e09738f.

⛔ Files ignored due to path filters (1)
  • src-tauri/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (9)
  • README.md
  • src-tauri/Cargo.toml
  • src-tauri/src/cloud.rs
  • src-tauri/src/commands.rs
  • src-tauri/src/dev_artifacts.rs
  • src-tauri/src/icloud_sync_health.rs
  • src-tauri/src/lib.rs
  • src-tauri/src/safety.rs
  • src/lib/api.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • src-tauri/src/lib.rs
  • src/lib/api.ts
  • src-tauri/src/dev_artifacts.rs

Comment thread src-tauri/src/cloud.rs Outdated
Comment thread src-tauri/src/commands.rs
Comment thread src-tauri/src/icloud_sync_health.rs
Comment thread src-tauri/src/safety.rs
Comment thread src-tauri/src/safety.rs
Comment thread src-tauri/src/safety.rs Outdated
Comment thread src-tauri/src/safety.rs
@seonghobae

Copy link
Copy Markdown
Contributor Author

Follow-up 88ea9f7 addresses the valid CodeRabbit findings on the new safety work:

  • Restricts the macOS bounded-discovery branch to not(coverage) and keeps the coverage fallback on read_dir.
  • Enforces the 512 MiB CloudDocs snapshot bound inside the copy routine; the non-macOS fallback streams with a hard cap, and every partial destination is removed on failure/overflow.
  • Uses monotonic age_days >= requested_age_days for dev-artifact revalidation.
  • Corrects the Windows identity comments/cfg and reports staged paths for every failed restoration. Successful identity-staged trash moves retain the private empty recovery directory so OS-trash undo has a valid target; README documents that original-path restoration is a separate recovery step.

Focused tests: safety 43, commands 22, cloud 46, iCloud health 9; full Rust lib 545 passed / 1 ignored.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head 88ea9f7826625ea7b81024fdfb9542d00ffaec75.

  • Head SHA: 88ea9f7826625ea7b81024fdfb9542d00ffaec75

  • Workflow run: 31490697391

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 3

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (11 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (11 files)"]
  R1 --> V1["required checks"]
Loading

@opencode-agent

opencode-agent Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: be67175c0bc7a619fb5b82c16f5433007b480a40
  • Workflow run: 31504366418
  • Workflow attempt: 1
  • Gate result: REQUEST_CHANGES (approval step)

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head be67175c0bc7a619fb5b82c16f5433007b480a40.

  • Head SHA: be67175c0bc7a619fb5b82c16f5433007b480a40

  • Workflow run: 31504366418

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 3

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (14 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (14 files)"]
  R1 --> V1["required checks"]
  Evidence --> S2["Docs: 2026-07-21-apfs-reclaim-evidence-design.md"]
  S2 --> I2["operator or user guidance"]
  I2 --> R2["Review risk: Docs: 2026-07-21-apfs-reclaim-evidence-design.md"]
  R2 --> V2["docs review"]
Loading

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head d0ff837d9081df2ef0c6094ef4f22cb249d0a651.

  • Head SHA: d0ff837d9081df2ef0c6094ef4f22cb249d0a651

  • Workflow run: 31498750321

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 3

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (11 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (11 files)"]
  R1 --> V1["required checks"]
Loading

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src-tauri/src/reclaim.rs`:
- Around line 438-444: Update src-tauri/src/reclaim.rs lines 438-444 to select
the active-use query based on RootKind::File versus RootKind::Directory; update
active_use_evidence in src-tauri/src/git_worktree.rs lines 607-611 so regular
files use lsof without +D while directories retain recursive probing; revise the
test in src-tauri/src/reclaim.rs lines 537-552 to assert that a regular-file
root uses the exact-file query instead of merely allowing probe errors.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: bb09b544-ed7a-4224-8544-2074d86c307f

📥 Commits

Reviewing files that changed from the base of the PR and between e09738f and ac79ffd.

📒 Files selected for processing (9)
  • README.md
  • docs/superpowers/specs/2026-07-21-apfs-reclaim-evidence-design.md
  • src-tauri/src/bin/disksage-reclaim-plan.rs
  • src-tauri/src/cloud.rs
  • src-tauri/src/commands.rs
  • src-tauri/src/git_worktree.rs
  • src-tauri/src/icloud_sync_health.rs
  • src-tauri/src/reclaim.rs
  • src-tauri/src/safety.rs
🚧 Files skipped from review as they are similar to previous changes (4)
  • src-tauri/src/cloud.rs
  • src-tauri/src/commands.rs
  • README.md
  • src-tauri/src/safety.rs

Comment thread src-tauri/src/reclaim.rs

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head be67175c0bc7a619fb5b82c16f5433007b480a40.

  • Head SHA: be67175c0bc7a619fb5b82c16f5433007b480a40

  • Workflow run: 31504366418

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 3

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (14 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (14 files)"]
  R1 --> V1["required checks"]
  Evidence --> S2["Docs: 2026-07-21-apfs-reclaim-evidence-design.md"]
  S2 --> I2["operator or user guidance"]
  I2 --> R2["Review risk: Docs: 2026-07-21-apfs-reclaim-evidence-design.md"]
  R2 --> V2["docs review"]
Loading

@seonghobae
seonghobae dismissed stale reviews from opencode-agent[bot], opencode-agent[bot], and opencode-agent[bot] August 11, 2026 21:06

Stale predecessor-head blocker: this review applies to 88ea9f7, not current head d351c2f. The current exact-head required OpenCode workflow and coverage-evidence checks now pass; current review threads are resolved. Dismissing only the obsolete head-specific review, not any current finding.

@seonghobae
seonghobae merged commit 5576fb4 into main Aug 11, 2026
35 checks passed
@seonghobae
seonghobae deleted the feat/dev-artifact-revalidation-v1 branch August 11, 2026 21:10
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