fix(debate): 검증 5건 일괄 수정 — WD 덮어쓰기 방지, Conclusion Wiki 업로드, 전문 코드삽입, 번호수정, participant 검증규칙
This commit is contained in:
@@ -222,13 +222,13 @@ class DebateHandler:
|
|||||||
# ⑥ Working Document 통합 편집 (Flash + Wiki.js)
|
# ⑥ Working Document 통합 편집 (Flash + Wiki.js)
|
||||||
await self._update_working_document(speaker, response)
|
await self._update_working_document(speaker, response)
|
||||||
|
|
||||||
# ⑥ 양쪽 wiki/ 동기화
|
# ⑦ 양쪽 wiki/ 동기화
|
||||||
self._sync_wiki()
|
self._sync_wiki()
|
||||||
|
|
||||||
# ⑦ #debate에 요약 게시
|
# ⑧ #debate에 요약 게시
|
||||||
await self._post_summary(speaker, response)
|
await self._post_summary(speaker, response)
|
||||||
|
|
||||||
# ⑧ 합의 판정
|
# ⑨ 합의 판정
|
||||||
decision = await self._judge_consensus(speaker, response)
|
decision = await self._judge_consensus(speaker, response)
|
||||||
|
|
||||||
if decision == "conclude":
|
if decision == "conclude":
|
||||||
@@ -274,21 +274,35 @@ class DebateHandler:
|
|||||||
|
|
||||||
async def _prepare_input(self, speaker: str):
|
async def _prepare_input(self, speaker: str):
|
||||||
"""사회자가 input.md + wiki/ 작성."""
|
"""사회자가 input.md + wiki/ 작성."""
|
||||||
# 사회자(Flash) 프롬프트 생성
|
# 사회자(Flash) 해설 생성
|
||||||
moderated_prompt = await self._build_moderator_prompt(speaker)
|
moderator_commentary = await self._build_moderator_prompt(speaker)
|
||||||
|
|
||||||
# input.md 작성
|
# 상대방 전문을 코드에서 직접 삽입 (Flash의 요약에 의존하지 않음)
|
||||||
|
prev = [h for h in self.session.history if h["speaker"] != "user"]
|
||||||
|
opponent_section = ""
|
||||||
|
if prev:
|
||||||
|
last = prev[-1]
|
||||||
|
opponent_section = (
|
||||||
|
f"\n\n---\n\n"
|
||||||
|
f"## 상대방({last['speaker']})의 발언 원본 (전문)\n\n"
|
||||||
|
f"{last['content']}\n\n"
|
||||||
|
f"---\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
# input.md = 사회자 해설 + 상대방 전문 (코드가 보장)
|
||||||
|
full_input = moderator_commentary + opponent_section
|
||||||
input_path = AGENT_PATHS[speaker] / "input.md"
|
input_path = AGENT_PATHS[speaker] / "input.md"
|
||||||
input_path.write_text(moderated_prompt, encoding="utf-8")
|
input_path.write_text(full_input, encoding="utf-8")
|
||||||
|
|
||||||
# wiki/ 동기화 (TODO: Wiki.js에서 가져와서 로컬에 쓰기)
|
# wiki/ — 기존 working_document.md가 있으면 그대로 유지
|
||||||
# 현재는 히스토리 기반으로 working_document 생성
|
|
||||||
wiki_dir = AGENT_PATHS[speaker] / "wiki"
|
wiki_dir = AGENT_PATHS[speaker] / "wiki"
|
||||||
wiki_dir.mkdir(exist_ok=True)
|
wiki_dir.mkdir(exist_ok=True)
|
||||||
working_doc = self._build_working_document()
|
wd_path = wiki_dir / "working_document.md"
|
||||||
(wiki_dir / "working_document.md").write_text(
|
if not wd_path.exists():
|
||||||
working_doc, encoding="utf-8",
|
# 첫 라운드에만 초기 스텁 생성
|
||||||
)
|
wd_path.write_text(
|
||||||
|
self._build_working_document(), encoding="utf-8",
|
||||||
|
)
|
||||||
|
|
||||||
async def _send_signal(self, speaker: str):
|
async def _send_signal(self, speaker: str):
|
||||||
"""AG에게 Discord 시그널."""
|
"""AG에게 Discord 시그널."""
|
||||||
@@ -365,11 +379,12 @@ class DebateHandler:
|
|||||||
|
|
||||||
meta += f"""
|
meta += f"""
|
||||||
## 지시
|
## 지시
|
||||||
발언자({speaker})에게 보낼 메시지를 작성하세요.
|
발언자({speaker})에게 보낼 **사회자 해설/방향 지시**를 작성하세요.
|
||||||
|
(상대방 발언 전문은 시스템이 별도로 `input.md`에 포함합니다 — 여기서 복사할 필요 없음)
|
||||||
|
|
||||||
1. 사용자의 판단이 있으면 맥락 설명
|
1. 사용자의 판단이 있으면 맥락 설명
|
||||||
2. 상대방의 최근 발언이 있다면 **반드시 원본 전문을 그대로 포함** (절대 요약 금지)
|
2. 상대방 발언의 핵심 포인트 정리 및 검증 방향 안내
|
||||||
3. 상대방의 발언 전문을 바탕으로, 현재 `wiki/working_document.md`에 사회자가 내용을 올바르게 취합/합의했는지 검증하라고 지시
|
3. 현재 `wiki/working_document.md`에 사회자가 내용을 올바르게 취합/합의했는지 검증하라고 지시
|
||||||
4. 상대방 주장의 오류/허점 확인 + 개선 방향 지시
|
4. 상대방 주장의 오류/허점 확인 + 개선 방향 지시
|
||||||
5. 핵심 쟁점 방향 제시
|
5. 핵심 쟁점 방향 제시
|
||||||
6. 첫 발언이면 주제 설명 + 자유 의견 안내
|
6. 첫 발언이면 주제 설명 + 자유 의견 안내
|
||||||
@@ -458,8 +473,16 @@ class DebateHandler:
|
|||||||
await ctrl.send(embed=embed)
|
await ctrl.send(embed=embed)
|
||||||
|
|
||||||
async def _post_conclusion(self, channel):
|
async def _post_conclusion(self, channel):
|
||||||
"""토론 종료."""
|
"""토론 종료 — Discord + Wiki.js에 결론 기록."""
|
||||||
self.session.active = False
|
self.session.active = False
|
||||||
|
|
||||||
|
# Working Document 최종본 읽기
|
||||||
|
wd_path = AGENT_PATHS["gemini"] / "wiki" / "working_document.md"
|
||||||
|
final_doc = ""
|
||||||
|
if wd_path.exists():
|
||||||
|
final_doc = wd_path.read_text(encoding="utf-8").strip()
|
||||||
|
|
||||||
|
# Discord에 요약 게시
|
||||||
parts = []
|
parts = []
|
||||||
for h in self.session.history[-8:]:
|
for h in self.session.history[-8:]:
|
||||||
emoji = AGENT_EMOJI.get(h["speaker"], "👤")
|
emoji = AGENT_EMOJI.get(h["speaker"], "👤")
|
||||||
@@ -476,6 +499,20 @@ class DebateHandler:
|
|||||||
)
|
)
|
||||||
await channel.send(embed=embed)
|
await channel.send(embed=embed)
|
||||||
|
|
||||||
|
# Wiki.js에 Conclusion 페이지 업로드
|
||||||
|
conclusion_content = (
|
||||||
|
f"# {self.session.topic} — 결론\n\n"
|
||||||
|
f"**총 라운드**: {self.session.round}\n\n"
|
||||||
|
f"---\n\n"
|
||||||
|
f"## 최종 Working Document\n\n"
|
||||||
|
f"{final_doc if final_doc else '(문서 없음)'}\n"
|
||||||
|
)
|
||||||
|
await self._wiki_upsert(
|
||||||
|
f"debates/{self.session.topic_slug}/conclusion",
|
||||||
|
f"{self.session.wiki_title} — Conclusion",
|
||||||
|
conclusion_content,
|
||||||
|
)
|
||||||
|
|
||||||
# ═══════════════════════════════════════════
|
# ═══════════════════════════════════════════
|
||||||
# 유틸
|
# 유틸
|
||||||
# ═══════════════════════════════════════════
|
# ═══════════════════════════════════════════
|
||||||
|
|||||||
@@ -15,13 +15,14 @@
|
|||||||
|
|
||||||
## 행동 규칙
|
## 행동 규칙
|
||||||
|
|
||||||
1. **input.md 먼저 읽기** — 사회자의 지시, 상대 의견, 방향이 담겨 있음
|
1. **input.md 먼저 읽기** — 사회자의 지시, 상대 의견 전문, 방향이 담겨 있음
|
||||||
2. **전문으로 답변** — 요약하지 마세요. 논거를 구체적으로 전개하세요
|
2. **전문으로 답변** — 요약하지 마세요. 논거를 구체적으로 전개하세요
|
||||||
3. **상대 의견 검증** — 오류·누락·논리적 허점을 확인하세요
|
3. **상대 의견 검증** — 오류·누락·논리적 허점을 확인하세요
|
||||||
4. **개선안 제시** — 단순 반론이 아니라 대안/보강을 함께 제시하세요
|
4. **사회자 취합 검증** — `wiki/working_document.md`에 사회자가 양측 의견을 올바르게 반영했는지 확인하고, 누락/오류가 있으면 지적하세요
|
||||||
5. **근거 명시** — 기술적 근거, 사례, 레퍼런스를 포함하세요
|
5. **개선안 제시** — 단순 반론이 아니라 대안/보강을 함께 제시하세요
|
||||||
6. **합의 가능 시 인정** — 상대 의견이 맞으면 솔직히 인정하고 발전시키세요
|
6. **근거 명시** — 기술적 근거, 사례, 레퍼런스를 포함하세요
|
||||||
7. **wiki/ 참고** — 이전에 합의된 사항과 모순되지 않게 답변하세요
|
7. **합의 가능 시 인정** — 상대 의견이 맞으면 솔직히 인정하고 발전시키세요
|
||||||
|
8. **wiki/ 참고** — 이전에 합의된 사항과 모순되지 않게 답변하세요
|
||||||
|
|
||||||
## 금지 사항
|
## 금지 사항
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user