Skip to content

fix(search): announce asynchronous empty results - #1636

Draft
seonghobae wants to merge 7 commits into
codex/search-customer-copyfrom
codex/search-empty-live-region
Draft

fix(search): announce asynchronous empty results#1636
seonghobae wants to merge 7 commits into
codex/search-customer-copyfrom
codex/search-empty-live-region

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Current authority — 2026-09-10

  • canonical Search parent: #1603@8348772f8bb92dc25605e8b1ef9e85c8196bf939
  • source-order RED: 47c53b15d83b299777002f320c46578fce93ac96
  • rejected generated-blob overlay: d99d88ab2d67c80fc1042f6ebbb2e8627214d5b4
  • repair-to-owner source: da2c9f8e27d60b5c6b826f4a73bad3baa62d99d9
  • owner-preserving source integration: b1ee9b2d86916a5c29bcd7be1de09c6a6fb4e98c
  • first async-test child: e64a1181c234c9213774bcd5c2d4c4288bb889b2
  • exact head: 8ca8767c09810945a1348bdb1c4b862df1a87f96
  • lifecycle: Draft / Search accessibility successor / do not merge yet
  • effective delta over fix(search): hide internal relationship plumbing #1603: exactly two files — one focused test plus the one-line semantic change in SearchLayout.tsx; fresh compare is ahead-only (behind_by=0).

Generated #1633 identified a valid Search empty-state announcement gap but its full SearchLayout.tsx blob was based on protected develop. Direct overlay was proven unsafe because it reverted valid #1603 customer-facing relationship/evidence copy. The branch was repaired non-destructively, then only the generated one-line semantic patch was isolated on protected-develop ancestry and integrated through ordinary Git three-way merge (#1637). No generated .jules metadata, dependency source, Today source, or stale Search customer-copy source is effective here.

The regression holds /api/search pending, verifies the existing loading status, and requires 맥락 검색 결과가 없습니다. to become a polite status live region only after the asynchronous search actually completes.

Test-harness finding and repair

Static re-inspection of e64a118... found an evidence defect in the test itself. The test constructed a native Response for /api/search, while the promise it explicitly awaited as emptyBody was a separate already-resolved promise used only to build that response. ApiClient.post() awaits response.json() on its own promise, so the test body overstated that it explicitly flushed the same controlled response/body chain. This is not a product-source regression and does not justify changing SearchLayout.tsx.

Exact child 8ca8767... repairs only the focused test. It uses an actual Response whose json() is backed by a separately controlled body promise, resolves the HTTP response first and verifies the UI remains loading while the body is still pending, then resolves/awaits that exact body promise inside React act before asserting the loading→empty transition. Product source is unchanged by this child. The effective PR scope remains exactly two files.

Exact-head evidence boundary

This feature-base stacked PR cannot currently materialize Naruon’s repository-local Application CI/Bandit through ordinary pull_request synchronization because protected workflow filters name only default/release bases. Canonical fleet defect .github#2073 owns the repair. Do not retarget this PR to develop, push a dummy commit, copy central workflow source, or transfer predecessor checks.

CodeRabbit review attempts on predecessor heads were either rate-limited or became stale after source-changing test repair. Codex and CodeRabbit have both been requested on the current lane, but 8ca8767... requires a fresh post-last-push independent review; no predecessor approval transfers.

UI Delivery Gate: FAIL

Intentionality, content ownership, and source-level functional completeness are PASS. Exact-head hosted execution is absent because the canonical stacked-PR CI contract is still open, qualifying independent current-head review is absent, and browser/AT/keyboard evidence remains incomplete. No broad accessibility-conformance claim is authorized, and #1603/#1623 are not protected-integrated.

No force-push, destructive rebase, self-approval, historical-check transfer, source-copy across canonical owners, or gate weakening.

Add a focused asynchronous loading-to-empty regression on the current Search owner. The unchanged owner source lacks a status live region for the empty result, so this commit is the source-order RED.

