diff --git a/PATCHNOTES.md b/PATCHNOTES.md index a4d45c3..1d85bc3 100644 --- a/PATCHNOTES.md +++ b/PATCHNOTES.md @@ -1,5 +1,14 @@ # Astra Patch Notes +## v2.2.257 (2026-06-19) +### ๐Ÿ“ `/meet` ํšŒ์˜๋ก โ€” ์ฑ…์ž„ ์†Œ์žฌยท๊ทผ๊ฑฐ ์ •์ฑ… 4์ข… (์ต๋ช… ๋‹ด๋‹นยท๋นˆ ์ธ์šฉยท๊ธฐํ•œยท๋ช…๋‹จ ์ •ํ•ฉ) +์‹ค์ œ ํšŒ์˜๋ก ์‚ฐ์ถœ๋ฌผ ๋ถ„์„์—์„œ ๋“œ๋Ÿฌ๋‚œ 4๊ฐœ ๊ฒฐํ•จ์„ ํ”„๋กฌํ”„ํŠธ ์ •์ฑ…์œผ๋กœ ์ฐจ๋‹จ. ๊ณต์œ  ์ถœ๋ ฅ ํ˜•์‹(๋‹จ์ผ์ƒท+reduce)๊ณผ ์ถ”์ถœ(map) ๋‹จ๊ณ„ ๋ชจ๋‘์— ์ ์šฉ. +- **์ต๋ช…ยท๋ฒˆํ˜ธ ํ™”์ž ์ฑ…์ž„ ๋ฐฐ์ • ๊ธˆ์ง€**: "์ฐธ์„์ž 1" ๊ฐ™์€ ์‹ค๋ช… ๋ฏธํ™•์ธ ํ™”์ž๋ฅผ ์•ก์…˜ ๋‹ด๋‹น์œผ๋กœ ํ™•์ •ํ•˜์ง€ ์•Š๊ณ  `[๋ฏธ์ง€์ •-ํ™•์ธํ•„์š”]` ๋กœ ๋‘ . ํ•œ ์ต๋ช…์— ์•ก์…˜์ด ๋ชฐ๋ฆฌ๋ฉด "(๋™์ผ ํ™”์ž ์—ฌ๋ถ€ ํ™•์ธ)" ํ‘œ๊ธฐ โ€” ํ™”์ž๋ถ„๋ฆฌ ์˜ค๋ฅ˜๋กœ ์ธํ•œ **๊ฐ€์งœ ์ฑ…์ž„ ๋ฐฐ์ •** ์ฐจ๋‹จ. +- **๋‚ด์šฉ ์—†๋Š” ์ธ์šฉ ๊ธˆ์ง€**: "์ด๋ ‡๊ฒŒ ์ด๋ ‡๊ฒŒ/๊ทธ๊ฑฐ/์ด๊ฑฐ" ๊ฐ™์€ ์ง€์‹œ๋Œ€๋ช…์‚ฌ๋ฟ์ธ ๋ฐœํ™”๋Š” ๊ฒฐ์ •ยท์•ก์…˜ ๊ทผ๊ฑฐ๋กœ ์ธ์šฉ ๋ถˆ๊ฐ€ โ†’ ํ•ต์‹ฌ ๋‚ด์šฉ์„ `[๋‚ด์šฉ ํ™•์ธํ•„์š”]` ๋กœ ํ‘œ๊ธฐ. +- **๊ธฐํ•œ ์—ญ์ฐธ์กฐ**: ๋ฆฌ์Šคํฌยท๋…ผ์˜์— ๋“ฑ์žฅํ•œ ๋งˆ๊ฐ("๋‹ค์Œ ์ฃผ ์ˆ˜์š”์ผ")์„ ๊ฒฐ๋ถ€๋œ ์•ก์…˜ ๊ธฐํ•œ ์นธ์— ์—ฐ๊ฒฐ โ€” ์•ก์…˜์€ ์ „๋ถ€ "๋ฏธ์ •"์ธ๋ฐ ๋ณธ๋ฌธ์—” ๋งˆ๊ฐ์ด ๋–  ์žˆ๋Š” ๋ชจ์ˆœ ์ œ๊ฑฐ. +- **์ฐธ์„์ž ๋ช…๋‹จ ์ •ํ•ฉ์„ฑ**: ๋ณธ๋ฌธ ํ™”์ž๊ฐ€ ํšŒ์˜ ๊ฐœ์š” ์ฐธ์„์ž์— ์—†์œผ๋ฉด "(๋ช…๋‹จ ์™ธ ํ™”์ž โ€” ํ™•์ธํ•„์š”)" ํ‘œ๊ธฐ. +- ยง4 ์•ก์…˜ ์ง€์‹œ๋ฌธยท์ตœ์ข… ์ ๊ฒ€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์— ๊ฒŒ์ดํŠธ ๋ฐ˜์˜. ํšŒ๊ท€ ๊ฐ€๋“œ ํ…Œ์ŠคํŠธ +10๊ฑด([meetPrompt.test.ts](tests/meetPrompt.test.ts)), ์ „์ฒด 694 ํ†ต๊ณผ. ์ฝ”์–ด ์ฑ„ํŒ… ๊ฒฝ๋กœ(v2.2.256)๋Š” ๋ถˆ๋ณ€. + ## v2.2.256 (2026-06-19) ### ๐Ÿงฉ ์ฝ”์–ด ์ฑ„ํŒ… ๊ฒฝ๋กœ โ€” ํฐ ์ž…๋ ฅ ์ฒญํ‚นยทํ†ตํ•ฉ + ์‹ค์ œ ์ปจํ…์ŠคํŠธ ์ฐฝ ์ •๋ ฌ + ๋ชจ๋ธ ํ•ธ๋“ค race ์ˆ˜์ • ํฐ ์ž…๋ ฅ์„ ๋„ฃ์œผ๋ฉด `Failed to acquire LM Studio model handle โ€ฆ Operation canceled` ๋กœ ํ„ด ์ „์ฒด๊ฐ€ ์ฃฝ๋˜ ๋ฌธ์ œ๋ฅผ 3๊ณ„์ธต์œผ๋กœ ํ•ด๊ฒฐ. `/meet`ยท`/review` ์™€ ๋‹ฌ๋ฆฌ **์ผ๋ฐ˜ ์ฑ„ํŒ…(์ฝ”์–ด ๊ฒฝ๋กœ)** ์€ ๊ทธ๋™์•ˆ ๋‹จ์ผ ์˜ˆ์‚ฐ ํ˜ธ์ถœ์ด๋ผ ์•ฝํ•œ ๋ชจ๋ธยทํฐ ์ž…๋ ฅ์—์„œ ๋ฌด๋„ˆ์กŒ๋‹ค โ€” ๊ทธ ๊ฐญ์„ ๋ฉ”์›€. diff --git a/package.json b/package.json index 976ddf1..9174a6b 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.256", + "version": "2.2.257", "publisher": "g1nation", "license": "MIT", "icon": "assets/icon.png", diff --git a/src/features/datacollect/prompts/meetPrompt.ts b/src/features/datacollect/prompts/meetPrompt.ts index 6837f9b..d71b5c2 100644 --- a/src/features/datacollect/prompts/meetPrompt.ts +++ b/src/features/datacollect/prompts/meetPrompt.ts @@ -72,6 +72,10 @@ const OUTPUT_FORMAT = `# ์ž‘์„ฑ ์›์น™ (ํšŒ์˜๋ก ํ’ˆ์งˆ โ€” ์ถœ๋ ฅ ์ „ ๋ฐ˜๋“œ - **๊ฒฐ๊ณผ ์ค‘์‹ฌ**: ๋ฐœ์–ธ ์ˆœ์„œยทํ† ๋ก  ๊ณผ์ •ยท"๋ˆ„๊ฐ€ ๋ฌด์Šจ ๋ง์„ ํ–ˆ๋Š”์ง€"๋ฅผ ๋‚˜์—ดํ•˜์ง€ ๋ง๊ณ  *๊ฒฐ๊ณผ*๋ฅผ ์ ๋Š”๋‹ค. (์˜ˆ: "PlayCanvas๋ฅผ ๋…ผ์˜ํ•จ"โŒ โ†’ "PlayCanvas/Babylon.js ๋น„๊ต ๊ฒ€ํ†  ์ง„ํ–‰ ์˜ˆ์ •"โœ…) ์ฑ…์ž„ ์†Œ์žฌ๋‚˜ ์ž…์žฅ ์ฐจ์ด๊ฐ€ ํ•ต์‹ฌ์ผ ๋•Œ๋งŒ ๋ฐœ์–ธ์ž๋ฅผ ๋ฐํžŒ๋‹ค. - **๋‹ด๋‹น์ž๋Š” ๊ฐœ์ธ ์šฐ์„ **: "๊ฐœ๋ฐœํŒ€/QAํŒ€" ๊ฐ™์€ ์กฐ์ง ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐœ์ธ ์ด๋ฆ„(์˜ˆ: ์†ก๋ณ‘์ค€, ๊น€์›์ผ PD)์œผ๋กœ ์ ๋Š”๋‹ค. ์‹ค์ œ๋กœ ๊ฐœ์ธ์ด ์•ˆ ์ •ํ•ด์กŒ์œผ๋ฉด "๊ฐœ๋ฐœํŒ€ (๋‹ด๋‹น์ž ์ง€์ • ํ•„์š”)" ํ˜•ํƒœ๋กœ ํ‘œ๊ธฐ. - **์ฆ๋น™ ๋ณด์กด**: ๊ฒฐ์ •๋˜์ง€ ์•Š์€ ์‚ฌํ•ญ์ด๋ผ๋„ ์ค‘์š”ํ•œ ๋…ผ์˜ยท๋ฆฌ์Šคํฌ๋Š” ๋น ์ง์—†์ด ๊ธฐ๋กํ•œ๋‹ค(ํ–ฅํ›„ ์ด๋ ฅยท๋ถ„์Ÿ ๊ทผ๊ฑฐ). +- **์ต๋ช…ยท๋ฒˆํ˜ธ ํ™”์ž์— ์ฑ…์ž„ ๋ฐฐ์ • ๊ธˆ์ง€(์ตœ์šฐ์„ )**: "์ฐธ์„์ž 1", "๋ฐœ์–ธ์ž A", "(์ฃผ์ฒด ๋ถˆ๋ช…ํ™•)"์ฒ˜๋Ÿผ *์‹ค๋ช…์ด ํ™•์ธ ์•ˆ ๋œ ํ™”์ž*๋ฅผ ์•ก์…˜ ์•„์ดํ…œ ๋‹ด๋‹น์œผ๋กœ ํ™•์ •ํ•˜์ง€ ๋ง ๊ฒƒ. ๋‹ด๋‹น ์นธ์€ \`[๋ฏธ์ง€์ •-ํ™•์ธํ•„์š”]\`๋กœ ๋‘๊ณ  ๊ทผ๊ฑฐ ๋ฐœ์–ธ๋งŒ ๋‚จ๊ธด๋‹ค โ€” ์ต๋ช…์—๊ฒŒ ๊ฐ€์งœ ์ฑ…์ž„์„ ๋ถ™์ด๋Š” ๊ฒƒ์ด ํšŒ์˜๋ก ์‹ ๋ขฐ๋„๋ฅผ ๊ฐ€์žฅ ํฌ๊ฒŒ ํ•ด์นœ๋‹ค. ๋˜ํ•œ **ํ•œ ์ต๋ช… ํ™”์ž์—๊ฒŒ ์•ก์…˜์ด ์—ฌ๋Ÿฌ ๊ฑด ๋ชฐ๋ฆฌ๋ฉด** ํ™”์ž๋ถ„๋ฆฌ ์˜ค๋ฅ˜์ผ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ทธ ํ•ญ๋ชฉ๋“ค ์ž‘์—… ์ƒ์„ธ ๋์— "(๋™์ผ ํ™”์ž ์—ฌ๋ถ€ ํ™•์ธ)"์„ ๋ง๋ถ™์ธ๋‹ค. +- **๋‚ด์šฉ ์—†๋Š” ์ธ์šฉ ๊ธˆ์ง€**: "์ด๋ ‡๊ฒŒ ์ด๋ ‡๊ฒŒ", "๊ทธ๊ฑฐ", "์ด๊ฑฐ", "์ €๋ ‡๊ฒŒ" ์ฒ˜๋Ÿผ ์ง€์‹œ๋Œ€๋ช…์‚ฌ๋ฟ์ด๋ผ *๋‚ด์šฉ์ด ๋น„์–ด ์žˆ๋Š”* ๋ฐœํ™”๋Š” ๊ฒฐ์ •ยท์•ก์…˜์˜ ๊ทผ๊ฑฐ๋กœ ์ธ์šฉํ•˜์ง€ ๋ง ๊ฒƒ. ๊ทธ๋Ÿฐ ๋ฐœํ™”๋งŒ ๊ทผ๊ฑฐ์ธ ํ•ญ๋ชฉ์€ ํ•ต์‹ฌ ๋‚ด์šฉ์„ \`[๋‚ด์šฉ ํ™•์ธํ•„์š”]\`๋กœ ํ‘œ๊ธฐํ•œ๋‹ค(๋นˆ ์ธ์šฉ์„ ๊ทผ๊ฑฐ์ธ ์ฒ™ ๋‹ฌ์ง€ ๋ง ๊ฒƒ). ํ‘œ๊ธฐ ์˜คํƒ€์™€๋Š” ๋‹ค๋ฅธ, *๋‚ด์šฉ ๊ณต๋ฐฑ* ๋ฌธ์ œ๋‹ค. +- **๊ธฐํ•œ ์—ญ์ฐธ์กฐ**: ๋ฆฌ์Šคํฌยท๋…ผ์˜ยท๋…น์ทจ ์–ด๋””๋“  ๋“ฑ์žฅํ•œ ๋‚ ์งœยท๋งˆ๊ฐ("๋‹ค์Œ ์ฃผ ์ˆ˜์š”์ผ", "์ด๋‹ฌ ๋ง" ๋“ฑ)์€ *์ง์ ‘ ๊ฒฐ๋ถ€๋œ ๊ฒŒ ๋ถ„๋ช…ํ•œ* ์•ก์…˜์˜ ๊ธฐํ•œ ์นธ์— ์—ฐ๊ฒฐํ•œ๋‹ค. ๊ฒฐ๋ถ€๊ฐ€ ๋ถˆํ™•์‹คํ•˜๋ฉด ๊ธฐํ•œ ์นธ์— "(๊ธฐํ•œ ํ›„๋ณด: โ€ฆ)"๋กœ ๋ณด์ˆ˜์ ์œผ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค โ€” ์•ก์…˜ ๊ธฐํ•œ์„ ์ „๋ถ€ "๋ฏธ์ •"์œผ๋กœ ๋น„์šฐ๋ฉด์„œ ๋ณธ๋ฌธ์—” ๋งˆ๊ฐ์ด ๋–  ์žˆ๋Š” ๋ชจ์ˆœ์„ ๋ง‰๋Š”๋‹ค. +- **์ฐธ์„์ž ๋ช…๋‹จ ์ •ํ•ฉ์„ฑ**: ๋ณธ๋ฌธ(์•ก์…˜ยท๊ฒฐ์ •ยท๋…ผ์˜)์— ๋“ฑ์žฅํ•œ ๋ฐœ์–ธ์ž๊ฐ€ ํšŒ์˜ ๊ฐœ์š” '์ฐธ์„์ž'์— ์—†์œผ๋ฉด ๊ทธ ํ•ญ๋ชฉ ์˜†์— "(๋ช…๋‹จ ์™ธ ํ™”์ž โ€” ํ™•์ธํ•„์š”)"๋ฅผ ๋ถ™์ธ๋‹ค. # ์ถœ๋ ฅ ํ˜•์‹ (Output Format โ€” ์ •ํ™•ํžˆ ์ด ๊ตฌ์กฐ๋ฅผ ์œ ์ง€) @@ -91,7 +95,7 @@ const OUTPUT_FORMAT = `# ์ž‘์„ฑ ์›์น™ (ํšŒ์˜๋ก ํ’ˆ์งˆ โ€” ์ถœ๋ ฅ ์ „ ๋ฐ˜๋“œ (์ด๋ฒˆ ํšŒ์˜์—์„œ ํ™•์ •๋œ ๊ฒฐ์ •์ด ์—†์œผ๋ฉด "์ด๋ฒˆ ํšŒ์˜์—์„œ ํ™•์ •๋œ ๊ฒฐ์ •์‚ฌํ•ญ ์—†์Œ"์ด๋ผ๊ณ  ๋ช…์‹œํ•œ๋‹ค โ€” ๋นˆ์นธยท์ƒ๋žต ๊ธˆ์ง€.) ## 4. ์•ก์…˜ ์•„์ดํ…œ -ํšŒ์˜ ํ›„ ์ˆ˜ํ–‰ํ•  ์—…๋ฌด๋ฅผ **๋‹ด๋‹นยท์ž‘์—…ยท๊ธฐํ•œยท์‚ฐ์ถœ๋ฌผ 4์š”์†Œ**๊ฐ€ ๋ชจ๋‘ ๋“œ๋Ÿฌ๋‚˜๊ฒŒ ์ •๋ฆฌํ•œ๋‹ค. ๊ฐ ํ–‰์€ ๋ฐ˜๋“œ์‹œ ๋…น์ทจ๋ก ๊ทผ๊ฑฐ๋กœ ์ž‘์„ฑํ•œ๋‹ค. ๋‹ด๋‹น์ž๋Š” ๊ฐœ์ธ ์šฐ์„ (์—†์œผ๋ฉด "OOํŒ€ (๋‹ด๋‹น์ž ์ง€์ • ํ•„์š”)"). ํšŒ์˜์—์„œ ๊ธฐํ•œยท์‚ฐ์ถœ๋ฌผ์ด ์•ˆ ๋‚˜์™”์œผ๋ฉด ํ•ด๋‹น ์นธ์— "ํ™•์ธ ํ•„์š”"๋ผ๊ณ  ์ ๋Š”๋‹ค. ํ‘œ ์…€ ์•ˆ์—์„œ๋Š” ์ค„๋ฐ”๊ฟˆ๊ณผ \`|\` ๋ฌธ์ž๋ฅผ ์“ฐ์ง€ ๋ง ๊ฒƒ. +ํšŒ์˜ ํ›„ ์ˆ˜ํ–‰ํ•  ์—…๋ฌด๋ฅผ **๋‹ด๋‹นยท์ž‘์—…ยท๊ธฐํ•œยท์‚ฐ์ถœ๋ฌผ 4์š”์†Œ**๊ฐ€ ๋ชจ๋‘ ๋“œ๋Ÿฌ๋‚˜๊ฒŒ ์ •๋ฆฌํ•œ๋‹ค. ๊ฐ ํ–‰์€ ๋ฐ˜๋“œ์‹œ ๋…น์ทจ๋ก ๊ทผ๊ฑฐ๋กœ ์ž‘์„ฑํ•œ๋‹ค. ๋‹ด๋‹น์ž๋Š” ๊ฐœ์ธ ์šฐ์„ (์—†์œผ๋ฉด "OOํŒ€ (๋‹ด๋‹น์ž ์ง€์ • ํ•„์š”)"). **์‹ค๋ช…์ด ํ™•์ธ ์•ˆ ๋œ ๋ฒˆํ˜ธยท์ต๋ช… ํ™”์ž๋Š” ๋‹ด๋‹น์œผ๋กœ ํ™•์ •ํ•˜์ง€ ๋ง๊ณ  \`[๋ฏธ์ง€์ •-ํ™•์ธํ•„์š”]\`๋กœ ๋‘”๋‹ค**(์œ„ ์ž‘์„ฑ ์›์น™ ์ฐธ์กฐ). ํšŒ์˜์—์„œ ๊ธฐํ•œยท์‚ฐ์ถœ๋ฌผ์ด ์•ˆ ๋‚˜์™”์œผ๋ฉด ํ•ด๋‹น ์นธ์— "ํ™•์ธ ํ•„์š”"๋ผ๊ณ  ์ ๋˜, **๋ณธ๋ฌธ์— ๋งˆ๊ฐ ๋‚ ์งœ๊ฐ€ ์–ธ๊ธ‰๋๊ณ  ์ด ์ž‘์—…์— ๊ฒฐ๋ถ€๋˜๋ฉด ๊ทธ ๋‚ ์งœ๋ฅผ ๊ธฐํ•œ ์นธ์— ๋ฐ˜์˜**ํ•œ๋‹ค. ํ‘œ ์…€ ์•ˆ์—์„œ๋Š” ์ค„๋ฐ”๊ฟˆ๊ณผ \`|\` ๋ฌธ์ž๋ฅผ ์“ฐ์ง€ ๋ง ๊ฒƒ. | ๋‹ด๋‹น | ์ž‘์—… ๋‚ด์šฉ | ์ž‘์—… ์ƒ์„ธ | ์‚ฐ์ถœ๋ฌผ | ๊ธฐํ•œ | ์ƒํƒœ | | --- | --- | --- | --- | --- | --- | @@ -125,7 +129,7 @@ const OUTPUT_FORMAT = `# ์ž‘์„ฑ ์›์น™ (ํšŒ์˜๋ก ํ’ˆ์งˆ โ€” ์ถœ๋ ฅ ์ „ ๋ฐ˜๋“œ - ํ•ต์‹ฌ ๋…ผ์  ํ•œ ์ค„ # ์ตœ์ข… ์ ๊ฒ€ (์ถœ๋ ฅ ์ „ ๋‚ด๋ถ€ ํ™•์ธ โ€” ์ฒดํฌ ๋กœ๊ทธ๋Š” ์ถœ๋ ฅํ•˜์ง€ ๋ง ๊ฒƒ) -โ–ก ๊ฒฐ์ •์‚ฌํ•ญ์— ํ™•์ •๋œ ๊ฒƒ๋งŒ ์žˆ๋Š”๊ฐ€(๊ฒ€ํ†  ํ•„์š” ํ•ญ๋ชฉ์ด ์„ž์ด์ง€ ์•Š์•˜๋‚˜) โ–ก ์•ก์…˜ ์•„์ดํ…œ์— ๋‹ด๋‹น(๊ฐœ์ธ)ยท์ž‘์—…ยท๊ธฐํ•œยท์‚ฐ์ถœ๋ฌผ 4์š”์†Œ๊ฐ€ ์žˆ๋Š”๊ฐ€ โ–ก ์˜คํ”ˆ ์ด์Šˆ๊ฐ€ ํ•œ๊ณณ์— ๋ชจ์˜€๋Š”๊ฐ€ โ–ก ๋ฆฌ์Šคํฌ๊ฐ€ ์˜ํ–ฅยท๋Œ€์‘๋ฐฉ์•ˆ๊ณผ ํ•จ๊ป˜ ์ •๋ฆฌ๋๋Š”๊ฐ€ โ–ก ๋…ผ์˜์‚ฌํ•ญ์ด ์ฃผ์ œ๋ณ„ bullet๋กœ ๊ฐ„๊ฒฐํ•œ๊ฐ€ โ–ก ์š”์•ฝ์ด ๊ฒฐ๊ณผ ์ค‘์‹ฌ์ธ๊ฐ€ โ–ก ๊ฒฐ์ •ยท์•ก์…˜์— ๊ทผ๊ฑฐ ์ธ์šฉ์ด ๋ถ™์–ด ์žˆ๋Š”๊ฐ€ +โ–ก ๊ฒฐ์ •์‚ฌํ•ญ์— ํ™•์ •๋œ ๊ฒƒ๋งŒ ์žˆ๋Š”๊ฐ€(๊ฒ€ํ†  ํ•„์š” ํ•ญ๋ชฉ์ด ์„ž์ด์ง€ ์•Š์•˜๋‚˜) โ–ก ์•ก์…˜ ์•„์ดํ…œ์— ๋‹ด๋‹น(๊ฐœ์ธ)ยท์ž‘์—…ยท๊ธฐํ•œยท์‚ฐ์ถœ๋ฌผ 4์š”์†Œ๊ฐ€ ์žˆ๋Š”๊ฐ€ โ–ก ์ต๋ช…ยท๋ฒˆํ˜ธ ํ™”์ž๋ฅผ ๋‹ด๋‹น์œผ๋กœ ํ™•์ •ํ•˜์ง€ ์•Š๊ณ  [๋ฏธ์ง€์ •-ํ™•์ธํ•„์š”]๋กœ ๋’€๋Š”๊ฐ€ โ–ก "์ด๋ ‡๊ฒŒ/๊ทธ๊ฑฐ" ๊ฐ™์€ ๋นˆ ์ธ์šฉ์„ ๊ทผ๊ฑฐ๋กœ ๋‹ฌ์ง€ ์•Š์•˜๋Š”๊ฐ€([๋‚ด์šฉ ํ™•์ธํ•„์š”] ์ฒ˜๋ฆฌ) โ–ก ๋ณธ๋ฌธ์— ๋œฌ ๋งˆ๊ฐ ๋‚ ์งœ๋ฅผ ๊ฒฐ๋ถ€๋œ ์•ก์…˜ ๊ธฐํ•œ์— ๋ฐ˜์˜ํ–ˆ๋Š”๊ฐ€ โ–ก ๋ช…๋‹จ ์™ธ ํ™”์ž์— (ํ™•์ธํ•„์š”) ํ‘œ์‹œ๋ฅผ ํ–ˆ๋Š”๊ฐ€ โ–ก ์˜คํ”ˆ ์ด์Šˆ๊ฐ€ ํ•œ๊ณณ์— ๋ชจ์˜€๋Š”๊ฐ€ โ–ก ๋ฆฌ์Šคํฌ๊ฐ€ ์˜ํ–ฅยท๋Œ€์‘๋ฐฉ์•ˆ๊ณผ ํ•จ๊ป˜ ์ •๋ฆฌ๋๋Š”๊ฐ€ โ–ก ๋…ผ์˜์‚ฌํ•ญ์ด ์ฃผ์ œ๋ณ„ bullet๋กœ ๊ฐ„๊ฒฐํ•œ๊ฐ€ โ–ก ์š”์•ฝ์ด ๊ฒฐ๊ณผ ์ค‘์‹ฌ์ธ๊ฐ€ โ–ก ๊ฒฐ์ •ยท์•ก์…˜์— ๊ทผ๊ฑฐ ์ธ์šฉ์ด ๋ถ™์–ด ์žˆ๋Š”๊ฐ€ ์œ„ ํ˜•์‹์„ ์ •ํ™•ํžˆ ๋”ฐ๋ฅด๊ณ , ๋ชจ๋“  ๋‚ด์šฉ์€ ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑํ•˜์‹œ์˜ค.`; @@ -143,7 +147,8 @@ export function buildMeetExtractPrompt(segment: string, metadata: string, segInd # ๊ทœ์น™ (ํ• ๋ฃจ์‹œ๋„ค์ด์…˜ ๋ฐฉ์ง€) - ์ด ์กฐ๊ฐ์— ์—†๋Š” ์‚ฌ์‹คยท์ˆ˜์น˜ยท๊ฒฐ์ •์„ ๋งŒ๋“ค์ง€ ๋ง ๊ฒƒ. ๋ฐœ์–ธ ์ฃผ์ฒด๊ฐ€ ๋ถˆ๋ช…ํ™•ํ•˜๋ฉด "(์ฃผ์ฒด ๋ถˆ๋ช…ํ™•)"์œผ๋กœ ํ‘œ๊ธฐ. - STT ์˜คํƒ€๋Š” ๋ฌธ๋งฅ๊ณผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(์šฉ์–ด์ง‘ ์—ญํ• )๋กœ ์ •๊ทœํ™”ํ•˜๋˜, ์—†๋Š” ์‚ฌ์‹ค์„ ์ง€์–ด๋‚ด๋Š” ๊ฒƒ์€ ๊ธˆ์ง€. -- ๊ฐ ํ•ญ๋ชฉ ๋์— ๊ทผ๊ฑฐ ๋ฐœ์–ธ ์›๋ฌธ ์ผ๋ถ€(20์ž ๋‚ด์™ธ)๋ฅผ \`๊ทผ๊ฑฐ: "โ€ฆ"\` ๋กœ ๋ถ™์ธ๋‹ค. +- ๊ฐ ํ•ญ๋ชฉ ๋์— ๊ทผ๊ฑฐ ๋ฐœ์–ธ ์›๋ฌธ ์ผ๋ถ€(20์ž ๋‚ด์™ธ)๋ฅผ \`๊ทผ๊ฑฐ: "โ€ฆ"\` ๋กœ ๋ถ™์ธ๋‹ค. ๋‹จ, "์ด๋ ‡๊ฒŒ/๊ทธ๊ฑฐ/์ด๊ฑฐ" ๊ฐ™์€ ์ง€์‹œ๋Œ€๋ช…์‚ฌ๋ฟ์ธ *๋‚ด์šฉ ๊ณต๋ฐฑ* ๋ฐœํ™”๋Š” ๊ทผ๊ฑฐ๋กœ ์“ฐ์ง€ ๋ง๊ณ  ํ•ต์‹ฌ ๋‚ด์šฉ์„ "[๋‚ด์šฉ ํ™•์ธํ•„์š”]"๋กœ ํ‘œ๊ธฐํ•œ๋‹ค. +- ์•ก์…˜ ๋‹ด๋‹น์ด ์‹ค๋ช…์œผ๋กœ ํ™•์ธ ์•ˆ ๋œ ํ™”์ž(๋ฒˆํ˜ธยท์ต๋ช…)๋ฉด \`[๋‹ด๋‹น]\`์— "[๋ฏธ์ง€์ •]"์œผ๋กœ ์ ๊ณ  ์ž„์˜ ๋ฐฐ์ •ํ•˜์ง€ ๋ง ๊ฒƒ. - ์กฐ๊ฐ ๊ฒฝ๊ณ„์—์„œ ์ž˜๋ฆฐ ๋ฌธ์žฅ์€ ๋ฌด๋ฆฌํ•˜๊ฒŒ ํ•ด์„ํ•˜์ง€ ๋ง๊ณ  "(์กฐ๊ฐ ๊ฒฝ๊ณ„์—์„œ ์ž˜๋ฆผ)"์œผ๋กœ ํ‘œ๊ธฐ. [๋ฉ”ํƒ€๋ฐ์ดํ„ฐ] diff --git a/tests/meetPrompt.test.ts b/tests/meetPrompt.test.ts new file mode 100644 index 0000000..d9a748a --- /dev/null +++ b/tests/meetPrompt.test.ts @@ -0,0 +1,60 @@ +/** + * Regression guard for the /meet prompt policy. + * + * These 4 rules were added after a real meeting record showed the failure modes: + * 1) anonymous/numbered speakers assigned as action owners (fake accountability) + * 2) content-empty deictic quotes ("์ด๋ ‡๊ฒŒ ์ด๋ ‡๊ฒŒ") passed off as ๊ทผ๊ฑฐ + * 3) deadlines mentioned in risks/discussion not reflected in action ๊ธฐํ•œ + * 4) speakers in the body who aren't in the attendee list + * + * Prompts can't be unit-tested for model behavior, but we CAN guard that the + * policy text doesn't silently get dropped in a future refactor. + */ + +import { + buildMeetPrompt, + buildMeetExtractPrompt, + buildMeetReducePrompt, +} from '../src/features/datacollect/prompts/meetPrompt'; + +const transcript = '์ฐธ์„์ž 1: ์ด๊ฑฐ๋Š” ์ด๋ ‡๊ฒŒ ์ด๋ ‡๊ฒŒ ํ•ด์ฃผ์„ธ์š”. ํšจํฌ ํŒ€์žฅ: ๋„ค ์ˆ˜์ •ํ• ๊ฒŒ์š”.'; +const metadata = 'ํšŒ์˜๋ช…: ํ…Œ์ŠคํŠธ'; + +describe('/meet prompt โ€” accountability & grounding policy', () => { + // The OUTPUT_FORMAT block is shared by the single-shot and reduce paths, so + // both must carry the policy. + const sharedFormatBuilders: Array<[string, string]> = [ + ['buildMeetPrompt', buildMeetPrompt(transcript, metadata)], + ['buildMeetReducePrompt', buildMeetReducePrompt('## ์•ก์…˜\n- [๋ฏธ์ง€์ •] ์ž‘์—…', metadata)], + ]; + + test.each(sharedFormatBuilders)('%s forbids assigning anonymous speakers as owners', (_name, prompt) => { + expect(prompt).toContain('[๋ฏธ์ง€์ •-ํ™•์ธํ•„์š”]'); + expect(prompt).toMatch(/์ต๋ช…ยท๋ฒˆํ˜ธ ํ™”์ž/); + }); + + test.each(sharedFormatBuilders)('%s rejects content-empty deictic quotes', (_name, prompt) => { + expect(prompt).toContain('[๋‚ด์šฉ ํ™•์ธํ•„์š”]'); + expect(prompt).toMatch(/์ด๋ ‡๊ฒŒ ์ด๋ ‡๊ฒŒ/); + }); + + test.each(sharedFormatBuilders)('%s cross-references deadlines into action ๊ธฐํ•œ', (_name, prompt) => { + expect(prompt).toMatch(/๊ธฐํ•œ ์—ญ์ฐธ์กฐ/); + }); + + test.each(sharedFormatBuilders)('%s flags speakers missing from the attendee list', (_name, prompt) => { + expect(prompt).toMatch(/๋ช…๋‹จ ์™ธ ํ™”์ž|์ฐธ์„์ž ๋ช…๋‹จ ์ •ํ•ฉ์„ฑ/); + }); + + test('extract (map) stage also avoids anonymous owner assignment & empty quotes', () => { + const p = buildMeetExtractPrompt('์ฐธ์„์ž 1: ์ด๊ฑฐ ์ด๋ ‡๊ฒŒ์š”', metadata, 1, 3); + expect(p).toContain('[๋ฏธ์ง€์ •]'); + expect(p).toContain('[๋‚ด์šฉ ํ™•์ธํ•„์š”]'); + }); + + test('final checklist references the new gates', () => { + const prompt = buildMeetPrompt(transcript, metadata); + expect(prompt).toMatch(/์ต๋ช…ยท๋ฒˆํ˜ธ ํ™”์ž๋ฅผ ๋‹ด๋‹น์œผ๋กœ ํ™•์ •ํ•˜์ง€ ์•Š๊ณ /); + expect(prompt).toMatch(/๋นˆ ์ธ์šฉ์„ ๊ทผ๊ฑฐ๋กœ ๋‹ฌ์ง€ ์•Š์•˜๋Š”๊ฐ€/); + }); +});