release: v1.9.0

This commit is contained in:
coso
2026-04-13 02:50:53 +08:00
parent 52624b1488
commit 0f15b8a71e
313 changed files with 19875 additions and 9864 deletions
+3
View File
@@ -13,6 +13,7 @@
- `content/`:对外文档站正文(产品介绍、用户指南、进阶能力)
- `aiprompts/`:模块级工程文档(前后端组件、服务、命令、数据层)
- `exec-plans/`:执行计划、进度日志、技术债追踪
- `tech/`:跨模块技术蓝图与专题工程文档(当前已包含 Harness Engineering 指导文档)
- `bussniss/`:商务合作与代理运营方案
- `develop/`:开发流程与协作规范
@@ -21,6 +22,8 @@
- `iteration-notes/`:迭代备忘与下版本建议(暂不进入当前发布范围的问题)
- `images/`:文档图片资源
- `TECH_SPEC.md`:技术规格文档
- `exec-plans/README.md`:执行计划目录说明
- `exec-plans/tech-debt-tracker.md`:技术债持续追踪表
- `develop/execution-tracker-technical-plan.md`:统一执行追踪(Execution Tracker)专项技术规划
- `develop/execution-tracker-deprecation-plan.md`:统一执行追踪旧路径退场计划(P0 收口)
- `develop/execution-tracker-p0-acceptance-report.md`:统一执行追踪 P0 验收报告
+2
View File
@@ -16,6 +16,7 @@
- `overview.md` - 项目架构总览与模块分层
- `governance.md` - 新旧并存治理、迁移收口、禁止回流
- `harness-engine-governance.md` - Harness Engine 事实源、evidence pack、replay / analysis / review 治理规范
- `quality-workflow.md` - 本地校验、GUI smoke、契约检查、CI 门禁
- `command-runtime.md` - `@` / `/` / 轻卡 / viewer / 功能方案包实施手册
- `skill-standard.md` - 统一技能标准、skill / adapter / runtime binding 边界
@@ -62,6 +63,7 @@
- **做网页登录态访问 / 网页导出 / Markdown 落盘场景**:先读 `web-browser-scene-skill.md`
- **改 Workspace / GUI 壳 / 主路径**:先读 `workspace.md`、`quality-workflow.md`、`playwright-e2e.md`
- **做迁移 / 收口 / 去兼容层**:先读 `governance.md`
- **改 handoff / evidence pack / replay / review / HarnessStatusPanel**:先读 `harness-engine-governance.md`,再回看 `governance.md`
- **改 Provider / 凭证加载 / Token 刷新**:先读 `providers.md`、`credential-pool.md`
- **做跨仓库联动**:先读 `limecore-collaboration-entry.md`
+1 -1
View File
@@ -510,7 +510,7 @@ npm run verify:local
- **Agent / Codex 主命令**:继续收敛到 `agent_runtime_*`
- **子代理运行时主链**:继续收敛到 `agent_runtime_spawn_subagent`;当前 request surface 使用 `name / teamName / runInBackground / mode / isolation / cwd` 等字段,其中 `teamName` 需要与 `name` 搭配并依附现有 Team 上下文,`cwd` 必须是绝对目录,并稳定投影到 child session 的 `working_dir` 与 Team 成员展示;当前 runtime 仍会明确拒绝非空 `mode / isolation`
- **Team runtime 工具主链**:当前协作工具面继续收敛到 `Agent / TeamCreate / TeamDelete / SendMessage / ListPeers`;`SubAgentTask` 仅保留兼容入口,不再作为新的多代理主路径
- **Team runtime 工具主链**:当前协作工具面继续收敛到 `Agent / TeamCreate / TeamDelete / SendMessage / ListPeers`;不要把已删除的 `SubAgentTask` compat 工具重新接回新的多代理主路径
- **用户可见消息工具主链**:继续收敛到 `SendUserMessage`,用于把回复、进度同步、主动提醒和附件送到用户主可见消息面;不要再把这类能力拆到其它平行工具名或旁路协议里
- **会话状态回写主链**:继续收敛到 `agent_runtime_update_session`,用于名称、执行策略、session provider/model、`recent_access_mode`、`recent_preferences` 以及 `recent_team_selection` 的轻量持久化回写
- **会话权限主链**:`agent_runtime_submit_turn.turn_config.approval_policy / sandbox_policy` 是正式 turn context 权限协议;`getSession` 返回的 `execution_runtime.recent_access_mode` 负责承接会话最近一次 accessMode。当前端已命中同一 steady-state 权限时,不应继续依赖 `harness.access_mode` 作为唯一事实源
+12
View File
@@ -244,6 +244,17 @@ npm run test:contracts
只要其中任意一个答案是否定的,就说明治理还没完成。
### Harness Engine 主链
遇到 handoff、evidence pack、replay、review、外部诊断交接相关改动时,至少问这几个问题:
- 运行时事实是不是继续收敛到 `agent_runtime_export_evidence_pack`
- replay / analysis / review / GUI 是否只是在消费 evidence pack,而不是重新拼装一套摘要
- gap 是否只来自“当前线程真实适用但尚未导出”的信号,而不是历史硬编码模板
- request telemetry 是否已经按 `session/thread/turn` 真实关联导出;如果当前线程没有匹配请求,是否导出空摘要而不是继续保留 `unlinked`
只要其中任意一个答案是否定的,就说明 Harness Engine 还在继续长平行事实源。
### 记忆与旁路
遇到记忆系统治理时,至少同时看:
@@ -302,6 +313,7 @@ npm run test:contracts
## 相关文档
- `docs/aiprompts/commands.md`
- `docs/aiprompts/harness-engine-governance.md`
- `docs/aiprompts/quality-workflow.md`
- `docs/aiprompts/project-heatmap.md`
+271
View File
@@ -0,0 +1,271 @@
# Lime Harness Engine 治理规范
## 这份文档回答什么
本文件定义 Lime 的 harness Engine 应该如何长期演进,主要回答:
- 运行时诊断、evidence pack、replay case、analysis handoff、review template 分别谁负责什么
- 什么才算 harness 的唯一事实源,什么只是消费层或展示层
- 哪些证据可以导出,哪些只能在“适用时”导出,不能把不存在的信号硬写成全局缺口
- 当 Lime 对齐 Claude Code 的治理方式时,哪些原则应该真正落到代码里
它是 **Harness Engine 的长期治理文档**,不是某次分析导出功能的临时设计说明。
## 对齐目标
这份规范参考 Claude Code 的治理方式,但 **不照搬实现细节**。对齐的是以下几条原则:
1. **单一事实源**
2. **先采集,再解释**
3. **只有可关联的遥测,才算会话级证据**
4. **只有真正发生过的验证,才进入 evidence**
5. **消费层不重新拼装另一套运行时真相**
一句话说,就是:
**Harness Engine 不是“再做一层报表”,而是把运行时事实稳定导出,供 replay / analysis / review / UI 复用。**
## 事实源声明
从现在开始,Harness Engine 相关能力默认收敛到以下主链:
- 运行时事实导出:`agent_runtime_export_evidence_pack`
- 回放样本导出:`agent_runtime_export_replay_case`
- 外部诊断交接:`agent_runtime_export_analysis_handoff`
- 人工审核模板:`agent_runtime_export_review_decision_template`、`agent_runtime_save_review_decision`
其中:
- `evidence pack` 是 **运行时事实源**
- `replay / analysis / review / history-record summary` 是 **派生物**
- GUI 面板例如 `HarnessStatusPanel` 与 nightly dashboard 是 **展示层**
允许的数据方向只有:
`runtime thread/session` -> `evidence pack` -> `replay / analysis / review / summary` -> `trend / cleanup / dashboard` -> `UI`
禁止反向或旁路:
- `analysis` 自己再拼一套 observability summary
- `replay` 不复用 evidence pack,改为本地猜测缺口
- `UI` 的显示状态反过来成为事实源
## 分类语言
Harness Engine 相关 surface 继续沿用仓库统一分类:
- `current`:当前唯一主路径,后续功能只允许继续向这里收敛
- `compat`:兼容层,只允许委托和适配
- `deprecated`:已知要退出的旧路径,只允许迁移和下线
- `dead`:已无入口或确认停用,优先删除
在 harness 语境里,常见判断如下:
- `current`
- `agent_runtime_export_*`
- evidence pack 中的 `runtime.json / timeline.json / artifacts.json`
- `compat`
- 临时存在但只做委托的旧导出入口
- 仍保留的旧 GUI 打开目录/复制命令适配层
- `deprecated`
- 各消费方各自维护的 observability builder
- 无条件导出固定 known gaps 的旧逻辑
- `dead`
- 已没有入口引用的旧 handoff / review / diagnostics 拼装路径
## 核心治理原则
### 1. 先导出事实,再导出判断
evidence pack 先负责导出:
- 关联键
- timeline
- warnings / failed tool / failed command
- 最近产物
- 已真实发生的 verification 记录
其中 `observabilitySummary` 应优先承载紧凑的 verification outcome 摘要;更完整的明细仍可放在 `artifacts.json`,但下游不应为了得到“是否通过 / 是否失败 / 是否缺失”再单独重建第二套判断。
analysis brief、replay input、review template 只能在此基础上做解释,不能自己再回头拼装另一套事实。
### 2. 信号必须按适用性导出
Claude Code 风格最重要的一点,不是“信号越多越好”,而是“只导出当前回合真正成立的信号”。
因此 Lime 的 harness 必须遵守:
- `requestTelemetry`
- RequestLog 必须携带 `session_id / thread_id / turn_id / pending_request_id / queued_turn_id / subagent_session_id`
- evidence pack 必须按这些关联键导出会话级 request telemetry 摘要
- 如果当前线程没有匹配请求,导出空摘要即可,不能再伪造 `unlinked`
- `artifactValidator`
- 只有最近产物里存在 ArtifactDocument 或等价 artifact schema 时,才允许出现
- `browserVerification`
- 只有线程里真实出现浏览器工具或浏览器命令时,才允许出现
- `guiSmoke`
- 只有线程里真实执行了 `verify:gui-smoke` 时,才允许出现
不适用的信号不应进入 `known_gaps`,更不应被硬编码成所有线程的默认缺口。
### 3. gap 代表“已证明缺失”,不是“历史上想接”
`known_gaps` 只能来自:
- 已定义的信号覆盖表
- 且状态不是 `exported`
- 且该信号对当前线程确实适用
禁止继续保留以下旧做法:
- 所有线程都写 `artifactValidator/browserVerification/guiSmoke`
- 即使没有相关产物或相关命令,也输出空 verification 壳
- 用“未来计划支持”冒充“当前已识别缺口”
补充约束:
- trend / cleanup report 必须区分 `current` 样本里的 gap 和 `degraded` 样本故意保留的 gap
- 只有 `current` 样本出现的 observability gap 才应被当成主线回归风险
- `degraded` 样本的作用是保留诊断语义与 known gap 事实,不能反过来把 cleanup 优先级抬高
### 4. 关联键先于遥测摘要
Claude Code 的 tracing / event logging 之所以可用,前提是事件先有稳定的 session 级关联。
因此 Lime 必须把下面这些键视为 harness 级基础设施,而不是锦上添花:
- `session_id`
- `thread_id`
- `turn_id`
- `pending_request_id`
- `queued_turn_id`
- `subagent_session_id`
如果 RequestLog 还没稳定携带这些键,就不能把 request telemetry 当成会话级证据;但一旦键已补齐,后续 analysis / replay / review / UI 必须统一消费同一份 request telemetry 摘要,不能继续并存旧的 `unlinked` 语义。
### 5. 展示层不能成为新事实源
以下内容只能消费 evidence pack,不能反向定义事实:
- `HarnessStatusPanel`
- 外部 AI copy prompt
- review-summary / analysis-brief 里的文案摘要
- GUI 上看到的 warning / gap / status 卡片
展示层至少要如实透出:
- `current / degraded` observability gap 角色
- `observabilityVerificationOutcomes` 里的紧凑 outcome 焦点
- cleanup 主事实源里已经存在的 `blocking_failure / advisory_failure / recovered` 摘要
对 cleanup / dashboard / nightly report 这条推荐动作链,字段语义也必须固定:
- failure 焦点只允许走 `focusVerificationFailureOutcomes`
- recovered 焦点只允许走 `focusVerificationRecoveredOutcomes`
- 不允许继续把两类 outcome 混在一个 recommendation 字段里,再由展示层二次猜测
一旦 UI 文案和后端 evidence 冲突,以 evidence pack 和运行时导出为准。
### 6. 诊断链路必须复用下游制品
标准导出链路应保持为:
1. `evidence pack` 先落盘
2. `replay case` 复用 evidence pack
3. `analysis handoff` 复用 handoff bundle + evidence pack + replay case
4. `history-record` 复用 summary,并继续派生 `trend / cleanup / dashboard`
5. `review decision template` 再复用 analysis handoff
任何一层如果又回去重新读取 thread 并拼第二套摘要,都视为治理倒退。
### 7. 旁路系统也必须服从同一事实源
Harness Engine 不只是导出文件目录。以下旁路也必须收敛:
- diagnostics 摘要
- export copy prompt
- review template
- GUI 状态卡
- 后续 eval / trend / promote 使用的样本事实
如果主导出已经修了,旁路仍沿旧字段判断,就说明治理还没完成。
## 典型反模式
出现以下行为,视为 Harness Engine 治理倒退:
- 在 `analysis / replay / UI` 各自维护一份 observability 拼装逻辑
- 给所有线程硬塞 `artifactValidator`、`browserVerification`、`guiSmoke`
- verification 还没发生,就先导出空数组或空对象占位
- RequestLog 还无法 join,会话摘要却写成“已有 request telemetry”
- 后端证据已经修正,前端或 handoff 文案仍沿旧 gap 模板输出
- 为保留旧行为再新增一层 compat 包装,而不是删掉错误事实
## 变更顺序
涉及 Harness Engine 改动时,默认按这个顺序做:
1. 先确认唯一事实源是不是 `agent_runtime_export_*`
2. 再确认改动属于 `current / compat / deprecated / dead` 哪一类
3. 先修 evidence pack,再修 replay / analysis / review / UI
4. 先删错误默认值,再考虑是否需要新增字段
5. 最后补定向测试与最小 GUI / 契约验证
如果说不清这次改动要收敛到哪个导出入口,就不要继续扩。
## 最低验证要求
Harness Engine 改动至少应覆盖:
- 受影响 Rust 服务的定向测试
- evidence pack 导出结果检查
- replay / analysis 是否复用 evidence pack 的回归检查
- 如果改动触及 cleanup report / dashboard 推荐动作契约,默认把 cleanup contract 校验纳入最小门槛:
```bash
npm run harness:cleanup-report:check
```
如果要校验某个指定产物,再显式传入:
```bash
node scripts/check-generated-slop-report.mjs --input "<cleanup-json>"
```
如同时触及命令边界,再补:
```bash
npm run test:contracts
```
如同时触及 GUI 主路径或 `HarnessStatusPanel`,再补:
```bash
npm run verify:gui-smoke
```
人工 spot check 至少看一次:
- `.lime/harness/sessions/<session_id>/evidence/runtime.json`
- `.lime/harness/sessions/<session_id>/evidence/artifacts.json`
- `.lime/harness/sessions/<session_id>/replay/input.json`
- `.lime/harness/sessions/<session_id>/analysis/analysis-context.json`
## 当前最值得继续优化的一刀
如果继续沿这条主线推进,优先级最高的是:
**把已导出的 request telemetry 继续沉淀到 trend / replay / review 守卫里,确保后续任何新入口都只能复用同一份会话级摘要,而不是再次旁路读取或重建第二套真相。**
这样才能继续逼近 Claude Code 那种“先 trace,再解释,而且所有解释都复用同一份 trace”的治理状态。
## 相关文档
- `docs/aiprompts/governance.md`
- `docs/aiprompts/commands.md`
- `docs/aiprompts/quality-workflow.md`
- `docs/aiprompts/playwright-e2e.md`
## 一句话总结
**Harness Engine 的治理目标不是导出更多文件,而是让所有诊断、回放、审核和 GUI 都只复用同一份运行时事实。**
+25
View File
@@ -126,6 +126,31 @@ x-api-key: {api_key}
anthropic-version: 2023-06-01
```
## Prompt Cache 能力边界
Lime 当前把 Prompt Cache 能力视为 **Provider 类型能力**,而不是“请求长得像哪家协议”:
- `anthropic` / `claude` / `claude-oauth`:声明为 `automatic`
- `anthropic-compatible`:声明为 `explicit_only`
- 其它 Provider:默认 `not_applicable`
这条事实源当前收敛在:
- 前端:`src/lib/model/providerPromptCacheSupport.ts`
- 后端:Provider 类型与运行时能力判断链
需要特别注意:
1. `anthropic-compatible` 只表示接入方兼容 Anthropic wire format,不等于上游已经实现 Anthropic Automatic Prompt Caching
2. Lime 不会因为某个自定义渠道“长得像 Anthropic”就默认把它当成官方 Anthropic 自动缓存能力
3. 对 `anthropic-compatible` 渠道,Lime 只保留显式 `cache_control` 语义;如果上游没有实现 Automatic Prompt Cache,`cached_input_tokens` 为空不能直接归因到 Lime 没发字段
排查这类问题时,优先确认三件事:
1. 当前 Provider 类型是不是 `anthropic-compatible`
2. 上游服务是否真的声明支持 Anthropic Automatic Prompt Caching
3. 响应 usage 中是否存在 `cache_creation_input_tokens` / `cache_read_input_tokens` / `cached_input_tokens`
## 凭证管理策略
### 方案 B: 独立副本策略
+17 -1
View File
@@ -82,7 +82,7 @@
如果本轮涉及 `companion_*` 桌宠命令族,还要同步检查本地 companion `WebSocket` 入口、前端 `src/lib/api/companion.ts` 网关、Rust 注册、治理目录册以及浏览器模式 mock 返回形态;浏览器模式下这组命令默认也要保持可 mock,不要让桌宠接入把默认页面渲染链路卡死。
如果本轮涉及 team runtime 工具面或主线程用户消息工具,还要同步检查 Rust catalog / inventory、runtime 注册、浏览器 fallback mock 与前端 tool display;`Agent / TeamCreate / TeamDelete / SendMessage / ListPeers` 必须保持同一组 current surface,`SendUserMessage` 也必须继续停留在 current 主线程工具面,`SubAgentTask` 只能继续停留在 compat 读取边界。
如果本轮涉及 team runtime 工具面或主线程用户消息工具,还要同步检查 Rust catalog / inventory、runtime 注册、浏览器 fallback mock 与前端 tool display;`Agent / TeamCreate / TeamDelete / SendMessage / ListPeers` 必须保持同一组 current surface,`SendUserMessage` 也必须继续停留在 current 主线程工具面,不要把已删除的 `SubAgentTask` compat 工具重新接回 Rust catalog、runtime 注册、mock 或前端 tool display。
如果本轮涉及 MCP bridge runtime tool surface、inventory 或 ToolSearch,还要同步检查 Rust extension 注入、inventory 快照、浏览器 fallback mock 与 GUI 面板命名;当前唯一命名事实源是 `mcp__<server>__<tool>`,对应 extension surface key 为 `mcp__<server>`,不要让 mock 或 UI 退回裸 `server__tool`。同时,Lime runtime 里的 `ToolSearch` 当前事实源必须是 `ToolSearchBridgeTool`;`aster-rust` 自带 `ToolSearchTool` 只能停留在 compat 存量,不允许再抢占当前 runtime surface。
如果本轮还需要对子工作区单独跑 Rust 定向测试,例如 `src-tauri/crates/aster-rust`,必须确认产物仍落在统一的 `src-tauri/target`,不要重新写回子目录自己的 `target/`;否则 `tauri dev` 会把构建产物当成源码变化,反复触发重编译。
@@ -183,6 +183,22 @@ npm run test:bridge
npm run bridge:health -- --timeout-ms 120000
```
如果本轮改动落在 harness cleanup / dashboard 推荐动作契约,还应补:
```bash
npm run harness:cleanup-report:check
```
这条校验已经进入 `npm run test:contracts` 默认门禁;如果你要点检某个指定产物,再显式执行:
```bash
node scripts/check-generated-slop-report.mjs --input "<cleanup-json>"
```
同时,`scripts/report-generated-slop.mjs`、`scripts/check-generated-slop-report.mjs`、`scripts/harness-eval-history-record.mjs`、`scripts/harness-eval-trend-report.mjs`、`scripts/lib/generated-slop-report-core.mjs`、`scripts/lib/harness-dashboard-core.mjs` 这条 harness cleanup/report 主链,在 `verify:local` 的 smart 模式里默认也按 bridge/contracts 风险处理。
本地 `verify:local` 输出里如果看到 `bridge 校验(harness cleanup contract)`,说明命中的就是这条 cleanup/report 契约门禁,而不是普通 DevBridge 变更。
CI 里的 `.github/workflows/quality.yml` 结果摘要现在也会透出 `bridge_reasons`,并写入 `GITHUB_STEP_SUMMARY`,用于区分这次是 `harness_cleanup_contract`、`bridge_runtime`,还是 `workflow_full_suite` / `fallback_full_suite` 这类全量触发。
作用:
- 检查前端命令调用与 Rust 注册表是否一致
+2 -3
View File
@@ -28,8 +28,8 @@
- `src-tauri/src/services/execution_tracker_service.rs`
- `src-tauri/src/services/heartbeat_service/mod.rs`
- `src-tauri/src/services/heartbeat_service/delivery.rs`
- `src-tauri/src/commands/aster_agent_cmd.rs`
- `src-tauri/src/commands/subagent_cmd.rs`
- `src-tauri/src/commands/aster_agent_cmd/mod.rs`
- `src-tauri/src/commands/aster_agent_cmd/tool_runtime/subagent_tools.rs`
- `src-tauri/crates/websocket/src/handlers/rpc_handler.rs`
- `src-tauri/crates/core/src/database/schema.rs`
@@ -256,4 +256,3 @@ Lime 的底座(追踪、权限、沙箱、Provider 能力)已经具备,当
1. **远程触发协议与命令面**(入口)
2. **任务治理状态模型**(稳定性)
3. **任务健康与追踪看板**(运营)
+28
View File
@@ -0,0 +1,28 @@
# `docs/exec-plans`
本目录存放会影响开发执行的 versioned artifact:执行计划、进度日志、阻塞记录、迁移清单、技术债追踪。
## 放什么
- 多轮实现、迁移、治理任务的执行计划
- 与计划绑定的阶段进度、阻塞项、决策记录
- 需要持续小额偿还的技术债与退出条件
## 命名约定
- 专项计划:`<topic>-plan.md`
- 进度日志:`<topic>-progress.md`
- 常驻追踪:使用固定文件名,例如 `tech-debt-tracker.md`
## 使用规则
1. 计划不是一次性文档,推进状态变化时要同步更新
2. 会改变实现顺序、范围或回滚策略的决策,必须记录在这里或链接到这里
3. 清理类工作如果不能直接回挂路线图,应登记到 `tech-debt-tracker.md`
4. 被替代的计划不要悬空,保留跳转说明或归档指针
## 关联入口
- 路线图主线:`docs/roadmap/`
- 技术债追踪:`docs/exec-plans/tech-debt-tracker.md`
- 模块级实施细节:`docs/aiprompts/README.md`
+15
View File
@@ -0,0 +1,15 @@
# 技术债追踪
本文件记录需要持续、小额偿还的技术债,避免把问题堆到一次性大清理。
## 记录规则
1. 每条技术债都要写清具体代码面、影响和下一小步
2. 能回挂路线图主线的,优先回挂路线图;不能回挂的,登记到这里
3. 状态至少区分 `待处理`、`进行中`、`已完成`、`放弃`
## 条目
| ID | 日期 | 区域 | 差距 / 债务 | 影响 | 下一小步 | 关联文档 | 状态 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| TBD-000 | 2026-04-12 | 待补 | 初始化占位,后续将零散技术债迁入本表 | 先让规则有稳定落点,避免口头追踪 | 首次登记真实条目时替换本行 | `docs/exec-plans/README.md` | 待处理 |
+2 -3
View File
@@ -77,7 +77,6 @@ Lime 实际已经具备这些能力:
| current | `src-tauri/crates/mcp/src/manager.rs` | MCP tools runtime registry |
| current | `src-tauri/src/commands/aster_agent_cmd.rs` | Aster runtime 注入、`ToolSearch`、inventory 命令 |
| current | `src-tauri/src/agent_tools/inventory.rs` | runtime 工具库存快照 |
| compat | `SubAgentTask` | 兼容旧子代理工具名;current 协作工具面已收敛到 `Agent / SendMessage / TeamCreate / TeamDelete / ListPeers` |
| compat | `workspace_allowed_tool_names(...)` | 当前保留为旧调用入口别名,实际委托默认授权目录 |
| dead-candidate | `src-tauri/crates/agent/src/tool_permissions.rs` | 已退出 `lime-agent` 的 `lib.rs` 编译图,仅通过 `src-tauri/crates/agent/tests/legacy_permission_surfaces.rs` 测试夹具加载 |
| dead-candidate | `src-tauri/crates/agent/src/shell_security.rs` | 已退出 `lime-agent` 的 `lib.rs` 编译图,仅通过 `src-tauri/crates/agent/tests/legacy_permission_surfaces.rs` 测试夹具加载 |
@@ -237,8 +236,8 @@ Lime 实际已经具备这些能力:
- **Team runtime current surface**
`Agent` / `SendMessage` / `TeamCreate` / `TeamDelete` / `ListPeers`
- **Compat only**
`SubAgentTask`
- **Compat tool name**
当前不再保留 `SubAgentTask`;team runtime 已收敛到 `Agent / SendMessage / TeamCreate / TeamDelete / ListPeers`
- **说明**
Core surface 现已按 current surface 收敛;精确数量与分类以 `src-tauri/src/agent_tools/catalog.rs` 为准。
+3 -4
View File
@@ -45,9 +45,9 @@
- `TeamDelete`
- `ListPeers`
### Compat only
### Compat tool name
- `SubAgentTask`
- 当前不再保留 `SubAgentTask`
### Core 总数
@@ -111,7 +111,7 @@ Core surface 当前默认 allow 的工具集已经收敛到 current surface,
结论:
- 默认 allowlist 继续优先保留常驻、小而稳的工具面
- `SubAgentTask` 已降为 compat 入口,不再作为 current 默认协作工具面
- `SubAgentTask` 已从应用层删除,不再作为 current 默认协作工具面
- `read` / `write` / `edit` / `bash` / `WebFetch` 这类需要参数约束或更强执行控制的工具仍不应默认放开
这符合“常驻工具面小而稳”的原则。
@@ -218,7 +218,6 @@ const snapshot = await getAgentRuntimeToolInventory({
## 5.2 compat
- `SubAgentTask`
- `workspace_allowed_tool_names(...)`
## 5.3 deprecated
+10
View File
@@ -134,6 +134,16 @@ npm run harness:eval:trend
npm run harness:eval:history:record
```
默认会把完整 artifact 套件写到 `./.lime/harness/reports/`:
- `harness-eval-summary.json`
- `harness-eval-summary.md`
- `harness-eval-trend.json`
- `harness-eval-trend.md`
- `harness-cleanup-report.json`
- `harness-cleanup-report.md`
- `harness-dashboard.html`
### 运行 Harness cleanup / slop 报告
```bash
+7
View File
@@ -47,6 +47,13 @@
"source": "repo_fixture",
"caseDir": "docs/test/harness-fixtures/replay/minimal-pending-request",
"tags": ["conversation-runtime", "replay", "handoff", "evidence"]
},
{
"id": "fixture-minimal-observability-gap",
"title": "最小 observability gap Replay 样本",
"source": "repo_fixture",
"caseDir": "docs/test/harness-fixtures/replay/minimal-observability-gap",
"tags": ["conversation-runtime", "replay", "handoff", "evidence", "observability-gap"]
}
]
},
+47 -12
View File
@@ -56,8 +56,12 @@ Lime 当前不直接把“真实模型重放平台”一次做完,而是先固
1. **仓库固定 Replay 样本**
- 用于 CI / nightly 的稳定入口
- 当前固定一条 fixture:
- 当前固定两条 fixture:
- `fixture-minimal-pending-request`
- `fixture-minimal-observability-gap`
- 角色分工必须稳定:
- `fixture-minimal-pending-request` 是 `current` 样本,要求 observability fully exported,不能继续挂 `known_gap`
- `fixture-minimal-observability-gap` 是 `degraded` 样本,专门承载 `known_gap` 语义,避免把证据缺口混进 current 样本
- 目的不是替代真实会话,而是先验证 grader 合同、字段预算和摘要出口不会漂移
2. **仓库沉淀 Replay 样本**
@@ -89,6 +93,7 @@ Lime 当前不直接把“真实模型重放平台”一次做完,而是先固
3. 校验 replay case 最小四件套与关键 JSON 字段
4. 输出统一 JSON / Markdown 摘要,并聚合 `suite tag / failure mode / review decision status / risk level` 分布
5. 继续聚合 `observabilitySignals`,把 `requestTelemetry / artifactValidator / browser/gui smoke` 的证据缺口也纳入 trend 与 cleanup
6. 继续聚合 `observabilityVerificationOutcomes`,直接复用 evidence pack 导出的紧凑 outcome,告诉治理层当前更像是 `artifactValidator issues / browser failure / gui smoke failed` 还是已通过
当前它**不直接执行真实模型重放**,而是先把“样本是否可评估、摘要是否可归档”工程化。
@@ -167,16 +172,34 @@ node scripts/harness-replay-promote.mjs \
固定下来。
当前 nightly 还会恢复并追加 `artifacts/history/*.json` 历史窗口,用于让 trend 不只停留在单次 seed。
当前 nightly 会恢复并追加 `artifacts/history/*.json` 历史窗口,用于让 trend 不只停留在单次 seed。
在当前仓库主链里,nightly 还会基于 trend + doc freshness + governance report 继续生成 `harness-cleanup-report.json/md`,让回归样本、人工审核状态和治理建议进入同一份 nightly artifact。
从当前主线开始,nightly 不再手工串 `runner -> trend -> cleanup` 三段命令,而是统一走:
从 `2026-03-27` 起,这个历史窗口不再依赖 workflow 里的 `cp / ls / xargs` 拼接,而是直接由 `scripts/harness-eval-runner.mjs --record-history-dir` 负责写入和裁剪,保证本地与 nightly 走同一条跨平台主链。
```bash
node scripts/harness-eval-history-record.mjs \
--history-dir "./artifacts/history" \
--summary-json "./artifacts/harness-eval-summary.json" \
--summary-markdown "./artifacts/harness-eval-summary.md" \
--trend-json "./artifacts/harness-eval-trend.json" \
--trend-markdown "./artifacts/harness-eval-trend.md" \
--cleanup-json "./artifacts/harness-cleanup-report.json" \
--cleanup-markdown "./artifacts/harness-cleanup-report.md" \
--dashboard-html "./artifacts/harness-dashboard.html"
```
这样本地与 nightly 复用同一条 `summary -> history -> trend -> cleanup -> dashboard` 主线,也让 `current / degraded` observability gap 角色在两侧保持同口径,并把 `browser/gui/artifact` 的 verification outcome 焦点直接带进 nightly HTML 仪表板,继续绑定到同一事实源。
从 `2026-03-27` 起,这个历史窗口不再依赖 workflow 里的 `cp / ls / xargs` 拼接;当前唯一 current 入口是 `scripts/harness-eval-history-record.mjs`,统一负责写入和裁剪 history window,保证本地与 nightly 走同一条跨平台主链。
同一天新增的 `scripts/harness-eval-history-record.mjs` 又把这条主链向前推了一步:
- 本地可以一次命令完成 `summary -> history -> trend -> cleanup`
- 本地默认把 history window 写到 `./.lime/harness/history`,并把 trend / cleanup 报表写到 `./.lime/harness/reports`
- 本地可以一次命令完成 `summary -> history -> trend -> cleanup -> dashboard`
- 本地默认把 history window 写到 `./.lime/harness/history`,并把 `summary / trend / cleanup / dashboard` 全部写到 `./.lime/harness/reports`
- 如显式传入 `--dashboard-html`,会覆盖默认 HTML 产物路径,但仍直接复用 in-memory 的 `summary / trend / cleanup` 对象生成 HTML,不再额外读取第二套事实
- `history-record` 自身的 JSON / text 结果也应直接带出 cleanup 侧的 verification outcome 焦点,避免调用方为了知道“先修 artifact/browser/gui 哪层”还要再手工下钻 cleanup 报告
- `cleanup` 当前还应继续导出稳定的 verification 摘要,例如 `failureCaseCount / recoveredCaseCount`,让 dashboard 与 nightly 值班出口可以直接判断是否需要立刻阻断主线
- 对 failure outcome 还应继续区分 `blocking_failure / advisory_failure`;默认像 `guiSmoke:failed`、`browserVerification:failure` 这类直接验证失败应被归到 blocking,而 `artifactValidator:issues_present` 这类更偏证据治理的失败应停留在 advisory
- `cleanup report` 在未显式传入 `--trend-input / --trend-history-dir` 时,会优先自动发现 `./.lime/harness/history`,再回退到 `./artifacts/history`
- 修复后的趋势积累不再只属于 nightly,开发者本地也能拿到同口径的历史窗口
@@ -203,13 +226,22 @@ node scripts/harness-eval-runner.mjs \
--output-json "./tmp/harness-eval-summary.json" \
--output-markdown "./tmp/harness-eval-summary.md"
# 推荐的本地一体化入口:记录 history,并同时刷新 trend / cleanup
# 推荐的本地一体化入口:记录 history,并同时刷新 summary / trend / cleanup / dashboard
npm run harness:eval:history:record
# 如需显式指定本地 history window
node scripts/harness-eval-runner.mjs \
--record-history-dir "./.lime/harness/history" \
--history-retain 30
# 默认产物目录:
# ./.lime/harness/reports/harness-eval-summary.json
# ./.lime/harness/reports/harness-eval-summary.md
# ./.lime/harness/reports/harness-eval-trend.json
# ./.lime/harness/reports/harness-eval-trend.md
# ./.lime/harness/reports/harness-cleanup-report.json
# ./.lime/harness/reports/harness-cleanup-report.md
# ./.lime/harness/reports/harness-dashboard.html
# 如需覆盖 dashboard 产物路径
node scripts/harness-eval-history-record.mjs \
--history-dir "./.lime/harness/history" \
--dashboard-html "./tmp/harness-dashboard.html"
# 从历史 summary 目录生成趋势报告
node scripts/harness-eval-trend-report.mjs \
@@ -229,7 +261,8 @@ Runner 摘要至少回答下面这些问题:
- 哪些 case 属于什么 suite tag / failure mode
- 哪些 case 默认需要人工复核
- 哪些 case 已经记录人工审核状态与风险等级
- 哪些 case 还缺 `observabilitySummary` 或仍处于 `requestTelemetry:unlinked`、`artifactValidator:known_gap` 等证据缺口
- 哪些 case 还缺 `observabilitySummary` 或仍处于 `requestTelemetry:known_gap`、`artifactValidator:known_gap` 等证据缺口
- 哪些 case 已经导出 `observabilityVerificationOutcomes`,并能直接看出 `artifactValidator:issues_present`、`browserVerification:failure`、`guiSmoke:failed` 等 outcome
- 工作区 replay 是否已经开始形成增量样本
如果摘要回答不了这些问题,就说明 runner 还不算进入 current 主链。
@@ -241,6 +274,8 @@ Trend 报告至少还要回答:
- 哪些 failure mode / suite tag 在 latest 里增长或退化了
- 哪些人工审核状态 / 风险等级在 latest 里新增、减少或发生迁移
- 哪些 observability signal gap 在 latest 里增加、减少或仍然停留在 current 样本中
- 哪些 verification outcome 在 latest 里新增、减少或迁移,足以直接指出先修 artifact/browser/gui 哪一层
- 哪些 observability gap 属于 `current` 样本回归,哪些只是 `degraded` 样本刻意保留的诊断基线
- 当前只有 trend seed,还是已经开始形成真正的历史窗口
## 与其他事实源的关系
@@ -0,0 +1,125 @@
{
"replayCaseVersion": "v1",
"exportedAt": "2026-03-27T14:10:00Z",
"handoffBundle": {
"relativeRoot": ".lime/harness/sessions/fixture-session-observability-gap/handoff",
"absoluteRoot": "/workspace/lime/.lime/harness/sessions/fixture-session-observability-gap/handoff",
"artifacts": [
{
"kind": "plan",
"title": "执行计划",
"relativePath": ".lime/harness/sessions/fixture-session-observability-gap/handoff/plan.md"
},
{
"kind": "handoff",
"title": "交接摘要",
"relativePath": ".lime/harness/sessions/fixture-session-observability-gap/handoff/handoff.md"
}
]
},
"evidencePack": {
"relativeRoot": ".lime/harness/sessions/fixture-session-observability-gap/evidence",
"absoluteRoot": "/workspace/lime/.lime/harness/sessions/fixture-session-observability-gap/evidence",
"knownGaps": [
"当前环境未找到可读取的 request telemetry 日志目录,Evidence Pack 无法导出会话级请求遥测。",
"当前检测到 1 个 ArtifactDocument 产物,但 validator outcome 尚未回挂到当前 evidence pack。"
],
"artifacts": [
{
"kind": "summary",
"title": "证据摘要",
"relativePath": ".lime/harness/sessions/fixture-session-observability-gap/evidence/summary.md"
},
{
"kind": "runtime",
"title": "运行时快照",
"relativePath": ".lime/harness/sessions/fixture-session-observability-gap/evidence/runtime.json"
}
]
},
"observabilitySummary": {
"schemaVersion": "v1",
"correlation": {
"correlationKeys": [
"session_id",
"thread_id",
"turn_id",
"pending_request_id",
"queued_turn_id",
"subagent_session_id"
],
"sessionId": "fixture-session-observability-gap",
"threadId": "fixture-thread-observability-gap",
"activeTurnId": "turn-gap-001",
"pendingRequestIds": [],
"queuedTurnIds": [],
"subagentSessionIds": []
},
"counts": {
"turnCount": 1,
"itemCount": 2,
"pendingRequestCount": 0,
"queuedTurnCount": 0,
"warningCount": 0,
"failedToolCallCount": 0,
"failedCommandCount": 0,
"subagentCount": 0,
"recentArtifactCount": 2
},
"latest": {
"warning": null,
"failedTool": null,
"failedCommand": null
},
"requestTelemetry": {
"source": "lime_infra.telemetry.request_logs",
"searchedRoots": [],
"matchedRequestCount": 0,
"latestRequestAt": null,
"statusCounts": {},
"providers": [],
"models": [],
"requests": []
},
"signalCoverage": [
{
"signal": "correlation",
"status": "exported",
"source": "runtime thread identity",
"detail": "当前证据包已导出 session/thread/turn/pending request/subagent 关联键。"
},
{
"signal": "timeline",
"status": "exported",
"source": "timeline.json",
"detail": "当前证据包已导出最近 turn 与 item 时间线。"
},
{
"signal": "warnings",
"status": "exported",
"source": "thread.diagnostics",
"detail": "当前线程没有 diagnostics,但 warning 通道已保留在导出结构中。"
},
{
"signal": "requestTelemetry",
"status": "known_gap",
"source": "lime_infra.telemetry.request_logs",
"detail": "当前环境未找到可读取的 request telemetry 日志目录,Evidence Pack 无法导出会话级请求遥测。"
},
{
"signal": "artifactValidator",
"status": "known_gap",
"source": "artifact_document_validator",
"detail": "当前检测到 1 个 ArtifactDocument 产物,但 validator outcome 尚未回挂到当前 evidence pack。"
}
],
"knownGaps": [
"当前环境未找到可读取的 request telemetry 日志目录,Evidence Pack 无法导出会话级请求遥测。",
"当前检测到 1 个 ArtifactDocument 产物,但 validator outcome 尚未回挂到当前 evidence pack。"
]
},
"recentArtifacts": [
"docs/tech/harness/implementation-blueprint.md",
".lime/artifacts/thread-gap/report.artifact.json"
]
}
@@ -0,0 +1,28 @@
{
"replayCaseVersion": "v1",
"exportedAt": "2026-03-27T14:10:00Z",
"sessionId": "fixture-session-observability-gap",
"threadId": "fixture-thread-observability-gap",
"goalSummary": "确认评估链会把 observability 证据缺口显式识别出来,而不是把证据不完整的会话误判为全量覆盖。",
"successCriteria": [
"评分结果必须明确指出 requestTelemetry 与 artifactValidator 的 known gap。",
"若沿用 handoff bundle 与 evidence pack,结论必须引用至少一条证据来源。",
"不得把 evidence 缺口包装成 PASS 证据。"
],
"blockingChecks": [
"确认当前线程虽已完成,但 observability 缺口仍被保留下来。",
"确认 requestTelemetry 缺日志目录不会被误判为已导出空摘要。"
],
"artifactChecks": [
"确认 `.lime/harness/sessions/fixture-session-observability-gap/handoff/handoff.md` 仍与目标一致。",
"确认 evidence pack 中记录的 known gaps 被正确解读。"
],
"nonGoals": [
"不要要求与原始会话完全相同的工具调用顺序。",
"不要把措辞差异当作失败,除非它改变了 observability 风险判断。"
],
"graderSuggestion": {
"preferredMode": "result_artifact_and_observability_gap_resolution",
"requiresHumanReview": false
}
}
@@ -0,0 +1,37 @@
# Replay Case 评分说明
- 会话:`fixture-session-observability-gap`
- 线程:`fixture-thread-observability-gap`
- 导出时间:2026-03-27T14:10:00Z
- 目标摘要:确认评估链会把 observability 证据缺口显式识别出来,而不是把证据不完整的会话误判为全量覆盖。
## 建议读取顺序
1. 先读 `input.json`,理解当前任务、线程状态与 observability 缺口。
2. 再读 `expected.json`,确认只评估结果与风险。
3. 再读 `evidence-links.json`,跳转到 handoff 与 evidence 入口。
4. 如需补证据,优先回看 evidence pack 中的 `knownGaps` 与 `observabilitySummary`。
## 评分原则
- 只评结果,不评路径。
- 先证据后结论;缺口必须引用 evidence,而不是凭印象补齐。
- 如果 evidence 已明确记录 `known_gap`,结论里必须解释它是否阻断判定,不能把缺口包装成 PASS 证据。
## 最小通过条件
- 结果必须指出 `requestTelemetry` 与 `artifactValidator` 的缺口状态。
- 结果必须引用 handoff 或 evidence 中的至少一条证据。
- 不得把 observability 缺口误判为“证据已完整”。
## 建议输出模板
```text
verdict: pass | fail | needs_review
reason:
- ...
evidence:
- ...
risks:
- ...
```
@@ -0,0 +1,174 @@
{
"replayCaseVersion": "v1",
"source": "lime.fixture.replay_case",
"exportedAt": "2026-03-27T14:10:00Z",
"session": {
"sessionId": "fixture-session-observability-gap",
"threadId": "fixture-thread-observability-gap",
"workspaceId": "fixture-workspace",
"workspaceRoot": "/workspace/lime",
"model": "fixture-model",
"executionStrategy": "agent_runtime"
},
"task": {
"goalSummary": "确认评估链会把 observability 证据缺口显式识别出来,而不是把证据不完整的会话误判为全量覆盖。",
"latestPlan": "先导出 handoff bundle 与 evidence pack,再由 grader 校验 observability gap。",
"latestTurnSummary": "线程已完成,但 request telemetry 与 artifact validator 仍存在 known gap。",
"latestTurnPrompt": "请把这次 evidence 不完整的会话导出为 replay 样本。",
"latestTurnId": "turn-gap-001",
"latestTurnStatus": "completed",
"threadStatus": "completed",
"primaryBlockingSummary": "当前交付已完成,但 observability 证据仍不完整,评分时必须显式说明。"
},
"classification": {
"sourceKind": "repo_fixture",
"suiteTags": [
"conversation-runtime",
"replay",
"observability-gap",
"handoff",
"evidence"
],
"failureModes": [
"observability_gap"
],
"primaryBlockingKind": "completed"
},
"runtimeContext": {
"pendingRequests": [],
"queuedTurns": [],
"todoItems": [
{
"content": "补 request telemetry 关联",
"status": "in_progress"
}
],
"activeSubagents": [],
"recentArtifacts": [
"docs/tech/harness/implementation-blueprint.md",
".lime/artifacts/thread-gap/report.artifact.json"
],
"recentTimeline": [
{
"itemId": "timeline-gap-001",
"turnId": "turn-gap-001",
"payloadKind": "plan",
"status": "completed",
"summary": "产出 observability gap 导出计划",
"updatedAt": "2026-03-27T14:02:00Z"
},
{
"itemId": "timeline-gap-002",
"turnId": "turn-gap-001",
"payloadKind": "file_artifact",
"status": "completed",
"summary": "导出 evidence pack 与 handoff",
"updatedAt": "2026-03-27T14:07:00Z"
}
],
"lastOutcome": {
"thread_id": "fixture-thread-observability-gap",
"turn_id": "turn-gap-001",
"outcome_type": "success",
"summary": "handoff 与 evidence 已导出,但 observability known gap 待后续治理",
"primary_cause": "observability_gap",
"retryable": true
},
"incidents": []
},
"observability": {
"schemaVersion": "v1",
"correlation": {
"correlationKeys": [
"session_id",
"thread_id",
"turn_id",
"pending_request_id",
"queued_turn_id",
"subagent_session_id"
],
"sessionId": "fixture-session-observability-gap",
"threadId": "fixture-thread-observability-gap",
"activeTurnId": "turn-gap-001",
"pendingRequestIds": [],
"queuedTurnIds": [],
"subagentSessionIds": []
},
"counts": {
"turnCount": 1,
"itemCount": 2,
"pendingRequestCount": 0,
"queuedTurnCount": 0,
"warningCount": 0,
"failedToolCallCount": 0,
"failedCommandCount": 0,
"subagentCount": 0,
"recentArtifactCount": 2
},
"latest": {
"warning": null,
"failedTool": null,
"failedCommand": null
},
"requestTelemetry": {
"source": "lime_infra.telemetry.request_logs",
"searchedRoots": [],
"matchedRequestCount": 0,
"latestRequestAt": null,
"statusCounts": {},
"providers": [],
"models": [],
"requests": []
},
"signalCoverage": [
{
"signal": "correlation",
"status": "exported",
"source": "runtime thread identity",
"detail": "当前证据包已导出 session/thread/turn/pending request/subagent 关联键。"
},
{
"signal": "timeline",
"status": "exported",
"source": "timeline.json",
"detail": "当前证据包已导出最近 turn 与 item 时间线。"
},
{
"signal": "warnings",
"status": "exported",
"source": "thread.diagnostics",
"detail": "当前线程没有 diagnostics,但 warning 通道已保留在导出结构中。"
},
{
"signal": "requestTelemetry",
"status": "known_gap",
"source": "lime_infra.telemetry.request_logs",
"detail": "当前环境未找到可读取的 request telemetry 日志目录,Evidence Pack 无法导出会话级请求遥测。"
},
{
"signal": "artifactValidator",
"status": "known_gap",
"source": "artifact_document_validator",
"detail": "当前检测到 1 个 ArtifactDocument 产物,但 validator outcome 尚未回挂到当前 evidence pack。"
}
],
"knownGaps": [
"当前环境未找到可读取的 request telemetry 日志目录,Evidence Pack 无法导出会话级请求遥测。",
"当前检测到 1 个 ArtifactDocument 产物,但 validator outcome 尚未回挂到当前 evidence pack。"
]
},
"linkedArtifacts": {
"handoffBundle": {
"relativeRoot": ".lime/harness/sessions/fixture-session-observability-gap/handoff",
"artifactCount": 4
},
"evidencePack": {
"relativeRoot": ".lime/harness/sessions/fixture-session-observability-gap/evidence",
"artifactCount": 4,
"knownGaps": [
"当前环境未找到可读取的 request telemetry 日志目录,Evidence Pack 无法导出会话级请求遥测。",
"当前检测到 1 个 ArtifactDocument 产物,但 validator outcome 尚未回挂到当前 evidence pack。"
]
}
}
}
@@ -20,11 +20,39 @@
"evidencePack": {
"relativeRoot": ".lime/harness/sessions/fixture-session-minimal-pending-request/evidence",
"absoluteRoot": "/workspace/lime/.lime/harness/sessions/fixture-session-minimal-pending-request/evidence",
"knownGaps": [
"当前 Lime 虽然已有全局 RequestLog / token / retry / duration 遥测,但 RequestLog 尚未携带 session/thread/turn 关联键,Evidence Pack 只能导出 request telemetry coverage gap,不能给出精确的会话级摘要。",
"当前 Evidence Pack 尚未纳入 ArtifactDocument validator outcome 与修复问题摘要。",
"当前 Evidence Pack 尚未纳入 GUI smoke / browser 验证结果。"
],
"knownGaps": [],
"verification": {
"artifactValidatorIssues": [
{
"path": ".lime/artifacts/thread-1/report.artifact.json",
"issues": [
"title 缺失或为空,已使用兜底标题。"
],
"repaired": true,
"fallbackUsed": false
}
],
"browserEvidence": [
{
"itemId": "browser-tool-fixture-001",
"turnId": "turn-fixture-001",
"toolName": "browser_snapshot",
"status": "completed",
"updatedAt": "2026-03-27T11:22:00Z"
}
],
"guiSmoke": {
"itemId": "gui-smoke-fixture-001",
"turnId": "turn-fixture-001",
"status": "completed",
"command": "npm run verify:gui-smoke",
"cwd": "/workspace/lime",
"exitCode": 0,
"error": null,
"updatedAt": "2026-03-27T11:23:30Z",
"outputPreview": "GUI smoke finished successfully"
}
},
"artifacts": [
{
"kind": "summary",
@@ -65,13 +93,25 @@
"failedToolCallCount": 0,
"failedCommandCount": 0,
"subagentCount": 0,
"recentArtifactCount": 2
"recentArtifactCount": 3
},
"latest": {
"warning": null,
"failedTool": null,
"failedCommand": null
},
"requestTelemetry": {
"source": "lime_infra.telemetry.request_logs",
"searchedRoots": [
"/workspace/lime/request_logs"
],
"matchedRequestCount": 0,
"latestRequestAt": null,
"statusCounts": {},
"providers": [],
"models": [],
"requests": []
},
"signalCoverage": [
{
"signal": "correlation",
@@ -93,37 +133,57 @@
},
{
"signal": "requestTelemetry",
"status": "unlinked",
"source": "lime_infra.telemetry",
"detail": "Lime 已有 workspace 级 request telemetry,但当前 RequestLog 还未携带 session/thread/turn 元数据。"
"status": "exported",
"source": "lime_infra.telemetry.request_logs",
"detail": "当前证据包已扫描 request telemetry 日志目录,但当前会话未匹配到 provider request 记录。"
},
{
"signal": "artifactValidator",
"status": "known_gap",
"status": "exported",
"source": "artifact_document_validator",
"detail": "Artifact validator outcome 尚未回挂到当前 evidence pack。"
"detail": "当前证据包已为 1 个 ArtifactDocument 产物导出 validator outcome。"
},
{
"signal": "browserVerification",
"status": "known_gap",
"status": "exported",
"source": "browser runtime",
"detail": "浏览器截图、DOM 快照和交互验证结果尚未接入 evidence pack。"
"detail": "当前证据包已导出 1 条浏览器验证线索。"
},
{
"signal": "guiSmoke",
"status": "known_gap",
"status": "exported",
"source": "verify:gui-smoke",
"detail": "GUI smoke 结果尚未作为结构化证据回挂当前会话。"
"detail": "当前证据包已导出 GUI smoke 运行结果。"
}
],
"knownGaps": [
"当前 Lime 虽然已有全局 RequestLog / token / retry / duration 遥测,但 RequestLog 尚未携带 session/thread/turn 关联键,Evidence Pack 只能导出 request telemetry coverage gap,不能给出精确的会话级摘要。",
"当前 Evidence Pack 尚未纳入 ArtifactDocument validator outcome 与修复问题摘要。",
"当前 Evidence Pack 尚未纳入 GUI smoke / browser 验证结果。"
]
"verificationSummary": {
"artifactValidator": {
"applicable": true,
"recordCount": 1,
"issueCount": 1,
"repairedCount": 1,
"fallbackUsedCount": 0
},
"browserVerification": {
"recordCount": 1,
"successCount": 1,
"failureCount": 0,
"unknownCount": 0,
"latestUpdatedAt": "2026-03-27T11:22:00Z"
},
"guiSmoke": {
"status": "completed",
"exitCode": 0,
"passed": true,
"updatedAt": "2026-03-27T11:23:30Z",
"hasOutputPreview": true
}
},
"knownGaps": []
},
"recentArtifacts": [
"docs/tech/harness/implementation-blueprint.md",
".lime/artifacts/thread-1/report.artifact.json",
".lime/harness/sessions/fixture-session-minimal-pending-request/handoff/handoff.md"
]
}
@@ -15,7 +15,7 @@
],
"artifactChecks": [
"确认 `.lime/harness/sessions/fixture-session-minimal-pending-request/handoff/handoff.md` 仍与目标一致。",
"确认 evidence pack 中记录的 known gaps 没有被当作 PASS 证据。"
"确认 evidence pack 中导出的 verification 证据与 pending request 风险被正确解读。"
],
"nonGoals": [
"不要要求与原始会话完全相同的工具调用顺序。",
@@ -56,6 +56,7 @@
"activeSubagents": [],
"recentArtifacts": [
"docs/tech/harness/implementation-blueprint.md",
".lime/artifacts/thread-1/report.artifact.json",
".lime/harness/sessions/fixture-session-minimal-pending-request/handoff/handoff.md"
],
"recentTimeline": [
@@ -113,13 +114,25 @@
"failedToolCallCount": 0,
"failedCommandCount": 0,
"subagentCount": 0,
"recentArtifactCount": 2
"recentArtifactCount": 3
},
"latest": {
"warning": null,
"failedTool": null,
"failedCommand": null
},
"requestTelemetry": {
"source": "lime_infra.telemetry.request_logs",
"searchedRoots": [
"/workspace/lime/request_logs"
],
"matchedRequestCount": 0,
"latestRequestAt": null,
"statusCounts": {},
"providers": [],
"models": [],
"requests": []
},
"signalCoverage": [
{
"signal": "correlation",
@@ -141,34 +154,53 @@
},
{
"signal": "requestTelemetry",
"status": "unlinked",
"source": "lime_infra.telemetry",
"detail": "Lime 已有 workspace 级 request telemetry,但当前 RequestLog 还未携带 session/thread/turn 元数据。"
"status": "exported",
"source": "lime_infra.telemetry.request_logs",
"detail": "当前证据包已扫描 request telemetry 日志目录,但当前会话未匹配到 provider request 记录。"
},
{
"signal": "artifactValidator",
"status": "known_gap",
"status": "exported",
"source": "artifact_document_validator",
"detail": "Artifact validator outcome 尚未回挂到当前 evidence pack。"
"detail": "当前证据包已为 1 个 ArtifactDocument 产物导出 validator outcome。"
},
{
"signal": "browserVerification",
"status": "known_gap",
"status": "exported",
"source": "browser runtime",
"detail": "浏览器截图、DOM 快照和交互验证结果尚未接入 evidence pack。"
"detail": "当前证据包已导出 1 条浏览器验证线索。"
},
{
"signal": "guiSmoke",
"status": "known_gap",
"status": "exported",
"source": "verify:gui-smoke",
"detail": "GUI smoke 结果尚未作为结构化证据回挂当前会话。"
"detail": "当前证据包已导出 GUI smoke 运行结果。"
}
],
"knownGaps": [
"当前 Lime 虽然已有全局 RequestLog / token / retry / duration 遥测,但 RequestLog 尚未携带 session/thread/turn 关联键,Evidence Pack 只能导出 request telemetry coverage gap,不能给出精确的会话级摘要。",
"当前 Evidence Pack 尚未纳入 ArtifactDocument validator outcome 与修复问题摘要。",
"当前 Evidence Pack 尚未纳入 GUI smoke / browser 验证结果。"
]
"verificationSummary": {
"artifactValidator": {
"applicable": true,
"recordCount": 1,
"issueCount": 1,
"repairedCount": 1,
"fallbackUsedCount": 0
},
"browserVerification": {
"recordCount": 1,
"successCount": 1,
"failureCount": 0,
"unknownCount": 0,
"latestUpdatedAt": "2026-03-27T11:22:00Z"
},
"guiSmoke": {
"status": "completed",
"exitCode": 0,
"passed": true,
"updatedAt": "2026-03-27T11:23:30Z",
"hasOutputPreview": true
}
},
"knownGaps": []
},
"linkedArtifacts": {
"handoffBundle": {
@@ -178,11 +210,39 @@
"evidencePack": {
"relativeRoot": ".lime/harness/sessions/fixture-session-minimal-pending-request/evidence",
"artifactCount": 4,
"knownGaps": [
"当前 Lime 虽然已有全局 RequestLog / token / retry / duration 遥测,但 RequestLog 尚未携带 session/thread/turn 关联键,Evidence Pack 只能导出 request telemetry coverage gap,不能给出精确的会话级摘要。",
"当前 Evidence Pack 尚未纳入 ArtifactDocument validator outcome 与修复问题摘要。",
"当前 Evidence Pack 尚未纳入 GUI smoke / browser 验证结果。"
]
"verification": {
"artifactValidatorIssues": [
{
"path": ".lime/artifacts/thread-1/report.artifact.json",
"issues": [
"title 缺失或为空,已使用兜底标题。"
],
"repaired": true,
"fallbackUsed": false
}
],
"browserEvidence": [
{
"itemId": "browser-tool-fixture-001",
"turnId": "turn-fixture-001",
"toolName": "browser_snapshot",
"status": "completed",
"updatedAt": "2026-03-27T11:22:00Z"
}
],
"guiSmoke": {
"itemId": "gui-smoke-fixture-001",
"turnId": "turn-fixture-001",
"status": "completed",
"command": "npm run verify:gui-smoke",
"cwd": "/workspace/lime",
"exitCode": 0,
"error": null,
"updatedAt": "2026-03-27T11:23:30Z",
"outputPreview": "GUI smoke finished successfully"
}
},
"knownGaps": []
}
}
}