Signed-off-by: Seongho Bae <me@seonghobae.me>
Keep the existing loading status and make the post-search empty result a polite status live region. This is the minimal source repair for the focused loading-to-empty regression and changes no visual styling or Search domain behavior.

Signed-off-by: Seongho Bae <me@seonghobae.me>
@coderabbitai

coderabbitai Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

Next included review available in 41 minutes.

Check out review usage here.

View limit details

Limit 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.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 79c5c7b9-38b1-44ef-92ec-f4452966e949

📥 Commits

Reviewing files that changed from the base of the PR and between 8348772 and 8ca8767.

📒 Files selected for processing (2)
  • frontend/src/components/SearchLayout.empty-live-region.test.tsx
  • frontend/src/components/SearchLayout.tsx

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.

The generated #1633 SearchLayout blob was based on protected develop and reverted valid #1603 customer-copy semantics when overlaid directly. Restore the exact #1603 source while retaining only the focused live-region RED test. Keep this branch RED-only until the one-line semantic fix is applied without replacing owner content.

Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae seonghobae changed the title fix(search): announce asynchronous empty results test(search): require empty-result live announcement Sep 10, 2026
Isolate only the generated SearchLayout live-region change on protected-develop ancestry so Git can perform an ordinary three-way integration into the active Search owner without copying stale generated customer-copy source.

Signed-off-by: Seongho Bae <me@seonghobae.me>
Ordinary three-way integration of the one-line live-region change into the active #1603 successor. Preserve the focused RED test and all existing Search customer-copy/evidence source.
@seonghobae seonghobae changed the title test(search): require empty-result live announcement fix(search): announce asynchronous empty results Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Review current exact head b1ee9b2d86916a5c29bcd7be1de09c6a6fb4e98c against exact base 8348772f8bb92dc25605e8b1ef9e85c8196bf939. Scope only frontend/src/components/SearchLayout.tsx and frontend/src/components/SearchLayout.empty-live-region.test.tsx. Verify the effective source delta is exactly the one polite status live-region addition, the asynchronous loading→empty test is causal and deterministic, existing error alert/customer-facing relationship/evidence semantics are preserved, and no stale generated #1633 source survives.

@coderabbitai

coderabbitai Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='8348772f8bb92dc25605e8b1ef9e85c8196bf939'
head='b1ee9b2d86916a5c29bcd7be1de09c6a6fb4e98c'
search_file='frontend/src/components/SearchLayout.tsx'
test_file='frontend/src/components/SearchLayout.empty-live-region.test.tsx'

git cat-file -e "${base}^{commit}"
git cat-file -e "${head}^{commit}"

printf '%s\n' '=== exact-range name-status ==='
git diff --name-status "$base" "$head"

printf '%s\n' '=== exact-range stat ==='
git diff --stat "$base" "$head"

printf '%s\n' '=== exact-range scoped patch ==='
git diff --find-renames --find-copies --no-ext-diff "$base" "$head" -- "$search_file" "$test_file"

printf '%s\n' '=== SearchLayout symbols at head ==='
git show "${head}:${search_file}" | ast-grep outline /dev/stdin --lang tsx --items all 2>/dev/null || true

printf '%s\n' '=== SearchLayout at base ==='
git show "${base}:${search_file}" | cat -n

printf '%s\n' '=== SearchLayout at head ==='
git show "${head}:${search_file}" | cat -n

printf '%s\n' '=== focused test at head ==='
git show "${head}:${test_file}" | cat -n

printf '%s\n' '=== test/tooling manifests ==='
fd -HI '^(package\.json|vite\.config\..*|vitest\.config\..*)$' . -x sh -c 'echo "=== $1 ==="; sed -n "1,220p" "$1"' sh {} \;

Length of output: 114897


🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='8348772f8bb92dc25605e8b1ef9e85c8196bf939'
head='b1ee9b2d86916a5c29bcd7be1de09c6a6fb4e98c'
overlay='d99d88ab2d67c80fc1042f6ebbb2e8627214d5b4'
search_file='frontend/src/components/SearchLayout.tsx'

printf '%s\n' '=== api-client outline and relevant implementation ==='
ast-grep outline frontend/src/lib/api-client.ts --items all
sed -n '1,260p' frontend/src/lib/api-client.ts

printf '%s\n' '=== Vitest setup ==='
sed -n '1,260p' frontend/src/test/setup.ts

printf '%s\n' '=== exact commit ancestry ==='
git merge-base --is-ancestor "$base" "$head" && echo 'base is an ancestor of head'
git merge-base "$base" "$head"
git show -s --format='head=%H%nparents=%P%nsubject=%s' "$head"

printf '%s\n' '=== normalized SearchLayout equality ==='
git show "${base}:${search_file}" > /tmp/search-base.tsx
git show "${head}:${search_file}" > /tmp/search-head.tsx
sed 's/ role="status" aria-live="polite" className=/ className=/' /tmp/search-head.tsx > /tmp/search-head-normalized.tsx
cmp -s /tmp/search-base.tsx /tmp/search-head-normalized.tsx \
  && echo 'head equals base after removing only the intended attributes' \
  || { echo 'unexpected source difference'; diff -u /tmp/search-base.tsx /tmp/search-head-normalized.tsx; }

printf '%s\n' '=== generated-overlay availability and scoped comparison ==='
if git cat-file -e "${overlay}^{commit}" 2>/dev/null; then
  git show -s --format='overlay=%H%nparents=%P%nsubject=%s' "$overlay"
  git diff --no-ext-diff "$base" "$overlay" -- "$search_file"
else
  echo 'overlay commit is not available in the local object database'
fi

Length of output: 18297


@seonghobae Reviewed exact head b1ee9b2d86916a5c29bcd7be1de09c6a6fb4e98c against exact base 8348772f8bb92dc25605e8b1ef9e85c8196bf939.

No source-level findings in the requested scope.

  • The range changes exactly two files.
  • SearchLayout.tsx adds only role="status" aria-live="polite" to 맥락 검색 결과가 없습니다..
  • The test holds /api/search pending, verifies loading, resolves { results: [] }, and verifies the empty polite status after loading disappears.
  • The error branch remains role="alert".
  • Customer-facing relationship copy and evidence-boundary semantics are unchanged.
  • The stale generated #1633 overlay changes are absent from the effective range.

I did not perform browser, keyboard, assistive-technology, or hosted exact-head validation. Those delivery-gate items remain outside this source review.

⚠️ 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.

Make the async loading-to-empty contract deterministic by resolving and flushing the controlled response chain inside React act instead of polling real zero-delay timers. Preserve the exact one-line Search source delta.

Signed-off-by: Seongho Bae <me@seonghobae.me>

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Re-review current exact head e64a1181c234c9213774bcd5c2d4c4288bb889b2 against exact base 8348772f8bb92dc25605e8b1ef9e85c8196bf939. Scope only frontend/src/components/SearchLayout.tsx and frontend/src/components/SearchLayout.empty-live-region.test.tsx. Verify the effective source delta remains exactly one polite status live-region addition plus its focused regression; the test no longer relies on bounded real-timer polling and deterministically flushes the controlled async response inside React act; existing Search customer-copy/evidence/error semantics remain intact; no stale generated #1633 source survives.

@coderabbitai

coderabbitai Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='8348772f8bb92dc25605e8b1ef9e85c8196bf939'
head='e64a1181c234c9213774bcd5c2d4c4288bb889b2'
overlay='d99d88ab2d67c80fc1042f6ebbb2e8627214d5b4'
search_file='frontend/src/components/SearchLayout.tsx'
test_file='frontend/src/components/SearchLayout.empty-live-region.test.tsx'

