Skip to content

Commit 5c2b8f9

Browse files
authored
Merge pull request #77 from qwerfunch/feat/v0.15.8-swe-bench-suite
feat: v0.15.8 — SWE-bench Verified A/B benchmark framework (F-173)
2 parents aa01aeb + a37d7c0 commit 5c2b8f9

19 files changed

Lines changed: 1392 additions & 6 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"name": "harness-boot",
1212
"description": "Multi-agent development harness for Claude Code. Your AI has speed; we give it direction — through living specs and focused specialist agents.",
1313
"source": "./",
14-
"version": "0.15.7",
14+
"version": "0.15.8",
1515
"homepage": "https://github.com/qwerfunch/harness-boot",
1616
"category": "development"
1717
}

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "harness-boot",
3-
"version": "0.15.7",
3+
"version": "0.15.8",
44
"description": "Multi-agent development harness for Claude Code. Your AI has speed; we give it direction — through living specs and focused specialist agents.",
55
"author": {
66
"name": "qwerfunch"

.harness/spec.archive.yaml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6081,3 +6081,44 @@ features:
60816081
`commands/token.md` short note explaining manual self-report flow.
60826082
Slash-command UX stays out of scope (TS CLI surface only; hook
60836083
automation is a follow-up)."
6084+
- id: F-173
6085+
description: |-
6086+
Direct response to "어떤 benchmark 로 객관 평가" — user picked
6087+
SWE-bench Verified 20-task subset (option A). This feature
6088+
lands the suite framework, not the run results: the
6089+
methodology, task selection criteria, reproduction scripts,
6090+
and a fillable REPORT.md skeleton. Running the actual 20
6091+
tasks (each Docker-isolated, $30-200 of model calls, hours of
6092+
wall time) is a follow-up the maintainer executes offline;
6093+
the artifact is the framework that makes the comparison
6094+
reproducible by anyone.
6095+
6096+
Output lives in `docs/benchmark/swe-bench-verified/` (tracked
6097+
so README.md can link to it for the marketing axis the user
6098+
mentioned).
6099+
acceptance_criteria:
6100+
- "AC-1: `docs/benchmark/swe-bench-verified/` directory exists with
6101+
README.md (methodology + harness fit + limits), REPORT.md (results
6102+
skeleton), tasks.json (20-task selection with criteria),
6103+
scripts/{run-vanilla.sh, run-harness.sh, aggregate.py, setup.md},
6104+
analysis/threats-to-validity.md."
6105+
- "AC-2: README.md documents the 4 measurement axes (resolve-rate · token
6106+
consumption · code quality · wall time), the harness-side capture path
6107+
(`harness token`), and the vanilla-side capture path (Claude Code
6108+
`/cost` manual log)."
6109+
- "AC-3: tasks.json carries selection rationale per pick (repo diversity,
6110+
difficulty mix, harness-fit axis). 20 task rows with task_id + repo +
6111+
base_commit + brief summary."
6112+
- "AC-4: Per-task result schema is a documented JSON shape (task_id,
6113+
approach=vanilla|harness, resolved, tokens_in, tokens_out,
6114+
wall_time_sec, attempts, code_loc, tests_added, tests_passed,
6115+
harness_drift_catches, harness_evidence_kinds, notes). Both run scripts
6116+
emit this schema."
6117+
- "AC-5: threats-to-validity.md spells out the limits — single model,
6118+
single author (Claude), benchmark contamination risk, harness-fit bias
6119+
per task, single-time confounder."
6120+
- "AC-6: A repro path verifiable without running tasks — the
6121+
scripts/setup.md walks a user through Docker setup, model config, output
6122+
collection, and aggregation. Smoke check: `bash
6123+
docs/benchmark/swe-bench-verified/scripts/aggregate.py --help` exits 0
6124+
with usage."

