leerness 1.33.0 → 1.35.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/CHANGELOG.md CHANGED
@@ -1,5 +1,160 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.35.0 — 2026-06-27 — 🕸️ [안정화/Stable] 온톨로지 그래프(graph --html + 자동생성) 안정 minor
4
+
5
+ **신규 기능 minor**: leerness 적용 프로젝트의 하네스(5 메모리 표면 + skills + feature-graph)를 인터랙티브 온톨로지 그래프 HTML(`leerness.html`)로 표면화하는 기능을 도입하고, 누적 수정(1.34.1~1.34.4)을 묶어 안정화. 0 런타임 의존 자기완결 vanilla JS — 노드 클릭으로 하네스 내용을 손쉽게 조회.
6
+
7
+ ### 이번 minor 통합 (1.34.1~1.34.4)
8
+ - **🕸️ leerness graph --html (1.34.3)**: 프로젝트 루트에 `leerness.html`(Obsidian graph-view 스타일 force-directed 캔버스) 생성. 노드=task(status색)/plan/decision/lesson/rule/skill/feature, 엣지=`M-####`·`[TURDL]-####`·`[[wikilink]]`·feature-graph. 기존 `graph`(mermaid 코드그래프)는 비파괴 유지(`--html` 분기). 새 모듈 `lib/graph.js`(DI). 맹신X: 엣지 이중계수 dedup + (자가발견)U+2028-in-regex SyntaxError 회귀를 중첩 spawn 재현으로 반증·revert.
9
+ - **📊 graph 자동생성 (1.34.4)**: `LEERNESS_AUTO_GRAPH=1`(기본 OFF, Always-Off Opt-In) 시 `handoff` 마다 `leerness.html` 자동 갱신. dispatch 래퍼 격리 + `quiet` 모드. 맹신X: `handoff --json` notice 오염 차단(`!has('--json')`).
10
+ - **🔬 gate --claims 정직화 (1.34.1)**: gate 정밀성 문구 정직화 + 판별 케이스 e2e 가드.
11
+ - **🐶 scan secrets FP 억제 (1.34.2)**: dogfood(leerness Gate) 발견 — 'test' 픽스처 토큰 FP 억제(FN-safe, 실키 회귀 0).
12
+
13
+ ### 안정화 표시 (R-0006)
14
+ - annotated tag `v1.35.0` (Stable) · GitHub release · npm dist-tag `stable` — 게시 단계에서 수행.
15
+ - **배포 대기**: `npm publish` 는 2FA OTP 필요 → 사용자 게시 후 게시본 클린룸 재실증(graph --html 행위 포함, re-verify-published-artifact 교훈).
16
+
17
+ ### 검증 (회귀 0)
18
+ - selftest **262** · full **e2e 381/381**. `files:["lib"]` → 신규 `lib/graph.js` 게시 포함 확인. bin+package.json 동시 bump 일치.
19
+
20
+ ## 1.34.4 — 2026-06-27 — 📊 graph 자동생성(opt-in): handoff 시 leerness.html 자동 갱신
21
+
22
+ **T-0077 후속(사용자 비전 "자동으로 작성되게" 충족)**: `leerness graph --html`(1.34.3)은 수동이었음. 이제 `leerness handoff` 시 leerness.html 을 자동 재생성하는 opt-in 훅 추가 — 매 세션 시작마다 온톨로지 그래프가 최신 상태로 유지.
23
+
24
+ ### 기능 (Always-Off Opt-In)
25
+ - 환경변수 `LEERNESS_AUTO_GRAPH=1` 일 때만 동작(기본 OFF — 1.9.213 "Always-Off Opt-In" 원칙). handoff 출력 끝에 `_maybeAutoGraph(root)` 가 leerness.html 을 조용히(quiet) 재생성하고 한 줄 알림.
26
+ - 비치명: dispatch 래퍼에서 `handoffCmd()` 반환 후 호출 → `.harness` 미존재/오류 시 try/catch 로 handoff 본문 무영향. `--quiet`/`--compact` 시 알림 생략.
27
+ - `lib/graph.js`: `graphHtmlCmd` 에 `quiet` 옵션 추가(자동생성 시 사람용 3줄 로그 억제). 거대 handoff 본문 미수정(격리).
28
+
29
+ ### 검증 (회귀 0)
30
+ - selftest **262** (신규: handoff opt-in 배선 grep[split-literal 자기참조 회피] + quiet 모드 무로그 행위).
31
+ - **end-to-end**: init 한 임시 하네스에서 `handoff` — env 미설정 → leerness.html 미생성(기본 off 증명), `LEERNESS_AUTO_GRAPH=1` → 생성 + 알림 라인 확인.
32
+ - full **e2e 381/381**(711s, 기본 off → 기본경로 무영향) · bin+package.json 동시 bump. patch(1.34.4) — npm 미배포(R-0011).
33
+
34
+ ## 1.34.3 — 2026-06-26 — 🕸️ leerness graph --html: 하네스 온톨로지 그래프(leerness.html) 자동 생성
35
+
36
+ **사용자 요청 신규 기능(T-0077)**: leerness 적용 프로젝트 루트에 인터랙티브 온톨로지 그래프 HTML(`leerness.html`)을 생성. Obsidian graph-view 스타일 force-directed 캔버스로 5 메모리 표면(task/plan/decision/lesson/rule) + skills + feature-graph 를 노드/엣지로 시각화하고, 노드 클릭 → 내용 패널로 하네스를 손쉽게 조회. **0 런타임 의존 자기완결 vanilla JS**(차트 라이브러리 X). codex 와 설계 협업(통합 지점·데이터 재사용·DI 배치), 검수는 메인.
37
+
38
+ ### 기능
39
+ - `leerness graph [path] --html [--out <file>] [--json]` — 기존 `graph`(mermaid 코드 의존성 그래프)는 기본 동작 유지, `--html` 분기로 온톨로지 HTML 생성(비파괴).
40
+ - 데이터: in-process 로더 주입(`_roadmapData`·`_loadDecisions`·`_loadLessons`) — 자식 프로세스 셸링 0. 노드: task(status별 색상)/plan/decision/lesson/rule/skill/feature. 엣지: `M-####`·`[TURDL]-####` 참조 · `[[wikilink]]` · `feature-graph.md`.
41
+ - 새 모듈 `lib/graph.js`(DI 패턴 — lib/diagnostics 류와 일관). bin/leerness.js 는 thin wrapper + dispatch 분기 + help 만.
42
+ - 임베드 안전: 모든 `<` → `<` 치환으로 `</script>`·`<!--` 차단(JSON 문자열 내부라 런타임 복원), function 치환기로 `$`-특수문자 회피.
43
+
44
+ ### 맹신X (자기검수에서 실버그 2건 발견·해결)
45
+ - **P2 엣지 이중계수**: task→milestone 가 `_roadmapData` 추출(`_ms`) + blob `M-####` 정규식 양쪽에서 추가 → 엣지수/degree 부풀림. `(source,target)` dedup 으로 정확화(루트 하네스 20→10 정확).
46
+ - **자가발견 회귀 + 반증**: U+2028/U+2029 escape 를 정규식 리터럴 안에 raw 로 넣어 `SyntaxError`(정규식은 줄종결자 불가) → bin 이 require 하는 공유 모듈이라 e2e 자식 전부 크래시(균일 75 실패). "다수 균일 실패=환경" 유혹을 **중첩 spawn 으로 `--version` 재현**해 반증(내 신택스 에러) → 이익 미미한 escape 는 단순 검증형으로 revert.
47
+
48
+ ### 검증 (회귀 0)
49
+ - selftest **261** (신규: `graph --html` 행위 — 임시 하네스 seed → `leerness.html` 생성 + 노드/엣지 존재 + XSS 무결성(`</script>` 정확히 1개); 자기참조 트랩 회피 split-literal).
50
+ - full **e2e 381/381**(750s) · 라이브: 루트 119 nodes/10 edges, `DATA` JSON.parse OK.
51
+ - patch(1.34.3) — npm 미배포(R-0011). bin+package.json 동시 bump 일치.
52
+
53
+ ## 1.34.2 — 2026-06-20 — 🐶 dogfood 발견: scan secrets 테스트-픽스처 FP 억제 ('test' 토큰)
54
+
55
+ **🐶 product(leerness Gate, GitHub App)를 leerness 하니스로 dogfooding 하다 발견한 leerness 개선.** 실제 product 코드를 leerness 로 빌드·검증하니 `scan secrets` 가 테스트 픽스처(`const SECRET = 'test-webhook-secret-123'`)를 "Hardcoded password assignment" FP 로 플래그함. (웹 Opus 4.8 리뷰의 "self-dev 밖 실제 product 에서 검증" 가치가 첫 leerness 개선으로 결실.)
56
+
57
+ ### 맹신X (양방향 재현 — FP 억제 + 실키 FN-guard 0)
58
+ - 재현: `_isPlaceholderSecret('test-webhook-secret-123')` → false(플래그). 전체-값 placeholder 토큰도, marker 단어도 아니고(markers 에 bare 'test'/'secret' 없음), 저엔트로피(alnum 20 < 24)라 실키 가드도 미적용 → 최종 `return false`(플래그)에 도달.
59
+ - **FN-guard 재현**: 실키(`AKIAJQXMP7RZ2KL9WXYZ` · `ghp_…` · 고엔트로피 랜덤 · `prod-database-secret-…` · `latestKEY…`)는 전부 FLAGGED 유지 확인. 수정 규칙은 함수 끝(실키 prefix·고엔트로피가 이미 return 한 뒤)에만 위치해 실키엔 **도달 불가** → 보안 회귀 0.
60
+
61
+ ### 변경 (FN-safe, 최소)
62
+ - `_isPlaceholderSecret`: 'test' 구분자 토큰(`test-…`/`…-test`/`…-tests`/`TEST_…`)을 가진 **저엔트로피 비-실키** 값을 placeholder 로 판정 — 함수 끝(고엔트로피·실키 prefix 분기 뒤)에 추가해 실키 무영향. `test-webhook-secret-123`/`webhook-secret-for-tests` 류 FP 억제.
63
+ - **whack-a-mole 회피(lesson)**: placeholder 휴리스틱 무한 확장은 FN 위험만 키움 — leerness 는 가장 명확한 'test' 픽스처 클래스만 잡고, 그 외(PEM 델리미터-in-코드·일반 fixture 값)는 product-side 에서 정직하게 해결(게이밍 X). 완전 해소는 allowlist 기제(향후)로.
64
+
65
+ ### 검증 (회귀 0)
66
+ - selftest **260** (신규: _isPlaceholderSecret FP 억제 5종 + 실키 FN-guard 5종 + 소스 가드 '규칙이 고엔트로피 분기 뒤').
67
+ - dogfood 검증: leerness-gate `scan secrets` → ✓ clean(FP 0), product 37 tests 유지.
68
+ - patch(1.34.2) — npm 미배포(R-0011). bin+package.json 동시 bump 일치.
69
+
70
+ ## 1.34.1 — 2026-06-19 — 🔬 16th 리뷰(게시본 1.34.0 신규 표면) — gate --claims 정밀성 정직화 + 판별 가드
71
+
72
+ **🔬 게시본 1.34.0 신규 표면(gate --claims · verify-claim --all · MCP)을 적대적 리뷰 + 맹신X 양방향 재현.** R-0006(멀티에이전트 보수)에 따라 무거운 fan-out 대신 단일 컨텍스트 적대 버그헌트로 수행. 신규 표면은 행위상 견고했으나(스텁/부풀린카운트 차단·json 무오염·MCP 라운드트립 정상), **`gate --claims` 의 가치 설명 문구가 부정확**함을 발견.
73
+
74
+ ### 맹신X (양방향 재현 — 정밀성 가치는 REAL, 문구만 과장)
75
+ - **재현으로 기각한 과장**: 종전 코드주석이 "기본 게이트는 lazy/audit 으로 거짓완료를 잡지만 부풀린카운트·스텁은 verify-claim 이 더 잘 잡음"이라 표현 → lazy/audit 이 **콘텐츠를 검사하는 듯 오해**를 줌. 실제 재현: 기본 게이트가 거짓완료를 잡은 건 `lazy detect` 의 **워크스페이스-상태 신호**(handoff 미생성·test-run 미기록 — done-work 있으면 blocking)였지, 부풀린카운트/스텁 **콘텐츠 탐지가 아니었음**.
76
+ - **재현으로 확인한 진짜 가치(REAL)**: `lazy detect` 를 완전히 깨끗하게(유효 handoff + test-run 기록) 만든 성숙 프로젝트 + 콘텐츠-레벨 거짓(테스트 50개 주장, 실제 1개) → **기본 게이트 5체크 전부 통과(exit 0)**, **`--claims` 만 차단(exit 1, verify-claims FAIL)**. 즉 `--claims` 는 5체크가 안 보는 **콘텐츠-레벨 차원**(파일/카운트/스텁/optimism)을 추가하는 게 맞음.
77
+
78
+ ### 변경 (정직화 + 가드)
79
+ - **문구 정직화**: `verifyClaimAllCmd`/`gate --claims` 코드주석을 "워크스페이스-상태 휴리스틱(5체크) vs 콘텐츠-레벨 검증(--claims)" 으로 교정 — lazy/audit 이 콘텐츠를 본다는 오해 제거. README enforcement 문구("via heuristics … --claims makes it precise")는 이미 정확해 유지.
80
+ - **결정적 판별 e2e 가드 B(1.34.1)**: lazy detect 0 finding + 부풀린카운트 → 기본 게이트 exit 0, `--claims` exit 1(verify-claims FAIL · lazy detect ok). 미래에 `--claims` 가 조용히 무가치(기본도 잡거나 --claims 가 못 잡음)해지면 즉시 실패하게 고정.
81
+
82
+ ### 검증 (회귀 0)
83
+ - selftest 259 · E2E 381(B(1.34.1) 추가). 신규 표면 적대 프로브(스텁·부풀린카운트·json오염·MCP) 모두 정상.
84
+ - patch(1.34.1) — npm 미배포(R-0011, 다음 minor 에 게시). bin+package.json 동시 bump 일치.
85
+
86
+ ## 1.34.0 — 2026-06-19 — 🛡️ [안정화/Stable] verify-claim + CI gate 슬라이스 강화 (CLI→CI→MCP 완결) 안정 minor
87
+
88
+ **🛡️ 안정화(Stable) minor — 직전 minor(1.33.0) 이후 누적된 패치 3건(1.33.1~1.33.3)을 검증·통합해 npm 공개.** R-0011 정책의 25번째 stable minor. **이번 minor 의 핵심은 차별화 슬라이스(verify-claim + CI gate)를 한 테마로 완결한 것** — 웹 Opus 4.8 외부리뷰가 "leerness 의 진짜 가치 = verify-claim + CI gate"라 짚었고, 사용자가 그 방향을 선택해 3라운드에 걸쳐 플래그십을 CLI → CI 게이트 → MCP 까지 연결했습니다. 한국어 우선 기본은 그대로.
89
+
90
+ ### 이번 minor 통합 (1.33.1~1.33.3)
91
+ - **🔒 CI 게이트 워크플로 production-grade (1.33.1)**: `leerness ci init` 생성 PR 게이트가 **leerness 버전 핀**(재현성·공급망 안전 — 새 릴리스가 게이트 판정을 조용히 못 바꿈) + **최소권한**(`permissions: contents: read`) + **중복 취소**(`concurrency` + `cancel-in-progress`). 맹신X: gate 본체는 이미 실제 시크릿을 차단(미수정, 헛수정 회피).
92
+ - **🔎 verify-claim --all (1.33.2)**: 플래그십을 per-task 전용 → **일괄**(`leerness verify-claim --all`)로. 모든 done/완료 주장을 한 명령으로 검증, 하나라도 불일치면 exit 1(CI·스케일). per-task 경로에 비침투 `opts.collect` 추가로 정밀 검사(스텁·부풀린 카운트·optimism) 그대로 재사용. 맹신X: 일괄 verdict ↔ per-task 일치 재현.
93
+ - **🔗 gate --claims + MCP (1.33.3)**: 일괄 검증을 강제·에이전트 표면에 연결 — `leerness gate --claims` opt-in 6번째 체크(기본 5체크 무변경, 회귀 0) + MCP `leerness_verify_claim_all`(86 도구). 비-exit 코어 `_verifyClaimsAll` 를 CLI·게이트가 공유. 맹신X: 게이트 5체크가 done 주장에 verify-claim 을 안 돌렸음을 소스 확인 → `--claims` 로 정밀화.
94
+
95
+ ### 안정화 표시 (R-0006)
96
+ - annotated tag `v1.34.0` (Stable) · GitHub release `--latest` · npm dist-tag `stable` 시도.
97
+ - **게시본 클린룸 재실증**: npm 공개본을 빈 임시폴더에 fresh 설치 → 버전 + 플래그십(verify-claim 거짓완료 차단 + gate --claims) 행위 재확인.
98
+
99
+ ### 검증 (회귀 0)
100
+ - selftest **259** · E2E **380** (양 minor 누적 가드 포함). bin+package.json 동시 bump 일치.
101
+ - **npm 공개**(minor — R-0011): 1.33.0 → 1.34.0. 누적 패치는 GitHub/CHANGELOG 에만 있던 것을 안정 버전으로 묶어 게시.
102
+
103
+ ## 1.33.3 — 2026-06-19 — 🔗 verify-claim --all → CI gate(opt-in) + MCP (양 표면 도달)
104
+
105
+ **🔗 차별화 슬라이스(verify-claim + CI gate) 견고화 3번째 — 1.33.2 의 일괄 검증을 실제 강제·에이전트 표면에 연결.** 1.33.2 가 CLI 에 `verify-claim --all` 을 추가했지만, ① CI **게이트**는 여전히 done 주장에 정밀 per-claim 검사를 안 돌렸고(거짓완료를 lazy/audit 휴리스틱으로만 차단), ② **MCP**(leerness 의 *주요* 에이전트 인터페이스)에는 일괄 검증 도구가 없었음(에이전트가 "내 완료 주장 전부 맞나?"를 한 번에 못 물음). 이 두 갭을 닫음.
106
+
107
+ ### 맹신X (양방향 재현)
108
+ - 게이트 5체크(verify/audit/scan/encoding/lazy) 중 **어느 것도 done 주장에 verify-claim 을 실행 안 함**을 소스로 확인 — README 의 "claims fail → cannot merge" 가 휴리스틱에 의존. `gate --claims` 로 정밀화.
109
+ - 회귀 0 재현: 클린 프로젝트는 기본 5체크/`--claims` 6체크 둘 다 통과 · 거짓완료는 기본 게이트 exit 1(기존 동작 유지) + `--claims` 의 6번째 `verify-claims` 체크가 명시적으로 ok:false. **human `--claims` 가 gate summary 까지 도달**(코어가 process.exit 안 해 step 집계 보호됨)을 검증.
110
+
111
+ ### 변경 (둘 다 additive·zero-regression)
112
+ - **`leerness gate --claims`** opt-in — 6번째 체크 `verify-claims`(= verify-claim --all 정밀 검사) 추가. **기본 게이트는 5체크 무변경**(기존 CI 어댑터 회귀 0). CI 가 README 약속을 문자 그대로 강제하려면 `--claims`.
113
+ - **MCP `leerness_verify_claim_all`** (85→86) — read-only. 응답 `{ ok, total, failed, results:[{id,ok,reasons}] }`. 에이전트가 세션 마감 전 모든 done 주장을 한 호출로 자가 점검.
114
+ - 구현: 비-exit 코어 `_verifyClaimsAll(root)` 추출(렌더/exit 없이 결과만) → CLI(`verify-claim --all`)·게이트(`--claims`)가 **동일 코어 공유**. 코어는 절대 `process.exit(` 안 함(게이트 프로세스 조기종료 방지 — selftest 가드).
115
+ - README: enforcement 섹션을 `gate --claims` 로 정밀화 + MCP 도구 수 86 갱신(en/ko).
116
+
117
+ ### 검증 (회귀 0)
118
+ - **selftest 259**(신규 1.33.3: 코어 exit 부재 + gate --claims 6번째 + MCP def↔case) · **E2E 380**(B(1.33.3): 클린 5/6 + 거짓완료 `--claims` 차단 + human summary 도달 + MCP `verify_claim_all` 라운드트립).
119
+ - patch(1.33.3) — npm 미배포(R-0011). bin+package.json 동시 bump 일치.
120
+
121
+ ## 1.33.2 — 2026-06-19 — 🔎 verify-claim --all (모든 done 주장 일괄 검증 — CI·스케일)
122
+
123
+ **🔎 차별화 슬라이스(verify-claim) 견고화 — 플래그십을 스케일로.** 직전 라운드(1.33.1)에 이어 verify-claim/gate 슬라이스를 강화. 종전 verify-claim 은 **per-task 전용**(`verify-claim <T-ID>`)이라 "내 완료 주장 전부가 증거와 맞는가?"를 한 명령으로 확인할 수 없었음. `--all` 추가로 모든 done/완료 주장을 일괄 검증 → CI·대규모 트래커에서 바로 사용. (사용자 방향 선택: verify-claim + CI gate 강화.)
124
+
125
+ ### 맹신X (양방향 재현 — 헛수정 회피)
126
+ - 직접 재현: 거짓완료(존재하지 않는 파일 주장 done) 프로젝트에서 `gate` 는 **이미** exit 1 로 차단(lazy/audit 휴리스틱) — 값 제안이 공허하지 않음을 확인 → "gate 가 주장을 안 본다"는 가설 **기각**. 단, `verify-claim --all`/no-id 는 둘 다 "T-ID 필요" 에러 → **일괄 검증 부재**가 진짜 갭.
127
+ - 일괄 verdict ↔ per-task 일치 검증: 거짓 task 는 `--all` 에서 ok:false(`files-missing`) + 개별 `verify-claim` 도 exit 1, 진실 task 는 양쪽 다 통과. 정밀 검사(스텁·부풀린 카운트·optimism)를 그대로 재사용(분기 없음).
128
+
129
+ ### 변경
130
+ - **`leerness verify-claim --all [--json]`** 신규 — progress-tracker 의 done/완료 주장을 전부 검증, 하나라도 불일치면 exit 1(CI 게이트). `--json`: `{ ok, total, failed, results:[{id,ok,reasons}] }`. 완료 주장 0건이면 통과(exit 0).
131
+ - 통과 플래그(`--run-tests`/`--strict-claims`/`--require-evidence`/`--lenient`/`--test-cmd`)는 전역이라 각 task 에 그대로 적용 — 기본은 정적 검사(빠름), `--run-tests` 시 각 task 테스트 실행.
132
+ - 구현: per-task 경로(`verifyClaimCmd`)에 `opts.collect` 비침투 추가 — 렌더/exit 없이 verdict 만 반환(기존 `--json`/human 게이팅 부울을 **동일 출처**로 공유). 일괄 모드는 thin orchestrator. **per-task 동작 무변경**(opts 없을 때 종전과 100% 동일).
133
+
134
+ ### 검증 (회귀 0)
135
+ - **selftest 258**(신규 1.33.2 가드: collect early-return·done 필터·라우팅·게이팅 부울 공유 + 7th헌트 not_found 윈도 {0,700}→{0,1200} 정합).
136
+ - **E2E 378→379**: 새 가드 B(1.33.2) — 거짓완료 일괄 차단(exit 1, `files-missing`)·진실완료/빈프로젝트 통과·per-task verdict 일치·human exit 1.
137
+ - patch(1.33.2) — npm 미배포(R-0011, 다음 minor 에 게시). bin+package.json 동시 bump + 일치 가드 통과.
138
+
139
+ ## 1.33.1 — 2026-06-17 — 🔒 verify-claim + CI gate 슬라이스 강화 (생성 워크플로 production-grade)
140
+
141
+ **🔒 차별화 슬라이스(verify-claim + CI gate) 견고화.** 웹 Opus 4.8 외부리뷰가 "가치의 대부분 + 버전을 핀하라"고 짚은 부분을 채택 — `leerness ci init` 이 생성하는 PR 게이트 워크플로를 production-grade 로. (사용자 방향 선택: self-dev 중 고가치 항목.)
142
+
143
+ ### 맹신X (gate 동작은 견고 — 헛수정 회피)
144
+ - 직접 재현: `gate` 는 5체크(verify/audit/scan-secrets/encoding/lazy) · `--json` 단일객체 집계(version/root/ok/total/failed/checks) · **실제 커밋 시크릿 차단**(exit 1, scan-secrets ok:false). AWS 문서 placeholder(`...EXAMPLE`)를 무시하는 건 정상(FP 회피)임을 확인 → gate 본체는 미수정.
145
+
146
+ ### 변경 (생성 워크플로 강화)
147
+ - **leerness 버전 핀**: `npx -y leerness gate .`(unpinned latest) → `npx -y leerness@<설치버전> gate .`. `ci init` 가 설치 버전을 주입 → **재현성·공급망 안전**(새 릴리스가 게이트 판정을 조용히 바꾸지 못함). 업데이트 안내 주석 + `ci init --force` 재생성.
148
+ - **최소 권한**: `permissions: contents: read` (least-privilege — gate 는 읽기·검증만).
149
+ - **중복 취소**: `concurrency` + `cancel-in-progress: true` (superseded PR run 자동 취소).
150
+ - **crisp CI 스토리**: `ci init` 성공 메시지에 핀/권한 + "branch protection 에서 required 지정 → guardrail 완성" 다음단계 명시. README ci 섹션도 1줄 보강.
151
+
152
+ ### 검증 (회귀 0)
153
+ - **selftest 257** (ci init 가드(3307)를 핀/permissions/concurrency 검사로 강화 + VERSION↔package.json 일치).
154
+ - **E2E 377→378**: 새 가드 B(1.33.1) — 버전핀(설치버전 일치)·미핀 latest 부재·`contents: read`·concurrency cancel.
155
+ - 생성 워크플로 **YAML 파싱 검증**(name/permissions/concurrency/run 구조 유효).
156
+ - patch(1.33.1) — npm 미배포(R-0011, 다음 minor 에 게시). bin+package.json 동시 bump + 일치 가드 통과.
157
+
3
158
  ## 1.33.0 — 2026-06-17 — 🛡️ [안정화/Stable] 15th리뷰 수정 + 정직성 calibration + A3 fencing 안정 minor
