diff --git a/IMPACT.md b/IMPACT.md index 4c8ebe5..7a28250 100644 --- a/IMPACT.md +++ b/IMPACT.md @@ -11,7 +11,7 @@ fixearly가 **실제 오픈소스에서 찾아낸 이슈**와 그 결과. 점수 | 발견 | repo | 유형 | PR | 상태 | 점수 | |------|------|------|----|------|------| -| `deleteBulkMetadata N+1` | [immich · 115.9k★](https://github.com/immich-app/immich) | N+1 (루프 안 순차 DELETE, item당 왕복 1회) | [#30163](https://github.com/immich-app/immich/pull/30163) | ❌ closed | — | +| `deleteBulkMetadata N+1` | [immich · 116k★](https://github.com/immich-app/immich) | N+1 (루프 안 순차 DELETE, item당 왕복 1회) | [#30163](https://github.com/immich-app/immich/pull/30163) | ❌ closed | — | | `sync-agent findOne N+1` | [novu · 40.1k★](https://github.com/novuhq/novu) | N+1 (for 루프 안 findOne, 소스 통합당 쿼리 1회) | [#12074](https://github.com/novuhq/novu/pull/12074) | ❌ closed | — | | `booking member diff O(n²)` | [cal.com · 48.9k★](https://github.com/calcom/cal.diy) | O(n²) 배열 조회 (루프 안 .some() 선형스캔 4회 → Set) | [#29828](https://github.com/calcom/cal.diy/pull/29828) | ❌ closed | — | | `view-widget-upsert O(n²)` | [twenty · 58.2k★](https://github.com/twentyhq/twenty) | O(n²) 배열 조회 (4개 루프서 .find() 키조회 → Map) | [#23231](https://github.com/twentyhq/twenty/pull/23231) | ❌ closed | — | @@ -36,7 +36,7 @@ fixearly가 **실제 오픈소스에서 찾아낸 이슈**와 그 결과. 점수 | `resize 핸들러 안 미사용 Map` | [excalidraw · 133.6k★](https://github.com/excalidraw/excalidraw) | 쓰기만 하는 컬렉션 (포인터 이동마다 채우고 아무도 안 읽음 — 삭제) | [#11805](https://github.com/excalidraw/excalidraw/pull/11805) | ❌ closed | — | | `member 통계 안 미사용 Map` | [ghost · 55.5k★](https://github.com/TryGhost/Ghost) | 쓰기만 하는 컬렉션 (날짜별 Map 을 채우고 아무도 안 읽음 — 삭제) | [#29831](https://github.com/TryGhost/Ghost/pull/29831) | ✅ merged | +1 | | `invalidate() 안 미사용 Set` | [storybook · 91.2k★](https://github.com/storybookjs/storybook) | 쓰기만 하는 컬렉션 (파일 변경마다 채우고 아무도 안 읽음 — 소비자는 2022-11 에 이미 삭제됨) | [#35829](https://github.com/storybookjs/storybook/pull/35829) | ❌ closed | — | -| `스택 트레이스 절반 유실` | [astro · 63.1k★](https://github.com/withastro/astro) | 전역 정규식 상태 (/g 정규식을 filter 안에서 .test() — lastIndex 가 새어 프레임이 하나 걸러 사라진다) | [#17665](https://github.com/withastro/astro/pull/17665) | ❌ closed | — | +| `스택 트레이스 절반 유실` | [astro · 63.2k★](https://github.com/withastro/astro) | 전역 정규식 상태 (/g 정규식을 filter 안에서 .test() — lastIndex 가 새어 프레임이 하나 걸러 사라진다) | [#17665](https://github.com/withastro/astro/pull/17665) | ❌ closed | — | | `graph 명령 안 미사용 Map` | [nx · 29.4k★](https://github.com/nrwl/nx) | 쓰기만 하는 컬렉션 (선언과 .clear() 만 남았다 — 읽기·쓰기는 #32418 에서 사라졌다) | [#36633](https://github.com/nrwl/nx/pull/36633) | ❌ closed | — | | `페이지 monitor 검증 뒤 중복 조회` | [openstatus · 9.2k★](https://github.com/openstatusHQ/openstatus) | N+1 (페이지 생성·수정에서 일괄 검증한 monitor를 루프마다 재조회 — Map 재사용) | [#2583](https://github.com/openstatusHQ/openstatus/pull/2583) | ✅ merged | +1 | | `Hono 보안 패치 · 의존성 점검` | [openstatus · 9.2k★](https://github.com/openstatusHQ/openstatus) | 보안 점검 (취약 Hono 직접·전이 의존성 업데이트) | [#2620](https://github.com/openstatusHQ/openstatus/pull/2620) | ❌ closed | — | @@ -50,13 +50,13 @@ fixearly가 **실제 오픈소스에서 찾아낸 이슈**와 그 결과. 점수 | `툴 피커 안 미사용 Map` | [vscode · 193.5k★](https://github.com/microsoft/vscode) | 쓰기만 하는 컬렉션 (MCP 툴마다 .set(), 읽기 없음 — #249448 이후 15개월째 · 삭제) | [#334230](https://github.com/microsoft/vscode/pull/334230) | ❌ closed | — | | `no-duplicate-case 이전 case 재스캔` | [eslint · 27.6k★](https://github.com/eslint/eslint) | O(n²) (case 마다 이전 case 전량 비교, 비교마다 토큰 전수 — 토큰 키 Set 으로 O(n)) | [#21317](https://github.com/eslint/eslint/pull/21317) | ❌ closed | — | | `템플릿 파이프라인의 쓰기만 하는 컬렉션` | [angular · 101k★](https://github.com/angular/angular) | 쓰기만 하는 컬렉션 (allocateSlots 의 slotMap, generateTemporaries 의 released — 채우기만 하고 읽지 않음, slotMap 은 주석이 '다음 순회에서 쓴다'고 잘못 설명) | [#70690](https://github.com/angular/angular/pull/70690) | ✅ merged | +1 | -| `빌드에서 쓰기만 하는 페이지 입력 집합` | [astro · 63.1k★](https://github.com/withastro/astro) | 쓰기만 하는 컬렉션 (viteBuild 가 pageInput 을 채우기만 하고 읽지 않는다 — 소비자 ssrBuild 인자가 #14306 Environment API 에서 사라졌다) | [#17987](https://github.com/withastro/astro/pull/17987) | ✅ merged | +1 | +| `빌드에서 쓰기만 하는 페이지 입력 집합` | [astro · 63.2k★](https://github.com/withastro/astro) | 쓰기만 하는 컬렉션 (viteBuild 가 pageInput 을 채우기만 하고 읽지 않는다 — 소비자 ssrBuild 인자가 #14306 Environment API 에서 사라졌다) | [#17987](https://github.com/withastro/astro/pull/17987) | ✅ merged | +1 | | `signal 입력 마이그레이션의 쓰기만 하는 Set` | [angular · 101k★](https://github.com/angular/angular) | 쓰기만 하는 컬렉션 (filterInputsViaConfig 의 skippedInputs 는 추가만 하고 읽지 않음 — 기존 markFieldIncompatible 는 그대로 유지) | [#70977](https://github.com/angular/angular/pull/70977) | ✅ merged | +1 | | `::ng-deep 감지 정규식 lastIndex 누수` | [angular · 101k★](https://github.com/angular/angular) | 전역 정규식 상태 (/g 정규식을 .test() 해 lastIndex 가 다음 규칙·스타일시트로 새어 ::ng-deep 를 놓침 → 비전역 사본) | [#71119](https://github.com/angular/angular/pull/71119) | ✅ merged | +1 | | `React 컴파일러 패스의 쓰기만 하는 컬렉션` | [react · 250.8k★](https://github.com/facebook/react) | 쓰기만 하는 컬렉션 (propagateNonNull 의 terminalPreds Set · alignReactiveScopesToBlockScopesHIR 의 placeScopes Map — 기록만 하고 읽지 않음) | [#37698](https://github.com/react/react/pull/37698) | ❌ closed | — | | `React 컴파일러 패스의 쓰기만 하는 컬렉션` | [react · 250.8k★](https://github.com/facebook/react) | 쓰기만 하는 컬렉션 (propagateNonNull 의 terminalPreds Set · alignReactiveScopesToBlockScopesHIR 의 placeScopes Map — 기록만 하고 읽지 않음) | [#37699](https://github.com/react/react/pull/37699) | ✅ merged | +1 | | `댓글 신고 이메일의 조회 3회 직렬` | [ghost · 55.5k★](https://github.com/TryGhost/Ghost) | 독립 순차 await (신고 API 가 기다리는 post·member·owner 조회 3개를 병렬 시작) | [#31019](https://github.com/TryGhost/Ghost/pull/31019) | ✅ merged | +1 | -| `sitemap 청크 URL 분류 O(n²)` | [astro · 63.1k★](https://github.com/withastro/astro) | O(n²) (청크별 배열 복사와 URL 포함 검사 → Set) | [#18149](https://github.com/withastro/astro/pull/18149) | ⚪ awaiting review | — | +| `sitemap 청크 URL 분류 O(n²)` | [astro · 63.2k★](https://github.com/withastro/astro) | O(n²) (청크별 배열 복사와 URL 포함 검사 → Set) | [#18149](https://github.com/withastro/astro/pull/18149) | ⚪ awaiting review | — | | `Vite 입력 CSS 의존성 기록 경합` | [tailwindcss · 97.8k★](https://github.com/tailwindlabs/tailwindcss) | 버려진 Promise (입력 CSS 파일 시각 기록을 기다리지 않아 재빌드 누락) | [#20525](https://github.com/tailwindlabs/tailwindcss/pull/20525) | ⚪ awaiting review | — | | `ES 청크 재내보내기 이름 반복 검색` | [rollup · 26.3k★](https://github.com/rollup/rollup) | O(n²) 배열 조회 (재내보내기마다 렌더된 export 배열 탐색 → Set) | [#6534](https://github.com/rollup/rollup/pull/6534) | ✅ merged | +1 | | `알림 목록의 모니터 관계 반복 검색` | [openstatus · 9.2k★](https://github.com/openstatusHQ/openstatus) | O(n²) 배열 조회 (알림마다 전체 모니터 관계 재검색 → Map 그룹화) | [#2780](https://github.com/openstatusHQ/openstatus/pull/2780) | ❌ closed | — | @@ -66,7 +66,7 @@ fixearly가 **실제 오픈소스에서 찾아낸 이슈**와 그 결과. 점수 | `M:N 소유 측 populate 가 부모마다 자식 전체를 다시 훑고 indexOf 로 정렬` | [mikro-orm · 9.2k★](https://github.com/mikro-orm/mikro-orm) | O(n²) 배열 조회 (부모 × 자식 filter + indexOf 정렬 — 자식 위치를 Map 으로 한 번 색인) | [#8392](https://github.com/mikro-orm/mikro-orm/pull/8392) | ✅ merged | +1 | | `upsertMany 재조회 행을 엔티티마다 전부 비교` | [mikro-orm · 9.2k★](https://github.com/mikro-orm/mikro-orm) | O(n²) 배열 조회 (배치 × 재조회 행 comparator.matching — 엄격 비교 키 값으로 행을 한 번 묶어 같은 묶음만 비교) | [#8393](https://github.com/mikro-orm/mikro-orm/pull/8393) | ✅ merged | +1 | | `표현식 unique·차집합이 원시값 배열도 깊은 비교로 이중 순회` | [n8n · 206.9k★](https://github.com/n8n-io/n8n) | O(n²) 배열 조회 (lodash isEqual 쌍 비교 — 원시값만 있으면 Set 이 같은 답을 낸다) | [#40311](https://github.com/n8n-io/n8n/pull/40311) | ⚪ awaiting review | — | -| `채우기만 하고 읽지 않는 Map` | [Babylon.js · 26.1k★](https://github.com/BabylonJS/Babylon.js) | 쓰기만 하는 컬렉션 (set 만 하고 읽는 곳 0 — DFS 는 연결점의 소유 블록을 직접 따라간다) | [#18980](https://github.com/BabylonJS/Babylon.js/pull/18980) | ✅ merged | +1 | +| `채우기만 하고 읽지 않는 Map` | [Babylon.js · 26.2k★](https://github.com/BabylonJS/Babylon.js) | 쓰기만 하는 컬렉션 (set 만 하고 읽는 곳 0 — DFS 는 연결점의 소유 블록을 직접 따라간다) | [#18980](https://github.com/BabylonJS/Babylon.js/pull/18980) | ✅ merged | +1 | | `채우기만 하고 읽지 않는 Map 3개` | [cherry-studio · 52.5k★](https://github.com/CherryHQ/cherry-studio) | 쓰기만 하는 컬렉션 (set 만 하고 읽는 곳 0 — 생긴 뒤 한 번도 읽힌 적 없다) | [#21363](https://github.com/CherryHQ/cherry-studio/pull/21363) | ✅ merged | +1 | | `검증 에러가 dev 서버를 죽임` | [react-router · 56.6k★](https://github.com/remix-run/react-router) | 버려진 Promise (throw 하는 async 검증을 await 없이 불러 unhandled rejection 으로 프로세스 종료) | [#15591](https://github.com/remix-run/react-router/pull/15591) | ⚪ awaiting review | — | | `리팩터 뒤 남은 조상 Set` | [pdf.js · 54k★](https://github.com/mozilla/pdf.js) | 쓰기만 하는 컬렉션 (2021 usehref 리팩터로 소비자 둘이 ancestors 로 바뀐 뒤 남은 Set) | [#22102](https://github.com/mozilla/pdf.js/pull/22102) | ⚪ awaiting review | — | @@ -77,13 +77,13 @@ fixearly가 **실제 오픈소스에서 찾아낸 이슈**와 그 결과. 점수 | `실패 테스트 재실행이 추출 테스트마다 전부 다시 직렬화` | [promptfoo · 25.9k★](https://github.com/promptfoo/promptfoo) | O(n²) 배열 조회 (extractedTests.some(JSON.stringify(...)) — 미매칭 결과 5,000건에서 4.2초 → 21ms) | [#11464](https://github.com/promptfoo/promptfoo/pull/11464) | ✅ merged | +1 | | `모델 변경 후 QA 재학습이 옛 모델로 돈다` | [FastGPT · 29.8k★](https://github.com/labring/FastGPT) | 버려진 Promise (updateTraining 을 await 없이 트랜잭션 커밋 전에 호출 — 워커가 옛 에이전트 모델로 작업을 집고 실패는 사라진다) | [#7918](https://github.com/labring/FastGPT/pull/7918) | ❌ closed | — | | `SCAM 변환이 spec 의 declarations 를 못 지운다` | [nx · 29.4k★](https://github.com/nrwl/nx) | 버린 반환값 (spec.replace(/declarations: \[.+/, '') 결과를 대입 안 함 — standalone 컴포넌트가 declarations 에 남아 테스트가 깨진다) | [#37332](https://github.com/nrwl/nx/pull/37332) | ⚪ awaiting review | — | -| `설정 검색이 중첩 속성을 못 찾는다` | [jupyterlab · 15.3k★](https://github.com/jupyterlab/jupyterlab) | 버린 반환값 (acc.concat(재귀 결과) 를 대입 안 함 — 객체 설정 안의 속성 이름·제목이 검색에서 빠진다) | [#20008](https://github.com/jupyterlab/jupyterlab/pull/20008) | ✅ merged | +1 | +| `설정 검색이 중첩 속성을 못 찾는다` | [jupyterlab · 15.4k★](https://github.com/jupyterlab/jupyterlab) | 버린 반환값 (acc.concat(재귀 결과) 를 대입 안 함 — 객체 설정 안의 속성 이름·제목이 검색에서 빠진다) | [#20008](https://github.com/jupyterlab/jupyterlab/pull/20008) | ✅ merged | +1 | | `clang-query 도구 옵션이 compile_flags.txt 에 안 들어간다` | [compiler-explorer · 19.1k★](https://github.com/compiler-explorer/compiler-explorer) | 버린 반환값 (compileFlags.concat(this.tool.options) 결과를 대입 안 함 — TS 전환 때 push 가 concat 으로 바뀐 회귀) | [#9241](https://github.com/compiler-explorer/compiler-explorer/pull/9241) | ⚪ awaiting review | — | | `RAG 색인 상태 Map 쓰기만 함` | [readest · 25k★](https://github.com/readest/readest) | 쓰기만 하는 컬렉션 (ragService 의 indexingStates Map · IndexingState 객체 — 기록만 하고 읽지 않음) | [#6687](https://github.com/readest/readest/pull/6687) | ✅ merged | +1 | | `PKI 동기화 3곳의 외부 ID Map 쓰기만 함` | [infisical · 29.7k★](https://github.com/Infisical/infisical) | 쓰기만 하는 컬렉션 (ACM·Secrets Manager·Azure Key Vault 동기화의 syncRecordsByExternalId — 채우기만 하고 읽지 않음, Chef 만 씀) | [#8536](https://github.com/Infisical/infisical/pull/8536) | ⚪ awaiting review | — | | `채우기만 하고 읽지 않는 Map 3개` | [super-productivity · 22.7k★](https://github.com/super-productivity/super-productivity) | 쓰기만 하는 컬렉션 (op-log 검증 projectTaskMap · sync-md mdById · doc-mode lastWrittenTitles — 주석은 echo 판별용이라는데 읽는 곳 0) | [#10607](https://github.com/super-productivity/super-productivity/pull/10607) | ✅ merged | +1 | | `보내는 쪽이 사라진 구독 스트림` | [cline · 70.1k★](https://github.com/cline/cline) | 쓰기만 하는 컬렉션 (activeRelinquishControlSubscriptions — 유일한 송신 함수가 지워져 add/delete 만 남음 · 웹뷰 콜백도 못 울림) | [#14974](https://github.com/cline/cline/pull/14974) | ✅ merged | +1 | -| `인스펙터 v2 애니메이션 창이 자식 애니메이션을 버림` | [Babylon.js · 26.1k★](https://github.com/BabylonJS/Babylon.js) | 버린 반환값 (animations.concat(자식 애니메이션) 를 대입 안 함 — 자식에만 애니메이션이 있으면 'No Animations') | [#18990](https://github.com/BabylonJS/Babylon.js/pull/18990) | 🟠 changes requested | — | +| `인스펙터 v2 애니메이션 창이 자식 애니메이션을 버림` | [Babylon.js · 26.2k★](https://github.com/BabylonJS/Babylon.js) | 버린 반환값 (animations.concat(자식 애니메이션) 를 대입 안 함 — 자식에만 애니메이션이 있으면 'No Animations') | [#18990](https://github.com/BabylonJS/Babylon.js/pull/18990) | 🔵 approved · 머지 대기 | — | | `output 마이그레이션 ID 의 .d.ts 정규화 결과를 버림` | [angular · 101k★](https://github.com/angular/angular) | 버린 반환값 (id.replace(/\.d\.ts$/, '.ts') 결과 미대입 — 형제 마이그레이션 둘은 대입) | [#71267](https://github.com/angular/angular/pull/71267) | 🔵 approved · 머지 대기 | — | | `댓글 스레드 그래프의 깊이 Map 쓰기만 함` | [ghost · 55.5k★](https://github.com/TryGhost/Ghost) | 쓰기만 하는 컬렉션 (buildThreadGraph 의 depthById — 깊이는 reply.depth 로 이미 읽힌다) | [#31677](https://github.com/TryGhost/Ghost/pull/31677) | ⚪ awaiting review | — | | `ER 다이어그램·dagre 그래프의 쓰기만 하는 Map` | [mermaid · 90.6k★](https://github.com/mermaid-js/mermaid) | 쓰기만 하는 컬렉션 (ErDB.getData 의 subGraphDB — flowDb 에서 복사, parentDB 만 읽힘 · mermaid-graphlib 의 parents — set·clear 만) | [#8413](https://github.com/mermaid-js/mermaid/pull/8413) | ⚪ awaiting review | — | @@ -95,6 +95,7 @@ fixearly가 **실제 오픈소스에서 찾아낸 이슈**와 그 결과. 점수 | `jdbc: 접두사를 떼는 줄이 아무것도 안 함` | [nocodb · 65.2k★](https://github.com/nocodb/nocodb) | 버린 반환값 (jdbcToXcConfig·jdbcToXcUrl 의 url.replace(/^jdbc:/, '') — jdbc:mysql://… 가 driver jdbc·host mysql 로 파싱됨) | [#14812](https://github.com/nocodb/nocodb/pull/14812) | ⚪ awaiting review | — | | `모델 정보 창의 Base Model 행이 파일이 없으면 사라짐` | [rgthree-comfy · 3.6k★](https://github.com/rgthree/rgthree-comfy) | 같은 식 두 번 비교 (dialog_info 의 !info.baseModelFile && !info.baseModelFile — baseModel 이었어야) | [#790](https://github.com/rgthree/rgthree-comfy/pull/790) | ⚪ awaiting review | — | | `Route53 기존 레코드를 못 찾고 매번 CREATE 를 보냄` | [serverless · 46.9k★](https://github.com/serverless/serverless) | return 없는 콜백 (createRecordIfNotExists 의 ResourceRecordSets.find — 블록 본문이 값을 안 돌려줘 existingRecord 가 늘 undefined) | [#13947](https://github.com/serverless/serverless/pull/13947) | ⚪ awaiting review | — | +| `벤치마크가 잘못된 type 을 받아도 실패하지 않고 엉뚱한 값을 잼` | [Node.js · 122.3k★](https://github.com/nodejs/node) | 버린 반환값 (fs·webstorage 벤치마크 21곳 default 분기의 new Error('Invalid type') — throw 가 빠져 아무 일도 안 함) | [#66647](https://github.com/nodejs/node/pull/66647) | ⚪ awaiting review | — | ## 규칙 diff --git a/PR-QUEUE.md b/PR-QUEUE.md index b793076..8294ac9 100644 --- a/PR-QUEUE.md +++ b/PR-QUEUE.md @@ -53,6 +53,7 @@ | [angular#70690](https://github.com/angular/angular/pull/70690) | 머지 | — | | [angular#70977](https://github.com/angular/angular/pull/70977) | 머지 | — | | [angular#71119](https://github.com/angular/angular/pull/71119) | 머지 | — | +| [Babylon.js#18990](https://github.com/BabylonJS/Babylon.js/pull/18990) | 승인 | — | | [angular#71267](https://github.com/angular/angular/pull/71267) | 승인 | — | | [openstatus#2620](https://github.com/openstatusHQ/openstatus/pull/2620) | 닫힘 | 상위 #2751 의존성 업데이트로 Hono 4.13.8·node-server 2.1.1이 반영돼 보안 목표가 충족됐다. 이 PR은 미병합 | | [openstatus#2780](https://github.com/openstatusHQ/openstatus/pull/2780) | 닫힘 | 메인테이너가 V1 API 폐기 예정이라고 밝혀 우리가 닫았다 | @@ -348,30 +349,31 @@ CLA 는 봇 댓글(`@microsoft-github-policy-service agree`)뿐 · 이슈 없는 | PR | 축 | 상태 | 경과 / 외부 머지 중앙값 | |---|---|---|---| -| [angular#71267](https://github.com/angular/angular/pull/71267) | 버린 반환값 | 🔵 승인 · 머지 대기 | 오늘 / 보통 2일 | -| [Babylon.js#18990](https://github.com/BabylonJS/Babylon.js/pull/18990) | 버린 반환값 | 🟠 변경 요청 | 오늘 / 보통 1일 | -| [vscode#340771](https://github.com/microsoft/vscode/pull/340771) | return 없는 콜백 | 🟢 리뷰 진행 | 오늘 / 보통 1일 | +| [Babylon.js#18990](https://github.com/BabylonJS/Babylon.js/pull/18990) | 버린 반환값 | 🔵 승인 · 머지 대기 | 1일째 / 보통 1일 | +| [angular#71267](https://github.com/angular/angular/pull/71267) | 버린 반환값 | 🔵 승인 · 머지 대기 | 1일째 / 보통 2일 | +| [vscode#340771](https://github.com/microsoft/vscode/pull/340771) | return 없는 콜백 | 🟢 리뷰 진행 | 1일째 / 보통 1일 | | [infisical#8536](https://github.com/Infisical/infisical/pull/8536) | 쓰기만 하는 컬렉션 | ⚪ 대기 | 1일째 / 보통 1일 | -| [insomnia#10575](https://github.com/Kong/insomnia/pull/10575) | forEach 안 await | ⚪ 대기 | 2일째 / 보통 2일 | +| [insomnia#10575](https://github.com/Kong/insomnia/pull/10575) | forEach 안 await | ⚪ 대기 | 3일째 / 보통 2일 | | [Trilium#11949](https://github.com/TriliumNext/Trilium/pull/11949) | 버려진 Promise | ⚪ 대기 | 2일째 / 보통 1일 | -| [ghost#31677](https://github.com/TryGhost/Ghost/pull/31677) | 쓰기만 하는 컬렉션 | ⚪ 대기 | 오늘 / 보통 1일 | -| [compiler-explorer#9241](https://github.com/compiler-explorer/compiler-explorer/pull/9241) | 버린 반환값 | ⚪ 대기 | 1일째 / 보통 1일 | -| [cytoscape.js#3527](https://github.com/cytoscape/cytoscape.js/pull/3527) | O(n²) | ⚪ 대기 | 2일째 / 보통 6일 | -| [mermaid#8413](https://github.com/mermaid-js/mermaid/pull/8413) | 쓰기만 하는 컬렉션 | ⚪ 대기 | 오늘 / 보통 6일 | -| [pdf.js#22102](https://github.com/mozilla/pdf.js/pull/22102) | 쓰기만 하는 컬렉션 | ⚪ 대기 | 2일째 / 보통 1일 | -| [n8n#40311](https://github.com/n8n-io/n8n/pull/40311) | O(n²) | ⚪ 대기 | 4일째 / 보통 1일 | -| [nocodb#14812](https://github.com/nocodb/nocodb/pull/14812) | 버린 반환값 | ⚪ 대기 | 오늘 | +| [ghost#31677](https://github.com/TryGhost/Ghost/pull/31677) | 쓰기만 하는 컬렉션 | ⚪ 대기 | 1일째 / 보통 1일 | +| [compiler-explorer#9241](https://github.com/compiler-explorer/compiler-explorer/pull/9241) | 버린 반환값 | ⚪ 대기 | 2일째 / 보통 1일 | +| [cytoscape.js#3527](https://github.com/cytoscape/cytoscape.js/pull/3527) | O(n²) | ⚪ 대기 | 3일째 / 보통 6일 | +| [mermaid#8413](https://github.com/mermaid-js/mermaid/pull/8413) | 쓰기만 하는 컬렉션 | ⚪ 대기 | 1일째 / 보통 6일 | +| [pdf.js#22102](https://github.com/mozilla/pdf.js/pull/22102) | 쓰기만 하는 컬렉션 | ⚪ 대기 | 3일째 / 보통 1일 | +| [n8n#40311](https://github.com/n8n-io/n8n/pull/40311) | O(n²) | ⚪ 대기 | 5일째 / 보통 1일 | +| [nocodb#14812](https://github.com/nocodb/nocodb/pull/14812) | 버린 반환값 | ⚪ 대기 | 1일째 | +| [Node.js#66647](https://github.com/nodejs/node/pull/66647) | 버린 반환값 | ⚪ 대기 | 오늘 / 보통 2일 | | [nx#37332](https://github.com/nrwl/nx/pull/37332) | 버린 반환값 | ⚪ 대기 | 2일째 / 보통 1일 | -| [opensumi#4776](https://github.com/opensumi/core/pull/4776) | 버린 반환값 | ⚪ 대기 | 오늘 / 보통 4일 | -| [react-router#15591](https://github.com/remix-run/react-router/pull/15591) | 버려진 Promise | ⚪ 대기 | 2일째 / 보통 4일 | +| [opensumi#4776](https://github.com/opensumi/core/pull/4776) | 버린 반환값 | ⚪ 대기 | 1일째 / 보통 4일 | +| [react-router#15591](https://github.com/remix-run/react-router/pull/15591) | 버려진 Promise | ⚪ 대기 | 3일째 / 보통 4일 | | [rgthree-comfy#790](https://github.com/rgthree/rgthree-comfy/pull/790) | 같은 식 두 번 비교 | ⚪ 대기 | 오늘 / 보통 4일 | | [serverless#13947](https://github.com/serverless/serverless/pull/13947) | return 없는 콜백 | ⚪ 대기 | 오늘 / 보통 1일 | -| [strapi#27893](https://github.com/strapi/strapi/pull/27893) | 버려진 Promise | ⚪ 대기 | 8일째 / 보통 6일 | -| [tailwindcss#20525](https://github.com/tailwindlabs/tailwindcss/pull/20525) | 버려진 Promise | ⚪ 대기 | 12일째 / 보통 1일 · 보류 | -| [affine#15692](https://github.com/toeverything/AFFiNE/pull/15692) | 쓰기만 하는 컬렉션 | ⚪ 대기 | 오늘 / 보통 6일 | -| [astro#18149](https://github.com/withastro/astro/pull/18149) | O(n²) | ⚪ 대기 | 12일째 / 보통 1일 · 보류 | +| [strapi#27893](https://github.com/strapi/strapi/pull/27893) | 버려진 Promise | ⚪ 대기 | 9일째 / 보통 6일 | +| [tailwindcss#20525](https://github.com/tailwindlabs/tailwindcss/pull/20525) | 버려진 Promise | ⚪ 대기 | 13일째 / 보통 1일 · 보류 | +| [affine#15692](https://github.com/toeverything/AFFiNE/pull/15692) | 쓰기만 하는 컬렉션 | ⚪ 대기 | 1일째 / 보통 6일 | +| [astro#18149](https://github.com/withastro/astro/pull/18149) | O(n²) | ⚪ 대기 | 13일째 / 보통 1일 · 보류 | -**열린 것 22건(보류 2건 빼면 20건).** 판정 난 63건 중 머지 36 · 승인 1 · 닫힘 26. +**열린 것 23건(보류 2건 빼면 21건).** 판정 난 64건 중 머지 36 · 승인 2 · 닫힘 26. **2026-08-10 준비** — astro 후보를 손검증까지 끝내고 브랜치만 만들어 뒀다(하루 1건이라 @@ -798,81 +800,81 @@ changeset(`astro: patch`)을 같이 넣는다. 브랜치는 `fix/stack-trace-reg | 저장소 | 지나가는 기여자 수락률 | 전체 외부 | 중앙 | 지나가는 머지 | 판정 | 메모 | |---|---|---|---|---|---|---| -| Ghost | 100% | 95% | 0.0일 | 5/5 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 | -| orval | 100% | 96% | 0.1일 | 10/10 | **1차 통과** | 판정 경험 있음 | -| pnpm | 100% | 100% | 0.1일 | 6/6 | 표본 부족 | 판정 경험 있음 · AI 작성 PR 본문에 agent disclosure 필수 · 전체 저장소 대신 영향 패키지 테스트 실행 | -| mikro-orm | 100% | 100% | 0.2일 | 14/14 | **1차 통과** | 판정 경험 있음 | +| orval | 100% | 96% | 0.1일 | 9/9 | 표본 부족 | 판정 경험 있음 | +| mikro-orm | 100% | 94% | 0.2일 | 12/12 | **1차 통과** | 판정 경험 있음 | | novu | 100% | 94% | 0.2일 | 3/3 | 표본 부족 | 판정 경험 있음 | | mattermost | 100% | 98% | 0.7일 | 9/9 | 표본 부족 | — | | pdf.js | 100% | 85% | 0.7일 | 3/3 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 | | n8n | 100% | 90% | 1.0일 | 22/22 | **1차 통과** | 열린 PR 있음 — 저장소당 1건 | -| cherry-studio | 100% | 94% | 1.2일 | 11/11 | **1차 통과** | 판정 경험 있음 | | compromise | 100% | 90% | 1.5일 | 11/11 | **1차 통과** | — | | Babylon.js | 96% | 83% | 0.9일 | 23/24 | **1차 통과** | 열린 PR 있음 — 저장소당 1건 | | react-hook-form | 94% | 88% | 0.1일 | 16/17 | **1차 통과** | — | -| compiler-explorer | 92% | 94% | 0.6일 | 11/12 | **1차 통과** | 열린 PR 있음 — 저장소당 1건 | | storybook | 92% | 84% | 6.2일 | 11/12 | 1차 통과 · 후순위(느림) | 판정 경험 있음 · 게이트 0 — danger 가 `ci:*`·`qa:*` 라벨을 요구하는데 메인테이너만 붙일 수 있다 (#35829 가 25일째 빨간불이라 접었다) · CONTRIBUTING 'Never let an LLM speak for you': 사람 개입 없는 PR 은 3일 뒤 자동 닫힘 | -| insomnia | 89% | 98% | 1.7일 | 8/9 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 | +| super-productivity | 91% | 91% | 2.5일 | 10/11 | **1차 통과** | 판정 경험 있음 | +| cherry-studio | 90% | 88% | 0.9일 | 9/10 | **1차 통과** | 판정 경험 있음 | +| compiler-explorer | 89% | 92% | 0.7일 | 8/9 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 | | openstatus | 88% | 88% | 3.8일 | 7/8 | 표본 부족 | 판정 경험 있음 | -| rollup | 88% | 88% | 6.4일 | 14/16 | 1차 통과 · 후순위(느림) | 판정 경험 있음 · 코드 변경은 테스트 필수 · 내부 API 단위 테스트 대신 전체 산출물 테스트로 검증 · 첫 외부 기여자 CI 는 메인테이너 워크플로 승인 필요 · Vercel 배포도 Rollup 팀원 승인 필요 | +| rollup | 88% | 88% | 9.1일 | 15/17 | 1차 통과 · 후순위(느림) | 판정 경험 있음 · 코드 변경은 테스트 필수 · 내부 API 단위 테스트 대신 전체 산출물 테스트로 검증 · 첫 외부 기여자 CI 는 메인테이너 워크플로 승인 필요 · Vercel 배포도 Rollup 팀원 승인 필요 | +| promptfoo | 86% | 91% | 0.6일 | 12/14 | **1차 통과** | 판정 경험 있음 | | tegaki | 83% | 83% | 0.5일 | 10/12 | **1차 통과** | 판정 경험 있음 | -| infisical | 83% | 81% | 1.4일 | 5/6 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 | | cytoscape.js | 83% | 88% | 6.3일 | 10/12 | 1차 통과 · 후순위(느림) | 열린 PR 있음 — 저장소당 1건 | | babel | 82% | 70% | 0.8일 | 9/11 | **1차 통과** | 게이트 0 — AI_POLICY.md: LLM 이 쓴 PR 설명 금지(본인이 직접 써야 함), LLM 산문은 앞에 명시 표기. 어기면 조직 차단까지. 설명을 사람이 쓰지 않는 한 내지 않는다 | | readest | 82% | 85% | 0.9일 | 14/17 | **1차 통과** | 판정 경험 있음 | +| insomnia | 82% | 95% | 1.6일 | 9/11 | **1차 통과** | 열린 PR 있음 — 저장소당 1건 | | nx | 80% | 85% | 0.7일 | 4/5 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 · 열린 PR 있음 — 저장소당 1건 · PR 제목을 `scripts/validate-pr-title.js` 가 검증한다 · **포크 PR 의 워크플로는 메인테이너 승인이 있어야 돈다**(2026-09-12 확인: 네 워크플로 전부 `action_required`). 빨간불처럼 보여도 우리 코드가 깬 게 아니다 — 재푸시하면 승인만 다시 걸린다 | -| next.js | 80% | 73% | 1.1일 | 4/5 | 표본 부족 | 커밋 서명 필수 · 기여 가이드가 사소한 정리 PR 은 닫힐 가능성이 높다고 명시 · PR 템플릿: 외부 기여자 PR 설명은 사람이 직접 써야 함 | | Burn-My-Windows | 80% | 82% | 2.7일 | 8/10 | **1차 통과** | 판정 경험 있음 | -| grafana | 79% | 81% | 0.7일 | 27/34 | 컷 | 판정 경험 있음 · 게이트 0 — 2026-06-22 부터 모든 커밋 서명 필수, 미서명 PR 은 닫는다(CONTRIBUTING, 에이전트 작성 PR 포함). CLA assistant 서명도 필요 | | supabase | 79% | 64% | 0.9일 | 19/24 | 컷 | — | -| super-productivity | 79% | 82% | 2.3일 | 11/14 | 컷 | 판정 경험 있음 | | terser | 79% | 72% | 5.5일 | 26/33 | 컷 | — | | kiss-translator | 78% | 82% | 1.4일 | 14/18 | 컷 | — | | mongoose | 76% | 78% | 2.6일 | 16/21 | 컷 | 판정 경험 있음 | | postcss | 75% | 76% | 0.2일 | 27/36 | 컷 | — | +| grafana | 75% | 80% | 0.3일 | 24/32 | 컷 | 판정 경험 있음 · 게이트 0 — 2026-06-22 부터 모든 커밋 서명 필수, 미서명 PR 은 닫는다(CONTRIBUTING, 에이전트 작성 PR 포함). CLA assistant 서명도 필요 | | payload | 75% | 88% | 1.0일 | 6/8 | 표본 부족 | 판정 경험 있음 | | core | 75% | 71% | 3.9일 | 6/8 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 | | nest | 75% | 86% | 4.3일 | 9/12 | 컷 | — | -| promptfoo | 74% | 83% | 6.3일 | 14/19 | 컷 | 판정 경험 있음 | | TypeScript | 71% | 68% | 1.6일 | 5/7 | 표본 부족 | 게이트 0 — CONTRIBUTING '자율 코딩 에이전트 안내': **큐·대량 워크플로로 PR 을 열지 마라**(이슈·검색결과를 훑어 도는 방식). 어기면 계정 차단. 특정 사람이 그 건을 직접 고르고 리뷰까지 본인이 끌고 갈 때만 허용하고, 지시가 충돌하면 '운영자에게 이 문단을 보여주고 멈추라'고 적혀 있다. AI 보조 자체는 PR 본문에 밝히면 허용(밝히지 않으면 리뷰 없이 닫힘) · 자동 생성 댓글 금지 | -| cline | 69% | 72% | 0.5일 | 9/13 | 컷 | 판정 경험 있음 | +| cline | 69% | 72% | 0.4일 | 9/13 | 컷 | 판정 경험 있음 | | tabby | 69% | 78% | 8.1일 | 9/13 | 컷 | — | -| vscode | 67% | 95% | 0.1일 | 2/3 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 · CLA 는 봇 댓글로 서명(@microsoft-github-policy-service agree) · 이슈 연결 권장이지만 정리 PR 은 이슈 없이도 머지 사례(#334095) · 버그 PR 은 메인테이너가 이슈 먼저 요구할 수 있음 | | serverless | 67% | 92% | 0.1일 | 6/9 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 | -| immich | 67% | 57% | 0.3일 | 12/18 | 컷 | 판정 경험 있음 · 게이트 0 — `changelog:*` 라벨이 메인테이너 전용 | +| FastGPT | 67% | 65% | 3.7일 | 10/15 | 컷 | 판정 경험 있음 | | react-router | 63% | 73% | 4.0일 | 19/30 | 컷 | 열린 PR 있음 — 저장소당 1건 | -| twenty | 62% | 68% | 3.0일 | 10/16 | 컷 | 판정 경험 있음 | -| angular | 61% | 82% | 2.2일 | 11/18 | 컷 | 열린 PR 있음 — 저장소당 1건 · CLA 서명 필요 — 2026-09-11 yoominho91 서명 완료(cla/google 통과) | -| FastGPT | 60% | 62% | 2.8일 | 9/15 | 컷 | 판정 경험 있음 | +| infisical | 62% | 77% | 1.3일 | 5/8 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 | | svelte | 58% | 53% | 1.5일 | 15/26 | 컷 | — | -| marktext | 57% | 57% | 0.8일 | 8/14 | 컷 | — | +| eslint | 58% | 64% | 3.1일 | 18/31 | 컷 | 판정 경험 있음 · 게이트 0 — AI 보조 PR 은 **선행 이슈**가 있어야 받는다(eslint.org/docs/latest/contribute/ai-policy). PR 템플릿의 AI 체크박스를 정직하게 체크하면 이 정책이 적용된다 | +| marktext | 57% | 57% | 0.7일 | 8/14 | 컷 | — | | mermaid | 57% | 62% | 6.1일 | 12/21 | 컷 | 열린 PR 있음 — 저장소당 1건 | | berry | 57% | 57% | 11.6일 | 27/47 | 컷 | — | | v86 | 56% | 70% | 2.0일 | 14/25 | 컷 | — | -| eslint | 56% | 63% | 2.8일 | 18/32 | 컷 | 판정 경험 있음 · 게이트 0 — AI 보조 PR 은 **선행 이슈**가 있어야 받는다(eslint.org/docs/latest/contribute/ai-policy). PR 템플릿의 AI 체크박스를 정직하게 체크하면 이 정책이 적용된다 | +| angular | 56% | 80% | 2.2일 | 9/16 | 컷 | 열린 PR 있음 — 저장소당 1건 · CLA 서명 필요 — 2026-09-11 yoominho91 서명 완료(cla/google 통과) | +| immich | 55% | 48% | 0.3일 | 11/20 | 컷 | 판정 경험 있음 · 게이트 0 — `changelog:*` 라벨이 메인테이너 전용 | | tailwindcss | 55% | 65% | 0.5일 | 16/29 | 컷 | 열린 PR 있음 — 저장소당 1건 | | jupyterlab | 55% | 81% | 0.6일 | 6/11 | 컷 | 판정 경험 있음 | | jest | 54% | 54% | 7.1일 | 13/24 | 컷 | — | | cesium | 53% | 71% | 1.5일 | 8/15 | 컷 | — | | turborepo | 50% | 91% | 0.2일 | 5/10 | 컷 | 판정 경험 있음 | +| next.js | 50% | 67% | 1.1일 | 3/6 | 표본 부족 | 커밋 서명 필수 · 기여 가이드가 사소한 정리 PR 은 닫힐 가능성이 높다고 명시 · PR 템플릿: 외부 기여자 PR 설명은 사람이 직접 써야 함 | +| twenty | 50% | 30% | 1.3일 | 6/12 | 컷 | 판정 경험 있음 | | rgthree-comfy | 50% | 49% | 3.9일 | 15/30 | 컷 | 열린 PR 있음 — 저장소당 1건 | -| AFFiNE | 48% | 48% | 5.7일 | 11/23 | 컷 | 열린 PR 있음 — 저장소당 1건 | +| AFFiNE | 50% | 50% | 5.7일 | 11/22 | 컷 | 열린 PR 있음 — 저장소당 1건 | | typebot.io | 47% | 29% | 13.3일 | 7/15 | 컷 | 판정 경험 있음 | -| medusa | 46% | 41% | 5.2일 | 11/24 | 컷 | 판정 경험 있음 · 게이트 0 — CONTRIBUTING 'Issues before PRs': 작업 전에 이슈가 먼저 있어야 한다 · PR 대상 브랜치는 main 이 아니라 `develop` · 브랜치 이름 접두사가 PR 라벨을 정한다(CLAUDE.md) · PR 템플릿이 What/Why/How/Testing + 사용 예제를 요구한다 · AI 정책은 없다 | +| pnpm | 45% | 45% | 0.1일 | 9/20 | 컷 | 판정 경험 있음 · AI 작성 PR 본문에 agent disclosure 필수 · 전체 저장소 대신 영향 패키지 테스트 실행 | | parcel | 45% | 45% | 6.6일 | 9/20 | 컷 | — | -| outline | 43% | 43% | 7.0일 | 3/7 | 표본 부족 | 판정 경험 있음 · AI 정책 없음 · 수락률 38%(3/8)·중앙 5.9일 로 로테이션 컷 | | directus | 41% | 45% | 5.2일 | 12/29 | 컷 | 판정 경험 있음 | +| medusa | 41% | 41% | 5.2일 | 11/27 | 컷 | 판정 경험 있음 · 게이트 0 — CONTRIBUTING 'Issues before PRs': 작업 전에 이슈가 먼저 있어야 한다 · PR 대상 브랜치는 main 이 아니라 `develop` · 브랜치 이름 접두사가 PR 라벨을 정한다(CLAUDE.md) · PR 템플릿이 What/Why/How/Testing + 사용 예제를 요구한다 · AI 정책은 없다 | +| vscode | 40% | 86% | 0.1일 | 2/5 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 · CLA 는 봇 댓글로 서명(@microsoft-github-policy-service agree) · 이슈 연결 권장이지만 정리 PR 은 이슈 없이도 머지 사례(#334095) · 버그 PR 은 메인테이너가 이슈 먼저 요구할 수 있음 | | langfuse | 40% | 87% | 0.3일 | 2/5 | 표본 부족 | 판정 경험 있음 | | astro | 40% | 77% | 1.1일 | 2/5 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 · 사용자에게 보이는 변화면 changeset 필요 — 내부 전용 변경은 changeset 없이 머지된다(#17430 refactor·#16734 chore 가 changeset 0) · AI 정책 없음 · **포크 PR 워크플로가 승인 게이트가 아니다**(2026-09-13 #17987 제출 직후 CI 가 바로 돌았다 — angular·nx 와 다르다) · **`Test (Smoke)` 는 `smoke/docs` 의존성을 pkg.pr.new 커밋 핀에서 받는다** — 그 빌드가 만료되면 `ERR_PNPM_FETCH_404` 로 죽는다(2026-09-13 #17987 에서 밟음). PR 내용과 무관하다 | +| node | 38% | 46% | 2.0일 | 6/16 | 컷 | 열린 PR 있음 — 저장소당 1건 | +| outline | 38% | 38% | 7.0일 | 3/8 | 표본 부족 | 판정 경험 있음 · AI 정책 없음 · 수락률 38%(3/8)·중앙 5.9일 로 로테이션 컷 | +| prettier | 36% | 26% | 0.8일 | 5/14 | 컷 | — | +| vite | 35% | 35% | 3.4일 | 11/31 | 컷 | 판정 경험 있음 · 게이트 0 — CONTRIBUTING 'AI Policy': 댓글·이슈·PR 설명은 본인 말로 써야 함(LLM 이 대신 말하지 말 것). 어기면 바로 닫을 수 있음 | | strapi | 35% | 45% | 6.0일 | 7/20 | 컷 | 열린 PR 있음 — 저장소당 1건 | -| vite | 32% | 32% | 3.9일 | 10/31 | 컷 | 판정 경험 있음 · 게이트 0 — CONTRIBUTING 'AI Policy': 댓글·이슈·PR 설명은 본인 말로 써야 함(LLM 이 대신 말하지 말 것). 어기면 바로 닫을 수 있음 | -| typeorm | 32% | 42% | 17.3일 | 10/31 | 컷 | 판정 경험 있음 | -| prettier | 31% | 23% | 9.0일 | 4/13 | 컷 | — | | cli | 28% | 43% | 4.3일 | 7/25 | 컷 | — | | acorn | 26% | 53% | 0.8일 | 9/35 | 컷 | 게이트 0 — CONTRIBUTING: AI 언어모델이 (일부라도) 쓴 코드는 받지 않는다 | +| typeorm | 26% | 40% | 15.0일 | 7/27 | 컷 | 판정 경험 있음 | | budibase | 25% | 65% | 0.8일 | 2/8 | 표본 부족 | 판정 경험 있음 · 게이트 0 — 외부 PR 은 '작성자에게 배정된' 이슈를 참조해야 하는데 배정은 메인테이너만 한다 (#19555 가 이 봇 체크로 당일 닫혔다) | | vitest | 24% | 21% | 0.5일 | 5/21 | 컷 | 게이트 0 — CONTRIBUTING 'AI Contributions': 실제 사람이 공식 템플릿으로 열고 AI 도구를 밝혀야 함. 사람 개입 없는 PR 은 'maybe automated' 라벨 후 1일 뒤 자동 닫힘, 답글도 LLM 이 쓴 게 아니어야 함 | -| react | 20% | 14% | 4.4일 | 6/30 | 컷 | 판정 경험 있음 · 후보가 `/* DISABLED */` 주석 건이라 PR 보다 이슈가 맞다 | +| react | 20% | 13% | 4.4일 | 6/30 | 컷 | 판정 경험 있음 · 후보가 `/* DISABLED */` 주석 건이라 PR 보다 이슈가 맞다 | | core | 17% | 65% | 0.5일 | 1/6 | 표본 부족 | — | | cal.diy | 10% | 7% | 2.5일 | 4/42 | 컷 | 판정 경험 있음 · 게이트 0 — 외부 PR 에서 `required` 잡이 항상 실패 | | drizzle-orm | 10% | 8% | 5.7일 | 4/40 | 컷 | drizzle-kit 의 snapshotsDiffer 는 beta(v1 재작성)에서 사라졌다 — main 쪽 수정은 곧 버려질 코드 | @@ -880,6 +882,7 @@ changeset(`astro: patch`)을 같이 넣는다. 브랜치는 `fix/stack-trace-reg | excalidraw | 0% | 0% | 표본 없음 | 0/53 | 컷 | 판정 경험 있음 | | nocodb | 0% | 0% | 표본 없음 | 0/2 | 표본 부족 | 열린 PR 있음 — 저장소당 1건 | | Trilium | —% | 100% | 0.0일 | 0/0 | 표본 없음 | 열린 PR 있음 — 저장소당 1건 | +| Ghost | —% | 91% | 0.0일 | 0/0 | 표본 없음 | 열린 PR 있음 — 저장소당 1건 | | webpack | —% | —% | 표본 없음 | 0/0 | 표본 없음 | 게이트 0 — AGENTS.md 가 PR 본문 양식(Use of AI 섹션 필수, governance AI_POLICY: human-in-the-loop·질문에 답할 수 있어야 함)과 Co-authored-by 금지, 커밋 author 는 사람만을 REQUIRED 로 둔다 | diff --git a/data/repo-avatars.json b/data/repo-avatars.json index 634468d..3864509 100644 --- a/data/repo-avatars.json +++ b/data/repo-avatars.json @@ -54,5 +54,6 @@ "Schneegans/Burn-My-Windows": "data:image/png;base64,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", "gkurt/tegaki": "data:image/png;base64,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", "rgthree/rgthree-comfy": "data:image/png;base64,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", -"serverless/serverless": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAABOUlEQVR4nGJioDEYtWDUglEL6GABCy6J2aaGSUrycO7///81t+25/eWrACvrM38PdmZmZMWPv31T2LwLqznE+uDs+w+3v3xlYGDwkhRHMx0/wOmDPS9fffnzB87d/eIVhPHn//9Jt+6iKf7w6xfxVlIZ4PSBl6S4vgA/hH3u/YedYB/4Skno8PNhKv70+/fUO/dJsyBQRgoeyQknz0IY/Ya6ijzcmIoff/uGywLCkfz3//8dz18yMDDo8PNiNR0/YMQlIcDKysXCDLHg5Y+fDAwMnMxMgmxsuBwBUTMAAGccxCvI2YgKf/r9u/jCFQYGBmVurgotdVyK3/36VX7xKmkW2IgKJynJr338FMKNVZBDztho4PG3b7gsIBDJ2569hDAi5GXwqxwwMPSL61ELRi0YAhYAAgAA//9MC2WR1XAhXAAAAABJRU5ErkJggg==" +"serverless/serverless": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAABOUlEQVR4nGJioDEYtWDUglEL6GABCy6J2aaGSUrycO7///81t+25/eWrACvrM38PdmZmZMWPv31T2LwLqznE+uDs+w+3v3xlYGDwkhRHMx0/wOmDPS9fffnzB87d/eIVhPHn//9Jt+6iKf7w6xfxVlIZ4PSBl6S4vgA/hH3u/YedYB/4Skno8PNhKv70+/fUO/dJsyBQRgoeyQknz0IY/Ya6ijzcmIoff/uGywLCkfz3//8dz18yMDDo8PNiNR0/YMQlIcDKysXCDLHg5Y+fDAwMnMxMgmxsuBwBUTMAAGccxCvI2YgKf/r9u/jCFQYGBmVurgotdVyK3/36VX7xKmkW2IgKJynJr338FMKNVZBDztho4PG3b7gsIBDJ2569hDAi5GXwqxwwMPSL61ELRi0YAhYAAgAA//9MC2WR1XAhXAAAAABJRU5ErkJggg==", +"nodejs/node": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEgElEQVR4nLSXXUwcVRTHz70z+wFlWZBKkQZqgZS2PhCQ+kn1UQ2NUZ+0TUyq9c2QWGuML9a+1IRorDH1wcYXfdCgaSRpU2PS2Gh8ajQlAUFYQWBblo9dlv2euV/m3plZWHYXFxhPMnOG4d45v/s/Z87e0WAHpnmx9+gLB9/qO9c11Ni19/nUYvavbDQX3smz0HYntDza+GzvmcOfVdf5OzgDoJRDOsEgMrL89Z9DU+dyq8bS/wJwX1vgSO/rnYNNDzWcEByAMwESgHEBRoYDMQUIyhLTN+cuhm7MXmImN1wB8Ab0QO+rh853Ptc6AAI8KvAmAEYF5NJcjccaAiOZmxn7NjRw9/bitR0DYB1pR/pbT3ef7Ljgr/U2C+EELQaQnhgMiAmAsQUh/cpk/MfRocl34jPJ0W0BNHc1PPbkwNHL9S2BHiEESMn/C4AzDkZWWPAYAdYAEAZACOjsr/cuj34XOm8mydqWAIH91S2Pnzl8se1400kBgK3AFQJwAdTkQImtAkaANBsGA5hZEpkYnvkg9NP8l4IJWgTQ/Ur7m4+cPjSo6bhKBcsHrhyAU6GK0VIBANmpUDC2T0XSI79dGnkpEU5Py3GqD2h+bc8Tb3ffCtR7fA6QyJ/WvYTY8uDrHiFrfdIjZHl58tZ4mgjCwaU7K8MKVJ00XB2NmDolvFytVGzIimxDbVDR/juToqD59VpnPHYupIxLYXPXAGDnNa/GBmVk2jIpVjAWb5y2ukQhl2WuQAgVsXD16SRV1/nUFgDYN91SIV/ItgqUCDByxSnGhbMAkjGm8uSGybQ6NZDNsJJtBxdEty0ya1oS7haA2/2BcKDy9VTyowKQdQDsJMfq68mYOyowKX12k/TFNSBA6BxAHgqEw/Jdl1SwG1c5swCkIjpXEEJnAJoAYgiIL7mhArIEL7OW9RR4mH1wENzK08qCqX5q3YAAURpiHcBJAUeAhHVbVnEsQlwAsK0ERD4F+Row9IIB8WUKxNx9iy639cgXoaoBQwfEN7UGAbByz2UVigGs1xAlvSXnpOIMcmk3WjQqUkIBcCrSsOY1ndyXsqiLtWCmSdy5VvsBQQUhMT4XfDB4HOtadalJspP5qjDoHlTRfmDzPUf6xHzi59Bw6CzN0rU8gLRUODUS+X3hiqfWE9zTVNNj7WEKTXa0QL2mZNwugJkw56euTb0RGg696wQvAJDGTZ6LjkWvx6Ziw9X7qjr8QX9bwf9lj9IReP24YgBmsNTcL+EPx78ZP5WcS97ZvKgtvwsaH77/xbZn2j/xBXwH8sQ6wAMHfUrSUntCxsD2AhZHo99PXJ08m13OzZeLseW3YXohM7Fwe+ELgUUu0Bw4hjXsk6uT2LIeyimQiKT+GPlq/NT0jX8GaYYmtopR8aeZf6+vuf1Ex8cNnQ0vY4Rg3wEvSL9RASNFYuM/TL83c3P+iuDluv8OARyr76x7qq2//aPG9tpjdQ0e69OMCDJ9K/z52NW/L5hrZHW7z9y+YUD7+5pf6/+0L/T0+z3Xg601nTt91L8BAAD//+SmJxGCA1CJAAAAAElFTkSuQmCC" } \ No newline at end of file diff --git a/data/repo-contributors.json b/data/repo-contributors.json index 84989be..58bcc02 100644 --- a/data/repo-contributors.json +++ b/data/repo-contributors.json @@ -1,11 +1,11 @@ { - "generatedAt": "2026-10-10T08:41:24+00:00", + "generatedAt": "2026-10-10T18:28:58+00:00", "method": "GitHub REST contributors?per_page=1&anon=true; last-page count; commit authors, not unique humans", "repos": { "Automattic/mongoose": 1090, "BabylonJS/Babylon.js": 804, "Budibase/budibase": 148, - "CherryHQ/cherry-studio": 482, + "CherryHQ/cherry-studio": 483, "Infisical/infisical": 286, "Kong/insomnia": 366, "Schneegans/Burn-My-Windows": 124, @@ -18,14 +18,14 @@ "compiler-explorer/compiler-explorer": 702, "cytoscape/cytoscape.js": 170, "directus/directus": 589, - "eslint/eslint": 1253, + "eslint/eslint": 1254, "excalidraw/excalidraw": 378, "facebook/react": 2020, "gkurt/tegaki": 11, "grafana/grafana": 3142, "immich-app/immich": 1025, "jupyterlab/jupyterlab": 739, - "labring/FastGPT": 196, + "labring/FastGPT": 197, "langfuse/langfuse": 221, "medusajs/medusa": 589, "mermaid-js/mermaid": 855, @@ -34,6 +34,7 @@ "mozilla/pdf.js": 536, "n8n-io/n8n": 812, "nocodb/nocodb": 355, + "nodejs/node": 4523, "novuhq/novu": 536, "nrwl/nx": 1310, "openstatusHQ/openstatus": 126, @@ -41,16 +42,16 @@ "orval-labs/orval": 406, "outline/outline": 265, "payloadcms/payload": 587, - "pnpm/pnpm": 698, + "pnpm/pnpm": 700, "promptfoo/promptfoo": 387, "readest/readest": 137, "remix-run/react-router": 1320, "rgthree/rgthree-comfy": 21, - "rollup/rollup": 473, + "rollup/rollup": 474, "serverless/serverless": 1246, "storybookjs/storybook": 2801, "strapi/strapi": 1398, - "super-productivity/super-productivity": 531, + "super-productivity/super-productivity": 534, "tailwindlabs/tailwindcss": 377, "toeverything/AFFiNE": 270, "twentyhq/twenty": 774, diff --git a/data/repo-merge-times.json b/data/repo-merge-times.json index 1c46df8..1f1d260 100644 --- a/data/repo-merge-times.json +++ b/data/repo-merge-times.json @@ -1,5 +1,5 @@ { - "generatedAt": "2026-10-10T08:43:25Z", + "generatedAt": "2026-10-10T18:30:59Z", "method": "latest 60 closed PRs; merged non-bot external contributors; medianDays is the one we judge by", "repos": { "Automattic/mongoose": { @@ -47,14 +47,14 @@ "sampledClosed": 60 }, "CherryHQ/cherry-studio": { - "medianDays": 1.2, - "averageDays": 1.4, - "mergedExternal": 15, - "acceptancePct": 94, + "medianDays": 0.9, + "averageDays": 1.2, + "mergedExternal": 14, + "acceptancePct": 88, "closedExternal": 16, - "driveByAcceptancePct": 100, - "driveByMerged": 11, - "driveByClosed": 11, + "driveByAcceptancePct": 90, + "driveByMerged": 9, + "driveByClosed": 10, "sampledClosed": 60 }, "Eugeny/tabby": { @@ -69,25 +69,25 @@ "sampledClosed": 60 }, "Infisical/infisical": { - "medianDays": 1.4, + "medianDays": 1.3, "averageDays": 3.7, - "mergedExternal": 42, - "acceptancePct": 81, - "closedExternal": 52, - "driveByAcceptancePct": 83, + "mergedExternal": 41, + "acceptancePct": 77, + "closedExternal": 53, + "driveByAcceptancePct": 62, "driveByMerged": 5, - "driveByClosed": 6, + "driveByClosed": 8, "sampledClosed": 60 }, "Kong/insomnia": { - "medianDays": 1.7, - "averageDays": 7.9, - "mergedExternal": 41, - "acceptancePct": 98, - "closedExternal": 42, - "driveByAcceptancePct": 89, - "driveByMerged": 8, - "driveByClosed": 9, + "medianDays": 1.6, + "averageDays": 7.7, + "mergedExternal": 42, + "acceptancePct": 95, + "closedExternal": 44, + "driveByAcceptancePct": 82, + "driveByMerged": 9, + "driveByClosed": 11, "sampledClosed": 60 }, "Schneegans/Burn-My-Windows": { @@ -103,10 +103,10 @@ }, "TriliumNext/Trilium": { "medianDays": 0.0, - "averageDays": 0.1, - "mergedExternal": 20, + "averageDays": 0.2, + "mergedExternal": 21, "acceptancePct": 100, - "closedExternal": 20, + "closedExternal": 21, "driveByAcceptancePct": null, "driveByMerged": 0, "driveByClosed": 0, @@ -115,12 +115,12 @@ "TryGhost/Ghost": { "medianDays": 0.0, "averageDays": 0.2, - "mergedExternal": 42, - "acceptancePct": 95, - "closedExternal": 44, - "driveByAcceptancePct": 100, - "driveByMerged": 5, - "driveByClosed": 5, + "mergedExternal": 43, + "acceptancePct": 91, + "closedExternal": 47, + "driveByAcceptancePct": null, + "driveByMerged": 0, + "driveByClosed": 0, "sampledClosed": 60 }, "acornjs/acorn": { @@ -138,11 +138,11 @@ "medianDays": 2.2, "averageDays": 9.7, "mergedExternal": 40, - "acceptancePct": 82, - "closedExternal": 49, - "driveByAcceptancePct": 61, - "driveByMerged": 11, - "driveByClosed": 18, + "acceptancePct": 80, + "closedExternal": 50, + "driveByAcceptancePct": 56, + "driveByMerged": 9, + "driveByClosed": 16, "sampledClosed": 60 }, "babel/babel": { @@ -179,25 +179,25 @@ "sampledClosed": 60 }, "cline/cline": { - "medianDays": 0.5, - "averageDays": 3.8, - "mergedExternal": 39, + "medianDays": 0.4, + "averageDays": 3.3, + "mergedExternal": 38, "acceptancePct": 72, - "closedExternal": 54, + "closedExternal": 53, "driveByAcceptancePct": 69, "driveByMerged": 9, "driveByClosed": 13, "sampledClosed": 60 }, "compiler-explorer/compiler-explorer": { - "medianDays": 0.6, - "averageDays": 2.8, - "mergedExternal": 16, - "acceptancePct": 94, - "closedExternal": 17, - "driveByAcceptancePct": 92, - "driveByMerged": 11, - "driveByClosed": 12, + "medianDays": 0.7, + "averageDays": 3.8, + "mergedExternal": 11, + "acceptancePct": 92, + "closedExternal": 12, + "driveByAcceptancePct": 89, + "driveByMerged": 8, + "driveByClosed": 9, "sampledClosed": 60 }, "copy/v86": { @@ -245,14 +245,14 @@ "sampledClosed": 60 }, "eslint/eslint": { - "medianDays": 2.8, - "averageDays": 6.3, + "medianDays": 3.1, + "averageDays": 8.0, "mergedExternal": 29, - "acceptancePct": 63, - "closedExternal": 46, - "driveByAcceptancePct": 56, + "acceptancePct": 64, + "closedExternal": 45, + "driveByAcceptancePct": 58, "driveByMerged": 18, - "driveByClosed": 32, + "driveByClosed": 31, "sampledClosed": 60 }, "excalidraw/excalidraw": { @@ -270,8 +270,8 @@ "medianDays": 4.4, "averageDays": 5.5, "mergedExternal": 6, - "acceptancePct": 14, - "closedExternal": 44, + "acceptancePct": 13, + "closedExternal": 45, "driveByAcceptancePct": 20, "driveByMerged": 6, "driveByClosed": 30, @@ -300,25 +300,25 @@ "sampledClosed": 60 }, "grafana/grafana": { - "medianDays": 0.7, - "averageDays": 2.1, - "mergedExternal": 44, - "acceptancePct": 81, + "medianDays": 0.3, + "averageDays": 2.0, + "mergedExternal": 43, + "acceptancePct": 80, "closedExternal": 54, - "driveByAcceptancePct": 79, - "driveByMerged": 27, - "driveByClosed": 34, + "driveByAcceptancePct": 75, + "driveByMerged": 24, + "driveByClosed": 32, "sampledClosed": 60 }, "immich-app/immich": { "medianDays": 0.3, - "averageDays": 6.4, - "mergedExternal": 12, - "acceptancePct": 57, - "closedExternal": 21, - "driveByAcceptancePct": 67, - "driveByMerged": 12, - "driveByClosed": 18, + "averageDays": 3.4, + "mergedExternal": 11, + "acceptancePct": 48, + "closedExternal": 23, + "driveByAcceptancePct": 55, + "driveByMerged": 11, + "driveByClosed": 20, "sampledClosed": 60 }, "jestjs/jest": { @@ -344,19 +344,19 @@ "sampledClosed": 60 }, "labring/FastGPT": { - "medianDays": 2.8, - "averageDays": 4.3, - "mergedExternal": 16, - "acceptancePct": 62, + "medianDays": 3.7, + "averageDays": 4.8, + "mergedExternal": 17, + "acceptancePct": 65, "closedExternal": 26, - "driveByAcceptancePct": 60, - "driveByMerged": 9, + "driveByAcceptancePct": 67, + "driveByMerged": 10, "driveByClosed": 15, "sampledClosed": 60 }, "langfuse/langfuse": { "medianDays": 0.3, - "averageDays": 0.8, + "averageDays": 0.7, "mergedExternal": 41, "acceptancePct": 87, "closedExternal": 47, @@ -366,8 +366,8 @@ "sampledClosed": 60 }, "marktext/marktext": { - "medianDays": 0.8, - "averageDays": 2.7, + "medianDays": 0.7, + "averageDays": 2.6, "mergedExternal": 13, "acceptancePct": 57, "closedExternal": 23, @@ -393,9 +393,9 @@ "mergedExternal": 11, "acceptancePct": 41, "closedExternal": 27, - "driveByAcceptancePct": 46, + "driveByAcceptancePct": 41, "driveByMerged": 11, - "driveByClosed": 24, + "driveByClosed": 27, "sampledClosed": 60 }, "mermaid-js/mermaid": { @@ -424,22 +424,22 @@ "medianDays": 0.1, "averageDays": 0.5, "mergedExternal": 19, - "acceptancePct": 95, - "closedExternal": 20, - "driveByAcceptancePct": 67, + "acceptancePct": 86, + "closedExternal": 22, + "driveByAcceptancePct": 40, "driveByMerged": 2, - "driveByClosed": 3, + "driveByClosed": 5, "sampledClosed": 60 }, "mikro-orm/mikro-orm": { "medianDays": 0.2, "averageDays": 0.3, "mergedExternal": 17, - "acceptancePct": 100, - "closedExternal": 17, + "acceptancePct": 94, + "closedExternal": 18, "driveByAcceptancePct": 100, - "driveByMerged": 14, - "driveByClosed": 14, + "driveByMerged": 12, + "driveByClosed": 12, "sampledClosed": 60 }, "mozilla/pdf.js": { @@ -486,6 +486,17 @@ "driveByClosed": 2, "sampledClosed": 60 }, + "nodejs/node": { + "medianDays": 2.0, + "averageDays": 2.9, + "mergedExternal": 12, + "acceptancePct": 46, + "closedExternal": 26, + "driveByAcceptancePct": 38, + "driveByMerged": 6, + "driveByClosed": 16, + "sampledClosed": 60 + }, "novuhq/novu": { "medianDays": 0.2, "averageDays": 3.8, @@ -543,24 +554,24 @@ }, "orval-labs/orval": { "medianDays": 0.1, - "averageDays": 1.8, - "mergedExternal": 23, + "averageDays": 1.5, + "mergedExternal": 24, "acceptancePct": 96, - "closedExternal": 24, + "closedExternal": 25, "driveByAcceptancePct": 100, - "driveByMerged": 10, - "driveByClosed": 10, + "driveByMerged": 9, + "driveByClosed": 9, "sampledClosed": 60 }, "outline/outline": { "medianDays": 7.0, "averageDays": 8.5, "mergedExternal": 3, - "acceptancePct": 43, - "closedExternal": 7, - "driveByAcceptancePct": 43, + "acceptancePct": 38, + "closedExternal": 8, + "driveByAcceptancePct": 38, "driveByMerged": 3, - "driveByClosed": 7, + "driveByClosed": 8, "sampledClosed": 60 }, "parcel-bundler/parcel": { @@ -587,13 +598,13 @@ }, "pnpm/pnpm": { "medianDays": 0.1, - "averageDays": 1.4, - "mergedExternal": 11, - "acceptancePct": 100, - "closedExternal": 11, - "driveByAcceptancePct": 100, - "driveByMerged": 6, - "driveByClosed": 6, + "averageDays": 110.5, + "mergedExternal": 9, + "acceptancePct": 45, + "closedExternal": 20, + "driveByAcceptancePct": 45, + "driveByMerged": 9, + "driveByClosed": 20, "sampledClosed": 60 }, "postcss/postcss": { @@ -608,14 +619,14 @@ "sampledClosed": 60 }, "prettier/prettier": { - "medianDays": 9.0, - "averageDays": 10.4, - "mergedExternal": 6, - "acceptancePct": 23, - "closedExternal": 26, - "driveByAcceptancePct": 31, - "driveByMerged": 4, - "driveByClosed": 13, + "medianDays": 0.8, + "averageDays": 8.0, + "mergedExternal": 7, + "acceptancePct": 26, + "closedExternal": 27, + "driveByAcceptancePct": 36, + "driveByMerged": 5, + "driveByClosed": 14, "sampledClosed": 60 }, "prisma/prisma": { @@ -630,14 +641,14 @@ "sampledClosed": 60 }, "promptfoo/promptfoo": { - "medianDays": 6.3, - "averageDays": 26.4, - "mergedExternal": 44, - "acceptancePct": 83, + "medianDays": 0.6, + "averageDays": 17.6, + "mergedExternal": 48, + "acceptancePct": 91, "closedExternal": 53, - "driveByAcceptancePct": 74, - "driveByMerged": 14, - "driveByClosed": 19, + "driveByAcceptancePct": 86, + "driveByMerged": 12, + "driveByClosed": 14, "sampledClosed": 60 }, "react-hook-form/react-hook-form": { @@ -685,14 +696,14 @@ "sampledClosed": 45 }, "rollup/rollup": { - "medianDays": 6.4, - "averageDays": 13.8, - "mergedExternal": 14, + "medianDays": 9.1, + "averageDays": 14.6, + "mergedExternal": 15, "acceptancePct": 88, - "closedExternal": 16, + "closedExternal": 17, "driveByAcceptancePct": 88, - "driveByMerged": 14, - "driveByClosed": 16, + "driveByMerged": 15, + "driveByClosed": 17, "sampledClosed": 60 }, "serverless/serverless": { @@ -751,14 +762,14 @@ "sampledClosed": 60 }, "super-productivity/super-productivity": { - "medianDays": 2.3, + "medianDays": 2.5, "averageDays": 6.8, - "mergedExternal": 14, - "acceptancePct": 82, - "closedExternal": 17, - "driveByAcceptancePct": 79, - "driveByMerged": 11, - "driveByClosed": 14, + "mergedExternal": 10, + "acceptancePct": 91, + "closedExternal": 11, + "driveByAcceptancePct": 91, + "driveByMerged": 10, + "driveByClosed": 11, "sampledClosed": 60 }, "sveltejs/svelte": { @@ -798,44 +809,44 @@ "medianDays": 5.7, "averageDays": 9.5, "mergedExternal": 11, - "acceptancePct": 48, - "closedExternal": 23, - "driveByAcceptancePct": 48, + "acceptancePct": 50, + "closedExternal": 22, + "driveByAcceptancePct": 50, "driveByMerged": 11, - "driveByClosed": 23, + "driveByClosed": 22, "sampledClosed": 60 }, "twentyhq/twenty": { - "medianDays": 3.0, - "averageDays": 4.1, - "mergedExternal": 15, - "acceptancePct": 68, - "closedExternal": 22, - "driveByAcceptancePct": 62, - "driveByMerged": 10, - "driveByClosed": 16, + "medianDays": 1.3, + "averageDays": 3.4, + "mergedExternal": 7, + "acceptancePct": 30, + "closedExternal": 23, + "driveByAcceptancePct": 50, + "driveByMerged": 6, + "driveByClosed": 12, "sampledClosed": 60 }, "typeorm/typeorm": { - "medianDays": 17.3, - "averageDays": 23.6, - "mergedExternal": 15, - "acceptancePct": 42, - "closedExternal": 36, - "driveByAcceptancePct": 32, - "driveByMerged": 10, - "driveByClosed": 31, + "medianDays": 15.0, + "averageDays": 22.8, + "mergedExternal": 14, + "acceptancePct": 40, + "closedExternal": 35, + "driveByAcceptancePct": 26, + "driveByMerged": 7, + "driveByClosed": 27, "sampledClosed": 60 }, "vercel/next.js": { "medianDays": 1.1, - "averageDays": 7.4, - "mergedExternal": 19, - "acceptancePct": 73, - "closedExternal": 26, - "driveByAcceptancePct": 80, - "driveByMerged": 4, - "driveByClosed": 5, + "averageDays": 7.8, + "mergedExternal": 18, + "acceptancePct": 67, + "closedExternal": 27, + "driveByAcceptancePct": 50, + "driveByMerged": 3, + "driveByClosed": 6, "sampledClosed": 60 }, "vercel/turborepo": { @@ -850,13 +861,13 @@ "sampledClosed": 60 }, "vitejs/vite": { - "medianDays": 3.9, - "averageDays": 6.1, - "mergedExternal": 10, - "acceptancePct": 32, + "medianDays": 3.4, + "averageDays": 5.5, + "mergedExternal": 11, + "acceptancePct": 35, "closedExternal": 31, - "driveByAcceptancePct": 32, - "driveByMerged": 10, + "driveByAcceptancePct": 35, + "driveByMerged": 11, "driveByClosed": 31, "sampledClosed": 60 }, diff --git a/impact.json b/impact.json index 65a192d..97a6c6d 100644 --- a/impact.json +++ b/impact.json @@ -4,7 +4,7 @@ "title": "deleteBulkMetadata N+1", "type": "N+1 (루프 안 순차 DELETE, item당 왕복 1회)", "repo": "immich-app/immich", - "repoLabel": "immich · 115.9k★", + "repoLabel": "immich · 116k★", "pr": 30163, "createdAt": "2026-07-23T15:26:09Z", "status": "closed", @@ -363,7 +363,7 @@ "titleEn": "printed error stacks lose every other frame", "type": "전역 정규식 상태 (/g 정규식을 filter 안에서 .test() — lastIndex 가 새어 프레임이 하나 걸러 사라진다)", "repo": "withastro/astro", - "repoLabel": "astro · 63.1k★", + "repoLabel": "astro · 63.2k★", "pr": 17665, "createdAt": "2026-08-11T12:35:43Z", "status": "closed", @@ -573,7 +573,7 @@ "titleEn": "write-only page input set in the build", "type": "쓰기만 하는 컬렉션 (viteBuild 가 pageInput 을 채우기만 하고 읽지 않는다 — 소비자 ssrBuild 인자가 #14306 Environment API 에서 사라졌다)", "repo": "withastro/astro", - "repoLabel": "astro · 63.1k★", + "repoLabel": "astro · 63.2k★", "pr": 17987, "createdAt": "2026-09-13T04:00:19Z", "status": "merged", @@ -673,7 +673,7 @@ "titleEn": "quadratic sitemap chunk URL lookups", "type": "O(n²) (청크별 배열 복사와 URL 포함 검사 → Set)", "repo": "withastro/astro", - "repoLabel": "astro · 63.1k★", + "repoLabel": "astro · 63.2k★", "pr": 18149, "createdAt": "2026-09-27T10:21:18Z", "status": "waiting" @@ -815,7 +815,7 @@ "titleEn": "Map that is filled but never read", "type": "쓰기만 하는 컬렉션 (set 만 하고 읽는 곳 0 — DFS 는 연결점의 소유 블록을 직접 따라간다)", "repo": "BabylonJS/Babylon.js", - "repoLabel": "Babylon.js · 26.1k★", + "repoLabel": "Babylon.js · 26.2k★", "pr": 18980, "status": "merged", "createdAt": "2026-10-07T04:59:27Z", @@ -955,7 +955,7 @@ "titleEn": "settings search drops properties nested in object settings", "type": "버린 반환값 (acc.concat(재귀 결과) 를 대입 안 함 — 객체 설정 안의 속성 이름·제목이 검색에서 빠진다)", "repo": "jupyterlab/jupyterlab", - "repoLabel": "jupyterlab · 15.3k★", + "repoLabel": "jupyterlab · 15.4k★", "pr": 20008, "status": "merged", "createdAt": "2026-10-08T08:42:59Z", @@ -1031,10 +1031,13 @@ "titleEn": "inspector v2 Animations pane drops child animatables' animations", "type": "버린 반환값 (animations.concat(자식 애니메이션) 를 대입 안 함 — 자식에만 애니메이션이 있으면 'No Animations')", "repo": "BabylonJS/Babylon.js", - "repoLabel": "Babylon.js · 26.1k★", + "repoLabel": "Babylon.js · 26.2k★", "pr": 18990, "createdAt": "2026-10-09T11:42:12Z", - "status": "changes" + "status": "approved", + "approvedBy": [ + "Popov72" + ] }, { "title": "output 마이그레이션 ID 의 .d.ts 정규화 결과를 버림", @@ -1157,7 +1160,17 @@ "pr": 13947, "createdAt": "2026-10-10T08:40:23Z", "status": "waiting" + }, + { + "title": "벤치마크가 잘못된 type 을 받아도 실패하지 않고 엉뚱한 값을 잼", + "titleEn": "Benchmarks silently measure an undefined path for an invalid type", + "type": "버린 반환값 (fs·webstorage 벤치마크 21곳 default 분기의 new Error('Invalid type') — throw 가 빠져 아무 일도 안 함)", + "repo": "nodejs/node", + "repoLabel": "Node.js · 122.3k★", + "pr": 66647, + "createdAt": "2026-10-10T18:27:04Z", + "status": "waiting" } ], - "generatedAt": "2026-10-10T08:45:02.601Z" + "generatedAt": "2026-10-10T18:32:44.552Z" } diff --git a/index.html b/index.html index 1757a17..5622578 100644 --- a/index.html +++ b/index.html @@ -594,7 +594,7 @@
1배운다 · 고칠 규칙Learn · fix rules62고친다 · PRFix · PRs843판정 · 머지Verdict · merged364다진다 · 오탐 가드Sharpen · FP guards45쓰기만 하는 컬렉션 15O(n²) 조회 12불필요한 순차 I/O 4버려진 Promise 2버린 반환값 2전역 정규식 상태 1Write-only collection 15O(n²) lookup 12Needless sequential I/O 4Floating promise 2Discarded pure call 2Stateful /g regex 1남의 저장소에서 머지된 PR 과 남의 코드에서 고칠 규칙을 뽑고, 그 규칙으로 다른 저장소를 고쳐 PR 을 낸다. 머지·거절이 다시 규칙을 다듬는다 — 규칙 6개 중 6개가 머지로 검증 · 저장소 26곳 · 거절 26 · 대기 22. Fix rules come from PRs strangers merged and from strangers' code; we apply them to other repos as PRs, and merges and rejections sharpen them again — 6 of 6 rules verified by a merge · 26 projects · closed 26 · open 22. 전체 기록 →Full record →
1배운다 · 고칠 규칙Learn · fix rules62고친다 · PRFix · PRs853판정 · 머지Verdict · merged364다진다 · 오탐 가드Sharpen · FP guards45쓰기만 하는 컬렉션 15O(n²) 조회 12불필요한 순차 I/O 4버려진 Promise 2버린 반환값 2전역 정규식 상태 1Write-only collection 15O(n²) lookup 12Needless sequential I/O 4Floating promise 2Discarded pure call 2Stateful /g regex 1남의 저장소에서 머지된 PR 과 남의 코드에서 고칠 규칙을 뽑고, 그 규칙으로 다른 저장소를 고쳐 PR 을 낸다. 머지·거절이 다시 규칙을 다듬는다 — 규칙 6개 중 6개가 머지로 검증 · 저장소 26곳 · 거절 26 · 대기 23. Fix rules come from PRs strangers merged and from strangers' code; we apply them to other repos as PRs, and merges and rejections sharpen them again — 6 of 6 rules verified by a merge · 26 projects · closed 26 · open 23. 전체 기록 →Full record →
카드의 기여자 수는 기준 GitHub 커밋 작성자 집계다. 같은 사람의 여러 계정이나 봇이 각각 포함될 수 있다.
Contributor counts use GitHub commit authors as of . Multiple accounts for one person and bots may be counted separately.
-머지됨 36 · 승인 · 머지 대기 1 · 변경 요청 1 · 리뷰 진행 1 · 아무도 안 봄 17 · 보류 2 · 닫힘 26 — 전체 기록은 IMPACT.md. 상태는 GitHub 에서 자동 갱신된다. 기준선은 각 저장소의 최근 닫힌 PR 60건 중 외부 기여자 머지의 중앙값이다 — 평균은 묵은 몇 건이 통째로 끌고 간다(next.js 는 평균 7.4일인데 중앙값 1.1일). 초록불은 그 안, 빨간불은 초과, 보라불은 +7일을 넘긴 보류다. 옆의 수락률은 그 저장소가 최근 닫힌 외부 PR 을 얼마나 머지했는지다 — 늦은 게 우리 것만 밀린 건지, 원래 대부분 거절인 곳인지를 가른다. 보류는 GitHub 에 없는 상태다 — 닫히지도 머지되지도 않은 채 그 저장소의 평소 속도를 크게 지난 것을 우리가 따로 센다.
-36 merged · 1 approved · 1 changes requested · 1 in review · 17 nobody has looked · 2 stalled · 26 closed — full log in IMPACT.md, refreshed from GitHub. The baseline is the median of external-contributor merges among each repository's latest 60 closed PRs — a mean gets dragged by a few stale PRs (next.js averages 7.4 days but its median is 1.1). Green is within it; red is over; violet is stalled — past it by 7 days. The percentage next to it is how many recently closed external PRs that repository merged — it separates "ours is being skipped" from "this repo turns most outsiders down". Stalled is not a GitHub state: it is neither merged nor closed, just well past how fast that repository usually moves, and we count it separately.
+머지됨 36 · 승인 · 머지 대기 2 · 리뷰 진행 1 · 아무도 안 봄 18 · 보류 2 · 닫힘 26 — 전체 기록은 IMPACT.md. 상태는 GitHub 에서 자동 갱신된다. 기준선은 각 저장소의 최근 닫힌 PR 60건 중 외부 기여자 머지의 중앙값이다 — 평균은 묵은 몇 건이 통째로 끌고 간다(next.js 는 평균 7.8일인데 중앙값 1.1일). 초록불은 그 안, 빨간불은 초과, 보라불은 +7일을 넘긴 보류다. 옆의 수락률은 그 저장소가 최근 닫힌 외부 PR 을 얼마나 머지했는지다 — 늦은 게 우리 것만 밀린 건지, 원래 대부분 거절인 곳인지를 가른다. 보류는 GitHub 에 없는 상태다 — 닫히지도 머지되지도 않은 채 그 저장소의 평소 속도를 크게 지난 것을 우리가 따로 센다.
+36 merged · 2 approved · 1 in review · 18 nobody has looked · 2 stalled · 26 closed — full log in IMPACT.md, refreshed from GitHub. The baseline is the median of external-contributor merges among each repository's latest 60 closed PRs — a mean gets dragged by a few stale PRs (next.js averages 7.8 days but its median is 1.1). Green is within it; red is over; violet is stalled — past it by 7 days. The percentage next to it is how many recently closed external PRs that repository merged — it separates "ours is being skipped" from "this repo turns most outsiders down". Stalled is not a GitHub state: it is neither merged nor closed, just well past how fast that repository usually moves, and we count it separately.
감점 비중은 인지 복잡도 37 · 함수 길이 23 · 중복 9 · 파일 크기 8 · 순차 I/O 5 · O(n²) 5(캡 기준, 합 87). 나머지 24종은 등급을 건드리지 않고 파일·줄만 짚는다.
Caps by axis: complexity 37, function length 23, duplication 9, file size 8, sequential I/O 5, O(n²) 5 — 87 total. The other twenty-four never touch the grade; they name the file and line.
-채우기만 하고 아무도 읽지 않는 Set·Map·배열. 소비하던 코드가 리팩터로 사라진 흔적이라 지워도 동작이 같고, 매번 채우는 비용만 사라진다. knip 은 .add 도 "사용"으로 봐서 못 잡는다.A Set, Map, or array that is filled but never read — what a refactor left behind. Removing it changes nothing but the cost of filling it. knip misses it because .add counts as a use.
행마다 다른 배열을 .find·.some·.includes 로 처음부터 훑는 자리. 한 번 Map·Set 으로 색인해두면 조회가 O(1)이 된다 — 데이터가 커질수록 차이가 제곱으로 벌어진다.Each row rescans another array with .find/.some/.includes. Index it once into a Map/Set and each lookup is O(1) — the gap grows with the square of the data.
테스트·프론트 구역, 정적 외곽, n 이 잘린 자리는 세지 않고 3곳 미만은 면제. 10k줄당 유예 1.0, 캡 5 — 판정 난 초기 PR 6건 중 4건이 닫혀서, 오탐이 등급을 뒤집지 않게 낮게 잡았다.Test/frontend zones, static outers, and capped-n sites are excluded; under three sites is free. Free below 1.0 per 10k lines, capped at 5 — four of the first six decided PRs were closed, so a false positive must not flip a grade.
루프 한 바퀴마다 DB·네트워크를 부르는 N+1, 그리고 서로의 결과를 쓰지 않는 await 를 줄 세우는 것. IN (...) 한 번이나 Promise.all 로 묶으면 왕복이 셈으로 줄어든다.A DB or network call per loop pass (N+1), and awaits that never use each other's result queued one by one. One IN (...) or a Promise.all cuts the round trips — provable by counting.
같은 결함이라 한 축. 37곳 재측정에서 기존 점수와 rho=−0.18 로 독립이고 11곳(30%)에서 발동한다. 3곳 미만은 안 센다(재시도·커서 페이지네이션은 순차가 맞다). 유예 3.0/1000파일, 캡 5.One defect, one axis. Across 37 re-measured repos it is independent of the score (rho=−0.18) and fires in 11 (30%). Under three sites is ignored — retries and cursor pagination are meant to be serial. Free below 3.0 per 1,000 files, capped at 5.
async 함수를 await 없이 부르고 결과를 버린다. 실패해도 아무도 모르고, 호출한 쪽은 끝나기 전에 다음 단계로 넘어간다.An async call with no await and nothing holding the result. Failures vanish, and the caller moves on before it finishes.
s.replace(…)·arr.concat(…) 를 부르고 결과를 대입하지 않는다. 문자열은 불변이라 그 줄은 아무것도 안 한다 — 지우려던 줄이 남고, 붙이려던 말이 빠진다.Calls s.replace(…) or arr.concat(…) and drops the result. Strings are immutable, so the line does nothing — what it meant to remove stays, what it meant to append is lost.
/g 정규식을 공유한 채 루프에서 .test() 하면 lastIndex 가 다음 호출로 새어, 같은 입력에 참·거짓이 번갈아 나온다. 성능이 아니라 조용히 틀린 답이다.A shared /g regex used with .test() in a loop leaks lastIndex into the next call, so the same input flips between true and false. Not slow — silently wrong.
한 번에 읽어야 하는 양. 중첩 함수·주석을 뺀 자기 코드 줄 기준, 40줄 초과(JSX 60줄) 비율. 파일을 쪼개도 안 변한다 — 그래서 조작이 안 된다.How much you must read at once — a function's own code lines, nested functions and comments removed. Splitting files doesn't move it, so it can't be gamed.
함수를 머리로 따라가는 부담. SonarSource S3776 스펙과 정본값까지 일치 검증.How hard a function is to follow. Matches SonarSource S3776, verified to canonical values.
토큰 단위 복사·붙여넣기 밀도. 74개 실측에서 점수와 상관 −0.11이라 비중을 16→9로 줄였다 — 대부분에겐 0점, 소수에게만 큰 항목이다.Token-level copy-paste density. Correlates −0.11 with score across 74 repos, so its cap was cut 16 → 9: zero for most, heavy for a few.
평균 줄 수 + 대형 파일 비중. 보조 항으로 강등(27→8) — 같은 코드를 6파일로 쪼개기만 해도 옛 공식은 +27점을 줬다. 함수 길이와 상관 +0.16이라 버리진 않았다.Average lines + oversized-file share, demoted to a minor term (27 → 8): splitting identical code into six files used to gain +27. Kept, because it correlates only +0.16 with function length.
채우기만 하고 아무도 읽지 않는 Set·Map·배열. 소비하던 코드가 리팩터로 사라진 흔적이라 지워도 동작이 같고, 매번 채우는 비용만 사라진다. knip 은 .add 도 "사용"으로 봐서 못 잡는다.A Set, Map, or array that is filled but never read — what a refactor left behind. Removing it changes nothing but the cost of filling it. knip misses it because .add counts as a use.
행마다 다른 배열을 .find·.some·.includes 로 처음부터 훑는 자리. 한 번 Map·Set 으로 색인해두면 조회가 O(1)이 된다 — 데이터가 커질수록 차이가 제곱으로 벌어진다.Each row rescans another array with .find/.some/.includes. Index it once into a Map/Set and each lookup is O(1) — the gap grows with the square of the data.
테스트·프론트 구역, 정적 외곽, n 이 잘린 자리는 세지 않고 3곳 미만은 면제. 10k줄당 유예 1.0, 캡 5 — 판정 난 초기 PR 6건 중 4건이 닫혀서, 오탐이 등급을 뒤집지 않게 낮게 잡았다.Test/frontend zones, static outers, and capped-n sites are excluded; under three sites is free. Free below 1.0 per 10k lines, capped at 5 — four of the first six decided PRs were closed, so a false positive must not flip a grade.
루프 한 바퀴마다 DB·네트워크를 부르는 N+1, 그리고 서로의 결과를 쓰지 않는 await 를 줄 세우는 것. IN (...) 한 번이나 Promise.all 로 묶으면 왕복이 셈으로 줄어든다.A DB or network call per loop pass (N+1), and awaits that never use each other's result queued one by one. One IN (...) or a Promise.all cuts the round trips — provable by counting.
같은 결함이라 한 축. 37곳 재측정에서 기존 점수와 rho=−0.18 로 독립이고 11곳(30%)에서 발동한다. 3곳 미만은 안 센다(재시도·커서 페이지네이션은 순차가 맞다). 유예 3.0/1000파일, 캡 5.One defect, one axis. Across 37 re-measured repos it is independent of the score (rho=−0.18) and fires in 11 (30%). Under three sites is ignored — retries and cursor pagination are meant to be serial. Free below 3.0 per 1,000 files, capped at 5.
async 함수를 await 없이 부르고 결과를 버린다. 실패해도 아무도 모르고, 호출한 쪽은 끝나기 전에 다음 단계로 넘어간다.An async call with no await and nothing holding the result. Failures vanish, and the caller moves on before it finishes.
s.replace(…)·arr.concat(…) 를 부르고 결과를 대입하지 않는다. 문자열은 불변이라 그 줄은 아무것도 안 한다 — 지우려던 줄이 남고, 붙이려던 말이 빠진다.Calls s.replace(…) or arr.concat(…) and drops the result. Strings are immutable, so the line does nothing — what it meant to remove stays, what it meant to append is lost.
/g 정규식을 공유한 채 루프에서 .test() 하면 lastIndex 가 다음 호출로 새어, 같은 입력에 참·거짓이 번갈아 나온다. 성능이 아니라 조용히 틀린 답이다.A shared /g regex used with .test() in a loop leaks lastIndex into the next call, so the same input flips between true and false. Not slow — silently wrong.
한 번에 읽어야 하는 양. 중첩 함수·주석을 뺀 자기 코드 줄 기준, 40줄 초과(JSX 60줄) 비율. 파일을 쪼개도 안 변한다 — 그래서 조작이 안 된다.How much you must read at once — a function's own code lines, nested functions and comments removed. Splitting files doesn't move it, so it can't be gamed.
함수를 머리로 따라가는 부담. SonarSource S3776 스펙과 정본값까지 일치 검증.How hard a function is to follow. Matches SonarSource S3776, verified to canonical values.
토큰 단위 복사·붙여넣기 밀도. 74개 실측에서 점수와 상관 −0.11이라 비중을 16→9로 줄였다 — 대부분에겐 0점, 소수에게만 큰 항목이다.Token-level copy-paste density. Correlates −0.11 with score across 74 repos, so its cap was cut 16 → 9: zero for most, heavy for a few.
평균 줄 수 + 대형 파일 비중. 보조 항으로 강등(27→8) — 같은 코드를 6파일로 쪼개기만 해도 옛 공식은 +27점을 줬다. 함수 길이와 상관 +0.16이라 버리진 않았다.Average lines + oversized-file share, demoted to a minor term (27 → 8): splitting identical code into six files used to gain +27. Kept, because it correlates only +0.16 with function length.