a114d968b0
- Alignment Self-Learning: 자가 조사(질문 전 두뇌 검색)·사용자 답변 두뇌 저장·핵심메시지/프로젝트 컨텍스트 주입 (alignmentResearch.ts 신규)
- 웹 접근: Bridge 폴백 직접 fetch(webFetch.ts 신규)·<fetch_url> 액션 태그·기업 모드 URL/아키텍처 컨텍스트 주입·bare 도메인 인식
- 트리거 버그 수정: startsWith('/') 가 절대경로를 슬래시 명령으로 오인 — 분석 지시·URL 주입 전멸 원인 (회귀 테스트 고정)
- 자기지식 접지: 기능 인벤토리 lazy 재생성·학습 메커니즘 정본 섹션·[인벤토리 대조] 태그 의무화·결정론적 재구현 제안 정정 훅(featureConceptMap.ts 신규)
- 환경 자가점검: HealthCheckMonitor 에 Bridge/두뇌 볼륨/git 자격증명/확장 버전 검사 4종 + readyBar ⚠ 표시
- 두뇌 동기화: 원격 미설정 시 로컬 새로고침 모드·staged 기준 commit 판정·인증 부재 안내
- 기타: outputFormat 기본 markdown(제목 렌더 복구)·레슨/행동제약 truncation 보호 구역 이동·[CONTEXT] 절단 우선순위 재정렬
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
137 lines
7.9 KiB
TypeScript
137 lines
7.9 KiB
TypeScript
/**
|
|
* 기능 개념 지도 — vscode 의존 없는 순수 모듈 (테스트 용이).
|
|
*
|
|
* 두 소비처:
|
|
* 1. featureInventory.ts — "ASTRA 기능 인벤토리" 마크다운 생성 (LLM 프롬프트 주입용)
|
|
* 2. postAnswerHooks inventory-cross-check — 답변이 *이미 구현된 기능*을 신규
|
|
* 제안하는지 결정론적으로 검사해 정정 푸터를 붙임
|
|
*
|
|
* 2번이 존재하는 이유: 인벤토리를 프롬프트에 주입해도 작은 로컬 모델은 mid-prompt
|
|
* 컨텍스트를 무시하고 일반론으로 "X를 도입하라"고 제안하는 실패가 반복 재현됐다.
|
|
* 프롬프트 주입은 1차 방어선일 뿐 — 모델이 무시해도 사용자에게 정정이 보이는
|
|
* 결정론적 안전망(LLM 콜 0)이 최종 방어선이다.
|
|
*/
|
|
|
|
export interface ConceptEntry {
|
|
/** 학술/일반 명칭 (마크다운 표기용). */
|
|
concept: string;
|
|
/** ASTRA 구현 내역 한 줄. */
|
|
impl: string;
|
|
/** 답변 본문에서 이 개념을 식별하는 키워드 (소문자 비교, 한·영). */
|
|
keywords: string[];
|
|
}
|
|
|
|
export const CONCEPT_ENTRIES: ConceptEntry[] = [
|
|
{
|
|
concept: 'CoVe / Chain-of-Verification / Self-Critique',
|
|
impl: '구현됨 — coveEnabled(답변 전 그라운딩 체크리스트) + critic-loop 훅(문제 신호 턴 LLM 검수) + citationTrace(출처 역추적)',
|
|
keywords: ['cove', 'chain-of-verification', 'self-critique', 'selfcritique', 'self-correction', '자기 검증', '자기검증', '자기 수정', '크리틱 에이전트', '비판적 사고 루프', '스스로 검토하는 단계'],
|
|
},
|
|
{
|
|
concept: '지식 노후 점검 자동화 / Automated Decay Audit',
|
|
impl: '구현됨 — 주간 성장 사이클이 매주 자동 실행 (decay-report.md) + "Astra: 지식 노후 점검" 수동 명령',
|
|
keywords: ['노후화', '노후 점검', 'decay', '지식 신선도'],
|
|
},
|
|
{
|
|
concept: '지식 충돌 감지/해결 / Conflict Resolver',
|
|
impl: '구현됨 — 검색 시점 [CONFLICT WARNING] + 일일 충돌 스캔 + 신뢰도(trust·confidence·최신성) 비교 우선 권고. 최종 결정만 사람',
|
|
keywords: ['충돌 감지', '충돌 해결', 'conflict resolver', '상충되는 정보 발견'],
|
|
},
|
|
{
|
|
concept: '피드백 태깅 / 오류 분류 / Feedback Tagging',
|
|
impl: '구현됨 — Correction Loop가 사용자 정정을 자동 분류(사실오류/근거누락/맥락누락/추론오류/지시불이행/형식오류)해 레슨+회귀 케이스로 저장',
|
|
keywords: ['피드백 태깅', '피드백 루프 자동화', '오류 분류', '교훈으로 자동', '자동으로 \'교훈\'', '교훈을 자동', 'feedback tagging'],
|
|
},
|
|
{
|
|
concept: '멀티스텝 플래닝 / Multi-Step Planning / CoT 강제',
|
|
impl: '구현됨 — multiAgentEnabled(Planner→Researcher→Writer, 기본 OFF) + 1인 기업 모드 디스패처',
|
|
keywords: ['멀티스텝 플래닝', 'multi-step planning', 'cot 강제', 'reasoning chain', '추론 체인', 'chain of thought', '생각 단계(thought)', '생각의 단계'],
|
|
},
|
|
{
|
|
concept: '골든셋 자동 평가 / Regression Test',
|
|
impl: '구현됨 — 주간 사이클 자동 평가 + 직전 대비 회귀 경보(regression-alert.md) + 정정 회귀 재검사',
|
|
keywords: ['골든셋', '회귀 테스트', 'regression test'],
|
|
},
|
|
{
|
|
concept: 'Sleep-time / 유휴 시간 학습',
|
|
impl: '구현됨 — 일일 지식 사전 소화 (Digests/)',
|
|
keywords: ['sleep-time', '유휴 시간 학습', '유휴시간 학습'],
|
|
},
|
|
{
|
|
concept: '확신도 게이팅 / 환각 방지 표명',
|
|
impl: '구현됨 — [GROUNDING] 강함/보통/약함 + 약함 시 표명 강제 + 학습큐 자동 등록',
|
|
keywords: ['확신도 게이팅', '환각 방지', '확신 편향'],
|
|
},
|
|
{
|
|
concept: 'Reflection Layer / 자기 성찰 / 메타 학습 루프 / Self-Reflection',
|
|
impl: '구현됨 — Self-Reflector Phase A(답변 자가 점검 블록, opt-in) + Phase B(외부 검증 LLM + 자동 재시도) + Phase C(생성 파일 syntax 검증) + Hollow Code Check(빈 깡통 감지 + 자동 재작업) + 약점 프로필→자기검토 블록(최근 정정 통계가 다음 턴 행동을 직접 변경)',
|
|
keywords: ['reflection layer', 'self-reflection', '자기 성찰', '성찰 계층', '성찰 단계', '성찰(reflection)', '메타 학습'],
|
|
},
|
|
{
|
|
concept: '질문 전 자가 조사 / Self-Research / 경험 기반 제약 주입',
|
|
impl: '구현됨 — Intent Alignment 자가 조사(질문을 사용자에게 노출하기 전 두뇌 검색으로 선해결) + 사용자 답변 두뇌 자동 저장(Alignment Knowledge 학습 루프) + 레슨 체크리스트 truncation 보호 구역 주입',
|
|
keywords: ['자가 조사', 'self-research', '경험 기반 제약'],
|
|
},
|
|
];
|
|
|
|
/**
|
|
* 신규 도입/추가/구축을 제안하는 문장인지 (또는 부재를 단정하는 문장).
|
|
* '합' 포함 — "추가합니다/구축합니다" 활용형 미매치 갭 (회귀 테스트로 발견).
|
|
* '강화' 동사 + "도입:" 명사형(소제목 스타일) 추가 — 12B 답변의
|
|
* "Reasoning Chain 도입: ..." 패턴 미매치 갭 (회귀 테스트로 발견).
|
|
*/
|
|
const PROPOSAL_RE = /(도입|추가|구축|신설|개발|보강|강화|만들)(하|해|할|합|을|를)|(도입|추가|구축|신설)\s*[::]|필요합니다|제안합니다|추천합니다|부족합니다|부재|없습니다|미흡/;
|
|
/** 같은 문장에서 이미 구현 사실을 인지하고 있으면 정정 불필요. */
|
|
const ACKNOWLEDGED_RE = /(이미|기)\s*(구현|존재|있)|구현돼|구현되어|작동\s*중/;
|
|
|
|
export interface ReimplementationHit {
|
|
concept: string;
|
|
impl: string;
|
|
/** 감지된 문장 (검증/디버그용, 120자 cap). */
|
|
sentence: string;
|
|
}
|
|
|
|
/**
|
|
* 답변이 이미 구현된 기능을 "도입하라/없다"고 제안·단정하는 문장을 결정론적으로
|
|
* 감지. LLM 콜 0 — 문장 단위 키워드 + 제안 동사 공기(co-occurrence) 검사.
|
|
* 보수적 설계: 같은 문장에 "이미 구현/존재" 인지가 있으면 제외 (정정 노이즈 방지).
|
|
*/
|
|
export function detectReimplementedProposals(answer: string): ReimplementationHit[] {
|
|
if (!answer || !answer.trim()) return [];
|
|
// 문장 분리 — 마침표/줄바꿈/콜론 기준의 느슨한 분할이면 충분.
|
|
const sentences = answer.split(/(?<=[.!?다요음됨])\s+|\n+/);
|
|
const hits: ReimplementationHit[] = [];
|
|
const seen = new Set<string>();
|
|
for (const sentence of sentences) {
|
|
const lower = sentence.toLowerCase();
|
|
if (!PROPOSAL_RE.test(sentence)) continue;
|
|
if (ACKNOWLEDGED_RE.test(sentence)) continue;
|
|
for (const entry of CONCEPT_ENTRIES) {
|
|
if (seen.has(entry.concept)) continue;
|
|
if (entry.keywords.some((k) => lower.includes(k.toLowerCase()))) {
|
|
seen.add(entry.concept);
|
|
hits.push({
|
|
concept: entry.concept,
|
|
impl: entry.impl,
|
|
sentence: sentence.trim().slice(0, 120),
|
|
});
|
|
}
|
|
}
|
|
}
|
|
return hits;
|
|
}
|
|
|
|
/** 정정 푸터 마크다운 — 빈 hits 면 ''. */
|
|
export function formatReimplementationFooter(hits: ReimplementationHit[]): string {
|
|
if (hits.length === 0) return '';
|
|
const lines: string[] = [];
|
|
lines.push('\n\n---');
|
|
lines.push('⚠️ **기능 인벤토리 자동 대조** (결정론적 검사 — LLM 아님): 위 답변이 신규 도입을 제안한 항목 중 다음은 **이미 구현되어 있습니다**.');
|
|
for (const h of hits) {
|
|
lines.push(`- **${h.concept}** → ${h.impl}`);
|
|
}
|
|
lines.push('');
|
|
lines.push('_위 제안을 채택하기 전에 기존 구현을 먼저 확인하세요. (두뇌의 "ASTRA 기능 인벤토리.md" 참조)_');
|
|
return lines.join('\n');
|
|
}
|