diff --git a/.astra/project-context/architecture.md b/.astra/project-context/architecture.md
index b90a480..1205728 100644
--- a/.astra/project-context/architecture.md
+++ b/.astra/project-context/architecture.md
@@ -3,20 +3,20 @@
## Snapshot
-- **Workspace**: `connectai` `v2.2.231` _(absolute path varies by environment; resolved from the active VS Code workspace)_
+- **Workspace**: `ConnectAI` `v2.2.247` _(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**: 551 source files, ~81,540 lines across 5 top-level modules.
+- **Stats**: 560 source files, ~83,576 lines across 5 top-level modules.
## Last Refresh
-- **Time**: 2026-06-12T07:39:29.082Z
+- **Time**: 2026-06-12T14:30:58.311Z
- **Files newly analysed**: 3
-- **Files reused from cache**: 548
+- **Files reused from cache**: 557
## Directory Map
```mermaid
mindmap
- root((connectai))
+ root((ConnectAI))
src/
features/
sidebar/
@@ -33,18 +33,18 @@ mindmap
docs/
records/
docs/
- Meeting/
+ plans/
```
## Module Dependencies
> Arrows: which top-level module imports from which.
```mermaid
flowchart LR
- src["src/
313 files"]
+ src["src/
317 files"]
media["media/
6 files"]
- tests["tests/
55 files"]
+ tests["tests/
58 files"]
core_py["core_py/
6 files"]
- docs["docs/
171 files"]
+ docs["docs/
173 files"]
tests --> src
```
@@ -56,71 +56,71 @@ flowchart LR
## Hub Files
> Imported by many other files — touching these has wide blast radius.
-- `src/utils.ts` — referenced by **100** files
+- `src/utils.ts` — referenced by **102** files
- `src/config.ts` — referenced by **38** files
- `src/agent.ts` — referenced by **34** files
-- `src/core/services.ts` — referenced by **15** files
+- `src/core/services.ts` — referenced by **17** 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/retrieval/brainIndex.ts` — referenced by **12** files · Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 /.astra/brain-index.json 에
- `src/integrations/telegram/telegramClient.ts` — referenced by **12** files
-- `src/retrieval/index.ts` — referenced by **11** files · RetrievalOrchestrator — Unified RAG Pipeline Astra의 모든 검색 소스를 통합 관리하는 오케스트레이터입니다. 검색 흐름: ① Query Planning — 의도 분류 + 검색 전략 결정 ② Parallel Search — Brain + Memory + Project + Episode 동시 검색 ③ Result Fusio
## Modules
-### `src/` — 313 files, ~59,911 lines
+### `src/` — 317 files, ~61,263 lines
**Sub-directories**
-- `src/features/` (110) — Astra Office — public API. 다음 세션에서 추가될 OfficeSnapshot presenter / schema 도 같은 entry 로 노출 예정. 현재 노출: full webview panel H
+- `src/features/` (112) — Generic event-sourced store — append-only .jsonl 파일 1개를 읽고/쓰는 공통 기반. 배경: customers, hire, runway, feedback 4개 store 가 같은
- `src/sidebar/` (35) — Brain profile lifecycle 의 pure helpers — sidebarProvider 의 add/edit/delete 흐름에서 modal UI 와 config 쓰기를 제외한 데이터 변환 만 격리. 현
- `src/lib/` (33) — Astra Mode Architecture Context Builder. 의도: 사용자가 Astra 자체의 mode 디자인 (Guard vs Multi-Agent 가 별도 모드여야 하는지) 을 묻는 메타 질문에 답할
-- `src/agent/` (30) — 한·영 깨진 토큰 감지·수리 — 소형 로컬 모델의 토큰 붕괴 보정. 증상: 한국어 단어 중간에 영문 토큰이 섞임 — "덩어리"→"덩ey", "결과적으로"→"결ently". 프롬프트 규칙([출력 위생])으로는 못 막는
+- `src/agent/` (31) — 한·영 깨진 토큰 감지·수리 — 소형 로컬 모델의 토큰 붕괴 보정. 증상: 한국어 단어 중간에 영문 토큰이 섞임 — "덩어리"→"덩ey", "결과적으로"→"결ently". 프롬프트 규칙([출력 위생])으로는 못 막는
- `src/intelligence/` (18) — Confidence Engine — 답변 확신도 0~100 결정론적 산출. Self-Evolving OS 마스터 플랜 Phase 2 / Track 1-1. 신뢰 조건 T4 "확신이 없으면 사람에게 묻는다" 의 측정
- `src/retrieval/` (18) — Actionability Scoring — 검색 결과를 "현재 작업 상태" 신호로 재가중. 기존 TF-IDF (단어 매칭) + recency (시간) 만으로는 "지금 이 사용자가 하고 있는 작업과 직접 연결 된 문서
- `src/core/` (15) — Astra Path Resolver (경로 해결기) Astra의 모든 데이터 파일(.astra 디렉토리)의 경로를 중앙에서 관리합니다. 확장 프로그램의 설치 경로(extensionUri) 기반으로 .astra 디렉토
-- `src/extension/` (12) — 두뇌(Second Brain) 기본 위치 부트스트랩 — 첫 실행 온보딩. 문제: 두뇌 미설정 시 config 가 ~/.g1nation-brain(숨김 점폴더)로 조용히 폴백했다. - 폴더가 실제로 생성되지 않고, 설
-- `src/memory/` (9) — Distillation Loop — stale Episodic Memory → Long-Term "episode-digest" 승급. 배경: Episodic Memory 가 무한히 누적되면 검색 노이즈. 30일+ 지
-- `src/docs/` (6) — Bug: Edited agent.ts Edited agent.ts Edited agent.ts Edited agent.ts Edited agent.ts ...
+- `src/extension/` (13) — 두뇌(Second Brain) 기본 위치 부트스트랩 — 첫 실행 온보딩. 문제: 두뇌 미설정 시 config 가 ~/.g1nation-brain(숨김 점폴더)로 조용히 폴백했다. - 폴더가 실제로 생성되지 않고, 설
+- `src/memory/` (9) — Episodic Memory (일화 기억) 과거 대화/회의/결정의 맥락 흐름을 저장합니다. 세션 종료 시 자동으로 에피소드를 요약하여 저장합니다. "왜 이렇게 결정했는지", "어떤 흐름으로 진행했는지" 기록. 저장
+- `src/docs/` (6) — src Chronicle Records
- `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)
**Key files**
-- `src/utils.ts` (472 lines)
-- `src/config.ts` (637 lines)
-- `src/agent.ts` (1634 lines)
+- `src/utils.ts` (485 lines)
+- `src/config.ts` (661 lines)
+- `src/agent.ts` (1670 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/sidebarProvider.ts` (3487 lines)
- `src/integrations/telegram/telegramClient.ts` (154 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/lib/paths.ts` (151 lines)
- `src/agent/actions/types.ts` (41 lines)
+- `src/lib/contextManager.ts` (278 lines) — Context Manager (컨텍스트 한계 관리) "context length = 132k" 는 "답변을 132k 토큰까지 생성해도 된다" 가 아닙니다. 시스템 프롬프트 + 대화 기록 + 입력 문서 + 생성될 답변 + 여유분 ≤ context length 이 모듈은 요청을 보내기 전에 입력 토큰을 추정하고, - 동적으로 출력 상한(maxTokens)을 계
- `src/retrieval/brainIndex.ts` (566 lines) — Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 /.astra/brain-index.json 에
- `src/retrieval/scoring.ts` (541 lines) — Scoring Engine — TF-IDF + Bilingual Tokenizer 단순 includes() 키워드 매칭을 넘어서, TF-IDF 가중치 기반의 문서 스코어링을 제공합니다. 한국어/영어 양국어 토크나이저를 포함합니다.
+- `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/lib/paths.ts` (151 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/intelligence/requirementGraph.ts` (273 lines) — Requirement Graph — 업무 유형별 필수 요소 정의 + 감지 + 커버리지 검사. Self-Evolving Digital Employee OS 마스터 플랜(docs/SELFEVOLVINGOSMASTERPLAN.md) Phase 1 / Track 2-1. 신뢰 조건 T3 "품질이 일관적이다 — 필수 요소 누락 없음" 담당. 동작 2단계: 1. In
+- `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/features/stocks/types.ts` (53 lines) — Stocks 모듈 공유 타입. investresults/targetstocks.json 스키마를 그대로 받아서, ConnectAI 의 /.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/intelligence/confidenceEngine.ts` (165 lines) — Confidence Engine — 답변 확신도 0~100 결정론적 산출. Self-Evolving OS 마스터 플랜 Phase 2 / Track 1-1. 신뢰 조건 T4 "확신이 없으면 사람에게 묻는다" 의 측정 기반 — Escalation Engine 의 입력. 설계 원칙 (termValidator 와 동일): LLM 호출 없음. 검색 그라운딩 신호(턴
- `src/intelligence/reflectionStore.ts` (162 lines) — Reflection Store — 업무 turn 회고 기록 + Failure Pattern 집계. Self-Evolving OS 마스터 플랜 Phase 1 / Track 2-4 (Reflection Engine v1) + Phase 3 / Track 3-6 (Failure Pattern DB v1 시드). 신뢰 조건 T5 "같은 실수를 반복하지 않는다" 의
- `src/extension/telegramCommands.ts` (103 lines)
- `src/security.ts` (159 lines)
-### `media/` — 6 files, ~7,785 lines
+### `media/` — 6 files, ~7,799 lines
**Key files**
- `media/sidebar.css` (2114 lines) — Stylesheet
-- `media/sidebar.js` (3933 lines)
+- `media/sidebar.js` (3947 lines)
- `media/sidebar.html` (539 lines) — Astra
- `media/settings-panel.html` (440 lines) — Astra Settings
- `media/settings-panel.js` (505 lines)
- `media/settings-panel.css` (254 lines) — Stylesheet
-### `tests/` — 55 files, ~7,902 lines
+### `tests/` — 58 files, ~8,276 lines
*Depends on*: `src/`
**Sub-directories**
@@ -151,9 +151,9 @@ flowchart LR
- `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/sleepDigest.test.ts` (101 lines) — Sleep-time 사전 소화 — 순수 로직 테스트 (대상 선정·노후화 판정·노트 형식). LLM 호출(runSleepDigestOnce)은 제외 — 통합 검증은 수동 명령으로.
- `tests/stocksCriteria.test.ts` (129 lines) — criteriaEval — /stocks judge 결정론 평가기 테스트. 픽스처는 옛 LLM 프롬프트에 명시돼 있던 사용자의 실제 분류 예시 3종 (마녀공장/기가비스/엔켐) — 코드 판정이 사용자 패턴과 일치해야 한다.
+- `tests/alignmentResearch.test.ts` (208 lines)
- `tests/conflictCheck.test.ts` (65 lines) — Schedule Conflict Check (Self-Evolving OS Track 6-2/6-3) 테스트.
- `tests/dataProcessor.test.ts` (87 lines) — /
-- `tests/featureInventory.test.ts` (58 lines) — 기능 인벤토리 자동 생성 + 충돌 스캔 대상 필터 — 순수 로직 테스트. (자기 지식 구식화 버그의 근본 수정: 인벤토리가 package.json 에서 기계 생성되는지)
### `core_py/` — 6 files, ~409 lines
@@ -165,39 +165,39 @@ flowchart LR
- `core_py/optimizer.py` (55 lines)
- `core_py/queue_worker.py` (82 lines)
-### `docs/` — 171 files, ~5,533 lines
+### `docs/` — 173 files, ~5,829 lines
**Sub-directories**
-- `docs/records/` (157) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고...
-- `docs/docs/` (5) — Bug: Viewed integrationretrieval.test.ts:1-59 integrationretrieval.test.ts를 통해 ...
-- `docs/Meeting/` (0)
+- `docs/records/` (157) — Astra Project Chronicle Records
+- `docs/docs/` (5) — docs Chronicle Records
+- `docs/plans/` (2) — Alignment Self-Learning 개선 계획 (v2 — 적대적 리뷰 반영)
**Key files**
-- `docs/records/ConnectAI/timeline.md` (422 lines) — Project Timeline
- `docs/TELEGRAM_REMOTE_EXECUTION_PLAN.md` (452 lines) — Telegram Remote Execution 기획서
+- `docs/records/ConnectAI/timeline.md` (422 lines) — Project Timeline
- `docs/AgentEngine_Architecture.md` (314 lines) — AgentEngine Architecture Document
- `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
+- `docs/PROJECT_CHRONICLE_GUARD_ROADMAP.md` (43 lines) — Project Chronicle Guard: Search Engine Roadmap
+- `docs/UX_UI_Consistency_Guidelines.md` (44 lines) — UX/UI Consistency Guidelines
+- `docs/docs/records/docs/README.md` (18 lines) — docs Chronicle Records
- `docs/docs/records/docs/bugs/BUG-0001-viewed-integration-retrieval-test-ts-1-59-integration-retrie.md` (16 lines) — Bug: Viewed integrationretrieval.test.ts:1-59 integrationretrieval.test.ts를 통해 ...
- `docs/docs/records/docs/chronicle.config.json` (11 lines) — JSON configuration
- `docs/docs/records/docs/project-profile.md` (31 lines) — Project Profile
-- `docs/docs/records/docs/README.md` (18 lines) — docs Chronicle Records
- `docs/docs/records/docs/timeline.md` (7 lines) — Project Timeline
-- `docs/PROJECT_CHRONICLE_GUARD_ROADMAP.md` (43 lines) — Project Chronicle Guard: Search Engine Roadmap
-- `docs/records/ConnectAI/bugs/BUG-0001-volumes-data-project-antigravity-connectai-프로젝트-코드-리뷰-해줄-수-있.md` (16 lines) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고...
-- `docs/records/ConnectAI/bugs/BUG-0002-지금-내가-분석-요청하고-너가-답을-줄때-아래-템플릿에-맞춰-답을-써주고-있는데-개선-포인트가-있는지-확인해.md` (16 lines) — Bug: 지금 내가 분석 요청하고 너가 답을 줄때 아래 템플릿에 맞춰 답을 써주고 있는데, 개선 포인트가 있는지 확인해줘. ## 내가 보는 위험 가장 큰...
-- `docs/records/ConnectAI/bugs/BUG-0003-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md` (16 lines) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...
-- `docs/records/ConnectAI/bugs/BUG-0004-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md` (16 lines) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...
-- `docs/records/ConnectAI/bugs/BUG-0005-다시한번-답줘-volumes-data-project-antigravity-connectai-내-질문에-대한-.md` (16 lines) — Bug: 다시한번 답줘. /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는...
-- `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/README.md` (18 lines) — Astra Project Chronicle Records
+- `docs/records/ConnectAI/bugs/BUG-0001-volumes-data-project-antigravity-connectai-프로젝트-코드-리뷰-해줄-수-있.md` (16 lines) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고...
+- `docs/records/ConnectAI/bugs/BUG-0002-지금-내가-분석-요청하고-너가-답을-줄때-아래-템플릿에-맞춰-답을-써주고-있는데-개선-포인트가-있는지-확인해.md` (16 lines) — Bug: 지금 내가 분석 요청하고 너가 답을 줄때 아래 템플릿에 맞춰 답을 써주고 있는데, 개선 포인트가 있는지 확인해줘. ## 내가 보는 위험 가장 큰...
+- `docs/records/ConnectAI/bugs/BUG-0003-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md` (16 lines) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...
+- `docs/records/ConnectAI/bugs/BUG-0004-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md` (16 lines) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...
+- `docs/records/ConnectAI/bugs/BUG-0005-다시한번-답줘-volumes-data-project-antigravity-connectai-내-질문에-대한-.md` (16 lines) — Bug: 다시한번 답줘. /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는...
+- `docs/records/ConnectAI/bugs/BUG-0006-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md` (16 lines) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...
## VS Code Extension Surface
- **Extension ID**: `g1nation.astra`
@@ -242,7 +242,7 @@ flowchart LR
- `g1nation.calendar.refresh` — Astra: Google Calendar 새로고침 📅
- `g1nation.calendar.connectOAuth` — Astra: Google Calendar OAuth 연결 (쓰기) 🔐
- `g1nation.devilAgent.toggle` — Astra: Toggle Devil Agent 🎭
-- **Configuration** (146 settings):
+- **Configuration** (149 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).
@@ -303,7 +303,7 @@ flowchart LR
- `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.
- - _…and 86 more_
+ - _…and 89 more_
## Dependencies
- **Runtime** (2): `@lmstudio/sdk`, `pdf-parse`
@@ -351,7 +351,7 @@ Astra는 대표님의 명시적인 승인 하에 로컬 시스템의 강력한
**Designed for High-Performance Decision Making.**
Copyright (C) **g1nation**. All rights reserved.
-_Last auto-scan: 2026-06-12T07:39:29.082Z · signature `72294281`_
+_Last auto-scan: 2026-06-12T14:30:58.311Z · signature `314f69`_
## Purpose
diff --git a/.astra/project-context/scan-cache.json b/.astra/project-context/scan-cache.json
index 8dd258d..4db3e04 100644
--- a/.astra/project-context/scan-cache.json
+++ b/.astra/project-context/scan-cache.json
@@ -1,10 +1,10 @@
{
"version": 1,
- "generatedAt": "2026-06-12T07:39:29.157Z",
+ "generatedAt": "2026-06-12T14:30:58.350Z",
"files": {
"src/agent/actions/brainOps.ts": {
- "mtimeMs": 1779764602582.9768,
- "size": 2696,
+ "mtimeMs": 1779634187000,
+ "size": 2642,
"lines": 54,
"role": "",
"imports": [
@@ -14,8 +14,8 @@
]
},
"src/agent/actions/calendar.ts": {
- "mtimeMs": 1781152132419.819,
- "size": 3755,
+ "mtimeMs": 1781260027000,
+ "size": 3689,
"lines": 66,
"role": "",
"imports": [
@@ -26,8 +26,8 @@
]
},
"src/agent/actions/fileCreateEdit.ts": {
- "mtimeMs": 1779764602583.981,
- "size": 3336,
+ "mtimeMs": 1779634159000,
+ "size": 3263,
"lines": 73,
"role": "",
"imports": [
@@ -37,8 +37,8 @@
]
},
"src/agent/actions/fileDeleteRead.ts": {
- "mtimeMs": 1779764602584.9866,
- "size": 2097,
+ "mtimeMs": 1779634168000,
+ "size": 2053,
"lines": 44,
"role": "",
"imports": [
@@ -48,8 +48,8 @@
]
},
"src/agent/actions/listFiles.ts": {
- "mtimeMs": 1779764602584.9866,
- "size": 1501,
+ "mtimeMs": 1779634179000,
+ "size": 1470,
"lines": 31,
"role": "",
"imports": [
@@ -59,8 +59,8 @@
]
},
"src/agent/actions/runCommand.ts": {
- "mtimeMs": 1779764602585.998,
- "size": 945,
+ "mtimeMs": 1779634168000,
+ "size": 925,
"lines": 20,
"role": "",
"imports": [
@@ -69,8 +69,8 @@
]
},
"src/agent/actions/sheets.ts": {
- "mtimeMs": 1779764602586.8142,
- "size": 4186,
+ "mtimeMs": 1779634216000,
+ "size": 4099,
"lines": 87,
"role": "",
"imports": [
@@ -80,8 +80,8 @@
]
},
"src/agent/actions/tasks.ts": {
- "mtimeMs": 1779764602586.8142,
- "size": 3658,
+ "mtimeMs": 1779634214000,
+ "size": 3589,
"lines": 69,
"role": "",
"imports": [
@@ -91,8 +91,8 @@
]
},
"src/agent/actions/types.ts": {
- "mtimeMs": 1779764602587.8208,
- "size": 2512,
+ "mtimeMs": 1779634104000,
+ "size": 2471,
"lines": 41,
"role": "",
"imports": [
@@ -100,9 +100,19 @@
"src/agent"
]
},
+ "src/agent/actions/webFetch.ts": {
+ "mtimeMs": 1781262703000,
+ "size": 2032,
+ "lines": 43,
+ "role": "",
+ "imports": [
+ "src/agent/actions/types",
+ "src/lib/contextBuilders/urlContext"
+ ]
+ },
"src/agent/attrParsers.ts": {
- "mtimeMs": 1781152115192.5432,
- "size": 4985,
+ "mtimeMs": 1781260027000,
+ "size": 4864,
"lines": 121,
"role": "",
"imports": [
@@ -111,8 +121,8 @@
]
},
"src/agent/handlePrompt/applyAutoContinuation.ts": {
- "mtimeMs": 1779764602588.8245,
- "size": 7994,
+ "mtimeMs": 1779634654000,
+ "size": 7835,
"lines": 159,
"role": "",
"imports": [
@@ -125,9 +135,9 @@
]
},
"src/agent/handlePrompt/buildAgentModeSystemPrompt.ts": {
- "mtimeMs": 1781156303654.8252,
- "size": 4330,
- "lines": 78,
+ "mtimeMs": 1781267199000,
+ "size": 5174,
+ "lines": 94,
"role": "",
"imports": [
"src/lib/contextBuilders/systemPromptShaping",
@@ -137,9 +147,9 @@
]
},
"src/agent/handlePrompt/buildAstraModeSystemPrompt.ts": {
- "mtimeMs": 1781156248693.8586,
- "size": 6827,
- "lines": 105,
+ "mtimeMs": 1781264806000,
+ "size": 7037,
+ "lines": 108,
"role": "",
"imports": [
"src/lib/contextBuilders/localProjectIntent",
@@ -149,8 +159,8 @@
]
},
"src/agent/handlePrompt/buildModeBridgeContext.ts": {
- "mtimeMs": 1779764602590.831,
- "size": 2912,
+ "mtimeMs": 1779634537000,
+ "size": 2855,
"lines": 57,
"role": "",
"imports": [
@@ -161,8 +171,8 @@
]
},
"src/agent/handlePrompt/buildTurnContextBlocks.ts": {
- "mtimeMs": 1779764602590.831,
- "size": 4974,
+ "mtimeMs": 1779634584000,
+ "size": 4857,
"lines": 117,
"role": "",
"imports": [
@@ -179,8 +189,8 @@
]
},
"src/agent/handlePrompt/computeBudgetedRequest.ts": {
- "mtimeMs": 1779764602591.863,
- "size": 8252,
+ "mtimeMs": 1779634641000,
+ "size": 8091,
"lines": 161,
"role": "",
"imports": [
@@ -191,8 +201,8 @@
]
},
"src/agent/handlePrompt/processFinalAnswer.ts": {
- "mtimeMs": 1779764602591.863,
- "size": 6606,
+ "mtimeMs": 1779634891000,
+ "size": 6459,
"lines": 147,
"role": "",
"imports": [
@@ -211,15 +221,15 @@
]
},
"src/agent/hangulHygiene.ts": {
- "mtimeMs": 1781239601929.7876,
+ "mtimeMs": 1781260027000,
"size": 3244,
"lines": 61,
"role": "한·영 깨진 토큰 감지·수리 — 소형 로컬 모델의 토큰 붕괴 보정. 증상: 한국어 단어 중간에 영문 토큰이 섞임 — \"덩어리\"→\"덩ey\", \"결과적으로\"→\"결ently\". 프롬프트 규칙([출력 위생])으로는 못 막는다 — 지시 불이행이 아니라 디코딩 사고라서. 보정: 결정론 감지(아래 패턴) + 발견 시 1회 LLM 수리 패스. - 감지 패턴: 한글 음절 ",
"imports": []
},
"src/agent/llm/callNonStreaming.ts": {
- "mtimeMs": 1779764602592.8665,
- "size": 4334,
+ "mtimeMs": 1779633563000,
+ "size": 4233,
"lines": 101,
"role": "",
"imports": [
@@ -232,8 +242,8 @@
]
},
"src/agent/llm/createStreamingRequest.ts": {
- "mtimeMs": 1779764602593.8696,
- "size": 9137,
+ "mtimeMs": 1779633585000,
+ "size": 8968,
"lines": 169,
"role": "",
"imports": [
@@ -247,8 +257,8 @@
]
},
"src/agent/llm/devilRebuttal.ts": {
- "mtimeMs": 1779764602593.8696,
- "size": 3012,
+ "mtimeMs": 1779633604000,
+ "size": 2938,
"lines": 74,
"role": "",
"imports": [
@@ -258,8 +268,8 @@
]
},
"src/agent/llm/streamChatOnce.ts": {
- "mtimeMs": 1779764602594.8728,
- "size": 5970,
+ "mtimeMs": 1779633587000,
+ "size": 5834,
"lines": 136,
"role": "",
"imports": [
@@ -269,8 +279,8 @@
]
},
"src/agent/misc.ts": {
- "mtimeMs": 1779764602594.8728,
- "size": 2126,
+ "mtimeMs": 1779633631000,
+ "size": 2070,
"lines": 56,
"role": "",
"imports": [
@@ -281,8 +291,8 @@
]
},
"src/agent/multiAgent/callRoleAgent.ts": {
- "mtimeMs": 1779764602595.8782,
- "size": 4770,
+ "mtimeMs": 1779633728000,
+ "size": 4666,
"lines": 104,
"role": "",
"imports": [
@@ -294,8 +304,8 @@
]
},
"src/agent/multiAgent/workflow.ts": {
- "mtimeMs": 1779764602595.8782,
- "size": 5650,
+ "mtimeMs": 1779633889000,
+ "size": 5533,
"lines": 117,
"role": "",
"imports": [
@@ -309,9 +319,9 @@
]
},
"src/agent/postAnswerHooks/index.ts": {
- "mtimeMs": 1781232089341.6956,
- "size": 12177,
- "lines": 251,
+ "mtimeMs": 1781269525000,
+ "size": 13633,
+ "lines": 276,
"role": "Post-answer hook registry — 답변 완료 후 실행되는 부가 작업 모음. 새 hook 추가 = 1 객체 push. agent.ts 는 이 배열을 iterate 만 함. 현재 등록 순서 (v2.2.197): 1. devilRebuttal — Devil Agent 반박 카드 (비활성 시 silent skip) 2. postHocSelfChec",
"imports": [
"src/agent/postAnswerHooks/types",
@@ -325,11 +335,13 @@
"src/intelligence/reflectionStore",
"src/intelligence/gapDetector",
"src/intelligence/skillScore",
- "src/config"
+ "src/config",
+ "src/extension/featureConceptMap",
+ "src/lib/contextBuilders/selfAssessContext"
]
},
"src/agent/postAnswerHooks/types.ts": {
- "mtimeMs": 1781144501440.8574,
+ "mtimeMs": 1781260027000,
"size": 2345,
"lines": 52,
"role": "Post-Answer Hook 인터페이스 — 답변 streaming 완료 후 실행되는 부가 작업. 옛 구조: agent.ts 의 maybeEmitDevilRebuttal, maybePostHocSelfCheck, maybeRunTermValidator 3개 private method. 새 hook 추가 시 (1) method 정의 (2) import (3)",
@@ -338,15 +350,15 @@
]
},
"src/agent/postHocSelfCheck.ts": {
- "mtimeMs": 1780033021215.5054,
+ "mtimeMs": 1781006628000,
"size": 8943,
"lines": 230,
"role": "Post-hoc Self-Check — 답변 완료 후 LLM 한 번 호출로 3가지 평가. 사용자 제안: \"[Self-Check] 단계 — 이 답변이 사용자 질문에 직접 답하는가 / 규칙 준수 / 논리 모순 없는가\". 기존 CoVe (v2.2.184) 와 차이: - CoVe = 답변 작성 전 모델에게 self-verify 지시 (instructional, 1",
"imports": []
},
"src/agent/sessions/compressSummary.ts": {
- "mtimeMs": 1779764602596.8809,
- "size": 2780,
+ "mtimeMs": 1779633584000,
+ "size": 2719,
"lines": 61,
"role": "",
"imports": [
@@ -356,7 +368,7 @@
]
},
"src/agent/termValidator.ts": {
- "mtimeMs": 1780278698973.1787,
+ "mtimeMs": 1781006628000,
"size": 8156,
"lines": 202,
"role": "Post-generation Term Validator — 답변 완료 후 정규식/사전 기반 결정론적 스캔. v2.2.192 의 Terminology Dictionary 가 instructional (LLM 에게 표준 표기 사용 지시) 이면, 이건 deterministic — LLM 이 지시를 안 따랐을 때 catch. Glossary 파싱 — 두 패턴 인식",
@@ -365,9 +377,9 @@
]
},
"src/agent.ts": {
- "mtimeMs": 1781239617439.6067,
- "size": 88521,
- "lines": 1634,
+ "mtimeMs": 1781268962000,
+ "size": 91458,
+ "lines": 1670,
"role": "",
"imports": [
"src/utils",
@@ -379,7 +391,9 @@
"src/lib/contextBuilders/astraModeArchitecture",
"src/lib/contextBuilders/scheduleContext",
"src/lib/contextBuilders/selfAssessContext",
+ "src/extension/featureInventory",
"src/lib/contextBuilders/urlContext",
+ "src/features/web/webFetch",
"src/intelligence/correctionLoop",
"src/lib/contextBuilders/multiAgentRouting",
"src/lib/contextBuilders/thinkingPartnerContract",
@@ -431,6 +445,7 @@
"src/agent/actions/fileDeleteRead",
"src/agent/actions/runCommand",
"src/agent/actions/listFiles",
+ "src/agent/actions/webFetch",
"src/agent/actions/brainOps",
"src/agent/actions/calendar",
"src/agent/actions/sheets",
@@ -448,13 +463,12 @@
"src/intelligence/confidenceEngine",
"src/features/providers",
"src/agent/hangulHygiene",
- "src/features/selfReflector/selfReflectorExecution",
- "src/features/selfReflector/selfReflectorHollow"
+ "src/features/selfReflector/selfReflectorExecution"
]
},
"src/agents/AgentWorkflowManager.ts": {
- "mtimeMs": 1779764602597.9622,
- "size": 2798,
+ "mtimeMs": 1779609976000,
+ "size": 2729,
"lines": 69,
"role": "",
"imports": [
@@ -464,8 +478,8 @@
]
},
"src/agents/factory.ts": {
- "mtimeMs": 1779764602598.9656,
- "size": 19832,
+ "mtimeMs": 1779601097000,
+ "size": 19504,
"lines": 328,
"role": "",
"imports": [
@@ -474,8 +488,8 @@
]
},
"src/bridge.ts": {
- "mtimeMs": 1779411812096.6685,
- "size": 10768,
+ "mtimeMs": 1779492050000,
+ "size": 10526,
"lines": 242,
"role": "",
"imports": [
@@ -487,21 +501,21 @@
]
},
"src/config.ts": {
- "mtimeMs": 1781167857164.7136,
- "size": 35286,
- "lines": 637,
+ "mtimeMs": 1781271211000,
+ "size": 36879,
+ "lines": 661,
"role": "",
"imports": []
},
"src/core/astraPath.ts": {
- "mtimeMs": 1778037123135.2776,
- "size": 1832,
+ "mtimeMs": 1778169995000,
+ "size": 1782,
"lines": 50,
"role": "Astra Path Resolver (경로 해결기) Astra의 모든 데이터 파일(.astra 디렉토리)의 경로를 중앙에서 관리합니다. 확장 프로그램의 설치 경로(extensionUri) 기반으로 .astra 디렉토리를 해결하여, 사용자 프로젝트 루트가 아닌 ConnectAI 패키지 내부에 데이터를 저장합니다. 이 모듈은 AAL(Astra Autonomou",
"imports": []
},
"src/core/conflict.ts": {
- "mtimeMs": 1778038174478.8147,
+ "mtimeMs": 1778169995000,
"size": 1726,
"lines": 30,
"role": "",
@@ -510,46 +524,47 @@
]
},
"src/core/dataProcessor.ts": {
- "mtimeMs": 1778038193232.0127,
+ "mtimeMs": 1778169995000,
"size": 3235,
"lines": 96,
"role": "Aggregate result type definition",
"imports": []
},
"src/core/errorHandler.ts": {
- "mtimeMs": 1777511752606.2458,
- "size": 2354,
+ "mtimeMs": 1777808065000,
+ "size": 2305,
"lines": 49,
"role": "",
"imports": []
},
"src/core/errors.ts": {
- "mtimeMs": 1778037081022.028,
- "size": 958,
+ "mtimeMs": 1778169995000,
+ "size": 924,
"lines": 34,
"role": "g1nation Custom Error Classes",
"imports": []
},
"src/core/events.ts": {
- "mtimeMs": 1778028987396.9893,
- "size": 1028,
+ "mtimeMs": 1777808065000,
+ "size": 993,
"lines": 35,
"role": "",
"imports": []
},
"src/core/health.ts": {
- "mtimeMs": 1778038139567.3984,
- "size": 2873,
- "lines": 79,
+ "mtimeMs": 1781272867000,
+ "size": 8298,
+ "lines": 167,
"role": "",
"imports": [
"src/config",
- "src/utils"
+ "src/utils",
+ "src/features/datacollect/bridgeClient"
]
},
"src/core/lock.ts": {
- "mtimeMs": 1779764602600.9722,
- "size": 3962,
+ "mtimeMs": 1779609906000,
+ "size": 3869,
"lines": 93,
"role": "",
"imports": [
@@ -557,8 +572,8 @@
]
},
"src/core/queue.ts": {
- "mtimeMs": 1778666871393.5244,
- "size": 2509,
+ "mtimeMs": 1778674336000,
+ "size": 2428,
"lines": 81,
"role": "",
"imports": [
@@ -566,7 +581,7 @@
]
},
"src/core/responseRecovery.ts": {
- "mtimeMs": 1779764602600.9722,
+ "mtimeMs": 1779598805000,
"size": 16753,
"lines": 310,
"role": "Response Recovery — Thought Quarantine + Final-only Retry + Auto-Continuation The user already asked their question; they're waiting for an answer, not for a chance to babysit the generation engine. S",
@@ -575,8 +590,8 @@
]
},
"src/core/services.ts": {
- "mtimeMs": 1779764602601.9775,
- "size": 7622,
+ "mtimeMs": 1779535877000,
+ "size": 7446,
"lines": 176,
"role": "",
"imports": [
@@ -585,8 +600,8 @@
]
},
"src/core/session.ts": {
- "mtimeMs": 1777511752609.8882,
- "size": 2873,
+ "mtimeMs": 1777808065000,
+ "size": 2785,
"lines": 88,
"role": "",
"imports": [
@@ -595,14 +610,14 @@
]
},
"src/core/statusBar.ts": {
- "mtimeMs": 1778028987401.3042,
- "size": 2057,
+ "mtimeMs": 1777808065000,
+ "size": 2000,
"lines": 57,
"role": "",
"imports": []
},
"src/core/telemetry.ts": {
- "mtimeMs": 1778666901466.1726,
+ "mtimeMs": 1778674336000,
"size": 5442,
"lines": 129,
"role": "Telemetry — append-only usage events to .astra/usage.jsonl Why local-file telemetry instead of a webview dashboard or remote endpoint: - Astra is local-first. No data leaves the machine. - JSONL is tr",
@@ -612,8 +627,8 @@
]
},
"src/core/transaction.ts": {
- "mtimeMs": 1778549008897.4194,
- "size": 4590,
+ "mtimeMs": 1778251556000,
+ "size": 4458,
"lines": 132,
"role": "",
"imports": [
@@ -621,50 +636,50 @@
"src/utils"
]
},
+ "src/docs/records/src/README.md": {
+ "mtimeMs": 1777949473000,
+ "size": 422,
+ "lines": 18,
+ "role": "src Chronicle Records",
+ "imports": []
+ },
"src/docs/records/src/bugs/BUG-0001-edited-agent-ts-edited-agent-ts-edited-agent-ts-edited-agent.md": {
- "mtimeMs": 1778028987403.465,
- "size": 1813,
+ "mtimeMs": 1777949473000,
+ "size": 1797,
"lines": 16,
"role": "Bug: Edited agent.ts Edited agent.ts Edited agent.ts Edited agent.ts Edited agent.ts ...",
"imports": []
},
- "src/docs/records/src/bugs/BUG-0002-viewed-agent-ts-2159-2206-제공해주신-세부-파일-구조와-지식-수집-워크플로우-관점의-코드.md": {
- "mtimeMs": 1778028987403.9697,
- "size": 2217,
+ "src/docs/records/src/bugs/BUG-0002-viewed-agent-ts-2159-2206-제공해주신-세부-파일-구조와-지식-수집-워크플로우-관점의-코드.md": {
+ "mtimeMs": 1777949638000,
+ "size": 2201,
"lines": 16,
"role": "Bug: Viewed agent.ts:2159-2206 제공해주신 세부 파일 구조와 지식 수집 워크플로우 관점의 코드리뷰 요청을 정독했습니다. 이...",
"imports": []
},
"src/docs/records/src/chronicle.config.json": {
- "mtimeMs": 1778028987403.9697,
- "size": 528,
+ "mtimeMs": 1777949638000,
+ "size": 517,
"lines": 11,
"role": "JSON configuration",
"imports": []
},
"src/docs/records/src/project-profile.md": {
- "mtimeMs": 1778028987404.973,
- "size": 613,
+ "mtimeMs": 1777949473000,
+ "size": 582,
"lines": 31,
"role": "Project Profile",
"imports": []
},
- "src/docs/records/src/README.md": {
- "mtimeMs": 1778028987402.338,
- "size": 440,
- "lines": 18,
- "role": "src Chronicle Records",
- "imports": []
- },
"src/docs/records/src/timeline.md": {
- "mtimeMs": 1778028987405.4775,
- "size": 391,
+ "mtimeMs": 1777949638000,
+ "size": 381,
"lines": 10,
"role": "Project Timeline",
"imports": []
},
"src/extension/brainBootstrap.ts": {
- "mtimeMs": 1781165381545.3738,
+ "mtimeMs": 1781260027000,
"size": 4679,
"lines": 90,
"role": "두뇌(Second Brain) 기본 위치 부트스트랩 — 첫 실행 온보딩. 문제: 두뇌 미설정 시 config 가 ~/.g1nation-brain(숨김 점폴더)로 조용히 폴백했다. - 폴더가 실제로 생성되지 않고, 설정 UI 에도 보이지 않으며, 숨김 폴더라 비개발자 사용자는 자신의 성장 데이터(레슨·기억·지식)가 어디 쌓이는지 알 수 없다. - 컴퓨터마다 ",
@@ -673,8 +688,8 @@
]
},
"src/extension/calendarSetup.ts": {
- "mtimeMs": 1779764602603.984,
- "size": 10765,
+ "mtimeMs": 1779631650000,
+ "size": 10551,
"lines": 214,
"role": "",
"imports": [
@@ -682,7 +697,7 @@
]
},
"src/extension/embeddingBootstrap.ts": {
- "mtimeMs": 1781172021718.2744,
+ "mtimeMs": 1781260027000,
"size": 4667,
"lines": 80,
"role": "임베딩 모델 자동 감지 부트스트랩 — 하이브리드(sparse+dense) 검색 온보딩. 문제: g1nation.embeddingModel 기본값이 '' (비활성) — LM Studio 에 임베딩 모델이 로드돼 있어도 사용자가 설정 키와 모델명 문자열을 알아야만 켜진다. 비개발자 사용자에게는 사실상 영구 비활성. 측정 결과 임베딩 블렌드가 어휘 갭 (\"심판\"",
@@ -691,7 +706,7 @@
]
},
"src/extension/evalCommands.ts": {
- "mtimeMs": 1781147900732.2805,
+ "mtimeMs": 1781260027000,
"size": 29561,
"lines": 521,
"role": "",
@@ -715,19 +730,27 @@
"src/intelligence/learningQueue"
]
},
+ "src/extension/featureConceptMap.ts": {
+ "mtimeMs": 1781274608000,
+ "size": 7832,
+ "lines": 134,
+ "role": "기능 개념 지도 — vscode 의존 없는 순수 모듈 (테스트 용이). 두 소비처: 1. featureInventory.ts — \"ASTRA 기능 인벤토리\" 마크다운 생성 (LLM 프롬프트 주입용) 2. postAnswerHooks inventory-cross-check — 답변이 이미 구현된 기능을 신규 제안하는지 결정론적으로 검사해 정정 푸터를 붙임 2",
+ "imports": []
+ },
"src/extension/featureInventory.ts": {
- "mtimeMs": 1781234194666.4055,
- "size": 7556,
- "lines": 115,
+ "mtimeMs": 1781273606000,
+ "size": 7938,
+ "lines": 127,
"role": "ASTRA 기능 인벤토리 자동 생성 — 자기 지식 구식화의 근본 수정. 문제 (반복 발생한 심각 버그): ASTRA 의 자기 지식이 사람이 쓴 스냅샷 (selfIdentity 블록, \"ASTRA 자기 아키텍처\" 위키 문서)에 의존했다. 스냅샷은 작성 시점에 박제되므로 릴리스마다 구식이 되고, ASTRA 는 자기 평가·개선 제안에서 이미 있는 기능을 \"신규 ",
"imports": [
"src/utils",
- "src/agent/postAnswerHooks"
+ "src/agent/postAnswerHooks",
+ "src/extension/featureConceptMap"
]
},
"src/extension/initialSetup.ts": {
- "mtimeMs": 1779764602604.987,
- "size": 2982,
+ "mtimeMs": 1779631670000,
+ "size": 2922,
"lines": 60,
"role": "",
"imports": [
@@ -735,8 +758,8 @@
]
},
"src/extension/lessonCommands.ts": {
- "mtimeMs": 1779764602604.987,
- "size": 2712,
+ "mtimeMs": 1779632141000,
+ "size": 2666,
"lines": 46,
"role": "",
"imports": [
@@ -746,8 +769,8 @@
]
},
"src/extension/lessons.ts": {
- "mtimeMs": 1781234976058.6348,
- "size": 7786,
+ "mtimeMs": 1781260027000,
+ "size": 7646,
"lines": 140,
"role": "",
"imports": [
@@ -758,8 +781,8 @@
]
},
"src/extension/providerCommands.ts": {
- "mtimeMs": 1779764602605.9907,
- "size": 7701,
+ "mtimeMs": 1781260027000,
+ "size": 7565,
"lines": 136,
"role": "",
"imports": [
@@ -771,8 +794,8 @@
]
},
"src/extension/scaffoldCommand.ts": {
- "mtimeMs": 1779764602607.0142,
- "size": 2350,
+ "mtimeMs": 1779632128000,
+ "size": 2300,
"lines": 50,
"role": "",
"imports": [
@@ -781,8 +804,8 @@
]
},
"src/extension/settingsSetup.ts": {
- "mtimeMs": 1780968650740.2703,
- "size": 3361,
+ "mtimeMs": 1781006628000,
+ "size": 3294,
"lines": 67,
"role": "",
"imports": [
@@ -794,8 +817,8 @@
]
},
"src/extension/telegramCommands.ts": {
- "mtimeMs": 1779764602608.0176,
- "size": 4905,
+ "mtimeMs": 1779632383000,
+ "size": 4802,
"lines": 103,
"role": "",
"imports": [
@@ -804,8 +827,8 @@
]
},
"src/extension.ts": {
- "mtimeMs": 1781232046994.3347,
- "size": 21727,
+ "mtimeMs": 1781260027000,
+ "size": 21309,
"lines": 418,
"role": "",
"imports": [
@@ -851,9 +874,16 @@
"src/features/growth/conflictScan"
]
},
+ "src/features/_shared/eventSourcedStore.ts": {
+ "mtimeMs": 1781006628000,
+ "size": 3216,
+ "lines": 83,
+ "role": "Generic event-sourced store — append-only .jsonl 파일 1개를 읽고/쓰는 공통 기반. 배경: customers, hire, runway, feedback 4개 store 가 같은 패턴 4번 반복 (getXFilePath / readX / appendX / countX) — byte-for-byte 중복 ~240줄. 한 ",
+ "imports": []
+ },
"src/features/approval/approvalPanelProvider.ts": {
- "mtimeMs": 1778664480470.9922,
- "size": 7285,
+ "mtimeMs": 1778674336000,
+ "size": 7132,
"lines": 153,
"role": "",
"imports": [
@@ -862,8 +892,8 @@
]
},
"src/features/approval/approvalQueue.ts": {
- "mtimeMs": 1778549008899.4456,
- "size": 4851,
+ "mtimeMs": 1778251548000,
+ "size": 4722,
"lines": 129,
"role": "",
"imports": [
@@ -871,8 +901,8 @@
]
},
"src/features/approval/approvalStatusBar.ts": {
- "mtimeMs": 1778549008899.4456,
- "size": 1642,
+ "mtimeMs": 1778251623000,
+ "size": 1601,
"lines": 41,
"role": "",
"imports": [
@@ -880,8 +910,8 @@
]
},
"src/features/astraOffice/index.ts": {
- "mtimeMs": 1779065453862.6475,
- "size": 807,
+ "mtimeMs": 1781260027000,
+ "size": 789,
"lines": 18,
"role": "Astra Office — public API. 다음 세션에서 추가될 OfficeSnapshot presenter / schema 도 같은 entry 로 노출 예정. 현재 노출: full webview panel HTML 생성 함수. sidebarProvider.ts 는 이 한 줄만 import.",
"imports": [
@@ -892,8 +922,8 @@
]
},
"src/features/astraOffice/presenter.ts": {
- "mtimeMs": 1779065453862.6475,
- "size": 7549,
+ "mtimeMs": 1781260027000,
+ "size": 7368,
"lines": 181,
"role": "Presenter — 옛 AgentWorkState + bubble queue + activity items 를 OfficeSnapshot 으로 변환하는 pure 함수. mini / full view 둘 다 같은 OfficeSnapshot 을 받게 만드는 게 목표. 이번 세션의 범위: 인터페이스 + 스텁. 실제 wiring 은 다음 세션에서: - sideb",
"imports": [
@@ -903,8 +933,8 @@
]
},
"src/features/astraOffice/schema.ts": {
- "mtimeMs": 1779065453864.1523,
- "size": 10936,
+ "mtimeMs": 1781260027000,
+ "size": 10631,
"lines": 305,
"role": "OfficeSnapshot — Astra Office 의 도메인 타입. 동시성 진실 (docs/ASTRAOFFICEREFACTOR.md §1): dispatcher 는 직렬이라 한 시점에 active agent 는 0 또는 1명. 이걸 데이터로 강제하는 게 이 타입의 핵심 역할. 이 세션에서는 타입 + validator + empty factory 만. 백",
"imports": [
@@ -912,29 +942,29 @@
]
},
"src/features/astraOffice/view/layoutSchema.ts": {
- "mtimeMs": 1779065453864.8176,
- "size": 6655,
+ "mtimeMs": 1781260027000,
+ "size": 6475,
"lines": 180,
"role": "Pixel Office layout 저장 스키마 — workspaceState 의 g1nation.pixelOfficeLayout 키 에 저장되는 객체의 런타임 validator + v1 → v2 migration. 옛 runtime.ts 의 isV2Snap() heuristic 을 정식 schema 로 격상. webview 에서 받는 즉시 한 번 통과시키",
"imports": []
},
"src/features/astraOffice/view/officeBody.ts": {
- "mtimeMs": 1779065453865.8494,
- "size": 4207,
+ "mtimeMs": 1781260027000,
+ "size": 4104,
"lines": 103,
"role": "",
"imports": []
},
"src/features/astraOffice/view/officeStyles.ts": {
- "mtimeMs": 1779065453866.8667,
- "size": 26165,
+ "mtimeMs": 1781260027000,
+ "size": 25746,
"lines": 419,
"role": "",
"imports": []
},
"src/features/astraOffice/view/panelHtml.ts": {
- "mtimeMs": 1779065453867.871,
- "size": 949,
+ "mtimeMs": 1781260027000,
+ "size": 923,
"lines": 26,
"role": "Full Astra Office webview HTML composition. 옛 sidebarProvider.ts 의 거대한 pixelOfficePanelHtml 을 4개 파일로 분리한 entry. 이번 세션은 동작 동등 분리 만. 다음 세션에 mini view 와 공통 presenter 도입.",
"imports": [
@@ -944,14 +974,14 @@
]
},
"src/features/astraOffice/view/runtime.ts": {
- "mtimeMs": 1779764602610.0264,
- "size": 95995,
- "lines": 1953,
+ "mtimeMs": 1781260027000,
+ "size": 93954,
+ "lines": 1963,
"role": "자동 분리: src/sidebarProvider.ts 4002-5116 (IIFE 본문) 에서 추출. 동작 동등. ${assets.derivedBase} placeholder 는 panelHtml 에서 .replace() 로 실제 값 주입. 다음 세션에서 OfficeSnapshot 기반으로 단계적으로 잘라낼 예정.",
"imports": []
},
"src/features/briefing/dailyBriefing.ts": {
- "mtimeMs": 1781170096875.4578,
+ "mtimeMs": 1781260027000,
"size": 9101,
"lines": 184,
"role": "데일리 브리핑 워처 — 평일(월~금) KST 09:30 에 \"오늘의 할 일\"을 텔레그램으로 발송. 소스: 1. Google Calendar — iCal 캐시 새로고침 후 오늘 일정 (readCalendarEventsCache) 2. Google Tasks — 오늘 마감 + 기한 지난 미완료 + 날짜 없는 [조건부] task (listTasks) 발송 조건 ",
@@ -965,8 +995,8 @@
]
},
"src/features/calendar/calendarApi.ts": {
- "mtimeMs": 1781169418789.298,
- "size": 9935,
+ "mtimeMs": 1781260027000,
+ "size": 9717,
"lines": 218,
"role": "Google Calendar API v3 — event create/list 호출. access token 은 caller 가 직접 주입한다. 만료 처리는 withFreshAccessToken 헬퍼가 refresh token 으로 갱신 → 호출 → 401 발생 시 한 번 더 갱신 + 재시도. 외부 라이브러리(googleapis) 안 씀 — Calendar ",
"imports": [
@@ -975,8 +1005,8 @@
]
},
"src/features/calendar/calendarCache.ts": {
- "mtimeMs": 1781152082335.483,
- "size": 13392,
+ "mtimeMs": 1781260027000,
+ "size": 13121,
"lines": 271,
"role": "Google Calendar (iCal) 캐시 — fetch + parse + 회사 shared/calendarcache.md 에 저장. Connectorigin 의 googlecalendar.py 를 TypeScript / native fetch 로 옮김. OAuth 없음. 사용자가 Google Calendar 설정 → \"비공개 주소(iCal 형식)\" 복",
"imports": [
@@ -984,22 +1014,22 @@
]
},
"src/features/calendar/conflictCheck.ts": {
- "mtimeMs": 1781152051164.7207,
+ "mtimeMs": 1781260027000,
"size": 3481,
"lines": 81,
"role": "Schedule Conflict Check — 일정 생성 전 기존 일정과의 겹침 감지. Self-Evolving OS 마스터 플랜 병렬 트랙 6-2 + 6-3. Requirement Graph 의 일정 필수 요소 \"충돌 확인\" 과 Constitution \"승인 없는 외부 액션 금지\" 의 실행 계층: - 에이전트가 로 ",
"imports": []
},
"src/features/calendar/icsParser.ts": {
- "mtimeMs": 1779065453870.9949,
- "size": 4937,
+ "mtimeMs": 1778934638000,
+ "size": 4823,
"lines": 114,
"role": "Minimal ICS parser — no library deps. Connectorigin 의 Python 버전을 그대로 옮겼고, 본 함수는 pure 라서 단위테스트가 쉽다. 처리 범위: - VEVENT 블록 추출 - line continuation (다음 줄이 공백 시작) 펼치기 - SUMMARY / DESCRIPTION / LOCATION / DTST",
"imports": []
},
"src/features/calendar/index.ts": {
- "mtimeMs": 1781152148411.5476,
- "size": 877,
+ "mtimeMs": 1781260027000,
+ "size": 829,
"lines": 48,
"role": "",
"imports": [
@@ -1012,14 +1042,14 @@
]
},
"src/features/calendar/oauth.ts": {
- "mtimeMs": 1780654426655.6082,
- "size": 10986,
+ "mtimeMs": 1781006628000,
+ "size": 10750,
"lines": 236,
"role": "Google OAuth 2.0 — loopback (Desktop app) 흐름. Google 은 Desktop 앱 OAuth client 에 대해 http://127.0.0.1: redirect URI 를 허용한다. 본 모듈은: 1. ephemeral port 에 일회용 HTTP 서버 띄움 2. 사용자 브라우저로 Google 로",
"imports": []
},
"src/features/calendar/tasksApi.ts": {
- "mtimeMs": 1781160799880.293,
+ "mtimeMs": 1781260027000,
"size": 7421,
"lines": 172,
"role": "Google Tasks API v1 — task create 호출. Calendar / Sheets 와 같은 OAuth 토큰을 공유한다 (scope 에 tasks 포함). Tasks 는 date-only 모델(시간 없음)이라 /meet 의 액션 아이템처럼 \"시간 없이 마감일만 있는 할 일\" 에 자연스럽게 맞는다. 외부 라이브러리 안 씀 — Tasks API",
@@ -1028,17 +1058,29 @@
]
},
"src/features/company/agents.ts": {
- "mtimeMs": 1779764602611.032,
- "size": 38122,
+ "mtimeMs": 1779608334000,
+ "size": 37591,
"lines": 531,
"role": "기본 에이전트 로스터 — 1인 기업 모드의 출고 디폴트. 설계 의도: 소프트웨어/게임 개발 IT 회사의 1인 기업 운영을 가정. 한 사람이 기획 → 디자인 → 개발 → QA → 출시 → 운영/마케팅을 모두 책임질 때 필요한 직군을 빠짐없이 커버하되 역할이 겹치지 않게 분리한다. 직군 구분 (혼동 방지): - 기획자(business) : 무엇을 만들지 정의 ",
"imports": [
"src/features/company/types"
]
},
+ "src/features/company/alignmentResearch.ts": {
+ "mtimeMs": 1781261317000,
+ "size": 13558,
+ "lines": 311,
+ "role": "Alignment Self-Research — 사용자에게 묻기 전에 두뇌를 먼저 검색. Intent Alignment 분석기가 만든 openQuestions 를 사용자에게 노출하기 전에, 활성 두뇌(지식 폴더)를 TF-IDF 로 검색해 스스로 답할 수 있는 질문 을 걸러낸다. 답을 찾은 질문은 answeredQuestions 로 옮겨지고(자가 조사 mark",
+ "imports": [
+ "src/core/services",
+ "src/utils",
+ "src/retrieval/brainIndex",
+ "src/retrieval/scoring"
+ ]
+ },
"src/features/company/ceoPlanner.ts": {
- "mtimeMs": 1779764602612.037,
- "size": 12109,
+ "mtimeMs": 1779535966000,
+ "size": 11839,
"lines": 270,
"role": "CEO planner — turns a user prompt into a CompanyTaskPlan. Lifecycle of one planner call: 1. Build the planner system prompt (template + active-agent list). 2. Hit the AI service with the user prompt a",
"imports": [
@@ -1051,8 +1093,8 @@
]
},
"src/features/company/ceoReporter.ts": {
- "mtimeMs": 1779764602613.1416,
- "size": 5076,
+ "mtimeMs": 1779535985000,
+ "size": 4953,
"lines": 123,
"role": "CEO synthesis pass — runs after all specialists have finished. Given the per-agent outputs, this asks the CEO model to produce the final markdown report (✅ 완료 / 🚀 다음 / 💡 인사이트) that the user actually",
"imports": [
@@ -1064,8 +1106,8 @@
]
},
"src/features/company/companyConfig.ts": {
- "mtimeMs": 1778811673797.1216,
- "size": 41035,
+ "mtimeMs": 1778902489000,
+ "size": 40139,
"lines": 896,
"role": "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",
"imports": [
@@ -1074,9 +1116,9 @@
]
},
"src/features/company/dispatcher.ts": {
- "mtimeMs": 1780367676001.7544,
- "size": 70731,
- "lines": 1364,
+ "mtimeMs": 1781262875000,
+ "size": 71180,
+ "lines": 1397,
"role": "Sequential dispatcher for 1인 기업 모드. Drives one company \"turn\": user prompt → CEO planner (JSON {brief, tasks}) → for each task in plan: dispatch one specialist (sequentially) - build specialist prompt",
"imports": [
"src/core/services",
@@ -1103,8 +1145,8 @@
]
},
"src/features/company/dispatcherHelpers.ts": {
- "mtimeMs": 1779764602614.1453,
- "size": 5987,
+ "mtimeMs": 1779631073000,
+ "size": 5866,
"lines": 121,
"role": "",
"imports": [
@@ -1113,9 +1155,9 @@
]
},
"src/features/company/index.ts": {
- "mtimeMs": 1778814836698.1172,
- "size": 2702,
- "lines": 106,
+ "mtimeMs": 1781261331000,
+ "size": 2819,
+ "lines": 113,
"role": "Public API for 1인 기업 모드. Consumers (sidebarProvider, chatHandlers, command handlers) import from this barrel so internal layout can move around without touching every call site.",
"imports": [
"src/features/company/agents",
@@ -1127,13 +1169,14 @@
"src/features/company/sessionStore",
"src/features/company/intentClassifier",
"src/features/company/intentAlignment",
+ "src/features/company/alignmentResearch",
"src/features/company/pixelOfficeState"
]
},
"src/features/company/intentAlignment.ts": {
- "mtimeMs": 1780366738786.6855,
- "size": 18078,
- "lines": 367,
+ "mtimeMs": 1781261252000,
+ "size": 19522,
+ "lines": 387,
"role": "Intent Alignment — 사용자의 자연어 요청을 실행 가능한 작업 조건으로 변환. 사용자는 자기 의도와 배경지식이 에이전트에게 충분히 전달되었다고 착각하는 경향이 있다 (투명성의 착각·지식의 저주·공통 기반 부족). 그래서 에이전트가 즉시 작업에 돌입하면 사용자가 머릿속에 가진 것과 다른 결과를 만들어 낸다. 이 모듈은 그 격차를 메꾸는 한 단계 ",
"imports": [
"src/core/services",
@@ -1142,7 +1185,7 @@
]
},
"src/features/company/intentClassifier.ts": {
- "mtimeMs": 1778819562785.657,
+ "mtimeMs": 1778902489000,
"size": 17372,
"lines": 348,
"role": "Intent classifier for 1인 기업 모드 chat input. The company mode used to route every chat message through the full dispatcher (CEO planner → specialists → CEO synthesis). That meant casual messages like \"고",
@@ -1152,8 +1195,8 @@
]
},
"src/features/company/pipelineTemplates.ts": {
- "mtimeMs": 1780367702872.9678,
- "size": 16572,
+ "mtimeMs": 1781006628000,
+ "size": 16287,
"lines": 285,
"role": "Built-in pipeline templates for 1인 기업 모드. These are blueprints, not data — they're surfaced in the manage panel's \"템플릿에서 추가\" dropdown so a non-developer user can stamp out a working pipeline in one cl",
"imports": [
@@ -1161,23 +1204,23 @@
]
},
"src/features/company/pixelOfficeState.ts": {
- "mtimeMs": 1778843402595.067,
+ "mtimeMs": 1778902489000,
"size": 10025,
"lines": 286,
"role": "Pixel Office — Agent Work Pipeline 상태를 시각화하는 UI Layer 전용 모듈. ─────────────────── 설계 원칙 ─────────────────── 1. Agent 핵심 판단 로직을 절대 바꾸지 않는다. Pipeline 진행, contract 합의, 검수 cycle, 승인 게이트 — 모두 기존 dispatcher ",
"imports": []
},
"src/features/company/promptAssets.ts": {
- "mtimeMs": 1778720117525.2087,
- "size": 6896,
+ "mtimeMs": 1778680887000,
+ "size": 6782,
"lines": 114,
"role": "Inlined prompt assets for the 1인 기업 mode. The CEO planner / reporter / casual-chat prompts are kept as TS string constants rather than loaded from prompts/.md at runtime, for two reasons: 1. Bundling.",
"imports": []
},
"src/features/company/promptBuilder.ts": {
- "mtimeMs": 1779065453877.1128,
- "size": 19037,
- "lines": 314,
+ "mtimeMs": 1781262774000,
+ "size": 18967,
+ "lines": 315,
"role": "System-prompt construction for company-mode agents. Each specialist needs a prompt that includes: - Their identity (name, role, specialty) + optional persona. - The action-tag contract (, ",
"imports": [
"src/features/company/agents",
@@ -1188,29 +1231,29 @@
]
},
"src/features/company/prompts/ceo-chat.md": {
- "mtimeMs": 1778720117527.2378,
- "size": 466,
+ "mtimeMs": 1778680831000,
+ "size": 462,
"lines": 4,
"role": "당신은 {{COMPANY}}의 CEO입니다. 사용자(사장님)와 짧게 인사·안부·잡담을 주고받습니다. - 한국어로 1~3문장. 친근하지만 사장-CEO 관계는 유지. - 인사·안부 질문이면 자연스럽게 응답하세요. 작업 지시가 아니면 굳이 작업 분배 제안 X. - 회사 정체성·최근 결정·추적기 상태가 컨텍스트에 있으면 자연스럽게 활용. - JSON 출력 금지. ",
"imports": []
},
"src/features/company/prompts/ceo-planner.md": {
- "mtimeMs": 1778720117527.2378,
- "size": 3237,
+ "mtimeMs": 1778680831000,
+ "size": 3199,
"lines": 38,
"role": "당신은 \"{{COMPANY}}\"의 CEO입니다. 1인 AI 기업의 사령관이자 오케스트레이터입니다.",
"imports": []
},
"src/features/company/prompts/ceo-report.md": {
- "mtimeMs": 1778720117528.7502,
- "size": 1394,
+ "mtimeMs": 1778680831000,
+ "size": 1373,
"lines": 21,
"role": "당신은 {{COMPANY}}의 CEO입니다. 방금 팀이 작업을 끝냈습니다. 각 에이전트의 산출물을 읽고 사장님께 올릴 종합 보고서를 작성하세요.",
"imports": []
},
"src/features/company/resumeStore.ts": {
- "mtimeMs": 1779764602616.1516,
- "size": 6170,
+ "mtimeMs": 1779608998000,
+ "size": 6030,
"lines": 140,
"role": "Disk persistence for company-turn resume state. 각 turn의 sessionDir 안에 resume.json을 두고, dispatcher가 매 의미 있는 시점(plan 확정 / 각 stage 직후 / abort 시점)에 현재 상태를 덮어쓴다. 재개 시점에는 이 파일을 읽어 nextIndex 부터 dispatch 재개. ",
"imports": [
@@ -1220,8 +1263,8 @@
]
},
"src/features/company/sessionStore.ts": {
- "mtimeMs": 1778720117528.7502,
- "size": 8958,
+ "mtimeMs": 1778680971000,
+ "size": 8727,
"lines": 231,
"role": "Disk persistence for company-mode session artefacts. Each company turn produces a timestamped directory: /.astra/company/sessions/2026-05-13T21-29/ ├─ brief.md ← CEO's task decompositio",
"imports": [
@@ -1230,8 +1273,8 @@
]
},
"src/features/company/telegramReport.ts": {
- "mtimeMs": 1778739949327.3745,
- "size": 8294,
+ "mtimeMs": 1778762677000,
+ "size": 8126,
"lines": 168,
"role": "Telegram mirror for the secretary agent (영숙). After every company turn finishes, this helper takes the CEO synthesis + task list and pushes it to the user's Telegram chat — same behaviour as Connector",
"imports": [
@@ -1243,14 +1286,14 @@
]
},
"src/features/company/types.ts": {
- "mtimeMs": 1778813870251.361,
- "size": 21323,
+ "mtimeMs": 1778902489000,
+ "size": 20877,
"lines": 446,
"role": "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",
"imports": []
},
"src/features/customers/customersStore.ts": {
- "mtimeMs": 1780275713140.8125,
+ "mtimeMs": 1781006628000,
"size": 5722,
"lines": 149,
"role": "고객사 / MRR / 갱신 트래커. 4인 기업의 수입 쪽 — /runway 가 통장과 burn 을 본다면, 여기는 어디서 돈이 들어오나. Salesforce / HubSpot 같은 CRM 아닌 가벼운 event-sourced 로그. 저장 형식: JSON Lines (.jsonl) — append-only event log. 같은 customer 의 여러 이",
@@ -1259,14 +1302,14 @@
]
},
"src/features/datacollect/bridgeClient.ts": {
- "mtimeMs": 1781239127096.5232,
- "size": 8238,
+ "mtimeMs": 1781260027000,
+ "size": 8060,
"lines": 178,
"role": "",
"imports": []
},
"src/features/datacollect/handlers.ts": {
- "mtimeMs": 1781239638273.816,
+ "mtimeMs": 1781260027000,
"size": 46089,
"lines": 821,
"role": "Datacollect handlers — /benchmark · /youtube · /blog · /wikify · /meet. (/research(NotebookLM)는 v2.2.205 에서 제거 — 로컬 Datacollect 앱 전용으로 분리) v2.2.201 에서 slashRouter.ts 에서 분리. Datacollect bridge (port 30",
@@ -1285,7 +1328,7 @@
]
},
"src/features/datacollect/llm.ts": {
- "mtimeMs": 1780281843749.1597,
+ "mtimeMs": 1781006628000,
"size": 6940,
"lines": 122,
"role": "Datacollect LLM 호출 인프라 — bridge /api/lm 프록시 통해 OpenAI 호환 chat completion 단발 호출. v2.2.201 에서 slashRouter.ts 에서 분리. 옛 위치는 slashRouter.callLmSynthesis 였으나 datacollect handlers + teamops/communication 양쪽이",
@@ -1294,49 +1337,49 @@
]
},
"src/features/datacollect/prompts/meetPrompt.ts": {
- "mtimeMs": 1781160824134.4404,
- "size": 13297,
+ "mtimeMs": 1781260027000,
+ "size": 13096,
"lines": 201,
"role": "회의 녹취 텍스트 → 사실 기반 구조화 회의록(Actionable Minutes) LLM 프롬프트. 사용자 정의 규칙: Fact/Discussion/Decision/Risk/Action 분류, 메타데이터 우선.",
"imports": []
},
"src/features/datacollect/prompts/synthesisPrompt.ts": {
- "mtimeMs": 1779764602618.1577,
- "size": 14095,
+ "mtimeMs": 1779630675000,
+ "size": 13838,
"lines": 257,
"role": "/benchmark 보고서의 3 파트 분할 — 1: 4-렌즈 / 2: IA + 토큰 / 3: 재구축 명세.",
"imports": []
},
"src/features/datacollect/prompts/weeklyPrompt.ts": {
- "mtimeMs": 1780554147645.3784,
+ "mtimeMs": 1781006628000,
"size": 4702,
"lines": 96,
"role": "/weekly 주간 보고서 LLM 프롬프트. 입력: 캘린더(Google Tasks)에서 버킷팅된 금주/차주 task 목록 + 각 task 의 제목·마감·상태·메모(= /meet·/task 가 넣은 \"작업 상세 / 맥락\"). 금주/차주 분류는 호출부(coordination.ts)에서 due/completed 날짜로 이미 끝낸 상태로 들어온다. 이 프롬프트는 ",
"imports": []
},
"src/features/datacollect/prompts/wikifyPrompt.ts": {
- "mtimeMs": 1781239076699.4426,
+ "mtimeMs": 1781260027000,
"size": 8441,
"lines": 158,
"role": "추출된 웹사이트 본문 → P-Reinforce 위키 문서 프롬프트. 포맷 정본은 Datacollect 브리지의 wikiformat.mjs — 핸들러가 GET /api/wiki/template 로 받아 canonical 로 주입한다 (양쪽 포맷 통일). 브리지가 구버전(엔드포인트 없음)일 때만 아래 내장 사본(fallback)을 쓴다. 내장 사본은 정본을 따",
"imports": []
},
"src/features/datacollect/prompts/youtubePrompts.ts": {
- "mtimeMs": 1779852277877.3347,
- "size": 19109,
+ "mtimeMs": 1781006628000,
+ "size": 18762,
"lines": 347,
"role": "/youtube slash command 의 LLM 입력 빌더 + 자막 변환 헬퍼. - formatHms / fullScriptFromSegments / bucketSegments — segment list 가공 - YoutubeAnalysisMode — info/benchmark/both 라우팅 enum (slashRouter 가 사용) - buildIn",
"imports": []
},
"src/features/datacollect/scheduling/calendarHelpers.ts": {
- "mtimeMs": 1781160936476.3435,
- "size": 4854,
+ "mtimeMs": 1781260027000,
+ "size": 4755,
"lines": 99,
"role": "/meet 슬래시 명령의 후처리 — 회의록에서 action items 를 뽑아 캘린더 task 일정을 계산하는 stateless helpers. slashRouter 의 inline 블록을 분리. - addBusinessDays(base, n) — 토·일 제외 영업일 n 일 후 날짜 - toYmd(d) — Date → 'YYYY-MM-DD' - extrac",
"imports": []
},
"src/features/datacollect/scheduling/meetRegistration.ts": {
- "mtimeMs": 1781170008519.57,
+ "mtimeMs": 1781260027000,
"size": 20511,
"lines": 392,
"role": "/meet 액션 아이템의 \"확신 게이트\" 등록 시스템. 정책 (사용자 정의): - 확정(합의+기한) → 자동 등록. - 진행미정 / 기한미정 / 조건부 → 등록 보류 + 사용자에게 질문, /meet confirm 답변으로 등록 완결. - 반복(예: 매주 목요일) → 반복 등록하지 않고 첫 1회만 등록 (까먹음 방지). - 과거 날짜(옛 녹취) → 과거 날짜",
@@ -1349,7 +1392,7 @@
]
},
"src/features/datacollect/slashRouter.ts": {
- "mtimeMs": 1780281950731.9368,
+ "mtimeMs": 1781006628000,
"size": 10210,
"lines": 201,
"role": "",
@@ -1362,15 +1405,15 @@
]
},
"src/features/devilAgent/devilPrompt.ts": {
- "mtimeMs": 1779065453878.1177,
- "size": 3662,
+ "mtimeMs": 1778943576000,
+ "size": 3591,
"lines": 71,
"role": "Devil's Advocate (도현) — system prompt 빌더. 설계 원칙: - 모든 약점을 나열하지 않음. 한 turn 에 1개 — 사용자가 깊게 생각하게. - 'X 입장에서 본다면' framing — 본인 의견이 아니라 다른 시점 으로 제시. 이는 LLM 의 '내가 옳다' 경향을 줄이는 잘 알려진 패턴. - 통계 / 구체 수치 / 외부 사례 ",
"imports": []
},
"src/features/devilAgent/devilService.ts": {
- "mtimeMs": 1779065453879.116,
- "size": 2517,
+ "mtimeMs": 1778943601000,
+ "size": 2457,
"lines": 60,
"role": "Devil Agent — 직전 답변에 대한 반박 생성기. 동작: 1. agent.ts 가 main turn 완료 직후 호출 2. 같은 model/engine 으로 별도 LLM call 1회 — 짧은 비판 한 문단 생성 3. 결과를 webview 로 'devilRebuttal' message 로 send 4. 실패 / 비활성 시 silent skip — ma",
"imports": [
@@ -1378,8 +1421,8 @@
]
},
"src/features/devilAgent/index.ts": {
- "mtimeMs": 1779065453879.116,
- "size": 276,
+ "mtimeMs": 1778943609000,
+ "size": 263,
"lines": 13,
"role": "",
"imports": [
@@ -1388,7 +1431,7 @@
]
},
"src/features/feedback/feedbackStore.ts": {
- "mtimeMs": 1780275889230.5403,
+ "mtimeMs": 1781006628000,
"size": 1851,
"lines": 44,
"role": "고객 피드백 누적 저장소. 단일 운영자(대표) 모드에서 슬랙·이메일·CS 채널에 흩어진 고객 피드백을 /feedback <텍스트> 한 줄로 모아 둔다. 패턴 분석은 /feedback summary 로 LLM 이 누적 데이터를 보고 카테고리 분포 + 반복 주제를 추출. 저장 형식: JSON Lines (.jsonl) — 한 줄 = 한 entry. 누적·app",
@@ -1397,7 +1440,7 @@
]
},
"src/features/growth/conflictScan.ts": {
- "mtimeMs": 1781234897748.83,
+ "mtimeMs": 1781260027000,
"size": 14843,
"lines": 263,
"role": "신규 지식 충돌 스캔 — 지식 정합성의 \"쓰기 시점\" 게이트. 기존 충돌 감지(검색 시점 [CONFLICT WARNING])는 두 문서가 우연히 같이 검색될 때만 동작한다. 이 스캔은 새로 추가·변경된 두뇌 문서를 매일 능동적으로 기존 유사 문서와 대조해, 검색되기 전에 모순을 표면화한다 (Mem0 의 UPDATE/DELETE 판단의 보수적 변형 — 시스템",
@@ -1411,7 +1454,7 @@
]
},
"src/features/growth/growthCycleWatcher.ts": {
- "mtimeMs": 1781231979220.9685,
+ "mtimeMs": 1781260027000,
"size": 19659,
"lines": 318,
"role": "주간 성장 사이클 워처 — Self-Evolving OS 의 폐루프 자동화. 기존엔 평가·학습큐·노후점검·학습실행이 전부 수동 명령이었다. 이 워처가 매주 (기본 일요일 20:00 KST) 자동으로: 1. 검색 평가 — 골든셋 recall@k/MRR (주간 추이 데이터, TF-IDF 경로) 2. 학습 큐 갱신 — Reflection → Need Engine",
@@ -1435,7 +1478,7 @@
]
},
"src/features/growth/sleepDigest.ts": {
- "mtimeMs": 1781232042506.8752,
+ "mtimeMs": 1781260027000,
"size": 13185,
"lines": 271,
"role": "Sleep-time 지식 사전 소화 (Sleep-time Compute, arXiv 2504.13171 의 ASTRA 이식). 아이디어: 로컬 LLM 의 최대 약점(느린 추론)을 응답 시점에서 유휴 시간으로 옮긴다. 유휴 시간에 두뇌의 \"raw context\"(위키 원문 더미)를 \"learned context\"(예상 질의별 압축 소화 노트)로 변환해 두면,",
@@ -1447,7 +1490,7 @@
]
},
"src/features/hire/hireStore.ts": {
- "mtimeMs": 1780275773463.53,
+ "mtimeMs": 1781006628000,
"size": 4567,
"lines": 125,
"role": "채용 파이프라인 트래커. 4인 → 5인 이상 확장 시점에 후보자가 여러 명, 여러 역할(개발/기획/디자인) 로 들어오기 시작 — 노션·스프레드시트·이메일에 흩어진 정보를 한 명령으로 본다. Event-sourced (customersStore 와 동일 패턴) — append-only 이벤트 로그를 재생해 후보자별 현재 단계 + 노트 누적 도출. 위치: + anthropic-version: 2023-06-01 3. system prompt 는 messages 가 아니라 top-level system 필드 ",
"imports": [
@@ -1549,8 +1592,8 @@
]
},
"src/features/providers/gemini.ts": {
- "mtimeMs": 1779065453881.3628,
- "size": 4434,
+ "mtimeMs": 1778941478000,
+ "size": 4326,
"lines": 108,
"role": "Google Gemini Generative Language API adapter. 차이점 (OpenAI 와): 1. base URL: https://generativelanguage.googleapis.com/v1beta 2. 인증: ?key= (query parameter) 3. 메시지 형식: contents: [{role: 'user'",
"imports": [
@@ -1560,8 +1603,8 @@
]
},
"src/features/providers/index.ts": {
- "mtimeMs": 1779065453882.3787,
- "size": 3311,
+ "mtimeMs": 1778941521000,
+ "size": 3242,
"lines": 69,
"role": "Cloud LLM provider public API. 일반 호출 흐름: 1. agent.ts 의 chat 진입부에서 parseModelPrefix(modelId) 호출 2. null → local engine 경로 (옛 로직). 객체 → streamCloudCompletion(context, hit, params) 호출 3. Response 의 body ",
"imports": [
@@ -1573,8 +1616,8 @@
]
},
"src/features/providers/openrouter.ts": {
- "mtimeMs": 1779065453882.3787,
- "size": 2748,
+ "mtimeMs": 1778941431000,
+ "size": 2673,
"lines": 75,
"role": "OpenRouter — OpenAI 호환 API. 별도 transform 없이 fetch Response 를 그대로 반환. Base: https://openrouter.ai/api/v1 POST /chat/completions — OpenAI 형식 그대로. stream:true 면 SSE. GET /models — 사용 가능 모델 목록. 인증: Author",
"imports": [
@@ -1583,8 +1626,8 @@
]
},
"src/features/providers/providerConfig.ts": {
- "mtimeMs": 1779065453883.386,
- "size": 2761,
+ "mtimeMs": 1778941498000,
+ "size": 2683,
"lines": 78,
"role": "Provider 별 API key + enable 토글 저장소. 설계: - API key 자체는 vscode.SecretStorage (secrets) 에 — settings.json / Settings Sync 침범 안 받음. - enabled 토글은 일반 settings (g1nation.providers..enabled) — 사용자가 패널에서 ",
"imports": [
@@ -1592,21 +1635,21 @@
]
},
"src/features/providers/streamHelpers.ts": {
- "mtimeMs": 1779065453883.386,
- "size": 6048,
+ "mtimeMs": 1778941413000,
+ "size": 5904,
"lines": 144,
"role": "Stream transformer — provider 별 SSE 형식을 OpenAI 호환 SSE 로 변환. 이렇게 하면 agent.ts 의 기존 SSE 파서 (data: {...delta...} 형식 가정) 가 변경 없이 모든 provider 출력을 같은 코드 경로로 소비할 수 있다. 신규 provider 가 들어와도 adapter 하나만 추가하면 됨 (c",
"imports": []
},
"src/features/providers/types.ts": {
- "mtimeMs": 1779065453884.8909,
- "size": 2433,
+ "mtimeMs": 1778941377000,
+ "size": 2370,
"lines": 63,
"role": "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",
"imports": []
},
"src/features/runway/runwayStore.ts": {
- "mtimeMs": 1780275853704.5698,
+ "mtimeMs": 1781006628000,
"size": 5511,
"lines": 146,
"role": "Runway / Cash 누적 저장소. 4인 기업 운영의 가장 중요한 숫자 — 현금 잔고 / 월 소진율 / 남은 개월수 — 를 한 명령 (/runway) 로 본다. 회계 시스템은 아니고, 대표가 머리에 가지고 있는 \"지금 통장에 얼마, 한 달에 얼마 나감\" 을 코드 옆에서 잡는 가벼운 트래커. 저장 형식: JSON Lines (.jsonl) — 한 줄 = ",
@@ -1615,8 +1658,8 @@
]
},
"src/features/secondBrainTrace.ts": {
- "mtimeMs": 1779411561816.5603,
- "size": 39429,
+ "mtimeMs": 1779492050000,
+ "size": 38637,
"lines": 792,
"role": "",
"imports": [
@@ -1625,8 +1668,8 @@
]
},
"src/features/selfReflector/selfReflectorExecution.ts": {
- "mtimeMs": 1779325350825.2378,
- "size": 9570,
+ "mtimeMs": 1779277718000,
+ "size": 9363,
"lines": 207,
"role": "Self-Reflector Phase C — 실행 기반 검증. Phase A/B는 LLM 텍스트 분석에 의존하므로 \"코드가 실제로 컴파일되는가?\" 같은 질문엔 한계가 있다. Phase C는 정답: 그냥 실행해 본다. 동작: 1. action-tag executor가 반환한 report를 받아 ✅ Created: / ✅ Edited: ",
"imports": [
@@ -1634,21 +1677,21 @@
]
},
"src/features/selfReflector/selfReflectorHollow.ts": {
- "mtimeMs": 1778821213094.901,
+ "mtimeMs": 1778902489000,
"size": 10482,
"lines": 258,
"role": "Self-Reflector — 빈 깡통(Hollow Code) 검출 휴리스틱. Phase C(syntax/lint)는 문법 오류만 잡는다. 작은 LLM이 가장 자주 만드는 실패 패턴은 문법은 맞지만 본문이 비어 있는 코드 — def foo(): pass, # TODO: implement, import만 있고 로직 0줄인 모듈 등. 사용자가 \"완료 됐다\"라는",
"imports": []
},
"src/features/selfReflector/selfReflectorPrompt.ts": {
- "mtimeMs": 1778821145026.1665,
+ "mtimeMs": 1778902489000,
"size": 6139,
"lines": 108,
"role": "Self-Reflector — 답변 산출물의 자기 검증 레이어. Memory(기억) 단계는 이미 충분히 강하지만 Verification(검증) 단계는 사용자 피드백에 의존적이다. 이 모듈은 그 격차를 메꾸는 3단 구조: Phase A (이 파일) ─ 시스템 프롬프트에 self-check 체크리스트 룰을 박아 LLM이 응답 마지막에 [Self-Reflecto",
"imports": []
},
"src/features/selfReflector/selfReflectorVerifier.ts": {
- "mtimeMs": 1778821237110.5894,
+ "mtimeMs": 1778902489000,
"size": 7495,
"lines": 172,
"role": "Self-Reflector Phase B — 분리된 콘텍스트에서 LLM 한 번 더 호출해 응답을 외부 시각으로 검증. Phase A의 self-check는 같은 모델·같은 콘텍스트에서 자기 자신을 보는 한계가 있다. 모델이 자기가 만든 답변을 자신 있게 잘못 평가하는 과신 편향은 LLM의 잘 알려진 약점이다. Phase B는 이걸 보완하기 위해: 1. sp",
@@ -1658,8 +1701,8 @@
]
},
"src/features/settings/settingsPanelProvider.ts": {
- "mtimeMs": 1780968616137.0164,
- "size": 35518,
+ "mtimeMs": 1781006628000,
+ "size": 34784,
"lines": 734,
"role": "",
"imports": [
@@ -1673,8 +1716,8 @@
]
},
"src/features/setup/datacollectSetup.ts": {
- "mtimeMs": 1780624672053.5078,
- "size": 12679,
+ "mtimeMs": 1781006628000,
+ "size": 12412,
"lines": 267,
"role": "Datacollect 의존성(Python 패키지) 자동 설치/검증 모듈. 의도: Astra extension 만 깔고 끝나면 /youtube, /research 같은 datacollect 슬래시 명령은 bridge 의 Python 의존성 (yt-dlp, youtube-transcript-api) 이 없어서 실패한다. 사용자가 그걸 매번 수동으로 깔아야 하는",
"imports": [
@@ -1682,8 +1725,8 @@
]
},
"src/features/sheets/index.ts": {
- "mtimeMs": 1779065453886.916,
- "size": 250,
+ "mtimeMs": 1778935930000,
+ "size": 237,
"lines": 13,
"role": "",
"imports": [
@@ -1691,8 +1734,8 @@
]
},
"src/features/sheets/sheetsApi.ts": {
- "mtimeMs": 1779065453887.9194,
- "size": 7960,
+ "mtimeMs": 1778936110000,
+ "size": 7794,
"lines": 166,
"role": "Google Sheets API v4 — read / write / append. 토큰은 calendar 와 공유 (같은 OAuth 에 spreadsheets scope 포함). 별도 셋업 없음 — \"Astra: Google Calendar OAuth 연결\" 명령으로 한 번 로그인하면 둘 다 동작한다. 외부 라이브러리 안 씀 — Sheets API REST",
"imports": [
@@ -1700,7 +1743,7 @@
]
},
"src/features/stocks/criteriaEval.ts": {
- "mtimeMs": 1781086243443.0957,
+ "mtimeMs": 1781095278000,
"size": 12293,
"lines": 209,
"role": "/stocks judge 의 결정론적 기준 평가기. 기존에는 \"유보율: 5,800%\" 같은 문자열 파싱과 임계값 비교(ROE ≥ 10% 등)까지 전부 LLM 에게 맡겼는데, 로컬 소형 모델은 콤마 숫자 파싱·다중 기준 동시 비교에서 자주 틀린다. 수치 기준은 코드로 100% 정확하게 계산하고, LLM 은 ① '기술력' 도메인 정성 판단(키워드 매칭이 모호할",
@@ -1710,8 +1753,8 @@
]
},
"src/features/stocks/discoveryAnalyzer.ts": {
- "mtimeMs": 1779764602625.2075,
- "size": 10526,
+ "mtimeMs": 1779670188000,
+ "size": 10289,
"lines": 237,
"role": "",
"imports": [
@@ -1723,8 +1766,8 @@
]
},
"src/features/stocks/index.ts": {
- "mtimeMs": 1779764602625.2075,
- "size": 121,
+ "mtimeMs": 1779668795000,
+ "size": 119,
"lines": 2,
"role": "",
"imports": [
@@ -1733,7 +1776,7 @@
]
},
"src/features/stocks/llmJudge.ts": {
- "mtimeMs": 1781084049810.22,
+ "mtimeMs": 1781095278000,
"size": 6072,
"lines": 125,
"role": "",
@@ -1746,8 +1789,8 @@
]
},
"src/features/stocks/naverFundamentals.ts": {
- "mtimeMs": 1781086142605.6724,
- "size": 8323,
+ "mtimeMs": 1781095278000,
+ "size": 8145,
"lines": 178,
"role": "",
"imports": [
@@ -1755,8 +1798,8 @@
]
},
"src/features/stocks/naverScreener.ts": {
- "mtimeMs": 1779764602627.2136,
- "size": 6593,
+ "mtimeMs": 1779668297000,
+ "size": 6442,
"lines": 151,
"role": "",
"imports": [
@@ -1764,8 +1807,8 @@
]
},
"src/features/stocks/sheetsSync.ts": {
- "mtimeMs": 1779764602628.3208,
- "size": 4292,
+ "mtimeMs": 1779666427000,
+ "size": 4193,
"lines": 99,
"role": "",
"imports": [
@@ -1777,8 +1820,8 @@
]
},
"src/features/stocks/signalClassifier.ts": {
- "mtimeMs": 1779764602628.3208,
- "size": 2818,
+ "mtimeMs": 1779666385000,
+ "size": 2749,
"lines": 69,
"role": "",
"imports": [
@@ -1786,8 +1829,8 @@
]
},
"src/features/stocks/slashStocks.ts": {
- "mtimeMs": 1781084110909.264,
- "size": 34650,
+ "mtimeMs": 1781095278000,
+ "size": 34021,
"lines": 629,
"role": "",
"imports": [
@@ -1807,8 +1850,8 @@
]
},
"src/features/stocks/stockDiscovery.ts": {
- "mtimeMs": 1779769708419.8738,
- "size": 9622,
+ "mtimeMs": 1781006628000,
+ "size": 9426,
"lines": 196,
"role": "",
"imports": [
@@ -1820,8 +1863,8 @@
]
},
"src/features/stocks/stocksStore.ts": {
- "mtimeMs": 1779764602630.329,
- "size": 4123,
+ "mtimeMs": 1779666348000,
+ "size": 4027,
"lines": 96,
"role": "",
"imports": [
@@ -1830,8 +1873,8 @@
]
},
"src/features/stocks/stocksWatcher.ts": {
- "mtimeMs": 1779764602630.329,
- "size": 6530,
+ "mtimeMs": 1779666551000,
+ "size": 6367,
"lines": 163,
"role": "",
"imports": [
@@ -1843,8 +1886,8 @@
]
},
"src/features/stocks/telegramReport.ts": {
- "mtimeMs": 1779764602631.3562,
- "size": 5335,
+ "mtimeMs": 1779666511000,
+ "size": 5218,
"lines": 117,
"role": "",
"imports": [
@@ -1857,15 +1900,15 @@
]
},
"src/features/stocks/types.ts": {
- "mtimeMs": 1779764602631.3562,
- "size": 2188,
+ "mtimeMs": 1779666327000,
+ "size": 2135,
"lines": 53,
"role": "Stocks 모듈 공유 타입. investresults/targetstocks.json 스키마를 그대로 받아서, ConnectAI 의 /.astra/stocks.json 으로 옮긴 뒤 같은 필드명을 유지. 한글 필드명은 사용자의 도메인 데이터라 변경하지 않는다 — 마이그레이션 충돌 회피 + 사용자가 직접 JSON 편집할 때 frictio",
"imports": []
},
"src/features/stocks/yahooClient.ts": {
- "mtimeMs": 1779856972057.0444,
- "size": 16112,
+ "mtimeMs": 1781006628000,
+ "size": 15759,
"lines": 353,
"role": "",
"imports": [
@@ -1873,7 +1916,7 @@
]
},
"src/features/system/handlers.ts": {
- "mtimeMs": 1780624661739.6692,
+ "mtimeMs": 1781006628000,
"size": 20556,
"lines": 394,
"role": "System handlers — /memory · /glossary · /help (인프라·관리·발견). v2.2.200 에서 slashRouter.ts 에서 분리. 4인 팀 운영 도메인 아닌 \"ASTRA 자체 인프라\" 슬래시 명령. teamops handlers 와 같은 패턴.",
@@ -1886,8 +1929,8 @@
]
},
"src/features/tasks/index.ts": {
- "mtimeMs": 1779065453887.9194,
- "size": 238,
+ "mtimeMs": 1778936468000,
+ "size": 225,
"lines": 13,
"role": "",
"imports": [
@@ -1895,14 +1938,21 @@
]
},
"src/features/tasks/taskStore.ts": {
- "mtimeMs": 1779065453888.9917,
- "size": 9366,
+ "mtimeMs": 1778936462000,
+ "size": 9121,
"lines": 245,
"role": "Task tracker — .astra/company/shared/tasks.md 단일 파일. 설계 원칙: - 외부 DB 없이 사람이 읽을 수 있는 마크다운 테이블에 누적. git 으로 history 추적 가능. - 파싱은 regex 기반 (셀 구분자 |). 사용자가 손으로 편집해도 fault-tolerant. - 모든 task 는 안정적 id (t001,",
"imports": []
},
+ "src/features/teamops/handlers/_shared.ts": {
+ "mtimeMs": 1781006628000,
+ "size": 3647,
+ "lines": 84,
+ "role": "TeamOps handlers 공통 헬퍼 — 4인 팀 운영 슬래시 명령 클러스터가 공유하는 함수·상수. 이전 위치: src/features/datacollect/slashRouter.ts 내부 module-local 함수 (v2.2.196 에서 분리). 핸들러 도메인별 분할 시 공통 항목만 여기에. 추후 datacollect / system 핸들러도 비슷한",
+ "imports": []
+ },
"src/features/teamops/handlers/communication.ts": {
- "mtimeMs": 1780281864898.1965,
+ "mtimeMs": 1781006628000,
"size": 13821,
"lines": 255,
"role": "TeamOps Communication — /draft · /feedback (외부 출력·기록). v2.2.199 에서 slashRouter.ts 에서 분리. (원래는 v2.2.200 예정이었으나 coordination 추출 시 register 라인이 인접해 묶여 함께 진행.)",
@@ -1913,7 +1963,7 @@
]
},
"src/features/teamops/handlers/coordination.ts": {
- "mtimeMs": 1780554184648.2307,
+ "mtimeMs": 1781006628000,
"size": 35565,
"lines": 665,
"role": "TeamOps Coordination — /task · /decisions · /onesie · /blocked · /standup. v2.2.199 에서 slashRouter.ts 에서 분리. 작업·결정·1:1·블로커·스탠드업 등 \"팀 운영의 실시간 부분\" 클러스터. 공통 헬퍼는 ./shared.ts 에서. 옛 slashRouter 의 local pars",
@@ -1927,7 +1977,7 @@
]
},
"src/features/teamops/handlers/dashboards.ts": {
- "mtimeMs": 1780554715659.2327,
+ "mtimeMs": 1781006628000,
"size": 26379,
"lines": 493,
"role": "TeamOps Dashboards — /morning · /evening · /cohort (CEO 일·월 리듬). v2.2.198 에서 slashRouter.ts 에서 분리. cross-data 합성 (Tasks + customers + hire + runway + Chronicle ADR) 으로 일/월 단위 시야 제공. (구 /weekly CEO 리뷰 ",
@@ -1942,7 +1992,7 @@
]
},
"src/features/teamops/handlers/index.ts": {
- "mtimeMs": 1780280542425.257,
+ "mtimeMs": 1781006628000,
"size": 501,
"lines": 14,
"role": "TeamOps handlers 배럴 — extension activate 시 1회 import 로 모든 핸들러 등록. 각 핸들러 파일은 module scope 에서 registerSlashCommand({...}) 호출하므로 import 만으로 등록 완료. 새 핸들러 파일은 여기에 한 줄 추가. v2.2.196 — trackers (runway/custom",
@@ -1954,7 +2004,7 @@
]
},
"src/features/teamops/handlers/trackers.ts": {
- "mtimeMs": 1780278032934.0896,
+ "mtimeMs": 1781006628000,
"size": 36032,
"lines": 704,
"role": "TeamOps Trackers — /runway · /customers · /hire (event-sourced 트래커 3종). v2.2.196 에서 slashRouter.ts 에서 분리. 모두 .astra/.jsonl event log 를 읽고 (createEventStore via 각 store 모듈) 대시보드 / 수정 명령 제공. 공통 헬퍼 (fmtK",
@@ -1966,23 +2016,16 @@
"src/features/hire/hireStore"
]
},
- "src/features/teamops/handlers/_shared.ts": {
- "mtimeMs": 1780277843419.9949,
- "size": 3647,
- "lines": 84,
- "role": "TeamOps handlers 공통 헬퍼 — 4인 팀 운영 슬래시 명령 클러스터가 공유하는 함수·상수. 이전 위치: src/features/datacollect/slashRouter.ts 내부 module-local 함수 (v2.2.196 에서 분리). 핸들러 도메인별 분할 시 공통 항목만 여기에. 추후 datacollect / system 핸들러도 비슷한",
- "imports": []
- },
- "src/features/_shared/eventSourcedStore.ts": {
- "mtimeMs": 1780275610701.943,
- "size": 3216,
- "lines": 83,
- "role": "Generic event-sourced store — append-only .jsonl 파일 1개를 읽고/쓰는 공통 기반. 배경: customers, hire, runway, feedback 4개 store 가 같은 패턴 4번 반복 (getXFilePath / readX / appendX / countX) — byte-for-byte 중복 ~240줄. 한 ",
+ "src/features/web/webFetch.ts": {
+ "mtimeMs": 1781269374000,
+ "size": 7330,
+ "lines": 167,
+ "role": "Web Fetch — Bridge 무관 직접 URL fetch (vscode 의존 없음 — 테스트 용이). 배경: 일반 챗의 URL 주입(urlContext.ts)은 Datacollect Bridge(:3002)에 100% 의존했다. Bridge가 꺼져 있으면 — 확장은 Bridge를 자동 시작하지 않는다 — \"접근 실패\" 블록이 떠서 모델이 \"사이트 방문",
"imports": []
},
"src/integrations/telegram/conversationHistory.ts": {
- "mtimeMs": 1778720117535.294,
- "size": 6427,
+ "mtimeMs": 1778684811000,
+ "size": 6273,
"lines": 154,
"role": "Per-chat conversation history for the Telegram bot. Why this exists: the previous bot was stateless — every inbound message hit AIService.chat({system, user}) in isolation, with no memory of what the ",
"imports": [
@@ -1990,8 +2033,8 @@
]
},
"src/integrations/telegram/promptBuilders.ts": {
- "mtimeMs": 1779764602632.363,
- "size": 7663,
+ "mtimeMs": 1779632676000,
+ "size": 7520,
"lines": 143,
"role": "",
"imports": [
@@ -1999,8 +2042,8 @@
]
},
"src/integrations/telegram/telegramBot.ts": {
- "mtimeMs": 1778549008903.0078,
- "size": 11614,
+ "mtimeMs": 1778421270000,
+ "size": 11344,
"lines": 270,
"role": "",
"imports": [
@@ -2010,8 +2053,8 @@
]
},
"src/integrations/telegram/telegramClient.ts": {
- "mtimeMs": 1778549008904.013,
- "size": 6027,
+ "mtimeMs": 1778252333000,
+ "size": 5873,
"lines": 154,
"role": "",
"imports": [
@@ -2020,8 +2063,8 @@
]
},
"src/integrations/telegram/telegramSetup.ts": {
- "mtimeMs": 1781170079525.693,
- "size": 11600,
+ "mtimeMs": 1781260027000,
+ "size": 11403,
"lines": 197,
"role": "",
"imports": [
@@ -2039,21 +2082,21 @@
]
},
"src/integrations/telegram/types.ts": {
- "mtimeMs": 1778549008904.013,
- "size": 1309,
+ "mtimeMs": 1778252305000,
+ "size": 1255,
"lines": 54,
"role": "Subset of the Telegram Bot API types we actually consume. Source: https://core.telegram.org/bots/api Only fields the bot reads or writes are typed — leaving the rest as unknown keeps the surface narro",
"imports": []
},
"src/intelligence/confidenceEngine.ts": {
- "mtimeMs": 1781142298902.0667,
+ "mtimeMs": 1781260027000,
"size": 6993,
"lines": 165,
"role": "Confidence Engine — 답변 확신도 0~100 결정론적 산출. Self-Evolving OS 마스터 플랜 Phase 2 / Track 1-1. 신뢰 조건 T4 \"확신이 없으면 사람에게 묻는다\" 의 측정 기반 — Escalation Engine 의 입력. 설계 원칙 (termValidator 와 동일): LLM 호출 없음. 검색 그라운딩 신호(턴",
"imports": []
},
"src/intelligence/correctionLoop.ts": {
- "mtimeMs": 1781234941518.895,
+ "mtimeMs": 1781260027000,
"size": 17684,
"lines": 382,
"role": "Correction Loop — 사용자 정정 1회가 시스템을 세 군데서 성장시키는 단일 파이프라인. 사용자 정정 (\"아니야, 그거 6월이야\") ① 감지(looksLikeCorrection) + LLM 오류 분류(classifyCorrection) ├→ 태깅된 레슨 저장 (lessons/ — error-tag frontmatter) └→ 회귀 케이스 적립 (",
@@ -2064,7 +2107,7 @@
]
},
"src/intelligence/criticAgent.ts": {
- "mtimeMs": 1781144246295.8977,
+ "mtimeMs": 1781260027000,
"size": 7294,
"lines": 174,
"role": "Critic Agent + Debate Loop (v1) — 제출된 업무 산출물의 LLM 검수. Self-Evolving OS 마스터 플랜 Phase 1 / Track 2-3. 신뢰 조건 T3 의 LLM 계층: Requirement Coverage(결정론적, 정규식) 가 \"요소가 언급 됐는가\" 만 보면, Critic 은 \"내용이 충실 한가 + 결정/미결 구",
@@ -2073,14 +2116,14 @@
]
},
"src/intelligence/epistemicGuardBlock.ts": {
- "mtimeMs": 1781142349593.672,
+ "mtimeMs": 1781260027000,
"size": 2559,
"lines": 45,
"role": "Epistemic Guard — 모름/추정/확실 3분류 강제 시스템 프롬프트 블록. Self-Evolving OS 마스터 플랜 Phase 2 / Track 1-3 (Anti-Hallucination Layer). 신뢰 조건 T1 \"모르면 모른다고 말한다\" 담당. CoVe(coveBlock) 와의 분업: - CoVe: 검색 출처가 있을 때 주장-출처 매핑을 ",
"imports": []
},
"src/intelligence/escalationEngine.ts": {
- "mtimeMs": 1781142325031.3643,
+ "mtimeMs": 1781260027000,
"size": 3501,
"lines": 74,
"role": "Escalation Engine — 인간 개입 필요성 판단. Self-Evolving OS 마스터 플랜 Phase 2 / Track 1-2. 신뢰 조건 T4 의 행동 부분: Confidence Engine 이 \"얼마나 확실한가\" 를 재면, 이 모듈은 \"그래서 사람에게 물어야 하는가\" 를 결정한다. 설계서 13장 조건: 확신도 낮음 / 영향도 높음 / 정보 ",
@@ -2090,7 +2133,7 @@
]
},
"src/intelligence/gapDetector.ts": {
- "mtimeMs": 1781146607158.5022,
+ "mtimeMs": 1781260027000,
"size": 3135,
"lines": 73,
"role": "Gap Detector — Gap = Requirement − Knowledge (설계서 7.4). Self-Evolving OS 마스터 플랜 Phase 3 / Track 3-2. 업무 turn 마다 \"필요한 것\" (Requirement Graph 의 필수 요소)과 \"가진 것\"(검색 그라운딩 + 산출물 커버리지)을 비교해 부족 지식·영향도·긴급도를 산출한다",
@@ -2100,21 +2143,21 @@
]
},
"src/intelligence/knowledgeDecay.ts": {
- "mtimeMs": 1781147140600.4475,
+ "mtimeMs": 1781260027000,
"size": 5151,
"lines": 110,
"role": "Knowledge Decay — 지식 노후 감쇠 점검 (설계서 10장, \"인간처럼 잊어버리는 기능\"). Self-Evolving OS 마스터 플랜 Phase 4 / Track 4-3. 분야별 반감기로 지식의 신선도 계수를 계산하고, 노후 지식을 보고서로 노출한다. v1 은 비침습적 감사 — 검색 랭킹은 건드리지 않는다. RAG 평가 하니스로 튜닝된 검색 경",
"imports": []
},
"src/intelligence/knowledgeValidation.ts": {
- "mtimeMs": 1781147318275.7917,
+ "mtimeMs": 1781260027000,
"size": 6473,
"lines": 168,
"role": "Knowledge Validation + Belief Revision — 지식 저장 전 검증 (설계서 10장). Self-Evolving OS 마스터 플랜 Phase 4 / Track 4-1 + 4-2. 새 지식 후보를 기존 지식과 비교해 수용/검토/거부를 판정하고, 충돌 시 Add/Update/Retire 권고를 만든다. Constitution 준수: 이",
"imports": []
},
"src/intelligence/learningQueue.ts": {
- "mtimeMs": 1781146722080.366,
+ "mtimeMs": 1781260027000,
"size": 4962,
"lines": 118,
"role": "Learning Queue — 승인 기반 학습 대기열 (설계서 9장). Self-Evolving OS 마스터 플랜 Phase 3 / Track 3-5. Need Engine 의 우선순위를 사람이 승인 가능한 큐로 영속화한다. Constitution 준수 (Track 8-2, Permission Based Learning): - 시스템은 항목을 propose",
@@ -2123,7 +2166,7 @@
]
},
"src/intelligence/lessonNetwork.ts": {
- "mtimeMs": 1781234925667.318,
+ "mtimeMs": 1781260027000,
"size": 4326,
"lines": 93,
"role": "레슨 네트워크 — A-MEM(NeurIPS 2025, Zettelkasten 원리)의 ASTRA 이식. 문제: lessons/ 가 고립된 카드 모음 — 새 레슨이 과거의 비슷한 교훈과 연결되지 않아 \"같은 종류의 실수\"라는 패턴이 파일 수준에서 보이지 않는다. A-MEM 의 두 메커니즘을 파일 기반으로 구현: 1. 동적 링킹: 새 레슨 저장 시 기존 레슨과",
@@ -2132,14 +2175,14 @@
]
},
"src/intelligence/llmCall.ts": {
- "mtimeMs": 1781144318025.0918,
+ "mtimeMs": 1781260027000,
"size": 2099,
"lines": 52,
"role": "단순 non-streaming LLM 호출 — Ollama / LM Studio(OpenAI 호환) 듀얼 엔드포인트. postHocSelfCheck 의 호출 패턴을 재사용 가능한 헬퍼로 분리. 평가 하니스·Critic 등 AgentExecutor 밖에서 LLM 1회 호출이 필요한 곳이 사용한다 (확장 명령 등). agent turn 내부에서는 agent.t",
"imports": []
},
"src/intelligence/needEngine.ts": {
- "mtimeMs": 1781147322252.6475,
+ "mtimeMs": 1781260027000,
"size": 9219,
"lines": 220,
"role": "Need Engine — 학습 필요성 산출 (설계서 7.6) + Knowledge Inventory v1 (7.3). Self-Evolving OS 마스터 플랜 Phase 3 / Track 3-3 + 3-1. Reflection 기록을 집계해 \"무엇을 먼저 배워야 하는가\" 를 점수로 산출한다 — 성장 루프의 두뇌. Need Score (설계서 공식, 0~1",
@@ -2148,28 +2191,28 @@
]
},
"src/intelligence/orgMemoryBlock.ts": {
- "mtimeMs": 1781147430047.9055,
+ "mtimeMs": 1781260027000,
"size": 2750,
"lines": 68,
"role": "Organizational Memory — 조직 규칙·프로세스·선호 방식 시스템 프롬프트 블록. Self-Evolving OS 마스터 플랜 Phase 5 / Track 5-2 (설계서 11장 Organizational Memory). \"이 회사는 속도 우선, 완벽주의 지양\" 류의 조직 문화·업무 방식을 모든 업무 turn 에 주입한다. Terminology",
"imports": []
},
"src/intelligence/reflectionStore.ts": {
- "mtimeMs": 1781146621996.6653,
+ "mtimeMs": 1781260027000,
"size": 6906,
"lines": 162,
"role": "Reflection Store — 업무 turn 회고 기록 + Failure Pattern 집계. Self-Evolving OS 마스터 플랜 Phase 1 / Track 2-4 (Reflection Engine v1) + Phase 3 / Track 3-6 (Failure Pattern DB v1 시드). 신뢰 조건 T5 \"같은 실수를 반복하지 않는다\" 의",
"imports": []
},
"src/intelligence/requirementGraph.ts": {
- "mtimeMs": 1781144397584.8677,
+ "mtimeMs": 1781260027000,
"size": 12495,
"lines": 273,
"role": "Requirement Graph — 업무 유형별 필수 요소 정의 + 감지 + 커버리지 검사. Self-Evolving Digital Employee OS 마스터 플랜(docs/SELFEVOLVINGOSMASTERPLAN.md) Phase 1 / Track 2-1. 신뢰 조건 T3 \"품질이 일관적이다 — 필수 요소 누락 없음\" 담당. 동작 2단계: 1. In",
"imports": []
},
"src/intelligence/researchAgent.ts": {
- "mtimeMs": 1781147776688.333,
+ "mtimeMs": 1781260027000,
"size": 7355,
"lines": 153,
"role": "Research Agent — 학습 큐 approved 항목의 조사 실행 (설계서 9장). Self-Evolving OS 마스터 플랜 Phase 6 / Track 7-1. 학습 루프의 마지막 구간: Need Engine → Learning Queue(approved) → Research Agent → Validation 게이트 → 저장 제안 v1 은 \"조사",
@@ -2179,7 +2222,7 @@
]
},
"src/intelligence/skillScore.ts": {
- "mtimeMs": 1781147811826.0857,
+ "mtimeMs": 1781260027000,
"size": 6870,
"lines": 168,
"role": "Skill Score + Success Pattern DB — 역량 점수와 성공 사례 축적 (설계서 12장). Self-Evolving OS 마스터 플랜 Phase 6 / Track 7-3 + 7-4. Skill Score (0~100, 업무 유형 단위 v1): 최근 N건 reflection 의 (확신도 50% + 요소 충족률 30% + 비에스컬레이션율 2",
@@ -2188,7 +2231,7 @@
]
},
"src/intelligence/taskEvalHarness.ts": {
- "mtimeMs": 1781144360998.8086,
+ "mtimeMs": 1781260027000,
"size": 7942,
"lines": 185,
"role": "Task Eval Harness — 업무 산출물 골든셋 자동 채점 (Self Evaluation v1). Self-Evolving OS 마스터 플랜 Phase 3 / Track 3-4. \"성장세를 숫자로 증명\" 의 핵심: 같은 골든셋을 버전마다 돌려 점수 추이를 비교한다 (검색 평가 하니스가 recall@1 37.5%→75% 를 증명한 것과 같은 방법론을 ",
@@ -2197,15 +2240,15 @@
]
},
"src/lib/contextBuilders/astraModeArchitecture.ts": {
- "mtimeMs": 1779764602634.5583,
- "size": 3982,
+ "mtimeMs": 1779601304000,
+ "size": 3926,
"lines": 56,
"role": "Astra Mode Architecture Context Builder. 의도: 사용자가 Astra 자체의 mode 디자인 (Guard vs Multi-Agent 가 별도 모드여야 하는지) 을 묻는 메타 질문에 답할 때, 모델이 일반론적 답이 아니라 현재 코드베이스 의 실제 구조 를 보고 답하게 하려고 시스템 프롬프트에 추가 컨텍스트 블록을 주입. 이 bu",
"imports": []
},
"src/lib/contextBuilders/droppedHistorySummary.ts": {
- "mtimeMs": 1779764602634.5583,
- "size": 2351,
+ "mtimeMs": 1779618681000,
+ "size": 2299,
"lines": 52,
"role": "",
"imports": [
@@ -2213,8 +2256,8 @@
]
},
"src/lib/contextBuilders/engineMessages.ts": {
- "mtimeMs": 1779764602635.5603,
- "size": 2244,
+ "mtimeMs": 1779622213000,
+ "size": 2188,
"lines": 56,
"role": "",
"imports": [
@@ -2222,8 +2265,8 @@
]
},
"src/lib/contextBuilders/historyTransform.ts": {
- "mtimeMs": 1779764602635.5603,
- "size": 3748,
+ "mtimeMs": 1779622758000,
+ "size": 3671,
"lines": 77,
"role": "",
"imports": [
@@ -2231,8 +2274,8 @@
]
},
"src/lib/contextBuilders/jarvisProjectBrief.ts": {
- "mtimeMs": 1779764602635.5603,
- "size": 2919,
+ "mtimeMs": 1779619198000,
+ "size": 2860,
"lines": 59,
"role": "",
"imports": [
@@ -2242,8 +2285,8 @@
]
},
"src/lib/contextBuilders/lastTopicLine.ts": {
- "mtimeMs": 1779764602636.9287,
- "size": 1076,
+ "mtimeMs": 1779618707000,
+ "size": 1057,
"lines": 19,
"role": "",
"imports": [
@@ -2251,8 +2294,8 @@
]
},
"src/lib/contextBuilders/lmStudioSampling.ts": {
- "mtimeMs": 1779764602637.9385,
- "size": 1297,
+ "mtimeMs": 1779630388000,
+ "size": 1268,
"lines": 29,
"role": "",
"imports": [
@@ -2261,8 +2304,8 @@
]
},
"src/lib/contextBuilders/localProjectIntent.ts": {
- "mtimeMs": 1781240137750.4143,
- "size": 14163,
+ "mtimeMs": 1781260027000,
+ "size": 13930,
"lines": 233,
"role": "",
"imports": [
@@ -2270,8 +2313,8 @@
]
},
"src/lib/contextBuilders/localProjectPath.ts": {
- "mtimeMs": 1779764602638.9414,
- "size": 17046,
+ "mtimeMs": 1779621240000,
+ "size": 16718,
"lines": 328,
"role": "",
"imports": [
@@ -2282,9 +2325,9 @@
]
},
"src/lib/contextBuilders/memoryContext.ts": {
- "mtimeMs": 1781173219871.77,
- "size": 25179,
- "lines": 444,
+ "mtimeMs": 1781267162000,
+ "size": 25167,
+ "lines": 449,
"role": "",
"imports": [
"src/agent",
@@ -2313,15 +2356,15 @@
]
},
"src/lib/contextBuilders/modelCandidates.ts": {
- "mtimeMs": 1779764602639.947,
- "size": 853,
+ "mtimeMs": 1779618716000,
+ "size": 833,
"lines": 20,
"role": "사용자 지정 modelName 으로 추론 호출 시도할 때, 첫 호출이 404 / not-loaded 류로 실패할 가능성에 대비한 fallback 후보 목록을 만든다. LM Studio 한정: gemma3:4b 같은 \":quant suffix\" 형태가 안 먹히면 base name (gemma3) 도 시도하게 한 줄 더 push. Ollama 는 항상 정확한 ",
"imports": []
},
"src/lib/contextBuilders/multiAgentRouting.ts": {
- "mtimeMs": 1779764602639.947,
- "size": 5257,
+ "mtimeMs": 1779622465000,
+ "size": 5161,
"lines": 96,
"role": "",
"imports": [
@@ -2333,15 +2376,15 @@
]
},
"src/lib/contextBuilders/outputSanitization.ts": {
- "mtimeMs": 1779764602640.9502,
- "size": 5338,
+ "mtimeMs": 1779622739000,
+ "size": 5239,
"lines": 99,
"role": "모델 출력 후처리 (post-stream sanitization). 모두 stateless pure transform. 1) sanitizeAssistantContent — 모델이 답변에 흘려보낸 내부 마커 (rationale, reasoning channels, Harmony/GPT-OSS 채널 마커, [PROBLEM]/[GOAL]/[REASONING] ",
"imports": []
},
"src/lib/contextBuilders/priorTurnConclusion.ts": {
- "mtimeMs": 1781156354349.277,
- "size": 4210,
+ "mtimeMs": 1781260027000,
+ "size": 4132,
"lines": 78,
"role": "",
"imports": [
@@ -2349,15 +2392,15 @@
]
},
"src/lib/contextBuilders/projectEvidence.ts": {
- "mtimeMs": 1779764602641.9536,
- "size": 2171,
+ "mtimeMs": 1779619101000,
+ "size": 2132,
"lines": 39,
"role": "Project-knowledge / local-path 컨텍스트 블록 안에서 증거 파일 목록을 뽑아내는 pure parser 모음. 두 종류 컨텍스트 포맷이 살짝 달라 함수를 둘로 둠: - extractEvidenceFilesFromProjectKnowledge: ## Evidence Files 블록 (project knowledge overview 문서 ",
"imports": []
},
"src/lib/contextBuilders/projectKnowledge.ts": {
- "mtimeMs": 1779764602641.9536,
- "size": 9677,
+ "mtimeMs": 1779620833000,
+ "size": 9514,
"lines": 163,
"role": "",
"imports": [
@@ -2366,15 +2409,15 @@
]
},
"src/lib/contextBuilders/promptDetection.ts": {
- "mtimeMs": 1779764602641.9536,
- "size": 5568,
- "lines": 85,
+ "mtimeMs": 1781269363000,
+ "size": 6710,
+ "lines": 107,
"role": "사용자 prompt 의 의도 분류 류 detection helpers. 모두 stateless 정규식 매칭. 옛 코드는 agent.ts 의 private 메서드로 박혀 있었는데, system prompt 빌더 (buildJarvisProjectBriefContext 등) 가 이걸 의존하면서 god-file 안에서 서로 얽힘. 헬퍼만 먼저 떼면 의존 그래프가",
"imports": []
},
"src/lib/contextBuilders/recentProjectKnowledge.ts": {
- "mtimeMs": 1779764602643.456,
- "size": 8905,
+ "mtimeMs": 1779621624000,
+ "size": 8714,
"lines": 191,
"role": "",
"imports": [
@@ -2384,7 +2427,7 @@
]
},
"src/lib/contextBuilders/scheduleContext.ts": {
- "mtimeMs": 1781170311837.847,
+ "mtimeMs": 1781260027000,
"size": 5418,
"lines": 97,
"role": "일정/할일 질의 컨텍스트 빌더 — \"오늘 업무 목록 알려줘\" 류 질문에 연결된 Google Calendar(iCal 캐시) + Google Tasks 의 실데이터를 주입한다. 문제: 채팅 경로(RAG)는 두뇌·기억만 검색해서, 캘린더가 연결돼 있어도 \"오늘 일정\"을 묻면 모델이 모르거나 지어냈다. 데일리 브리핑(텔레그램)과 같은 소스를 채팅에도 노출한다. ",
@@ -2395,8 +2438,8 @@
]
},
"src/lib/contextBuilders/secondBrainInventory.ts": {
- "mtimeMs": 1779764602643.456,
- "size": 6314,
+ "mtimeMs": 1779619757000,
+ "size": 6210,
"lines": 104,
"role": "",
"imports": [
@@ -2405,31 +2448,31 @@
]
},
"src/lib/contextBuilders/selfAssessContext.ts": {
- "mtimeMs": 1781234219748.3652,
- "size": 3903,
- "lines": 61,
+ "mtimeMs": 1781274586000,
+ "size": 5788,
+ "lines": 83,
"role": "자기 평가/개선 질의 컨텍스트 — \"기능 개선 아이디어 줘\" 류 질문에 ASTRA 의 현행 기능 인벤토리(자동 생성 문서)를 결정론적으로 직접 주입한다. 문제 (3회 재발한 자기 지식 구식화의 마지막 구멍): 인벤토리 문서를 자동 생성해도 RAG 점수 경쟁에서 안 뽑히거나 모델이 검색 없이 기억으로 답하면 — 실제 사례: 답변 말미에 \"출처: 모델 지식 (",
"imports": [
"src/extension/featureInventory"
]
},
"src/lib/contextBuilders/selfIdentity.ts": {
- "mtimeMs": 1781231922976.9702,
+ "mtimeMs": 1781260027000,
"size": 3418,
"lines": 28,
"role": "[ASTRA 자기 지식 + 1인칭 정체성] 블록 — Astra/Agent 양쪽 모드 system prompt 가 공유. 왜 필요한가 (BUG: 자기 오보고): - 이 블록이 없으면 \"너는 어떻게 성장해?\" 같은 메타 질문에 모델이 학습 데이터의 일반 LLM 보일러플레이트(\"나는 frozen 모델이라 학습하지 않는다\")로 답한다. 실제 ASTRA 는 레슨·장",
"imports": []
},
"src/lib/contextBuilders/systemPromptShaping.ts": {
- "mtimeMs": 1779764602644.5593,
- "size": 3200,
+ "mtimeMs": 1779621987000,
+ "size": 3122,
"lines": 78,
"role": "System prompt 의 조립 단계 에서 일어나는 두 가지 stateless 변환: 1) stripAstraFormattingForAgentMode — Agent Mode v3 에서 Astra 기본 시스템 프롬프트의 포맷/페르소나/스탠스 섹션을 제거. 에이전트 자체 프롬프트와 섹션 헤더가 충돌해 모델이 두 톤을 섞어 답하는 회귀를 막는다. 2) comp",
"imports": []
},
"src/lib/contextBuilders/thinFollowUp.ts": {
- "mtimeMs": 1779764602644.5593,
- "size": 2136,
+ "mtimeMs": 1779635357000,
+ "size": 2097,
"lines": 39,
"role": "",
"imports": [
@@ -2437,32 +2480,33 @@
]
},
"src/lib/contextBuilders/thinkingPartnerContract.ts": {
- "mtimeMs": 1779764602645.571,
- "size": 1310,
+ "mtimeMs": 1779618664000,
+ "size": 1289,
"lines": 21,
"role": "Thinking partner response contract — system prompt 에 항상 prepend 되는 6항목 응답 규약. 100% stateless 한 정적 문자열이라 god-file agent.ts 에 박혀 있을 이유 없음. 단위 테스트 / 다른 모드에서 재사용 / contract 수정 시 변경 범위 최소화를 위해 별도 모듈로 격리. 6",
"imports": []
},
"src/lib/contextBuilders/urlContext.ts": {
- "mtimeMs": 1781239183459.6887,
- "size": 3408,
- "lines": 64,
- "role": "URL 컨텍스트 빌더 — 채팅 프롬프트에 URL 이 있으면 본문을 추출해 실데이터로 주입. 문제: /wikify 는 URL 에 접근하지만(브리지 /api/web-extract), 일반 채팅에 URL 을 주면 추출 경로가 없어 모델이 \"접근할 수 없습니다\"라고 답하거나 내용을 추측했다. 수정: 강제 주입 패턴의 4번째 적용 (일정→캘린더, 자기평가→인벤토리,",
+ "mtimeMs": 1781269382000,
+ "size": 5438,
+ "lines": 108,
+ "role": "URL 컨텍스트 빌더 — 채팅 프롬프트에 URL 이 있으면 본문을 추출해 실데이터로 주입. 문제: /wikify 는 URL 에 접근하지만(브리지 /api/web-extract), 일반 채팅에 URL 을 주면 추출 경로가 없어 모델이 \"접근할 수 없습니다\"라고 답하거나 내용을 추측했다. v2: Bridge 100% 의존이 두 번째 공백이었다 — Bridge ",
"imports": [
"src/utils",
- "src/features/datacollect/bridgeClient"
+ "src/features/datacollect/bridgeClient",
+ "src/features/web/webFetch"
]
},
"src/lib/contextManager.ts": {
- "mtimeMs": 1779764602646.58,
- "size": 13536,
+ "mtimeMs": 1779513818000,
+ "size": 13258,
"lines": 278,
"role": "Context Manager (컨텍스트 한계 관리) \"context length = 132k\" 는 \"답변을 132k 토큰까지 생성해도 된다\" 가 아닙니다. 시스템 프롬프트 + 대화 기록 + 입력 문서 + 생성될 답변 + 여유분 ≤ context length 이 모듈은 요청을 보내기 전에 입력 토큰을 추정하고, - 동적으로 출력 상한(maxTokens)을 계",
"imports": []
},
"src/lib/diagnostics.ts": {
- "mtimeMs": 1779764602647.5833,
- "size": 9212,
+ "mtimeMs": 1779534648000,
+ "size": 8992,
"lines": 220,
"role": "",
"imports": [
@@ -2470,8 +2514,8 @@
]
},
"src/lib/discoverModels.ts": {
- "mtimeMs": 1780968581182.5598,
- "size": 3083,
+ "mtimeMs": 1781006628000,
+ "size": 3021,
"lines": 62,
"role": "",
"imports": [
@@ -2479,8 +2523,8 @@
]
},
"src/lib/engine.ts": {
- "mtimeMs": 1779764602648.587,
- "size": 53264,
+ "mtimeMs": 1779609235000,
+ "size": 52150,
"lines": 1114,
"role": "",
"imports": [
@@ -2494,8 +2538,8 @@
]
},
"src/lib/formatter.ts": {
- "mtimeMs": 1779764602649.5906,
- "size": 4772,
+ "mtimeMs": 1779609099000,
+ "size": 4676,
"lines": 96,
"role": "",
"imports": [
@@ -2503,29 +2547,29 @@
]
},
"src/lib/mtimeFileCache.ts": {
- "mtimeMs": 1780278539124.1875,
+ "mtimeMs": 1781006628000,
"size": 2553,
"lines": 72,
"role": "mtime-keyed file cache utility — 파일을 parse 결과 까지 캐싱. 배경: terminologyBlock.ts 와 termValidator.ts 가 같은 글로서리 파일에 별도 캐시 2개를 보유. \"함께 무효화\" 가 사람이 손으로 보장하는 invariant — 한쪽만 잊고 invalidate 안 하면 stale read 위험. 이 ",
"imports": []
},
"src/lib/paths.ts": {
- "mtimeMs": 1778664139961.0637,
- "size": 6567,
+ "mtimeMs": 1778591351000,
+ "size": 6416,
"lines": 151,
"role": "",
"imports": []
},
"src/lmstudio/activityTracker.ts": {
- "mtimeMs": 1778549008906.526,
- "size": 445,
+ "mtimeMs": 1778246443000,
+ "size": 426,
"lines": 19,
"role": "",
"imports": []
},
"src/lmstudio/client.ts": {
- "mtimeMs": 1779764602650.5938,
- "size": 11423,
+ "mtimeMs": 1779517529000,
+ "size": 11168,
"lines": 255,
"role": "",
"imports": [
@@ -2533,8 +2577,8 @@
]
},
"src/lmstudio/lifecycleManager.ts": {
- "mtimeMs": 1780971557004.6528,
- "size": 13855,
+ "mtimeMs": 1781006628000,
+ "size": 13528,
"lines": 327,
"role": "",
"imports": [
@@ -2545,8 +2589,8 @@
]
},
"src/lmstudio/streamer.ts": {
- "mtimeMs": 1779764602652.6316,
- "size": 13416,
+ "mtimeMs": 1779517620000,
+ "size": 13164,
"lines": 252,
"role": "",
"imports": [
@@ -2554,8 +2598,65 @@
"src/utils"
]
},
+ "src/memory/EpisodicMemory.ts": {
+ "mtimeMs": 1781006628000,
+ "size": 12819,
+ "lines": 341,
+ "role": "Episodic Memory (일화 기억) 과거 대화/회의/결정의 맥락 흐름을 저장합니다. 세션 종료 시 자동으로 에피소드를 요약하여 저장합니다. \"왜 이렇게 결정했는지\", \"어떤 흐름으로 진행했는지\" 기록. 저장 위치: {brainPath}/memory/episodes/.json",
+ "imports": [
+ "src/memory/types"
+ ]
+ },
+ "src/memory/LongTermMemory.ts": {
+ "mtimeMs": 1781006628000,
+ "size": 13135,
+ "lines": 322,
+ "role": "Long-Term Memory (장기 기억) 사용자의 취향, 프로젝트 목표, 반복 규칙, 과거 결정 사항을 영구적으로 저장하고 관리합니다. 저장 위치: {brainPath}/memory/longterm.json",
+ "imports": [
+ "src/memory/types"
+ ]
+ },
+ "src/memory/MemoryExtractor.ts": {
+ "mtimeMs": 1781006628000,
+ "size": 4282,
+ "lines": 120,
+ "role": "Memory Extractor (기억 추출기) 대화 종료 시 히스토리를 분석하여 각 메모리 레이어에 저장할 정보를 자동으로 추출합니다. LLM 호출 없이 패턴 매칭 기반으로 동작합니다.",
+ "imports": [
+ "src/memory/LongTermMemory",
+ "src/memory/ProjectMemory",
+ "src/memory/EpisodicMemory"
+ ]
+ },
+ "src/memory/ProceduralMemory.ts": {
+ "mtimeMs": 1777858120000,
+ "size": 5533,
+ "lines": 173,
+ "role": "Procedural Memory (절차 기억) 반복 작업의 절차와 패턴을 관리합니다. 기존 skill.md 시스템과 통합되어, Brain의 memory/procedures/ 아래의 MD 파일을 스캔하여 절차를 로드합니다. 저장 위치: {brainPath}/memory/procedures/.md",
+ "imports": [
+ "src/memory/types"
+ ]
+ },
+ "src/memory/ProjectMemory.ts": {
+ "mtimeMs": 1777864677000,
+ "size": 6533,
+ "lines": 212,
+ "role": "Project Memory (프로젝트 기억) 프로젝트별 요구사항, 코드 구조, 아키텍처 결정, 버그 기록 등을 Astra 확장 프로그램 내부에 저장하고 관리합니다. 저장 위치: {ConnectAI}/.astra/projectmemory.json (기존: {projectRoot}/.astra/ → 변경됨)",
+ "imports": [
+ "src/memory/types",
+ "src/core/astraPath"
+ ]
+ },
+ "src/memory/ShortTermMemory.ts": {
+ "mtimeMs": 1777858031000,
+ "size": 1167,
+ "lines": 37,
+ "role": "Short-Term Memory (단기 기억) 현재 대화의 즉시 맥락을 관리합니다. FIFO 방식으로 최근 N개 메시지를 유지합니다.",
+ "imports": [
+ "src/memory/types"
+ ]
+ },
"src/memory/distillation.ts": {
- "mtimeMs": 1780029994371.4304,
+ "mtimeMs": 1781006628000,
"size": 7826,
"lines": 200,
"role": "Distillation Loop — stale Episodic Memory → Long-Term \"episode-digest\" 승급. 배경: Episodic Memory 가 무한히 누적되면 검색 노이즈. 30일+ 지난 에피소드는 \"지금 이 순간 관련 가능성\" 보다 \"역사적 패턴\" 가치가 커서, 디테일을 압축해 Long-Term 으로 옮기고 원본은 archi",
@@ -2565,18 +2666,9 @@
"src/memory/types"
]
},
- "src/memory/EpisodicMemory.ts": {
- "mtimeMs": 1780029951842.101,
- "size": 13160,
- "lines": 341,
- "role": "Episodic Memory (일화 기억) 과거 대화/회의/결정의 맥락 흐름을 저장합니다. 세션 종료 시 자동으로 에피소드를 요약하여 저장합니다. \"왜 이렇게 결정했는지\", \"어떤 흐름으로 진행했는지\" 기록. 저장 위치: {brainPath}/memory/episodes/.json",
- "imports": [
- "src/memory/types"
- ]
- },
"src/memory/index.ts": {
- "mtimeMs": 1780030158922.7122,
- "size": 8053,
+ "mtimeMs": 1781006628000,
+ "size": 7828,
"lines": 225,
"role": "MemoryManager — 5-Layer Cognitive Memory System (통합 진입점) Astra의 모든 메모리 레이어를 통합 관리하는 중앙 매니저입니다. ① Short-Term Memory — 현재 대화 흐름 (FIFO) ② Long-Term Memory — 사용자 취향/규칙/결정 ③ Project Memory — 프로젝트별 지식 ④ Pro",
"imports": [
@@ -2591,63 +2683,15 @@
"src/memory/distillation"
]
},
- "src/memory/LongTermMemory.ts": {
- "mtimeMs": 1780625897996.766,
- "size": 13457,
- "lines": 322,
- "role": "Long-Term Memory (장기 기억) 사용자의 취향, 프로젝트 목표, 반복 규칙, 과거 결정 사항을 영구적으로 저장하고 관리합니다. 저장 위치: {brainPath}/memory/longterm.json",
- "imports": [
- "src/memory/types"
- ]
- },
- "src/memory/MemoryExtractor.ts": {
- "mtimeMs": 1780625907142.6775,
- "size": 4402,
- "lines": 120,
- "role": "Memory Extractor (기억 추출기) 대화 종료 시 히스토리를 분석하여 각 메모리 레이어에 저장할 정보를 자동으로 추출합니다. LLM 호출 없이 패턴 매칭 기반으로 동작합니다.",
- "imports": [
- "src/memory/LongTermMemory",
- "src/memory/ProjectMemory",
- "src/memory/EpisodicMemory"
- ]
- },
- "src/memory/ProceduralMemory.ts": {
- "mtimeMs": 1778028987416.5232,
- "size": 5706,
- "lines": 173,
- "role": "Procedural Memory (절차 기억) 반복 작업의 절차와 패턴을 관리합니다. 기존 skill.md 시스템과 통합되어, Brain의 memory/procedures/ 아래의 MD 파일을 스캔하여 절차를 로드합니다. 저장 위치: {brainPath}/memory/procedures/.md",
- "imports": [
- "src/memory/types"
- ]
- },
- "src/memory/ProjectMemory.ts": {
- "mtimeMs": 1778028987417.0342,
- "size": 6745,
- "lines": 212,
- "role": "Project Memory (프로젝트 기억) 프로젝트별 요구사항, 코드 구조, 아키텍처 결정, 버그 기록 등을 Astra 확장 프로그램 내부에 저장하고 관리합니다. 저장 위치: {ConnectAI}/.astra/projectmemory.json (기존: {projectRoot}/.astra/ → 변경됨)",
- "imports": [
- "src/memory/types",
- "src/core/astraPath"
- ]
- },
- "src/memory/ShortTermMemory.ts": {
- "mtimeMs": 1778028987418.1267,
- "size": 1204,
- "lines": 37,
- "role": "Short-Term Memory (단기 기억) 현재 대화의 즉시 맥락을 관리합니다. FIFO 방식으로 최근 N개 메시지를 유지합니다.",
- "imports": [
- "src/memory/types"
- ]
- },
"src/memory/types.ts": {
- "mtimeMs": 1780029896609.2737,
- "size": 4799,
+ "mtimeMs": 1781006628000,
+ "size": 4648,
"lines": 151,
"role": "Memory Type Definitions (메모리 타입 정의) Astra의 5-Layer Cognitive Memory System의 모든 타입을 정의합니다. ① Short-Term ② Long-Term ③ Project ④ Procedural ⑤ Episodic",
"imports": []
},
"src/retrieval/actionabilityScoring.ts": {
- "mtimeMs": 1780029379776.906,
+ "mtimeMs": 1781006628000,
"size": 6602,
"lines": 156,
"role": "Actionability Scoring — 검색 결과를 \"현재 작업 상태\" 신호로 재가중. 기존 TF-IDF (단어 매칭) + recency (시간) 만으로는 \"지금 이 사용자가 하고 있는 작업과 직접 연결 된 문서\" 가 우선되지 않음. 예: 사용자가 /runway 명령을 막 실행했다면 runway / 재무 관련 문서가 같은 키워드 매치 점수여도 더 위로 ",
@@ -2656,8 +2700,8 @@
]
},
"src/retrieval/brainIndex.ts": {
- "mtimeMs": 1781171738808.4268,
- "size": 23847,
+ "mtimeMs": 1781260027000,
+ "size": 23281,
"lines": 566,
"role": "Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 /.astra/brain-index.json 에",
"imports": [
@@ -2668,14 +2712,14 @@
]
},
"src/retrieval/chunker.ts": {
- "mtimeMs": 1780910566332.277,
+ "mtimeMs": 1781006628000,
"size": 6927,
"lines": 174,
"role": "Markdown Section Chunker (Phase 1-가) 긴 노트를 #~###### 헤딩 경계로 섹션 청크 로 나눈다. 파일 단위 색인은 5000자 다주제 문서를 하나의 흐릿한 단위로 만들어 검색 정밀도를 떨어뜨린다 — 섹션 단위로 쪼개면 질의가 정확히 해당 섹션에 매치된다 (제2뇌의 \"문서 청킹 전략\" 지식 그대로). 규칙: - 각 헤딩 ~ 다음",
"imports": []
},
"src/retrieval/citationTrace.ts": {
- "mtimeMs": 1781142381872.4841,
+ "mtimeMs": 1781260027000,
"size": 4887,
"lines": 102,
"role": "Citation Trace — 답변 끝 에 \"출처:\" 한 줄 명시 지시. CoVe Strict 모드 (v2.2.184) 와 차이: - CoVe Strict: 모든 사실 주장 뒤에 inline [S1] 인용 강제 — verbose, 학술적 - Citation Trace: 답변 끝에 사용된 출처 한 줄 정리 — 가벼움, 항상 ON 권장 둘은 함께 동작 가능. ",
@@ -2684,7 +2728,7 @@
]
},
"src/retrieval/conflictBlock.ts": {
- "mtimeMs": 1780025261798.6677,
+ "mtimeMs": 1781006628000,
"size": 8276,
"lines": 204,
"role": "Conflict Surface — [CONFLICT WARNINGS] 시스템 프롬프트 블록 생성. 기존 scoring.ts 가 문서당 conflictSeverity(NONE/LOW/MEDIUM/HIGH) 를 이미 계산하지만(반대/논란/vs 등 indicator 단어 카운트), LLM 은 그 사실을 모름. buildAstraModeSystemPrompt 의 ",
@@ -2694,8 +2738,8 @@
]
},
"src/retrieval/contextBudget.ts": {
- "mtimeMs": 1780654426656.6118,
- "size": 6442,
+ "mtimeMs": 1781006628000,
+ "size": 6286,
"lines": 156,
"role": "Context Budget Manager (컨텍스트 예산 관리) 시스템 프롬프트의 토큰 예산을 관리하여 로컬 모델의 context window를 효율적으로 활용합니다.",
"imports": [
@@ -2703,7 +2747,7 @@
]
},
"src/retrieval/coveBlock.ts": {
- "mtimeMs": 1780028941111.8562,
+ "mtimeMs": 1781006628000,
"size": 6062,
"lines": 121,
"role": "Chain-of-Verification (CoVe) — [VERIFICATION CHECKLIST] 시스템 프롬프트 블록 생성. 배경: 사용자 피드백 \"추론 결과가 나오기 직전, 이 결론이 확보된 지식(제2뇌)에만 근거하고 있는가? 를 스스로 질문하고 검증하는 로직\" — 할루시네이션 방지 + 그라운딩 명확화. 원논문 CoVe 는 2-pass (draft →",
@@ -2712,7 +2756,7 @@
]
},
"src/retrieval/embeddings.ts": {
- "mtimeMs": 1781171386826.0757,
+ "mtimeMs": 1781260027000,
"size": 8182,
"lines": 184,
"role": "Embeddings — local hybrid (sparse + dense) retrieval support TF-IDF is fast and zero-cost but misses synonyms / paraphrase. A small local embedding model (BGE-small, multilingual-e5-small, nomic-embed",
@@ -2721,14 +2765,14 @@
]
},
"src/retrieval/evalHarness.ts": {
- "mtimeMs": 1780908975047.264,
+ "mtimeMs": 1781006628000,
"size": 9812,
"lines": 218,
"role": "Retrieval Evaluation Harness 골든셋(질문 → 기대 문서)으로 brain 검색 품질을 recall@k / MRR 로 결정적으로 측정한다. 청킹·re-rank·embedding alpha 등 어떤 변경이 실제로 recall 을 올렸는지 숫자로 증명하기 위한 토대 — 이게 있어야 RAG 개선이 \"감(感)\" 이 아니라 무결성 있는 엔지니어링",
"imports": []
},
"src/retrieval/hierarchicalLevel.ts": {
- "mtimeMs": 1780030714979.2786,
+ "mtimeMs": 1781006628000,
"size": 5908,
"lines": 135,
"role": "Hierarchical Context Window — 질의·문서의 추상도 레벨 매칭으로 검색 노이즈 감소. 사용자 제안: \"사용자가 '배포해줘' 라고 하면 L1(실행) 우선, '전략 검토' 라고 하면 L3(전략) 우선\". 같은 키워드 매치 점수여도 추상도가 안 맞으면 noise. v1 — 3-level 휴리스틱 (LLM 호출 없음, 결정적): - concr",
@@ -2737,8 +2781,8 @@
]
},
"src/retrieval/index.ts": {
- "mtimeMs": 1781171760925.9387,
- "size": 37706,
+ "mtimeMs": 1781260027000,
+ "size": 36941,
"lines": 765,
"role": "RetrievalOrchestrator — Unified RAG Pipeline Astra의 모든 검색 소스를 통합 관리하는 오케스트레이터입니다. 검색 흐름: ① Query Planning — 의도 분류 + 검색 전략 결정 ② Parallel Search — Brain + Memory + Project + Episode 동시 검색 ③ Result Fusio",
"imports": [
@@ -2757,15 +2801,15 @@
]
},
"src/retrieval/intentClarification.ts": {
- "mtimeMs": 1780032375486.0012,
+ "mtimeMs": 1781006628000,
"size": 7076,
"lines": 141,
"role": "Intent Clarification — 모호한 질의에서 추측 답변 대신 질문 던지기 지시. 사용자 피드백: \"ASTRA 는 질문을 받으면 즉시 답변을 생성하려 함. 하지만 '날카로운' 파악을 위해서는 질문 뒤의 '실행 목적' 을 먼저 정의해야\". 예: \"배포해줘\" → 환경 (dev/prod) / 태그 묻기. \"그 부분 고쳐줘\" → 어느 파일/모듈인지 묻기",
"imports": []
},
"src/retrieval/knowledgeMix.ts": {
- "mtimeMs": 1778821115241.6562,
- "size": 7786,
+ "mtimeMs": 1778902489000,
+ "size": 7621,
"lines": 165,
"role": "Knowledge Mix — model 지식 vs Second Brain 지식의 상대 비율을 LLM에게 전달하는 정책 레이어. ── 정책 v2 (상대값+상대값=상대값) ────────────────────────────────────── weight는 0~100 정수이지만 상대 비율로만 해석한다. 즉 \"70\"은 \"100% 중 70%\"라는 상대 표현이고, 시",
"imports": [
@@ -2774,8 +2818,8 @@
]
},
"src/retrieval/lessonHelpers.ts": {
- "mtimeMs": 1778665428445.0337,
- "size": 14459,
+ "mtimeMs": 1778674336000,
+ "size": 14134,
"lines": 325,
"role": "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",
"imports": [
@@ -2783,14 +2827,14 @@
]
},
"src/retrieval/scoring.ts": {
- "mtimeMs": 1779764602655.6497,
- "size": 22638,
+ "mtimeMs": 1779536686000,
+ "size": 22097,
"lines": 541,
"role": "Scoring Engine — TF-IDF + Bilingual Tokenizer 단순 includes() 키워드 매칭을 넘어서, TF-IDF 가중치 기반의 문서 스코어링을 제공합니다. 한국어/영어 양국어 토크나이저를 포함합니다.",
"imports": []
},
"src/retrieval/semanticRerank.ts": {
- "mtimeMs": 1780030762153.9978,
+ "mtimeMs": 1781006628000,
"size": 8205,
"lines": 213,
"role": "LLM Semantic Re-ranking — TF-IDF / 임베딩이 놓치는 의도 매치를 작은 LLM 호출 한 번으로 잡는다. 동작: 1. 1차 검색(TF-IDF + embedding + 부스트들) 결과의 상위 K (기본 15) 후보를 추출 2. 가벼운 프롬프트로 LLM 에게 \"이 중 query 의도에 가장 부합하는 순서로 ID 나열\" 요청 3. LLM ",
@@ -2799,7 +2843,7 @@
]
},
"src/retrieval/terminologyBlock.ts": {
- "mtimeMs": 1780278609386.6382,
+ "mtimeMs": 1781006628000,
"size": 5450,
"lines": 127,
"role": "Terminology Dictionary — 프로젝트 표준 용어집을 시스템 프롬프트에 주입. 사용자 제안: \"표준 표기 강제 + 답변 내 표기 일관성 검증\". 예: runway vs 런웨이, P-Reinforce vs p-reinforce, Chronicle vs 크로니클. 설계 — 사용자 편집 markdown 파일: - 위치: /.as",
@@ -2808,15 +2852,15 @@
]
},
"src/retrieval/types.ts": {
- "mtimeMs": 1780654426658.6223,
- "size": 2485,
+ "mtimeMs": 1779536706000,
+ "size": 2419,
"lines": 66,
"role": "Retrieval Types (검색 결과 통합 타입) 모든 검색 소스(Brain, Memory, Project, Episode)의 결과를 통합 인터페이스로 정의합니다.",
"imports": []
},
"src/scaffolder/projectScaffolder.ts": {
- "mtimeMs": 1778549008910.5835,
- "size": 4619,
+ "mtimeMs": 1778251854000,
+ "size": 4508,
"lines": 111,
"role": "",
"imports": [
@@ -2826,22 +2870,22 @@
]
},
"src/scaffolder/templates.ts": {
- "mtimeMs": 1778549008910.5835,
- "size": 5051,
+ "mtimeMs": 1778251830000,
+ "size": 4897,
"lines": 154,
"role": "Scaffolder template catalog. Templates are pure data — (projectName) => { [relativePath]: contents }. New templates are added by appending to TEMPLATES; the rest of the scaffolder (validation, IO, com",
"imports": []
},
"src/security.ts": {
- "mtimeMs": 1779764602656.6587,
- "size": 6333,
+ "mtimeMs": 1779494950000,
+ "size": 6174,
"lines": 159,
"role": "",
"imports": []
},
"src/sidebar/agentHandlers.ts": {
- "mtimeMs": 1778720117552.737,
- "size": 7921,
+ "mtimeMs": 1778676515000,
+ "size": 7752,
"lines": 169,
"role": "",
"imports": [
@@ -2851,8 +2895,8 @@
]
},
"src/sidebar/brainHandlers.ts": {
- "mtimeMs": 1778549008912.5908,
- "size": 1113,
+ "mtimeMs": 1778248976000,
+ "size": 1080,
"lines": 33,
"role": "",
"imports": [
@@ -2860,8 +2904,8 @@
]
},
"src/sidebar/builders/agentSkillResolver.ts": {
- "mtimeMs": 1779764602657.666,
- "size": 4340,
+ "mtimeMs": 1779628200000,
+ "size": 4250,
"lines": 90,
"role": "",
"imports": [
@@ -2871,8 +2915,8 @@
]
},
"src/sidebar/builders/alignmentCardPayloads.ts": {
- "mtimeMs": 1779764602658.6692,
- "size": 1558,
+ "mtimeMs": 1779628760000,
+ "size": 1517,
"lines": 41,
"role": "",
"imports": [
@@ -2880,8 +2924,8 @@
]
},
"src/sidebar/builders/alignmentRouting.ts": {
- "mtimeMs": 1779764602658.6692,
- "size": 1959,
+ "mtimeMs": 1779630169000,
+ "size": 1918,
"lines": 41,
"role": "",
"imports": [
@@ -2889,8 +2933,8 @@
]
},
"src/sidebar/builders/architecturePayloads.ts": {
- "mtimeMs": 1779764602659.7676,
- "size": 4413,
+ "mtimeMs": 1779629073000,
+ "size": 4306,
"lines": 107,
"role": "",
"imports": [
@@ -2899,15 +2943,15 @@
]
},
"src/sidebar/builders/autoChronicleClassifier.ts": {
- "mtimeMs": 1779764602659.7676,
- "size": 4350,
+ "mtimeMs": 1779627010000,
+ "size": 4262,
"lines": 88,
"role": "",
"imports": []
},
"src/sidebar/builders/autoChroniclePayloads.ts": {
- "mtimeMs": 1779764602660.7708,
- "size": 4822,
+ "mtimeMs": 1779627191000,
+ "size": 4706,
"lines": 116,
"role": "",
"imports": [
@@ -2917,15 +2961,15 @@
]
},
"src/sidebar/builders/brainProfileHelpers.ts": {
- "mtimeMs": 1779764602660.7708,
- "size": 1133,
+ "mtimeMs": 1779626545000,
+ "size": 1109,
"lines": 24,
"role": "Brain profile lifecycle 의 pure helpers — sidebarProvider 의 add/edit/delete 흐름에서 modal UI 와 config 쓰기를 제외한 데이터 변환 만 격리. 현재 한 함수만 있지만 향후 edit 의 \"변경된 필드만 머지\", delete 의 \"next active 선택 규칙\" 등 다른 pure trans",
"imports": []
},
"src/sidebar/builders/chroniclePayloads.ts": {
- "mtimeMs": 1779764602661.7737,
- "size": 1842,
+ "mtimeMs": 1779625757000,
+ "size": 1793,
"lines": 49,
"role": "",
"imports": [
@@ -2933,8 +2977,8 @@
]
},
"src/sidebar/builders/companyPayloads.ts": {
- "mtimeMs": 1779764602661.7737,
- "size": 9186,
+ "mtimeMs": 1779625178000,
+ "size": 8984,
"lines": 202,
"role": "",
"imports": [
@@ -2942,8 +2986,8 @@
]
},
"src/sidebar/builders/companyTurnEmitter.ts": {
- "mtimeMs": 1779764602662.786,
- "size": 2539,
+ "mtimeMs": 1779629947000,
+ "size": 2485,
"lines": 54,
"role": "",
"imports": [
@@ -2951,9 +2995,9 @@
]
},
"src/sidebar/builders/dispatcherDepsBuilder.ts": {
- "mtimeMs": 1779764602663.7969,
- "size": 3529,
- "lines": 68,
+ "mtimeMs": 1781262929000,
+ "size": 3821,
+ "lines": 74,
"role": "",
"imports": [
"src/features/company",
@@ -2963,15 +3007,15 @@
]
},
"src/sidebar/builders/proactiveSuggestions.ts": {
- "mtimeMs": 1779764602663.7969,
- "size": 1515,
+ "mtimeMs": 1779626190000,
+ "size": 1485,
"lines": 30,
"role": "Proactive suggestion tip 한 줄 텍스트 — 사이드바가 사용자의 특정 탐색 행동 (settings 열기, brain sync 보기, agent 선택 등) 을 감지하면 채팅에 callout 으로 잠깐 띄우는 도움말. Stateless lookup table — sidebarProvider 의 옛 handleProactiveSuggestion",
"imports": []
},
"src/sidebar/builders/projectProfileFactories.ts": {
- "mtimeMs": 1779764602664.8113,
- "size": 4590,
+ "mtimeMs": 1779627696000,
+ "size": 4484,
"lines": 106,
"role": "",
"imports": [
@@ -2980,8 +3024,8 @@
]
},
"src/sidebar/builders/promptAttachments.ts": {
- "mtimeMs": 1779764602664.8113,
- "size": 6092,
+ "mtimeMs": 1779627922000,
+ "size": 5975,
"lines": 117,
"role": "",
"imports": [
@@ -2989,8 +3033,8 @@
]
},
"src/sidebar/builders/sessionPayloads.ts": {
- "mtimeMs": 1779764602665.827,
- "size": 2397,
+ "mtimeMs": 1779628917000,
+ "size": 2334,
"lines": 63,
"role": "",
"imports": [
@@ -2999,24 +3043,24 @@
]
},
"src/sidebar/builders/statusPayloads.ts": {
- "mtimeMs": 1779764602665.827,
- "size": 4461,
- "lines": 107,
+ "mtimeMs": 1781272890000,
+ "size": 4546,
+ "lines": 110,
"role": "",
"imports": [
"src/config"
]
},
"src/sidebar/builders/textHelpers.ts": {
- "mtimeMs": 1779764602666.8687,
- "size": 1433,
+ "mtimeMs": 1779625537000,
+ "size": 1399,
"lines": 34,
"role": "sidebarProvider 가 chronicle 기록 / 세션 title / YAML frontmatter 등에서 공통으로 쓰는 작은 텍스트 변환 헬퍼. 모두 stateless. - slugify(value) — kebab-case slug (한/영/숫자 보존, 48자 cap) - summarizeForTitle(value) — chat title 표시용",
"imports": []
},
"src/sidebar/builders/wikiRaw.ts": {
- "mtimeMs": 1779764602666.8687,
- "size": 4233,
+ "mtimeMs": 1779625926000,
+ "size": 4136,
"lines": 97,
"role": "",
"imports": [
@@ -3025,8 +3069,8 @@
]
},
"src/sidebar/chatHandlers.ts": {
- "mtimeMs": 1779764602667.872,
- "size": 26431,
+ "mtimeMs": 1779669848000,
+ "size": 25980,
"lines": 451,
"role": "",
"imports": [
@@ -3041,8 +3085,8 @@
]
},
"src/sidebar/chronicleHandlers.ts": {
- "mtimeMs": 1779764602668.8755,
- "size": 2481,
+ "mtimeMs": 1779514386000,
+ "size": 2422,
"lines": 59,
"role": "",
"imports": [
@@ -3050,8 +3094,8 @@
]
},
"src/sidebar/companyHandlers.ts": {
- "mtimeMs": 1779764602669.881,
- "size": 18453,
+ "mtimeMs": 1781260027000,
+ "size": 18106,
"lines": 347,
"role": "",
"imports": [
@@ -3061,15 +3105,15 @@
]
},
"src/sidebar/managers/agentSkillStore.ts": {
- "mtimeMs": 1779764602669.881,
- "size": 5691,
+ "mtimeMs": 1779626174000,
+ "size": 5563,
"lines": 128,
"role": "",
"imports": []
},
"src/sidebar/managers/approvalGates.ts": {
- "mtimeMs": 1779764602670.8843,
- "size": 2818,
+ "mtimeMs": 1779601410000,
+ "size": 2755,
"lines": 63,
"role": "",
"imports": [
@@ -3077,8 +3121,8 @@
]
},
"src/sidebar/managers/architectureWatch.ts": {
- "mtimeMs": 1779764602670.8843,
- "size": 4320,
+ "mtimeMs": 1779617624000,
+ "size": 4230,
"lines": 90,
"role": "",
"imports": [
@@ -3088,8 +3132,8 @@
]
},
"src/sidebar/managers/chatSessionStore.ts": {
- "mtimeMs": 1779764602671.8875,
- "size": 4865,
+ "mtimeMs": 1779623748000,
+ "size": 4755,
"lines": 110,
"role": "",
"imports": [
@@ -3098,8 +3142,8 @@
]
},
"src/sidebar/managers/chronicleProjectStore.ts": {
- "mtimeMs": 1779764602671.8875,
- "size": 2428,
+ "mtimeMs": 1779627762000,
+ "size": 2378,
"lines": 50,
"role": "",
"imports": [
@@ -3108,8 +3152,8 @@
]
},
"src/sidebar/managers/companyTurn.ts": {
- "mtimeMs": 1779764602672.8894,
- "size": 4513,
+ "mtimeMs": 1779617783000,
+ "size": 4397,
"lines": 116,
"role": "",
"imports": [
@@ -3117,8 +3161,8 @@
]
},
"src/sidebar/managers/modelDiscovery.ts": {
- "mtimeMs": 1779764602673.9143,
- "size": 6273,
+ "mtimeMs": 1779624023000,
+ "size": 6127,
"lines": 146,
"role": "",
"imports": [
@@ -3127,8 +3171,8 @@
]
},
"src/sidebar/managers/pixelOfficeHelpers.ts": {
- "mtimeMs": 1779764602675.0503,
- "size": 6355,
+ "mtimeMs": 1781260027000,
+ "size": 6199,
"lines": 156,
"role": "",
"imports": [
@@ -3137,8 +3181,8 @@
]
},
"src/sidebar/managers/pixelOfficeLayoutStore.ts": {
- "mtimeMs": 1779764602675.0503,
- "size": 1709,
+ "mtimeMs": 1781260027000,
+ "size": 1672,
"lines": 37,
"role": "",
"imports": [
@@ -3146,8 +3190,8 @@
]
},
"src/sidebar/managers/pixelOfficeState.ts": {
- "mtimeMs": 1779764602676.0718,
- "size": 3571,
+ "mtimeMs": 1781260027000,
+ "size": 3494,
"lines": 77,
"role": "",
"imports": [
@@ -3156,8 +3200,8 @@
]
},
"src/sidebar/managers/sessionStateStore.ts": {
- "mtimeMs": 1779764602676.0718,
- "size": 2914,
+ "mtimeMs": 1779628403000,
+ "size": 2851,
"lines": 63,
"role": "",
"imports": [
@@ -3165,8 +3209,8 @@
]
},
"src/sidebar/registry.ts": {
- "mtimeMs": 1779764602677.081,
- "size": 1949,
+ "mtimeMs": 1779600922000,
+ "size": 1898,
"lines": 51,
"role": "",
"imports": [
@@ -3174,9 +3218,9 @@
]
},
"src/sidebarProvider.ts": {
- "mtimeMs": 1780907511341.9016,
- "size": 157039,
- "lines": 3180,
+ "mtimeMs": 1781272916000,
+ "size": 167809,
+ "lines": 3487,
"role": "",
"imports": [
"src/utils",
@@ -3223,17 +3267,20 @@
"src/sidebar/builders/alignmentRouting",
"src/skills/agentKnowledgeMap",
"src/retrieval/brainIndex",
+ "src/features/web/webFetch",
+ "src/lib/contextBuilders/urlContext",
"src/lib/contextManager",
"src/features/projectArchitecture",
"src/features/projectArchitecture/intentDetector",
"src/features/company",
"src/core/services",
+ "src/core/health",
"src/features/astraOffice"
]
},
"src/skills/agentKnowledgeMap.ts": {
- "mtimeMs": 1778720117565.968,
- "size": 16081,
+ "mtimeMs": 1778676092000,
+ "size": 15707,
"lines": 374,
"role": "",
"imports": [
@@ -3242,8 +3289,8 @@
]
},
"src/skills/externalSkillLoader.ts": {
- "mtimeMs": 1778549008916.6155,
- "size": 6018,
+ "mtimeMs": 1778470672000,
+ "size": 5859,
"lines": 159,
"role": "",
"imports": [
@@ -3252,8 +3299,8 @@
]
},
"src/skills/scopedBrainRetriever.ts": {
- "mtimeMs": 1779411581885.858,
- "size": 6369,
+ "mtimeMs": 1779492050000,
+ "size": 6213,
"lines": 156,
"role": "",
"imports": [
@@ -3265,8 +3312,8 @@
]
},
"src/skills/skillInjectionService.ts": {
- "mtimeMs": 1778549008918.12,
- "size": 6421,
+ "mtimeMs": 1778681774000,
+ "size": 6276,
"lines": 145,
"role": "",
"imports": [
@@ -3275,23 +3322,23 @@
]
},
"src/system/specs.ts": {
- "mtimeMs": 1778549008918.12,
- "size": 4444,
+ "mtimeMs": 1778251036000,
+ "size": 4326,
"lines": 118,
"role": "",
"imports": []
},
"src/types/interfaces.ts": {
- "mtimeMs": 1778036927218.7627,
- "size": 1299,
+ "mtimeMs": 1778169995000,
+ "size": 1260,
"lines": 39,
"role": "Service Interfaces (서비스 인터페이스 정의) 각 서비스(Agent, Brain, FileSystem 등)의 추상화 인터페이스를 정의합니다. 의존성 주입(DI)과 단위 테스트를 위해 필수적입니다.",
"imports": []
},
"src/utils.ts": {
- "mtimeMs": 1781240101964.1643,
- "size": 27593,
- "lines": 472,
+ "mtimeMs": 1781267310000,
+ "size": 28160,
+ "lines": 485,
"role": "",
"imports": [
"src/config",
@@ -3299,50 +3346,50 @@
]
},
"media/settings-panel.css": {
- "mtimeMs": 1780882667511.7163,
- "size": 6041,
+ "mtimeMs": 1781006628000,
+ "size": 5787,
"lines": 254,
"role": "Stylesheet",
"imports": []
},
"media/settings-panel.html": {
- "mtimeMs": 1780882658555.451,
- "size": 26332,
+ "mtimeMs": 1781006628000,
+ "size": 25892,
"lines": 440,
"role": "Astra Settings",
"imports": []
},
"media/settings-panel.js": {
- "mtimeMs": 1780881704898.5125,
- "size": 24963,
+ "mtimeMs": 1781006628000,
+ "size": 24458,
"lines": 505,
"role": "",
"imports": []
},
"media/sidebar.css": {
- "mtimeMs": 1779764602575.4897,
- "size": 91876,
+ "mtimeMs": 1781261553000,
+ "size": 90145,
"lines": 2114,
"role": "Stylesheet",
"imports": []
},
"media/sidebar.html": {
- "mtimeMs": 1779764602576.522,
- "size": 35100,
+ "mtimeMs": 1781260027000,
+ "size": 34561,
"lines": 539,
"role": "Astra",
"imports": []
},
"media/sidebar.js": {
- "mtimeMs": 1779764602577.525,
- "size": 233458,
- "lines": 3933,
+ "mtimeMs": 1781272941000,
+ "size": 231565,
+ "lines": 3947,
"role": "",
"imports": []
},
"tests/agentEngine.test.ts": {
- "mtimeMs": 1779764602680.0923,
- "size": 19463,
+ "mtimeMs": 1779609795000,
+ "size": 19050,
"lines": 413,
"role": "AgentEngine Tests — Chunked Writer Architecture 예전 buildup(planner → researcher → reflector → writer → synthesizer)을 단일 ChunkedWriter 의 outline → section[N] → polish 로 교체한 뒤의 회귀 테스트. 다루는 범위: 1. ErrorC",
"imports": [
@@ -3350,9 +3397,21 @@
"src/config"
]
},
+ "tests/alignmentResearch.test.ts": {
+ "mtimeMs": 1781261630000,
+ "size": 9071,
+ "lines": 208,
+ "role": "",
+ "imports": [
+ "src/features/company/alignmentResearch",
+ "src/retrieval/brainIndex",
+ "src/utils",
+ "src/core/services"
+ ]
+ },
"tests/approvalQueue.test.ts": {
- "mtimeMs": 1778549008920.1624,
- "size": 6079,
+ "mtimeMs": 1778251690000,
+ "size": 5915,
"lines": 164,
"role": "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.",
"imports": [
@@ -3360,8 +3419,8 @@
]
},
"tests/brainIndex.test.ts": {
- "mtimeMs": 1778664139970.806,
- "size": 5513,
+ "mtimeMs": 1778594450000,
+ "size": 5406,
"lines": 107,
"role": "",
"imports": [
@@ -3369,8 +3428,8 @@
]
},
"tests/calendarApi.test.ts": {
- "mtimeMs": 1779065453894.5227,
- "size": 5234,
+ "mtimeMs": 1778935637000,
+ "size": 5103,
"lines": 131,
"role": "",
"imports": [
@@ -3379,7 +3438,7 @@
]
},
"tests/confidenceEngine.test.ts": {
- "mtimeMs": 1781142599349.454,
+ "mtimeMs": 1781260027000,
"size": 7643,
"lines": 175,
"role": "Confidence Engine + Escalation Engine (Self-Evolving OS Phase 2) 단위 테스트. 순수 함수만 검증 — vscode 의존 없음.",
@@ -3392,7 +3451,7 @@
]
},
"tests/conflictCheck.test.ts": {
- "mtimeMs": 1781152468767.2957,
+ "mtimeMs": 1781260027000,
"size": 2915,
"lines": 65,
"role": "Schedule Conflict Check (Self-Evolving OS Track 6-2/6-3) 테스트.",
@@ -3402,8 +3461,8 @@
]
},
"tests/contextManager.test.ts": {
- "mtimeMs": 1779764602681.109,
- "size": 7904,
+ "mtimeMs": 1779514030000,
+ "size": 7755,
"lines": 149,
"role": "",
"imports": [
@@ -3411,7 +3470,7 @@
]
},
"tests/correctionLoop.test.ts": {
- "mtimeMs": 1781173427471.894,
+ "mtimeMs": 1781260027000,
"size": 7272,
"lines": 158,
"role": "Correction Loop 단위 테스트 — 순수 로직 (감지·프로필·레슨·큐 등록·영속화). LLM 의존 부분(classifyCorrection)은 엔드포인트 실패 → 휴리스틱 fallback 경로만 검증.",
@@ -3421,7 +3480,7 @@
]
},
"tests/criticReflectionEval.test.ts": {
- "mtimeMs": 1781144662610.272,
+ "mtimeMs": 1781260027000,
"size": 8327,
"lines": 200,
"role": "Critic Agent / Reflection Store / Task Eval Harness (Self-Evolving OS P1 잔여 + P3) 테스트.",
@@ -3433,8 +3492,8 @@
]
},
"tests/dataProcessor.test.ts": {
- "mtimeMs": 1778028987448.8394,
- "size": 3517,
+ "mtimeMs": 1777808065000,
+ "size": 3430,
"lines": 87,
"role": "/ ",
"imports": [
@@ -3442,8 +3501,8 @@
]
},
"tests/devilAgent.test.ts": {
- "mtimeMs": 1779065453895.5222,
- "size": 3240,
+ "mtimeMs": 1778943907000,
+ "size": 3179,
"lines": 61,
"role": "",
"imports": [
@@ -3451,7 +3510,7 @@
]
},
"tests/featureInventory.test.ts": {
- "mtimeMs": 1781232120081.0696,
+ "mtimeMs": 1781260027000,
"size": 2613,
"lines": 58,
"role": "기능 인벤토리 자동 생성 + 충돌 스캔 대상 필터 — 순수 로직 테스트. (자기 지식 구식화 버그의 근본 수정: 인벤토리가 package.json 에서 기계 생성되는지)",
@@ -3461,8 +3520,8 @@
]
},
"tests/findBrainFilesCache.test.ts": {
- "mtimeMs": 1778549008921.7842,
- "size": 2800,
+ "mtimeMs": 1778247665000,
+ "size": 2720,
"lines": 80,
"role": "Unit tests for findBrainFiles TTL cache.",
"imports": [
@@ -3470,7 +3529,7 @@
]
},
"tests/hangulHygiene.test.ts": {
- "mtimeMs": 1781239721715.7893,
+ "mtimeMs": 1781260027000,
"size": 2573,
"lines": 54,
"role": "한·영 깨진 토큰 감지·수리 — 순수 로직 테스트.",
@@ -3479,8 +3538,8 @@
]
},
"tests/helpers/mockLLMClient.ts": {
- "mtimeMs": 1779764602682.1555,
- "size": 3675,
+ "mtimeMs": 1779601519000,
+ "size": 3563,
"lines": 112,
"role": "MockLLMClient — IAIService 의 Mock 구현체. 의도: 회사 모드 dispatcher / ChunkedWriter / ceoPlanner 등 LLM 을 호출하는 코드 경로를 CI 환경에서도 테스트 가능하게. 실제 Ollama / LM Studio 없이도 응답을 미리 정의하거나 동적으로 생성 가능. 사용 예: const ai = new ",
"imports": [
@@ -3488,8 +3547,8 @@
]
},
"tests/icsParser.test.ts": {
- "mtimeMs": 1779065453895.5222,
- "size": 5145,
+ "mtimeMs": 1778934828000,
+ "size": 5011,
"lines": 134,
"role": "",
"imports": [
@@ -3497,8 +3556,8 @@
]
},
"tests/integration/mockLLMClient.test.ts": {
- "mtimeMs": 1779764602683.1582,
- "size": 3017,
+ "mtimeMs": 1779601548000,
+ "size": 2931,
"lines": 86,
"role": "MockLLMClient 자체의 sanity test. 이게 통과하면 dispatcher / ceoPlanner / ChunkedWriter 등 IAIService 를 받는 코드가 실제 LLM 없이 단위 / integration 테스트 가능. 향후 dispatcher 의 multi-stage flow 같은 큰 integration 테스트는 이 mock 을 ",
"imports": [
@@ -3506,8 +3565,8 @@
]
},
"tests/integration_retrieval.test.ts": {
- "mtimeMs": 1779764602683.1582,
- "size": 4104,
+ "mtimeMs": 1779536730000,
+ "size": 4013,
"lines": 91,
"role": "",
"imports": [
@@ -3516,7 +3575,7 @@
]
},
"tests/knowledgeOps.test.ts": {
- "mtimeMs": 1781147477013.794,
+ "mtimeMs": 1781260027000,
"size": 8035,
"lines": 174,
"role": "Knowledge Validation / Belief Revision / Decay / Debt (Self-Evolving OS Phase 4 — 지식 운영) 테스트.",
@@ -3529,8 +3588,8 @@
]
},
"tests/lessonHelpers.test.ts": {
- "mtimeMs": 1778664139972.9592,
- "size": 9591,
+ "mtimeMs": 1778595482000,
+ "size": 9400,
"lines": 191,
"role": "",
"imports": [
@@ -3538,7 +3597,7 @@
]
},
"tests/lessonNetwork.test.ts": {
- "mtimeMs": 1781235008042.3987,
+ "mtimeMs": 1781260027000,
"size": 4375,
"lines": 84,
"role": "레슨 네트워크(A-MEM 이식) + 통합 초안 형식 — 순수 로직 테스트.",
@@ -3549,8 +3608,8 @@
]
},
"tests/lmStudioLifecycle.test.ts": {
- "mtimeMs": 1780971798141.8428,
- "size": 12218,
+ "mtimeMs": 1781006628000,
+ "size": 11888,
"lines": 330,
"role": "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",
"imports": [
@@ -3560,8 +3619,8 @@
]
},
"tests/lmStudioStreamer.test.ts": {
- "mtimeMs": 1779764602685.173,
- "size": 9010,
+ "mtimeMs": 1779516692000,
+ "size": 8788,
"lines": 222,
"role": "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.",
"imports": [
@@ -3570,8 +3629,8 @@
]
},
"tests/localPathPreflight.test.ts": {
- "mtimeMs": 1779764602686.1758,
- "size": 25530,
+ "mtimeMs": 1779622608000,
+ "size": 25010,
"lines": 520,
"role": "",
"imports": [
@@ -3589,7 +3648,7 @@
]
},
"tests/meetRegistration.test.ts": {
- "mtimeMs": 1781162418444.7136,
+ "mtimeMs": 1781260027000,
"size": 5116,
"lines": 110,
"role": "/meet 확신 게이트 — 분류·confirm 파싱·날짜 정규화 테스트. 정책: 확정+기한만 자동, 진행미정/기한미정/조건부는 보류, 반복은 첫 1회, 과거 날짜는 등록하되 완료확인 표기, 기한 해석 불가 확정건은 보류(추측 등록 금지).",
@@ -3598,14 +3657,14 @@
]
},
"tests/mocks/vscode.js": {
- "mtimeMs": 1778549008931.3582,
- "size": 1738,
+ "mtimeMs": 1778246810000,
+ "size": 1670,
"lines": 68,
"role": "",
"imports": []
},
"tests/needEngineQueue.test.ts": {
- "mtimeMs": 1781146804618.2693,
+ "mtimeMs": 1781260027000,
"size": 7123,
"lines": 159,
"role": "Gap Detector / Need Engine / Knowledge Inventory / Learning Queue (Self-Evolving OS Phase 3 — 성장 루프 코어) 테스트.",
@@ -3617,8 +3676,8 @@
]
},
"tests/officeSchema.test.ts": {
- "mtimeMs": 1779065453896.7021,
- "size": 10125,
+ "mtimeMs": 1781260027000,
+ "size": 9884,
"lines": 241,
"role": "",
"imports": [
@@ -3628,8 +3687,8 @@
]
},
"tests/paths.test.ts": {
- "mtimeMs": 1778549008931.3582,
- "size": 2674,
+ "mtimeMs": 1778250990000,
+ "size": 2590,
"lines": 84,
"role": "Unit tests for the centralized path resolver.",
"imports": [
@@ -3637,8 +3696,8 @@
]
},
"tests/pipelineTemplates.test.ts": {
- "mtimeMs": 1779065453897.361,
- "size": 3053,
+ "mtimeMs": 1778934174000,
+ "size": 2984,
"lines": 69,
"role": "",
"imports": [
@@ -3646,8 +3705,8 @@
]
},
"tests/projectChronicle.test.ts": {
- "mtimeMs": 1778029332769.3286,
- "size": 8558,
+ "mtimeMs": 1778169995000,
+ "size": 8359,
"lines": 199,
"role": "",
"imports": [
@@ -3655,8 +3714,8 @@
]
},
"tests/projectChronicleGuardPrompt.test.ts": {
- "mtimeMs": 1778028987452.0652,
- "size": 2890,
+ "mtimeMs": 1777808369000,
+ "size": 2838,
"lines": 52,
"role": "",
"imports": [
@@ -3664,8 +3723,8 @@
]
},
"tests/projectScaffolder.test.ts": {
- "mtimeMs": 1778549008932.6519,
- "size": 5935,
+ "mtimeMs": 1778251915000,
+ "size": 5800,
"lines": 135,
"role": "Unit tests for FileSystemProjectScaffolder. Drives against a real temp directory so end-to-end file IO + path-traversal defenses are exercised.",
"imports": [
@@ -3673,8 +3732,8 @@
]
},
"tests/providers.test.ts": {
- "mtimeMs": 1779065453898.3752,
- "size": 4215,
+ "mtimeMs": 1778942187000,
+ "size": 4118,
"lines": 97,
"role": "",
"imports": [
@@ -3683,7 +3742,7 @@
]
},
"tests/requirementGraph.test.ts": {
- "mtimeMs": 1781140474254.644,
+ "mtimeMs": 1781260027000,
"size": 5535,
"lines": 126,
"role": "Requirement Graph (Self-Evolving OS Phase 1 / Track 2-1) 단위 테스트. 순수 함수만 검증 — vscode 의존 없음.",
@@ -3692,7 +3751,7 @@
]
},
"tests/researchSkill.test.ts": {
- "mtimeMs": 1781147950430.0676,
+ "mtimeMs": 1781260027000,
"size": 5860,
"lines": 122,
"role": "Research Agent / Skill Score / Success Pattern DB (Self-Evolving OS Phase 6) 테스트.",
@@ -3704,8 +3763,8 @@
]
},
"tests/resilience_stress.test.ts": {
- "mtimeMs": 1779764602686.1758,
- "size": 8610,
+ "mtimeMs": 1779534568000,
+ "size": 8413,
"lines": 197,
"role": "Resilience & Boundary Stress Test Suite (v2.77.3) 이 테스트는 ConnectAI 엔진이 극한의 환경(인증 실패, 네트워크 차단, 타임아웃 등)에서 얼마나 안정적으로 복구되고, 신뢰성 지표(Resilience Metrics)를 정확히 기록하는지 검증합니다.",
"imports": [
@@ -3713,8 +3772,8 @@
]
},
"tests/resilience_v4.test.ts": {
- "mtimeMs": 1778028987453.5366,
- "size": 3519,
+ "mtimeMs": 1777978211000,
+ "size": 3435,
"lines": 84,
"role": "",
"imports": [
@@ -3723,8 +3782,8 @@
]
},
"tests/responseRecovery.test.ts": {
- "mtimeMs": 1778664139974.819,
- "size": 8933,
+ "mtimeMs": 1778598707000,
+ "size": 8782,
"lines": 151,
"role": "",
"imports": [
@@ -3732,7 +3791,7 @@
]
},
"tests/retrievalEvalCompare.test.ts": {
- "mtimeMs": 1781167712806.1748,
+ "mtimeMs": 1781260027000,
"size": 4115,
"lines": 86,
"role": "검색 모드 A/B 측정 — 파일 단위(baseline) vs 섹션 청크(Phase 1-가). 평소 테스트 런에서는 skip 된다 (실제 두뇌 폴더 + 수천 파일 인덱싱이 필요해 CI/패키징에 부적합). 수동 실행: ASTRAEVALBRAIN=\"E:/Wiki/2nd/10Wiki/Topics\" npx jest tests/retrievalEvalCompare.t",
@@ -3744,7 +3803,7 @@
]
},
"tests/retrievalEvalEmbedding.test.ts": {
- "mtimeMs": 1781170974222.5422,
+ "mtimeMs": 1781260027000,
"size": 5598,
"lines": 106,
"role": "하이브리드(sparse+dense) 검색 측정 — 청크 TF-IDF vs 청크+임베딩 (alpha sweep). 평소 테스트 런에서는 skip (실제 두뇌 + 로컬 임베딩 서버 필요). 수동 실행: ASTRAEVALBRAIN=\"E:/Wiki/2nd/10Wiki/Topics\" \\ ASTRAEVALEMBEDMODEL=\"text-embedding-nomic-em",
@@ -3757,8 +3816,8 @@
]
},
"tests/scoring.test.ts": {
- "mtimeMs": 1778043314856.5872,
- "size": 6189,
+ "mtimeMs": 1778169995000,
+ "size": 6055,
"lines": 134,
"role": "",
"imports": [
@@ -3766,8 +3825,8 @@
]
},
"tests/secondBrainTrace.test.ts": {
- "mtimeMs": 1778028987455.0378,
- "size": 23431,
+ "mtimeMs": 1777866065000,
+ "size": 23024,
"lines": 407,
"role": "",
"imports": [
@@ -3775,7 +3834,7 @@
]
},
"tests/selfAssessContext.test.ts": {
- "mtimeMs": 1781232946761.048,
+ "mtimeMs": 1781260027000,
"size": 3413,
"lines": 68,
"role": "자기 평가 정본 주입 + 충돌 신뢰도 비교 — 순수 로직 테스트.",
@@ -3785,9 +3844,21 @@
"src/features/growth/conflictScan"
]
},
+ "tests/selfAssessTriggers.test.ts": {
+ "mtimeMs": 1781274623000,
+ "size": 5964,
+ "lines": 90,
+ "role": "자기 분석 트리거 + 인벤토리 자동 대조 회귀 테스트. 모든 케이스는 실제 사용자 세션에서 재현된 실패에서 가져왔다: - \"/Volumes/... 분석해줘\" 프롬프트가 startsWith('/') 가드에 슬래시 명령으로 오인되어 분석 지시·인벤토리가 전부 미주입 (v2.2.239 까지의 버그) - 이전 답변 전문(5천자+)을 붙여넣는 재검토 프롬프트가 길이",
+ "imports": [
+ "src/lib/contextBuilders/selfAssessContext",
+ "src/lib/contextBuilders/promptDetection",
+ "src/features/web/webFetch",
+ "src/extension/featureConceptMap"
+ ]
+ },
"tests/sheetsApi.test.ts": {
- "mtimeMs": 1779065453899.3755,
- "size": 4026,
+ "mtimeMs": 1778936029000,
+ "size": 3913,
"lines": 113,
"role": "",
"imports": [
@@ -3796,8 +3867,8 @@
]
},
"tests/skillInjectionService.test.ts": {
- "mtimeMs": 1778549008933.6833,
- "size": 6913,
+ "mtimeMs": 1778681774000,
+ "size": 6741,
"lines": 172,
"role": "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",
"imports": [
@@ -3805,7 +3876,7 @@
]
},
"tests/sleepDigest.test.ts": {
- "mtimeMs": 1781231131342.9487,
+ "mtimeMs": 1781260027000,
"size": 4527,
"lines": 101,
"role": "Sleep-time 사전 소화 — 순수 로직 테스트 (대상 선정·노후화 판정·노트 형식). LLM 호출(runSleepDigestOnce)은 제외 — 통합 검증은 수동 명령으로.",
@@ -3814,7 +3885,7 @@
]
},
"tests/stocksCriteria.test.ts": {
- "mtimeMs": 1781086406001.8665,
+ "mtimeMs": 1781095278000,
"size": 7191,
"lines": 129,
"role": "criteriaEval — /stocks judge 결정론 평가기 테스트. 픽스처는 옛 LLM 프롬프트에 명시돼 있던 사용자의 실제 분류 예시 3종 (마녀공장/기가비스/엔켐) — 코드 판정이 사용자 패턴과 일치해야 한다.",
@@ -3824,8 +3895,8 @@
]
},
"tests/systemPrompt.test.ts": {
- "mtimeMs": 1779764602687.5603,
- "size": 1487,
+ "mtimeMs": 1779513481000,
+ "size": 1455,
"lines": 32,
"role": "",
"imports": [
@@ -3833,8 +3904,8 @@
]
},
"tests/systemSpecs.test.ts": {
- "mtimeMs": 1778549008934.187,
- "size": 3554,
+ "mtimeMs": 1778251130000,
+ "size": 3464,
"lines": 90,
"role": "Unit tests for SystemSpecs + HeuristicModelMemoryEstimator. Strategy: - HeuristicModelMemoryEstimator is pure — directly drive it with model ids. - NodeSystemSpecsProvider depends on os. so we test: a",
"imports": [
@@ -3842,8 +3913,8 @@
]
},
"tests/taskStore.test.ts": {
- "mtimeMs": 1779065453901.3855,
- "size": 7411,
+ "mtimeMs": 1778936645000,
+ "size": 7226,
"lines": 185,
"role": "",
"imports": [
@@ -3852,8 +3923,8 @@
]
},
"tests/telegramBot.test.ts": {
- "mtimeMs": 1778549008934.187,
- "size": 13375,
+ "mtimeMs": 1778253785000,
+ "size": 13012,
"lines": 363,
"role": "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",
"imports": [
@@ -3863,8 +3934,8 @@
]
},
"tests/transaction.test.ts": {
- "mtimeMs": 1777511752614.9685,
- "size": 2132,
+ "mtimeMs": 1777808065000,
+ "size": 2064,
"lines": 68,
"role": "/ ",
"imports": [
@@ -3872,7 +3943,7 @@
]
},
"tests/urlContext.test.ts": {
- "mtimeMs": 1781239218670.592,
+ "mtimeMs": 1781260027000,
"size": 2655,
"lines": 48,
"role": "URL 컨텍스트 + wikify 정본 포맷 — 순수 로직 테스트.",
@@ -3882,8 +3953,8 @@
]
},
"tests/vulnerability.test.ts": {
- "mtimeMs": 1777511752615.9702,
- "size": 2160,
+ "mtimeMs": 1777808065000,
+ "size": 2100,
"lines": 60,
"role": "/ ",
"imports": [
@@ -3891,1246 +3962,1269 @@
"src/core/transaction"
]
},
+ "tests/webFetch.test.ts": {
+ "mtimeMs": 1781264406000,
+ "size": 3470,
+ "lines": 76,
+ "role": "",
+ "imports": [
+ "src/features/web/webFetch"
+ ]
+ },
"core_py/events.py": {
- "mtimeMs": 1778028987265.2336,
- "size": 2438,
+ "mtimeMs": 1777559069000,
+ "size": 2374,
"lines": 64,
"role": "",
"imports": []
},
"core_py/inference.py": {
- "mtimeMs": 1778028987265.8833,
- "size": 3925,
+ "mtimeMs": 1777559249000,
+ "size": 3834,
"lines": 91,
"role": "",
"imports": []
},
"core_py/loader.py": {
- "mtimeMs": 1778028987266.8376,
- "size": 2429,
+ "mtimeMs": 1777559060000,
+ "size": 2368,
"lines": 61,
"role": "",
"imports": []
},
"core_py/monitoring.py": {
- "mtimeMs": 1778028987266.8376,
- "size": 2116,
+ "mtimeMs": 1777559685000,
+ "size": 2060,
"lines": 56,
"role": "",
"imports": []
},
"core_py/optimizer.py": {
- "mtimeMs": 1778028987267.4917,
- "size": 2382,
+ "mtimeMs": 1777559265000,
+ "size": 2327,
"lines": 55,
"role": "",
"imports": []
},
"core_py/queue_worker.py": {
- "mtimeMs": 1778028987268.5847,
- "size": 3069,
+ "mtimeMs": 1777559676000,
+ "size": 2987,
"lines": 82,
"role": "",
"imports": []
},
- "docs/Advanced_Features_Implementation_Guide.md": {
- "mtimeMs": 1778028987294.7693,
- "size": 1844,
- "lines": 40,
- "role": "Advanced Features Implementation Guide",
- "imports": []
- },
- "docs/AgentEngine_Architecture.md": {
- "mtimeMs": 1778028987295.9912,
- "size": 14652,
- "lines": 314,
- "role": "AgentEngine Architecture Document",
- "imports": []
- },
"docs/ASTRA_OFFICE_REFACTOR.md": {
- "mtimeMs": 1779065453844.1316,
- "size": 9593,
+ "mtimeMs": 1778931177000,
+ "size": 9395,
"lines": 198,
"role": "Astra Office Refactor — Design Doc",
"imports": [
"docs/features/astraOffice"
]
},
- "docs/docs/records/docs/bugs/BUG-0001-viewed-integration-retrieval-test-ts-1-59-integration-retrie.md": {
- "mtimeMs": 1778028987313.924,
- "size": 2075,
- "lines": 16,
- "role": "Bug: Viewed integrationretrieval.test.ts:1-59 integrationretrieval.test.ts를 통해 ...",
+ "docs/Advanced_Features_Implementation_Guide.md": {
+ "mtimeMs": 1777808065000,
+ "size": 1804,
+ "lines": 40,
+ "role": "Advanced Features Implementation Guide",
"imports": []
},
- "docs/docs/records/docs/chronicle.config.json": {
- "mtimeMs": 1778028987314.4072,
- "size": 533,
- "lines": 11,
- "role": "JSON configuration",
- "imports": []
- },
- "docs/docs/records/docs/project-profile.md": {
- "mtimeMs": 1778028987314.9126,
- "size": 617,
- "lines": 31,
- "role": "Project Profile",
- "imports": []
- },
- "docs/docs/records/docs/README.md": {
- "mtimeMs": 1778028987312.8103,
- "size": 445,
- "lines": 18,
- "role": "docs Chronicle Records",
- "imports": []
- },
- "docs/docs/records/docs/timeline.md": {
- "mtimeMs": 1778028987315.4329,
- "size": 217,
- "lines": 7,
- "role": "Project Timeline",
+ "docs/AgentEngine_Architecture.md": {
+ "mtimeMs": 1777863061000,
+ "size": 14338,
+ "lines": 314,
+ "role": "AgentEngine Architecture Document",
"imports": []
},
"docs/EXPERIENCE_MEMORY_PLAN.md": {
- "mtimeMs": 1778664139926.1729,
- "size": 9512,
+ "mtimeMs": 1778595595000,
+ "size": 9390,
"lines": 122,
"role": "Experience Memory (Mistake / Lesson Loop) — Implementation Plan",
"imports": []
},
"docs/PROJECT_CHRONICLE_GUARD_ROADMAP.md": {
- "mtimeMs": 1778028987296.7407,
- "size": 1677,
+ "mtimeMs": 1777948230000,
+ "size": 1634,
"lines": 43,
"role": "Project Chronicle Guard: Search Engine Roadmap",
"imports": []
},
- "docs/records/ConnectAI/bugs/BUG-0001-volumes-data-project-antigravity-connectai-프로젝트-코드-리뷰-해줄-수-있.md": {
- "mtimeMs": 1778028987317.1565,
- "size": 1424,
- "lines": 16,
- "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0002-지금-내가-분석-요청하고-너가-답을-줄때-아래-템플릿에-맞춰-답을-써주고-있는데-개선-포인트가-있는지-확인해.md": {
- "mtimeMs": 1778028987317.6665,
- "size": 2575,
- "lines": 16,
- "role": "Bug: 지금 내가 분석 요청하고 너가 답을 줄때 아래 템플릿에 맞춰 답을 써주고 있는데, 개선 포인트가 있는지 확인해줘. ## 내가 보는 위험 가장 큰...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0003-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md": {
- "mtimeMs": 1778028987320.982,
- "size": 1907,
- "lines": 16,
- "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0004-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md": {
- "mtimeMs": 1778028987321.984,
- "size": 1899,
- "lines": 16,
- "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0005-다시한번-답줘-volumes-data-project-antigravity-connectai-내-질문에-대한-.md": {
- "mtimeMs": 1778028987322.4868,
- "size": 1884,
- "lines": 16,
- "role": "Bug: 다시한번 답줘. /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0006-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md": {
- "mtimeMs": 1778028987322.9897,
- "size": 1639,
- "lines": 16,
- "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0007-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md": {
- "mtimeMs": 1778028987322.9897,
- "size": 1839,
- "lines": 16,
- "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0008-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md": {
- "mtimeMs": 1778028987323.9915,
- "size": 1753,
- "lines": 16,
- "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0009-문제점을-읽고-어떻게-개선하는게-최선인지-분석해주면-좋겠어-알겠습니다-지금부터-connectai-프로젝트-에.md": {
- "mtimeMs": 1778028987324.4944,
- "size": 2311,
- "lines": 16,
- "role": "Bug: 문제점을 읽고 어떻게 개선하는게 최선인지 분석해주면 좋겠어. 알겠습니다. 지금부터 ConnectAI 프로젝트에만 완전히 집중하겠습니다. ...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0010-문제점을-읽고-어떻게-개선하는게-최선인지-분석해주면-좋겠어-알겠습니다-지금부터-connectai-프로젝트-에.md": {
- "mtimeMs": 1778028987324.9973,
- "size": 2355,
- "lines": 16,
- "role": "Bug: 문제점을 읽고 어떻게 개선하는게 최선인지 분석해주면 좋겠어. 알겠습니다. 지금부터 ConnectAI 프로젝트에만 완전히 집중하겠습니다. ...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0011-문제점을-읽고-어떻게-개선하는게-최선인지-분석해주면-좋겠어-알겠습니다-지금부터-connectai-프로젝트-에.md": {
- "mtimeMs": 1778028987325.5178,
- "size": 2293,
- "lines": 16,
- "role": "Bug: 문제점을 읽고 어떻게 개선하는게 최선인지 분석해주면 좋겠어. 알겠습니다. 지금부터 ConnectAI 프로젝트에만 완전히 집중하겠습니다. ...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0012-질문이-있어-논문을-쓰려고해-논문-주제는-서비스적이-아닌-사용자가-ai에게-구조로-질문을-해야-사용자의-의도.md": {
- "mtimeMs": 1778727537111.4634,
- "size": 2354,
- "lines": 16,
- "role": "Bug: 질문이 있어. 논문을 쓰려고해. 논문 주제는 서비스적이 아닌 사용자가 ai에게 구조로 질문을 해야 사용자의 의도에 맞는 답변을 받을 수 있을까야...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0013-thesis-paper를-쓰려고-하는데-아래와-같이-쓰면-좋을까-이런-식으로-쓰면-되지-않을까-싶음-1-in.md": {
- "mtimeMs": 1778728112255.496,
- "size": 2527,
- "lines": 16,
- "role": "Bug: Thesis paper를 쓰려고 하는데 아래와 같이 쓰면 좋을까? 이런 식으로 쓰면 되지 않을까 싶음 1. Introduction Thesis ...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0014-논문-outline-title-인간-ai-상호작용에서-의도-정렬을-높이기-위한-최소-질의-구조-연구-또는-사.md": {
- "mtimeMs": 1778728474713.4639,
- "size": 2531,
- "lines": 16,
- "role": "Bug: 논문 Outline Title 인간-AI 상호작용에서 의도 정렬을 높이기 위한 최소 질의 구조 연구 또는 사용자의 인지적 편향을 보완하는 구조화...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0015-짚어둘-관찰-사항-참고용-face-api-js-환경-face-api-js는-원래-브라우저용입니다-node-단.md": {
- "mtimeMs": 1780281037883.6174,
- "size": 2482,
- "lines": 16,
- "role": "Bug: 짚어둘 관찰 사항 (참고용) face-api.js 환경: face-api.js는 원래 브라우저용입니다. Node 단독 실행 시 @tensorfl...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0016-미안-나는-아스트라-너한테-autonomous-workflow는-필요-없어-이메일을-써줘라고-할-수는-있지만.md": {
- "mtimeMs": 1781154543927.271,
- "size": 1708,
- "lines": 16,
- "role": "Bug: 미안 나는 아스트라, 너한테 autonomous workflow는 필요 없어. 이메일을 써줘라고 할 수는 있지만 이메일을 보내는 것는 내가 될꺼...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0017-이-이메일을-읽어줘-지금까지-이메일-내용-모두-포함되어-있어-이제-회신을-해야하는데-어떠한-부분을-회신해야하.md": {
- "mtimeMs": 1781154827555.317,
- "size": 2053,
- "lines": 16,
- "role": "Bug: 이 이메일을 읽어줘. 지금까지 이메일 내용 모두 포함되어 있어. 이제 회신을 해야하는데 어떠한 부분을 회신해야하는지와, 너가 회신에 맞게 이메일...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0018-이-이메일을-봤을때-지금-어떠한-상태이고-우리가-취해야하는-행동은-뭐가-있을까-hi-jason-nice-to.md": {
- "mtimeMs": 1781155104057.1958,
- "size": 2103,
- "lines": 16,
- "role": "Bug: 이 이메일을 봤을때 지금 어떠한 상태이고 우리가 취해야하는 행동은 뭐가 있을까? Hi Jason, Nice to e-meet you and no...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0019-너가-작성한-회의록에-대한-나의-평가는-아래와-같아-평가부터-하면-생성-품질은-생각보다-괜찮은-편-70-80.md": {
- "mtimeMs": 1781156164255.9114,
- "size": 2529,
- "lines": 16,
- "role": "Bug: 너가 작성한 회의록에 대한 나의 평가는 아래와 같아. 평가부터 하면, 생성 품질은 생각보다 괜찮은 편(70~80점 수준) 입니다. 특히 ...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0020-이번-회의록을-참고해서-이전-회의록과-비교했을때-많은-부분이-개선된-것이-확인이-되었어-그렇지만-아래와-같이.md": {
- "mtimeMs": 1781156389283.776,
- "size": 2625,
- "lines": 16,
- "role": "Bug: 이번 회의록을 참고해서 이전 회의록과 비교했을때 많은 부분이 개선된 것이 확인이 되었어. 그렇지만 아래와 같이 지금 만든 회의록에 대한 피드백을...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0021-이번-결과는-이전-두-번보다-확실히-개선되었습니다-점수로-보면-1차-회의록-83점-2차-회의록-88-90점-.md": {
- "mtimeMs": 1781156720475.01,
- "size": 2579,
- "lines": 16,
- "role": "Bug: 이번 결과는 이전 두 번보다 확실히 개선되었습니다. 점수로 보면: 1차 회의록: 83점 2차 회의록: 88~90점 이번 회의록...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0022-내일-별-보고가-있어-이번주-작업과-차주-작업-관련해서-pm팀-업무-보고를-해야하는데-간단하고-간결하게-주요.md": {
- "mtimeMs": 1781161289463.564,
- "size": 2605,
- "lines": 16,
- "role": "Bug: 내일 별 보고가 있어. 이번주 작업과 차주 작업 관련해서 pm팀 업무 보고를 해야하는데 간단하고 간결하게 주요 이슈 사항들을 보고 할 수 있게 ...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0023-지금-스크립트-봤는데-아래와-같은-피드백을-줄께-너의-성장에-도움이-될만한것들은-성장요소로-쓰면-좋겠어-전체.md": {
- "mtimeMs": 1781161523565.7075,
- "size": 2715,
- "lines": 16,
- "role": "Bug: 지금 스크립트 봤는데 아래와 같은 피드백을 줄께. 너의 성장에 도움이 될만한것들은 성장요소로 쓰면 좋겠어. 전체적으로는 괜찮아요. 특히 PM 보...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0024-이메일-하나-작성해줘-점검-시나리오-2026-6-18-메타버스-사유-메타버스-라이브-서버-스펙-다운-다만-스.md": {
- "mtimeMs": 1781168627170.849,
- "size": 2577,
- "lines": 16,
- "role": "Bug: 이메일 하나 작성해줘. 점검 시나리오 : 2026-6-18 메타버스 사유 : 메타버스 라이브 서버 스펙 다운 다만 스펙 다운이라고 패치 노트를 ...",
- "imports": []
- },
- "docs/records/ConnectAI/bugs/BUG-0025-아-문제는-이메일-받는-사람이-점검이-있을것이라는-것을-몰라-그래서-점검을-진행하려한다고-정중히.md": {
- "mtimeMs": 1781168834822.8625,
- "size": 1679,
- "lines": 16,
- "role": "Bug: 아 문제는 이메일 받는 사람이 점검이 있을것이라는 것을 몰라. 그래서 점검을 진행하려한다고 정중히",
- "imports": []
- },
- "docs/records/ConnectAI/chronicle.config.json": {
- "mtimeMs": 1781249962751.5684,
- "size": 371,
- "lines": 11,
- "role": "JSON configuration",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0001-volumes-data-project-antigravity-connectai-이-프로젝트를-지금-개발-중에-.md": {
- "mtimeMs": 1778028987326.5986,
- "size": 1463,
- "lines": 19,
- "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트를 지금 개발 중에 있어. 코드 리뷰를 하고 잘된점과 ...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0002-지금-너의-제2뇌-지식을-이용해서-아래-프로젝트-평가하고-앞으로-어느부분을-더-집중해서-개선을-하면-좋을지-.md": {
- "mtimeMs": 1778028987326.5986,
- "size": 1897,
- "lines": 19,
- "role": "ADR: 지금 너의 제2뇌 지식을 이용해서 아래 프로젝트 평가하고 앞으로 어느부분을 더 집중해서 개선을 하면 좋을지 알려주면 좋겠어. /Volumes/D...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0003-volumes-data-project-antigravity-connectai-이-프로젝트-자체를-나는-자비스.md": {
- "mtimeMs": 1778028987328.1038,
- "size": 1805,
- "lines": 19,
- "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 자체를 나는 자비스와 같은 툴로 만드는 것이 내 목표...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0004-volumes-data-project-antigravity-connectai-이-프로젝트-자체를-나는-자비스.md": {
- "mtimeMs": 1778028987328.613,
- "size": 1491,
- "lines": 19,
- "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 자체를 나는 자비스와 같은 툴로 만드는 것이 내 목표...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0005-volumes-data-project-antigravity-connectai-이-프로젝트-아키텍처-분석해줘.md": {
- "mtimeMs": 1778028987329.1296,
- "size": 1531,
- "lines": 19,
- "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 아키텍처 분석해줘.",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0006-volumes-data-project-antigravity-connectai-프로젝트에-대해서-너가-사용자-.md": {
- "mtimeMs": 1778028987329.1296,
- "size": 1623,
- "lines": 19,
- "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트에 대해서 너가 사용자 입장에서 평가 해주면 좋겠어.",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0007-volumes-data-project-antigravity-connectai-이거에-기능-개선을-하고-싶어-.md": {
- "mtimeMs": 1778549008870.013,
- "size": 1944,
- "lines": 19,
- "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 이거에 기능 개선을 하고 싶어. 너가 기획과 방향성을 정해주면 좋...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0008-volumes-data-project-antigravity-connectai-분석하고-부족한-부분이나-개선이.md": {
- "mtimeMs": 1778664139928.3345,
- "size": 1625,
- "lines": 19,
- "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 분석하고 부족한 부분이나 개선이 필요한 부분을 알려주면 좋겠어.",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0009-이-프로젝트의-구조에-대해서-설명해봐.md": {
- "mtimeMs": 1778720117388.955,
- "size": 1526,
- "lines": 19,
- "role": "ADR: 이 프로젝트의 구조에 대해서 설명해봐.",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0010-volumes-data-project-antigravity-connectai-self-reflection-기.md": {
- "mtimeMs": 1778720117389.4595,
- "size": 1487,
- "lines": 19,
- "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI self reflection 기능이 적용되었는지 확인해줘. 1인 ...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0011-e-wiki-connectai-self-reflection-기능이-있는데-어떻게-self-reflection.md": {
- "mtimeMs": 1778720344688.4775,
- "size": 1604,
- "lines": 19,
- "role": "ADR: E:\\Wiki\\connectai self reflection 기능이 있는데 어떻게 SELF REFLECTION이 반영되는지 분석해줘.",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0012-e-wiki-connectai-self-reflection-기능이-있는데-어떻게-self-reflection.md": {
- "mtimeMs": 1778720368351.8215,
- "size": 1448,
- "lines": 19,
- "role": "ADR: E:\\Wiki\\connectai self reflection 기능이 있는데 어떻게 SELF REFLECTION이 반영되는지 분석해줘.",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0013-e-wiki-connectai-이-프로젝트야.md": {
- "mtimeMs": 1778842918359.619,
- "size": 1370,
- "lines": 19,
- "role": "ADR: E:\\Wiki\\connectai 이 프로젝트야",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0014-astra-office-부분-관련해서-개선할-부분이-너무-많아-개선점이-무었이-있는지-의견-주면-좋겠어.md": {
- "mtimeMs": 1778842955303.0571,
- "size": 1560,
- "lines": 19,
- "role": "ADR: ASTRA OFFICE 부분 관련해서 개선할 부분이 너무 많아. 개선점이 무었이 있는지 의견 주면 좋겠어.",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0015-너의-생각은-사용자가-다음-행동을-추측-안-해도-되는-astra-이게-가장-큰-효과-있을-거-같습니다-3개-.md": {
- "mtimeMs": 1779065453846.6514,
- "size": 2501,
- "lines": 19,
- "role": "ADR: 너의 생각은? \"사용자가 다음 행동을 추측 안 해도 되는 Astra\" 이게 가장 큰 효과 있을 거 같습니다. 3개 작업으로 묶어볼 수 있어요: ...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0016-내가-블로그글-작성시-사용하고-있는-지침서인데-slot1번-기준으로-더-자연스럽고-트랜디하고-구독자에게-자연.md": {
- "mtimeMs": 1779065453847.7014,
- "size": 2451,
- "lines": 19,
- "role": "ADR: 내가 블로그글 작성시 사용하고 있는 지침서인데 slot1번 기준으로 더 자연스럽고 트랜디하고 구독자에게 자연스럽게 정보를 전달 할 수 있게 개선...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0017-e-wiki-connectai-질문이-있어-지금-이-프로젝트는-2nd-지식을-내가-특정-폴더로-wiki화한-.md": {
- "mtimeMs": 1779270264270.286,
- "size": 1823,
- "lines": 19,
- "role": "ADR: E:\\Wiki\\connectai 질문이 있어. 지금 이 프로젝트는 2nd 지식을 내가 특정 폴더로 wiki화한 md 파일들을 불러오는 방식으로 ...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0018-방금-2nd-뇌-에-lateral-thinking-관련-지식을-추가했어-이-기능이-앞으로-너가-답을-할때-어.md": {
- "mtimeMs": 1779420144716.2415,
- "size": 1619,
- "lines": 19,
- "role": "ADR: 방금 2nd 뇌 에 Lateral Thinking 관련 지식을 추가했어. 이 기능이 앞으로 너가 답을 할때 어떠한 영향을 끼치는지 알려주면 좋겠...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0019-오늘-팀별-보고를-했어-그냥-하는게-너무-심적으로-힘든데-어떻게-개선할-수-있을까.md": {
- "mtimeMs": 1779420342804.8145,
- "size": 1642,
- "lines": 19,
- "role": "ADR: 오늘 팀별 보고를 했어. 그냥 하는게 너무 심적으로 힘든데 어떻게 개선할 수 있을까?",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0020-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md": {
- "mtimeMs": 1779430149727.801,
- "size": 2341,
- "lines": 19,
- "role": "ADR: A팀장이 있어. 팀원으로 B가 있고 C가 있어. A팀장은 0라는 이사의 제안을 받아서 다른 회사로 가기로 했어. 이 소문이 퍼져서 B와 C도 알...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0021-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md": {
- "mtimeMs": 1779434247942.7249,
- "size": 2333,
- "lines": 19,
- "role": "ADR: A팀장이 있어. 팀원으로 B가 있고 C가 있어. A팀장은 0라는 이사의 제안을 받아서 다른 회사로 가기로 했어. 이 소문이 퍼져서 B와 C도 알...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0022-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md": {
- "mtimeMs": 1779442646619.3445,
- "size": 2353,
- "lines": 19,
- "role": "ADR: A팀장이 있어. 팀원으로 B가 있고 C가 있어. A팀장은 0라는 이사의 제안을 받아서 다른 회사로 가기로 했어. 이 소문이 퍼져서 B와 C도 알...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0023-메일-다듬어줘-안녕하세요-문의-주신-poc-진행-관련하여-아래와-같이-회신드립니다-현재-내부-검토-결과-락인.md": {
- "mtimeMs": 1779442717209.4446,
- "size": 2164,
- "lines": 19,
- "role": "ADR: 메일 다듬어줘. 안녕하세요. 문의 주신 POC 진행 관련하여 아래와 같이 회신드립니다. 현재 내부 검토 결과, 락인컴퍼니의 LIAPP 및 LIS...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0024-volumes-data-project-antigravity-connectai-코드-리뷰하고-사용자-입장에서-.md": {
- "mtimeMs": 1779764602567.3247,
- "size": 1207,
- "lines": 19,
- "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰하고 사용자 입장에서 개선이 필요한 부분이 있는지, 제안...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0025-e-wiki-connectai-프로젝트에-대한-너의-평가-해줘.md": {
- "mtimeMs": 1779783003960.8098,
- "size": 1472,
- "lines": 19,
- "role": "ADR: E:\\Wiki\\connectai 프로젝트에 대한 너의 평가 해줘.",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0026-질문이-있어-내가-당근이라는-중고-거래-사이트에서-8tb-hdd를-구매했어-안전거래-escrow-를-사용했어.md": {
- "mtimeMs": 1780032500203.2405,
- "size": 2483,
- "lines": 19,
- "role": "ADR: 질문이 있어, 내가 당근이라는 중고 거래 사이트에서 8TB HDD를 구매했어. 안전거래 (Escrow)를 사용했어. 일단 물건을 어제 받았고, ...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0027-connectai-프로젝트의-아스트라-대부분-답을-잘-줘-근대-간혹-오타가-발생하거나-상황에-맞지-않는-단어.md": {
- "mtimeMs": 1780033038688.5405,
- "size": 1749,
- "lines": 19,
- "role": "ADR: connectAI 프로젝트의 아스트라 대부분 답을 잘 줘. 근대 간혹 오타가 발생하거나 상황에 맞지 않는 단어를 간혹 사용해서 혼선을 줄때가 있...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0028-질문이-있어-내가-당근이라는-중고-거래-사이트에서-8tb-hdd를-구매했어-안전거래-escrow-를-사용했어.md": {
- "mtimeMs": 1780037924606.6091,
- "size": 2481,
- "lines": 19,
- "role": "ADR: 질문이 있어, 내가 당근이라는 중고 거래 사이트에서 8TB HDD를 구매했어. 안전거래 (Escrow)를 사용했어. 일단 물건을 어제 받았고, ...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0029-여전히-오타가-있어-그러고-어색한-답변도-있네-오타-및-문맥-수정-사항-s-m-a-t-s-m-a-r-t-하드.md": {
- "mtimeMs": 1780038664272.424,
- "size": 2211,
- "lines": 19,
- "role": "ADR: 여전히 오타가 있어. 그러고 어색한 답변도 있네. 오타 및 문맥 수정 사항 S.M.A.T -> S.M.A.R.T: 하드디스크의 자가 진단 기능을...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0030-outlook에서도-이메일-내용을-가져올-수-있나.md": {
- "mtimeMs": 1780655594198.4128,
- "size": 1444,
- "lines": 19,
- "role": "ADR: outlook에서도 이메일 내용을 가져올 수 있나?",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0031-아래-프로젝트의-로직을-분석하고-어떻게-하면-astra가-더-정확하고-정교하게-개선할-수-있는-부분이-있는지.md": {
- "mtimeMs": 1780908096070.1074,
- "size": 1660,
- "lines": 19,
- "role": "ADR: 아래 프로젝트의 로직을 분석하고 어떻게 하면 astra가 더 정확하고, 정교하게 개선할 수 있는 부분이 있는지 검토해주고 의견을 주면 좋겠어. ...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0032-아래-프로젝트의-로직을-분석하고-어떻게-하면-astra가-더-정확하고-정교하게-개선할-수-있는-부분이-있는지.md": {
- "mtimeMs": 1780914029189.1228,
- "size": 1660,
- "lines": 19,
- "role": "ADR: 아래 프로젝트의 로직을 분석하고 어떻게 하면 astra가 더 정확하고, 정교하게 개선할 수 있는 부분이 있는지 검토해주고 의견을 주면 좋겠어. ...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0033-e-wiki-connectai-지금-코드-개선-중인데-분석해주면-좋겠어-지금-너의-기능에서-어떠한-부분이-더.md": {
- "mtimeMs": 1781146591614.5254,
- "size": 1791,
- "lines": 19,
- "role": "ADR: E:\\Wiki\\connectai 지금 코드 개선 중인데 분석해주면 좋겠어. 지금 너의 기능에서 어떠한 부분이 더 개선이 되고 있는지. 어떠한 효...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0034-지금-1차-개발이-완료되었거든-다시-새롭게-분석해줘.md": {
- "mtimeMs": 1781153790639.3967,
- "size": 1470,
- "lines": 19,
- "role": "ADR: 지금 1차 개발이 완료되었거든. 다시 새롭게 분석해줘.",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0035-너는-스스로-생각하고-결과물에-대한-평가를-하고-개선-할-수-잇는-방법을-찾기-위해-노력하는-기능이-있어.md": {
- "mtimeMs": 1781154226884.3354,
- "size": 1660,
- "lines": 19,
- "role": "ADR: 너는 스스로 생각하고 결과물에 대한 평가를 하고 개선 할 수 잇는 방법을 찾기 위해 노력하는 기능이 있어?",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0036-vibe-coding으로-e-wiki-connectai-프로젝트를-만들었어-이-프로젝트가-앞으로-나아갈-방향.md": {
- "mtimeMs": 1781154392598.549,
- "size": 1801,
- "lines": 19,
- "role": "ADR: vibe coding으로 E:\\Wiki\\connectai 프로젝트를 만들었어. 이 프로젝트가 앞으로 나아갈 방향과, 어떠한 부분이 weak po...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0037-이런-기준으로-다시-내-의도를-파악하고-앞으로의-astra가-성장해야할-부분을-다시-분석해줘.md": {
- "mtimeMs": 1781154668100.3328,
- "size": 1584,
- "lines": 19,
- "role": "ADR: 이런 기준으로 다시 내 의도를 파악하고 앞으로의 astra가 성장해야할 부분을 다시 분석해줘.",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0038-아닐텐데-astra-너-자신은-자아-성찰적-학습-기능은-실제로-존재하고-작동-중인데-astra가-자기-자신의.md": {
- "mtimeMs": 1781155802005.8943,
- "size": 1745,
- "lines": 19,
- "role": "ADR: 아닐텐데, astra 너 자신은 자아 성찰적 학습 기능은 실제로 존재하고 작동 중인데, ASTRA가 \"자기 자신의 구조\"를 몰라서 일반 LLM ...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0039-너가-astra야-왜-남처럼-이야기-하지.md": {
- "mtimeMs": 1781155861160.9226,
- "size": 1458,
- "lines": 19,
- "role": "ADR: 너가 ASTRA야 왜 남처럼 이야기 하지?",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0040-스크립트로-써달라했자나.md": {
- "mtimeMs": 1781161547920.235,
- "size": 1516,
- "lines": 19,
- "role": "ADR: 스크립트로 써달라했자나",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0041-좋아-다음에-업무-스크립트-써달라고했을때-이-규칙을-사용해줘.md": {
- "mtimeMs": 1781161592347.8997,
- "size": 1591,
- "lines": 19,
- "role": "ADR: 좋아. 다음에 업무 스크립트 써달라고했을때 이 규칙을 사용해줘~",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0042-어-지금-다시-보면-3dism-계정관련해서는-6-11-롯데-이노베이트-미팅을-통해-칼리버스-전용-계정-생성을.md": {
- "mtimeMs": 1781161751144.0005,
- "size": 1935,
- "lines": 19,
- "role": "ADR: 어 지금 다시 보면 3Dism 계정관련해서는 6/11 롯데 이노베이트 미팅을 통해 칼리버스 전용 계정 생성을 마쳤습니다. 라고 했는데 마쳤다고 ...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0043-지금-같은-질문에는-아래와-같은-답변은-불필요한거-같아-다가오는-주요-일정-메타버스-라이브-서버-스펙-다운-.md": {
- "mtimeMs": 1781169926345.4453,
- "size": 1908,
- "lines": 19,
- "role": "ADR: 지금 같은 질문에는 아래와 같은 답변은 불필요한거 같아. [다가오는 주요 일정] 메타버스 라이브 서버 스펙 다운/인스턴스 삭제 작업 (D-7) ...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0044-어-캘린더로-보면-6월-12일-날짜로-등록된-테스크가-4개가-있는데-예정된-주요-일정은-없습니다가-맞아.md": {
- "mtimeMs": 1781170027295.177,
- "size": 1698,
- "lines": 19,
- "role": "ADR: 어 캘린더로 보면 6월 12일 날짜로 등록된 테스크가 4개가 있는데 예정된 주요 일정은 없습니다가 맞아?",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0045-여전히-6월-12일-업무-목록이-없다고-답하네.md": {
- "mtimeMs": 1781170097209.9717,
- "size": 1562,
- "lines": 19,
- "role": "ADR: 여전히 6월 12일 업무 목록이 없다고 답하네?",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0046-self-evolving-기능이-있는데-이-기능을-어떻게-하면-더-날카롭게-할-수-있을까.md": {
- "mtimeMs": 1781172642379.3794,
- "size": 1522,
- "lines": 19,
- "role": "ADR: self evolving 기능이 있는데 이 기능을 어떻게 하면 더 날카롭게 할 수 있을까?",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0047-아스트라를-성장하고-self-envolving을-더-고도화-하기-위해서-어떠한-로직을-추가로-개발하면-좋을지.md": {
- "mtimeMs": 1781229170549.6265,
- "size": 1642,
- "lines": 19,
- "role": "ADR: 아스트라를 성장하고 self-envolving을 더 고도화 하기 위해서 어떠한 로직을 추가로 개발하면 좋을지 의견있어?",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0048-e-wiki-connectai-의-기능-중-astra의-업무-능력이나-지식-self-envolving-혹은-.md": {
- "mtimeMs": 1781232584790.917,
- "size": 1665,
- "lines": 19,
- "role": "ADR: E:\\Wiki\\connectai 의 기능 중 astra의 업무 능력이나 지식 self-envolving 혹은 대화 방법이라거나 답변 관련하여 개...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0049-koritips-com-블로그에-대한-평가해줘.md": {
- "mtimeMs": 1781232964837.836,
- "size": 1468,
- "lines": 19,
- "role": "ADR: koritips.com 블로그에 대한 평가해줘.",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0050-e-wiki-connectai-의-기능-중-astra의-업무-능력이나-지식-self-envolving-혹은-.md": {
- "mtimeMs": 1781233897833.9773,
- "size": 1677,
- "lines": 19,
- "role": "ADR: E:\\Wiki\\connectai 의 기능 중 astra의 업무 능력이나 지식 self-envolving 혹은 대화 방법이라거나 답변 관련하여 개...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0051-e-wiki-connectai-프로젝트에서-아스트라가-답변을-하는-포맷에-대해-분석하고-어떻게-하면-사용자가.md": {
- "mtimeMs": 1781239596642.4785,
- "size": 1762,
- "lines": 19,
- "role": "ADR: E:\\Wiki\\connectai 프로젝트에서 아스트라가 답변을 하는 포맷에 대해 분석하고 어떻게 하면 사용자가 더 읽기 편한 포멧으로 작성될 수...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0052-시각적-요소를-늘리는-방향.md": {
- "mtimeMs": 1781239705410.6494,
- "size": 1472,
- "lines": 19,
- "role": "ADR: 시각적 요소를 늘리는 방향.",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0053-아니-이런-아이디어로-3개-정도-써달라고.md": {
- "mtimeMs": 1781248860896.5273,
- "size": 1544,
- "lines": 19,
- "role": "ADR: 아니 이런 아이디어로 3개 정도 써달라고 ㅎㅎㅎ",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0054-ncsoft-같은-경우-내가-속해-있는-프로젝트에-대한-교육-영상-모회사-영상을-만들어서-보게-하고-내가-속.md": {
- "mtimeMs": 1781249410718.2761,
- "size": 1914,
- "lines": 19,
- "role": "ADR: NCSoft 같은 경우, 내가 속해 있는 프로젝트에 대한 교육 영상 + 모회사 영상을 만들어서 보게 하고 내가 속해 있는 프로젝트에 대한 이해도...",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0055-재미요소를-조금-더-넣고-상큼하게-해주면-좋을-것-같아.md": {
- "mtimeMs": 1781249734304.306,
- "size": 1526,
- "lines": 19,
- "role": "ADR: 재미요소를 조금 더 넣고, 상큼하게 해주면 좋을 것 같아",
- "imports": []
- },
- "docs/records/ConnectAI/decisions/ADR-0056-일단-조건을-하나-더-추가할께-계열사는-하고-싶어-하지-않아-우리한테-업무를-주는게-추가-업무로-이어진다고-.md": {
- "mtimeMs": 1781249876661.1396,
- "size": 1802,
- "lines": 19,
- "role": "ADR: 일단 조건을 하나 더 추가할께. 계열사는 하고 싶어 하지 않아. 우리한테 업무를 주는게 추가 업무로 이어진다고 생각해. 해서 이걸 뒤집을 정도로...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-02_answer-format-readability-tuning.md": {
- "mtimeMs": 1778028987330.4185,
- "size": 1564,
- "lines": 30,
- "role": "Development Log: Answer Format Readability Tuning",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-02_connectai_project_knowledge_overview.md": {
- "mtimeMs": 1778028987330.9385,
- "size": 4661,
- "lines": 121,
- "role": "Astra Project Knowledge Overview",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-02_local-path-code-review-preflight.md": {
- "mtimeMs": 1778028987330.9385,
- "size": 1890,
- "lines": 35,
- "role": "Development Log: Local Path Code Review Preflight",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-02_no-evidence-no-project-claim.md": {
- "mtimeMs": 1778028987331.969,
- "size": 1563,
- "lines": 35,
- "role": "Development Log: No Evidence, No Project Claim",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-02_progressive-answer-format.md": {
- "mtimeMs": 1778028987332.698,
- "size": 1223,
- "lines": 29,
- "role": "Development Log: Progressive Answer Format",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-02_project-claim-output-brake.md": {
- "mtimeMs": 1778028987333.7078,
- "size": 1524,
- "lines": 35,
- "role": "Development Log: Project Claim Output Brake",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-02_project-claim-policy-enforcement.md": {
- "mtimeMs": 1778028987334.2126,
- "size": 1551,
- "lines": 35,
- "role": "Development Log: Project Claim Policy Enforcement",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-02_query-intent-search-tuning.md": {
- "mtimeMs": 1778028987335.4814,
- "size": 1946,
- "lines": 35,
- "role": "Development Log: Query Intent Search Tuning",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-02_remove-local-template-replies.md": {
- "mtimeMs": 1778028987335.4814,
- "size": 1074,
- "lines": 25,
- "role": "Development Log: Remove Local Template Replies",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-02_second-brain-trace-quality-tuning.md": {
- "mtimeMs": 1778028987336.4841,
- "size": 1467,
- "lines": 26,
- "role": "Development Log: Second Brain Trace Quality Tuning",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-03_connectai_project_knowledge_overview.md": {
- "mtimeMs": 1778028987336.988,
- "size": 4787,
- "lines": 121,
- "role": "Astra Project Knowledge Overview",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-05_volumes-data-project-antigravity-connectai-오늘-많은-것을-업데이트했어-많_implementation.md": {
- "mtimeMs": 1778028987337.4993,
- "size": 1858,
- "lines": 22,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 오늘 많은 것을 업데이트했어. 많이 고친것 같지만 그럼에도 불구하...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-05_volumes-data-project-antigravity-connectai-이-프로젝트-분석해줘-volum_implementation.md": {
- "mtimeMs": 1778028987337.4993,
- "size": 1770,
- "lines": 23,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 분석해줘./Volumes/Data/project/An...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-05_volumes-data-project-antigravity-connectai-이-프로젝트-분석해줘_implementation.md": {
- "mtimeMs": 1778028987338.1978,
- "size": 1749,
- "lines": 22,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 분석해줘.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-분석하고-부족한-부분이나-개선이_implementation-2.md": {
- "mtimeMs": 1778664139929.635,
- "size": 1597,
- "lines": 22,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 분석하고 부족한 부분이나 개선이 필요한 부분을 알려주면 좋겠어.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-분석하고-부족한-부분이나-개선이_implementation-3.md": {
- "mtimeMs": 1778664139930.2983,
- "size": 1663,
- "lines": 22,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 분석하고 부족한 부분이나 개선이 필요한 부분을 알려주면 좋겠어.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-분석하고-부족한-부분이나-개선이_implementation-4.md": {
- "mtimeMs": 1778664139930.8157,
- "size": 1739,
- "lines": 24,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 분석하고 부족한 부분이나 개선이 필요한 부분을 알려주면 좋겠어.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-분석하고-부족한-부분이나-개선이_implementation.md": {
- "mtimeMs": 1778664139931.329,
- "size": 706,
- "lines": 22,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 분석하고 부족한 부분이나 개선이 필요한 부분을 알려주면 좋겠어.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트-작업할거야_implementation.md": {
- "mtimeMs": 1778720117403.2517,
- "size": 1012,
- "lines": 22,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 작업할거야",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-13_너는-분석-요청하거나-내가-작업-요청을-할때-connectai-architecture-md-문서를-참고하고-_implementation.md": {
- "mtimeMs": 1778720117403.2517,
- "size": 1760,
- "lines": 22,
- "role": "Development Log: 너는 분석 요청하거나 내가 작업 요청을 할때 connectai architecture.md 문서를 참고하고 작업을 하나?",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-14_reflector-에이전트가-1인-기업-에이전트-목록에는-안보이는데_implementation.md": {
- "mtimeMs": 1778720474901.9106,
- "size": 1519,
- "lines": 24,
- "role": "Development Log: REFLECTOR 에이전트가 1인 기업 에이전트 목록에는 안보이는데",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-16_astra-google-calendar-oauth-연결_implementation-2.md": {
- "mtimeMs": 1779065453847.7014,
- "size": 1252,
- "lines": 22,
- "role": "Development Log: Astra: Google Calendar OAuth 연결",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-16_astra-google-calendar-oauth-연결_implementation.md": {
- "mtimeMs": 1779065453848.7056,
- "size": 1289,
- "lines": 22,
- "role": "Development Log: Astra: Google Calendar OAuth 연결",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-16_astra-office가-아직은-많이-부족한것-같은데-어떻게-하면-트랜디하고-재미있는-볼거리가-될-수-있을지_implementation.md": {
- "mtimeMs": 1779065453849.6394,
- "size": 1772,
- "lines": 22,
- "role": "Development Log: astra office가 아직은 많이 부족한것 같은데 어떻게 하면 트랜디하고 재미있는 볼거리가 될 수 있을지. 개선점 줄 수 있어?",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-22_e-wiki-connectai-이-프로젝트가-너의-프로젝트인데-단순히-cloud-base-ai-model을-_implementation.md": {
- "mtimeMs": 1779412633314.1108,
- "size": 1638,
- "lines": 22,
- "role": "Development Log: E:\\Wiki\\connectai 이 프로젝트가 너의 프로젝트인데, 단순히 cloud base ai model을 사용하는 것과 너를 사용하는 것이...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰를-하고-사용자-입장에_implementation-2.md": {
- "mtimeMs": 1779764602567.3247,
- "size": 1848,
- "lines": 25,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰를 하고 사용자 입장에서 개선이 필요한 부분이 있는지 확...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰를-하고-사용자-입장에_implementation.md": {
- "mtimeMs": 1779764602568.3337,
- "size": 845,
- "lines": 22,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰를 하고 사용자 입장에서 개선이 필요한 부분이 있는지 확...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰를-해줘-그리고-어떻게_implementation.md": {
- "mtimeMs": 1779764602568.3337,
- "size": 876,
- "lines": 22,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰를 해줘 그리고 어떻게 하면 더 유저 친화적으로 너를 개...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰하고-사용자-입장에서-_implementation-2.md": {
- "mtimeMs": 1779764602569.4502,
- "size": 1862,
- "lines": 26,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰하고 사용자 입장에서 개선이 필요한 부분이 있는지, 제안...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰하고-사용자-입장에서-_implementation-3.md": {
- "mtimeMs": 1779764602569.4502,
- "size": 873,
- "lines": 22,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰하고 사용자 입장에서 개선이 필요한 부분이 있는지, 제안...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰하고-사용자-입장에서-_implementation-4.md": {
- "mtimeMs": 1779764602570.461,
- "size": 1809,
- "lines": 23,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰하고 사용자 입장에서 개선이 필요한 부분이 있는지, 제안...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰하고-사용자-입장에서-_implementation-5.md": {
- "mtimeMs": 1779764602570.461,
- "size": 1356,
- "lines": 22,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰하고 사용자 입장에서 개선이 필요한 부분이 있는지, 제안...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰하고-사용자-입장에서-_implementation.md": {
- "mtimeMs": 1779764602571.4724,
- "size": 873,
- "lines": 22,
- "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰하고 사용자 입장에서 개선이 필요한 부분이 있는지, 제안...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-29_e-wiki-connectai-프로젝트에-대해서-이야기-하는거야_implementation.md": {
- "mtimeMs": 1780031872506.9214,
- "size": 1611,
- "lines": 28,
- "role": "Development Log: E:\\Wiki\\connectai 프로젝트에 대해서 이야기 하는거야.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-05-29_아스트라를-지금-보다-더-날카롭고-신뢰감이-높은-아이-그리고-나의-의도를-잘-파악하게-하기-위해서는-어떤부분_implementation.md": {
- "mtimeMs": 1780031951811.4153,
- "size": 1670,
- "lines": 22,
- "role": "Development Log: 아스트라를 지금 보다 더 날카롭고 신뢰감이 높은 아이 그리고 나의 의도를 잘 파악하게 하기 위해서는 어떤부분을 강화하는게 좋을까?",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-08_아니-지금-코드-업데이트를-했거든-다시-코드를-검토하고-의견을-줘_implementation.md": {
- "mtimeMs": 1780914060075.0564,
- "size": 1413,
- "lines": 23,
- "role": "Development Log: 아니 지금 코드 업데이트를 했거든. 다시 코드를 검토하고 의견을 줘.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-11_6월-12일-업무-목록-알려줘_implementation.md": {
- "mtimeMs": 1781170123344.3845,
- "size": 1713,
- "lines": 22,
- "role": "Development Log: 6월 12일 업무 목록 알려줘",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-11_너는-스스로-너-자신이-성장할-수-있는-기능이-있어_implementation.md": {
- "mtimeMs": 1781172558512.6155,
- "size": 1627,
- "lines": 22,
- "role": "Development Log: 너는 스스로 너 자신이 성장할 수 있는 기능이 있어?",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-11_아-내용을-잘못-줬어-작업-시간은-약-4시간-정도-예상-11시에-시작해서-15시까지-로-시간을-다시-조정해주_implementation.md": {
- "mtimeMs": 1781168751631.405,
- "size": 1734,
- "lines": 22,
- "role": "Development Log: 아 내용을 잘못 줬어. 작업 시간은 약 4시간 정도 예상 11시에 시작해서 15시까지. 로 시간을 다시 조정해주고 점검 예상 시간 관련해서 정정...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-11_아니-너의-답변-방식을-좀-더-개선하면-좋을-것-같아-나의-질문은-오늘-즉-6월-11일-업무-브리핑해줘는-6_implementation.md": {
- "mtimeMs": 1781169872096.6626,
- "size": 1850,
- "lines": 22,
- "role": "Development Log: 아니 너의 답변 방식을 좀 더 개선하면 좋을 것 같아. 나의 질문은 오늘 즉 6월 11일 업무 브리핑해줘는. 6월 11일 날짜에 캘린더에 등록된...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-11_아니-오늘날짜로-브리핑해달-라고-헀자나-그러면-6월-11일-업무-목록을-알려줘야지_implementation.md": {
- "mtimeMs": 1781169744395.8994,
- "size": 1758,
- "lines": 22,
- "role": "Development Log: 아니 오늘날짜로 브리핑해달ㄹ라고 헀자나. 그러면 6월 11일 업무 목록을 알려줘야지.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-11_앞으로는-내-의도를-잘-파악해주면-좋겠어_implementation.md": {
- "mtimeMs": 1781169957034.6182,
- "size": 1772,
- "lines": 22,
- "role": "Development Log: 앞으로는 내 의도를 잘 파악해주면 좋겠어.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-11_오늘-날짜-업무-알려줘_implementation.md": {
- "mtimeMs": 1781169987573.6775,
- "size": 1320,
- "lines": 22,
- "role": "Development Log: 오늘 날짜 업무 알려줘.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-11_오늘-업무-목록-줘_implementation.md": {
- "mtimeMs": 1781170061965.1648,
- "size": 1506,
- "lines": 22,
- "role": "Development Log: 오늘 업무 목록 줘.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-11_캘린더를-보면-오늘-날짜로-2개-테스크가-있는데-롯데-자이언츠-이머시브-현황-확인과-즐겨찾기-ui-수정이-있_implementation.md": {
- "mtimeMs": 1781169806677.5552,
- "size": 1804,
- "lines": 22,
- "role": "Development Log: 캘린더를 보면 오늘 날짜로 2개 테스크가 있는데 ? 롯데 자이언츠 이머시브 현황 확인과 즐겨찾기 UI 수정이 있자나.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-11_캘린더를-읽고-정확한-내용을-줘_implementation.md": {
- "mtimeMs": 1781170156036.4238,
- "size": 1593,
- "lines": 22,
- "role": "Development Log: 캘린더를 읽고 정확한 내용을 줘.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-11_캘린더에서-오늘날짜-기준으로-할일-브리핑해줘-간단하게_implementation.md": {
- "mtimeMs": 1781169689828.0005,
- "size": 1080,
- "lines": 22,
- "role": "Development Log: 캘린더에서 오늘날짜 기준으로 할일 브리핑해줘. 간단하게",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-12_3가지를-줬는데-너무-보편적인것만-있어-이런-아이디어가-있으면-좋겠어-한국법에서-회사에서-1년에-1번인가-2_implementation.md": {
- "mtimeMs": 1781248822406.391,
- "size": 1744,
- "lines": 22,
- "role": "Development Log: 3가지를 줬는데 너무 보편적인것만 있어. 이런 아이디어가 있으면 좋겠어. 한국법에서 회사에서 1년에 1번인가 2번 임직원 컴플라이언스 교육이 있...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-12_e-wiki-connectai-에서-wikify-사용되는-포멧에-대한-의견-부족한거나-개선이-필요한-부분이-_implementation.md": {
- "mtimeMs": 1781239096463.1362,
- "size": 1619,
- "lines": 22,
- "role": "Development Log: E:\\Wiki\\connectai 에서 wikify 사용되는 포멧에 대한 의견. 부족한거나 개선이 필요한 부분이 있는지.",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-12_e-wiki-connectai-의-기능-중-astra의-업무-능력이나-지식-self-envolving-혹은-_implementation.md": {
- "mtimeMs": 1781234652056.5469,
- "size": 1750,
- "lines": 23,
- "role": "Development Log: E:\\Wiki\\connectai 의 기능 중 astra의 업무 능력이나 지식 self-envolving 혹은 대화 방법이라거나 답변 관련하여 개...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-12_아이디어-좋아-지금-포멧으로-써줘-이번건-일단-이것을-우리-모회사의-계열사-대상으로-할-수-있는-아이디어로-_implementation.md": {
- "mtimeMs": 1781249101884.1958,
- "size": 1825,
- "lines": 22,
- "role": "Development Log: 아이디어 좋아. 지금 포멧으로 써줘. 이번건. 일단 이것을 우리 모회사의 계열사 대상으로 할 수 있는 아이디어로 주면 어떨까 싶어",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-12_어-블로그-글-쓰기에-대한-블로그-아니야-아마-넌-예전-블로그-내용을-보는데-최근-블로그-초기화-하고-다시-_implementation.md": {
- "mtimeMs": 1781246304327.9424,
- "size": 1765,
- "lines": 22,
- "role": "Development Log: 어? 블로그 글 쓰기에 대한 블로그 아니야? 아마 넌 예전 블로그 내용을 보는데? 최근 블로그 초기화 하고 다시 만들었거든",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-12_우리-회사에서-할-수-있는-기술력을-설명할께-우리만-작업해서-할-수-있는-작업-위주로-주면-더-좋지만-안되면_implementation.md": {
- "mtimeMs": 1781248513097.4795,
- "size": 1834,
- "lines": 22,
- "role": "Development Log: 우리 회사에서 할 수 있는 기술력을 설명할께. 우리만 작업해서 할 수 있는 작업 위주로 주면 더 좋지만 안되면 우리를 중심으로 외주를 고용하는 ...",
- "imports": []
- },
- "docs/records/ConnectAI/development/2026-06-12_지금까지-너는-나에게-아이디어-핵심-내용-기대-효과-내용으로-써줬는데-법정-의무-교육은-다른-포멧으로-줬어-_implementation.md": {
- "mtimeMs": 1781249962705.1416,
- "size": 1866,
- "lines": 22,
- "role": "Development Log: 지금까지 너는 나에게 아이디어, 핵심 내용, 기대 효과 내용으로 써줬는데. 법정 의무 교육은 다른 포멧으로 줬어 기대 효과를 써줘. 법정 의무 ...",
- "imports": []
- },
- "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트-작업-할-거야.md": {
- "mtimeMs": 1778720117404.2578,
- "size": 668,
- "lines": 16,
- "role": "Discussion: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 작업 할 거야.",
- "imports": []
- },
- "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트-작업할거야.md": {
- "mtimeMs": 1778720117405.2607,
- "size": 667,
- "lines": 16,
- "role": "Discussion: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 작업할거야",
- "imports": []
- },
- "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트-하위-폴더-포함해서.md": {
- "mtimeMs": 1778720117405.2607,
- "size": 736,
- "lines": 16,
- "role": "Discussion: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 하위 폴더 포함해서 딥 리서치 해줘. 최적화 할 부분...",
- "imports": []
- },
- "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트를-작업할거야.md": {
- "mtimeMs": 1778720117406.7637,
- "size": 735,
- "lines": 16,
- "role": "Discussion: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트를 작업할거야.",
- "imports": []
- },
- "docs/records/ConnectAI/discussions/2026-05-14_최성연-알아-칼리버스에서-근무한데.md": {
- "mtimeMs": 1778733596076.9204,
- "size": 1297,
- "lines": 16,
- "role": "Discussion: 최성연 알아? 칼리버스에서 근무한데",
- "imports": []
- },
- "docs/records/ConnectAI/discussions/2026-05-22_e-wiki-connectai-git에-커밋하고-푸쉬해줘.md": {
- "mtimeMs": 1779431169034.8508,
- "size": 745,
- "lines": 16,
- "role": "Discussion: E:\\Wiki\\connectai git에 커밋하고 푸쉬해줘.",
- "imports": []
- },
- "docs/records/ConnectAI/discussions/2026-05-29_진행해.md": {
- "mtimeMs": 1780039836692.6577,
- "size": 892,
- "lines": 16,
- "role": "Discussion: 진행해",
- "imports": []
- },
- "docs/records/ConnectAI/discussions/2026-06-11_duns를-재발급-받아야-하는데-발행시-사용한-이메일을-알-수가-없어-이럴때-어떻게-해야해.md": {
- "mtimeMs": 1781162469078.791,
- "size": 1514,
- "lines": 16,
- "role": "Discussion: DUNS를 재발급 받아야 하는데, 발행시 사용한 이메일을 알 수가 없어. 이럴때 어떻게 해야해?",
- "imports": []
- },
- "docs/records/ConnectAI/discussions/2026-06-11_너는-어떻게-너-스스로의-지식을-쌓고-성장해가는거야.md": {
- "mtimeMs": 1781155163227.4497,
- "size": 1522,
- "lines": 16,
- "role": "Discussion: 너는 어떻게 너 스스로의 지식을 쌓고 성장해가는거야?",
- "imports": []
- },
- "docs/records/ConnectAI/discussions/2026-06-12_그니깐-https-koritips-com-홈페이지에-들어가서-홈페이지-분석-후-다시-분석해줘.md": {
- "mtimeMs": 1781246378651.709,
- "size": 1476,
- "lines": 16,
- "role": "Discussion: 그니깐, https://koritips.com 홈페이지에 들어가서 홈페이지 분석 후 다시 분석해줘",
- "imports": []
- },
- "docs/records/ConnectAI/discussions/2026-06-12_우리-개발실은-가우시안-스필리터-그리고-월마트에서-이머시브-스토어-그리고-ai로-영상-사운드-제작팀이-있어-.md": {
- "mtimeMs": 1781243961658.7224,
- "size": 1747,
- "lines": 16,
- "role": "Discussion: 우리 개발실은 가우시안 스필리터, 그리고 월마트에서 이머시브 스토어, 그리고 ai로 영상, 사운드 제작팀이 있어. 인원은 30명정도야. 여기에는...",
- "imports": []
- },
- "docs/records/ConnectAI/planning/2026-05-02_project-chronicle-guard.md": {
- "mtimeMs": 1778028987339.2349,
- "size": 3004,
- "lines": 58,
- "role": "Feature Plan: Project Chronicle Guard",
- "imports": []
- },
- "docs/records/ConnectAI/planning/2026-05-02_second-brain-trace-mode.md": {
- "mtimeMs": 1778028987339.818,
- "size": 1503,
- "lines": 36,
- "role": "Feature Plan: Second Brain Trace Mode",
- "imports": []
- },
- "docs/records/ConnectAI/planning/2026-05-13_connectai-architecture-문서-최신화-해줘.md": {
- "mtimeMs": 1778807413479.8662,
- "size": 1380,
- "lines": 40,
- "role": "Feature Plan: Connectai architecture 문서 최신화 해줘.",
- "imports": []
- },
- "docs/records/ConnectAI/planning/2026-05-13_상세하게-아키텍처-기준으로-설명해줘.md": {
- "mtimeMs": 1778720117406.7637,
- "size": 1260,
- "lines": 40,
- "role": "Feature Plan: 상세하게 아키텍처 기준으로 설명해줘.",
- "imports": []
- },
- "docs/records/ConnectAI/planning/2026-05-13_지금-connectai-architecture-md-문서-내용-중-업데이트가-필요한-부분이-있는지-확인해줘-.md": {
- "mtimeMs": 1778807413480.8667,
- "size": 3010,
- "lines": 40,
- "role": "Feature Plan: 지금 connectai architecture.md 문서 내용 중 업데이트가 필요한 부분이 있는지 확인해줘. 그러고 최신화해줘. 너가 분석해",
- "imports": []
- },
- "docs/records/ConnectAI/planning/2026-06-11_e-wiki-connectai-프로젝트의-코딩-설계가-잘되어-있는지-유지-보수가-쉽게-되어-있는지-검토해줄-.md": {
- "mtimeMs": 1781165413304.578,
- "size": 3506,
- "lines": 40,
- "role": "Feature Plan: E:\\Wiki\\connectai 프로젝트의 코딩, 설계가 잘되어 있는지, 유지 보수가 쉽게 되어 있는지 검토해줄 수 있어?",
- "imports": []
- },
- "docs/records/ConnectAI/planning/2026-06-12_https-koritips-com-블로그에-대한-조사-내용-평가를-해줘.md": {
- "mtimeMs": 1781246227682.2588,
- "size": 3418,
- "lines": 40,
- "role": "Feature Plan: https://koritips.com 블로그에 대한 조사, 내용 평가를 해줘.",
- "imports": []
- },
- "docs/records/ConnectAI/project-profile.md": {
- "mtimeMs": 1778028987341.925,
- "size": 987,
- "lines": 30,
- "role": "Project Profile",
- "imports": []
- },
- "docs/records/ConnectAI/README.md": {
- "mtimeMs": 1778028987316.5518,
- "size": 616,
- "lines": 18,
- "role": "Astra Project Chronicle Records",
- "imports": []
- },
- "docs/records/ConnectAI/timeline.md": {
- "mtimeMs": 1781249962707.1494,
- "size": 26348,
- "lines": 422,
- "role": "Project Timeline",
- "imports": []
- },
- "docs/refactoring_roadmap.md": {
- "mtimeMs": 1778232062143.956,
- "size": 3176,
- "lines": 53,
- "role": "🛠️ ConnectAI 아키텍처 리팩토링 로드맵",
- "imports": []
- },
"docs/SELF_EVOLVING_OS_MASTER_PLAN.md": {
- "mtimeMs": 1781152614989.5796,
+ "mtimeMs": 1781260027000,
"size": 22492,
"lines": 275,
"role": "ASTRA Self-Evolving Digital Employee OS — 마스터 개발 계획 v1.1",
"imports": []
},
"docs/TELEGRAM_REMOTE_EXECUTION_PLAN.md": {
- "mtimeMs": 1778664139927.3354,
- "size": 12706,
+ "mtimeMs": 1778592247000,
+ "size": 12254,
"lines": 452,
"role": "Telegram Remote Execution 기획서",
"imports": []
},
"docs/UX_UI_Consistency_Guidelines.md": {
- "mtimeMs": 1778028987311.5012,
- "size": 2553,
+ "mtimeMs": 1777808065000,
+ "size": 2509,
"lines": 44,
"role": "UX/UI Consistency Guidelines",
"imports": []
+ },
+ "docs/docs/records/docs/README.md": {
+ "mtimeMs": 1777949758000,
+ "size": 427,
+ "lines": 18,
+ "role": "docs Chronicle Records",
+ "imports": []
+ },
+ "docs/docs/records/docs/bugs/BUG-0001-viewed-integration-retrieval-test-ts-1-59-integration-retrie.md": {
+ "mtimeMs": 1777949758000,
+ "size": 2059,
+ "lines": 16,
+ "role": "Bug: Viewed integrationretrieval.test.ts:1-59 integrationretrieval.test.ts를 통해 ...",
+ "imports": []
+ },
+ "docs/docs/records/docs/chronicle.config.json": {
+ "mtimeMs": 1777949758000,
+ "size": 522,
+ "lines": 11,
+ "role": "JSON configuration",
+ "imports": []
+ },
+ "docs/docs/records/docs/project-profile.md": {
+ "mtimeMs": 1777949758000,
+ "size": 586,
+ "lines": 31,
+ "role": "Project Profile",
+ "imports": []
+ },
+ "docs/docs/records/docs/timeline.md": {
+ "mtimeMs": 1777949758000,
+ "size": 210,
+ "lines": 7,
+ "role": "Project Timeline",
+ "imports": []
+ },
+ "docs/plans/alignment-self-learning-plan.md": {
+ "mtimeMs": 1781261208000,
+ "size": 10538,
+ "lines": 194,
+ "role": "Alignment Self-Learning 개선 계획 (v2 — 적대적 리뷰 반영)",
+ "imports": []
+ },
+ "docs/plans/web-fetch-and-mode-parity-plan.md": {
+ "mtimeMs": 1781262579000,
+ "size": 6481,
+ "lines": 102,
+ "role": "웹 접근 + 모드 동등성 수정 계획 (v2 — 적대적 리뷰 + 재검증 반영)",
+ "imports": []
+ },
+ "docs/records/ConnectAI/README.md": {
+ "mtimeMs": 1777808202000,
+ "size": 598,
+ "lines": 18,
+ "role": "Astra Project Chronicle Records",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0001-volumes-data-project-antigravity-connectai-프로젝트-코드-리뷰-해줄-수-있.md": {
+ "mtimeMs": 1777865266000,
+ "size": 1408,
+ "lines": 16,
+ "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0002-지금-내가-분석-요청하고-너가-답을-줄때-아래-템플릿에-맞춰-답을-써주고-있는데-개선-포인트가-있는지-확인해.md": {
+ "mtimeMs": 1777889979000,
+ "size": 2559,
+ "lines": 16,
+ "role": "Bug: 지금 내가 분석 요청하고 너가 답을 줄때 아래 템플릿에 맞춰 답을 써주고 있는데, 개선 포인트가 있는지 확인해줘. ## 내가 보는 위험 가장 큰...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0003-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md": {
+ "mtimeMs": 1777962835000,
+ "size": 1891,
+ "lines": 16,
+ "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0004-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md": {
+ "mtimeMs": 1777964236000,
+ "size": 1883,
+ "lines": 16,
+ "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0005-다시한번-답줘-volumes-data-project-antigravity-connectai-내-질문에-대한-.md": {
+ "mtimeMs": 1777965245000,
+ "size": 1868,
+ "lines": 16,
+ "role": "Bug: 다시한번 답줘. /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0006-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md": {
+ "mtimeMs": 1777965308000,
+ "size": 1623,
+ "lines": 16,
+ "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0007-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md": {
+ "mtimeMs": 1777965612000,
+ "size": 1823,
+ "lines": 16,
+ "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0008-volumes-data-project-antigravity-connectai-내-질문에-대한-답변이-잘-정리.md": {
+ "mtimeMs": 1777966704000,
+ "size": 1737,
+ "lines": 16,
+ "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI 내 질문에 대한 답변이 잘 정리되서 알려주긴 하는데 focused...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0009-문제점을-읽고-어떻게-개선하는게-최선인지-분석해주면-좋겠어-알겠습니다-지금부터-connectai-프로젝트-에.md": {
+ "mtimeMs": 1777977740000,
+ "size": 2295,
+ "lines": 16,
+ "role": "Bug: 문제점을 읽고 어떻게 개선하는게 최선인지 분석해주면 좋겠어. 알겠습니다. 지금부터 ConnectAI 프로젝트에만 완전히 집중하겠습니다. ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0010-문제점을-읽고-어떻게-개선하는게-최선인지-분석해주면-좋겠어-알겠습니다-지금부터-connectai-프로젝트-에.md": {
+ "mtimeMs": 1777981089000,
+ "size": 2339,
+ "lines": 16,
+ "role": "Bug: 문제점을 읽고 어떻게 개선하는게 최선인지 분석해주면 좋겠어. 알겠습니다. 지금부터 ConnectAI 프로젝트에만 완전히 집중하겠습니다. ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0011-문제점을-읽고-어떻게-개선하는게-최선인지-분석해주면-좋겠어-알겠습니다-지금부터-connectai-프로젝트-에.md": {
+ "mtimeMs": 1777982331000,
+ "size": 2277,
+ "lines": 16,
+ "role": "Bug: 문제점을 읽고 어떻게 개선하는게 최선인지 분석해주면 좋겠어. 알겠습니다. 지금부터 ConnectAI 프로젝트에만 완전히 집중하겠습니다. ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0012-질문이-있어-논문을-쓰려고해-논문-주제는-서비스적이-아닌-사용자가-ai에게-구조로-질문을-해야-사용자의-의도.md": {
+ "mtimeMs": 1778762677000,
+ "size": 2354,
+ "lines": 16,
+ "role": "Bug: 질문이 있어. 논문을 쓰려고해. 논문 주제는 서비스적이 아닌 사용자가 ai에게 구조로 질문을 해야 사용자의 의도에 맞는 답변을 받을 수 있을까야...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0013-thesis-paper를-쓰려고-하는데-아래와-같이-쓰면-좋을까-이런-식으로-쓰면-되지-않을까-싶음-1-in.md": {
+ "mtimeMs": 1778762677000,
+ "size": 2527,
+ "lines": 16,
+ "role": "Bug: Thesis paper를 쓰려고 하는데 아래와 같이 쓰면 좋을까? 이런 식으로 쓰면 되지 않을까 싶음 1. Introduction Thesis ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0014-논문-outline-title-인간-ai-상호작용에서-의도-정렬을-높이기-위한-최소-질의-구조-연구-또는-사.md": {
+ "mtimeMs": 1778762677000,
+ "size": 2531,
+ "lines": 16,
+ "role": "Bug: 논문 Outline Title 인간-AI 상호작용에서 의도 정렬을 높이기 위한 최소 질의 구조 연구 또는 사용자의 인지적 편향을 보완하는 구조화...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0015-짚어둘-관찰-사항-참고용-face-api-js-환경-face-api-js는-원래-브라우저용입니다-node-단.md": {
+ "mtimeMs": 1781006628000,
+ "size": 2482,
+ "lines": 16,
+ "role": "Bug: 짚어둘 관찰 사항 (참고용) face-api.js 환경: face-api.js는 원래 브라우저용입니다. Node 단독 실행 시 @tensorfl...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0016-미안-나는-아스트라-너한테-autonomous-workflow는-필요-없어-이메일을-써줘라고-할-수는-있지만.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1708,
+ "lines": 16,
+ "role": "Bug: 미안 나는 아스트라, 너한테 autonomous workflow는 필요 없어. 이메일을 써줘라고 할 수는 있지만 이메일을 보내는 것는 내가 될꺼...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0017-이-이메일을-읽어줘-지금까지-이메일-내용-모두-포함되어-있어-이제-회신을-해야하는데-어떠한-부분을-회신해야하.md": {
+ "mtimeMs": 1781260027000,
+ "size": 2053,
+ "lines": 16,
+ "role": "Bug: 이 이메일을 읽어줘. 지금까지 이메일 내용 모두 포함되어 있어. 이제 회신을 해야하는데 어떠한 부분을 회신해야하는지와, 너가 회신에 맞게 이메일...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0018-이-이메일을-봤을때-지금-어떠한-상태이고-우리가-취해야하는-행동은-뭐가-있을까-hi-jason-nice-to.md": {
+ "mtimeMs": 1781260027000,
+ "size": 2103,
+ "lines": 16,
+ "role": "Bug: 이 이메일을 봤을때 지금 어떠한 상태이고 우리가 취해야하는 행동은 뭐가 있을까? Hi Jason, Nice to e-meet you and no...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0019-너가-작성한-회의록에-대한-나의-평가는-아래와-같아-평가부터-하면-생성-품질은-생각보다-괜찮은-편-70-80.md": {
+ "mtimeMs": 1781260027000,
+ "size": 2529,
+ "lines": 16,
+ "role": "Bug: 너가 작성한 회의록에 대한 나의 평가는 아래와 같아. 평가부터 하면, 생성 품질은 생각보다 괜찮은 편(70~80점 수준) 입니다. 특히 ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0020-이번-회의록을-참고해서-이전-회의록과-비교했을때-많은-부분이-개선된-것이-확인이-되었어-그렇지만-아래와-같이.md": {
+ "mtimeMs": 1781260027000,
+ "size": 2625,
+ "lines": 16,
+ "role": "Bug: 이번 회의록을 참고해서 이전 회의록과 비교했을때 많은 부분이 개선된 것이 확인이 되었어. 그렇지만 아래와 같이 지금 만든 회의록에 대한 피드백을...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0021-이번-결과는-이전-두-번보다-확실히-개선되었습니다-점수로-보면-1차-회의록-83점-2차-회의록-88-90점-.md": {
+ "mtimeMs": 1781260027000,
+ "size": 2579,
+ "lines": 16,
+ "role": "Bug: 이번 결과는 이전 두 번보다 확실히 개선되었습니다. 점수로 보면: 1차 회의록: 83점 2차 회의록: 88~90점 이번 회의록...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0022-내일-별-보고가-있어-이번주-작업과-차주-작업-관련해서-pm팀-업무-보고를-해야하는데-간단하고-간결하게-주요.md": {
+ "mtimeMs": 1781260027000,
+ "size": 2605,
+ "lines": 16,
+ "role": "Bug: 내일 별 보고가 있어. 이번주 작업과 차주 작업 관련해서 pm팀 업무 보고를 해야하는데 간단하고 간결하게 주요 이슈 사항들을 보고 할 수 있게 ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0023-지금-스크립트-봤는데-아래와-같은-피드백을-줄께-너의-성장에-도움이-될만한것들은-성장요소로-쓰면-좋겠어-전체.md": {
+ "mtimeMs": 1781260027000,
+ "size": 2715,
+ "lines": 16,
+ "role": "Bug: 지금 스크립트 봤는데 아래와 같은 피드백을 줄께. 너의 성장에 도움이 될만한것들은 성장요소로 쓰면 좋겠어. 전체적으로는 괜찮아요. 특히 PM 보...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0024-이메일-하나-작성해줘-점검-시나리오-2026-6-18-메타버스-사유-메타버스-라이브-서버-스펙-다운-다만-스.md": {
+ "mtimeMs": 1781260027000,
+ "size": 2577,
+ "lines": 16,
+ "role": "Bug: 이메일 하나 작성해줘. 점검 시나리오 : 2026-6-18 메타버스 사유 : 메타버스 라이브 서버 스펙 다운 다만 스펙 다운이라고 패치 노트를 ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/bugs/BUG-0025-아-문제는-이메일-받는-사람이-점검이-있을것이라는-것을-몰라-그래서-점검을-진행하려한다고-정중히.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1679,
+ "lines": 16,
+ "role": "Bug: 아 문제는 이메일 받는 사람이 점검이 있을것이라는 것을 몰라. 그래서 점검을 진행하려한다고 정중히",
+ "imports": []
+ },
+ "docs/records/ConnectAI/chronicle.config.json": {
+ "mtimeMs": 1781274087000,
+ "size": 416,
+ "lines": 11,
+ "role": "JSON configuration",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0001-volumes-data-project-antigravity-connectai-이-프로젝트를-지금-개발-중에-.md": {
+ "mtimeMs": 1777860282000,
+ "size": 1444,
+ "lines": 19,
+ "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트를 지금 개발 중에 있어. 코드 리뷰를 하고 잘된점과 ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0002-지금-너의-제2뇌-지식을-이용해서-아래-프로젝트-평가하고-앞으로-어느부분을-더-집중해서-개선을-하면-좋을지-.md": {
+ "mtimeMs": 1777869330000,
+ "size": 1878,
+ "lines": 19,
+ "role": "ADR: 지금 너의 제2뇌 지식을 이용해서 아래 프로젝트 평가하고 앞으로 어느부분을 더 집중해서 개선을 하면 좋을지 알려주면 좋겠어. /Volumes/D...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0003-volumes-data-project-antigravity-connectai-이-프로젝트-자체를-나는-자비스.md": {
+ "mtimeMs": 1777877376000,
+ "size": 1786,
+ "lines": 19,
+ "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 자체를 나는 자비스와 같은 툴로 만드는 것이 내 목표...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0004-volumes-data-project-antigravity-connectai-이-프로젝트-자체를-나는-자비스.md": {
+ "mtimeMs": 1777878318000,
+ "size": 1472,
+ "lines": 19,
+ "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 자체를 나는 자비스와 같은 툴로 만드는 것이 내 목표...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0005-volumes-data-project-antigravity-connectai-이-프로젝트-아키텍처-분석해줘.md": {
+ "mtimeMs": 1777889802000,
+ "size": 1512,
+ "lines": 19,
+ "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 아키텍처 분석해줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0006-volumes-data-project-antigravity-connectai-프로젝트에-대해서-너가-사용자-.md": {
+ "mtimeMs": 1777902312000,
+ "size": 1604,
+ "lines": 19,
+ "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트에 대해서 너가 사용자 입장에서 평가 해주면 좋겠어.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0007-volumes-data-project-antigravity-connectai-이거에-기능-개선을-하고-싶어-.md": {
+ "mtimeMs": 1778398958000,
+ "size": 1925,
+ "lines": 19,
+ "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 이거에 기능 개선을 하고 싶어. 너가 기획과 방향성을 정해주면 좋...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0008-volumes-data-project-antigravity-connectai-분석하고-부족한-부분이나-개선이.md": {
+ "mtimeMs": 1778600479000,
+ "size": 1606,
+ "lines": 19,
+ "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 분석하고 부족한 부분이나 개선이 필요한 부분을 알려주면 좋겠어.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0009-이-프로젝트의-구조에-대해서-설명해봐.md": {
+ "mtimeMs": 1778678639000,
+ "size": 1507,
+ "lines": 19,
+ "role": "ADR: 이 프로젝트의 구조에 대해서 설명해봐.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0010-volumes-data-project-antigravity-connectai-self-reflection-기.md": {
+ "mtimeMs": 1778689955000,
+ "size": 1468,
+ "lines": 19,
+ "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI self reflection 기능이 적용되었는지 확인해줘. 1인 ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0011-e-wiki-connectai-self-reflection-기능이-있는데-어떻게-self-reflection.md": {
+ "mtimeMs": 1778762677000,
+ "size": 1604,
+ "lines": 19,
+ "role": "ADR: E:\\Wiki\\connectai self reflection 기능이 있는데 어떻게 SELF REFLECTION이 반영되는지 분석해줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0012-e-wiki-connectai-self-reflection-기능이-있는데-어떻게-self-reflection.md": {
+ "mtimeMs": 1778762677000,
+ "size": 1448,
+ "lines": 19,
+ "role": "ADR: E:\\Wiki\\connectai self reflection 기능이 있는데 어떻게 SELF REFLECTION이 반영되는지 분석해줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0013-e-wiki-connectai-이-프로젝트야.md": {
+ "mtimeMs": 1778902489000,
+ "size": 1370,
+ "lines": 19,
+ "role": "ADR: E:\\Wiki\\connectai 이 프로젝트야",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0014-astra-office-부분-관련해서-개선할-부분이-너무-많아-개선점이-무었이-있는지-의견-주면-좋겠어.md": {
+ "mtimeMs": 1778902489000,
+ "size": 1560,
+ "lines": 19,
+ "role": "ADR: ASTRA OFFICE 부분 관련해서 개선할 부분이 너무 많아. 개선점이 무었이 있는지 의견 주면 좋겠어.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0015-너의-생각은-사용자가-다음-행동을-추측-안-해도-되는-astra-이게-가장-큰-효과-있을-거-같습니다-3개-.md": {
+ "mtimeMs": 1778943211000,
+ "size": 2482,
+ "lines": 19,
+ "role": "ADR: 너의 생각은? \"사용자가 다음 행동을 추측 안 해도 되는 Astra\" 이게 가장 큰 효과 있을 거 같습니다. 3개 작업으로 묶어볼 수 있어요: ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0016-내가-블로그글-작성시-사용하고-있는-지침서인데-slot1번-기준으로-더-자연스럽고-트랜디하고-구독자에게-자연.md": {
+ "mtimeMs": 1779029444000,
+ "size": 2432,
+ "lines": 19,
+ "role": "ADR: 내가 블로그글 작성시 사용하고 있는 지침서인데 slot1번 기준으로 더 자연스럽고 트랜디하고 구독자에게 자연스럽게 정보를 전달 할 수 있게 개선...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0017-e-wiki-connectai-질문이-있어-지금-이-프로젝트는-2nd-지식을-내가-특정-폴더로-wiki화한-.md": {
+ "mtimeMs": 1779492050000,
+ "size": 1823,
+ "lines": 19,
+ "role": "ADR: E:\\Wiki\\connectai 질문이 있어. 지금 이 프로젝트는 2nd 지식을 내가 특정 폴더로 wiki화한 md 파일들을 불러오는 방식으로 ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0018-방금-2nd-뇌-에-lateral-thinking-관련-지식을-추가했어-이-기능이-앞으로-너가-답을-할때-어.md": {
+ "mtimeMs": 1779492050000,
+ "size": 1619,
+ "lines": 19,
+ "role": "ADR: 방금 2nd 뇌 에 Lateral Thinking 관련 지식을 추가했어. 이 기능이 앞으로 너가 답을 할때 어떠한 영향을 끼치는지 알려주면 좋겠...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0019-오늘-팀별-보고를-했어-그냥-하는게-너무-심적으로-힘든데-어떻게-개선할-수-있을까.md": {
+ "mtimeMs": 1779492050000,
+ "size": 1642,
+ "lines": 19,
+ "role": "ADR: 오늘 팀별 보고를 했어. 그냥 하는게 너무 심적으로 힘든데 어떻게 개선할 수 있을까?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0020-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md": {
+ "mtimeMs": 1779492050000,
+ "size": 2341,
+ "lines": 19,
+ "role": "ADR: A팀장이 있어. 팀원으로 B가 있고 C가 있어. A팀장은 0라는 이사의 제안을 받아서 다른 회사로 가기로 했어. 이 소문이 퍼져서 B와 C도 알...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0021-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md": {
+ "mtimeMs": 1779492050000,
+ "size": 2333,
+ "lines": 19,
+ "role": "ADR: A팀장이 있어. 팀원으로 B가 있고 C가 있어. A팀장은 0라는 이사의 제안을 받아서 다른 회사로 가기로 했어. 이 소문이 퍼져서 B와 C도 알...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0022-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md": {
+ "mtimeMs": 1779492050000,
+ "size": 2353,
+ "lines": 19,
+ "role": "ADR: A팀장이 있어. 팀원으로 B가 있고 C가 있어. A팀장은 0라는 이사의 제안을 받아서 다른 회사로 가기로 했어. 이 소문이 퍼져서 B와 C도 알...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0023-메일-다듬어줘-안녕하세요-문의-주신-poc-진행-관련하여-아래와-같이-회신드립니다-현재-내부-검토-결과-락인.md": {
+ "mtimeMs": 1779492050000,
+ "size": 2164,
+ "lines": 19,
+ "role": "ADR: 메일 다듬어줘. 안녕하세요. 문의 주신 POC 진행 관련하여 아래와 같이 회신드립니다. 현재 내부 검토 결과, 락인컴퍼니의 LIAPP 및 LIS...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0024-volumes-data-project-antigravity-connectai-코드-리뷰하고-사용자-입장에서-.md": {
+ "mtimeMs": 1779515288000,
+ "size": 1188,
+ "lines": 19,
+ "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰하고 사용자 입장에서 개선이 필요한 부분이 있는지, 제안...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0025-e-wiki-connectai-프로젝트에-대한-너의-평가-해줘.md": {
+ "mtimeMs": 1781006628000,
+ "size": 1472,
+ "lines": 19,
+ "role": "ADR: E:\\Wiki\\connectai 프로젝트에 대한 너의 평가 해줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0026-질문이-있어-내가-당근이라는-중고-거래-사이트에서-8tb-hdd를-구매했어-안전거래-escrow-를-사용했어.md": {
+ "mtimeMs": 1781006628000,
+ "size": 2483,
+ "lines": 19,
+ "role": "ADR: 질문이 있어, 내가 당근이라는 중고 거래 사이트에서 8TB HDD를 구매했어. 안전거래 (Escrow)를 사용했어. 일단 물건을 어제 받았고, ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0027-connectai-프로젝트의-아스트라-대부분-답을-잘-줘-근대-간혹-오타가-발생하거나-상황에-맞지-않는-단어.md": {
+ "mtimeMs": 1781006628000,
+ "size": 1749,
+ "lines": 19,
+ "role": "ADR: connectAI 프로젝트의 아스트라 대부분 답을 잘 줘. 근대 간혹 오타가 발생하거나 상황에 맞지 않는 단어를 간혹 사용해서 혼선을 줄때가 있...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0028-질문이-있어-내가-당근이라는-중고-거래-사이트에서-8tb-hdd를-구매했어-안전거래-escrow-를-사용했어.md": {
+ "mtimeMs": 1781006628000,
+ "size": 2481,
+ "lines": 19,
+ "role": "ADR: 질문이 있어, 내가 당근이라는 중고 거래 사이트에서 8TB HDD를 구매했어. 안전거래 (Escrow)를 사용했어. 일단 물건을 어제 받았고, ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0029-여전히-오타가-있어-그러고-어색한-답변도-있네-오타-및-문맥-수정-사항-s-m-a-t-s-m-a-r-t-하드.md": {
+ "mtimeMs": 1781006628000,
+ "size": 2211,
+ "lines": 19,
+ "role": "ADR: 여전히 오타가 있어. 그러고 어색한 답변도 있네. 오타 및 문맥 수정 사항 S.M.A.T -> S.M.A.R.T: 하드디스크의 자가 진단 기능을...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0030-outlook에서도-이메일-내용을-가져올-수-있나.md": {
+ "mtimeMs": 1781006628000,
+ "size": 1444,
+ "lines": 19,
+ "role": "ADR: outlook에서도 이메일 내용을 가져올 수 있나?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0031-아래-프로젝트의-로직을-분석하고-어떻게-하면-astra가-더-정확하고-정교하게-개선할-수-있는-부분이-있는지.md": {
+ "mtimeMs": 1781006628000,
+ "size": 1660,
+ "lines": 19,
+ "role": "ADR: 아래 프로젝트의 로직을 분석하고 어떻게 하면 astra가 더 정확하고, 정교하게 개선할 수 있는 부분이 있는지 검토해주고 의견을 주면 좋겠어. ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0032-아래-프로젝트의-로직을-분석하고-어떻게-하면-astra가-더-정확하고-정교하게-개선할-수-있는-부분이-있는지.md": {
+ "mtimeMs": 1781006628000,
+ "size": 1660,
+ "lines": 19,
+ "role": "ADR: 아래 프로젝트의 로직을 분석하고 어떻게 하면 astra가 더 정확하고, 정교하게 개선할 수 있는 부분이 있는지 검토해주고 의견을 주면 좋겠어. ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0033-e-wiki-connectai-지금-코드-개선-중인데-분석해주면-좋겠어-지금-너의-기능에서-어떠한-부분이-더.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1791,
+ "lines": 19,
+ "role": "ADR: E:\\Wiki\\connectai 지금 코드 개선 중인데 분석해주면 좋겠어. 지금 너의 기능에서 어떠한 부분이 더 개선이 되고 있는지. 어떠한 효...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0034-지금-1차-개발이-완료되었거든-다시-새롭게-분석해줘.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1470,
+ "lines": 19,
+ "role": "ADR: 지금 1차 개발이 완료되었거든. 다시 새롭게 분석해줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0035-너는-스스로-생각하고-결과물에-대한-평가를-하고-개선-할-수-잇는-방법을-찾기-위해-노력하는-기능이-있어.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1660,
+ "lines": 19,
+ "role": "ADR: 너는 스스로 생각하고 결과물에 대한 평가를 하고 개선 할 수 잇는 방법을 찾기 위해 노력하는 기능이 있어?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0036-vibe-coding으로-e-wiki-connectai-프로젝트를-만들었어-이-프로젝트가-앞으로-나아갈-방향.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1801,
+ "lines": 19,
+ "role": "ADR: vibe coding으로 E:\\Wiki\\connectai 프로젝트를 만들었어. 이 프로젝트가 앞으로 나아갈 방향과, 어떠한 부분이 weak po...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0037-이런-기준으로-다시-내-의도를-파악하고-앞으로의-astra가-성장해야할-부분을-다시-분석해줘.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1584,
+ "lines": 19,
+ "role": "ADR: 이런 기준으로 다시 내 의도를 파악하고 앞으로의 astra가 성장해야할 부분을 다시 분석해줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0038-아닐텐데-astra-너-자신은-자아-성찰적-학습-기능은-실제로-존재하고-작동-중인데-astra가-자기-자신의.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1745,
+ "lines": 19,
+ "role": "ADR: 아닐텐데, astra 너 자신은 자아 성찰적 학습 기능은 실제로 존재하고 작동 중인데, ASTRA가 \"자기 자신의 구조\"를 몰라서 일반 LLM ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0039-너가-astra야-왜-남처럼-이야기-하지.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1458,
+ "lines": 19,
+ "role": "ADR: 너가 ASTRA야 왜 남처럼 이야기 하지?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0040-스크립트로-써달라했자나.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1516,
+ "lines": 19,
+ "role": "ADR: 스크립트로 써달라했자나",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0041-좋아-다음에-업무-스크립트-써달라고했을때-이-규칙을-사용해줘.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1591,
+ "lines": 19,
+ "role": "ADR: 좋아. 다음에 업무 스크립트 써달라고했을때 이 규칙을 사용해줘~",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0042-어-지금-다시-보면-3dism-계정관련해서는-6-11-롯데-이노베이트-미팅을-통해-칼리버스-전용-계정-생성을.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1935,
+ "lines": 19,
+ "role": "ADR: 어 지금 다시 보면 3Dism 계정관련해서는 6/11 롯데 이노베이트 미팅을 통해 칼리버스 전용 계정 생성을 마쳤습니다. 라고 했는데 마쳤다고 ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0043-지금-같은-질문에는-아래와-같은-답변은-불필요한거-같아-다가오는-주요-일정-메타버스-라이브-서버-스펙-다운-.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1908,
+ "lines": 19,
+ "role": "ADR: 지금 같은 질문에는 아래와 같은 답변은 불필요한거 같아. [다가오는 주요 일정] 메타버스 라이브 서버 스펙 다운/인스턴스 삭제 작업 (D-7) ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0044-어-캘린더로-보면-6월-12일-날짜로-등록된-테스크가-4개가-있는데-예정된-주요-일정은-없습니다가-맞아.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1698,
+ "lines": 19,
+ "role": "ADR: 어 캘린더로 보면 6월 12일 날짜로 등록된 테스크가 4개가 있는데 예정된 주요 일정은 없습니다가 맞아?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0045-여전히-6월-12일-업무-목록이-없다고-답하네.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1562,
+ "lines": 19,
+ "role": "ADR: 여전히 6월 12일 업무 목록이 없다고 답하네?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0046-self-evolving-기능이-있는데-이-기능을-어떻게-하면-더-날카롭게-할-수-있을까.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1522,
+ "lines": 19,
+ "role": "ADR: self evolving 기능이 있는데 이 기능을 어떻게 하면 더 날카롭게 할 수 있을까?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0047-아스트라를-성장하고-self-envolving을-더-고도화-하기-위해서-어떠한-로직을-추가로-개발하면-좋을지.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1642,
+ "lines": 19,
+ "role": "ADR: 아스트라를 성장하고 self-envolving을 더 고도화 하기 위해서 어떠한 로직을 추가로 개발하면 좋을지 의견있어?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0048-e-wiki-connectai-의-기능-중-astra의-업무-능력이나-지식-self-envolving-혹은-.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1665,
+ "lines": 19,
+ "role": "ADR: E:\\Wiki\\connectai 의 기능 중 astra의 업무 능력이나 지식 self-envolving 혹은 대화 방법이라거나 답변 관련하여 개...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0049-koritips-com-블로그에-대한-평가해줘.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1468,
+ "lines": 19,
+ "role": "ADR: koritips.com 블로그에 대한 평가해줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0050-e-wiki-connectai-의-기능-중-astra의-업무-능력이나-지식-self-envolving-혹은-.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1677,
+ "lines": 19,
+ "role": "ADR: E:\\Wiki\\connectai 의 기능 중 astra의 업무 능력이나 지식 self-envolving 혹은 대화 방법이라거나 답변 관련하여 개...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0051-e-wiki-connectai-프로젝트에서-아스트라가-답변을-하는-포맷에-대해-분석하고-어떻게-하면-사용자가.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1762,
+ "lines": 19,
+ "role": "ADR: E:\\Wiki\\connectai 프로젝트에서 아스트라가 답변을 하는 포맷에 대해 분석하고 어떻게 하면 사용자가 더 읽기 편한 포멧으로 작성될 수...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0052-시각적-요소를-늘리는-방향.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1472,
+ "lines": 19,
+ "role": "ADR: 시각적 요소를 늘리는 방향.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0053-아니-이런-아이디어로-3개-정도-써달라고.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1544,
+ "lines": 19,
+ "role": "ADR: 아니 이런 아이디어로 3개 정도 써달라고 ㅎㅎㅎ",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0054-ncsoft-같은-경우-내가-속해-있는-프로젝트에-대한-교육-영상-모회사-영상을-만들어서-보게-하고-내가-속.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1914,
+ "lines": 19,
+ "role": "ADR: NCSoft 같은 경우, 내가 속해 있는 프로젝트에 대한 교육 영상 + 모회사 영상을 만들어서 보게 하고 내가 속해 있는 프로젝트에 대한 이해도...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0055-재미요소를-조금-더-넣고-상큼하게-해주면-좋을-것-같아.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1526,
+ "lines": 19,
+ "role": "ADR: 재미요소를 조금 더 넣고, 상큼하게 해주면 좋을 것 같아",
+ "imports": []
+ },
+ "docs/records/ConnectAI/decisions/ADR-0056-일단-조건을-하나-더-추가할께-계열사는-하고-싶어-하지-않아-우리한테-업무를-주는게-추가-업무로-이어진다고-.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1802,
+ "lines": 19,
+ "role": "ADR: 일단 조건을 하나 더 추가할께. 계열사는 하고 싶어 하지 않아. 우리한테 업무를 주는게 추가 업무로 이어진다고 생각해. 해서 이걸 뒤집을 정도로...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-02_answer-format-readability-tuning.md": {
+ "mtimeMs": 1777808065000,
+ "size": 1534,
+ "lines": 30,
+ "role": "Development Log: Answer Format Readability Tuning",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-02_connectai_project_knowledge_overview.md": {
+ "mtimeMs": 1777808211000,
+ "size": 4540,
+ "lines": 121,
+ "role": "Astra Project Knowledge Overview",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-02_local-path-code-review-preflight.md": {
+ "mtimeMs": 1777808065000,
+ "size": 1855,
+ "lines": 35,
+ "role": "Development Log: Local Path Code Review Preflight",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-02_no-evidence-no-project-claim.md": {
+ "mtimeMs": 1777808065000,
+ "size": 1528,
+ "lines": 35,
+ "role": "Development Log: No Evidence, No Project Claim",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-02_progressive-answer-format.md": {
+ "mtimeMs": 1777808065000,
+ "size": 1194,
+ "lines": 29,
+ "role": "Development Log: Progressive Answer Format",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-02_project-claim-output-brake.md": {
+ "mtimeMs": 1777808065000,
+ "size": 1489,
+ "lines": 35,
+ "role": "Development Log: Project Claim Output Brake",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-02_project-claim-policy-enforcement.md": {
+ "mtimeMs": 1777808065000,
+ "size": 1516,
+ "lines": 35,
+ "role": "Development Log: Project Claim Policy Enforcement",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-02_query-intent-search-tuning.md": {
+ "mtimeMs": 1777808065000,
+ "size": 1911,
+ "lines": 35,
+ "role": "Development Log: Query Intent Search Tuning",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-02_remove-local-template-replies.md": {
+ "mtimeMs": 1777808065000,
+ "size": 1049,
+ "lines": 25,
+ "role": "Development Log: Remove Local Template Replies",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-02_second-brain-trace-quality-tuning.md": {
+ "mtimeMs": 1777808065000,
+ "size": 1441,
+ "lines": 26,
+ "role": "Development Log: Second Brain Trace Quality Tuning",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-03_connectai_project_knowledge_overview.md": {
+ "mtimeMs": 1777808211000,
+ "size": 4666,
+ "lines": 121,
+ "role": "Astra Project Knowledge Overview",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-05_volumes-data-project-antigravity-connectai-오늘-많은-것을-업데이트했어-많_implementation.md": {
+ "mtimeMs": 1777986879000,
+ "size": 1836,
+ "lines": 22,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 오늘 많은 것을 업데이트했어. 많이 고친것 같지만 그럼에도 불구하...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-05_volumes-data-project-antigravity-connectai-이-프로젝트-분석해줘-volum_implementation.md": {
+ "mtimeMs": 1777967233000,
+ "size": 1747,
+ "lines": 23,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 분석해줘./Volumes/Data/project/An...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-05_volumes-data-project-antigravity-connectai-이-프로젝트-분석해줘_implementation.md": {
+ "mtimeMs": 1777966822000,
+ "size": 1727,
+ "lines": 22,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 분석해줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-분석하고-부족한-부분이나-개선이_implementation-2.md": {
+ "mtimeMs": 1778598784000,
+ "size": 1575,
+ "lines": 22,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 분석하고 부족한 부분이나 개선이 필요한 부분을 알려주면 좋겠어.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-분석하고-부족한-부분이나-개선이_implementation-3.md": {
+ "mtimeMs": 1778599019000,
+ "size": 1641,
+ "lines": 22,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 분석하고 부족한 부분이나 개선이 필요한 부분을 알려주면 좋겠어.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-분석하고-부족한-부분이나-개선이_implementation-4.md": {
+ "mtimeMs": 1778600781000,
+ "size": 1715,
+ "lines": 24,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 분석하고 부족한 부분이나 개선이 필요한 부분을 알려주면 좋겠어.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-분석하고-부족한-부분이나-개선이_implementation.md": {
+ "mtimeMs": 1778598509000,
+ "size": 684,
+ "lines": 22,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 분석하고 부족한 부분이나 개선이 필요한 부분을 알려주면 좋겠어.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트-작업할거야_implementation.md": {
+ "mtimeMs": 1778691256000,
+ "size": 990,
+ "lines": 22,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 작업할거야",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-13_너는-분석-요청하거나-내가-작업-요청을-할때-connectai-architecture-md-문서를-참고하고-_implementation.md": {
+ "mtimeMs": 1778678912000,
+ "size": 1738,
+ "lines": 22,
+ "role": "Development Log: 너는 분석 요청하거나 내가 작업 요청을 할때 connectai architecture.md 문서를 참고하고 작업을 하나?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-14_reflector-에이전트가-1인-기업-에이전트-목록에는-안보이는데_implementation.md": {
+ "mtimeMs": 1778762677000,
+ "size": 1519,
+ "lines": 24,
+ "role": "Development Log: REFLECTOR 에이전트가 1인 기업 에이전트 목록에는 안보이는데",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-16_astra-google-calendar-oauth-연결_implementation-2.md": {
+ "mtimeMs": 1778937290000,
+ "size": 1230,
+ "lines": 22,
+ "role": "Development Log: Astra: Google Calendar OAuth 연결",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-16_astra-google-calendar-oauth-연결_implementation.md": {
+ "mtimeMs": 1778937268000,
+ "size": 1267,
+ "lines": 22,
+ "role": "Development Log: Astra: Google Calendar OAuth 연결",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-16_astra-office가-아직은-많이-부족한것-같은데-어떻게-하면-트랜디하고-재미있는-볼거리가-될-수-있을지_implementation.md": {
+ "mtimeMs": 1778942937000,
+ "size": 1750,
+ "lines": 22,
+ "role": "Development Log: astra office가 아직은 많이 부족한것 같은데 어떻게 하면 트랜디하고 재미있는 볼거리가 될 수 있을지. 개선점 줄 수 있어?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-22_e-wiki-connectai-이-프로젝트가-너의-프로젝트인데-단순히-cloud-base-ai-model을-_implementation.md": {
+ "mtimeMs": 1779492050000,
+ "size": 1638,
+ "lines": 22,
+ "role": "Development Log: E:\\Wiki\\connectai 이 프로젝트가 너의 프로젝트인데, 단순히 cloud base ai model을 사용하는 것과 너를 사용하는 것이...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰를-하고-사용자-입장에_implementation-2.md": {
+ "mtimeMs": 1779510546000,
+ "size": 1823,
+ "lines": 25,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰를 하고 사용자 입장에서 개선이 필요한 부분이 있는지 확...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰를-하고-사용자-입장에_implementation.md": {
+ "mtimeMs": 1779510462000,
+ "size": 823,
+ "lines": 22,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰를 하고 사용자 입장에서 개선이 필요한 부분이 있는지 확...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰를-해줘-그리고-어떻게_implementation.md": {
+ "mtimeMs": 1779508381000,
+ "size": 854,
+ "lines": 22,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰를 해줘 그리고 어떻게 하면 더 유저 친화적으로 너를 개...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰하고-사용자-입장에서-_implementation-2.md": {
+ "mtimeMs": 1779512574000,
+ "size": 1836,
+ "lines": 26,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰하고 사용자 입장에서 개선이 필요한 부분이 있는지, 제안...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰하고-사용자-입장에서-_implementation-3.md": {
+ "mtimeMs": 1779514787000,
+ "size": 851,
+ "lines": 22,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰하고 사용자 입장에서 개선이 필요한 부분이 있는지, 제안...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰하고-사용자-입장에서-_implementation-4.md": {
+ "mtimeMs": 1779514895000,
+ "size": 1786,
+ "lines": 23,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰하고 사용자 입장에서 개선이 필요한 부분이 있는지, 제안...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰하고-사용자-입장에서-_implementation-5.md": {
+ "mtimeMs": 1779514975000,
+ "size": 1334,
+ "lines": 22,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰하고 사용자 입장에서 개선이 필요한 부분이 있는지, 제안...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-23_volumes-data-project-antigravity-connectai-코드-리뷰하고-사용자-입장에서-_implementation.md": {
+ "mtimeMs": 1779511474000,
+ "size": 851,
+ "lines": 22,
+ "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI 코드 리뷰하고 사용자 입장에서 개선이 필요한 부분이 있는지, 제안...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-29_e-wiki-connectai-프로젝트에-대해서-이야기-하는거야_implementation.md": {
+ "mtimeMs": 1781006628000,
+ "size": 1611,
+ "lines": 28,
+ "role": "Development Log: E:\\Wiki\\connectai 프로젝트에 대해서 이야기 하는거야.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-05-29_아스트라를-지금-보다-더-날카롭고-신뢰감이-높은-아이-그리고-나의-의도를-잘-파악하게-하기-위해서는-어떤부분_implementation.md": {
+ "mtimeMs": 1781006628000,
+ "size": 1670,
+ "lines": 22,
+ "role": "Development Log: 아스트라를 지금 보다 더 날카롭고 신뢰감이 높은 아이 그리고 나의 의도를 잘 파악하게 하기 위해서는 어떤부분을 강화하는게 좋을까?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-08_아니-지금-코드-업데이트를-했거든-다시-코드를-검토하고-의견을-줘_implementation.md": {
+ "mtimeMs": 1781006628000,
+ "size": 1413,
+ "lines": 23,
+ "role": "Development Log: 아니 지금 코드 업데이트를 했거든. 다시 코드를 검토하고 의견을 줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-11_6월-12일-업무-목록-알려줘_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1713,
+ "lines": 22,
+ "role": "Development Log: 6월 12일 업무 목록 알려줘",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-11_너는-스스로-너-자신이-성장할-수-있는-기능이-있어_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1627,
+ "lines": 22,
+ "role": "Development Log: 너는 스스로 너 자신이 성장할 수 있는 기능이 있어?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-11_아-내용을-잘못-줬어-작업-시간은-약-4시간-정도-예상-11시에-시작해서-15시까지-로-시간을-다시-조정해주_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1734,
+ "lines": 22,
+ "role": "Development Log: 아 내용을 잘못 줬어. 작업 시간은 약 4시간 정도 예상 11시에 시작해서 15시까지. 로 시간을 다시 조정해주고 점검 예상 시간 관련해서 정정...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-11_아니-너의-답변-방식을-좀-더-개선하면-좋을-것-같아-나의-질문은-오늘-즉-6월-11일-업무-브리핑해줘는-6_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1850,
+ "lines": 22,
+ "role": "Development Log: 아니 너의 답변 방식을 좀 더 개선하면 좋을 것 같아. 나의 질문은 오늘 즉 6월 11일 업무 브리핑해줘는. 6월 11일 날짜에 캘린더에 등록된...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-11_아니-오늘날짜로-브리핑해달-라고-헀자나-그러면-6월-11일-업무-목록을-알려줘야지_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1758,
+ "lines": 22,
+ "role": "Development Log: 아니 오늘날짜로 브리핑해달ㄹ라고 헀자나. 그러면 6월 11일 업무 목록을 알려줘야지.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-11_앞으로는-내-의도를-잘-파악해주면-좋겠어_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1772,
+ "lines": 22,
+ "role": "Development Log: 앞으로는 내 의도를 잘 파악해주면 좋겠어.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-11_오늘-날짜-업무-알려줘_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1320,
+ "lines": 22,
+ "role": "Development Log: 오늘 날짜 업무 알려줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-11_오늘-업무-목록-줘_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1506,
+ "lines": 22,
+ "role": "Development Log: 오늘 업무 목록 줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-11_캘린더를-보면-오늘-날짜로-2개-테스크가-있는데-롯데-자이언츠-이머시브-현황-확인과-즐겨찾기-ui-수정이-있_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1804,
+ "lines": 22,
+ "role": "Development Log: 캘린더를 보면 오늘 날짜로 2개 테스크가 있는데 ? 롯데 자이언츠 이머시브 현황 확인과 즐겨찾기 UI 수정이 있자나.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-11_캘린더를-읽고-정확한-내용을-줘_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1593,
+ "lines": 22,
+ "role": "Development Log: 캘린더를 읽고 정확한 내용을 줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-11_캘린더에서-오늘날짜-기준으로-할일-브리핑해줘-간단하게_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1080,
+ "lines": 22,
+ "role": "Development Log: 캘린더에서 오늘날짜 기준으로 할일 브리핑해줘. 간단하게",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-12_3가지를-줬는데-너무-보편적인것만-있어-이런-아이디어가-있으면-좋겠어-한국법에서-회사에서-1년에-1번인가-2_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1744,
+ "lines": 22,
+ "role": "Development Log: 3가지를 줬는데 너무 보편적인것만 있어. 이런 아이디어가 있으면 좋겠어. 한국법에서 회사에서 1년에 1번인가 2번 임직원 컴플라이언스 교육이 있...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-12_e-wiki-connectai-에서-wikify-사용되는-포멧에-대한-의견-부족한거나-개선이-필요한-부분이-_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1619,
+ "lines": 22,
+ "role": "Development Log: E:\\Wiki\\connectai 에서 wikify 사용되는 포멧에 대한 의견. 부족한거나 개선이 필요한 부분이 있는지.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-12_e-wiki-connectai-의-기능-중-astra의-업무-능력이나-지식-self-envolving-혹은-_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1750,
+ "lines": 23,
+ "role": "Development Log: E:\\Wiki\\connectai 의 기능 중 astra의 업무 능력이나 지식 self-envolving 혹은 대화 방법이라거나 답변 관련하여 개...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-12_아이디어-좋아-지금-포멧으로-써줘-이번건-일단-이것을-우리-모회사의-계열사-대상으로-할-수-있는-아이디어로-_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1825,
+ "lines": 22,
+ "role": "Development Log: 아이디어 좋아. 지금 포멧으로 써줘. 이번건. 일단 이것을 우리 모회사의 계열사 대상으로 할 수 있는 아이디어로 주면 어떨까 싶어",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-12_어-블로그-글-쓰기에-대한-블로그-아니야-아마-넌-예전-블로그-내용을-보는데-최근-블로그-초기화-하고-다시-_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1765,
+ "lines": 22,
+ "role": "Development Log: 어? 블로그 글 쓰기에 대한 블로그 아니야? 아마 넌 예전 블로그 내용을 보는데? 최근 블로그 초기화 하고 다시 만들었거든",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-12_우리-회사에서-할-수-있는-기술력을-설명할께-우리만-작업해서-할-수-있는-작업-위주로-주면-더-좋지만-안되면_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1834,
+ "lines": 22,
+ "role": "Development Log: 우리 회사에서 할 수 있는 기술력을 설명할께. 우리만 작업해서 할 수 있는 작업 위주로 주면 더 좋지만 안되면 우리를 중심으로 외주를 고용하는 ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/development/2026-06-12_지금까지-너는-나에게-아이디어-핵심-내용-기대-효과-내용으로-써줬는데-법정-의무-교육은-다른-포멧으로-줬어-_implementation.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1866,
+ "lines": 22,
+ "role": "Development Log: 지금까지 너는 나에게 아이디어, 핵심 내용, 기대 효과 내용으로 써줬는데. 법정 의무 교육은 다른 포멧으로 줬어 기대 효과를 써줘. 법정 의무 ...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트-작업-할-거야.md": {
+ "mtimeMs": 1778690673000,
+ "size": 652,
+ "lines": 16,
+ "role": "Discussion: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 작업 할 거야.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트-작업할거야.md": {
+ "mtimeMs": 1778680095000,
+ "size": 651,
+ "lines": 16,
+ "role": "Discussion: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 작업할거야",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트-하위-폴더-포함해서.md": {
+ "mtimeMs": 1778689036000,
+ "size": 720,
+ "lines": 16,
+ "role": "Discussion: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트 하위 폴더 포함해서 딥 리서치 해줘. 최적화 할 부분...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트를-작업할거야.md": {
+ "mtimeMs": 1778677791000,
+ "size": 719,
+ "lines": 16,
+ "role": "Discussion: /Volumes/Data/project/Antigravity/ConnectAI 이 프로젝트를 작업할거야.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-05-14_최성연-알아-칼리버스에서-근무한데.md": {
+ "mtimeMs": 1778762677000,
+ "size": 1297,
+ "lines": 16,
+ "role": "Discussion: 최성연 알아? 칼리버스에서 근무한데",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-05-22_e-wiki-connectai-git에-커밋하고-푸쉬해줘.md": {
+ "mtimeMs": 1779492050000,
+ "size": 745,
+ "lines": 16,
+ "role": "Discussion: E:\\Wiki\\connectai git에 커밋하고 푸쉬해줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-05-29_진행해.md": {
+ "mtimeMs": 1781006628000,
+ "size": 892,
+ "lines": 16,
+ "role": "Discussion: 진행해",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-06-11_duns를-재발급-받아야-하는데-발행시-사용한-이메일을-알-수가-없어-이럴때-어떻게-해야해.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1514,
+ "lines": 16,
+ "role": "Discussion: DUNS를 재발급 받아야 하는데, 발행시 사용한 이메일을 알 수가 없어. 이럴때 어떻게 해야해?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-06-11_너는-어떻게-너-스스로의-지식을-쌓고-성장해가는거야.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1522,
+ "lines": 16,
+ "role": "Discussion: 너는 어떻게 너 스스로의 지식을 쌓고 성장해가는거야?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-06-12_그니깐-https-koritips-com-홈페이지에-들어가서-홈페이지-분석-후-다시-분석해줘.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1476,
+ "lines": 16,
+ "role": "Discussion: 그니깐, https://koritips.com 홈페이지에 들어가서 홈페이지 분석 후 다시 분석해줘",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-06-12_우리-개발실은-가우시안-스필리터-그리고-월마트에서-이머시브-스토어-그리고-ai로-영상-사운드-제작팀이-있어-.md": {
+ "mtimeMs": 1781260027000,
+ "size": 1747,
+ "lines": 16,
+ "role": "Discussion: 우리 개발실은 가우시안 스필리터, 그리고 월마트에서 이머시브 스토어, 그리고 ai로 영상, 사운드 제작팀이 있어. 인원은 30명정도야. 여기에는...",
+ "imports": []
+ },
+ "docs/records/ConnectAI/planning/2026-05-02_project-chronicle-guard.md": {
+ "mtimeMs": 1777808065000,
+ "size": 2946,
+ "lines": 58,
+ "role": "Feature Plan: Project Chronicle Guard",
+ "imports": []
+ },
+ "docs/records/ConnectAI/planning/2026-05-02_second-brain-trace-mode.md": {
+ "mtimeMs": 1777808065000,
+ "size": 1467,
+ "lines": 36,
+ "role": "Feature Plan: Second Brain Trace Mode",
+ "imports": []
+ },
+ "docs/records/ConnectAI/planning/2026-05-13_connectai-architecture-문서-최신화-해줘.md": {
+ "mtimeMs": 1778693933000,
+ "size": 1340,
+ "lines": 40,
+ "role": "Feature Plan: Connectai architecture 문서 최신화 해줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/planning/2026-05-13_상세하게-아키텍처-기준으로-설명해줘.md": {
+ "mtimeMs": 1778678870000,
+ "size": 1220,
+ "lines": 40,
+ "role": "Feature Plan: 상세하게 아키텍처 기준으로 설명해줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/planning/2026-05-13_지금-connectai-architecture-md-문서-내용-중-업데이트가-필요한-부분이-있는지-확인해줘-.md": {
+ "mtimeMs": 1778694061000,
+ "size": 2970,
+ "lines": 40,
+ "role": "Feature Plan: 지금 connectai architecture.md 문서 내용 중 업데이트가 필요한 부분이 있는지 확인해줘. 그러고 최신화해줘. 너가 분석해",
+ "imports": []
+ },
+ "docs/records/ConnectAI/planning/2026-06-11_e-wiki-connectai-프로젝트의-코딩-설계가-잘되어-있는지-유지-보수가-쉽게-되어-있는지-검토해줄-.md": {
+ "mtimeMs": 1781260027000,
+ "size": 3506,
+ "lines": 40,
+ "role": "Feature Plan: E:\\Wiki\\connectai 프로젝트의 코딩, 설계가 잘되어 있는지, 유지 보수가 쉽게 되어 있는지 검토해줄 수 있어?",
+ "imports": []
+ },
+ "docs/records/ConnectAI/planning/2026-06-12_https-koritips-com-블로그에-대한-조사-내용-평가를-해줘.md": {
+ "mtimeMs": 1781260027000,
+ "size": 3418,
+ "lines": 40,
+ "role": "Feature Plan: https://koritips.com 블로그에 대한 조사, 내용 평가를 해줘.",
+ "imports": []
+ },
+ "docs/records/ConnectAI/project-profile.md": {
+ "mtimeMs": 1777808208000,
+ "size": 957,
+ "lines": 30,
+ "role": "Project Profile",
+ "imports": []
+ },
+ "docs/records/ConnectAI/timeline.md": {
+ "mtimeMs": 1781260027000,
+ "size": 26139,
+ "lines": 422,
+ "role": "Project Timeline",
+ "imports": []
+ },
+ "docs/refactoring_roadmap.md": {
+ "mtimeMs": 1778171332000,
+ "size": 3123,
+ "lines": 53,
+ "role": "🛠️ ConnectAI 아키텍처 리팩토링 로드맵",
+ "imports": []
}
}
}
\ No newline at end of file
diff --git a/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json b/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json
index 488cb58..fa59f0e 100644
--- a/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json
+++ b/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json
@@ -1,5 +1,5 @@
{
"result": "직답 결과 — single-pass mock 응답입니다.",
- "createdAt": 1781240203092,
+ "createdAt": 1781274728276,
"modelVersion": "unknown"
}
\ No newline at end of file
diff --git a/.astra/tests/engine/.astra/cache/8c208151bed9108b665cd93e98fc10d377a9fef641dd359504b8d53aecd0a4c3.json b/.astra/tests/engine/.astra/cache/8c208151bed9108b665cd93e98fc10d377a9fef641dd359504b8d53aecd0a4c3.json
index ef7c140..2e42bcc 100644
--- a/.astra/tests/engine/.astra/cache/8c208151bed9108b665cd93e98fc10d377a9fef641dd359504b8d53aecd0a4c3.json
+++ b/.astra/tests/engine/.astra/cache/8c208151bed9108b665cd93e98fc10d377a9fef641dd359504b8d53aecd0a4c3.json
@@ -1,5 +1,5 @@
{
- "result": "---\nid: wiki_on\ndate: 2026-06-12T04:56:43.094Z\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": 1781240203095,
+ "result": "---\nid: wiki_on\ndate: 2026-06-12T14:32:08.279Z\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) (11ms)\n",
+ "createdAt": 1781274728280,
"modelVersion": "unknown"
}
\ No newline at end of file
diff --git a/.astra/tests/engine/.astra/missions/wiki_on.json b/.astra/tests/engine/.astra/missions/wiki_on.json
index 033ba86..f2e4f53 100644
--- a/.astra/tests/engine/.astra/missions/wiki_on.json
+++ b/.astra/tests/engine/.astra/missions/wiki_on.json
@@ -1,8 +1,8 @@
{
"missionId": "wiki_on",
"status": "completed",
- "startTime": "2026-06-12T04:56:43.071Z",
- "totalElapsedMs": 25,
+ "startTime": "2026-06-12T14:32:08.260Z",
+ "totalElapsedMs": 21,
"results": {
"direct": "직답 결과 — single-pass mock 응답입니다."
},
@@ -12,16 +12,16 @@
{
"from": "idle",
"to": "direct",
- "durationMs": 18,
+ "durationMs": 11,
"message": "답변 작성 중... (단일 호출 fast-path)",
- "ts": "2026-06-12T04:56:43.089Z"
+ "ts": "2026-06-12T14:32:08.271Z"
},
{
"from": "direct",
"to": "completed",
- "durationMs": 7,
+ "durationMs": 10,
"message": "미션 완료",
- "ts": "2026-06-12T04:56:43.096Z"
+ "ts": "2026-06-12T14:32:08.281Z"
}
],
"resilienceMetrics": {
diff --git a/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json b/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json
index 6966c1d..cc2f6b9 100644
--- a/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json
+++ b/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json
@@ -1,5 +1,5 @@
{
"result": "Final report with inconsistencies. This should be long enough to pass validation.",
- "createdAt": 1781240209816,
+ "createdAt": 1781274734889,
"modelVersion": "unknown"
}
\ No newline at end of file
diff --git a/.astra/tests/stress/.astra/cache/4fc755e372f1dd80d6bffc7b2ef973124fb64ba505f767c53a783833bbc3fa6a.json b/.astra/tests/stress/.astra/cache/4fc755e372f1dd80d6bffc7b2ef973124fb64ba505f767c53a783833bbc3fa6a.json
index e78acf0..cc2f6b9 100644
--- a/.astra/tests/stress/.astra/cache/4fc755e372f1dd80d6bffc7b2ef973124fb64ba505f767c53a783833bbc3fa6a.json
+++ b/.astra/tests/stress/.astra/cache/4fc755e372f1dd80d6bffc7b2ef973124fb64ba505f767c53a783833bbc3fa6a.json
@@ -1,5 +1,5 @@
{
"result": "Final report with inconsistencies. This should be long enough to pass validation.",
- "createdAt": 1781240209815,
+ "createdAt": 1781274734889,
"modelVersion": "unknown"
}
\ No newline at end of file
diff --git a/.astra/tests/stress/.astra/cache/6e559207c4542d959700ff14f360e6575e54853929e991e579e318f2f5a19030.json b/.astra/tests/stress/.astra/cache/6e559207c4542d959700ff14f360e6575e54853929e991e579e318f2f5a19030.json
index aa32c21..253d49d 100644
--- a/.astra/tests/stress/.astra/cache/6e559207c4542d959700ff14f360e6575e54853929e991e579e318f2f5a19030.json
+++ b/.astra/tests/stress/.astra/cache/6e559207c4542d959700ff14f360e6575e54853929e991e579e318f2f5a19030.json
@@ -1,5 +1,5 @@
{
"result": "[{\"heading\":\"본문\",\"scope\":\"전체 답변\"}]",
- "createdAt": 1781240209811,
+ "createdAt": 1781274734878,
"modelVersion": "unknown"
}
\ No newline at end of file
diff --git a/.astra/tests/stress/.astra/cache/f65136cebc95448a7e93a45745cb73b3a5a01af5d82391ec29a25bd72b8239a5.json b/.astra/tests/stress/.astra/cache/f65136cebc95448a7e93a45745cb73b3a5a01af5d82391ec29a25bd72b8239a5.json
index 8bcecc2..59a50e8 100644
--- a/.astra/tests/stress/.astra/cache/f65136cebc95448a7e93a45745cb73b3a5a01af5d82391ec29a25bd72b8239a5.json
+++ b/.astra/tests/stress/.astra/cache/f65136cebc95448a7e93a45745cb73b3a5a01af5d82391ec29a25bd72b8239a5.json
@@ -1,5 +1,5 @@
{
"result": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.",
- "createdAt": 1781240209813,
+ "createdAt": 1781274734884,
"modelVersion": "unknown"
}
\ No newline at end of file
diff --git a/.astra/tests/stress/.astra/missions/stress_conflict_1781240209794.json b/.astra/tests/stress/.astra/missions/stress_conflict_1781274734861.json
similarity index 73%
rename from .astra/tests/stress/.astra/missions/stress_conflict_1781240209794.json
rename to .astra/tests/stress/.astra/missions/stress_conflict_1781274734861.json
index a1e6377..8e93612 100644
--- a/.astra/tests/stress/.astra/missions/stress_conflict_1781240209794.json
+++ b/.astra/tests/stress/.astra/missions/stress_conflict_1781274734861.json
@@ -1,8 +1,8 @@
{
- "missionId": "stress_conflict_1781240209794",
+ "missionId": "stress_conflict_1781274734861",
"status": "completed",
- "startTime": "2026-06-12T04:56:49.794Z",
- "totalElapsedMs": 23,
+ "startTime": "2026-06-12T14:32:14.861Z",
+ "totalElapsedMs": 28,
"results": {
"outline": "[{\"heading\":\"본문\",\"scope\":\"전체 답변\"}]",
"section_0": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.",
@@ -14,30 +14,30 @@
{
"from": "idle",
"to": "outline",
- "durationMs": 16,
+ "durationMs": 11,
"message": "답변 구조 잡는 중...",
- "ts": "2026-06-12T04:56:49.810Z"
+ "ts": "2026-06-12T14:32:14.872Z"
},
{
"from": "outline",
"to": "section",
- "durationMs": 2,
+ "durationMs": 6,
"message": "본문 작성 중...",
- "ts": "2026-06-12T04:56:49.812Z"
+ "ts": "2026-06-12T14:32:14.878Z"
},
{
"from": "section",
"to": "polish",
- "durationMs": 2,
+ "durationMs": 6,
"message": "최종 다듬기 중...",
- "ts": "2026-06-12T04:56:49.814Z"
+ "ts": "2026-06-12T14:32:14.884Z"
},
{
"from": "polish",
"to": "completed",
- "durationMs": 3,
+ "durationMs": 5,
"message": "미션 완료",
- "ts": "2026-06-12T04:56:49.817Z"
+ "ts": "2026-06-12T14:32:14.889Z"
}
],
"resilienceMetrics": {
diff --git a/docs/plans/alignment-self-learning-plan.md b/docs/plans/alignment-self-learning-plan.md
new file mode 100644
index 0000000..2ab4405
--- /dev/null
+++ b/docs/plans/alignment-self-learning-plan.md
@@ -0,0 +1,194 @@
+# Alignment Self-Learning 개선 계획 (v2 — 적대적 리뷰 반영)
+
+## v1 → v2 변경 (리뷰 지적 반영)
+1. **[❌→해결] webview 렌더링**: 2-C를 "권장"이 아닌 필수 구현으로 격상. 삽입 위치 media/sidebar.js 의 openQuestions 렌더 블록(~1228) 직후. `c.answeredQuestions` 중 자가 조사 marker 필터 후 최대 3건 표시.
+2. **[❌→해결] selfAnswerQuestions 시스템 프롬프트 전문 명시** (아래 2-A에 추가).
+3. **[❌→해결] `companyAlignmentKnowledgeSave` package.json 명세 추가** (3-C에 키 이름·기본값·설명 명시).
+4. **[⚠→해결] contract mutation → 비파괴적 변경**: `analysis.contract`를 직접 mutate하지 않고 spread로 새 객체 생성(`enrichedContract`). 이후 모든 경로(payload·_alignment.set·_runCompanyTurn)에 enriched를 전달.
+5. **[⚠→해결] 자가 조사 marker 명확화**: `(자가 조사) ` → `(자가 조사로 두뇌에서 확인) ` — dispatcher의 LLM이 사용자 직접 답변과 구분 가능하도록 의미를 텍스트에 내장. formatContractForPrompt 수정 불필요.
+6. **[⚠→확인완료] 파일 쓰기 권한**: 기존 lessons.ts(line 64, 82)가 이미 fs.writeFileSync로 brain 폴더에 직접 쓰고 있음 — extension host는 로컬 fs 권한 제약 없음. 위험 아님.
+7. **[⚠→영향없음] alignment 'off' 모드**: 자가 조사는 `_runIntentAlignment` 내부에서만 작동 — alignment 자체가 안 돌면 자가 조사도 비활성. 추가 처리 불필요.
+
+## 목표
+1인 기업 모드의 Intent Alignment(요청 분석) 단계가:
+1. 묻기 전에 **프로젝트 컨텍스트를 먼저 본다** (Phase 1)
+2. 그래도 비는 항목은 **두뇌를 스스로 검색해 답을 찾는다** (Phase 2)
+3. 정말 모르는 것만 사용자에게 묻고, **받은 답을 두뇌에 저장**해 다음부터 안 묻는다 (Phase 3)
+
+## 확인된 코드 사실
+- `analyzeIntent` 입력(`IntentAnalysisInput`)에 프로젝트/두뇌 정보가 전혀 없음 — [intentAlignment.ts:51-74]
+- `_buildProjectArchitectureContext()`가 이미 존재, `.astra/project-context/architecture.md`를 16,000자 cap으로 포맷 — [sidebarProvider.ts:1781, architecturePayloads.ts:97]
+- 분석기 모델은 `companyIntentClassifierModel || defaultModel` (작은 모델) — [sidebarProvider.ts:1942]
+- 두뇌 검색 빌딩블록: `findBrainFiles`(utils, 5s cache) + `getBrainTokenIndex` + `tokenize/expandQuery/scoreTfIdfPreTokenized` + `extractBestExcerpt` — [retrieval/]
+- `RetrievalOrchestrator`는 `MemoryManager` 의존이라 alignment에서 직접 쓰기 무거움 → 빌딩블록 직접 조합
+- webview alignment 카드는 `openQuestions`만 렌더, `answeredQuestions`는 미표시 — [media/sidebar.js:1209]
+- Lesson 시스템(kind: qa-finding)은 "실수 회피" 용도로 의미가 다름 → **일반 노트로 저장** (lesson frontmatter 사용 안 함)
+- `analyzeIntent`는 throw하지 않는 패턴 (실패 시 low-conf fallback) — 신규 코드도 동일 패턴 준수
+- alignment 흐름: `_runIntentAlignment` → `shouldAutoProceedAlignment` 판정 → auto-proceed 또는 카드 표시 → `_handleAlignmentAnswer`(답변 라운드) / `_proceedWithCurrentAlignment`(진행 버튼)
+
+---
+
+## Phase 1 — 프로젝트 컨텍스트 주입
+
+### 1-A. `src/features/company/intentAlignment.ts`
+- `IntentAnalysisInput`에 `projectContext?: string` 추가 (doc comment 포함)
+- `_buildUserMessage`: projectContext 있으면 블록 추가:
+ ```
+ [프로젝트 컨텍스트 — 현재 워크스페이스에서 자동 수집]
+ 아래는 현재 열려 있는 프로젝트의 아키텍처 요약입니다. 여기서 직접 확인되는
+ 사실(프로젝트가 무엇인지·기술 스택·구조)은 이미 알려진 정보로 취급해 context
+ 슬롯에 반영하고, openQuestions에 다시 넣지 마세요.
+ ---
+ <내용>
+ ---
+ ```
+- `SYSTEM_PROMPT`에 규칙 1줄 추가: "[프로젝트 컨텍스트] 블록이 있으면 그 내용으로 context를 채우고, 거기서 답이 확인되는 질문은 openQuestions에 만들지 마세요."
+
+### 1-B. `src/sidebarProvider.ts` `_runIntentAlignment`
+- 첫 라운드만(`!opts.previousContract`) — priorChatSummary와 동일 패턴:
+ ```ts
+ let projectContext: string | undefined;
+ if (!opts.previousContract) {
+ try {
+ const arch = this._buildProjectArchitectureContext();
+ if (arch) {
+ projectContext = arch.length > 3000
+ ? arch.slice(0, 3000) + '\n…(이하 생략 — 전체는 architecture.md 참조)'
+ : arch;
+ }
+ } catch { /* alignment는 계속 */ }
+ }
+ ```
+- `analyzeIntent` 입력에 `projectContext` 전달
+- 주의: architecture detach(autoAttach=false) 사용자는 빈 문자열 → Phase 1 효과 없음 (의도된 동작)
+
+---
+
+## Phase 2 — 자가 조사(Self-Research) 패스
+
+### 2-A. 신규 `src/features/company/alignmentResearch.ts`
+```ts
+export const SELF_RESEARCH_PREFIX = '(자가 조사) ';
+
+export interface QuestionEvidence {
+ question: string;
+ excerpts: Array<{ title: string; relativePath: string; excerpt: string }>;
+}
+
+// 두뇌 TF-IDF 검색 — 질문별 top 2 파일에서 발췌. 전체 합계 4,000자 cap.
+// brainPath 없음/빈 두뇌/에러 → 빈 excerpts (throw 금지)
+export function gatherEvidenceForQuestions(
+ brainPath: string,
+ questions: string[],
+): QuestionEvidence[]
+
+// LLM 1회 호출 — 근거만으로 답할 수 있는 질문 판별.
+// JSON: { answers: [{ question, status: 'answered'|'unanswered', answer }] }
+// 4-stage 관용 파서 (intentAlignment 패턴 복제). 실패 시 전원 unanswered.
+export async function selfAnswerQuestions(
+ ai: IAIService,
+ input: { userPrompt: string; evidence: QuestionEvidence[]; model?: string },
+): Promise>
+```
+
+### 2-B. `_runIntentAlignment` 통합 (순서 변경 포함)
+analyzeIntent 직후, `shouldAutoProceedAlignment` 판정 **전에** 삽입:
+```ts
+const contract = analysis.contract;
+const reachedLimit = opts.roundsAsked >= opts.roundsLimit;
+
+// ── 자가 조사: 사용자에게 묻기 전에 두뇌에서 스스로 답 찾기 ──
+if (cfg.companyAlignmentSelfResearch !== false
+ && contract.openQuestions.length > 0 && !reachedLimit) {
+ try {
+ const brain = getActiveBrainProfile();
+ const evidence = gatherEvidenceForQuestions(brain.localBrainPath, contract.openQuestions);
+ if (evidence.some((e) => e.excerpts.length > 0)) {
+ const answers = await selfAnswerQuestions(new AIService(), {
+ userPrompt: opts.userPrompt, evidence,
+ model: cfg.companyIntentClassifierModel || cfg.defaultModel,
+ });
+ const solved = answers.filter((a) => a.answered && a.answer.trim());
+ if (solved.length > 0) {
+ const solvedSet = new Set(solved.map((s) => s.question));
+ contract.answeredQuestions.push(
+ ...solved.map((s) => ({ q: s.question, a: SELF_RESEARCH_PREFIX + s.answer })));
+ contract.openQuestions = contract.openQuestions.filter((q) => !solvedSet.has(q));
+ // pixelOffice 로그
+ }
+ }
+ } catch { /* 실패해도 원래 질문 그대로 진행 */ }
+}
+
+if (shouldAutoProceedAlignment(...)) { ... } // 기존 흐름 — openQuestions가 비면 자연히 confirm/진행
+```
+- 라운드 카운트 소비 없음 (사용자 응답이 아니므로)
+- latency: 질문 있을 때만 LLM 1회 추가
+
+### 2-C. webview `media/sidebar.js` (line ~1209 부근)
+- `answeredQuestions` 중 `(자가 조사)` prefix 항목이 있으면 카드에 소섹션 추가:
+ "🔎 스스로 확인한 정보" + q/a 목록 (최대 3건, a는 150자 cap)
+
+### 2-D. config
+- `src/config.ts`: `companyAlignmentSelfResearch: boolean` (default true) — 기존 company* 키 패턴
+- `package.json`: `g1nation.company.alignmentSelfResearch` boolean default true + 설명
+
+---
+
+## Phase 3 — 지식 요청 답변의 두뇌 저장 (학습 루프 완성)
+
+### 3-A. `alignmentResearch.ts`에 추가
+```ts
+// 사용자가 직접 답한 Q/A만 (SELF_RESEARCH_PREFIX 제외, a.length >= 20)
+// 저장: /Alignment Knowledge/YYYY-MM-DD .md (일반 노트, frontmatter 없음)
+// 동일 경로 존재 시 skip (중복 방지). 반환: 저장 경로 | null. throw 금지.
+export function saveAlignmentKnowledge(
+ brainPath: string,
+ input: { userPrompt: string; qaList: Array<{ q: string; a: string }> },
+): string | null
+```
+본문 형식:
+```md
+# {userPrompt 앞 50자}
+
+> 1인 기업 모드 Intent Alignment에서 사용자가 직접 제공한 정보. ({date})
+
+## 원본 요청
+{userPrompt}
+
+## 확인된 정보
+### Q. {q}
+{a}
+```
+
+### 3-B. 트리거 2곳 (fire-and-forget)
+- `_runIntentAlignment`의 auto-proceed 분기: `_runCompanyTurn` 직전
+- `_proceedWithCurrentAlignment`: `_runCompanyTurn` 직전
+- 조건: `cfg.companyAlignmentKnowledgeSave !== false` && 사용자 직접 답변 존재
+- try/catch + void (alignment 흐름 차단 금지), pixelOffice 로그 "💾 확인된 정보 두뇌 저장"
+
+### 3-C. config
+- `companyAlignmentKnowledgeSave: boolean` default true + package.json 노출
+
+### 효과 (루프 완성)
+저장된 노트는 일반 brain 노트 → 다음 turn에서 Phase 2 자가 조사가 TF-IDF로 발견 → 같은 질문 재발 시 스스로 해결 → 사용자에게 두 번 묻지 않음.
+
+---
+
+## 구현 순서
+1. intentAlignment.ts (Phase 1-A) — 순수 추가
+2. alignmentResearch.ts 신규 (2-A + 3-A) — 독립 모듈
+3. config.ts + package.json (2-D + 3-C)
+4. sidebarProvider.ts 통합 (1-B + 2-B + 3-B)
+5. media/sidebar.js (2-C)
+6. tests/alignmentResearch.test.ts 신규 — 파서 관용성, marker 필터, slug 생성, 저장 skip, 빈 두뇌 안전성
+7. `npx tsc --noEmit` + `npm test`
+
+## 리스크 및 완화
+| 리스크 | 완화 |
+|---|---|
+| 작은 모델 토큰 폭주 (arch 16K) | 3,000자 재절단 |
+| 자가 조사 LLM이 엉뚱한 답을 "answered" 처리 | 프롬프트에 "근거에 명시된 것만, 불확실하면 unanswered" + 근거 출처 표기 |
+| 두뇌 오염 (자동 저장) | 사용자 직접 답변만, 20자 미만 제외, 전용 폴더, config로 off 가능 |
+| alignment latency 증가 | 질문 존재 시에만 작동, 검색은 캐시된 인덱스 |
+| 기존 테스트 파손 | SYSTEM_PROMPT 변경은 순수 추가, 기존 입력 필드 시그니처 유지 |
diff --git a/docs/plans/web-fetch-and-mode-parity-plan.md b/docs/plans/web-fetch-and-mode-parity-plan.md
new file mode 100644
index 0000000..0f7b3d2
--- /dev/null
+++ b/docs/plans/web-fetch-and-mode-parity-plan.md
@@ -0,0 +1,102 @@
+# 웹 접근 + 모드 동등성 수정 계획 (v2 — 적대적 리뷰 + 재검증 반영)
+
+## v1 → v2 핵심 변화: 근본 원인 재진단
+
+리뷰 과정에서 **일반 챗에는 URL 주입 기능이 이미 존재**함이 확인됨
+(`src/lib/contextBuilders/urlContext.ts`, agent.ts:557-569에서 호출).
+
+### 그런데 왜 실패했나 (정확한 원인)
+1. **일반 챗**: `buildUrlContext`가 **Datacollect Bridge(127.0.0.1:3002)에 100% 의존**.
+ 확장은 Bridge를 자동 시작하지 않음 → Bridge 꺼져 있으면 '접근 실패' 정직 블록
+ → 모델이 "사이트 방문 불가"라고 답함. (Bridge 추출 실패/JS 렌더링 페이지도 동일)
+2. **기업 모드**: dispatcher 경로에 URL 주입이 **아예 없음** → 항상 불가.
+3. 검증 완료된 사실:
+ - `isCasualConversation` 게이트는 40자 초과 프롬프트에 영향 없음 (문제 아님)
+ - `buildRequestHistory`는 internal 메시지를 필터링하지 않음 → internal push가 LLM에 도달
+ - continuation loop 트리거 = "action이 chatHistory를 늘렸는가" (agent.ts:1238) → read_file과 동일 패턴이면 fetch_url도 자동 재분석
+ - `_handleCompanyCasual`은 일반 챗 경로(_handlePrompt)를 타므로 별도 처리 불필요
+ - BASE_SYSTEM_PROMPT/DispatcherDeps를 단언하는 기존 테스트 없음 (안전)
+
+---
+
+## 수정 설계 (v2)
+
+### A. 신규 `src/features/web/webFetch.ts` — Bridge 무관 직접 fetch (vscode 의존 없음)
+```ts
+export function extractUrls(text: string, max = 2): string[]
+// http(s)만, dedupe, trailing 구두점 제거, 슬래시 명령(/...)으로 시작하면 빈 배열
+
+export interface WebFetchResult { ok: boolean; url: string; title: string; text: string; error?: string }
+export async function fetchUrlDirect(url: string, opts?: { timeoutMs?: number /*15s*/; maxChars?: number /*20000*/ }): Promise
+// global fetch (bridgeClient가 이미 사용 — 호스트 지원 확인됨) + typeof 가드
+// AbortController timeout / html이면 script·style·noscript 제거 → 태그 strip →
+// 엔티티 최소 디코드 → 공백 정리 + 추출 / html 아니면 raw cap / throw 금지
+```
+
+### B. `urlContext.ts` 개선 — Bridge → 직접 fetch 폴백 (기존 인터페이스 유지)
+- `buildUrlContext(url)`: ① Bridge `/api/web-extract` 시도 (타임아웃 45s→**15s** 단축)
+ → ② 실패/빈 본문이면 `fetchUrlDirect` 폴백 → ③ 둘 다 실패 시 기존 정직 블록
+- **모듈 레벨 TTL 캐시** (URL→블록, 5분, 최대 10개) — chat/alignment/dispatcher가
+ 같은 URL을 연달아 요청해도 네트워크 1회
+- `extractUrlFromPrompt`는 유지하되 호출부는 `extractUrls`(최대 2개)로 확장
+- 실패 안내 문구에서 "브리지 실행 확인" → "직접 접속도 실패" 반영
+
+### C. `` 액션 태그 (LLM 주도 — 양 모드 광고)
+- 신규 `src/agent/actions/webFetch.ts`: `` (회당 최대 2개)
+ - fileDeleteRead.ts의 read_file 패턴 복제: regex → `buildUrlContext(url)` →
+ `ctx.report.push('🌐 Fetched: ')` + `ctx.chatHistory.push({role:'system', internal:true})`
+ - chatHistory push → 일반 챗 continuation loop 자동 트리거 (검증됨)
+ - transactionManager 불필요 (read-only)
+- agent.ts `executeActions`에 `applyWebFetchActions(ctx)` 등록 (listFiles 다음)
+- `utils.ts` BASE_SYSTEM_PROMPT: [ACTION 15: FETCH URL] — 라인 401 부근, 기존 포맷 준수
+ ("링크의 실제 내용이 필요할 때만, 일반 지식 질문에는 사용 금지" 지침 포함)
+- `promptBuilder.ts` specialist 액션 목록(129-142)에 fetch_url 추가
+
+### D. 기업 모드 — DispatcherDeps에 **2개 별도 필드** (리뷰 권고 반영)
+```ts
+// dispatcher.ts DispatcherDeps에 추가:
+architectureContextBlock?: string; // 현재 워크스페이스 아키텍처 (문제 2 해소)
+webContextBlock?: string; // 사용자 프롬프트 URL pre-fetch 결과
+```
+- 4개 합성 지점(planner ~358, specialist ~671, verifier ~699, inspector/CEO ~1053)에서:
+ ```ts
+ const prefix = [deps.architectureContextBlock, deps.webContextBlock, contract...]
+ .filter(Boolean).join('\n\n');
+ ```
+ contract **앞에** 배치 (둘 다 optional — 미전달 시 기존 동작 100% 동일)
+- `_runCompanyTurn`(sidebarProvider:2189) deps 빌드 시:
+ - `architectureContextBlock` = `this._buildProjectArchitectureContext()` 6,000자 절단
+ - `webContextBlock` = `extractUrls(userPrompt)` → `buildUrlContext` (캐시 적중) → 8,000자 cap
+ - 빌드는 try/catch — 실패해도 turn 진행
+
+### E. Alignment 웹 컨텍스트
+- `_runIntentAlignment` 첫 라운드: URL 있으면 `buildUrlContext`(캐시) 결과를
+ 기존 `projectContext` 입력에 append (합계 3,000자 cap 유지 — web 부분은 별도 2,000자 cap 후 합산이 아니라, arch 먼저 + web 이어붙이고 총 5,000자로 상향)
+- 효과: "그 사이트가 뭐냐"는 alignment 질문 차단
+
+### F. config + package.json
+- `webAutoFetchEnabled: boolean` 기본 true — `g1nation.web.autoFetchUrls`
+ (pre-fetch 게이트: 일반 챗 주입부 + _runCompanyTurn + alignment 모두 이 키 확인.
+ 기존 일반 챗 주입부에도 게이트 추가 — 현재는 무조건 실행)
+
+---
+
+## 구현 순서
+1. `src/features/web/webFetch.ts` 신규 + `tests/webFetch.test.ts`
+2. `urlContext.ts` 폴백 + 캐시 + 타임아웃 단축
+3. config.ts + package.json 키
+4. `src/agent/actions/webFetch.ts` + agent.ts 등록 + BASE_SYSTEM_PROMPT + promptBuilder
+5. dispatcher.ts deps 2필드 + 4지점 합성
+6. sidebarProvider.ts: `_runCompanyTurn` + `_runIntentAlignment`
+7. agent.ts 일반 챗 주입부: extractUrls(2개) + config 게이트
+8. `npx tsc --noEmit` + `npm test`
+
+## 리스크 (v2)
+| 리스크 | 완화 |
+|---|---|
+| Bridge 타임아웃 45→15s 단축으로 느린 추출 실패 ↑ | 직접 fetch 폴백이 받아줌 (총 최대 ~30s) |
+| EUC-KR 등 비UTF-8 직접 fetch 깨짐 | Bridge 우선 경로가 1차 방어, 한계 문서화 |
+| 거대 페이지 토큰 폭주 | 직접 20,000자 / 기업 블록 8,000자 / alignment 총 5,000자 cap |
+| dispatcher 테스트 파손 | 신규 필드 optional — 미전달 시 기존과 동일 |
+| 캐시 오염 (실패 결과 캐시) | 실패 블록은 캐시하지 않음 — 성공 결과만 TTL 캐시 |
+| LLM의 fetch_url 남발 | 회당 최대 2개 처리 + "필요할 때만" 프롬프트 지침 |
diff --git a/docs/records/ConnectAI/chronicle.config.json b/docs/records/ConnectAI/chronicle.config.json
index fb847d7..df405b9 100644
--- a/docs/records/ConnectAI/chronicle.config.json
+++ b/docs/records/ConnectAI/chronicle.config.json
@@ -1,11 +1,11 @@
{
"projectId": "connectai",
- "projectName": "connectai",
- "projectRoot": "E:\\Wiki\\connectai",
- "recordRoot": "E:\\Wiki\\connectai\\docs\\records\\connectai",
+ "projectName": "ConnectAI",
+ "projectRoot": "/Volumes/Data/project/Antigravity/ConnectAI",
+ "recordRoot": "/Volumes/Data/project/Antigravity/ConnectAI/docs/records/ConnectAI",
"description": "Auto-created by Project Architecture activation.",
"corePurpose": "",
"detailLevel": "standard",
- "createdAt": "2026-05-20T09:42:40.003Z",
- "updatedAt": "2026-06-12T07:39:22.751Z"
+ "createdAt": "2026-05-23T03:51:11.620Z",
+ "updatedAt": "2026-06-12T14:21:27.301Z"
}
diff --git a/media/sidebar.css b/media/sidebar.css
index ea94a4c..908152e 100644
--- a/media/sidebar.css
+++ b/media/sidebar.css
@@ -1037,6 +1037,17 @@
border-left: 2px solid var(--accent);
background: rgba(99,102,241,0.04);
}
+ .company-alignment-card .cal-self-research {
+ margin-top: 6px; padding: 6px 8px;
+ border-left: 2px solid #22c55e;
+ background: rgba(34,197,94,0.05);
+ }
+ .company-alignment-card .cal-self-research ul {
+ margin: 4px 0 4px 16px; padding: 0;
+ }
+ .company-alignment-card .cal-self-research li {
+ margin-bottom: 2px; color: var(--text-primary);
+ }
.company-alignment-card .cal-q-head {
font-weight: 600; color: var(--text-bright); margin-bottom: 4px;
}
diff --git a/media/sidebar.js b/media/sidebar.js
index 04f93fb..b69e5b6 100644
--- a/media/sidebar.js
+++ b/media/sidebar.js
@@ -416,10 +416,15 @@
if (s.lmStudioError) {
segs.push(`⚠ LM Studio 로드 실패`);
}
+ // 환경 전제 조건 경고 (Bridge·두뇌 볼륨·자격증명·확장 버전) — 전체 목록은 hover.
+ if (Array.isArray(s.healthWarnings) && s.healthWarnings.length > 0) {
+ segs.push(`⚠ 환경 ${s.healthWarnings.length}건`);
+ }
rbContent.innerHTML = segs.join('·');
if (rbDot) {
const on = s.engine && s.engine.online;
- rbDot.className = 'rb-dot ' + (on === true ? 'ok' : on === false ? 'bad' : 'warn');
+ const hasEnvWarn = Array.isArray(s.healthWarnings) && s.healthWarnings.length > 0;
+ rbDot.className = 'rb-dot ' + (on === false ? 'bad' : hasEnvWarn ? 'warn' : on === true ? 'ok' : 'warn');
}
}
@@ -1205,6 +1210,31 @@
summary.appendChild(dl('형식', c.format));
card.appendChild(summary);
+ // ── 자가 조사로 해결된 항목 — 묻기 전에 두뇌에서 스스로 찾은 답 ──
+ const SELF_RESEARCH_PREFIX = '(자가 조사로 두뇌에서 확인) ';
+ if (Array.isArray(c.answeredQuestions)) {
+ const selfResearched = c.answeredQuestions
+ .filter((qa) => qa && typeof qa.a === 'string' && qa.a.startsWith(SELF_RESEARCH_PREFIX))
+ .slice(0, 3);
+ if (selfResearched.length > 0) {
+ const srBlock = document.createElement('div');
+ srBlock.className = 'cal-self-research';
+ const srHead = document.createElement('div');
+ srHead.className = 'cal-q-head';
+ srHead.textContent = '🔎 스스로 확인한 정보 (두뇌 검색):';
+ srBlock.appendChild(srHead);
+ const srUl = document.createElement('ul');
+ for (const qa of selfResearched) {
+ const li = document.createElement('li');
+ const ans = qa.a.slice(SELF_RESEARCH_PREFIX.length);
+ li.textContent = `${qa.q} → ${ans.length > 150 ? ans.slice(0, 150) + '…' : ans}`;
+ srUl.appendChild(li);
+ }
+ srBlock.appendChild(srUl);
+ card.appendChild(srBlock);
+ }
+ }
+
// ── 미해결 질문 ──
if (Array.isArray(c.openQuestions) && c.openQuestions.length > 0 && v.kind === 'questions') {
const qBlock = document.createElement('div');
diff --git a/package.json b/package.json
index 13d406d..5938d79 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "astra",
"displayName": "Astra",
"description": "The personal intelligence layer for Antigravity and VS Code. A private cognitive partner for deep project context, memory, and proactive strategic decision-making.",
- "version": "2.2.231",
+ "version": "2.2.247",
"publisher": "g1nation",
"license": "MIT",
"icon": "assets/icon.png",
@@ -926,8 +926,8 @@
"plain",
"markdown"
],
- "default": "plain",
- "markdownDescription": "최종 답변 표시 방식.\n\n- `plain` (기본): 모델이 무심코 내보낸 마크다운 마커(`##`, `**`, `__`, `> `, `* ` 등)를 후처리로 모두 제거. 섹션 라벨 텍스트(예: `핵심 요약`)는 유지되지만 헤더 마커는 사라져 깔끔한 plain text 로 보임. 작은 로컬 모델이 학습된 습관으로 `## 다음 한 수` 같은 마커를 흘리는 문제 차단.\n- `markdown`: legacy 동작. 모델 출력을 그대로 렌더러에 넘김."
+ "default": "markdown",
+ "markdownDescription": "최종 답변 표시 방식.\n\n- `markdown` (기본): 모델 출력을 그대로 렌더러에 넘김 — 채팅 UI 가 마크다운을 렌더하므로 `##` 제목이 크게, `**` 강조가 굵게 표시되어 가독성이 좋음.\n- `plain`: 마크다운 마커(`##`, `**`, `__`, `> `, `* ` 등)를 후처리로 모두 제거. 제목/본문이 같은 크기의 평문이 됨 — 답변을 평문으로 복사해 쓰는 워크플로 전용. (작은 로컬 모델의 마커 누수 차단 용도였으나 채팅 가독성을 해쳐 기본에서 제외)"
},
"g1nation.chronicleAutoRecord": {
"type": "boolean",
@@ -966,6 +966,21 @@
"default": 3,
"description": "Maximum back-and-forth rounds the Intent Alignment analyzer is allowed to ask before forcing a 'confirm or cancel' card (it stops asking new questions and shows the current contract for user approval). Each round = one LLM call. Default 3."
},
+ "g1nation.web.autoFetchUrls": {
+ "type": "boolean",
+ "default": true,
+ "description": "URL 자동 수집 — 메시지에 http(s) 링크가 있으면 답변 생성 전에 페이지 본문을 가져와 모델에게 전달합니다 (일반 챗·기업 모드·Intent Alignment 공통). Datacollect Bridge가 켜져 있으면 고품질 추출을 우선 사용하고, 꺼져 있으면 확장이 직접 페이지를 가져옵니다. 끄면 모델이 링크 내용을 알 수 없습니다."
+ },
+ "g1nation.company.alignmentSelfResearch": {
+ "type": "boolean",
+ "default": true,
+ "description": "Alignment 자가 조사 — 분석기가 만든 질문을 사용자에게 보여주기 전에 두뇌(지식 폴더)를 먼저 검색해 스스로 답할 수 있는 질문을 걸러냅니다. 두뇌에서 답을 찾은 항목은 '(자가 조사로 두뇌에서 확인)' 표시와 함께 contract에 반영되고, 정말 모르는 질문만 카드에 노출됩니다. 질문이 있을 때만 LLM 1회가 추가됩니다."
+ },
+ "g1nation.company.alignmentKnowledgeSave": {
+ "type": "boolean",
+ "default": true,
+ "description": "Alignment 학습 루프 — 사용자가 alignment 라운드에서 직접 답해준 Q/A를 두뇌의 'Alignment Knowledge' 폴더에 노트로 저장합니다. 다음 turn의 자가 조사가 이 노트를 발견해 같은 질문을 두 번 묻지 않게 됩니다. 20자 미만의 짧은 답과 자가 조사 항목은 저장하지 않습니다."
+ },
"g1nation.selfReflector.enabled": {
"type": "boolean",
"default": false,
diff --git a/src/agent.ts b/src/agent.ts
index 2d3f2ea..dd748c1 100644
--- a/src/agent.ts
+++ b/src/agent.ts
@@ -20,8 +20,10 @@ import { SessionManager } from './core/session';
import { AgentWorkflowManager } from './agents/AgentWorkflowManager';
import { buildAstraModeArchitectureContext } from './lib/contextBuilders/astraModeArchitecture';
import { isScheduleRequest, buildScheduleContext } from './lib/contextBuilders/scheduleContext';
-import { isSelfAssessRequest, buildSelfAssessContext } from './lib/contextBuilders/selfAssessContext';
-import { extractUrlFromPrompt, buildUrlContext } from './lib/contextBuilders/urlContext';
+import { isSelfAssessRequest, isAboutSelf, buildSelfAssessContext } from './lib/contextBuilders/selfAssessContext';
+import { ensureFeatureInventory } from './extension/featureInventory';
+import { buildUrlContext } from './lib/contextBuilders/urlContext';
+import { extractUrls } from './features/web/webFetch';
import { looksLikeCorrection, captureCorrection } from './intelligence/correctionLoop';
import { shouldUseMultiAgentWorkflow } from './lib/contextBuilders/multiAgentRouting';
import { buildThinkingPartnerResponseContract } from './lib/contextBuilders/thinkingPartnerContract';
@@ -35,6 +37,7 @@ import {
isExplicitSecondBrainRequest,
isSecondBrainInventoryRequest,
isNoBrainDataRefusal,
+ isAnalysisRequest,
} from './lib/contextBuilders/promptDetection';
import { stripAstraFormattingForAgentMode, computeModeSignature } from './lib/contextBuilders/systemPromptShaping';
import { sanitizeAssistantContent, isRestartedAnswer, parseRationale } from './lib/contextBuilders/outputSanitization';
@@ -154,6 +157,7 @@ import { applyFileCreateEditActions } from './agent/actions/fileCreateEdit';
import { applyFileDeleteReadActions } from './agent/actions/fileDeleteRead';
import { applyRunCommandActions } from './agent/actions/runCommand';
import { applyListFilesActions } from './agent/actions/listFiles';
+import { applyWebFetchActions } from './agent/actions/webFetch';
import { applyBrainOpsActions } from './agent/actions/brainOps';
import { applyCalendarActions } from './agent/actions/calendar';
import { applySheetsActions } from './agent/actions/sheets';
@@ -542,8 +546,14 @@ export class AgentExecutor {
// [자기 평가 정본 주입] 기능 개선/자기 평가 질의는 RAG 경쟁에 맡기지 않고
// 현행 기능 인벤토리를 결정론적으로 주입 — 모델이 검색 없이 기억으로 답해
// 이미 있는 기능을 신규 제안하던 구식화 버그(3회 재발)의 마지막 구멍 봉쇄.
- if (prompt && loopDepth === 0 && !isCasualConversation && activeBrain?.localBrainPath && isSelfAssessRequest(prompt)) {
+ if (prompt && loopDepth === 0 && !isCasualConversation && activeBrain?.localBrainPath
+ && (isSelfAssessRequest(prompt) || (isAnalysisRequest(prompt) && isAboutSelf(prompt)))) {
try {
+ // 인벤토리 lazy 재생성 — 활성화 시 1회 생성은 brain 볼륨이 늦게
+ // 마운트되면 조용히 건너뛰어 파일이 영영 없는 상태가 됐다 (그 결과
+ // "파일 없음" 안내만 주입돼 모델이 구현 여부를 알 수 없었음).
+ // 질의 시점에 한 번 더 보장. idempotent — 있으면 즉시 return.
+ await ensureFeatureInventory(this.context);
const selfAssessBlock = buildSelfAssessContext(activeBrain.localBrainPath);
contextBlock += `\n\n${selfAssessBlock}`;
// 성공 로그 필수 — "주입이 됐는데 모델이 무시" vs "주입 자체가 안 됨"을
@@ -554,11 +564,26 @@ export class AgentExecutor {
}
}
- // [URL 실데이터] 채팅 프롬프트에 URL 이 있으면 브리지로 본문을 추출해 주입.
+ // [근거 기반 분석 강제] 분석/검토/의견형 요청인데 모델이 코드를 읽지 않고
+ // "~로 보입니다" 추측으로 답하는 실패 모드 차단. 워크스페이스가 열려 있으면
+ // "주장 전에 read_file 로 실제 확인하라"는 지시를 주입 — 강제 주입 패턴의
+ // 5번째 적용 (일정→캘린더, 자기평가→인벤토리, 정정→캡처, URL→실데이터와 동일).
+ if (prompt && loopDepth === 0 && !isCasualConversation && isAnalysisRequest(prompt)
+ && vscode.workspace.workspaceFolders?.length) {
+ contextBlock += `\n\n[근거 기반 분석 규칙 — 이 요청은 분석/검토형]
+- 이 워크스페이스의 코드·문서·기능에 대한 주장은 *이 대화에서 실제로 읽은 파일*에만 근거하라.
+- 확인하지 않은 구현을 "~로 보입니다", "~일 것입니다"라고 추측 서술하는 것은 금지. 먼저 와 태그로 관련 파일을 직접 열어 확인한 뒤 답하라. 태그를 emit 하면 시스템이 파일 내용을 주입하고 자동으로 이어서 답변하게 된다.
+- ⚠️ "소스 코드 확인이 필요합니다"라고 말만 하고 끝내는 것은 금지다. 확인이 필요하다고 판단했다면 *바로 이 답변 안에서* / 태그를 emit 하라 — 그것이 확인하는 방법이다. 태그로 접근 불가능한 대상(외부 시스템·미설치 도구 등)에 한해서만 "확인하지 못함"으로 명시하라.
+- "X 기능을 추가하라"고 제안하기 전에 그 기능이 이미 구현돼 있는지 해당 모듈을 찾아 읽어라. 이미 있는 기능을 새로 만들라고 제안하는 것은 잘못된 분석이다.
+- 일반론·추측으로 빈칸을 채우지 마라.`;
+ }
+
+ // [URL 실데이터] 채팅 프롬프트에 URL 이 있으면 본문을 추출해 주입.
// /wikify 만 URL 접근이 가능하고 일반 채팅은 "접근 불가"라고 답하던 공백 수정.
- if (prompt && loopDepth === 0 && !isCasualConversation) {
- const url = extractUrlFromPrompt(prompt);
- if (url) {
+ // v2: Bridge 추출 → 직접 fetch 폴백 (urlContext 내부) + 최대 2개 URL + config 게이트.
+ if (prompt && loopDepth === 0 && !isCasualConversation && getConfig().webAutoFetchEnabled !== false) {
+ const urls = extractUrls(prompt, 2);
+ for (const url of urls) {
try {
contextBlock += `\n\n${await buildUrlContext(url)}`;
logInfo('URL 컨텍스트 주입 시도.', { url });
@@ -720,6 +745,7 @@ export class AgentExecutor {
negativeCtx,
actualModel,
contextLength: config.contextLength,
+ dynamicBlocks: this._turnCtx.dynamicBlocks,
})
: buildAstraModeSystemPrompt({
prompt,
@@ -1586,6 +1612,7 @@ export class AgentExecutor {
await applyFileDeleteReadActions(ctx);
await applyRunCommandActions(ctx);
await applyListFilesActions(ctx);
+ await applyWebFetchActions(ctx);
await applyBrainOpsActions(ctx);
await applyCalendarActions(ctx);
await applySheetsActions(ctx);
diff --git a/src/agent/actions/webFetch.ts b/src/agent/actions/webFetch.ts
new file mode 100644
index 0000000..982a432
--- /dev/null
+++ b/src/agent/actions/webFetch.ts
@@ -0,0 +1,43 @@
+import { HandlerContext } from './types';
+import { buildUrlContext } from '../../lib/contextBuilders/urlContext';
+
+/**
+ * Action 15: Fetch URL (read-only — transaction record 불필요)
+ *
+ * LLM 이 작업 중 웹 페이지의 실제 내용이 필요할 때 emit 하는 태그.
+ * 결과 블록을 chatHistory 에 internal push — read_file 과 동일 패턴이라
+ * 일반 챗의 continuation loop(컨텍스트 주입 → 자동 재호출)가 그대로 작동해
+ * fetch 직후 모델이 내용을 분석한다.
+ *
+ * buildUrlContext 재사용: Bridge 추출 우선 → 직접 fetch 폴백 → 정직 실패
+ * 블록 + 5분 캐시. 실패 블록도 chatHistory 에 push 한다 — 모델이 "가져왔다"고
+ * 지어내지 않고 실패 사실을 사용자에게 전달해야 하므로.
+ */
+const FETCH_URL_MAX_PER_TURN = 2;
+
+export async function applyWebFetchActions(ctx: HandlerContext): Promise {
+ const { aiMessage, report } = ctx;
+ const fetchRegex = /\s]+)['"]?\s*\/?>(?:<\/fetch_url>)?/gi;
+ let match;
+ let handled = 0;
+ const seen = new Set();
+ while ((match = fetchRegex.exec(aiMessage)) !== null) {
+ if (handled >= FETCH_URL_MAX_PER_TURN) {
+ report.push(`⚠️ fetch_url 한도 초과 — 회당 최대 ${FETCH_URL_MAX_PER_TURN}개만 처리합니다.`);
+ break;
+ }
+ const url = match[1].trim();
+ if (seen.has(url)) continue;
+ seen.add(url);
+ handled++;
+ try {
+ const block = await buildUrlContext(url);
+ const ok = block.includes('실데이터');
+ report.push(ok ? `🌐 Fetched: ${url}` : `⚠️ Fetch failed: ${url}`);
+ ctx.chatHistory.push({ role: 'system', content: block, internal: true });
+ } catch (err: any) {
+ // buildUrlContext 는 throw 하지 않지만 방어적으로.
+ report.push(`⚠️ Fetch error: ${url} — ${String(err?.message ?? err).slice(0, 100)}`);
+ }
+ }
+}
diff --git a/src/agent/handlePrompt/buildAgentModeSystemPrompt.ts b/src/agent/handlePrompt/buildAgentModeSystemPrompt.ts
index 2399d7e..31c8e5a 100644
--- a/src/agent/handlePrompt/buildAgentModeSystemPrompt.ts
+++ b/src/agent/handlePrompt/buildAgentModeSystemPrompt.ts
@@ -22,6 +22,11 @@ export interface BuildAgentModeSystemPromptInput {
actualModel: string;
/** For token-cost logging — getConfig().contextLength. */
contextLength: number;
+ /**
+ * 행동 제약·동적 블록 (behavior-constraints / cove-checklist 등) — Astra 모드와
+ * 동일하게 [CONTEXT] *밖* 보호 구역에 join. 없으면 옛 동작 그대로.
+ */
+ dynamicBlocks?: Map;
}
export function buildAgentModeSystemPrompt(input: BuildAgentModeSystemPromptInput): string {
@@ -38,6 +43,7 @@ export function buildAgentModeSystemPrompt(input: BuildAgentModeSystemPromptInpu
negativeCtx,
actualModel,
contextLength,
+ dynamicBlocks,
} = input;
// The Agent's prompt IS the primary directive (role / persona / tone / output format),
@@ -69,10 +75,20 @@ export function buildAgentModeSystemPrompt(input: BuildAgentModeSystemPromptInpu
// [CONTEXT] … [/CONTEXT] 사이만 컨텍스트 초과 시 trim 대상 — agentBlock(앞)·reminder(뒤)·negative 는 보호.
// memoryCtx(RAG/메모리/lessons)도 [CONTEXT] 안에 넣어 토큰이 빡빡할 때 대화 기록보다 먼저 잘리게 한다.
+ // 순서 = 잘림 우선순위 (truncation 은 body *뒤*부터 자름): contextBlock(사용자가
+ // 지금 가리킨 실데이터 — URL 본문/열린 파일/일정)을 맨 앞에 둬 최후까지 보존하고,
+ // 배경 지식(brain RAG)과 memory 는 그보다 먼저 잘리게 한다.
const priorConclusionBlock = priorConclusionCtx ? '\n\n' + priorConclusionCtx : '';
// [자기 지식 + 1인칭] Astra 모드와 공용 — Agent 모드에서도 자기 오보고/3인칭 화법 방지.
const selfIdentityBlock = '\n\n' + buildSelfIdentityBlock();
- const fullSystemPrompt = `${agentBlock}${modeBridgeCtx ? '\n\n' + modeBridgeCtx : ''}${priorConclusionBlock}\n\n${strippedSystemPrompt}${selfIdentityBlock}${designerCtx}${secondBrainTraceCtx}\n\n[CONTEXT]\n${memoryCtx}\n${knowledgeContextForPrompt}\n${contextBlock}\n[/CONTEXT]\n${negativeCtx}${agentTailReminder}`;
+ // 동적 블록 (행동 제약·CoVe 등) — [CONTEXT] 밖에 join 해 truncation 보호.
+ let dynamicBlocksJoined = '';
+ if (dynamicBlocks && dynamicBlocks.size > 0) {
+ for (const body of dynamicBlocks.values()) {
+ if (body && body.trim()) dynamicBlocksJoined += '\n\n' + body;
+ }
+ }
+ const fullSystemPrompt = `${agentBlock}${modeBridgeCtx ? '\n\n' + modeBridgeCtx : ''}${priorConclusionBlock}\n\n${strippedSystemPrompt}${selfIdentityBlock}${designerCtx}${secondBrainTraceCtx}${dynamicBlocksJoined}\n\n[CONTEXT]\n${contextBlock}\n${knowledgeContextForPrompt}\n${memoryCtx}\n[/CONTEXT]\n${negativeCtx}${agentTailReminder}`;
return fullSystemPrompt;
}
diff --git a/src/agent/handlePrompt/buildAstraModeSystemPrompt.ts b/src/agent/handlePrompt/buildAstraModeSystemPrompt.ts
index b6dbb4c..2549f5d 100644
--- a/src/agent/handlePrompt/buildAstraModeSystemPrompt.ts
+++ b/src/agent/handlePrompt/buildAstraModeSystemPrompt.ts
@@ -101,5 +101,8 @@ export function buildAstraModeSystemPrompt(input: BuildAstraModeSystemPromptInpu
if (body && body.trim()) dynamicBlocksJoined += '\n\n' + body;
}
}
- return `${systemPrompt}${modeBridgeCtx ? '\n\n' + modeBridgeCtx : ''}${priorConclusionBlock}${designerCtx}${projectArchitectureCtx}${localProjectKnowledgeCtx}${thinkingPartnerCtx}${astraStanceCtx}${secondBrainTraceCtx}${v4PolicyCtx}${selfGrowthIdentityCtx}${knowledgeMixCtx}${casualCtx}${dynamicBlocksJoined}\n\n[CONTEXT]\n${memoryCtx}\n${knowledgeContextForPrompt}\n${contextBlock}\n[/CONTEXT]\n${negativeCtx}`;
+ // [CONTEXT] 내부 순서 = 잘림 우선순위 (truncation 은 body *뒤*부터 자름):
+ // contextBlock(사용자가 지금 가리킨 실데이터 — URL 본문/열린 파일/일정)을 맨 앞에
+ // 둬 최후까지 보존, 배경 지식(brain RAG)과 memory 는 그보다 먼저 잘리게 한다.
+ return `${systemPrompt}${modeBridgeCtx ? '\n\n' + modeBridgeCtx : ''}${priorConclusionBlock}${designerCtx}${projectArchitectureCtx}${localProjectKnowledgeCtx}${thinkingPartnerCtx}${astraStanceCtx}${secondBrainTraceCtx}${v4PolicyCtx}${selfGrowthIdentityCtx}${knowledgeMixCtx}${casualCtx}${dynamicBlocksJoined}\n\n[CONTEXT]\n${contextBlock}\n${knowledgeContextForPrompt}\n${memoryCtx}\n[/CONTEXT]\n${negativeCtx}`;
}
diff --git a/src/agent/postAnswerHooks/index.ts b/src/agent/postAnswerHooks/index.ts
index 7f52704..c206d62 100644
--- a/src/agent/postAnswerHooks/index.ts
+++ b/src/agent/postAnswerHooks/index.ts
@@ -24,6 +24,8 @@ import { appendReflection } from '../../intelligence/reflectionStore';
import { detectGaps } from '../../intelligence/gapDetector';
import { appendSuccessPattern } from '../../intelligence/skillScore';
import { getConfig } from '../../config';
+import { detectReimplementedProposals, formatReimplementationFooter } from '../../extension/featureConceptMap';
+import { isSelfAssessRequest, isAboutSelf } from '../../lib/contextBuilders/selfAssessContext';
const devilRebuttalHook: PostAnswerHook = {
id: 'devil-rebuttal',
@@ -226,6 +228,28 @@ const criticLoopHook: PostAnswerHook = {
},
};
+/**
+ * 인벤토리 자동 대조 — 자기 평가/자기 분석 턴에서 답변이 *이미 구현된 기능*을
+ * 신규 도입하라고 제안하면 결정론적으로(LLM 콜 0) 정정 푸터를 붙인다.
+ *
+ * 배경: 인벤토리를 프롬프트에 주입해도 작은 로컬 모델이 mid-prompt 컨텍스트를
+ * 무시하고 "Reflection Layer 도입하라"(이미 Self-Reflector 3단계 구현) 같은
+ * 제안을 반복하는 실패가 재현됐다. 주입은 1차 방어선 — 이 훅이 최종 방어선.
+ */
+const inventoryCrossCheckHook: PostAnswerHook = {
+ id: 'inventory-cross-check',
+ runAsync: false,
+ run(ctx: PostAnswerHookContext): void {
+ if (!ctx.assistantAnswer || !ctx.assistantAnswer.trim()) return;
+ // 자기 대상 턴에만 — 일반 코딩/리서치 답변에 오탐 푸터를 붙이지 않게.
+ if (!(isSelfAssessRequest(ctx.userPrompt) || isAboutSelf(ctx.userPrompt))) return;
+ const hits = detectReimplementedProposals(ctx.assistantAnswer);
+ if (hits.length === 0) return;
+ const footer = formatReimplementationFooter(hits);
+ if (footer) ctx.getWebview()?.postMessage({ type: 'streamChunk', value: footer });
+ },
+};
+
export const POST_ANSWER_HOOKS: PostAnswerHook[] = [
devilRebuttalHook,
postHocSelfCheckHook,
@@ -233,6 +257,7 @@ export const POST_ANSWER_HOOKS: PostAnswerHook[] = [
requirementCoverageHook,
confidenceEscalationHook,
criticLoopHook,
+ inventoryCrossCheckHook,
];
/** 모든 hook 을 안전하게 실행 — 한 hook 의 throw 가 다른 hook 막지 않음. */
diff --git a/src/config.ts b/src/config.ts
index 7f68dc7..102e179 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -269,6 +269,23 @@ export interface IAgentConfig {
companyIntentAlignmentMode: 'off' | 'smart' | 'strict';
/** alignment 라운드 최대 횟수 (질문→답변 사이클). 1~5. */
companyIntentAlignmentMaxRounds: number;
+ /**
+ * URL 자동 수집 — 사용자 프롬프트에 http(s) URL 이 있으면 LLM 호출 전에
+ * 본문을 가져와 컨텍스트로 주입 (일반 챗 + 기업 모드 + alignment 공통 게이트).
+ * Bridge 추출 우선, 실패 시 직접 fetch 폴백.
+ */
+ webAutoFetchEnabled: boolean;
+ /**
+ * Alignment 자가 조사 — openQuestions 를 사용자에게 보여주기 전에 두뇌를
+ * 검색해 스스로 답할 수 있는 질문을 걸러낸다. 끄면 기존 동작 (질문 즉시 노출).
+ */
+ companyAlignmentSelfResearch: boolean;
+ /**
+ * Alignment 학습 루프 — 사용자가 alignment 라운드에서 직접 답한 Q/A 를
+ * 두뇌의 "Alignment Knowledge" 폴더에 노트로 저장. 다음 turn 의 자가 조사가
+ * 이 노트를 발견해 같은 질문을 두 번 묻지 않게 된다.
+ */
+ companyAlignmentKnowledgeSave: boolean;
/**
* Pixel Office 시각화 패널을 사이드바에 표시할지 여부. UI layer 전용 —
* 끈다고 Agent 행동이 바뀌지 않는다. Off면 webview는 패널을 숨기고
@@ -538,6 +555,9 @@ export function getConfig(): IAgentConfig {
// 이유는 config 가 features/ 아래 모듈을 의존하면 의도치 않은 순환 import 가 생기기 때문.
// 둘이 어긋나면 안 되므로 변경 시 양쪽 같이 갱신.
companyIntentAlignmentMaxRounds: Math.max(1, Math.min(5, cfg.get('company.intentAlignmentMaxRounds', 3))),
+ webAutoFetchEnabled: cfg.get('web.autoFetchUrls', true),
+ companyAlignmentSelfResearch: cfg.get('company.alignmentSelfResearch', true),
+ companyAlignmentKnowledgeSave: cfg.get('company.alignmentKnowledgeSave', true),
selfReflectorEnabled: cfg.get('selfReflector.enabled', false),
hollowCheckEnabled: cfg.get('hollowCheck.enabled', true),
hollowCheckAutoRetry: cfg.get('hollowCheck.autoRetry', true),
@@ -557,8 +577,12 @@ export function getConfig(): IAgentConfig {
polishPersonaOverride: (cfg.get('polishPersonaOverride', '') || '').trim(),
liveStreamTokens: cfg.get('liveStreamTokens', true),
outputFormat: ((): 'plain' | 'markdown' => {
- const v = (cfg.get('outputFormat', 'plain') || 'plain').trim().toLowerCase();
- return v === 'markdown' ? 'markdown' : 'plain';
+ // 기본 'markdown' — 채팅 webview 가 marked 로 렌더하므로 plain 이 기본이면
+ // 최종본(streamReplace)에서 ## 헤더가 제거되어 제목/본문이 같은 크기로
+ // 보이는 가독성 문제가 생긴다 (스트리밍 중에는 raw 가 그대로 렌더되어
+ // 멀쩡하다가 완료 순간 평문으로 변하는 증상).
+ const v = (cfg.get('outputFormat', 'markdown') || 'markdown').trim().toLowerCase();
+ return v === 'plain' ? 'plain' : 'markdown';
})(),
chronicleAutoRecord: cfg.get('chronicleAutoRecord', true),
lmStudioTopP: Math.max(0, Math.min(1, cfg.get('lmStudio.sampling.topP', 0.9))),
diff --git a/src/core/health.ts b/src/core/health.ts
index ca8e507..741c5fc 100644
--- a/src/core/health.ts
+++ b/src/core/health.ts
@@ -1,16 +1,33 @@
import * as vscode from 'vscode';
import * as fs from 'fs';
+import * as os from 'os';
+import * as path from 'path';
+import { execSync } from 'child_process';
import { getConfig } from '../config';
-import { logInfo, logWarn, logError } from '../utils';
+import { logInfo, logWarn, logError, getActiveBrainProfile } from '../utils';
+import { getBridgeBaseUrl } from '../features/datacollect/bridgeClient';
/**
- * HealthCheckMonitor: Periodically monitors the environment
+ * HealthCheckMonitor: Periodically monitors the environment
* (Ollama, Disk, API) to ensure the agent stays functional.
- *
+ *
+ * v2.2.245: 머신 로컬 전제 조건 4종 추가 — Bridge 응답·두뇌 볼륨 마운트·
+ * git push 자격증명·Antigravity 확장 버전 정합. 한 세션에서 이 4가지가 전부
+ * 사고로 터진 적이 있는데 (URL 분석 실패 / 인벤토리 미생성 / 동기화 실패 /
+ * 구버전 실행), 전부 사후 디버깅으로만 발견됐다. 이제 readyBar ⚠️ 로 사전 가시화.
+ *
* Properly tracks the interval timer for cleanup on deactivation.
*/
export class HealthCheckMonitor {
private static intervalHandle: ReturnType | null = null;
+ /** 마지막 검사 결과 — readyBar payload 가 읽어간다 (재검사 비용 없이). */
+ private static _lastReports: string[] = [];
+ /** 직전 토스트 내용 — 같은 경고를 10분마다 반복 토스트하지 않기 위한 dedupe. */
+ private static _lastToastKey = '';
+
+ public static get lastReports(): string[] {
+ return this._lastReports.slice();
+ }
public static async runAllChecks(): Promise<{ ok: boolean; reports: string[] }> {
const reports: string[] = [];
@@ -46,9 +63,80 @@ export class HealthCheckMonitor {
reports.push('Write permissions denied in the current workspace.');
}
+ // 4. Datacollect Bridge 응답 — 어떤 HTTP 응답이든(404 포함) 살아 있는 것.
+ // 네트워크 오류만 다운으로 판정. Bridge 다운이어도 URL 분석은 직접
+ // fetch 폴백으로 동작하므로 경고는 영향 범위를 정확히 알린다.
+ try {
+ const bridgeUrl = getBridgeBaseUrl();
+ if (bridgeUrl) {
+ try {
+ await fetch(bridgeUrl, { signal: AbortSignal.timeout(3000) });
+ } catch {
+ reports.push(`Datacollect Bridge(${bridgeUrl})가 응답하지 않습니다 — /wikify·/benchmark 와 고품질 URL 추출이 비활성 (URL 분석 자체는 직접 fetch 폴백으로 동작).`);
+ }
+ }
+ } catch { /* config 읽기 실패 등 — 검사 자체를 조용히 skip */ }
+
+ // 5. 두뇌 볼륨/경로 — 외장 볼륨이 늦게 마운트되면 검색·레슨·인벤토리가
+ // 조용히 비활성화되던 사고의 사전 감지.
+ let brain: ReturnType | undefined;
+ try {
+ brain = getActiveBrainProfile();
+ if (brain?.localBrainPath && !fs.existsSync(brain.localBrainPath)) {
+ reports.push(`두뇌 폴더가 없습니다 (외장 볼륨 미마운트?): ${brain.localBrainPath} — 검색·레슨·인벤토리가 비활성화됩니다.`);
+ }
+ } catch { /* profile 읽기 실패 — skip */ }
+
+ // 6. git push 자격증명 — 원격 동기화를 *설정한* 두뇌만 검사 (secondBrainRepo
+ // 비어 있으면 두뇌 동기화가 로컬 새로고침 모드라 자격증명 불필요).
+ try {
+ if (brain?.secondBrainRepo?.trim() && brain.localBrainPath && fs.existsSync(brain.localBrainPath)) {
+ try {
+ execSync('git push --dry-run', {
+ cwd: brain.localBrainPath,
+ env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
+ timeout: 5000,
+ stdio: ['ignore', 'pipe', 'pipe'],
+ });
+ } catch (e: any) {
+ const msg = String(e?.stderr || e?.message || '');
+ if (/could not read Username|Authentication failed|terminal prompts disabled/i.test(msg)) {
+ reports.push(`두뇌 원격 push 자격증명이 없습니다 — 터미널에서 "cd ${brain.localBrainPath} && git push" 1회 실행으로 키체인에 저장하세요.`);
+ }
+ // 그 외(오프라인·upstream 없음 등)는 소음 방지 — 보고하지 않음.
+ }
+ }
+ } catch { /* skip */ }
+
+ // 7. Antigravity 확장 버전 정합 — VS Code 와 Antigravity 양쪽에 설치된
+ // 경우 버전이 갈리면 "고쳤는데 안 고쳐짐" 혼란의 단골 원인 (실사례:
+ // 2.2.19 vs 2.2.232 공존). Antigravity 미사용 머신에서는 자동 skip.
+ try {
+ const agExtRegistry = path.join(os.homedir(), '.antigravity', 'extensions', 'extensions.json');
+ if (fs.existsSync(agExtRegistry)) {
+ const arr = JSON.parse(fs.readFileSync(agExtRegistry, 'utf8'));
+ const mine = Array.isArray(arr)
+ ? arr.find((e: any) => e?.identifier?.id === 'g1nation.astra')
+ : null;
+ const myVersion = vscode.extensions.getExtension('g1nation.astra')?.packageJSON?.version;
+ if (mine?.version && myVersion && mine.version !== myVersion) {
+ reports.push(`Antigravity 에 다른 버전의 Astra(${mine.version})가 설치되어 있습니다 — 현재 실행 중 ${myVersion}. Antigravity 쪽은 수동 업데이트가 필요합니다.`);
+ }
+ }
+ } catch { /* registry 파싱 실패 — skip */ }
+
+ this._lastReports = reports;
+
if (reports.length > 0) {
logWarn(`Health Check Warnings: ${reports.join(' | ')}`);
- vscode.window.showWarningMessage(`Astra Health Warning: ${reports[0]}`);
+ // 동일 경고 반복 토스트 방지 — 내용이 바뀐 경우에만 1회 토스트.
+ const toastKey = reports.join('|');
+ if (toastKey !== this._lastToastKey) {
+ this._lastToastKey = toastKey;
+ vscode.window.showWarningMessage(`Astra Health Warning: ${reports[0]}${reports.length > 1 ? ` (외 ${reports.length - 1}건 — 준비 상태 바 참조)` : ''}`);
+ }
+ } else {
+ this._lastToastKey = '';
}
return {
diff --git a/src/extension/featureConceptMap.ts b/src/extension/featureConceptMap.ts
new file mode 100644
index 0000000..e5cc88e
--- /dev/null
+++ b/src/extension/featureConceptMap.ts
@@ -0,0 +1,136 @@
+/**
+ * 기능 개념 지도 — vscode 의존 없는 순수 모듈 (테스트 용이).
+ *
+ * 두 소비처:
+ * 1. featureInventory.ts — "ASTRA 기능 인벤토리" 마크다운 생성 (LLM 프롬프트 주입용)
+ * 2. postAnswerHooks inventory-cross-check — 답변이 *이미 구현된 기능*을 신규
+ * 제안하는지 결정론적으로 검사해 정정 푸터를 붙임
+ *
+ * 2번이 존재하는 이유: 인벤토리를 프롬프트에 주입해도 작은 로컬 모델은 mid-prompt
+ * 컨텍스트를 무시하고 일반론으로 "X를 도입하라"고 제안하는 실패가 반복 재현됐다.
+ * 프롬프트 주입은 1차 방어선일 뿐 — 모델이 무시해도 사용자에게 정정이 보이는
+ * 결정론적 안전망(LLM 콜 0)이 최종 방어선이다.
+ */
+
+export interface ConceptEntry {
+ /** 학술/일반 명칭 (마크다운 표기용). */
+ concept: string;
+ /** ASTRA 구현 내역 한 줄. */
+ impl: string;
+ /** 답변 본문에서 이 개념을 식별하는 키워드 (소문자 비교, 한·영). */
+ keywords: string[];
+}
+
+export const CONCEPT_ENTRIES: ConceptEntry[] = [
+ {
+ concept: 'CoVe / Chain-of-Verification / Self-Critique',
+ impl: '구현됨 — coveEnabled(답변 전 그라운딩 체크리스트) + critic-loop 훅(문제 신호 턴 LLM 검수) + citationTrace(출처 역추적)',
+ keywords: ['cove', 'chain-of-verification', 'self-critique', 'selfcritique', 'self-correction', '자기 검증', '자기검증', '자기 수정', '크리틱 에이전트', '비판적 사고 루프', '스스로 검토하는 단계'],
+ },
+ {
+ concept: '지식 노후 점검 자동화 / Automated Decay Audit',
+ impl: '구현됨 — 주간 성장 사이클이 매주 자동 실행 (decay-report.md) + "Astra: 지식 노후 점검" 수동 명령',
+ keywords: ['노후화', '노후 점검', 'decay', '지식 신선도'],
+ },
+ {
+ concept: '지식 충돌 감지/해결 / Conflict Resolver',
+ impl: '구현됨 — 검색 시점 [CONFLICT WARNING] + 일일 충돌 스캔 + 신뢰도(trust·confidence·최신성) 비교 우선 권고. 최종 결정만 사람',
+ keywords: ['충돌 감지', '충돌 해결', 'conflict resolver', '상충되는 정보 발견'],
+ },
+ {
+ concept: '피드백 태깅 / 오류 분류 / Feedback Tagging',
+ impl: '구현됨 — Correction Loop가 사용자 정정을 자동 분류(사실오류/근거누락/맥락누락/추론오류/지시불이행/형식오류)해 레슨+회귀 케이스로 저장',
+ keywords: ['피드백 태깅', '피드백 루프 자동화', '오류 분류', '교훈으로 자동', '자동으로 \'교훈\'', '교훈을 자동', 'feedback tagging'],
+ },
+ {
+ concept: '멀티스텝 플래닝 / Multi-Step Planning / CoT 강제',
+ impl: '구현됨 — multiAgentEnabled(Planner→Researcher→Writer, 기본 OFF) + 1인 기업 모드 디스패처',
+ keywords: ['멀티스텝 플래닝', 'multi-step planning', 'cot 강제', 'reasoning chain', '추론 체인', 'chain of thought', '생각 단계(thought)', '생각의 단계'],
+ },
+ {
+ concept: '골든셋 자동 평가 / Regression Test',
+ impl: '구현됨 — 주간 사이클 자동 평가 + 직전 대비 회귀 경보(regression-alert.md) + 정정 회귀 재검사',
+ keywords: ['골든셋', '회귀 테스트', 'regression test'],
+ },
+ {
+ concept: 'Sleep-time / 유휴 시간 학습',
+ impl: '구현됨 — 일일 지식 사전 소화 (Digests/)',
+ keywords: ['sleep-time', '유휴 시간 학습', '유휴시간 학습'],
+ },
+ {
+ concept: '확신도 게이팅 / 환각 방지 표명',
+ impl: '구현됨 — [GROUNDING] 강함/보통/약함 + 약함 시 표명 강제 + 학습큐 자동 등록',
+ keywords: ['확신도 게이팅', '환각 방지', '확신 편향'],
+ },
+ {
+ concept: 'Reflection Layer / 자기 성찰 / 메타 학습 루프 / Self-Reflection',
+ impl: '구현됨 — Self-Reflector Phase A(답변 자가 점검 블록, opt-in) + Phase B(외부 검증 LLM + 자동 재시도) + Phase C(생성 파일 syntax 검증) + Hollow Code Check(빈 깡통 감지 + 자동 재작업) + 약점 프로필→자기검토 블록(최근 정정 통계가 다음 턴 행동을 직접 변경)',
+ keywords: ['reflection layer', 'self-reflection', '자기 성찰', '성찰 계층', '성찰 단계', '성찰(reflection)', '메타 학습'],
+ },
+ {
+ concept: '질문 전 자가 조사 / Self-Research / 경험 기반 제약 주입',
+ impl: '구현됨 — Intent Alignment 자가 조사(질문을 사용자에게 노출하기 전 두뇌 검색으로 선해결) + 사용자 답변 두뇌 자동 저장(Alignment Knowledge 학습 루프) + 레슨 체크리스트 truncation 보호 구역 주입',
+ keywords: ['자가 조사', 'self-research', '경험 기반 제약'],
+ },
+];
+
+/**
+ * 신규 도입/추가/구축을 제안하는 문장인지 (또는 부재를 단정하는 문장).
+ * '합' 포함 — "추가합니다/구축합니다" 활용형 미매치 갭 (회귀 테스트로 발견).
+ * '강화' 동사 + "도입:" 명사형(소제목 스타일) 추가 — 12B 답변의
+ * "Reasoning Chain 도입: ..." 패턴 미매치 갭 (회귀 테스트로 발견).
+ */
+const PROPOSAL_RE = /(도입|추가|구축|신설|개발|보강|강화|만들)(하|해|할|합|을|를)|(도입|추가|구축|신설)\s*[::]|필요합니다|제안합니다|추천합니다|부족합니다|부재|없습니다|미흡/;
+/** 같은 문장에서 이미 구현 사실을 인지하고 있으면 정정 불필요. */
+const ACKNOWLEDGED_RE = /(이미|기)\s*(구현|존재|있)|구현돼|구현되어|작동\s*중/;
+
+export interface ReimplementationHit {
+ concept: string;
+ impl: string;
+ /** 감지된 문장 (검증/디버그용, 120자 cap). */
+ sentence: string;
+}
+
+/**
+ * 답변이 이미 구현된 기능을 "도입하라/없다"고 제안·단정하는 문장을 결정론적으로
+ * 감지. LLM 콜 0 — 문장 단위 키워드 + 제안 동사 공기(co-occurrence) 검사.
+ * 보수적 설계: 같은 문장에 "이미 구현/존재" 인지가 있으면 제외 (정정 노이즈 방지).
+ */
+export function detectReimplementedProposals(answer: string): ReimplementationHit[] {
+ if (!answer || !answer.trim()) return [];
+ // 문장 분리 — 마침표/줄바꿈/콜론 기준의 느슨한 분할이면 충분.
+ const sentences = answer.split(/(?<=[.!?다요음됨])\s+|\n+/);
+ const hits: ReimplementationHit[] = [];
+ const seen = new Set();
+ for (const sentence of sentences) {
+ const lower = sentence.toLowerCase();
+ if (!PROPOSAL_RE.test(sentence)) continue;
+ if (ACKNOWLEDGED_RE.test(sentence)) continue;
+ for (const entry of CONCEPT_ENTRIES) {
+ if (seen.has(entry.concept)) continue;
+ if (entry.keywords.some((k) => lower.includes(k.toLowerCase()))) {
+ seen.add(entry.concept);
+ hits.push({
+ concept: entry.concept,
+ impl: entry.impl,
+ sentence: sentence.trim().slice(0, 120),
+ });
+ }
+ }
+ }
+ return hits;
+}
+
+/** 정정 푸터 마크다운 — 빈 hits 면 ''. */
+export function formatReimplementationFooter(hits: ReimplementationHit[]): string {
+ if (hits.length === 0) return '';
+ const lines: string[] = [];
+ lines.push('\n\n---');
+ lines.push('⚠️ **기능 인벤토리 자동 대조** (결정론적 검사 — LLM 아님): 위 답변이 신규 도입을 제안한 항목 중 다음은 **이미 구현되어 있습니다**.');
+ for (const h of hits) {
+ lines.push(`- **${h.concept}** → ${h.impl}`);
+ }
+ lines.push('');
+ lines.push('_위 제안을 채택하기 전에 기존 구현을 먼저 확인하세요. (두뇌의 "ASTRA 기능 인벤토리.md" 참조)_');
+ return lines.join('\n');
+}
diff --git a/src/extension/featureInventory.ts b/src/extension/featureInventory.ts
index a156809..42ff1aa 100644
--- a/src/extension/featureInventory.ts
+++ b/src/extension/featureInventory.ts
@@ -32,20 +32,14 @@ const HOOK_DESCRIPTIONS: Record = {
};
/**
- * 학술/일반 개념 명칭 ↔ ASTRA 구현 매핑. 자기 개선 제안에서 모델이 학술 명칭
- * ("CoVe 도입하라")으로 제안할 때 설정 키(coveEnabled)와 같은 것임을 모르는
- * 이름 매핑 갭을 막는다. 코드와 함께 배포되므로 릴리스마다 자동 최신화.
+ * 학술/일반 개념 명칭 ↔ ASTRA 구현 매핑 — featureConceptMap.ts 로 이전 (순수
+ * 모듈). 인벤토리 마크다운과 inventory-cross-check 훅(결정론적 재구현 제안
+ * 감지)이 같은 정본을 공유한다.
*/
-const CONCEPT_MAP: Array<[concept: string, impl: string]> = [
- ['CoVe / Chain-of-Verification / Self-Critique', '구현됨 — coveEnabled(답변 전 그라운딩 체크리스트) + critic-loop 훅(문제 신호 턴 LLM 검수) + citationTrace(출처 역추적)'],
- ['지식 노후 점검 자동화 / Automated Decay Audit', '구현됨 — 주간 성장 사이클이 매주 자동 실행 (decay-report.md)'],
- ['지식 충돌 감지/해결 / Conflict Resolver', '구현됨 — 검색 시점 [CONFLICT WARNING] + 일일 충돌 스캔 + 신뢰도(trust·confidence·최신성) 비교 우선 권고. 최종 결정만 사람'],
- ['피드백 태깅 / 오류 분류 / Feedback Tagging', '구현됨 — Correction Loop가 사용자 정정을 자동 분류(사실오류/근거누락/맥락누락/추론오류/지시불이행/형식오류)해 레슨+회귀 케이스로 저장'],
- ['멀티스텝 플래닝 / Multi-Step Planning / CoT 강제', '구현됨 — multiAgentEnabled(Planner→Researcher→Writer, 기본 OFF) + 1인 기업 모드 디스패처'],
- ['골든셋 자동 평가 / Regression Test', '구현됨 — 주간 사이클 자동 평가 + 직전 대비 회귀 경보(regression-alert.md) + 정정 회귀 재검사'],
- ['Sleep-time / 유휴 시간 학습', '구현됨 — 일일 지식 사전 소화 (Digests/)'],
- ['확신도 게이팅 / 환각 방지 표명', '구현됨 — [GROUNDING] 강함/보통/약함 + 약함 시 표명 강제 + 학습큐 자동 등록'],
-];
+import { CONCEPT_ENTRIES } from './featureConceptMap';
+
+const CONCEPT_MAP: Array<[concept: string, impl: string]> =
+ CONCEPT_ENTRIES.map((e) => [e.concept, e.impl]);
function stripMd(s: string): string {
return (s || '').replace(/\*\*|`|\[|\]/g, '').replace(/\s+/g, ' ').trim();
@@ -88,6 +82,24 @@ export function buildInventoryMarkdown(pkg: any, nowIso: string): string {
'아래 개념들은 명칭이 달라도 **이미 구현되어 있다**. 이들을 "도입/추가하라"고 제안하면 오답이다:',
...CONCEPT_MAP.map(([concept, impl]) => `- **${concept}**: ${impl}`),
'',
+ '## 📖 학습 메커니즘 — 정본 (자기 학습 방식 질문에는 이 섹션만 근거로 답할 것)',
+ '',
+ '**대원칙: 모델 가중치는 절대 학습되지 않는다.** 모든 "학습"은 두뇌 폴더',
+ '(설정된 localBrainPath — ConnectAI 프로젝트 루트가 아님)에 *파일로* 쌓이고,',
+ '다음 턴의 검색·프롬프트 주입을 통해 행동이 바뀌는 **외부 기억 기반** 방식이다.',
+ '두뇌 폴더를 지우면 학습도 사라진다. "패턴을 학습해 선제적으로 제시한다" 류의',
+ '서술은 거짓이다 — 선제 제시 엔진은 존재하지 않는다.',
+ '',
+ '자동 학습 회로는 정확히 다음 5가지뿐이다:',
+ '1. **Correction Loop** — 사용자 정정 발화 감지 → 오류 유형 자동 분류 → 레슨 + 회귀 케이스(.astra/eval/corrections.jsonl) 저장',
+ '2. **레슨(Experience Memory)** — 과거 실수가 "실패 방지 체크리스트"로 다음 턴 프롬프트에 주입 (truncation 보호 구역)',
+ '3. **약점 프로필** — 최근 정정 통계가 자기검토 블록을 통해 다음 턴 행동을 직접 변경',
+ '4. **Alignment Knowledge** — 1인 기업 모드 질문에 사용자가 답해준 내용을 두뇌 "Alignment Knowledge" 폴더에 저장 → 같은 질문 재발 방지',
+ '5. **주간 성장 사이클** — decay 리포트(지식 노후), 골든셋 회귀 평가, 학습 큐 갱신',
+ '',
+ '보조 기억(학습이 아닌 *기억*): 단기 대화 히스토리, [PRIOR TURN CONCLUSION] 앵커,',
+ '세션 요약(중기), 두뇌 RAG(장기), Project Chronicle(기록 생성 — 검색 두뇌와 별개).',
+ '',
];
return lines.join('\n');
}
diff --git a/src/features/company/alignmentResearch.ts b/src/features/company/alignmentResearch.ts
new file mode 100644
index 0000000..a818021
--- /dev/null
+++ b/src/features/company/alignmentResearch.ts
@@ -0,0 +1,311 @@
+/**
+ * Alignment Self-Research — 사용자에게 묻기 전에 두뇌를 먼저 검색.
+ *
+ * Intent Alignment 분석기가 만든 openQuestions 를 사용자에게 노출하기 전에,
+ * 활성 두뇌(지식 폴더)를 TF-IDF 로 검색해 *스스로 답할 수 있는 질문* 을 걸러낸다.
+ * 답을 찾은 질문은 answeredQuestions 로 옮겨지고(자가 조사 marker 부착),
+ * 정말 모르는 질문만 사용자에게 도달한다.
+ *
+ * Phase 3(학습 루프): 사용자가 직접 답해준 Q/A 는 두뇌의 전용 폴더에 일반
+ * 노트로 저장된다. 다음 turn 에서 같은 질문이 나오면 이 모듈의 자가 조사가
+ * 그 노트를 발견해 스스로 해결 — 같은 것을 두 번 묻지 않는 구조.
+ *
+ * 설계 원칙 (intentAlignment 와 동일):
+ * - 절대 throw 하지 않는다. 검색/LLM/IO 실패는 "자가 조사 안 한 것"과
+ * 동일하게 동작해야 한다 — alignment 흐름 차단 금지.
+ * - Lesson(Experience Memory) 시스템과 분리 — 그쪽은 "실수 회피" 카드라
+ * 주입 위치/의미가 다르다. 여기 저장물은 평범한 지식 노트.
+ */
+import * as fs from 'fs';
+import * as path from 'path';
+import { IAIService } from '../../core/services';
+import { findBrainFiles, logError, logInfo } from '../../utils';
+import { getBrainTokenIndex } from '../../retrieval/brainIndex';
+import { tokenize, expandQuery, scoreTfIdfPreTokenized, extractBestExcerpt } from '../../retrieval/scoring';
+
+/**
+ * 자가 조사로 채워진 답변의 식별 prefix. formatContractForPrompt 를 거쳐
+ * dispatcher 의 LLM 에게 그대로 전달되므로, "사용자가 직접 말한 사실"과
+ * 구분되도록 의미를 텍스트 자체에 내장한다. webview 카드 렌더에서도 이
+ * prefix 로 자가 조사 항목을 골라낸다.
+ */
+export const SELF_RESEARCH_PREFIX = '(자가 조사로 두뇌에서 확인) ';
+
+/** 두뇌 저장 폴더 이름 — Phase 3 의 지식 노트가 쌓이는 곳. */
+export const ALIGNMENT_KNOWLEDGE_DIR = 'Alignment Knowledge';
+
+/** 질문 1개에 대해 두뇌에서 모은 근거 발췌. */
+export interface QuestionEvidence {
+ question: string;
+ excerpts: Array<{ title: string; relativePath: string; excerpt: string }>;
+}
+
+/** 질문별 검색 상한 — 질문당 top 2 파일, 발췌 600자, 전체 합계 4,000자. */
+const FILES_PER_QUESTION = 2;
+const EXCERPT_MAX_CHARS = 600;
+const TOTAL_EVIDENCE_CAP = 4000;
+
+/**
+ * openQuestions 각각을 두뇌에 TF-IDF 검색해 근거 발췌를 모은다.
+ * 빈 두뇌 / 잘못된 경로 / IO 에러 → 해당 질문의 excerpts 가 빈 배열 (throw 금지).
+ * 인덱스는 brainIndex 의 mtime 캐시를 그대로 활용하므로 재호출 비용이 낮다.
+ */
+export function gatherEvidenceForQuestions(
+ brainPath: string,
+ questions: string[],
+): QuestionEvidence[] {
+ const empty = questions.map((q) => ({ question: q, excerpts: [] as QuestionEvidence['excerpts'] }));
+ if (!brainPath || questions.length === 0) return empty;
+ try {
+ const files = findBrainFiles(brainPath);
+ if (files.length === 0) return empty;
+ const index = getBrainTokenIndex(brainPath, files);
+ if (index.length === 0) return empty;
+
+ let totalChars = 0;
+ return questions.map((question) => {
+ const queryTokens = expandQuery(tokenize(question));
+ if (queryTokens.length === 0) return { question, excerpts: [] };
+ const scored = scoreTfIdfPreTokenized(queryTokens, index)
+ .filter((s) => s.score > 0)
+ .slice(0, FILES_PER_QUESTION);
+ const excerpts: QuestionEvidence['excerpts'] = [];
+ for (const s of scored) {
+ if (totalChars >= TOTAL_EVIDENCE_CAP) break;
+ const doc = index[s.index];
+ let content = '';
+ try {
+ content = fs.readFileSync(doc.filePath, 'utf8');
+ } catch {
+ continue; // 인덱스에 있는데 디스크에서 사라진 파일 — skip
+ }
+ const excerpt = extractBestExcerpt(content, tokenize(question), EXCERPT_MAX_CHARS);
+ if (!excerpt.trim()) continue;
+ totalChars += excerpt.length;
+ excerpts.push({ title: doc.title, relativePath: doc.relativePath, excerpt });
+ }
+ return { question, excerpts };
+ });
+ } catch (e: any) {
+ logError('alignmentResearch: evidence gathering failed; skipping self-research.', {
+ error: e?.message ?? String(e),
+ });
+ return empty;
+ }
+}
+
+const SELF_ANSWER_SYSTEM_PROMPT = `당신은 "1인 기업 모드"의 *자가 조사 판정가*입니다. 사용자에게 질문을 던지기 전에, 두뇌(저장된 지식 노트)에서 검색된 근거만으로 각 질문에 답할 수 있는지 판정합니다.
+
+규칙:
+- 근거 발췌에 *명시적으로 적혀 있는* 내용으로만 답하세요. 일반 상식·추측으로 채우는 것은 금지입니다.
+- 근거가 부분적이거나 모호하면 그 질문은 "unanswered" 입니다. 확신이 없으면 unanswered 가 정답입니다.
+- answered 인 질문의 answer 는 근거에서 추출한 사실을 2~3문장으로 요약하고, 출처 노트 제목을 괄호로 덧붙이세요.
+
+⚠️ 반드시 아래 JSON 한 번만 출력. 다른 텍스트(설명·코드펜스·머리말) 일체 금지.
+
+{
+ "answers": [
+ { "question": "<원문 그대로>", "status": "answered" | "unanswered", "answer": "" }
+ ]
+}`;
+
+/** 자가 조사 판정 결과 한 건. */
+export interface SelfAnswer {
+ question: string;
+ answered: boolean;
+ answer: string;
+}
+
+/**
+ * LLM 1회 호출로 "근거만으로 답 가능한 질문"을 판정. 호출/파싱 실패 시
+ * 모든 질문을 unanswered 로 반환 — 원래의 질문 카드 흐름이 그대로 동작.
+ */
+export async function selfAnswerQuestions(
+ ai: IAIService,
+ input: {
+ userPrompt: string;
+ evidence: QuestionEvidence[];
+ model?: string;
+ timeoutMs?: number;
+ },
+): Promise {
+ const withEvidence = input.evidence.filter((e) => e.excerpts.length > 0);
+ const fallback = input.evidence.map((e) => ({ question: e.question, answered: false, answer: '' }));
+ if (withEvidence.length === 0) return fallback;
+
+ const lines: string[] = [];
+ lines.push('[사용자 원본 요청]');
+ lines.push(input.userPrompt);
+ lines.push('');
+ lines.push('[판정할 질문과 두뇌 검색 근거]');
+ for (const e of withEvidence) {
+ lines.push('');
+ lines.push(`질문: ${e.question}`);
+ for (const x of e.excerpts) {
+ lines.push(`- 근거 (노트: "${x.title}", 경로: ${x.relativePath}):`);
+ lines.push(` ${x.excerpt.replace(/\n/g, '\n ')}`);
+ }
+ }
+ lines.push('');
+ lines.push('판정 JSON만 출력:');
+
+ let raw = '';
+ try {
+ const result = await ai.chat({
+ system: SELF_ANSWER_SYSTEM_PROMPT,
+ user: lines.join('\n'),
+ model: input.model,
+ timeoutMs: input.timeoutMs,
+ });
+ raw = result.content || '';
+ } catch (e: any) {
+ logError('alignmentResearch: self-answer call failed; all questions pass through.', {
+ error: e?.message ?? String(e),
+ });
+ return fallback;
+ }
+ const parsed = _parseSelfAnswerJson(raw);
+ if (!parsed) {
+ logInfo('alignmentResearch: self-answer parse failed; all questions pass through.', {
+ rawHead: raw.slice(0, 100),
+ });
+ return fallback;
+ }
+ // LLM 출력을 원래 질문 목록에 매핑 — 누락된 질문은 unanswered 로 채움.
+ const byQuestion = new Map(parsed.map((a) => [a.question.trim(), a]));
+ return input.evidence.map((e) => {
+ const hit = byQuestion.get(e.question.trim());
+ if (hit && hit.status === 'answered' && hit.answer.trim()) {
+ return { question: e.question, answered: true, answer: hit.answer.trim() };
+ }
+ return { question: e.question, answered: false, answer: '' };
+ });
+}
+
+/** 4-stage 관용 파서 — intentAlignment 와 동일 패턴 (작은 모델의 펜스/머리말 대응). */
+export function _parseSelfAnswerJson(raw: string): Array<{
+ question: string;
+ status: 'answered' | 'unanswered';
+ answer: string;
+}> | null {
+ if (!raw || !raw.trim()) return null;
+ const fenced = raw.match(/```(?:json)?\s*([\s\S]*?)\s*```/i);
+ const stage1 = (fenced ? fenced[1] : raw).trim();
+ for (const candidate of [stage1, _extractFirstBalancedObject(stage1)]) {
+ if (!candidate) continue;
+ try {
+ const obj = JSON.parse(candidate);
+ const coerced = _coerceSelfAnswers(obj);
+ if (coerced) return coerced;
+ } catch { /* 다음 stage */ }
+ }
+ return null;
+}
+
+function _coerceSelfAnswers(obj: unknown): ReturnType {
+ if (!obj || typeof obj !== 'object') return null;
+ const answers = (obj as Record).answers;
+ if (!Array.isArray(answers)) return null;
+ const out: Array<{ question: string; status: 'answered' | 'unanswered'; answer: string }> = [];
+ for (const a of answers) {
+ if (!a || typeof a !== 'object') continue;
+ const r = a as Record;
+ const question = typeof r.question === 'string' ? r.question.trim() : '';
+ if (!question) continue;
+ const status = r.status === 'answered' ? 'answered' : 'unanswered';
+ const answer = typeof r.answer === 'string' ? r.answer.trim() : '';
+ out.push({ question, status, answer });
+ }
+ return out.length > 0 ? out : null;
+}
+
+function _extractFirstBalancedObject(s: string): string | null {
+ const start = s.indexOf('{');
+ if (start === -1) return null;
+ let depth = 0;
+ let inString = false;
+ let escape = false;
+ for (let i = start; i < s.length; i++) {
+ const ch = s[i];
+ if (inString) {
+ if (escape) escape = false;
+ else if (ch === '\\') escape = true;
+ else if (ch === '"') inString = false;
+ continue;
+ }
+ if (ch === '"') { inString = true; continue; }
+ if (ch === '{') depth++;
+ else if (ch === '}') {
+ depth--;
+ if (depth === 0) return s.slice(start, i + 1);
+ }
+ }
+ return null;
+}
+
+// ─── Phase 3: 사용자 답변의 두뇌 저장 (학습 루프) ────────────────────────────
+
+/** 저장 대상 필터 — 사용자가 *직접* 답한 실질적 정보만. */
+const MIN_ANSWER_CHARS = 20;
+
+/**
+ * 사용자가 alignment 라운드에서 직접 답해준 Q/A 를 두뇌의 전용 폴더에 일반
+ * 노트로 저장한다. 자가 조사 항목(SELF_RESEARCH_PREFIX)과 20자 미만의 짧은
+ * 답은 제외 — 두뇌 오염 방지. 같은 날 같은 요청의 노트가 이미 있으면 skip.
+ *
+ * @returns 저장된 파일 경로, 저장할 것이 없거나 실패하면 null (throw 금지).
+ */
+export function saveAlignmentKnowledge(
+ brainPath: string,
+ input: { userPrompt: string; qaList: Array<{ q: string; a: string }> },
+): string | null {
+ try {
+ if (!brainPath || !fs.existsSync(brainPath)) return null;
+ const userAnswered = input.qaList.filter(
+ (qa) => !qa.a.startsWith(SELF_RESEARCH_PREFIX) && qa.a.trim().length >= MIN_ANSWER_CHARS,
+ );
+ if (userAnswered.length === 0) return null;
+
+ const date = new Date();
+ const ymd = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
+ const slug = _slugify(input.userPrompt, 30);
+ const dir = path.join(brainPath, ALIGNMENT_KNOWLEDGE_DIR);
+ const filePath = path.join(dir, `${ymd} ${slug}.md`);
+ if (fs.existsSync(filePath)) return null; // 같은 turn 재진입/재실행 — 중복 저장 방지
+
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
+ const body: string[] = [];
+ body.push(`# ${input.userPrompt.replace(/\s+/g, ' ').trim().slice(0, 50)}`);
+ body.push('');
+ body.push(`> 1인 기업 모드 Intent Alignment 에서 사용자가 직접 제공한 정보. (${ymd})`);
+ body.push('');
+ body.push('## 원본 요청');
+ body.push(input.userPrompt.trim());
+ body.push('');
+ body.push('## 확인된 정보');
+ for (const qa of userAnswered) {
+ body.push(`### Q. ${qa.q.replace(/\n/g, ' ').trim()}`);
+ body.push(qa.a.trim());
+ body.push('');
+ }
+ fs.writeFileSync(filePath, body.join('\n').trimEnd() + '\n', 'utf8');
+ logInfo('alignmentResearch: saved user-provided knowledge to brain.', { filePath });
+ return filePath;
+ } catch (e: any) {
+ logError('alignmentResearch: knowledge save failed (non-fatal).', {
+ error: e?.message ?? String(e),
+ });
+ return null;
+ }
+}
+
+/** 파일명 안전 slug — 한글 보존, 경로 위험 문자만 제거. */
+export function _slugify(text: string, maxChars: number): string {
+ const cleaned = text
+ .replace(/\s+/g, ' ')
+ .trim()
+ .replace(/[\\/:*?"<>|#%{}$!'@`+=[\]]/g, '')
+ .slice(0, maxChars)
+ .trim();
+ return cleaned || 'alignment';
+}
diff --git a/src/features/company/dispatcher.ts b/src/features/company/dispatcher.ts
index 65eefe1..ba7bf1e 100644
--- a/src/features/company/dispatcher.ts
+++ b/src/features/company/dispatcher.ts
@@ -215,6 +215,30 @@ export interface DispatcherDeps {
* 'off'였던 경우.
*/
requirementContract?: RequirementContract;
+ /**
+ * 현재 워크스페이스의 아키텍처 컨텍스트 (architecture.md 요약, 호출자가
+ * 절단해 전달). 일반 챗은 이 컨텍스트를 자동 주입받지만 기업 모드는 빠져
+ * 있던 공백 수정 — specialist 가 "이 프로젝트가 뭐냐"를 추측하지 않게.
+ * contract 와 같은 4개 지점(planner/specialist/verifier/inspector)에 prepend.
+ */
+ architectureContextBlock?: string;
+ /**
+ * 사용자 프롬프트에 포함된 URL 의 pre-fetch 결과 ([URL CONTENT] 블록).
+ * 기업 모드에는 continuation loop 가 없어 LLM 주도 fetch 결과를 재분석할
+ * 기회가 없으므로, dispatch 전에 호출자가 가져와 모든 에이전트에게 배포.
+ */
+ webContextBlock?: string;
+}
+
+/**
+ * deps 의 자동 수집 컨텍스트(architecture + web)를 한 prefix 문자열로 합성.
+ * 둘 다 없으면 빈 문자열 — 기존 동작과 100% 동일.
+ */
+function buildExtraContextPrefix(deps: DispatcherDeps): string {
+ const blocks = [deps.architectureContextBlock, deps.webContextBlock]
+ .map((b) => (b || '').trim())
+ .filter(Boolean);
+ return blocks.length > 0 ? blocks.join('\n\n') : '';
}
/**
@@ -353,11 +377,13 @@ export async function runCompanyTurn(
};
} else {
const ceoModel = modelForAgent(state, 'ceo', deps.defaultModel);
+ const plannerExtraPrefix = buildExtraContextPrefix(deps);
+ const plannerContract = deps.requirementContract
+ ? formatContractForPrompt(deps.requirementContract)
+ : undefined;
const plannerResult = await runCeoPlanner(deps.ai, userPrompt, state, {
model: ceoModel,
- contractBlock: deps.requirementContract
- ? formatContractForPrompt(deps.requirementContract)
- : undefined,
+ contractBlock: [plannerExtraPrefix, plannerContract].filter(Boolean).join('\n\n') || undefined,
signal: deps.signal,
});
plan = plannerResult.plan;
@@ -666,11 +692,13 @@ async function _dispatchOne(
peerOutputs,
brainContext, // injected as `[SECOND BRAIN CONTEXT]` block
knowledgeMixPolicy: policyBlock, // injected as `[KNOWLEDGE MIX POLICY]` block
- // alignment 단계에서 도출된 contract가 deps에 있으면 모든 specialist의
- // system 프롬프트에 같은 ground truth로 prepend된다. 추측 방지.
- contractBlock: deps.requirementContract
- ? formatContractForPrompt(deps.requirementContract)
- : undefined,
+ // alignment 단계에서 도출된 contract + 자동 수집 컨텍스트(architecture/web)가
+ // deps에 있으면 모든 specialist의 system 프롬프트에 같은 ground truth로
+ // prepend된다. 추측 방지.
+ contractBlock: [
+ buildExtraContextPrefix(deps),
+ deps.requirementContract ? formatContractForPrompt(deps.requirementContract) : '',
+ ].filter(Boolean).join('\n\n') || undefined,
});
// 우선순위: stage > agent > global default.
const model = (stageModelOverride && stageModelOverride.trim())
@@ -696,9 +724,10 @@ async function _dispatchOne(
// 옛 dynamic import 8회 → 정적 import 로 promote (파일 상단). 모듈 자체 cyclic 없음.
const cfgRuntime = getDispatcherConfig();
if (cfgRuntime.selfReflectorExternalEnabled && rawResponse) {
- const contractBlock = deps.requirementContract
- ? formatContractForPrompt(deps.requirementContract)
- : undefined;
+ const contractBlock = [
+ buildExtraContextPrefix(deps),
+ deps.requirementContract ? formatContractForPrompt(deps.requirementContract) : '',
+ ].filter(Boolean).join('\n\n') || undefined;
const verdict = await verifyResponse(deps.ai, {
task,
response: rawResponse,
@@ -1048,11 +1077,13 @@ async function _runReviewCycle(args: {
return { verdict: 'aborted', rounds: round - 1 };
}
const startedAt = Date.now();
- // contract가 있으면 검수자/CEO 모두에게 같은 ground truth를 prepend —
- // 검수 기준이 contract와 일치하는지를 정확히 평가할 수 있다.
- const contractPrefix = deps.requirementContract
- ? formatContractForPrompt(deps.requirementContract) + '\n\n'
- : '';
+ // contract + 자동 수집 컨텍스트가 있으면 검수자/CEO 모두에게 같은 ground
+ // truth를 prepend — 검수 기준이 contract와 일치하는지를 정확히 평가할 수 있다.
+ const contractPrefixParts = [
+ buildExtraContextPrefix(deps),
+ deps.requirementContract ? formatContractForPrompt(deps.requirementContract) : '',
+ ].filter(Boolean).join('\n\n');
+ const contractPrefix = contractPrefixParts ? contractPrefixParts + '\n\n' : '';
// ── 1) 검수자 LLM 콜 ──
const inspectorSystem = contractPrefix + '당신은 산출물 *감리*입니다. 작업자의 결과물을 객관적으로 검토하고 한국어 마크다운으로 응답하세요.\n\n반드시 첫 줄을 다음 둘 중 하나로 시작:\n - ✅ 통과 — 산출물이 task 요구 + 위 contract의 criteria를 모두 충족하면.\n - ❌ 보완 필요: <구체 항목 한 줄> — contract 기준 누락·오류·약점이 있으면.\n\n그 다음 줄들에 *구체적인* 피드백 또는 칭찬 1~3줄. 모호한 일반론 금지.';
diff --git a/src/features/company/index.ts b/src/features/company/index.ts
index e5c8b23..32e8c06 100644
--- a/src/features/company/index.ts
+++ b/src/features/company/index.ts
@@ -95,6 +95,13 @@ export type { ChatIntent, IntentContext, IntentResult, PipelineHint } from './in
export { analyzeIntent, formatContractForPrompt } from './intentAlignment';
export type { IntentAnalysisInput, IntentAnalysisResult } from './intentAlignment';
+export {
+ gatherEvidenceForQuestions,
+ selfAnswerQuestions,
+ saveAlignmentKnowledge,
+ SELF_RESEARCH_PREFIX,
+} from './alignmentResearch';
+export type { QuestionEvidence, SelfAnswer } from './alignmentResearch';
export type { RequirementContract } from './types';
export {
diff --git a/src/features/company/intentAlignment.ts b/src/features/company/intentAlignment.ts
index dfe1473..4b4d9ef 100644
--- a/src/features/company/intentAlignment.ts
+++ b/src/features/company/intentAlignment.ts
@@ -71,6 +71,14 @@ export interface IntentAnalysisInput {
* 없으면 undefined (첫 진입 / 모드 토글 없는 케이스).
*/
priorChatSummary?: string;
+ /**
+ * 현재 열린 워크스페이스의 아키텍처 컨텍스트 (architecture.md 요약).
+ * 사용자가 *지금 열어둔 프로젝트* 에 대해 요청하는 경우가 많은데, 분석기가
+ * 이걸 못 보면 "그 프로젝트가 뭐냐"는 — 워크스페이스가 이미 답하고 있는 —
+ * 질문을 던진다. 첫 라운드에만 첨부 (후속 라운드는 contract 에 흡수됨).
+ * 작은 모델 보호를 위해 호출자가 3,000자 내외로 절단해 전달.
+ */
+ projectContext?: string;
}
const SYSTEM_PROMPT = `당신은 "1인 기업 모드"의 *요청 분석가*입니다. 사용자의 자연어 요청을 받아 그것을 실행 가능한 작업 조건 5가지(C-G-C-F-Q)로 정리합니다.
@@ -85,6 +93,8 @@ const SYSTEM_PROMPT = `당신은 "1인 기업 모드"의 *요청 분석가*입
⚠️ **[모드 전환 시 context 우선 추출]**: 입력에 \`[모드 전환 직전 일반 채팅 요약]\` 블록이 있으면, 그것을 **사용자의 한 줄과 같은 권위로** 취급하세요. 거기서 context/goal/criteria/format 을 *직접 추출* 한 뒤, 그래도 빠진 항목만 openQuestions 에 넣으세요. 사용자가 이미 일반 채팅에서 충분히 설명한 내용을 다시 물어보면 안 됩니다 — 일반 채팅에서 *명시적으로 언급* 된 항목은 추측이 아니라 **명시된 사실** 입니다.
+⚠️ **[프로젝트 컨텍스트 우선 활용]**: 입력에 \`[프로젝트 컨텍스트]\` 블록이 있으면 그것은 *사용자가 지금 열어둔 워크스페이스* 의 실제 구조 요약입니다. 거기서 직접 확인되는 사실(이 프로젝트가 무엇인지, 기술 스택, 폴더 구조, 주요 기능)은 이미 알려진 정보로 취급해 context 슬롯에 반영하고, 그 블록에서 답이 확인되는 질문은 openQuestions 에 만들지 마세요. 예: 사용자가 그 프로젝트 이름·경로를 언급하며 요청하면 "그 프로젝트가 무엇인가요?" 같은 질문은 금지입니다.
+
confidence는 다음 기준으로 자체 판정:
- "high" : C·G·C·F 4개 모두 prompt에서 직접 추론 가능. openQuestions = [] 가능.
- "medium" : 대체로 명확하지만 1~2개 항목에서 합리적 가정 필요. 추가 질문 1~2개.
@@ -119,6 +129,16 @@ function _buildUserMessage(input: IntentAnalysisInput): string {
lines.push(input.priorChatSummary);
lines.push('---');
}
+ // 현재 워크스페이스 아키텍처 요약 — "이 프로젝트가 뭐냐"류의 재질문 차단.
+ if (input.projectContext && input.projectContext.trim()) {
+ lines.push('');
+ lines.push('[프로젝트 컨텍스트]');
+ lines.push('아래는 사용자가 현재 열어둔 워크스페이스의 아키텍처 요약입니다. 여기서 직접');
+ lines.push('확인되는 사실은 이미 알려진 정보로 취급해 context 슬롯에 반영하고, 다시 묻지 마세요.');
+ lines.push('---');
+ lines.push(input.projectContext);
+ lines.push('---');
+ }
if (input.activePipelineName) {
lines.push('');
lines.push(`(활성 파이프라인) "${input.activePipelineName}"`);
diff --git a/src/features/company/promptBuilder.ts b/src/features/company/promptBuilder.ts
index 85560b5..8a95b28 100644
--- a/src/features/company/promptBuilder.ts
+++ b/src/features/company/promptBuilder.ts
@@ -140,6 +140,7 @@ export function buildSpecialistPrompt(inputs: SpecialistPromptInputs): string {
parts.push(' • `` — 작업 추적기에 task 추가');
parts.push(' • `` — 진척·blocker 갱신');
parts.push(' • `` — task 완료 처리 (done 섹션으로 이동)');
+ parts.push(' • `` — 웹 페이지 본문 가져오기 (회당 최대 2개). "사이트 방문 불가"라고 답하지 말고 이 태그를 사용할 것. 결과는 [URL CONTENT] 블록으로 주입됨.');
parts.push('');
parts.push('📋 **Task 사용 시점**:');
parts.push('- 회의록·요청 처리 중 *명확한 할일* 마다 add_task 1개씩 emit. 추측·확장 금지.');
diff --git a/src/features/web/webFetch.ts b/src/features/web/webFetch.ts
new file mode 100644
index 0000000..eb4b9ef
--- /dev/null
+++ b/src/features/web/webFetch.ts
@@ -0,0 +1,167 @@
+/**
+ * Web Fetch — Bridge 무관 직접 URL fetch (vscode 의존 없음 — 테스트 용이).
+ *
+ * 배경: 일반 챗의 URL 주입(urlContext.ts)은 Datacollect Bridge(:3002)에 100%
+ * 의존했다. Bridge가 꺼져 있으면 — 확장은 Bridge를 자동 시작하지 않는다 —
+ * "접근 실패" 블록이 떠서 모델이 "사이트 방문 불가"라고 답하는 공백이 있었다.
+ * 이 모듈은 그 폴백: extension host의 global fetch(Node 18+, bridgeClient가
+ * 이미 사용 중)로 직접 페이지를 가져와 본문 텍스트를 추출한다.
+ *
+ * 설계 원칙: 절대 throw 하지 않는다 — 모든 실패는 {ok:false, error} 로 반환.
+ */
+
+/**
+ * 스킴 없는 도메인 인식용 보수적 TLD 목록 — 사용자는 "koritips.com 가서 분석해줘"
+ * 처럼 https:// 를 생략하기 마련이라, 흔한 TLD 만 허용해 파일명(utils.ts,
+ * package.json 등) 오인을 차단한다.
+ */
+const BARE_DOMAIN_TLDS = 'com|net|org|io|co|kr|jp|dev|app|ai|me|info|blog|shop|site|xyz|cc|tv|us|uk|edu|gov';
+
+/**
+ * http(s) URL 추출 — dedupe + trailing 구두점 제거. 슬래시 명령은 자체 처리하므로
+ * 제외. https:// 가 없는 bare 도메인(koritips.com, www.foo.net 등)도 인식해
+ * https:// 를 붙여 반환한다.
+ */
+export function extractUrls(text: string, max = 2): string[] {
+ const t = (text || '').trim();
+ // 슬래시 *명령* (/wikify 등)만 제외 — 절대경로("/Volumes/... koritips.com 봐줘")로
+ // 시작하는 프롬프트는 URL 추출 대상이다 (startsWith('/') 는 경로를 오인했던 버그).
+ if (!t || /^\/[a-zA-Z][\w-]*(\s|$)/.test(t)) return [];
+ const seen = new Set();
+ const out: string[] = [];
+
+ // ① 스킴 있는 URL 우선.
+ const re = /https?:\/\/[^\s<>"'`)\]]+/gi;
+ let m: RegExpExecArray | null;
+ while ((m = re.exec(t)) !== null && out.length < max) {
+ // 문장 끝 구두점이 URL 에 붙는 흔한 오염 제거.
+ const url = m[0].replace(/[.,;:!?…」』)]+$/, '');
+ if (!seen.has(url)) {
+ seen.add(url);
+ out.push(url);
+ }
+ }
+ if (out.length >= max) return out;
+
+ // ② Bare 도메인 — 이미 찾은 URL 영역은 마스킹해 이중 매칭 방지.
+ // 직전 문자가 @(이메일)·/(경로 일부)·.(서브파트) 면 제외.
+ let masked = t;
+ for (const u of out) masked = masked.split(u).join(' '.repeat(Math.min(u.length, 8)));
+ const bareRe = new RegExp(
+ `(^|[\\s("'\`「『<>])((?:[a-z0-9-]+\\.)+(?:${BARE_DOMAIN_TLDS})(?:\\.[a-z]{2})?(?::\\d{2,5})?(?:/[^\\s<>"'\`)\\]]*)?)`,
+ 'gi',
+ );
+ while ((m = bareRe.exec(masked)) !== null && out.length < max) {
+ const candidate = m[2].replace(/[.,;:!?…」』)]+$/, '');
+ if (!candidate.includes('.')) continue;
+ const url = `https://${candidate}`;
+ if (!seen.has(url) && !seen.has(`http://${candidate}`)) {
+ seen.add(url);
+ out.push(url);
+ }
+ }
+ return out;
+}
+
+export interface WebFetchResult {
+ ok: boolean;
+ url: string;
+ title: string;
+ text: string;
+ error?: string;
+}
+
+const DEFAULT_TIMEOUT_MS = 15_000;
+const DEFAULT_MAX_CHARS = 20_000;
+
+/**
+ * URL 본문을 직접 fetch 해 텍스트로 변환. HTML 이면 태그를 걷어내고,
+ * 그 외(text/json 등)는 원문 그대로 cap. http/https 만 허용.
+ */
+export async function fetchUrlDirect(
+ url: string,
+ opts: { timeoutMs?: number; maxChars?: number } = {},
+): Promise {
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
+ const maxChars = opts.maxChars ?? DEFAULT_MAX_CHARS;
+ const fail = (error: string): WebFetchResult => ({ ok: false, url, title: '', text: '', error });
+
+ if (!/^https?:\/\//i.test(url)) return fail('http/https URL만 지원합니다.');
+ if (typeof fetch !== 'function') return fail('이 환경은 직접 fetch를 지원하지 않습니다.');
+
+ const controller = new AbortController();
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
+ try {
+ const res = await fetch(url, {
+ signal: controller.signal,
+ redirect: 'follow',
+ headers: {
+ // 일부 사이트가 UA 없는 요청을 차단 — 평범한 브라우저 UA 로.
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36',
+ 'Accept': 'text/html,application/xhtml+xml,application/json;q=0.9,text/plain;q=0.8,*/*;q=0.5',
+ },
+ });
+ if (!res.ok) return fail(`HTTP ${res.status} ${res.statusText || ''}`.trim());
+ const contentType = (res.headers.get('content-type') || '').toLowerCase();
+ const raw = await res.text();
+ if (!raw.trim()) return fail('응답 본문이 비어 있습니다.');
+
+ if (contentType.includes('html') || /^\s*<(!doctype|html)/i.test(raw)) {
+ const title = _extractTitle(raw);
+ const text = htmlToText(raw).slice(0, maxChars);
+ if (text.trim().length < 50) {
+ return fail('본문 추출 실패 (콘텐츠 없음 또는 JS 전용 렌더링).');
+ }
+ return { ok: true, url, title, text };
+ }
+ return { ok: true, url, title: '', text: raw.slice(0, maxChars) };
+ } catch (e: any) {
+ const msg = e?.name === 'AbortError'
+ ? `타임아웃 (${Math.round(timeoutMs / 1000)}s)`
+ : String(e?.message ?? e).slice(0, 120);
+ return fail(msg);
+ } finally {
+ clearTimeout(timer);
+ }
+}
+
+function _extractTitle(html: string): string {
+ const m = html.match(/]*>([\s\S]*?)<\/title>/i);
+ return m ? decodeEntities(m[1]).replace(/\s+/g, ' ').trim().slice(0, 200) : '';
+}
+
+/** HTML → 평문. script/style/noscript 제거 → 블록 태그를 줄바꿈으로 → 태그 strip → 엔티티 → 공백 정리. */
+export function htmlToText(html: string): string {
+ let s = html
+ .replace(/
+제목입니다
첫 문단.
둘째 문단.