실제 회의록 산출물 분석에서 드러난 4개 결함을 프롬프트 정책으로 차단.
공유 출력 형식(단일샷+reduce)과 추출(map) 단계 모두에 적용.
- 익명·번호 화자("참석자 1")를 액션 담당으로 확정 금지 → [미지정-확인필요].
한 익명에 액션 몰리면 "(동일 화자 여부 확인)" — 가짜 책임 배정 차단.
- 내용 없는 인용("이렇게 이렇게/그거") 근거 금지 → [내용 확인필요].
- 기한 역참조: 리스크·논의의 마감("다음 주 수요일")을 결부된 액션 기한에 반영.
- 참석자 명단 정합성: 본문 화자가 명단에 없으면 "(명단 외 화자 — 확인필요)".
§4 지시문·최종 점검 체크리스트 반영. 회귀 가드 +10건, 전체 694 통과.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
일반 에이전트 채팅이 큰 코드베이스 리뷰를 단일 호출로 처리하다 약한 로컬
모델에서 빈 응답으로 무너지던 문제를, /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>
회의록 출력물 개선 (실무 회의록 가이드 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>
소형 로컬 모델이 한국어 단어 중간에 영문 토큰을 섞는 디코딩 사고
("덩어리"→"덩ey", "결과적으로"→"결ently"). 프롬프트 출력 위생 규칙으로는
못 막음 — 지시 불이행이 아니라 토큰 붕괴라서. 사후 보정으로 해결:
- hangulHygiene.ts: 고정밀 감지 패턴(한글 음절+영문 소문자 2+ 연속) —
"API를"/"Code의"(영문+조사)·"플랜B"(한글+대문자)는 정상 표기로 미감지,
코드 블록 제외. 감지 시 LLM 수리 1회 (깨진 토큰만 복원, 내용 변경 금지).
- 수리 검증 게이트: 길이 ±35% 이내 + 깨진 토큰 감소 — 미통과 시 원문 유지
(수리가 더 망치는 것 방지). 실패 전 과정 로그 (관측성 원칙).
- 적용 경로: 채팅 답변(스트림 후·확정 전) + /wikify 산출물(영구 자산이라
더 중요 — "🩹 표기 오류 N건 교정" 표시).
테스트 11건 (감지 정밀도·검증 게이트·실패 안전).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
[포맷 통일 — 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>
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>
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>
캘린더 등록 정책을 "확신 없으면 등록 대신 질문"으로 전환:
- 액션 표에 상태 컬럼(확정/진행미정/기한미정/조건부:선행/반복:주기) — 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>
/stocks judge — 조건 판정 정확도 (P2/P3/P4):
- criteriaEval.ts 신설: 8개 키워드 중 수치 기준 7개("5,800%" 파싱·임계값
비교)와 충족/미충족 판정·투자성향별 대표 3개 선택을 코드로 결정론 계산.
LLM 은 '기술력' 도메인 정성 판단(키워드 모호 시)과 근거 서술만 담당,
실패 시 결정론 폴백 → judge 가 LLM 형식 오류로 실패하는 경로 제거.
- cmdJudge: 판정 전 Naver 실시간 펀더멘털 fetch(실패 시 저장값 폴백) +
결과에 데이터 출처 표기.
- tests/stocksCriteria.test.ts: 사용자 실제 분류 패턴(마녀공장/기가비스/
엔켐) 픽스처 8건 — 코드 판정이 기존 패턴과 일치함을 고정.
/meet — 할루시네이션·문맥 누락 (P1/P5/P6):
- 근거 인용 의무: 결정·액션마다 발언 원문 인용(근거: "…") — 인용 불가
항목은 결정/액션 금지 (날조 구조적 억제).
- 60K 하드 자르기 폐지 → 12K 조각 추출(Map) + 병합(Reduce) 2단계.
lost-in-the-middle·후반부 증발 해소, 커버리지 60K→144K자.
- g1nation.meetVerifyPass(기본 off): 결정·액션을 근거 소스와 LLM 대조해
확인 불가 항목을 '⚠️ 검증 결과' 섹션으로 표시.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Datacollect Bridge 로컬/NAS 타깃 토글(Settings 패널) + NAS URL/x-bridge-token.
기본 local = 현행 동작 유지. (백엔드 NAS 분리 준비)
- /research(NotebookLM) 제거 — 로컬 Datacollect 앱 전용으로 분리.
- 에러로그 오염 차단: STT/스택트레이스/에러덤프를 장기기억 채굴 제외 + 자동
추출 항목 14일 TTL(참조 시 슬라이딩 연장). 기존·수동 항목 무영향.
- 컨텍스트 [주제] 태깅 + 교차오염 방지 경계 지침.
- "확인 불가" 사실 날조 금지 규칙(R7과 구분).
- /meet STT 오타 보정: 철자 정규화 허용하되 사실 날조는 차단.
타입체크 + 407 테스트 통과.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- /weekly: 차주 날짜 입력→금주 자동 역산, Google Tasks 기반 금주/차주 보고서.
버킷팅은 코드(예측 가능), 포맷팅만 LLM. 신규 weeklyPrompt.ts + coordination.ts runWeekly.
- 기존 CEO /weekly 리뷰 카드(dashboards.ts) 제거 — 이름 충돌 해소, /weekly 일원화.
- /meet: 액션아이템에 '작업 상세' 열 추가, 캘린더 notes 가 실제 작업 내용을 담도록 재구성.
- /meet: 발언자 추적 복원 + 비선형 회의 재조립 + 근거/할루시네이션 억제 규칙으로 오귀속 감소.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
v2.2.192 Terminology Dictionary 가 *instructional* 지시 (LLM 에게 표준 표기 사용 권유)
였다면, 이번엔 *deterministic* 검증 — LLM 이 지시를 안 따랐을 때 결정론적 정규식 스캔.
신규 모듈: src/agent/termValidator.ts
- parseGlossary() — .astra/glossary.md 정규식 파싱 (mtime 캐시)
Pattern 1: **Canonical** (X: typo1, typo2, ...) — typo 등장 시 "→ Canonical 권장"
Pattern 2: H2/H3 "금지/비추/forbidden/avoid/don't" 섹션의 - ❌ "phrase"
- validateTermUsage() — 정규식 스캔 + 발견 횟수
- formatTermValidatorFooter() — markdown 한 줄 footer
False-positive 필터:
- 한글 1음절·영문 1자·공백 포함 토큰 제외
- 영문 단어 경계 매치, 한글 substring
Wiring:
- agent.ts _maybeRunTermValidator — Self-Check 직후, swallow 패턴
- /glossary reload — Term Validator 캐시도 함께 비움
신규 설정: g1nation.termValidatorEnabled (기본 true)
Footer 누적:
- v2.2.191 🔍 Self-check (LLM 호출, opt-in)
- v2.2.194 🔤 Term validator (정규식, on by default)
시너지: Terminology Dictionary(instructional, 작성 중) + Term Validator(deterministic,
작성 후) → 사용자가 .astra/glossary.md 한 곳만 관리하면 2단 자동 동작.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
v2.2.168: 재패키징.
v2.2.169: /meet 액션 아이템을 Google Tasks 로 등록 추가.
- 신규 src/features/calendar/tasksApi.ts (Google Tasks API v1)
- OAuth SCOPE 에 https://www.googleapis.com/auth/tasks 추가 — 사용자 재인증 필요
- 신규 설정 g1nation.meetUsesTasks (기본 true)
v2.2.170: /meet 양쪽 동시 등록 (Tasks + Calendar 독립 토글).
- meetUsesCalendar 신설, 둘 다 독립 on/off
- 출력에 destination 별 성공/실패 표시
v2.2.171: 신규 /task <제목> <시작일> <완료일> 명령.
- 단일 작업을 Tasks + Calendar 양쪽에 단발 등록 (설정 무시, 항상 둘 다)
- 단일일 폼: /task <제목> <날짜> 도 지원
- 날짜 형식 3종: YY/MM/DD, YYYY-MM-DD, YYYY/MM/DD
- Calendar all-day end-exclusive 자동 보정
v2.2.172: meetUsesCalendar 기본 true→false (중복 방지).
- Tasks 도 Calendar 사이드바에 같이 노출되어 둘 다 켜면 중복 표시되던 문제 해결
- 양쪽 원하면 명시적으로 true 토글
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
[v2.2.83] /youtube info 프롬프트 강화
- 비유 방향 보존 룰 (Hugging Face=자료실 같은 짝 뒤집기 방지)
- 신뢰도 라벨 4종 ([근거 명시] / [화자 주장] / [가정] / [정리자 추론])
- 타임스탬프 fail 룰 (인용·구간 요약 모두 mm:ss 필수)
- "정리자 노트" 별도 섹션으로 추론 격리
[v2.2.85] polishPersona self-check 5가지
- 정리·리뷰·요약 답변 출력 직전 머릿속 체크:
(1) 사실 오류 (2) 없는 내용 추가 (3) 뉘앙스 유지
(4) 중요도 비례 (5) 중복 제거
[v2.2.86] chunkedSwitchTokens 절대 임계값 게이트
- 입력 < 50k 토큰이면 키워드·길이 트리거 무시하고 단일 호출
- 큰 컨텍스트 모델(131k+)에서 chunked 과잉 발동 방지
[v2.2.87] MAX_SECTIONS 5→3 cap
- 총 호출 7회 → 5회 (outline + 3 section + polish)
- 사용자 피드백 "6+회는 과하다"
[v2.2.88] 이모지 사용 금지 룰
- polishPersona / directPersona / sectionPersona 모두 적용
- 사용자 피드백 "이모지는 시각 노이즈"
[v2.2.89] 사용자 노출 설정 두 항목
- chunkedMaxSections config 신규 (default 3, 1~10 clamp)
- MAX_SECTIONS_HARD_CEILING (10) 으로 안전망 격상
- Astra Settings 패널 "고급" 섹션에 두 슬라이더 노출
[v2.2.90] 가이드 문구 단순화
- "작은 모델은 낮추라" 문구 빼고 일관되게 50000 권장으로
[v2.2.91] 답변 포맷 가독성 fix
- persona 의 "TL;DR" 표현 전부 "한 줄 요약" 으로 단일화
- stripMarkdownFormatting 에 헤더 후 빈 줄 강제 삽입
(marked.parse 가 라벨·본문을 별도 단락으로 인식 → 시각 분리)
[테스트] 400/400 통과 (resilience_stress + chunked flow + MAX_SECTIONS cap 등)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
주요 변경:
[chunked writer 아키텍처 (v2.2.74~v2.2.75)]
- 5-stage 다중 에이전트(planner/researcher/reflector/writer/synthesizer)
파이프라인 제거 → 단일 ChunkedWriter 의 outline → section[N] → polish
3-step 으로 교체. 본문 분석에서 추상화 손실 / 토큰 폭증 문제 해소
- 답변 길이 자동 분기: 짧은 prompt 는 fast-path direct 1회 호출,
본문 분석은 chunked. outline 빈 배열도 direct 폴백
[코드 리뷰 9개 항목 일괄 패치 (v2.2.76)]
- /research polling hang 방어 (heartbeat + status 정규화 + 연속 실패 abort)
- 회사 모드 dispatcher abort 신호를 AIService.chat 까지 전달
- bridgeFetch 에 onHeartbeat 콜백 도입 (slow endpoint 사용자 친화적)
- dead code 정리: reflectionPersister.ts 제거 + enableReflection 등 좀비 config 키
- parseOutline 의 empty vs fallback reason 명시적 분리
- chatHandlers 의 회사 모드 케이스 ~325줄을 src/sidebar/companyHandlers.ts 로 분리
- Intent Alignment 라운드 한도 도달 시 smart 모드 자동 진행
- LM Studio doSwitch unload 실패 시 currentModel 정리 + load 강행
- retrieval informationDensity → queryCoverage 정합화
[/youtube 채널 지원 (v2.2.77~v2.2.82)]
- 채널/플레이리스트 URL 자동 감지 + n:N 으로 영상 개수 지정 (최대 50)
- 채널 루트 URL 에 /videos 탭 자동 append (yt-dlp enumeration 정상화)
- 영상별 순차 처리 (queue 패턴) + i/N 진행 표시 + 마지막 통계 요약
- mode:info / mode:benchmark / mode:both 분석 모드 분기
- info: 영상 내용을 지식 카드로 추출 (튜토리얼·강의·뉴스용)
- benchmark: 4-렌즈 대본 역기획서 (콘텐츠 제작 벤치마크용)
- both: 둘 다 (기본)
- bare keyword 도 허용: /youtube <url> n:1 info
- bridge 에러 메시지 [object Object] 깨짐 수정 (구조화 에러 추출)
- "패키지 없음" 등 환경 의존성 에러에 자동 가이드 첨부
[Astra: Setup Datacollect Dependencies 명령 추가 (v2.2.80)]
- Python 자동 감지 + yt-dlp / youtube-transcript-api 자동 설치
- macOS PEP 668 환경 자동 폴백 (--user --break-system-packages)
- /youtube 등에서 패키지 미설치 감지 시 "Install Now" 버튼 notification
[테스트]
- tests/agentEngine.test.ts 를 chunked flow 에 맞춰 전체 재작성
- tests/resilience_stress.test.ts Scenario B/D 를 role-aware mock 으로 갱신
- 399/399 통과
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- /meet <txt> — 로컬 회의 녹취를 사실 기반 구조화 회의록으로 합성·저장 (v2.2.53)
- /meet 회의록 액션 아이템을 task별 종일 일정으로 Google Calendar에 자동 등록 (v2.2.55)
- 날짜 규칙: 명시 날짜·"차주"(+6일)·변환 불가(등록일+영업일 5일, "(미확정)" 꼬리표)
- handleSlashCommand에 ExtensionContext 배선 (chatHandlers 경유)
- callLmSynthesis: top_p/top_k/repeat_penalty 추가 + 한·영 깨짐 조건부 교정 패스 (v2.2.54)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- /youtube: 4-렌즈 분석 → 대본(스크립트) 역기획서 포맷으로 개편, 보고서
앞에 영상 전체 스크립트(Full Script) 출력, 명령어 보조 컨텍스트 지원
- /wikify: 신규 슬래시 명령 — 웹사이트 본문(/api/web-extract)을 P-Reinforce
v3.0 위키 문서로 합성. 여러 링크 순차 배치 처리, 명세 문서 완전성 규칙,
위키링크 자동 교정
- Self-Reflector Phase A 기본 비활성화 — [Self-Reflector Check] 내부 검증
로그가 사용자 답변에 노출되지 않도록
- 슬래시 합성·일반 채팅 시스템 프롬프트에 출력 위생 규칙 추가 — 한·영 토큰
깨짐 정제, 내부 검증 로그 출력 금지
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- /benchmark now runs the full scan -> LLM 3-stage 4-lens synthesis ->
markdown report pipeline, matching the Datacollect web app output
- Add settings: datacollectSynthesisTemperature (0.1), datacollectCrawlDepth,
datacollectMaxPages, datacollectSavePath; new "Datacollect" Settings section
- Fix slash result not rendering (missing streamStart) and /benchmark URL
parsing when natural language is appended
- Rename view container/view ids to g1nation-* to avoid conflict with the
Antigravity built-in "Connect AI" extension
- Version bump 2.2.34 -> 2.2.41
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>