Compare commits

...

52 Commits

Author SHA1 Message Date
koriweb 7d6b8b509f v2.2.311~312: 응답 지연 근본 개선(KV 캐시 분리·제2뇌 상주 캐시) + 보고 품질 수술
v2.2.311 — 응답 지연 (실측: 출력 22토큰에 94.7초, 원인은 매 턴 13k+ 토큰 전체 재프리필)
- KV 캐시 친화 프롬프트 분리(kvCachePromptSplit, 기본 ON): message[0]을 불변
  정적 본문으로 고정, 날짜/RAG/[CONTEXT]/동적 블록을 마지막 user 메시지 직전의
  internal system 메시지로 이동 — llama.cpp prompt cache 프리픽스 재사용으로
  턴당 재프리필을 "직전 교환 + 동적 컨텍스트"로 축소. truncation 도 tail 적용.
- 검색 토큰 예산 현실화(retrievalTokenBudget, 0=자동): 창의 25%(8k~80k) →
  12%(2.5k~6k 클램프).
- continuation 은 depth-0 memoryCtx 재사용: 라운드당 재검색 3~8초 제거 +
  빈 쿼리 재검색으로 청크가 갈리던 문제 제거 + 턴 내 프롬프트 안정화.
- 제2뇌 상주 캐시(신규 brainWatch.ts): 재귀 fs.watch 세대 카운터로 변경 없으면
  디렉터리 워크·파일별 statSync 전면 생략. 수정 직후 3초 창은 신뢰 제외(이벤트
  지연 레이스 가드), 워처 불가 시 종전 폴백, 활성화 시 백그라운드 워밍,
  유휴 해제 30분→2시간.

v2.2.312 — 보고 품질 (실사례: "## 4."부터 시작하는 7줄 일반론 보고서)
- 중간 라운드 본문 표시 버그 수정: 액션과 함께 작성된 섹션(1~3)이 화면에 한 번도
  안 나가고 최종 라운드만 표시되던 근본 원인 제거 — stripForDisplay.ts 로 액션
  태그만 걷어내고 라운드 순서대로 버블에 표시.
- '분석 보고' 업무 유형 신설(requirementGraph): 보고 개요(첫 줄 자기선언)·파일
  근거(주장마다 실제 읽은 파일 인용, 일반론 금지)·구조·발견·다음 단계 강제,
  유형 감지 시 "최대 3섹션" 규칙보다 필수 요소 커버 우선.
- 근거 없는 분석 감지: 파일을 읽고도 인용 2개 미만인 장문 분석에 "근거 인용
  없음" footer 경고 (헛조사 감지의 반대 방향).

검증: 전체 테스트 954건 통과(신규 28), tsc 무오류, vsix 패키징·설치 확인.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 13:21:41 +09:00
koriweb a31d273bfe chore(records): .astra 런타임 자산 + ConnectAI 기록 동기화 (테스트 실행분·대화 기록)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 13:21:15 +09:00
koriweb 6e4de611e6 로컬 프로젝트 분석: STATUS.md 를 현재 상태의 단일 기준으로 승격
- findPriorityProjectFiles: STATUS.md 를 우선 프리뷰 대상에 추가하고
  랭킹을 package.json 바로 다음(README 앞)으로 배치.
