leerness 1.35.7 → 1.35.8
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 +12 -0
- package/README.md +14 -4
- package/bin/leerness.js +16 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.35.8 — 2026-07-03 — GPT5.5평가 잔여 제안 채택: 문서 drift 가드 + 전용 스캐너 병행 레시피 + 테스트 티어 안내 (UR-0017)
|
|
4
|
+
|
|
5
|
+
**GPT 5.5 Pro 평가 후속 라운드** — 1.35.7 에서 확정버그 3건을 수정했고, 이번엔 잔여 개선제안 중 저위험·고정직성 항목을 채택. 나머지(e2e 3-tier 분리 / minimal lazy-create / AST 검증기)는 UR-0014~0016 으로 백로그 등록.
|
|
6
|
+
|
|
7
|
+
### 채택 (제안⑤⑥ + ③문서파트)
|
|
8
|
+
- **문서 숫자 drift 자동가드 (제안⑤)**: selftest 가 README managed 섹션의 MCP 도구 수(`**N개 도구**`)를 `lib/mcp-tools` 실제 정의 수와 대조 — 사이트가 85↔86 으로 drift 했던 계열의 재발을 릴리스 게이트에서 차단.
|
|
9
|
+
- **전용 스캐너 병행 레시피 (제안⑥)**: README "Guidance vs enforcement" 에 gitleaks-action + leerness scan secrets 병행 워크플로 스니펫 추가. `scan secrets` human 출력에도 포지셔닝 정직 고지 1줄(편의 가드 — CI급 보장은 전용 스캐너 병행, ko/en) — README 만으론 CLI 사용자에게 닿지 않던 갭.
|
|
10
|
+
- **테스트 티어 안내 (제안③ 문서파트)**: README Maturity 에 npm test = 풀 릴리스 게이트(10분+, 의도된 설계) vs test:fast = 개발 루프(1분 미만) 명시. 스크립트 분리 자체는 UR-0014 별도 라운드.
|
|
11
|
+
|
|
12
|
+
### 검증
|
|
13
|
+
- selftest **268** (신규: README 도구 수 정합 + 레시피/고지/티어 문서 존재). full e2e (scan secrets 출력 1줄 추가 — 기존 단언과 충돌 없음 확인).
|
|
14
|
+
|
|
3
15
|
## 1.35.7 — 2026-07-03 — 19th GPT5.5pro 평가: verify-claim declared-pass 부풀림 게이팅 + spec 리포터 파싱 + json ok/reasons (UR-0013)
|
|
4
16
|
|
|
5
17
|
**웹 GPT 5.5 Pro 확장의 독립 평가보고서(1.35.6 게시본 대상) 검토 라운드**. 맹신 X 재현 결과 보고서의 헤드라인 버그가 **3경로 전부 실재** — 원인 분석의 소스 위치까지 정확했음. 검토 중 추가 발견 2건(자기모순 출력 + Node v26 파서 FN)도 함께 수정.
|
package/README.md
CHANGED
|
@@ -81,12 +81,22 @@ The generated workflow is production-grade: it **pins the leerness version** (re
|
|
|
81
81
|
|
|
82
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).
|
|
83
83
|
|
|
84
|
+
For secrets, pair the gate with a **dedicated scanner** in the same workflow — leerness's `scan secrets` is a convenience guard (the same signal your agent sees locally), not a hard guarantee:
|
|
85
|
+
|
|
86
|
+
```yaml
|
|
87
|
+
# add to .github/workflows/leerness-gate.yml (or a separate job)
|
|
88
|
+
- uses: gitleaks/gitleaks-action@v2 # dedicated scanner — the hard-guarantee layer
|
|
89
|
+
- run: npx leerness@<pinned-version> scan secrets . --json # convenience layer — same check your agent runs locally
|
|
90
|
+
```
|
|
91
|
+
|
|
84
92
|
---
|
|
85
93
|
|
|
86
94
|
## Maturity — and why trying it is still cheap
|
|
87
95
|
|
|
88
96
|
Be honest with yourself before you depend on this: leerness is **early and largely solo-maintained**, developed mostly through autonomous AI rounds — so its own `selftest` + e2e suites are the primary quality signal, and external adoption is still small. Don't make it load-bearing on faith: **pin a version**, and treat the differentiated slice — `verify-claim` + the CI `gate` as a required check — as the part worth relying on.
|
|
89
97
|
|
|
98
|
+
(Contributor note: `npm test` is the full release gate — selftest + the entire e2e suite, **10+ minutes by design**. For a quick dev loop use `npm run test:fast` — selftest + smoke, under a minute.)
|
|
99
|
+
|
|
90
100
|
The asymmetry is what makes a trial reasonable anyway: MIT, **0 runtime dependencies**, offline-first, and all state is plain files in *your* repo. Lock-in is near zero — if it doesn't earn its place, remove the tool and your `task`/`decision`/`lesson` files stay. (For secret scanning specifically, mature dedicated tools like gitleaks/trufflehog exist — use those if you need a hard guarantee; leerness's `scan secrets` is a convenience guard, not a replacement.)
|
|
91
101
|
|
|
92
102
|
---
|
|
@@ -115,7 +125,7 @@ MIT
|
|
|
115
125
|
<!-- leerness:project-readme:start -->
|
|
116
126
|
## Leerness Project Harness
|
|
117
127
|
|
|
118
|
-
이 프로젝트는 Leerness v1.35.
|
|
128
|
+
이 프로젝트는 Leerness v1.35.8 하네스를 사용합니다. AI 에이전트는 작업 전 `leerness handoff`로 컨텍스트를 적재하고, 작업 후 `leerness check`/`leerness audit`/`leerness session close`를 수행해야 합니다.
|
|
119
129
|
|
|
120
130
|
### 정체성 — AI 에이전트 운영 레이어 (UR-0030)
|
|
121
131
|
|
|
@@ -169,7 +179,7 @@ leerness memory restore decision <date|title>
|
|
|
169
179
|
|
|
170
180
|
### MCP server (외부 AI 통합)
|
|
171
181
|
|
|
172
|
-
Leerness v1.35.
|
|
182
|
+
Leerness v1.35.8는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code · Cursor · Codex CLI 등 외부 AI에 **86개 도구**를 노출:
|
|
173
183
|
|
|
174
184
|
```jsonc
|
|
175
185
|
// 카테고리별
|
|
@@ -190,7 +200,7 @@ Leerness v1.35.7는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code
|
|
|
190
200
|
`<<autonomous-loop-dynamic>>` 신호만 보내면 AI가:
|
|
191
201
|
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) 다음 라운드 예약.
|
|
192
202
|
|
|
193
|
-
현재 누적: **70 라운드 (1.9.40 → 1.35.
|
|
203
|
+
현재 누적: **70 라운드 (1.9.40 → 1.35.8)** · 매 라운드 GitHub release/태그 생성 · _reports/는 비공개 보존.
|
|
194
204
|
|
|
195
205
|
### 성능 가이드 (1.9.140 측정)
|
|
196
206
|
|
|
@@ -228,6 +238,6 @@ leerness release pack --close --auto-main-push
|
|
|
228
238
|
- `.harness/session-handoff.md`: 다음 세션 인수인계 (자동 작성)
|
|
229
239
|
- `.harness/lessons.md` / `decisions.md` / `rules.md`: 영구 메모리 (5 surface)
|
|
230
240
|
|
|
231
|
-
Last synced by Leerness v1.35.
|
|
241
|
+
Last synced by Leerness v1.35.8: 2026-07-03
|
|
232
242
|
<!-- leerness:project-readme:end -->
|
|
233
243
|
|
package/bin/leerness.js
CHANGED
|
@@ -32,7 +32,7 @@ const { _evidenceQuality, _parseEvidenceStats, _shellGuardAnalyze, _claimFileInG
|
|
|
32
32
|
// 1.9.295 (UR-0025 4단계): 정적 데이터 카탈로그 모듈 분리 (비파괴, require-based).
|
|
33
33
|
const { CAPABILITY_SURFACE, POWERFUL_COMMANDS, ADAPTERS, REUSE_CATEGORIES, REUSE_CHECKLIST, _DEFAULT_PLATFORM_CONSTRAINTS, _DEFAULT_DOMAIN_CATALOG, _TOOL_CATALOG, _LSP_LANG_PATTERNS, OPTIMISM_PATTERNS, BUILT_IN_PERSONAS, STRINGS, BUILTIN_CATALOG, ROADMAP_STATUS_LABEL, ROADMAP_STATUS_COLOR, SECRET_PATTERNS, MERGE_OVERWRITE_FILES, MINIMAL_SKIP_KEYS, REQUIRED_WORKSPACE_FILES, KEYWORD_STOPWORDS, SKILL_CATALOG_PRESETS } = require('../lib/catalogs'); // 1.9.344/368/369 (UR-0025): catalog 분리 · 1.11.4 (UR-0007): _TOOL_CATALOG
|
|
34
34
|
|
|
35
|
-
const VERSION = '1.35.
|
|
35
|
+
const VERSION = '1.35.8';
|
|
36
36
|
|
|
37
37
|
// 1.9.290 (UR-0037, Codex gpt-5.5 #4 수렴): CLI 전용 부작용은 require 시 실행하지 않는다.
|
|
38
38
|
// 이전: warning listener 제거 / NODE_OPTIONS 변경 / chcp IIFE 가 top-level 즉시 실행 → require('harness') 시 호스트 프로세스 오염.
|
|
@@ -2905,6 +2905,17 @@ function _selfTestCases() {
|
|
|
2905
2905
|
const jsonOk = src.includes('out.ok = out.reasons.length === 0') && src.includes('if (!out.ok) return process.exit(1)');
|
|
2906
2906
|
return parseOk && gateWired && jsonOk;
|
|
2907
2907
|
} },
|
|
2908
|
+
{ name: '19th GPT5.5평가 제안⑤⑥ (UR-0017): README MCP 도구 수 ↔ lib/mcp-tools 정합(문서 drift 가드) + 전용 스캐너 병행 레시피/포지셔닝/테스트 티어 문서화 (1.35.8)', run: () => {
|
|
2909
|
+
// (⑤) 문서 숫자 drift: README managed 섹션의 "**N개 도구**" 가 실제 MCP 도구 정의 수와 일치해야 함 (사이트 85↔86 drift 재발 방지 계열).
|
|
2910
|
+
const readme = read(path.join(__dirname, '..', 'README.md'));
|
|
2911
|
+
const m = readme.match(/\*\*(\d+)개 도구\*\*/);
|
|
2912
|
+
const tools = require('../lib/mcp-tools').length;
|
|
2913
|
+
const managedOk = !!m && parseInt(m[1], 10) === tools;
|
|
2914
|
+
// (⑥) 전용 스캐너 병행 레시피(README) + scan secrets 출력 포지셔닝 고지 + 테스트 티어 안내.
|
|
2915
|
+
const recipeOk = /gitleaks\/gitleaks-action/.test(readme) && /test:fast/.test(readme);
|
|
2916
|
+
const advisoryOk = /pair with a dedicated scanner \(gitleaks\/trufflehog\)/.test(read(__filename));
|
|
2917
|
+
return managedOk && recipeOk && advisoryOk;
|
|
2918
|
+
} },
|
|
2908
2919
|
{ name: 'honesty-check: AI 인식론적 정직성 3차원 + MCP/CLI/strict 통합 (사용자명시 1.9.305)', run: () => { const h = _epistemicHonestyCheck; const d1 = h('이 기능은 항상 정상 동작합니다').findings.some(f => f.dim === 'pretend-knowledge'); const d2 = h('아마 될 것 같습니다. 구현 완료했습니다').findings.some(f => f.dim === 'premature-judgment'); const d3 = h('이 API 의 rate limit 은 초당 5회입니다').findings.some(f => f.dim === 'no-info-gathering'); const clean = h('src/api.js 수정, 12/12 통과 (Exit: 0)').ok === true; const src = read(__filename); const wired = require('../lib/mcp-tools').some(t => t.name === 'leerness_honesty_check') && /if \(cmd === 'honesty-check'\)/.test(src) && /honestyFindings = _epistemicHonestyCheck/.test(src); return d1 && d2 && d3 && clean && wired; } },
|
|
2909
2920
|
{ name: 'exit code 일관성: fail()→exitCode 1 행위 + unknown 명령 안내 (UR-0045 / CV-5 행위화 1.9.366)', run: () => { if (typeof fail !== 'function') return false; const saved = process.exitCode; const _w = process.stdout.write; let setOk = false; try { process.stdout.write = () => true; process.exitCode = 0; fail('selftest probe'); setOk = process.exitCode === 1; } finally { process.stdout.write = _w; process.exitCode = saved; } const src = read(__filename); const dispatchOk = /알 수 없는 명령: \$\{cmd\}/.test(src); return setOk && dispatchOk; } },
|
|
2910
2921
|
{ name: 'brief: 프로젝트 청사진 set/show/export + README 개요 섹션 (UR-0055 사용자명시 1.9.307)', run: () => { const src = read(__filename); const fnOk = typeof briefCmd === 'function' && typeof _loadBrief === 'function' && typeof _briefBlueprint === 'function' && _BRIEF_FIELDS.length === 10; const b = { project: 'X', intro: 'i', purpose: 'p', problem: '', features: ['f1', 'f2'], stack: ['s'], architecture: '', users: [], success: [], nonGoals: [], currentState: '' }; const bp = _briefBlueprint(b, VERSION); const bpOk = /Blueprint/.test(bp) && /소개 \(Intro\)/.test(bp) && /f1/.test(bp) && /신규 프로젝트 시작 가이드/.test(bp); const rb = _briefReadmeBlock(b); const rbOk = rb.includes(BRIEF_START) && rb.includes(BRIEF_END) && /프로젝트 개요/.test(rb) && /\*\*목적\*\*/.test(rb); return fnOk && bpOk && rbOk && /if \(cmd === 'brief'\)/.test(src); } },
|
|
@@ -8238,6 +8249,10 @@ function scanSecrets(root, opts = {}) {
|
|
|
8238
8249
|
if (ignored.length) {
|
|
8239
8250
|
log(` ⓘ gitignored ${ignored.length}건 (커밋 제외 — 설계상 안전 보관, 비실패): ${[...new Set(ignored.map(f => f.file))].join(', ')}`);
|
|
8240
8251
|
}
|
|
8252
|
+
// 1.35.8 (UR-0017, GPT5.5평가 제안⑥): 포지셔닝 정직 고지 — 편의 가드임을 출력에서도 명시(README 만으론 CLI 사용자에게 안 닿음).
|
|
8253
|
+
log(_uiLang(root) === 'en'
|
|
8254
|
+
? ` ⓘ positioning: convenience guard for agent workflows — for CI-grade guarantees pair with a dedicated scanner (gitleaks/trufflehog). Recipe: README "Guidance vs enforcement".`
|
|
8255
|
+
: ` ⓘ 포지셔닝: 에이전트 워크플로용 편의 가드 — CI급 보장이 필요하면 전용 스캐너(gitleaks/trufflehog)와 병행하세요. 레시피: README "Guidance vs enforcement".`);
|
|
8241
8256
|
}
|
|
8242
8257
|
|
|
8243
8258
|
function encodingCheck(root, opts = {}) {
|