feat: v2.2.173-193 — 4인 팀 운영 슬래시 13개 + ASTRA 검증 엔진 6종

4인 팀 운영 슬래시 (v2.2.173~189):
- 일과 리듬: /morning, /evening, /weekly, /standup
- 트래커 (event-sourced .astra/*.jsonl): /runway, /customers, /hire
- 작업·결정: /task, /blocked, /onesie, /decisions
- 외부 출력: /draft, /feedback
- 분석: /cohort (MoM 추세)

ASTRA 추론·검색 엔진 (v2.2.183~192):
- v2.2.183 Conflict Surface — scoring.conflictSeverity 를 [CONFLICT WARNINGS] 블록으로
  서피스 + 교차-문서 발산(Jaccard) 감지
- v2.2.184 Chain-of-Verification — [VERIFICATION CHECKLIST] 답변 작성 전 그라운딩 자기 점검
  (instructional, strictMode 옵션)
- v2.2.185 Actionability Scoring — 최근 슬래시 명령 + 열린 파일 신호로 검색 결과 재가중
- v2.2.186 Temporal Markers + Distillation Loop — LongTerm/Episodic 만료 필터 +
  30일+ stale episode → LongTerm 'episode-digest' 승급 (수동 /memory distill + 세션 종료 자동)
- v2.2.187 Hierarchical Context Window + LLM Semantic Re-rank — 3-level 추상도 매칭
  + 토큰 예산 통과 후 LLM 1회로 의도-부합 재정렬 (opt-in)
- v2.2.190 Intent Clarification + Citation Trace — 모호 차원 감지 시 역질문 우선
  + 답변 끝 사용 출처 한 줄 정리
- v2.2.191 Post-hoc Self-Check — 답변 완료 후 별도 LLM 호출 1회로 답함/그라운딩/모순 평가,
  footer 한 줄로 표시 (opt-in, semantic re-rank 와 같은 안전 fallback 패턴)
- v2.2.192 Terminology Dictionary — .astra/glossary.md 사용자 편집 파일 + Term Check
  지침 통합 + /glossary init/path/reload
- v2.2.193 /help — 카테고리별 명령 목록 + 6종 verification 블록 현재 on/off

신규 모듈:
- src/retrieval/{conflictBlock,coveBlock,actionabilityScoring,hierarchicalLevel,
  semanticRerank,intentClarification,citationTrace,terminologyBlock}.ts
- src/memory/distillation.ts + types.ts 에 expiresAt/promoted/episode-digest 추가
- src/agent/postHocSelfCheck.ts
- src/features/{customers,feedback,hire,runway}/*.ts (event-sourced stores)

ASTRA 검증 5종 자동 주입 (buildAstraModeSystemPrompt, casual 모드 제외):
[INTENT CLARIFICATION GUIDANCE] (답변 시작 전) → [TERMINOLOGY DICTIONARY] +
[CONFLICT WARNINGS] + [VERIFICATION CHECKLIST] (작성 중) → [CITATION TRACE] (끝)
+ 6번째: Post-hoc Self-Check footer (답변 완료 후, opt-in)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-29 16:05:30 +09:00
parent f3439ddad5
commit 990ea0ae5f
46 changed files with 7172 additions and 136 deletions
+906
View File
@@ -1,5 +1,911 @@
# Astra Patch Notes
## v2.2.193 (2026-05-29)
### 📚 /help — 슬래시 명령 카테고리 브라우저 + 엔진 상태
누적된 슬래시 명령이 25개+. 사용자 발견 부담을 줄이기 위해 카테고리별 그룹핑 + ASTRA 추론 엔진 상태(6종 verification 블록 on/off) 한 화면.
**신규 `/help` 명령:**
- `/help` — 전체 명령 카테고리별 + 엔진 상태
- `/help <명령>` — 특정 명령의 짧은 설명 + 세부 도움말 안내
**카테고리 자동 그룹핑 (7개):**
- ☀️ **일과 리듬 (Daily Cycle)** — /morning · /evening · /weekly · /cohort · /standup
- 🏢 **4인 팀 운영 트래커** — /runway · /customers · /hire (event-sourced .jsonl)
- 📋 **작업·블로커·1:1** — /task · /blocked · /onesie · /decisions
- ✉️ **외부 출력·기록** — /draft · /feedback
- 🔬 **리서치·분석** — /research · /benchmark · /youtube · /blog · /wikify · /meet (Datacollect bridge)
- ⚙️ **시스템·메모리** — /memory · /glossary
- 📈 **주식·외부** — /stocks
- 🔌 **기타·외부 플러그인** — 위 카테고리에 안 잡히는 모든 명령 (외부 플러그인 자동 포함)
**ASTRA 추론 엔진 상태 (자동 표시):**
6종 verification 블록의 *현재 on/off* 를 한 화면. 각 블록의 system prompt 라벨과 *어느 시점* 에 동작하는지 표시:
- ✓ Intent Clarification — `[INTENT CLARIFICATION GUIDANCE]` (답변 시작 전)
- ✓ Terminology Dictionary — `[TERMINOLOGY DICTIONARY]` (답변 작성 중)
- ✓ Conflict Surface — `[CONFLICT WARNINGS]` (답변 작성 중)
- ✓ Chain-of-Verification — `[VERIFICATION CHECKLIST]` (답변 작성 중)
- ✓ Citation Trace — `[CITATION TRACE]` (답변 끝)
- ⊘ Post-hoc Self-Check — `footer` (답변 완료 후, opt-in)
추가 신호 (검색 단계): Recency · Actionability · Hierarchical Level · Semantic Re-rank (opt-in).
메모리 관리: Temporal Markers · Distillation Loop.
**동적 명령 목록:**
- `listSlashCommands()` 사용 — 외부 플러그인이 추가한 명령도 자동 노출
- 카테고리 매칭 함수 기반 — 새 명령 추가 시 매칭 함수만 업데이트하면 자동 분류
**신규 패키징:** `astra-2.2.193.vsix`.
---
## v2.2.192 (2026-05-29)
### 📖 Terminology Dictionary + Term Check (엔진 변경)
사용자 제안 "출력 품질 관리" 중 *진짜 새 가치* 만 추출 — Terminology Glossary 단일 메커니즘으로 #1(typo/용어 self-check) + #2(표준 용어집) 통합. **#3 sampling 튜닝은 이미 적용된 상태라 스킵**.
**감사 결과 (스킵한 이유):**
- #3 Temperature/Sampling 튜닝 → 이미 `modelTemperature=0.3`, `datacollectSynthesisTemperature=0.1`, `top_p=0.85`, `top_k=20`, `repeat_penalty=1.1`, `repairKoreanGlitches` 적용. 추가 튜닝 시 다양성↓ 위험.
- #1 별도 [Output Quality Control] 블록 → 시스템 프롬프트 비대 위험, *Glossary 블록 내 Term Check sub-clause* 로 통합이 깔끔.
---
**신규 메커니즘 — `.astra/glossary.md` 사용자 편집 파일**
- **위치**: `<workspace>/.astra/glossary.md` (설정으로 변경 가능)
- **형식**: 자유 markdown — ASTRA 는 형식 강제 안 함, 본문 통째로 시스템 프롬프트에 주입
- **권장 컨벤션** (`/glossary init` 템플릿):
- `## 표준 표기``**ASTRA** (X: astra) — 본 extension` 형태
- `## 영-한 표기 컨벤션` — Performance → 성능
- `## 금지·비추 표현`
- `## 슬래시 명령 표기`
- **캐시**: mtime 기반 — 사용자가 편집할 때만 다시 읽음 (매 turn 디스크 read 0회)
**시스템 프롬프트 블록 `[TERMINOLOGY DICTIONARY]`:**
1. 글로서리 본문 (cap 4000자, 초과분 잘림 안내)
2. **[Term Check — 답변 직전 자기 점검]** 5개 규칙 (사용자 제안 #1 통합):
- 표준 표기 우선, 변형·번역 임의 적용 금지
- 표기 흔들림 방지 (같은 답변 안에서 일관)
- 새 용어 도입 시 "새 용어: X" 명시
- 금지 표기 검증 + 재작성
- 표기 확신 없으면 "글로서리에 없어 일반 표기 사용" 명시
**신규 모듈: [terminologyBlock.ts](src/retrieval/terminologyBlock.ts)**
- `buildTerminologyBlock(opts)` — 글로서리 + Term Check 합쳐 블록 생성
- mtime cache 내장
- `GLOSSARY_TEMPLATE` — 권장 템플릿 export
**신규 슬래시 명령 `/glossary`:**
- `/glossary` — 상태 카드 (파일 존재/크기/cap/주입 여부/첫 5줄 미리보기)
- `/glossary path` — 절대 경로
- `/glossary init` — 권장 템플릿으로 초기 파일 생성 (이미 있으면 덮어쓰지 않음)
- `/glossary reload` — 캐시 비우기 (편집 직후 즉시 반영 강제)
- `/glossary help` — 가이드
**Wiring:**
- [memoryContext.ts](src/lib/contextBuilders/memoryContext.ts) — 매 turn 글로서리 블록 계산 → `turnCtx.terminology`
- [agent.ts](src/agent.ts) — turn reset 시 비움, system prompt build 시 전달
- [buildAstraModeSystemPrompt.ts](src/agent/handlePrompt/buildAstraModeSystemPrompt.ts) — `[CONTEXT]` 밖, `[INTENT CLARIFICATION]` 직후 (verification 블록 군집)
- Casual conversation 모드 비활성 (greeting 에 용어 강제 의미 없음)
**신규 설정 3개:**
- `g1nation.glossaryEnabled` (boolean, 기본 true) — 마스터
- `g1nation.glossaryPath` (string, 기본 `.astra/glossary.md`)
- `g1nation.glossaryMaxBodyLength` (number 500~20000, 기본 4000)
**ASTRA 검증 6종 (engine 변경 누적, v2.2.183~192):**
| # | 블록 | 시점 | 빌드 |
|---|---|---|---|
| INTENT | `[INTENT CLARIFICATION GUIDANCE]` | 답변 시작 전 | v2.2.190 |
| **TERMINOLOGY** | **`[TERMINOLOGY DICTIONARY]`** | **답변 작성 중 (용어)** | **v2.2.192** |
| CONFLICT | `[CONFLICT WARNINGS]` | 답변 작성 중 | v2.2.183 |
| COVE | `[VERIFICATION CHECKLIST]` | 답변 작성 중 | v2.2.184 |
| CITATION | `[CITATION TRACE]` | 답변 끝 | v2.2.190 |
| SELF-CHECK | footer (separate LLM) | 답변 완료 후 | v2.2.191 |
**신규 패키징:** `astra-2.2.192.vsix`.
---
## v2.2.191 (2026-05-29)
### 🔍 추론 신뢰도 — Post-hoc Self-Check (2-pass 검증, 엔진 변경)
v2.2.190 의 #1+#2 (Intent + Citation) 짝꿍. 답변 *완료 후* 별도 LLM 호출 1회로 사후 검증. CoVe (v2.2.184) 가 *답변 전* instructional self-check 이면, 이번엔 *답변 후* 객관 평가.
**설계 결정 — 비동기 후처리:**
- 기존 `_maybeEmitDevilRebuttal` (Devil Agent) 패턴 그대로 — main turn 종료 후 비동기, 실패해도 답변 보존
- 답변이 webview 에 렌더된 직후 self-check footer streamChunk 로 append
- 사용자는 답변 즉시 보고, 1~6초 후 self-check 결과 한 줄이 아래에 추가됨
**평가 3차원 (LLM 출력 JSON):**
1. `answersQuestion` — yes/partial/no — 답변이 질문에 직접 답하나
2. `grounded` — yes/partial/no/unknown — 답변이 제공된 출처에 근거하나
3. `contradiction` — none/minor/major — 답변에 논리 모순 있나
**Footer 형식:**
```
---
_🔍 **Self-check**: 답함=✓ · 근거=○ · 모순=없음 — 답변은 직접적이나 일부 주장이 모델 일반 지식 기반 _(2.4s · gemma2:2b)__
```
**신규 모듈: [postHocSelfCheck.ts](src/agent/postHocSelfCheck.ts)**
- `postHocSelfCheck(prompt, answer, sources, opts)` — LLM 호출 + JSON 파싱 + 안전 fallback
- `formatSelfCheckFooter(result, model)` — 마크다운 footer 한 줄
**안전망:**
- 응답 파싱 실패 / 타임아웃 / 오류 → 흐릿한 한 줄 footer ("⊘ failed: ...")
- 답변 자체는 영향 없음 (Devil Agent 와 동일 패턴)
- 짧은 timeout (기본 6초)
- 별도 빠른 모델 지정 가능
**Wiring:**
- [memoryContext.ts](src/lib/contextBuilders/memoryContext.ts) — 검색 후 `turnCtx.selfCheckSources` 에 상위 5개 chunk (title, excerpt) 저장
- [agent.ts](src/agent.ts) — Devil rebuttal 옆에 `_maybePostHocSelfCheck` 호출 추가, 결과를 streamChunk 로 append
**신규 설정 3개:**
- `g1nation.selfCheckEnabled` (boolean, **기본 false** — opt-in)
- `g1nation.selfCheckModel` (string, 비면 defaultModel)
- `g1nation.selfCheckTimeoutSec` (number 1~60, 기본 6)
---
**ASTRA 검증 5종 완전체 (engine 변경 누적):**
| # | 블록 | 시점 | 모드 |
|---|---|---|---|
| INTENT (v2.2.190) | `[INTENT CLARIFICATION GUIDANCE]` | 답변 시작 전 | instructional |
| CONFLICT (v2.2.183) | `[CONFLICT WARNINGS]` | 답변 작성 중 | instructional |
| COVE (v2.2.184) | `[VERIFICATION CHECKLIST]` | 답변 작성 중 | instructional |
| CITATION (v2.2.190) | `[CITATION TRACE]` | 답변 끝 | instructional |
| **SELF-CHECK (v2.2.191)** | footer 한 줄 | **답변 완료 후** | **separate LLM call** |
**활용 권장:**
- 기본 ON 4개 (INTENT/CONFLICT/COVE/CITATION) — 즉시 활용
- `g1nation.selfCheckModel` 에 빠른 모델 설정 (예: gemma2:2b)
- `g1nation.selfCheckEnabled = true` — opt-in. footer 한 줄로 답변 품질 즉시 검증
**신규 패키징:** `astra-2.2.191.vsix`.
---
## v2.2.190 (2026-05-29)
### 🎯 추론 신뢰도 — Intent Clarification + Citation Trace (엔진 변경)
사용자 제안 "Pre-inference Contextualization + Grounding" 중 ASTRA 에 *진짜 빈* 두 영역. ASTRA 검색 엔진 자체 변경 — 매 채팅 turn 자동 적용, 슬래시 명령 없음.
**감사 결과 (분리한 이유):**
- 제안 #1 Intent Clarification → **갭 명확**: ASTRA 는 항상 답을 시도, *모호하면 묻기* 메커니즘 없음
- 제안 #2 Citation Trace → CoVe Strict (v2.2.184) 와 부분 중복, *가벼운 always-on 형제* 로 추가
- 제안 #3 Self-Correction Loop → CoVe 가 *instructional 형태* 로 이미 구현, *post-hoc 2-pass* 는 v2.2.191 에서 별도 빌드
---
**#1 Intent Clarification — 모호 질의 역질문 (기본 ON)**
신규 모듈: [intentClarification.ts](src/retrieval/intentClarification.ts)
- **5개 의도 차원 휴리스틱**:
- `환경` — 배포/롤백 trigger + dev/prod 명시 검사
- `대상` — 고쳐/수정 trigger + 파일/모듈/`.ts` 검사
- `범위` — 리팩토링/정리 trigger + 전체/일부 검사
- `포맷` — 요약/보고서 trigger + 표/리스트/markdown 검사
- `마감` — 빨리/급함 trigger + 오늘/내일 검사
- **trigger 만 있고 specifier 없으면 missing**
- **Strictness 3-level**: low (2개+ missing), medium (1개+ missing, 기본), high (짧은 질의 추가 검사)
- **시스템 프롬프트 블록 `[INTENT CLARIFICATION GUIDANCE]`**: 모호 차원 + 권장 역질문 예시 + "사용자가 '추정해도 OK' 했으면 가정 명시 후 진행" 등 4개 규칙
**효과**: "배포해줘" → ASTRA 가 추측하지 않고 "dev 인가요 prod 인가요?" 한 줄 질문 먼저.
---
**#2 Citation Trace — 답변 끝 출처 한 줄 (기본 ON)**
신규 모듈: [citationTrace.ts](src/retrieval/citationTrace.ts)
- **CoVe Strict 와 차이**: CoVe Strict = 모든 사실 주장 뒤 inline `[S1]` (verbose). Citation Trace = 답변 끝 한 줄 정리 (가벼움).
- **시스템 프롬프트 블록 `[CITATION TRACE]`**: "답변 끝에 *출처:* 한 줄, 사용한 출처만 나열, 일반 지식이면 그 사실 명시" 등 5개 규칙
- **CoVe 와 시너지**: CoVe 가 `[S1]..[SN]` 라벨 제공, Citation 이 끝에 정리
**효과**: 답변 끝에 자동으로 `*출처:* file1.md · chunk-title2` 같은 한 줄 → 사용자 검증 가능, 할루시네이션 억제.
---
**Wiring (둘 다):**
- [memoryContext.ts](src/lib/contextBuilders/memoryContext.ts) — 검색 직후 두 블록 계산 → `turnCtx.intentClarification` / `turnCtx.citationTrace`
- [agent.ts](src/agent.ts) — turn reset 시 비움, system prompt build 시 전달
- [buildAstraModeSystemPrompt.ts](src/agent/handlePrompt/buildAstraModeSystemPrompt.ts) — `[CONTEXT]` 밖 주입. Intent block 은 다른 verification 블록보다 ** (모호하면 답변 자체를 안 만들어야 하므로). Citation 은 끝.
**신규 설정 3개:**
- `g1nation.intentClarificationEnabled` (boolean, 기본 true)
- `g1nation.intentClarificationStrictness` (low/medium/high, 기본 medium)
- `g1nation.citationTraceEnabled` (boolean, 기본 true)
**ASTRA 추론 엔진 검증 3종 (#2/#3/#1 시리즈와 함께):**
| 블록 | 시점 | 용도 |
|---|---|---|
| `[INTENT CLARIFICATION GUIDANCE]` | 답변 시작 전 | 모호하면 묻기 |
| `[CONFLICT WARNINGS]` (v2.2.183) | 답변 작성 중 | 충돌 출처 양측 명시 |
| `[VERIFICATION CHECKLIST]` (v2.2.184) | 답변 작성 중 | 근거 매핑 + 자기 점검 |
| `[CITATION TRACE]` | 답변 끝 | 사용 출처 한 줄 정리 |
**다음 (v2.2.191):**
- **#3 Post-hoc Self-Check** — 답변 *완료 후* LLM 호출 1회로 검증 (semantic re-rank 와 유사 패턴, 기본 OFF / opt-in)
**신규 패키징:** `astra-2.2.190.vsix`.
---
## v2.2.189 (2026-05-29)
### 📅 4인 팀 운영 12단계 — /weekly 주간 리뷰 카드 (대표용)
일 단위 리듬은 `/morning` · `/evening` 으로 단조. 주 단위 리듬은 비어 있었음 (`/standup weekly` 는 팀 공유용, 대표 전략 시야 아님). 그 갭을 메움.
**신규 `/weekly` 명령** (인자 없음, 매주 일요일/월요일 1회 실행 권장)
**`/standup weekly` 와 차이:**
- `/standup weekly`*팀에 공유* (멤버별 완료/진행/블로커, 슬랙 복붙)
- `/weekly`*대표가 본다* (cross-data delta, 회고 프롬프트)
**섹션 구성:**
**1. ✅ 이번 주 진척**
- **작업**: 멤버별 카운트 + 지난 주 대비 ↑↓→
- **📒 고객**: 신규/갱신/위험/이탈 이벤트 카운트 + 신규 MRR 합산
- **🎯 채용**: 신규 후보/단계 이동/합격 이벤트
- **💰 재무**: 주간 지출/수입/순 burn + 잔고 시작→끝 Δ
- **📋 결정**: 이번 주 Chronicle ADR (최대 5건)
**2. 🔄 지난 주 대비 (ISO week 기반 월~일)**
- 작업 / 신규 고객 / 이탈 / 순 burn / 채용 이벤트 — 각각 ↑↓→ delta
- 화살표 + (이번 X ← 지난 Y) 형식
**3. 🌅 다음 주 준비**
- 14일 내 갱신 (D-7 🔴 / D-14 🟡)
- 다음 주 마감 작업 카운트
- 정체 후보 (7일+ 미변동) top 3
**4. 💭 주간 회고 한 줄**
- 6개 회고 질문 풀, 주차 결정적 선택 (같은 주 = 같은 질문)
- 예: "이번 주 가장 중요한 결정은 무엇이었나? 다음 주에 어떤 결정을 미루면 안 되나?"
**ISO Week 기반 윈도우:**
- 월요일 00:00 ~ 일요일 23:59:59
- "YYYY-Wnn (M/D-M/D)" 라벨
**4인 팀 운영 누적 (1~12 — 일·주 리듬 완성):**
| 시간 | 명령 |
|---|---|
| 🌅 아침 (일) | `/morning` |
| 🌞 낮 | `/blocked`, `/task`, `/onesie @멤버` |
| 🌙 저녁 (일) | `/evening` |
| 📊 팀 공유 | `/standup` |
| 📅 **주말 (대표용)** | **`/weekly`** ⭐ |
| 📈 분기 | `/cohort` |
| 💰 트래커 | `/runway`, `/customers`, `/hire` |
| 📋 의사결정 | `/decisions`, `/draft`, `/feedback` |
**신규 패키징:** `astra-2.2.189.vsix`.
---
## v2.2.188 (2026-05-29)
### 📈 4인 팀 운영 11단계 — /cohort MoM 추세 분석
`/customers` + `/runway` 의 events 가 누적되니 *추세* 가 보임. 한 시점 스냅샷(`/morning` 같은) 이 아닌 *6~12개월 흐름* 으로 비즈니스 방향 검토. 회계 SaaS 의 board metric 의 미니 버전.
**신규 `/cohort` 명령:**
- `/cohort` — 최근 **6개월** 추세 (기본)
- `/cohort yearly` — 최근 12개월
- `/cohort <N>` — 최근 N개월 (1~24)
**섹션 구성:**
**1. 고객 & MRR 추이 (월별 테이블)**
| 월 | 신규 | 갱신 | 이탈 | MRR Δ |
- 누계: 신규 +N · 이탈 -M · 순 ±K
- MRR 순증 (추가 신규 MRR 만, 이탈 차감은 history 부재로 미반영)
- 월평균 신규/이탈 + 이탈/신규 비율 (단순 churn-rate 근사)
**2. 재무 추이 (월별 테이블)**
| 월 | 지출 | 수입 | 순 burn | 월말 잔고 |
- 6개월 누계
- 월평균 burn
**3. 💡 인사이트 한 줄 (자동 도출)**
- 🟢 최근 3개월 신규 가속 (이전 3개월 대비 +20%↑)
- 🟡 신규 둔화 (-20%↓)
- 🔴 burn 가속 (+30%↑)
- 🟢 매출 커버리지 80%+ → 흑자 임박
- 🟡 매출 커버리지 20% 미만 → 매출 기반 약함
**데이터 출처:**
- `<workspace>/.astra/customers.jsonl` (add/renew/churn timestamp 그룹핑)
- `<workspace>/.astra/runway.jsonl` (expense/revenue/snapshot 그룹핑)
**현 시점 한계 (의도적 단순화):**
- Churn MRR 감소 = 직전 mrr 추적 안 함 — 보수적으로 0 계산
- Update event 의 mrr 차이 = 0 (state 추적 없음)
- 향후 v2: customers store 에 monthly snapshot 추가하면 정확한 churn MRR 계산 가능
**4인 팀 운영 누적 (1~11단계):**
`/decisions` · `/onesie` · `/draft` · `/feedback` · `/blocked` · `/standup` · `/runway` · `/customers` · `/hire` · `/morning` · `/evening` · **`/cohort`** ⭐
**신규 패키징:** `astra-2.2.188.vsix`.
---
## v2.2.187 (2026-05-29)
### 🔍 Retrieval 의도 매칭 — Hierarchical + LLM Semantic Re-rank (엔진 변경)
사용자 제안 "지식 발굴 로직 강화" 중 *진짜 새 가치* 2개 적용. (제안의 Re-ranking 항목들 — Recency / Actionability / Conflict Check — 은 이미 v2.2.183~185 에서 완료. 제안자가 빌드 모름.)
**둘 다 ASTRA 검색 엔진 자체 변경 — 슬래시 명령 추가 없음, 매 채팅 turn 자동 적용.**
---
**#2 Hierarchical Context Window — 추상도 매칭 (기본 ON)**
신규 모듈: `src/retrieval/hierarchicalLevel.ts`
- **3-level 분류** (LLM 호출 없음, 결정적 휴리스틱):
- `concrete` — 코드/로그/디버그/실행 (folder hints: code, log, debug; title hints: fix, bug, error)
- `operational` — 작업/일정/운영/회의 (기본값)
- `strategic` — 전략/비전/방향/의사결정 (folder hints: strategy, vision, decision; title hints: plan, direction)
- **질의 분류**: 키워드 우열 — `'전략 검토'` → strategic, `'버그 고쳐'` → concrete
- **재가중 정책**:
- 같은 레벨 → × 1.15 (boost)
- 인접 레벨 (concrete↔operational, operational↔strategic) → 변화 없음
- 양 끝 mismatch (concrete↔strategic) → × 0.70 (penalty)
- **시점**: `RetrievalOrchestrator.retrieve()` 의 normalize 직후, 토큰 예산 직전 — 어떤 chunk 가 살아남는지에 영향
- **위치**: [hierarchicalLevel.ts](src/retrieval/hierarchicalLevel.ts) + retrieve() 파이프라인 stage ③-c
---
**#4 LLM Semantic Re-rank — 의도 매칭 (기본 OFF, 명시적 opt-in)**
신규 모듈: `src/retrieval/semanticRerank.ts`
- **로직**: 토큰 예산 통과한 `selectedChunks` 상위 K(기본 15) 를 LLM 한 번 호출로 의도 부합도 순 재정렬
- **프롬프트**: `[C1]..[CK]` 라벨 + 발췌문 → LLM 이 JSON `{"ranking":[3,1,5,...]}` 한 줄 출력
- **파싱 보호**: 응답 누락/중복/번호 오류 시 원순서 fallback. 타임아웃 시도 원순서 fallback. **재정렬 실패해도 검색 자체는 절대 실패 안 함.**
- **위험 관리**:
- 기본 OFF — `g1nation.semanticRerankEnabled` 명시 on 필요
- 짧은 timeout (기본 8초) — 초과 시 원순서
- 별도 빠른 모델 지정 가능 (`g1nation.semanticRerankModel`, 예: gemma2:2b) — 메인 모델 latency 보호
- **시점**: `memoryContext.ts` 에서 retrieve() 결과의 selectedChunks 를 비동기 재정렬 후 context string 빌드
- **효과**: LLM attention 은 컨텍스트 상단에 더 강함 → 의도 부합 chunk 가 상단 → 답변 품질↑
---
**신규 설정 5개:**
- `g1nation.hierarchicalReweightEnabled` (boolean, 기본 true)
- `g1nation.semanticRerankEnabled` (boolean, **기본 false** — opt-in)
- `g1nation.semanticRerankModel` (string, 비면 defaultModel)
- `g1nation.semanticRerankCandidateK` (number 2~30, 기본 15)
- `g1nation.semanticRerankTimeoutSec` (number 1~60, 기본 8)
---
**감사 결과 — 스킵한 제안 항목:**
- #1 Graph-based Retrieval → 스킵 (마크다운 wiki brain 에 NER+그래프 인프라 비용 큼, 가치 불확실)
- #3 Re-ranking 항목들 → 이미 v2.2.183~185 에 완료:
- Recency 가중 = scoring.ts recencyBoost
- Actionability = actionabilityScoring.ts (v2.2.185)
- Conflict Check = conflictBlock.ts + scoring.ts conflictMultiplier (v2.2.183)
**신규 패키징:** `astra-2.2.187.vsix`.
---
## v2.2.186 (2026-05-29)
### 🧠 메모리 라이프사이클 — Temporal Markers + Distillation Loop
사용자 제안 "정보의 계층화 + 생성 주기 관리" 중 *실제로 빈 곳* 2개에 집중. 제안의 절반은 이미 5-layer 로 구현돼 있어 *그 위에 라이프사이클 관리만 추가*.
**Part 1 — Temporal Markers (만료일)**
- `LongTermEntry` + `EpisodicEntry``expiresAt?: number` (epoch ms) 추가.
- 검색·context build 시 `expiresAt < now` 인 entry **자동 제외** — 만료 plan/decisions 가 stale 답변에 끼어드는 것 방지.
- `LongTermMemory.setExpiration(idOrPrefix, expiresAt)` API — 슬래시 명령에서 호출.
- 예: "Q3 2026 마케팅 계획" entry 에 `expiresAt = 2026-09-30` 설정 → 10월부터 검색 결과에서 자동 사라짐.
**Part 2 — Distillation Loop (stale → digest)**
- 신규 모듈: `src/memory/distillation.ts`
- 30일+ 지난 episodes → LongTerm `'episode-digest'` 카테고리로 승급. 원본은 `promoted=true` 마킹되어 검색에서 제외 (중복 노출 방지).
- 신규 LongTermCategory: `'episode-digest'` 추가.
- **LLM-less 설계 (v1)**: 기존 EpisodicEntry 의 title/summary/keyDecisions/topics 를 구조적으로 결합 — 비용 0, 결정적, 재현 가능.
- **자동 트리거**: 세션 종료 시 (마지막 실행 후 N일 경과 시만, 기본 7일 간격).
- **수동 트리거**: `/memory distill [age_days]`
- **Archive 모드 2종**:
- `'mark-promoted'` (기본): 플래그만, 파일 보존
- `'archive-file'`: 파일을 `memory/episodes/archive/` 로 이동
**신규 슬래시 명령 `/memory`**
- `/memory` — 현재 상태 (LongTerm/Episodic 카운트, 카테고리 분포, distillation 마지막 실행, 30일 내 만료 임박)
- `/memory distill [age_days]` — 수동 distillation (기본 30일 임계)
- `/memory expire <id-prefix> <YYYY-MM-DD>` — LongTerm entry 에 만료일 설정
- `/memory list-expiring [days]` — N일 내 만료 entry 목록 (기본 30)
- `/memory list-promoted` — 승급된 episodes (digest 형태로 LongTerm 에 살아 있음)
- `/memory help` — 명령어 가이드
**신규 설정 4개:**
- `g1nation.distillationEnabled` (boolean, 기본 true)
- `g1nation.distillationAgeThresholdDays` (number 1~365, 기본 30)
- `g1nation.distillationIntervalDays` (number 1~90, 기본 7)
- `g1nation.distillationArchiveMode` (mark-promoted/archive-file, 기본 mark-promoted)
**감사 결과 (스킵한 제안 항목):**
- L1 Working Memory → 이미 `ShortTermMemory.ts` 로 완료
- L2 Episodic → 이미 `EpisodicMemory.ts` 로 완료
- L3 unification (3 silo → 1 통합) → 스킵 (refactor 비용 > 가치, 작동 중)
- 자유 해시태그 시스템 → 스킵 (기존 카테고리 enum 으로 80% 커버)
- Conflict reconciliation 닫는 루프 → 추후 (UI 작업 + supersedeance 인프라 큼)
**신규 패키징:** `astra-2.2.186.vsix`.
---
## v2.2.185 (2026-05-29)
### 🎯 추론 품질 #1 — Actionability Scoring (맥락 가중치, 마무리)
사용자 피드백: "*단순히 키워드가 겹치는 정보가 아니라, 현재 작업의 상태와 직접적으로 연결된 지식에 더 높은 가중치를 부여*". 추론 품질 3단 시리즈의 마지막. #2 (Conflict Surface) + #3 (CoVe) 완성 위에 *검색 자체* 를 재가중하는 가장 깊은 변경.
**v1 신호 (사용자 선택):**
1. **최근 슬래시 명령**`slashRouter` 에 in-memory ring buffer 추가. 최근 10개 (중복 제거, 최신 우선). 명령 이름 (`/runway``runway`) 이 chunk 내용에 단어 경계 매치 시 boost.
2. **열린 파일 경로** — VS Code 활성 에디터에서 캡처.
- **Exact filePath 매치**: 가장 강한 boost (× 1.5)
- **파일명 매치**: `weights.openFileNameMatch` (기본 0.40)
- **부모 디렉터리 매치**: `weights.openFileParentDirMatch` (기본 0.20, 'src'/'lib' 제외)
- **확장자 의미 매치**: `weights.openFileExtMatch` (기본 0.10, e.g. `.ts` → 'typescript' 단어)
**점수 결합 (보수적):**
- `finalScore = baseScore × (1 + actionabilityScore × combinedWeight)`
- `combinedWeight` 기본 0.30 → actionability=1.0 인 chunk 는 30% boost
- TF-IDF 가 여전히 dominant — actionability 는 *동점 깨기* 역할
**신규 모듈: `src/retrieval/actionabilityScoring.ts`**
- `captureWorkStateSignals(recentCmds)` — 신호 수집
- `computeActionabilityScore(chunk, signals, weights)` — 0~1.0
- `applyActionabilityBoost(chunks, signals, weights)` — 배열 in-place 재가중
**Wiring:**
- `slashRouter.ts` — 명령 실행 직전에 `pushRecentSlashCommand(head)` 호출, ring buffer 갱신
- `getRecentSlashCommands()` export — memoryContext 가 읽음
- `RetrievalOrchestrator.retrieve()``normalizeScores` 직후, `selectWithinBudget` 직전에 actionability 적용 (어떤 chunk 가 token 예산을 살아남는지에 영향)
- `RetrievalOptions.workStateSignals` 신규 필드 — undefined 면 legacy
- `fusionLog` 에 boosted 개수 + 시그널 요약 기록 (디버그 footer 노출 가능)
**신규 설정 1개:**
- `g1nation.actionabilityEnabled` (boolean, 기본 true) — 마스터 스위치
**추론 품질 3단 시리즈 완성:**
| # | 로직 | 효과 | 위치 |
|---|---|---|---|
| **#2** | Conflict Surface | 충돌 출처 데이터 LLM 에 노출 | `conflictBlock.ts` |
| **#3** | CoVe | 답변 직전 자기 검증 체크리스트 | `coveBlock.ts` |
| **#1** | Actionability | 작업 상태 신호로 검색 재가중 | `actionabilityScoring.ts` |
**시너지:** Actionability 가 *어떤 출처가 답변에 포함되나* 를 개선 → CoVe 가 *그 출처로 어떻게 그라운딩하나* 를 지시 → Conflict Surface 가 *충돌 출처를 어떻게 처리하나* 를 명시. 검색 → 추론 → 응답 3단계 모두 verification 적용.
**향후 #1 v2 후보 (사용자 미선택, 추후 옵션):**
- 최근 7일 Chronicle ADR / decisions 매치 boost
- 최근 24시간 customers/hire/runway 이벤트 매치 boost
**신규 패키징:** `astra-2.2.185.vsix`.
---
## v2.2.184 (2026-05-29)
### 🧭 추론 품질 #3 — Chain-of-Verification (CoVe)
사용자 피드백: "*추론 결과가 나오기 직전, 이 결론이 확보된 지식(제2뇌)에만 근거하고 있는가? 를 스스로 질문하고 검증하는 로직*" — 할루시네이션 방지 + 그라운딩 명확화.
**설계 결정 — Instructional CoVe (v1):**
원논문 CoVe 는 2-pass (draft → verify → revise). 그러나 ASTRA local-first 라 추가 LLM 호출 비용 큼 + 같은 모델 self-verify 효과 제한적. → v1 은 *instructional* — 시스템 프롬프트에 명시적 검증 체크리스트 주입해 모델이 한 패스 안에서 "답변 작성 전" 그라운딩 점검을 *내재화* 하도록. 향후 strict 모드 확장 가능 (knob 준비).
**신규 모듈: `src/retrieval/coveBlock.ts`**
- `buildCoveChecklistBlock(chunks, userPrompt, options)` — [VERIFICATION CHECKLIST] 시스템 프롬프트 블록 생성.
- **체크리스트 구조:**
1. **근거 매핑 (Grounding Inventory)** — 상위 N 출처를 [S1]..[SN] 으로 라벨, 각 출처의 score + conflictSeverity + 발췌문.
2. **답변 직전 자기 질문 (Pre-Output Self-Check)** — 4개 질문 (그라운딩, 단정 톤 적정성, 구체적 액션 제시, [CONFLICT WARNINGS] 와 통합).
3. **STRICT 모드 (옵션)** — 모든 사실 주장 뒤 `[S1]` 형식 inline 인용 강제 (기본 off).
**Wiring:**
- `memoryContext.ts` — 검색 직후 CoVe 블록 계산 → `turnCtx.coveChecklist` 저장
- `agent.ts` — turn reset 시 비움, system prompt build 시 전달
- `buildAstraModeSystemPrompt.ts``[CONFLICT WARNINGS]` 다음, `[CONTEXT]` ** 에 주입 (token-truncation 보호)
- Casual conversation 모드 비활성
**신규 설정 3개:**
- `g1nation.coveEnabled` (boolean, 기본 true)
- `g1nation.coveTopSourcesCount` (number 1~15, 기본 5)
- `g1nation.coveStrictMode` (boolean, 기본 false) — inline citation 강제
**Conflict Surface 와의 시너지:**
- 둘이 보완: Conflict = "충돌 데이터 제공", CoVe = "그 데이터 어떻게 verify 할지 지시"
- 함께 켜면 (기본): 모델이 충돌 출처를 식별 → 양측 명시 → 출처 ID 표기 → 사용자 판단에 위임 (3-step 그라운딩)
**남은 작업 (#1):**
- **Actionability Scoring** — 현재 작업 상태(active slash command / 열린 파일 / 최근 ADR) 신호로 검색 재랭킹. 가장 큰 신규 설계.
**신규 패키징:** `astra-2.2.184.vsix`.
---
## v2.2.183 (2026-05-29)
### 🔀 추론 품질 #2 — Conflict Surface (모순 검증 로직 1단계)
ASTRA 의 `scoring.ts` 가 검색된 문서별로 `conflictSeverity` (NONE/LOW/MEDIUM/HIGH) 를 *이미 계산*하고 있었음 — 그런데 LLM 에게 *어느 출처가 충돌인지* 전달하지 않아 v4 정책의 "[CONFLICT WARNING] 플래그" 가 무용한 상태. 이번 빌드가 그 갭을 메움.
**신규 모듈: `src/retrieval/conflictBlock.ts`**
- `buildConflictWarningsBlock(chunks, options)` — [CONFLICT WARNINGS] 시스템 프롬프트 블록 생성.
- 두 종류 충돌 모두 surface:
1. **자기-신호 (self-flag)** — 출처 내부에서 충돌 키워드(반대/논란/vs 등) 감지된 경우
2. **교차-문서 발산 (cross-divergence)** — 같은 주제 ≥2 chunks 의 본문 Jaccard < 0.30 인 잠재 모순 쌍
**Wiring:**
- `memoryContext.ts``result.selectedChunks` 가 retrieval 완료 직후 conflict 블록 계산 → `turnCtx.conflictWarnings` 에 저장
- `agent.ts` — turn 시작 시 reset, system prompt build 시 인자로 전달
- `buildAstraModeSystemPrompt.ts``[CONTEXT]` ** 에 주입 (token-truncation 보호)
- Casual conversation 모드는 RAG 컨텍스트 자체를 안 쓰므로 충돌 경고도 생략
**프롬프트 지침 (LLM 에 명시):**
1. 답변에 위 출처 중 하나라도 사용한다면, 충돌 가능성을 명시
2. 어느 쪽이 옳다고 단정하지 말고, 사용자가 판단할 수 있도록 근거 분리 제시
3. 충돌이 답변과 무관하면 무시 가능 — 다만 무관 판단 자체도 한 줄로 기록
**신규 설정 3개:**
- `g1nation.conflictHighlightingEnabled` (boolean, 기본 true) — 마스터 스위치
- `g1nation.conflictSeverityThreshold` (low/medium/high, 기본 medium) — 자기-신호 최소 severity
- `g1nation.conflictCrossDocEnabled` (boolean, 기본 true) — 교차-문서 발산 감지 활성
**다음 (#3, #1 예정):**
- **#3 CoVe (Chain-of-Verification)** — 결론 직전 자기 검증 루프 (할루시네이션 방지)
- **#1 Actionability Scoring** — 검색 결과 재랭킹 시 현재 작업 상태 가중치 반영 (가장 큰 신규 설계)
**신규 패키징:** `astra-2.2.183.vsix`.
---
## v2.2.182 (2026-05-29)
### 🌙 4인 팀 운영 10단계 — /evening 하루 마무리 카드
`/morning` 의 짝. 하루 시작과 끝을 한 명령씩으로 단조. *오늘 무엇이 진척됐는지* 보고 → *내일 무엇을 준비할지* 확인 → *짧은 회고 한 줄* 로 마무리.
**신규 `/evening` 명령:**
- 단일 형태 — 인자 없음. 매일 저녁 한 번 실행.
**섹션 구성:**
**1. ✅ 오늘의 진척**
- **작업 완료** — 오늘 00:00 이후 completed 된 Google Tasks, 멤버별 그룹.
- **📒 고객 이벤트** — `.astra/customers.jsonl` 오늘 append (add/renew/risk/churn/note).
- **🎯 채용 이벤트** — `.astra/hire.jsonl` 오늘 append (stage 이동, offer, hire 등).
- **💰 재무 기록** — `.astra/runway.jsonl` 오늘 append (잔고/지출/수입).
**2. 🌅 내일 준비**
- 내일 마감 작업 (멤버별).
- 7일 내 갱신 — D-3 🔴 / D-7 🟡.
- 정체 후보 (7일+ 미변동) top 3.
**3. 🧭 회고 한 줄**
- 8개 회고 질문 중 *날짜 기반 결정적 선택* — 같은 날 재실행해도 동일 질문.
- 예: "오늘 가장 중요한 한 가지는 무엇이었나? 의도한 대로 됐나?"
- 답을 어디 적으면 좋은지 안내 (`/decisions` · `/feedback` · `/customers note` · `/hire note`).
**Tasks OAuth 실패 시:**
- "기록된 진척 없음" + Tasks 에러 메시지 별도 표시 — 다른 섹션은 정상 표시.
**4인 팀 운영 누적 (1~10단계 — 일과 사이클 완성):**
`/decisions` · `/onesie` · `/draft` · `/feedback` · `/blocked` · `/standup` · `/runway` · `/customers` · `/hire` · `/morning` · **`/evening`** ⭐
**일과 ritual:**
- 아침: `/morning` (긴급 + 액션 5)
- 낮: `/blocked` `/onesie @멤버` (필요 시)
- 저녁: `/evening` (진척 + 내일 + 회고)
**신규 패키징:** `astra-2.2.182.vsix`.
---
## v2.2.181 (2026-05-29)
### ☀️ 4인 팀 운영 9단계 — /morning 매일 아침 통합 대시보드
1~8단계로 만든 모든 트래커(runway / customers / hire / tasks / decisions) 의 핵심을 *한 명령*으로. CEO 의 아침 ritual — 6개 명령 안 치고 `/morning` 하나.
**신규 `/morning` 명령:**
- `/morning` — 전체 대시보드 (긴급 + 재무 + 고객 + 팀 + 채용 + 오늘의 액션)
- `/morning brief` — 짧은 버전 (긴급 + 액션 3개만, 30초 스캔용)
**섹션 구성:**
1. **🚨 긴급** — 런웨이 < 6개월, 위험 고객, 7일 내 갱신, 지연 작업, 정체 후보 — 자동 집계
2. **💰 재무** — 현금 / burn / 런웨이 신호등
3. **📒 고객** — 총 MRR + 활성/위험/이탈 + 7일 내 갱신 top 5
4. **👥 팀** — 지연/이번 주 작업 카운트 + 멤버별 지연 top 4
5. **🎯 채용** — 단계별 진행 한 줄 요약 + 정체 후보 top 3
6. **📋 오늘의 액션** — 위 데이터에서 자동 도출 top 5 (휴리스틱 우선순위)
**액션 도출 휴리스틱:**
- 우선순위: 런웨이 위험 > 위험 고객(MRR 큰 순) > 갱신 임박 > 지연 작업 > 정체 후보 > inbox 누적
- 각 액션은 *명시적 다음 행동* 포함 ("투자자 미팅", "갱신 의사 확인", "스크리닝 시간 확보" 등)
**데이터 부족 시 우아한 처리:**
- 각 섹션이 독립적으로 "데이터 없음 — `/runway cash` 로 시작" 안내.
- Tasks OAuth 실패해도 나머지 섹션 계속 표시.
**4인 팀 운영 누적 (1~9단계):**
`/decisions` · `/onesie` · `/draft` · `/feedback` · `/blocked` · `/standup` · `/runway` · `/customers` · `/hire` · **`/morning`** ⭐
**신규 패키징:** `astra-2.2.181.vsix`.
---
## v2.2.180 (2026-05-29)
### 👥 4인 팀 운영 8단계 — /hire 채용 파이프라인 트래커
4인 → 5인 이상 확장 시점. 후보자가 노션·스프레드시트·이메일에 흩어지지 않게 한 명령으로 본다. `/customers` 와 동일한 event-sourced 패턴.
**신규 `/hire` 명령 (서브명령 11개):**
- `/hire` — 파이프라인 대시보드 (역할별/단계별 현황, 정체 알림)
- `/hire add <이름> <역할>` — inbox 단계 신규 후보
- `/hire stage <이름> <새 단계>` — 단계 이동
- `/hire note <이름> <텍스트>` — 자유 메모
- `/hire offer <이름> <연봉> [입사일]` — 오퍼 발송 (단계=offer)
- `/hire hire <이름> [입사일]` — 입사 확정 (단계=hired)
- `/hire reject <이름> <사유>` — 거절 (회사 측)
- `/hire decline <이름> <사유>` — 후보 사양
- `/hire show <이름>` — 상세 + 이력 (부분 매치 OK)
- `/hire list [active/closed/단계명/역할]` — 필터 목록
- `/hire path` — 파일 위치
**기본 파이프라인:**
inbox → screened → interview → final → offer → accepted → hired
(터미널: rejected · declined)
**대시보드 핵심:**
- 진행 중 / 합격 / 종료 카운트
- **역할별 진행** (백엔드 N명 · 디자이너 M명) — 채용 균형 시야
- **단계별 후보** + 각자 정체 일수 (`⏰ N일 정체` — 7일 이상 미변동 시)
- 최근 합격 5명 (입사일 순)
**저장 — 로컬 only:**
- `<workspace>/.astra/hire.jsonl` (append-only 이벤트)
- 민감 정보(이름, 연봉, 거절 사유) 외부 안 보냄.
**4인 팀 운영 누적 (1~8단계):**
`/decisions` · `/onesie` · `/draft` · `/feedback` · `/blocked` · `/standup` · `/runway` · `/customers` · **`/hire`** ⭐
**신규 패키징:** `astra-2.2.180.vsix`.
---
## v2.2.179 (2026-05-28)
### 📒 4인 팀 운영 7단계 — /customers 고객사/MRR/갱신/위험 트래커
`/runway`*지출 쪽* 시야라면 `/customers`*수입 쪽*. Salesforce 없이도 4인 기업이 알아야 하는 모든 매출 정보 — MRR, 갱신 임박, 위험 고객 — 를 한 명령으로.
**Event-sourced 설계 (CRM 아님):**
- 모든 변경(add/update/renew/risk/churn/note) = append-only 이벤트.
- 현재 상태 = 같은 customerId 의 이벤트를 시간순 재생.
- 손상·실수 복구 쉬움 — .jsonl 한 줄만 지우면 그 이벤트만 무효화.
**신규 `/customers` 명령 (서브명령 10개):**
- `/customers` — 대시보드 (총 MRR, 활성/위험/이탈, 30일 내 갱신, 위험 MRR 비율)
- `/customers add <이름> <MRR> [갱신일] [요금제]` — 신규
- `/customers update <이름> mrr=… renewal=… plan=…` — 정보 수정
- `/customers renew <이름> <새 갱신일> [새 MRR]` — 갱신 처리 (active 복귀)
- `/customers risk <이름> <사유>` — 위험 표시
- `/customers churn <이름> <사유>` — 이탈 처리 (MRR 0 으로)
- `/customers note <이름> <텍스트>` — 자유 메모
- `/customers show <이름>` — 상세 + 이벤트 히스토리 (부분 매치 OK)
- `/customers list [active/risk/churned]` — 필터 목록
- `/customers path` — 파일 경로
**대시보드 핵심 지표:**
- 총 MRR + 연 환산 (자동)
- 활성/위험/이탈 카운트
- **위험 MRR 비율** — 전체 MRR 의 몇 %가 위험에 노출됐는지 (이 숫자 보고 우선순위)
- **30일 내 갱신** — D-7 🔴 / D-14 🟡 / D-30 🟢 신호등
- MRR 순 활성 고객 top 10
**금액 단위:** `200만` / `1.5억` / `300000` 모두 OK (한국식).
**갱신일:** `YYYY-MM-DD`.
**저장 — 로컬 only:**
- `<workspace>/.astra/customers.jsonl` (append-only 이벤트 로그)
- 민감 정보(고객사 이름, 매출) 외부 안 보냄.
**4인 팀 운영 누적 (1~7단계):**
`/decisions` · `/onesie` · `/draft` · `/feedback` · `/blocked` · `/standup` · `/runway` · **`/customers`** ⭐
**신규 패키징:** `astra-2.2.179.vsix`.
---
## v2.2.178 (2026-05-28)
### 💰 4인 팀 운영 6단계 — /runway 현금/소진율/런웨이 트래커
4인 기업 CEO 가 매일·매주 확인하는 가장 중요한 숫자 — *통장에 얼마, 한 달에 얼마 나감, 몇 개월 버틸 수 있나*. 회계 SaaS 연동 없이 한 명령으로 한 화면.
**신규 `/runway` 명령 (서브명령 7개):**
- `/runway` — 현재 상태 카드 (현금 / burn / 런웨이 + 위험 등급)
- `/runway cash <금액> [메모]` — 통장 잔고 스냅샷
- `/runway expense <금액> [메모]` — 지출 기록 (자동 burn 계산에 반영)
- `/runway revenue <금액> [메모]` — 수입 기록 (burn 상쇄)
- `/runway burn <월 금액>` — 월 소진율 수동 설정 (자동 계산보다 우선)
- `/runway log [N]` — 최근 N건 (기본 20, 최신순)
- `/runway path` — .jsonl 파일 위치
**금액 파싱 — 한국식 단위 그대로:**
- `5000만` / `1.5억` / `300000` / `1,500,000` / `10k` / `5m` 모두 OK.
**런웨이 위험 등급:**
- 🟢 6개월+ (안전)
- 🟡 3~6개월 (자금 계획 점검 권장)
- 🔴 3개월 미만 (즉시 조달/절감 필요)
- ♾️ 흑자 운영 (지출 ≤ 수입)
**Burn 계산 우선순위:**
1. `/runway burn` 으로 수동 설정한 값 (예측 가능, 계절성 무시)
2. 최근 30일 실적 (expense revenue, 30일 미만이면 일평균 × 30 환산)
**저장 — 로컬 only:**
- `<workspace>/.astra/runway.jsonl` (append-only, 사람 편집 가능)
- 민감 정보(현금 잔고) 외부 안 보냄 — ASTRA local-first.
**4인 팀 운영 누적 (1~6단계):**
`/decisions` · `/onesie` · `/draft` · `/feedback` · `/blocked` · `/standup` · **`/runway`** ⭐
**신규 패키징:** `astra-2.2.178.vsix`.
---
## v2.2.177 (2026-05-28)
### 📊 4인 팀 운영 5단계 — /standup 공유용 스탠드업 카드
`/blocked`*대표가 본다* (분석), `/standup`*팀에 공유한다* (소통). 같은 Tasks 데이터지만 다른 포맷·관점.
**신규 `/standup [daily/weekly/monthly]` 명령:**
- 기본: `weekly` (7일 윈도우). 옵션: `daily` (1일) · `monthly` (30일).
- **멤버별 그룹핑 + 3-row 표준 스탠드업 포맷**:
- ✅ 완료 (윈도우 내 완료, 최대 8건)
- 🎯 진행/예정 (다가오는 마감 + 마감 미정, 최대 6건)
- 🚧 블로커 (지연된 항목, 최대 5건)
- 멤버 정렬: 활동량(완료+진행+지연×2) 내림차순 — 가장 바쁜 사람 위.
- 부록: **이번 기간 결정 (Chronicle ADR)** 목록, 최대 10건.
- 출력: 단순 마크다운 — **슬랙·노션 그대로 복붙 가능**.
**`/blocked` vs `/standup`:**
- `/blocked`: 대표 시야 확보용. 멤버별 압박 요약 + `/onesie` 안내. 매일 아침.
- `/standup`: 팀 공유용. 표준 standup 3-row. 매일/매주 게시.
**4인 팀 운영 누적 (1~5단계):**
`/decisions` · `/onesie` · `/draft` · `/feedback` · `/blocked` · **`/standup`** ⭐
**신규 패키징:** `astra-2.2.177.vsix`.
---
## v2.2.176 (2026-05-28)
### 🚨 4인 팀 운영 4단계 — /blocked 전사 across 지연·블로커 뷰
대표의 *일일 아침 ritual* 도구. `/onesie` 가 멤버 단위라면 `/blocked` 는 전체 across 한 화면 — "오늘 어디 살펴봐야 하나" 즉시 잡힘.
**신규 `/blocked [@멤버]` 명령:**
- Google Tasks 전체 조회 후 owner 자동 추출(제목 `[멤버]` prefix · notes `담당: 이름` 패턴 모두 인식 — `/task``/meet` 양쪽 호환).
- **3개 섹션 자동 분류:**
- 🔴 지연 (마감 < 오늘) — 가장 오래 지연된 것부터, 최대 20건
- 🟡 이번 주 마감 (오늘~+7일) — 임박 순, 최대 15건
- ⚪ 마감일 없음 — owner 별, 우선순위 합의 대상, 최대 10건
- **멤버별 압박 요약** (전체 보기일 때) — 지연·이번주 가중치로 정렬 → 압박 큰 멤버부터 `/onesie @<멤버>` 안내.
- `@멤버` 인자 시 그 멤버만 (압축된 1인 뷰).
**사용 예:**
- `/blocked` → 매일 아침 전체 점검
- `/blocked @기획자` → 기획자만 압축 뷰
**4인 팀 운영 누적 (1~4단계 완성):**
- `/decisions` · `/onesie` · `/draft` · `/feedback` · **`/blocked`** ⭐
**신규 패키징:** `astra-2.2.176.vsix`.
---
## v2.2.175 (2026-05-28)
### 📥 4인 팀 운영 3단계 — /feedback 고객 신호 누적 + 패턴 분석
3단계: 슬랙·이메일·CS 채널에 흩어진 고객 피드백을 한 곳에 모으고 LLM이 자동 분류·패턴 분석. **ASTRA local-first 의 강점이 가장 살아나는 영역** — 민감 정보도 외부 전송 없이 로컬 처리.
**신규 모듈 [feedbackStore.ts](src/features/feedback/feedbackStore.ts):**
- 저장 위치: `<workspace>/.astra/customer-feedback.jsonl` (한 줄 = 한 항목, append-only, 사람이 직접 편집 가능).
- `FeedbackEntry` 타입: id / timestamp / text / source / categories / sentiment.
**신규 `/feedback` 4-mode 명령:**
- `/feedback <텍스트>` — 저장 + **LLM 자동 카테고리 분류** (1~3개 카테고리 + sentiment positive/neutral/negative). LLM 분류 실패해도 원본은 보존.
- `/feedback list [카테고리]` — 누적 목록 (최신순, 최대 20건). 카테고리 필터 가능.
- `/feedback summary` — 3건 이상 누적 시 LLM 패턴 분석 리포트 (카테고리 분포 + 감정 분포 + 반복 패턴 Top 3 + 추천 액션).
- `/feedback path` — 저장 파일 경로 표시.
**사용 예:**
- `/feedback 결제 흐름이 너무 복잡해서 중간에 포기했어요 - 김XX`
- `/feedback list 결제` → 결제 카테고리 누적 피드백만
- `/feedback summary` → 전체 패턴 리포트
**다음 단계 후보** (별도): `/blocked` 전사 블로커 뷰, /feedback 자동 주간 리포트 (매주 월요일).
**신규 패키징:** `astra-2.2.175.vsix`.
---
## v2.2.174 (2026-05-27)
### 🏢 4인 팀 운영 2단계 — /onesie 1:1 카드 + /draft 외부 커뮤니케이션 초안
2단계 묶음 (1단계는 v2.2.173 `@담당자` 태그 + `/decisions`). 단독 운영자(대표)의 주간 ritual 효율화.
**신규 `/onesie [멤버]` — 1:1 미팅 준비 카드:**
- Google Tasks API 전체 조회 후 멤버 필터 (제목 `[멤버]` prefix · notes `@멤버` · notes `담당: 멤버` 패턴 모두 인식).
- 자동 카테고리: **최근 30일 완료 / 지연 / 진행 중·다가오는 / 마감일 없음**.
- Chronicle ADR 에서 해당 멤버 언급된 결정 최신 5건 동시 표시.
- **자동 대화 토픽 제안** — 상태 신호(지연 多 → 블로커, 완료 0 → 시간 사용 확인, 마감일 없음 多 → 우선순위 합의)에서 유도.
- 사용 예: `/onesie 기획자` · `/onesie @디자이너` · `/onesie 개발`.
**신규 `/draft [유형] [요청]` — 외부 커뮤니케이션 초안:**
- 6개 유형: `email` · `slack` · `blog` · `newsletter` · `investor-update` · `proposal`.
- 각 유형별 분량/구조/톤 가이드 자동 적용.
- 신규 설정 **`g1nation.teamVoiceGuide`** (multilineText) — 팀 보이스 가이드를 한 번 저장하면 모든 초안에 자동 반영.
- 사용 예: `/draft email 김 대표님께 미팅 일정 조율 요청, 다음 주 가능 시간 3개 제안`
**토대 — `listTasks` Google Tasks API 조회:**
- [tasksApi.ts](src/features/calendar/tasksApi.ts): `listTasks(context, {showCompleted, maxResults})` — 신규 `ListedTask` 타입 (id/title/status/due/completed/notes).
- /onesie 외 향후 `/blocked`, 진행률 리포트 등에 재활용 가능.
**신규 패키징:** `astra-2.2.174.vsix`.
---
## v2.2.173 (2026-05-27)
### 🏢 4인 팀 운영 — @담당자 태그 + /decisions 결정 검색
4인 단독 운영 모드(대표가 모든 데이터 입력 + ASTRA가 조회·합성·재활용 담당)의 두 가지 토대 기능.
**`/task``@담당자` 태그 추가:**
- 첫 토큰이 `@` 로 시작하면 owner 로 파싱 → 제목 앞에 `[담당자]` prefix 자동 추가.
- 사용 예: `/task @기획자 스펙 1차 정리 26/06/01 26/06/05` → Tasks/Calendar 양쪽에 `[기획자] 스펙 1차 정리` 로 표시.
- 노트에도 `담당: @기획자` 한 줄 자동 기록 → `/decisions` 가 grep 으로 찾을 수 있음.
**신규 `/decisions [키워드] [@담당자]` — Chronicle ADR 검색:**
- 이미 chronicle 이 쌓고 있는 결정 기록(`<recordRoot>/decisions/ADR-NNNN-*.md`)을 키워드 + 담당자로 검색.
- 모든 등록된 chronicle 프로젝트 일괄 스캔, 최신순, 최대 20건.
- 출력: 제목 + 날짜 + 프로젝트 + 키워드 주변 스니펫 + 파일 경로.
- 사용 예: `/decisions 환불 정책` · `/decisions @기획자` · `/decisions 결제 @개발`
- 인자 없이 실행 시 도움말 표시.
**다음 단계 후보** (별도 작업): `/onesie [멤버]` — 1:1 미팅 준비 카드, `/draft [유형]` — 외부 커뮤니케이션 초안.
**신규 패키징:** `astra-2.2.173.vsix`.
---
## v2.2.172 (2026-05-27)
### 🎛️ /meet — 기본값을 Tasks 단독 등록으로 변경 (중복 방지)
- **`g1nation.meetUsesCalendar` 기본값 `true``false`.** Tasks 도 Calendar 사이드바에 같이 보이므로 둘 다 켜져 있으면 동일 항목이 중복 노출(일정 + 할 일 각 1건씩)되던 문제 해결.