Self-Improving 运行契约

August 21, 2026 · View on GitHub

状态:Self-Evolution V1 已接入生产控制面并默认关闭;M10 外部反馈是独立用户面; legacy 组件边界见下文 最后核对:2026-07-30 权威源:生产启动代码、类型、配置解析和测试;本文不保存 PR/实施历史

Self-Improving 的目标是让历史分析结果在受控边界内改善后续分析,同时不把模型输出 直接升级成事实、代码或公共知识。Web UI、CLI、API、五种 runtime、报告、snapshot 和私有知识投影仍遵守产品面规则。 面向部署者和管理员的启用、权限、用户影响与测试步骤见 Self-Evolution 使用与验收;本文只维护运行时 和数据契约。

当前能力矩阵

能力当前状态启用边界
FeedbackEventV1 与可逆投影已接入scope JSONL 是唯一事实源;effective_feedback 增量投影;private feedback 物理隔离
Pattern memory已接入intrinsicStatusfeedbackProjectionStatus 分离;读取 effective status
Legacy FeedbackPipeline已退役feedbackPipeline.ts 已删除,不再存在第二套“反馈→学习产物”状态机
Curated/runtime Skill Notes 注入已接入,默认关闭SELF_IMPROVE_NOTES_INJECT_ENABLED=1;quick path 预算默认 0
Case Evolution capture/review/retrieve已接入,全部默认关闭后端启动时读取 CASE_EVOLUTION_*;依赖关系校验失败时会降级或拒绝
Legacy ReviewWorker组件和单测存在,未接入应用启动SELF_IMPROVE_REVIEW_ENABLED 只影响已显式构造的 worker
Strategy auto-patch组件和单测存在,未接入应用启动不读取 SELF_IMPROVE_AUTOPATCH_ENABLED,不能作为产品能力启用
Skill SQL auto-patch不支持没有生产入口,不允许模型直接修改 Skill SQL
Self-Evolution manifest / feedback / eval corpus已接入,默认关闭SELF_EVOLUTION_ENABLED=true;private feedback 与 public curation 物理隔离
显式策展与提案生命周期已接入,默认关闭只处理 effective public feedback;每次人工触发最多生成一个有界提案
固定 paired evaluation gate已接入,默认关闭所有 evidence run 必须共享同一 pinned 环境,再运行 baseline/candidate;validation 与 holdout 都不可缺失
Overlay apply / reconcile / rollback已接入,默认关闭且 fail-closed还需 SELF_EVOLUTION_APPLY=true 和可写、包外 user data root
管理 API、SSE 与 UI已接入独立 RBAC;设置页 自进化 / Evolution 控制台
贡献包导出已接入只允许 public evidence;持久化去标识 artifact,不自动上传
Agent 辅助外部反馈已接入,独立于 Self-Evolution从已完成源 run 检测机会,固定原 provider/runtime 做无工具 triage,用户确认后只打开未提交 GitHub 草稿
外部 L2 judge未配置必须逐次明确授权;当前没有环境变量、provider 调用或后台任务

“组件存在”不等于“产品已启用”。对外说明、配置示例和运维判断必须以上表和 backend/src/index.ts 的实际启动链为准。

Self-Evolution V1 控制闭环

生产路径保持“统计假设”和“上线资格”分离:

public feedback
  -> explicit bounded curation
  -> draft proposal
  -> fixed validation + holdout paired replay
  -> human accept or reject
  -> optional deidentified local contribution bundle
  -> explicit apply
  -> immutable overlay artifact + generation publish
  -> reconciliation / explicit revert

在线反馈统计只用于形成 hypothesis_only 提案,不能替代 paired replay。评测固定 runtime、provider、model、output language、tool allowlist、registry fingerprint 和 overlay generation;baseline 与 candidate 使用同一 case 集、预算和并发策略。任何一侧 失败、case split 缺失、registry 漂移或持久化不可用都会阻止 gate/apply。

提案状态按 revision 单向推进:

draft(1) -> gated(2) -> accepted|rejected(3)
accepted(3) -> applied(4) -> reverted(5)

