## Phase 8: Enterprise Extractor Improvements ✅ - 14 security extractors (TLS, JWT, SQL injection, XSS, etc.) - 10 framework-specific extractors (Spring, Django, Rails, etc.) - Config file security detection (YAML, TOML) ## Phase 9: Autonomous Extractor Generation ✅ - Shadow mode executor with TP/FP tracking - Graduation pipeline with confidence thresholds - Auto-rollback on regression detection - Cross-project pattern syncing ## UAT Suite Complete (14 scripts, 90 tests) - test-core-detection.sh (6 tests) - test-declarative-extractors.sh (5 tests) - test-domain-frameworks.sh (5 tests) - test-domain-unreal.sh (3 tests) - test-llm-extraction.sh (6 tests) - test-eval-harness.sh (5 tests) - test-cross-language.sh (3 tests) - test-precommit-performance.sh (4 tests) - test-output-formats.sh (8 tests) - test-drift-detection.sh (6 tests) - test-exit-codes.sh (12 tests) + 3 more scripts ## Other Changes - Updated roadmap to mark Phase 8-9 complete - Added .gitignore entries for build artifacts - Updated pre-commit: 800 line limit, exclude tests/data/cmd Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
350 lines
13 KiB
Markdown
350 lines
13 KiB
Markdown
# Disputed Roadmap
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌────────────────────────────────────────────────────────────┐
|
|
│ DISPUTED │
|
|
├────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ INPUT LAYER │
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
│ │ System Audio│ │ Mic Input │ │ Text Input │ │
|
|
│ │ (loopback) │ │ (live) │ │ (paste/OCR) │ │
|
|
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
|
|
│ │ │ │ │
|
|
│ └────────────────┼────────────────┘ │
|
|
│ ▼ │
|
|
│ TRANSCRIPTION LAYER │
|
|
│ ┌─────────────────────────────────────────┐ │
|
|
│ │ Whisper (local) / Groq API / Deepgram │ │
|
|
│ │ - Streaming transcription │ │
|
|
│ │ - Speaker diarization (future) │ │
|
|
│ └──────────────────┬──────────────────────┘ │
|
|
│ ▼ │
|
|
│ EXTRACTION LAYER │
|
|
│ ┌─────────────────────────────────────────┐ │
|
|
│ │ Claim Extractor (LLM) │ │
|
|
│ │ - Identifies factual claims │ │
|
|
│ │ - Structures as subject/predicate/obj │ │
|
|
│ │ - Assigns confidence from hedging │ │
|
|
│ │ - Extracts source metadata │ │
|
|
│ └──────────────────┬──────────────────────┘ │
|
|
│ ▼ │
|
|
│ STORAGE LAYER │
|
|
│ ┌─────────────────────────────────────────┐ │
|
|
│ │ Episteme (stemedb) │ │
|
|
│ │ - Append-only claim storage │ │
|
|
│ │ - Conflict detection via Lenses │ │
|
|
│ │ - Source provenance tracking │ │
|
|
│ │ - Trust tier scoring │ │
|
|
│ └──────────────────┬──────────────────────┘ │
|
|
│ ▼ │
|
|
│ UI LAYER │
|
|
│ ┌─────────────────────────────────────────┐ │
|
|
│ │ Tauri Desktop App │ │
|
|
│ │ - Menubar presence │ │
|
|
│ │ - Toast notifications │ │
|
|
│ │ - Claim browser / search │ │
|
|
│ │ - Conflict explorer │ │
|
|
│ └─────────────────────────────────────────┘ │
|
|
│ │
|
|
└────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Implementation Progress
|
|
|
|
### Week 1: Foundation & Core Pipeline ✅ COMPLETE
|
|
|
|
**Goal:** Clean, professional codebase foundation. One complete flow: paste text → extract claims → see results.
|
|
|
|
| Task | Status |
|
|
|------|--------|
|
|
| Type system foundation (`src/lib/types.ts`, `src/lib/schemas.ts`) | ✅ |
|
|
| Rust module organization (`src-tauri/src/commands/`, `types.rs`) | ✅ |
|
|
| Services layer (`src/services/`) with Zod validation | ✅ |
|
|
| Zustand stores (`src/stores/`) for state management | ✅ |
|
|
| React hooks (`src/hooks/`) for business logic | ✅ |
|
|
| App refactor to use hooks | ✅ |
|
|
| Quality gates (ESLint, Prettier, Clippy, pre-commit) | ✅ |
|
|
| Tauri app launches and displays UI | ✅ |
|
|
|
|
**Commands:**
|
|
```bash
|
|
npm run check # ESLint + TypeScript + Prettier
|
|
npm run tauri:dev # Development mode
|
|
cargo clippy # Rust linting
|
|
```
|
|
|
|
---
|
|
|
|
### Week 2: LLM Integration 🔜 NEXT
|
|
|
|
**Goal:** Real claim extraction using Claude/Groq APIs
|
|
|
|
| Task | Status |
|
|
|------|--------|
|
|
| LLM prompt for claim extraction | ⬜ |
|
|
| Claude API integration | ⬜ |
|
|
| Groq API as alternative | ⬜ |
|
|
| Structured output parsing | ⬜ |
|
|
| Batch extraction for longer text | ⬜ |
|
|
| API key settings UI | ⬜ |
|
|
| Error handling and retries | ⬜ |
|
|
|
|
**Key Files to Create/Modify:**
|
|
- `src-tauri/src/commands/llm.rs` - LLM API calls
|
|
- `src-tauri/src/prompts/` - Extraction prompts
|
|
- `src/components/settings-dialog.tsx` - API key configuration
|
|
|
|
---
|
|
|
|
### Week 3: Episteme Integration ⬜
|
|
|
|
**Goal:** Connect to knowledge graph for conflict detection
|
|
|
|
| Task | Status |
|
|
|------|--------|
|
|
| Embed stemedb as Rust dependency | ⬜ |
|
|
| Local database in `~/.disputed/` | ⬜ |
|
|
| Save claims with source metadata | ⬜ |
|
|
| Query existing claims for conflicts | ⬜ |
|
|
| Semantic similarity matching | ⬜ |
|
|
| Conflict status badges in UI | ⬜ |
|
|
|
|
---
|
|
|
|
### Week 4: Audio Pipeline ⬜
|
|
|
|
**Goal:** Listen to system audio → transcribe → extract claims
|
|
|
|
| Task | Status |
|
|
|------|--------|
|
|
| System audio capture (macOS ScreenCaptureKit) | ⬜ |
|
|
| Microphone input option | ⬜ |
|
|
| Groq Whisper API integration | ⬜ |
|
|
| Chunked streaming transcription | ⬜ |
|
|
| Real-time claim extraction | ⬜ |
|
|
| Audio source detection/labeling | ⬜ |
|
|
|
|
---
|
|
|
|
## Phase Overview
|
|
|
|
### Phase 1: Text Input MVP (Weeks 1-3)
|
|
|
|
**Goal:** Paste text → extract claims → save to Episteme → show conflicts
|
|
|
|
#### 1.1 Tauri App Shell ✅
|
|
- [x] Initialize Tauri project with Rust backend
|
|
- [x] Basic window with text input area
|
|
- [x] Type-safe frontend/backend communication
|
|
- [x] Quality gates (lint, format, typecheck)
|
|
- [ ] Menubar icon (system tray) - deferred
|
|
- [ ] Global hotkey to open input window - deferred
|
|
|
|
#### 1.2 Claim Extraction
|
|
- [x] Structured output: `{ subject, predicate, object, confidence, quote }`
|
|
- [ ] LLM prompt for claim extraction
|
|
- [ ] Integration with Claude API (or local Ollama)
|
|
- [ ] Batch extraction for longer text
|
|
|
|
#### 1.3 Episteme Integration
|
|
- [ ] Embed stemedb as Rust dependency
|
|
- [ ] Local database in `~/.disputed/`
|
|
- [ ] Save claims with source metadata (manual label for now)
|
|
- [ ] Query existing claims for conflicts
|
|
|
|
#### 1.4 Basic UI ✅
|
|
- [x] Display extracted claims before saving
|
|
- [x] Show status badges (new/matches/contradicts)
|
|
- [x] Accept/reject controls
|
|
- [ ] Show matching/conflicting claims from database
|
|
- [ ] Simple claim history view
|
|
|
|
**Deliverable:** App where you paste text, see claims, save them, see conflicts.
|
|
|
|
---
|
|
|
|
### Phase 2: Audio Transcription (Week 4+)
|
|
|
|
**Goal:** Listen to system audio → transcribe → extract claims in real-time
|
|
|
|
#### 2.1 Audio Capture
|
|
- [ ] System audio loopback (macOS: ScreenCaptureKit)
|
|
- [ ] Microphone input option
|
|
- [ ] Audio level indicator in menubar
|
|
- [ ] Start/stop recording controls
|
|
|
|
#### 2.2 Transcription Pipeline
|
|
- [ ] Groq Whisper API integration (fast, cheap)
|
|
- [ ] Chunked streaming (send 30s segments)
|
|
- [ ] Local Whisper option for privacy
|
|
- [ ] Handle overlapping chunks for continuity
|
|
|
|
#### 2.3 Streaming Extraction
|
|
- [ ] Process transcript chunks as they arrive
|
|
- [ ] Deduplicate claims across chunk boundaries
|
|
- [ ] Real-time toast notifications for new claims
|
|
- [ ] Buffer for context (don't extract from single sentences)
|
|
|
|
#### 2.4 Source Detection
|
|
- [ ] Auto-detect source from audio metadata if available
|
|
- [ ] Manual source labeling ("What are you listening to?")
|
|
- [ ] Remember recent sources for quick selection
|
|
|
|
**Deliverable:** Listen to a podcast, see claims pop up in real-time.
|
|
|
|
---
|
|
|
|
### Phase 3: Conflict Intelligence
|
|
|
|
**Goal:** Smart conflict detection and exploration
|
|
|
|
- [ ] Semantic similarity for related claims
|
|
- [ ] Contradiction classification (agrees/contradicts/related)
|
|
- [ ] Confidence-weighted conflict scoring
|
|
- [ ] Source diversity in conflicts
|
|
- [ ] Conflict explorer view
|
|
- [ ] Trust tier system for sources
|
|
|
|
---
|
|
|
|
### Phase 4: Browser Extension
|
|
|
|
**Goal:** Highlight text on any webpage → extract claims
|
|
|
|
- [ ] Chrome/Firefox extension
|
|
- [ ] Context menu: "Extract claims"
|
|
- [ ] Auto-detect article metadata
|
|
- [ ] Communicate with desktop app
|
|
|
|
---
|
|
|
|
### Phase 5: Intelligence Features
|
|
|
|
**Goal:** Proactive insights, not just reactive capture
|
|
|
|
- [ ] Topic clustering and summarization
|
|
- [ ] Source reliability scoring
|
|
- [ ] Belief evolution visualization
|
|
- [ ] Export/share functionality
|
|
|
|
---
|
|
|
|
## Tech Stack
|
|
|
|
| Component | Choice | Rationale |
|
|
|-----------|--------|-----------|
|
|
| Desktop Framework | Tauri 2.4 | Rust backend, small binary, native feel |
|
|
| Frontend | React 19, TypeScript 5.7 | Type safety, ecosystem |
|
|
| Styling | Tailwind 4, Shadcn components | Utility-first, accessible |
|
|
| State | Zustand 5 | Lightweight, TypeScript-first |
|
|
| Validation | Zod 4 | Runtime type safety |
|
|
| Backend | Rust + Episteme | Already built, append-only, conflict-aware |
|
|
| Transcription | Groq Whisper API | Fast (real-time), cheap ($0.02/hr) |
|
|
| Local Transcription | whisper.cpp | Privacy option, runs on M1/M2 well |
|
|
| Claim Extraction | Claude API | Best at structured extraction |
|
|
| Local Extraction | Ollama + Llama 3 | Privacy option |
|
|
|
|
---
|
|
|
|
## File Structure
|
|
|
|
```
|
|
applications/disputed/
|
|
├── vision.md # Product vision
|
|
├── roadmap.md # You are here
|
|
└── app/ # Tauri desktop app
|
|
├── package.json
|
|
├── tsconfig.json
|
|
├── vite.config.ts
|
|
├── eslint.config.js
|
|
├── .pre-commit-config.yaml
|
|
├── src/
|
|
│ ├── main.tsx
|
|
│ ├── App.tsx
|
|
│ ├── index.css
|
|
│ ├── lib/
|
|
│ │ ├── types.ts # Domain types
|
|
│ │ ├── schemas.ts # Zod validation
|
|
│ │ └── utils.ts # Utilities (cn)
|
|
│ ├── services/
|
|
│ │ ├── index.ts
|
|
│ │ ├── claims.ts # Tauri invoke wrappers
|
|
│ │ └── settings.ts
|
|
│ ├── stores/
|
|
│ │ ├── index.ts
|
|
│ │ ├── claims.ts # Zustand stores
|
|
│ │ └── settings.ts
|
|
│ ├── hooks/
|
|
│ │ ├── index.ts
|
|
│ │ ├── useClaims.ts # React hooks
|
|
│ │ └── useSettings.ts
|
|
│ └── components/
|
|
│ └── ui/ # Shadcn components
|
|
│ ├── button.tsx
|
|
│ ├── card.tsx
|
|
│ ├── badge.tsx
|
|
│ └── textarea.tsx
|
|
└── src-tauri/
|
|
├── Cargo.toml
|
|
├── tauri.conf.json
|
|
├── capabilities/
|
|
│ └── default.json
|
|
├── icons/
|
|
└── src/
|
|
├── main.rs
|
|
├── lib.rs # Tauri setup
|
|
├── types.rs # Rust types
|
|
└── commands/
|
|
├── mod.rs
|
|
├── claims.rs # Claim commands
|
|
└── settings.rs # Settings commands
|
|
```
|
|
|
|
---
|
|
|
|
## MVP Definition
|
|
|
|
**MVP = Phase 1 complete (Weeks 1-3)**
|
|
|
|
You can:
|
|
1. Open app
|
|
2. Paste text
|
|
3. See extracted claims (LLM-powered)
|
|
4. Save to local database (Episteme)
|
|
5. See conflicts with existing claims
|
|
|
|
This validates the core loop before adding audio complexity.
|
|
|
|
---
|
|
|
|
## Success Metrics
|
|
|
|
| Metric | Target | Why |
|
|
|--------|--------|-----|
|
|
| Claims saved per week | 50+ | Proves capture is frictionless |
|
|
| Conflicts surfaced | 5+ | Proves the core value prop |
|
|
| Retention (weekly active) | 60%+ | Proves ongoing value |
|
|
| Time to first conflict | < 5 min | Proves immediate value |
|
|
|
|
---
|
|
|
|
## Next Action
|
|
|
|
**Week 2: LLM Integration**
|
|
|
|
1. Add Claude API client to Rust backend
|
|
2. Create extraction prompt
|
|
3. Implement `extract_claims` command with real LLM calls
|
|
4. Add API key settings UI
|
|
5. Handle errors gracefully
|
|
|
|
```bash
|
|
cd disputed/app
|
|
npm run tauri:dev
|
|
```
|