14 KiB
State / History / Telemetry 主链
这份文档回答什么
本文件定义 Lime 当前 State / History / Telemetry 的唯一主链,主要回答:
- 哪些路径负责持久会话历史、线程稳定读模型、pending request / outcome / incident 投影
SessionDetail、AgentRuntimeThreadReadModel、RequestLog、agent_runtime_export_*、history-record分别属于哪一层- 哪些页面、报表和导出只是消费这条主链,而不是继续定义另一套“真实线程状态”
- 哪些旧专题计划、原始遥测浏览面或旧 observability 语义只能作为附属层或退场面
它是 当前 session / thread / turn / request / evidence / history 边界的 current 文档,不是某个专题计划,也不是单独的 harness 或 reliability 页面说明。
什么时候先读
遇到以下任一情况时,先读本文件:
- 调整
agent_runtime_get_session、agent_runtime_get_thread_read、agent_runtime_replay_request - 调整
SessionDetail、AgentRuntimeSessionDetail、AgentRuntimeThreadReadModel - 调整
build_pending_requests(...)、build_last_outcome(...)、build_incidents(...) - 调整 request correlation headers、
RequestLog、requestTelemetry - 调整
agent_runtime_export_*、handoff bundle、evidence pack、replay case、analysis handoff、review decision - 调整
scripts/harness-eval-history-record.mjs、cleanup/dashboard、HarnessStatusPanel.tsx、AgentThreadReliabilityPanel.tsx - 讨论“状态模型”“可靠性”“证据链”“历史窗口”这几个词时,发现大家已经在混用不同层的语言
如果一个需求同时碰到“会话历史 + 线程状态”“request telemetry + evidence 导出”“history-record + cleanup/dashboard”中的两项以上,默认属于本主链。
固定主链
后续 Lime 的 State / History / Telemetry 只允许向下面这条主链收敛:
agent_sessions / agent_messages -> SessionDetail -> AgentRuntimeThreadReadModel -> RequestLog 关联键 -> handoff / evidence / replay / analysis / review -> history-record / trend / cleanup / dashboard -> HarnessStatusPanel / AgentThreadReliabilityPanel
这条主链的固定判断是:
SessionDetail是当前会话、回合、时间线 item 的唯一持久读模型入口。AgentRuntimeThreadReadModel是当前线程状态、pending request、最近 outcome、active incident 的唯一稳定线程读模型。RequestLog只有在带上session/thread/turn/pending/queued/subagent关联键后,才算当前线程的 request telemetry 事实源。agent_runtime_export_*与agent_runtime_save_review_decision是当前交接、证据、回放、分析、审核的唯一派生导出链。history-record / trend / cleanup / dashboard与 GUI 面板都是下游消费层,不允许反向定义 session 或 thread 真相。
固定规则只有一句:
后续新增状态、历史或遥测能力时,只允许接到 SessionDetail -> AgentRuntimeThreadReadModel -> RequestLog -> export/history 这组 current 边界;不允许再造并列状态真相。
代码入口地图
1. 持久会话与历史事实源
src-tauri/crates/agent/src/session_store.rssrc-tauri/src/agent/aster_agent.rs的get_runtime_session_detail(...)agent_sessions / agent_messages
当前这里负责:
- 会话创建、列表、详情与最近消息预览。
- 把消息、turn、timeline item、todo、子会话信息统一投影成
SessionDetail。 - 为
get_session、get_thread_read、replay_request、export_*提供同一份历史事实源。
固定规则:
- 持久会话历史统一收口到
session_store.rs与SessionDetail,不要让 UI 或脚本再各自重扫数据库拼第二套历史。 - 如果一个需求要解释“这一线程真实发生了什么”,先回到
SessionDetail.messages / turns / items,不要从页面状态或导出文件反推。
2. 线程稳定读模型与 reliability projection
src-tauri/src/commands/aster_agent_cmd/command_api/runtime_api.rsagent_runtime_get_sessionagent_runtime_get_thread_readload_runtime_export_context(...)
src-tauri/src/commands/aster_agent_cmd/dto.rsAgentRuntimeSessionDetailAgentRuntimeThreadReadModelbuild_pending_requests(...)build_last_outcome(...)build_incidents(...)
src-tauri/src/services/thread_reliability_projection_service.rs
当前这里负责:
- 从
SessionDetail派生 pending request、最近 outcome、active incident。 - 把派生结果同步到线程 reliability 投影表,再回读成稳定线程状态。
- 统一组装线程状态、interrupt 状态、queued turn、diagnostics、latest compaction boundary。
- 让
get_session、get_thread_read与所有export_*共享同一份线程读模型加载前奏。
固定规则:
- 新的线程健康信号、等待态、重放态,优先落在
dto.rs+thread_reliability_projection_service.rs,不要先写到面板局部推断逻辑里。 get_session、get_thread_read与export_*必须复用同一套SessionDetail + queued_turns + projection组合,不允许各写各的 thread loader。AgentRuntimeSessionDetail是“会话详情 + 稳定线程读模型”的组合返回,不是另一套事实源。
3. 请求关联键与 request telemetry 事实源
src-tauri/crates/server/src/handlers/api.rs的attach_request_correlation_metadata(...)src-tauri/crates/server/src/lib.rs的record_request_telemetry(...)src-tauri/crates/infra/src/telemetry/types.rs的RequestLog
当前这里负责:
- 从请求头把
session_id / thread_id / turn_id / pending_request_id / queued_turn_id / subagent_session_id注入RequestContext.metadata。 - 在请求完成后记录统一
RequestLog,保留 provider、model、status、duration、token、credential 与上述关联键。 - 让 evidence pack 可以按会话与线程真实 join 到 request telemetry 摘要。
固定规则:
- 如果当前线程没有匹配的
RequestLog,导出空摘要即可;不要再发明unlinked这一类伪会话级状态。 - request telemetry 的 join 条件优先看关联键,而不是 provider/model/时间戳的模糊猜测。
- 原始日志浏览、统计页、控制台可以展示
RequestLog,但不能反向定义 session/thread 的唯一真相。
4. 证据、交接与审核派生链
src-tauri/src/services/runtime_handoff_artifact_service.rssrc-tauri/src/services/runtime_evidence_pack_service.rssrc-tauri/src/services/runtime_replay_case_service.rssrc-tauri/src/services/runtime_analysis_handoff_service.rssrc-tauri/src/services/runtime_review_decision_service.rssrc-tauri/src/commands/aster_agent_cmd/command_api/runtime_api.rs的:agent_runtime_export_handoff_bundleagent_runtime_export_evidence_packagent_runtime_export_analysis_handoffagent_runtime_export_review_decision_templateagent_runtime_save_review_decisionagent_runtime_export_replay_case
当前这里负责:
- 统一复用
load_runtime_export_context(...)拿到SessionDetail + AgentRuntimeThreadReadModel + workspace_root。 - 导出 handoff bundle、evidence pack、replay case、analysis handoff、review decision 模板与保存结果。
- 把 request telemetry、verification outcomes、recent artifacts、timeline snapshot、review actions 作为下游派生链的共同输入。
固定规则:
- 派生导出层只能消费
SessionDetail、AgentRuntimeThreadReadModel、RequestLog和现有工作区产物,不得回头再拼第二套 observability summary。 - verification 的适用性、known gaps、current/degraded 角色判断统一由 evidence pack 与 shared verification facts 决定。
- replay / analysis / review 不能跳过 evidence/handoff 直接定义自己的线程真相。
5. 历史窗口与下游汇总
scripts/harness-eval-history-record.mjsscripts/lib/harness-verification-facts.mjs
当前这里负责:
- 记录 summary 历史窗口,并继续派生 trend、cleanup 与 dashboard。
- 统一从 summary / trend / cleanup 提炼 verification outcome 焦点与 recovered baseline。
- 为 nightly report、cleanup recommendation、dashboard 卡片提供共享解释层。
固定规则:
- history-record 只记录当前 summary 窗口,不应回头重建运行时 thread 状态。
- verification outcome 的聚合与文案焦点统一走
harness-verification-facts.mjs,不要在 cleanup、dashboard、review 各自再写一套。 - 下游汇总必须区分
current与degraded样本,不允许继续把两者混成同一种主线回归风险。
6. 用户可见稳定消费层
src/components/agent/chat/components/HarnessStatusPanel.tsxsrc/components/agent/chat/components/AgentThreadReliabilityPanel.tsx
当前这里负责:
- 展示
threadRead、queued turn、pending request、outcome、incident、handoff / evidence / replay / review 导出动作。 - 复用会话稳定读模型、记忆预演和 verification 摘要,不自行读取另一套原始状态。
- 为操作者提供当前线程可继续执行、可回放、可交接、可审核的统一面板。
固定规则:
- 页面层只能消费
threadRead、导出结果和 shared verification facts,不自己再扫描 timeline 或 request logs 定义第二套线程状态。 - UI 文案如果和 evidence pack / thread read 冲突,以后端稳定读模型为准。
current / compat / deprecated / dead
current
docs/aiprompts/state-history-telemetry.mdsrc-tauri/crates/agent/src/session_store.rssrc-tauri/src/agent/aster_agent.rssrc-tauri/src/commands/aster_agent_cmd/dto.rssrc-tauri/src/commands/aster_agent_cmd/command_api/runtime_api.rs的get_session / get_thread_read / replay_request / export_*src-tauri/src/services/thread_reliability_projection_service.rssrc-tauri/crates/server/src/handlers/api.rssrc-tauri/crates/server/src/lib.rssrc-tauri/crates/infra/src/telemetry/types.rssrc-tauri/src/services/runtime_handoff_artifact_service.rssrc-tauri/src/services/runtime_evidence_pack_service.rssrc-tauri/src/services/runtime_replay_case_service.rssrc-tauri/src/services/runtime_analysis_handoff_service.rssrc-tauri/src/services/runtime_review_decision_service.rsscripts/harness-eval-history-record.mjsscripts/lib/harness-verification-facts.mjssrc/components/agent/chat/components/HarnessStatusPanel.tsxsrc/components/agent/chat/components/AgentThreadReliabilityPanel.tsx
这些路径共同构成当前状态 / 历史 / 遥测主链:
- 会话与时间线历史看
SessionDetail - 线程稳定状态看
AgentRuntimeThreadReadModel - request telemetry 看带关联键的
RequestLog - 交接、证据、回放、分析、审核看
agent_runtime_export_* - 历史窗口、cleanup 与 dashboard 只作为下游派生层
compat
docs/roadmap/lime-aster-codex-alignment-roadmap.mddocs/roadmap/reliability/README.mddocs/roadmap/reliability/*src-tauri/src/commands/telemetry_cmd.rs
保留原因:
- 这组路径仍然有用,但它们当前只能作为实现方案、专题排期或原始日志浏览入口。
- 它们可以解释“怎么做专项”,不能再解释“什么是当前唯一状态真相”。
退出条件:
- 新的状态模型判断、分类和导航回写统一落到本文件,不再把专题计划文档当仓库级总入口。
- 原始 request log 浏览面只展示
RequestLog原始事实,并回链到 session / thread / evidence;不再自行扩展会话级状态语义。
deprecated
scripts/lib/generated-slop-report-core.mjs中仍保留的requestTelemetry:unlinked权重与同类旧 observability 语义- 任何在没有匹配
RequestLog时仍然输出全局 request telemetry 缺口的报表、脚本或面板逻辑 - 任何绕过
AgentRuntimeThreadReadModel、直接从 timeline / request logs 重新拼 pending request、outcome、incident 的实现
保留原因:
- 这类逻辑会把“没有匹配日志”“旧样本兼容状态”“当前真实缺口”混在一起,继续制造第二事实源。
退出条件:
- cleanup / dashboard / review 统一回到
evidence pack + shared verification facts的 current/degraded 语义。 requestTelemetry只保留exported / known_gap等当前可解释状态,不再保留unlinked旧语义。
dead
当前没有新增确认可立即删除的 dead 实现文件。
这轮主问题是并行计划和旧语义残留,而不是零引用代码;后续若 reliability 专项文档或旧报表分支完全失去入口,再单独转为 dead。
最低验证要求
如果本轮改动涉及本主链,至少按边界选择最贴近的验证:
- 纯文档 / 分类回写:
npm run harness:doc-freshness - 改
SessionDetail、AgentRuntimeThreadReadModel、projection 或export_*:相关 Rust 定向测试 - 改 request correlation headers、
RequestLog或 cleanup/dashboard verification 语义:相关 Rust / Vitest 测试;必要时补npm run harness:cleanup-report:check - 改 Tauri 命令边界:额外执行
npm run test:contracts - 改
HarnessStatusPanel、AgentThreadReliabilityPanel等用户可见面:补现有*.test.tsx稳定断言;必要时再补npm run verify:gui-smoke
这一步如何服务主线
M5 的目标不是一次性重写所有状态代码,而是先把状态、历史和遥测的事实源收成一条 current 主链。
从现在开始:
- 解释会话与历史回放时,回到
SessionDetail - 解释线程当前能否继续、在等什么、最近为什么失败时,回到
AgentRuntimeThreadReadModel - 解释 request telemetry 时,回到带关联键的
RequestLog - 解释 evidence / replay / analysis / review / handoff 时,回到
agent_runtime_export_* - 解释历史窗口、cleanup、dashboard 时,回到
history-record + harness-verification-facts
这样后续再做 reliability、history、review 或 operator 视图时,就不会继续在“状态模型”“线程读模型”“证据链”“遥测控制台”之间横跳排期语言。