apply/revert 使用调用方提供的幂等 actionId,经 proposal action saga、artifact store、 overlay registry 和 reconciler 发布 generation。启动或升级时会再次对账;孤儿、 fingerprint drift、验证失败和 publish failure 都进入 reconciliation report,不会静默 继续生效。apply 前会从持久化 Gate attempt 重新加载候选物化与 paired replay proof, 复验候选、treatment artifact、完整 treatment contract,并要求 overlay payload 与 treatment entries 一一对应;调用方临时构造的任意 artifact 不能越过该绑定。

set_metadata 的 allowlist 字段按叶路径整体替换,不做深合并。当前叶路径是 meta.descriptionmeta.tagstriggers.keywordstriggers.patterns。 其中 triggers.keywords 整体是一个叶路径:只提交 zh 会清除原有 en,反之亦然; 需要保留双语关键词时,overlay 必须同时重述 zhen

隐私、授权与 RBAC

  • private feedback 写入独立路径,策展源只打开 public effective feedback;
  • self_evolution:read 读取 overview、提案、overlay 和对账;
  • self_evolution:curate 显式启动策展、读取该 scope 的 SSE、运行 gate 和接受/拒绝;
  • self_evolution:exportself_evolution:applyself_evolution:revert 相互独立;
  • 操作与 SSE 按 tenant/workspace 隔离;每个 scope 最多同时运行 4 个并保留 20 个, 单次最长 5 分钟,终态事件最多保留 15 分钟;进程内最多保留 100 个 operation, 每个最多 64 个事件;
  • contribution bundle 只落本地、去标识且要求所有 evidence run 都来自 public effective feedback;不会自动提交到仓库或远端;
  • M10 外部反馈只额外读取同一 run 的 effective public negative feedback 作为 user_reported_inaccuracy 信号,不读取 proposal,也不触发策展、gate、apply 或 contribution bundle。private/code-aware 源 run fail-closed;送入外部 triage Provider 的信号和公开草稿都经过统一 public-artifact 扫描与去标识,安全问题只允许 转到 private advisory;
  • L2 judge 当前固定返回 not_configured / explicit_external_judge_consent_required。增加外部 judge 前必须设计版本化 rubric、 采样/争议策略和逐次明确授权,不能复用普通 provider 同意。

已接入的生产数据流

Pattern memory

完整与 quick 分析路径可以保存有界 pattern。Provenance schema 可以携带 run、session、 turn 和 trace 内容身份;当前主 runtime 写入 session/turn,并按 traceFeatures 相似度和 可选 bucketKey 去重。正向、负向与 quick bucket 分开存储,避免短期经验污染长期结果。

Pattern 的生命周期状态与反馈投影分开持久化。active feedback 仍保留时间语义:

provisional
  -> confirmed       正向反馈或自动确认
  -> rejected        负向反馈
  -> disputed        短期内出现相反反馈
  -> disputed_late   已确认后出现迟到反证,仅降低信任并留审计

Quick pattern 只有在 scene/architecture/domain 相容、相似度和 insight 重合满足门槛、 full-path 验证通过且没有负向状态时,才能创建新的长期 pattern。它不是原样搬运。

反馈写入按 (tenantId, workspaceId) 单写者分配 sequence,先 fsync append-only JSONL,再推进 effective_feedback 与 dirty-target revision。崩溃不会回滚事实日志; 下一次 append 或离线 npm --prefix backend run self-evolution:feedback-migrate -- --rebuild 会幂等补投影。 旧 pattern 的当前状态一次性冻结为 intrinsicStatus,旧反馈不可撤销。旧 candidate_feedback 表现在只作历史审计源,不再写入;迁移仅把该表中旧流程 已接受的 short 行规范化追加到事实日志,旧 JSONL 中的 mis-tap、重复或写库失败 记录继续保留审计但不进入有效投影。

Skill Notes

runtimeSkillNotes.ts 只在 SELF_IMPROVE_NOTES_INJECT_ENABLED=1 时构造注入预算。 Curated baseline 和 runtime notes 都必须经过容量、去重和 token 裁剪;quick path 的 SELF_IMPROVE_QUICK_NOTES_BUDGET 默认为 0,并受实现上限约束。

Runtime note 晋升到受版本控制的 curated baseline 需要人工操作:

