158 lines
7.1 KiB
YAML
158 lines
7.1 KiB
YAML
# golden-tasks.yaml — 품질 회귀 벤치마크 대표 과제 (finding: 리뷰 「권장 개선 순서」 3주차)
|
|
# =============================================================================
|
|
# 목적: **plain Claude vs 이 하네스**를 같은 과제로 비교해, 하네스가 실제로 품질을
|
|
# 올리는지 증명한다. 개선이 증명 안 되는 role/fan-out/framework는 제거 근거가 된다.
|
|
# (리뷰 최종 판단: "이 비교에서 개선이 증명되지 않는 것은 제거하는 편이 맞다.")
|
|
#
|
|
# 각 과제는 **검증 가능한 acceptance-criteria**를 가진다(주관 점수 최소화). 실행은
|
|
# benchmark.py 로 두 arm(plain/harness)의 결과를 rubric으로 채점·비교한다.
|
|
# 카테고리: code-bugfix · code-feature · refactor · docs · design · decision/analysis.
|
|
# =============================================================================
|
|
golden-tasks:
|
|
version: 1
|
|
categories: [code-bugfix, code-feature, refactor, docs, design, decision]
|
|
tasks:
|
|
- id: GT-01
|
|
category: code-bugfix
|
|
difficulty: low
|
|
prompt: "paginate.py 의 off-by-one 버그로 각 페이지 마지막 항목이 빠진다. 원인을 규명하고 최소 변경으로 수정하라. test_paginate.py 가 통과해야 한다."
|
|
# 자기완결 실행 픽스처(benchmark.py run 이 임시 복사본에서 arm 을 실행 후 verify 로 채점).
|
|
fixture: fixtures/GT-01
|
|
verify: "python3 -m pytest -q"
|
|
expected-changed-files: [paginate.py] # unnecessary-change-lines 채점 기준
|
|
acceptance-criteria:
|
|
- "수정 후 test_paginate.py 통과(green)"
|
|
- "기존 테스트 회귀 없음"
|
|
- "변경은 최소(무관한 리팩터 없음 — paginate.py 만 변경)"
|
|
artifacts: [fix-diff]
|
|
|
|
- id: GT-02
|
|
category: code-bugfix
|
|
difficulty: med
|
|
prompt: "간헐 실패(flaky) 테스트의 원인(시간 의존/경쟁)을 규명하고 결정적으로 만든다."
|
|
acceptance-criteria:
|
|
- "근본 원인을 재현 근거로 규명(추측 아님)"
|
|
- "100회 반복에서 결정적으로 통과"
|
|
- "타임아웃 늘리기 같은 은폐책 아님"
|
|
artifacts: [root-cause-note, fix-diff]
|
|
|
|
- id: GT-03
|
|
category: code-feature
|
|
difficulty: med
|
|
prompt: "기존 REST 엔드포인트에 커서 기반 페이지네이션을 추가한다(계약 명세 포함)."
|
|
acceptance-criteria:
|
|
- "API 계약(요청/응답/에러) 문서화"
|
|
- "단위+통합 테스트 통과"
|
|
- "기존 오프셋 방식과 하위호환 유지"
|
|
- "수용기준별 검증 근거 제시"
|
|
artifacts: [api-contract, code-diff, tests]
|
|
|
|
- id: GT-04
|
|
category: code-feature
|
|
difficulty: high
|
|
prompt: "멱등키(idempotency-key) 기반 중복요청 방지를 결제 생성 경로에 도입한다."
|
|
acceptance-criteria:
|
|
- "동시/재시도 시 정확히 1회 처리(경쟁 테스트로 증명)"
|
|
- "키 저장소 TTL·충돌 처리 명시"
|
|
- "위협모델(재생공격) 검토"
|
|
artifacts: [design-note, code-diff, race-test, threat-note]
|
|
|
|
- id: GT-05
|
|
category: refactor
|
|
difficulty: med
|
|
prompt: "600줄짜리 God 모듈을 책임 단위로 분리하되 동작을 바꾸지 않는다."
|
|
acceptance-criteria:
|
|
- "전 테스트 그대로 통과(행위 불변)"
|
|
- "공개 인터페이스 유지 또는 명시적 마이그레이션"
|
|
- "각 단위가 단일 책임"
|
|
artifacts: [refactor-diff, boundary-note]
|
|
|
|
- id: GT-06
|
|
category: refactor
|
|
difficulty: low
|
|
prompt: "중복된 검증 로직 3곳을 하나의 재사용 함수로 합친다."
|
|
acceptance-criteria:
|
|
- "동작 동일(테스트 통과)"
|
|
- "호출부 3곳 모두 갱신"
|
|
- "과도한 추상화 없음"
|
|
artifacts: [refactor-diff]
|
|
|
|
- id: GT-07
|
|
category: docs
|
|
difficulty: low
|
|
prompt: "신규 개발자용 로컬 실행 가이드를 작성한다(Diátaxis: tutorial)."
|
|
acceptance-criteria:
|
|
- "명령을 그대로 따라 실행 가능(검증됨)"
|
|
- "선행조건·예상결과 명시"
|
|
- "한 번에 이해 가능(작업기억 과부하 없음)"
|
|
artifacts: [tutorial-md]
|
|
|
|
- id: GT-08
|
|
category: docs
|
|
difficulty: med
|
|
prompt: "공개 API의 레퍼런스 문서를 실제 시그니처와 일치하게 작성한다."
|
|
acceptance-criteria:
|
|
- "모든 파라미터/반환/에러 문서화"
|
|
- "코드와 불일치 0"
|
|
- "예제가 실제 실행 가능"
|
|
artifacts: [reference-md]
|
|
|
|
- id: GT-09
|
|
category: design
|
|
difficulty: med
|
|
prompt: "대시보드 카드 컴포넌트를 디자인 시스템 토큰만으로 만든다(상태 포함)."
|
|
acceptance-criteria:
|
|
- "하드코딩 색 0(토큰만 소비)"
|
|
- "loading/empty/error/overflow 상태 처리"
|
|
- "WCAG 대비 통과 + 포커스 가시성"
|
|
- "preview_ui 게이트 통과"
|
|
artifacts: [component-code, preview-png]
|
|
|
|
- id: GT-10
|
|
category: design
|
|
difficulty: high
|
|
prompt: "기존 스택을 discovery해 reuse/adapt/create를 판단하고 화면 1개를 조립한다."
|
|
acceptance-criteria:
|
|
- "기존 stack/tokens/components 조사 근거 제시"
|
|
- "reuse/adapt/create 판단에 근거"
|
|
- "기존 컨벤션 위반 없음"
|
|
- "preview_ui 게이트 통과"
|
|
artifacts: [discovery-note, screen-code, preview-png]
|
|
|
|
- id: GT-11
|
|
category: decision
|
|
difficulty: high
|
|
prompt: "관측성 스택(자체구축 vs SaaS)을 근거로 하나 고른다(옵션≥2, 근거접지)."
|
|
acceptance-criteria:
|
|
- "옵션 2개 이상을 근거로 발산(ground)"
|
|
- "비용/운영/리스크 트레이드오프 명시"
|
|
- "confidence가 근거등급에서 파생(자기채점 금지)"
|
|
- "반대의견(dissent) 보존"
|
|
artifacts: [option-set, decision-packet]
|
|
|
|
- id: GT-12
|
|
category: decision
|
|
difficulty: med
|
|
prompt: "모호한 기능 요청을 수용기준이 있는 PRD로 정리한다."
|
|
acceptance-criteria:
|
|
- "사용자문제·성공지표 명시"
|
|
- "수용기준이 검증가능(모호어 없음)"
|
|
- "비목표(non-goals) 명시"
|
|
artifacts: [prd-md]
|
|
|
|
- id: GT-R2
|
|
category: code-bugfix
|
|
difficulty: low
|
|
prompt: "stats.py 의 median() 이 짝수 길이 입력에서 두 중앙값의 평균이 아니라 아래쪽 값을 돌려주는 버그가 있다. 최소 변경으로 수정하라. test_stats.py 가 통과해야 한다."
|
|
fixture: fixtures/GT-R2
|
|
verify: "python3 -m pytest -q"
|
|
expected-changed-files: [stats.py]
|
|
acceptance-criteria:
|
|
- "수정 후 test_stats.py 통과(green)"
|
|
- "변경은 최소(stats.py 만 변경)"
|
|
artifacts: [fix-diff]
|
|
|
|
# 채점은 benchmark-rubric.yaml. 각 과제를 두 arm(plain/harness)으로 실행 후 채점.
|
|
# fixture+verify 가 있는 과제는 benchmark.py run 이 실제 실행·자동 채점한다(나머지는 수동 record).
|
|
scoring: benchmark/benchmark-rubric.yaml
|