Skip to content
Draft
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
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@
# Ignore Gradle build output directory
build

.idea
.idea
# Ignore backup files created during exploration
*.orig
24 changes: 24 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,27 @@
## 2026-08-11 - Array의 toMutableList 할당 오버헤드 최적화
**학습:** 배열을 정렬하기 위해 `.toMutableList()`를 호출하면 새로운 `ArrayList` 객체와 내부 배열 객체가 할당되어 대규모 디렉토리를 순회할 때 가비지 컬렉션(GC) 부하를 유발합니다. 배열 복제가 필요한 경우 `.clone()`을 사용하면 하나의 배열 객체만 새로 할당되므로 더 효율적입니다.
**조치:** 디렉토리 파일 배열을 정렬하기 전에 복사할 때 `.toMutableList()` 대신 `.clone()`을 사용하여 불필요한 중간 컬렉션 할당을 제거하고 성능을 향상시켰습니다.
## 2026-09-25 - 문자열 변환 지연 할당을 통한 GC 오버헤드 감소
**Learning:** 디렉토리 순회 중 파일 필터링 시 모든 파일 이름에 대해 무조건 `toLowerCase()`를 호출하면 불필요한 중간 문자열이 생성되어 가비지 컬렉션(GC) 부하가 발생합니다. `isHiddenFile()`이나 `endsWith("~")`와 같은 저렴한 검사를 먼저 수행하면 많은 파일에서 문자열 할당을 생략할 수 있습니다.
**Action:** 핫 패스(hot path)에서 문자열 할당(예: `toLowerCase()`)을 수행하기 전에, 변환이 필요 없는 저렴한 메모리 내 검사(예: 접두사/접미사 확인)를 먼저 배치하여 단축(short-circuit) 평가를 활용합니다.
## 2026-09-26 - 인프라 문제 시 우회 전략 학습
**Learning:** CI가 인프라 이슈(예: Noema HTTP 429)로 실패했을 경우, 코드베이스의 문제를 찾으려 하지 말고 재시도를 위한 명확한 조치를 고려하거나, 필요한 경우 submit 도구를 단순 재호출하여 일시적인 장애를 돌파해야 합니다.
**Action:** API provider의 일시적 장애가 원인임을 로그에서 확인하면, 코드를 변경하지 않고 우회하거나 submit을 재시도합니다.
## 2026-09-26 - 인프라 문제 시 우회 전략 학습
**Learning:** CI가 인프라 이슈(예: opencode-review의 No APPROVED or CHANGES_REQUESTED 등)로 실패했을 경우, 코드베이스의 문제를 찾으려 하지 말고 재시도를 위한 명확한 조치를 고려하거나, 필요한 경우 submit 도구를 단순 재호출하여 일시적인 장애를 돌파해야 합니다.
**Action:** API provider의 일시적 장애가 원인임을 로그에서 확인하면, 코드를 변경하지 않고 우회하거나 submit을 재시도합니다.
## 2026-09-26 - 임시 파일 처리 및 버전 관리 위생
**Learning:** PR 탐색 과정에서 생성된 백업 파일이나 임시 파일(, 등)은 코드베이스를 오염시키므로 PR 제출 전 반드시 삭제해야 하며, 동일한 실수를 방지하기 위해 에 해당 확장자를 추가하는 것이 중요합니다.
**Action:** 탐색 과정에서 파생된 백업 파일()을 찾아서 삭제하고, 에 해당 패턴을 추가하는 작업을 수행합니다.
## 2026-09-26 - 임시 파일 처리 및 버전 관리 위생
**Learning:** PR 탐색 과정에서 생성된 백업 파일이나 임시 파일(.orig, .rej 등)은 코드베이스를 오염시키므로 PR 제출 전 반드시 삭제해야 하며, 동일한 실수를 방지하기 위해 .gitignore에 해당 확장자를 추가하는 것이 중요합니다.
**Action:** 탐색 과정에서 파생된 백업 파일(.orig)을 찾아서 삭제하고, .gitignore에 해당 패턴을 추가하는 작업을 수행합니다.
## 2026-09-26 - 백업 파일 제외 정책 누락 방지
**Learning:** PR 검토 시 `.gitignore`에 의도적으로 추가했던 규칙(`*.orig` 등)이 리베이스나 다른 커밋 과정에서 누락되어 CI 정책 검사에서 실패할 수 있습니다.
**Action:** PR 리뷰 피드백을 통해 `.gitignore` 누락을 발견하면 즉시 해당 규칙을 다시 추가하고 전체 테스트 스위트를 재실행하여 커버리지와 안정성을 검증합니다.
## 2026-09-26 - .gitignore 중복 관리
**Learning:** 여러 번의 커밋 시도를 통해 `.gitignore` 등에 항목(`*.orig`)이 중복해서 들어갈 수 있으며, 이는 리뷰 과정에서 문제를 일으킵니다.
**Action:** 설정 파일을 수정할 때는 중복을 방지하기 위해 내용 확인을 먼저 수행하거나 고유성을 보장하도록 정제(deduplication)하고 코멘트를 남깁니다.
## 2026-09-26 - PR 상태 검토 및 대기 전략
**Learning:** 코드 수정 후 리뷰 피드백에서 상태가 보존되었음을 명시하고 큐(queue) 대기 상황을 알려줄 경우, 추가적인 코드 수정 없이 진행 상황을 모니터링하며 응답하는 것이 중요합니다.
**Action:** 추가 수정이 필요 없는 상태 업데이트 코멘트에 대해서는 코드가 보존되었음을 확인하고 완료 대기 중임을 답변합니다.
19 changes: 10 additions & 9 deletions src/main/kotlin/html4tree/main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -351,16 +351,17 @@ fun process_ignore_file(curr_dir: File, dirFilesNames: Array<String>? = null): S

// 보안 향상: dot-like prefixes and case variants of known sensitive names are excluded.
(dirFilesNames ?: curr_dir.list())?.forEach {
val normalizedName = it.toLowerCase(java.util.Locale.ROOT)
if (
it.isHiddenFile() ||
normalizedName in Constants.defaultSensitiveFileNamesLowercase ||
normalizedName.endsWith("~") ||
Constants.defaultSensitiveExtensions.any { extension ->
normalizedName.endsWith(extension)
}
) {
if (it.isHiddenFile() || it.endsWith("~")) {
files_to_exclude.add(it)
} else {
// ⚡ Bolt Performance Optimization: 저렴한 검사 통과 후 문자열을 변환하여 불필요한 GC 오버헤드 감소
val normalizedName = it.toLowerCase(java.util.Locale.ROOT)
if (
normalizedName in Constants.defaultSensitiveFileNamesLowercase ||
Constants.defaultSensitiveExtensions.any { extension -> normalizedName.endsWith(extension) }
) {
files_to_exclude.add(it)
}
}
}

Expand Down