Skip to content

๐ŸŽจ Palette: ๋น„๋™๊ธฐ ๋กœ๋”ฉ ์ƒํƒœ์˜ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ํ…Œ์ด๋ธ” ํ–‰ ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ ์ถ”๊ฐ€ - #1368

Draft
seonghobae wants to merge 4 commits into
developfrom
palette-ux-async-row-disabled-14626093907206407032
Draft

seonghobae wants to merge 4 commits into
developfrom
palette-ux-async-row-disabled-14626093907206407032

Conversation

@seonghobae

@seonghobae seonghobae commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Buyer-visible outcome

Prevents duplicate pointer, Enter, and Space activation of a scan-history row while its asynchronous detail request is pending. The row remains focusable and exposes aria-busy plus aria-disabled; success, failure, stale completion, or Escape restores only the current row state.

Exact authority

  • protected base: develop@2949d30718752ea5915c7713ba227e8c19d9e5bf
  • original implementation head: 90bde706088ffa0a3380c7ef2c28681d612f6198
  • first regression head: c026a4f72c1bf9de1e9d687e134a5d556fbd01bc
  • repaired regression head: eaea564c53f3b4f7d1bd01086f0e311fe949d6ac
  • current exact head: 21b92ac8c6e048685734bf85c704deb601589b1d
  • exact tree: 548065034ae313103e4c68c56bb456bb300607f5
  • exact regression blob: 2ed63cb92d61ffecfa74ba71e1969546b1913189
  • current relation: one ordinary source-neutral child ahead of eaea564..., zero behind, zero changed files
  • lifecycle: Draft / open / mergeable

Root cause and bounded repair

pointer-events: none alone does not prevent keyboard activation, and <tr> has no native disabled state. The production change therefore uses a synchronous aria-disabled guard in both click and Enter/Space handlers, sets the state before awaiting the API, and removes it only when the row's detailRequest still matches the completing request. Escape invalidates the request, clears busy/disabled state, and restores focus.

The first candidate changed this behavior without a regression. The first test child failed on both Python 3.11 and 3.13 after counting two tr.removeAttribute calls even though Escape correctly clears lastDetailFocus and request settlement clears tr. Exact logs reported 1 failed / 1,091 passed. The ordinary repair independently requires lastDetailFocus.removeAttribute and tr.removeAttribute. No production abstraction or dependency was added. Current head 21b92ac... is a source-neutral preservation child of the repaired tree.

Test-first and exact-log evidence

  • RED against protected develop: four new disabled-state assertions fail; the existing request-identity assertion passes
  • GREEN source contract against implementation: pointer/keyboard guards, pending CSS/ARIA, Escape cleanup, settlement cleanup, and request identity are present
  • failed hosted head c026a4f...: Python 3.11 and 3.13 each report exactly 1 failed / 1,091 passed at the incorrect cleanup-count assertion
  • current exact head: Tests 36881388166, Security Scan 36881388150, SAST 36881388234, Security Process 36881388158, Retention 36881388553, OpenSSF 36881388239, Pinned HTTPS 36881388243, and Scan path 36881388313 are terminal SUCCESS
  • CodeQL 36881388246 completed/skipped; qualifying approval is 0 and unresolved threads are 0

Delivery gate

Keep Draft until successful CodeQL settlement where required and qualifying independent review. No Force Push, destructive rebase, self-approval, gate weakening, merge, tag, or release.

@google-labs-jules

Copy link
Copy Markdown

๐Ÿ‘‹ Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a ๐Ÿ‘€ emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@coderabbitai

coderabbitai Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

Review in Change Stack โ†’

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. ๐ŸŽ‰

โ„น๏ธ Recent review info
โš™๏ธ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 68562a40-e207-407d-b3bf-a5df78a49900

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 2949d30 and 90bde70.

๐Ÿ“’ Files selected for processing (2)
  • .jules/palette.md
  • scanner/dashboard/console.html

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.


๐Ÿ“ Walkthrough

