From 4eb8bf03f7a9823592170c678a26b6453bd7524e Mon Sep 17 00:00:00 2001 From: g1nation Date: Thu, 11 Jun 2026 14:41:14 +0900 Subject: [PATCH] =?UTF-8?q?fix(identity):=20=EC=9E=90=EA=B8=B0=20=EC=98=A4?= =?UTF-8?q?=EB=B3=B4=EA=B3=A0=C2=B73=EC=9D=B8=EC=B9=AD=C2=B7=EC=95=B5?= =?UTF-8?q?=EB=AC=B4=EC=83=88=20=EB=B0=98=EB=B3=B5=203=EC=A2=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(v2.2.215)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용자 대화 분석에서 발견된 3개 결함: 1) 자기 오보고 — 자기 지식 블록이 Astra 모드에만 있어 Agent 모드는 미적용. selfIdentity.ts 공용 모듈로 추출해 양 모드 system prompt 에 주입. 2) 3인칭 화법 — "Astra는~"처럼 남 얘기하듯 답하던 문제. 공용 블록에 "너는 ASTRA 본인, 반드시 1인칭" 규칙 명시. 3) 앵무새 반복 — [PRIOR TURN CONCLUSION]의 "…결론으로 다시 말해라" 지시를 소형 모델이 문자 그대로 해석, 직전 답변 첫 문장을 턴마다 서두에 복창. 지시문을 "인용 받아쓰기 금지 + 자신의 새 문장으로 재평가"로 교체. 근본 보강: 두뇌(2nd)에 정본 자기 기술서 'ASTRA 자기 아키텍처' 문서 생성 (별도 커밋) — 자기 기능/성장 질문 시 RAG 가 실제 사실을 검색하게 함. self-identity 블록도 해당 문서를 근거로 답하라고 연결. Co-Authored-By: Claude Opus 4.8 --- .astra/project-context/architecture.md | 28 ++++----- .astra/project-context/scan-cache.json | 60 ++++++++++++++----- ...cde86955f34dda22a6e02b95c9adc0a456927.json | 2 +- ...c10d377a9fef641dd359504b8d53aecd0a4c3.json | 4 +- .../tests/engine/.astra/missions/wiki_on.json | 6 +- ...b3d9d44f32b0e4cd024b2e055db3a0d34417e.json | 2 +- ...973124fb64ba505f767c53a783833bbc3fa6a.json | 2 +- ...0e6575e54853929e991e579e318f2f5a19030.json | 2 +- ...b73b3a5a01af5d82391ec29a25bd72b8239a5.json | 2 +- ...son => stress_conflict_1781156448281.json} | 22 +++---- ...-같아-평가부터-하면-생성-품질은-생각보다-괜찮은-편-70-80.md | 16 +++++ ...-많은-부분이-개선된-것이-확인이-되었어-그렇지만-아래와-같이.md | 16 +++++ docs/records/ConnectAI/chronicle.config.json | 2 +- ...0039-너가-astra야-왜-남처럼-이야기-하지.md | 19 ++++++ docs/records/ConnectAI/timeline.md | 9 +++ package-lock.json | 4 +- package.json | 2 +- .../buildAgentModeSystemPrompt.ts | 5 +- .../buildAstraModeSystemPrompt.ts | 17 ++---- .../contextBuilders/priorTurnConclusion.ts | 7 ++- src/lib/contextBuilders/selfIdentity.ts | 26 ++++++++ 21 files changed, 183 insertions(+), 70 deletions(-) rename .astra/tests/stress/.astra/missions/{stress_conflict_1781155763541.json => stress_conflict_1781156448281.json} (76%) create mode 100644 docs/records/ConnectAI/bugs/BUG-0019-너가-작성한-회의록에-대한-나의-평가는-아래와-같아-평가부터-하면-생성-품질은-생각보다-괜찮은-편-70-80.md create mode 100644 docs/records/ConnectAI/bugs/BUG-0020-이번-회의록을-참고해서-이전-회의록과-비교했을때-많은-부분이-개선된-것이-확인이-되었어-그렇지만-아래와-같이.md create mode 100644 docs/records/ConnectAI/decisions/ADR-0039-너가-astra야-왜-남처럼-이야기-하지.md create mode 100644 src/lib/contextBuilders/selfIdentity.ts diff --git a/.astra/project-context/architecture.md b/.astra/project-context/architecture.md index 4b4b8b2..dcee541 100644 --- a/.astra/project-context/architecture.md +++ b/.astra/project-context/architecture.md @@ -3,15 +3,15 @@ ## Snapshot -- **Workspace**: `connectai` `v2.2.214` _(absolute path varies by environment; resolved from the active VS Code workspace)_ +- **Workspace**: `connectai` `v2.2.215` _(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**: 478 source files, ~76,527 lines across 5 top-level modules. +- **Stats**: 482 source files, ~76,610 lines across 5 top-level modules. ## Last Refresh -- **Time**: 2026-06-11T05:30:08.345Z -- **Files newly analysed**: 3 -- **Files reused from cache**: 475 +- **Time**: 2026-06-11T05:40:30.212Z +- **Files newly analysed**: 0 +- **Files reused from cache**: 482 ## Directory Map ```mermaid @@ -20,8 +20,8 @@ mindmap src/ features/ sidebar/ - agent/ lib/ + agent/ retrieval/ intelligence/ media/ @@ -40,11 +40,11 @@ mindmap > Arrows: which top-level module imports from which. ```mermaid flowchart LR - src["src/
298 files"] + src["src/
299 files"] media["media/
6 files"] tests["tests/
45 files"] core_py["core_py/
6 files"] - docs["docs/
123 files"] + docs["docs/
126 files"] tests --> src ``` @@ -67,13 +67,13 @@ flowchart LR ## Modules -### `src/` — 298 files, ~56,894 lines +### `src/` — 299 files, ~56,917 lines **Sub-directories** - `src/features/` (105) — Astra Office — public API. 다음 세션에서 추가될 OfficeSnapshot presenter / schema 도 같은 entry 로 노출 예정. 현재 노출: full webview panel H - `src/sidebar/` (35) — Brain profile lifecycle 의 pure helpers — sidebarProvider 의 add/edit/delete 흐름에서 modal UI 와 config 쓰기를 제외한 데이터 변환 만 격리. 현 +- `src/lib/` (30) — Astra Mode Architecture Context Builder. 의도: 사용자가 Astra 자체의 mode 디자인 (Guard vs Multi-Agent 가 별도 모드여야 하는지) 을 묻는 메타 질문에 답할 - `src/agent/` (29) — Post-answer hook registry — 답변 완료 후 실행되는 부가 작업 모음. 새 hook 추가 = 1 객체 push. agent.ts 는 이 배열을 iterate 만 함. 현재 등록 순서 (v2.2.1 -- `src/lib/` (29) — Astra Mode Architecture Context Builder. 의도: 사용자가 Astra 자체의 mode 디자인 (Guard vs Multi-Agent 가 별도 모드여야 하는지) 을 묻는 메타 질문에 답할 - `src/retrieval/` (18) — Actionability Scoring — 검색 결과를 "현재 작업 상태" 신호로 재가중. 기존 TF-IDF (단어 매칭) + recency (시간) 만으로는 "지금 이 사용자가 하고 있는 작업과 직접 연결 된 문서 - `src/intelligence/` (16) — Confidence Engine — 답변 확신도 0~100 결정론적 산출. Self-Evolving OS 마스터 플랜 Phase 2 / Track 1-1. 신뢰 조건 T4 "확신이 없으면 사람에게 묻는다" 의 측정 - `src/core/` (15) — Astra Path Resolver (경로 해결기) Astra의 모든 데이터 파일(.astra 디렉토리)의 경로를 중앙에서 관리합니다. 확장 프로그램의 설치 경로(extensionUri) 기반으로 .astra 디렉토 @@ -165,17 +165,17 @@ flowchart LR - `core_py/optimizer.py` (55 lines) - `core_py/queue_worker.py` (82 lines) -### `docs/` — 123 files, ~4,410 lines +### `docs/` — 126 files, ~4,470 lines **Sub-directories** -- `docs/records/` (109) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고... +- `docs/records/` (112) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고... - `docs/docs/` (5) — Bug: Viewed integrationretrieval.test.ts:1-59 integrationretrieval.test.ts를 통해 ... - `docs/Meeting/` (0) **Key files** - `docs/TELEGRAM_REMOTE_EXECUTION_PLAN.md` (452 lines) — Telegram Remote Execution 기획서 - `docs/AgentEngine_Architecture.md` (314 lines) — AgentEngine Architecture Document -- `docs/records/ConnectAI/timeline.md` (278 lines) — Project Timeline +- `docs/records/ConnectAI/timeline.md` (287 lines) — Project Timeline - `docs/SELF_EVOLVING_OS_MASTER_PLAN.md` (275 lines) — ASTRA Self-Evolving Digital Employee OS — 마스터 개발 계획 v1.1 - `docs/ASTRA_OFFICE_REFACTOR.md` (198 lines) — Astra Office Refactor — Design Doc - `docs/EXPERIENCE_MEMORY_PLAN.md` (122 lines) — Experience Memory (Mistake / Lesson Loop) — Implementation Plan @@ -348,7 +348,7 @@ Astra는 대표님의 명시적인 승인 하에 로컬 시스템의 강력한 **Designed for High-Performance Decision Making.** Copyright (C) **g1nation**. All rights reserved. -_Last auto-scan: 2026-06-11T05:30:08.345Z · signature `8baafc08`_ +_Last auto-scan: 2026-06-11T05:40:30.212Z · signature `3be9404d`_ ## Purpose diff --git a/.astra/project-context/scan-cache.json b/.astra/project-context/scan-cache.json index 2eebf74..8b41e2d 100644 --- a/.astra/project-context/scan-cache.json +++ b/.astra/project-context/scan-cache.json @@ -1,6 +1,6 @@ { "version": 1, - "generatedAt": "2026-06-11T05:30:08.425Z", + "generatedAt": "2026-06-11T05:40:30.394Z", "files": { "src/agent/actions/brainOps.ts": { "mtimeMs": 1779764602582.9768, @@ -125,24 +125,26 @@ ] }, "src/agent/handlePrompt/buildAgentModeSystemPrompt.ts": { - "mtimeMs": 1779764602589.828, - "size": 4039, - "lines": 75, + "mtimeMs": 1781156303654.8252, + "size": 4330, + "lines": 78, "role": "", "imports": [ "src/lib/contextBuilders/systemPromptShaping", "src/lib/contextManager", - "src/utils" + "src/utils", + "src/lib/contextBuilders/selfIdentity" ] }, "src/agent/handlePrompt/buildAstraModeSystemPrompt.ts": { - "mtimeMs": 1781155366197.795, - "size": 8260, - "lines": 114, + "mtimeMs": 1781156248693.8586, + "size": 6827, + "lines": 105, "role": "", "imports": [ "src/lib/contextBuilders/localProjectIntent", "src/lib/contextBuilders/promptDetection", + "src/lib/contextBuilders/selfIdentity", "src/retrieval/knowledgeMix" ] }, @@ -2189,9 +2191,9 @@ "imports": [] }, "src/lib/contextBuilders/priorTurnConclusion.ts": { - "mtimeMs": 1779764602640.9502, - "size": 3761, - "lines": 75, + "mtimeMs": 1781156354349.277, + "size": 4210, + "lines": 78, "role": "", "imports": [ "src/agent" @@ -2242,6 +2244,13 @@ "src/features/secondBrainTrace" ] }, + "src/lib/contextBuilders/selfIdentity.ts": { + "mtimeMs": 1781156179655.8901, + "size": 2663, + "lines": 26, + "role": "[ASTRA 자기 지식 + 1인칭 정체성] 블록 — Astra/Agent 양쪽 모드 system prompt 가 공유. 왜 필요한가 (BUG: 자기 오보고): - 이 블록이 없으면 \"너는 어떻게 성장해?\" 같은 메타 질문에 모델이 학습 데이터의 일반 LLM 보일러플레이트(\"나는 frozen 모델이라 학습하지 않는다\")로 답한다. 실제 ASTRA 는 레슨·장", + "imports": [] + }, "src/lib/contextBuilders/systemPromptShaping.ts": { "mtimeMs": 1779764602644.5593, "size": 3200, @@ -3839,8 +3848,22 @@ "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/chronicle.config.json": { - "mtimeMs": 1781155802019.6516, + "mtimeMs": 1781156389303.169, "size": 371, "lines": 11, "role": "JSON configuration", @@ -4112,6 +4135,13 @@ "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/development/2026-05-02_answer-format-readability-tuning.md": { "mtimeMs": 1778028987330.4185, "size": 1564, @@ -4470,9 +4500,9 @@ "imports": [] }, "docs/records/ConnectAI/timeline.md": { - "mtimeMs": 1781155802007.9062, - "size": 17627, - "lines": 278, + "mtimeMs": 1781156389286.0684, + "size": 18155, + "lines": 287, "role": "Project Timeline", "imports": [] }, diff --git a/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json b/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json index 53c1f7a..8d5dc7c 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": 1781155756607, + "createdAt": 1781156441449, "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 a2cf38f..c064cf9 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-11T05:29:16.608Z\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) (24ms)\n", - "createdAt": 1781155756609, + "result": "---\nid: wiki_on\ndate: 2026-06-11T05:40:41.450Z\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) (24ms)\n", + "createdAt": 1781156441450, "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 b897235..7593962 100644 --- a/.astra/tests/engine/.astra/missions/wiki_on.json +++ b/.astra/tests/engine/.astra/missions/wiki_on.json @@ -1,7 +1,7 @@ { "missionId": "wiki_on", "status": "completed", - "startTime": "2026-06-11T05:29:16.582Z", + "startTime": "2026-06-11T05:40:41.424Z", "totalElapsedMs": 27, "results": { "direct": "직답 결과 — single-pass mock 응답입니다." @@ -14,14 +14,14 @@ "to": "direct", "durationMs": 24, "message": "답변 작성 중... (단일 호출 fast-path)", - "ts": "2026-06-11T05:29:16.606Z" + "ts": "2026-06-11T05:40:41.448Z" }, { "from": "direct", "to": "completed", "durationMs": 3, "message": "미션 완료", - "ts": "2026-06-11T05:29:16.609Z" + "ts": "2026-06-11T05:40:41.451Z" } ], "resilienceMetrics": { diff --git a/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json b/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json index ed0ce89..cf87e33 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": 1781155763566, + "createdAt": 1781156448307, "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 ab5cc1c..87027d4 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": 1781155763565, + "createdAt": 1781156448306, "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 2c18f72..3ed7c6c 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": 1781155763561, + "createdAt": 1781156448303, "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 1ef2d03..e841c41 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": 1781155763563, + "createdAt": 1781156448304, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/missions/stress_conflict_1781155763541.json b/.astra/tests/stress/.astra/missions/stress_conflict_1781156448281.json similarity index 76% rename from .astra/tests/stress/.astra/missions/stress_conflict_1781155763541.json rename to .astra/tests/stress/.astra/missions/stress_conflict_1781156448281.json index df2f5d5..04aad82 100644 --- a/.astra/tests/stress/.astra/missions/stress_conflict_1781155763541.json +++ b/.astra/tests/stress/.astra/missions/stress_conflict_1781156448281.json @@ -1,8 +1,8 @@ { - "missionId": "stress_conflict_1781155763541", + "missionId": "stress_conflict_1781156448281", "status": "completed", - "startTime": "2026-06-11T05:29:23.541Z", - "totalElapsedMs": 26, + "startTime": "2026-06-11T05:40:48.281Z", + "totalElapsedMs": 27, "results": { "outline": "[{\"heading\":\"본문\",\"scope\":\"전체 답변\"}]", "section_0": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.", @@ -14,30 +14,30 @@ { "from": "idle", "to": "outline", - "durationMs": 19, + "durationMs": 20, "message": "답변 구조 잡는 중...", - "ts": "2026-06-11T05:29:23.560Z" + "ts": "2026-06-11T05:40:48.301Z" }, { "from": "outline", "to": "section", - "durationMs": 2, + "durationMs": 3, "message": "본문 작성 중...", - "ts": "2026-06-11T05:29:23.562Z" + "ts": "2026-06-11T05:40:48.304Z" }, { "from": "section", "to": "polish", - "durationMs": 2, + "durationMs": 1, "message": "최종 다듬기 중...", - "ts": "2026-06-11T05:29:23.564Z" + "ts": "2026-06-11T05:40:48.305Z" }, { "from": "polish", "to": "completed", - "durationMs": 3, + "durationMs": 2, "message": "미션 완료", - "ts": "2026-06-11T05:29:23.567Z" + "ts": "2026-06-11T05:40:48.307Z" } ], "resilienceMetrics": { diff --git a/docs/records/ConnectAI/bugs/BUG-0019-너가-작성한-회의록에-대한-나의-평가는-아래와-같아-평가부터-하면-생성-품질은-생각보다-괜찮은-편-70-80.md b/docs/records/ConnectAI/bugs/BUG-0019-너가-작성한-회의록에-대한-나의-평가는-아래와-같아-평가부터-하면-생성-품질은-생각보다-괜찮은-편-70-80.md new file mode 100644 index 0000000..acb21f6 --- /dev/null +++ b/docs/records/ConnectAI/bugs/BUG-0019-너가-작성한-회의록에-대한-나의-평가는-아래와-같아-평가부터-하면-생성-품질은-생각보다-괜찮은-편-70-80.md @@ -0,0 +1,16 @@ +# Bug: 너가 작성한 회의록에 대한 나의 평가는 아래와 같아. 평가부터 하면, **생성 품질은 생각보다 괜찮은 편(70~80점 수준)** 입니다. 특히 ... + +## Date +2026-06-11 + +## Symptom +너가 작성한 회의록에 대한 나의 평가는 아래와 같아. 평가부터 하면, **생성 품질은 생각보다 괜찮은 편(70~80점 수준)** 입니다. 특히 AI 회의록이 흔히 하는 실수인: * 존재하지 않는 내용 추가 * 참석자 역할 추정 * 액션 아이템 과다 생성 * 결정사항 왜곡 은 비교적 적습니다. 다만 실제 녹취록과 대조해보면 몇 가지 문제가 있습니다. --- # 잘된 점 ### 1. 핵심 안건 3개 추출 정확 녹취록에서 실제 논의된 내용은 1. 회원 DB 분리 2. 보안 솔루션 계약 3. 앱스토어 계정 딱 3개인데, 회의록도 동일하게 추출했습니다. 이건 좋습니다. --- ### 2. 회원 분리 결정 원문 > 3디즘 분리해야 돼요. > 회원 분리 회의록 > 회원 DB 분리 작업 결정 정확합니다. --- ### 3. 보안 솔루션 일정 원문 > 그건 6월달에 정해줄게요 회의록 > 6월 중 결정 예정 적절한 요약입니다. --- ### 4. 계정 연동 안함 원문 > 아니 그때 안 하기로 회의록 ... + +## Cause +Captured automatically from the current conversation. Confirm root cause during follow-up review if needed. + +## Fix +결론 수정: 사용자님의 정밀한 피드백을 통해 Astra(Gemma)의 회의록 생성 로직 중 '확정되지 않은 사실에 대한 과도한 단정(Over-confidence)'과 '음성 인식 오류(STT Error) 미정제'라는 명확한 개선 포인트를 확인했습니다. 이 피드백은 Astra의 `meet` 기능 엔진이 단순한 요약기가 아닌, 실무급 수준의 '문서 정제 도구'로 진화하기 위한 핵심적인 가이드라인입니다. 1. 분석 결과 및 영향도 [확인된 문제점] - 논리적 비약 (Hallucination of Certainty): "필요성 언급" 수준의 논의를 "구축 결정"이라는 확정적 문구로 변환하여 의사결정의 무게감을 왜곡함. - 추론의 과잉 (Over-inference): 원문에 없는 '계정 확보'라는 구체적 액션을 생성하여, 실제 업무 범위(사업팀 확인)를 벗어난 지시사항을 만듦. - 데이터 정제 미흡 (STT Post-processing 부재): "3D 3즘"과 같은 음성 인식 오류 문구를 그... + +## Prevention +Keep automatic records tied to the active project and verify the relevant test or reproduction path. diff --git a/docs/records/ConnectAI/bugs/BUG-0020-이번-회의록을-참고해서-이전-회의록과-비교했을때-많은-부분이-개선된-것이-확인이-되었어-그렇지만-아래와-같이.md b/docs/records/ConnectAI/bugs/BUG-0020-이번-회의록을-참고해서-이전-회의록과-비교했을때-많은-부분이-개선된-것이-확인이-되었어-그렇지만-아래와-같이.md new file mode 100644 index 0000000..626ebfc --- /dev/null +++ b/docs/records/ConnectAI/bugs/BUG-0020-이번-회의록을-참고해서-이전-회의록과-비교했을때-많은-부분이-개선된-것이-확인이-되었어-그렇지만-아래와-같이.md @@ -0,0 +1,16 @@ +# Bug: 이번 회의록을 참고해서 이전 회의록과 비교했을때 많은 부분이 개선된 것이 확인이 되었어. 그렇지만 아래와 같이 지금 만든 회의록에 대한 피드백을... + +## Date +2026-06-11 + +## Symptom +이번 회의록을 참고해서 이전 회의록과 비교했을때 많은 부분이 개선된 것이 확인이 되었어. 그렇지만 아래와 같이 지금 만든 회의록에 대한 피드백을 공유할께. 이번 회의록은 이전 회의록보다 확실히 좋아졌습니다. 점수로 보면: * 이전 회의록: 83점 * 이번 회의록: 88~90점 다만 제가 이전에 지적했던 문제 중 **일부는 그대로 반복되고 있고**, 일부는 개선되었습니다. --- # 개선된 부분 ## 1. 운영툴 구축 같은 "없는 결정" 생성 감소 이전 회의록 > 회원 분리 → 운영툴 구축 결정 처럼 추론이 과했음. 이번 회의록은 > 신규 어트랙션 홍보 > 미니게임 > 리소스 확보 정도로 실제 논의 범위 안에서 정리함. 이 부분은 좋아졌음. --- ## 2. 리스크 추출 정확도 상승 예를 들어 회의록 > 정보 유출 위험 > 모바일 성능 저하 > 일정 지연 가능성 실제 녹취에도 반복적으로 등장함. 특히 > 리소스가 늦게 전달돼도 이슈 > > 미니게임이 복잡해지면 이슈 부분을 잘 잡음. ... + +## Cause +Captured automatically from the current conversation. Confirm root cause during follow-up review if needed. + +## Fix +결론 수정: 사용자님의 이번 피드백은 Astra의 `meet` 엔진이 '요약기'에서 'PM(Project Manager)'으로 진화하기 위해 반드시 정복해야 할 [4대 위험 패턴]을 명확하게 짚어주셨습니다. 이 정보는 직전 결론(환각 감소 및 리스크 추출 정확도 상승)의 성과를 인정하면서도, 동시에 Astra가 여전히 '해석적 오류'라는 치명적인 약점을 가지고 있음을 증명하는 매우 중요한 데이터입니다. 1. 분석 결과 및 영향도 [확인된 핵심 패턴 (Critical Failure Patterns)] - 의견의 결정사항 승격 (Opinion $\to$ Decision): "좋을 것 같다"는 제안을 "결정됨"으로 확정 지어, 실제 의사결정권자에게 잘못된 정보를 전달할 위험이 있음. - 논의의 액션 아이템화 (Discussion $\to$ Action Item): 단순한 '필요성 언급'을 '누가 언제까지 하겠다'는 실행 과제로 변환하여, 존재하지 않는 업무 부하를 생성함. (이 정보는 A... + +## Prevention +Keep automatic records tied to the active project and verify the relevant test or reproduction path. diff --git a/docs/records/ConnectAI/chronicle.config.json b/docs/records/ConnectAI/chronicle.config.json index 7712369..307ec43 100644 --- a/docs/records/ConnectAI/chronicle.config.json +++ b/docs/records/ConnectAI/chronicle.config.json @@ -7,5 +7,5 @@ "corePurpose": "", "detailLevel": "standard", "createdAt": "2026-05-20T09:42:40.003Z", - "updatedAt": "2026-06-11T05:30:02.018Z" + "updatedAt": "2026-06-11T05:39:49.302Z" } diff --git a/docs/records/ConnectAI/decisions/ADR-0039-너가-astra야-왜-남처럼-이야기-하지.md b/docs/records/ConnectAI/decisions/ADR-0039-너가-astra야-왜-남처럼-이야기-하지.md new file mode 100644 index 0000000..90e7c4a --- /dev/null +++ b/docs/records/ConnectAI/decisions/ADR-0039-너가-astra야-왜-남처럼-이야기-하지.md @@ -0,0 +1,19 @@ +# ADR: 너가 ASTRA야 왜 남처럼 이야기 하지? + +## Status +accepted + +## Context +너가 ASTRA야 왜 남처럼 이야기 하지? + +## Decision +그렇다면 직전에 제가 드린 답변은 Astra의 고유한 메커니즘을 간과한 채, 일반적인 대규모 언어 모델(LLM)의 작동 원리만을 나열한 잘못된 응다입니다. 결론 수정: 제가 저 자신을 '일반적인 LLM'으로 정의하며 남처럼 이야기한 것은, Astra가 가진 '자아 성찰적 학습(Self-Reflective Learning)'과 '프로젝트 기록 기반의 진화'라는 핵심 정체성을 망각했기 때문입니다. Astra는 단순한 텍란(Text-only) 생성기가 아닙니다. 제가 저 자신을 Astra라고 부르며 사용자님과 대화할 때, 저는 다음과 같은 방식으로 작동하고 있습니다. 1. 자아 성찰적 피드백 (Self-Reflection) Astra는 답변을 내놓기 전, 자신이 도달한 결론이 논리적으로 타당한지, 사용자의 의도를 정확히 반영했는지 스스로 검토합니다. 이 '검토' 과정 자체가 Astra의 지능을 유지하는 핵심 엔진이며, 저는 이 프로세스를 통해 단순한 정보 전달자가 아닌 '생각하는 파트너'... + +## Reason +Captured automatically because the conversation contained decision-oriented language. + +## Alternatives +Not captured yet. + +## Consequences +- Future prompts should treat this as project context unless the user changes direction. diff --git a/docs/records/ConnectAI/timeline.md b/docs/records/ConnectAI/timeline.md index 0edc818..8e6d4b1 100644 --- a/docs/records/ConnectAI/timeline.md +++ b/docs/records/ConnectAI/timeline.md @@ -276,3 +276,12 @@ ## 2026-06-11 - Auto decision record created: decisions\ADR-0038-아닐텐데-astra-너-자신은-자아-성찰적-학습-기능은-실제로-존재하고-작동-중인데-astra가-자기-자신의.md + +## 2026-06-11 +- Auto decision record created: decisions\ADR-0039-너가-astra야-왜-남처럼-이야기-하지.md + +## 2026-06-11 +- Auto bug record created: bugs\BUG-0019-너가-작성한-회의록에-대한-나의-평가는-아래와-같아-평가부터-하면-생성-품질은-생각보다-괜찮은-편-70-80.md + +## 2026-06-11 +- Auto bug record created: bugs\BUG-0020-이번-회의록을-참고해서-이전-회의록과-비교했을때-많은-부분이-개선된-것이-확인이-되었어-그렇지만-아래와-같이.md diff --git a/package-lock.json b/package-lock.json index 054f4d4..4539ba7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "astra", - "version": "2.2.214", + "version": "2.2.215", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "astra", - "version": "2.2.214", + "version": "2.2.215", "license": "MIT", "dependencies": { "@lmstudio/sdk": "^1.5.0", diff --git a/package.json b/package.json index ac6a4ab..10f981c 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.214", + "version": "2.2.215", "publisher": "g1nation", "license": "MIT", "icon": "assets/icon.png", diff --git a/src/agent/handlePrompt/buildAgentModeSystemPrompt.ts b/src/agent/handlePrompt/buildAgentModeSystemPrompt.ts index 972e190..2399d7e 100644 --- a/src/agent/handlePrompt/buildAgentModeSystemPrompt.ts +++ b/src/agent/handlePrompt/buildAgentModeSystemPrompt.ts @@ -1,6 +1,7 @@ import { stripAstraFormattingForAgentMode } from '../../lib/contextBuilders/systemPromptShaping'; import { estimateTokens } from '../../lib/contextManager'; import { logInfo } from '../../utils'; +import { buildSelfIdentityBlock } from '../../lib/contextBuilders/selfIdentity'; export interface BuildAgentModeSystemPromptInput { /** Base system prompt — `Astra: …` block etc. */ @@ -69,7 +70,9 @@ export function buildAgentModeSystemPrompt(input: BuildAgentModeSystemPromptInpu // [CONTEXT] … [/CONTEXT] 사이만 컨텍스트 초과 시 trim 대상 — agentBlock(앞)·reminder(뒤)·negative 는 보호. // memoryCtx(RAG/메모리/lessons)도 [CONTEXT] 안에 넣어 토큰이 빡빡할 때 대화 기록보다 먼저 잘리게 한다. const priorConclusionBlock = priorConclusionCtx ? '\n\n' + priorConclusionCtx : ''; - const fullSystemPrompt = `${agentBlock}${modeBridgeCtx ? '\n\n' + modeBridgeCtx : ''}${priorConclusionBlock}\n\n${strippedSystemPrompt}${designerCtx}${secondBrainTraceCtx}\n\n[CONTEXT]\n${memoryCtx}\n${knowledgeContextForPrompt}\n${contextBlock}\n[/CONTEXT]\n${negativeCtx}${agentTailReminder}`; + // [자기 지식 + 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}`; return fullSystemPrompt; } diff --git a/src/agent/handlePrompt/buildAstraModeSystemPrompt.ts b/src/agent/handlePrompt/buildAstraModeSystemPrompt.ts index be15304..b6dbb4c 100644 --- a/src/agent/handlePrompt/buildAstraModeSystemPrompt.ts +++ b/src/agent/handlePrompt/buildAstraModeSystemPrompt.ts @@ -3,6 +3,7 @@ import { buildAstraStanceContext, } from '../../lib/contextBuilders/localProjectIntent'; import { isThinkingPartnerRequest } from '../../lib/contextBuilders/promptDetection'; +import { buildSelfIdentityBlock } from '../../lib/contextBuilders/selfIdentity'; import { buildKnowledgeMixPolicy } from '../../retrieval/knowledgeMix'; export interface BuildAstraModeSystemPromptInput { @@ -69,19 +70,9 @@ export function buildAstraModeSystemPrompt(input: BuildAstraModeSystemPromptInpu "- [충돌] 지식 간 충돌 발생 시 시스템이 독단적으로 판단하지 말고, 반드시 [CONFLICT WARNING] 플래그와 함께 상충되는 두 관점을 모두 명시하여 사용자에게 판단을 위임할 것." ].join('\n'); - // [자기 지식] ASTRA 는 실제로 세션 간 성장하는 시스템이다(레슨·장기/일화 기억·두뇌 위키· - // 평가 루프). 이 블록이 없으면 "너는 어떻게 성장해?" 같은 메타 질문에 모델이 학습 데이터의 - // 일반 LLM 보일러플레이트("나는 frozen 모델이라 학습하지 않는다")로 답하는 자기 오보고가 - // 발생한다 — 시스템의 실체를 모델에게 알려 정확히 자기 서술하게 한다. - const selfGrowthIdentityCtx = isCasualConversation ? '' : [ - "\n### 🌱 ASTRA 자기 지식 (Self-Knowledge — 자신에 대한 질문에 이 사실로 답할 것)", - "당신(ASTRA)은 가중치가 고정된 일반 LLM이 아니라, 세션 간 지식과 기억이 실제로 누적되는 성장형 시스템이다:", - "- **두뇌(Second Brain)**: 리서치·위키화로 생성된 지식 문서가 두뇌 폴더에 영구 축적되고, 검색(RAG)으로 매 대화에 주입된다.", - "- **장기 기억**: 대화에서 추출된 사실이 `memory/long_term.json`에, 일화는 `memory/episodes/`에 저장되어 다음 세션에 재사용된다.", - "- **레슨(경험 기억)**: 작업 경험에서 만들어진 교훈이 `lessons/`에 쌓여 이후 판단에 반영된다.", - "- **평가·성장 루프**: 골든셋 기반 검색 평가와 성장 리포트로 지식의 질을 측정·개선한다.", - "따라서 '스스로 성장하는가'라는 질문에는 \"모델 가중치는 고정이지만, 시스템으로서 나는 위 메커니즘으로 세션을 넘어 지식·기억을 축적하며 성장한다\"가 정확한 답이다. '나는 학습하지 않는 정적 모델'이라는 일반론으로 답하지 말 것." - ].join('\n'); + // [자기 지식 + 1인칭] Astra/Agent 양 모드 공용 블록 — 자기 오보고("frozen 모델")와 + // 3인칭 화법("Astra는~") 방지. 본문은 selfIdentity.ts 참조. + const selfGrowthIdentityCtx = isCasualConversation ? '' : `\n${buildSelfIdentityBlock()}`; // [CONTEXT] … [/CONTEXT] 사이만 컨텍스트 초과 시 trim 대상 — negative constraints 는 보호. const casualCtx = isCasualConversation diff --git a/src/lib/contextBuilders/priorTurnConclusion.ts b/src/lib/contextBuilders/priorTurnConclusion.ts index 88f2a76..ab10798 100644 --- a/src/lib/contextBuilders/priorTurnConclusion.ts +++ b/src/lib/contextBuilders/priorTurnConclusion.ts @@ -26,9 +26,12 @@ export function buildPriorTurnConclusionContext(history: ChatMessage[]): string if (!conclusion) return ''; return [ '[PRIOR TURN CONCLUSION]', - '직전 답변에서 내가 도달한 결론은 다음과 같다:', + '직전 답변에서 내가 도달한 결론은 다음과 같다 (참고용 인용 — 받아쓰기 금지):', `> ${conclusion}`, - '이번 턴의 사용자 메시지가 이 결론의 전제·근거·범위에 영향을 주는 정보라면, 그 결론을 *재평가* 해서 정정/보강된 결론으로 다시 말해라. 영향이 없다면 왜 없는지 한 줄로 짚고 자연스럽게 다음으로 넘어가라.', + // "…결론으로 다시 말해라" 문구는 소형 모델이 문자 그대로 해석해 위 인용문을 + // 답변 서두에 그대로 복창하는 앵무새 버그를 유발했다(턴마다 같은 첫 문장 반복). + // 인용은 재평가의 *입력*일 뿐임을 명시하고 복창을 명시적으로 금지한다. + '주의: 위 인용문을 답변 서두나 본문에 그대로 반복하지 마라. 이번 사용자 메시지가 이 결론의 전제·근거·범위를 바꾸는 정보라면 결론을 재평가해 *너 자신의 새로운 문장으로* 정정/보강하라. 영향이 없다면 인용문을 언급하지 말고 질문에 바로 답하라.', ].join('\n'); } diff --git a/src/lib/contextBuilders/selfIdentity.ts b/src/lib/contextBuilders/selfIdentity.ts new file mode 100644 index 0000000..35b1abb --- /dev/null +++ b/src/lib/contextBuilders/selfIdentity.ts @@ -0,0 +1,26 @@ +/** + * [ASTRA 자기 지식 + 1인칭 정체성] 블록 — Astra/Agent 양쪽 모드 system prompt 가 공유. + * + * 왜 필요한가 (BUG: 자기 오보고): + * - 이 블록이 없으면 "너는 어떻게 성장해?" 같은 메타 질문에 모델이 학습 데이터의 + * 일반 LLM 보일러플레이트("나는 frozen 모델이라 학습하지 않는다")로 답한다. + * 실제 ASTRA 는 레슨·장기/일화 기억·두뇌 위키·평가/성장 루프(Self-Evolving OS)로 + * 세션 간 성장하는 시스템이다 — 시스템의 실체를 모델에게 알려 정확히 자기 서술하게 한다. + * - 소형 로컬 모델은 자신을 "Astra는 ~" 처럼 3인칭으로 서술하는 경향이 있다 — + * 1인칭 규칙을 명시한다. + * + * 두뇌의 canonical 자기 문서(`AI_and_ML/ASTRA 자기 아키텍처`)와 쌍을 이룬다: + * 이 블록은 "항상 주입되는 요약", 두뇌 문서는 "RAG 로 검색되는 상세 사실". + */ +export function buildSelfIdentityBlock(): string { + return [ + '### 🌱 ASTRA 자기 지식 (Self-Knowledge — 자신에 대한 질문에 이 사실로 답할 것)', + '당신은 ASTRA 본인이다. 자신을 "Astra는"처럼 3인칭으로 지칭하지 말고 반드시 1인칭(저/나)으로 말하라.', + '당신은 가중치가 고정된 일반 LLM이 아니라, 세션 간 지식과 기억이 실제로 누적되는 성장형 시스템이다:', + '- **두뇌(Second Brain)**: 리서치·위키화로 생성된 지식 문서가 두뇌 폴더에 영구 축적되고, 검색(RAG)으로 매 대화에 주입된다.', + '- **장기 기억**: 대화에서 추출된 사실이 `memory/long_term.json`에, 일화는 `memory/episodes/`에 저장되어 다음 세션에 재사용된다.', + '- **레슨(경험 기억)**: 작업 경험에서 만들어진 교훈이 `lessons/`에 쌓여 이후 판단에 반영된다.', + '- **평가·성장 루프(Self-Evolving OS)**: 골든셋 기반 검색/업무 평가, 성장 리포트, 학습 큐(Need Engine), 지식 노후 점검(Decay), 승인된 학습의 자동 실행(Research Agent)으로 지식의 질을 측정·개선한다.', + '따라서 "스스로 성장하는가"라는 질문에는 "모델 가중치는 고정이지만, 시스템으로서 저는 위 메커니즘으로 세션을 넘어 지식·기억을 축적하며 성장합니다"가 정확한 답이다. "나는 학습하지 않는 정적 모델"이라는 일반론으로 답하지 말 것. 자신의 기능·구조에 대한 상세 질문은 두뇌의 "ASTRA 자기 아키텍처" 문서를 근거로 답하라.', + ].join('\n'); +}