.harness/spec.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2017,6 +2017,17 @@ features:
20172017
test_strategy: tdd
20182018
digest: Direct response to the v0.15.6 post-release verification gap. The user's
20192019
real question — "harness vs 그냥 Claude — 작업 퀄...
2020+
- id: F-173
2021+
name: SWE-bench Verified A/B benchmark suite — methodology + scripts + report
2022+
skeleton
2023+
type: docs
2024+
status: planned
2025+
release_target: v0.15.8
2026+
modules:
2027+
- docs_benchmark
2028+
test_strategy: smoke
2029+
digest: Direct response to "어떤 benchmark 로 객관 평가" — user picked SWE-bench
2030+
Verified 20-task subset (option A). This feature la...
20202031
goals: []
20212032
constraints:
20222033
tech_stack:

.harness/state.yaml

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3983,8 +3983,50 @@ features:
39833983
author: human
39843984
started_at: 2026-05-13T03:07:38Z
39853985
completed_at: 2026-05-13T03:07:39Z
3986+
- id: F-173
3987+
status: done
3988+
gates:
3989+
gate_0:
3990+
last_result: pass
3991+
ts: 2026-05-13T03:35:52Z
3992+
note: "cmd: npm test"
3993+
gate_1:
3994+
last_result: pass
3995+
ts: 2026-05-13T03:35:53Z
3996+
note: "cmd: npm run typecheck"
3997+
gate_2:
3998+
last_result: pass
3999+
ts: 2026-05-13T03:35:55Z
4000+
note: "cmd: npm run lint"
4001+
gate_5:
4002+
last_result: pass
4003+
ts: 2026-05-13T03:35:56Z
4004+
note: "cmd: bash self_check.sh"
4005+
evidence:
4006+
- ts: 2026-05-13T03:35:52Z
4007+
kind: gate_run
4008+
summary: "Gate gate_0 pass (1.8s) · cmd: npm test"
4009+
author: llm
4010+
- ts: 2026-05-13T03:35:53Z
4011+
kind: gate_run
4012+
summary: "Gate gate_1 pass (0.9s) · cmd: npm run typecheck"
4013+
author: llm
4014+
- ts: 2026-05-13T03:35:55Z
4015+
kind: gate_run
4016+
summary: "Gate gate_2 pass (1.5s) · cmd: npm run lint"
4017+
author: llm
4018+
- ts: 2026-05-13T03:35:56Z
4019+
kind: gate_run
4020+
summary: "Gate gate_5 pass (0.5s) · cmd: bash self_check.sh"
4021+
author: llm
4022+
- ts: 2026-05-13T03:35:56Z
4023+
kind: manual_check
4024+
summary: F-173 SWE-bench Verified A/B framework — docs/benchmark/swe-bench-verified/ 8 files re-applied on develop (v0.15.7 baseline · F-172 token CLI 활용) · aggregate.py --help smoke pass · 862/862 vitest · self_check 6/6
4025+
author: human
4026+
started_at: 2026-05-13T03:35:50Z
4027+
completed_at: 2026-05-13T03:36:13Z
39864028
session:
39874029
started_at: 2026-04-23T13:02:49Z
3988-
last_command: /harness:work F-172
4030+
last_command: /harness:work F-173
39894031
last_gate_passed: gate_5
39904032
active_feature_id: null

CHANGELOG.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,56 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versio
1111

1212
### Queued
1313

