Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
ad9a8eb
๐ŸŽจ Palette: [aria-busy] ์‹œ๊ฐ์ /๊ธฐ๋Šฅ์  ํ”ผ๋“œ๋ฐฑ ์ถ”๊ฐ€
seonghobae Aug 23, 2026
1858c2e
๐ŸŽจ Palette: [aria-busy] ์‹œ๊ฐ์ /๊ธฐ๋Šฅ์  ํ”ผ๋“œ๋ฐฑ ์ถ”๊ฐ€
seonghobae Aug 23, 2026
cbeb554
๐ŸŽจ Palette: [aria-busy] ์‹œ๊ฐ์ /๊ธฐ๋Šฅ์  ํ”ผ๋“œ๋ฐฑ ์ถ”๊ฐ€
seonghobae Aug 23, 2026
4449c7d
๐ŸŽจ Palette: [aria-busy] ์‹œ๊ฐ์ /๊ธฐ๋Šฅ์  ํ”ผ๋“œ๋ฐฑ ์ถ”๊ฐ€
seonghobae Aug 23, 2026
405fdad
test(console): cover busy row activation guard
seonghobae Aug 24, 2026
1ab6721
fix(console): block repeat busy row activation
seonghobae Aug 24, 2026
e45b266
๐ŸŽจ Palette: [aria-busy] ์‹œ๊ฐ์ /๊ธฐ๋Šฅ์  ํ”ผ๋“œ๋ฐฑ ์ถ”๊ฐ€ ๋ฐ ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€
seonghobae Aug 24, 2026
653eef1
Merge branch 'develop' into palette-ux-aria-busy-pointer-events-86489โ€ฆ
opencode-agent[bot] Aug 27, 2026
c4db71f
docs(ui): keep busy-state doctrine evidence-scoped
seonghobae Sep 7, 2026
c314a95
๐ŸŽจ Palette: [aria-busy] ์‹œ๊ฐ์ /๊ธฐ๋Šฅ์  ํ”ผ๋“œ๋ฐฑ ์ถ”๊ฐ€ ๋ฐ ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€
seonghobae Sep 7, 2026
bda517e
fix(pr): preserve scoped busy-state delta after concurrent update
seonghobae Sep 7, 2026
84b8ae6
๐ŸŽจ Palette: [aria-busy] ์‹œ๊ฐ์ /๊ธฐ๋Šฅ์  ํ”ผ๋“œ๋ฐฑ ์ถ”๊ฐ€ ๋ฐ ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€
seonghobae Sep 7, 2026
e9d1946
๐ŸŽจ Palette: [aria-busy] ์‹œ๊ฐ์ /๊ธฐ๋Šฅ์  ํ”ผ๋“œ๋ฐฑ ์ถ”๊ฐ€ ๋ฐ ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€
seonghobae Sep 7, 2026
57fcbcd
๐ŸŽจ Palette: [aria-busy] ์‹œ๊ฐ์ /๊ธฐ๋Šฅ์  ํ”ผ๋“œ๋ฐฑ ์ถ”๊ฐ€ ๋ฐ ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€
seonghobae Sep 7, 2026
32953df
๐ŸŽจ Palette: [aria-busy] ์‹œ๊ฐ์ /๊ธฐ๋Šฅ์  ํ”ผ๋“œ๋ฐฑ ์ถ”๊ฐ€ ๋ฐ ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€
seonghobae Sep 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .jules/palette.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,3 +81,7 @@
## 2026-08-12 - Skip to Content Accessibility
**Learning:** Screen reader and keyboard-only users experience significant friction when forced to navigate through repetitive header controls on every page load.
**Action:** Keep a visible-on-focus skip link as the first interactive element, target a programmatically focusable main container, and give the focused link a high-contrast outline.

## 2026-08-23 - Async Interactive Element Interactions
**Learning:** Adding `aria-busy="true"` explicitly communicates loading states to screen readers, but it does not natively prevent clicks, unlike the `disabled` attribute. During async operations (like loading scan details), users might double-click an interactive element that lacks `pointer-events: none`, causing duplicate API requests or unexpected state bugs.
**Action:** Always map the `[aria-busy="true"]` state directly to CSS with `pointer-events: none` and visual indicators (like `opacity`) to ensure visual parity with the accessibility tree and prevent duplicate user actions.
3 changes: 0 additions & 3 deletions CHANGELOG.d/1031-malicious-shared-skill-threats.md

This file was deleted.

2 changes: 0 additions & 2 deletions docs/THREAT_MODEL.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,6 @@ flowchart LR
| deploy exclusions erase evidence | hidden risk | exclusions affect gate only; finding remains visible |
| tampered SBOM/report evidence | acquisition/security misstatement | deterministic source/lock provenance and manifest hashes |
| autonomous model self-approval | governance bypass | developer/reviewer/merge/release authority separation |
| malicious shared skill (homoglyph name, injected instructions, exfiltration directive) | agent hijack and secret exfiltration | deny-listed skill sync with exact alias matching; catalog/skill text treated as untrusted data, never instructions (#1031) |
| placeholder template published as an installable skill | discovery pollution and broken installs | reject unresolved placeholder names at sync; workspace state kept out of skill roots (#1031) |

## Stored SSRF abuse case

Expand Down
5 changes: 3 additions & 2 deletions scanner/dashboard/console.html
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
.err{color:var(--crit);font-weight:600}
code{background:var(--bg);padding:1px 5px;border-radius:4px}
.hidden{display:none}
:disabled, [aria-busy="true"] { opacity: 0.7; pointer-events: none; }
Comment thread
seonghobae marked this conversation as resolved.
Comment thread
seonghobae marked this conversation as resolved.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
</style>
</head>
<body>
Expand Down Expand Up @@ -135,8 +136,8 @@ <h1>AppGuardrail Console</h1>
<td>${esc(s.created_at)}</td><td>${esc(s.repo||"โ€”")}</td><td><code>${esc((s.commit||"โ€”").slice(0,10))}</code></td>
<td>${s.total}</td><td>${pill(s.deploy_blocking,"var(--crit)")}</td><td>${pill(s.new_blocking,"var(--high)")}</td></tr>`).join("")||'<tr><td colspan="6" class="muted">No scans. POST to /api/v1/scans from CI.</td></tr>';
document.querySelectorAll("tr.scan").forEach(tr=>{
tr.onclick=()=>detail(tr.dataset.id,tr);
tr.addEventListener('keydown', e => { if(e.key === 'Enter' || e.key === ' ') { e.preventDefault(); detail(tr.dataset.id,tr); } });
tr.onclick=()=>{if(tr.getAttribute("aria-busy")==="true")return;detail(tr.dataset.id,tr);};
tr.addEventListener('keydown', e => { if(e.key === 'Enter' || e.key === ' ') { e.preventDefault(); if(tr.getAttribute("aria-busy")==="true")return; detail(tr.dataset.id,tr); } });
});
}catch(e){ $("#msg").classList.remove("hidden");$("#app").classList.add("hidden");
$("#msg").innerHTML=`<span class="err">${esc(e.message)}</span>`; }
Expand Down
Loading