feat(knowledge-flywheel): add Phase 3 Knowledge Flywheel — AI analysis, review queue, analytics

Phase 3 implementation:
- AI session analysis service that generates flow proposals from resolved sessions
- APScheduler job for batch processing pending analyses (max_instances=1)
- Knowledge gap detection (weak options, high escalation signals)
- Flow proposals CRUD with team admin review workflow (approve/edit/dismiss/reject)
- FlowPilot analytics dashboard with confidence tiers, PSA metrics, knowledge gaps
- In-session script generator component
- Review queue page with filtering and proposal detail panel

Bug fixes from review (12 total):
- Fix "Edit & Publish" navigating to non-existent /editor/new route
- Hide Approve button for enhancement proposals (require Edit & Publish)
- Add max_instances=1 to scheduler to prevent TOCTOU race
- Fix eventual_success case() double-counting failed retries
- Add tree_structure validation before creating tree from proposal
- Simplify script generator rendering condition
- Add severity style fallback, toFixed on rates, Link instead of <a href>
- Add toast.warning on dismiss failure, fix dedup for domain-less sessions
- Cast Decimal to int in knowledge gap evidence dicts

Also updates CLAUDE.md with lessons 67-71 and Phase 3 project structure.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-19 05:12:10 +00:00
parent ce118b51d8
commit 9bad49d568
42 changed files with 5427 additions and 13 deletions

View File

@@ -0,0 +1,38 @@
// ── Flow Proposals (Knowledge Flywheel / Review Queue) ──
export interface FlowProposalSummary {
id: string
proposal_type: 'new_flow' | 'enhancement' | 'branch_addition' | 'auto_reinforced'
title: string
description: string | null
problem_domain: string | null
confidence_score: number
supporting_session_count: number
status: 'pending' | 'approved' | 'modified' | 'rejected' | 'dismissed' | 'auto_reinforced'
target_flow_id: string | null
source_session_id: string
created_at: string
}
export interface FlowProposalDetail extends FlowProposalSummary {
proposed_flow_data: Record<string, unknown>
proposed_diff: Record<string, unknown> | null
supporting_session_ids: string[]
reviewer_notes: string | null
reviewed_by: string | null
reviewed_at: string | null
}
export interface ReviewProposalRequest {
action: 'approve' | 'reject' | 'modify' | 'dismiss'
reviewer_notes?: string | null
modified_flow_data?: Record<string, unknown> | null
}
export interface FlowProposalStats {
pending_count: number
approved_this_week: number
rejected_this_week: number
auto_reinforced_this_week: number
top_domains: Array<{ domain: string; count: number }>
}

View File

@@ -0,0 +1,79 @@
export interface MTTRDataPoint {
date: string
mttr_minutes: number
session_count: number
}
export interface DomainBreakdown {
domain: string
total: number
resolved: number
escalated: number
resolution_rate: number
}
export interface ConfidenceBreakdown {
guided_sessions: number
guided_resolution_rate: number
exploring_sessions: number
exploring_resolution_rate: number
discovery_sessions: number
discovery_resolution_rate: number
}
export interface DomainCoverage {
domain: string
flow_count: number
session_count: number
guided_rate: number
}
export interface KnowledgeCoverage {
total_flows: number
ai_generated_flows: number
total_proposals_pending: number
proposals_approved_this_period: number
proposals_rejected_this_period: number
coverage_by_domain: DomainCoverage[]
}
export interface PsaMetrics {
ticket_link_rate: number
auto_push_success_rate: number
auto_push_retry_success_rate: number
total_time_entries_logged: number
total_hours_logged: number
}
export interface FlowPilotDashboard {
period: string
total_sessions: number
resolved_sessions: number
escalated_sessions: number
abandoned_sessions: number
resolution_rate: number
avg_steps_to_resolution: number
avg_session_duration_minutes: number
avg_rating: number | null
mttr_minutes: number | null
mttr_trend: MTTRDataPoint[]
sessions_by_domain: DomainBreakdown[]
confidence_breakdown: ConfidenceBreakdown
knowledge_coverage: KnowledgeCoverage
psa_metrics: PsaMetrics | null
}
export interface KnowledgeGap {
gap_type: string
domain: string | null
severity: 'high' | 'medium' | 'low'
title: string
description: string
evidence: Record<string, unknown>
suggested_action: string
}
export interface KnowledgeGapReport {
generated_at: string
gaps: KnowledgeGap[]
}

View File

@@ -13,6 +13,8 @@ export * from './analytics'
export * from './copilot'
export type { AssistantChat, AssistantChatMessage, ChatListItem, ChatMessageResponse, RetentionSettings } from './assistant-chat'
export * from './ai-session'
export * from './flow-proposal'
export * from './flowpilot-analytics'
// API response wrapper types
export interface PaginatedResponse<T> {

View File

@@ -73,7 +73,8 @@ export interface ScriptTemplateDetail extends ScriptTemplateListItem {
export interface ScriptGenerateRequest {
template_id: string
parameters: Record<string, unknown>
session_id?: string // Phase 3: passed when generating inside a session
session_id?: string // Legacy tree-based session
ai_session_id?: string // FlowPilot AI session
}
export interface ScriptGenerateResponse {