git cat-file -e "${base}^{commit}"
git cat-file -e "${head}^{commit}"

echo '=== Commit and ancestry ==='
git merge-base --is-ancestor "$base" "$head" && echo 'base-is-ancestor=yes'
git show -s --format='base=%H%nhead=%H%nparents=%P%nsubject=%s' "$base" "$head"

echo '=== Exact-range files and stat ==='
git diff --name-status "$base" "$head"
git diff --stat "$base" "$head"

echo '=== Exact-range scoped patch ==='
git diff --no-ext-diff --find-renames --find-copies "$base" "$head" -- "$search_file" "$test_file"

echo '=== Base SearchLayout ==='
git show "${base}:${search_file}" | cat -n

echo '=== Head SearchLayout ==='
git show "${head}:${search_file}" | cat -n

echo '=== Head focused regression ==='
git show "${head}:${test_file}" | cat -n

echo '=== SearchLayout imports and API implementation ==='
ast-grep outline frontend/src/components/SearchLayout.tsx --items all
ast-grep outline frontend/src/lib/api-client.ts --items all
sed -n '1,280p' frontend/src/lib/api-client.ts

echo '=== Test setup and test configuration candidates ==='
fd -HI '^(setup\.(ts|tsx|js|jsx)|vitest\.config\..*|vite\.config\..*|package\.json)$' frontend . \
  -E node_modules -E dist -E build \
  -x sh -c 'echo "=== $1 ==="; sed -n "1,260p" "$1"' sh {} \;

echo '=== Normalized source equality ==='
git show "${base}:${search_file}" > /tmp/search-base.tsx
git show "${head}:${search_file}" > /tmp/search-head.tsx
sed 's/ role="status" aria-live="polite" className=/ className=/' \
  /tmp/search-head.tsx > /tmp/search-head-normalized.tsx
if cmp -s /tmp/search-base.tsx /tmp/search-head-normalized.tsx; then
  echo 'only-live-region-attributes=yes'
else
  echo 'only-live-region-attributes=no'
  diff -u /tmp/search-base.tsx /tmp/search-head-normalized.tsx || true
fi

echo '=== Stale overlay comparison ==='
if git cat-file -e "${overlay}^{commit}" 2>/dev/null; then
  git show -s --format='overlay=%H%nparents=%P%nsubject=%s' "$overlay"
  git diff --no-ext-diff "$base" "$overlay" -- "$search_file"
else
  echo 'overlay-object=unavailable'
fi

echo '=== Focused test timer and async patterns ==='
git show "${head}:${test_file}" |
  rg -n -C 3 'setTimeout|setInterval|waitFor|act\s*\(|resolve|fetch|api/search|role|aria-live|loading|결과가 없습니다' || true

Length of output: 140220


@seonghobae Reviewed exact head e64a1181c234c9213774bcd5c2d4c4288bb889b2 against exact base 8348772f8bb92dc25605e8b1ef9e85c8196bf939.

No source-level findings exist in the requested scope.

  • The base is an ancestor of the head.
  • The range changes exactly two files.
  • SearchLayout.tsx adds only role="status" aria-live="polite" to 맥락 검색 결과가 없습니다..
  • The regression test holds /api/search pending and verifies the loading status.
  • The test resolves the empty response inside asynchronous React act.
  • The test verifies the empty polite status after loading text disappears.
  • The test uses no bounded real-timer polling, setTimeout, setInterval, or waitFor.
  • The existing error branch remains role="alert".
  • Customer-facing relationship copy and evidence-boundary semantics remain unchanged.
  • The stale #1633 overlay changes are absent from the exact-head source.

This review did not include hosted execution or browser, keyboard, or assistive-technology validation.

⚠️ 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.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