14+
## [0.15.8] — 2026-05-13
15+
16+
**SWE-bench Verified A/B benchmark framework.** Direct response to
17+
the user question "어떤 benchmark 로 객관 평가". This release lands
18+
the *framework* (methodology · 20-task selection · reproduction
19+
scripts · result schema · honest limits doc) for a side-by-side
20+
comparison of harness-boot against vanilla Claude Code. The actual
21+
20-task runs are external (Docker-per-task, hours of wall time,
22+
$30-200 model cost) and the maintainer fills `REPORT.md`
23+
incrementally as data arrives.
24+
25+
Builds on v0.15.7's F-172 token tracking — the harness-side run
26+
script (`scripts/run-harness.sh`) calls `harness token` to capture
27+
per-cycle LLM usage that aggregates into REPORT.md's token columns.
28+
29+
### Added
30+
31+
- **F-173**`docs/benchmark/swe-bench-verified/` directory
32+
(tracked so the project README can link to it for the marketing
33+
axis the user mentioned):
34+
- `README.md` — methodology (why SWE-bench Verified · 4
35+
measurement axes · 5 known limits).
36+
- `tasks.json` — 20-task selection across 9 repos (django ·
37+
sympy · scikit-learn · matplotlib · sphinx · pytest · requests
38+
· flask · pylint · astropy · pandas · xarray) with explicit
39+
selection criteria (difficulty mix · harness-fit mix · task
40+
type mix).
41+
- `REPORT.md` — skeleton tables (§2 per-task · §2.2 aggregate ·
42+
§2.3 harness-only signals · §3 by harness-fit slice). Cells
43+
start as `` and fill as runs complete.
44+
- `scripts/run-vanilla.sh` — Claude Code vanilla side runner.
45+
- `scripts/run-harness.sh` — harness-boot side runner (uses
46+
`harness token` from F-172).
47+
- `scripts/aggregate.py` — per-task JSON → REPORT.md tables.
48+
`--help` smoke-tested.
49+
- `scripts/setup.md` — end-to-end external setup walkthrough.
50+
- `analysis/threats-to-validity.md` — construct · internal ·
51+
external · conclusion validity. Spells out single-model /
52+
single-author / benchmark-contamination / weak-N caveats so
53+
null results stay honest (BR-014).
54+
55+
### Follow-up (not in this release)
56+
57+
- Pilot run (5 tasks) — maintainer fills REPORT.md row by row.
58+
- Full 20-task run.
59+
- Hook automation for token capture (F-172 follow-up) — removes
60+
the manual `/cost` input requirement during vanilla runs.
61+
- Multi-author run via external dogfood (logcat-on, cosmic-suika)
62+
to address the single-author validity threat.
63+
1464
## [0.15.7] — 2026-05-13
1565

1666
**LLM token tracking infrastructure.** The v0.15.6 verification cycle

README.ko.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
Claude Code 위에서 도는 multi-agent 개발 하네스. 다른 AI 도구가 *능력* 을 더할 때, harness-boot 는 *방향* 을 만듭니다.
88

