leerness 1.36.4 → 1.36.6
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 +20 -0
- package/README.md +6 -6
- package/bin/leerness.js +28 -12
- package/lib/health.js +3 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.36.6 — 2026-07-09 — 정직성 백로그 소진: 강제력/종합-health 문구 정직화 (심층 감사 P2/P3 후속)
|
|
4
|
+
|
|
5
|
+
**1.36.5 심층 정직성 감사가 확인했으나 미수정으로 남긴 P2/P3 강제력·과장 문구를 정직화.**
|
|
6
|
+
|
|
7
|
+
- **handoff `⚕ health` 토큰 → `🔐 .env`**: 이 헤드라인 토큰은 실제로 **.env 의 .gitignore 보호 여부만** 봤는데 "종합 health(보안+drift)"로 표기했다(주석까지 그렇게 거짓). 커밋된 시크릿/drift/상태무결성은 안 봄 → 라벨을 `🔐 .env` 로 정직화(종합 health 아님 명시).
|
|
8
|
+
- **policy enforce "초과 명령 차단"** → `초과 명령 = 차단 판정 + exit 1 신호 · 실제 셸 실행을 가로채진 않음`: leerness 는 셸을 감싸지 않으므로 enforce ON 이어도 협조적 verdict/exit code 일 뿐, 하드 실행 차단이 아님을 명시.
|
|
9
|
+
- **KO identity/about "허위 완료 차단" → "허위 완료 감지 (권고; CI 게이트 필수화 시 차단)"**: EN 설명은 이미 협조적(권고)임을 밝히는데 KO 정체성/about/README 는 하드 "차단"으로 과장 → EN 과 일치시킴(사용자 프로젝트 README 에 기록되는 고가시성 문구).
|
|
10
|
+
- **README "measures the real count and rejects a mismatch"** → 기본은 **테스트 선언(정적 카운트)** 이 주장 초과 시 거부하는 것이지 "통과" 증명이 아님을 명시(+`--run-tests` 로 실제 실행 검증).
|
|
11
|
+
- selftest 280 (신규 정직성 후속 소스가드, split-literal self-ref 회피) + e2e 통과.
|
|
12
|
+
|
|
13
|
+
## 1.36.5 — 2026-07-09 — 정직성 감사: 성숙도 판정 과장 보정 (심층 멀티에이전트 정직성 감사 채택)
|
|
14
|
+
|
|
15
|
+
**게시본 1.36.4에 9개 사용자대면 표면 정직성 감사(멀티에이전트 35 + 적대적 반증) → 가장 강하게 수렴한 P1(성숙도 판정 과장) 보정.**
|
|
16
|
+
|
|
17
|
+
- `leerness health` 6능력 매트릭스: `overall N% (production-ready)` 는 **소스 문자열 존재 + 의존성 설치 여부 휴리스틱**의 평균일 뿐(미설치 의존성도 부분점수). "측정된/독립 성숙도 판정"으로 오독되지 않도록 **인라인 캐비엇** 추가.
|
|
18
|
+
- mcpTools 근거의 `CRUD 완성/CRUD complete` 제거 — 도구 수(≥50)는 기능적 CRUD 완결성을 증명하지 않음.
|
|
19
|
+
- REPL 환영창의 **하드코딩된 "72% production-ready · MCP 54 도구"** 고정/구식 수치 제거 → `leerness health` 참조로 대체.
|
|
20
|
+
- selftest 279 (신규 정직성 소스가드) + e2e 통과. self-ref 트랩 회피(split-literal).
|
|
21
|
+
- 정직 고지: 감사가 확인한 나머지 P2/P3 문구(policy "차단" enforce-ON 협조성, KO identity "허위완료 차단" vs EN, README "measures the real count" 방향성, "독립 검수"↔cross-model, encoding "passed" 스코프)는 정직성 백로그로 추적 — 이번 릴리스는 최고 수렴 P1에 집중.
|
|
22
|
+
|
|
3
23
|
## 1.36.4 — 2026-07-09 — database 렌즈 recall: 내용 기반 DB 감지 (dogfood FN) — 평범한 이름의 DB 모듈도 렌즈 노출
|
|
4
24
|
|
|
5
25
|
**도그푸드에서 발견한 recall gap(FN) 소진.** 실사용(재고 서비스) 도중, `_lensDomainsForFiles` 가 **경로 휴리스틱**만 써서 `models/`·`.repository.`·`.sql` 등 관습적 이름의 파일만 `database` 도메인에 매핑함을 경험적으로 확인했다 — `inventory.safe.mjs`·`orders.occ.mjs` 처럼 실제로 SQLite 를 다루지만 이름에 단서가 없는 모듈은 `database` 렌즈가 **전혀 노출되지 않았다**(`["code"]` 로만 분류).
|
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ npx leerness verify-claim T-0002 # exit 1 — payment.js does not exist. Claim
|
|
|
35
35
|
|
|
36
36
|
Now actually write `payment.js`, then run the **same** `verify-claim T-0002` → it exits 0. That is the whole idea: **"done" must match reality.**
|
|
37
37
|
|
|
38
|
-
> Tip: if your evidence claims a specific test count (e.g. "5 tests passed"), leerness
|
|
38
|
+
> Tip: if your evidence claims a specific test count (e.g. "5 tests passed"), leerness counts the test functions actually present and rejects a claim that exceeds them — so claim only what's true. That default is a static count of test declarations, not proof they pass; add `--run-tests --test-cmd "<your test cmd>"` to verify they actually pass by running them.
|
|
39
39
|
|
|
40
40
|
> Want a smaller footprint? `leerness init . --minimal` installs only the core memory + verification files instead of the full set.
|
|
41
41
|
|
|
@@ -125,7 +125,7 @@ MIT
|
|
|
125
125
|
<!-- leerness:project-readme:start -->
|
|
126
126
|
## Leerness Project Harness
|
|
127
127
|
|
|
128
|
-
이 프로젝트는 Leerness v1.36.
|
|
128
|
+
이 프로젝트는 Leerness v1.36.6 하네스를 사용합니다. AI 에이전트는 작업 전 `leerness handoff`로 컨텍스트를 적재하고, 작업 후 `leerness check`/`leerness audit`/`leerness session close`를 수행해야 합니다.
|
|
129
129
|
|
|
130
130
|
### 정체성 — AI 에이전트 운영 레이어 (UR-0030)
|
|
131
131
|
|
|
@@ -134,7 +134,7 @@ Leerness 는 **실행기/코딩 에이전트가 아니라**, 어떤 AI 코딩
|
|
|
134
134
|
- **기억(Memory)** — 프로젝트 상태/결정/진행을 `.harness/` 에 영속화
|
|
135
135
|
- **정책(Policy)** — 8단계 권한 등급 + enforce (read-only→publish), MCP 호출 게이트
|
|
136
136
|
- **인수인계(Handoff)** — 에이전트 간 컨텍스트 표준 전달 + `get_project_context` 1콜 온보딩
|
|
137
|
-
- **검증(Verification)** — 근거 기반 완료 검증으로 허위 완료 차단
|
|
137
|
+
- **검증(Verification)** — 근거 기반 완료 검증으로 허위 완료 감지 (권고; CI 게이트 필수화 시 차단)
|
|
138
138
|
- **감사(Audit)** — drift/idempotency/secret/encoding 자동 감사 + self-heal
|
|
139
139
|
|
|
140
140
|
AGENTS.md(정적 지침)을 **대체하지 않고 보완**합니다 — 정적 규칙은 AGENTS.md, 동적 상태·검증·인수인계는 leerness. 정체성 조회: `leerness about` (MCP `leerness_about`).
|
|
@@ -179,7 +179,7 @@ leerness memory restore decision <date|title>
|
|
|
179
179
|
|
|
180
180
|
### MCP server (외부 AI 통합)
|
|
181
181
|
|
|
182
|
-
Leerness v1.36.
|
|
182
|
+
Leerness v1.36.6는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code · Cursor · Codex CLI 등 외부 AI에 **86개 도구**를 노출:
|
|
183
183
|
|
|
184
184
|
```jsonc
|
|
185
185
|
// 카테고리별
|
|
@@ -200,7 +200,7 @@ Leerness v1.36.4는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code
|
|
|
200
200
|
`<<autonomous-loop-dynamic>>` 신호만 보내면 AI가:
|
|
201
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) 다음 라운드 예약.
|
|
202
202
|
|
|
203
|
-
현재 누적: **70 라운드 (1.9.40 → 1.36.
|
|
203
|
+
현재 누적: **70 라운드 (1.9.40 → 1.36.6)** · 매 라운드 GitHub release/태그 생성 · _reports/는 비공개 보존.
|
|
204
204
|
|
|
205
205
|
### 성능 가이드 (1.9.140 측정)
|
|
206
206
|
|
|
@@ -238,6 +238,6 @@ leerness release pack --close --auto-main-push
|
|
|
238
238
|
- `.harness/session-handoff.md`: 다음 세션 인수인계 (자동 작성)
|
|
239
239
|
- `.harness/lessons.md` / `decisions.md` / `rules.md`: 영구 메모리 (5 surface)
|
|
240
240
|
|
|
241
|
-
Last synced by Leerness v1.36.
|
|
241
|
+
Last synced by Leerness v1.36.6: 2026-07-09
|
|
242
242
|
<!-- leerness:project-readme:end -->
|
|
243
243
|
|
package/bin/leerness.js
CHANGED
|
@@ -33,7 +33,7 @@ const { _evidenceQuality, _parseEvidenceStats, _shellGuardAnalyze, _claimFileInG
|
|
|
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
|
const { findCorruptedStateJson: _findCorruptedStateJson } = require('../lib/state-integrity'); // 1.36.1 (클린룸 리뷰 FN): .harness/*.json 상태 무결성 (audit/health/check 공유)
|
|
35
35
|
|
|
36
|
-
const VERSION = '1.36.
|
|
36
|
+
const VERSION = '1.36.6';
|
|
37
37
|
|
|
38
38
|
// 1.9.290 (UR-0037, Codex gpt-5.5 #4 수렴): CLI 전용 부작용은 require 시 실행하지 않는다.
|
|
39
39
|
// 이전: warning listener 제거 / NODE_OPTIONS 변경 / chcp IIFE 가 top-level 즉시 실행 → require('harness') 시 호스트 프로세스 오염.
|
|
@@ -301,7 +301,7 @@ function managedReadmeBlock(project) {
|
|
|
301
301
|
'- **기억(Memory)** — 프로젝트 상태/결정/진행을 `.harness/` 에 영속화',
|
|
302
302
|
'- **정책(Policy)** — 8단계 권한 등급 + enforce (read-only→publish), MCP 호출 게이트',
|
|
303
303
|
'- **인수인계(Handoff)** — 에이전트 간 컨텍스트 표준 전달 + `get_project_context` 1콜 온보딩',
|
|
304
|
-
'- **검증(Verification)** — 근거 기반 완료 검증으로 허위 완료 차단',
|
|
304
|
+
'- **검증(Verification)** — 근거 기반 완료 검증으로 허위 완료 감지 (권고; CI 게이트 필수화 시 차단)',
|
|
305
305
|
'- **감사(Audit)** — drift/idempotency/secret/encoding 자동 감사 + self-heal',
|
|
306
306
|
'',
|
|
307
307
|
'AGENTS.md(정적 지침)을 **대체하지 않고 보완**합니다 — 정적 규칙은 AGENTS.md, 동적 상태·검증·인수인계는 leerness. 정체성 조회: `leerness about` (MCP `leerness_about`).',
|
|
@@ -3955,6 +3955,24 @@ function _selfTestCases() {
|
|
|
3955
3955
|
// 1.35.12: 정직성 마커 강화 — clean-room 프레이밍 + heuristic 한계 + self-administered(독립 아님) + 재현 레시피.
|
|
3956
3956
|
return /clean-room/i.test(d) && /heuristic, not semantic/i.test(d) && /self-administered/i.test(d) && /npm i leerness@/.test(d);
|
|
3957
3957
|
} },
|
|
3958
|
+
{ name: '정직성 감사 (1.36.5, 심층감사 채택): capability matrix 성숙도 판정 휴리스틱 캐비엇 + 하드코딩%/완결성 과장 제거 (소스 가드)', run: () => {
|
|
3959
|
+
const hp = path.join(path.dirname(__filename), '..', 'lib', 'health.js');
|
|
3960
|
+
const h = exists(hp) ? read(hp) : '';
|
|
3961
|
+
if (!h) return true; // 설치본에 lib 없으면 스킵(안전)
|
|
3962
|
+
const caveatOk = /휴리스틱 자가평가/.test(h) && /heuristic self-assessment/i.test(h); // production-ready 판정 정직화
|
|
3963
|
+
const noCrudComplete = !/CRUD complete/i.test(h); // 도구수→기능완결성 과장 제거
|
|
3964
|
+
const fabricated = '72% ' + 'production-ready'; // split-literal: self-ref 트랩 회피
|
|
3965
|
+
const noHardcodedMaturity = !read(__filename).includes(fabricated); // REPL 하드코딩 성숙도% 제거
|
|
3966
|
+
return caveatOk && noCrudComplete && noHardcodedMaturity;
|
|
3967
|
+
} },
|
|
3968
|
+
{ name: '정직성 감사 후속 (1.36.6, 백로그 소진): handoff .env 토큰 + KO identity/policy 강제력 문구 정직화 (소스 가드)', run: () => {
|
|
3969
|
+
const self = read(__filename);
|
|
3970
|
+
const oldHealthTok = '⚕ ' + 'health:'; // split-literal(escape+concat): 옛 종합-health 토큰 라벨 self-ref 회피
|
|
3971
|
+
const tokenHonest = self.includes('🔐 .env:') && !self.includes(oldHealthTok); // handoff 토큰: 종합 health 오칭 → .env 보호로 정직화
|
|
3972
|
+
const idHonest = self.includes('허위 완료 감지 (권고'); // KO identity/about: 차단(하드) → 감지(권고; CI 시 차단)
|
|
3973
|
+
const policyHonest = self.includes('실제 셸 실행을 가로채진 않음'); // policy enforce: 차단 판정이 실행 가로채기 아님을 명시
|
|
3974
|
+
return tokenHonest && idHonest && policyHonest;
|
|
3975
|
+
} },
|
|
3958
3976
|
{ name: 'CLI 영어화 Phase 1 (1.20.2, UR-0010): _uiLang 해석(flag>env>manifest>ko) + 첫화면 _t 적용 (행위+소스)', run: () => {
|
|
3959
3977
|
const save = process.argv; const saveEnv = process.env.LEERNESS_LANG;
|
|
3960
3978
|
try {
|
|
@@ -9099,19 +9117,17 @@ function handoff(root) {
|
|
|
9099
9117
|
const skillCnt = Object.keys(all).length;
|
|
9100
9118
|
if (skillCnt > 0) parts.push(`📚 ${skillCnt} skills`);
|
|
9101
9119
|
} catch {}
|
|
9102
|
-
// 6) 1.9.93
|
|
9103
|
-
//
|
|
9120
|
+
// 6) 1.9.93 → 1.36.6 정직화: 이 토큰은 .env 의 gitignore 보호 여부만 본다 — 종합 health 가 아니다
|
|
9121
|
+
// (커밋된 시크릿/drift/상태무결성은 `leerness health`/`scan secrets`/`drift check` 로 확인). 라벨을 '🔐 .env' 로 정직화.
|
|
9104
9122
|
try {
|
|
9105
|
-
// 보안 위험 ↔ healthy 판정 (간단)
|
|
9106
9123
|
const envPath = path.join(root, '.env');
|
|
9107
|
-
let
|
|
9124
|
+
let envUnprotected = false;
|
|
9108
9125
|
if (exists(envPath)) {
|
|
9109
9126
|
const giText = exists(path.join(root, '.gitignore')) ? read(path.join(root, '.gitignore')) : '';
|
|
9110
9127
|
const giLines = giText.split('\n').map(l => l.trim());
|
|
9111
|
-
if (!(giLines.includes('.env') || giLines.includes('/.env')))
|
|
9128
|
+
if (!(giLines.includes('.env') || giLines.includes('/.env'))) envUnprotected = true;
|
|
9112
9129
|
}
|
|
9113
|
-
//
|
|
9114
|
-
parts.push(healthIssue ? '⚕ health: ⚠' : '⚕ health: ✓');
|
|
9130
|
+
parts.push(envUnprotected ? '🔐 .env: ⚠' : '🔐 .env: ✓'); // .env 보호만 — 종합 health 아님
|
|
9115
9131
|
} catch {}
|
|
9116
9132
|
// 7) 1.9.113: Memory Write Surface 5종 카운트 (T=tasks in-progress / D=decisions / R=rules active / P=plan milestones / L=lessons)
|
|
9117
9133
|
try {
|
|
@@ -18014,7 +18030,7 @@ function policyCmd(root, sub, ...args) {
|
|
|
18014
18030
|
if (json) { log(JSON.stringify({ tiers: PERMISSION_TIERS, allowedTier: p.allowedTier, enforce: p.enforce, powerfulCommands: POWERFUL_COMMANDS.map(c => ({ cmd: c.cmd, requiredTier: _requiredTier(c.cmd) })) }, null, 2)); return; }
|
|
18015
18031
|
log(`# leerness policy (1.9.281, UR-0034) — 권한 등급`);
|
|
18016
18032
|
log(`등급(위험 오름차순): ${PERMISSION_TIERS.join(' < ')}`);
|
|
18017
|
-
log(`허용 등급: ${p.allowedTier} · enforce: ${p.enforce ? '🔴 ON (초과 명령 차단)' : '🟢 OFF (advisory only, 기본)'}`);
|
|
18033
|
+
log(`허용 등급: ${p.allowedTier} · enforce: ${p.enforce ? '🔴 ON (초과 명령 = 차단 판정 + exit 1 신호 · 실제 셸 실행을 가로채진 않음)' : '🟢 OFF (advisory only, 기본)'}`);
|
|
18018
18034
|
log('');
|
|
18019
18035
|
log(`## 주의 명령 요구 등급`);
|
|
18020
18036
|
for (const c of POWERFUL_COMMANDS) { const rt = _requiredTier(c.cmd); const al = _policyAllows(p.allowedTier, rt); log(` ${al ? '🟢' : (p.enforce ? '🔴' : '🟡')} ${c.cmd.padEnd(22)} → ${rt}`); }
|
|
@@ -18077,7 +18093,7 @@ function _leernessIdentity() {
|
|
|
18077
18093
|
{ key: 'memory', ko: '기억', desc: '프로젝트 상태/결정/진행을 .harness/ 에 영속화 (task/decision/lesson/plan; 선택 state substrate 는 .leerness/)' },
|
|
18078
18094
|
{ key: 'policy', ko: '정책', desc: '8단계 권한 등급 + enforce (read-only→publish), MCP 호출 게이트' },
|
|
18079
18095
|
{ key: 'handoff', ko: '인수인계', desc: '에이전트 간 컨텍스트 표준 전달 (Claude→Codex→Goose), get_project_context 1콜 온보딩' },
|
|
18080
|
-
{ key: 'verification', ko: '검증', desc: '근거 기반 완료 검증 (verify-claim --require-evidence) — 허위 완료 차단' },
|
|
18096
|
+
{ key: 'verification', ko: '검증', desc: '근거 기반 완료 검증 (verify-claim --require-evidence) — 허위 완료 감지 (권고; CI 게이트 시 차단)' },
|
|
18081
18097
|
{ key: 'audit', ko: '감사', desc: 'drift/idempotency/secret/encoding 자동 감사 + self-heal (--auto-fix)' }
|
|
18082
18098
|
],
|
|
18083
18099
|
complements: 'AGENTS.md(정적 지침)을 대체하지 않고 보완 — 정적 규칙/명령/금지는 AGENTS.md, 동적 상태·기억·검증·인수인계는 leerness',
|
|
@@ -18656,7 +18672,7 @@ async function _agentRepl(root, opts) {
|
|
|
18656
18672
|
log(C.green(' │ ') + C.dim('• Bridge slash :web/:pc/:lsp REPL 즉시 호출 + LSP 다국어 5종') + C.green(' │'));
|
|
18657
18673
|
log(C.green(' │ ') + C.dim('• review-request 사전 검토 + task add 자동 trigger') + C.green(' │'));
|
|
18658
18674
|
log(C.green(' │ ') + C.dim('• release sync-main 자동 npm publish (.env NPM_TOKEN)') + C.green(' │'));
|
|
18659
|
-
log(C.green(' │ ') + C.dim('• 6 능력 매트릭스
|
|
18675
|
+
log(C.green(' │ ') + C.dim('• 6 능력 매트릭스 자가평가 (leerness health 로 상세)') + C.green(' │'));
|
|
18660
18676
|
log(C.bold(C.green(' └─────────────────────────────────────────────────────────────────────┘')));
|
|
18661
18677
|
log('');
|
|
18662
18678
|
log(C.bold(' Available Slash (5 그룹)'));
|
package/lib/health.js
CHANGED
|
@@ -270,7 +270,7 @@ function healthCmd(root, deps = {}) {
|
|
|
270
270
|
// (5) MCP 도구 — tools array 카운트 (1.9.288: 정확한 도구 정의 패턴 — 자기-매칭 오탐 제거, Codex #5)
|
|
271
271
|
const toolCount = _mcpToolCount();
|
|
272
272
|
cap.mcpTools = toolCount >= 50
|
|
273
|
-
? { score: 100, status: '✓', evidence: t(`${toolCount}/50+
|
|
273
|
+
? { score: 100, status: '✓', evidence: t(`${toolCount}/50+ 도구`, `${toolCount}/50+ tools`) }
|
|
274
274
|
: { score: Math.round((toolCount / 50) * 100), status: toolCount > 30 ? '✓' : '⚠', evidence: t(`${toolCount} 도구`, `${toolCount} tools`) };
|
|
275
275
|
// (6) 코드 인텔리전스 — 1.9.167 LSP 어댑터 + typescript 설치 detect
|
|
276
276
|
const hasLspBridge = /function lspCmd\(root, sub/.test(harnessSrc);
|
|
@@ -350,6 +350,8 @@ function healthCmd(root, deps = {}) {
|
|
|
350
350
|
log(t(`## 🧪 6능력 매트릭스 (1.9.167 자동 평가)`, `## 🧪 6-capability matrix (auto-assessed)`));
|
|
351
351
|
const cm = out.capabilityMatrix;
|
|
352
352
|
log(t(` 종합: ${cm.overallScore}% (${cm.assessment})`, ` overall: ${cm.overallScore}% (${cm.assessment})`));
|
|
353
|
+
// 1.36.5 (정직성 감사): 이 점수/판정은 소스 존재·의존성 휴리스틱 자가평가일 뿐 — 측정된/독립 성숙도 검증이 아님을 명시(과장 방지).
|
|
354
|
+
log(t(` ⚠ 소스 존재·의존성 기반 휴리스틱 자가평가 — 측정된/독립 성숙도 판정 아님(미설치 의존성도 부분점수).`, ` ⚠ heuristic self-assessment from source-presence + dependency checks — NOT a measured or independent maturity verdict (a missing dependency still scores partial).`));
|
|
353
355
|
log(t(` (1) 웹 자동화 ${cm.capabilities.webAutomation.status} ${cm.capabilities.webAutomation.score}% · ${cm.capabilities.webAutomation.evidence}`, ` (1) web automation ${cm.capabilities.webAutomation.status} ${cm.capabilities.webAutomation.score}% · ${cm.capabilities.webAutomation.evidence}`));
|
|
354
356
|
log(t(` (2) PC 조작 ${cm.capabilities.pcAutomation.status} ${cm.capabilities.pcAutomation.score}% · ${cm.capabilities.pcAutomation.evidence}`, ` (2) PC control ${cm.capabilities.pcAutomation.status} ${cm.capabilities.pcAutomation.score}% · ${cm.capabilities.pcAutomation.evidence}`));
|
|
355
357
|
log(t(` (3) 멀티 오케스트레이션 ${cm.capabilities.multiAgentOrchestration.status} ${cm.capabilities.multiAgentOrchestration.score}% · ${cm.capabilities.multiAgentOrchestration.evidence}`, ` (3) multi-agent orch. ${cm.capabilities.multiAgentOrchestration.status} ${cm.capabilities.multiAgentOrchestration.score}% · ${cm.capabilities.multiAgentOrchestration.evidence}`));
|