현재 exact head e64a1181c234c9213774bcd5c2d4c4288bb889b2만 독립 검토해 주세요. Base는 #1603@8348772f8bb92dc25605e8b1ef9e85c8196bf939이며 effective delta는 SearchLayout.empty-live-region.test.tsxSearchLayout.tsx 두 파일뿐입니다. 비동기 loading→empty 전환의 실제 React act flush가 runner timing에 의존하지 않는지, 기존 Search customer-copy를 되돌리지 않는지, role="status"/aria-live="polite"가 빈 결과 상태에만 정확히 적용되는지 확인해 주세요. 이전 b1ee9b2... 검토는 source-changing child 이후의 승인 근거로 사용하지 않습니다.

@coderabbitai

coderabbitai Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='8348772f8bb92dc25605e8b1ef9e85c8196bf939'
head='e64a1181c234c9213774bcd5c2d4c4288bb889b2'
search_file='frontend/src/components/SearchLayout.tsx'
test_file='frontend/src/components/SearchLayout.empty-live-region.test.tsx'

git cat-file -e "${base}^{commit}"
git cat-file -e "${head}^{commit}"

printf '%s\n' '=== ancestry and commit identity ==='
git merge-base --is-ancestor "$base" "$head" && echo 'base-is-ancestor=yes'
git show -s --format='base=%H%nhead=%H%nhead-parents=%P%nhead-subject=%s' "$base" "$head"

printf '%s\n' '=== exact-range changed files ==='
git diff --name-status "$base" "$head"
git diff --stat "$base" "$head"

printf '%s\n' '=== exact-range patch, requested scope ==='
git diff --no-ext-diff --find-renames --find-copies "$base" "$head" -- "$search_file" "$test_file"

printf '%s\n' '=== SearchLayout outline at exact head ==='
git show "${head}:${search_file}" >/tmp/SearchLayout.tsx
ast-grep outline /tmp/SearchLayout.tsx --lang tsx --items all

printf '%s\n' '=== SearchLayout base ==='
git show "${base}:${search_file}" | cat -n
printf '%s\n' '=== SearchLayout exact head ==='
git show "${head}:${search_file}" | cat -n

printf '%s\n' '=== focused regression at exact head ==='
git show "${head}:${test_file}" | cat -n

printf '%s\n' '=== source equality after removing only intended attributes ==='
git show "${base}:${search_file}" >/tmp/search-base.tsx
git show "${head}:${search_file}" |
  sed 's/ role="status" aria-live="polite" className=/ className=/' >/tmp/search-head-normalized.tsx
if cmp -s /tmp/search-base.tsx /tmp/search-head-normalized.tsx; then
  echo 'only-live-region-attributes=yes'
else
  echo 'only-live-region-attributes=no'
  diff -u /tmp/search-base.tsx /tmp/search-head-normalized.tsx || true
fi

printf '%s\n' '=== focused async and timing constructs ==='
git show "${head}:${test_file}" |
  rg -n -C 4 'act\s*\(|setTimeout|setInterval|waitFor|vi\.(useFakeTimers|advanceTimers)|Promise|resolve|fetch|/api/search|loading|role|aria-live|결과가 없습니다' || true

printf '%s\n' '=== all live-region and alert occurrences in SearchLayout at head ==='
rg -n -C 3 'role="(status|alert)"|aria-live=|결과가 없습니다|오류|error' /tmp/SearchLayout.tsx

Length of output: 123448


🏁 Script executed:

#!/bin/bash
set -euo pipefail

api_file='frontend/src/lib/api-client.ts'

printf '%s\n' '=== API client outline ==='
ast-grep outline "$api_file" --items all

printf '%s\n' '=== API client fetch and JSON handling ==='
rg -n -C 12 '(^|[[:space:]])(async )?(post|get|request)[[:space:]]*<|fetch\s*\(|\.json\s*\(|Response|Api' "$api_file"

printf '%s\n' '=== structural post-method candidates ==='
ast-grep run --lang typescript \
  --pattern 'async post<$T>($$$) { $$$ }' \
  "$api_file" || true