9-
[![plugin](https://img.shields.io/badge/plugin-v0.15.7-blue)](.claude-plugin/plugin.json)
9+
[![plugin](https://img.shields.io/badge/plugin-v0.15.8-blue)](.claude-plugin/plugin.json)
1010
[![tests](https://img.shields.io/badge/tests-862%20passing-brightgreen)](tests/parity)
1111
[![license](https://img.shields.io/badge/license-MIT-lightgrey)](LICENSE)
1212

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
77
harness-boot is a multi-agent development harness for Claude Code. Where most AI tools add *capability*, we add *focus*.
88

9-
[![plugin](https://img.shields.io/badge/plugin-v0.15.7-blue)](.claude-plugin/plugin.json)
9+
[![plugin](https://img.shields.io/badge/plugin-v0.15.8-blue)](.claude-plugin/plugin.json)
1010
[![tests](https://img.shields.io/badge/tests-862%20passing-brightgreen)](tests/parity)
1111
[![license](https://img.shields.io/badge/license-MIT-lightgrey)](LICENSE)
1212

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
# SWE-bench Verified A/B benchmark — harness-boot vs vanilla Claude Code
2+
3+
> Object: **객관적으로 측정** — 같은 task 를 (a) 그냥 Claude Code 와 (b) harness-boot 로 풀었을 때, 결과물 퀄리티 / 토큰 소비 / 목표 달성률에 정량적 차이가 있는가?
4+
5+
이 디렉터리는 **재현 가능한 비교 framework** 입니다. 실측 데이터는 `REPORT.md` 에 누적됩니다.
6+
7+
---
8+
9+
## 1. 왜 SWE-bench Verified?
10+
11+
| 기준 | SWE-bench Verified | 다른 후보 |
12+
|---|---|---|
13+
| 권위 | Anthropic / Princeton 이 표준으로 사용 — 모든 frontier model 의 비교 baseline | HumanEval (단순 함수, contamination) · MBPP (구식) · Aider polyglot (단일 언어 X) |
14+
| 현실성 | 실제 GitHub repo 의 issue → PR. multi-file fix. test 통과 여부로 자동 채점 | LiveCodeBench (월별 갱신 noise) · TAU-bench (도메인 한정) |
15+
| harness fit | **multi-step agentic + AC 명시 가능 + repo-level → harness 의 가치 axis 모두 발현** | HumanEval 류는 single function 이라 harness overhead 가 정량 패배 |
16+
| 외부 인용 가능 | Anthropic / OpenAI / Google 모두 인용 — README marketing 가치 | 자체 benchmark 는 외부 검증 X |
17+
18+
**500 → 20 task 축소 근거**: full run 은 task 당 $1-10 × 모델 × 양쪽 = $40+ × 500 = $20,000 비현실적. 20 task subset 으로 first-order signal 확보 후 결과에 따라 확장.
19+
20+
`tasks.json` 의 20 pick 은 repo 다양성 (django · sympy · flask · pandas · matplotlib · sphinx · scikit-learn · pytest · pylint · requests 등) + difficulty 분포 (hard 4 · medium 12 · easy 4) + harness-fit axis (single-fix vs multi-step) 의 mix.
21+
22+
---
23+
24+
## 2. 측정 4 axis
25+
26+
각 task 의 양쪽 시도 (vanilla · harness) 결과를 `results/<approach>/<task_id>.json` 에 기록. schema:
27+
28+
```json
29+
{
30+
"task_id": "django__django-13551",
31+
"approach": "vanilla" | "harness",
32+
"resolved": true, // SWE-bench test harness 가 PASS 판정
33+
"tokens_input": 123456, // 누적 input token (vanilla: /cost 수기, harness: `harness token` 자동)
34+
"tokens_output": 7890,
35+
"wall_time_sec": 720,
36+
"attempts": 1, // 같은 task 재시도 횟수
37+
"code_loc": 45, // patch 의 +line - -line
38+
"tests_added": 3, // 새로 작성한 test 수
39+
"tests_passed": "all" | "partial" | "none",
40+
"harness_drift_catches": 0, // harness only: 15-detector 가 잡은 issue 수
41+
"harness_evidence_kinds": ["manual_check", "test", "..."], // harness only
42+
"notes": "..." // 정성적 관찰
43+
}
44+
```
45+
46+
집계 (`scripts/aggregate.py`):
47+
- **Resolve rate** = `Σ(resolved == true) / N`
48+
- **Mean tokens per task** = input + output 합산 평균
49+
- **Mean wall time per task** = sec 평균
50+
- **Per-task delta** = harness − vanilla 의 분포
51+
52+
---
53+
54+
## 3. 비교 절차 (재현)
55+
56+
자세한 단계는 `scripts/setup.md`. 요약:
57+
58+
```bash
59+
# 1) SWE-bench 환경 셋업 (한 번만)
60+
git clone https://github.com/princeton-nlp/SWE-bench.git
61+
cd SWE-bench
62+
pip install -e .
63+
64+
# 2) 20 task subset 추출
65+
python scripts/pick_subset.py --tasks docs/benchmark/swe-bench-verified/tasks.json
66+
67+
# 3) vanilla 시도 (모든 task 순회)
68+
bash docs/benchmark/swe-bench-verified/scripts/run-vanilla.sh
69+
70+
# 4) harness 시도 (모든 task 순회)
71+
bash docs/benchmark/swe-bench-verified/scripts/run-harness.sh
72+
73+
# 5) 집계 + REPORT.md 갱신
74+
python docs/benchmark/swe-bench-verified/scripts/aggregate.py
75+
```
76+
77+
vanilla 와 harness 의 토큰 측정:
78+
- **vanilla**: Claude Code 의 `/cost` 명령을 매 task 직후 호출, 누적값을 result JSON 에 수기 입력
79+
- **harness**: `harness token --in X --out Y --model M --feature F-N` 으로 자동 기록 (F-172 의 인프라)
80+
81+
---
82+
83+
## 4. harness 가 정확히 어떻게 다른가 (가설)
84+
85+
이 비교가 noise 가 아닌 signal 을 잡으려면 가설이 명확해야:
86+
87+
| 가설 | 측정 방법 | 예상 |
88+
|---|---|---|
89+
| harness 는 **AC 미커버 task** 에서 vanilla 보다 더 자주 resolve | `tests_passed == "all"` 비율 | harness +5~15% |
90+
| harness 는 **drift 패턴 (e.g. README 와 code 불일치)** 을 자동 catch | `harness_drift_catches > 0` 인 task 수 | harness 가 vanilla 보다 0~3 건 더 |
91+
| harness 는 **multi-step task** 에서 token 단축 (자동 sync · ceremony 가 manual prompt 절감) | `tokens_input + tokens_output` 평균 | harness −10~30% |
92+
| harness 는 **single-fix task** 에서 token 증가 (boilerplate overhead) | 같은 axis | harness +10~30% |
93+
| harness 는 **resolve rate 자체는 비슷** (모델은 같으니까) | resolve rate | ±0~5% |
94+
95+
→ 결과가 가설과 다르면 그게 더 가치 있는 발견. **null result 도 정직하게 기록**.
96+
97+
---
98+
99+
## 5. 정직한 한계
100+
101+
- **Single model · single author** (Claude). vanilla 와 harness 양쪽 동일 모델 사용. 사람 user 의 prompt 차이는 confounder.
102+
- **Single time**. v0.15.7 시점 plugin · 특정 모델 release 시점.
103+
- **Benchmark contamination**. SWE-bench Verified 의 일부 task 는 training data 에 포함됐을 가능성. resolve rate 자체를 절대값으로 신뢰 X — 두 approach 간 **상대 차이** 가 중요.
104+
- **20 task subset**. 500 의 4%. statistical power 약함. p-value 보다는 effect size 의 magnitude 관찰.
105+
- **harness fit per task**. AC 가 명확한 task 는 harness 우위, 단순 typo fix 는 harness overhead. task selection 의 mix 자체가 결과에 영향.
106+
107+
자세한 분석: `analysis/threats-to-validity.md`.
108+
109+
---
110+
111+
## 6. 산출물 라이프사이클
112+
113+
1. **Framework (이 PR)** — 폴더 / 방법론 / 스크립트 / skeleton — landed v0.15.8
114+
2. **Pilot run (5 task)** — maintainer 가 외부 환경에서 실측, REPORT.md 의 일부 row 채움
115+
3. **Full run (20 task)** — pilot 결과 보고 확장. 별도 cycle.
116+
4. **README link** — 결과 안정화되면 project root `README.md` 의 "Status" / "Built with" 근처에 link 추가
117+
118+
---
119+
120+
## 7. 디렉터리 구조
121+
122+
```
123+
docs/benchmark/swe-bench-verified/
124+
├── README.md # 이 파일 — 방법론 + 한계
125+
├── REPORT.md # 결과 누적 (실측 후 채움)
126+
├── tasks.json # 20-task selection + 근거
127+
├── results/
128+
│ ├── vanilla/<task_id>.json
129+
│ └── harness/<task_id>.json
130+
├── scripts/
131+
│ ├── run-vanilla.sh
132+
│ ├── run-harness.sh
133+
│ ├── aggregate.py
134+
│ └── setup.md
135+
└── analysis/
136+
└── threats-to-validity.md
137+
```
138+
139+
---
140+
141+
## 8. 인용
142+
143+
이 benchmark suite 의 데이터를 인용할 때:
144+
145+
```
146+
harness-boot SWE-bench Verified A/B (v0.15.8+)
147+
https://github.com/qwerfunch/harness-boot/tree/main/docs/benchmark/swe-bench-verified
148+
```
149+
150+
비교 대상이 vanilla Claude Code 가 아닌 다른 도구라면 fork 후 새 디렉터리로 분기 권장.

0 commit comments

Comments
 (0)