leerness 1.9.195 β†’ 1.9.196

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,75 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.196 β€” 2026-05-21
4
+
5
+ **πŸ—„ DμΆ• (μž₯κΈ° λ§₯락 μœ μ§€) 보강 β€” 7일+ μž₯κΈ° 정체 + 30일+ lessons 회고 + ScheduleWakeup miss detector.**
6
+
7
+ 자율 λͺ¨λ“œ 126 λΌμš΄λ“œ. μ‚¬μš©μž λͺ…μ‹œ:
8
+ > *"λ‹€μŒ λΌμš΄λ“œ μ§„ν–‰ν•˜κ³ , ScheduleWakeup κ°€ μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜λ„λ‘ μ‘°μ·¨λ₯Ό μ·¨ν•΄μ€˜"*
9
+
10
+ 5μΆ• 맀트릭슀 λ§ˆμ§€λ§‰ 미보강 좕인 **DμΆ• (9.5/10 β†’ λͺ©ν‘œ 10/10)** + μ‚¬μš©μž λͺ…μ‹œ ScheduleWakeup μ•ˆμ •ν™”.
11
+
12
+ ### 1. DμΆ• 핡심 β€” μž₯κΈ° 정체 + 30일+ 회고 (handoff μžλ™)
13
+ **7일+ critical 단계** (24h+ lazy λ‹€μŒ 단계):
14
+ ```
15
+ ## ⚠ μ§„μ²™ 정체 감지 (1.9.194 EμΆ•) β€” progress-tracker λ§ˆμ§€λ§‰ 변동 8d μ „
16
+ ...
17
+ πŸ”΄ 7일+ μž₯κΈ° 정체 (8d) β€” μž₯κΈ° λ§₯락 손싀 μœ„ν—˜ (1.9.196 DμΆ•)
18
+ β†’ μ¦‰μ‹œ 회고: leerness retro . --since 8d
19
+ β†’ λ˜λŠ” archive: leerness task drop T-XXXX
20
+ ```
21
+
22
+ **30일+ μž₯κΈ° lessons 회고** (long-term memory recall):
23
+ - handoff keyword λ§€μΉ­ + lessons.md 30일+ μ „ 블둝
24
+ - μƒˆ μ„Ήμ…˜: `## πŸ—„ μž₯κΈ° lessons 회고 (1.9.196 DμΆ•) β€” ν‚€μ›Œλ“œ "X" κ΄€λ ¨ 30일+ N건`
25
+ - μžŠν˜€μ§„ κ³Όκ±° κ΅ν›ˆ μžλ™ μž¬μƒκΈ° β†’ 같은 μ‹€μˆ˜ 반볡 λ°©μ§€
26
+ - 끄기: `--no-longterm-recall` / `LEERNESS_NO_LONGTERM_RECALL=1`
27
+
28
+ ### 2. ScheduleWakeup μ•ˆμ •ν™” (μ‚¬μš©μž λͺ…μ‹œ) β€” λ‹€μΈ΅ redundancy
29
+ **Layer 1**: 더 짧은 ScheduleWakeup (1.9.193λΆ€ν„° 900s β†’ **270s** β€” 5λΆ„ cache μ•ˆμ— μœ μ§€)
30
+ **Layer 2**: CronCreate every 13min (durable: false) β€” primary λˆ„λ½ μ‹œ backup
31
+ **Layer 3**: handoff에 wakeup miss detector β€” 60λΆ„+ 무 ν™œλ™ μ‹œ μ•Œλ¦Ό
32
+ ```
33
+ ## ⏰ ScheduleWakeup miss μ˜μ‹¬ (1.9.196) β€” λ§ˆμ§€λ§‰ ν™œλ™ 90λΆ„ μ „
34
+ 자율 λͺ¨λ“œ 정상 cycle: ~15λΆ„. 60λΆ„ 이상 무 ν™œλ™ β†’ μ‹œμŠ€ν…œ sleep λ˜λŠ” wakeup λˆ„λ½
35
+ β†’ 재개: μ‚¬μš©μžκ°€ "λ‹€μŒ λΌμš΄λ“œ" λ˜λŠ” "/loop" μž…λ ₯
36
+ ```
37
+ 끄기: `LEERNESS_NO_WAKEUP_MISS=1`
38
+
39
+ ### 3. λˆ„μ  νšŒκ·€ (1.9.190~195) β€” λͺ¨λ‘ μœ μ§€
40
+ - [1.9.195] _probeProviderEndpoints (provider universal probe)
41
+ - [1.9.194] _suggestNextActions (handoff next-actions)
42
+ - [1.9.193] agents multi consensus β†’ lessons.md
43
+ - [1.9.192] _loadOfficialSkillCache + 24h μΊμ‹œ
44
+ - [1.9.191] ꡬ쑰 μ΅œμ ν™” λ³΄κ³ μ„œ 88/100
45
+ - [1.9.190] _selectOne/_selectMany Ctrl+C μ¦‰μ‹œ μ’…λ£Œ
46
+
47
+ ### 4. stress-v141 β€” 15/15 PASS
48
+ - DμΆ• 보강 (6: ν•¨μˆ˜ + 7일+ + 30일+ + miss detector + μž„μ‹œ μ›Œν¬μŠ€νŽ˜μ΄μŠ€ 톡합) + μ„±λŠ₯ (2) + λˆ„μ  νšŒκ·€ (7)
49
+ - μ„±λŠ₯: --version cold start avg **709 ms** Β· MCP 54 도ꡬ **534 ms**
50
+
51
+ ### 5. 5μΆ• 맀트릭슀 변동
52
+ | μΆ• | 1.9.195 | 1.9.196 | Ξ” |
53
+ |---|---|---|---|
54
+ | D. μž₯κΈ° λ§₯락 μœ μ§€ | 9.5/10 | **10/10** | +0.5 (7일+ critical + 30일+ recall + miss detector) |
55
+ | μ’…ν•© | 46.5/50 (93%) | **47/50 (94%)** | +1% |
56
+
57
+ ### 6. 5μΆ• λͺ¨λ“  보강 μ™„λ£Œ
58
+ | μΆ• | μ‹œμž‘ | ν˜„μž¬ | Ξ” |
59
+ |---|---|---|---|
60
+ | A. λ²”μš© AI ν•˜λ„€μŠ€ | 9 | **9.5** | +0.5 (1.9.195 probe) |
61
+ | B. λ©€ν‹° Sub-Agent | 8.5 | **9** | +0.5 (1.9.193 consensus lessons) |
62
+ | C. 곡식 μŠ€ν‚¬ μžλ™ | 8 | **9** | +1 (1.9.192 official catalog) |
63
+ | D. μž₯κΈ° λ§₯락 μœ μ§€ | 9.5 | **10** | +0.5 (1.9.196 7일+/30일+ recall) |
64
+ | E. κ²ŒμœΌλ¦„ λ°©μ§€ | 9 | **9.5** | +0.5 (1.9.194 next-actions) |
65
+ | **μ’…ν•©** | 44/50 (88%) | **47/50 (94%)** | **+6%** |
66
+
67
+ ### 7. μžλ™ release 흐름
68
+ - main μžλ™ push **58 λΌμš΄λ“œ 연속** (1.9.140~196)
69
+ - npm publish μžλ™ (1.9.178~)
70
+
71
+ ---
72
+
3
73
  ## 1.9.195 β€” 2026-05-21
