Skip to content

feat: surface privacy-safe Podman reclaim evidence - #133

Closed
seonghobae wants to merge 67 commits into
mainfrom
feat/podman-desktop-evidence
Closed

feat: surface privacy-safe Podman reclaim evidence#133
seonghobae wants to merge 67 commits into
mainfrom
feat/podman-desktop-evidence

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Summary

  • closes Integrate privacy-safe Podman reclaim evidence into the desktop #107 by adding a read-only Podman evidence panel to Cleanup
  • projects the detailed Rust probe into a versioned privacy-safe desktop schema
  • keeps configured capacity, raw logical size, host allocation, guest usage, graph-root usage, and Podman logical candidates semantically separate
  • keeps image, stopped-container, and volume review boundaries independent
  • exposes no prune, remove, machine lifecycle, VM deletion, TRIM, raw-image mutation, or shell-string execution path
  • rejects schema/type/range/fingerprint drift in the frontend and keeps missing observations as unknown rather than zero

Privacy and safety

  • removes machine names, configuration/raw-image/graph-root paths, image IDs, tags, command output, account-local context, and dynamic error details before IPC
  • replaces all untrusted Tauri, operating-system, and JavaScript failure detail with the stable podman-evidence-unavailable UI code
  • never labels Podman logical candidates as verified host physical reclaimability
  • invalid candidate fingerprints fail closed and mark the response incomplete
  • the only registered command is inspect_podman_reclaim

Verification contract

  • Rust projection tests cover redaction, independent review domains, issue-code sanitization, invalid fingerprints, and missing evidence
  • module-level missing_docs enforcement and a source-level integration contract require beginner-readable rustdoc for every Podman desktop function, including private helpers and regression tests
  • TypeScript contract tests cover Tauri invocation, schema/type/range validation, null preservation, fingerprint validation, untrusted error redaction, and all view states
  • podmanEvidence.ts and podmanEvidenceError.ts are included in the 100% statement/branch/function/line coverage gate
  • a source-level regression test requires adjacent beginner-readable JSDoc for every Podman frontend production function
  • Svelte markup provides explicit labels plus role=status and role=alert
  • authoritative ADR and APA 7th references are recorded in docs/architecture/podman-desktop-evidence.md

Required before merge

  • exact-current-head Test, Release, Security Scan, SAST, coverage, packaging, provenance, and release-acceptance checks pass
  • no unresolved actionable human, CodeRabbit, GitHub Advanced Security, Dependabot, OpenCode, or other automated finding
  • independent non-author approval and repository policy are satisfied

No version is bumped and no release is published by this change.

Summary by CodeRabbit

  • 새로운 기능

    • 정리 화면에서 Podman의 용량 관측값과 이미지·중지 컨테이너·볼륨 정리 후보를 읽기 전용으로 확인할 수 있습니다.
    • 증거 수집 상태, 누락 정보, 검토 경계, 사유 코드와 후보 지문을 표시합니다.
    • 경로, 머신명, 식별자, 명령 출력 및 상세 오류를 표시하지 않아 개인정보를 보호합니다.
  • 버그 수정

    • 잘못된 응답과 오류를 안전하고 일관된 상태 및 메시지로 처리합니다.
  • 문서

    • Podman 증거 조회 구조와 커버리지 증거 생성 절차를 문서화했습니다.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@seonghobae, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 53 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 179ba2a6-5253-45eb-8c7c-773d1b8c4e9e

📥 Commits

Reviewing files that changed from the base of the PR and between abb2399 and 24fe2d4.

📒 Files selected for processing (4)
  • .github/workflows/test.yml
  • CHANGELOG.md
  • docs/development/coverage-evidence.md
  • src/lib/coverageEvidenceWorkflow.test.ts
📝 Walkthrough

Walkthrough

Podman reclaim 정보를 읽기 전용 개인정보 안전 evidence로 변환하고 Tauri와 Cleanup UI에 연결했습니다. 프런트엔드·Rust 계약, 개인정보 보호, 문서화 및 CI 검사를 추가했습니다. CI는 정확한 head의 Rust coverage evidence를 생성하고 검증합니다.