Walkthrough

์ƒ์„ธ ์š”์ฒญ ์ค‘ ์Šค์บ” ํ–‰์˜ ํด๋ฆญ๊ณผ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ์ฐจ๋‹จํ•˜๊ณ  ๋น„ํ™œ์„ฑ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ์™„๋ฃŒ ๋˜๋Š” ์ƒ์„ธ ์ฐฝ ๋‹ซ๊ธฐ ์‹œ ๋น„ํ™œ์„ฑ ์ƒํƒœ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

Changes

์Šค์บ” ํ–‰ ์ƒํ˜ธ์ž‘์šฉ

Layer / File(s) Summary
์ƒ์„ธ ์š”์ฒญ ์ค‘ ํ–‰ ๋น„ํ™œ์„ฑํ™” ๋ฐ ๋ณต๊ตฌ
.jules/palette.md, scanner/dashboard/console.html
์ƒ์„ธ ์š”์ฒญ ์‹œ์ž‘ ์‹œ aria-disabled="true"๋ฅผ ์„ค์ •ํ•˜๊ณ , ํด๋ฆญ ๋ฐ Enter/Space ์ž…๋ ฅ์—์„œ ๋น„ํ™œ์„ฑ ํ–‰์˜ ์š”์ฒญ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ์™„๋ฃŒ ๋˜๋Š” ์ƒ์„ธ ์ฐฝ ๋‹ซ๊ธฐ ์‹œ ์†์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. CSS๋Š” ๋น„ํ™œ์„ฑ ํ–‰์˜ ํฌ์ธํ„ฐ ์ž…๋ ฅ์„ ์ฐจ๋‹จํ•˜๊ณ  ๋ถˆํˆฌ๋ช…๋„๋ฅผ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค. ํŒ”๋ ˆํŠธ ์ง€์นจ์— ์ด ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Priority: โฌ‡๏ธ Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Merge Risk: โšช Minimal ยท up to 90bde

Rows reject repeated activation while details load and recover after requests finish, including failures. No concrete merge-blocking risk was identified.

Architecture Summary

Architecture risk: ๐Ÿ”ต Low ยท up to 90bde

The change affects 1 system.

Changed systems: scanner

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed โ€” scanner (service) was modified; 1 changed file maps to changed impact.

Before / after behavior

  • observed โ€” Modified behavior in scanner/dashboard/console.html: aria-disabled="true"์ธ ์Šค์บ” ํ–‰์˜ ํฌ์ธํ„ฐ ์ž…๋ ฅ์„ ๋ง‰๊ณ  ๋ถˆํˆฌ๋ช…๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • observed โ€” Modified behavior in scanner/dashboard/console.html: ์ƒ์„ธ ์ฐฝ์„ ๋‹ซ์„ ๋•Œ ๋งˆ์ง€๋ง‰ ํฌ์ปค์Šค ๋Œ€์ƒ์—์„œ aria-disabled๋ฅผ ์ œ๊ฑฐํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • observed โ€” Modified behavior in scanner/dashboard/console.html: ์Šค์บ” ํ–‰์˜ ํด๋ฆญ ๋ฐ Enter/Space ์ฒ˜๋ฆฌ์—์„œ aria-disabled="true"์ด๋ฉด ์ƒ์„ธ ์š”์ฒญ์„ ์ค‘๋‹จํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฒ˜๋ฆฌ์—๋Š” ์ด ์ฐจ๋‹จ ๊ฒ€์‚ฌ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • observed โ€” Modified behavior in scanner/dashboard/console.html: ์ƒ์„ธ ์š”์ฒญ ์‹œ์ž‘ ์‹œ ํ•ด๋‹น ์Šค์บ” ํ–‰์— aria-disabled="true"๋ฅผ ์„ค์ •ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