4
159
 
5
160
  **🛡️ 안정화(Stable) minor — 직전 minor(1.32.0) 이후 누적된 패치 3건(1.32.1~1.32.3)을 검증·통합해 npm 공개.** R-0011 정책의 24번째 stable minor. **이번 minor 의 핵심은 정직성 — 1.32.2 에서 calibrate 한 정직한 README/docs(self-administered 클린룸·성숙도 라벨)가 그동안 GitHub 에만 있었고 npm 에는 1.32.0 의 과장본이 남아 있었음. 1.33.0 이 정직한 게시본을 npm 에 올린다** (false-"done" 을 막는 도구가 자기 자신에 대해서도 과장하지 않도록). 한국어 우선 기본은 그대로.
package/README.ko.md CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  > **어떤 언어, 어떤 AI 에이전트로 작업하든 — "증거 없이는 끝났다고 말할 수 없게" 만드는 AI 코딩 운영 레이어.** 코드를 대신 쓰는 도구가 아니라, AI 에이전트의 **기억·인수인계·검증·감사·보안 가드**를 프로젝트에 영속화하는 CLI + MCP 서버입니다. (이 포지셔닝은 **자체 수행 AI 클린룸 평가** — AI 에이전트가 빈 임시폴더에 fresh 설치 후 행위만으로 검증, 검증기 적대공격 포함 — 로 점검했습니다. *제3자 인간 감사·동료심사가 아닙니다.* 방법론·결과·정직한 한계: [docs/clean-room-evaluations.md](./docs/clean-room-evaluations.md))
15
15
 