cd backend
npm run skill-notes:promote -- <skillId> <noteId> --dry-run
npm run skill-notes:promote -- <skillId> <noteId>
npm run test:scene-trace-regression

Case Evolution

Case Evolution 是当前接入后端生命周期的独立管线:

analysis result
  -> bounded candidate capture
  -> SQLite outbox
  -> optional SDK review worker
  -> optional sidecar / case-library ingest
  -> optional retrieval
  -> optional prompt background context

后端启动会调用 startCaseEvolutionWorker(),关闭时会停止 worker 并关闭 outbox。 所有 flag 默认关闭,并按依赖关系逐级启用:

  • CASE_EVOLUTION_REVIEW_ENABLED 需要 CASE_EVOLUTION_CAPTURE_ENABLED
  • CASE_EVOLUTION_NOTES_WRITE_ENABLEDCASE_EVOLUTION_INGEST_ENABLED 需要 review;
  • CASE_EVOLUTION_PROMPT_INJECT_ENABLED 需要 CASE_EVOLUTION_RETRIEVE_ENABLED
  • CASE_EVOLUTION_INCLUDE_DRAFTS 需要 retrieve 与 prompt inject 同时开启。

Review 输出必须经过 schema/关系类型/证据引用验证和匿名化。检索命中只是待当前 trace 证据验证的背景,不会自动成为 claim evidence。发布或撤回 learned case 使用专用 CLI, 不能直接改运行时数据库或生成 YAML。

Failure taxonomy 与证据边界

FailureCategorycomputeFailureModeHash() 使用稳定枚举字段建立失败身份。模型生成 的症状描述只用于解释和审计,不能参与 hash。负向 pattern、review note 和 supersede marker 可以共享 failure identity,但各自保留来源、scope 和状态。

任何学习产物都必须满足:

  • 不把外部知识、历史 case 或模型总结当成当前 trace 测量值;
  • 保留 run/session/trace、producer、evidence/artifact 和时间信息;
  • 未知 failure category 不触发自动 supersede;
  • 负向或 disputed 反馈降低或阻止注入;
  • workspace/private scope 不能跨边界提升;公共化需要显式人工动作;
  • 内容扫描器拒绝 prompt injection、路径逃逸、凭据和不可控 patch 内容。

组件级 Review 与 Patch 边界

backend/src/agentv3/selfImprove/ 仍包含 outbox、review SDK、strategy fingerprint、 supersede、phase-hint renderer 和 worktree runner。这些是可测试组件,不代表生产启动:

  • Legacy ReviewWorker 没有在 backend/src/index.ts 构造;
  • SELF_IMPROVE_NOTES_WRITE_ENABLEDSELF_IMPROVE_AUTOPATCH_ENABLED 没有生产读取点;
  • Strategy patch 只允许模板化 phase_hints,模型不能提交任意 YAML;
  • worktree、内容扫描、fingerprint 和测试通过也只生成候选变更,永不自动 merge;
  • Skill SQL patch 没有可用入口。

要启用任何组件级路径,必须先补齐应用生命周期、凭据、资源上限、workspace/RBAC、 监控、Docker/portable 行为和回滚验证,再更新本文与用户配置文档。

存储与安全

数据当前位置边界
Pattern memorybackendLogPath() 下的 analysis pattern stores默认 backend/logs,可由 SMARTPERFETTO_BACKEND_LOG_DIR 重定向
Legacy review outboxbackend/data/self_improve/self_improve.db组件级 SQLite outbox
Supersede markersbackend/data/self_improve/supersede.db组件级 strategy 状态
Case Evolution outboxbackend/data/self_improve/case_evolution.db生产生命周期可选 worker
Runtime Skill Notesbackend runtime logs/data path不进 git
Curated Skill Notesbackend/skills/curated_skill_notes/人工晋升并随代码评审
Phase hint templatesbackend/strategies/phase_hint_templates/受控模板,不是自由 YAML patch
Run manifestsuser data self_improve/run_manifests.dbscope/run 身份与 pinned runtime 事实源
Feedback event/indexuser data self_improve/ 下的 public/private 日志与 feedback_index.dbappend-only 事件;private 目录不进入策展
Eval corpususer data self_improve/eval.dbeval-corpus/immutable case artifact 与 split 元数据
Proposals / gate attemptsuser data self_improve/proposals.dbrevision、gate session、channel artifact 和 action saga
Overlay artifacts / registryuser data self_improve/overlays/objects/evolution_registry.dbcontent-addressed artifact、generation 与 reconciliation
Contribution bundlesuser data self_improve/contribution-bundles/本地去标识归档;不自动上传
M10 外部反馈不创建独立事实库;默认路径仅额外持久化完成态 analysis_completed 证据按请求从持久化源 run 与同 run effective public negative feedback 解析信号与 review;只返回 notSubmitted 草稿,不写 GitHub

