Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 6 additions & 0 deletions .jules/palette.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,9 @@
## 2026-07-30 - Add window.confirm for destructive actions
**Learning:** Destructive actions like deleting groups and edge relationships previously occurred immediately without user confirmation.
**Action:** Always wrap delete operations with window.confirm() dialogs and ensure corresponding tests successfully mock window.confirm.
## 2025-02-23 - κ·Έλ£Ή 및 관계 μ‚­μ œ μ‹œ 쀑볡 확인창 제거
**Learning:** λͺ¨λ‹¬μ°½ λ‚΄λΆ€μ˜ `window.confirm`κ³Ό λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ˜ ν•Έλ“€λŸ¬μ— μžˆλŠ” `window.confirm`이 μ€‘λ³΅μœΌλ‘œ λ°œμƒν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ 두 번의 확인을 μš”κ΅¬ν•˜λŠ” λΆˆνŽΈν•œ UX λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
**Action:** λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ— μžˆλŠ” μƒμ„Έν•œ μ„€λͺ…μ˜ ν™•μΈμ°½λ§Œ 남기고 `GroupModal.tsx`와 `EditEdgeModal.tsx` λ‚΄μ˜ λΆˆν•„μš”ν•œ `window.confirm` μ½”λ“œλ₯Ό μ œκ±°ν•˜μ—¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°„μ†Œν™”ν–ˆμŠ΅λ‹ˆλ‹€.
## 2026-08-24 - Transient STRIX Failures
**Learning:** If the STRIX CI penetration test fails with 'provider/backend was unavailable' or 'LLM CONNECTION FAILED', this indicates a transient infrastructure failure with the Strix AI provider backend, not a codebase vulnerability.
**Action:** Do not attempt to modify the repository to fix this specific connection error, simply resubmit to trigger a new run.
1 change: 1 addition & 0 deletions frontend/src/App.coverage.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@ describe('App orchestration coverage', () => {
expect(screen.getByRole('heading', { name: 'ν”„λ‘œμ νŠΈ' })).toBeInTheDocument()
fireEvent.click(screen.getAllByRole('button', { name: 'μ—΄κΈ°' })[1]!)
expect(screen.getByRole('heading', { name: 'λ‹€μ΄μ–΄κ·Έλž¨' })).toBeInTheDocument()
await waitFor(() => expect(screen.queryByText('아직 λ‹€μ΄μ–΄κ·Έλž¨ μŠ€λƒ…μƒ·μ΄ μ—†μŠ΅λ‹ˆλ‹€. νŽΈμ§‘κΈ°μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 역곡학해 μ‹œμž‘ν•˜μ„Έμš”.')).not.toBeInTheDocument())
fireEvent.change(screen.getByLabelText('λ‹€μ΄μ–΄κ·Έλž¨ 검색'), { target: { value: 'no-match' } })
expect(screen.getByText('검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€.')).toBeInTheDocument()
fireEvent.change(screen.getByLabelText('λ‹€μ΄μ–΄κ·Έλž¨ 검색'), { target: { value: 'failed' } })
Expand Down
1 change: 0 additions & 1 deletion frontend/src/components/modals/EditEdgeModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ export function EditEdgeModal({
<button
type="button"
onClick={() => {
if (!window.confirm("이 관계λ₯Ό μ‚­μ œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?")) return;
onRelDelete();
}}
style={{ color: "#b91c1c", borderColor: "#fca5a5" }}
Expand Down
1 change: 0 additions & 1 deletion frontend/src/components/modals/GroupModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,6 @@ export function GroupModal({
type="button"
aria-label={`${group.name} κ·Έλ£Ή μ‚­μ œ`}
onClick={() => {
if (!window.confirm(`'${group.name}' 그룹을 μ‚­μ œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?`)) return;
onDeleteBusinessGroup(group.id);
}}
Comment on lines 111 to 113

@devin-ai-integration devin-ai-integration Bot Aug 24, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟑 User-visible change missing from CHANGELOG

Removing the delete confirmation dialogs changes user-visible behavior, but neither CHANGELOG.md nor frontend/CHANGELOG.md is updated, contrary to the repo convention that user-visible frontend changes be recorded in both Unreleased sections.

Open in Devin Review

Was this helpful? React with πŸ‘ or πŸ‘Ž to provide feedback.

Comment on lines 111 to 113

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

πŸ“ Info: Duplicate confirm removal is safe

onRelDelete (frontend/src/App.tsx:688) and onDeleteBusinessGroup (frontend/src/App.tsx:843) still call window.confirm, so deletion keeps one confirmation. Both modals are only used by App.tsx, so no other caller relied on the removed prompt.

Open in Devin Review

Was this helpful? React with πŸ‘ or πŸ‘Ž to provide feedback.

>
Expand Down
4 changes: 0 additions & 4 deletions frontend/src/components/modals/ModalCoverage.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,7 @@ describe('modal behavior coverage', () => {
fireEvent.change(screen.getByLabelText('μ œμ•½μ‘°κ±΄ 이름 (Label)'), {
target: { value: 'fk_changed' },
})
vi.spyOn(window, 'confirm').mockReturnValueOnce(true)
fireEvent.click(screen.getByRole('button', { name: 'μ‚­μ œ' }))
expect(window.confirm).toHaveBeenCalledWith("이 관계λ₯Ό μ‚­μ œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?")
fireEvent.click(screen.getByRole('button', { name: 'μ·¨μ†Œ' }))
fireEvent.click(screen.getByRole('button', { name: 'μ €μž₯' }))
expect(setRelLabel).toHaveBeenCalledWith('fk_changed')
Expand Down Expand Up @@ -264,9 +262,7 @@ describe('modal behavior coverage', () => {
fireEvent.change(screen.getByLabelText('κ·Έλ£Ή 이름'), { target: { value: 'New' } })
fireEvent.click(screen.getAllByRole('button', { name: /^색상 / })[1]!)
fireEvent.click(screen.getByRole('button', { name: 'μΆ”κ°€' }))
vi.spyOn(window, 'confirm').mockReturnValueOnce(true)
fireEvent.click(screen.getByRole('button', { name: 'Billing κ·Έλ£Ή μ‚­μ œ' }))
expect(window.confirm).toHaveBeenCalledWith("'Billing' 그룹을 μ‚­μ œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?")
fireEvent.change(screen.getByRole('combobox'), { target: { value: '' } })
fireEvent.click(screen.getByRole('button', { name: '업무 κ·Έλ£Ή λ‹«κΈ°' }))
expect(setName).toHaveBeenCalledWith('New')
Expand Down
Loading