leerness 1.9.197 β†’ 1.9.198

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,57 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.198 β€” 2026-05-21
4
+
5
+ **πŸ€– BμΆ• 9/10 β†’ 9.5/10 β€” handoff multi-agent consensus 이λ ₯ 기반 best agent μžλ™ μΆ”μ²œ.**
6
+
7
+ 자율 λͺ¨λ“œ 128 λΌμš΄λ“œ. 1.9.193 consensus μžλ™ lessons.md μ €μž₯ (BμΆ•) 후속 β€” μ €μž₯ν•œ 데이터λ₯Ό **handoff μ—μ„œ μ¦‰μ‹œ μž¬ν™œμš©**.
8
+
9
+ ### μ‚¬μš©μž μ˜λ„ μ •λ ¬ (1.9.191 verbatim)
10
+ > *"λ©€ν‹° μ„œλΈŒ μ—μ΄μ „νŠΈ μ˜€μΌ€μŠ€νŠΈλΌ ... 졜고의 도ꡬ"*
11
+
12
+ ### 1. handoff μ‹ κ·œ μ„Ήμ…˜ (BμΆ• 핡심)
13
+ ```
14
+ ## πŸ€– task λ§€μΉ­ best agent (1.9.198 BμΆ•) β€” ν‚€μ›Œλ“œ "authentication"
15
+ κ³Όκ±° multi-agent consensus 2건 β€” μΆ”μ²œ agent: claude (1회 best)
16
+ 졜근 hit: 2026-05-20 agent=claude score=0.873
17
+ β†’ μž¬μ‹€ν–‰: leerness agents multi "<task>" --execute
18
+ ```
19
+ - lessons.md 의 1.9.193 `multi-agent consensus β€” best=X (1.9.193)` νŒ¨ν„΄ μžλ™ μΆ”μΆœ
20
+ - keyword fuzzy 맀칭으둜 κ΄€λ ¨ hits 선별
21
+ - agent 별 λΉˆλ„ 카운트 β†’ μ΅œλ‹€ best agent μžλ™ λ…ΈμΆœ
22
+ - 끄기: `--no-multiagent-hint` λ˜λŠ” `LEERNESS_NO_MULTIAGENT_HINT=1`
23
+
24
+ ### 2. μ‹ κ·œ ν•¨μˆ˜
25
+ - `_loadMultiAgentConsensusHistory(root, keyword)` β€” lessons.md 1.9.193 νŒ¨ν„΄ μΆ”μΆœ + fuzzy λ§€μΉ­
26
+
27
+ ### 3. λˆ„μ  νšŒκ·€ (1.9.192~197) β€” λͺ¨λ‘ μœ μ§€
28
+ - [1.9.197] _readyBackendCountFromCache (60λΆ„ μΊμ‹œ + ν—€λ“œλΌμΈ)
29
+ - [1.9.196] DμΆ• 7일+/30일+ recall + ScheduleWakeup miss detector
30
+ - [1.9.195] _probeProviderEndpoints (provider universal probe)
31
+ - [1.9.194] _suggestNextActions (handoff next-actions)
32
+ - [1.9.193] agents multi consensus β†’ lessons.md
33
+ - [1.9.192] _loadOfficialSkillCache + 24h μΊμ‹œ
34
+
35
+ ### 4. stress-v143 β€” 14/14 PASS
36
+ - BμΆ• 보강 (5: ν•¨μˆ˜ + μ„Ήμ…˜ + μž„μ‹œ μ›Œν¬μŠ€νŽ˜μ΄μŠ€ 톡합 검증 + λΉˆλ„ 카운트)
37
+ - μ„±λŠ₯: --version cold start avg **500 ms** Β· MCP 54 도ꡬ **494 ms**
38
+
39
+ ### 5. 5μΆ• 맀트릭슀 변동
40
+ | μΆ• | 1.9.197 | 1.9.198 | Ξ” |
41
+ |---|---|---|---|
42
+ | B. λ©€ν‹° Sub-Agent μ˜€μΌ€μŠ€νŠΈλΌ | 9/10 | **9.5/10** | +0.5 (consensus 이λ ₯ μžλ™ 회수) |
43
+ | μ’…ν•© | 47.5/50 (95%) | **48/50 (96%)** | +1% |
44
+
45
+ ### 6. μ‚¬μš©μž λͺ…μ‹œ 쑰치
46
+ - Cron `10dcaa07` (hourly :17 backup) μ‚¬μš©μž μš”μ²­μœΌλ‘œ μ‚­μ œ
47
+ - μžλ™ λ£¨ν”„λŠ” **ScheduleWakeup 1500s (25λΆ„, R-0001 영ꡬ λ£°)** 단독 운영
48
+
49
+ ### 7. μžλ™ release 흐름
50
+ - main μžλ™ push **60 λΌμš΄λ“œ 연속** (1.9.140~198)
51
+ - npm publish μžλ™ (1.9.178~)
52
+
53
+ ---
54
+
3
55
  ## 1.9.197 β€” 2026-05-21
