feat(engine): implement self-reflection (reflector) stage in multi-agent pipeline

- Added ReflectorAgent for meta-cognition and critical review between Research and Writing
- Updated WriterAgent to explicitly address reflection critiques
- Introduced 'g1nation.enableReflection' configuration setting
- Added comprehensive integration tests for the self-reflection stage
- Documented design decisions in ADR-0010 and related discussion records
This commit is contained in:
g1nation
2026-05-14 01:47:28 +09:00
parent e075779635
commit 8da9532ca1
18 changed files with 610 additions and 124 deletions
+230 -51
View File
@@ -1,11 +1,11 @@
{
"version": 1,
"generatedAt": "2026-05-13T13:48:21.464Z",
"generatedAt": "2026-05-13T16:44:14.033Z",
"files": {
"src/agent.ts": {
"mtimeMs": 1778677012000,
"size": 184384,
"lines": 3207,
"mtimeMs": 1778683690000,
"size": 185807,
"lines": 3232,
"role": "",
"imports": [
"src/utils",
@@ -38,19 +38,20 @@
]
},
"src/agents/AgentWorkflowManager.ts": {
"mtimeMs": 1777808065000,
"size": 1745,
"lines": 50,
"mtimeMs": 1778690404000,
"size": 2262,
"lines": 60,
"role": "",
"imports": [
"src/agents/factory",
"src/lib/engine"
"src/lib/engine",
"src/config"
]
},
"src/agents/factory.ts": {
"mtimeMs": 1778591282000,
"size": 7965,
"lines": 166,
"mtimeMs": 1778690336000,
"size": 11023,
"lines": 219,
"role": "",
"imports": [
"src/config",
@@ -58,7 +59,7 @@
]
},
"src/bridge.ts": {
"mtimeMs": 1778251262000,
"mtimeMs": 1778681774000,
"size": 9705,
"lines": 227,
"role": "",
@@ -71,9 +72,9 @@
]
},
"src/config.ts": {
"mtimeMs": 1778676053000,
"size": 9149,
"lines": 209,
"mtimeMs": 1778690442000,
"size": 9619,
"lines": 216,
"role": "",
"imports": []
},
@@ -248,9 +249,9 @@
"imports": []
},
"src/extension.ts": {
"mtimeMs": 1778677220000,
"size": 37920,
"lines": 757,
"mtimeMs": 1778687229000,
"size": 49361,
"lines": 945,
"role": "",
"imports": [
"src/utils",
@@ -273,11 +274,13 @@
"src/integrations/telegram/telegramClient",
"src/integrations/telegram/telegramBot",
"src/core/services",
"src/features/company",
"src/features/settings/settingsPanelProvider",
"src/skills/agentKnowledgeMap",
"src/retrieval",
"src/retrieval/lessonHelpers",
"src/skills/scopedBrainRetriever"
"src/skills/scopedBrainRetriever",
"src/integrations/telegram/conversationHistory"
]
},
"src/features/approval/approvalPanelProvider.ts": {
@@ -308,10 +311,160 @@
"src/features/approval/approvalQueue"
]
},
"src/features/company/agents.ts": {
"mtimeMs": 1778680824000,
"size": 6684,
"lines": 136,
"role": "The 9-agent roster for 1인 기업 모드. Each entry is a static description — persona, role, specialty — used to build the specialist's system prompt at dispatch time. The set was adopted from Connectorigin's",
"imports": [
"src/features/company/types"
]
},
"src/features/company/ceoPlanner.ts": {
"mtimeMs": 1778681095000,
"size": 8406,
"lines": 219,
"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": [
"src/core/services",
"src/utils",
"src/features/company/agents",
"src/features/company/companyConfig",
"src/features/company/promptAssets",
"src/features/company/promptBuilder",
"src/features/company/types"
]
},
"src/features/company/ceoReporter.ts": {
"mtimeMs": 1778681122000,
"size": 4812,
"lines": 120,
"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": [
"src/core/services",
"src/utils",
"src/features/company/agents",
"src/features/company/promptAssets",
"src/features/company/types"
]
},
"src/features/company/companyConfig.ts": {
"mtimeMs": 1778686762000,
"size": 13473,
"lines": 330,
"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": [
"src/features/company/agents",
"src/features/company/types"
]
},
"src/features/company/dispatcher.ts": {
"mtimeMs": 1778686839000,
"size": 20029,
"lines": 434,
"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",
"src/utils",
"src/skills/scopedBrainRetriever",
"src/skills/agentKnowledgeMap",
"src/retrieval/knowledgeMix",
"src/features/company/agents",
"src/features/company/companyConfig",
"src/features/company/ceoPlanner",
"src/features/company/ceoReporter",
"src/features/company/promptBuilder",
"src/features/company/sessionStore",
"src/features/company/telegramReport",
"src/features/company/types"
]
},
"src/features/company/index.ts": {
"mtimeMs": 1778686769000,
"size": 1114,
"lines": 55,
"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",
"src/features/company/companyConfig",
"src/features/company/types",
"src/features/company/dispatcher",
"src/features/company/sessionStore"
]
},
"src/features/company/promptAssets.ts": {
"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": 1778686868000,
"size": 10317,
"lines": 202,
"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 (<createfile>, ",
"imports": [
"src/features/company/agents",
"src/features/company/companyConfig",
"src/features/company/types"
]
},
"src/features/company/prompts/ceo-chat.md": {
"mtimeMs": 1778680831000,
"size": 462,
"lines": 4,
"role": "당신은 {{COMPANY}}의 CEO입니다. 사용자(사장님)와 짧게 인사·안부·잡담을 주고받습니다. - 한국어로 1~3문장. 친근하지만 사장-CEO 관계는 유지. - 인사·안부 질문이면 자연스럽게 응답하세요. 작업 지시가 아니면 굳이 작업 분배 제안 X. - 회사 정체성·최근 결정·추적기 상태가 컨텍스트에 있으면 자연스럽게 활용. - JSON 출력 금지. ",
"imports": []
},
"src/features/company/prompts/ceo-planner.md": {
"mtimeMs": 1778680831000,
"size": 3199,
"lines": 38,
"role": "당신은 \"{{COMPANY}}\"의 CEO입니다. 1인 AI 기업의 사령관이자 오케스트레이터입니다.",
"imports": []
},
"src/features/company/prompts/ceo-report.md": {
"mtimeMs": 1778680831000,
"size": 1373,
"lines": 21,
"role": "당신은 {{COMPANY}}의 CEO입니다. 방금 팀이 작업을 끝냈습니다. 각 에이전트의 산출물을 읽고 사장님께 올릴 종합 보고서를 작성하세요.",
"imports": []
},
"src/features/company/sessionStore.ts": {
"mtimeMs": 1778680971000,
"size": 8727,
"lines": 231,
"role": "Disk persistence for company-mode session artefacts. Each company turn produces a timestamped directory: <workspaceRoot>/.astra/company/sessions/2026-05-13T21-29/ ├─ brief.md ← CEO's task decompositio",
"imports": [
"src/utils",
"src/features/company/types"
]
},
"src/features/company/telegramReport.ts": {
"mtimeMs": 1778686162000,
"size": 8111,
"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": [
"src/utils",
"src/integrations/telegram/telegramClient",
"src/integrations/telegram/conversationHistory",
"src/features/company/agents",
"src/features/company/types"
]
},
"src/features/company/types.ts": {
"mtimeMs": 1778686714000,
"size": 6454,
"lines": 150,
"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/projectArchitecture/index.ts": {
"mtimeMs": 1778679015000,
"size": 22657,
"lines": 515,
"mtimeMs": 1778684164000,
"size": 23147,
"lines": 523,
"role": "Project Architecture Context (Feature 2) Builds a markdown document that captures the durable facts about a project — its purpose, modules, key files, constraints, decisions — so Astra can attach it t",
"imports": [
"src/utils",
@@ -413,6 +566,15 @@
"src/lib/paths"
]
},
"src/integrations/telegram/conversationHistory.ts": {
"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": [
"src/utils"
]
},
"src/integrations/telegram/telegramBot.ts": {
"mtimeMs": 1778421270000,
"size": 11344,
@@ -467,9 +629,9 @@
]
},
"src/lib/engine.ts": {
"mtimeMs": 1777985699000,
"size": 38497,
"lines": 849,
"mtimeMs": 1778690608000,
"size": 40830,
"lines": 880,
"role": "",
"imports": [
"src/core/lock",
@@ -740,14 +902,15 @@
]
},
"src/sidebar/chatHandlers.ts": {
"mtimeMs": 1778677129000,
"size": 8596,
"lines": 175,
"mtimeMs": 1778686906000,
"size": 13454,
"lines": 266,
"role": "",
"imports": [
"src/sidebarProvider",
"src/utils",
"src/lib/paths"
"src/lib/paths",
"src/features/company"
]
},
"src/sidebar/chronicleHandlers.ts": {
@@ -760,9 +923,9 @@
]
},
"src/sidebarProvider.ts": {
"mtimeMs": 1778679027000,
"size": 112397,
"lines": 2603,
"mtimeMs": 1778686896000,
"size": 127185,
"lines": 2934,
"role": "",
"imports": [
"src/utils",
@@ -780,7 +943,9 @@
"src/lib/contextManager",
"src/skills/externalSkillLoader",
"src/features/projectArchitecture",
"src/features/projectArchitecture/intentDetector"
"src/features/projectArchitecture/intentDetector",
"src/features/company",
"src/core/services"
]
},
"src/skills/agentKnowledgeMap.ts": {
@@ -816,7 +981,7 @@
]
},
"src/skills/skillInjectionService.ts": {
"mtimeMs": 1778251221000,
"mtimeMs": 1778681774000,
"size": 6276,
"lines": 145,
"role": "",
@@ -870,30 +1035,30 @@
"imports": []
},
"media/sidebar.css": {
"mtimeMs": 1778677793000,
"size": 38372,
"lines": 987,
"mtimeMs": 1778688155000,
"size": 49347,
"lines": 1225,
"role": "Stylesheet",
"imports": []
},
"media/sidebar.html": {
"mtimeMs": 1778677855000,
"size": 16364,
"lines": 285,
"mtimeMs": 1778687548000,
"size": 20499,
"lines": 356,
"role": "Astra",
"imports": []
},
"media/sidebar.js": {
"mtimeMs": 1778677844000,
"size": 77309,
"lines": 1388,
"mtimeMs": 1778688191000,
"size": 103898,
"lines": 1874,
"role": "",
"imports": []
},
"tests/agentEngine.test.ts": {
"mtimeMs": 1777983087000,
"size": 27182,
"lines": 646,
"mtimeMs": 1778690526000,
"size": 33414,
"lines": 776,
"role": "AgentEngine Integration Tests & Performance Benchmarks 검증 대상: 1. ErrorClassifier — 오류 유형(Transient/Permanent/Abort) 자동 분류 2. ErrorRecoveryMatrix — 각 규칙이 의도한 대응 전략으로 매핑되는지 검증 3. resilientExecute — 지수 백",
"imports": [
"src/lib/engine"
@@ -1083,7 +1248,7 @@
]
},
"tests/skillInjectionService.test.ts": {
"mtimeMs": 1778251292000,
"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",
@@ -1343,7 +1508,7 @@
"imports": []
},
"docs/records/ConnectAI/chronicle.config.json": {
"mtimeMs": 1778680095000,
"mtimeMs": 1778690568000,
"size": 416,
"lines": 11,
"role": "JSON configuration",
@@ -1412,6 +1577,13 @@
"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/development/2026-05-02_answer-format-readability-tuning.md": {
"mtimeMs": 1777808065000,
"size": 1534,
@@ -1552,6 +1724,13 @@
"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,
@@ -1588,9 +1767,9 @@
"imports": []
},
"docs/records/ConnectAI/timeline.md": {
"mtimeMs": 1778680095000,
"size": 7871,
"lines": 116,
"mtimeMs": 1778689955000,
"size": 8165,
"lines": 122,
"role": "Project Timeline",
"imports": []
},