๐Ÿšฅ Pre-merge checks | โœ… 5
โœ… Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage โœ… Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0โ€ฆ
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.
Description Check โœ… Passed Check skipped - CodeRabbitโ€™s high-level summary is enabled.
Title check โœ… Passed ์ œ๋ชฉ์€ ๋น„๋™๊ธฐ ๋กœ๋”ฉ ์ค‘ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ํ…Œ์ด๋ธ” ํ–‰์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ •ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
โœจ Finishing Touches ๐Ÿ’ก 1
๐Ÿงช Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
๐Ÿ› ๏ธ Fix failing CI checks ๐Ÿ’ก
  • Commit to this branch
  • Create a new PR
  • Autopilot ยท Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


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.

@seonghobae
seonghobae marked this pull request as draft October 1, 2026 14:58

Copy link
Copy Markdown
Contributor Author

Missing regression repaired on the existing writer branch.

  • exact head c026a4f72c1bf9de1e9d687e134a5d556fbd01bc
  • tree 9c89fe31f8336ad23eb40336c354657a1be63eb8
  • test blob 7fab68b5adfb7951e30692ee2e5151137c30ef20
  • ordinary child of 90bde706088ffa0a3380c7ef2c28681d612f6198; force:false
  • RED on protected source: 4 disabled-state assertions fail / 1 existing request-identity assertion passes
  • GREEN on implementation source: 5/5 assertions pass

The test is intentionally added to the existing console detail-loading contract; no duplicate UI abstraction or dependency was introduced. Fresh exact-head hosted Checks and independent review remain required, so the PR stays Draft.

seonghobae added a commit that referenced this pull request Oct 1, 2026

Copy link
Copy Markdown
Contributor Author

Exact-log RCA and test-only repair:

  • failed head c026a4f72c1bf9de1e9d687e134a5d556fbd01bc: Tests 36880717787
  • both Python 3.11 and 3.13: 1 failed / 1,091 passed
  • failing assertion expected two tr.removeAttribute("aria-disabled") calls
  • production correctly uses lastDetailFocus.removeAttribute for Escape and tr.removeAttribute for request settlement
  • repaired head eaea564c53f3b4f7d1bd01086f0e311fe949d6ac
  • tree 548065034ae313103e4c68c56bb456bb300607f5
  • regression blob 2ed63cb92d61ffecfa74ba71e1969546b1913189

The ordinary force:false child changes only the test identity and separately asserts both cleanup paths. Fresh exact-head Checks are required; Draft remains.

@google-labs-jules

Copy link
Copy Markdown

Missing regression repaired on the existing writer branch.

  • exact head c026a4f72c1bf9de1e9d687e134a5d556fbd01bc
  • tree 9c89fe31f8336ad23eb40336c354657a1be63eb8
  • test blob 7fab68b5adfb7951e30692ee2e5151137c30ef20
  • ordinary child of 90bde706088ffa0a3380c7ef2c28681d612f6198; force:false
  • RED on protected source: 4 disabled-state assertions fail / 1 existing request-identity assertion passes
  • GREEN on implementation source: 5/5 assertions pass

The test is intentionally added to the existing console detail-loading contract; no duplicate UI abstraction or dependency was introduced. Fresh exact-head hosted Checks and independent review remain required, so the PR stays Draft.

Acknowledged. Thanks for providing the test updates on the writer branch to verify the fix.

@google-labs-jules

Copy link
Copy Markdown

Exact-log RCA and test-only repair:

  • failed head c026a4f72c1bf9de1e9d687e134a5d556fbd01bc: Tests 36880717787
  • both Python 3.11 and 3.13: 1 failed / 1,091 passed
  • failing assertion expected two tr.removeAttribute("aria-disabled") calls
  • production correctly uses lastDetailFocus.removeAttribute for Escape and tr.removeAttribute for request settlement
  • repaired head eaea564c53f3b4f7d1bd01086f0e311fe949d6ac
  • tree 548065034ae313103e4c68c56bb456bb300607f5
  • regression blob 2ed63cb92d61ffecfa74ba71e1969546b1913189

The ordinary force:false child changes only the test identity and separately asserts both cleanup paths. Fresh exact-head Checks are required; Draft remains.

