架构总览

August 13, 2026 · View on GitHub

English | 中文

SmartPerfetto 在 Perfetto UI 之上增加 AI 分析层。Perfetto 仍负责 trace 加载、时间线和 SQL 基础能力;SmartPerfetto 后端负责 agent 编排、Skill 执行、报告生成和流式输出。

Frontend: Perfetto UI @ :10000
  └─ com.smartperfetto.AIAssistant plugin
       ├─ trace upload / open trace
       ├─ AI panel / floating window
       ├─ Codebase Config Panel
       ├─ Self-Evolution control plane
       ├─ DataEnvelope tables and charts
       └─ SSE client

Backend: Express @ :3000
  ├─ /api/agent/v1/*          agentv3 分析主路径
  ├─ /api/traces/*            trace 上传和生命周期
  ├─ /api/rag/*               RAG 与 codebase 管理
  ├─ /api/skills/*            Skill 查询和执行
  ├─ /api/admin/self-evolution 管理闭环与 SSE
  ├─ /api/export/*            导出
  ├─ /api/reports/*           HTML report
  └─ trace_processor_shell    HTTP RPC pool, 9100-9900

Standalone CLI: smp / smartperfetto
  └─ 复用同一后端 runtime、Skill、SQL、session、report 和 comparison contract

产品入口与发布形态

入口用户形态运行边界
Web UIDocker、免安装包、源码 ./start.sh通过 HTTP/SSE 调后端,使用提交的 frontend/ 预构建 UI
CLInpm 包 @gracker/smartperfettoNode.js >=24 <25,不启动 Web UI,写本地 ~/.smartperfetto/ session/report
API/SSE/api/agent/v1/*前端和外部集成都依赖同一契约
Portable launcherGitHub 三平台 asset包内自带 Node.js 24、native deps、后端、frontend/trace_processor_shell
DockerDocker Hub imageLinux container,不读取宿主机 Claude Code 登录态

Feature/Bug 设计要同时判断 Web UI、CLI、API、报告、Docker、免安装包、runtime/provider、 预构建内容和 Node 版本边界。LLM/Agent 的具体检查清单在 ../../.claude/rules/product-surface.md

启动生命周期边界

源码入口共享 scripts/service-lifecycle.sh:PID 文件记录 launch generation、 OS 进程启动身份、可执行文件、cwd 和用于诊断的命令快照,并原子写入。启动/停止 只操作稳定身份仍匹配且属于当前 checkout 的进程树;端口冲突默认只诊断,不按 端口或模糊命令名杀进程。Backend 和 Frontend 都是必需服务,任一在 readiness 前退出、超时或运行中意外退出,launcher 都会停止另一端并返回非零。Docker 使用 tini 承担 PID1 信号转发/子进程回收,entrypoint 和 container health 同时覆盖 backend 与 frontend。

核心模块

模块位置责任
Perfetto UI pluginperfetto/ui/src/plugins/com.smartperfetto.AIAssistant/面板、SSE、结果渲染、场景导航、选区交互
Express backendbackend/src/index.ts路由注册、健康检查、中间件、进程清理
OIDC 与请求身份backend/src/routes/enterpriseAuthRoutes.tsenterpriseSsoService.tsmiddleware/auth.ts登录回调、Session/CSRF、个人工作区所有权、请求级 tenant/workspace/RBAC 绑定
Runtime contract 与 registrybackend/src/agentRuntime/runtimeKinds.tsruntimeDescriptors.tsruntimeSelection.ts定义当前 production runtime 集合、capabilities、canonical loader 和每个 session 的 runtime 选择
Runtime enginesbackend/src/agentRuntime/engines/{claude,openai,pi,opencode,qoder}/五个当前 runtime 的 canonical 实现,复用统一 orchestrator、结果和安全边界
共享 Agent 能力backend/src/agentv3/MCP server/registry、策略注入、planning、verifier 和记忆;其中个别 runtime 文件仅保留 compatibility re-export
OpenAI compatibility facadesbackend/src/agentOpenAI/向旧 import path 提供 re-export;canonical OpenAI 实现在 agentRuntime/engines/openai/
assistant applicationbackend/src/assistant/session 管理、stream projection、结果 contract
Skill enginebackend/src/services/skillEngine/YAML Skill 加载、参数替换、SQL 执行、DataEnvelope 输出
Skillsbackend/skills/原子、组合、深度、渲染管线分析
Strategiesbackend/strategies/场景策略、Prompt 模板、知识模板
Self-Evolutionbackend/src/services/selfEvolution/backend/src/routes/selfEvolutionAdminRoutes.tsRunManifest、反馈投影、eval/replay、提案门控、overlay、对账、RBAC 控制面
Agent 外部反馈backend/src/services/externalIssueReporting/agentExternalIssueRoutes.ts、AI Assistant plugin源 run 信号、固定 provider triage、严格校验、去标识 GitHub 草稿;不自动提交
Code-aware analysisbackend/src/services/codebase/, backend/src/services/rag/, backend/src/services/symbol/本地路径注册、无索引按需搜索/读取、可选源码索引、符号解析、隐私投影与 patch 三态校验
External Android knowledgebackend/src/services/androidInternalsWiki/, externalKnowledgeSourceRegistry.ts, ragStore.ts外部 Wiki 全库审计、版本/指纹、分代索引、许可/同意/scope 和私有内容投影
Trace processorbackend/src/services/traceProcessorService.tstrace 加载、RPC 管理、SQL 查询
Reportsbackend/src/services/htmlReportGenerator.tsHTML 报告生成
Result quality pipelinebackend/src/services/agentResultNormalizer.ts, finalReportContractGate.ts, evidence/, verifier/, analysisResultSnapshotPipeline.tsfinal report contract、evidence/claim verification、identity resolution、snapshot
CLIbackend/src/cli-user/smp / smartperfetto 命令、session/history/report export
Comparison servicesbackend/src/services/comparison*Service.tsRaw trace 与 analysis-result 对比共享证据/报告 contract

双 Trace Engine 边界

Web UI 打开 trace 后会形成两条用途不同的处理路径:

本地时间线与 Perfetto 插件
  浏览器 -> WasmEngineProxy -> 提交在 frontend/ 中的 trace_processor.wasm

AI、SQL、Skill、CLI 与报告证据
  浏览器后台上传 -> /api/traces/upload
    -> TraceProcessorService -> scripts/trace-processor-pin.env 固定的 trace_processor_shell

第一条路径只服务浏览器内的时间线、轨道和 Perfetto 插件查询;第二条路径是 SmartPerfetto AI 证据与自动化契约的权威执行面。两个 engine 可以使用经过独立审查的 不同 Perfetto pin,当前具体身份分别由提交的 frontend/ 目录名和 scripts/trace-processor-pin.env 声明。浏览器 WASM 新增的表、模块、解析格式或 SQL 能力,在 native pin 完成五平台预构建、回归与发布门禁前,不得被 Skills、Strategies、 CLI 或 AI 报告宣称为可用。

Web Assistant 页面与身份生命周期

Web UI 的两个 AI 入口共享同一鉴权边界,但不共享 trace 前置条件:

  • /assistantConversationPage 是 Conversation-first 入口;没有加载 Trace 时也能进行 普通多轮对话,附加 Trace 后才进入 trace-aware 对话。
  • 已加载 Trace 的 AIPanel、侧边栏和浮窗共享当前页面、当前 Trace 的 AnalysisBackendConnection。后台上传完成只产生连接候选;只有 scoped lease 对应的 native processor 状态为 ready,AI 分析才可使用该后端。
  • Viewer 始终继续使用浏览器内的 trace_processor.wasm。页面 lease 只管理 AI 后端的 授权、状态和生命周期;它不会设置全局 HTTP RPC target,也不会把 Viewer 切换为 native trace processor。/api/workspaces/:workspaceId/traces/leases/:leaseId/connection 只返回粗粒度状态,不返回端口、凭据、文件路径或其他租户信息。

OIDC 模式下,session、trace、lease、connection、run/receipt 和临时连接状态都只存在于 当前页面内存。可持久化消息先移除运行时绑定和私有原文,再写入 tenant/user/workspace 隔离的命名空间;切换身份或 workspace 不会恢复另一个作用域的历史。logout、401、跨 标签页 authority invalidation、身份/上下文切换和页面卸载都会 abort start/stream,递增 运行代际并清空页面运行态,迟到结果不得写回新身份。

local/API-key 模式保持既有浏览器请求和 resume 语义:共享 helper 不会无条件添加 cookie credentials,也不会把非 OIDC 401 当作 OIDC authority 失效。本次架构整合没有 新增环境变量或配置项;provider、runtime 和 endpoint 仍来自现有配置源。

主分析数据流

OIDC 模式下,静态入口先通过 /api/auth/session 完成门禁,未就绪时不加载 Perfetto bundle。回调建立后端 Session 后,所有浏览器请求的 tenant、user 和 workspace 都以后端 Session 和数据库所有权为准;前端请求头只是传输上下文,不能改变授权边界。个人工作区按 (tenant, user) 唯一映射,租户管理员只有元数据读取权限。

1. 用户加载 trace
   UI -> WasmEngineProxy -> frontend/trace_processor.wasm(本地时间线与插件)
      -> 后台 /api/traces/upload -> TraceProcessorService
         -> pinned trace_processor_shell(AI / SQL / Skill)

2. 用户发起分析
   UI -> POST /api/agent/v1/analyze
      -> AgentAnalyzeSessionService.prepareSession()
      -> createAgentOrchestrator()
      -> selected runtime analyze()

3. Agent 获取证据
   Runtime -> MCP tools
      -> execute_sql -> trace_processor_shell
      -> invoke_skill -> SkillExecutor -> SQL / DataEnvelope
      -> lookup_knowledge / lookup_sql_schema / fetch_artifact
      -> lookup_blog_knowledge(source=android_internals_pack)
         -> 会话固定签名 Pack 版本 -> FTS5/BM25 -> 脱敏、预算控制的背景引用
      -> lookup_blog_knowledge(source=android_internals_wiki)
         -> request source allowlist + live registry consent/scope check
         -> active RAG generation -> bounded attributed background context
      (两种 Android Internals 来源都不是当前 trace 证据)
      -> resolve_symbol / lookup_app_source / lookup_aosp_source / lookup_kernel_source
         -> LookupResponseFilter -> CodeRef metadata
      -> propose_patch -> PatchProposer -> verified / sketch / unverified

4. 结果归一化与质量产物
   raw runtime result -> agentResultNormalizer
      -> final_report_contract gate
      -> evidence contract / claim verification / identity resolutions
      -> QueryReviewV1(查询可审查元数据,不是独立证据)

5. 后端流式输出
   SDK/server events -> runtime bridge -> StreamProjector -> SSE
      -> frontend renders progress, tables, thought, answer tokens

6. 结束与报告
   conclusion -> analysis_completed -> sanitized CodeRef/patch metadata
      -> AnalysisReceiptV1
      -> HTML report + CLI artifacts + analysis-result snapshot
      -> /api/reports/:id

CLI smp run / smp ask / smp compare 复用同一 session、runtime、Skill、report 和 trace_processor 路径;区别只是本地存储在 ~/.smartperfetto/,输出可以是 textjsonndjson

外部 Wiki 与 trace 证据是两条独立数据流。正文只在显式请求 capability 下进入当前 provider 的 tool result;运行时桥接到 SSE、日志、报告或 snapshot 时统一投影为 chunk 引用/哈希/许可/出处。Wiki 背景不能被 claim verifier 当作当前 trace 的测量值。

源码与外部知识的选择、授权指纹、非恢复策略和删除生命周期见 私有分析上下文架构。该边界同时覆盖普通分析、Smart Profile 深度分析、Web UI、CLI 和 PRODUCTION_RUNTIME_KINDS 当前注册的 runtime。

Self-Evolution 控制闭环

Self-Evolution 与在线分析解耦:分析先 seal 不可变 RunManifest;反馈进入 append-only 事实日志和可重建投影;只有 effective public feedback 能被人工触发的策展读取。 提案必须在同一 pinned 环境中完成 baseline/candidate 的 validation + holdout 配对 回放,并经人工 accept,才可能显式 apply。

apply 发布 content-addressed overlay artifact 和新 generation。已有 run 保留旧 snapshot,新 run 才解析新 generation。启动和升级会先对账;冲突、漂移或验证失败 的 overlay 被隔离,显式 revert 再发布一个不含该 overlay 的 generation。该路径默认 关闭,apply 还要求包外持久化能力;详见 运行契约用户验收指南

Agent 辅助外部反馈闭环

M10 从持久化 analysis_completed、匹配 RunManifest 和可选 result snapshot 构建 deterministic opportunity;用户点击后才运行源 provider/runtime 固定的无工具 triage。Agent 输出经过引用白名单、置信度、Skill trust、大小和公共工件脱敏校验, 再结合用户回答生成 notSubmitted GitHub 草稿。

这条路径不读取当前 session.result,不调用 GitHub API,也不创建 Self-Evolution feedback/proposal/overlay。private/code-aware 结果禁用公开草稿,安全漏洞改道到 private advisory。详见 Agent 辅助 GitHub 反馈

Runtime 与 Provider 边界

RuntimeProvider关键边界
claude-agent-sdkAnthropic、Bedrock、Vertex、Claude/Anthropic-compatible provider、本地 Claude Code fallback本地 Claude 登录态只适用于源码运行;Docker/portable/npm CLI 需要显式 provider/env
openai-agents-sdkOpenAI、Ollama、OpenAI-compatible provider按 OpenAI runtime 规则验证凭证和 chat-completions/Responses 协议
pi-agent-coreCustom provider需要显式 Pi model JSON 或等价 env;不读取 .pi project config、package extension、shell tool 或 file tool
opencodeCustom provider需要显式 OpenCode/OpenAI-compatible model 配置;使用隔离 OpenCode server 和 request-scoped MCP tools,不读取个人 OpenCode 登录态/project state
qoder-agent-sdkCustom provider 或显式 envQoder SDK 是 opt-in optional peer;使用本机 Qoder CLI 登录态或 PAT,并隔离私有知识的 stream/session/snapshot

Provider Manager active profile 优先于 .env fallback。历史 session 恢复时必须保留 原 provider/runtime/comparison identity,不能因为当前 active provider 变化而静默切换。

AI 输出合约

SmartPerfetto 的最终回答不是单一 Markdown 字符串,而是一组共享但分工不同的产物:

产物消费者边界
visible chat conclusion前端 AI panel保持可读,隐藏低价值 SQL/appendix/audit 噪音
HTML report浏览器、导出、分享保留 evidence、claim verification、identity resolution 和 appendix
CLI artifactssmp run / smp ask / smp capture --analyze / smp report持久化 turn、report、claim verification 和 identity files
analysis-result snapshot多结果对比、历史回看保存 conclusion contract、claim support、verification 和 identity metadata
Query ReviewAI panel、HTML report、Artifact说明实际查询的读取、过滤、输出和限制;固定为 review metadata,不能单独支撑诊断结论
Analysis ReceiptAI panel、HTML report、CLI、snapshot绑定 run/session/trace/runtime,汇总证据计数、claim audit、质量门禁和实际输出

这些结构的字段和投影规则以 Data Contract 为准。不同表面可以压缩显示, 但不能把 Query Review 提升成证据,也不能把 Receipt 的 partial/not_applicable 显示为通过。

修复结论质量时先确认是哪一层出了问题:runtime 产物、contract/gate、evidence/verification、report 生成、snapshot,还是 frontend projection。不要为了让聊天更干净而删除报告或 snapshot 需要的来源信息。

对比模式

模式入口数据来源合约
Raw Trace Compare前端 reference trace、CLI smp comparecurrent trace + reference trace 实时查询共享 comparison identity、evidence pack、session snapshot 和 report section
Analysis Result Compare前端多结果对比 API已完成分析结果 snapshot保留 workspace/RBAC/matrix 能力,并复用共享 report section

Web UI 的双 Trace 工作区操作状态机见 双 Trace 工作区操作模型

文档与策略分工

SmartPerfetto 有两类“内容”:

内容位置运行时角色
Strategy / Prompt templatebackend/strategies/*.strategy.md, *.template.md进入系统 Prompt,约束 agent 思考方式
YAML Skillbackend/skills/**/*.skill.yaml被 MCP invoke_skill 调用,确定性执行 SQL 分析
Rendering pipeline catalogbackend/skills/pipelines/index.yaml固定上游 commit 与文档哈希,并把检测条目区分为主类型 variant 或附加 feature
Rendering pipeline docsdocs/rendering_pipelines/*.mdGracker/rendering_pipelines 同步的 Android 17 权威教学来源;构建时复制到 backend/dist/rendering_pipelines/
普通 docsdocs/ 其他目录面向用户和贡献者

不要在 TypeScript 中硬编码 Prompt 内容。TypeScript 只负责加载、变量替换和结构性编排。 不要在文档或代码中写死 MCP 工具总数、Skill 总数或 scene 总数;这些分别由 tool registry、backend/skills/ 文件树和 strategy frontmatter 决定。

渲染管线输出需要同时保留两层身份:教学文档定义 rendering type, catalog 中的 pipeline 条目定义 trace 检测子路径或 feature。只有 catalog 中 classification_role: variantprimary_eligible: true 的条目能成为主判定; 同步、哈希和引用完整性由 npm run check:rendering-pipelines 校验。