Skip to content

fix(dashboard): 자동요약을 서버 배치에 위임해 목록 창 밖 세션까지 처리 - #387

Merged
k002bill2 merged 1 commit into
mainfrom
fix/auto-summary-server-batch
Sep 3, 2026
Merged

fix(dashboard): 자동요약을 서버 배치에 위임해 목록 창 밖 세션까지 처리#387
k002bill2 merged 1 commit into
mainfrom
fix/auto-summary-server-batch

Conversation

@k002bill2

Copy link
Copy Markdown
Owner

Summary

  • 자동요약이 GET /api/agent-sessions?limit=200 으로 최근 200 건만 훑어 그 창 밖의 미요약 세션에 영원히 닿지 못하던 문제를 고친다
  • 목록을 넓히는 대신 창이 없는 서버 배치(generate-batch)로 위임한다 — _discover_with_monitors 가 전체 세션을 훑는다
  • 부수적으로 같은 세션에 1.7s 간격으로 두 번 POST 가 나가던 문제도 함께 사라진다

배경 (실측)

미요약 267 건이 전부 창 밖의 오래된 Codex 세션이었다. Codex 요약은 #384 로 하루 전 도입된 기능이라 회귀가 아닌 기능 이전 백로그지만, 자동으로는 소진되지 않고 수동 "일괄 요약 생성" 버튼(50 건)을 여섯 번 눌러야 하는 상태였다.

확인 항목
요약 생성 성공 / 실패 202 건 / 0 건
개별 자동요약 POST 52 건, 전부 200
배치 처리량 50 요청 → 캐시 정확히 50 개 (실측 333s)
pending 267 → 0 (limit=300 배치 1 회, 195/195 성공)

Changes

stores/claudeSessions/index.ts

  • autoGenerateMissingSummaries 가 목록 조회 + 세션별 POST 루프 대신 POST /api/claude-sessions/summaries/generate-batch?limit=20&skip_existing=true 1 회를 호출
  • 서버가 이미 가진 요청 간 지연 2s·재시도 3 회를 그대로 얻는다 (프론트 루프에는 페이싱이 없었다)
  • 자동 실행도 isBatchGenerating 을 세우고 finally 에서 내린다 — 읽기만 하면 가드가 자기 자신에게 무력해 새로고침·필터 변경이 같은 후보를 다시 집는다
  • 단건 생성(generatingSummaryFor)과도 상호 배제 — 그 세션은 아직 캐시가 없어 배치 후보에 그대로 들어온다
  • 수동 배치의 batchProgress·batchJustCompleted 는 건드리지 않는다. 후자는 일괄 생성 버튼을 숨기는 플래그라 자동이 세우면 사용자가 백로그를 직접 소진할 수단을 잃는다

limit=20 근거 — 건당 실측 6.7s 라 정상 133s. 막히는 세션 하나가 372s(재시도 3 회 × httpx 120s)라 1 건까지는 499s 로 클라이언트 타임아웃 600s 안이다. 2 건부터는 어떤 limit 으로도 못 막는다(10 건이어도 797s) — 막힌 건 하나의 비용이 배치 전체보다 크기 때문. 근거를 주석에 남겼다.

__tests__/claudeSessions.test.ts

  • 새 동작 11 개 테스트 (위임·상한·in-flight·상호배제·UI 상태 불변·403)
  • resetStore() 에 빠져 있던 permissionDenied 를 채웠다. 없으면 앞선 403 테스트가 세운 플래그가 뒤 테스트로 새어, 호출이 안 나간 이유가 코드가 아니라 앞 테스트라는 사실이 드러나지 않는다

Codex 리뷰 3 라운드

라운드 지적 처리
1차 [P1] 자동 배치가 자기를 in-flight 표시 안 함 반영
2차 [P2] 단건 생성과 상호 배제 (회귀) 반영
2차 [P2] 최악 런타임 주석 과신 반영 (재계산 후 정정)
2차 [P2] 진행 중 끄기가 배치를 못 멈춤 미반영 — abort 해도 서버는 끝까지 돌아 취소가 표시상의 것일 뿐. 대신 붙잡히는 구간이 200 건에서 20 건으로 짧아졌다
3차 [P2] 필터(project/source_user) 미전달 미반영 — 필터를 존중하면 필터를 건 사용자가 다른 프로젝트 백로그에 영원히 못 닿는다. 이 변경이 없앤 "최근 200 건" 창과 축만 다른 같은 문제다. 필터 밖 요약은 낭비가 아니라 선반영이고(캐시 값은 어디서 만들어도 같다) 미요약 배지도 필터가 없으면 전체를 센다

