ygl-trees 0.79.1 → 0.81.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.81.0(2026-10-17)命令面五处修正 + task 挂树 + 事件流对账
4
+ - **doctor write_integrity 误报修复**(用户上报①:合法 `kb remove` 后 doctor 报 phantom write fail):`kb rm` 现在落 `kb.rm` 事件(与 source/evidence 对齐);check 10 的幽灵扫描加 `NOT EXISTS rm 事件` 豁免,且整体降级 fail→warn——无 rm 事件的缺行可能是 0.81 前的合法删除或 db sql 手工清理,不值得炸掉脚本门禁
5
+ - **`--url` 收任意 scheme**(上报②:a2a:// 被拒,跨 Agent 引用被迫落盘):正则放宽为 RFC-3986 `<scheme>://`,https/file/session/a2a/… 均可;url_hash 去重照常兜底
6
+ - **`node list` 未知旗标点名 rc=2**(上报③:`node list --tree X` 静默吞 flag 列出当前树——冻结契约⑤违约):允许集 {t, json, no-color},其余旗标点名拒绝并指路 `-t <tree>`
7
+ - **`node cond add|rm` 动作词**(上报④:`cond add p0` 被解析成 key="add" 报 node not found):add/rm/remove 动作词前置,与 link/unlock 风格一致;**新增 `node cond rm <key> --name <n>`**(此前只能 db sql 手工清理)——事务删除 + `node.cond-rm` 事件 + 缺失时点名并列出该节点剩余条件名
8
+ - **rel 节点引用的错误指引**(上报⑤:裸 `node:<key>` 在 current_tree 未设时报泛型 not found):无当前树 →「qualify as node:<tree>/<key> 或先 tree use」;有当前树但未命中 → 附「searched current tree 'X'」
9
+ - **`claim add --confidence` 数值档**(建议⑥):A|B|C 之外收 0-1 小数与 0-100(%)(0.92 / 85% 原样入库,列仍 TEXT);nonsense 仍 rc=2
10
+ - **`task add --node <tree>/<key>`**(建议⑦:task 与 rel 织物脱节):建任务同时挂 `tracked-by` 关系;`task:<id|title>` 成为第九类引用类型(REL_TYPES 8→9)
11
+ - **`db timeline --actor <a> --session <s>`**(建议⑧:多 Agent 并发对账):按 events.actor / payload.session 过滤增长视图,过滤时附最近 20 条原始事件尾
12
+ - 测试:`condrm.spec.ts` 3 例(自然键删除+事件 / 点名+剩余条件 / node not found)、`rels.test.ts` +1(task 引用解析)→ 单测 172;demo 5h 段 12 断言(含 doctor warn 降级、a2a://、confidence 三态、task --node、timeline actor、无树指路)→ 94;README 修复 db 命令表被 PG 段落吞并的排版缺陷 + `db timeline --actor` 文档
13
+
14
+ ## 0.80.0(2026-10-17)rel 织物并入 eval 上下文 + 会话内裁决载体
15
+ - **eval 上下文包并入 rel 挂接摘要**(用户实测发现:裁决已 `decided-by` 挂链,P 仍 0.30,必须 `--state k=v` 手动携带事实才 0.92):`evalContext` 新增 `attachments`——节点挂接的 relations 双向查询(≤12 条),claim 摘录 text+status+confidence、evidence 摘录 quote(截 120 字)、kb/source 标题、node key+name、其余 id-only;无挂接时字段缺省(与旧形状逐字节兼容)
16
+ - **`research source add --adjudication "<裁决摘要>"`**:会话内裁决原生载体——url 自动 `session://adjudication/<yyyymmddhhmm>`,摘要兼作缺省标题;`--url` 校验放宽收 `session://`;裸 `--adjudication` 旗标缺值 rc=2
17
+ - 测试:`packages/techtree/model/tests/evalctx.spec.ts` 5 例(无挂接兼容 / decided-by 摘要 / 反向 evidenced-by / 截断与悬空退化 / 12 条上限);`scripts/readme-verify.sh` +1(--adjudication rc=0)
18
+
3
19
  ## 0.79.1(2026-10-17)锁身份 + serve --help 短路 + 批量判定 + 回测状态桥
4
20
  - **异常①锁归属**:`.ygllock` 记录持有者命令行;撞锁报错、`db unlock`(含 `holder_cmd` JSON 字段)、`doctor` 三处回显真实持有者身份——CLI 撞 CLI 不再被误标为 serve(serve 从不取写锁,报错明示这一点)
5
21
  - **异常②**:`webui serve --help` 短路打印用法即退出,不再直接启动服务(随机端口误触发实证)
package/README.md CHANGED
@@ -60,9 +60,10 @@ node dist/bundle/bin.cjs db init # 发布产物(bin 字段指向它;比
60
60
 
61
61
  ```bash
62
62
  ygl-trees node add steel # 先有节点
63
- ygl-trees node cond steel --name research_lab_level --kind level --value 3 # 必检
64
- ygl-trees node cond steel --name has_engineer --kind flag --op has \
65
- --optional --effect cost_mul --weight 0.8 # 可选,打八折
63
+ ygl-trees node cond add steel --name research_lab_level --kind level --value 3 # 必检
64
+ ygl-trees node cond add steel --name has_engineer --kind flag --op has \
65
+ --optional --effect cost_mul --weight 0.8 # 可选,打八折
66
+ ygl-trees node cond rm steel --name research_lab_level # 按自然键删除
66
67
  ```
67
68
 
68
69
  ### 索引:查询不再递归
@@ -103,7 +104,9 @@ ygl-trees node import --file tree.json --tree copy # 严格校验、事务导
103
104
 
104
105
  **批量判定 + `--state-file`(0.79.1)**:`node can k1 k2 k3` 一次进程判定多节点(多键自动进批模式,`--json` 返回数组);`--state-file <json>` 喂状态袋,两种形状——**扁平计数** `{"y_imported": 40}` 全节点共享,或**按节点** `{"a": {"y_imported": 40}, "b": {...}}` 各取各袋。探针脚本从此每树起一次进程而非每节点。
105
106
 
106
- **决策模型评估门(spec R8;0.14 布尔 → 0.26 三题型 → 0.27 混批)**:语义型必检条件用 eval 题型声明,`node can <key> --eval` 会把**节点元数据 + 直接父(关联)+ 祖先链(闭包索引)+ 条件组 + 已解锁集 + --state 袋**组装为上下文包,交给评估模型(TypeSafe jev,经 Vercel AI Gateway)判定:
107
+ **决策模型评估门(spec R8;0.14 布尔 → 0.26 三题型 → 0.27 混批 → 0.80 织物并入)**:语义型必检条件用 eval 题型声明,`node can <key> --eval` 会把**节点元数据 + 直接父(关联)+ 祖先链(闭包索引)+ 条件组 + 已解锁集 + --state 袋 + rel 挂接摘要**组装为上下文包,交给评估模型(TypeSafe jev,经 Vercel AI Gateway)判定:
108
+
109
+ - **rel 织物并入(0.80)**:节点挂接的 evidence(quote 摘要)/ claim(text+status+confidence)/ kb/source(标题)等 rel 关系(双向,≤12 条,文本截 120 字)自动进上下文包的 `attachments`——「证据挂链」纪律从此对语义门槛可见,不必再 `--state k=v` 手动携带裁决事实(实测 P 0.30 → 0.92 的差距由挂链补平)
107
110
 
108
111
  - **三题型**:`--op eval`(布尔 P(true))/ `--op eval-choice`(多选一,判 **P(期望答案)**,`--options "k=desc,..."` + `--answer k`)/ `--op eval-score`(等级评分 `--levels "级0,..."` 2-10 级 + `--min-score n`,判概率加权均值 ±1 灰带)
109
112
  - P≥0.7 通过 · P≤0.4 未通过 · **灰带 pending**(过程态,禁作终态,单列不阻塞也不放行);score 的灰带是 [min−1, min)
@@ -124,9 +127,10 @@ ygl-trees node import --file tree.json --tree copy # 严格校验、事务导
124
127
  query add 登记检索式
125
128
  query attach 检索式 ↔ 来源关联(query list 显示召回数)
126
129
  source add 收来源,按 (project, url_hash) 去重;--query 顺带关联
130
+ --adjudication "<裁决摘要>":会话内裁决原生载体(url 自动 session://adjudication/<时刻>,摘要兼作标题);--url 收任意 <scheme>://(https/file/session/a2a/… 跨 Agent 引用免落盘)
127
131
  source fetch <url> 直接抓取网页入库:title/meta description/去标签正文;15s 超时、非 html 拒收、失败零副作用,正文过薄自动打 needs_review
128
132
  evidence add 从来源摘原文片段,带 locator(页码/章节);长摘录用 --file <path> 免转义
129
- claim add 写下断言
133
+ claim add 写下断言;--confidence 收 A|B|C 或数值档(0.92 / 85% 原样入库)
130
134
  claim link 断言 ↔ 证据,自动算 supported / refuted / contested
131
135
  --by-source:传来源 id 一次挂齐其全部证据;误传来源 id 会列出该来源的证据 id
132
136
  claim resolve 人工仲裁出口:--as supported|refuted|contested,事件留痕;后续新证据链接会重新推导
@@ -185,17 +189,18 @@ ygl-trees rel add node:steel artifact:<id> --rel tracked-by # 产出/任
185
189
  ygl-trees rel list --src node:steel # 双向浏览(对端解析成显示名)
186
190
  ```
187
191
 
188
- `<type>:<ref>` 词表:`node claim evidence source query kb artifact skill`。`/api/node` 同时返回双向 `related[]`,WebUI 节点详情直接可见。
192
+ `<type>:<ref>` 词表:`node claim evidence source query kb artifact task skill`。`/api/node` 同时返回双向 `related[]`,WebUI 节点详情直接可见。
189
193
 
190
194
  ### task:任务状态机(todo → doing → done)
191
195
 
192
196
  ```bash
193
- ygl-trees task add "<标题>" [--note ...] # 建任务(todo)
197
+ ygl-trees task add "<标题>" [--note ...] # 建任务(todo)
198
+ ygl-trees task add "验证 X" --node <tree>/<key> # 建任务并挂到树节点(tracked-by)
194
199
  ygl-trees task list [--status todo|doing|done]
195
200
  ygl-trees task doing <id> | task done <id> # 推进(每次状态变更留痕 events)
196
201
  ```
197
202
 
198
- 任务本体是 `artifacts` 的 `kind='task'` + meta 状态信封(**没有独立的 tasks 表**)——与产出工件同源,可被 `rel ... tracked-by` 挂到节点。
203
+ 任务本体是 `artifacts` 的 `kind='task'` + meta 状态信封(**没有独立的 tasks 表**)——与产出工件同源,可被 `rel ... tracked-by` 挂到节点(`task add --node` 一步到位,`task:<id>` 也是合法引用类型)。
199
204
 
200
205
  ### produce spec / design:工程产出形态
201
206
 
@@ -243,15 +248,18 @@ CJK 检索是个坑:FTS5 默认 `unicode61` 会把整句中文当成一个 tok
243
248
 
244
249
  - **写入幂等**:`claim / evidence / query / kb / job` 的写命令按内容 hash 判重,重复执行返回已存在行(`! duplicate, kept existing`),Agent 重试不产生脏数据;`--force` 显式保留重复(job 用标题序号后缀)
245
250
  - **完整备份**:`db export <file>` 覆盖全部数据表(含七张科技树表)并输出逐表行数摘要;dump 自带 `PRAGMA foreign_keys` 开关,可直接重放恢复。`--lean` 跳过闭包/拓扑等派生表数据
246
- - **PostgreSQL 镜像/迁移**:`db time-travel "<ts>" workspace state at past moment
247
- db timeline growth visualization (events/day)
248
- db workspace list|create multi-workspace management
249
- db obsidian [dir] export as Obsidian markdown vault
250
- db sync pg <url>` 把整库单向全量镜像到 PG(可刷新,供 SQL 工具/团队分析);`db migrate pg <url> [--fresh]` 一次性完整保真迁移(FK/UNIQUE/索引约束齐全,目标库可独立持有)。两者都不做双后端同写,中文检索在 PG 侧用 tsvector+GIN 等价召回(详见 docs/pg-compat.md)。url 可走环境变量 `YGL_PG_URL`;`pg` 为可选依赖,不用 PG 则零影响
251
+ - **PostgreSQL 镜像/迁移**:`db sync pg <url>` 把整库单向全量镜像到 PG(可刷新,供 SQL 工具/团队分析);`db migrate pg <url> [--fresh]` 一次性完整保真迁移(FK/UNIQUE/索引约束齐全,目标库可独立持有)。两者都不做双后端同写,中文检索在 PG 侧用 tsvector+GIN 等价召回(详见 docs/pg-compat.md)。url 可走环境变量 `YGL_PG_URL`;`pg` 为可选依赖,不用 PG 则零影响
251
252
  - **TypeORM 查询层**(0.8.0 起,研究域试点 `project show`):实体是 schema v8 的类型化快照(`synchronize` 永久 false,迁移权威仍在 user_version 轨道;FTS5/PRAGMA 路径保持裸 SQL)。依赖 typeorm + better-sqlite3 + reflect-metadata
252
253
  - **重复可见**:`db dups` 列出同内容多行(含迁移前存量重复)
253
254
  - **自动迁移**:v2 老库首次打开自动升级 schema v3(补 content_hash 列 + 回填 + 唯一索引),无人工介入
254
255
 
256
+ ```bash
257
+ db time-travel "<ts>" # 工作区在历史时刻的状态
258
+ db timeline [--actor <a>] [--session <s>] # events/day 增长视图;过滤时附最近 20 条原始事件(多 Agent 对账)
259
+ db workspace list|create # 多工作区管理
260
+ db obsidian [dir] # 导出 Obsidian markdown vault
261
+ ```
262
+
255
263
  ---
256
264
 
257
265
  ## 四、调度
@@ -281,7 +289,7 @@ ygl-trees agent ask "<question>" natural language interface
281
289
  ## 五b、开发与运维工具
282
290
 
283
291
  ```bash
284
- pnpm test # 四段制回归:unit (vitest 163 例) + build (tsc + tsdown) + demo(82 条断言)+ contract:audit(86 项)
292
+ pnpm test # 四段制回归:unit (vitest 172 例) + build (tsc + tsdown) + demo(94 条断言)+ contract:audit(86 项)
285
293
  pnpm bench # 性能基准七席(startup/写路径/检索/索引),每席含 RSS 内存端点 → tmp/bench-results.json
286
294
  node benchmarks/bench.js --quick # 缩小规模快速跑
287
295
  pnpm pack:check # 发布就绪门禁:打包 → 隔离安装 → 驱动发布产物跑命令面 + --json 纯净性