4
56
 
5
57
  **πŸ”Œ AμΆ• 9.5/10 β†’ 10/10 β€” provider probe handoff μžλ™ 톡합 + 60λΆ„ μΊμ‹œ. 5μΆ• 맀트릭슀 47.5/50 (95%).**
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.197-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v142-15%2F15-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-54-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-127-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-59_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-95%2F100_(5μΆ•)-brightgreen)]() [![backend-probe](https://img.shields.io/badge/handoff-13_backend_μžλ™-success)]() [![perf](https://img.shields.io/badge/cold_start-506ms-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.198-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v143-14%2F14-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-54-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-128-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-60_rounds-success)]() [![goal-matrix](https://img.shields.io/badge/λͺ©μ _맀트릭슀-96%2F100_(5μΆ•)-brightgreen)]() [![best-agent](https://img.shields.io/badge/handoff-best_agent_μžλ™_μΆ”μ²œ-success)]() [![perf](https://img.shields.io/badge/cold_start-500ms-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.197 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.198 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ πŸ”Œ 5μΆ• 맀트릭슀 95/100 Β· backend probe handoff μžλ™ Β· 127 λΌμš΄λ“œ β•‘
17
+ β•‘ πŸ€– best agent μžλ™ μΆ”μ²œ Β· 맀트릭슀 96/100 Β· 128 λΌμš΄λ“œ β•‘
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.197';
10
+ const VERSION = '1.9.198';
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 처리).
@@ -1662,6 +1662,39 @@ async function skillAutoCacheCmd(root, sub) {
1662
1662
  if (c.expired) log(` β†’ κ°±μ‹ : leerness skill auto-cache refresh`);
1663
1663
  }
1664
1664
 
1665
+ // 1.9.198: BμΆ• (λ©€ν‹° Sub-Agent μ˜€μΌ€μŠ€νŠΈλΌ) 보강 β€” handoff μ—μ„œ task keyword λ§€μΉ­ best agent μΆ”μ²œ
1666
+ // 1.9.193 μ—μ„œ agents multi --execute κ²°κ³Όλ₯Ό lessons.md 에 기둝 β†’ 이λ₯Ό keyword λ§€μΉ­ν•˜μ—¬ μΆ”μΆœ
1667
+ // μ‚¬μš©μž/AI κ°€ 같은 task μž¬μ‹œλ„ μ‹œ "κ³Όκ±° best agent μš°μ„  μ‹œλ„" μ¦‰μ‹œ 인지
1668
+ function _loadMultiAgentConsensusHistory(root, keyword) {
1669
+ try {
1670
+ const lp = lessonsPath(root);
1671
+ if (!exists(lp)) return [];
1672
+ const lt = read(lp);
1673
+ // 1.9.193 νŒ¨ν„΄: ### YYYY-MM-DD multi-agent consensus β€” best=<agent> (1.9.193)
1674
+ // blocks 뢄리 ν›„ keyword λ§€μΉ­ + best agent μΆ”μΆœ
1675
+ const blocks = lt.split(/\n### /).slice(1).map(b => '### ' + b);
1676
+ const re193 = /multi-agent consensus β€” best=(\S+) \(1\.9\.193\)/;
1677
+ const fuzzyRe = keyword ? new RegExp(escapeRegex(keyword.slice(0, Math.max(4, Math.floor(keyword.length * 0.7)))), 'i') : null;
1678
+ const hits = [];
1679
+ for (const b of blocks) {
1680
+ const m = re193.exec(b);
1681
+ if (!m) continue;
1682
+ if (fuzzyRe && !fuzzyRe.test(b)) continue;
1683
+ // task / score μΆ”μΆœ
1684
+ const taskM = b.match(/- task: ([^\n]+)/);
1685
+ const scoreM = b.match(/- best agent: \S+, score=([\d.]+)/);
1686
+ const dateM = b.match(/^### (\d{4}-\d{2}-\d{2})/);
1687
+ hits.push({
1688
+ date: dateM ? dateM[1] : '?',
1689
+ agent: m[1],
1690
+ task: taskM ? taskM[1].slice(0, 80) : '',
1691
+ score: scoreM ? Number(scoreM[1]) : null
1692
+ });
1693
+ }
1694
+ return hits;
1695
+ } catch { return []; }
1696
+ }
1697
+
1665
1698
  // 1.9.194: EμΆ• (κ²ŒμœΌλ¦„ λ°©μ§€) β€” handoff μ—μ„œ λ‹€μŒ 단계 1-3개 μžλ™ μ œμ•ˆ
1666
1699
  // ν˜„μž¬ in-progress task description + Memory Surface (decisions/lessons/plan) μ‘°ν•© β†’
1667
1700
  // "λ‹€μŒ λ‹¨κ³„λ‘œ 무엇을 ν• μ§€" μΆ”λ‘  (μ‚¬μš©μž/AI 직접 μž…λ ₯ 없이 μ¦‰μ‹œ λ…ΈμΆœ)
@@ -3725,6 +3758,29 @@ function handoff(root) {
3725
3758
  }
3726
3759
  } catch {}
3727
3760
  }
3761
+ // 1.9.198: BμΆ• (λ©€ν‹° Sub-Agent μ˜€μΌ€μŠ€νŠΈλΌ) 보강 β€” handoff μ—μ„œ keyword λ§€μΉ­ best agent μžλ™ μΆ”μ²œ
3762
+ // 1.9.193 lessons.md 기둝을 회수 β†’ "이 task ν‚€μ›Œλ“œλŠ” 이전에 agent X κ°€ best μ˜€λ‹€" ν‘œμ‹œ
3763
+ // 끄기: --no-multiagent-hint λ˜λŠ” LEERNESS_NO_MULTIAGENT_HINT=1
3764
+ if (!has('--no-multiagent-hint') && !has('--quiet') && process.env.LEERNESS_NO_MULTIAGENT_HINT !== '1') {
3765
+ try {
3766
+ const maHits = _loadMultiAgentConsensusHistory(root, keyword);
3767
+ if (maHits.length > 0) {
3768
+ // κ°€μž₯ 졜근 hit 1 + 동일 agent λΉˆλ„ 카운트
3769
+ const recent = maHits[maHits.length - 1];
3770
+ const agentCounts = {};
3771
+ for (const h of maHits) { agentCounts[h.agent] = (agentCounts[h.agent] || 0) + 1; }
3772
+ const topAgent = Object.entries(agentCounts).sort((a, b) => b[1] - a[1])[0];
3773
+ const isTty = process.stdout && process.stdout.isTTY;
3774
+ const blu = s => isTty ? `\x1b[34m${s}\x1b[0m` : s;
3775
+ const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
3776
+ log(blu(`## πŸ€– task λ§€μΉ­ best agent (1.9.198 BμΆ•) β€” ν‚€μ›Œλ“œ "${keyword}"`));
3777
+ log(dim(` κ³Όκ±° multi-agent consensus ${maHits.length}건 β€” μΆ”μ²œ agent: ${topAgent[0]} (${topAgent[1]}회 best)`));
3778
+ log(dim(` 졜근 hit: ${recent.date} agent=${recent.agent}${recent.score != null ? ` score=${recent.score.toFixed(3)}` : ''}`));
3779
+ log(dim(` β†’ μž¬μ‹€ν–‰: leerness agents multi "${(latestRow.request || '').slice(0, 60)}" --execute`));
3780
+ log('');
3781
+ }
3782
+ } catch {}
3783
+ }
3728
3784
  // 1.9.196: DμΆ• (μž₯κΈ° λ§₯락 μœ μ§€) 보강 β€” 30일+ μ „ lessons μžλ™ 회고 (long-term memory recall)
3729
3785
  // keyword 와 λ§€μΉ­λ˜λŠ” 30일+ 였래된 lessons 1건 λ…ΈμΆœ β†’ μžŠν˜€μ§„ κ³Όκ±° κ΅ν›ˆ μž¬μƒκΈ°
3730
3786
  // 끄기: --no-longterm-recall λ˜λŠ” LEERNESS_NO_LONGTERM_RECALL=1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.197",
3
+ "version": "1.9.198",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",