@minonl/dia 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +253 -2
  3. package/bin/dia.js +5 -0
  4. package/dist/cli.js +7408 -0
  5. package/docs/acp-integration.md +136 -0
  6. package/docs/architecture.md +166 -0
  7. package/docs/cli.md +117 -0
  8. package/docs/dependency-registry.md +105 -0
  9. package/docs/deps.jsonl +7 -0
  10. package/docs/ecosystem-integration.md +155 -0
  11. package/docs/ecosystem-positioning.md +95 -0
  12. package/docs/entrypoints.md +83 -0
  13. package/docs/evolution-process.md +298 -0
  14. package/docs/history/framework-bootstrap.md +109 -0
  15. package/docs/host-control-surface.md +213 -0
  16. package/docs/index.md +80 -0
  17. package/docs/kit-install.md +339 -0
  18. package/docs/migrations/kb-golden.md +32 -0
  19. package/docs/migrations/llm-migration.md +49 -0
  20. package/docs/migrations/no-python.md +52 -0
  21. package/docs/migrations/yan-agent-current.md +52 -0
  22. package/docs/migrations/yan-agent-next.md +168 -0
  23. package/docs/migrations/yan-kb-parity.md +159 -0
  24. package/docs/migrations/yan-kb.md +120 -0
  25. package/docs/model-baseline-sidecar.md +220 -0
  26. package/docs/model-behavior.md +229 -0
  27. package/docs/monorepo.md +83 -0
  28. package/docs/overview.md +126 -0
  29. package/docs/patching.md +91 -0
  30. package/docs/persona-install.md +264 -0
  31. package/docs/platforms/index.md +66 -0
  32. package/docs/platforms/registry.json +54 -0
  33. package/docs/pricing.md +43 -0
  34. package/docs/proposals.md +76 -0
  35. package/docs/research/benchmarks-survey.md +96 -0
  36. package/docs/research/collaboration-theory.md +85 -0
  37. package/docs/research/dsh-superagent.md +97 -0
  38. package/docs/research/frameworks-survey-2.md +75 -0
  39. package/docs/research/h0/report.md +135 -0
  40. package/docs/research/h0/sample.json +34 -0
  41. package/docs/research/model-boundary-patterns.md +99 -0
  42. package/docs/research/opencode-session-scoping.md +84 -0
  43. package/docs/review/reuse-review.md +105 -0
  44. package/docs/review/verification-2026-10-28.md +49 -0
  45. package/docs/security/audits/2026-11-04.json +44 -0
  46. package/docs/security/credentials.md +95 -0
  47. package/docs/security/public-release.md +108 -0
  48. package/docs/security-sandbox.md +157 -0
  49. package/docs/status.md +157 -0
  50. package/docs/team-automation.md +169 -0
  51. package/docs/team.md +112 -0
  52. package/docs/versioning.md +226 -0
  53. package/docs/vision.md +161 -0
  54. package/package.json +45 -4
  55. package/packages/job/README.md +98 -0
  56. package/packages/job/bin/dia-job +1283 -0
  57. package/packages/job/config.example +5 -0
  58. package/packages/job/install.sh +37 -0
  59. package/packages/job/lib/config.sh +18 -0
  60. package/packages/job/lib/json.mjs +130 -0
  61. package/packages/job/lib/policy.sh +103 -0
  62. package/packages/job/package.json +10 -0
  63. package/packages/job/shim/yan-task +24 -0
  64. package/packages/job/tests/bootstrap.test.sh +115 -0
  65. package/packages/job/tests/install.test.sh +30 -0
  66. package/packages/job/tests/linux.test.sh +130 -0
  67. package/packages/job/tests/p2.test.sh +46 -0
  68. package/packages/job/tests/policy.test.sh +38 -0
  69. package/packages/wt/bin/dia-wt +1148 -0
  70. package/packages/wt/tests/check.test.sh +126 -0
  71. package/packages/wt/tests/clean.test.sh +126 -0
  72. package/packages/wt/tests/prune-merged.test.sh +169 -0
  73. package/packages/wt/tests/route.test.sh +112 -0
  74. package/packages/wt/tests/scope.test.sh +69 -0
