leerness 1.36.31 → 1.36.32
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 +8 -0
- package/README.md +4 -4
- package/bin/leerness.js +1 -1
- package/package.json +1 -1
- package/scripts/e2e.js +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.36.32 — 2026-07-15 — e2e 그린 복원 + 게이트 절차 정직 교정 (자기 감사)
|
|
4
|
+
|
|
5
|
+
**정정(정직 기록)**: 1.36.30/1.36.31 의 CHANGELOG 는 "게이트 e2e" 통과를 주장했지만 **사실이 아니었다** — 1.36.30 의 자동생성 전환(roadmap.html→leerness.html)으로 e2e 의 구식 단언 4건이 실패·크래시했는데, 게이트 러너 래퍼(`npm test > log; echo $?`)의 echo 가 exit code 를 0 으로 가려 두 릴리스가 e2e 실패 상태로 게시됐다(28/29 는 진짜 386/386). selftest 와 라이브 클린룸 실증은 두 릴리스 모두 실제로 통과했으므로 게시된 기능 자체는 검증돼 있었으나, e2e 전체 그린 주장은 과잉이었다.
|
|
6
|
+
|
|
7
|
+
- **e2e 단언 4건 현행화**: 자동생성 대상 단언을 leerness.html 로 (수동 `leerness roadmap` 의 roadmap.html 테스트 3건은 불변 — 여전히 유효한 기능).
|
|
8
|
+
- **게이트 절차 교정**: 러너에서 exit 마스킹 echo 제거 — npm test 의 exit 가 그대로 전파. 성공 판정에 "E2E result: N/N passed" 라인 존재를 필수 조건으로 추가.
|
|
9
|
+
- **검증**: 이번 릴리스는 전체 게이트(selftest 301 + e2e 전체)를 exit 전파형으로 통과한 것만 게시.
|
|
10
|
+
|
|
3
11
|
## 1.36.31 — 2026-07-15 — 동시성 직렬화 — 병렬 에이전트의 lost update 차단 (codex 미검토표면 헌트 이연분 #1/#2/#5/#7)
|
|
4
12
|
|
|
5
13
|
1.36.28 헌트에서 이연했던 동시성 P1 계열. 기존 `_withLock`(원자 배타 생성 + stale 회수 + 재진입 안전)을 재사용 — 새 락 발명 아님.
|
package/README.md
CHANGED
|
@@ -121,7 +121,7 @@ MIT
|
|
|
121
121
|
<!-- leerness:project-readme:start -->
|
|
122
122
|
## Leerness Project Harness
|
|
123
123
|
|
|
124
|
-
이 프로젝트는 Leerness v1.36.
|
|
124
|
+
이 프로젝트는 Leerness v1.36.32 하네스를 사용합니다. AI 에이전트는 작업 전 `leerness handoff`로 컨텍스트를 적재하고, 작업 후 `leerness check`/`leerness audit`/`leerness session close`를 수행해야 합니다.
|
|
125
125
|
|
|
126
126
|
### 정체성 — AI 에이전트 운영 레이어 (UR-0030)
|
|
127
127
|
|
|
@@ -175,7 +175,7 @@ leerness memory restore decision <date|title>
|
|
|
175
175
|
|
|
176
176
|
### MCP server (외부 AI 통합)
|
|
177
177
|
|
|
178
|
-
Leerness v1.36.
|
|
178
|
+
Leerness v1.36.32는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code · Cursor · Codex CLI 등 외부 AI에 **86개 도구**를 노출:
|
|
179
179
|
|
|
180
180
|
```jsonc
|
|
181
181
|
// 카테고리별
|
|
@@ -196,7 +196,7 @@ Leerness v1.36.31는 stdio JSON-RPC MCP server를 내장합니다 — Claude Cod
|
|
|
196
196
|
`<<autonomous-loop-dynamic>>` 신호만 보내면 AI가:
|
|
197
197
|
1) 다음 라운드 후보 선정 → 2) 코드 변경 → 3) stress-v* 신규 작성 + 누적 회귀 → 4) e2e 219/219 → 5) npm pack + git tag + GitHub release → 6) main 자동 push → 7) session close → 8) 다음 라운드 예약.
|
|
198
198
|
|
|
199
|
-
현재 누적: **70 라운드 (1.9.40 → 1.36.
|
|
199
|
+
현재 누적: **70 라운드 (1.9.40 → 1.36.32)** · 매 라운드 GitHub release/태그 생성 · _reports/는 비공개 보존.
|
|
200
200
|
|
|
201
201
|
### 성능 가이드
|
|
202
202
|
|
|
@@ -234,6 +234,6 @@ leerness release pack --close --auto-main-push
|
|
|
234
234
|
- `.harness/session-handoff.md`: 다음 세션 인수인계 (자동 작성)
|
|
235
235
|
- `.harness/lessons.md` / `decisions.md` / `rules.md`: 영구 메모리 (5 surface)
|
|
236
236
|
|
|
237
|
-
Last synced by Leerness v1.36.
|
|
237
|
+
Last synced by Leerness v1.36.32: 2026-07-15
|
|
238
238
|
<!-- leerness:project-readme:end -->
|
|
239
239
|
|
package/bin/leerness.js
CHANGED
|
@@ -34,7 +34,7 @@ const { CAPABILITY_SURFACE, POWERFUL_COMMANDS, ADAPTERS, REUSE_CATEGORIES, REUSE
|
|
|
34
34
|
const { tokenizeForRank: _tokenizeForRank, expandQuery: _expandQuery, scoreHits: _scoreHits, suggestTerms: _suggestTerms } = require('../lib/search-core'); // 1.36.23: memory search 랭킹 코어(순수·0-deps)
|
|
35
35
|
const { findCorruptedStateJson: _findCorruptedStateJson } = require('../lib/state-integrity'); // 1.36.1 (클린룸 리뷰 FN): .harness/*.json 상태 무결성 (audit/health/check 공유)
|
|
36
36
|
|
|
37
|
-
const VERSION = '1.36.
|
|
37
|
+
const VERSION = '1.36.32';
|
|
38
38
|
|
|
39
39
|
// 1.9.290 (UR-0037, Codex gpt-5.5 #4 수렴): CLI 전용 부작용은 require 시 실행하지 않는다.
|
|
40
40
|
// 이전: warning listener 제거 / NODE_OPTIONS 변경 / chcp IIFE 가 top-level 즉시 실행 → require('harness') 시 호스트 프로세스 오염.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.36.
|
|
3
|
+
"version": "1.36.32",
|
|
4
4
|
"description": "The AI-coding operations layer that makes \"done\" require evidence — persistent memory, evidence-gated completion checks, and clean handoffs for any AI agent (Claude Code, Codex, Cursor). State lives as plain files in your repo. CLI + MCP, 0 runtime dependencies.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|
package/scripts/e2e.js
CHANGED
|
@@ -2228,8 +2228,8 @@ total++;
|
|
|
2228
2228
|
{
|
|
2229
2229
|
const tmpA = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-auto1-'));
|
|
2230
2230
|
cp.spawnSync(process.execPath, [CLI, 'init', tmpA, '--yes', '--language', 'ko', '--skills', 'recommended'], { stdio: 'ignore' });
|
|
2231
|
-
const ok = fs.existsSync(path.join(tmpA, '
|
|
2232
|
-
console.log(ok ? '✓ B(1.9.12) install 직후
|
|
2231
|
+
const ok = fs.existsSync(path.join(tmpA, 'leerness.html'));
|
|
2232
|
+
console.log(ok ? '✓ B(1.9.12) install 직후 leerness.html(온톨로지) 자동 생성 (1.36.30 전환)' : '✗ install 후 leerness.html 없음');
|
|
2233
2233
|
if (!ok) failed++;
|
|
2234
2234
|
}
|
|
2235
2235
|
|
|
@@ -2239,7 +2239,7 @@ total++;
|
|
|
2239
2239
|
const tmpA = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-auto2-'));
|
|
2240
2240
|
cp.spawnSync(process.execPath, [CLI, 'init', tmpA, '--yes', '--language', 'ko', '--skills', 'recommended'], { stdio: 'ignore' });
|
|
2241
2241
|
// 첫 mtime 캡처
|
|
2242
|
-
const f = path.join(tmpA, '
|
|
2242
|
+
const f = path.join(tmpA, 'leerness.html');
|
|
2243
2243
|
const mt1 = fs.statSync(f).mtimeMs;
|
|
2244
2244
|
// 시간 차이 보장
|
|
2245
2245
|
const wait = Date.now() + 50; while (Date.now() < wait) {}
|
|
@@ -2248,7 +2248,7 @@ total++;
|
|
|
2248
2248
|
cp.spawnSync(process.execPath, [CLI, 'session', 'close', tmpA], { stdio: 'ignore' });
|
|
2249
2249
|
const mt2 = fs.statSync(f).mtimeMs;
|
|
2250
2250
|
const ok = mt2 > mt1;
|
|
2251
|
-
console.log(ok ? '✓ B(1.9.12) session close 후
|
|
2251
|
+
console.log(ok ? '✓ B(1.9.12) session close 후 leerness.html 자동 갱신 (mtime 증가)' : `✗ session close 후 갱신 안 됨 mt1=${mt1} mt2=${mt2}`);
|
|
2252
2252
|
if (!ok) failed++;
|
|
2253
2253
|
}
|
|
2254
2254
|
|
|
@@ -2258,14 +2258,14 @@ total++;
|
|
|
2258
2258
|
const tmpA = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-auto3-'));
|
|
2259
2259
|
cp.spawnSync(process.execPath, [CLI, 'init', tmpA, '--yes', '--language', 'ko', '--skills', 'recommended'], { stdio: 'ignore' });
|
|
2260
2260
|
cp.spawnSync(process.execPath, [CLI, 'roadmap', 'auto', 'off', '--path', tmpA], { stdio: 'ignore' });
|
|
2261
|
-
const f = path.join(tmpA, '
|
|
2261
|
+
const f = path.join(tmpA, 'leerness.html');
|
|
2262
2262
|
const mt1 = fs.statSync(f).mtimeMs;
|
|
2263
2263
|
const wait = Date.now() + 80; while (Date.now() < wait) {}
|
|
2264
2264
|
cp.spawnSync(process.execPath, [CLI, 'task', 'add', '비활성 후 추가', '--path', tmpA], { stdio: 'ignore' });
|
|
2265
2265
|
cp.spawnSync(process.execPath, [CLI, 'session', 'close', tmpA], { stdio: 'ignore' });
|
|
2266
2266
|
const mt2 = fs.statSync(f).mtimeMs;
|
|
2267
2267
|
const ok = mt2 === mt1;
|
|
2268
|
-
console.log(ok ? '✓ B(1.9.12) auto off:
|
|
2268
|
+
console.log(ok ? '✓ B(1.9.12) auto off: leerness.html 갱신 안 됨' : `✗ auto off 후에도 갱신됨`);
|
|
2269
2269
|
if (!ok) failed++;
|
|
2270
2270
|
}
|
|
2271
2271
|
|
|
@@ -2275,7 +2275,7 @@ total++;
|
|
|
2275
2275
|
const tmpA = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-auto4-'));
|
|
2276
2276
|
cp.spawnSync(process.execPath, [CLI, 'init', tmpA, '--yes', '--language', 'ko', '--skills', 'recommended'], { stdio: 'ignore' });
|
|
2277
2277
|
cp.spawnSync(process.execPath, [CLI, 'roadmap', 'auto', 'on', '--on-every-change', '--path', tmpA], { stdio: 'ignore' });
|
|
2278
|
-
const f = path.join(tmpA, '
|
|
2278
|
+
const f = path.join(tmpA, 'leerness.html');
|
|
2279
2279
|
const mt1 = fs.statSync(f).mtimeMs;
|
|
2280
2280
|
const wait = Date.now() + 80; while (Date.now() < wait) {}
|
|
2281
2281
|
cp.spawnSync(process.execPath, [CLI, 'task', 'add', 'on-every-change 테스트', '--path', tmpA], { stdio: 'ignore' });
|