fix: bound duplicate workflow failure feedback - #197
Conversation
|
Warning Review limit reachedNext included review available in 10 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthrough중복 파일 검색 및 삭제 실패 시 원시 예외 문자열 대신 고정된 한국어 메시지를 표시합니다. 오류 메시지에 Changes중복 파일 오류 처리
Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to This localized change bounds duplicate-operation failure messages and adds alert semantics without supplied evidence of a current correctness, security, or availability issue; no actionable merge-blocking risk remains beyond normal required checks. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
|
@coderabbitai review |
Rate Limit Exceeded
|
OpenCode Review Overview
Changed-File Evidence Mapflowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (2 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (2 files)"]
R1 --> V1["required checks"]
|
Pull request was converted to draft
| if (root !== scannedRoot) return; | ||
| await scan(); | ||
| results = r; | ||
| } catch { | ||
| loadError = "선택한 중복 파일을 휴지통으로 보내지 못했습니다. 파일이 열려 있는지와 휴지통 접근 권한을 확인한 뒤 중복 찾기부터 다시 실행하세요."; | ||
| } finally { | ||
| busy = false; |
There was a problem hiding this comment.
🟡 Stale cleanup corrupts new-root state
When the root changes during cleanup, stale completion updates results, loadError, and busy. Old outcomes appear, and active cleanup can become clickable again.
Prompt for agents
In src/lib/Duplicates.svelte, deleteSelected captures the root and generation before confirmation, but the cleanup continuation only checks the root once immediately after cleanPaths resolves. A root change during cleanPaths can make the catch and finally mutate the new root's loadError and busy state. A root change during the subsequent scan can also let results from the old root be assigned after the reset. Bind every post-cleanup state write to the originating root/generation or use an operation token distinct from scan generation, so stale success, failure, and finally paths cannot modify current state or unlock another active operation.
Was this helpful? React with 👍 or 👎 to provide feedback.
Purpose
Prevent arbitrary thrown backend exception text, per-file backend failure detail, and stale prior duplicate evidence from crossing the Duplicates desktop boundary. Every blocked or failed action now tells the customer what to check next while deliberately selected duplicate paths, cleanup authority, and per-result success/failure semantics remain intact.
Exact current state
d16610533b850bf95b8860d4e2b27aeefbd1c94a.main:be418bac9bfbdc8aa41b1a698713833e3dbccfdc.src/lib/Duplicates.svelteplussrc/lib/duplicatesErrorPrivacyContract.test.ts.COMMENTEDreview on predecessor head67031499bf665fbded9586ae867aa6c5e473d3d0; its valid raw-r.errorfinding is addressed and its thread is resolved/outdated. It is not approval and predecessor review evidence does not transfer.Test-first privacy, freshness, and recovery repair
b1e19b6cb437ed6ed7b31cd65b80eaa6b625b78cfirst required thrown backend errors to stop crossing the interface and required an accessible dynamic failure region.String(e)projections with bounded messages and removed raw partial-failurer.errorrendering while preserving the selected path needed to identify a failed item.alert()instead of the existing accessible failure region.c686f0825c7471fa11603a0d3b7ac72d03e41428requires action-oriented scan/delete/partial-failure copy, rejects unusedcatch (e)andalert(), requires stale groups/selections/verdicts/results to be cleared beforefindDuplicateFiles, preserves selected paths, and verifies the existing discovery/cleanup authority calls.d16610533b850bf95b8860d4e2b27aeefbd1c94achanges onlyDuplicates.svelte: replacement discovery clears prior duplicate evidence before the backend call; scan and cleanup failures direct the customer to verify the scan root, open-file state, and trash permissions before restarting at the correct stage; the all-selected safety guard reports throughrole="alert"; successful cleanup tells the customer how to restore from Trash; and partial failures keep the selected path but expose no backend detail.Duplicate discovery, grouping, default selection, exact group-preservation guard, confirmation, cleanup calls, model-verdict advisory behavior, per-result
oksemantics, visible customer-selected paths, and filesystem mutation authority remain unchanged.Exact-head validation
For exact head
d16610533b850bf95b8860d4e2b27aeefbd1c94a:31885292141— in progress;31885292122— queued;31885292168— queued;31885292124— queued.Queued or in-progress evidence is not passing, and predecessor-head success does not transfer. PR-event publication or attestation helpers that are conditionally skipped are not represented as passing release-publication or provenance evidence.
Scope / non-duplication
This line owns only the Duplicates desktop failure/freshness boundary and its focused contract. It does not change backend cleanup authority or import generic-cleanup #174, repository-wide exact coverage #156, canonical documentation #149, or another active product line.
Remaining integration blockers
Required before merge
Do not merge unless the unchanged exact head satisfies every applicable live required workflow and current finding, every review thread is resolved, a qualifying independent approval covers the last push/current head, fresh protected-main ancestry remains current, the live review ruleset is satisfied, and repository-wide exact coverage is satisfied without exclusions or threshold weakening. Pending, queued, skipped-required, neutral-required, failed, stale, predecessor, synthetic, diagnostic-only, status-only, model-only, rate-limited, no-source scanner, or infrastructure-only evidence is not passing.