@@ -0,0 +1,264 @@
1
+ # Persona / Kit 安装:用 dia 从 git 地址装
2
+
3
+ > 日期 2026-10-28,**2026-11-02 复核**(实现状态以 `docs/cli.md §4.1` 为准)。命名已定:**persona = 可被选中的 agent 定义**,**kit = 知识/技能/工具内容**,**profile = 宿主运行环境(dsh)**。
4
+ > 安装入口统一为 `dia persona ...` / `dia kit ...`,不再使用 `pkg`。
5
+
6
+ ---
7
+
8
+ ## 1. 命令
9
+
10
+ ```bash
11
+ # 取回并注册(私有仓用现有 git 凭据)
12
+ dia persona add dabo --from git+https://github.com/minonl/dabo-agent.git --ref <sha>
13
+
14
+ # 已存在产物与源不一致(用户手改 / 旧版本安装)→ 覆盖;覆盖前备份到 <data>/backups/persona-<id>-<ts>/
15
+ dia persona add dabo --from <dir> --force
16
+
17
+ # 查看 / 校验 / 卸载
18
+ dia persona list
19
+ dia persona verify dabo
20
+ dia persona remove dabo
21
+
22
+ # 生效版本(多版本并存时指定跑哪一版;有审计)
23
+ dia persona show dabo # 生效版本 + 最近切换记录
24
+ dia persona use dabo@0.1.0 --reason "回滚"
25
+ dia persona path dabo # 生效版本目录(服务/脚本取代码用)
26
+
27
+ # 与上游对比 / 升级(从 lock 记录的 source+ref 重装)
28
+ dia persona check dabo # same/differs/unknown/local-only,exit 0/1/2/3
29
+ dia persona update dabo
30
+
31
+ # 宿主默认 agent(显式动作,不随安装自动做)
32
+ dia persona default dabo # 备份原文件 + 记原值;--unset 精确还原
33
+
34
+ # 作者轴
35
+ dia persona create mybot --dir ~/repos/mybot
36
+ dia persona render dabo --host opencode|dsh [--check]
37
+
38
+ # 内容包
39
+ dia kit add --from git+https://github.com/minonl/<kit>.git --ref <sha>
40
+ dia kit list / verify <id> / remove <id>
41
+
42
+ # 作用域(知识根 / 数据根 / 域命令)
43
+ dia --persona dabo kb query "…"
44
+ dia --persona dabo doctor
45
+ ```
46
+
47
+ **渲染目标**:
48
+
49
+ | 宿主 | 产物 | 是否改默认 |
50
+ |---|---|---|
51
+ | opencode | `~/.config/opencode/agents/dabo.md` | **否**(用户自己切) |
52
+ | dsh | `~/.dsh/profiles/dabo/`(独立 profile;webserver 端口动态,默认回退 1111) | **否**(`dsh --profile dabo`) |
53
+ | 记录 | `deps.jsonl` + `dia.lock` | — |
54
+
55
+ 原则:**只新增,不改 yan;默认 agent 必须显式 `persona default` 才动。**
56
+
57
+ ---
58
+
59
+ ## 2. 清单:`dia.json`(一个文件,`kind` 区分)
60
+
61
+ ```json
62
+ {
63
+ "schema": 1,
64
+ "kind": "persona",
65
+ "id": "dabo",
66
+ "name": "大波(dabo)",
67
+ "version": "0.1.0",
68
+ "hosts": ["opencode", "dsh"],
69
+ "entry": {
70
+ "opencode": "agents/dabo.md",
71
+ "dsh": "platform/dsh/dabo-persona"
72
+ },
73
+ "kits": ["core"],
74
+ "capabilities": {
75
+ "tools": ["bash", "git"],
76
+ "network": false,
77
+ "env": []
78
+ },
79
+ "requires": { "dia": ">=0.1.0" }
80
+ }
81
+ ```
82
+
83
+ kit 的完整格式、渲染规则与生命周期见 [`docs/kit-install.md`](kit-install.md)(本文只留最小形态)。
84
+
85
+ kit 用同一个文件名:
86
+
87
+ ```json
88
+ { "schema": 1, "kind": "kit", "id": "core", "version": "0.1.0", "skills": ["..."], "knowledge": ["docs/"] }
89
+ ```
90
+
91
+ **为什么不是 `dia.persona.json` / `dia.kit.json`**:两个文件名会让命令按名字猜类型、维护两套入口;`dia.json` + `kind` 更直接。
92
+ **为什么不是 `package.json`**:npm 语义(依赖/脚本/执行)与"安装不执行"冲突。
93
+
94
+ ---
95
+
96
+ ## 3. 安装管线
97
+
98
+ ```
99
+ git clone --depth 1 --ref <sha> → 临时目录
100
+ → 校验 dia.json(schema/kind/版本/宿主)
101
+ → 计算内容哈希 → 写 dia.lock
102
+ → 渲染:
103
+ opencode:复制 agents/dabo.md(当前原样复制;managed-by 头待实现)
104
+ dsh:复制 platform/dsh/dabo-persona + 生成独立 profile
105
+ → 登记 deps.jsonl(待实现)
106
+ → 不启停服务、不改默认
107
+ ```
108
+
109
+ **幂等**:同 commit 重装无变化;换 commit 先备份旧渲染产物,可 `remove` 回滚。
110
+
111
+ ### 3.1 update 与 render 的区别
112
+
113
+ | 命令 | 是否换内容 | 做什么 | 何时用 |
114
+ |---|---|---|---|
115
+ | **add** | 首次 | fetch → 校验 → render → lock | 第一次安装 |
116
+ | **update** | **是**(git ref → 新 commit) | 取新版本 → 校验 → 备份旧版 → render → lock | 升级人格/内容 |
117
+ | **render** | **否** | 用已安装版本重新生成宿主文件 | 宿主升级、配置改了、渲染文件被手改/丢失 |
118
+
119
+ 一句话:**update = 换内容 + render;render = 只重画,不换内容。**
120
+
121
+ `render --check` 只比对宿主文件与 lock,输出 drift,不写盘。
122
+
123
+ ### 3.2 能不能热更新进行中的会话?
124
+
125
+ **看宿主能力,不一刀切**(详见 `docs/versioning.md` §3):
126
+
127
+ | 能力 | 行为 |
128
+ |---|---|
129
+ | T3 原生增量(dsh `in-history` / opencode `agent.transform`) | 新增/移除可通知会话;可按 `--apply active` |
130
+ | T2 事件/预步 | 下一轮注入变更通知;破环性变更仍拒绝 |
131
+ | T1 工具边界 | 下次调用感知(如 MCP 登录) |
132
+ | T0 无钩子 | 只能下次会话 |
133
+
134
+ **硬规则**:破环性变更(移除工具、签名变化、换 persona 身份)**永远不静默热切**;`--activate-now` 需 `--i-am-human` 且在 T0/T1 下要求 0 活跃会话。`render` 只改文件,不触碰会话。
135
+
136
+ 体验示意:
137
+
138
+ ```
139
+ $ dia persona update dabo --ref <sha>
140
+ staged dabo@v2 (commit abc123)
141
+ 3 active sessions still on v1; new sessions will use v2
142
+ apply now: dia persona update --activate-now --i-am-human (0 active required)
143
+ ```
144
+
145
+ ---
146
+
147
+ ## 4. 安全规则
148
+
149
+ 1. 来源白名单(git host + owner),防误装。
150
+ 2. `--ref` 解析后把 **commit sha** 写进 lock。
151
+ 3. 逐字节 sha256 只覆盖 **dia 写入且宿主不改写** 的产物(persona 内容、opencode agent md、软链);
152
+ **宿主自管目录**(dsh profile)只校验「目录在 + `.dia-managed` 归属」,不比字节——dsh 启动会重写
153
+ `cordis.yml`、装插件会改 `package.json`。`verify` 失败时用 `issues` 逐条列出原因。
154
+ 4. **不执行安装脚本**;dsh 插件也不在安装期执行。
155
+ 5. `capabilities` 未声明的工具不授予;网络默认关。
156
+ 6. `--dry-run` 显示将写入的文件与差异。
157
+ 7. 卸载只删带 `.dia-managed`(id 匹配)的产物;用户手改/归属不符的目录拒绝删除并提示。
158
+
159
+ ---
160
+
161
+ ## 5. 配置失败/降级体验
162
+
163
+ | 情况 | 用户看到 | 行为 |
164
+ |---|---|---|
165
+ | git 不可达/鉴权失败 | `E_AUTH` + 修复提示 | 不写入任何文件 |
166
+ | 清单缺失/版本不符 | `E_MANIFEST` | 不安装 |
167
+ | 哈希不符 | `E_HASH`(按篡改处理) | 隔离,不覆盖 |
168
+ | 目标 agent 冲突 | `E_CONFLICT`(exit 32) | 不覆盖;先 remove 或手改 |
169
+ | 宿主未安装 | `W_HOST_MISSING` | 只装另一个宿主,记录 degraded |
170
+ | 默认 agent 被改 | — | **禁止**:安装器不写 default 字段 |
171
+
172
+ ---
173
+
174
+ ## 5.1 已实测(2026-10-29)
175
+
176
+ - `dia persona add --from ~/repos/github/dabo-agent` → 同时渲染 opencode agent + dsh profile;
177
+ - `opencode debug agents` 出现 `dabo`,**默认仍是 `yan`**;
178
+ - `dsh --profile dabo` 启动正常(当时 webserver 3090,避开 3080;2026-11 起 dabo-agent 改为动态端口,默认回退 1111);
179
+ - yan 的 agent/profile 未改动。
180
+
181
+ > 2026-11-01 补:`dia persona create` / `dia persona render` 已实现(此前只有文档)。
182
+ > create 生成骨架时**已内置必填 config**(`tool-fs-search.sampleOverCapGlobResults`),
183
+ > render 修产物时先备份到 `<data>/backups/render-<ts>/`;`--check` 只报 drift 不写盘。
184
+ > 2026-11-03 补:dsh profile 是宿主领地——宿主会改 `cordis.yml` / `package.json` / 锁文件,
185
+ > 这些文件**不参与 drift 比对、re-render 也不覆盖**;render 只写入 persona 自己的产物,
186
+ > **不再整树重建 profile**(宿主装的插件目录不会被删)。
187
+
188
+ ## 5.2 opencode 配置:`.json` 与 `.jsonc`(2026-11-01)
189
+
190
+ opencode 从 **v0.3.100(2025-07-31,PR #1434)** 起支持 `opencode.jsonc`;
191
+ 从 **v1.14.49(2026-05-13,PR #26992)** 起,没有配置时默认创建 `opencode.jsonc`。
192
+ 宿主的查找顺序是 `["opencode.json", "opencode.jsonc"]`(两者都存在时先读 `.json`)。
193
+
194
+ 因此 `dia persona show|default` 的配置解析规则:
195
+
196
+ | 优先级 | 来源 |
197
+ |---|---|
198
+ | 1 | `DIA_OPENCODE_CONFIG`(显式路径) |
199
+ | 2 | `~/.config/opencode/opencode.json`(存在即用) |
200
+ | 3 | `~/.config/opencode/opencode.jsonc`(存在即用) |
201
+ | 4 | 都不存在 → 用默认路径 `opencode.json`(`show` 返回「未设置」,`default` 报 `E_CONFIG`) |
202
+
203
+ 两张表都读得懂:读 = JSONC(注释 + 尾逗号);写 = **只改 `default_agent` 一个键,保留注释与排版**(写回前重新解析校验,坏配置不落盘)。
204
+
205
+ ## 5.3 校验边界:dia 只管自己写的字节(2026-11-01 反思)
206
+
207
+ **事故**:`dia doctor` 对 dsh profile 目录做整树哈希,而 dsh 首次启动就把 `cordis.yml` 重写成自己的
208
+ header 形态(文件头写着 “Edit cordis.patch.yml, not this file”)→ verify 假红,且提示把原因写成
209
+ 「期望 d07d454c 实得 d07d454c」(内容哈希其实一致,真正 drift 的是宿主目录)。
210
+
211
+ **结论(越界反思)**:安装器的校验职责边界是 **「自己写入的、宿主不改写的产物」**。
212
+
213
+ | 对象 | 校验方式 | 理由 |
214
+ |---|---|---|
215
+ | persona 内容树 / 复制的 agent md / 软链 | 逐字节 sha256 | 只有 dia 会写,改动 = 真篡改 |
216
+ | 宿主 profile 目录(dsh) | 存在性 + `.dia-managed` 归属 | 宿主自己会重写 `cordis.yml`、改 `package.json` |
217
+ | 默认 agent | 只读、只报告 | dia 契约是「不改默认」,指向别处不算不健康 |
218
+
219
+ `verify` 现在返回 `issues: string[]`(逐条可读),doctor 直接显示第一条;`remove` 也改为按归属标记判断,
220
+ 不再因为宿主改写过就拒绝卸载(否则卸载会留残)。
221
+
222
+
223
+ ## 5.4 persona 自带命令与知识根(2026-11-01)
224
+
225
+ persona 可以在 `dia.json` 里声明(不必单独做一个 kit):
226
+
227
+ ```json
228
+ {
229
+ "knowledge": ["core/knowledge"],
230
+ "data_root": "~/.dabo-agent",
231
+ "commands": [
232
+ { "name": "todo", "entry": "scripts/dabo-task", "runtime": "bash",
233
+ "env": { "DABO_ROOT": "~/.dabo-agent" } }
234
+ ]
235
+ }
236
+ ```
237
+
238
+ 调用与语义:
239
+
240
+ ```bash
241
+ dia --persona dabo kb search "台账" # 知识根 = persona 的 core/knowledge(自动索引到 cache)
242
+ dia --persona dabo todo list # 委派到 scripts/dabo-task;退出码原样透传
243
+ ```
244
+
245
+ | 项 | 语义 |
246
+ |---|---|
247
+ | `knowledge` | 相对 persona 根;`kb` 命令默认用第一个作为根(`DIA_KB_ROOT`) |
248
+ | `data_root` | 子进程注入 `DIA_DATA_ROOT_SCOPE` / `DIA_DATA_ROOT`(`YAN_DATA_ROOT` 仅保留给既有 yan 配方) |
249
+ | `commands[].runtime` | `bun` / `node`:argv 为 `[entry, <命令名>, ...args]`;`bash`:argv 为 `[entry, ...args]`(**不注入命令名**,脚本自己解析子命令) |
250
+ | `commands[].env` | 注入到子进程(值支持 `~` 展开) |
251
+ | 命名冲突 | 内置命令优先(`dia task` 是内置,persona 里请用 `todo` 这类不冲突的名字) |
252
+ | 隔离 | 命令入口必须在 persona 根内(绝对路径 / `../` 穿越 → `E_DELEGATE_SCOPE`);若 `env` 写死数据根(如 dabo 的 `DABO_ROOT`),会绕过 `DIA_DATA_DIR` 的测试隔离 |
253
+
254
+ ## 6. 当前缺口
255
+
256
+ 1. dabo-agent 没有 `dia.json`、`agents/dabo.md`、dsh persona bundle。
257
+ 2. dia 没有 `persona` / `kit` 命令。
258
+ 3. 没有 lock/verify 实现。
259
+
260
+ ## 7. 第一刀
261
+
262
+ 1. dabo-agent 加 `dia.json` + opencode agent + dsh bundle(纯文本,可审);
263
+ 2. dia 实现 `persona add/update/remove/verify/list`(先 git + 两宿主);
264
+ 3. 临时 HOME E2E:装完 `dabo` 可选中、yan 与默认不变、卸载无残留。
@@ -0,0 +1,66 @@
1
+ # AI 工具平台经验库(规则与用法)
2
+
3
+ > **单一事实源 = [`registry.json`](registry.json)**:平台支持范围、实测版本、已知坑全部只在 JSON 里。
4
+ > 本文件**不重复**那些数据,只写规则与用法;人读视图由 `dia doctor` 派生。
5
+ >
6
+ > 本目录记录的是 **AI 工具平台**(opencode / dsh / codex / pi / mimocode / zed …),不是设备。
7
+
8
+ ---
9
+
10
+ ## 0. 脱敏规则(写之前先看)
11
+
12
+ | 可以入仓(公开级) | 不入公共仓(私人仓/数据根) |
13
+ |---|---|
14
+ | 软件名、公开版本号、公开配置键、公开 issue/文档链接 | 内网域名 / IP、账号、凭据、token |
15
+ | 通用路径(`~/.config/...`、`~/.dsh/profiles/...`) | 家庭设备、个人设备清单、组织机构内部标识 |
16
+ | **公开的 hostname**(公开示例 / demo 环境) | **家庭 / 内网 hostname**、任何能反查到个人或组织的组合信息 |
17
+ | 复现命令(用占位符 `<host>` / `<org>` / `<id>`) | 需要脱敏才能写的事实(拿不准就按私人仓处理) |
18
+
19
+ 判据:提交前 `git grep -nE "<内网域名>|<hostname>|<账号>"` 必须为空;拿不准就按"私人仓"处理。
20
+
21
+ ---
22
+
23
+ ## 1. 规则
24
+
25
+ 1. **一条经验 = 版本范围 + 复现命令 + 判据**;没有复现命令的写「未验证」。
26
+ 2. 数据只改 `registry.json`;不要在 md / README / 知识库里再抄一份(同步必然漂)。
27
+ 3. `range` 只写简单约束(`>=2.0.0 <3.0.0`);垫脚石版本先写进 `tested[]`。
28
+ 4. `supported: false` 的平台只做记录,不参与探测判定。
29
+
30
+ ---
31
+
32
+ ## 2. 怎么改
33
+
34
+ ```bash
35
+ # 1) 只改数据源
36
+ $EDITOR docs/platforms/registry.json
37
+ # 2) 校验 JSON + 单测
38
+ bun test tests/platforms.test.ts
39
+ # 3) 看派生视图(本机探测 + 范围判定)
40
+ dia doctor # 人读
41
+ dia doctor --json # 机器读
42
+ ```
43
+
44
+ 新增一个平台:在 `platforms` 下加一项,字段见下;先 `supported: false`,等 `dia persona render --host` 真的支持了再翻 true。
45
+
46
+ | 字段 | 含义 |
47
+ |---|---|
48
+ | `supported` | dia 是否已支持渲染到该平台 |
49
+ | `render` | 渲染目标路径(未支持时 `null`) |
50
+ | `probe` | 探测命令参数(默认 `--version`) |
51
+ | `range` | 支持范围(简单约束;`null` = 不判) |
52
+ | `tested` | 实测过的版本(用来垫脚,不参与判定) |
53
+ | `notes` | 已知坑(一行一条,能复现的写命令) |
54
+
55
+ ---
56
+
57
+ ## 3. 派生视图
58
+
59
+ `dia doctor` 每次按注册表探测本机平台,输出 `platform:<name>`:
60
+
61
+ - 装了且在范围内 → `ok`
62
+ - 没装 → `warn`(渲染不需要宿主,运行才需要;不判红)
63
+ - 版本超出 `range` → `warn`(附支持范围)
64
+
65
+ 安装版从 `~/.local/share/dia/registry/platforms.json` 读(`install.sh` 分发);开发态回退到仓库 `docs/platforms/registry.json`;
66
+ 也可用 `DIA_PLATFORMS_FILE` 显式指定。
@@ -0,0 +1,54 @@
1
+ {
2
+ "schema": 1,
3
+ "updated": "2026-11-03",
4
+ "note": "单一事实源:平台支持范围、实测版本、已知坑。人读视图由 dia doctor 派生,不要手抄进 md。",
5
+ "platforms": {
6
+ "opencode": {
7
+ "supported": true,
8
+ "render": "~/.config/opencode/agents/<id>.md",
9
+ "probe": ["--version"],
10
+ "range": ">=2.0.0 <3.0.0",
11
+ "tested": ["2.2.5"],
12
+ "notes": [
13
+ "V1 → V2 断代:V1 实现不在 V2 运行,配置键与 hook API 全变",
14
+ "配置文件 opencode.json / opencode.jsonc 二选一;两者都在时宿主先读 .json"
15
+ ]
16
+ },
17
+ "dsh": {
18
+ "supported": true,
19
+ "render": "~/.dsh/profiles/<id>/",
20
+ "probe": ["--version"],
21
+ "range": ">=0.2.0 <0.3.0",
22
+ "tested": ["0.2.1-rc.2"],
23
+ "notes": [
24
+ "preset 里 patch 覆写 preset 会让全部 agent 掉工具,需冷启动",
25
+ "cordis.yml 由宿主运行时重写;改动写 cordis.patch.yml",
26
+ "覆盖插件 config 是整体替换,必填项要一起写"
27
+ ]
28
+ },
29
+ "codex": {
30
+ "supported": false,
31
+ "render": null,
32
+ "probe": ["--version"],
33
+ "range": null,
34
+ "tested": [],
35
+ "notes": ["只有配置注入实践(~/.codex/config.toml),未纳入 dia 渲染"]
36
+ },
37
+ "mimocode": {
38
+ "supported": false,
39
+ "render": null,
40
+ "probe": ["--version"],
41
+ "range": null,
42
+ "tested": [],
43
+ "notes": ["只有配置注入实践,未纳入 dia 渲染"]
44
+ },
45
+ "zed": {
46
+ "supported": false,
47
+ "render": null,
48
+ "probe": ["--version"],
49
+ "range": null,
50
+ "tested": [],
51
+ "notes": ["只有配置注入实践(language_models.openai_compatible),未纳入 dia 渲染"]
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,43 @@
1
+ # 价目表(tokens → 金额)
2
+
3
+ > 日期 2026-10-29。原则:**没有价格就不编造**;`unpriced` 明确记录,预算按 tokens 兜底。
4
+
5
+ ---
6
+
7
+ ## 1. 数据来源
8
+
9
+ - `deepseek/*`:从模型目录取得真实单价(2026-10-29):
10
+ - `deepseek/deepseek-flash`:$0.15 / $0.60 / cache $0.003 per Mtok
11
+ - `deepseek/deepseek-v4-pro`:$0.66 / $1.98 / cache $0.022 per Mtok
12
+ - `example/*`:**按免费(0)计**(用户 2026-10-29 定);单价在 `prices.json` 里是 `0/0`,不是 unpriced。
13
+
14
+ ## 2. 配置
15
+
16
+ `~/.config/dia/prices.json`(可覆盖默认;`DIA_PRICES_FILE` 可改路径):
17
+
18
+ ```json
19
+ {
20
+ "example/deepseek-v4.1-flash": { "input": 0.2, "output": 0.8 },
21
+ "vendor/model": null
22
+ }
23
+ ```
24
+
25
+ - 未列出的模型 = unpriced,不估算。
26
+ - 价格单位:USD / 百万 tokens。
27
+
28
+ ## 3. 记录
29
+
30
+ `runtime/model-calls.jsonl` 每行含:`model / input_tokens / output_tokens / total_tokens / cost_usd / priced`。
31
+ dsh 的 tokens 从 `~/.dsh/sessions/.../session.v4.jsonl.zstd` 的 `assistant/message.data.usage` 增量读取。
32
+ 每任务 `usage.json` 汇总 `cost_usd` 与 `unpriced_calls`。
33
+
34
+ ## 4. 预算
35
+
36
+ - 已知价格:按 `cost_usd` 累计。
37
+ - 未知价格:按 tokens 设上限(例如每任务 ≤200k tokens),并在验收包标注 `unpriced`。
38
+ - 月度封顶 $50(既有约定),超限降级/升级。
39
+
40
+ ## 5. 局限
41
+
42
+ - 缓存计价只按 `cacheReadTokens` 粗略计算;provider 的缓存写/读折扣可能不同。
43
+ - 价格会变;以 `prices.json` 的 `updated_at`(建议手动记录)为准。
@@ -0,0 +1,76 @@
1
+ # 目标提案(team next)
2
+
3
+ > 日期 2026-10-29。定位:**团队可以提候选,不能定目标。**
4
+ > **状态(2026-11-03)**:v0 **已实现** —— `dia team next`(纯规则打分,不调模型)。
5
+ > 人只在两处介入:选目标(本命令的产出)与验收(team accept)。
6
+
7
+ ---
8
+
9
+ ## 1. 能力
10
+
11
+ `dia team next` 扫描已有信号,输出 **≤3 个候选目标**:
12
+
13
+ - 每个候选带:`why / evidence[] / 预计成本 / 风险 / 来源信号`
14
+ - **不创建任务、不改状态**;人选完后用 `dia task add` 立项。
15
+ - 纯规则打分(v0),不调用模型;模型只能后续用于措辞/归因,不参与决定。
16
+
17
+ ---
18
+
19
+ ## 2. 信号源(v0)
20
+
21
+ | 信号 | 来源 | 触发 |
22
+ |---|---|---|
23
+ | 升级任务 | `tasks/ledger.jsonl` 状态 `escalated` | 每个 escalated 任务一条候选 |
24
+ | 验证失败 | `runs/<id>/verify.json` conclusion ≠ 通过 | 反复失败优先 |
25
+ | 对抗高危 | `runs/<id>/redteam.json` findings.severity=high | 每条高危一条候选 |
26
+ | 依赖未验证 | `docs/deps.jsonl` 的 `result: unknown` / `support: unknown` | 复核依赖 |
27
+ | 待验证假设 | `docs/hypotheses.md` 表格中的 `待验证`(按 `H1 / H2–H5` 展开为单条,并映射标题) | 低成本实验优先 |
28
+
29
+ **不采集**:会话原文、凭据、用户消息内容;只用 id/计数/结论。
30
+
31
+ ---
32
+
33
+ ## 3. 打分(v0)
34
+
35
+ ```
36
+ score = severity_weight × 2
37
+ + min(evidence_count, 3)
38
+ - cost_penalty(low 0 / medium 1 / high 2)
39
+ ```
40
+
41
+ - severity:high=3 / medium=2 / low=1;
42
+ - 同分按“最近出现”排序;
43
+ - 只输出前 N(默认 3)。
44
+
45
+ ---
46
+
47
+ ## 4. 数据契约(为后续能力准备)
48
+
49
+ 每条候选:
50
+
51
+ ```json
52
+ {
53
+ "id": "p-...",
54
+ "title": "...",
55
+ "why": "...",
56
+ "evidence": ["..."],
57
+ "source": "task|verify|redteam|deps|hypothesis",
58
+ "severity": "high|medium|low",
59
+ "cost": "low|medium|high",
60
+ "score": 7
61
+ }
62
+ ```
63
+
64
+ 后续要补的采集(v1):
65
+ - escalated 的**归因分类**(判据缺失 / 环境 / 预算 / 模型能力);
66
+ - 失败率的滑动窗口(不是单次);
67
+ - 成本 p50/p95;
68
+ - redteam findings 的处置状态(fixed/waived/open)。
69
+
70
+ ---
71
+
72
+ ## 5. 边界
73
+
74
+ - **不是**自动路线图:没有 backlog、没有优先级共识、没有资源日历;
75
+ - **不替代人**:目标涉及价值与取舍,agent 无法承担;
76
+ - **数据不足时**:宁可少提,不编造;候选必须带证据。
@@ -0,0 +1,96 @@
1
+ # 开源评测与基准:可用清单(2026-10)
2
+
3
+ > 日期 2026-10-28。回答:哪些开源项目的**真实任务**能直接用;哪些只能做首次 baseline(已污染);私有 canary 怎么建。
4
+ > 判据:E=精确匹配,U=单测/脚本,J=LLM 评审,H=人工;依赖:D=Docker,B=浏览器,V=VM/GPU,W=联网。
5
+
6
+ ---
7
+
8
+ ## A. 清单(★/更新为 2026-10-28)
9
+
10
+ | 项目 | ★ | 许可 | 任务/子集 | 判 | 依赖 | 单次成本 | 证 |
11
+ |---|---|---|---|---|---|---|---|
12
+ | lm-evaluation-harness | 14.3k | MIT | 数百 task | E | – | $0–1 | A |
13
+ | HELM | 3.0k | Apache-2.0 | 40+ scenario | E/J | V | $5–50 | A |
14
+ | OpenAI Evals | 19.7k | 混合 | ~200 | E/J | – | $1–20 | A |
15
+ | Inspect AI | 3.1k | MIT | 131 包/~200 eval | E/J/U | 可选 D | $1–30 | A |
16
+ | promptfoo | 26.5k | MIT | 自带断言 | 自定义 | – | <$1 | A |
17
+ | DeepEval | 19.1k | Apache-2.0 | 指标库 | J | – | $1–10 | A |
18
+ | **SWE-bench** | 6.1k | MIT | 2294 / Verified 500 / Lite 300 | U | D | $0.5–5/题 | A |
19
+ | **Terminal-Bench 2.0** | 432 | Apache-2.0 | 89 题(2.1=91) | U | D | $0.3–3/题 | A |
20
+ | Aider polyglot | 49.8k | Apache-2.0 | 225 / 6 语言 | U | – | $2–10/轮 | A |
21
+ | RepoBench v1.1 | 215 | CC-BY-4.0 | Py/Java 补全 | E | – | <$1 | A |
22
+ | LiveCodeBench | 970 | MIT | 400 + 按月滚动 | U | 沙箱 | <$1/题 | A |
23
+ | **BFCL v4** | 13.1k | Apache-2.0 | 20 类目,100–800/类 | E(AST/执行) | 部分 W | $0.01–0.1/例 | A |
24
+ | **τ²/τ³(tau-bench)** | 1.5k | MIT | airline 50 / retail 114 / telecom 2285 | U(DB 终态)+J | – | $1–5/题 | A |
25
+ | AgentBench | 3.8k | Apache-2.0 | 8 环境 | U/J | D+B | 高 | A |
26
+ | GAIA | HF gated | 见卡 | 466(val 165) | E | W | $0.2–2/题 | A |
27
+ | WebArena | 1.6k | Apache-2.0 | 812 | U+J | D+B | 高 | A |
28
+ | OSWorld | 3.2k | Apache-2.0 | 369(small 子集) | U+J | V+B | 很高 | A |
29
+ | AssistantBench | 72 | 见仓 | 214 | E/F1+J | W | $0.1–1/题 | A |
30
+ | MLE-bench | 1.8k | NOASSERTION | 75 | U(奖牌线) | V+GPU | 极高 | A |
31
+
32
+ ---
33
+
34
+ ## B. 首次 baseline:最合适的 3 个
35
+
36
+ | 用途 | 集 | 规模 | 成本 | 为什么 |
37
+ |---|---|---|---|---|
38
+ | 工具调用 sanity | **BFCL simple/multiple** | 各 100 | ~$2 | 10 分钟内跑完,错误可定位 |
39
+ | 步数/上下文 | **τ² retail+airline** | 取 30 | ~$15 | 多轮工具 + DB 终态比对,直接给出 max_steps/context 初值 |
40
+ | 真实交付 | **Terminal-Bench 2.0** | 取 10–20 | ~$10 | 唯一同时压出步数/上下文/错误恢复 |
41
+
42
+ ---
43
+
44
+ ## C. 事故 canary:最合适的 3 个
45
+
46
+ 1. **LiveCodeBench 滚动窗口**:按发布日期取近 6 个月新题,训练集物理上不含;单测判分。
47
+ 2. **Terminal-Bench 2.1 固定子集**:与 2.0 不重叠,版本间可比。
48
+ 3. **私有 canary(自建)**:从自己仓库近 90 天 merged PR 挖题,**永不公开、不写进 prompt/日志**。
49
+
50
+ ---
51
+
52
+ ## D. 污染与过拟合(必须写在文档里)
53
+
54
+ | 状态 | 基准 |
55
+ |---|---|
56
+ | **已高度污染**(不建议做长期监控) | SWE-bench、Aider polyglot、BFCL、tau-bench、GAIA |
57
+ | **低污染** | LiveCodeBench(按日期切)、Terminal-Bench 2.x(新题)、自己的 PR |
58
+
59
+ 规避:
60
+ 1. 按时间切 held-out(只跑 cutoff 之后的题);
61
+ 2. 判据不放题面(隐藏测试);
62
+ 3. 每季度轮换 30%;
63
+ 4. 同模型跑 3 次;方差 > 分差则结论无效。
64
+
65
+ ---
66
+
67
+ ## E. 组合方案(已定:BFCL + τ²,$50/月封顶)
68
+
69
+ | 阶段 | 内容 | 成本 |
70
+ |---|---|---|
71
+ | 冷启动一次 | BFCL 50 例 + τ² 10 题 + 私有 8 题 | **≈$15–17** |
72
+ | 月度 canary | 私有 10 题 + (可选)LiveCodeBench 新月题 5 | **≈$10–20/月** |
73
+ | 事故加跑 | `dia model incident` 立即跑私有 10 题 | ≈$2–5/次 |
74
+ | **月度总封顶** | 基准 + canary + 事故合计 | **$50**(超限降级为 3 题抽样) |
75
+
76
+ **私有题源(已定:PR + episode 结合)**:
77
+ - **PR 类**:近 90 天 merged PR → 问题描述 + 隐藏测试(代码/终端任务);
78
+ - **episode 类**:从已有 257 条会话抽自包含任务(问答/结构化/工具调用);
79
+ - 两类都脱敏、判据脚本化、冻结入库;季度轮换 30%。
80
+
81
+ **私有题池流水线**:
82
+ ```
83
+ git log --since=90d --merges → 取「问题描述 + 隐藏测试」→ 脱敏 → 人工过一遍 → 冻结入库
84
+ 每季度复审,半年淘汰 30%
85
+ ```
86
+
87
+ 这是唯一不随公开榜单饱和而失效的部分。
88
+
89
+ ---
90
+
91
+ ## F. 对我们实现的含义
92
+
93
+ 1. **不重写 benchmark harness**:TB2/τ²/BFCL 各用自己的 runner;dia 只**导入结果 JSON** 进 `baselines/`。
94
+ 2. **canary 只用私有**(公开题只做首次画像);私有题从 episode/PR 生成,判据脚本化。
95
+ 3. **成本护栏**:canary 单次预算上限;超限降级为 3 题抽样。
96
+ 4. **可重复性**:记录模型版本、题集 hash、判据版本、运行时间;缺一项视为"无法判定"。