feat(self): 자기 평가 질의에 기능 인벤토리 강제 주입 + 충돌 신뢰도 비교 권고 (v2.2.226)

[자기 지식 구식화 — 마지막 구멍 봉쇄]
인벤토리를 자동 생성해도(v2.2.225) 모델이 검색 없이 기억으로 답하면 무용
— 실사례: 답변 말미 "출처: 모델 지식 (검색 미사용)" 후 이미 있는 기능
(CoVe·멀티스텝 플래닝·노후점검 자동화)을 신규 제안. 프롬프트 규칙은 검색을
강제할 수 없으므로 scheduleContext 와 동일 패턴으로 해결:
- selfAssessContext: "기능 개선/고도화/self-evolving/무슨 기능" 류 질의 감지
  시 인벤토리 전문을 RAG 경쟁 없이 결정론적 주입 + "이미 있는 기능 신규 제안
  금지, '현재 X 있음 — 빠진 증분 Y' 형태" 지시. 인벤토리 미생성 시 정직 안내.

[충돌 해결사 — 권고까지만, 자동 결정은 안 함]
- conflictScan 에 신뢰도 비교 추가: 양쪽 frontmatter(source_trust_level S~D,
  confidence_score) + 최신성으로 "신규/기존 우선 권고" 생성. 메타데이터 없거나
  비등하면 권고 보류 (근거 없는 권고 금지). 삭제·덮어쓰기는 여전히 사람 결정.

테스트 17건 추가 (질의 감지·인벤토리 주입·신뢰 파싱·권고 분기).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 11:59:05 +09:00
parent b03a49bfc3
commit 960f43f643
6 changed files with 192 additions and 5 deletions
@@ -0,0 +1,58 @@
/**
* 자기 평가/개선 질의 컨텍스트 — "기능 개선 아이디어 줘" 류 질문에 ASTRA 의
* *현행* 기능 인벤토리(자동 생성 문서)를 결정론적으로 직접 주입한다.
*
* 문제 (3회 재발한 자기 지식 구식화의 마지막 구멍): 인벤토리 문서를 자동 생성해도
* RAG 점수 경쟁에서 안 뽑히거나 모델이 검색 없이 기억으로 답하면 — 실제 사례:
* 답변 말미에 "출처: 모델 지식 (검색 미사용)" — 이미 있는 기능을 신규 제안한다.
* 프롬프트 규칙("인벤토리와 대조하라")은 검색을 강제할 수 없다.
*
* 수정: scheduleContext(일정 질의→캘린더 실데이터 강제 주입)와 동일 패턴 —
* 자기 평가 질의를 감지하면 인벤토리 전문을 RAG 경쟁 없이 컨텍스트에 넣는다.
* "검색 안 함" 실패 모드 자체를 제거.
*/
import * as fs from 'fs';
import * as path from 'path';
import { INVENTORY_FILE } from '../../extension/featureInventory';
const IMPROVE_RE = /(개선|고도화|발전|보완|제안|평가|분석|방향|방법|아이디어|로드맵|업그레이드|날카롭|강화)/i;
const SELF_RE = /(기능|역량|능력|아키텍처|구조|시스템|self.?evolv|자기\s*진화|자기\s*개선|아스트라|astra|너(가|의|는)?|네가)/i;
const CAPABILITY_RE = /(무슨|어떤|할\s*수\s*있는)\s*(기능|일|것)|기능\s*(목록|리스트)|capabilit/i;
/**
* 자기 평가·개선·기능 질의인지. 오탐 비용이 낮으므로(인벤토리 ~3KB 추가 주입뿐)
* 누락(또 구식 제안)보다 과잉 감지를 택한다.
*/
export function isSelfAssessRequest(prompt: string): boolean {
const p = (prompt || '').trim();
if (!p || p.length > 600) return false;
return CAPABILITY_RE.test(p) || (IMPROVE_RE.test(p) && SELF_RE.test(p));
}
const MAX_INVENTORY_CHARS = 7000;
/** 인벤토리 전문 + 대조 지시 블록. 파일 없으면 정직한 안내 (지어내기 방지). */
export function buildSelfAssessContext(brainPath: string): string {
const header = '[ASTRA 현행 기능 인벤토리 — 소스 코드에서 자동 생성된 정본]';
let body = '';
try {
const file = path.join(brainPath, INVENTORY_FILE);
if (fs.existsSync(file)) body = fs.readFileSync(file, 'utf8').slice(0, MAX_INVENTORY_CHARS);
} catch { /* 아래 fallback */ }
if (!body.trim()) {
return [
header,
'상태: 인벤토리 문서가 아직 생성되지 않음 (다음 활성화 때 자동 생성).',
'→ 기억에 의존해 기능 목록을 단정하지 말고, 기능 존재 여부가 불확실하면 "확인 필요"로 표시하라.',
].join('\n');
}
return [
header,
'자기 기능 평가·개선 제안 시 반드시 아래 인벤토리와 대조하라:',
'- 아래에 **이미 있는 기능을 신규 제안하지 마라.**',
'- 제안은 "현재 X가 있고, 빠진 증분은 Y" 형태로.',
'- 아래에 없는 기능을 있다고 주장하지도 마라.',
'',
body,
].join('\n');
}