미반영 2 건은 사유를 코드 주석에 (Codex [P2], 미반영) 로 남겼다.

동작 변화

  • 필터가 걸려 있어도 전체 세션을 대상으로 요약한다 (위 3차 항목 참조)
  • 자동 실행 중에는 일괄 생성 버튼이 비활성화되고 스피너가 돈다 — 실제로 생성 중이므로 정직한 표시

Test Plan

  • npx tsc --noEmit — exit 0
  • npm run lint — 0 건
  • npx vitest run — 4479 passed (211 files)
  • npm run build — OK
  • Red-Green: 구현을 HEAD 버전으로 되돌려 새 테스트 4 건이 실패하는 것을 확인 후 복원
  • 대시보드에서 Agent Sessions 페이지 새로고침 → 미요약 배지가 남아 있으면 자동으로 20 건씩 줄어드는지 확인

🤖 Generated with Claude Code

https://claude.ai/code/session_01H9Ud1j4pa5DZ54TL6DFfAi

자동요약이 `GET /api/agent-sessions?limit=200` 으로 최근 200 건만 훑어,
그 창 밖의 미요약 세션에는 영원히 닿지 못했다. 실측 결과 미요약 267 건이
전부 창 밖의 오래된 Codex 세션이었고, 수동 "일괄 요약 생성" 버튼(50 건)을
반복해서 눌러야만 소진되는 상태였다.

목록을 넓히는 대신 창이 없는 서버 배치로 위임한다
(`_discover_with_monitors` 가 전체 세션을 훑는다). 부수적으로 서버가 이미
가진 요청 간 지연 2s·재시도 3 회를 얻고, 세션마다 POST 를 순차 발사하던
루프가 사라지면서 같은 세션에 1.7s 간격으로 두 번 요청이 나가던 문제도
함께 없어진다 (원인이던 `generatingSummaryFor` 가드가 await 이전에 읽혀
두 호출이 같은 null 을 보던 구조).

- limit 20: 건당 실측 6.7s 라 정상 133s. 막히는 세션 하나가 372s(재시도
  3 회 × httpx 120s)라 1 건까지는 499s 로 클라이언트 타임아웃 600s 안이다.
  2 건부터는 어떤 limit 으로도 못 막는다(10 건이어도 797s) — 근거는 주석에.
- 자동 실행도 `isBatchGenerating` 을 세우고 finally 에서 내린다. 읽기만 하면
  가드가 자기 자신에게 무력해 새로고침·필터 변경이 같은 후보를 다시 집는다.
- 수동 배치의 `batchProgress`·`batchJustCompleted` 는 건드리지 않는다.
  후자는 일괄 생성 버튼을 숨기는 플래그라 자동이 세우면 사용자가 백로그를
  직접 소진할 수단을 잃는다.

테스트: `resetStore()` 에 빠져 있던 `permissionDenied` 를 채웠다. 없으면
앞선 403 테스트가 세운 플래그가 뒤 테스트로 새어, 호출이 안 나간 이유가
코드가 아니라 앞 테스트라는 사실이 드러나지 않는다.

검증: tsc 0, eslint 0, vitest 4479 passed, build OK.
Codex 리뷰 3 라운드 — [P1] 1 건·[P2] 2 건 반영, [P2] 2 건은 사유를 주석에
남기고 미반영(진행 중 취소는 서버가 계속 돌아 무의미, 필터 존중은 이 변경이
없앤 창 문제를 축만 바꿔 되살림).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H9Ud1j4pa5DZ54TL6DFfAi
@k002bill2
k002bill2 merged commit 7066eb5 into main Sep 3, 2026
9 checks passed
@k002bill2
k002bill2 deleted the fix/auto-summary-server-batch branch September 3, 2026 00:06
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