16
- [![npm](https://img.shields.io/npm/v/leerness)](https://www.npmjs.com/package/leerness) · ![MCP tools](https://img.shields.io/badge/MCP--tools-85-blue) · **런타임 의존성 0** · **install-script 0** · offline-first · Node ≥ 18 · MIT
16
+ [![npm](https://img.shields.io/npm/v/leerness)](https://www.npmjs.com/package/leerness) · ![MCP tools](https://img.shields.io/badge/MCP--tools-86-blue) · **런타임 의존성 0** · **install-script 0** · offline-first · Node ≥ 18 · MIT
17
17
 
18
18
  > 이 문서는 **AI 다중 모델(Codex / Claude Sonnet / Claude Opus)이 README 없이 leerness 를 직접 설치·실행·분석한 클린룸 리뷰**(행위 기반 — 제3자 인간 객관 감사는 아님)를 바탕으로 재구성됐습니다. 매 릴리스마다 자동 갱신됩니다.
19
19
 
@@ -112,7 +112,7 @@ leerness verify-claim T-0001 --require-evidence
112
112
  - **외부 에이전트**: `agents list/check/dispatch` · `provider` · `roles` · `adapter`
113
113
  - **운영/확장**: `release` · `migrate` · `team` · `install-safety` · `route` · `review`(페르소나)
114
114
  - **브리지(opt-in)**: `web`(playwright) · `pc`(robotjs) · `lsp`
115
- - **MCP**: `mcp serve` — stdio JSON-RPC 서버로 85개 도구 노출
115
+ - **MCP**: `mcp serve` — stdio JSON-RPC 서버로 86개 도구 노출 (verify-claim --all 일괄 검증 포함, 1.33.3)
116
116
 
117
117
  전체 명령은 `leerness commands` 또는 `leerness --help` 로 확인하세요.
118
118
 
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  > **The AI-coding operations layer that makes "done" require evidence — for any language, any AI agent.**
13
13
  > leerness does not write code. It gives your AI agent persistent memory, verified completion, and clean handoffs — stored inside your repo as plain files, exposed via CLI + MCP.
14
14
 
15
- [![npm](https://img.shields.io/npm/v/leerness)](https://www.npmjs.com/package/leerness) · ![MCP tools](https://img.shields.io/badge/MCP--tools-85-blue) · **0 runtime deps** · **0 install scripts** · offline-first · Node ≥ 18 · MIT
15
+ [![npm](https://img.shields.io/npm/v/leerness)](https://www.npmjs.com/package/leerness) · ![MCP tools](https://img.shields.io/badge/MCP--tools-86-blue) · **0 runtime deps** · **0 install scripts** · offline-first · Node ≥ 18 · MIT
16
16
 
17
17
  **🇰🇷 한국어 전문: [README.ko.md](./README.ko.md)**
18
18
 
@@ -49,7 +49,7 @@ You never have to type a command yourself. Paste this into Claude Code, Cursor,
49
49
 
50
50
  The agent installs and operates it for you — `leerness init` also writes the instructions into CLAUDE.md / AGENTS.md so future sessions pick them up automatically.
51
51
 
52
- Prefer pure natural language? leerness ships an **MCP server with 85 tools** (`leerness mcp serve`). Connect it once to Claude Desktop / Claude Code and just ask: *"what was I working on?"*, *"did the AI actually finish T-0001?"*
52
+ Prefer pure natural language? leerness ships an **MCP server with 86 tools** (`leerness mcp serve`). Connect it once to Claude Desktop / Claude Code and just ask: *"what was I working on?"*, *"did the AI actually finish T-0001?"*
53
53
 
54
54
  ---
55
55
 
@@ -77,7 +77,9 @@ By default leerness is **cooperative**: your AI agent runs the commands because
77
77
  leerness ci init # writes .github/workflows/leerness-gate.yml — runs `leerness gate` on every PR
78
78
  ```
79
79
 
80
- Then make that check **required** in GitHub branch protection. Now a PR that skips verification (or whose claims fail) **cannot merge** — the gate runs independently of the agent, returns a non-zero exit code, and blocks. That is the difference between a guideline and a guardrail.
80
+ The generated workflow is production-grade: it **pins the leerness version** (reproducible — the gate's verdict can't change from a silent upgrade), runs with **least-privilege permissions** (`contents: read`), and cancels superseded runs.
81
+
82
+ Then make that check **required** in GitHub branch protection. Now a PR that skips verification (or whose claims fail) **cannot merge** — the gate runs independently of the agent, returns a non-zero exit code, and blocks. That is the difference between a guideline and a guardrail. For exact per-claim enforcement, run `leerness gate --claims` — it adds a 6th check that runs `verify-claim` on **every** completed task and fails the gate if any "done" task's evidence doesn't match reality (the default 5-check gate already blocks false-done via heuristics; `--claims` makes it precise).
81
83
 
82
84
  ---
83
85
 
@@ -93,7 +95,7 @@ The asymmetry is what makes a trial reasonable anyway: MIT, **0 runtime dependen
93
95
 
94
96
  - **Memory** — `task` / `plan` / `decision` / `lesson` / `rule`: canonical JSON + markdown projections, archive/restore.
95
97
  - **Handoff** — `handoff` (session start context) · `session close` (closing report). Survives agent swaps.
96
- - **Verification** — `verify-claim` (evidence vs reality, stub/fake-test/inflated-count detection, `--run-tests --test-cmd` for any language) · `contract verify` (spec ↔ impl) · `gate` (one-call CI gate).
98
+ - **Verification** — `verify-claim` (evidence vs reality, stub/fake-test/inflated-count detection, `--run-tests --test-cmd` for any language; `--all` checks **every** completed claim at once for CI) · `contract verify` (spec ↔ impl) · `gate` (one-call CI gate).
97
99
  - **Audit** — `audit` · `lazy detect` · `drift check` keep the workspace honest over time.
98
100
  - **Security** — `scan secrets` (committed-secret detection) · `encoding check` (BOM/CP949) — also runs at `session close`.
99
101
 
@@ -112,7 +114,7 @@ MIT
112
114
  <!-- leerness:project-readme:start -->
113
115
  ## Leerness Project Harness
114
116
 
115
- 이 프로젝트는 Leerness v1.33.0 하네스를 사용합니다. AI 에이전트는 작업 전 `leerness handoff`로 컨텍스트를 적재하고, 작업 후 `leerness check`/`leerness audit`/`leerness session close`를 수행해야 합니다.
117
+ 이 프로젝트는 Leerness v1.35.0 하네스를 사용합니다. AI 에이전트는 작업 전 `leerness handoff`로 컨텍스트를 적재하고, 작업 후 `leerness check`/`leerness audit`/`leerness session close`를 수행해야 합니다.
116
118
 
117
119
  ### 정체성 — AI 에이전트 운영 레이어 (UR-0030)
118
120
 
@@ -166,7 +168,7 @@ leerness memory restore decision <date|title>
166
168
 
167
169
  ### MCP server (외부 AI 통합)
168
170
 
169
- Leerness v1.33.0는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code · Cursor · Codex CLI 등 외부 AI에 **85개 도구**를 노출:
171
+ Leerness v1.35.0는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code · Cursor · Codex CLI 등 외부 AI에 **86개 도구**를 노출:
170
172
 
171
173
  ```jsonc
172
174
  // 카테고리별
@@ -179,7 +181,7 @@ Leerness v1.33.0는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code
179
181
  // • Workflow: session_close / agents_list / task_export / env_check / usage_stats / reuse_map / whats_new
180
182
 
181
183
  // MCP server 실행: leerness mcp serve
182
- // tools/list 응답: 85 도구
184
+ // tools/list 응답: 86 도구
183
185
  ```
184
186
 
185
187
  ### Autonomous mode (자율 모드)
@@ -187,7 +189,7 @@ Leerness v1.33.0는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code
187
189
  `<<autonomous-loop-dynamic>>` 신호만 보내면 AI가:
188
190
  1) 다음 라운드 후보 선정 → 2) 코드 변경 → 3) stress-v* 신규 작성 + 누적 회귀 → 4) e2e 219/219 → 5) npm pack + git tag + GitHub release → 6) main 자동 push (1.9.140+) → 7) session close → 8) 다음 라운드 예약.
189
191
 
190
- 현재 누적: **70 라운드 (1.9.40 → 1.33.0)** · 매 라운드 GitHub release/태그 생성 · _reports/는 비공개 보존.
192
+ 현재 누적: **70 라운드 (1.9.40 → 1.35.0)** · 매 라운드 GitHub release/태그 생성 · _reports/는 비공개 보존.
191
193
 
192
194
  ### 성능 가이드 (1.9.140 측정)
193
195
 
@@ -225,6 +227,6 @@ leerness release pack --close --auto-main-push
225
227
  - `.harness/session-handoff.md`: 다음 세션 인수인계 (자동 작성)
226
228
  - `.harness/lessons.md` / `decisions.md` / `rules.md`: 영구 메모리 (5 surface)
227
229
 
228
- Last synced by Leerness v1.33.0: 2026-06-17
230
+ Last synced by Leerness v1.35.0: 2026-06-27
229
231
  <!-- leerness:project-readme:end -->
230
232