diff --git a/negodata/front/src/features/products/components/PriceUpdateModal.tsx b/negodata/front/src/features/products/components/PriceUpdateModal.tsx
index aeb0293..79ee979 100644
--- a/negodata/front/src/features/products/components/PriceUpdateModal.tsx
+++ b/negodata/front/src/features/products/components/PriceUpdateModal.tsx
@@ -270,7 +270,9 @@ export function PriceUpdateModal({ open, products, selectedIds, onDone, onClose
if (fresh.success_yn && fresh.lp_price != null) {
found += 1;
const prev = prevPriceOf(id);
- if (prev <= 0 || fresh.lp_price < prev) succeeded.add(id); // 값이 실제로 갱신된 행
+ // 값이 실제로 갱신된 행. 단 **못 본 몰이 있으면 완료로 치지 않는다** —
+ // 그 몰에 더 싼 값이 있었을 수 있어, 다음 '다시 검색'의 기본 대상으로 남겨둔다.
+ if ((prev <= 0 || fresh.lp_price < prev) && unconfirmed.length === 0) succeeded.add(id);
// by_mall 이 비어 오는 옛 이력 대비 — 최소한 대표 최저가는 보이도록 폴백을 채운다.
if (Object.keys(malls).length === 0) malls.etc = fresh.lp_price;
setItem(id, { kind: 'done', price: fresh.lp_price, malls, unconfirmed });
@@ -354,6 +356,16 @@ export function PriceUpdateModal({ open, products, selectedIds, onDone, onClose
switch (s.kind) {
case 'done':
case 'notfound':
+ // 못 본 몰이 있으면 '변동 없음'이라 말하면 안 된다 — 그 몰에 더 싼 값이 있었을 수 있어
+ // 이 결과는 최종이 아니다. 사용자에게 필요한 건 어느 몰이 왜 막혔는지가 아니라
+ // '결과가 완전하지 않다'는 사실 하나다(재시도할 이유가 생긴다).
+ if (s.unconfirmed?.length) {
+ return (
+
+ 일부 확인 못함
+
+ );
+ }
// 검색은 정상 수행됐으나 기존보다 낮은 가격이 없었음(미발견 포함) — 값이 안 바뀐 상태.
return 변동 없음;
case 'failed':