Phase 06: Consensus & Export - 2 plans created - 4 total tasks defined - Ready for execution Plan 06-01: Consensus generation (M6) Plan 06-02: Markdown export (M7) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
4.9 KiB
| phase | plan | type |
|---|---|---|
| 06-consensus-export | 01 | execute |
Purpose: Enable users to synthesize discussion outcomes into structured agreements/disagreements (M6 milestone). Output: Working /consensus command that generates and displays AI-summarized consensus.
<execution_context> ~/.claude/get-shit-done/workflows/execute-phase.md ~/.claude/get-shit-done/templates/summary.md </execution_context>
@.planning/PROJECT.md @.planning/ROADMAP.md @.planning/STATE.mdPrior phase context (discussion infrastructure):
@.planning/phases/05-multi-model-discussions/05-03-SUMMARY.md
Source files to modify/reference:
@src/moai/core/models.py @src/moai/core/orchestrator.py @src/moai/core/services/discussion.py @src/moai/bot/handlers/discussion.py @src/moai/bot/handlers/commands.py
Tech stack available: python-telegram-bot, sqlalchemy, openai SDK, asyncio Established patterns: Service layer in core/services/, orchestrator for AI calls, handler delegation to services
Constraining decisions:
- Phase 05-03: build_context() assembles discussion history for AI context
- Phase 05-01: Discussion service with eager loading via selectinload
- Phase 04-01: AI client singleton pattern, MODEL_MAP for short names
SPEC.md consensus format:
- agreements: string[] (bullet points)
- disagreements: [{topic, positions: {model: position}}]
- Consensus model already exists with these fields
-
Add
generate_consensus(discussion: Discussion, model: str = "claude") -> dictfunction:- Build context from discussion using existing build_context()
- Append CONSENSUS_PROMPT as final user message
- Call AI client with system prompt explaining the task
- Parse JSON response (handle parsing errors gracefully)
- Return dict with "agreements" and "disagreements" keys
-
In discussion.py service, add:
save_consensus(discussion_id: str, agreements: list, disagreements: list, generated_by: str) -> Consensusget_consensus(discussion_id: str) -> Consensus | None
Use existing session patterns (async with get_session()). Import Consensus model.
Python imports succeed: python -c "from moai.core.orchestrator import generate_consensus; from moai.core.services.discussion import save_consensus, get_consensus"
generate_consensus() returns dict with agreements/disagreements, save_consensus() persists to DB, get_consensus() retrieves
**Agreements:**
- point 1
- point 2
**Disagreements:**
- **Topic:** {topic}
- Claude: {position}
- GPT: {position}
_Generated by {model}_
```
- Show typing indicator while generating
-
Register handler in init.py:
CommandHandler("consensus", consensus_command) -
Update HELP_TEXT in commands.py to add consensus under Output section:
/consensus- Generate consensus summary Bot responds to /consensus with either consensus output or appropriate error message /consensus generates and displays consensus for active discussion, or shows existing if already generated
<success_criteria>
- generate_consensus() calls AI and returns structured dict
- Consensus persisted to database via save_consensus()
- /consensus command displays formatted consensus
- Help text updated
- No ruff errors </success_criteria>