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