@uzysjung/agent-harness 26.113.0 → 26.115.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uzysjung/agent-harness",
3
- "version": "26.113.0",
3
+ "version": "26.115.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": {
@@ -17,7 +17,6 @@ templates/codex/
17
17
  ├── config.toml.template # 프로젝트 .codex/config.toml (hooks + mcp + sandbox)
18
18
  └── hooks/ # Shell 스크립트 (.claude/hooks/ 재사용 가능)
19
19
  ├── README.md # 포팅 상태 + Event 매핑
20
- ├── hito-counter.sh # user_prompt_submit
21
20
  ├── session-start.sh # session_start
22
21
  └── uncommitted-check.sh # post_tool_use (Bash 한정)
23
22
  ```
@@ -50,14 +50,6 @@ type = "command"
50
50
  timeout = 10
51
51
  async = false
52
52
 
53
- # UserPromptSubmit: HITO(Human-In-The-Loop Interrupts) 카운트
54
- [[hooks.user_prompt_submit]]
55
- name = "hito-counter"
56
- command = ["{PROJECT_DIR}/.codex/hooks/hito-counter.sh"]
57
- type = "command"
58
- timeout = 5
59
- async = true # non-blocking 측정
60
-
61
53
  # PostToolUse: 미커밋 파일 경고 (Bash 한정)
62
54
  [[hooks.post_tool_use]]
63
55
  name = "uncommitted-check"
@@ -8,7 +8,6 @@
8
8
  | Codex event (snake_case) | 스크립트 | 원본 (Claude) | 상태 |
9
9
  |--------------------------|----------|---------------|------|
10
10
  | `session_start` | `session-start.sh` | `.claude/hooks/session-start.sh` | Phase C 포팅 예정 |
11
- | `user_prompt_submit` | `hito-counter.sh` | `.claude/hooks/hito-counter.sh` | Phase C 포팅 예정 |
12
11
  | `post_tool_use` | `uncommitted-check.sh` | `.claude/hooks/uncommitted-check.sh` | Phase C 포팅 예정 |
13
12
  | ❌ (hook 사용 안 함) | ❌ | `.claude/hooks/protect-files.sh` | **Codex sandbox로 이관 (ADR-002 v2 D3)** |
14
13
 
@@ -55,7 +55,6 @@ OpenCode `permission` 설정이 1차 방어. LLM 추가 준수:
55
55
  ## Experience Accumulation
56
56
 
57
57
  - 검증된 learning만 Rules 승격
58
- - HITO 로그: `.claude/evals/hito-YYYY-MM-DD.log`
59
58
 
60
59
  ## Context Management
61
60
 
@@ -1,7 +1,8 @@
1
1
  # Benchmark Parity (벤치마크 핵심 기능 완결성)
2
2
 
3
3
  레퍼런스 제품(벤치마크)을 실측해 핵심 기능을 도출하고, 자체 구현이 **올바르게 + 필요한 항목 전부**
4
- 갖췄는지 반복 검토·발전시키는 워크플로우. 실서비스 운영(레퍼런스 audit 20회 내외 실행)에서 검증된
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
  ```
@@ -42,17 +42,6 @@
42
42
  }
43
43
  ],
44
44
  "PostToolUse": [],
45
- "UserPromptSubmit": [
46
- {
47
- "hooks": [
48
- {
49
- "type": "command",
50
- "command": "bash \"$CLAUDE_PROJECT_DIR/.claude/hooks/hito-counter.sh\"",
51
- "async": true,
52
- "timeout": 2
53
- }
54
- ]
55
- }
56
- ]
45
+ "UserPromptSubmit": []
57
46
  }
58
47
  }
@@ -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
- ### Capability Evals
113
- 1. Can create new user account
114
- 2. Can validate email format
115
- 3. Can hash password securely
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
- ### Regression Evals
118
- 1. Existing login still works
119
- 2. Session management unchanged
120
- 3. Logout flow intact
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
- ### Success Metrics
123
- - pass@3 > 90% for capability evals
124
- - pass^3 = 100% for regression evals
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
 
@@ -73,8 +73,8 @@ Sanity-check the metric before trusting it:
73
73
  north-star." Flag it instead of silently planning against a corrupt target.
74
74
 
75
75
  > In this repo the literal north-star is **GitHub stars** (per memory and the service-audit
76
- > roadmap), with the NORTH_STAR NSM (HITO 3/feature, low re-clarification) as the *value* the
77
- > stars are supposed to reward. Plan toward stars **via** the value inputs, not by gaming the count.
76
+ > roadmap), with the NORTH_STAR NSM (context cost per install, justified-asset ratio) as the *value*
77
+ > the stars are supposed to reward. Plan toward stars **via** the value inputs, not by gaming the count.
78
78
 
