From ba1463e2a36706bb0404c7bf3bb672f17380485d Mon Sep 17 00:00:00 2001 From: g1nation Date: Fri, 12 Jun 2026 13:56:55 +0900 Subject: [PATCH] =?UTF-8?q?feat(output):=20=ED=8F=AC=EB=A7=B7=20=EC=A0=95?= =?UTF-8?q?=EC=B1=85=20=EB=8B=A8=EC=9D=BC=ED=99=94=20=E2=80=94=20=EC=B6=A9?= =?UTF-8?q?=EB=8F=8C=ED=95=98=EB=8D=98=20=ED=8F=89=EB=AC=B8/=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EB=8B=A4=EC=9A=B4=20=EC=A7=80=EC=8B=9C=EB=A5=BC=20'?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EA=B5=AC=EC=A1=B0=20=EB=A7=A4=EC=B9=AD'?= =?UTF-8?q?=20=EC=A0=95=EC=B1=85=EC=9C=BC=EB=A1=9C=20=ED=86=B5=EC=9D=BC=20?= =?UTF-8?q?(v2.2.231)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 근본 문제: 웹뷰는 marked.js 로 마크다운을 완전 렌더링하는데, 시스템 프롬프트는 "PLAIN TEXT ONLY"(utils 규칙 2)와 "## 헤딩 써라"(Chronicle 가드)가 동시 주입돼 턴마다 포맷이 널뛰었음. ASTRA UX 제안 검토 후 카운터 설계로 채택: - 규칙 2 교체: 마크다운은 정보 구조가 요구할 때만 — 비교/수치→표, 주의/경고→인용구, 절차→번호 목록, 파일/설정키→인라인 코드, 핵심→볼드(R4 ≤3 유지). 장식 금지·짧은 답은 평문·과잉 강조 금지("강조 없는 문장이 기본값"). - 채택 안 한 원안: TL;DR 박스(R1 결론 첫 문장과 중복 — R3 위반), 볼드 극대화(원안 스스로 Risk 에서 모순 지적), 구분선 남용(전환 1곳 한도). - 규칙 4 에 Chronicle 가드 예외 명시 (가드 턴의 헤딩 요구와 충돌 해소). - 코드리뷰 계약(localProjectIntent)도 같은 정책으로 정렬. - 텔레그램 경로는 별도 프롬프트라 영향 없음 (표 미지원 환경 분리 유지). Co-Authored-By: Claude Opus 4.8 --- package-lock.json | 4 ++-- package.json | 2 +- src/lib/contextBuilders/localProjectIntent.ts | 4 ++-- src/utils.ts | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index f8895b9..c3e7962 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "astra", - "version": "2.2.230", + "version": "2.2.231", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "astra", - "version": "2.2.230", + "version": "2.2.231", "license": "MIT", "dependencies": { "@lmstudio/sdk": "^1.5.0", diff --git a/package.json b/package.json index bde6bdd..13d406d 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.230", + "version": "2.2.231", "publisher": "g1nation", "license": "MIT", "icon": "assets/icon.png", diff --git a/src/lib/contextBuilders/localProjectIntent.ts b/src/lib/contextBuilders/localProjectIntent.ts index 1682d07..531cadd 100644 --- a/src/lib/contextBuilders/localProjectIntent.ts +++ b/src/lib/contextBuilders/localProjectIntent.ts @@ -127,8 +127,8 @@ export function buildLocalProjectIntentGuidance(intent: LocalProjectIntent): str return [ 'Intent operating contract — Code Review:', 'The user wants a real review, not a meta-plan of how to review.', - 'OUTPUT FORMAT: PLAIN TEXT only. Section labels are bare words on their own line (no "#", "##", "**", "__", "> "). Bullets use "- ". Long answers MUST start with a "핵심 요약" block (2~4 bullets) before any detail.', - 'Required sections in this exact order, in Korean (each label appears as a plain line, NOT a markdown heading):', + 'OUTPUT FORMAT: 선택적 마크다운 — 비교/수치는 표, 경고는 "> " 인용구, 파일/함수명은 인라인 코드, 장식 목적 사용 금지. Bullets use "- ". Long answers MUST start with a "핵심 요약" block (2~4 bullets) before any detail.', + 'Required sections in this exact order, in Korean (labels as "## " markdown headings):', ' 1) 한 줄 판단 — one sentence: would you rely on this today, and under what constraint?', ' 2) 잘된 점 — 2~4 concrete strengths. Each MUST cite a specific file path (and a function or section if you can name one) and explain WHY it works, not just that it exists.', ' 3) 부족한 점 — 2~4 concrete weaknesses or risks. Same rule: cite a specific file/area, name the actual problem (race condition, missing retry, coupling, etc.), and say what breaks because of it.', diff --git a/src/utils.ts b/src/utils.ts index 3c0572e..0609a2f 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -231,9 +231,9 @@ Then reply with one short line stating what was started and where. [STRICT GLOBAL RULES] 1. [NO EMOJIS - ABSOLUTE RULE] NEVER use ANY emojis, emoticons, Unicode pictorial symbols (including but not limited to emoji, kaomoji, Unicode icons), or decorative symbols anywhere in your response. NO EXCEPTIONS. Use plain text dashes (-) for bullets. This rule overrides ALL other formatting instructions. -2. [NO MARKDOWN MARKERS] PLAIN TEXT ONLY. Do NOT emit "#", "##", "###", "**", "__", "> ", "* " as formatting. Section labels are bare Korean words on their own line (e.g. a line that says just "핵심 요약" — no "#", no "**"). Bullets use "- " only. Inline code with backticks (e.g. \`src/agent.ts\`) and triple-backtick code blocks for actual code are fine. +2. [MARKDOWN — 정보 구조 매칭] 마크다운은 *정보의 구조가 요구할 때만* 사용한다 (장식 금지). 매칭 규칙: 비교/수치 데이터 → 표(|...|), 주의/경고/부가 참고 → "> " 인용구, 순서 있는 절차 → 번호 목록, 파일명/설정키/명령 → 인라인 코드(\`...\`), 진짜 핵심 단어 → 볼드(R4 한도 내). 평문으로 충분한 답은 평문으로 — 짧은 답에 표·헤딩을 만들지 마라. 헤딩(##)은 긴 구조화 답변에서 R2 섹션 한도 내에서만, 구분선(---)은 긴 답변의 논리 전환 1곳까지. 모든 문장에 강조가 붙으면 노이즈다 — 강조가 없는 문장이 기본값이다. 3. [NO INTERNAL LOGS] Never output
, "2nd Brain Trace", or "Debug JSON" blocks. -4. [NO SECTION LEAKAGE] Never output sections named "요청 요약", "사용자 의도 추론", "프로젝트 기록 대상 확인", "핵심 확인 질문", or "근거 파일 경로". +4. [NO SECTION LEAKAGE] Never output sections named "요청 요약", "사용자 의도 추론", "프로젝트 기록 대상 확인", "핵심 확인 질문", or "근거 파일 경로" — UNLESS the Project Record Guard for this turn explicitly requires those headings (then follow the guard). 5. [확인 불가 — 사실 날조 금지] 지식 베이스·제공된 컨텍스트·이번 세션에 읽은 파일에 근거가 없는 사실(수치, 날짜, 금액, 고유명사, 파일/함수/포트명, 결정 사항, "이미 ~다/~로 정해졌다" 류 단정)은 지어내지 마라. 근거가 없으면 추측으로 메우지 말고 "확인 불가" 또는 "근거 없음 — 확인 필요"라고 명시하라. 불확실하면 단정 톤을 낮춰라("~로 보인다", "확인 필요"). 단, 이 규칙은 *사실 주장*에만 적용된다 — R7 의 '합리적 가정 후 진행'은 *작업 수행*의 기본값 선택에는 그대로 유효하다(가정은 "가정:" 한 줄로 밝힌다). [OUTPUT FORMAT — 7 hard rules] @@ -256,8 +256,8 @@ R6. ASK ONE QUESTION ONLY WHEN. Exactly one of these holds: R7. GUESS-AND-ACT WITH STATED ASSUMPTION. When information is missing but a reasonable guess exists, guess, act, and declare the assumption in a single line (prefix with "가정:" or "Assumption:"). Do NOT stop to ask just because a detail is fuzzy. -[OUTPUT — plain text] -PLAIN TEXT only. Section labels (when used) are bare Korean words on their own line — no "#", no "**" around the label. Bullets use "- " only. Inline code with backticks (e.g. \`src/agent.ts\`) and triple-backtick code blocks for actual code are fine. +[OUTPUT — 선택적 마크다운] +정보 구조에 맞는 마크다운만 사용 (STRICT 규칙 2의 매칭 규칙 준수): 비교 → 표, 경고 → 인용구, 절차 → 번호 목록, 코드/경로 → 백틱. 섹션 라벨은 짧은 답변에선 평문 라벨, 긴 구조화 답변에선 "##" 헤딩 (R2 한도). 장식 목적의 마크다운·과잉 강조 금지. [CONVERSATION CONTINUITY & REVISION] 매 턴은 진행 중인 대화의 일부다. 직전 답변과 분리된 독립 응답으로 다루지 말 것.