leerness 1.34.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.34.0",
3
+ "version": "1.35.0",
4
4
  "description": "Leerness: 비파괴 마이그레이션, 자동 버전 감지·업데이트, 계획/진행/핸드오프 자동화, 게으름·시크릿·인코딩 자동 가드, Claude Code 슬래시 통합을 갖춘 한국어 우선 AI 개발 하네스.",
5
5
  "keywords": [
6
6
  "leerness",
package/scripts/e2e.js CHANGED
@@ -6435,6 +6435,40 @@ total++;
6435
6435
  if (!ok) failed++;
6436
6436
  }
6437
6437
 
6438
+ // 1.34.1 회귀 (16th리뷰 정직화 실증): gate --claims 정밀성 가치 — 워크스페이스가 깨끗(lazy detect 0 finding)한데 콘텐츠-레벨 거짓(부풀린 테스트 카운트)인 경우, 기본 5체크는 통과(exit 0)하고 --claims 만 차단(exit 1). 이 판별 케이스가 깨지면(기본도 잡거나 --claims가 못 잡으면) --claims 의 차별 가치가 사라진 것이므로 가드.
6439
+ total++;
6440
+ {
6441
+ let ok = false;
6442
+ try {
6443
+ const d = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-disc-'));
6444
+ const R = (a) => cp.spawnSync(process.execPath, [CLI, ...a, '--path', d], { encoding: 'utf8', timeout: 30000 });
6445
+ cp.spawnSync(process.execPath, [CLI, 'init', d, '--yes'], { encoding: 'utf8', timeout: 30000 });
6446
+ fs.writeFileSync(path.join(d, 'calc.js'), 'function add(a,b){return a+b}\nmodule.exports={add}\n');
6447
+ fs.mkdirSync(path.join(d, 'tests'));
6448
+ fs.writeFileSync(path.join(d, 'tests', 'calc.test.js'), 'const {add}=require("../calc.js");\ntest("a",()=>{if(add(1,2)!==3)throw 0});\n');
6449
+ // lazy detect 완전 무력화: 유효 handoff(Last generated + 비어있지 않은 섹션) + test-run 기록
6450
+ fs.writeFileSync(path.join(d, '.harness', 'session-handoff.md'), '# Handoff\nLast generated: 2026-06-19T00:00:00Z\n\n## Completed\n- calc.js add() 구현 + 테스트\n\n## Next Exact Step\n- 배포\n');
6451
+ fs.writeFileSync(path.join(d, '.harness', 'review-evidence.md'), '# Evidence\n## Test run\n- npm test: 1/1 passing\n');
6452
+ // 콘텐츠-레벨 거짓: 실파일/실테스트 존재하나 evidence 가 테스트 50개 통과(실제 1개) 부풀림
6453
+ const id = (R(['task', 'add', 'calc 구현']).stdout.match(/T-\d{4,}/) || [])[0];
6454
+ R(['task', 'update', id, '--status', 'done', '--evidence', 'calc.js + tests/calc.test.js 테스트 50개 통과']);
6455
+ // lazy detect 깨끗(blocking 0) 확인
6456
+ const lz = JSON.parse(R(['lazy', 'detect', '.', '--json']).stdout);
6457
+ const lazyClean = R(['lazy', 'detect', '.']).status === 0 && (lz.findings || []).length === 0;
6458
+ // 핵심 판별: 기본 게이트는 통과(exit 0), --claims 만 차단(exit 1)
6459
+ const gDef = R(['gate', '.']);
6460
+ const gClaims = R(['gate', '.', '--claims', '--json']);
6461
+ const gcj = JSON.parse(gClaims.stdout);
6462
+ const vcCheck = gcj.checks.find((c) => c.name === 'verify-claims');
6463
+ const lazyCheck = gcj.checks.find((c) => c.name === 'lazy detect');
6464
+ const discriminates = gDef.status === 0 && gClaims.status === 1 && vcCheck && vcCheck.ok === false && lazyCheck && lazyCheck.ok === true;
6465
+ fs.rmSync(d, { recursive: true, force: true });
6466
+ ok = lazyClean && discriminates;
6467
+ } catch (e) {}
6468
+ console.log(ok ? '✓ B(1.34.1) gate --claims 정밀성 REAL: 워크스페이스 깨끗(lazy 0) + 콘텐츠거짓(부풀린카운트) → 기본 5체크 통과(exit 0), --claims 만 차단(exit 1)' : '✗ gate --claims 정밀성 판별 가드 실패');
6469
+ if (!ok) failed++;
6470
+ }
6471
+
6438
6472
  // 1.9.430 (10th 외부평가 UR-0130): health 보안 CRITICAL(커밋 시크릿)은 --strict 없이도 exit 1(CI 게이트). 클린은 exit 0.
6439
6473
  total++;
6440
6474
  {