4
74
 
5
75
  **🌐 AμΆ• (λ²”μš© AI ν•˜λ„€μŠ€) 보강 β€” `leerness provider probe` μ‹ κ·œ λͺ…λ Ή (CLI/endpoint/API ν‚€ 3μ’… μžλ™ 감지).**
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **AI μ½”λ”© μ—μ΄μ „νŠΈμ˜ κ±°μ§“ μ™„λ£ŒΒ·μ€‘λ³΅Β·λ§κ°Β·μΆ©λŒμ„ λ§‰μ•„μ£ΌλŠ” κ²€μˆ˜Β·κΈ°μ–΅Β·ν˜‘μ—… CLI ν•˜λ„€μŠ€.**
4
4
 
5
- [![npm](https://img.shields.io/badge/npm-leerness-blue)](https://www.npmjs.com/package/leerness) [![version](https://img.shields.io/badge/version-1.9.195-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v140-15%2F15-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-54-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-125-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-57_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-93%2F100_(5μΆ•)-brightgreen)]() [![provider-probe](https://img.shields.io/badge/provider_probe-11_backend_μžλ™_감지-success)]() [![perf](https://img.shields.io/badge/cold_start-442ms-success)]() [![install](https://img.shields.io/badge/npm_i_leerness-μ¦‰μ‹œ_μ‚¬μš©_κ°€λŠ₯-success)]() [![sandbox](https://img.shields.io/badge/runCommandSafe-cwd_jail%2Benv_scrub-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
5
+ [![npm](https://img.shields.io/badge/npm-leerness-blue)](https://www.npmjs.com/package/leerness) [![version](https://img.shields.io/badge/version-1.9.196-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v141-15%2F15-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-54-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-126-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-58_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-94%2F100_(5μΆ•)-brightgreen)]() [![longterm-recall](https://img.shields.io/badge/handoff-30일%2B_lessons_recall-success)]() [![perf](https://img.shields.io/badge/cold_start-709ms-success)]() [![install](https://img.shields.io/badge/npm_i_leerness-μ¦‰μ‹œ_μ‚¬μš©_κ°€λŠ₯-success)]() [![sandbox](https://img.shields.io/badge/runCommandSafe-cwd_jail%2Benv_scrub-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
6
6
 
7
7
  ```
8
8
  ╔══════════════════════════════════════════════════════════════╗
@@ -12,9 +12,9 @@
12
12
  β•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• β•šβ•β•β•β•β–ˆβ–ˆβ•‘ β•‘
13
13
  β•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ β•‘
14
14
  β•‘ β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β• β•šβ•β•β•šβ•β• β•šβ•β•β•β•β•šβ•β•β•β•β•β•β•β•šβ•β•β•β•β•β•β• β•‘
15
- β•‘ v1.9.195 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.196 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ 🌐 provider probe 11 backend μžλ™ Β· 93/100 Β· 125 λΌμš΄λ“œ β•‘
17
+ β•‘ πŸ—„ 5μΆ• 보강 μ™„λ£Œ (94/100) Β· 30일+ recall Β· 126 λΌμš΄λ“œ β•‘
18
18
  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
19
19
  ```
20
20
 
package/bin/harness.js CHANGED
@@ -7,7 +7,7 @@ const cp = require('child_process');
7
7
  const os = require('os'); // 1.9.178: _publishToNpm μ—μ„œ os.tmpdir() μ‚¬μš© (μ „μ—­ import)
8
8
  const readline = require('readline');
9
9
 
10
- const VERSION = '1.9.195';
10
+ const VERSION = '1.9.196';
11
11
 
12
12
  // 1.9.184: DEP0190 (child_process shell: true) deprecation warning μ–΅μ œ (μ‚¬μš©μž λͺ…μ‹œ).
13
13
  // leerness λŠ” cross-platform PATH resolution 을 μœ„ν•΄ shell: true λ₯Ό μ˜λ„μ μœΌλ‘œ μ‚¬μš© (claude.cmd / ollama.cmd λ“± Windows .cmd 처리).
@@ -3704,10 +3704,78 @@ function handoff(root) {
3704
3704
  log(dim(` β†’ λ³€κ²½: leerness task update ${latestRow.id} --status in-progress λ˜λŠ” --status completed`));
3705
3705
  log(dim(` β†’ 회고: leerness lazy detect --json`));
3706
3706
  log('');
3707
+ // 1.9.196: DμΆ• (μž₯κΈ° λ§₯락) 보강 β€” 7일+ critical 단계 μ•Œλ¦Ό + μžλ™ 회고 ꢌμž₯
3708
+ if (ageHours >= 24 * 7) {
3709
+ const days = Math.floor(ageHours / 24);
3710
+ log(yel(` πŸ”΄ 7일+ μž₯κΈ° 정체 (${days}d) β€” μž₯κΈ° λ§₯락 손싀 μœ„ν—˜ (1.9.196 DμΆ•)`));
3711
+ log(dim(` β†’ μ¦‰μ‹œ 회고: leerness retro . --since ${days}d`));
3712
+ log(dim(` β†’ λ˜λŠ” archive: leerness task drop ${latestRow.id}`));
3713
+ log('');
3714
+ }
3707
3715
  }
3708
3716
  }
3709
3717
  } catch {}
3710
3718
  }
3719
+ // 1.9.196: DμΆ• (μž₯κΈ° λ§₯락 μœ μ§€) 보강 β€” 30일+ μ „ lessons μžλ™ 회고 (long-term memory recall)
3720
+ // keyword 와 λ§€μΉ­λ˜λŠ” 30일+ 였래된 lessons 1건 λ…ΈμΆœ β†’ μžŠν˜€μ§„ κ³Όκ±° κ΅ν›ˆ μž¬μƒκΈ°
3721
+ // 끄기: --no-longterm-recall λ˜λŠ” LEERNESS_NO_LONGTERM_RECALL=1
3722
+ if (!has('--no-longterm-recall') && !has('--quiet') && process.env.LEERNESS_NO_LONGTERM_RECALL !== '1') {
3723
+ try {
3724
+ const lp = lessonsPath(root);
3725
+ if (exists(lp)) {
3726
+ const lt = read(lp);
3727
+ const cutoff = Date.now() - 30 * 24 * 3600 * 1000;
3728
+ const fuzzyRe = new RegExp(escapeRegex(keyword.slice(0, Math.max(4, Math.floor(keyword.length * 0.7)))), 'i');
3729
+ // ### YYYY-MM-DD 블둝 뢄리 β†’ 30일+ 이전 + keyword λ§€μΉ­
3730
+ const blocks = lt.split(/\n### /).slice(1).map(b => '### ' + b);
3731
+ const matches = [];
3732
+ for (const b of blocks) {
3733
+ const m = b.match(/^### (\d{4}-\d{2}-\d{2})/);
3734
+ if (!m) continue;
3735
+ const blockDate = new Date(m[1]).getTime();
3736
+ if (isNaN(blockDate) || blockDate > cutoff) continue;
3737
+ if (fuzzyRe.test(b)) matches.push({ date: m[1], title: (b.split('\n')[0] || '').slice(0, 80) });
3738
+ }
3739
+ if (matches.length > 0) {
3740
+ const isTty = process.stdout && process.stdout.isTTY;
3741
+ const blu = s => isTty ? `\x1b[34m${s}\x1b[0m` : s;
3742
+ const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
3743
+ const oldest = matches[matches.length - 1];
3744
+ const ageDays = Math.floor((Date.now() - new Date(oldest.date).getTime()) / (24 * 3600 * 1000));
3745
+ log(blu(`## πŸ—„ μž₯κΈ° lessons 회고 (1.9.196 DμΆ•) β€” ν‚€μ›Œλ“œ "${keyword}" κ΄€λ ¨ 30일+ ${matches.length}건`));
3746
+ log(dim(` 졜였래된: ${oldest.date} (${ageDays}일 μ „) β€” ${oldest.title}`));
3747
+ if (matches.length > 1) {
3748
+ log(dim(` 졜근30일+: ${matches[0].date} β€” ${matches[0].title}`));
3749
+ }
3750
+ log(dim(` β†’ 전체 회고: cat .harness/lessons.md`));
3751
+ log('');
3752
+ }
3753
+ }
3754
+ } catch {}
3755
+ }
3756
+ }
3757
+ }
3758
+ } catch {}
3759
+ }
3760
+ // 1.9.196: ScheduleWakeup miss detector β€” 자율 λͺ¨λ“œ μ‚¬μš©μž λͺ…μ‹œ "λͺ»μΌμ–΄λ‚˜λŠ” 경우 μ’…μ’… 있음" (1.9.191) 후속
3761
+ // λ§ˆμ§€λ§‰ session μ‹œκ°„ (handoff mtime λ˜λŠ” task-log λ§ˆμ§€λ§‰ entry) > 2h ago μ‹œ μ•Œλ¦Ό
3762
+ // 끄기: LEERNESS_NO_WAKEUP_MISS=1
3763
+ if (process.env.LEERNESS_NO_WAKEUP_MISS !== '1' && !has('--quiet') && !has('--no-wakeup-miss')) {
3764
+ try {
3765
+ const tlp = taskLogPath(root);
3766
+ if (exists(tlp)) {
3767
+ const ageMs = Date.now() - fs.statSync(tlp).mtimeMs;
3768
+ const ageMin = Math.floor(ageMs / 60000);
3769
+ // 자율 λͺ¨λ“œλŠ” ~15λΆ„ cycle. 60λΆ„ 이상 무 ν™œλ™μ΄λ©΄ wakeup miss μ˜μ‹¬ (CronCreate 13min λ°±μ—…κ³Ό ν•¨κ»˜)
3770
+ if (ageMin >= 60) {
3771
+ const isTty = process.stdout && process.stdout.isTTY;
3772
+ const yel = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
3773
+ const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
3774
+ const label = ageMin < 120 ? `${ageMin}λΆ„` : (ageMin < 1440 ? `${Math.floor(ageMin/60)}μ‹œκ°„` : `${Math.floor(ageMin/1440)}일`);
3775
+ log(yel(`## ⏰ ScheduleWakeup miss μ˜μ‹¬ (1.9.196) β€” λ§ˆμ§€λ§‰ ν™œλ™ ${label} μ „`));
3776
+ log(dim(` 자율 λͺ¨λ“œ 정상 cycle: ~15λΆ„. 60λΆ„ 이상 무 ν™œλ™ β†’ μ‹œμŠ€ν…œ sleep λ˜λŠ” wakeup λˆ„λ½ κ°€λŠ₯μ„±`));
3777
+ log(dim(` β†’ 재개: μ‚¬μš©μžκ°€ "λ‹€μŒ λΌμš΄λ“œ" λ˜λŠ” "/loop" μž…λ ₯`));
3778
+ log('');
3711
3779
  }
3712
3780
  }
3713
3781
  } catch {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.195",
3
+ "version": "1.9.196",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",