79
79
  ### 2. ASSESS current state against each Input — expose the gap
80
80
 
@@ -123,12 +123,13 @@ document** — both the metric and the priorities are expected to be revised as
123
123
 
124
124
  > **1. Metric + Inputs** (from `docs/NORTH_STAR.md`)
125
125
  > North Star Metric: GitHub stars as the adoption signal that the harness delivers real value.
126
- > Inputs: (a) HITO 3 / feature, (b) Promise = Implementation (advertised assets 100% work),
127
- > (c) first-run install success, (d) vetted+security-audited asset count, (e) 4-CLI parity.
126
+ > Inputs: (a) context cost per install (resident + fired tokens), (b) Promise = Implementation
127
+ > (advertised assets 100% work), (c) first-run install success, (d) justified-asset ratio,
128
+ > (e) 4-CLI parity.
128
129
  > *Leading-indicator check:* stars alone are gameable, so we plan against inputs (a)–(e), the value
129
130
  > the stars reward — not the raw count.
130
131
  >
131
- > **2. Gap** — (a) HITO unmeasured in fresh installs · (b) closed after no-false-ship work · (c)
132
+ > **2. Gap** — (a) fired-body tokens unmeasured · (b) closed after no-false-ship work · (c)
132
133
  > install-matrix green but no post-publish telemetry · (e) plugins don't yet reach non-Claude CLIs.
133
134
  >
134
135
  > **3. Direction** — "Make the *first 60 seconds* prove the value before asking for a star."
@@ -97,6 +97,16 @@ mechanism.** If the countermeasure's effect depends on someone (human or model)
97
97
  the right moment, it is Level 1 no matter where the prose lives. Level 2 means the wrong action
98
98
  *cannot complete*: the test fails, the hook exits 2, the duplicated list no longer exists.
99
99
 
100
+ **Write the gate as a sweep, not a list.** A Level-2 gate that enumerates the surfaces it covers
101
+ has just made a second copy of the very list that drifted — and whatever is missing from that copy
102
+ becomes the next habitat for the same defect. Prefer a glob, or a derive from a single source, that
103
+ picks up new surfaces on its own; if someone has to remember to extend the gate, it is already
104
+ failing at Level 1 wearing a Level-2 costume. Grant exemptions by marking the exempt item, never by
105
+ curating an inclusion list — the **default must be checked**. This harness learned it the expensive
106
+ way: five recurrences of one doc-fact drift, each answered by adding one more per-surface pattern,
107
+ and a file named as a drift surface in the fourth postmortem still carried zero coverage at the
108
+ fifth.
109
+
100
110
  **Confirm before adding standing cost.** A rule is read every session and a gate runs on every
101
111
  CI/tool call — both are permanent taxes on the harness. Levels 1 and 2 therefore need explicit
102
112
  user confirmation (a brief escalation: signature, count with evidence, proposed artifact, its
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Placeholder — Phase C에서 `.claude/hooks/hito-counter.sh`로부터 포팅
3
- # stdin JSON 필드는 Claude Code와 호환 (ADR-002 v2 D5)
4
- # Codex event 매핑은 templates/codex/hooks/README.md 참조
5
- set -euo pipefail
6
- echo "not-yet-implemented (Phase C)" >&2
7
- exit 0
@@ -1,26 +0,0 @@
1
- #!/bin/bash
2
- # ============================================================
3
- # hito-counter.sh (v26.32.0)
4
- # UserPromptSubmit hook — HITO (Human-In-The-Loop Occurrences) 측정용.
5
- #
6
- # NORTH_STAR.md NSM 추적을 위한 Phase 2 baseline 수집 인프라.
7
- # 사용자 prompt submit 시마다 타임스탬프 1줄 추가.
8
- # 프롬프트 내용은 기록하지 않음 (프라이버시).
9
- #
10
- # 로그 위치: .claude/evals/hito-YYYY-MM-DD.log
11
- # 집계: `wc -l .claude/evals/hito-*.log` 로 일일 카운트
12
- # 더 정밀한 분류(명시적 지시 vs 승인 vs 확인)는 수동 eval에서.
13
- #
14
- # Exit: 항상 0 (hook 차단 금지)
15
- # ============================================================
16
-
17
- DATE=$(date +%Y-%m-%d 2>/dev/null || echo "unknown")
18
- LOG_DIR="${CLAUDE_PROJECT_DIR:-.}/.claude/evals"
19
- LOG_FILE="$LOG_DIR/hito-$DATE.log"
20
-
21
- mkdir -p "$LOG_DIR" 2>/dev/null || exit 0
22
-
23
- TS=$(date -u +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || echo "?")
24
- echo "$TS prompt_submit" >> "$LOG_FILE" 2>/dev/null
25
-
26
- exit 0