Extend session store with real-time event capture and health invariants
还没有人认领这个 Issue。
评估
- 难度
- 5/5
- 预计耗时
- 一周以上
- 新手友好度
- 25/100
- Issue 类型
- 功能
- 描述清晰度
- 需要澄清
- 活跃度
- 停滞
- 技术栈
- rust
- 领域
- backend, observability
调研方向
Start by reading the existing persistence, search, and session-import paths in terraphim_sessions and the analysis entry points in terraphim-session-analyzer. Trace the listed integration points in terraphim_hooks, terraphim_service, terraphim_multi_agent, terraphim_types, and terraphim_mcp_server, then confirm scope before implementation; done means event capture, typed events, correlation IDs, invariant results, and the listed integrations are covered.
由索引模型根据 Issue 内容生成。
描述
Summary
Extend terraphim_sessions and terraphim-session-analyzer with real-time event-level capture, structured event types, and health invariant queries. Not a new crate -- the session store already has persistence, search, and KG enrichment.
Why Not a Separate Event Store?
Originally proposed as a new terraphim_event_store crate. But terraphim_sessions already:
- Parses session logs into structured records (costs, tool usage, patterns)
- Uses
terraphim_persistencebackends (SQLite, DashMap, S3) - Supports KG-enriched search via Aho-Corasick automata
- Has rayon-based parallel processing
A session IS a sequence of events. Building parallel storage is over-engineering.
What's Missing (Gaps to Fill)
1. Real-time capture (not just post-hoc import)
Currently: session logs are imported after the session ends.
Needed: events captured as they happen during a session.
Add a SessionEventEmitter trait:
pub trait SessionEventEmitter: Send + Sync {
async fn emit(&self, event: SessionEvent) -> Result<()>;
}
Hook into existing infrastructure:
terraphim_hooks(PreToolUse, PostToolUse) -> emit events in real-timeterraphim_service(search, LLM calls) -> emit events on each operationterraphim_multi_agent(agent decisions) -> emit events per decision
2. Structured event types
Currently: session-analyzer parses free-text logs.
Needed: typed event records for structured queries.
pub enum SessionEvent {
LlmCall { model: String, tokens_in: u32, tokens_out: u32, cost_usd: f64, latency_ms: u64 },
SearchExecuted { query: String, results_count: u32, relevance_scores: Vec<f64> },
HookFired { hook_type: HookType, action: String, result: HookResult },
Prediction { id: Ulid, source: String, predicted_outcome: String, confidence: f64 },
Outcome { prediction_id: Ulid, actual_outcome: String, accuracy: f64 },
ToolUse { tool: String, input_summary: String, success: bool, duration_ms: u64 },
}
These coexist with existing free-text session import -- typed events are a superset.
3. Health invariant queries
Currently: session-analyzer identifies patterns post-hoc.
Needed: automated drift/anomaly detection over rolling windows.
Invariants to detect:
- Model version drift: responses from unexpected model versions
- Score distribution shift: ranking scores deviate >2 sigma from rolling baseline
- Latency degradation: P95 response time exceeds historical threshold
- Error rate spike: error rate exceeds N% over rolling window
- Cost anomaly: per-session cost exceeds historical P95
Implementation: add check_invariants() method to session-analyzer that runs over the last N sessions/events and returns violations.
4. Correlation IDs
Currently: events within a session are sequential but not linked.
Needed: link related events (e.g., Prediction -> Outcome, PreToolUse -> PostToolUse for same invocation).
Add correlation_id: Option<Ulid> to SessionEvent. Events in the same logical operation share a correlation ID.
Affected Crates
terraphim_sessions(primary -- add real-time emitter, event types)terraphim-session-analyzer(add health invariant queries)terraphim_hooks(emit events via SessionEventEmitter)terraphim_service(emit events for search/LLM calls)terraphim_types(add SessionEvent enum, HookType, etc.)terraphim_mcp_server(expose invariant check results as MCP resource)
Estimated Effort
~1 day for event types + real-time emitter + basic invariants. Ongoing integration per crate.
Part of
Epic #595
Downstream Dependents
- #598 Budget-aware routing (cost tracking via session events)
- #599 Enhanced learning capture (learning events are session events)
- #601 EIDOS episodic reasoning (predictions/outcomes stored as session events)
- #602 Confidence-driven KG promotion (queries session events for confidence scoring)
- 主要语言
- Rust
- 星标
- 66
- 派生
- 5
- 平均合并
- 1 小时
- 30 天内合并 PR
- 3
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
terraphim/terraphim-ai 的其他 Issue
-
terraphim_rlm: require a per-sub-result verification plan (recheck / control / independent route)未关闭
难度 4/5 3-5 天 新手友好度 48/100
terraphim/terraphim-ai#969 · 1 条评论 ·
-
难度 5/5 一周以上 新手友好度 35/100
terraphim/terraphim-ai#968 · 1 条评论 ·
-
难度 5/5 一周以上 新手友好度 35/100
terraphim/terraphim-ai#967 ·
-
难度 4/5 3-5 天 新手友好度 48/100
terraphim/terraphim-ai#966 ·
-
难度 5/5 一周以上 新手友好度 30/100
terraphim/terraphim-ai#965 · 2 条评论 ·
查看 terraphim/terraphim-ai 的全部 Issue
相似的 Issue
-
proxy: SQL-over-HTTP turns empty arrays into [""] or [false], or HTTP 500 for int and float arrays未关闭
难度 2/5 1-3 小时 新手友好度 83/100
neondatabase/neon#12965 ·
-
难度 2/5 1-3 小时 新手友好度 78/100
goauthentik/authentik#26867 ·
维护者通常 1 天内回复
-
api bug macos maintainer-needed p2 triaged
难度 2/5 1-3 小时 新手友好度 66/100
维护者通常 1 天内回复
-
area::tern difficulty::easy good first issue kind::cleanup triage::ready
难度 1/5 1-3 小时 新手友好度 88/100
-
难度 2/5 1-3 小时 新手友好度 76/100
eclipse-zenoh/zenoh#2842 · 2 条评论 ·
维护者通常 1 天内回复