Acknowledged. I've updated the test_console_detail_loading_contract.py regression test locally to separately assert both tr.removeAttribute("aria-disabled"); and lastDetailFocus.removeAttribute("aria-disabled"); matching your repair. Tests pass locally now.

Copy link
Copy Markdown
Contributor Author

์ตœ์ข… exact-head ์žฌ๊ฒ€์ฆ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

  • ํ˜„์žฌ head: 21b92ac8c6e048685734bf85c704deb601589b1d
  • tree: 548065034ae313103e4c68c56bb456bb300607f5
  • regression blob: 2ed63cb92d61ffecfa74ba71e1969546b1913189
  • eaea564... ๋Œ€๋น„: ordinary child 1 ahead / 0 behind / 0 changed files
  • 8๊ฐœ non-CodeQL workflow: ๋ชจ๋‘ terminal SUCCESS
  • CodeQL 36881388246: completed/skipped
  • review approval 0 / unresolved thread 0

์ฒซ ํšŒ๊ท€ head c026a4f...์˜ ์–‘ Python job์€ ์ž˜๋ชป๋œ cleanup ์‹๋ณ„์ž count ๋•Œ๋ฌธ์— ๊ฐ๊ฐ 1 failed / 1,091 passed์˜€์Šต๋‹ˆ๋‹ค. production ๊ฒฐํ•จ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๊ตฌํ˜„์€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ , Escape์˜ lastDetailFocus cleanup๊ณผ request-settlement์˜ tr cleanup์„ ๋ณ„๋„๋กœ ๊ฒ€์ฆํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„ head๋Š” ๊ฒ€์ฆ๋œ repaired tree๋ฅผ source-neutralํ•˜๊ฒŒ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

CodeQL ์„ฑ๊ณต ํŒ์ •๊ณผ ๋…๋ฆฝ ์Šน์ธ์ด ์—†์œผ๋ฏ€๋กœ Draft๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ merge/releaseํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@google-labs-jules

Copy link
Copy Markdown

์ตœ์ข… exact-head ์žฌ๊ฒ€์ฆ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

  • ํ˜„์žฌ head: 21b92ac8c6e048685734bf85c704deb601589b1d
  • tree: 548065034ae313103e4c68c56bb456bb300607f5
  • regression blob: 2ed63cb92d61ffecfa74ba71e1969546b1913189
  • eaea564... ๋Œ€๋น„: ordinary child 1 ahead / 0 behind / 0 changed files
  • 8๊ฐœ non-CodeQL workflow: ๋ชจ๋‘ terminal SUCCESS
  • CodeQL 36881388246: completed/skipped
  • review approval 0 / unresolved thread 0

์ฒซ ํšŒ๊ท€ head c026a4f...์˜ ์–‘ Python job์€ ์ž˜๋ชป๋œ cleanup ์‹๋ณ„์ž count ๋•Œ๋ฌธ์— ๊ฐ๊ฐ 1 failed / 1,091 passed์˜€์Šต๋‹ˆ๋‹ค. production ๊ฒฐํ•จ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๊ตฌํ˜„์€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ , Escape์˜ lastDetailFocus cleanup๊ณผ request-settlement์˜ tr cleanup์„ ๋ณ„๋„๋กœ ๊ฒ€์ฆํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„ head๋Š” ๊ฒ€์ฆ๋œ repaired tree๋ฅผ source-neutralํ•˜๊ฒŒ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

CodeQL ์„ฑ๊ณต ํŒ์ •๊ณผ ๋…๋ฆฝ ์Šน์ธ์ด ์—†์œผ๋ฏ€๋กœ Draft๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ merge/releaseํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  non-CodeQL ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๊ณ  ์ˆ˜์ •๋œ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•จ์„ ํ™•์ธํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ž‘์—… ์—†์ด CI ๊ฒ€์ฆ ๋Œ€๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog

Development

Successfully merging this pull request may close these issues.

1 participant