SmartPerfetto 技术架构

August 2, 2026 · View on GitHub

English | 中文

本文从实现边界解释当前 SmartPerfetto。快速入口见 架构总览,runtime 细节见 Agent Runtime, 表格和证据传输见 Data Contract

1. 产品不是单一 Web 插件

SmartPerfetto 在同一分析核心上提供多种入口:

产品面入口关键边界
源码 Web./start.sh使用提交的 frontend/,普通用户不构建 Perfetto submodule
前端开发./scripts/start-dev.sh只用于修改 AI Assistant plugin
Dockerdocker-compose.hub.yml不读取宿主机 Claude Code 登录态
npm CLIsmp / smartperfettoNode.js >=24 <25,不包含 Web UI
portable三平台 release asset内置 Node.js 24、backend、frontend、trace processor 和 runtime assets
HTTP/SSE API/api/*Web、CLI 辅助服务和内部集成都复用后端 contract

因此功能修改不能只验证其中一个入口。权威产品面清单在 .claude/rules/product-surface.md

2. 组件边界

flowchart LR
  U["Web UI / CLI / API"] --> R["Express routes and application services"]
  R --> C["Resolved analysis context"]
  C --> O["IOrchestrator runtime"]
  O --> M["Shared MCP registry"]
  M --> S["YAML Skill engine"]
  S --> T["trace_processor_shell pool"]
  O --> K["Strategies and knowledge retrieval"]
  O --> Q["Result normalization and quality gates"]
  Q --> D["DataEnvelope / evidence / identity"]
  D --> X["Chat / report / CLI / snapshot / comparison"]

主要目录:

  • backend/src/routes/:HTTP/SSE 路由与输入边界;
  • backend/src/assistant/application/:session 准备和复用;
  • backend/src/agentRuntime/:provider-neutral runtime 与输出收敛;
  • backend/src/agentv3/:共享 MCP、策略加载、计划/verifier 等兼容命名空间;
  • backend/src/services/skillEngine/:YAML Skill 执行;
  • backend/src/services/selfEvolution/:RunManifest、反馈投影、eval/replay、 提案、门控、overlay generation 和升级对账;
  • backend/src/services/externalIssueReporting/:完成 run 的反馈机会检测、provider pin、无工具 triage、输出校验和 GitHub 草稿;
  • backend/skills/:确定性 trace 证据程序;
  • backend/strategies/:场景方法、prompt/template 和报告要求;
  • backend/src/services/traceProcessorService.ts:trace processor 生命周期和租约;
  • perfetto/ui/src/plugins/com.smartperfetto.AIAssistant/:Perfetto UI 插件源码;
  • frontend/:源码、Docker 和 portable 实际消费的提交版 UI。

3. 一次分析的主流程

POST /api/agent/v1/analyze
  -> AgentAnalyzeSessionService.prepareSession()
  -> 解析 workspace / user / trace / provider / source / knowledge context
  -> createAgentOrchestrator()
  -> 选择 Claude / OpenAI / Pi / OpenCode / Qoder runtime
  -> 通过共享 MCP registry 调用 SQL、Skill、知识和计划工具
  -> DataEnvelope + evidence/claim/identity sidecar
  -> final result normalization / report contract gate
  -> SSE chat projection + HTML report + snapshot + CLI artifact

options.analysisMode 支持:

  • fast:轻量工具面和确定性 direct-evidence path;
  • full:完整工具、计划和质量检查;
  • auto:先应用不可绕过的上下文规则,再由语义分类器决定。

reference trace、codebase 或私有 knowledge source 需要完整上下文时,不能为了满足 用户传入的 fast 而静默丢掉能力。

3.1 企业身份边界

/api/auth/oidc/login 和 callback 是公开 bootstrap 边界;其他 /api 默认经过统一 authenticate 中间件。EnterpriseOidcClient 用标准 discovery + Authorization Code + PKCE,并在边界内完成 ID Token 与 nonce 校验。短期 state/nonce/PKCE transaction 使用签名 HttpOnly Cookie;登录完成后只把不透明签名 session id 放入 HttpOnly Cookie,具体 tenant、workspace、role、scope 和撤销/到期状态仍从企业 SQLite 读取。

内置 OIDC 模式只信任标准化 Issuer 与 Subject:tenant 由 Issuer 稳定派生,user id 由 Issuer + Subject 派生。登录事务会自动创建或复用该用户唯一的个人工作区, sso_personal_workspaces 映射和数据库 trigger 阻止其他用户加入。IdP tenant、workspace 或 role claim 都不能覆盖这条所有权边界。前端入口先完成 Session 门禁,再加载 Perfetto; 所有分析、Provider、codebase、trace 和 Trace Processor 心跳请求都通过共享的 credentialed fetch/header 策略携带 Cookie 与必要的 CSRF Token。本地缓存按 tenant/user/workspace 分区,OIDC 模式不读取旧的未分区数据。

Cookie 写请求除了 CORS 之外还要经过精确 Origin 检查,因为 CORS 本身不会阻止浏览器 发送跨站 mutation;同时必须携带 Session 派生的 CSRF Token。回调建立 Session 后直接 跳回 FRONTEND_URL,不使用 popup 或前端工作区选择流程。

4. Runtime 与 Provider

PRODUCTION_RUNTIME_KINDS 当前注册的 production runtime 都实现共享 IOrchestrator 合约:

Runtime主要 Provider恢复状态
claude-agent-sdkAnthropic、Bedrock、Vertex、Claude-compatible、本机 Claude 登录Claude session id
openai-agents-sdkOpenAI Responses、OpenAI-compatible、Ollama/chat-completionshistory + response id
pi-agent-coreProvider Manager custom profile / Pi model configopaque transcript
opencodeOpenCode SDK 与 custom providerOpenCode session id + 隔离目录
qoder-agent-sdkQoder CLI 登录态或 PAT、custom providerQoder session id;私有知识运行不持久化 opaque session

canonical loader 和 capabilities 来自 backend/src/agentRuntime/runtimeDescriptors.ts,具体实现在 backend/src/agentRuntime/engines/backend/src/agentOpenAI/ 是旧 import path 的 compatibility facade;backend/src/agentv3/ 仍包含 canonical MCP、strategy、 planning 和 verifier shared layers,不能整体视为 legacy。

选择顺序是:请求显式 Provider Manager profile、持久化 session snapshot、 SMARTPERFETTO_AGENT_RUNTIME、默认 runtime。session 创建后固定 provider/runtime; 恢复时不能因为当前 active profile 改变而静默换 provider。

Provider Manager profile 优先于 .env fallback。Docker/portable 中的认证环境与宿主机 不同,不能把源码路径下可用的 Claude 登录态写成所有发布形态都可用。

5. MCP 工具面

backend/src/agentv3/mcpToolRegistry.ts 是工具描述、exposure 和 allowlist 的注册源, claudeMcpServer.ts 提供实现与按请求组合。工具不是固定总数:

  • fast/full 请求暴露面不同;
  • code-aware 工具需要授权;
  • comparison 工具只在 reference trace 存在时注册;
  • artifact 工具依赖当前 session 能力;
  • deprecated 或内部工具不会自动成为公开契约。

公开文档应说明工具家族和可见性,不复制静态数量或手工维护另一份 registry。 完整说明见 MCP 工具参考

6. Strategy 与 Skill

两类内容职责不同:

Markdown Strategy / Template
  -> 分类、方法、约束、final_report_contract

YAML Skill
  -> SQL / iterator / conditional / composite execution
  -> deterministic DataEnvelope evidence

长期 prompt 内容不写入 TypeScript。新增场景方法修改 backend/strategies/; 新增确定性证据修改 backend/skills/。Skill 数量、场景列表和 pipeline catalog 都从 文件树/frontmatter/index 发现,不能在代码或文档中固定复制。

渲染管线教学内容位于 docs/rendering_pipelines/,运行时通过 doc_path 读取。 这些文件由同步工具从固定来源更新,不手工编辑:

npm run sync:rendering-pipelines -- --source <checkout> --apply
npm run check:rendering-pipelines

Skill 合约见 Skill 系统指南

7. Trace Processor 与证据

TraceProcessorService 管理 trace_processor_shell pool、端口租约、trace load 和 SQL RPC。源码启动、npm、Docker 和 portable 必须使用同一 pin/校验规则;显式 TRACE_PROCESSOR_PATH 是用户拥有的覆盖路径,启动器不会替用户改权限或覆盖文件。

Skill/SQL 输出经过 DataEnvelope 后会继续形成:

  • evidence contract;
  • deterministic claim verification;
  • process/thread identity resolution;
  • report provenance;
  • analysis-result snapshot;
  • comparison metric。

聊天可读性与审计来源是分离产品面。隐藏聊天中的 raw SQL 不能删除报告、snapshot 或 CLI artifact 中用于复核的 provenance。

8. 两种对比产品

SmartPerfetto 维护两类不同对比:

  1. Raw trace comparison:current + reference trace 在同一 AI session 中实时查询。 CLI smp compare 与双窗 UI 复用后端 comparison context、Skill 和报告 section。
  2. Analysis-result comparison:比较已持久化 snapshot,可跨窗口、跨 trace, 并受 workspace/RBAC/share 规则约束。

两者可以共享标准指标和报告 section,但不能把 raw trace 对比实现成 UI/CLI 私有 prompt, 也不能把 snapshot comparison 误写成任意两个历史 raw trace 的双窗。

9. 源码与知识上下文

Code-Aware

代码库先经过 PathSecurityGate preview/register/reindex。默认 metadata_only 只向 模型提供 CodeRefprovider_send 还需要注册时同意和本次请求显式选择。原始源码 不能写入 session、日志、SSE、报告或 export。

Android Internals

内置签名 Knowledge Pack 与私有 checkout 是两个来源:

  • 内置 Pack 随各发布形态分发,TUF channel 可更新;分析只把 provenance 当作背景知识, 不能伪装成当前 trace 证据;
  • 私有 checkout 需要路径 allowlist、权利确认、provider 同意和 request-level source id。

统一 analysis context 会固定 codebase/knowledge generation、tenant/workspace/user、 provider consent 和 session continuity。恢复、报告和 snapshot 不能绕过这些边界。

10. Self-Evolution 数据与发布路径

在线分析和进化发布通过 immutable identity 解耦:

RunManifest + effective public feedback
  -> bounded curation proposal
  -> materialized treatment
  -> validation/holdout paired replay
  -> qualified + accepted proposal
  -> content-addressed overlay artifact
  -> atomic generation pointer
  -> immutable effective registry snapshot for each new run

事实存储分工明确:feedback JSONL 是事实源,SQLite 是可重建投影;eval case、 replay、proposal/gate attempt、overlay registry 和 reconciliation 分别保存版本化 artifact 与绑定关系。private feedback 使用独立路径,策展读取端不会打开它。

发布不是原地修改全局 Skill registry。一个 run seal 后始终使用同一 snapshot;新 generation 只供新 run 解析。apply/revert 通过幂等 action saga 发布,启动/升级通过 build identity 和 base fingerprint 对账。持久化能力、门控绑定或对账失败时 fail-closed。用户操作和验证见 Self-Evolution 指南

10A. Agent 辅助外部反馈

persisted analysis_completed + RunManifest + optional snapshot
  -> deterministic opportunity signals
  -> explicit user action
  -> same provider/runtime snapshot, no-tool triage
  -> strict reference/trust/content validation
  -> user answers + sensitive-data confirmation
  -> deidentified notSubmitted GitHub draft

源解析按 (tenant, workspace, sessionId, runId, runManifestId, snapshotId) 交叉校验, 不会使用当前 session 的 result 或触发 completed recovery。providerSnapshotHash 把 review 绑定到源 run;pin 缺失、变化或不支持时只返回确定性验证建议。 publicArtifactSanitizer 是 M9 contribution bundle 与 M10 草稿共享的中立公开边界, 但两条业务状态机互不调用。详见 Agent 辅助 GitHub 反馈

11. 输出与持久化

最终输出不是单一 Markdown 字符串:

产品面保留内容
SSE / AI chat可读结论、必要证据摘要和进度
HTML report证据、claim、identity、背景知识引用和 appendix
CLI artifactturn、report、resume state 和机器可读输出
analysis-result snapshot标准指标、证据引用、comparison 输入
provider session snapshotruntime/provider-specific 恢复状态

final_report_contract、normalizer 和质量门禁负责让各 runtime 收敛到共享结果语义, 而不是用 provider-specific 字符串补丁修某一个出口。

12. 发布资产

发布面彼此独立:

  • npm CLI 包含 CLI dist、Skills、Strategies、SQL、trace processor 和 Knowledge Pack;
  • portable 还包含 Node.js 24、原生依赖、backend、frontend/ 和 launcher;
  • Docker 从 main 构建 Linux image,消费提交的 frontend/ 和 runtime assets;
  • 源码 checkout 的普通路径也消费 frontend/,只有 UI 开发才构建 submodule。

发布顺序、签名和 smoke 见 发布手册portable 打包

13. 验证策略

最小验证由改动类型决定,完整合入门禁是:

npm run verify:docs
npm run verify:pr

关键专项入口:

cd backend
npm run validate:skills
npm run validate:strategies
npm run test:self-evolution
npm run test:scene-trace-regression
npm run cli:pack-check
npm run verify:codebase-aware

此外:

  • 双 Trace 浏览器契约:npm run test:e2e:dual-trace
  • trace corpus:npm run trace:regression
  • runtime-read 渲染文档:npm run verify:rendering-pipelines
  • portable:按 测试规则 运行脚本静态检查、 launcher cross-build、全包构建和 manifest 校验;
  • provider-backed E2E 只有安全凭证存在时运行,不能用单测冒充真实模型验证;
  • Android capture 只有连接真实设备时才能声明抓取 smoke 通过,离线只证明 proposal/config/CLI contract。

14. 修改位置速查

目标修改位置
新增确定性分析backend/skills/
修改 AI 方法或报告要求backend/strategies/
新增/修改 MCP 工具registry + implementation + reference + tests
修改 DataEnvelopebackend source + generator + frontend generated types + consumers
修改 API contractroute/application service + tests + API 文档
修改 AI Assistant UIPerfetto plugin source + dev/browser test + frontend/ prebuild
修改 runtime/provideragentRuntime/ + Provider Manager + session snapshot tests
修改 Self-Evolutionservices/selfEvolution/ + admin routes/UI + focused tests + current contract docs
修改 Agent 外部反馈services/externalIssueReporting/ + agent route + AI plugin + Issue Form + test:external-issue-reporting
修改发布资产package/release scripts + runtime-asset tests + release docs

架构修改完成后,再按 AGENTS.md.claude/rules/ 中对应规则选择验证层级。