Changes

Podman 증거 통합

Layer / File(s) Summary
Rust 증거 계약과 Tauri 연결
docs/architecture/podman-desktop-evidence.md, src-tauri/src/podman_desktop.rs, src-tauri/src/lib.rs
PodmanReclaimPlan을 개인정보 안전 PodmanDesktopEvidence로 투영합니다. 읽기 전용 inspect_podman_reclaim 명령을 등록합니다. 민감한 경로, 식별자 및 동적 오류 세부정보를 제거합니다.
프런트엔드 계약과 증거 패널
src/lib/podmanEvidence.ts, src/lib/podmanEvidenceError.ts, src/lib/PodmanEvidence.svelte, src/lib/Cleanup.svelte, CHANGELOG.md
Tauri 응답을 검증하고 상태 모델로 변환합니다. Cleanup 화면에 용량, 논리 후보, 독립 검토 경계, fingerprint 및 안정적 오류 코드를 표시합니다.
계약·개인정보·문서화 검증
src/lib/podmanEvidence.test.ts, src-tauri/src/podman_desktop.rs, src-tauri/tests/*, src/lib/*.test.ts, vitest.config.ts
스키마, 범위, fingerprint, null 보존, 개인정보 제거, 검토 경계 및 문서화 계약을 검증합니다.
Coverage-evidence CI 계약
.github/workflows/test.yml, docs/development/coverage-evidence.md, src/lib/coverageEvidenceWorkflow.test.ts
정확한 commit head에서 Rust coverage를 측정합니다. regions, branches, functions 및 lines가 각각 정확히 100%인지 확인하고 JSON artifact를 업로드합니다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant CleanupUI
  participant podmanEvidence
  participant Tauri
  participant podman_desktop
  participant Podman
  CleanupUI->>podmanEvidence: loadPodmanEvidence()
  podmanEvidence->>Tauri: invoke("inspect_podman_reclaim")
  Tauri->>podman_desktop: inspect_podman_reclaim()
  podman_desktop->>Podman: 읽기 전용 argv probe
  Podman-->>podman_desktop: PodmanReclaimPlan
  podman_desktop-->>Tauri: redacted PodmanDesktopEvidence
  Tauri-->>podmanEvidence: 검증된 JSON
  podmanEvidence-->>CleanupUI: 표시 상태
Loading

Possibly related PRs

  • ContextualWisdomLab/disksage#137: 개인정보 안전 evidence 아키텍처와 문서화 계약이 연결되어 있지만, 다른 실행 영역을 수정합니다.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning 핵심 계약과 보안 경계는 구현되었지만 [#107]의 컴포넌트 동작 테스트는 변경 파일에서 확인되지 않습니다. PodmanEvidence.svelte의 로딩, 오류, 완료 및 부분 증거 상태를 검증하는 컴포넌트 동작 테스트를 추가하십시오.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 개인정보 보호형 Podman reclaim evidence를 Cleanup에 노출하는 핵심 변경을 정확히 요약합니다.
Out of Scope Changes check ✅ Passed 변경 사항은 Podman 증거 통합, 계약 검증, 문서화 및 관련 CI 커버리지에 한정되어 있습니다.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
✨ 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/podman-desktop-evidence

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.

@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 dcb7cb687cfe2661b7276f75db768aa22e3a6c46.

  • Head SHA: dcb7cb687cfe2661b7276f75db768aa22e3a6c46

  • Workflow run: 31022151593

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

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

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: test.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: test.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file (8 files)"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file (8 files)"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: podman-desktop-evidence.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: podman-desktop-evidence.md"]
  R3 --> V3["docs review"]
Loading

@opencode-agent

opencode-agent Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: 24fe2d4e5190d437e737035d7131372a470cac10
  • Workflow run: 31322787306
  • 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 24fe2d4e5190d437e737035d7131372a470cac10.

  • Head SHA: 24fe2d4e5190d437e737035d7131372a470cac10

  • Workflow run: 31322787306

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

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

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: test.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: test.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file (16 files)"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file (16 files)"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs (2 files)"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs (2 files)"]
  R3 --> V3["docs review"]
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/podman_desktop.rs`:
- Around line 1-470: Run cargo fmt --manifest-path src-tauri/Cargo.toml and
apply the formatter’s generated changes, including any formatting adjustments in
redact_podman_reclaim_plan and its surrounding code. Commit the resulting
formatting-only changes so cargo fmt --check passes in CI.
🪄 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: 2ed7a2a3-26c4-47d8-a19e-c9c4f0b7877e

📥 Commits

Reviewing files that changed from the base of the PR and between 9bcb14f and a065ce7.

📒 Files selected for processing (10)
  • .github/workflows/test.yml
  • CHANGELOG.md
  • docs/architecture/podman-desktop-evidence.md
  • src-tauri/src/lib.rs
  • src-tauri/src/podman_desktop.rs
  • src/lib/Cleanup.svelte
  • src/lib/PodmanEvidence.svelte
  • src/lib/podmanEvidence.test.ts
  • src/lib/podmanEvidence.ts
  • vitest.config.ts

Comment thread src-tauri/src/podman_desktop.rs
@seonghobae
seonghobae force-pushed the feat/podman-desktop-evidence branch from 2fb9a8b to 4063824 Compare August 5, 2026 16:26

@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 6fd3c627f02125dc20926a049ca901eae9b344fd.

  • Head SHA: 6fd3c627f02125dc20926a049ca901eae9b344fd

  • Workflow run: 31287211091

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

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

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: test.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: test.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file (15 files)"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file (15 files)"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs (2 files)"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs (2 files)"]
  R3 --> V3["docs review"]
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 @.github/workflows/test.yml:
- Around line 76-126: Update .github/workflows/test.yml lines 76-126 to generate
coverage-diagnostic.json with the restricted coverage totals and exact-head
identifiers even when coverage validation fails, then upload it using if:
always() and the artifact name coverage-diagnostic-${{ env.HEAD_SHA }}. Keep the
existing success-only coverage-evidence.json upload unchanged.
src/lib/coverageEvidenceWorkflow.test.ts lines 33-42 requires no direct change;
preserve its artifact contract assertions.
🪄 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: 95e1e2f8-e521-432c-b67e-8bb2cdf6bbc8

📥 Commits

Reviewing files that changed from the base of the PR and between 0d26739 and 84e9378.

📒 Files selected for processing (7)
  • .github/workflows/test.yml
  • CHANGELOG.md
  • docs/development/coverage-evidence.md
  • src-tauri/src/lib.rs
  • src-tauri/tests/podman_desktop_branch_coverage.rs
  • src-tauri/tests/podman_desktop_documentation_contract.rs
  • src/lib/coverageEvidenceWorkflow.test.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src-tauri/tests/podman_desktop_documentation_contract.rs
  • CHANGELOG.md

Comment thread .github/workflows/test.yml

@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 f3dc01aeae287bb65ad4101b7b99b1e9d7218517.

  • Head SHA: f3dc01aeae287bb65ad4101b7b99b1e9d7218517

  • Workflow run: 31296633314

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

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

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: test.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: test.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file (16 files)"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file (16 files)"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs (2 files)"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs (2 files)"]
  R3 --> V3["docs review"]
Loading

@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 8cbb057666736b7cff56435960b142f42e6ef181.

  • Head SHA: 8cbb057666736b7cff56435960b142f42e6ef181

  • Workflow run: 31304597224

  • 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["Workflow: test.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: test.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file (16 files)"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file (16 files)"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs (2 files)"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs (2 files)"]
  R3 --> V3["docs review"]
Loading

@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 7d69ffdc738571d1b7738b43cd01af0d5f77b316.

  • Head SHA: 7d69ffdc738571d1b7738b43cd01af0d5f77b316

  • Workflow run: 31315193527

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

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

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: test.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: test.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file (16 files)"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file (16 files)"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs (2 files)"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs (2 files)"]
  R3 --> V3["docs review"]
Loading

@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 24fe2d4e5190d437e737035d7131372a470cac10.

  • Head SHA: 24fe2d4e5190d437e737035d7131372a470cac10

  • Workflow run: 31321667097

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

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

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: test.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: test.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file (16 files)"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file (16 files)"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs (2 files)"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs (2 files)"]
  R3 --> V3["docs review"]
Loading

Copy link
Copy Markdown
Contributor Author

@opencode-agent

Implement the still-valid component-behavior testing gap on exact current head 24fe2d4e5190d437e737035d7131372a470cac10; refuse stale-head execution if the branch moves. CodeRabbit's current linked-issue check correctly notes that issue #107 requires direct component behavior tests for src/lib/PodmanEvidence.svelte, while the branch currently has helper/schema/source-contract tests but no direct component interaction test. Do not weaken or replace the existing tests.

Add the smallest maintainable direct Svelte component test using the repository's actual Svelte/Vitest toolchain. Cover at minimum: initial Inspect action, loading/busy state, stable privacy-safe error alert, complete evidence rendering, and incomplete/partial evidence rendering with image/stopped-container/volume review domains remaining separate. Mock only the Tauri invocation boundary; use realistic versioned evidence payloads and assert user-visible semantics/accessibility roles rather than component source strings. If a DOM test environment or testing-library dependency is required, add the minimum current compatible dev dependency and regenerate the lockfile normally; do not hand-edit lock resolution or add unrelated packages. Keep 100% production statement/branch/function/line coverage and beginner-readable tests. Run the focused component test, full frontend tests/coverage, typecheck/build as applicable, and do not touch Rust/product authority, workflows, credentials, or unrelated files. Push only after GREEN.

@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 24fe2d4e5190d437e737035d7131372a470cac10.

  • Head SHA: 24fe2d4e5190d437e737035d7131372a470cac10

  • Workflow run: 31322787306

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

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

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: test.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: test.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file (16 files)"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file (16 files)"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs (2 files)"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs (2 files)"]
  R3 --> V3["docs review"]
Loading

Copy link
Copy Markdown
Contributor Author

Superseded by clean current-main replacements with the original semantic delta split by ownership rather than discarded. Fresh file-level comparison shows PR #150 preserves every Podman desktop/source/UI/test/doctoring path from this PR, while PR #147 owns the three generic coverage paths that #150 intentionally excludes: .github/workflows/test.yml, docs/development/coverage-evidence.md, and src/lib/coverageEvidenceWorkflow.test.ts. #150 also adds a dedicated Podman coverage contract. Current replacement heads rechecked before closure: #150 6eb54deacce36789eb23584648f3606bb6a96063, #147 7fbadc0a2cb8c16045fb08452d3b61d93a10af93; protected main is 7dd950b92de7c84e80be430451a286cf99c6c19d. No checks, reviews, or approvals from this stale 67-commit head transfer to either replacement. Closing this PR as superseded; issue #107 remains open until the clean product replacement actually integrates.

Copy link
Copy Markdown
Contributor Author

@opencode-agent fix

Refetch PR #133's exact current head, current main tip, review SHAs, unresolved threads, required contexts, and every workflow run/job/step before writing. Do not reuse predecessor-head conclusions.

The last verified repository-local state had Test, Release, Security Scan, and SAST successful, while central OpenCode coverage/review was the remaining gate. Reproduce the current failure and perform RCA rather than treating it as a generic external blocker. Separate product-code defects from central coverage-tooling defects, stale test contracts, infrastructure/quota failures, and approval-path defects. Generate materially distinct remedies and apply the realism gate before acting.

If the live failure is still coverage-related:

  1. inspect the exact coverage decision and first failing command/test/line;
  2. add a fail-first regression in the correct owner repository;
  3. fix the smallest root cause without widening cfg(coverage), excluding production code, lowering thresholds, weakening privacy/read-only boundaries, or counting advisory evidence as success;
  4. verify Rust statement/branch coverage, frontend coverage, public Rustdoc/docstrings, Tauri packaging, real-world Podman evidence scenarios, timeout/output bounds, non-UTF-8 paths, partial/unavailable Podman state, and logical-vs-physical reclaim wording;
  5. rerun the supported exact-current-head workflow and verify the required job/step truly executed.

Preserve the read-only Podman evidence contract: no prune/remove/VM mutation API; no raw local paths, machine names, graph roots, image IDs/tags, credentials, or unbounded stderr in shared evidence; stable reason codes; exact candidate-set digest; verified physical reclaim only from before/after host free-space evidence.

While central review runs, continue one non-conflicting bounded DiskSage buyer-visible slice instead of waiting. Resolve only current-head addressed threads. Enable auto-merge or merge only after live required checks, independent approval, security gates, and branch protection are satisfied, then immediately refetch the queue.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review
@cwl-noema-review

Re-review only the exact current head after the current RCA/repair. Confirm that repository-local and central coverage evidence run on the same head, all required jobs/steps actually execute, read-only Podman evidence cannot mutate local state, private local identifiers remain outside shared output, logical candidates are never presented as verified physical reclaim, and all tests/docstrings/coverage/package checks pass. Ignore predecessor-head verdicts.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ContextualWisdomLab/disksage"
pr="133"

echo '=== PR identity and branch state ==='
gh pr view "$pr" --repo "$repo" --json number,state,isDraft,headRefName,headRefOid,baseRefName,baseRefOid,url,mergeStateStatus,reviewDecision,statusCheckRollup

echo '=== Current main tip ==='
gh api "repos/$repo/git/ref/heads/main" --jq '.object.sha'

echo '=== Branch protection / required checks ==='
gh api "repos/$repo/branches/main/protection" 2>&1 || true

echo '=== Pull-request review threads ==='
gh api graphql -F owner="ContextualWisdomLab" -F name="disksage" -F number="$pr" -f query='
query($owner: String!, $name: String!, $number: Int!) {
  repository(owner: $owner, name: $name) {
    pullRequest(number: $number) {
      reviewThreads(first: 100) {
        nodes {
          isResolved
          isOutdated
          path
          line
          comments(first: 10) { nodes { author { login } body url createdAt } }
        }
      }
    }
  }
}' 2>&1 || true

head="$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq '.headRefOid')"
echo "=== Workflow runs for current head $head ==="
gh run list --repo "$repo" --commit "$head" --limit 100 --json databaseId,name,workflowName,status,conclusion,event,headSha,createdAt,updatedAt,url

echo '=== Jobs and steps for current-head workflow runs ==='
for run_id in $(gh run list --repo "$repo" --commit "$head" --limit 100 --json databaseId --jq '.[].databaseId'); do
  echo "--- run $run_id ---"
  gh run view "$run_id" --repo "$repo" --json name,workflowName,status,conclusion,headSha,jobs,url \
    --jq '{name, workflowName, status, conclusion, headSha, url, jobs: [.jobs[] | {name,status,conclusion,startedAt,completedAt,steps: [.steps[] | {name,status,conclusion,number}]}]}'
done

echo '=== Local checkout identity ==='
git rev-parse HEAD
git status --short
git show -s --format='%H%n%P%n%s' HEAD

echo '=== Map changed implementation files ==='
git diff --name-status "$(gh pr view "$pr" --repo "$repo" --json baseRefOid --jq '.baseRefOid')" HEAD
fd -a '^(podman_desktop\.rs|podmanEvidence\.ts|PodmanEvidence\.svelte|lib\.rs|test\.yml)$' . \
  -E node_modules -E target -E dist | sort

Length of output: 2571


🏁 Script executed:

#!/bin/bash
set -uo pipefail

repo="ContextualWisdomLab/disksage"
pr="133"

call() {
  local label="$1"
  shift
  echo "=== $label ==="
  if ! "$@"; then
    echo "[request failed: $label]" >&2
  fi
  echo
}

call "PR identity" \
  gh api "repos/$repo/pulls/$pr" \
  --jq '{number,state,draft,html_url,head:{ref:.head.ref,sha:.head.sha},base:{ref:.base.ref,sha:.base.sha},mergeable,mergeable_state}'

call "Current main tip" \
  gh api "repos/$repo/git/ref/heads/main" --jq '.object.sha'

head="$(gh api "repos/$repo/pulls/$pr" --jq '.head.sha' 2>/dev/null || true)"
if [ -n "$head" ]; then
  call "Check runs for current PR head $head" \
    gh api "repos/$repo/commits/$head/check-runs?per_page=100" \
    --jq '[.check_runs[] | {name,status,conclusion,details_url,started_at,completed_at,app:.app.slug}]'

  call "Workflow runs for current PR head $head" \
    gh api "repos/$repo/actions/runs?head_sha=$head&per_page=100" \
    --jq '[.workflow_runs[] | {id,name,display_title,event,status,conclusion,head_sha,html_url,created_at,updated_at}]'

  runs="$(gh api "repos/$repo/actions/runs?head_sha=$head&per_page=100" --jq '.workflow_runs[].id' 2>/dev/null || true)"
  for run_id in $runs; do
    call "Jobs and steps for workflow run $run_id" \
      gh api "repos/$repo/actions/runs/$run_id/jobs?per_page=100" \
      --jq '[.jobs[] | {name,status,conclusion,started_at,completed_at,steps:[.steps[] | {number,name,status,conclusion}]}]'
  done
fi

call "Local checkout identity" bash -c \
  'git rev-parse HEAD && git status --short && git show -s --format="%H%n%P%n%s" HEAD'

echo "=== Candidate source file outlines ==="
for file in $(fd -a '^(podman_desktop\.rs|podmanEvidence\.ts|PodmanEvidence\.svelte|lib\.rs|test\.yml)$' . -E node_modules -E target -E dist | sort); do
  echo "--- $file ---"
  ast-grep outline "$file" --items all 2>&1 || true
done

Length of output: 51879


🏁 Script executed:

#!/bin/bash
set -uo pipefail

repo="ContextualWisdomLab/disksage"
pr="133"
run="31319066739"

echo '=== Failed coverage job log ==='
gh run view "$run" --repo "$repo" --log-failed 2>&1 || true

echo '=== Coverage workflow artifacts ==='
gh api "repos/$repo/actions/runs/$run/artifacts?per_page=100" \
  --jq '[.artifacts[] | {id,name,size_in_bytes,expired,created_at,updated_at,archive_download_url}]' 2>&1 || true

echo '=== Current-head review status and comments ==='
gh api "repos/$repo/pulls/$pr/reviews?per_page=100" \
  --jq '[.[] | {id,user:.user.login,state,commit_id,submitted_at,body}]' 2>&1 || true
gh api "repos/$repo/pulls/$pr/comments?per_page=100" \
  --jq '[.[] | {user:.user.login,path,line,original_line,commit_id,body,html_url,created_at}]' 2>&1 || true

echo '=== Current-head diff file list ==='
git diff --name-status 9bcb14ff9719029411591036b249537b22d2f3fd HEAD

echo '=== Command registration and Podman desktop implementation ==='
sed -n '70,115p' src-tauri/src/lib.rs 2>&1 || true
sed -n '1,340p' src-tauri/src/podman_desktop.rs 2>&1 || true

echo '=== TypeScript contract and component ==='
sed -n '1,380p' src/lib/podmanEvidence.ts 2>&1 || true
sed -n '1,300p' src/lib/PodmanEvidence.svelte 2>&1 || true
sed -n '1,100p' src/lib/Cleanup.svelte 2>&1 || true

echo '=== Relevant test and workflow outlines ==='
for file in \
  .github/workflows/test.yml \
  vitest.config.ts \
  src/lib/podmanEvidence.test.ts \
  src/lib/podmanEvidence.error.test.ts \
  src/lib/podmanEvidence.docstrings.test.ts \
  src-tauri/tests/podman_desktop_branch_coverage.rs \
  src-tauri/tests/podman_desktop_command_coverage.rs \
  src-tauri/tests/podman_desktop_documentation_contract.rs \
  src-tauri/tests/podman_desktop_issue_privacy.rs; do
  if [ -f "$file" ]; then
    echo "--- $file ---"
    ast-grep outline "$file" --items all 2>&1 || true
  fi
done

echo '=== Static scan for mutation and sensitive-output primitives in Podman desktop boundary ==='
rg -n -i -C2 \
  '(prune|remove|rm\s|delete|machine\s+(start|stop|rm|init)|trim|fstrim|qemu-img|shell|Command::new|args_os|stderr|stdout|graph[_ -]?root|image[_ -]?id|tag)' \
  src-tauri/src/podman_desktop.rs src/lib/podmanEvidence.ts src/lib/PodmanEvidence.svelte 2>&1 || true

Length of output: 200935


@seonghobae, I reviewed only head 24fe2d4e5190d437e737035d7131372a470cac10.

Result: non-passing

PR #133 is closed. Its base is not current main. Current main is be418bac9bfbdc8aa41b1a698713833e3dbccfdc.

The repository Test workflow ran on the exact PR head.

  • The test job passed Rust formatting, Rust tests, npm test, frontend coverage, npm run check, and npm run build.
  • The Podman Rustdoc contract test passed.
  • The Podman privacy, candidate fingerprint, command-boundary, and CLI non-UTF-8/privacy tests passed.
  • Release, Security Scan, SAST, CodeQL, and the reviewed package builds passed.

The repository coverage-evidence job failed at Build exact-head coverage evidence.

  • Regions: 85.2786%
  • Branches: 61.0559%
  • Functions: 73.6005%
  • Lines: 85.6779%

The failure is an actual exact-100% gate failure. It is not a pending, skipped, or infrastructure-only result.

The central required job named coverage-evidence is not valid coverage evidence. Its only execution step emitted an echo message. It did not run coverage or publish same-head coverage results. It cannot replace the failed repository coverage job.

Podman boundary review

The inspected current-head implementation has these correct properties:

  • inspect_podman_reclaim projects probe output into PodmanDesktopEvidence.
  • The desktop command exposes no prune, remove, machine lifecycle, TRIM, or raw-image mutation operation.
  • The projection excludes machine names, local paths, graph-root locations, image IDs, tags, command output, and dynamic issue details.
  • The TypeScript parser rejects schema, type, safe-integer, and fingerprint drift.
  • Invalid candidate fingerprints clear the fingerprint and mark evidence incomplete.
  • The UI keeps image, stopped-container, and volume review domains separate.
  • The UI states that logical candidates are not verified host physical reclaimability.
  • physically_reclaimable_bytes remains separate from Podman logical candidate totals.

I found no new static violation of the read-only, privacy, or logical-versus-physical boundary in the inspected desktop code. The coverage failure and the non-executing central coverage context remain blockers for this exact head.


🧠 Learnings used
Learnt from: seonghobae
Repo: ContextualWisdomLab/disksage PR: 0
File: :0-0
Timestamp: 2026-08-04T11:09:15.602Z
Learning: In disksage repository, file src-tauri/src/bin/disksage-podman-reclaim-plan.rs uses std::env::args() (not args_os()) to parse CLI arguments, and its "unknown option" error path (as of commit ca055a73) embeds the raw unrecognized argument value in the error message returned from run() and printed via eprintln! in main(). This causes: (1) sensitive CLI argument values to be disclosed in stderr, and (2) a panic (not a clean error) when a non-UTF-8 argument is supplied, because std::env::args() panics on invalid Unicode. The PR added src-tauri/tests/podman_reclaim_cli.rs asserting neither behavior should occur, but as of head ca055a73a3cf8e30e45a661c09a5d56eb1211d76 the implementation had not yet been fixed to satisfy those assertions.
⚠️ 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.

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.

Integrate privacy-safe Podman reclaim evidence into the desktop

1 participant