Skip to content

fix: 하네스 측정 버그 수정 + 코드 리뷰 지적 11건 반영 - #51

Merged
bae080311 merged 2 commits into
mainfrom
fix/harness-audit
Sep 10, 2026
Merged

bae080311 merged 2 commits into
mainfrom
fix/harness-audit

Conversation

@bae080311

Copy link
Copy Markdown
Owner

post-pr-coverage.sh 훅이 이번 세션에 처음으로 실제 동작하기 시작했습니다(문법 에러 수정 후 PR #48/#49/#50에 코멘트를 남겼습니다). 그 출력을 처음 읽어보니 두 곳이 틀려 있었습니다.

1. 커버리지 수치가 틀렸다

vitest.config.tsinclude: ['packages/*/src/**/*.ts']__bench__/*.bench.ts까지 집계에 넣어서, 실행되지 않는 벤치 파일이 0%로 잡혀 전체 수치를 끌어내렸습니다.

  • 이전: All files 40.49%
  • 이후: All files 43.17%

측정값이 틀리면 커버리지 규칙 자체가 의미를 잃습니다.

2. 벤치마크 출력을 읽을 수 없었다

PR 코멘트에 ANSI 색상 코드가 그대로 찍혔고, vitest가 진행 상황을 다시 그리면서 같은 줄이 두 번 나왔습니다.

 ^[[32m✓^[[39m packages/core/src/__bench__/ScrollManager.bench.ts^[[2m > ^[[22m...
 ^[[32m✓^[[39m packages/core/src/__bench__/ScrollManager.bench.ts^[[2m > ^[[22m...

NO_COLOR=1로 막고, 그래도 남는 코드는 sed로 걷어내고, awk '!seen[$0]++'로 중복을 제거했습니다.

 ✓ packages/core/src/__bench__/ScrollManager.bench.ts > ScrollManager 벤치마크 11628ms
  getActiveId - packages/core/src/__bench__/ScrollManager.bench.ts > ScrollManager 벤치마크

검증: 두 변경 모두 실제로 실행해 확인했습니다. 이 PR 자체의 훅 코멘트로도 결과를 볼 수 있습니다.

🤖 Generated with Claude Code

post-pr-coverage.sh 훅이 이번에 처음으로 실제 동작하기 시작했고(문법 에러 수정 후
PR #48/#49/#50 에 코멘트를 남겼다), 그 출력을 처음 읽어보니 두 곳이 틀려 있었다.

- vitest.config.ts: 커버리지 집계에서 __bench__ 를 제외한다. 벤치 파일이 0% 로
  잡혀 전체 수치를 왜곡했다. 40.49% → 43.17% 로, 이제 실제 값이다.
  측정값이 틀리면 커버리지 규칙 자체가 의미를 잃는다
- post-pr-coverage.sh: 벤치 출력에서 ANSI 색상 코드를 제거하고 중복 라인을
  걷어낸다. PR 코멘트에 ^[[32m 같은 문자열이 그대로 찍혀 읽을 수 없었고,
  vitest 가 진행 상황을 다시 그리며 같은 줄을 여러 번 출력해 같은 항목이 두 번
  나왔다. NO_COLOR 로 막고, 그래도 남는 코드는 sed 로 걷어낸다

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 9, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
jump-section-docs Ready Ready Preview Sep 9, 2026 12:03pm UTC

@bae080311

Copy link
Copy Markdown
Owner Author

🧪 Test Coverage

-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   43.17 |    33.46 |   36.93 |   44.39 |                   
 core/src          |   55.95 |    39.06 |   68.33 |   57.96 |                   
  ScrollManager.ts |   55.95 |    39.06 |   68.33 |   57.96 | ...10-539,552,566 
 react/src         |    12.5 |        0 |       0 |    12.5 |                   
  ...onContext.tsx |   23.07 |        0 |       0 |   23.07 | 27-37,41-45       
  ...ollSection.ts |     7.4 |        0 |       0 |     7.4 | 7-36,45-53        
 svelte/src        |    2.85 |        0 |       0 |    3.12 |                   
  ...ollSection.ts |    2.85 |        0 |       0 |    3.12 | 12-85             
 vue/src           |    4.65 |        0 |       0 |    4.76 |                   
  ...ollSection.ts |    4.65 |        0 |       0 |    4.76 | 17-93,106-113     
-------------------|---------|----------|---------|---------|-------------------

📦 Bundle Size

파일 크기 gzip
packages/core/dist/index.js 11.2 KB 3.5 KB
packages/react/dist/index.js 2.2 KB 1.0 KB
packages/svelte/dist/index.js 1.3 KB 0.6 KB
packages/vue/dist/index.js 1.5 KB 0.7 KB
packages/core/dist/index.mjs 11.2 KB 3.5 KB
packages/react/dist/index.mjs 2.1 KB 0.9 KB
packages/svelte/dist/index.mjs 1.2 KB 0.6 KB
packages/vue/dist/index.mjs 1.5 KB 0.7 KB

⚡ Benchmark

> jump-section@1.0.0 bench /Users/bae/jump-section
> vitest bench --reporter=verbose
 ✓ packages/core/src/__bench__/ScrollManager.bench.ts > ScrollManager 벤치마크 11582ms
  getActiveId - packages/core/src/__bench__/ScrollManager.bench.ts > ScrollManager 벤치마크

🤖 Generated by jump-section AI Pipeline

직전 커밋이 "측정 버그를 고쳤다"고 했지만 세 가지가 틀렸다. 코드 리뷰가 실측으로
잡아냈다.

## 벤치 섹션에 측정값이 하나도 없었다

grep -E "(bench|ops/sec|✓|×)" 가 vitest 4 의 실측 행(`· getActiveId
50,897,820.27 ...`)과 비교 요약(`2.62x faster than ...`)을 전부 버렸다. 남은 건
pnpm 배너와 스위트 이름뿐이었다. ANSI 코드가 사라진 것만 확인하고 데이터가
빠진 것을 놓쳤다.

패턴으로 고르지 않고 tail -24 로 바꿨다. 표는 항상 출력 끝에 오므로, 리포터
형식이 바뀌어도 조용히 비어버리지 않는다. 파이프 단계가 줄어 pipefail + SIGPIPE
로 죽을 고리도 함께 사라졌다.

## 조용한 중단 경로를 새로 만들었다

fallback 을 명령 치환 밖으로 빼면서, 원래 `||` 가 주던 보호가 없어졌다.
`set -euo pipefail` 에서는 대입 자체가 파이프라인의 비-0 상태를 물려받아
스크립트를 죽이므로 fallback 은 도달 불가였고, gh pr comment 전에 아무 흔적 없이
종료됐다. 조용한 실패를 고치려던 스크립트에 조용한 실패를 넣은 셈이다
(CLAUDE.md「공통 규칙」위반).

ERR trap 을 추가해 중단이 stderr 에 드러나게 했다.

## 커버리지 수치가 여전히 틀렸다

coverage.include 가 `*.ts` 라서 `.tsx` 를 놓쳤다. 테스트가 없어 로드되지 않는
Section.tsx 가 리포트에 아예 나타나지 않아 수치가 실제보다 높게 보였다.
로드되는 .tsx(ScrollSectionContext.tsx)는 표시되기 때문에 눈에 띄지 않았다.

- 직전 커밋 주장: 43.17% 가 실제 값
- 실제: 42.24% (Section.tsx 0% 포함)

벤치 제외도 디렉터리 이름(`__bench__`)이 아니라 vitest 자신의 벤치 파일
패턴(`**/*.{bench,benchmark}.?(c|m)[jt]s?(x)`)을 기준으로 바꿨다. 그러지 않으면
__bench__ 밖에 둔 *.bench.ts 가 다시 0% 로 들어온다.

## 중복 출력의 원인도 틀리게 적었다

"vitest 가 진행 상황을 다시 그린다"고 썼지만 실제 원인은 `--reporter=verbose` 다.
vitest 는 benchmark reporters(기본 ['default'])와 --reporter 를 합집합으로 쓰므로
두 리포터가 같은 표를 각각 출력했다. 플래그를 빼면 헤더가 한 번만 나오고,
데이터를 훼손하던 awk 중복 제거도 필요 없어진다. sed ANSI 제거도 NO_COLOR 를
스크립트 전체에 export 하면 불필요해서 함께 걷어냈다.

## 회귀 테스트 추가

post-pr-coverage.test.sh 8케이스. 실제로 깨졌던 두 가지를 겨냥한다 — 추출이
실측값을 살려두는지(옛 grep 패턴이 버렸다는 것도 함께 못박음), 조용한 중단 방지
장치가 남아 있는지. flywheel 원장에 3행 append.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@bae080311 bae080311 changed the title fix: 하네스 점검에서 나온 측정 버그 2건 fix: 하네스 측정 버그 수정 + 코드 리뷰 지적 11건 반영 Sep 9, 2026
@bae080311

Copy link
Copy Markdown
Owner Author

코드 리뷰 반영 (11건 전부)

첫 커밋이 "측정 버그를 고쳤다"고 했지만 세 가지가 틀렸습니다. 리뷰가 실측으로 잡아냈습니다.

# 지적 처리
1 벤치 grep 이 실측 테이블을 전부 버려 Benchmark 섹션에 측정값이 없었다 tail -24 로 교체
2 fallback 을 치환 밖으로 빼서 set -e 가 대입에서 스크립트를 죽였다 (도달 불가 + 조용한 중단) 제거 + ERR trap
3 head -20 SIGPIPE 로 성공 경로에서도 죽을 수 있었다 파이프라인 축소로 소멸
4 coverage.include.tsx 를 놓쳐 Section.tsx 가 리포트에 없었다 *.{ts,tsx}, 43.17% → 42.24%
5 중복 원인이 진행상황 재렌더가 아니라 --reporter=verbose 였다 플래그 제거, awk 불필요
6 CLAUDE.md「공통 규칙」위반 — 자동화 변경에 검증 없음 + 조용한 실패 도입 ERR trap + 회귀 테스트 8케이스
7 벤치 제외를 디렉터리 이름으로 걸어 __bench__ 밖 파일은 다시 0% vitest 벤치 패턴 기준으로
8 ANSI 를 bench 에만 껐고 커버리지 실패 경로는 여전히 컬러 스크립트 전체 export
9 sed ANSI 제거가 죽은 코드 제거
10 flywheel 원장 append 누락 3행 추가 (#3 의 3회째)
11 awk 전역 dedupe 가 정상 중복 라인을 삭제 근본 원인 제거로 불필요

검증

NO_COLOR=1 FORCE_COLOR=0 pnpm bench | tail -24
     name                                    hz     min     max ...
   · getActiveId                   51,083,962.77  0.0000  0.0333 ...
   · getSections                   20,655,291.93  0.0000  0.1499 ...

ANSI 포함 줄 0개, 실측값 통과. 커버리지 All files 42.24% (Section.tsx 0% 노출).
bash .claude/scripts/post-pr-coverage.test.sh 8/8 통과.

위쪽 훅 코멘트는 PR 생성 시점의 것입니다 — 훅은 gh pr create 에만 발동하므로 이 수정의 결과는 다음 PR 코멘트에서 보입니다.

🤖 Generated with Claude Code

@bae080311

Copy link
Copy Markdown
Owner Author

🧪 Test Coverage

-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   42.24 |    32.81 |   36.28 |   43.37 |                   
 core/src          |   55.95 |    39.06 |   68.33 |   57.96 |                   
  ScrollManager.ts |   55.95 |    39.06 |   68.33 |   57.96 | ...10-539,552,566 
 react/src         |      10 |        0 |       0 |      10 |                   
  ...onContext.tsx |   23.07 |        0 |       0 |   23.07 | 27-37,41-45       
  Section.tsx      |       0 |        0 |       0 |       0 | 12-33             
  ...ollSection.ts |     7.4 |        0 |       0 |     7.4 | 7-36,45-53        
 svelte/src        |    2.85 |        0 |       0 |    3.12 |                   
  ...ollSection.ts |    2.85 |        0 |       0 |    3.12 | 12-85             
 vue/src           |    4.65 |        0 |       0 |    4.76 |                   
  ...ollSection.ts |    4.65 |        0 |       0 |    4.76 | 17-93,106-113     
-------------------|---------|----------|---------|---------|-------------------

📦 Bundle Size

파일 크기 gzip
packages/core/dist/index.js 11.2 KB 3.5 KB
packages/react/dist/index.js 2.2 KB 1.0 KB
packages/svelte/dist/index.js 1.3 KB 0.6 KB
packages/vue/dist/index.js 1.5 KB 0.7 KB
packages/core/dist/index.mjs 11.2 KB 3.5 KB
packages/react/dist/index.mjs 2.1 KB 0.9 KB
packages/svelte/dist/index.mjs 1.2 KB 0.6 KB
packages/vue/dist/index.mjs 1.5 KB 0.7 KB

⚡ Benchmark

> jump-section@1.0.0 bench /Users/bae/jump-section
> vitest bench --run

Benchmarking is an experimental feature.
Breaking changes might not follow SemVer, please pin Vitest's version when using it.

 RUN  v4.0.16 /Users/bae/jump-section


 ✓ packages/core/src/__bench__/ScrollManager.bench.ts > ScrollManager 벤치마크 11642ms
     name                                               hz     min     max    mean     p75     p99    p995    p999     rme   samples
   · registerSection + unregisterSection      1,786,617.40  0.0004  2.6591  0.0006  0.0005  0.0009  0.0012  0.0018  ±1.06%    893309
   · getSections                             20,496,252.77  0.0000  3.0722  0.0000  0.0000  0.0001  0.0001  0.0002  ±1.22%  10248127
   · getActiveId                             51,091,344.98  0.0000  0.0222  0.0000  0.0000  0.0000  0.0000  0.0000  ±0.06%  25545673
   · onActiveChange (subscribe/unsubscribe)  13,840,217.39  0.0000  3.5294  0.0001  0.0001  0.0002  0.0008  0.0013  ±3.25%   6920109
   · disableSection + enableSection           1,721,153.94  0.0005  0.1252  0.0006  0.0006  0.0009  0.0011  0.0022  ±0.17%    860577

 BENCH  Summary

  getActiveId - packages/core/src/__bench__/ScrollManager.bench.ts > ScrollManager 벤치마크
    2.49x faster than getSections
    3.69x faster than onActiveChange (subscribe/unsubscribe)
    28.60x faster than registerSection + unregisterSection
    29.68x faster than disableSection + enableSection

🤖 Generated by jump-section AI Pipeline

@bae080311
bae080311 merged commit 5020359 into main Sep 10, 2026
3 checks passed
@bae080311
bae080311 deleted the fix/harness-audit branch September 10, 2026 02:20
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