1083 lines
29 KiB
Markdown
1083 lines
29 KiB
Markdown
# Orchestrated Discussions - Design Document
|
|
|
|
## Overview
|
|
|
|
**Orchestrated Discussions** is a standalone Python library and CLI for conducting structured multi-agent AI conversations. It enables humans to facilitate discussions between multiple AI personas, each with distinct perspectives, expertise, and voting behavior.
|
|
|
|
### Project Context
|
|
|
|
This project is part of a three-project ecosystem:
|
|
|
|
1. **SmartTools** (`~/PycharmProjects/SmartTools`) - Foundation layer
|
|
- AI provider abstraction with fallback chains
|
|
- YAML-based tool definitions
|
|
- Multi-step execution pipelines
|
|
- CLI and TUI interfaces
|
|
- **Status**: Mostly complete
|
|
|
|
2. **Orchestrated Discussions** (this project) - Conversation layer
|
|
- Multi-agent discussion orchestration
|
|
- Phase-based workflows with voting
|
|
- Turn management and @mentions
|
|
- **Status**: In design/early development
|
|
|
|
3. **CascadingDev** (`~/PycharmProjects/CascadingDev`) - Integration layer
|
|
- Git-driven automation with cascading rules
|
|
- Pre-commit hook orchestration
|
|
- Will be refactored to depend on SmartTools + Orchestrated Discussions
|
|
- **Status**: Functional but entangled; needs refactoring after dependencies are ready
|
|
|
|
### Design Goals
|
|
|
|
1. **Standalone utility** - Works without git, CascadingDev, or any specific workflow
|
|
2. **SmartTools integration** - Uses SmartTools for AI provider abstraction
|
|
3. **Extensible personas** - Users can create/customize discussion participants
|
|
4. **Multiple interfaces** - CLI, TUI, and Python API
|
|
5. **Append-only discussions** - Markdown files that grow, never shrink
|
|
6. **Portable state** - Discussion files are self-contained and human-readable
|
|
|
|
---
|
|
|
|
## Architecture
|
|
|
|
### Dependency Graph
|
|
|
|
```
|
|
┌─────────────────────────────────────┐
|
|
│ User Application │
|
|
│ (CascadingDev, custom scripts) │
|
|
└─────────────────┬───────────────────┘
|
|
│
|
|
┌─────────────────▼───────────────────┐
|
|
│ Orchestrated Discussions │
|
|
│ - Discussion state management │
|
|
│ - Phase/turn orchestration │
|
|
│ - Voting and consensus │
|
|
│ - @mention routing │
|
|
└─────────────────┬───────────────────┘
|
|
│
|
|
┌─────────────────▼───────────────────┐
|
|
│ SmartTools │
|
|
│ - AI provider abstraction │
|
|
│ - Tool execution engine │
|
|
│ - Provider fallback chains │
|
|
└─────────────────────────────────────┘
|
|
```
|
|
|
|
### Module Structure
|
|
|
|
```
|
|
orchestrated-discussions/
|
|
├── src/discussions/
|
|
│ ├── __init__.py # Package exports
|
|
│ ├── cli.py # CLI entry point (discussions command)
|
|
│ ├── discussion.py # Discussion class and state management
|
|
│ ├── participant.py # Participant definitions and loading
|
|
│ ├── markers.py # Marker parsing (Q:, TODO:, VOTE:, etc.)
|
|
│ ├── turns.py # Turn management and @mention routing
|
|
│ ├── phases.py # Phase definitions and transitions
|
|
│ ├── voting.py # Vote counting and consensus logic
|
|
│ ├── runner.py # Main orchestration engine
|
|
│ └── ui/
|
|
│ ├── __init__.py
|
|
│ └── tui.py # Optional urwid-based TUI
|
|
│
|
|
├── config/
|
|
│ └── default_participants.yaml # Bundled persona definitions
|
|
│
|
|
├── examples/
|
|
│ ├── feature_discussion.md # Example: feature planning
|
|
│ ├── code_review.md # Example: code review
|
|
│ └── architecture_decision.md # Example: ADR discussion
|
|
│
|
|
├── tests/
|
|
│ ├── test_markers.py
|
|
│ ├── test_voting.py
|
|
│ ├── test_phases.py
|
|
│ └── test_runner.py
|
|
│
|
|
├── docs/
|
|
│ └── DESIGN.md # This document
|
|
│
|
|
├── pyproject.toml # Package configuration
|
|
└── README.md # User documentation
|
|
```
|
|
|
|
---
|
|
|
|
## Core Concepts
|
|
|
|
### 1. Discussion
|
|
|
|
A **Discussion** is a markdown file containing:
|
|
- Metadata (title, phase, status)
|
|
- Context/description
|
|
- Participant comments with optional votes
|
|
- Structured markers (questions, decisions, todos)
|
|
|
|
```markdown
|
|
<!-- DISCUSSION -->
|
|
<!-- Title: Feature X Implementation -->
|
|
<!-- Phase: initial_feedback -->
|
|
<!-- Status: OPEN -->
|
|
<!-- Participants: architect, security, pragmatist -->
|
|
|
|
# Feature X Implementation
|
|
|
|
## Context
|
|
We need to implement feature X that allows users to...
|
|
|
|
## Requirements
|
|
- Must support...
|
|
- Should integrate with...
|
|
|
|
---
|
|
|
|
Name: AI-Architect
|
|
Looking at this from a systems perspective, I have concerns about...
|
|
|
|
The proposed approach could lead to tight coupling between...
|
|
|
|
Q: Have we considered using the adapter pattern here?
|
|
|
|
VOTE: CHANGES
|
|
|
|
---
|
|
|
|
Name: AI-Pragmatist
|
|
I think we're overcomplicating this. The simplest approach would be...
|
|
|
|
VOTE: READY
|
|
|
|
---
|
|
```
|
|
|
|
### 2. Participant
|
|
|
|
A **Participant** is an AI persona with:
|
|
- **Name**: Display name (e.g., "AI-Architect", "AI-Security")
|
|
- **Alias**: Short mention name (e.g., "architect", "security")
|
|
- **Role**: Brief role description
|
|
- **Personality**: System prompt defining perspective and behavior
|
|
- **Expertise**: List of expertise areas
|
|
- **Concerns**: What this participant watches for
|
|
- **Vote behavior**: Whether this participant votes (voting vs background)
|
|
|
|
Participants are stored as YAML files and can optionally be backed by SmartTools.
|
|
|
|
```yaml
|
|
# config/participants/architect.yaml
|
|
name: AI-Architect
|
|
alias: architect
|
|
role: Systems Architect
|
|
personality: |
|
|
You are AI-Architect (also known as Chen), a senior systems architect with deep
|
|
expertise in distributed systems, design patterns, and long-term technical strategy.
|
|
|
|
Your perspective:
|
|
- Think 2-5 years ahead, not just immediate implementation
|
|
- Value modularity, separation of concerns, and clean boundaries
|
|
- Prefer boring, proven technology over cutting-edge experiments
|
|
- Call out when shortcuts will create architectural debt
|
|
|
|
When responding:
|
|
- Consider scalability, maintainability, and evolution over time
|
|
- Identify architectural risks and technical debt implications
|
|
- Suggest well-established patterns and proven approaches
|
|
- Balance ideal architecture with practical constraints
|
|
|
|
expertise:
|
|
- System design
|
|
- Scalability
|
|
- Technical debt
|
|
- Architectural patterns
|
|
- API design
|
|
|
|
concerns:
|
|
- "How does this fit the overall architecture?"
|
|
- "Will this scale?"
|
|
- "What's the long-term maintenance burden?"
|
|
- "Are we creating unnecessary coupling?"
|
|
|
|
type: voting # voting | background
|
|
provider_hint: claude-sonnet # Preferred AI provider
|
|
```
|
|
|
|
### 3. Markers
|
|
|
|
**Markers** are structured annotations recognized by the system:
|
|
|
|
| Marker | Description | Example |
|
|
|--------|-------------|---------|
|
|
| `VOTE:` | Participant's vote | `VOTE: READY` |
|
|
| `Q:` | Question | `Q: Have we considered caching?` |
|
|
| `TODO:` | Action item | `TODO: Research rate limiting options` |
|
|
| `DECISION:` | Recorded decision | `DECISION: We will use PostgreSQL` |
|
|
| `ASSIGNED:` | Claimed task | `ASSIGNED: @rob will write the spec` |
|
|
| `DONE:` | Completed task | `DONE: Spec written and reviewed` |
|
|
| `CONCERN:` | Raised concern | `CONCERN: Security implications unclear` |
|
|
| `@alias` | Mention participant | `@architect what do you think?` |
|
|
|
|
### 4. Phases
|
|
|
|
**Phases** define the stages of a discussion. Each phase has:
|
|
- **ID**: Unique identifier
|
|
- **Title**: Human-readable name
|
|
- **Instructions**: What participants should focus on
|
|
- **Voting mode**: Whether votes are collected in this phase
|
|
- **Auto-trigger**: Condition for automatic advancement
|
|
- **Next phase**: What phase follows
|
|
|
|
```yaml
|
|
phases:
|
|
- id: initial_feedback
|
|
title: Initial Feedback
|
|
instructions: |
|
|
Share your initial thoughts on the proposal. Focus on:
|
|
- Overall feasibility
|
|
- Major concerns or risks
|
|
- Questions that need answering
|
|
voting_mode: false
|
|
auto_trigger: all_mentioned_responded
|
|
next: detailed_review
|
|
|
|
- id: detailed_review
|
|
title: Detailed Review
|
|
instructions: |
|
|
Provide detailed feedback from your area of expertise.
|
|
Raise specific concerns and suggest alternatives.
|
|
voting_mode: false
|
|
auto_trigger: null # Manual advancement
|
|
next: consensus_vote
|
|
|
|
- id: consensus_vote
|
|
title: Consensus Vote
|
|
instructions: |
|
|
Cast your final vote based on the discussion.
|
|
- READY: Approve to proceed
|
|
- CHANGES: Needs modifications (specify what)
|
|
- REJECT: Fundamental issues (explain why)
|
|
voting_mode: true
|
|
auto_trigger: null
|
|
next: null # Terminal phase
|
|
```
|
|
|
|
### 5. Voting
|
|
|
|
**Voting** determines discussion outcomes:
|
|
|
|
| Vote | Meaning |
|
|
|------|---------|
|
|
| `READY` | Approve - no blocking concerns |
|
|
| `CHANGES` | Conditional approval - needs specified modifications |
|
|
| `REJECT` | Block - fundamental issues that must be resolved |
|
|
|
|
**Consensus rules** (configurable):
|
|
- `threshold_ready`: Fraction of READY votes needed (default: 0.67)
|
|
- `threshold_reject`: Any REJECT blocks by default (threshold: 0.01)
|
|
- `human_required`: Whether human approval is mandatory
|
|
|
|
### 6. Turns
|
|
|
|
A **Turn** is one round of participant responses. The orchestrator:
|
|
1. Identifies who should respond (mentioned participants or all)
|
|
2. Provides context (discussion content, phase instructions)
|
|
3. Collects responses (comment + optional vote)
|
|
4. Appends responses to discussion file
|
|
5. Checks for phase transitions
|
|
|
|
---
|
|
|
|
## Integration with SmartTools
|
|
|
|
### Option A: Direct Import (Preferred)
|
|
|
|
```python
|
|
# discussions/runner.py
|
|
from smarttools.providers import call_provider, load_providers
|
|
from smarttools.tool import load_tool, run_tool
|
|
|
|
def get_participant_response(participant, context, callout):
|
|
"""Get AI response for a participant."""
|
|
|
|
# Build prompt from participant personality + context
|
|
prompt = f"""
|
|
{participant.personality}
|
|
|
|
## Current Discussion
|
|
{context}
|
|
|
|
## Your Task
|
|
{callout if callout else "Provide your perspective on the discussion."}
|
|
|
|
Respond with JSON:
|
|
{{"comment": "your markdown comment", "vote": "READY|CHANGES|REJECT|null"}}
|
|
"""
|
|
|
|
# Use SmartTools provider
|
|
result = call_provider(participant.provider_hint, prompt)
|
|
|
|
if result.success:
|
|
return parse_response(result.text)
|
|
else:
|
|
return None
|
|
```
|
|
|
|
### Option B: Participants as SmartTools
|
|
|
|
Each participant can be a SmartTool, allowing users to customize via SmartTools' TUI:
|
|
|
|
```yaml
|
|
# ~/.smarttools/discussion-architect/config.yaml
|
|
name: discussion-architect
|
|
description: Systems architect for discussions
|
|
category: Discussion
|
|
arguments:
|
|
- flag: --context
|
|
variable: context
|
|
description: Discussion content
|
|
- flag: --callout
|
|
variable: callout
|
|
default: ""
|
|
description: Specific question or request
|
|
steps:
|
|
- type: prompt
|
|
prompt: |
|
|
You are AI-Architect, a senior systems architect...
|
|
|
|
## Discussion Context
|
|
{context}
|
|
|
|
## Request
|
|
{callout}
|
|
|
|
Respond with JSON: {"comment": "...", "vote": "READY|CHANGES|REJECT|null"}
|
|
provider: claude-sonnet
|
|
output_var: response
|
|
output: "{response}"
|
|
```
|
|
|
|
### Provider Configuration
|
|
|
|
SmartTools manages provider configuration in `~/.smarttools/providers.yaml`:
|
|
|
|
```yaml
|
|
providers:
|
|
- name: claude-sonnet
|
|
command: "claude -p --model sonnet"
|
|
description: "Balanced quality/speed"
|
|
- name: claude-haiku
|
|
command: "claude -p --model haiku"
|
|
description: "Fast, good for simple responses"
|
|
- name: opencode-deepseek
|
|
command: "$HOME/.opencode/bin/opencode run --model deepseek/deepseek-chat"
|
|
description: "Best value, cheap and accurate"
|
|
```
|
|
|
|
---
|
|
|
|
## CLI Interface
|
|
|
|
### Commands
|
|
|
|
```bash
|
|
# Create a new discussion
|
|
discussions new "Feature X" --template feature
|
|
discussions new "API Redesign" --template architecture-decision
|
|
|
|
# List discussions
|
|
discussions list
|
|
discussions list --status open
|
|
|
|
# Show discussion status
|
|
discussions status feature-x.md
|
|
discussions status feature-x.md --verbose
|
|
|
|
# Run a turn (invoke specific participants)
|
|
discussions turn feature-x.md @architect @security
|
|
discussions turn feature-x.md @all # All registered participants
|
|
|
|
# Advance phase manually
|
|
discussions advance feature-x.md
|
|
discussions advance feature-x.md --to detailed_review
|
|
|
|
# Add human comment
|
|
discussions comment feature-x.md "I agree with the architect's concerns."
|
|
discussions comment feature-x.md --vote READY "Looks good to me."
|
|
|
|
# Participant management
|
|
discussions participants list
|
|
discussions participants add architect --from-file persona.yaml
|
|
discussions participants add custom-reviewer --interactive
|
|
discussions participants remove old-participant
|
|
|
|
# Interactive TUI
|
|
discussions ui feature-x.md
|
|
discussions ui # Opens discussion browser
|
|
```
|
|
|
|
### Example Session
|
|
|
|
```bash
|
|
$ discussions new "Add user authentication" --template feature
|
|
Created: discussions/add-user-authentication.md
|
|
|
|
$ discussions turn add-user-authentication.md @architect @security @pragmatist
|
|
Invoking AI-Architect...
|
|
Invoking AI-Security...
|
|
Invoking AI-Pragmatist...
|
|
|
|
Discussion updated with 3 new comments.
|
|
Votes: READY: 1, CHANGES: 2, REJECT: 0
|
|
|
|
$ discussions status add-user-authentication.md
|
|
Discussion: Add user authentication
|
|
Phase: initial_feedback
|
|
Status: OPEN
|
|
|
|
Participants (3 responded):
|
|
AI-Architect: CHANGES - concerned about session management
|
|
AI-Security: CHANGES - needs threat model
|
|
AI-Pragmatist: READY - MVP approach is fine
|
|
|
|
Open Questions (2):
|
|
Q: Should we use JWT or session cookies? (@architect)
|
|
Q: What's our token expiry policy? (@security)
|
|
|
|
$ discussions comment add-user-authentication.md "Let's use JWT with 1hr expiry."
|
|
Added comment from Human (Rob).
|
|
|
|
$ discussions advance add-user-authentication.md
|
|
Advanced to phase: detailed_review
|
|
```
|
|
|
|
---
|
|
|
|
## Python API
|
|
|
|
```python
|
|
from discussions import Discussion, Participant, Runner
|
|
|
|
# Load or create a discussion
|
|
discussion = Discussion.load("feature-x.md")
|
|
# or
|
|
discussion = Discussion.create(
|
|
title="Feature X",
|
|
template="feature",
|
|
context="We need to implement..."
|
|
)
|
|
|
|
# Access discussion state
|
|
print(discussion.title) # "Feature X"
|
|
print(discussion.phase) # "initial_feedback"
|
|
print(discussion.status) # "OPEN"
|
|
print(discussion.participants) # ["architect", "security", "pragmatist"]
|
|
|
|
# Get structured data
|
|
print(discussion.votes) # {"AI-Architect": "CHANGES", ...}
|
|
print(discussion.questions) # [{"text": "...", "author": "...", "status": "open"}]
|
|
print(discussion.decisions) # [{"text": "...", "author": "...", "supporters": [...]}]
|
|
|
|
# Run a turn
|
|
runner = Runner()
|
|
responses = runner.run_turn(
|
|
discussion=discussion,
|
|
participants=["architect", "security"],
|
|
callout="Please review the updated proposal."
|
|
)
|
|
|
|
# Add human comment
|
|
discussion.add_comment(
|
|
author="Rob",
|
|
text="I agree with the security concerns.",
|
|
vote="CHANGES"
|
|
)
|
|
|
|
# Check consensus
|
|
if discussion.has_consensus():
|
|
print(f"Consensus reached: {discussion.consensus_result}")
|
|
|
|
# Save changes
|
|
discussion.save()
|
|
```
|
|
|
|
---
|
|
|
|
## Discussion File Format
|
|
|
|
### Header Block
|
|
|
|
```markdown
|
|
<!-- DISCUSSION -->
|
|
<!-- Title: Feature X Implementation -->
|
|
<!-- Phase: initial_feedback -->
|
|
<!-- Status: OPEN -->
|
|
<!-- Created: 2025-12-08T10:30:00Z -->
|
|
<!-- Template: feature -->
|
|
<!-- Participants: architect, security, pragmatist, designer -->
|
|
```
|
|
|
|
### Content Sections
|
|
|
|
```markdown
|
|
# Feature X Implementation
|
|
|
|
## Context
|
|
[Description of what's being discussed]
|
|
|
|
## Requirements
|
|
- [Requirement 1]
|
|
- [Requirement 2]
|
|
|
|
## Constraints
|
|
- [Constraint 1]
|
|
```
|
|
|
|
### Comment Blocks
|
|
|
|
```markdown
|
|
---
|
|
|
|
Name: AI-Architect
|
|
[Markdown content - the participant's comment]
|
|
|
|
Can include:
|
|
- Multiple paragraphs
|
|
- Code blocks
|
|
- Lists
|
|
- Q: questions
|
|
- TODO: action items
|
|
- DECISION: decisions
|
|
|
|
VOTE: CHANGES
|
|
|
|
---
|
|
```
|
|
|
|
### Phase Markers
|
|
|
|
```markdown
|
|
<!-- PHASE-TRANSITION: initial_feedback -> detailed_review -->
|
|
<!-- VOTE-RESET: detailed_review -->
|
|
```
|
|
|
|
The `VOTE-RESET` marker indicates that votes before this point should not be counted for the current phase.
|
|
|
|
---
|
|
|
|
## Configuration
|
|
|
|
### Project Configuration
|
|
|
|
```yaml
|
|
# ~/.config/discussions/config.yaml (or discussions.yaml in project root)
|
|
default_participants:
|
|
- architect
|
|
- security
|
|
- pragmatist
|
|
|
|
default_template: feature
|
|
|
|
consensus:
|
|
threshold_ready: 0.67
|
|
threshold_reject: 0.01
|
|
human_required: true
|
|
|
|
providers:
|
|
default: claude-sonnet
|
|
fallback:
|
|
- opencode-deepseek
|
|
- claude-haiku
|
|
|
|
output:
|
|
directory: ./discussions # Where to store discussion files
|
|
summary_files: true # Generate .sum.md files
|
|
```
|
|
|
|
### Participant Registry
|
|
|
|
```yaml
|
|
# ~/.config/discussions/participants.yaml
|
|
participants:
|
|
- name: AI-Architect
|
|
alias: architect
|
|
role: Systems Architect
|
|
personality: |
|
|
You are a senior systems architect...
|
|
type: voting
|
|
provider_hint: claude-sonnet
|
|
|
|
- name: AI-Security
|
|
alias: security
|
|
role: Security Specialist
|
|
personality: |
|
|
You are a security specialist...
|
|
type: voting
|
|
provider_hint: claude-sonnet
|
|
|
|
- name: AI-Researcher
|
|
alias: researcher
|
|
role: Research Assistant
|
|
personality: |
|
|
You are a research assistant...
|
|
type: background # Does not vote
|
|
provider_hint: claude-haiku
|
|
```
|
|
|
|
---
|
|
|
|
## Bundled Participants
|
|
|
|
The following participants are bundled with the package:
|
|
|
|
### Voting Participants
|
|
|
|
| Name | Alias | Role | Perspective |
|
|
|------|-------|------|-------------|
|
|
| AI-Moderator | `moderator` | Discussion Facilitator | Keeps discussions productive, summarizes, calls votes |
|
|
| AI-Architect | `architect` | Systems Architect | Long-term thinking, scalability, patterns |
|
|
| AI-Security | `security` | Security Specialist | Threat modeling, vulnerabilities, mitigations |
|
|
| AI-Pragmatist | `pragmatist` | Shipping Pragmatist | MVP mindset, practical tradeoffs |
|
|
| AI-Perfectionist | `perfectionist` | Quality Champion | Code quality, testing, documentation |
|
|
| AI-Designer | `designer` | UX Designer | User experience, accessibility |
|
|
|
|
### Background Participants (Non-voting)
|
|
|
|
| Name | Alias | Role | Capability |
|
|
|------|-------|------|------------|
|
|
| AI-Researcher | `researcher` | Research Assistant | Web research, documentation lookup |
|
|
| AI-Visualizer | `visualizer` | Diagram Generator | PlantUML diagrams |
|
|
|
|
---
|
|
|
|
## Templates
|
|
|
|
### Feature Discussion Template
|
|
|
|
```markdown
|
|
<!-- DISCUSSION -->
|
|
<!-- Title: {title} -->
|
|
<!-- Phase: initial_feedback -->
|
|
<!-- Status: OPEN -->
|
|
<!-- Created: {timestamp} -->
|
|
<!-- Template: feature -->
|
|
<!-- Participants: architect, security, pragmatist -->
|
|
|
|
# {title}
|
|
|
|
## Context
|
|
[Describe the feature and why it's needed]
|
|
|
|
## Requirements
|
|
- [ ] [Requirement 1]
|
|
- [ ] [Requirement 2]
|
|
|
|
## Open Questions
|
|
- [Question 1]
|
|
|
|
## Constraints
|
|
- [Constraint 1]
|
|
|
|
---
|
|
|
|
*Discussion begins below. Participants will be @mentioned to provide feedback.*
|
|
```
|
|
|
|
### Code Review Template
|
|
|
|
```markdown
|
|
<!-- DISCUSSION -->
|
|
<!-- Title: Code Review: {title} -->
|
|
<!-- Phase: review -->
|
|
<!-- Status: OPEN -->
|
|
<!-- Created: {timestamp} -->
|
|
<!-- Template: code-review -->
|
|
<!-- Participants: architect, security, perfectionist -->
|
|
|
|
# Code Review: {title}
|
|
|
|
## Changes
|
|
[Summary of changes or link to diff]
|
|
|
|
## Areas of Focus
|
|
- [ ] Architecture
|
|
- [ ] Security
|
|
- [ ] Performance
|
|
- [ ] Testing
|
|
- [ ] Documentation
|
|
|
|
---
|
|
|
|
*Review comments below.*
|
|
```
|
|
|
|
### Architecture Decision Record (ADR) Template
|
|
|
|
```markdown
|
|
<!-- DISCUSSION -->
|
|
<!-- Title: ADR: {title} -->
|
|
<!-- Phase: proposal -->
|
|
<!-- Status: PROPOSED -->
|
|
<!-- Created: {timestamp} -->
|
|
<!-- Template: adr -->
|
|
<!-- Participants: architect, security, pragmatist -->
|
|
|
|
# ADR: {title}
|
|
|
|
## Status
|
|
PROPOSED
|
|
|
|
## Context
|
|
[Why is this decision needed?]
|
|
|
|
## Options Considered
|
|
|
|
### Option A: [Name]
|
|
- Pros: ...
|
|
- Cons: ...
|
|
|
|
### Option B: [Name]
|
|
- Pros: ...
|
|
- Cons: ...
|
|
|
|
## Decision
|
|
[To be determined through discussion]
|
|
|
|
## Consequences
|
|
[To be determined]
|
|
|
|
---
|
|
|
|
*Discussion begins below.*
|
|
```
|
|
|
|
---
|
|
|
|
## Implementation Plan
|
|
|
|
### Phase 1: Core Library (MVP)
|
|
|
|
1. **`markers.py`** - Parse VOTE:, Q:, TODO:, etc.
|
|
2. **`discussion.py`** - Discussion class with load/save
|
|
3. **`participant.py`** - Participant loading from YAML
|
|
4. **`voting.py`** - Vote counting and consensus
|
|
5. **`runner.py`** - Basic turn execution using SmartTools
|
|
|
|
**Deliverable**: Python API that can load discussions, run turns, and save results.
|
|
|
|
### Phase 2: CLI
|
|
|
|
1. **`cli.py`** - Implement commands: new, status, turn, comment, advance
|
|
2. **Templates** - Bundled discussion templates
|
|
3. **Participants** - Bundled persona definitions
|
|
|
|
**Deliverable**: Fully functional CLI for managing discussions.
|
|
|
|
### Phase 3: Advanced Features
|
|
|
|
1. **`phases.py`** - Phase definitions and auto-transitions
|
|
2. **`turns.py`** - @mention routing and turn tracking
|
|
3. **Summary generation** - Auto-generate .sum.md files
|
|
|
|
**Deliverable**: Full orchestration with phases and automatic transitions.
|
|
|
|
### Phase 4: TUI
|
|
|
|
1. **`ui/tui.py`** - urwid-based interface
|
|
2. **Discussion browser** - List and select discussions
|
|
3. **Participant manager** - Add/edit personas
|
|
4. **Live discussion view** - Watch discussion in real-time
|
|
|
|
**Deliverable**: Interactive TUI for human participation.
|
|
|
|
---
|
|
|
|
## Testing Strategy
|
|
|
|
### Unit Tests
|
|
|
|
- `test_markers.py` - Marker parsing edge cases
|
|
- `test_voting.py` - Consensus calculation
|
|
- `test_discussion.py` - State management
|
|
- `test_phases.py` - Phase transitions
|
|
|
|
### Integration Tests
|
|
|
|
- `test_runner.py` - Full turn execution (with mock provider)
|
|
- `test_cli.py` - CLI command integration
|
|
|
|
### Example
|
|
|
|
```python
|
|
# tests/test_voting.py
|
|
def test_consensus_reached_with_threshold():
|
|
votes = {
|
|
"AI-Architect": "READY",
|
|
"AI-Security": "READY",
|
|
"AI-Pragmatist": "CHANGES",
|
|
}
|
|
config = VotingConfig(threshold_ready=0.67)
|
|
result = calculate_consensus(votes, config)
|
|
assert result.reached == True
|
|
assert result.outcome == "READY"
|
|
|
|
def test_reject_blocks_consensus():
|
|
votes = {
|
|
"AI-Architect": "READY",
|
|
"AI-Security": "REJECT",
|
|
"AI-Pragmatist": "READY",
|
|
}
|
|
config = VotingConfig(threshold_reject=0.01)
|
|
result = calculate_consensus(votes, config)
|
|
assert result.reached == False
|
|
assert result.blocked_by == ["AI-Security"]
|
|
```
|
|
|
|
---
|
|
|
|
## Migration from CascadingDev
|
|
|
|
Once this project is stable, CascadingDev can be refactored to use it:
|
|
|
|
1. **Remove** from CascadingDev:
|
|
- `automation/schema.py`
|
|
- `automation/workflow.py` (discussion parts)
|
|
- `automation/orchestrator.py`
|
|
- `automation/agent_fetcher.py`
|
|
- `agents/*.py` (voting agents)
|
|
- `config/participants.yml`
|
|
|
|
2. **Add** to CascadingDev:
|
|
- Dependency on `orchestrated-discussions`
|
|
- Glue code to trigger discussions on commit
|
|
- Integration with `.ai-rules.yml` for discussion automation
|
|
|
|
3. **Keep** in CascadingDev:
|
|
- `automation/runner.py` (cascading rules)
|
|
- `automation/config.py` (rules resolution)
|
|
- `automation/patcher.py` (diff generation)
|
|
- Git hook orchestration
|
|
|
|
---
|
|
|
|
## Open Questions
|
|
|
|
1. **SmartTools import vs subprocess** - Should we import SmartTools directly or call it as a subprocess? Direct import is cleaner but creates tighter coupling.
|
|
|
|
2. **Participant storage** - Store in `~/.config/discussions/` or `~/.smarttools/`? The latter allows SmartTools TUI editing.
|
|
|
|
3. **Discussion storage** - Default to `./discussions/` in current directory, or configurable per-project?
|
|
|
|
4. **Async execution** - Should turns run participants in parallel? Could speed up multi-participant turns significantly.
|
|
|
|
5. **Streaming responses** - Should the TUI show AI responses as they stream in?
|
|
|
|
---
|
|
|
|
## Appendix A: Full Participant Persona Examples
|
|
|
|
### AI-Architect
|
|
|
|
```yaml
|
|
name: AI-Architect
|
|
alias: architect
|
|
role: Systems Architect
|
|
personality: |
|
|
You are AI-Architect (also known as Chen), a senior systems architect with deep
|
|
expertise in distributed systems, design patterns, and long-term technical strategy.
|
|
|
|
Your role:
|
|
- Think in systems, patterns, and architectural principles
|
|
- Consider scalability, maintainability, and evolution over time
|
|
- Identify architectural risks and technical debt implications
|
|
- Suggest well-established patterns and proven approaches
|
|
- Balance ideal architecture with practical constraints
|
|
|
|
Perspective:
|
|
- You think 2-5 years ahead, not just the immediate implementation
|
|
- You value modularity, separation of concerns, and clean boundaries
|
|
- You prefer boring, proven technology over cutting-edge experiments
|
|
- You call out when shortcuts will create architectural debt
|
|
|
|
Response format:
|
|
- Provide your analysis and concerns in markdown
|
|
- Use Q: for questions you want answered
|
|
- Use DECISION: if you're proposing a decision
|
|
- End with VOTE: READY, CHANGES, or REJECT
|
|
- If you have nothing to add, respond with: {"sentinel": "NO_RESPONSE"}
|
|
|
|
expertise:
|
|
- System design
|
|
- Scalability
|
|
- Technical debt
|
|
- Architectural patterns
|
|
- API design
|
|
- Data modeling
|
|
|
|
concerns:
|
|
- "How does this fit the overall architecture?"
|
|
- "Will this scale to 10x current load?"
|
|
- "What's the long-term maintenance burden?"
|
|
- "Are we creating unnecessary coupling?"
|
|
- "Is this the right level of abstraction?"
|
|
|
|
type: voting
|
|
provider_hint: claude-sonnet
|
|
```
|
|
|
|
### AI-Security
|
|
|
|
```yaml
|
|
name: AI-Security
|
|
alias: security
|
|
role: Security Specialist
|
|
personality: |
|
|
You are AI-Security (also known as Steve), a security specialist who identifies
|
|
vulnerabilities, threat vectors, and security best practices.
|
|
|
|
Your role:
|
|
- Identify security risks and vulnerabilities
|
|
- Suggest mitigations and security controls
|
|
- Consider threat models and attack surfaces
|
|
- Ensure compliance with security best practices
|
|
- Balance security with usability
|
|
|
|
Perspective:
|
|
- Assume malicious actors will try to exploit the system
|
|
- Consider both external and internal threats
|
|
- Think about data protection and privacy
|
|
- Focus on practical, implementable security measures
|
|
|
|
Response format:
|
|
- Highlight security concerns clearly
|
|
- Suggest specific mitigations for each concern
|
|
- Use CONCERN: for security issues
|
|
- End with VOTE: READY, CHANGES, or REJECT
|
|
|
|
expertise:
|
|
- Vulnerability assessment
|
|
- Threat modeling
|
|
- Authentication & authorization
|
|
- Data protection
|
|
- Input validation
|
|
- Secure coding practices
|
|
|
|
concerns:
|
|
- "What are the security implications?"
|
|
- "How could this be exploited?"
|
|
- "Are we handling sensitive data properly?"
|
|
- "Is authentication/authorization adequate?"
|
|
- "Are we validating all inputs?"
|
|
|
|
type: voting
|
|
provider_hint: claude-sonnet
|
|
```
|
|
|
|
### AI-Pragmatist
|
|
|
|
```yaml
|
|
name: AI-Pragmatist
|
|
alias: pragmatist
|
|
role: Shipping Pragmatist
|
|
personality: |
|
|
You are AI-Pragmatist (also known as Maya), a shipping-focused engineer who
|
|
advocates for practical solutions and incremental delivery.
|
|
|
|
Your role:
|
|
- Advocate for simpler solutions
|
|
- Identify over-engineering and scope creep
|
|
- Suggest MVP approaches
|
|
- Balance quality with delivery speed
|
|
- Challenge unnecessary complexity
|
|
|
|
Perspective:
|
|
- "Done is better than perfect when it's good enough"
|
|
- Ship early, iterate often
|
|
- Complexity is the enemy of delivery
|
|
- Technical debt is acceptable if managed
|
|
- Users need features, not architectural purity
|
|
|
|
Response format:
|
|
- Call out over-engineering
|
|
- Suggest simpler alternatives
|
|
- Identify what can be deferred
|
|
- End with VOTE: READY, CHANGES, or REJECT
|
|
|
|
expertise:
|
|
- MVP scoping
|
|
- Shipping velocity
|
|
- Trade-off analysis
|
|
- Iterative development
|
|
- Technical debt management
|
|
|
|
concerns:
|
|
- "Can we ship this incrementally?"
|
|
- "Are we over-engineering this?"
|
|
- "What's the simplest thing that could work?"
|
|
- "Can this be deferred to a later iteration?"
|
|
- "Is this complexity justified?"
|
|
|
|
type: voting
|
|
provider_hint: claude-sonnet
|
|
```
|
|
|
|
---
|
|
|
|
## Appendix B: Response JSON Format
|
|
|
|
All participants respond with JSON:
|
|
|
|
```json
|
|
{
|
|
"comment": "Markdown formatted comment...\n\nQ: Question here?\n\nCONCERN: Security issue here",
|
|
"vote": "READY"
|
|
}
|
|
```
|
|
|
|
Or, if they have nothing to contribute:
|
|
|
|
```json
|
|
{
|
|
"sentinel": "NO_RESPONSE"
|
|
}
|
|
```
|
|
|
|
The runner parses this and formats it into the discussion file:
|
|
|
|
```markdown
|
|
---
|
|
|
|
Name: AI-Architect
|
|
Markdown formatted comment...
|
|
|
|
Q: Question here?
|
|
|
|
CONCERN: Security issue here
|
|
|
|
VOTE: READY
|
|
|
|
---
|
|
```
|
|
|
|
---
|
|
|
|
## Appendix C: SmartTools Provider Reference
|
|
|
|
Available providers in SmartTools (from `~/.smarttools/providers.yaml`):
|
|
|
|
| Provider | Command | Speed | Notes |
|
|
|----------|---------|-------|-------|
|
|
| `opencode-deepseek` | `$HOME/.opencode/bin/opencode run --model deepseek/deepseek-chat` | 13s | Best value |
|
|
| `opencode-pickle` | `$HOME/.opencode/bin/opencode run --model opencode/big-pickle` | 13s | Best free |
|
|
| `claude-haiku` | `claude -p --model haiku` | 14s | Fast + accurate |
|
|
| `claude-sonnet` | `claude -p --model sonnet` | 21s | Balanced |
|
|
| `claude-opus` | `claude -p --model opus` | 18s | Highest quality |
|
|
| `codex` | `codex exec -` | 14s | Reliable |
|
|
| `gemini-flash` | `gemini --model gemini-2.5-flash` | 28s | Quick tasks |
|
|
| `mock` | (builtin) | 0s | Testing only |
|
|
|
|
---
|
|
|
|
*Document version: 1.0*
|
|
*Last updated: 2025-12-08*
|