@uzysjung/agent-harness 26.112.0 → 26.114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +14 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/rules/benchmark-parity.md +19 -2
- package/templates/skills/deep-research/SKILL.md +24 -0
- package/templates/skills/eval-harness/SKILL.md +40 -13
- package/templates/skills/model-orchestration/SKILL.md +14 -0
- package/templates/skills/verification-loop/SKILL.md +38 -6
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uzysjung/agent-harness",
|
|
3
|
-
"version": "26.
|
|
3
|
+
"version": "26.114.0",
|
|
4
4
|
"description": "Curate vetted AI-coding skills & plugins by your tech stack — install only what you need, across Claude Code, Codex, OpenCode & Antigravity",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# Benchmark Parity (벤치마크 핵심 기능 완결성)
|
|
2
2
|
|
|
3
3
|
레퍼런스 제품(벤치마크)을 실측해 핵심 기능을 도출하고, 자체 구현이 **올바르게 + 필요한 항목 전부**
|
|
4
|
-
갖췄는지 반복 검토·발전시키는 워크플로우.
|
|
4
|
+
갖췄는지 반복 검토·발전시키는 워크플로우. **기준선은 레퍼런스 또는 자기 배포본**(후자 = Dogfood
|
|
5
|
+
pass) — 비교 대상이 다를 뿐 산출물(gap.md)과 규율은 같다. 실서비스 운영(레퍼런스 audit 20회 내외 실행)에서 검증된
|
|
5
6
|
관행의 일반화. 목표는 **모방이 아니라 핵심 기능 완결성** — NORTH_STAR 핵심 경쟁력에 기여하지 않는
|
|
6
7
|
단순 모방은 deferred (Will/Won't).
|
|
7
8
|
|
|
@@ -48,13 +49,29 @@ SSOT — 없으면 갭 판정 기준 자체가 없다.
|
|
|
48
49
|
- **증거 = file:line + capture 참조.** 증거 없는 행은 갭이 아니라 추정이다 (기재 금지).
|
|
49
50
|
- 선택 확장 열: Effort(S/M/L) · 벤치마크 구분(내부 버그 vs divergence).
|
|
50
51
|
|
|
52
|
+
## Dogfood pass (배포본 전수 walkthrough)
|
|
53
|
+
|
|
54
|
+
벤치마크 비교가 "남과 비교"라면, dogfood 는 **배포된 자기 서비스를 사용자처럼 끝까지 써보는
|
|
55
|
+
것**이다. 둘은 기준선이 다를 뿐 산출물은 같다 — **새 스키마를 만들지 말고 위 gap.md 표를 그대로
|
|
56
|
+
쓴다** (증거 열에 capture/영상 경로).
|
|
57
|
+
|
|
58
|
+
- **대상 = 배포본**(로컬 dev 아님). 로그인 상태로 전 메뉴를 실제로 눌러본다.
|
|
59
|
+
- **범위를 먼저 적는다** — "전체 서비스 / 주요 메뉴 N개" 처럼. 범위 미기재 보고는 커버리지를
|
|
60
|
+
부풀린다.
|
|
61
|
+
- **심각도 롤업을 머리에 둔다**: `CRITICAL n · HIGH n · MEDIUM n · LOW n · 합계 n`. 개별 행만
|
|
62
|
+
나열하면 "얼마나 나쁜가"가 안 보인다.
|
|
63
|
+
- **재현 아티팩트 필수** — 이슈마다 스크린샷/영상 경로. 없으면 증거 없는 행과 같다.
|
|
64
|
+
- **게이트**: CRITICAL 0 이어야 dogfood 통과. HIGH 는 사유를 적고 사용자 판단으로 넘긴다.
|
|
65
|
+
(아래 "자율 루프 완료조건"의 `CRITICAL/HIGH 전부 [x]` 와 다른 게이트다 — 이쪽은 **패스 통과**
|
|
66
|
+
기준, 저쪽은 **루프 종료** 기준. 루프를 끝내려면 HIGH 까지 닫아야 한다.)
|
|
67
|
+
|
|
51
68
|
## PR 의무 필드 (UI/UX 변경 PR)
|
|
52
69
|
|
|
53
70
|
UI/UX 에 영향하는 PR 의 description 에 다음 섹션 필수:
|
|
54
71
|
|
|
55
72
|
```markdown
|
|
56
73
|
## Fidelity (benchmark parity)
|
|
57
|
-
- Benchmark: <벤치마크명>
|
|
74
|
+
- Benchmark: <벤치마크명> (dogfood 발 PR 이면 `dogfood — 자기 배포본`)
|
|
58
75
|
- Capture: docs/research/<area>_audit_<sprint>/<file>.png
|
|
59
76
|
- 갭 매트릭스: docs/research/<area>_audit_<sprint>/gap.md §X
|
|
60
77
|
```
|
|
@@ -112,11 +112,35 @@ Structure the report:
|
|
|
112
112
|
1. [Title](url) — [one-line summary]
|
|
113
113
|
2. ...
|
|
114
114
|
|
|
115
|
+
## Research Ledger — [N] confirmed · [M] killed
|
|
116
|
+
|
|
117
|
+
| Killed claim/direction | Why rejected | Source that killed it |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| [what you looked into] | [contradicting evidence / legal or licensing block / vendor-only claim] | [url] |
|
|
120
|
+
|
|
121
|
+
> **Caveats**: [which numbers are vendor-promotional or self-reported, which sources are
|
|
122
|
+
> preprints, which claims you could not verify verbatim and are therefore follow-up work]
|
|
123
|
+
|
|
115
124
|
## Methodology
|
|
116
125
|
Searched [N] queries across web and news. Analyzed [M] sources.
|
|
117
126
|
Sub-questions investigated: [list]
|
|
118
127
|
```
|
|
119
128
|
|
|
129
|
+
### The ledger is not optional
|
|
130
|
+
|
|
131
|
+
A report that lists only what survived hides the most reusable part of the work. Record it as
|
|
132
|
+
`N confirmed · M killed`, and for each killed item write **why** — contradicting evidence, a
|
|
133
|
+
legal block, or a claim that turned out to be vendor-promotional. Two things follow:
|
|
134
|
+
|
|
135
|
+
- **Nobody re-researches a dead end.** Next quarter the same idea resurfaces; the ledger answers
|
|
136
|
+
it in one line instead of another research cycle.
|
|
137
|
+
- **A kill count is evidence of rigor.** `22 confirmed · 0 killed` means you were collecting
|
|
138
|
+
support, not testing claims. Zero kills is a signal to re-examine, not a clean result.
|
|
139
|
+
|
|
140
|
+
The caveat block does the same job for what survived but is *weakly* sourced: vendor numbers with
|
|
141
|
+
no independent verification, preprints whose self-reported performance you cite architecture from
|
|
142
|
+
but not results, beta APIs. Naming them keeps a soft source from hardening into a fact downstream.
|
|
143
|
+
|
|
120
144
|
### Step 6: Deliver
|
|
121
145
|
|
|
122
146
|
- **Short topics**: Post the full report in chat
|
|
@@ -106,24 +106,51 @@ Risk Level: LOW/MEDIUM/HIGH
|
|
|
106
106
|
## Eval Workflow
|
|
107
107
|
|
|
108
108
|
### 1. Define (Before Coding)
|
|
109
|
-
```markdown
|
|
110
|
-
## EVAL DEFINITION: feature-xyz
|
|
111
109
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
110
|
+
Write the spec to a file (`.claude/evals/<feature>.md`) before implementing. Give every eval a
|
|
111
|
+
stable ID — `C1..Cn` for capability, `R1..Rn` for regression — so the same identifier carries
|
|
112
|
+
from definition to the post-implementation status line, and a reviewer can check them off one by
|
|
113
|
+
one. Prose-only lists ("Can create new user account") can't be referenced or scored.
|
|
116
114
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
115
|
+
````markdown
|
|
116
|
+
# EVAL: <feature name> (<phase/PR>)
|
|
117
|
+
|
|
118
|
+
**Feature**: <one line>
|
|
119
|
+
**Baseline**: commit <sha> # what "regression" is measured against
|
|
120
|
+
**Target**: pass@1 = 100% for capability evals
|
|
121
|
+
|
|
122
|
+
## Capability Evals
|
|
123
|
+
|
|
124
|
+
### C1: <name>
|
|
125
|
+
- <concrete, checkable expectation — inputs → expected output>
|
|
126
|
+
|
|
127
|
+
### C2: <name>
|
|
128
|
+
- <expectation>
|
|
121
129
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
130
|
+
## Regression Evals
|
|
131
|
+
|
|
132
|
+
### R1: <existing behavior that must not move>
|
|
133
|
+
- <expectation>
|
|
134
|
+
|
|
135
|
+
## Test Command
|
|
136
|
+
```bash
|
|
137
|
+
pytest tests/test_<area>.py -v -k "<selector>"
|
|
125
138
|
```
|
|
126
139
|
|
|
140
|
+
## Status (after implementation)
|
|
141
|
+
- C1-Cn: PASS via <tests (N개) / route check / manual>
|
|
142
|
+
- R1-Rn: PASS
|
|
143
|
+
|
|
144
|
+
**Overall: pass@1 = <x>%**
|
|
145
|
+
````
|
|
146
|
+
|
|
147
|
+
Two fields carry most of the weight. **Baseline commit** makes "regression" falsifiable — without
|
|
148
|
+
it, R-evals are opinions about the past. **Test Command** makes the spec re-runnable by someone
|
|
149
|
+
who didn't write it; an eval nobody can re-run is documentation, not a gate.
|
|
150
|
+
|
|
151
|
+
Fill the Status section *after* implementing, in the same file. A spec whose status is still empty
|
|
152
|
+
at merge time means the evals were written and never used.
|
|
153
|
+
|
|
127
154
|
### 2. Implement
|
|
128
155
|
Write code to pass the defined evals.
|
|
129
156
|
|
|
@@ -164,6 +164,19 @@ it. How that plays out per lane:
|
|
|
164
164
|
This pairs with, not replaces, deterministic gates (tests, typecheck, CI) — the verifier
|
|
165
165
|
judges what automation can't: spec fit, missed edge cases, design drift.
|
|
166
166
|
|
|
167
|
+
**Verdict vocabulary (fixed).** A verifier's report never ends in free prose — it ends with
|
|
168
|
+
exactly one verdict, `PASS` / `PASS_WITH_NITS` / `FAIL`, and every finding carries one
|
|
169
|
+
severity label, `CRITICAL` / `HIGH` / `MEDIUM` / `LOW` (full contract: the verification-loop
|
|
170
|
+
skill's Verdict Contract). Two consequences for orchestration:
|
|
171
|
+
|
|
172
|
+
- **FAIL closes only on re-verification.** Fix → re-verify is one cycle; if the same
|
|
173
|
+
reviewer will re-verify, keep it alive via SendMessage and *declare* that intent
|
|
174
|
+
(worker lifecycle) — otherwise spawn a fresh verifier.
|
|
175
|
+
- **PASS_WITH_NITS is not silent PASS.** Its LOW/MEDIUM findings come back to the
|
|
176
|
+
orchestrator as recorded follow-ups, not as buried prose — deciding their fate is an
|
|
177
|
+
orchestrator judgment call, never the verifier's. (The name says nits, but the tier it
|
|
178
|
+
covers is LOW **and** MEDIUM.)
|
|
179
|
+
|
|
167
180
|
## Orchestrator handoff (quota exhaustion)
|
|
168
181
|
|
|
169
182
|
When the top-tier orchestrator's quota runs out mid-project, **Opus @ `max` takes over
|
|
@@ -203,6 +216,7 @@ build on. Hand off manually:
|
|
|
203
216
|
→ 오케스트레이터(Fable) 직접
|
|
204
217
|
기획·스펙·계획 문서 작성·관리 / 핵심 구현 / V&V
|
|
205
218
|
→ opus @ xhigh (또는 max) — pinned role 또는 Workflow opts
|
|
219
|
+
V&V 판정 → PASS | PASS_WITH_NITS | FAIL + CRITICAL~LOW (verification-loop 계약)
|
|
206
220
|
반복 구현 / E2E 테스트 / 리서치 스윕
|
|
207
221
|
→ sonnet @ high 이상
|
|
208
222
|
결정적 변환 (rename·포맷) → 모델 위임 금지 — sed/grep/스크립트 직접
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: verification-loop
|
|
3
|
-
description: "A comprehensive verification system for Claude Code sessions."
|
|
3
|
+
description: "A comprehensive verification system for Claude Code sessions. Every run ends with a fixed verdict — PASS / PASS_WITH_NITS / FAIL — plus severity-labeled findings (CRITICAL/HIGH/MEDIUM/LOW)."
|
|
4
4
|
origin: ECC
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -26,7 +26,9 @@ npm run build 2>&1 | tail -20
|
|
|
26
26
|
pnpm build 2>&1 | tail -20
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
If build fails, STOP and fix
|
|
29
|
+
If build fails, STOP and fix — then re-verify from Phase 1 in a fresh instance. Continuing
|
|
30
|
+
through the remaining phases yourself would make you the verifier of code you just wrote,
|
|
31
|
+
which the Verdict Contract below forbids.
|
|
30
32
|
|
|
31
33
|
### Phase 2: Type Check
|
|
32
34
|
```bash
|
|
@@ -100,13 +102,43 @@ Tests: [PASS/FAIL] (X/Y passed, Z% coverage)
|
|
|
100
102
|
Security: [PASS/FAIL] (X issues)
|
|
101
103
|
Diff: [X files changed]
|
|
102
104
|
|
|
103
|
-
|
|
105
|
+
Verdict: PASS | PASS_WITH_NITS | FAIL
|
|
104
106
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
107
|
+
Findings:
|
|
108
|
+
| ID | Severity | Finding | Evidence (file:line / command output) |
|
|
109
|
+
|----|----------|---------|---------------------------------------|
|
|
110
|
+
| F1 | HIGH | ... | ... |
|
|
108
111
|
```
|
|
109
112
|
|
|
113
|
+
## Verdict Contract
|
|
114
|
+
|
|
115
|
+
The report ends with exactly one verdict. Free-prose closings ("looks ready", "should be
|
|
116
|
+
fine") are banned — they leave room to bury defects. A fixed vocabulary makes the report
|
|
117
|
+
honest and machine-checkable.
|
|
118
|
+
|
|
119
|
+
| Verdict | Meaning | Action |
|
|
120
|
+
|---------|---------|--------|
|
|
121
|
+
| **PASS** | All gates green, zero findings at any severity | Ship |
|
|
122
|
+
| **PASS_WITH_NITS** | Ship-safe: only LOW/MEDIUM findings, each recorded with a follow-up | Ship + log follow-ups |
|
|
123
|
+
| **FAIL** | Any gate red, or one or more CRITICAL/HIGH findings | Block → fix → **re-verify** |
|
|
124
|
+
|
|
125
|
+
Every finding gets exactly one severity:
|
|
126
|
+
|
|
127
|
+
- **CRITICAL** — data loss, security hole, or the change misbehaves in real use if shipped
|
|
128
|
+
- **HIGH** — main-path defect or regression; users will hit it
|
|
129
|
+
- **MEDIUM** — edge-case or quality defect; unlikely to block real use
|
|
130
|
+
- **LOW** — nit: style, naming, doc wording
|
|
131
|
+
|
|
132
|
+
Rules:
|
|
133
|
+
- Severity is judged by impact evidence, not by how easy the fix is.
|
|
134
|
+
- FAIL → fix → re-verify is one cycle. A fix alone never upgrades the verdict — the
|
|
135
|
+
re-verification must reproduce green.
|
|
136
|
+
- A run that aborts early (Phase 1 build failure) still emits a report: verdict **FAIL**
|
|
137
|
+
with the failing gate as a CRITICAL finding. Stopping to fix is how you *reach* the next
|
|
138
|
+
verdict, not a reason to skip issuing this one — an unreported run reads as "not run".
|
|
139
|
+
- The instance that wrote the change never issues its own verdict: verification runs in a
|
|
140
|
+
fresh instance (see the model-orchestration skill's V&V separation).
|
|
141
|
+
|
|
110
142
|
## Continuous Mode
|
|
111
143
|
|
|
112
144
|
For long sessions, run verification every 15 minutes or after major changes:
|