feat(core): 자기지식 접지·웹 접근·환경 자가점검 — 할루시네이션 방어 3중화 (v2.2.247)

- 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>
This commit is contained in:
g1nation
2026-06-12 23:46:07 +09:00
parent 553aa0b134
commit a114d968b0
42 changed files with 4178 additions and 2088 deletions
+11
View File
@@ -1037,6 +1037,17 @@
border-left: 2px solid var(--accent);
background: rgba(99,102,241,0.04);
}
.company-alignment-card .cal-self-research {
margin-top: 6px; padding: 6px 8px;
border-left: 2px solid #22c55e;
background: rgba(34,197,94,0.05);
}
.company-alignment-card .cal-self-research ul {
margin: 4px 0 4px 16px; padding: 0;
}
.company-alignment-card .cal-self-research li {
margin-bottom: 2px; color: var(--text-primary);
}
.company-alignment-card .cal-q-head {
font-weight: 600; color: var(--text-bright); margin-bottom: 4px;
}
+31 -1
View File
@@ -416,10 +416,15 @@
if (s.lmStudioError) {
segs.push(`<span class="rb-seg bad" title="${escAttr(s.lmStudioError)}">⚠ LM Studio 로드 실패</span>`);
}
// 환경 전제 조건 경고 (Bridge·두뇌 볼륨·자격증명·확장 버전) — 전체 목록은 hover.
if (Array.isArray(s.healthWarnings) && s.healthWarnings.length > 0) {
segs.push(`<span class="rb-seg bad" title="${escAttr(s.healthWarnings.join('\n'))}">⚠ 환경 ${s.healthWarnings.length}건</span>`);
}
rbContent.innerHTML = segs.join('<span class="rb-sep">·</span>');
if (rbDot) {
const on = s.engine && s.engine.online;
rbDot.className = 'rb-dot ' + (on === true ? 'ok' : on === false ? 'bad' : 'warn');
const hasEnvWarn = Array.isArray(s.healthWarnings) && s.healthWarnings.length > 0;
rbDot.className = 'rb-dot ' + (on === false ? 'bad' : hasEnvWarn ? 'warn' : on === true ? 'ok' : 'warn');
}
}
@@ -1205,6 +1210,31 @@
summary.appendChild(dl('형식', c.format));
card.appendChild(summary);
// ── 자가 조사로 해결된 항목 — 묻기 전에 두뇌에서 스스로 찾은 답 ──
const SELF_RESEARCH_PREFIX = '(자가 조사로 두뇌에서 확인) ';
if (Array.isArray(c.answeredQuestions)) {
const selfResearched = c.answeredQuestions
.filter((qa) => qa && typeof qa.a === 'string' && qa.a.startsWith(SELF_RESEARCH_PREFIX))
.slice(0, 3);
if (selfResearched.length > 0) {
const srBlock = document.createElement('div');
srBlock.className = 'cal-self-research';
const srHead = document.createElement('div');
srHead.className = 'cal-q-head';
srHead.textContent = '🔎 스스로 확인한 정보 (두뇌 검색):';
srBlock.appendChild(srHead);
const srUl = document.createElement('ul');
for (const qa of selfResearched) {
const li = document.createElement('li');
const ans = qa.a.slice(SELF_RESEARCH_PREFIX.length);
li.textContent = `${qa.q}${ans.length > 150 ? ans.slice(0, 150) + '…' : ans}`;
srUl.appendChild(li);
}
srBlock.appendChild(srUl);
card.appendChild(srBlock);
}
}
// ── 미해결 질문 ──
if (Array.isArray(c.openQuestions) && c.openQuestions.length > 0 && v.kind === 'questions') {
const qBlock = document.createElement('div');