SQLite 路径通过 backendDataPath() 解析,不应从进程 cwd 拼接。写入使用事务/原子替换、 lease 和有界重试;损坏或未初始化的可选 store 不能让主分析路径崩溃。私有分析输出必须 经过统一 security projection,不能把 query、路径、知识正文或 provider 内容写入公共 report/snapshot。

运维入口

健康快照:

curl -H "Authorization: Bearer $SMARTPERFETTO_API_KEY" \
  http://localhost:3000/api/admin/self-improve/metrics

该端点继续使用既有 audit:read 权限,并向原响应追加 selfEvolution.operational, 聚合 proposal/overlay/generation/reconciliation、运行中 operation 和 L2 judge 状态。 它是观测面,不会自动启用组件。响应中的 warning 需要结合当前 flag 与启动日志判断。

Self-Evolution 控制面使用单独 base path:

/api/admin/self-evolution

浏览器入口位于 AI Assistant Settings → 自进化 / Evolution。SSE 客户端使用 fetch() 读取流,以便继续发送 Authorization 与 workspace headers;不要改成无法携带 这些 header 的原生 EventSource。运维端点和 RBAC 矩阵见 API 参考,端到端人工验收见 Self-Evolution 使用与验收

历史 pattern 的一次性迁移:

cd backend
npm run self-improve:migrate-failure-mode-hash
npm run self-improve:migrate-failure-mode-hash -- --apply

迁移前先备份当前 backend data path;先 dry-run,再 apply。

修改位置

责任权威源码
Pattern 保存、反馈、确认与注入backend/src/agentv3/analysisPatternMemory.ts 及其调用方
Failure taxonomybackend/src/agentv3/selfImprove/failureTaxonomy.ts
Skill Notes 运行时预算backend/src/agentRuntime/runtimeSkillNotes.ts
Legacy review/patch 组件backend/src/agentv3/selfImprove/
Case Evolution 配置与 workerbackend/src/services/caseEvolution/
Worker 启动/停止backend/src/index.ts
指标端点backend/src/routes/strategyAdminRoutes.ts
Self-Evolution lifecycle / stores / gate / overlaybackend/src/services/selfEvolution/
Self-Evolution 管理控制面backend/src/routes/selfEvolutionAdminRoutes.ts
Self-Evolution UIperfetto/ui/src/plugins/com.smartperfetto.AIAssistant/self_evolution_*
M10 信号、Agent triage、校验与草稿backend/src/services/externalIssueReporting/
M10 HTTP 控制面backend/src/routes/agentExternalIssueRoutes.ts
M10 UIperfetto/ui/src/plugins/com.smartperfetto.AIAssistant/external_issue_reporting.tsai_panel.ts

新增 flag 或生产入口时,必须先改配置解析/校验和生命周期测试,再更新本文;不要在文档里 声明源码没有读取的环境变量。

验证

Self-Improving 或 Case Evolution 改动至少按影响面运行:

cd backend
npm run typecheck
npm run test:self-evolution
npm run test:external-issue-reporting
npx jest --runInBand src/services/caseEvolution
npm run test:scene-trace-regression

控制台 UI 改动还要运行 Perfetto UI typecheck/相关 unit tests,在 ./scripts/start-dev.sh 中完成浏览器验证,再用 ./scripts/update-frontend.sh 更新仓库根目录的 committed prebuild。

Strategy/Skill 或公开证据合约变化还要遵守 测试规则Skill 规则。合入前运行仓库总门禁:

npm run verify:pr

禁止用旧的测试数量、历史 commit 或某次 review 结论代替当前命令结果。