ygl-trees 0.82.0 → 0.82.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.
- package/CHANGELOG.md +6 -0
- package/README.md +3 -1
- package/dist/apps/cli/src/bin.js +2 -0
- package/dist/bundle/bin.cjs +74 -3
- package/dist/packages/research/pipeline/src/cmds.js +41 -1
- package/dist/packages/research/pipeline/src/writes.js +32 -2
- package/package.json +3 -3
- package/skills/ygl-trees-research/SKILL.md +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.82.1(2026-10-17)预测生命周期护栏:挂证据 ≠ 仲裁
|
|
4
|
+
- **`claim link` 不再抢跑预测仲裁**(用户上报③:`--stance supports` 自动把 [预测·…] 断言置 supported,predict audit 判 supported||refuted → resolved——预测刚挂证据就退出跟踪表,实际无人仲裁):预测前缀断言挂证据时跳过自动晋升,状态保持 unverified 直到显式 `claim resolve` / 到期回测;证据链接与 stance 照常落库,回执明示 `auto_promote: false`(`--json` 返回 `{claim, evidence, stance, status, auto_promote}`);普通断言的自动推导不变(回归护栏)
|
|
5
|
+
- **`claim unresolve <claimId>`**(建议②:误晋升后无归位命令):复位通道把断言重置回 unverified(撤销链接副作用 / 抢跑仲裁),幂等(已 unverified → `duplicate:true`),落 `claim.unresolve` 事件留痕——0.82.1 前被误晋升的预测可用它归队
|
|
6
|
+
- **predict audit `--json` 覆盖确认**(建议③):`--json` 始终输出全量 rows(含 resolved 终态行),人类视图默认隐藏终态——机器读全量、人看增量,同构无缺口
|
|
7
|
+
- 测试:predlink.spec.ts 5 例(预测不晋升 / 普通照常推导 / unresolve 复位+事件 / 幂等 / 坏 id 点名)→ 177;demo 5j 段 5 断言(挂证据不晋升 / 普通推导回归 / unresolve 复位 / 幂等 / 复位后仍在跟踪表)→ 106
|
|
8
|
+
|
|
3
9
|
## 0.82.0(2026-10-17)跨树巡检 + 临期 eval 门槛 + 幻影对账一键修复
|
|
4
10
|
- **`node ready --all`**(用户建议②:12 棵树巡检要 24 条命令——每树 tree use + ready):一次进程扫全部树的就绪集,无需 tree use / `-t`;`--json` 返回 `[{tree, ready[]}]`,人类输出按树分节
|
|
5
11
|
- **`node cond --due [--days N] [--eval]`**(建议③:w1/d90 检验依赖人记得看):扫描全部 eval 族条件,提取问题文本中的 `YYYY-MM-DD` 期限,列出 N 天内到期(含逾期)的条件(树/节点/deadline/剩余天数);`--days` 放宽窗口(默认 7);`--eval` 逐条组装上下文包送判定模型(三题型按 op 自动选择,离线安全回落 pending)——**判定只报告不仲裁**,通过 ≠ 自动解锁,resolve/unlock 保持人工(与 predict audit 同纪律);跨树扫描前置于树解析,无当前树也能跑
|
package/README.md
CHANGED
|
@@ -138,7 +138,9 @@ evidence add 从来源摘原文片段,带 locator(页码/章节);长
|
|
|
138
138
|
claim add 写下断言;--confidence 收 A|B|C 或数值档(0.92 / 85% 原样入库)
|
|
139
139
|
claim link 断言 ↔ 证据,自动算 supported / refuted / contested
|
|
140
140
|
--by-source:传来源 id 一次挂齐其全部证据;误传来源 id 会列出该来源的证据 id
|
|
141
|
+
[预测·…] 断言不自动晋升(0.82.1):挂证据≠仲裁,状态保持 unverified 直到显式 resolve / 到期回测
|
|
141
142
|
claim resolve 人工仲裁出口:--as supported|refuted|contested,事件留痕;后续新证据链接会重新推导
|
|
143
|
+
claim unresolve 复位通道:把断言重置回 unverified(撤销链接副作用 / 抢跑仲裁),幂等 duplicate:true
|
|
142
144
|
predict audit 预测回测:扫描 [预测·N天] 断言,本地可测判据自动测(树/kb 计数、npm 版本数),判 hit/miss/pending/manual——只报告不仲裁,给出待 resolve 建议
|
|
143
145
|
--state <file|url>:外部计数桥接(如 DSH API 快照),判据里的裸键名后缀匹配嵌套键(y_imported≥12 ← counts.y_imported)
|
|
144
146
|
已 claim resolve 的预测默认隐藏(回测终态),--all 查看全表
|
|
@@ -294,7 +296,7 @@ ygl-trees agent ask "<question>" natural language interface
|
|
|
294
296
|
## 五b、开发与运维工具
|
|
295
297
|
|
|
296
298
|
```bash
|
|
297
|
-
pnpm test # 四段制回归:unit (vitest
|
|
299
|
+
pnpm test # 四段制回归:unit (vitest 177 例) + build (tsc + tsdown) + demo(106 条断言)+ contract:audit(86 项)
|
|
298
300
|
pnpm bench # 性能基准七席(startup/写路径/检索/索引),每席含 RSS 内存端点 → tmp/bench-results.json
|
|
299
301
|
node benchmarks/bench.js --quick # 缩小规模快速跑
|
|
300
302
|
pnpm pack:check # 发布就绪门禁:打包 → 隔离安装 → 驱动发布产物跑命令面 + --json 纯净性
|
package/dist/apps/cli/src/bin.js
CHANGED
|
@@ -163,6 +163,7 @@ ${(0, fmt_1.paint)(fmt_1.C.bold, "research", true)} collect → screen → ex
|
|
|
163
163
|
claim link <claimId> <evidenceId> [--stance supports|refutes]
|
|
164
164
|
--by-source <claimId> <sourceId>: link ALL evidence under a source
|
|
165
165
|
claim resolve <claimId> --as supported|refuted|contested [--note]
|
|
166
|
+
claim unresolve <claimId> reset to unverified (undo auto-promote / early arbitration)
|
|
166
167
|
claim list
|
|
167
168
|
|
|
168
169
|
${(0, fmt_1.paint)(fmt_1.C.bold, "produce", true)} outline → section → report · spec/design(工程产出)
|
|
@@ -664,6 +665,7 @@ function generateLlmsManifest() {
|
|
|
664
665
|
["research claim add \"<text>\"", "refutable assertion"],
|
|
665
666
|
["research claim link <cid> <eid> --stance supports|refutes", "link claim to evidence"],
|
|
666
667
|
["research claim resolve <cid> --as supported|refuted|contested", "manual arbitration"],
|
|
668
|
+
["research claim unresolve <cid>", "reset to unverified (undo link auto-promote)"],
|
|
667
669
|
["research claim evaluate <cid>", "decision model confidence (0-5 → A/B/C/D)"],
|
|
668
670
|
["research evidence assess <eid>", "decision model quality assessment"],
|
|
669
671
|
]],
|
package/dist/bundle/bin.cjs
CHANGED
|
@@ -4088,6 +4088,7 @@ var writes_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
|
|
|
4088
4088
|
claimAdd: () => claimAdd,
|
|
4089
4089
|
claimLink: () => claimLink,
|
|
4090
4090
|
claimResolve: () => claimResolve,
|
|
4091
|
+
claimUnresolve: () => claimUnresolve,
|
|
4091
4092
|
evidenceAdd: () => evidenceAdd,
|
|
4092
4093
|
jobAdd: () => jobAdd,
|
|
4093
4094
|
kbAdd: () => kbAdd,
|
|
@@ -4343,7 +4344,8 @@ function mapClaim(c) {
|
|
|
4343
4344
|
}
|
|
4344
4345
|
async function claimLink(ds, claimId, evidenceId, stance = "supports") {
|
|
4345
4346
|
return ds.transaction(async (mgr) => {
|
|
4346
|
-
|
|
4347
|
+
const c = await mgr.query(`SELECT id, text FROM claims WHERE id=?`, [claimId]);
|
|
4348
|
+
if (!c.length) throw new Error(`claim not found: ${claimId}`);
|
|
4347
4349
|
if (!(await mgr.query(`SELECT id FROM evidence WHERE id=?`, [evidenceId])).length) throw new Error(`evidence not found: ${evidenceId}`);
|
|
4348
4350
|
await mgr.query(`INSERT INTO claim_evidence(claim_id,evidence_id,stance) VALUES(?,?,?)
|
|
4349
4351
|
ON CONFLICT(claim_id,evidence_id) DO UPDATE SET stance=excluded.stance`, [
|
|
@@ -4351,6 +4353,15 @@ async function claimLink(ds, claimId, evidenceId, stance = "supports") {
|
|
|
4351
4353
|
evidenceId,
|
|
4352
4354
|
stance
|
|
4353
4355
|
]);
|
|
4356
|
+
if (String(c[0]?.text ?? "").startsWith("[预测·")) {
|
|
4357
|
+
const cur = await mgr.query(`SELECT status FROM claims WHERE id=?`, [claimId]);
|
|
4358
|
+
const status = String(cur?.[0]?.status ?? "unverified");
|
|
4359
|
+
await logEvent$1(mgr, "claim.link", "claim", claimId, `${stance} ${evidenceId} (prediction: auto-promote skipped)`);
|
|
4360
|
+
return {
|
|
4361
|
+
status,
|
|
4362
|
+
auto_promote: false
|
|
4363
|
+
};
|
|
4364
|
+
}
|
|
4354
4365
|
const sup = await mgr.query(`SELECT COUNT(*) AS c FROM claim_evidence WHERE claim_id=? AND stance='supports'`, [claimId]);
|
|
4355
4366
|
const ref = await mgr.query(`SELECT COUNT(*) AS c FROM claim_evidence WHERE claim_id=? AND stance='refutes'`, [claimId]);
|
|
4356
4367
|
const s = Number(sup?.[0]?.c ?? 0);
|
|
@@ -4358,7 +4369,33 @@ async function claimLink(ds, claimId, evidenceId, stance = "supports") {
|
|
|
4358
4369
|
const status = s && r ? "contested" : s ? "supported" : r ? "refuted" : "unverified";
|
|
4359
4370
|
await mgr.update(Claim, { id: claimId }, { status });
|
|
4360
4371
|
await logEvent$1(mgr, "claim.link", "claim", claimId, `${stance} ${evidenceId}`);
|
|
4361
|
-
return {
|
|
4372
|
+
return {
|
|
4373
|
+
status,
|
|
4374
|
+
auto_promote: true
|
|
4375
|
+
};
|
|
4376
|
+
});
|
|
4377
|
+
}
|
|
4378
|
+
/** 0.82.1 (user report ③): reset an auto-promoted / wrongly arbitrated claim
|
|
4379
|
+
* back to unverified — the repair channel for link side effects on
|
|
4380
|
+
* predictions (and for any claim arbitrated too early). Idempotent: already
|
|
4381
|
+
* unverified → duplicate:true, no event spam. */
|
|
4382
|
+
async function claimUnresolve(ds, claimId) {
|
|
4383
|
+
return ds.transaction(async (mgr) => {
|
|
4384
|
+
const c = await mgr.query(`SELECT id, status FROM claims WHERE id=?`, [claimId]);
|
|
4385
|
+
if (!c.length) throw new Error(`claim not found: ${claimId}`);
|
|
4386
|
+
if (String(c[0]?.status) === "unverified") return {
|
|
4387
|
+
status: "unverified",
|
|
4388
|
+
duplicate: true
|
|
4389
|
+
};
|
|
4390
|
+
await mgr.update(Claim, { id: claimId }, {
|
|
4391
|
+
status: "unverified",
|
|
4392
|
+
updated: require_text.nowIso()
|
|
4393
|
+
});
|
|
4394
|
+
await logEvent$1(mgr, "claim.unresolve", "claim", claimId, `${c[0]?.status} → unverified`);
|
|
4395
|
+
return {
|
|
4396
|
+
status: "unverified",
|
|
4397
|
+
duplicate: false
|
|
4398
|
+
};
|
|
4362
4399
|
});
|
|
4363
4400
|
}
|
|
4364
4401
|
async function claimResolve(ds, claimId, status, note = "") {
|
|
@@ -7049,7 +7086,15 @@ function run$8(env, action, rest, args) {
|
|
|
7049
7086
|
});
|
|
7050
7087
|
}
|
|
7051
7088
|
return getOrm(env.db.path).then((ds) => claimLink(ds, rest[1], rest[2], stance)).then((r) => {
|
|
7052
|
-
|
|
7089
|
+
if (ctx.json) console.log(JSON.stringify({
|
|
7090
|
+
claim: rest[1],
|
|
7091
|
+
evidence: rest[2],
|
|
7092
|
+
stance,
|
|
7093
|
+
status: r.status,
|
|
7094
|
+
auto_promote: r.auto_promote
|
|
7095
|
+
}, null, 2));
|
|
7096
|
+
else if (r.auto_promote === false) ok(ctx, `linked; prediction claim stays ${r.status} — auto-promote skipped (arbitration: claim resolve / deadline audit)`);
|
|
7097
|
+
else ok(ctx, `linked; claim status now: ${r.status}`);
|
|
7053
7098
|
try {
|
|
7054
7099
|
const { evaluateClaimConfidence } = (init_eval_enhance(), require_rolldown_runtime.__toCommonJS(eval_enhance_exports));
|
|
7055
7100
|
const evRows = store.db.all(`SELECT e.quote, ce.stance, s.title AS source_title
|
|
@@ -7129,6 +7174,30 @@ function run$8(env, action, rest, args) {
|
|
|
7129
7174
|
return 1;
|
|
7130
7175
|
});
|
|
7131
7176
|
}
|
|
7177
|
+
if (subAction === "unresolve") {
|
|
7178
|
+
const id = rest[1];
|
|
7179
|
+
if (!id) {
|
|
7180
|
+
bad(ctx, "usage: research claim unresolve <claimId>");
|
|
7181
|
+
return 2;
|
|
7182
|
+
}
|
|
7183
|
+
const c0 = store.db.get("SELECT id, status FROM claims WHERE id=? AND project_id=?", [id, project.id]);
|
|
7184
|
+
if (!c0) {
|
|
7185
|
+
bad(ctx, `claim not found: ${id}`);
|
|
7186
|
+
return 1;
|
|
7187
|
+
}
|
|
7188
|
+
return getOrm(env.db.path).then((ds) => claimUnresolve(ds, id)).then((r) => {
|
|
7189
|
+
if (ctx.json) console.log(JSON.stringify({
|
|
7190
|
+
id,
|
|
7191
|
+
status: r.status,
|
|
7192
|
+
duplicate: r.duplicate
|
|
7193
|
+
}, null, 2));
|
|
7194
|
+
else ok(ctx, r.duplicate ? `claim ${id} already unverified (no change)` : `claim ${id}: ${c0.status} → unverified (back in tracking; arbitration: claim resolve)`);
|
|
7195
|
+
return 0;
|
|
7196
|
+
}).catch((e) => {
|
|
7197
|
+
bad(ctx, e?.message || String(e));
|
|
7198
|
+
return 1;
|
|
7199
|
+
});
|
|
7200
|
+
}
|
|
7132
7201
|
if (subAction === "evaluate") {
|
|
7133
7202
|
const id = rest[1];
|
|
7134
7203
|
if (!id) {
|
|
@@ -11979,6 +12048,7 @@ ${paint(C.bold, "research", true)} collect → screen → extract → claim
|
|
|
11979
12048
|
claim link <claimId> <evidenceId> [--stance supports|refutes]
|
|
11980
12049
|
--by-source <claimId> <sourceId>: link ALL evidence under a source
|
|
11981
12050
|
claim resolve <claimId> --as supported|refuted|contested [--note]
|
|
12051
|
+
claim unresolve <claimId> reset to unverified (undo auto-promote / early arbitration)
|
|
11982
12052
|
claim list
|
|
11983
12053
|
|
|
11984
12054
|
${paint(C.bold, "produce", true)} outline → section → report · spec/design(工程产出)
|
|
@@ -12429,6 +12499,7 @@ function generateLlmsManifest() {
|
|
|
12429
12499
|
["research claim add \"<text>\"", "refutable assertion"],
|
|
12430
12500
|
["research claim link <cid> <eid> --stance supports|refutes", "link claim to evidence"],
|
|
12431
12501
|
["research claim resolve <cid> --as supported|refuted|contested", "manual arbitration"],
|
|
12502
|
+
["research claim unresolve <cid>", "reset to unverified (undo link auto-promote)"],
|
|
12432
12503
|
["research claim evaluate <cid>", "decision model confidence (0-5 → A/B/C/D)"],
|
|
12433
12504
|
["research evidence assess <eid>", "decision model quality assessment"]
|
|
12434
12505
|
]
|
|
@@ -555,7 +555,17 @@ function run(env, action, rest, args) {
|
|
|
555
555
|
return (0, orm_1.getOrm)(env.db.path)
|
|
556
556
|
.then((ds) => writes.claimLink(ds, rest[1], rest[2], stance))
|
|
557
557
|
.then((r) => {
|
|
558
|
-
|
|
558
|
+
// 0.82.1: prediction claims never auto-promote on link — the receipt
|
|
559
|
+
// says so explicitly instead of showing a silently-unchanged status.
|
|
560
|
+
if (ctx.json) {
|
|
561
|
+
console.log(JSON.stringify({ claim: rest[1], evidence: rest[2], stance, status: r.status, auto_promote: r.auto_promote }, null, 2));
|
|
562
|
+
}
|
|
563
|
+
else if (r.auto_promote === false) {
|
|
564
|
+
(0, fmt_1.ok)(ctx, `linked; prediction claim stays ${r.status} — auto-promote skipped (arbitration: claim resolve / deadline audit)`);
|
|
565
|
+
}
|
|
566
|
+
else {
|
|
567
|
+
(0, fmt_1.ok)(ctx, `linked; claim status now: ${r.status}`);
|
|
568
|
+
}
|
|
559
569
|
// R15 深度集成:链接后自动触发置信度评估(有模型时静默执行)
|
|
560
570
|
try {
|
|
561
571
|
const { evaluateClaimConfidence } = require("../../../ops/tools/src/eval-enhance");
|
|
@@ -629,6 +639,36 @@ function run(env, action, rest, args) {
|
|
|
629
639
|
return 1;
|
|
630
640
|
});
|
|
631
641
|
}
|
|
642
|
+
// 0.82.1 (user report ③): the repair channel for link side effects —
|
|
643
|
+
// resets a claim to unverified. Covers predictions auto-promoted before
|
|
644
|
+
// 0.82.1 AND any claim arbitrated too early (explicit un-arbitration).
|
|
645
|
+
if (subAction === "unresolve") {
|
|
646
|
+
const id = rest[1];
|
|
647
|
+
if (!id) {
|
|
648
|
+
(0, fmt_1.bad)(ctx, "usage: research claim unresolve <claimId>");
|
|
649
|
+
return 2;
|
|
650
|
+
}
|
|
651
|
+
const c0 = store.db.get("SELECT id, status FROM claims WHERE id=? AND project_id=?", [id, project.id]);
|
|
652
|
+
if (!c0) {
|
|
653
|
+
(0, fmt_1.bad)(ctx, `claim not found: ${id}`);
|
|
654
|
+
return 1;
|
|
655
|
+
}
|
|
656
|
+
return (0, orm_1.getOrm)(env.db.path)
|
|
657
|
+
.then((ds) => writes.claimUnresolve(ds, id))
|
|
658
|
+
.then((r) => {
|
|
659
|
+
if (ctx.json)
|
|
660
|
+
console.log(JSON.stringify({ id, status: r.status, duplicate: r.duplicate }, null, 2));
|
|
661
|
+
else
|
|
662
|
+
(0, fmt_1.ok)(ctx, r.duplicate
|
|
663
|
+
? `claim ${id} already unverified (no change)`
|
|
664
|
+
: `claim ${id}: ${c0.status} → unverified (back in tracking; arbitration: claim resolve)`);
|
|
665
|
+
return 0;
|
|
666
|
+
})
|
|
667
|
+
.catch((e) => {
|
|
668
|
+
(0, fmt_1.bad)(ctx, e?.message || String(e));
|
|
669
|
+
return 1;
|
|
670
|
+
});
|
|
671
|
+
}
|
|
632
672
|
// R15.2: claim evaluate — decision model evaluates confidence from linked evidence
|
|
633
673
|
if (subAction === "evaluate") {
|
|
634
674
|
const id = rest[1];
|
|
@@ -5,6 +5,7 @@ exports.sourceAdd = sourceAdd;
|
|
|
5
5
|
exports.evidenceAdd = evidenceAdd;
|
|
6
6
|
exports.claimAdd = claimAdd;
|
|
7
7
|
exports.claimLink = claimLink;
|
|
8
|
+
exports.claimUnresolve = claimUnresolve;
|
|
8
9
|
exports.claimResolve = claimResolve;
|
|
9
10
|
exports.queryAttach = queryAttach;
|
|
10
11
|
exports.kbAdd = kbAdd;
|
|
@@ -178,7 +179,7 @@ async function claimLink(ds, claimId, evidenceId, stance = "supports") {
|
|
|
178
179
|
return ds.transaction(async (mgr) => {
|
|
179
180
|
// Resolve both ends before writing: a bad/foreign id must surface as a
|
|
180
181
|
// named not-found, not as a raw FOREIGN KEY constraint failure.
|
|
181
|
-
const c = (await mgr.query(`SELECT id FROM claims WHERE id=?`, [claimId]));
|
|
182
|
+
const c = (await mgr.query(`SELECT id, text FROM claims WHERE id=?`, [claimId]));
|
|
182
183
|
if (!c.length)
|
|
183
184
|
throw new Error(`claim not found: ${claimId}`);
|
|
184
185
|
const e = (await mgr.query(`SELECT id FROM evidence WHERE id=?`, [evidenceId]));
|
|
@@ -186,6 +187,19 @@ async function claimLink(ds, claimId, evidenceId, stance = "supports") {
|
|
|
186
187
|
throw new Error(`evidence not found: ${evidenceId}`);
|
|
187
188
|
await mgr.query(`INSERT INTO claim_evidence(claim_id,evidence_id,stance) VALUES(?,?,?)
|
|
188
189
|
ON CONFLICT(claim_id,evidence_id) DO UPDATE SET stance=excluded.stance`, [claimId, evidenceId, stance]);
|
|
190
|
+
// 0.82.1 (user report ③): prediction claims (`[预测·…]` prefix) must NOT
|
|
191
|
+
// auto-promote on link — predict audit treats supported/refuted as
|
|
192
|
+
// human-arbitrated (terminal), so a mere evidence link would kick the
|
|
193
|
+
// prediction out of the tracking table before its deadline. Evidence
|
|
194
|
+
// linking is evidence gathering; arbitration stays an explicit
|
|
195
|
+
// `claim resolve` (frozen contract, same discipline as predict audit).
|
|
196
|
+
const text = String(c[0]?.text ?? "");
|
|
197
|
+
if (text.startsWith("[预测·")) {
|
|
198
|
+
const cur = (await mgr.query(`SELECT status FROM claims WHERE id=?`, [claimId]));
|
|
199
|
+
const status = String(cur?.[0]?.status ?? "unverified");
|
|
200
|
+
await logEvent(mgr, "claim.link", "claim", claimId, `${stance} ${evidenceId} (prediction: auto-promote skipped)`);
|
|
201
|
+
return { status, auto_promote: false };
|
|
202
|
+
}
|
|
189
203
|
const sup = (await mgr.query(`SELECT COUNT(*) AS c FROM claim_evidence WHERE claim_id=? AND stance='supports'`, [claimId]));
|
|
190
204
|
const ref = (await mgr.query(`SELECT COUNT(*) AS c FROM claim_evidence WHERE claim_id=? AND stance='refutes'`, [claimId]));
|
|
191
205
|
const s = Number(sup?.[0]?.c ?? 0);
|
|
@@ -193,7 +207,23 @@ async function claimLink(ds, claimId, evidenceId, stance = "supports") {
|
|
|
193
207
|
const status = s && r ? "contested" : s ? "supported" : r ? "refuted" : "unverified";
|
|
194
208
|
await mgr.update(entities_1.Claim, { id: claimId }, { status });
|
|
195
209
|
await logEvent(mgr, "claim.link", "claim", claimId, `${stance} ${evidenceId}`);
|
|
196
|
-
return { status };
|
|
210
|
+
return { status, auto_promote: true };
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
/** 0.82.1 (user report ③): reset an auto-promoted / wrongly arbitrated claim
|
|
214
|
+
* back to unverified — the repair channel for link side effects on
|
|
215
|
+
* predictions (and for any claim arbitrated too early). Idempotent: already
|
|
216
|
+
* unverified → duplicate:true, no event spam. */
|
|
217
|
+
async function claimUnresolve(ds, claimId) {
|
|
218
|
+
return ds.transaction(async (mgr) => {
|
|
219
|
+
const c = (await mgr.query(`SELECT id, status FROM claims WHERE id=?`, [claimId]));
|
|
220
|
+
if (!c.length)
|
|
221
|
+
throw new Error(`claim not found: ${claimId}`);
|
|
222
|
+
if (String(c[0]?.status) === "unverified")
|
|
223
|
+
return { status: "unverified", duplicate: true };
|
|
224
|
+
await mgr.update(entities_1.Claim, { id: claimId }, { status: "unverified", updated: (0, text_1.nowIso)() });
|
|
225
|
+
await logEvent(mgr, "claim.unresolve", "claim", claimId, `${c[0]?.status} → unverified`);
|
|
226
|
+
return { status: "unverified", duplicate: false };
|
|
197
227
|
});
|
|
198
228
|
}
|
|
199
229
|
async function claimResolve(ds, claimId, status, note = "") {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ygl-trees",
|
|
3
|
-
"version": "0.82.
|
|
3
|
+
"version": "0.82.1",
|
|
4
4
|
"description": "猿光 · 科技树 — database-centric CLI for research → production → knowledge reuse, built for AI agents.",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "dist/apps/cli/index.js",
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
"reflect-metadata": "^0.2.2",
|
|
27
27
|
"typeorm": "^1.1.2",
|
|
28
28
|
"@deepseek-ai/cordis": "~4.0.5-alpha.2",
|
|
29
|
-
"@deepseek-ai/
|
|
29
|
+
"@deepseek-ai/cordis-plugin-timer": "~1.1.7-alpha.2",
|
|
30
30
|
"@deepseek-ai/schemastery": "~3.18.5-alpha.2",
|
|
31
|
-
"@deepseek-ai/
|
|
31
|
+
"@deepseek-ai/cosmokit": "~1.8.6-alpha.2"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@types/node": "^20.0.0",
|
|
@@ -42,11 +42,13 @@ ygl-trees research evidence add <sourceId> --quote "原文片段" --locator "§2
|
|
|
42
42
|
ygl-trees research evidence add <sourceId> --file quotes.md # 长摘录免转义
|
|
43
43
|
ygl-trees research claim add "断言文本" --confidence A # 档位
|
|
44
44
|
ygl-trees research claim add "断言文本" --confidence 0.92 # 数值档(0.81:0-1 或 0-100%)
|
|
45
|
-
ygl-trees research claim link <claimId> <evidenceId> [--stance refutes] #
|
|
45
|
+
ygl-trees research claim link <claimId> <evidenceId> [--stance refutes] # 状态自动推导(普通断言)
|
|
46
46
|
ygl-trees research claim resolve <claimId> --as contested --note "矛盾待查" # 人工仲裁出口
|
|
47
|
+
ygl-trees research claim unresolve <claimId> # 复位回 unverified(0.82.1:撤销链接副作用/抢跑仲裁)
|
|
47
48
|
```
|
|
48
49
|
|
|
49
50
|
- 有支持有反对 → `contested`;仲裁后新证据链接会重新推导
|
|
51
|
+
- **预测断言(`[预测·…]` 前缀)挂证据不自动晋升**(0.82.1):挂证据 ≠ 仲裁,状态保持 unverified 直到显式 resolve / 到期回测——predict audit 才不会把刚挂证据的预测误判已结案;误晋升用 `claim unresolve` 归位(幂等 duplicate:true)
|
|
50
52
|
- 全部命令幂等:同内容重跑返回已存在行(`duplicate: true`,rc=0)
|
|
51
53
|
|
|
52
54
|
## 3. 产出
|
|
@@ -65,6 +67,7 @@ ygl-trees produce export <reportId> report.md
|
|
|
65
67
|
- 先 `agent brief --json` 看 next_actions(它会告诉你缺来源/缺证据/缺断言)
|
|
66
68
|
- 每条断言至少一条证据再进报告;contested 的要么补证据要么 resolve
|
|
67
69
|
- 预测断言(`[预测·N天]`)定期 `research predict audit` 回测:本地判据自动测;`--state <file|url>`
|
|
68
|
-
桥接外部计数(裸键名后缀匹配 `counts.y_imported`);已 resolve 的默认隐藏(`--all`
|
|
70
|
+
桥接外部计数(裸键名后缀匹配 `counts.y_imported`);已 resolve 的默认隐藏(`--all` 查看终态表,
|
|
71
|
+
`--json` 始终含全量行含终态——机器读全量、人看增量)
|
|
69
72
|
- `--json` 输出可直接 parse 拿 id;列表命令字段:source(id,title,url,relevance,…)、
|
|
70
73
|
claim(id,text,status,confidence,sup,ref)、evidence(id,source,locator,quote,used_by)
|