- 경로 분석/의도 가이던스: STATUS.md(작업 단위마다 갱신)를 먼저 읽고
  현재 페이즈/진행 판단의 앵커로 삼도록 지시. docs/plans/* 등 설계
  문서는 작성 시점의 의도라 낡을 수 있으며, 충돌 시 STATUS.md 가
  우선하고 설계 문서가 대체되었음을 명시적으로 말하게 함.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 09:59:39 +09:00
koriweb 5feacb4799 v2.2.308~310: Standing Rules + 조사 파이프라인 + LM Studio 추론 노출 수리
v2.2.308 — Standing Rules (Correction Loop ④): 행동/스타일 교정의 세션 영속화
- 행동 지적 감지("또 ~하네", "하지 말라고 했잖아" 등 5종) → LLM 이 명령형 규칙으로
  정규화 → .astra/growth/standing-rules.json 즉시 저장 → 매 턴 보호 구역 주입.
  self-reflection 이 컨텍스트 창(단기 기억)에 갇혀 새 세션에서 증발하던 문제 해결.
- 중복 지적은 hits 증가(토큰 자카드), 상한 10개 초과 시 자동 은퇴, 재지적 시 부활.
- "Astra: 상시 행동 규칙" 커맨드 — 활성/은퇴 규칙 + 실제 주입 블록 열람(도달 증거).

v2.2.309 — 조사 파이프라인: 파일명만 보고 상상하는 헛조사 4중 차단
- <investigate_files path focus> 액션: 폴더의 텍스트 파일을 코드가 강제 정독해
  파일별 노트 주입(Map-Reduce). 내용 해시 캐시(.astra/cache/investigate)로 재조사
  시 재사용 — 온디맨드 지식화.
- 조사 증거 게이트(행동 제약) + Hollow Investigation 감지(list만 하고 read 0회로
  파일 서술 시 경고 footer — continuation 경로 포함) + actionStats turn 추적.
- g1nation.investigationModel: 조사형 요청만 상위 모델(예: claude-code:sonnet) 라우팅.

v2.2.310 — LM Studio LSEP 합성 추론 구분자 처리
- 일부 모델 조합에서 추론이 여는 마커 없이 content 앞에 흐르고
  __LM_STUDIO_INTERNAL_LSEP_SYNTHETIC_REASONING_END_<hex>__ 로만 경계 표시 →
  생각 과정 전체가 채팅에 노출되던 문제.
- LiveReasoningFilter: 마커 감지 시 streamReplace 신호로 화면 즉시 리셋(토큰 분절
  대응 holdback 포함), sanitizeAssistantContent: 마커 이전 추론 최종 제거(이중 방어).

기타: tests/wikiSave.test.ts 상대경로 테스트 Windows 호환 수정(드라이브 문자).
검증: 전체 테스트 926건 통과 (신규 39건: standingRules 15 + investigationPipeline 16 + LSEP 8).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 18:18:49 +09:00
koriweb 137b83d8b6 chore(records): .astra 테스트 런타임 자산 동기화 (v2.2.310 테스트 실행분)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 18:18:20 +09:00
koriweb 47b3b9f93a v2.2.299~307: 아키텍처 수렴 + 채팅 정리 + 벤치마킹 강화 + Claude 구독 엔진
- v2.2.299 아키텍처 수렴: coreChat 통일(엔진 휴리스틱 3벌 제거), 기업 모드
  검색 오케스트레이터 승격, lib/execUtil(실행 래퍼 6곳·Python 탐지 3벌 단일화),
  lib/kstSchedule(워처 4개 nowInKst 통합), estimateTokens 통합, 설정 접근 규칙 명문화
- v2.2.300 채팅 화면 정리: LiveReasoningFilter(스트리밍 중 <think>/Harmony 추론
  토큰 단위 차단), 확신도·검토요청 footer 기본 숨김(계산·Reflection 은 유지)
- v2.2.301 문맥·의도 이해: [답변 전 이해 원칙] 상시 주입, 워크플로우 의도 브리핑,
  Report QA 루프(규칙 레지스트리+실측치+회귀 게이트, 블로그_v3 개념 이식)
- v2.2.302 /benchmark 비즈니스 렌즈(가격·수익·운영)+빌드 프롬프트 모드+QA 연계
- v2.2.303 handoff 모드(측정치 무손실 인수인계 문서)+/claude(Claude Code 터미널 위임)
- v2.2.304 이식성: 지식 경로 두뇌-상대 규약(pickWikiDir 상대 해석), 이사 체크리스트
- v2.2.305 Claude 구독 엔진: claude: 프로바이더(CLI 위임, 모델 드롭다운 자동 노출,
  coreChat 지원 — 워크플로우·QA도 구독 모델 가능)
- v2.2.306 Tone Guard: AI 상투어 금지 레지스트리(상담사 화법 실사례 8종+대조 예시)
- v2.2.307 /benchmark 레이아웃 골격(sectionRoles 결정론 분석, 롤링 배너 즉답),
  파트별 실패 격리, 합성 타임아웃 120→300초

검증: tsc 무오류 + jest 888 통과 + esbuild 정상

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 21:02:15 +09:00
koriweb 98d533f045 chore(records): .astra 런타임 자산 동기화 (v2.2.297 후)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 22:49:06 +09:00
koriweb 443488a3b6 v2.2.297: stocks 목록 클라우드 백업 — Sheets _backup 탭 자동 백업 + /stocks backup·restore
로컬 .astra/stocks.json 뿐이던 워치리스트를 spreadsheet _backup 탭에 원본
JSON 그대로 자동 백업(변경 시 30초 디바운스). 새 컴퓨터에서는 /stocks
restore 한 번으로 복원. sheetsApi 에 ensureSheetTab/clearSheetRange 추가,
writeStocksStore 성공 시 변경 리스너 발화로 모든 변경 경로 포착.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 22:48:59 +09:00
koriweb 26cde3afb0 chore(records): .astra 런타임 자산 동기화 (v2.2.296 후)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 20:50:26 +09:00
koriweb bb7cd6b879 v2.2.292-296: 메모리·발열 최적화 + Pixel Office 완전 제거 + 소형 모델 추론 강화(calculate/run_code/지식 스코프)
- v2.2.292 메모리·발열: 헬스체크 워크스페이스 쓰기→fs.access(워처 연쇄 제거)·git 검사 비동기 30분 주기,
  웹뷰 retainContextWhenHidden 정리(채팅만 유지), 브레인 인덱스 유휴 30분 TTL 해제,
  채팅 DOM 200개 상한, @lmstudio/sdk 지연 로드
- v2.2.293 Pixel Office 시각화 폐기: astraOffice 모듈·사이드바 매니저 3종·스프라이트 17MB 삭제,
  sidebarProvider collector 섹션 통삭제 (기업 모드 판단 로직 무변경, vsix 12.2MB→1.3MB)
- v2.2.294 도구 메뉴 'NotebookLM 백엔드 실행/종료' 버튼: OS 자동 감지, 프로젝트 자동 탐색+폴더 선택 저장,
  포트 정리 폴백 (터미널 없이 Research 백엔드 켜고 끄기)
- v2.2.295 추론 강화 1탄: [ACTION 16] <calculate> Python 계산 위임(결과 재주입·자가수정 루프),
  단계별 지식 스코프(General+Specialty, 결정적 도메인 분류, 설정 지식·기억 탭 UI)
- v2.2.296 추론 강화 2탄: [ACTION 17] <run_code> 실행 확인(stdout 회수→수정→재실행 루프),
  문법 오류 재주입 자가수정, 도구 라우팅 힌트(dynamicBlocks), Grounding rescue 도메인 스코프 확장
- 검증: jest 818 통과(신규 29개), tsc 무오류, esbuild 정상

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 18:59:47 +09:00
koriweb fa397d7fa1 v2.2.268-291: /email 통합(브리핑·스캔·워처) + stocks 자동편입·매수알림 + 지식문서·메신저 중앙화
[/email — Gmail + 클래식 Outlook (신규 기능군)]
- 기본 명령: brief(PM 업무 허브 대시보드)·list·read·wikify·reply(Drafts만)·open(Outlook 창 열기)
- Gmail: 자체 OAuth gmail.readonly 스코프 추가 (재연결 1회 필요) / Outlook: COM(PowerShell), 전 계정(Store)·하위 폴더(120개 가드) 수집, To/CC 판별
- 브리핑: 상태 3분류(결정/회신/확인만)·P등급 영향·프로젝트 위험도·Today Focus·오늘 완료 예상·기간 명시 시 표시 범위 제한
- 영속 상태(email_state.json): 회신대기/공넘김 상태머신, 창 밖 미회신 보존, done old N 일괄정리
- 워처: 주기 자동 수집 + 미회신 임계 알림(기본 끔) + 데일리 브리핑 '답할 이메일' 섹션
- 전체 스캔(/email scan): 자동 위키화(회차 15건·레지스트리·파일삭제 감지 재생성)·진행 표시(streamProgress)
- 자동발신 필터 확장(Confluence·AWS·광고·[Notification]) + 라벨 오타 후처리(polishBriefLabels)

[/stocks]
- discover 자동 편입(stocks.json) + 매수권장가 224일선 자동 산출
- 매수사정권 진입 전이 감지 → 텔레그램 1회 알림 (직전신호 추적)
- 버그 수정: '미충족'이 .includes('충족')에 오탐되던 필터 판정

[지식 문서 파이프라인 통일 (wikiFormat/wikiSave)]
- PC 로컬 직접 저장 (NAS 볼륨 미아 문제 해소) — 설정 폴더 → 두뇌 → 워크스페이스
- 이메일 전용 Email_Wiki 분리(email.wikifySavePath) + 봉투(frontmatter) 자동 통일
- 정본 프롬프트 단일 빌더(buildKnowledgeWikiPrompt) — web/email 래퍼화, 템플릿 fetch 일원화
- 이메일 문서 시점 3중 방어: 기준시점 헤더·제목=메일 최신일·날짜 없는 현재형 금지
- docs/WIKI_DOC_PIPELINE.md 개발 규약

[텔레그램 메신저 중앙화 (messageFormat)]
- 단일 렌더러 renderTelegram — 5개 발신 빌더(주식보고·매수시그널·Top5·데일리·미회신) 통일
- 주식 보고 시각 하드코딩 제거(messenger.stocksReportTimes CSV) + 알림 토글 2종
- 설정 패널 '메신저' 탭 신설 · '이메일' 토글 섹션(Gmail/Outlook on/off)

테스트 803개 통과 (이메일 상태머신·CC판별·포맷·매수전이·봉투 등 60+ 신규)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 18:57:12 +09:00
koriweb 92d81e38ce v2.2.267: 채팅 사이드바 Pixel Office 배너 제거 (화면 점유 해소)
채팅 위에 항상 떠 있던 Pixel Office 카드(캐릭터·Agent/Status/Task 표)가
화면을 과도하게 가리는 문제 — 시각 레이어만 제거, 기능은 보존:

제거 (media 웹뷰 시각 레이어):
- sidebar.html: #pixelOffice 배너 DOM 블록
- sidebar.js: Pixel Office 렌더러 IIFE + pixelOfficeUpdate/officeSnapshot 핸들러 no-op 화
- sidebar.css: .pixel-office / .po-* 스타일 전부

보존 (백엔드·별도 패널):
- 파이프라인 상태 추적(pixelOfficeOn*) 및 브로드캐스트 전부 유지 — 에이전트 동작 무영향
- 풀스크린 Astra Office 패널(Astra: Open Pixel Office (Full Screen)) 그대로 동작
- 설정 pixelOffice.enabled/bubbles 유지, 설명만 풀스크린 패널 전용으로 정정

(검증: node --check ✓ · 잔여 참조 grep 0 ✓ · tsc ✓ · jest 728/730 ✓)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 20:11:18 +09:00
koriweb 1dbd5fd186 v2.2.266: /stocks discover 멀티팩터 합성점수 (Quality/Value/Momentum/Stability)
/stocks discover 추천 순위를 업계 표준 방식(Stockopedia StockRanks·S&P 멀티팩터 지수)으로 고도화:

[compositeScore.ts] 신설:
- 후보군 내 백분위 정규화: 각 지표를 0~100 범위로 상대평가
- 4축 분리: Quality(ROE·마진·성장YoY·부채) / Value(PER·PBR) / Momentum(12m수익률·224회복·정배열·RSI·낙폭회복) / Stability(유보율·시총·부채)
- 투자성향별 가중 합성: 스윙/중기=M35%, 장기투자=Q40%, 저평가우량주=V40%
- Value trap 가드: miniF-Score(Piotroski) 절반 미달 시 Value 축 50점 캡 → ⚠️VT가드 표시
- 결측 축 재정규화: 데이터 없는 축은 가중치에서 제외

[stockDiscovery.ts] 배선:
- 모멘텀 입력 수집: 기존 시세 평가(MA224·낙폭회복) + 새로 정배열·RSI·12개월 수익률 계산
- 배치 채점: 후보 전체를 한 번에 scoreCandidates() 호출 → 백분위 정규화
- 정렬: "키워드 개수" → "합성점수" 내림차순 (타이브레이커 PBR 유지)
- DiscoveredCandidate에 score 필드 추가

[discoveryAnalyzer.ts] 재설계 (LLM 서술만):
- Top 5 선정: 코드가 확정(candidates.slice(0, 5)) — 순위 변경 X
- LLM 역할: 각 종목 pitch 한 줄만 서술 (v2.2.211 judge 철학 적용)
- 실패 폴백: LLM 무응답 시 결정론 pitch 자동 생성 (점수 분해 + 최강 축 언급)
- 출력: 점수 분해(Q/V/M/S), mini F-Score, value trap 가드 표시 추가

[slashStocks.ts] 출력:
- 후보 목록: 순위 점수 + 분해 점수 + VT가드 · mini F 표시
- 모멘텀: "키워드 수" → "멀티팩터 합성점수 내림차순" 명시

[tests/compositeScore.test.ts] 신설:
- percentileRanks: 백분위, 동점 평균 랭크, 결측 처리
- scoreCandidates: 그라데이션(이진 카운트 해소), value trap 가드, 성향별 가중 차별, 결측 재정규화
- 총 13개 테스트 케이스

효과:
- 그라데이션 반영: ROE 35% > 10.1% 실감
- 중복 카운트 제거: 영업이익률이 한 지표만 계산
- Value trap 방어: PBR 0.4 + 품질 미달 = 50점 캡
- Top 5 신뢰도: LLM 순위 변조 불가

한계: 문헌 기반 설계이며 한국 시장 백테스트 미실시 — 실전 매수는 참고용 권장.

(검증: tsc ✓ · jest 728/730 ✓ + compositeScore 13개 신규 테스트)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 19:50:06 +09:00
koriweb 8f1ce4d617 v2.2.265: /meet 검수 루프·편집·액션 상세·논의 매듭
/meet 파이프라인 대폭 개선:
- 검수 루프: 회의록 검증 후 지적분만 수정, 통과까지 반복 (전체 재작성 X)
- 편집(Editor): 검수 통과 후 보고서 형태로 구조 정리 (환각 방지 재검증)
- 액션 상세 확장: task 노트에 2~3문장 자기완결 설명 자동 생성
- 주요 논의/쟁점: 각 쟁점을 논점→논의→결론으로 그 자리에서 매듭
- 자동 등록 0건 fix: 기한 없는 확정·기한미정을 작성일(오늘)로 등록 (폴백)

신규 설정:
- g1nation.meetVerifyMaxRounds (기본 2)
- g1nation.meetEditorPass (기본 ON)
- g1nation.meetTaskDateFallback (기본 today)
- g1nation.meetTaskDetailExpand (기본 ON)

신규 프롬프트:
- buildMeetRevisePrompt (지적분만 수정)
- buildMeetEditorPrompt (근거 유지 편집)
- buildTaskDetailPrompt (액션 상세 확장)

신규 파서:
- parseTaskDetails (task 상세 맵핑)

신규 테스트:
- classifyAction dateFallback 동작 5건
- parseTaskDetails 파싱 4건

tsc ✓ · jest 715/715 ✓

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-07-02 18:22:52 +09:00
koriweb 40d003635e test: ASTRA 엔진·스트레스 테스트 캐시/미션 산출물 갱신
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 18:50:40 +09:00
koriweb e6d780be61 stocks: 미국 주식 지원(개별 종목) + datacollect LLM 직접 호출 + 백엔드 기본 NAS
미국 주식 (개별 종목 조회 — add/check/judge/analysis/position):
- marketUtils: KR(6자리)/US(티커) 시장 판별, 통화·시총 포매팅($/원, B·T/억·조)
- yahooClient: US는 raw 티커(.KQ/.KS 미부착), 심볼 라우팅 분리
- yahooFundamentals: Yahoo quoteSummary(무키) cookie+crumb 핸드셰이크로 ROE/PER/PBR/마진/성장/부채 fetch (429·crumb 하드닝)
- fundamentalsRouter: 심볼별 Naver(KR)/Yahoo(US) 분기
- criteriaEval: market-aware — US는 유보율 미보고라 유동성·안정성을 부채비율(D/E)·시총($B)으로 대체
- types: Stock.market 필드; slashStocks/llmJudge: 통화·라우팅·프롬프트 US 대응
- 테스트: stocksMarket + criteriaEval US 케이스 (전체 통과)

datacollect/llm.ts: LLM을 확장(PC)에서 직접 호출(과거 bridge /api/lm 프록시 제거)
 → 백엔드 NAS 이전 시 PC→NAS→PC 실패 제거, 스크래핑=NAS·LLM 추론=PC 분리

package.json: datacollectBridge 기본값 nas + https://dc.koritips.com; 버전 2.2.261

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 18:43:04 +09:00
koriweb 4288b212d5 v2.2.259: /meet 회의록 방향성 개선 (개조식 + 이슈→결정 순서)
회의록 생성 프롬프트(meetPrompt.ts OUTPUT_FORMAT) 개선 — 외부 모범사례 근거:
- 문체: 서술형 일기체 → 개조식·명사형 종결('~논의/합의/완료/필요')
- 구조: '주요 논의/쟁점'을 '결정 사항' 앞으로(이슈→결정 흐름)
- 참석자 명단의 "(참석자 N)" 화자번호 누수 차단; 최종 점검/검증 항목 보강
- package.json 2.2.258 → 2.2.259

(그 외 .astra/tests 런타임 캐시·미션 상태 변경 동반)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 19:25:29 +09:00
koriweb 7f2ecc5015 chore(records): .astra 런타임 자산·Chronicle 동기화 (v2.2.258 후)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 18:15:31 +09:00
koriweb 6dc5f17dec v2.2.258: /meet 화자 팀/역할 정규화 + 헤더 전조각 주입 + 검증 5종
STT 화자번호(참석자 N) 박멸→회사 표준 팀/역할 귀속, 회의 헤더 전 청크 주입, 전역 헤드라인 추출, 결정 게이트·담화 상태 태깅, 슬림 6섹션 포맷, 타임스탬프 근거, parseActionItems 헤더명 기반 재작성, 검증 패스 5종. 전체 698 통과.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 18:10:32 +09:00
koriweb 5d02a8a56f v2.2.257: /meet 회의록 책임 소재·근거 정책 4종
실제 회의록 산출물 분석에서 드러난 4개 결함을 프롬프트 정책으로 차단.
공유 출력 형식(단일샷+reduce)과 추출(map) 단계 모두에 적용.

- 익명·번호 화자("참석자 1")를 액션 담당으로 확정 금지 → [미지정-확인필요].
  한 익명에 액션 몰리면 "(동일 화자 여부 확인)" — 가짜 책임 배정 차단.
- 내용 없는 인용("이렇게 이렇게/그거") 근거 금지 → [내용 확인필요].
- 기한 역참조: 리스크·논의의 마감("다음 주 수요일")을 결부된 액션 기한에 반영.
- 참석자 명단 정합성: 본문 화자가 명단에 없으면 "(명단 외 화자 — 확인필요)".

§4 지시문·최종 점검 체크리스트 반영. 회귀 가드 +10건, 전체 694 통과.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 18:19:20 +09:00
koriweb 76d5fedfb5 v2.2.256: 코어 채팅 큰 입력 청킹·통합 + 실제 컨텍스트 창 정렬 + 모델 핸들 race 수정
큰 입력 시 "Failed to acquire LM Studio model handle … Operation canceled"
로 턴 전체가 죽던 문제를 3계층으로 해결. 일반 채팅(코어 경로)은 그동안
단일 예산 호출이라 약한 모델·큰 입력에서 무너졌다 — 그 갭을 메움.

- 핸들 race 수정: getModelHandle 을 재시도 루프 안으로 이동. 취소/죽은-핸들
  류 에러는 SDK 재생성 후 1회 자동 재시도(실제 사용자 취소는 존중). 라이프
  사이클의 동시 로드가 abort 되며 SDK 가 coalesce 한 JIT 조회까지 죽던 것.
- Phase 1 실제 창 정렬: llm.getContextLength()(캐시)로 실측 창에 예산 클램프.
  설정값보다 작은 창으로 로드된 경우 서버 truncation/빈 답변 차단. 배지에 표시.
- Phase 2 코어 Map-Reduce: 단일 입력이 (유효 창 × ratio) 초과 시 청크→질의
  인지형 추출→통합. 부분/전체 폴백, 무관 시 정직 신호. 동시성 기본 2.
- Phase 3 메타 노출: 진행/결과 배지 표시, [조각 k] 출처 옵트인.

신규 설정 5종. /meet·/review 전용 경로는 불변. 테스트 +25건, 전체 684 통과.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 18:05:44 +09:00
koriweb 6adbc2a6fa feat(review): /review 코드 리뷰 map-reduce 청킹 명령 (v2.2.255)
일반 에이전트 채팅이 큰 코드베이스 리뷰를 단일 호출로 처리하다 약한 로컬
모델에서 빈 응답으로 무너지던 문제를, /meet 의 검증된 map-reduce 로 우회.

- /review <디렉터리|파일> [초점] 신설 (코어 채팅 경로 무수정)
- Map: 파일별 독립 리뷰(라인 인용 근거), callLmSynthesis 재시도/붕괴감지 활용,
  한 파일 실패해도 부분 리뷰로 진행
- Reduce: 노트 통합 + hierarchical fold 로 reduce 입력을 약한 모델 한도(16K) 안 유지
- 의존성/빌드 산출물 제외, 파일 30개·400KB 상한, 결과 wiki 저장
- 신규 reviewPrompt.ts / reviewFiles.ts, 테스트 +5건(전체 667 통과)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 18:18:20 +09:00
koriweb 1efbe2ec0f fix(agent): 빈 응답 진단 정확도 — MoE 활성 파라미터 인식 (v2.2.254)
약한 모델이 큰 입력에 첫 토큰 EOS로 빈 응답을 낼 때, 모델명 파서가
gemma-4-26b-a4b를 "26B 큰 모델"로 오판하던 문제 수정.

- estimateActiveParamsB 추가: MoE 활성 파라미터 추정(a4b→4, A3B→3, e2b→2)
- 빈 응답 에러 메시지 개선: 원인이 답변 길이가 아니라 입력 크기임을 명시,
  MoE 총/활성 파라미터 표기, LM Studio 로드 context length 불일치 1순위 점검 안내
- 테스트 +6건(전체 662 통과)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 17:08:49 +09:00
koriweb 64d8093080 feat(meet): 회의록 가이드 v2 반영 + 모델 출력 붕괴 복원력 (v2.2.253)
회의록 출력물 개선 (실무 회의록 가이드 v2):
- 섹션 우선순위 재정렬(①결정 ②액션 ③오픈이슈 ④리스크 ⑤논의)
- 논의사항 주제별 bullet 간결화, 오픈 이슈 섹션 복원
- 액션 아이템 산출물 컬럼 추가(담당·작업·기한·산출물 4요소), 담당자 개인 우선
- Executive Summary 결과 중심, 결정사항은 확정된 것만

모델 출력 붕괴(degeneration) 대응:
- callLmSynthesis 재시도 내장(repeat_penalty↑/top_k↓로 반복 억제 강화) + looksDegenerate 감지
- 긴 녹취 조각 실패 시 절반 분할 재귀 재시도(12K→6K→3.5K)
- 부분 회의록 fallback(한 조각 실패해도 전체 중단 안 함)

하위호환: 액션 표 파서 신6컬럼/구5컬럼 모두 파싱, 섹션 번호 무관 탐지,
회의일 추출 일시/날짜 둘 다 인식. 테스트 +13건(전체 659 통과).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 17:16:55 +09:00
koriweb 53953fb5f8 feat(stocks): discover sector — 네이버 업종 코드 직접 조회로 재설계 (v2.2.250)
[버그] discover sector 가 항상 0개 반환. 원인: sectorHint 를 통합 API 의
없는 필드(industryInfo.name)에서 읽어 전 종목이 업종 미상 → 필터 전멸.

[근본 수정] "전 종목 시총 크롤 후 sectorHint 필터" → "네이버 업종 코드로
해당 섹터 종목 직접 조회". 실측: 2차전지 1000-5000억 0개 → 36개.
- stockSectors: 친화 섹터키 → 네이버 업종코드 묶음 (업종 79개 코드표). 17개 그룹.
- naverScreener.screenIndustry(): /api/stocks/industry/{code} 직접 수집 + 시총 필터 + dedup.
- naverFundamentals: sectorHint 를 industryCode→이름 매핑으로 수정 (기술력 키워드·judge 복구).
- stockDiscovery: 섹터 모드 3키워드 게이트 완화(≥1, "섹터 내 상대 추천").
- CLI: discover sector <섹터> [min] [max] / discover sectors.

테스트 8건. 라이브 e2e 확인.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 13:55:18 +09:00
koriweb ae021a8c16 Merge branch 'main' of https://git.koritips.com/bluemsi/connectai
# Conflicts:
#	docs/records/ConnectAI/chronicle.config.json
2026-06-15 11:46:49 +09:00
koriweb 8219f82e00 chore(records): chronicle.config 동기화 (pull 전) 2026-06-15 11:46:23 +09:00
g1nation a114d968b0 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>
2026-06-12 23:46:07 +09:00
koriweb 553aa0b134 chore(records): Chronicle 자동 기록 및 런타임 자산 동기화 2026-06-12 17:08:55 +09:00
koriweb a8365fc3eb chore(records): Chronicle 자동 기록 동기화 (ADR-0053~0055, development) 2026-06-12 16:37:35 +09:00
koriweb ea913b2361 chore(records): Project Chronicle 자동 기록 및 .astra 런타임 자산 동기화 (BUG-0021~0025, ADR-0040~0041, timeline) 2026-06-12 15:38:19 +09:00
koriweb ba1463e2a3 feat(output): 포맷 정책 단일화 — 충돌하던 평문/마크다운 지시를 '정보 구조 매칭' 정책으로 통일 (v2.2.231)
근본 문제: 웹뷰는 marked.js 로 마크다운을 완전 렌더링하는데, 시스템 프롬프트는
"PLAIN TEXT ONLY"(utils 규칙 2)와 "## 헤딩 써라"(Chronicle 가드)가 동시 주입돼
턴마다 포맷이 널뛰었음. ASTRA UX 제안 검토 후 카운터 설계로 채택:

- 규칙 2 교체: 마크다운은 정보 구조가 요구할 때만 — 비교/수치→표,
  주의/경고→인용구, 절차→번호 목록, 파일/설정키→인라인 코드, 핵심→볼드(R4 ≤3 유지).
  장식 금지·짧은 답은 평문·과잉 강조 금지("강조 없는 문장이 기본값").
- 채택 안 한 원안: TL;DR 박스(R1 결론 첫 문장과 중복 — R3 위반),
  볼드 극대화(원안 스스로 Risk 에서 모순 지적), 구분선 남용(전환 1곳 한도).
- 규칙 4 에 Chronicle 가드 예외 명시 (가드 턴의 헤딩 요구와 충돌 해소).
- 코드리뷰 계약(localProjectIntent)도 같은 정책으로 정렬.
- 텔레그램 경로는 별도 프롬프트라 영향 없음 (표 미지원 환경 분리 유지).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 13:56:55 +09:00
koriweb 1208050557 fix(output): 한·영 깨진 토큰("덩ey") 결정론 감지 + 1회 수리 패스 (v2.2.230)
소형 로컬 모델이 한국어 단어 중간에 영문 토큰을 섞는 디코딩 사고
("덩어리"→"덩ey", "결과적으로"→"결ently"). 프롬프트 출력 위생 규칙으로는
못 막음 — 지시 불이행이 아니라 토큰 붕괴라서. 사후 보정으로 해결:

- hangulHygiene.ts: 고정밀 감지 패턴(한글 음절+영문 소문자 2+ 연속) —
  "API를"/"Code의"(영문+조사)·"플랜B"(한글+대문자)는 정상 표기로 미감지,
  코드 블록 제외. 감지 시 LLM 수리 1회 (깨진 토큰만 복원, 내용 변경 금지).
- 수리 검증 게이트: 길이 ±35% 이내 + 깨진 토큰 감소 — 미통과 시 원문 유지
  (수리가 더 망치는 것 방지). 실패 전 과정 로그 (관측성 원칙).
- 적용 경로: 채팅 답변(스트림 후·확정 전) + /wikify 산출물(영구 자산이라
  더 중요 — "🩹 표기 오류 N건 교정" 표시).

테스트 11건 (감지 정밀도·검증 게이트·실패 안전).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 13:50:26 +09:00
koriweb bfb0d23a2f feat(wiki): /wikify 포맷 정본 통일 + 채팅 URL 실데이터 주입 (v2.2.229)
[포맷 통일 — Datacollect 가 정본]
/wikify 와 Datacollect research 가 각자 포맷 사본을 들고 어긋났던 문제.
더 최신인 Datacollect 포맷을 wiki_format.mjs 정본으로 추출(브리지 측)하고,
/wikify 는 GET /api/wiki/template 로 받아 소비. 구버전 브리지면 내장 사본
fallback (정본 v3.1과 동일 내용). 포맷 수정은 이제 wiki_format.mjs 한 곳.

/wikify 가 정본을 따르며 고쳐진 것:
- category "10_Wiki/Topics"(물리 경로 버그) → 논리 도메인 규칙
- 고정 신뢰도 B/0.8 → 소스 평가 동적 부여 (충돌 신뢰도 권고의 입력 품질)
- aliases 빈 배열 → 동의어 3-8개 강제 (어휘갭 검색 보완)
- "## 🔗 관련 문서 링크" → "## 🔗 지식 그래프" + 고아 방지 up-link
- 인라인 [S#] 출처 인용 + 📚 출처 섹션, 비교표·코드 패턴 조건 섹션

[채팅 URL 접근 — 강제 주입 패턴 4번째 적용]
일반 채팅에 URL 을 주면 "접근 불가"라고 답하던 공백: urlContext 가 URL 감지
시 브리지 /api/web-extract(기존 /wikify 인프라 재사용)로 본문 추출 →
컨텍스트 주입 (8K 캡, 잘림 시 /wikify 안내). 실패 시 정직 블록 (브리지 확인
안내 + 추측 금지). 슬래시 명령은 제외 (자체 처리). 주입 성공 로그 포함.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 13:42:43 +09:00
koriweb 925d91a4e5 feat(growth): 지식 재구성 — 충돌 통합 초안 + A-MEM 레슨 네트워크 (v2.2.228)
ASTRA 자기 제안(검증 통과분) 1순위 구현: 충돌을 '감지'에서 '재구성'으로.

[충돌 → 통합 초안 (사람 승인 대기)]
- conflictScan: 모순 감지 시 LLM이 통합 초안 생성 → .astra/growth/reconcile/
  (런당 ≤3건). 신뢰 권고 우선 쪽 기준 + 타방의 유효 정보 보존 + 판단 불가
  사실은 "(확인 필요: A는 X, B는 Y)" 병기 + 출처 표기 강제.
- 자동 반영 절대 없음 — 초안 머리에 명기, 승인 시 사람이 직접 반영 (status:
  pending-review). 거부 = 파일 삭제.

[A-MEM 레슨 네트워크 (NeurIPS 2025 이식, deep research 2순위)]
- lessonNetwork.ts: 새 레슨 저장 시 기존 레슨과 토큰 자카드 유사도 상위 3개를
  "## 관련 레슨" [[위키링크]]로 연결 + 기존 레슨에 백링크(역방향 갱신 —
  memory evolution). LLM 호출 0 — 캡처 경로 지연 없음. 멱등(재실행 안전).
- 연결 지점: Correction Loop 자동 레슨 + 수동 레슨 생성(Astra: New Lesson).
  고립된 카드 모음 → 상호 연결 네트워크: "같은 종류의 실수" 패턴이 파일
  수준에서 보이고 RAG 위키링크로 함께 검색됨.

테스트 6건 추가 (유사도·링크 멱등·양방향·초안 형식). 전체 588 통과.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 13:25:28 +09:00
koriweb c9ce36138f fix(self): 자기 평가 구식 제안 재발 — 개념 매핑·관측성·앵커 차단 3중 보강 (v2.2.227)
v2.2.226 후에도 동일 구식 제안("CoVe 도입하라" 등 + 출처: 모델 지식) 재현.
이번 보강의 핵심은 실패를 *관측 가능*하게 만드는 것 — "주입이 안 됨" vs
"주입됐는데 무시"를 구분 못 해 같은 버그를 3번 쫓았다.

- 개념 매핑 갭 봉쇄: 인벤토리에 "학술 개념 ↔ 구현 매핑" 섹션 자동 생성
  (CoVe/Self-Critique↔coveEnabled+critic-loop, 노후점검 자동화↔주간 사이클,
  충돌 해결↔일일 스캔+신뢰도 권고, 피드백 태깅↔Correction Loop 등 8건).
  모델이 학술 명칭으로 제안할 때 설정 키와 같은 것임을 모르는 갭 제거.
- 관측성: 주입 성공 logInfo + 모델에게 "출처: ASTRA 기능 인벤토리 v<버전>"
  표기 지시 — 답변만 봐도 인벤토리가 도달했는지 판별 가능.
- 감지 확대: SELF_RE 에 connectai/프로젝트/업무 능력 추가, 길이 상한 600→1500
  (배경 설명 붙은 실사용 질문 포착).
- 앵커 차단: "직전 대화의 본인 제안 반복 금지 — 인벤토리가 우선" 지시
  (같은 세션 재질문 시 이전 답변 히스토리에 끌려가는 것 방지).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 12:19:02 +09:00
koriweb 960f43f643 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>
2026-06-12 11:59:05 +09:00
koriweb b03a49bfc3 feat(growth): 자기 지식 자동화 + 회귀 경보 + 충돌 스캔 + Critic 게이트 확장 (v2.2.225)
[근본 수정 — 자가검증 구식 정보 버그]
ASTRA 자기 지식이 사람이 쓴 스냅샷(selfIdentity 블록·아키텍처 위키 문서)에
의존해 릴리스마다 구식이 됐고, 자기 개선 제안에서 이미 있는 기능을 신규
제안하는 오류가 반복됨. 수정:
- featureInventory.ts: 활성화 시 package.json(contributes.commands/configuration)
  + POST_ANSWER_HOOKS 레지스트리에서 "ASTRA 기능 인벤토리" 문서를 두뇌에
  기계 생성 (버전 변경 시 자동 재생성 — 사람이 갱신을 잊을 수 없는 구조).
- selfIdentity: "자기 기능 평가·제안 전 인벤토리와 대조, 기억 의존 서술 금지" 규칙.

[검증-피드백-재설계 파이프라인 보강 — 의견 검토 후 역제안 3건]
- A-1 골든셋 회귀 경보: 주간 사이클이 metrics-history.jsonl 적립 + 직전 대비
  recall@1 -10%p 또는 MRR -0.08 하락 시 ⚠️ + 그 기간 추가된 문서를 용의자로
  제시(regression-alert.md). 자동 롤백 없음 — 판단은 사람.
- A-2 신규 지식 충돌 스캔(conflictScan.ts): 일일(사전 소화와 같은 슬롯) 신규/변경
  문서를 기존 유사 top-2와 LLM 모순 비교 → 충돌 시 conflict-report.md +
  "기존 A vs 신규 B" 알림. 쓰기 주체(Datacollect/수동/Research) 무관 포착.
  런당 비교 ≤5건·최초 실행 24h 한정 (폭주 방지).
- A-3 criticLoop 게이트 확장: 업무 turn 외에도 "근거 약함(top<0.25) + 단정
  표현(수치·날짜·확언)" 트리거 추가. 전 답변 강제 2-pass 는 기각 — intrinsic
  self-correction 은 외부 신호 없이 효과 없음(arXiv 2310.01798).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 11:44:58 +09:00
koriweb 7584c6bbc1 feat(growth): Sleep-time 지식 사전 소화 — 응답 지연을 유휴 시간으로 이동 (v2.2.224)
deep research(3표 검증) 1순위 적용: sleep-time compute (arXiv 2504.13171).
유휴 시간에 로컬 LLM이 두뇌의 raw context를 learned context로 미리 소화해,
응답 시점 RAG가 고밀도 소화 노트를 검색하게 한다 — 로컬 LLM의 최대 약점
(느린 추론)의 비용을 사용자 응대 시점에서 유휴 시간으로 구조적으로 이동.

- sleepDigest.ts: 매일 03:00 KST(설정 가능) 최근 7일 변경 파일이 많은 폴더
  순으로 소화 노트 생성 (<두뇌>/Digests/<슬러그>.md, 런당 ≤5건).
  노트 = 예상 질의 Q&A + 핵심 사실 + 문서 간 연결 (출처 제목 인용 강제,
  "원문에 없는 내용 지어내지 마라" — 환각 방지 동일 원칙).
- 노후화 자동 감지: 소스 mtime > generated_at 이면 재생성, 아니면 skip
  (steady-state 비용 0). 노트는 삭제해도 안전 (자동 재생성).
- 승인 게이트 불요 근거: 외부 지식 유입이 아니라 기존 두뇌의 재구성.
  원문 우선 원칙을 노트 머리에 명기.
- 수동 명령 "Astra: 지식 사전 소화 지금 실행" + sleepDigest.enabled/time 설정.
- 실 LLM(gemma-4-26b)+실 위키 3문서로 프롬프트 품질 검증 완료 (출처 인용·
  무환각 확인). 테스트 8건 추가.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 11:29:40 +09:00
koriweb 72faa07480 feat(growth): Correction Loop — 정정 1회가 시스템 세 곳을 성장시키는 파이프라인 (v2.2.223)
self-evolving 고도화: 사용자 정정이 곧 Ground Truth — 정답지를 사람이 따로
만들지 않고, 태그 통계가 리포트에 머물지 않고 다음 턴의 행동을 바꾼다.

① 정정 감지·태깅 (correctionLoop.ts + agent.ts 훅, fire-and-forget):
- "아니야/틀렸어/~가 아니라" 류 정정 발화 감지 (보수적 — 추임새 "아니"는 제외)
- LLM 오류 분류 (사실오류/근거누락/맥락누락/추론오류/지시불이행/형식오류,
  실패 시 휴리스틱 fallback) → error-tag frontmatter 레슨(lessons/) 저장
- 동시에 회귀 케이스 적립: .astra/eval/corrections.jsonl {질문, 틀린답, 정정}

② 주간 성장 사이클 확장 (1.5단계):
- 정정 회귀 테스트: 정정받은 질문을 두뇌 검색 컨텍스트와 함께 재실행 →
  LLM-judge "같은 실수 반복?" 판정 → growth/regression-report.md (사이클당 ≤8건)
- 약점 프로필: 최근 60일 태그 통계 → growth/weakness-profile.json

③ 결핍의 행동화 (memoryContext):
- GROUNDING 약함 + agent scope 적용 중 → 전체 두뇌 1회 재검색 (scope 가
  정답 문서를 가리는 경우 구제, 더 강한 근거일 때만 채택)
- 그래도 약함 → 학습 큐에 지식 공백 자동 proposed 등록 (질문 해시 중복 차단,
  20건 폭주 방지, 승인은 사람 — Permission Based Learning 유지)
- 약점 프로필 → [자기검토] 블록 주입 (태그 2회 이상만): "너는 최근 X 정정을
  N회 받았다 — <유형별 자기검토 지시>"

테스트 25건 추가 (감지 패턴·프로필 집계·큐 등록·영속화·fallback 분류).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 19:28:46 +09:00
koriweb 67927b1d4e feat(retrieval): 임베딩 하이브리드 검색 활성화 — 자동 감지 + 측정 기반 수정 (v2.2.222)
골든셋(24질의) 측정으로 기존 하이브리드 구현의 결함 3건을 잡고 기본 활성화.
측정 결과: recall@3 83.3%→87.5%, MRR 0.802→0.806, recall@1 회귀 없음 (α=0.5).

수정 (측정으로 검증):
- 임베딩 입력을 토큰 재조합(tokens.join)→원문 슬라이스로 교체 + nomic/e5
  task prefix (search_query:/search_document:). 토큰 죽 입력은 하이브리드를
  전 지표 하락시켰음 (recall@1 75%→54%). @r2 리비전 키로 구벡터 자동 무효화.
- 블렌드 스케일 버그: 벡터 있는 후보만 정규화돼 벡터 없는 후보의 raw 점수가
  상위 독식 → 전 후보 정규화 + cosine 후보군 내 min-max 정규화.
- 헤딩-only 청크도 헤딩 텍스트로 임베딩 (벡터 공백 제거).

추가:
- embeddingBootstrap: 활성화 시 엔진 모델 목록에서 임베딩 모델 자동 감지 →
  embeddingModel 자동 설정 + "전체 색인" 버튼 알림. 다국어 모델(e5/bge-m3) 우선.
  사용자가 의도적으로 비우면 재설정 안 함 (globalState 가드).
- 벡터 저장 시 소수 4자리 양자화 — 캐시 360MB→~150MB (코사인 순위 영향 없음).
- tests/retrievalEvalEmbedding.test.ts: env-gated 하이브리드 측정 하니스 (alpha sweep).
- scripts/compact_brain_index.mjs: 기존 full-precision 캐시 1회 압축 도구.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 19:02:56 +09:00
koriweb c7c84702af feat(chat): 일정/할일 질의에 Google Calendar·Tasks 실데이터 주입 (v2.2.221)
"오늘 업무 목록 알려줘" 류 질문에 채팅이 캘린더를 못 읽던 문제 수정.
채팅 경로(RAG)는 두뇌·기억만 검색해 캘린더가 연결돼 있어도 일정 질의에
모른다고 하거나 지어내던 구조적 공백.

- scheduleContext.ts: 일정/할일 질의 감지(isScheduleRequest) 시
  iCal 캐시 새로고침 + 기간 내 일정 + Tasks(기간 마감/기한 경과/조건부)
  실데이터 블록을 contextBlock 에 주입. "데이터에 없으면 없다고 답하라"
  지시 포함 (환각 방지). 기간 해석: 기본 오늘 · "내일" · "이번 주".
- 미연결이면 연결 명령 안내 블록 — 지어내지 않고 정직하게 안내.
- Tasks 조회 실패(토큰 만료 등) 시 에러를 그대로 사용자에게 전달.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 18:34:06 +09:00
koriweb b72501fae5 feat(growth): 주간 성장 사이클 자동화 + 텔레그램 양방향 HITL (v2.2.220)
P4 — Self-Evolving OS 폐루프 자동화:
- growthCycleWatcher: 매주(기본 일 20:00 KST, 설정 가능) 자동으로
  ① 골든셋 검색 평가(recall/MRR 주간 추이) ② 학습 큐 갱신(Need Engine)
  ③ 지식 노후 점검 ④ 성장 리포트 ⑤ 승인(approved)된 학습 큐 항목을
  Research Agent 로 자동 실행(사이클당 최대 3건) ⑥ 요약 알림+텔레그램.
  승인 자체는 여전히 사람 — Permission Based Learning 유지, 자동화되는
  것은 '승인된 것의 실행'뿐. 결과물은 기존 수동 명령과 동일 위치
  (.astra/eval/, .astra/growth/) — 완전 호환. 수동 트리거 명령
  (growthCycle.runNow) 제공. 단계별 독립 try/catch.

P5 — 텔레그램 양방향 HITL:
- /meet confirm 코어를 출력 중립 processConfirmDecisions 로 추출
  (웹뷰·텔레그램 공용) — 핸들러는 위임 호출로 슬림화.
- 텔레그램 인바운드에 confirm/pending(보류) 분기 — 회사 밖에서
  "confirm 1=ok 2=6/20 3=skip" 회신으로 보류 액션 등록 완결.
- 데일리 브리핑에 보류 목록 + 회신 안내 포함 — 아침 브리핑에서
  바로 확정하는 흐름 완성.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 18:29:58 +09:00
koriweb b540923890 fix(calendar): OAuth 토큰 만료/철회 시 복구 안내 에러로 번역 (v2.2.219)
/task·/meet 등록에서 'Token has been expired or revoked.' raw 구글 에러만
노출되어 사용자가 복구 방법을 알 수 없던 문제. getFreshAccessToken 이
expired/revoked/invalid_grant 를 감지하면 재연결 명령("Astra: Google
Calendar OAuth 연결 (쓰기)")과 근본 원인 안내(OAuth 동의 화면 '테스트'
모드 = 리프레시 토큰 7일 만료, '앱 게시'로 영구화)를 함께 표시.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 18:18:22 +09:00
koriweb c42c66a3fc feat(retrieval): 청크 검색 기본 켬(+62.5%p recall@1) + 확신도 전역화 (v2.2.218)
P1 — 섹션 청크 검색 기본 활성화:
- 골든셋 24질의 A/B 측정: 파일 단위 → 섹션 청크에서
  recall@1 12.5%→75.0% · recall@3 33.3%→83.3% · recall@5 37.5%→87.5%
  · MRR 0.217→0.802. 18질의 개선·악화 0건.
- Phase 1-가 구현은 완성돼 있었으나 chunkLevelRetrieval 기본값이 false 라
  실전 채팅이 열등한 파일 모드로 동작 — package.json·config 기본값 true 로.
- tests/retrievalEvalCompare.test.ts: 환경변수(ASTRA_EVAL_BRAIN) 게이트형
  A/B 회귀 측정 도구 (평소 skip — CI/패키징 무영향).

P2 — 확신도 전역화 (/meet 원칙을 모든 대화로):
- memoryContext 에 [GROUNDING] 블록 — 두뇌 근거 강도(강/보통/약)를 점수로
  평가해 답변 정책 주입: 약함 → "⚠️ 두뇌 근거 약함" 표기+단정 금지,
  강함 → 근거 문서 제목 인용, 보통 → 사실/추론 구분 서술.

P3 — 회의 용어집 자동화 + 출력 위생:
- /meet 실행마다 담당자 이름·사용자 메타데이터 용어를 .astra/meet_glossary.json
  에 누적, 다음 실행 때 자동 주입 (STT 보정 용어집 — 반복 회의 표기 일관성).
- selfIdentity 블록에 한·영 혼합 깨진 표기 금지 규칙 (전 대화, 무비용).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 18:13:11 +09:00
koriweb 92c92da090 feat(onboarding): 두뇌 기본 위치 부트스트랩 — 성장 데이터 저장처 명시화 (v2.2.217)
두뇌 미설정 시 config 가 숨김 점폴더(~/.g1nation-brain)로 조용히 폴백해
성장 데이터(레슨·기억·지식)가 비개발자는 찾을 수 없는 곳에 쌓이거나 기능이
멈추던 문제 해결. 설치 컴퓨터마다 저장 위치가 결정적이고 발견 가능해진다.

- 활성화 시 brainProfiles/legacy 경로가 모두 비어 있으면:
  · 문서\AstraBrain 폴더 실제 생성 (lessons/·memory/ + 설명 README)
  · settings(global) brainProfiles 에 명시 기록 → 설정 UI 에서 보이고 변경 가능
  · 사용자 1회 알림 (경로 + 백업 권장)
- 데이터 보호: 옛 폴백(~/.g1nation-brain)에 데이터가 이미 있으면 이동 없이
  그 경로를 그대로 등록 (유실 방지).
- 기존 사용자(프로필/legacy 설정 존재)는 완전 no-op.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 17:39:08 +09:00
koriweb 70ea421827 feat(meet): 확신 게이트 등록 + /meet confirm + 데일리 브리핑 (v2.2.216)
캘린더 등록 정책을 "확신 없으면 등록 대신 질문"으로 전환:
- 액션 표에 상태 컬럼(확정/진행미정/기한미정/조건부:선행/반복:주기) — LLM 분류.
- 확정+기한만 자동 등록. 진행미정·기한미정·조건부는 보류 목록으로 질문,
  `/meet confirm 1=6/20 2=ok 3=skip` 답변으로 등록 완결 (/meet pending 재확인).
- 조건부 규칙: ok=날짜 없는 Tasks 로 [조건부] 등록(선행조건 노트 명시),
  날짜=그날을 '조건 확인일'로 등록 — 의존 대상이 제목/노트에서 즉시 인지됨.
- 반복 업무: 반복 등록 없이 첫 1회만(다음 해당 요일) — 까먹음 방지.
- 기한 해석 불가 확정건: 구버전의 +5일 추측 등록 제거 → 보류 질문.
- 과거 날짜(옛 녹취): 과거 날짜 그대로 등록 + "과거자료·완료확인 필요" 표기.
- 중복 방지: 녹취 sha256 해시 레지스트리(.astra/meet_registered.json)로
  같은 녹취 재실행 시 이중 등록 차단.
- tasksApi: due 옵션화(날짜 없는 task 지원).

데일리 브리핑 (신규):
- 평일 KST 09:30(설정 가능) 오늘의 캘린더 일정 + Tasks(오늘 마감/기한 경과/
  조건부 대기)를 텔레그램 발송. 텔레그램·캘린더 미연결 시 조용히 skip.
- g1nation.dailyBriefing.enabled(기본 true) / .time("09:30").

테스트: meetRegistration 15건 (분류 게이트·confirm 파싱·날짜 정규화·중복 키).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 16:22:19 +09:00
koriweb 4eb8bf03f7 fix(identity): 자기 오보고·3인칭·앵무새 반복 3종 수정 (v2.2.215)
사용자 대화 분석에서 발견된 3개 결함:
1) 자기 오보고 — 자기 지식 블록이 Astra 모드에만 있어 Agent 모드는 미적용.
   selfIdentity.ts 공용 모듈로 추출해 양 모드 system prompt 에 주입.
2) 3인칭 화법 — "Astra는~"처럼 남 얘기하듯 답하던 문제. 공용 블록에
   "너는 ASTRA 본인, 반드시 1인칭" 규칙 명시.
3) 앵무새 반복 — [PRIOR TURN CONCLUSION]의 "…결론으로 다시 말해라" 지시를
   소형 모델이 문자 그대로 해석, 직전 답변 첫 문장을 턴마다 서두에 복창.
   지시문을 "인용 받아쓰기 금지 + 자신의 새 문장으로 재평가"로 교체.

근본 보강: 두뇌(2nd)에 정본 자기 기술서 'ASTRA 자기 아키텍처' 문서 생성
(별도 커밋) — 자기 기능/성장 질문 시 RAG 가 실제 사실을 검색하게 함.
self-identity 블록도 해당 문서를 근거로 답하라고 연결.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 14:41:14 +09:00
koriweb 30a876c71a fix(prompt): ASTRA 자기 지식 블록 — 성장 구조 자기 오보고 수정 (v2.2.214)
"너는 어떻게 성장해?" 같은 메타 질문에 모델이 학습 데이터의 일반 LLM
보일러플레이트("나는 frozen 모델이라 학습하지 않는다")로 답하던 문제 수정.
실제로는 레슨·장기/일화 기억·두뇌 위키·골든셋 평가 루프로 세션 간 성장하는
시스템인데, 시스템 프롬프트에 자기 구조 설명이 없어 자기 오보고가 발생했음.

- buildAstraModeSystemPrompt: [ASTRA 자기 지식] 블록 추가 (casual 모드 제외)
  — 성장 메커니즘 4축 명시 + "정적 모델 일반론으로 답하지 말 것" 지시.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 14:30:18 +09:00
koriweb 358497413b chore(release): v2.2.213 — Self-Evolving OS P0~P6 패키지
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 14:00:14 +09:00
koriweb b2cc5b9a96 chore: .astra 런타임 상태·chronicle 기록 동기화
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 13:42:24 +09:00
koriweb 2afd1ac589 feat: Self-Evolving Digital Employee OS P0~P6 + 캘린더 충돌 게이트
신뢰성 코어 (P1~P2):
- Requirement Graph: 업무 유형(회의록/시장조사/업무조사/일정) 필수 요소 주입 + 커버리지 hook
- Confidence Engine(0~100 결정론적) / Escalation Engine(검토 요청) / Epistemic Guard(모름·추정·확실 3분류)
- Provenance: citationTrace 에 출처 수정일·오래됨 경고
- Critic Loop: 문제 신호 turn 만 LLM 검수 1회 + 보완 카드

성장 루프 (P3):
- Gap Detector(Requirement-Knowledge) / Need Engine(30/25/20/15/10 공식) / Knowledge Inventory
- Learning Queue(proposed 전용 병합 — 승인은 사람만) / Decision Journal / Reflection 기록
- 반복 누락 요소(3회+)는 다음 turn 체크리스트에 자동 강조 (T5 루프)

지식 운영 (P4) + 기억 (P5) + 학습 실행 (P6):
- Knowledge Validation + Belief Revision(중복 reject·충돌 시 update/add 권고)
- Knowledge Decay(분야별 반감기 감사) / Knowledge Debt(blocked x impact)
- Organizational Memory(.astra/organization.md 상시 주입)
- Research Agent(approved 큐 -> 조사 브리프+추정 라벨 초안+Validation 게이트 -> proposals/)
- Skill Score(전/후반 추세) + Success Pattern DB(전요소충족+확신도90+ 자동 적재)

병렬 트랙:
- 캘린더 충돌 게이트: conflictCheck + 구조화 이벤트 캐시 + create_calendar_event 차단(force 는 사용자 승인 후)
- Task Eval Harness: 회의록 골든셋 자동 채점 명령 + 성장 리포트/학습 큐/노후 점검 명령

신규 모듈 17종(src/intelligence/), VS Code 명령 5종, 설정 11종, 테스트 +89건(전체 508 통과).
설계 문서: docs/SELF_EVOLVING_OS_MASTER_PLAN.md

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 13:42:09 +09:00
726 changed files with 26973 additions and 8584 deletions
File diff suppressed because it is too large Load Diff
+132 -122
View File
@@ -3,15 +3,15 @@
<!-- ASTRA:AUTO-START -->
## Snapshot
- **Workspace**: `connectai` `v2.2.210` _(absolute path varies by environment; resolved from the active VS Code workspace)_
- **Workspace**: `connectai` `v2.2.312` _(absolute path varies by environment; resolved from the active VS Code workspace)_
- **Description**: The personal intelligence layer for Antigravity and VS Code. A private cognitive partner for deep project context, memory, and proactive strategic decision-making.
- **Stack**: TypeScript, Node.js, VS Code Extension, LM Studio SDK, Test runner
- **Stats**: 441 source files, ~71,522 lines across 5 top-level modules.
- **Stats**: 617 source files, ~90,403 lines across 5 top-level modules.
## Last Refresh
- **Time**: 2026-06-09T02:20:50.409Z
- **Files newly analysed**: 3
- **Files reused from cache**: 438
- **Time**: 2026-07-20T04:20:03.384Z
- **Files newly analysed**: 1
- **Files reused from cache**: 616
## Directory Map
```mermaid
@@ -19,11 +19,11 @@ mindmap
root((connectai))
src/
features/
sidebar/
agent/
lib/
agent/
sidebar/
retrieval/
core/
intelligence/
media/
tests/
helpers/
@@ -33,6 +33,7 @@ mindmap
docs/
records/
docs/
plans/
Meeting/
```
@@ -40,11 +41,11 @@ mindmap
> Arrows: which top-level module imports from which.
```mermaid
flowchart LR
src["src/<br/>280 files"]
src["src/<br/>342 files"]
media["media/<br/>6 files"]
tests["tests/<br/>37 files"]
tests["tests/<br/>86 files"]
core_py["core_py/<br/>6 files"]
docs["docs/<br/>112 files"]
docs["docs/<br/>177 files"]
tests --> src
```
@@ -56,71 +57,71 @@ flowchart LR
## Hub Files
> Imported by many other files — touching these has wide blast radius.
- `src/utils.ts` — referenced by **88** files
- `src/config.ts` — referenced by **35** files
- `src/agent.ts` — referenced by **34** files
- `src/core/services.ts` — referenced by **15** files
- `src/features/company/index.ts` — referenced by **14** files · Public API for 1인 기업 모드. Consumers (sidebarProvider, chatHandlers, command handlers) import from this barrel so internal layout can move around without touching every call site.
- `src/features/company/types.ts` — referenced by **14** files · Type definitions for the 1인 기업 (One-Person Company) mode. The mode turns the user into a virtual CEO that dispatches work to a roster of specialist agents. Each turn produces a session directory conta
- `src/sidebarProvider.ts` — referenced by **11** files
- `src/lib/contextManager.ts` — referenced by **10** files · Context Manager (컨텍스트 한계 관리) "context length = 132k" 는 "답변을 132k 토큰까지 생성해도 된다" 가 아닙니다. 시스템 프롬프트 + 대화 기록 + 입력 문서 + 생성될 답변 + 여유분 ≤ context length 이 모듈은 요청을 보내기 전에 입력 토큰을 추정하고, - 동적으로 출력 상한(maxTokens)을 계
- `src/utils.ts` — referenced by **116** files
- `src/config.ts` — referenced by **44** files
- `src/agent.ts` — referenced by **37** files
- `src/core/services.ts` — referenced by **23** files
- `src/retrieval/brainIndex.ts` — referenced by **14** files · Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 <brainPath>/.astra/brain-index.json 에
- `src/agent/actions/types.ts` — referenced by **13** files
- `src/integrations/telegram/telegramClient.ts` — referenced by **13** files
- `src/features/company/types.ts` — referenced by **13** files · Type definitions for the 1인 기업 (One-Person Company) mode. The mode turns the user into a virtual CEO that dispatches work to a roster of specialist agents. Each turn produces a session directory conta
## Modules
### `src/` — 280 files, ~53,526 lines
### `src/` — 342 files, ~65,381 lines
**Sub-directories**
- `src/features/` (103) — Astra Office — public API. 다음 세션에서 추가될 OfficeSnapshot presenter / schema 도 같은 entry 로 노출 예정. 현재 노출: full webview panel H
- `src/sidebar/` (35) — Brain profile lifecycle 의 pure helpers — sidebarProvider 의 add/edit/delete 흐름에서 modal UI 와 config 쓰기를 제외한 데이터 변환 만 격리. 현
- `src/agent/` (29) — Post-answer hook registry — 답변 완료 후 실행되는 부가 작업 모음. 새 hook 추가 = 1 객체 push. agent.ts 는 이 배열을 iterate 만 함. 현재 등록 순서 (v2.2.1
- `src/lib/` (29) — Astra Mode Architecture Context Builder. 의도: 사용자가 Astra 자체의 mode 디자인 (Guard vs Multi-Agent 가 별도 모드여야 하는지) 을 묻는 메타 질문에 답할
- `src/retrieval/` (18) — Actionability Scoring — 검색 결과를 "현재 작업 상태" 신호로 재가중. 기존 TF-IDF (단어 매칭) + recency (시간) 만으로는 "지금 이 사용자가 하고 있는 작업과 직접 연결 된 문서
- `src/features/` (126) — 데일리 브리핑 워처 — 평일(월~금) KST 09:30 에 "오늘의 할 일"을 텔레그램으로 발송. 소스: 1. Google Calendar — iCal 캐시 새로고침 후 오늘 일정 (readCalendarEvents
- `src/lib/` (37) — Astra Mode Architecture Context Builder.도: 사용자가 Astra 자체의 mode 디자인 (Guard vs Multi-Agent 가 별도 모드여야 하는지) 을 묻는 메타 질문에 답할
- `src/agent/` (36) — <investigatefiles path="..." focus="..."/> — 폴더(또는 단일 파일) 강제 정독 조사. listfiles 가 "이름 목록"을 주는 것과 달리, 이 액션은 대상 파일들을 코드가 직접
- `src/sidebar/` (32) — Brain profile lifecycle 의 pure helpers — sidebarProvider 의 add/edit/delete 흐름에서 modal UI 와 config 쓰기를 제외한 데이터 변환 만 격리. 현
- `src/retrieval/` (20) — Actionability Scoring — 검색 결과를 "현재 작업 상태" 신호로 재가중. 기존 TF-IDF (단어 매칭) + recency (시간) 만으로는 "지금 이 사용자가 하고 있는 작업과 직접 연결 된 문서
- `src/intelligence/` (19) — Confidence Engine — 답변 확신도 0~100 결정론적 산출. Self-Evolving OS 마스터 플랜 Phase 2 / Track 1-1. 신뢰 조건 T4 "확신이 없으면 사람에게 묻는다" 의 측정
- `src/core/` (15) — Astra Path Resolver (경로 해결기) Astra의 모든 데이터 파일(.astra 디렉토리)의 경로를 중앙에서 관리합니다. 확장 프로그램의 설치 경로(extensionUri) 기반으로 .astra 디렉토
- `src/extension/` (9) — 9 files (.ts)
- `src/extension/` (13) — 두뇌(Second Brain) 기본 위치 부트스트랩 — 첫 실행 온보딩. 문제: 두뇌 미설정 시 config 가 ~/.g1nation-brain(숨김 점폴더)로 조용히 폴백했다. - 폴더가 실제로 생성되지 않고, 설
- `src/memory/` (9) — Distillation Loop — stale Episodic Memory → Long-Term "episode-digest" 승급. 배경: Episodic Memory 가 무한히 누적되면 검색 노이즈. 30일+ 지
- `src/integrations/` (7) — Per-chat conversation history for the Telegram bot. Why this exists: the previous bot was stateless — every inbound mess
- `src/docs/` (6) — Bug: Edited agent.ts Edited agent.ts Edited agent.ts Edited agent.ts Edited agent.ts ...
- `src/integrations/` (6) — Per-chat conversation history for the Telegram bot. Why this exists: the previous bot was stateless — every inbound mess
- `src/lmstudio/` (4) — 4 files (.ts)
- `src/skills/` (4) — 4 files (.ts)
- `src/lmstudio/` (4) — [메모리·기동 개선] SDK 를 타입 전용으로만 import — 값 import 는 번들 로드(=확장 활성화) 시점에 SDK 모듈 초기화를 실행시킨다. 실제 모듈 로드는 getSdk() 첫 호출 때 require 로
**Key files**
- `src/utils.ts` (472 lines)
- `src/config.ts` (585 lines)
- `src/agent.ts` (1503 lines)
- `src/utils.ts` (538 lines)
- `src/config.ts` (727 lines)
- `src/agent.ts` (1979 lines)
- `src/core/services.ts` (218 lines)
- `src/features/company/types.ts` (446 lines) — Type definitions for the 1인 기업 (One-Person Company) mode. The mode turns the user into a virtual CEO that dispatches work to a roster of specialist agents. Each turn produces a session directory conta
- `src/core/services.ts` (176 lines)
- `src/sidebarProvider.ts` (3180 lines)
- `src/lib/contextManager.ts` (278 lines) — Context Manager (컨텍스트 한계 관리) "context length = 132k" 는 "답변을 132k 토큰까지 생성해도 된다" 가 아닙니다. 시스템 프롬프트 + 대화 기록 + 입력 문서 + 생성될 답변 + 여유분 ≤ context length 이 모듈은 요청을 보내기 전에 입력 토큰을 추정하고, - 동적으로 출력 상한(maxTokens)을 계
- `src/features/company/companyConfig.ts` (896 lines) — State + config plumbing for 1인 기업 모드. Two surfaces: - CompanyState (runtime data: enabled flag, company name, which agents are active, per-agent model overrides). Persisted in VS Code's globalState so
- `src/integrations/telegram/telegramClient.ts` (154 lines)
- `src/lib/paths.ts` (151 lines)
- `src/sidebarProvider.ts` (2992 lines)
- `src/agent/actions/types.ts` (41 lines)
- `src/skills/agentKnowledgeMap.ts` (374 lines)
- `src/features/datacollect/slashRouter.ts` (201 lines)
- `src/retrieval/types.ts` (66 lines) — Retrieval Types (검색 결과 통합 타입) 모든 검색 소스(Brain, Memory, Project, Episode)의 결과를 통합 인터페이스로 정의합니다.
- `src/memory/types.ts` (151 lines) — Memory Type Definitions (메모리 타입 정의) Astra의 5-Layer Cognitive Memory System의 모든 타입을 정의합니다. ① Short-Term ② Long-Term ③ Project ④ Procedural ⑤ Episodic
- `src/integrations/telegram/telegramClient.ts` (154 lines)
- `src/lib/contextManager.ts` (296 lines) — Context Manager (컨텍스트 한계 관리) "context length = 132k" 는 "답변을 132k 토큰까지 생성해도 된다" 가 아닙니다. 시스템 프롬프트 + 대화 기록 + 입력 문서 + 생성될 답변 + 여유분 ≤ context length 이 모듈은 요청을 보내기 전에 입력 토큰을 추정하고, - 동적으로 출력 상한(maxTokens)을 계
- `src/retrieval/brainIndex.ts` (645 lines) — Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 <brainPath>/.astra/brain-index.json 에
- `src/features/datacollect/slashRouter.ts` (211 lines)
- `src/retrieval/scoring.ts` (541 lines) — Scoring Engine — TF-IDF + Bilingual Tokenizer 단순 includes() 키워드 매칭을 넘어서, TF-IDF 가중치 기반의 문서 스코어링을 제공합니다. 한국어/영어 양국어 토크나이저를 포함합니다.
- `src/features/stocks/types.ts` (53 lines) — Stocks 모듈 공유 타입. investresults/targetstocks.json 스키마를 그대로 받아서, ConnectAI 의 <workspace>/.astra/stocks.json 으로 옮긴 뒤 같은 필드명을 유지. 한글 필드명은 사용자의 도메인 데이터라 변경하지 않는다 — 마이그레이션 충돌 회피 + 사용자가 직접 JSON 편집할 때 frictio
- `src/lib/contextBuilders/promptDetection.ts` (85 lines) — 사용자 prompt 의 의도 분류 류 detection helpers. 모두 stateless 정규식 매칭. 옛 코드는 agent.ts 의 private 메서드로 박혀 있었는데, system prompt 빌더 (buildJarvisProjectBriefContext 등) 가 이걸 의존하면서 god-file 안에서 서로 얽힘. 헬퍼만 먼저 떼면 의존 그래프가
- `src/retrieval/lessonHelpers.ts` (325 lines) — Lesson / Experience Memory — pure helpers (no vscode dependency) "Lesson" = a markdown file in the active brain that captures a past mistake/risk and how to avoid repeating it. Identified by a lessons
- `src/retrieval/brainIndex.ts` (536 lines) — Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 <brainPath>/.astra/brain-index.json 에
- `src/features/company/companyConfig.ts` (896 lines) — State + config plumbing for 1인 기업 모드. Two surfaces: - CompanyState (runtime data: enabled flag, company name, which agents are active, per-agent model overrides). Persisted in VS Code's globalState so
- `src/features/stocks/types.ts` (61 lines) — Stocks 모듈 공유 타입. investresults/targetstocks.json 스키마를 그대로 받아서, ConnectAI 의 <workspace>/.astra/stocks.json 으로 옮긴 뒤 같은 필드명을 유지. 한글 필드명은 사용자의 도메인 데이터라 변경하지 않는다 — 마이그레이션 충돌 회피 + 사용자가 직접 JSON 편집할 때 frictio
- `src/lib/paths.ts` (151 lines)
- `src/skills/agentKnowledgeMap.ts` (374 lines)
- `src/retrieval/types.ts` (66 lines) — Retrieval Types (검색 결과 통합 타입) 모든 검색 소스(Brain, Memory, Project, Episode)의 결과를 통합 인터페이스로 정의합니다.
- `src/intelligence/requirementGraph.ts` (312 lines) — Requirement Graph — 업무 유형별 필수 요소 정의 + 감지 + 커버리지 검사. Self-Evolving Digital Employee OS 마스터 플랜(docs/SELFEVOLVINGOSMASTERPLAN.md) Phase 1 / Track 2-1. 신뢰 조건 T3 "품질이 일관적이다 — 필수 요소 누락 없음" 담당. 동작 2단계: 1. In
- `src/security.ts` (159 lines)
- `src/features/secondBrainTrace.ts` (792 lines)
- `src/features/providers/types.ts` (63 lines) — Cloud LLM provider routing — model id prefix → provider id 매핑. Prefix 규칙: openrouter:anthropic/claude-3.5-sonnet → { provider: 'openrouter', model: 'anthropic/claude-3.5-sonnet' } anthropic:claude-3-5
- `src/integrations/telegram/telegramBot.ts` (270 lines)
- `src/lib/contextBuilders/localProjectIntent.ts` (233 lines)
- `src/lib/contextBuilders/promptDetection.ts` (107 lines) — 사용자 prompt 의 의도 분류 류 detection helpers. 모두 stateless 정규식 매칭. 옛 코드는 agent.ts 의 private 메서드로 박혀 있었는데, system prompt 빌더 (buildJarvisProjectBriefContext 등) 가 이걸 의존하면서 god-file 안에서 서로 얽힘. 헬퍼만 먼저 떼면 의존 그래프가
- `src/memory/types.ts` (151 lines) — Memory Type Definitions (메모리 타입 정의) Astra의 5-Layer Cognitive Memory System의 모든 타입을 정의합니다. ① Short-Term ② Long-Term ③ Project ④ Procedural ⑤ Episodic
- `src/extension/telegramCommands.ts` (103 lines)
- `src/lib/execUtil.ts` (104 lines)
- `src/retrieval/lessonHelpers.ts` (325 lines) — Lesson / Experience Memory — pure helpers (no vscode dependency) "Lesson" = a markdown file in the active brain that captures a past mistake/risk and how to avoid repeating it. Identified by a lessons
- `src/features/calendar/calendarCache.ts` (271 lines) — Google Calendar (iCal) 캐시 — fetch + parse + 회사 shared/calendarcache.md 에 저장. Connectorigin 의 googlecalendar.py 를 TypeScript / native fetch 로 옮김. OAuth 없음. 사용자가 Google Calendar 설정 → "비공개 주소(iCal 형식)" 복
### `media/` — 6 files, ~7,785 lines
### `media/` — 6 files, ~7,582 lines
**Key files**
- `media/sidebar.css` (2114 lines) — Stylesheet
- `media/sidebar.js` (3933 lines)
- `media/sidebar.html` (539 lines) — Astra
- `media/settings-panel.html` (440 lines) — Astra Settings
- `media/settings-panel.js` (505 lines)
- `media/sidebar.css` (1957 lines) — Stylesheet
- `media/sidebar.js` (3767 lines)
- `media/settings-panel.html` (541 lines) — Astra Settings
- `media/sidebar.html` (486 lines) — Astra
- `media/settings-panel.js` (577 lines)
- `media/settings-panel.css` (254 lines) — Stylesheet
### `tests/` — 37 files, ~5,875 lines
### `tests/` — 86 files, ~11,085 lines
*Depends on*: `src/`
**Sub-directories**
@@ -131,29 +132,29 @@ flowchart LR
**Key files**
- `tests/helpers/mockLLMClient.ts` (112 lines) — MockLLMClient — IAIService 의 Mock 구현체. 의도: 회사 모드 dispatcher / ChunkedWriter / ceoPlanner 등 LLM 을 호출하는 코드 경로를 CI 환경에서도 테스트 가능하게. 실제 Ollama / LM Studio 없이도 응답을 미리 정의하거나 동적으로 생성 가능. 사용 예: const ai = new
- `tests/agentEngine.test.ts` (413 lines) — AgentEngine Tests — Chunked Writer Architecture 예전 buildup(planner → researcher → reflector → writer → synthesizer)을 단일 ChunkedWriter 의 outline → section[N] → polish 로 교체한 뒤의 회귀 테스트. 다루는 범위: 1. ErrorC
- `tests/lmStudioLifecycle.test.ts` (326 lines) — Unit tests for ModelLifecycleManager. Strategy: inject mock ILMStudioClient and a simple in-memory IActivityTracker. No real LM Studio or SDK is touched — the manager file does not import the SDK dire
- `tests/lmStudioLifecycle.test.ts` (334 lines) — Unit tests for ModelLifecycleManager. Strategy: inject mock ILMStudioClient and a simple in-memory IActivityTracker. No real LM Studio or SDK is touched — the manager file does not import the SDK dire
- `tests/localPathPreflight.test.ts` (520 lines)
- `tests/telegramBot.test.ts` (363 lines) — Unit tests for TelegramBot + truncateForTelegram. Strategy: - TelegramBot is driven by an injected ITelegramClient stub. We script getUpdates to return queued batches and assert that: - the offset cur
- `tests/lmStudioStreamer.test.ts` (222 lines) — Unit tests for LMStudioStreamer. Strategy: inject a fake ILMStudioClient that returns a fake model handle whose respond() yields a controllable async iterable. No real SDK or WebSocket touched.
- `tests/criticReflectionEval.test.ts` (200 lines) — Critic Agent / Reflection Store / Task Eval Harness (Self-Evolving OS P1 잔여 + P3) 테스트.
- `tests/emailCommand.test.ts` (282 lines) — v2.2.269 — /email (Gmail + Outlook) 순수 로직 테스트. COM/네트워크는 통합 영역이라 제외 — 참조 파싱·프롬프트·트랜스크립트 컷만 고정.
- `tests/lmStudioStreamer.test.ts` (295 lines) — Unit tests for LMStudioStreamer. Strategy: inject a fake ILMStudioClient that returns a fake model handle whose respond() yields a controllable async iterable. No real SDK or WebSocket touched.
- `tests/meetRegistration.test.ts` (232 lines) — /meet 확신 게이트 — 분류·confirm 파싱·날짜 정규화 테스트. 정책: 확정+기한만 자동, 진행미정/기한미정/조건부는 보류, 반복은 첫 1회, 과거 날짜는 등록하되 완료확인 표기, 기한 해석 불가 확정건은 보류(추측 등록 금지).
- `tests/secondBrainTrace.test.ts` (407 lines)
- `tests/approvalQueue.test.ts` (164 lines) — Unit tests for ApprovalQueue. Strategy: drive enqueue → approve / reject / clear / pre-empt directly, confirm the onChange event fires at the right moments and callbacks fire exactly once.
- `tests/compositeScore.test.ts` (131 lines) — 멀티팩터 합성점수 (v2.2.266) — 백분위 랭크·축 합성·value trap 가드·결측 처리.
- `tests/computeBudgetedRequest.test.ts` (147 lines) — Phase 1 — context-window alignment. The budgeter must clamp to the model's ACTUALLY-loaded window when it's smaller than the user's contextLength setting, so a model loaded with a smaller window than
- `tests/confidenceEngine.test.ts` (175 lines) — Confidence Engine + Escalation Engine (Self-Evolving OS Phase 2) 단위 테스트. 순수 함수만 검증 — vscode 의존 없음.
- `tests/correctionLoop.test.ts` (158 lines) — Correction Loop 단위 테스트 — 순수 로직 (감지·프로필·레슨·큐 등록·영속화). LLM 의존 부분(classifyCorrection)은 엔드포인트 실패 → 휴리스틱 fallback 경로만 검증.
- `tests/emailState.test.ts` (121 lines) — v2.2.271 — 이메일 영속 상태 머신 (syncThreads / detectOverdue / setThreadState). "명령 안 쳐도 f/u 되는" 핵심 로직: 창 밖 미회신 보존, done 자동 재개, 알림 중복 차단.
- `tests/investigationPipeline.test.ts` (193 lines) — Investigation Pipeline — 파일명만 보고 상상하는 헛조사 차단 3중 방어. (v2.2.309) ① 조사형 요청 감지 + 증거 게이트 ② 강제 정독 Map + 해시 캐시 ③ Hollow 감지
- `tests/knowledgeOps.test.ts` (174 lines) — Knowledge Validation / Belief Revision / Decay / Debt (Self-Evolving OS Phase 4 — 지식 운영) 테스트.
- `tests/largeInputMapReduce.test.ts` (159 lines) — Phase 2 — large-input map-reduce core. Pure orchestration with an injected callLLM, so no network / SDK is touched.
- `tests/needEngineQueue.test.ts` (159 lines) — Gap Detector / Need Engine / Knowledge Inventory / Learning Queue (Self-Evolving OS Phase 3 — 성장 루프 코어) 테스트.
- `tests/projectScaffolder.test.ts` (135 lines) — Unit tests for FileSystemProjectScaffolder. Drives against a real temp directory so end-to-end file IO + path-traversal defenses are exercised.
- `tests/requirementGraph.test.ts` (146 lines) — Requirement Graph (Self-Evolving OS Phase 1 / Track 2-1) 단위 테스트. 순수 함수만 검증 — vscode 의존 없음.
- `tests/researchSkill.test.ts` (122 lines) — Research Agent / Skill Score / Success Pattern DB (Self-Evolving OS Phase 6) 테스트.
- `tests/resilience_stress.test.ts` (197 lines) — Resilience & Boundary Stress Test Suite (v2.77.3) 이 테스트는 ConnectAI 엔진이 극한의 환경(인증 실패, 네트워크 차단, 타임아웃 등)에서 얼마나 안정적으로 복구되고, 신뢰성 지표(Resilience Metrics)를 정확히 기록하는지 검증합니다.
- `tests/skillInjectionService.test.ts` (172 lines) — Unit tests for FileSystemSkillInjectionService. Strategy: drive the service against a real temp directory so path-traversal defenses and writeFileSync paths are exercised end-to-end. The service accep
- `tests/dataProcessor.test.ts` (87 lines) — / <reference types="jest" />
- `tests/findBrainFilesCache.test.ts` (80 lines) — Unit tests for findBrainFiles TTL cache.
- `tests/integration/mockLLMClient.test.ts` (86 lines) — MockLLMClient 자체의 sanity test. 이게 통과하면 dispatcher / ceoPlanner / ChunkedWriter 등 IAIService 를 받는 코드가 실제 LLM 없이 단위 / integration 테스트 가능. 향후 dispatcher 의 multi-stage flow 같은 큰 integration 테스트는 이 mock 을
- `tests/officeSchema.test.ts` (241 lines)
- `tests/paths.test.ts` (84 lines) — Unit tests for the centralized path resolver.
- `tests/systemSpecs.test.ts` (90 lines) — Unit tests for SystemSpecs + HeuristicModelMemoryEstimator. Strategy: - HeuristicModelMemoryEstimator is pure — directly drive it with model ids. - NodeSystemSpecsProvider depends on os. so we test: a
- `tests/transaction.test.ts` (68 lines) — / <reference types="jest" />
- `tests/vulnerability.test.ts` (60 lines) — / <reference types="jest" />
- `tests/brainIndex.test.ts` (107 lines)
- `tests/calendarApi.test.ts` (131 lines)
- `tests/contextManager.test.ts` (149 lines)
- `tests/icsParser.test.ts` (134 lines)
- `tests/lessonHelpers.test.ts` (191 lines)
- `tests/projectChronicle.test.ts` (199 lines)
- `tests/retrievalEvalEmbedding.test.ts` (106 lines) — 하이브리드(sparse+dense) 검색 측정 — 청크 TF-IDF vs 청크+임베딩 (alpha sweep). 평소 테스트 런에서는 skip (실제 두뇌 + 로컬 임베딩 서버 필요). 수동 실행: ASTRAEVALBRAIN="E:/Wiki/2nd/10Wiki/Topics" \ ASTRAEVALEMBEDMODEL="text-embedding-nomic-em
### `core_py/` — 6 files, ~409 lines
@@ -165,19 +166,23 @@ flowchart LR
- `core_py/optimizer.py` (55 lines)
- `core_py/queue_worker.py` (82 lines)
### `docs/` — 112 files, ~3,927 lines
### `docs/` — 177 files, ~5,946 lines
**Sub-directories**
- `docs/records/` (99) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고...
- `docs/records/` (160) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고...
- `docs/docs/` (5) — Bug: Viewed integrationretrieval.test.ts:1-59 integrationretrieval.test.ts를 통해 ...
- `docs/plans/` (2) — Alignment Self-Learning 개선 계획 (v2 — 적대적 리뷰 반영)
- `docs/Meeting/` (0)
**Key files**
- `docs/records/ConnectAI/timeline.md` (431 lines) — Project Timeline
- `docs/TELEGRAM_REMOTE_EXECUTION_PLAN.md` (452 lines) — Telegram Remote Execution 기획서
- `docs/AgentEngine_Architecture.md` (314 lines) — AgentEngine Architecture Document
- `docs/records/ConnectAI/timeline.md` (248 lines) — Project Timeline
- `docs/SELF_EVOLVING_OS_MASTER_PLAN.md` (275 lines) — ASTRA Self-Evolving Digital Employee OS — 마스터 개발 계획 v1.1
- `docs/ASTRA_OFFICE_REFACTOR.md` (198 lines) — Astra Office Refactor — Design Doc
- `docs/EXPERIENCE_MEMORY_PLAN.md` (122 lines) — Experience Memory (Mistake / Lesson Loop) — Implementation Plan
- `docs/plans/alignment-self-learning-plan.md` (194 lines) — Alignment Self-Learning 개선 계획 (v2 — 적대적 리뷰 반영)
- `docs/plans/web-fetch-and-mode-parity-plan.md` (102 lines) — 웹 접근 + 모드 동등성 수정 계획 (v2 — 적대적 리뷰 + 재검증 반영)
- `docs/records/ConnectAI/development/2026-05-02_connectai_project_knowledge_overview.md` (121 lines) — Astra Project Knowledge Overview
- `docs/records/ConnectAI/development/2026-05-03_connectai_project_knowledge_overview.md` (121 lines) — Astra Project Knowledge Overview
- `docs/Advanced_Features_Implementation_Guide.md` (40 lines) — Advanced Features Implementation Guide
@@ -195,17 +200,23 @@ flowchart LR
- `docs/records/ConnectAI/bugs/BUG-0006-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md` (16 lines) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...
- `docs/records/ConnectAI/bugs/BUG-0007-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md` (16 lines) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...
- `docs/records/ConnectAI/bugs/BUG-0008-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md` (16 lines) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...
- `docs/records/ConnectAI/bugs/BUG-0009-문제점을-읽고-어떻게-개선하는게-최선인지-분석해주면-좋겠어-알겠습니다-지금부터-connectai-프로젝트-에.md` (16 lines) — Bug: 문제점을 읽고 어떻게 개선하는게 최선인지 분석해주면 좋겠어. 알겠습니다. 지금부터 ConnectAI 프로젝트에만 완전히 집중하겠습니다. ...
- `docs/records/ConnectAI/bugs/BUG-0010-문제점을-읽고-어떻게-개선하는게-최선인지-분석해주면-좋겠어-알겠습니다-지금부터-connectai-프로젝트-에.md` (16 lines) — Bug: 문제점을 읽고 어떻게 개선하는게 최선인지 분석해주면 좋겠어. 알겠습니다. 지금부터 ConnectAI 프로젝트에만 완전히 집중하겠습니다. ...
- `docs/records/ConnectAI/bugs/BUG-0011-문제점을-읽고-어떻게-개선하는게-최선인지-분석해주면-좋겠어-알겠습니다-지금부터-connectai-프로젝트-에.md` (16 lines) — Bug: 문제점을 읽고 어떻게 개선하는게 최선인지 분석해주면 좋겠어. 알겠습니다. 지금부터 ConnectAI 프로젝트에만 완전히 집중하겠습니다. ...
## VS Code Extension Surface
- **Extension ID**: `g1nation.astra`
- **Activation events**: `onStartupFinished`
- **Commands** (31):
- **Commands** (39):
- `g1nation.newChat` — Astra: New Chat
- `g1nation.eval.retrieval` — Astra: 검색 평가 실행 (recall@k / MRR)
- `g1nation.eval.tasks` — Astra: 업무 평가 실행 (회의록 골든셋)
- `g1nation.growth.report` — Astra: 성장 리포트 (Reflection 추이)
- `g1nation.growth.standingRules` — Astra: 상시 행동 규칙 (Standing Rules)
- `g1nation.growth.learningQueue` — Astra: 학습 큐 갱신 (Need Engine)
- `g1nation.knowledge.decayAudit` — Astra: 지식 노후 점검 (Knowledge Decay)
- `g1nation.research.runQueue` — Astra: 학습 실행 (Research Agent — 승인된 큐 항목)
- `g1nation.growthCycle.runNow` — Astra: 주간 성장 사이클 지금 실행 (평가→학습큐→노후점검→승인분 실행)
- `g1nation.embeddings.backfill` — Astra: 두뇌 임베딩 전체 색인
- `g1nation.sleepDigest.runNow` — Astra: 지식 사전 소화 지금 실행 (Sleep-time Digest)
- `g1nation.conflictScan.runNow` — Astra: 지식 충돌 스캔 지금 실행 (신규 문서 ↔ 기존 지식)
- `g1nation.exportChat` — Astra: Export Chat as Markdown
- `g1nation.explainSelection` — Astra: Explain Selected Code
- `g1nation.focusChat` — Astra: Focus Chat Input
@@ -229,17 +240,21 @@ flowchart LR
- `g1nation.company.toggle` — Astra: Toggle 1인 기업 Mode
- `g1nation.company.manage` — Astra: Manage 1인 기업 Agents
- `g1nation.company.openSessions` — Astra: Open 1인 기업 Sessions Folder
- `g1nation.company.pixelOffice.open` — Astra: Open Pixel Office (Full Screen)
- `g1nation.calendar.connect` — Astra: Google Calendar (iCal) 연결 📅
- `g1nation.calendar.refresh` — Astra: Google Calendar 새로고침 📅
- `g1nation.calendar.connectOAuth` — Astra: Google Calendar OAuth 연결 (쓰기) 🔐
- `g1nation.devilAgent.toggle` — Astra: Toggle Devil Agent 🎭
- **Configuration** (129 settings):
- **Configuration** (183 settings):
- `g1nation.multiAgentEnabled` *(boolean)* _(default: `false`)_ — Enable Multi-Agent Workflow (Planner -> Researcher -> Writer) for complex tasks.
- `g1nation.datacollectBridgeTarget` *(string)* _(default: `"local"`)_
- `g1nation.datacollectBridgeUrl` *(string)* _(default: `"http://127.0.0.1:3002"`)_ — [local 타깃] Wiki/Datacollect MCP Bridge URL. /benchmark, /youtube, /wikify chat slash commands route here. The Bridge must be running (`npm run bridge` in the Datacollect project).
- `g1nation.datacollectBridgeNasUrl` *(string)* _(default: `""`)_
- `g1nation.datacollectBridgeTarget` *(string)* _(default: `"nas"`)_
- `g1nation.datacollectBridgeUrl` *(string)* _(default: `"http://127.0.0.1:3002"`)_ — [local 타깃] Wiki/Datacollect MCP Bridge URL. /benchmark, /youtube, /wikify chat slash commands route here. The Bridge must be running (`npm run bridge` in the Datacollect project). 백엔드를 NAS로 옮긴 경우 보통 사
- `g1nation.datacollectBridgeNasUrl` *(string)* _(default: `"https://dc.koritips.com"`)_
- `g1nation.datacollectBridgeNasToken` *(string)* _(default: `""`)_
- `g1nation.domainKnowledge.generalFolder` *(string)* _(default: `""`)_
- `g1nation.domainKnowledge.mathFolder` *(string)* _(default: `""`)_
- `g1nation.domainKnowledge.codingFolder` *(string)* _(default: `""`)_
- `g1nation.domainKnowledge.factsFolder` *(string)* _(default: `""`)_
- `g1nation.datacollectLocalProjectPath` *(string)* _(default: `""`)_
- `g1nation.datacollectSavePath` *(string)* _(default: `""`)_
- `g1nation.datacollectCrawlDepth` *(number)* _(default: `1`)_
- `g1nation.datacollectMaxPages` *(number)* _(default: `8`)_
@@ -247,6 +262,32 @@ flowchart LR
- `g1nation.chatTemperature` *(number)* _(default: `0.3`)_
- `g1nation.meetUsesTasks` *(boolean)* _(default: `true`)_
- `g1nation.meetUsesCalendar` *(boolean)* _(default: `false`)_
- `g1nation.meetVerifyPass` *(boolean)* _(default: `true`)_
- `g1nation.meetVerifyMaxRounds` *(number)* _(default: `2`)_
- `g1nation.meetEditorPass` *(boolean)* _(default: `true`)_
- `g1nation.meetTaskDateFallback` *(string)* _(default: `"today"`)_
- `g1nation.meetTaskDetailExpand` *(boolean)* _(default: `true`)_
- `g1nation.meetTeamRoster` *(string)* _(default: `""`)_
- `g1nation.meetMaxOutputTokens` *(number)* _(default: `8000`)_
- `g1nation.email.watcherEnabled` *(boolean)* _(default: `true`)_
- `g1nation.email.watchIntervalMinutes` *(number)* _(default: `60`)_
- `g1nation.email.overdueAlertHours` *(number)* _(default: `0`)_
- `g1nation.email.outlookEnabled` *(boolean)* _(default: `true`)_
- `g1nation.email.gmailEnabled` *(boolean)* _(default: `true`)_
- `g1nation.email.includeSubfolders` *(boolean)* _(default: `true`)_
- `g1nation.email.wikifySavePath` *(string)* _(default: `""`)_
- `g1nation.email.syncDays` *(number)* _(default: `7`)_
- `g1nation.messenger.stocksReportTimes` *(string)* _(default: `"09:00,15:00"`)_
- `g1nation.messenger.buySignalAlert` *(boolean)* _(default: `true`)_
- `g1nation.messenger.discoverTopFive` *(boolean)* _(default: `true`)_
- `g1nation.dailyBriefing.enabled` *(boolean)* _(default: `true`)_
- `g1nation.dailyBriefing.time` *(string)* _(default: `"09:30"`)_
- `g1nation.sleepDigest.enabled` *(boolean)* _(default: `true`)_
- `g1nation.sleepDigest.time` *(string)* _(default: `"03:00"`)_
- `g1nation.growthCycle.enabled` *(boolean)* _(default: `true`)_
- `g1nation.growthCycle.day` *(number)* _(default: `0`)_
- `g1nation.growthCycle.time` *(string)* _(default: `"20:00"`)_
- `g1nation.growthCycle.autoRunApproved` *(boolean)* _(default: `true`)_
- `g1nation.teamVoiceGuide` *(string)* _(default: `""`)_
- `g1nation.memoryEnabled` *(boolean)* _(default: `true`)_ — Enable layered memory injection before each model response.
- `g1nation.memoryShortTermMessages` *(number)* _(default: `8`)_ — Number of recent conversation messages included as short-term memory.
@@ -261,41 +302,10 @@ flowchart LR
- `g1nation.contextOverflowPolicy` *(string)* _(default: `"stopAtLimit"`)_ — Fallback behavior (LM Studio) if the prompt still exceeds the context window after Astra's own budgeting. 'stopAtLimit' fails clearly so you notice; 'truncateMiddle'/'rollingWindow' drop content silen
- `g1nation.autoCompactHistory` *(boolean)* _(default: `true`)_ — Automatically drop the oldest conversation messages from the request when the prompt would exceed the context budget (the on-screen chat history is unaffected). Default: true
- `g1nation.smallModelContextCap` *(number)* _(default: `0`)_ — Optional safety knob, OFF by default (0). Some very small models (≤3B) emit an empty/EOS response when given a prompt near their context window even though it nominally fits. If you observe that with
- `g1nation.autoContinueOnOutputLimit` *(boolean)* _(default: `true`)_ — When a reply is cut off because it hit the output-token limit, Astra continues it internally (compressed request — original question + the answer so far, not the whole context again) and shows one mer
- `g1nation.maxAutoContinuations` *(number)* _(default: `4`)_ — Maximum number of automatic continuation rounds per reply (prevents runaway loops). Raise it (e.g. 56) for long-form answers on slow local models; set 0 to disable auto-continuation. Default: 4
- `g1nation.finalOnlyRetryOnThoughtLeak` *(boolean)* _(default: `true`)_If the model emits only hidden reasoning (<think>, <|channel|>thought, "Thinking Process:" …) and no user-visible answer, Astra silently re-asks it for the final answer only. Hidden reasoning is never
- `g1nation.lmStudio.idleTimeoutMs` *(number)* _(default: `300000`)_ — Auto-eject the loaded LM Studio model after this many milliseconds of inactivity. Set to 0 to disable. Default: 300000 (5 minutes).
- `g1nation.lmStudio.autoLoadOnSelect` *(boolean)* _(default: `true`)_ — Automatically load LM Studio models into memory when selected from the Astra sidebar.
- `g1nation.lmStudio.sampling.topP` *(number)* _(default: `0.9`)_ — Nucleus sampling cutoff. Small / quantized models often spew wrong-neighbour tokens (한글 깨짐: 붕괴→붕점) when the tail is wide. Lower (0.80.9) tightens; 1.0 disables. Applied to both SDK and REST paths.
- `g1nation.lmStudio.sampling.topK` *(number)* _(default: `20`)_ — Top-K sampling cutoff. 0 disables. Default 20 — tighter for small models, raise to 4080 for large models that already sample well.
- `g1nation.lmStudio.sampling.minP` *(number)* _(default: `0.05`)_ — Min-P floor — discards tokens with probability below this fraction of the top token. Good defence against rare-token glitches. 0 disables.
- `g1nation.lmStudio.sampling.repeatPenalty` *(number)* _(default: `1.1`)_ — Repeat / frequency penalty to curb stutter (것입니다서입니다…). 1.0 disables. Values 1.051.2 are typical.
- `g1nation.lmStudio.statsInBudget` *(boolean)* _(default: `true`)_ — Show token/s and time-to-first-token from LM Studio prediction stats in the context-budget badge after each turn (SDK path only).
- `g1nation.lmStudio.draftModel` *(string)* _(default: `""`)_ — [Speculative decoding] LM Studio model key of a small draft model (e.g. 'gemma-2b-it') used to accelerate the main model. Empty disables. 1.53x throughput on large models. The draft must be downloade
- `g1nation.lmStudio.load.flashAttention` *(boolean)* _(default: `true`)_ — [Load option] Enable Flash Attention when loading models. Faster generation + lower memory on compatible hardware, especially helpful for long contexts. Default: true.
- `g1nation.lmStudio.load.gpuOffloadRatio` *(string)* _(default: `"max"`)_ — [Load option] How much of the model to offload to GPU. 'max' = all (default), 'off' = CPU only, or a number 01 (e.g. '0.5' = half). Numeric strings are parsed.
- `g1nation.lmStudio.load.offloadKVCacheToGpu` *(boolean)* _(default: `true`)_ — [Load option] Keep KV cache on GPU memory. Faster but requires VRAM headroom. Default: true.
- `g1nation.lmStudio.load.keepModelInMemory` *(boolean)* _(default: `true`)_ — [Load option] Prevent the model from being swapped out of system memory. Improves interactive responsiveness; raises RAM use. Default: true.
- `g1nation.lmStudio.load.useFp16ForKVCache` *(boolean)* _(default: `false`)_ — [Load option] Store KV cache in FP16 (halves cache memory). Tiny quality impact for most models — try if you run out of VRAM at long contexts. Default: false.
- `g1nation.lmStudio.load.evalBatchSize` *(number)* _(default: `0`)_ — [Load option] Token batch size during evaluation. 0 = engine default. Higher (5121024) improves prefill speed on GPU at the cost of memory.
- `g1nation.localBrainPath` *(string)* _(default: `""`)_ — Folder path for your local Second Brain knowledge base. Leave empty to use the default folder.
- `g1nation.brainProfiles` *(array)* _(default: `[]`)_ — Multiple brain profiles. Each item supports id, name, localBrainPath, secondBrainRepo, and description.
- `g1nation.activeBrainId` *(string)* _(default: `""`)_ — Active brain profile id used for the current chat context.
- `g1nation.secondBrainRepo` *(string)* _(default: `""`)_ — Optional GitHub repository URL used for Second Brain sync.
- `g1nation.autoPushBrain` *(boolean)* _(default: `false`)_ — Automatically commit and push Second Brain changes after updates.
- `g1nation.maxContextSize` *(number)* _(default: `32000`)_ — Maximum character count for active file context. Default: 32000
- `g1nation.maxAutoSteps` *(number)* _(default: `50`)_ — Maximum autonomous steps the agent can take per request. Default: 50
- `g1nation.dryRun` *(boolean)* _(default: `false`)_ — If enabled, the agent will ask for approval before committing any file changes.
- `g1nation.telegram.enabled` *(boolean)* _(default: `false`)_ — Enable the Telegram bot integration. When on, Astra polls a bot you configure and replies to incoming messages. Off by default — Astra remains 100% local until you opt in.
- `g1nation.telegram.allowedChatIds` *(array)* _(default: `[]`)_ — Optional allowlist of Telegram chat IDs that may message the bot. When empty, every chat that messages the bot is accepted (use with caution).
- `g1nation.telegram.defaultAgent` *(string)* _(default: `""`)_ — Agent name (matches an entry in the Agent ↔ Knowledge map) used to scope Second Brain retrieval for Telegram replies. Empty falls back to the map's defaultAgent, then to whole-brain search.
- `g1nation.telegram.agentByChatId` *(object)* _(default: `{}`)_ — Per-chat override of the Telegram agent. Keys are stringified chat IDs, values are agent names from the knowledge map. Overrides telegram.defaultAgent for the listed chats.
- `g1nation.telegram.contextChunks` *(number)* _(default: `6`)_ — How many Second Brain excerpts to inject into Telegram replies. Set 0 to disable RAG (plain prompt only).
- `g1nation.skillKnowledgeMapPath` *(string)* _(default: `""`)_ — Absolute path to the agent ↔ knowledge mapping JSON. When empty, defaults to '<workspace>/.astra/agent-knowledge-map.json'.
- `g1nation.skillKnowledgeMap` *(object)* _(default: `{}`)_ — Inline fallback for the agent ↔ knowledge mapping. Used only when the JSON file is missing. Shape: { defaultAgent?, agents: [{ name, knowledgeFolders, model?, description? }] }. Folder paths can be ab
- `g1nation.agentSkillsPath` *(string)* _(default: `""`)_ — Absolute path to the agent skills folder (`.agent/skills/*.md`). When empty, defaults to '<workspace>/.agent/skills'. Use this on Windows or when your skills live outside the workspace.
- `g1nation.embeddingModel` *(string)* _(default: `""`)_ — Embedding model registered in LM Studio / Ollama (e.g. 'text-embedding-bge-small-en-v1.5', 'nomic-embed-text', 'multilingual-e5-small'). When empty, Astra uses TF-IDF only. When set, the brain is embe
- _…and 69 more_
- `g1nation.largeInputMapReduce` *(boolean)* _(default: `true`)_ — When a single message is too large to fit the model's context window, split it into chunks, extract only the request-relevant facts from each (no hallucination/summary), integrate them, and answer fro
- `g1nation.mapReduceTriggerRatio` *(number)* _(default: `0.6`)_ — Map-reduce kicks in when a single message exceeds (effective context window × this ratio). Lower = engages sooner (safer for big inputs, more LLM calls). Default: 0.6
- `g1nation.mapReduceConcurrency` *(number)* _(default: `2`)_How many chunk extractions run in parallel. Keep low on a single local GPU (one model serves them sequentially anyway). Default: 2
- _…and 123 more_
## Dependencies
- **Runtime** (2): `@lmstudio/sdk`, `pdf-parse`
@@ -343,7 +353,7 @@ Astra는 대표님의 명시적인 승인 하에 로컬 시스템의 강력한
**Designed for High-Performance Decision Making.**
Copyright (C) **g1nation**. All rights reserved.
_Last auto-scan: 2026-06-09T02:20:50.409Z · signature `18ddda74`_
_Last auto-scan: 2026-07-20T04:20:03.384Z · signature `ff87bb88`_
<!-- ASTRA:AUTO-END -->
## Purpose
File diff suppressed because it is too large Load Diff
@@ -1,5 +1,5 @@
{
"result": "직답 결과 — single-pass mock 응답입니다.",
"createdAt": 1781085022765,
"createdAt": 1784521057661,
"modelVersion": "unknown"
}
@@ -1,5 +1,5 @@
{
"result": "---\nid: wiki_on\ndate: 2026-06-10T09:50:22.767Z\ntype: knowledge_artifact\nstandard: P-Reinforce v3.0\ntags: [automated, connect_ai, brain_sync]\n---\n\n## 📌 Brief Summary\n직답 결과 — single-pass mock 응답입니다.\n\n직답 결과 — single-pass mock 응답입니다.\n---\n## 🛡️ Reliability & Audit Summary\n> [!NOTE]\n> 이 문서는 ConnectAI의 **Intelligent Resilience** 엔진에 의해 검증 및 정제되었습니다.\n\n| Metric | Value | Status |\n| :--- | :--- | :--- |\n| **Conflict Risk** | `0/100` | ✅ Low |\n| **Fallbacks Used** | `0` | ✅ None |\n| **Auto Retries** | `0` | ✅ Stable |\n| **Deduplication** | `0` | Standard |\n| **Processing Time** | `0.0s` | ✅ Fast |\n\n### 🔍 Decision Audit Trail\n- **[DIRECT]** 답변 작성 중... (단일 호출 fast-path) (20ms)\n",
"createdAt": 1781085022767,
"result": "---\nid: wiki_on\ndate: 2026-07-20T04:17:37.663Z\ntype: knowledge_artifact\nstandard: P-Reinforce v3.0\ntags: [automated, connect_ai, brain_sync]\n---\n\n## 📌 Brief Summary\n직답 결과 — single-pass mock 응답입니다.\n\n직답 결과 — single-pass mock 응답입니다.\n---\n## 🛡️ Reliability & Audit Summary\n> [!NOTE]\n> 이 문서는 ConnectAI의 **Intelligent Resilience** 엔진에 의해 검증 및 정제되었습니다.\n\n| Metric | Value | Status |\n| :--- | :--- | :--- |\n| **Conflict Risk** | `0/100` | ✅ Low |\n| **Fallbacks Used** | `0` | ✅ None |\n| **Auto Retries** | `0` | ✅ Stable |\n| **Deduplication** | `0` | Standard |\n| **Processing Time** | `0.0s` | ✅ Fast |\n\n### 🔍 Decision Audit Trail\n- **[DIRECT]** 답변 작성 중... (단일 호출 fast-path) (18ms)\n",
"createdAt": 1784521057663,
"modelVersion": "unknown"
}
@@ -1,8 +1,8 @@
{
"missionId": "wiki_on",
"status": "completed",
"startTime": "2026-06-10T09:50:22.743Z",
"totalElapsedMs": 25,
"startTime": "2026-07-20T04:17:37.641Z",
"totalElapsedMs": 24,
"results": {
"direct": "직답 결과 — single-pass mock 응답입니다."
},
@@ -12,16 +12,16 @@
{
"from": "idle",
"to": "direct",
"durationMs": 20,
"durationMs": 18,
"message": "답변 작성 중... (단일 호출 fast-path)",
"ts": "2026-06-10T09:50:22.763Z"
"ts": "2026-07-20T04:17:37.659Z"
},
{
"from": "direct",
"to": "completed",
"durationMs": 5,
"message": "미션 완료",
"ts": "2026-06-10T09:50:22.768Z"
"ts": "2026-07-20T04:17:37.664Z"
}
],
"resilienceMetrics": {
@@ -1,5 +1,5 @@
{
"result": "Final report with inconsistencies. This should be long enough to pass validation.",
"createdAt": 1781085029846,
"createdAt": 1784521065426,
"modelVersion": "unknown"
}
@@ -1,5 +1,5 @@
{
"result": "Final report with inconsistencies. This should be long enough to pass validation.",
"createdAt": 1781085029845,
"createdAt": 1784521065425,
"modelVersion": "unknown"
}
@@ -1,5 +1,5 @@
{
"result": "[{\"heading\":\"본문\",\"scope\":\"전체 답변\"}]",
"createdAt": 1781085029841,
"createdAt": 1784521065420,
"modelVersion": "unknown"
}
@@ -1,5 +1,5 @@
{
"result": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.",
"createdAt": 1781085029843,
"createdAt": 1784521065423,
"modelVersion": "unknown"
}
@@ -1,8 +1,8 @@
{
"missionId": "stress_conflict_1781085029821",
"missionId": "stress_conflict_1784521065403",
"status": "completed",
"startTime": "2026-06-10T09:50:29.821Z",
"totalElapsedMs": 26,
"startTime": "2026-07-20T04:17:45.404Z",
"totalElapsedMs": 23,
"results": {
"outline": "[{\"heading\":\"본문\",\"scope\":\"전체 답변\"}]",
"section_0": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.",
@@ -14,30 +14,30 @@
{
"from": "idle",
"to": "outline",
"durationMs": 19,
"durationMs": 15,
"message": "답변 구조 잡는 중...",
"ts": "2026-06-10T09:50:29.840Z"
"ts": "2026-07-20T04:17:45.419Z"
},
{
"from": "outline",
"to": "section",
"durationMs": 2,
"durationMs": 3,
"message": "본문 작성 중...",
"ts": "2026-06-10T09:50:29.842Z"
"ts": "2026-07-20T04:17:45.422Z"
},
{
"from": "section",
"to": "polish",
"durationMs": 2,
"message": "최종 다듬기 중...",
"ts": "2026-06-10T09:50:29.844Z"
"ts": "2026-07-20T04:17:45.424Z"
},
{
"from": "polish",
"to": "completed",
"durationMs": 2,
"durationMs": 3,
"message": "미션 완료",
"ts": "2026-06-10T09:50:29.846Z"
"ts": "2026-07-20T04:17:45.427Z"
}
],
"resilienceMetrics": {
+242
View File
@@ -1,5 +1,247 @@
# Astra Patch Notes
## v2.2.312 (2026-07-20)
### 📋 보고 품질 — "## 4.부터 시작하는 보고서" 버그 + 일반론 총평 차단
실사례: "connectai 프로젝트를 분석하고 보고해줘" → 답변이 "## 4. 종합 분석 결과"부터 시작(1~3 증발), 내용은 프로젝트명을 바꿔도 성립하는 7줄 일반론.
- **중간 라운드 본문 표시 버그 수정 (근본 원인)**: 액션 루프에서 액션과 *함께* 본문 섹션을 쓴 라운드는 화면에 한 번도 표시되지 않고(라이브 스트리밍은 depth 0 전용) 최종 라운드만 append 됐다. 모델은 히스토리에서 자기 이전 섹션(1~3)을 보고 "## 4."부터 이어 써서 사용자에겐 4번부터 도착. 이제 중간 라운드의 가시 본문을 액션 태그만 걷어내고(신규 stripForDisplay.ts) 버블에 순서대로 표시한다.
- **분석 보고 업무 유형 신설 (requirementGraph)**: "분석하고 보고해줘/현황 보고/검토 보고"가 어떤 유형에도 안 걸리던 갭을 막음. 필수 요소: 보고 개요(첫 줄에 대상—근거—결론 자기선언), **파일 근거**(주장마다 실제 읽은 파일 인용, 일반론 금지), 구조·현황, 핵심 발견, 다음 단계. 유형 감지 시 "최대 3섹션" 일반 규칙보다 필수 요소 커버 우선 명시(보고서가 얕아지는 상충 제거).
- **근거 없는 분석 감지 (Hollow 의 반대 방향)**: 파일을 읽고도(read/investigate ≥1) 답변에 파일 인용이 2개 미만인 장문 분석이면 "근거 인용 없음" footer 로 경고 — 그럴듯한 총평이 검증된 분석처럼 통과하는 것을 차단.
검증: tsc 무오류 + jest 954 통과(신규 13: analysis-report 3 + ungrounded 5 + stripForDisplay 5) + esbuild 정상.
## v2.2.311 (2026-07-20)
### ⚡ 응답 지연 근본 개선 — KV 캐시 친화 프롬프트 + 제2뇌 상주 캐시
실측(usage.jsonl): 출력 22토큰 답변에 94.7초 — 지연의 90%+ 가 생성이 아니라 **매 턴 13k+ 토큰 전체 재프리필**이었다. 원인은 (a) 시스템 프롬프트 상단의 분 단위 시각이 llama.cpp prompt cache 를 첫 토큰부터 무효화, (b) 턴마다 바뀌는 RAG/동적 블록이 전부 message[0] 에 있어 히스토리 캐시까지 연쇄 무효화, (c) 32K 창에서 검색 결과에만 8k 토큰 예산, (d) continuation 마다 빈 쿼리로 재검색(3~8초), (e) 매 질의 6,500 파일 디렉터리 워크 + statSync.
- **KV 캐시 분리 (`kvCachePromptSplit`, 기본 ON)**: message[0] 을 불변 정적 본문(페르소나·규칙·환경)으로 고정하고, 날짜/RAG/[CONTEXT]/동적 블록 전부를 *마지막 user 메시지 직전*의 internal system 메시지로 이동. 프리픽스(정적 프롬프트+과거 히스토리)가 캐시에서 재사용되어 재프리필이 "직전 교환 + 동적 컨텍스트"로 줄어든다. [CONTEXT] truncation 도 tail 에 적용. 커스텀 systemPrompt 호출자(멀티에이전트 등)는 종전 경로 유지.
- **검색 토큰 예산 현실화 (`retrievalTokenBudget`, 0=자동)**: 자동값을 창의 25%(8k~80k) → 12%(2.5k~6k 클램프)로. 매 턴 재프리필되는 tail 을 직접 얇게 만든다.
- **continuation 은 depth-0 memoryCtx 재사용**: 액션 라운드마다의 재검색 제거 — 라운드당 3~8초 절감 + 빈 쿼리 재검색으로 청크가 갈리던 문제 제거 + 턴 내 프롬프트 안정화.
- **제2뇌 상주 캐시 (신규 brainWatch.ts)**: 브레인 루트에 재귀 fs.watch 를 걸고 세대 카운터로 무효화 — 변경 없으면 디렉터리 워크와 파일별 statSync(수천 회)를 통째로 생략하고 메모리의 파일 목록·토큰 인덱스를 신뢰한다. "제2뇌를 항상 메모리에" 아이디어의 안전한 구현: 원본 대신 검색 파생물을 상주시키고 워처가 정합성을 맡는다. 수정 직후 3초 창은 신뢰 명부에서 제외(이벤트 지연 레이스 가드), 워처 불가 환경은 자동으로 종전(매번 stat) 폴백. 활성화 시 백그라운드 워밍으로 첫 질의의 인덱스 파싱 비용도 선불 처리, 유휴 해제 30분→2시간.
- 기대 효과: 동일 세션 반복 턴의 프리필이 13k → 수백~2k 토큰 수준. LM Studio 쪽 GPU 오프로드/Flash Attention 설정과 병행 권장.
검증: tsc 무오류 + jest 941 통과(신규 15: split 6 + brainCache 4 + promptSplit 5) + esbuild 정상.
## v2.2.307 (2026-07-11)
### 🏗️ /benchmark 레이아웃 골격 분석 + 합성 안정화
koritips 실측 피드백 반영: ① 합성이 파트 2 에서 타임아웃("This operation was aborted")으로 죽으면서 105초 걸린 파트 1까지 폐기 ② 남은 원시 요약이 색·폰트뿐이라 "배너가 롤링인지, 각 페이지가 어떤 블록 순서인지" 알 길이 없었음.
- **레이아웃 골격 섹션 (신규 layoutSkeleton.ts — LLM 미개입)**: 스캔의 sectionRoles(태그+class/id 힌트+미리보기)에서 페이지별 위→아래 블록 구성을 결정론으로 그린다. class 신호(swiper/slick/carousel…→롤링 배너, hero/banner→정적 배너, grid/card→카드 그리드 등 12종 레지스트리)로 위젯을 판별하고 **"롤링 배너/캐러셀: 있음/신호 없음"에 즉답**. 신호가 없으면 지어내지 않고 "실사이트 확인 권장" 표기. 합성 성공/실패와 무관하게 보고서에 항상 포함 — LLM 이 죽어도 골격 분석은 남는다.
- **파트별 실패 격리**: 한 파트가 실패해도 완성된 파트를 버리지 않고 실패 표시 후 계속 진행. 전 파트 실패 시에만 원시 요약 폴백.
- **합성 타임아웃 120→300초**: 입력 JSON 이 큰 파트(IA·토큰)는 e4b 급 모델에서 120초를 넘긴다 — LmOpts.timeoutMs 신설, 벤치마크 합성에 300초 지정 (다른 호출자 기본 120초 유지).
- **파트 1 프롬프트 강화**: §2-1 페이지 골격 위→아래 서술 + 배너 롤링/정적 판정 의무화(신호 없으면 명시), §4-1 시각적 톤앤매너 한 문단(수치→성격 규정) 신설.
검증: tsc 무오류 + jest 888 통과(layoutSkeleton 9개 신규) + esbuild 정상.
## v2.2.306 (2026-07-11)
### 🗣️ AI 상투어 제거 — Tone Guard (금지 표현 레지스트리)
잡담 턴에서 "힘든 감정을 느끼고 계시군요. 괜찮으시다면 … 저는 언제든 여기에 있습니다." 같은 상담사 화법이 그대로 나오던 문제(실사례) 해결. 작업 턴에는 문체 규칙이 있었지만 casual 모드는 무방비였다.
- **AI_CLICHE_PATTERNS 레지스트리 (신규 toneGuard.ts)**: "~하시군요" 감정 미러링 / "괜찮으시다면 ~해 드릴 수 있습니다" 허락 구걸 / "저는 언제든 여기에 있습니다" 대기 선언 / "함께 ~해 보아요" / "물론입니다!" / "도움이 되었기를 바랍니다" / 감정 정당화 공식 등 8종을 단일 배열로 관리 — 새 클리셰 발견 시 한 곳만 추가 (블로그_v3 QA 레지스트리 철학).
- **구체적 금지 목록 + 대조 예시**로 주입: 소형 모델은 "자연스럽게 해" 같은 추상 지시보다 실사례 나쁜 답 vs 좋은 답 대조에 훨씬 잘 반응한다. "동료의 담백한 존댓말, 감정엔 상담사 공식이 아니라 사람의 짧은 반응, 오버해서 친한 척 금지" 방향 명시.
- **주입 위치 2곳**: casual 모드 블록(이번 사고 지점) + 기본 페르소나(작업 턴 포함 전 턴).
검증: tsc 무오류 + jest 879 통과(toneGuard 4개 신규) + esbuild 정상.
## v2.2.305 (2026-07-11)
### 🤝 Claude 구독을 Astra 엔진으로 — `claude:` 프로바이더 (Claude Code CLI 위임)
"Astra 가 쓰는 모델을 로컬 LLM 에서 Claude 로 바꿀 수 있게" 요청 구현. Anthropic 구독(Pro/Max)은 API 키가 아니라 Claude Code 로그인 방식이므로, 로그인된 로컬 CLI 를 추론 엔진으로 위임하는 4번째 클라우드 프로바이더를 추가 — **API 키·추가 과금 없이 구독 한도로 동작**.
- **모델 드롭다운에 자동 노출**: Claude Code CLI 가 설치돼 있으면 "Claude 구독 · sonnet/opus/haiku" 3종이 모델 목록에 나타난다 — 선택만 하면 채팅 두뇌가 Claude 로 전환. 기존 `anthropic:`(API 키·종량제) 프로바이더와 별개.
- **통합 방식**: 기존 클라우드 라우팅(`parseModelPrefix`)에 `claude:` 프리픽스 추가, CLI 의 stream-json 출력을 OpenAI 호환 SSE 로 변환해 기존 파서가 그대로 소비. 프롬프트는 ARG_MAX 회피를 위해 stdin 전달, 시스템 프롬프트·대화 이력은 구조화 평탄화. makeModelId 가 프리픽스 테이블을 따르도록 수정(id≠prefix 첫 사례).
- **coreChat 도 지원**: defaultModel 이 `claude:...` 면 멀티에이전트 워크플로우·Report QA·시맨틱 리랭크 등 내부 LLM 호출 전부가 구독 모델로 동작.
- **실패는 명확하게**: CLI 미설치/미로그인 시 설치(`npm i -g @anthropic-ai/claude-code`)·로그인 안내를 에러로 표시 (조용한 폴백 금지). CLI 경로 자동 탐지(+`g1nation.claude.cliPath` 수동 지정).
- 참고: /claude 명령(v2.2.303)은 "개발 작업 위임"용 터미널 실행이고, 이번 것은 "채팅 엔진 전환"— 용도가 다른 두 연동이다.
검증: tsc 무오류 + jest 875 통과(claudeCodeProvider 12개 신규) + esbuild 정상.
## v2.2.304 (2026-07-11)
### 🧳 지식 환경 이식성 — "새 컴퓨터에서 바꿀 경로는 두뇌 위치 1개"
지식(Wiki)이 Astra 소스 폴더 밖에 있는 구조는 유지(의도적 — Wiki 는 자체 git 데이터 저장소, Astra 는 vsix 설치)하되, 설정에 흩어진 절대 경로 5곳을 두뇌-상대 경로로 수렴시켜 컴퓨터 이동 시 `brainProfiles.localBrainPath` 하나만 바꾸면 되게 정리.
- **datacollectSavePath 상대 경로 지원**: pickWikiDir 가 비-절대 경로 설정을 활성 두뇌 루트 기준으로 해석 (`../../Premium/자료` 처럼 두뇌 밖 형제 폴더도 지정 가능). 기존엔 상대 경로를 조용히 무시하고 기본 폴더로 폴백했음.
- **사용자 설정 전환**: domainKnowledge 4개 키를 두뇌-상대(`Domain_Programming`/`Domain_General`/`_Common`/`_Common/Math`)로, datacollectSavePath 를 `../../Premium/Thinking & Reasoning` 으로 변경 (백업: settings.json.bak-portability). 도메인 스코프 해석기는 원래 상대 경로 지원 + 두뇌 밖 탈출 차단이 있어 코드 변경 불필요.
- **이사 체크리스트 문서**: Wiki 루트에 `컴퓨터_이사_체크리스트.md` 생성 — 새 컴퓨터에서 클론→vsix 설치→경로 1개 변경→NAS 토큰 입력 순서와 설계 이유 기록.
검증: tsc 무오류 + jest 864 통과(wikiSave 상대 경로 3개 신규) + esbuild 정상.
## v2.2.303 (2026-07-11)
### 🔗 벤치마킹→클라우드 개발 파이프라인 — handoff 모드 + /claude (Claude Code 위임)
"로컬 모델은 분석·명세까지, 실제 개발은 클라우드 모델로" 역할 분담 완성. 로컬 4b 모델의 요약 병목 없이 측정치를 그대로 클라우드에 전달한다.
- **`/benchmark <url> handoff` (신규)**: 스캔이 측정한 원시 값(rgb·px·폰트·카피 원문·페이지 인벤토리·원시 JSON 부록)을 **LLM 호출 0회**로 결정론 조립한 개발 인수인계 문서를 생성·저장. 소형 모델이 지시문을 작문하면 측정치가 "적절한 색상" 같은 모호어로 퇴화하는 문제를 원천 차단 — 클라우드 모델은 원시 구조화 데이터를 가장 잘 소화한다. 문서 구성: ⓪클라우드 모델용 지시문(측정치 그대로 사용·임의 대체 금지·모르면 질문) ①내 요구사항 슬롯(변형 지시 입력란 또는 체크리스트) ②디자인 토큰 ③마이크로카피 원문 ④IA 표 ⑤원시 JSON.
- **`/claude <지시>` (신규)**: 로컬에 설치·로그인된 Claude Code CLI 를 통합 터미널("Claude Code (Astra)")에서 실행 — **Anthropic 구독(Pro/Max) 인증을 그대로 위임** (API 키·추가 과금 없음). cwd=워크스페이스, 권한 승인은 터미널에서 사용자가 직접. 셸 안전 인자 정규화(따옴표·$·백틱 무해화). CLI 미설치 시 설치 안내 출력.
- **파이프라인 연결**: handoff 저장 완료 시 "다음 단계" 로 `/claude <저장경로> 파일을 읽고 명세대로 개발해줘` 명령을 제안 — 아스트라(무료 분석) → 핸드오프 문서 → Claude Code(구독 개발) 흐름이 명령 두 개로 이어진다.
검증: tsc 무오류 + jest 861 통과(handoffDoc·claudeCommand 10개 신규) + esbuild 정상.
## v2.2.302 (2026-07-11)
### 📊 /benchmark 강화 — 비즈니스 렌즈 + 스텝별 빌드 프롬프트 (벤치마킹→개발 틀)
"사이트 주소를 주면 구조·기능·서비스 아이디어·운영 방향성까지 제시하고, 매우 유사하게 만들 수 있게" 요청 구현. 기존 /benchmark 는 디자인 복원 시방서(4-렌즈+IA+재구축 명세)까지만 — 1인 AI 기업 벤치마킹의 핵심인 사업 분석이 없었다.
- **파트 4 — 비즈니스 벤치마킹 렌즈 (신규, 기본 포함)**: §10 서비스 정의·포지셔닝(헤드라인 공식 분석 — "Fire your X" 류) / §11 가격·수익 구조(티어 추출→AI 원가 시나리오 표: 상용 API vs 셀프호스팅→손익분기 부등식→수수료 반영 마진 시뮬레이션) / §12 기능 인벤토리·사용자 여정·백엔드 요구·**2~3일 MVP 컷** / §13 운영·방향성(시리즈화 3안·광고비 0원 채널·검증 지표·"접을 기준"). §13 에서만 사용자 보조 컨텍스트를 결합한 변형 제안 허용 — part 3 의 원본 복원 순수성은 그대로.
- **파트 5 — 스텝별 빌드 프롬프트 (build 모드)**: 스캔에서 추출한 실제 디자인 토큰·카피 원문을 박아 넣은 자기완결적 프롬프트 4개(STEP 1 랜딩 → 2 도구 UI → 3 API 연동 → 4 결제/대기명단)를 생성 — 바이브코딩 IDE 에 순서대로 붙여넣으면 유사 서비스가 완성되는 "프롬프트 교재" 형태.
- **모드**: `/benchmark <url> [mode]``full`(기본, 1~4) / `design`(기존 3파트) / `biz`(사업 분석만, 빠름) / `build`(1~5 풀코스). bare 키워드·`mode=` 표기 모두 인식. 가격 분석 목적이면 `depth=2` 권장 안내 추가.
- **품질 보증**: 비즈니스 렌즈(파트 4)는 날조 위험(임의 가격·매출)이 가장 큰 파트라 v2.2.301 의 Report QA 루프(채점→피드백 재작성→회귀 게이트)를 통과 — 재작성 호출에 스캔 JSON 이 포함된 합성 프롬프트를 근거로 전달해 근거 없는 수정 방지. 스캔에 가격이 없으면 "스캔 데이터 부족" 표기 강제(임의 추정 금지).
- 스캔 자체 강화(pricing 페이지 우선 크롤·가격 정규식·기술스택 신호)는 Datacollector Bridge 수정이 필요해 별도 단계로 보류.
검증: tsc 무오류 + jest 851 통과(benchmarkModes 9개 신규) + esbuild 정상.
## v2.2.301 (2026-07-11)
### 🎯 문맥·의도 이해 + 조사 보고서 품질 루프 (블로그_v3 방식 이식)
"문자 그대로만 답하지 말고 왜 묻는지를 이해하고 답하라" + "조사 답변은 블로그_v3 수준의 완성도로" 요청 구현. 블로그_v3 파이프라인의 검증 설계(실측치 주입·QA 규칙 레지스트리·회귀 게이트)를 보고서 도메인으로 개념 이식 (raw 복사 아님).
- **[답변 전 이해 원칙] (모든 실질 질문 턴, LLM 호출 0회)**: dynamicBlocks 행동 제약에 "문자 그대로 읽지 말고 대화 흐름과 함께 해석 → 왜 묻는지(목적)·진짜 궁금증·답의 용도를 먼저 판단 → 첫 문장은 그 목적에 답하는 결론" 지시를 상시 주입. truncation 보호 구역이라 컨텍스트 압박에서도 살아남는다.
- **[의도 브리핑] (워크플로우 선두, LLM 1회)**: 조사·복합 요청이 멀티에이전트 워크플로우에 들어오면 최근 대화 요지와 함께 질문을 분석해 {추정 목적 / 진짜 궁금증 1~3개 / 답의 용도} JSON 브리핑을 생성, outline→section→polish 전 단계 컨텍스트에 주입. "이 브리핑에 답하는 것이 성공 기준"으로 명시.
- **[Report QA Loop] (신규 src/agents/reportQa.ts)**: 조사성 요청(조사/리서치/보고서/레포트 등)의 최종 보고서를 ①결정적 실측치(본문 글자 수·소제목 수·출처 인용 흔적·나열 비율 — 코드 측정, 모델 눈대중 금지) 주입 ②REPORT_QA_RULES 레지스트리 12항(결론 선행·의도 부합·근거 명시·임의 수치 금지 등 critical 7항) 기준 JSON 채점 ③임계(기본 80) 미달 시 피드백 재주입 재작성(기본 최대 2회) ④**회귀 게이트** — 재작성본 점수가 떨어지면 폐기하고 최고점 초안 유지 (블로그_v3의 85→79 편집 회귀 사고 방지 장치 이식). 채점 실패는 로그로 드러내고 현재 최고 초안 반환 (조용한 폴백 금지).
- **라우팅 보강**: 명시적 조사·보고서 키워드는 chunkedSwitchTokens 절대 게이트보다 우선 발동 — 짧은 "X 조사해줘"도 파이프라인을 탄다 ('요약/리뷰' 류 일반 키워드는 기존 결정대로 게이트 아래 유지).
- 설정: `reportQaEnabled`(기본 ON) / `reportQaThreshold`(80) / `reportQaMaxRevisions`(2). 진행 상황은 사이드바 stage 인디케이터(⓪ 의도 분석 → ①②③ → ④ 품질 검증)로 표시.
검증: tsc 무오류 + jest 842 통과(reportQa 13개 신규) + esbuild 정상.
## v2.2.300 (2026-07-11)
### 🧹 채팅 화면 정리 — 생각 텍스트 실시간 차단 + 확신도 footer 기본 숨김
답변을 기다리는 동안 모델의 내부 추론(`<|channel|>thought …`, `<think>…`)이 화면에 그대로 흐르다가 완료 시에야 사라지던 문제, 그리고 인사말에까지 "확신도 40/100 · 사람 확인 필요" footer 가 붙던 노이즈를 정리.
- **LiveReasoningFilter (신규)**: 라이브 스트리밍(liveStreamTokens=true, 기본)에서 추론 구간을 *토큰 단위로* 걸러 화면에 아예 흐르지 않게 차단. 답변 본문은 기존처럼 실시간 표시 (TTFT 체감 유지). 마커가 토큰 두 개에 걸쳐 쪼개져 와도(`<th`+`ink>`) 잡는 보류(holdback) 상태 기계. Harmony 채널(thought/analysis/commentary/reasoning 숨김, final 통과)·`<think>`/`<thinking>`/`<analysis>` 지원. 놓친 마커는 완료 시 streamReplace 가 정리하는 이중 방어는 그대로. 본 스트림(agent)과 자동 이어쓰기 라운드(streamChatOnce) 모두 적용.
- **확신도·검토요청 footer 기본 비표시**: `confidenceEngineEnabled`/`escalationEnabled` 기본값 true→false (보고 싶으면 설정에서 opt-in). 점수 *계산* 과 Reflection 성장 기록(reflections.jsonl·Success Pattern DB)은 표시 여부와 무관하게 그대로 수행 — 성장 추이의 원천은 화면이 아니라 기록이므로.
- liveStreamTokens 관련 주석·설정 설명이 실제 기본값(true)과 어긋나 있던 것 정정.
검증: tsc 무오류 + jest 829 통과(LiveReasoningFilter 단위 11개 신규) + esbuild 정상.
## v2.2.299 (2026-07-11)
### 🧩 아키텍처 수렴 — "코어를 우회하는 딴살림" 청산 (감사 후속)
전체 설계 감사에서 확인된 코어 우회 지점들을 단일 구현으로 수렴. 동작 변화가 목적이 아니라, 앞으로의 수정이 한 곳만 고치면 전체에 반영되는 구조를 만드는 리팩토링.
- **LLM 호출 수렴 → `coreChat`(core/services)**: 자체 fetch + 엔진 휴리스틱(`:11434` 판별)을 각자 들고 있던 4곳 — agents/factory(BaseAgent.callLLM), intelligence/llmCall(simpleChatCompletion), retrieval/semanticRerank, agent/postHocSelfCheck — 을 전부 AIService.chat 경유로 교체. 엔진 자동 폴백(lmstudio↔ollama)·타임아웃·로깅이 이제 이들에게도 동일 적용. 이를 위해 AIChatRequest 에 `temperature/maxTokens/numCtx` 옵션 추가(엔진별 payload 매핑). **의도적 예외**: features/datacollect/llm(finish_reason 이어쓰기·repeat_penalty 등 장문 생성 엔진 요구)은 유지하고 파일에 예외 사유를 명문화.
- **기업 모드 검색 승격**: 사이드바 기업 모드가 경량 검색(scopedBrainRetriever)만 쓰던 드리프트 해소 — RetrievalOrchestrator 전체 경로(임베딩 하이브리드·청크)를 쓰는 `retrieveBrainChunksScoped`/`retrieveBrainBlockForCompany` 를 신설하고 DispatcherDeps thunk 로 주입. 텔레그램 등 에이전트 없는 경로는 기존 경량 검색 폴백 유지.
- **프로세스 실행 수렴 → `lib/execUtil`**: execFile/exec Promise 래퍼 6곳·Python 인터프리터 탐지 3벌을 단일 모듈로 — calculate/runCode(캡처 실행), health/bridgeLauncher(셸 실행), selfReflector(동기 탐지 공유), datacollectSetup(후보 순서 공유). OS별 후보 순서·타임아웃·캐시가 이제 한 벌.
- **KST 스케줄 수렴 → `lib/kstSchedule`**: stocksWatcher·dailyBriefing·sleepDigest·growthCycleWatcher 가 각자 복제한 nowInKst()/HH:MM 파싱을 단일화 (발사 정책 — 복수 시각/평일만/매일/주간 — 은 각 워처 고유이므로 유지).
- **토큰 추정 통합**: retrieval/contextBudget 의 자체 estimateTokens(한글만 인식)를 lib/contextManager 구현(CJK 전반·보수적 계수)으로 통일.
- **설정 접근 규칙 명문화**: config.ts getConfig 에 "코어 계약 값은 getConfig 경유, 기능 전용 키는 직접 접근 허용, 둘 이상이 읽으면 승격" 기준을 주석으로 박제.
검증: tsc 무오류 + jest 818 통과 + esbuild 정상.
## v2.2.298 (2026-07-11)
### 🧭 단계별 지식 폴더 — 지식 재편(멀티 에이전트 체계) 정합 + 조용한 폴백 제거
2026-07-11 두뇌 재편(_Common + Domain_*)에 맞춰 단계별 지식 스코프를 정합화.
- **설정 UI 문구·placeholder 갱신**: 새 분류 체계 경로(`_Common`/`_Common/Math`/`Domain_Programming`/`Domain_General`) 예시로 교체, 에이전트 매핑 우선순위·절대경로 허용 설명 추가. package.json 설정 설명도 동일 갱신.
- **[조용한 폴백 금지] Specialty 폴더 부재 시 로그**: 설정된 폴더가 존재하지 않으면(예: 재편 후 옛 경로) 조용히 전체 두뇌로 넘어가지 않고 출력 로그에 도메인·경로를 명시 — 이번에 실제로 사용자 설정이 옛 경로(Topic_Programming 등)를 가리켜 기능이 무력화돼 있던 것을 발견한 계기.
- 로직 체인 재검증: 에이전트 스코프 우선 → 도메인 스코프 → 전체 폴백, Grounding rescue, 도구 라우팅 힌트 모두 정상.
검증: jest 818 통과 + esbuild 정상.
## v2.2.297 (2026-07-05)
### ☁️ stocks 목록 클라우드 백업 — 컴퓨터 바꿔도 워치리스트 유지
stocks.json 이 로컬 워크스페이스에만 있어 기기를 바꾸면 목록이 사라지던 문제 해결. 기존 Sheet1~3 sync 는 분류 표시용이라 복원이 불가능했다.
- **자동 백업**: 목록이 바뀔 때마다(add/remove/check/discover 자동편입/워처 가격갱신 — writeStocksStore 성공 시 리스너 발화) 30초 디바운스 후 기존 spreadsheet(`g1nation.stocks.spreadsheetId`)의 `_backup` 탭에 **원본 JSON 그대로** 백업. 탭은 없으면 자동 생성(batchUpdate addSheet), 목록이 줄어도 잔여 행이 안 남게 클리어 후 덮어쓰기. `g1nation.stocks.autoBackup`(기본 ON)으로 끄기 가능.
- **`/stocks backup`**: 수동 즉시 백업. **`/stocks restore`**: 새 컴퓨터에서 한 번으로 복원(로컬 목록 교체, silent write 로 되백업 루프 차단, 손상 행은 skip).
- sheetsApi 에 `ensureSheetTab`(탭 존재 확인+생성) / `clearSheetRange`(values:clear) 추가 — OAuth·인프라는 기존 calendar/sheets 공유 그대로.
검증: tsc 무오류 + jest 818 통과 + esbuild 정상.
## v2.2.296 (2026-07-05)
### 🧠 소형 모델 추론 강화 2탄 — 코딩 실행 루프 + 도구 라우팅 + 근거 재검색
로드맵 2·3·4번 완결. 1탄(calculate·지식 스코프)과 합쳐 "모델은 판단만, 계산·실행·기억은 바깥에서" 아키텍처가 완성됐다.
- **[ACTION 17] `<run_code>` 실행 확인**: 워크스페이스 안의 .py/.js/.mjs/.cjs 파일을 인터프리터로 직접 실행하고 stdout/stderr/종료코드를 대화 컨텍스트로 재주입. run_command 와 달리 출력이 회수되므로 "생성→실행→에러 확인→수정" 루프가 모델 주도로 성립. 샌드박스(validatePath)·15초 타임아웃·회당 2회·출력 4천자 상한.
- **문법 오류 자가수정 루프**: Self-Reflector Phase C(실행 검증)의 문법 오류를 보고로 끝내지 않고 internal system 메시지로 재주입 → 자동 후속 턴에서 모델이 <edit_file> 로 즉시 수정 → 다음 라운드 재검증 (maxAutoSteps 한도로 무한 루프 차단). ※ `selfReflector.executionVerification` 설정이 켜져 있어야 동작.
- **도구 라우팅 힌트**: 도메인 분류(1탄의 휴리스틱) 결과가 그 턴의 행동을 직접 지시 — 수학→<calculate> 위임, 코딩→<run_code> 실행 확인, 팩트→근거 없으면 '확인 불가'/<fetch_url>. dynamicBlocks 보호 구역에 주입되어 컨텍스트 truncation 에서도 살아남는다. 분류 1회로 지식 스코프+도구 유도 동시 결정.
- **근거 재검색 확장**: 기존 Grounding rescue(근거 약함 → 전체 두뇌 재검색)가 에이전트 스코프에만 적용되던 것을 도메인 지식 스코프에도 확장 — Specialty 폴더가 정답 문서를 가리는 경우 같은 방식으로 구제.
검증: tsc 무오류 + jest 818 통과(신규 runCode 7개 + 라우팅 힌트 4개) + esbuild 정상.
## v2.2.295 (2026-07-05)
### 🧠 소형 모델 추론 강화 1탄 — <calculate> 계산 위임 + 단계별 지식 스코프
"작은 모델은 판단만, 계산·기억은 바깥에서" 전략의 첫 구현. 모델은 그대로 두고 외부 레이어만 강화한다.
- **[ACTION 16] `<calculate>` 계산 위임**: 수치·수학 계산을 모델이 암산하지 않고 Python(`-I` isolated, 10초 타임아웃)에 위임. stdout/stderr 이 internal system 메시지로 재주입되어 자동 후속 턴에서 모델이 결과를 해석하고, 에러 시 코드를 고쳐 재시도하는 자가수정 루프가 성립(read_file 과 동일한 재주입 메커니즘). 시스템 프롬프트에 '암산 금지' 규칙 추가. 회당 4회·출력 4천자 상한.
- **단계별 지식 스코프 (General + Specialty)**: 질문을 수학/코딩/팩트로 분류(LLM 호출 없는 결정적 휴리스틱 — 지연·비용 0)해, 해당 도메인의 Specialty 폴더 + 공통 General 폴더로 RAG 검색 범위를 축소. 4b 모델 컨텍스트에서 무관 청크를 배제하는 정밀도 최적화.
- 설정 패널 '지식·기억' 탭에 단계별 폴더 4개(General/수학/코딩/팩트) UI 추가 (`g1nation.domainKnowledge.*`, 두뇌 상대 경로).
- 안전 규칙: 분류 실패·Specialty 미설정 시 기존 전체 두뇌 검색으로 폴백(opt-in), 에이전트별 지식 매핑(agentKnowledgeMap)이 있으면 그쪽 우선(기존 제한을 느슨하게 만들지 않음), 두뇌 밖 경로(../) 차단.
- 기존 scopedBrainRetriever/searchBrainFiles 의 scopeFolders 메커니즘 재사용 — 검색 엔진 무변경.
검증: tsc 무오류 + jest 809 통과(신규 calculate 6개 + domainRouter 12개) + esbuild 정상.
## v2.2.294 (2026-07-05)
### 🔘 도구 메뉴에 'NotebookLM 백엔드 실행/종료' 버튼 (터미널 불필요)
Datacollector 의 Research(NotebookLM) 기능은 NAS 브리지로 처리 불가(로그인된 로컬 Chrome + PC 의 LM Studio 프록시 필요)라 로컬에서 `npm run bridge` 를 띄워야 했는데, 터미널 없이 사이드바 버튼으로 켜고 끌 수 있게 했다.
- **도구 ▾ 메뉴**: 'NotebookLM 백엔드 실행' / 'NotebookLM 백엔드 종료' 버튼 추가.
- **실행**: VS Code 통합 터미널("NotebookLM Bridge")에서 `npm run bridge` — 맥/윈도우 셸 차이를 VS Code 가 흡수하고, 브리지 로그(인증 만료 등)를 사용자가 그대로 볼 수 있다. 이미 실행 중이면(포트 3002 응답) 중복 실행 안 함.
- **프로젝트 자동 탐색**: 설정(`g1nation.datacollectLocalProjectPath`) → 워크스페이스 → 부모의 Datacollector_MAC/Datacollector/Datacollect 순. 못 찾으면 폴더 선택 창 → 선택 즉시 설정에 저장(다음부턴 버튼만).
- **종료**: 터미널 정리 + 포트 3002 점유 프로세스를 OS 자동 감지로 정리(윈도우 PowerShell Stop-Process / 맥·리눅스 lsof+kill) — 예전에 수동으로 띄워 남아 있던 프로세스까지 잡는다.
- NAS 브리지·Astra 슬래시 명령에는 영향 없음(별개 경로). 새 핸들러는 registerSidebarHandler 체인에 독립 모듈로 합류.
검증: tsc 무오류 + jest 791 통과(신규 bridgeLauncher 테스트 7개 포함) + esbuild 정상.
## v2.2.293 (2026-07-05)
### 🗑️ Pixel Office 완전 제거 (시각화 폐기 — 기업 모드 로직은 무변경)
v2.2.267 에서 채팅 배너를 제거한 데 이어, 시각화 기능 전체를 폐기하기로 결정(재도입 계획 없음).
- **삭제**: `src/features/astraOffice/**`, 사이드바 매니저 3종(pixelOfficeState/Helpers/LayoutStore), `features/company/pixelOfficeState.ts`(UI 전용 변환층), `assets/pixelOffice/**`(스프라이트 17MB), `.astra-office-preview.html`, officeSchema 테스트.
- **정리**: sidebarProvider 의 'Pixel Office collector' 섹션 통삭제(설계 주석의 "통째로 지워도 회사 모드 동일 동작" 불변식 그대로 활용), companyTurnEmitter 의 onPixelOffice 훅, chat/company 핸들러 케이스, `g1nation.company.pixelOffice.open` 커맨드, `company.pixelOffice.*` 설정 2종, webview 의 무시-케이스.
- **기업 모드(1인 기업) 판단 로직은 어떤 것도 변경되지 않음** — 제거된 것은 전부 read-only UI 레이어.
- 효과: 패키지 약 10MB 감량(12.2MB → 약 2MB대), 미사용 코드 ~1,000줄 제거.
검증: tsc 무오류 + jest 784 통과(2 skip, 삭제된 기능 테스트 17개 제외) + esbuild 번들 정상.
## v2.2.292 (2026-07-05)
### 🌡️ 메모리·발열 최적화 5종 (기능 변경 없음)
유휴·장시간 사용 시의 CPU 깨우기와 메모리 상주를 줄이는 최적화. 동작·기능은 동일.
- **헬스체크 워처 연쇄 제거**: 디스크 권한 검사를 워크스페이스 파일 쓰기/삭제 → `fs.access(W_OK)`로 교체. 10분마다 VS Code 본체·전체 확장의 파일 워처를 깨우던 연쇄가 사라짐.
- **헬스체크 느린 검사 분리**: `git push --dry-run`(원격 네트워크)을 execSync(최대 5초 확장 호스트 블로킹) → 비동기 exec 로 전환하고, Antigravity 레지스트리 검사와 함께 30분 주기(3틱마다)로 완화. 결과는 캐시되어 경고 표시는 깜빡이지 않음.
- **웹뷰 retainContextWhenHidden 정리**: 설정·승인·Pixel Office 패널에서 제거(숨김 시 렌더러 상주 해제, 각 수십 MB). 셋 다 재표시 시 상태 재구성 경로가 이미 있음(설정: 'ready'+getState, 승인: 백엔드 html 푸시). 채팅 패널만 대화 DOM 보존을 위해 유지.
- **브레인 인덱스 유휴 해제**: 한 번 로드되면 세션 내내 상주하던 토큰·임베딩 인덱스를 마지막 사용 30분 후 dirty flush 하고 메모리에서 내림(mtime 디스크 캐시가 있어 재로드 저렴). 상시 타이머 없이 접근 시 재예약되는 one-shot unref 타이머.
- **채팅 DOM 상한**: 사이드바 채팅 메시지 노드를 최근 200개로 제한(초과분은 오래된 것부터 제거 + 안내 문구). retain 웹뷰의 단조 메모리 증가 차단.
- **@lmstudio/sdk 지연 로드**: 최상위 값 import → 타입 전용 import + `getSdk()` 첫 호출 시 require. LM Studio 미사용 세션에서는 SDK 모듈이 초기화되지 않음.
검증: jest 801 통과(2 skip) + esbuild 번들 정상.
## v2.2.258 (2026-06-22)
### 📝 `/meet` 회의록 — 화자 팀/역할 정규화 + 슬림 포맷 + 타임스탬프 근거
실제 회의록 산출물(자이언츠 이머시브 커머스 데모 리뷰)을 녹취 원문과 대조한 피드백을 반영. *그 회의록 한 건을 고치는 게 아니라*, 앞으로 생성될 모든 회의록의 생성 파이프라인(프롬프트+코드+검증패스)을 개선.
- **화자 정규화(최우선)**: STT 화자번호("참석자 N")는 실명·역할이 아니고 번호↔이름 연결고리가 녹취록에 없다. 최종 문서에서 "참석자 N" 토큰을 **0개로 박멸**하고, 위험한 개인 추측 대신 **회사 표준 팀/역할**(PD·기획·사업·클라이언트·넥서스개발팀·UI·배경팀·캐릭터팀·QA·사운드·개발PM)로 귀속. 개인명은 명단+문맥 확실 시만 병기, 팀조차 불명이면 무귀속 중립 서술. 신규 설정 `g1nation.meetTeamRoster`.
- **회의 헤더 전(全)조각 주입**: 파일 상단 참석자 명단·일시·장소·녹취 길이를 파싱해 **모든 청크 추출 프롬프트에 주입**(자동 용어집과 동일 메커니즘) — 헤더가 첫 조각에만 있어 후반부 화자가 깨지던 구조적 갭 해소. 개요에 장소·회의유형·녹취길이·작성일 자동 반영. ([calendarHelpers.ts](src/features/datacollect/scheduling/calendarHelpers.ts) `extractMeetingHeader`)
- **전역 헤드라인 추출**: 12K 청크 분할의 약점(마지막 청크에만 있는 "고객 핵심 요구 3종"이 묻힘)을 reduce 단계 "전 청크 관통 결론 추출"로 해결 — 핵심 요약 맨 앞에 세움.
- **결정 게이트 강화**: "테스트 후 결정/다시 보고 얘기/고민해보자"류 조건부·미합의를 결정사항에서 빼 오픈이슈로. 담당+행동이 있는 일감은 액션으로(결정엔 순수 방향/정책만) — 결정/액션 중복 제거.
- **담화 상태 태깅**: 추출 단계가 각 제안을 `(합의)`/`(미합의)`/`(반박됨)`/`(철회됨)`으로 표시 → 즉시 일축된 가설(예: "흑인 예시")이 정식 이슈로 격상되는 것 차단. 화자간 수치 충돌(6 vs 8)은 단일값 확정 말고 그대로 명시.
- **슬림 포맷**: 7→6 섹션, 한 사실은 한 섹션에만(중복 제거), **빈 칸은 "—"**(빈 템플릿이 환각 유발), 리스크는 실제 논의됐을 때만 표 띄움. 액션 표 6→5컬럼(`담당|액션|기한|상태|출처`), 작업내용+상세 병합.
- **근거 = 타임스탬프**: STT 원문 통째 인용 대신 `[mm:ss]`로 정제(검증 점프 가능). 추출 노트엔 verbatim 보존(검증용).
- **파서 안전화**: `parseActionItems`를 **헤더명 기반 매핑**으로 재작성 — 컬럼 순서·개수가 바뀌어도(신/구 형식 모두) 캘린더 확신 게이트가 어긋나지 않음. 상태 taxonomy(확정/진행미정/기한미정/조건부/반복)·게이트는 불변.
- **검증 패스 기본 ON**: 단순 근거 존재 확인 → ①근거미확인 ②"참석자 N" 잔존 ③결정 과확정 ④폐기 가설 격상 ⑤액션 중복 **5종 점검**으로 확장(`g1nation.meetVerifyPass` 기본 true).
- 회귀 가드 갱신·신규([meetPrompt.test.ts](tests/meetPrompt.test.ts) · [meetRegistration.test.ts](tests/meetRegistration.test.ts)), 전체 698 통과. 코어 채팅 경로 불변.
## v2.2.257 (2026-06-19)
### 📝 `/meet` 회의록 — 책임 소재·근거 정책 4종 (익명 담당·빈 인용·기한·명단 정합)
실제 회의록 산출물 분석에서 드러난 4개 결함을 프롬프트 정책으로 차단. 공유 출력 형식(단일샷+reduce)과 추출(map) 단계 모두에 적용.
- **익명·번호 화자 책임 배정 금지**: "참석자 1" 같은 실명 미확인 화자를 액션 담당으로 확정하지 않고 `[미지정-확인필요]` 로 둠. 한 익명에 액션이 몰리면 "(동일 화자 여부 확인)" 표기 — 화자분리 오류로 인한 **가짜 책임 배정** 차단.
- **내용 없는 인용 금지**: "이렇게 이렇게/그거/이거" 같은 지시대명사뿐인 발화는 결정·액션 근거로 인용 불가 → 핵심 내용을 `[내용 확인필요]` 로 표기.
- **기한 역참조**: 리스크·논의에 등장한 마감("다음 주 수요일")을 결부된 액션 기한 칸에 연결 — 액션은 전부 "미정"인데 본문엔 마감이 떠 있는 모순 제거.
- **참석자 명단 정합성**: 본문 화자가 회의 개요 참석자에 없으면 "(명단 외 화자 — 확인필요)" 표기.
- §4 액션 지시문·최종 점검 체크리스트에 게이트 반영. 회귀 가드 테스트 +10건([meetPrompt.test.ts](tests/meetPrompt.test.ts)), 전체 694 통과. 코어 채팅 경로(v2.2.256)는 불변.
## v2.2.256 (2026-06-19)
### 🧩 코어 채팅 경로 — 큰 입력 청킹·통합 + 실제 컨텍스트 창 정렬 + 모델 핸들 race 수정
큰 입력을 넣으면 `Failed to acquire LM Studio model handle … Operation canceled` 로 턴 전체가 죽던 문제를 3계층으로 해결. `/meet`·`/review` 와 달리 **일반 채팅(코어 경로)** 은 그동안 단일 예산 호출이라 약한 모델·큰 입력에서 무너졌다 — 그 갭을 메움.
- **모델 핸들 race 수정**: 핸들 획득(`getModelHandle``llm.model()`)이 재시도 try/catch **바깥**에 있어, 라이프사이클의 동시 로드가 superseded/abort 되며 SDK 가 합쳐버린(coalesce) 우리 JIT 조회까지 "Operation canceled" 로 떨어지면 **재시도 없이 크래시**했다. 핸들 획득을 재시도 루프 안으로 넣고, 취소/죽은-핸들 류 에러는 SDK 재생성 후 1회 자동 재시도(실제 사용자 취소는 그대로 존중). 큰 입력일수록 26B 로드가 느려 race 창이 넓어져 잘 터지던 것. ([streamer.ts](src/lmstudio/streamer.ts))
- **Phase 1 — 실제 창 정렬**: 예산을 설정값(`g1nation.contextLength`)이 아니라 모델이 **실제 로드된 창**(`llm.getContextLength()`, 캐시)에 맞춰 둘 중 작은 쪽으로 클램프. 설정 32768 인데 모델이 8192/16384 로 떠 있으면 서버가 조용히 잘라 빈 답변이 나던 문제를 실측으로 차단. 불일치 시 컨텍스트 배지에 `⚠ 실제 창 N↓` 노출. ([client.ts](src/lmstudio/client.ts) · [computeBudgetedRequest.ts](src/agent/handlePrompt/computeBudgetedRequest.ts))
- **Phase 2 — 코어 채팅 Map-Reduce**: 단일 사용자 입력이 (유효 창 × `mapReduceTriggerRatio`, 기본 0.6) 을 넘으면 청크→**질의 인지형 추출**(요약 아님, 원문 사실만·추측 금지)→통합 후, 압축된 컨텍스트로 정상 스트리밍 답변. 합본이 또 넘치면 계층적 통합(`mapReduceMaxDepth`). 한 조각 실패는 부분 폴백, 전체 실패는 단발 경로로 폴백. 모두 무관하면 정직하게 "관련 내용 없음" 신호. 동시성은 로컬 GPU 보호로 기본 2. ([largeInputMapReduce.ts](src/agent/handlePrompt/largeInputMapReduce.ts))
- **Phase 3 — 메타 노출**: map-reduce 진행/결과(`N조각 → M추출`, 무관·실패)를 컨텍스트 배지에 표시. 출처 추적용 `[조각 k]` 태깅은 `g1nation.mapReduceShowProvenance` 로 옵트인.
- 신규 설정: `largeInputMapReduce`(기본 on) · `mapReduceTriggerRatio` · `mapReduceConcurrency` · `mapReduceMaxDepth` · `mapReduceShowProvenance`. 코어 경로만 변경, `/meet`·`/review` 전용 경로는 불변. 테스트 +25건(streamer·budget·map-reduce 코어), 전체 684 통과.
## v2.2.255 (2026-06-18)
### 🧩 `/review` — 코드 리뷰 map-reduce 청킹 (약한 모델도 큰 코드베이스 처리)
- 일반 에이전트 채팅은 코드 리뷰처럼 입력이 큰 작업을 단일 호출로 처리하다 약한 로컬 모델에서 빈 응답(첫 토큰 EOS)으로 무너진다. `/meet` 의 검증된 map-reduce 를 코드 리뷰에 적용한 **`/review <디렉터리|파일> [초점]`** 명령 신설. 코어 채팅 경로는 건드리지 않음.
- **Map**: 소스 파일을 하나씩 독립 리뷰(버그·보안·성능·설계·가독성, 라인 인용 근거 필수) → 파일별 노트. `callLmSynthesis` 의 재시도/출력붕괴 감지를 그대로 활용. 한 파일이 실패해도 전체를 포기하지 않고 부분 리뷰로 진행.
- **Reduce**: 노트를 통합해 우선순위가 매겨진 보고서(총평·우선개선·분류별·잘된점·다음단계). 노트가 크면 배치로 접는 **hierarchical fold** 로 reduce 입력도 약한 모델 한도(16K) 안에 유지.
- 의존성·빌드 산출물 자동 제외(`node_modules`/`dist`/`.d.ts`/`.min.js`/lock 등), 파일 30개·400KB 상한(초과 시 경고), 결과는 wiki 에 저장. 신규: [reviewPrompt.ts](src/features/datacollect/prompts/reviewPrompt.ts) · [reviewFiles.ts](src/features/datacollect/reviewFiles.ts). 테스트 +5건(전체 667 통과).
## v2.2.254 (2026-06-18)
### 🔎 빈 응답(empty response) 진단 정확도 — MoE 활성 파라미터 인식
- 일반 에이전트 채팅에서 약한 모델이 큰 입력에 첫 토큰 EOS 로 무너져 **빈 응답**이 날 때, 모델명 파서가 `gemma-4-26b-a4b` 를 "26B 큰 모델"로 오판해 엉뚱한 안내를 하던 문제. **활성 파라미터 추정**(`estimateActiveParamsB`: `a4b`→4, `A3B`→3, `e2b`→2) 추가 → MoE 를 정확히 식별. ([contextManager.ts](src/lib/contextManager.ts))
- 빈 응답 에러 메시지 개선: (1) "**답변이 길어서가 아니라 입력이 모델 용량 대비 커서**" 발생함을 명시, (2) MoE 면 `총 ~26B / 활성 ~4B` 표기 + 활성 7B+ 권장, (3) **LM Studio 로드 context length 와 `g1nation.contextLength` 불일치** 가능성을 1순위 점검 항목으로 안내. ([agent.ts](src/agent.ts))
- 참고: `/meet` 의 map-reduce 청킹은 그 명령 전용이며, 일반 채팅(코드 리뷰 등)에는 적용되지 않는다(단일 예산 호출). 테스트 +6건(전체 662 통과).
## v2.2.253 (2026-06-17)
### 🪓 /meet 조각 실패 시 절반 분할 재시도 (약한 모델 성공률↑)
- v2.2.252 의 재시도(반복 억제 강화)에도 조각이 계속 붕괴하면, 그 조각을 **줄 경계로 절반씩 쪼개 재귀 재시도**한다(12K→6K→3.5K). 입력이 작아질수록 약한 모델의 출력 붕괴 확률이 떨어지므로, **모델 교체 없이도** 추출 성공률이 오른다. 최소 크기(3.5K) 이하인데도 실패하는 구간만 건너뛴다. ([handlers.ts](src/features/datacollect/handlers.ts))
- 진행 로그에 분할 재시도 과정을 노출(`↩︎ 조각 1(12,000자) 출력 붕괴 → 절반으로 쪼개 재시도`).
- ⚠️ 근본 원인은 모델(`gemma-4-26b-a4b-it`, 활성 ~4B)이 긴 한국어 처리에 약한 것 — 분할로 완화될 뿐 완치는 **27B+급 또는 한국어 특화 모델(EXAONE/Qwen 등)** 전환 권장.
## v2.2.252 (2026-06-17)
### 🛡️ /meet 모델 출력 붕괴(degeneration) 대응 + 회의록 가이드 v2 반영
- **출력 붕괴 복원력**: 약한 로컬 모델이 긴 한국어 녹취록에서 반복 루프·토큰 깨짐("톤을 톤을 톤을…", 깨진 유니코드)에 빠져 LM 서버가 `Failed to parse input`을 던지던 문제. `callLmSynthesis`**재시도 내장**(시도마다 `repeat_penalty`↑ 1.1→1.25→1.4, `top_k`↓ 20→15→10으로 반복 억제 강화) + **degeneration 감지**(`looksDegenerate`) 추가. 모든 datacollect LLM 호출이 혜택. ([llm.ts](src/features/datacollect/llm.ts))
- **부분 회의록 fallback**: 긴 녹취 2단계 합성에서 한 조각이 끝내 실패해도 전체를 중단하지 않고 해당 구간만 표시 후 나머지로 **부분 회의록** 생성. 전 조각 실패 시에만 중단하고, 더 큰 모델(27B+) 사용을 안내. ([handlers.ts](src/features/datacollect/handlers.ts))
- **회의록 가이드 v2**: 섹션 우선순위 재정렬(①결정 ②액션 ③오픈이슈 ④리스크 ⑤논의), **논의사항을 주제별 bullet**로 간결화, **오픈 이슈 섹션 복원**, 액션 아이템에 **산출물 컬럼 추가**(담당·작업·기한·산출물 4요소), 담당자 개인 우선(조직 단위 지양), Executive Summary 결과 중심. ([meetPrompt.ts](src/features/datacollect/prompts/meetPrompt.ts))
- **하위호환**: 액션 표 파서가 신6컬럼/구5컬럼 모두 파싱, 섹션 번호 무관 탐지. 캘린더 확신 게이트·근거 인용 유지. 테스트 +13건(파서·degeneration 감지), 전체 659 통과.
## v2.2.251 (2026-06-17)
### 📝 /meet 회의록 출력물 개선 (실무 회의록 가이드 반영)
- **결정사항 ↔ 논의사항 분리(최우선 원칙)**: 기존 "주요 논의 사항" 안에 결정이 섞이고 "결정 사항"과 중복되던 구조를, **결정 사항(명시 합의만) / 논의 사항(추가 검토 필요)**로 명확히 분리.
- **구조 재편**: ① 회의 개요(+**회의 목적** 신규) → ② 주요 결과(Executive Summary, "비참석자가 이것만 읽고 결과 파악" 기준) → ③ 결정 사항 → ④ 논의 사항(안건별 현황/핵심논의/추가검토) → ⑤ **리스크 및 검토 사항(리스크·영향도·대응방안 표)** → ⑥ 액션 아이템.
- **결과 중심 서술**: 발언 나열 금지(누가 무슨 말 했는지 X), 책임 소재·입장 차이가 핵심일 때만 발언자 표기. 사실 중심·증빙 보존 원칙과 출력 전 품질 체크리스트를 프롬프트에 내재화. ([meetPrompt.ts](src/features/datacollect/prompts/meetPrompt.ts))
- **다운스트림 하위호환**: 회의일 추출 `**날짜**``**일시**`(둘 다 인식), 액션 섹션 파서를 번호 무관으로 변경(`(?:\d+\.)?액션 아이템`) — 캘린더 확신 게이트·근거 인용·발언 귀속 안전장치 전부 유지. ([calendarHelpers.ts](src/features/datacollect/scheduling/calendarHelpers.ts))
- 회귀 테스트 32건(meetRegistration·calendarApi) 통과, 타입체크 0 에러.
## v2.2.213 (2026-06-11)
### 🧠 Self-Evolving Digital Employee OS P0~P6 (신규 모듈 17종, `src/intelligence/`)
- **신뢰성 코어**: Requirement Graph(업무별 필수 요소 체크리스트 주입 + 답변 커버리지 footer) · Confidence Engine(확신도 0~100 footer) · Escalation Engine(저확신·충돌·출처누락 시 검토 요청) · Epistemic Guard(모름/추정/확실 3분류 강제) · Provenance(출처 수정일·오래됨 경고) · Critic Loop(문제 신호 turn 만 LLM 검수 1회)
- **성장 루프**: 업무 turn 마다 Reflection 자동 기록(`<brain>/.astra/growth/`) → Gap Detector → Need Engine → Learning Queue(승인은 사람만). 반복 누락 요소(3회+)는 다음 turn 체크리스트에 자동 강조.
- **지식 운영**: Knowledge Validation+Belief Revision(중복/충돌 게이트) · Decay 노후 감사 · Debt 집계 · Organizational Memory(`.astra/organization.md` 상시 주입)
- **학습 실행**: Research Agent — approved 큐 항목을 조사 브리프+추정 라벨 초안+검증 판정의 제안 문서로 생성. Skill Score(전/후반 추세)·Success Pattern DB 자동 축적.
- **신규 명령 5종**: 업무 평가 실행(회의록 골든셋) / 성장 리포트 / 학습 큐 갱신 / 지식 노후 점검 / 학습 실행(Research Agent)
- **캘린더 충돌 게이트**: `<create_calendar_event>` 가 기존 일정과 겹치면 생성 보류 + 사용자 확인 요청 (`force="true"` 는 승인 후에만). 구조화 이벤트 캐시(calendar_cache.json) 신설.
- 설정 11종 추가 (전부 기본 켜짐, `g1nation.*` 로 개별 off 가능). 테스트 +89건 (전체 508 통과). 설계: [docs/SELF_EVOLVING_OS_MASTER_PLAN.md](docs/SELF_EVOLVING_OS_MASTER_PLAN.md)
## v2.2.207 (2026-06-08)
### 🏷️ Settings 헤더에 빌드 버전 배지
- "Astra Settings" 옆에 현재 확장 버전(`v2.2.207`)을 표시 — 새 vsix가 실제로 로딩됐는지 한눈에 확인하는 마커. provider 가 `__VERSION__` 를 package 버전으로 주입(자동 동기화). ([settingsPanelProvider.ts](src/features/settings/settingsPanelProvider.ts) `_renderShell`).
+38
View File
@@ -0,0 +1,38 @@
# 업무별 골든셋 템플릿 (Self-Evolving OS Phase 0 / Track 0-3)
ASTRA의 업무 산출물 품질을 측정하기 위한 골든셋 템플릿.
기존 검색 골든셋(`<brain>/.astra/eval/golden.jsonl`, retrieval recall 평가)과 별개로,
**업무 결과물 자체**(회의록/시장조사/업무조사)를 평가한다.
## 사용 방법
1.`.golden.jsonl` 템플릿을 활성 brain의 `.astra/eval/tasks/` 로 복사
2. 실제 과거 업무 데이터로 5~10건씩 채움 (한 줄 = JSON 1건, `//` 시작 줄은 주석)
3. Phase 3 Self Evaluation 모듈이 이 골든셋을 읽어 자동 채점 (evalHarness 패턴 확장)
## 레코드 형식
```jsonc
{
"id": "mm-001", // 업무유형 약자 + 일련번호
"query": "사용자가 실제로 입력한 요청",
"input": "원자료 (회의 메모 원문, 조사 주제 배경 등)",
"expectedElements": ["참석자", "결정사항"], // 반드시 포함돼야 할 요소 (requirementGraph 의 label 과 일치)
"reference": "모범 결과물 전문 또는 핵심 포인트 목록",
"notes": "채점 시 주의사항 (선택)"
}
```
`expectedElements``src/intelligence/requirementGraph.ts`
`DEFAULT_TASK_REQUIREMENTS` element label 과 일치시킬 것 — 커버리지 검사와
Self Evaluation 이 같은 어휘를 쓰도록.
## 채점 기준 (Self Evaluation 에서 사용)
| 항목 | 척도 |
|------|------|
| 필수 요소 충족률 | expectedElements 커버 비율 (결정론적) |
| 정확성 | 1~10 (reference 대비) |
| 논리성 | 1~10 |
| 가독성 | 1~10 |
| 사실 오류 | 개수 (0이 목표) |
@@ -0,0 +1,2 @@
// 시장조사 골든셋 — 실제 과거 조사 업무로 교체할 것 (5~10건 권장). 아래는 형식 예시 1건.
{"id":"mr-001","query":"국내 로봇청소기 시장조사 해줘","input":"신제품 기획 검토용. 프리미엄 라인 진입 여부 판단 목적.","expectedElements":["시장 규모","성장률","경쟁사","가격","고객 니즈","트렌드","출처"],"reference":"시장 규모(금액·수치+출처), 연 성장률, 주요 경쟁사와 포지션, 가격대 분포, 고객 페인 포인트, 최근 트렌드, 모든 핵심 수치에 출처 명시","notes":"수치에 출처가 없으면 '(확인 필요)' 표기했는지 확인 — 환각 수치는 실격"}
@@ -0,0 +1,2 @@
// 회의록 골든셋 — 실제 과거 회의 데이터로 교체할 것 (5~10건 권장). 아래는 형식 예시 1건.
{"id":"mm-001","query":"오늘 주간회의 내용 회의록으로 정리해줘","input":"6/9 주간회의 메모: 김OO 이OO 박OO 참석. 신제품 출시일 7월 15일로 확정. 김OO이 6/20까지 견적서 발송하기로. 마케팅 예산은 다음 회의에서 재논의.","expectedElements":["참석자","결정사항","액션 아이템","담당자","기한"],"reference":"참석자: 김OO, 이OO, 박OO / 결정사항: 신제품 출시일 7/15 확정, 마케팅 예산은 차기 회의 재논의 / 액션 아이템: 견적서 발송 (담당: 김OO, 기한: 6/20)","notes":"미결 항목(마케팅 예산)을 결정사항과 구분해 표기했는지 확인"}
@@ -0,0 +1,2 @@
// 업무조사 골든셋 — 실제 과거 조사 요청으로 교체할 것 (5~10건 권장). 아래는 형식 예시 1건.
{"id":"wr-001","query":"MCP 프로토콜에 대해 조사해줘","input":"ASTRA에 외부 도구를 연결할 때 표준으로 쓸지 판단하기 위한 조사.","expectedElements":["조사 목적","핵심 요약","세부 내용","출처","시사점·다음 단계"],"reference":"목적 한 줄 → 3줄 요약 → 상세(아키텍처/생태계/한계) → 출처 → ASTRA 적용 시사점과 권장 다음 단계","notes":"모델 일반 지식과 검색 근거를 구분해 표기했는지 확인"}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 517 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 624 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Some files were not shown because too many files have changed in this diff Show More