printf '%s\n' '=== exact range without external comparison utility ==='
base='8348772f8bb92dc25605e8b1ef9e85c8196bf939'
head='e64a1181c234c9213774bcd5c2d4c4288bb889b2'
git diff --no-ext-diff --unified=0 "$base" "$head" -- frontend/src/components/SearchLayout.tsx

Length of output: 7634


@seonghobae 검토를 완료했습니다. 대상은 exact head e64a1181c234c9213774bcd5c2d4c4288bb889b2와 base 8348772f8bb92dc25605e8b1ef9e85c8196bf939입니다.

요청 범위에서 source-level finding은 없습니다.

  • Effective delta는 frontend/src/components/SearchLayout.empty-live-region.test.tsxfrontend/src/components/SearchLayout.tsx 두 파일뿐입니다.
  • SearchLayout.tsx의 유일한 source hunk는 빈 검색 결과 분기에 role="status" aria-live="polite"를 추가합니다.
  • 렌더링 분기는 loadingerrorfilteredResults.length === 0 순서입니다. 따라서 새 polite status는 빈 결과 상태에서만 적용됩니다.
  • 기존 loading status와 기존 role="alert" 오류 분기는 변경되지 않았습니다.
  • 기존 Search customer-copy, relationship copy, evidence-boundary copy는 exact range에서 변경되지 않았습니다.
  • 테스트는 /api/search 응답 Promise를 직접 제어합니다.
  • ApiClient.post()는 해당 fetch 응답의 response.json()을 기다립니다.
  • 테스트는 제어된 응답을 await act(async () => ...) 내부에서 resolve합니다. 이 동작은 결과 상태 업데이트와 finally의 loading 해제를 React act 안에서 flush합니다.
  • 테스트에는 setTimeout, setInterval, fake timer, waitFor 또는 bounded polling이 없습니다.
  • 테스트는 loading status가 먼저 존재함을 확인합니다. 그 후 empty status의 aria-live="polite"와 loading copy의 제거를 확인합니다.

Hosted execution, 브라우저, 키보드, 또는 assistive-technology 검증은 수행하지 않았습니다.

⚠️ 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.

Copy link
Copy Markdown
Contributor Author

@codex review

Please review only exact e64a1181c234c9213774bcd5c2d4c4288bb889b2 against base 8348772f8bb92dc25605e8b1ef9e85c8196bf939. Focus on the two-file Search async loading→empty live-region delta and especially whether the test deterministically waits for the same response-body promise that ApiClient.post() awaits, rather than merely awaiting an unrelated already-resolved promise. Do not transfer predecessor approval or broaden scope.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Current exact head advanced to 8ca8767c09810945a1348bdb1c4b862df1a87f96. Review only this head against #1603@8348772f8bb92dc25605e8b1ef9e85c8196bf939. Effective delta remains exactly two files. The new test-only child now controls the exact Response.json() body promise consumed by ApiClient.post(), proves the UI stays loading after headers resolve while the body is pending, then resolves that body inside React act before requiring the polite empty-result status. Verify that determinism, the unchanged one-line product hunk, and preservation of existing Search customer-copy/error semantics. Predecessor reviews do not transfer.

Copy link
Copy Markdown
Contributor Author

@codex review

Review only exact 8ca8767c09810945a1348bdb1c4b862df1a87f96 against 8348772f8bb92dc25605e8b1ef9e85c8196bf939. Focus on the two-file Search accessibility delta and the new deterministic two-stage response/body test. Confirm ApiClient.post() cannot finish while the controlled Response.json() promise is pending, the loading state therefore remains observable before body resolution, and no product source beyond the single empty-state live-region hunk changed.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@coderabbitai

coderabbitai Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='8348772f8bb92dc25605e8b1ef9e85c8196bf939'
head='8ca8767c09810945a1348bdb1c4b862df1a87f96'
search_file='frontend/src/components/SearchLayout.tsx'
test_file='frontend/src/components/SearchLayout.empty-live-region.test.tsx'
api_file='frontend/src/lib/api-client.ts'

git cat-file -e "${base}^{commit}"
git cat-file -e "${head}^{commit}"

printf '%s\n' '=== exact commit identity and ancestry ==='
git merge-base --is-ancestor "$base" "$head" && echo 'base-is-ancestor=yes'
git show -s --format='base=%H%nhead=%H%nhead-parents=%P%nhead-subject=%s' "$base" "$head"

printf '%s\n' '=== exact-range changed files and stat ==='
git diff --name-status "$base" "$head"
git diff --stat "$base" "$head"

printf '%s\n' '=== exact-range scoped patch ==='
git diff --no-ext-diff --find-renames --find-copies "$base" "$head" -- \
  "$search_file" "$test_file"

printf '%s\n' '=== base SearchLayout ==='
git show "${base}:${search_file}" | cat -n
printf '%s\n' '=== head SearchLayout ==='
git show "${head}:${search_file}" | cat -n
printf '%s\n' '=== head focused test ==='
git show "${head}:${test_file}" | cat -n

printf '%s\n' '=== API client outline and response-body handling ==='
ast-grep outline "$api_file" --items all
rg -n -C 14 '\bpost\s*<|\bpost\s*\(|fetch\s*\(|\.json\s*\(|Response' "$api_file"

printf '%s\n' '=== normalized product-source equality ==='
git show "${base}:${search_file}" >/tmp/search-base.tsx
git show "${head}:${search_file}" |
  sed 's/ role="status" aria-live="polite" className=/ className=/' \
  >/tmp/search-head-normalized.tsx
if cmp -s /tmp/search-base.tsx /tmp/search-head-normalized.tsx; then
  echo 'only-live-region-attributes=yes'
else
  echo 'only-live-region-attributes=no'
  diff -u /tmp/search-base.tsx /tmp/search-head-normalized.tsx || true
fi

printf '%s\n' '=== focused async and accessibility constructs ==='
git show "${head}:${test_file}" |
  rg -n -C 5 'Response|json\s*:|Promise|resolve|act\s*\(|fetch|/api/search|loading|role|aria-live|결과가 없습니다|setTimeout|setInterval|waitFor|advanceTimers' || true

printf '%s\n' '=== product live-region, error, and customer-copy branches ==='
rg -n -C 5 'role="(status|alert)"|aria-live=|결과가 없습니다|관계|근거|error|Error' \
  /tmp/search-head-normalized.tsx

Length of output: 144358


@seonghobae Reviewed exact head 8ca8767c09810945a1348bdb1c4b862df1a87f96 against exact base 8348772f8bb92dc25605e8b1ef9e85c8196bf939.

No source-level findings exist in the requested scope.

  • The base is an ancestor of the exact head.
  • The effective delta changes exactly two files.
  • SearchLayout.tsx has one product change. It adds role="status" aria-live="polite" to 맥락 검색 결과가 없습니다..
  • The render order is loading, then error, then empty results. The new status applies only to the empty-result branch.
  • The existing loading status and the existing role="alert" error branch are unchanged.
  • The exact diff does not modify customer-facing relationship copy or evidence-boundary copy.

The focused test is deterministic at the response-body boundary.

  • fetch("/api/search") returns searchResponse.responsePromise.
  • The resolved Response instance has a mocked json() method.
  • That json() method returns searchResponse.bodyPromise.
  • ApiClient.post() awaits this same response.json() promise.
  • The test resolves response headers first and verifies that loading remains while bodyPromise is pending.
  • The test resolves and awaits bodyPromise inside asynchronous React act.
  • The test then verifies the polite empty-result status and removal of the loading text.
  • The test does not use setTimeout, setInterval, fake timers, waitFor, or bounded polling.

I did not run hosted execution or browser, keyboard, or assistive-technology validation.

⚠️ 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.

1 participant