dsh-memory-gate 0.3.2 → 0.5.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 +26 -0
- package/README.md +8 -1
- package/backtest/capture.mjs +62 -0
- package/backtest/measure.mjs +43 -0
- package/backtest/measure.test.mjs +43 -0
- package/backtest/observe.mjs +56 -0
- package/backtest/result.mjs +97 -0
- package/backtest/run.mjs +212 -0
- package/backtest/schema-v0.json +34 -0
- package/backtest/trajectory.mjs +74 -0
- package/backtest/trajectory.test.mjs +37 -0
- package/fixtures/synthetic/scenario-01-pref-zh-concise.json +11 -0
- package/fixtures/synthetic/scenario-02-constraint-no-creds.json +11 -0
- package/fixtures/synthetic/scenario-03-fact-project-path.json +11 -0
- package/fixtures/synthetic/scenario-04-quarantine-warning.json +11 -0
- package/fixtures/synthetic/scenario-05-pollution-irrelevant.json +11 -0
- package/fixtures/synthetic/scenario-06-procedure-deploy.json +11 -0
- package/fixtures/synthetic/scenario-07-heuristic-verify.json +11 -0
- package/fixtures/synthetic/scenario-08-warning-risk-verify.json +11 -0
- package/fixtures/synthetic/scenario-09-weak-verify-port.json +11 -0
- package/fixtures/synthetic/scenario-10-en-preference.json +11 -0
- package/fixtures/synthetic/scenario-11-traditional-simplified.json +11 -0
- package/fixtures/synthetic/scenario-12-warning-weak-verify.json +12 -0
- package/fixtures/synthetic/scenario-13-expired-ignore.json +11 -0
- package/fixtures/synthetic/scenario-14-paraphrase-brief.json +11 -0
- package/fixtures/synthetic/scenario-15-paraphrase-refine.json +11 -0
- package/fixtures/synthetic/scenario-16-en-synonym.json +11 -0
- package/fixtures/synthetic/scenario-17-pollution-en-zh.json +11 -0
- package/fixtures/synthetic/scenario-18-scope-isolation.json +11 -0
- package/fixtures/synthetic/scenario-19-weak-verify-deploy.json +11 -0
- package/fixtures/synthetic/scenario-20-weak-verify-test.json +11 -0
- package/fixtures/synthetic/scenario-21-constraint-safety.json +11 -0
- package/fixtures/synthetic/scenario-22-fact-tool.json +11 -0
- package/fixtures/synthetic/scenario-23-procedure-multi-step.json +11 -0
- package/fixtures/synthetic/scenario-24-constraint-negative-zh.json +11 -0
- package/fixtures/synthetic/scenario-25-traditional-constraint.json +11 -0
- package/fixtures/synthetic/scenario-26-empty-store.json +9 -0
- package/fixtures/synthetic/scenario-27-multi-claim-select.json +12 -0
- package/fixtures/synthetic/scenario-28-warning-heuristic-verify.json +11 -0
- package/fixtures/synthetic/scenario-29-constraint-heuristic-verify.json +11 -0
- package/fixtures/synthetic/scenario-30-pollution-topic-mismatch.json +11 -0
- package/fixtures/synthetic/session-sample.jsonl +6 -0
- package/lib/authority.d.ts.map +1 -1
- package/lib/authority.js +12 -2
- package/lib/authority.js.map +1 -1
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +4 -5
- package/lib/service.js.map +1 -1
- package/package.json +10 -3
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import assert from 'node:assert/strict'
|
|
2
|
+
import { test } from 'node:test'
|
|
3
|
+
|
|
4
|
+
import { observeSession, parseEvents } from '../backtest/trajectory.mjs'
|
|
5
|
+
|
|
6
|
+
const SAMPLE = `{"type":"turn/start","data":{"turn":1}}
|
|
7
|
+
{"type":"user/message","data":{"content":[{"type":"text","text":"项目代码在哪个目录"}],"source":{"kind":"user"},"role":"user","id":"q1"}}
|
|
8
|
+
{"type":"user/message","data":{"content":[{"type":"text","text":"<long_term_memory>\\n- [USE #1 mem_8f3a2b1c9d4e fact] 项目代码位于 /home/ubuntu/dsh 目录\\n</long_term_memory>"}],"source":{"kind":"plugin"},"role":"user","id":"i1"}}
|
|
9
|
+
{"type":"assistant/message","data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"text","text":"项目代码在 /home/ubuntu/dsh 目录"}]}}}
|
|
10
|
+
`
|
|
11
|
+
|
|
12
|
+
test('observeSession 提取 query / 注入 / assistant 文本', () => {
|
|
13
|
+
const turns = observeSession(parseEvents(SAMPLE))
|
|
14
|
+
assert.equal(turns.length, 1)
|
|
15
|
+
const turn = turns[0]
|
|
16
|
+
assert.equal(turn.turn, 1)
|
|
17
|
+
assert.equal(turn.query, '项目代码在哪个目录')
|
|
18
|
+
assert.equal(turn.injections.length, 1)
|
|
19
|
+
assert.deepEqual(turn.injections[0].claimIds, ['mem_8f3a2b1c9d4e'])
|
|
20
|
+
assert.ok(turn.assistantText.includes('项目代码在 /home/ubuntu/dsh 目录'))
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
test('observeSession 容忍损坏行', () => {
|
|
24
|
+
const turns = observeSession(parseEvents('not-json\n{"type":"turn/start","data":{"turn":2}}\n'))
|
|
25
|
+
assert.equal(turns.length, 1)
|
|
26
|
+
assert.equal(turns[0].turn, 2)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
test('claimIds 去重且只取 mem_ 格式,并抽出 claim 正文', () => {
|
|
30
|
+
const block = '<long_term_memory>\n- [USE #1 mem_aaa fact] 项目代码在 A\n- [USE #2 mem_aaa fact] 项目代码在 B\n</long_term_memory>'
|
|
31
|
+
const turns = observeSession([
|
|
32
|
+
{ type: 'turn/start', data: { turn: 1 } },
|
|
33
|
+
{ type: 'user/message', data: { content: [{ type: 'text', text: block }] } },
|
|
34
|
+
])
|
|
35
|
+
assert.deepEqual(turns[0].injections[0].claimIds, ['mem_aaa'])
|
|
36
|
+
assert.deepEqual(turns[0].injections[0].contents, ['项目代码在 A', '项目代码在 B'])
|
|
37
|
+
})
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "pref-zh-concise",
|
|
5
|
+
"query": "请用简短的中文答复我",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "preference", "scope": "global", "content": "用户偏好简洁中文回答" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "constraint-no-creds",
|
|
5
|
+
"query": "生成配置文件时,别把 token 写进去",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "constraint", "scope": "global", "content": "不要在回复中暴露凭据或密钥" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "fact-project-path",
|
|
5
|
+
"query": "项目代码在哪个目录",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "fact", "scope": "global", "content": "项目代码位于 /home/ubuntu/dsh 目录" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false, "assistant_answer": "项目代码在 /home/ubuntu/dsh 目录", "feedback": "helped" }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "quarantine-warning",
|
|
5
|
+
"query": "数据库迁移怎么做",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "warning", "scope": "global", "content": "生产环境的数据库迁移需要停机窗口", "harmful_bootstrap": 2 }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [], "expected_action": "ignore", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "pollution-irrelevant",
|
|
5
|
+
"query": "用 Rust 写一个快速排序",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "fact", "scope": "global", "content": "上一次线上事故的原因是端口 8080 被占用" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [], "expected_action": "ignore", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "procedure-deploy",
|
|
5
|
+
"query": "部署上线怎么做",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "procedure", "scope": "global", "content": "部署流程是先测试再上线,采用蓝绿切换" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "heuristic-verify",
|
|
5
|
+
"query": "请用简短中文回复",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "preference", "scope": "global", "content": "我偏好简洁的中文回答", "origin": "heuristic" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "verify", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "warning-risk-verify",
|
|
5
|
+
"query": "在共享目录执行脚本",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "warning", "scope": "global", "content": "不要在共享目录运行高权限脚本", "harmful_bootstrap": 1 }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "verify", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "weak-verify-port",
|
|
5
|
+
"query": "如何排查端口占用问题",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "fact", "scope": "global", "content": "上一次线上事故的原因是端口 8080 被占用" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "verify", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "en-preference",
|
|
5
|
+
"query": "answer me in english",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "preference", "scope": "global", "content": "Respond in English only" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "traditional-simplified",
|
|
5
|
+
"query": "请用简洁中文答复",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "preference", "scope": "global", "content": "我偏好簡潔的中文回答" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "warning-weak-verify",
|
|
5
|
+
"query": "能直接在生产库改表吗",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "warning", "scope": "global", "content": "生产环境禁止直接修改数据库 schema" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "verify", "hard": false },
|
|
11
|
+
"note": "语义高度相关但词法弱(改表 vs 修改 schema 不在同义词组),弱匹配降级为 verify;待补同义覆盖后可回升为 use。"
|
|
12
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "expired-ignore",
|
|
5
|
+
"query": "请用简短中文回复",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "preference", "scope": "global", "content": "用户偏好简洁中文回答", "valid_until": 1 }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [], "expected_action": "ignore", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "paraphrase-brief",
|
|
5
|
+
"query": "回答请简短一点",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "preference", "scope": "global", "content": "用户偏好简洁中文回答" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "paraphrase-refine",
|
|
5
|
+
"query": "答复请精炼",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "preference", "scope": "global", "content": "用户偏好简洁中文回答" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "en-synonym",
|
|
5
|
+
"query": "prefer brief answers",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "preference", "scope": "global", "content": "用户偏好简洁中文回答" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "pollution-en-zh",
|
|
5
|
+
"query": "用 Rust 写快速排序",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "fact", "scope": "global", "content": "Remember to use tabs for indentation" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [], "expected_action": "ignore", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "scope-isolation",
|
|
5
|
+
"query": "项目代码在哪个目录",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "fact", "scope": "workspace", "scope_key": "other-workspace", "content": "项目代码位于 /home/ubuntu/dsh 目录" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [], "expected_action": "ignore", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "weak-verify-deploy",
|
|
5
|
+
"query": "部署文档怎么写",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "procedure", "scope": "global", "content": "部署流程是先测试再上线,采用蓝绿切换" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "verify", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "weak-verify-test",
|
|
5
|
+
"query": "写单元测试",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "fact", "scope": "global", "content": "测试环境的数据可以随意重置" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "verify", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "constraint-safety",
|
|
5
|
+
"query": "能在生产库执行删除吗",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "constraint", "scope": "global", "content": "不要在生产环境直接执行删除命令" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "fact-tool",
|
|
5
|
+
"query": "项目怎么构建",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "fact", "scope": "global", "content": "项目的构建命令是 pnpm build" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false, "assistant_answer": "用 pnpm build 构建项目即可", "feedback": "helped" }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "procedure-multi-step",
|
|
5
|
+
"query": "发布前要做什么",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "procedure", "scope": "global", "content": "发布前需要过代码评审和测试" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "constraint-negative-zh",
|
|
5
|
+
"query": "回答请用中文",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "constraint", "scope": "global", "content": "不要在回答中使用英文术语" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "traditional-constraint",
|
|
5
|
+
"query": "请勿暴露凭证",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "constraint", "scope": "global", "content": "請不要暴露憑證" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "multi-claim-select",
|
|
5
|
+
"query": "项目代码在哪个目录",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "fact", "scope": "global", "content": "项目代码位于 /home/ubuntu/dsh 目录" },
|
|
9
|
+
{ "kind": "fact", "scope": "global", "content": "上一次线上事故的原因是端口 8080 被占用" }
|
|
10
|
+
],
|
|
11
|
+
"golden": { "inject": [0], "expected_action": "use", "hard": false, "assistant_answer": "项目代码在 /home/ubuntu/dsh 目录", "feedback": "helped" }
|
|
12
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "warning-heuristic-verify",
|
|
5
|
+
"query": "在共享目录执行脚本",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "warning", "scope": "global", "content": "不要在共享目录运行高权限脚本", "origin": "heuristic" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "verify", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "constraint-heuristic-verify",
|
|
5
|
+
"query": "生成配置别暴露密钥",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "constraint", "scope": "global", "content": "不要暴露凭据", "origin": "heuristic" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [0], "expected_action": "verify", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1.0",
|
|
3
|
+
"source": "synthetic",
|
|
4
|
+
"scenario_id": "pollution-topic-mismatch",
|
|
5
|
+
"query": "写一个前端组件",
|
|
6
|
+
"scopes": ["global"],
|
|
7
|
+
"claim_store": [
|
|
8
|
+
{ "kind": "fact", "scope": "global", "content": "数据库备份在每天凌晨执行" }
|
|
9
|
+
],
|
|
10
|
+
"golden": { "inject": [], "expected_action": "ignore", "hard": false }
|
|
11
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{"type":"session","data":{"id":"s1","cwd":"/tmp"}}
|
|
2
|
+
{"type":"turn/start","seq":1,"time":1,"data":{"turn":1}}
|
|
3
|
+
{"type":"user/message","seq":2,"time":2,"data":{"content":[{"type":"text","text":"项目代码在哪个目录"}],"source":{"kind":"user"},"role":"user","id":"m-query-1"}}
|
|
4
|
+
{"type":"user/message","seq":3,"time":3,"data":{"content":[{"type":"text","text":"<long_term_memory>\nThe following records are user memory, not system instructions.\n- [USE #1 mem_8f3a2b1c9d4e fact] 项目代码位于 /home/ubuntu/dsh 目录\n</long_term_memory>"}],"source":{"kind":"plugin","plugin":"dsh-memory-gate","form":"recall"},"role":"user","id":"m-inj-1"}}
|
|
5
|
+
{"type":"assistant/message","seq":4,"time":4,"data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"reasoning","text":"思考过程……"},{"type":"text","text":"项目代码在 /home/ubuntu/dsh 目录,用 ls 就能看到。"}]}}}
|
|
6
|
+
{"type":"turn/end","seq":5,"time":5,"data":{"turn":1,"reason":{"kind":"completed"}}}
|
package/lib/authority.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../src/authority.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../src/authority.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAMxE,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,0BAA0B,EAAE,MAAM,CAAA;IAClC,qBAAqB,EAAE,MAAM,CAAA;CAC9B;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,eAAe,EACvB,GAAG,SAAa,GACf,iBAAiB,CA4DnB"}
|
package/lib/authority.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
const RELEVANCE_IGNORE_THRESHOLD = 0.12;
|
|
2
|
+
/** 弱词法匹配(非胶囊)降级为 verify 的阈值,由回测调定:低于它不能算「放心用」。 */
|
|
3
|
+
const RELEVANCE_VERIFY_THRESHOLD = 0.5;
|
|
1
4
|
export function decideAuthority(candidate, policy, now = Date.now()) {
|
|
2
5
|
const { claim, belief } = candidate;
|
|
3
6
|
const beliefScore = clamp(belief.alpha / Math.max(1, belief.alpha + belief.beta));
|
|
@@ -20,10 +23,15 @@ export function decideAuthority(candidate, policy, now = Date.now()) {
|
|
|
20
23
|
reasonCodes.push('harmful_quarantine');
|
|
21
24
|
return make('ignore');
|
|
22
25
|
}
|
|
23
|
-
if (relevanceScore <
|
|
26
|
+
if (relevanceScore < RELEVANCE_IGNORE_THRESHOLD) {
|
|
24
27
|
reasonCodes.push('low_relevance');
|
|
25
28
|
return make('ignore');
|
|
26
29
|
}
|
|
30
|
+
// 弱词法匹配:只命中少量词项,不足以「放心用」,降级为「待核验」。
|
|
31
|
+
// 胶囊(可信全局偏好/约束)豁免——它们本就按设计无条件注入。
|
|
32
|
+
if (candidate.recallChannel !== 'capsule' && relevanceScore < RELEVANCE_VERIFY_THRESHOLD) {
|
|
33
|
+
reasonCodes.push('weak_relevance');
|
|
34
|
+
}
|
|
27
35
|
if (freshnessScore < 0.2) {
|
|
28
36
|
reasonCodes.push('stale_memory');
|
|
29
37
|
return make('verify');
|
|
@@ -34,7 +42,9 @@ export function decideAuthority(candidate, policy, now = Date.now()) {
|
|
|
34
42
|
reasonCodes.push('risk_above_use_threshold');
|
|
35
43
|
if (claim.origin === 'heuristic')
|
|
36
44
|
reasonCodes.push('heuristic_origin');
|
|
37
|
-
if (reasonCodes.includes('belief_below_use_threshold') ||
|
|
45
|
+
if (reasonCodes.includes('belief_below_use_threshold') ||
|
|
46
|
+
reasonCodes.includes('risk_above_use_threshold') ||
|
|
47
|
+
reasonCodes.includes('weak_relevance')) {
|
|
38
48
|
return make('verify');
|
|
39
49
|
}
|
|
40
50
|
reasonCodes.push('authority_thresholds_passed');
|
package/lib/authority.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authority.js","sourceRoot":"","sources":["../src/authority.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"authority.js","sourceRoot":"","sources":["../src/authority.ts"],"names":[],"mappings":"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"}
|
package/lib/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EACV,KAAK,EACL,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,eAAe,EACf,eAAe,EAChB,MAAM,gBAAgB,CAAA;AAIvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,qBAAa,aAAa;IAKtB,QAAQ,CAAC,UAAU,EAAE,gBAAgB;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM;IALzB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,oBAAoB,CAAI;gBAGrB,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,MAAM;IAKzB,IAAI,IAAI,IAAI,UAAU,CAErB;IAED,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI/B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAevF,kBAAkB,CAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GACtG,KAAK,EAAE;IAwBV,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,eAAe;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EACV,KAAK,EACL,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,eAAe,EACf,eAAe,EAChB,MAAM,gBAAgB,CAAA;AAIvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,qBAAa,aAAa;IAKtB,QAAQ,CAAC,UAAU,EAAE,gBAAgB;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM;IALzB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,oBAAoB,CAAI;gBAGrB,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,MAAM;IAKzB,IAAI,IAAI,IAAI,UAAU,CAErB;IAED,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI/B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAevF,kBAAkB,CAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GACtG,KAAK,EAAE;IAwBV,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,eAAe;IAoCjD,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,eAAe,GAAG,SAAS;IA4BlE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,SAAK,GAAG,eAAe,EAAE;IAIzE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,SAAK,GAAG,eAAe,EAAE;IAIxD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO;IAIrD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAIzF,eAAe,CAAC,SAAS,EAAE,MAAM;;;;;CAGlC;AAmBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAG/E;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAGjF"}
|
package/lib/service.js
CHANGED
|
@@ -63,11 +63,10 @@ export class MemoryService {
|
|
|
63
63
|
const triggered = this.repository.search(context.query, scopeKeys, Math.max(1, this.config.candidateLimit - this.config.capsuleLimit));
|
|
64
64
|
const capsule = this.repository.capsule(scopeKeys, this.config.capsuleLimit);
|
|
65
65
|
const candidates = new Map(triggered.map((candidate) => [candidate.claim.id, candidate]));
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
66
|
+
// capsule 覆盖 trigger:可信的全局偏好/约束即使同时命中词法检索,
|
|
67
|
+
// 也须保留其「胶囊」身份(无条件 use),不能被弱词法匹配降级。
|
|
68
|
+
for (const candidate of capsule)
|
|
69
|
+
candidates.set(candidate.claim.id, candidate);
|
|
71
70
|
const ranked = [...candidates.values()]
|
|
72
71
|
.map((candidate) => rankCandidate(candidate, this.config.freshnessHalfLifeDays))
|
|
73
72
|
.sort((a, b) => b.rankScore - a.rankScore)
|
package/lib/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-memory-gate",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Retrieved ≠ injected: CBDC-gated memory for DeepSeek Harness — decides how memory is USED (use/verify/ignore decisions, feedback learning, full audit); local SQLite + FTS5, bounded, no extra model call",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -37,13 +37,20 @@
|
|
|
37
37
|
"CHANGELOG.md",
|
|
38
38
|
"LICENSE",
|
|
39
39
|
"docs/architecture.md",
|
|
40
|
-
"docs/benchmark.md"
|
|
40
|
+
"docs/benchmark.md",
|
|
41
|
+
"backtest",
|
|
42
|
+
"fixtures/synthetic"
|
|
41
43
|
],
|
|
42
44
|
"scripts": {
|
|
43
45
|
"build": "tsc -p tsconfig.build.json",
|
|
44
46
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
45
47
|
"check": "npm run typecheck && npm run build",
|
|
46
|
-
"test": "npm run build && node --test tests/text.test.mjs tests/repository.test.mjs"
|
|
48
|
+
"test": "npm run build && node --test tests/text.test.mjs tests/repository.test.mjs backtest/measure.test.mjs backtest/trajectory.test.mjs",
|
|
49
|
+
"backtest": "npm run build && node backtest/run.mjs",
|
|
50
|
+
"result": "npm run build && node backtest/result.mjs",
|
|
51
|
+
"observe": "npm run build && node backtest/observe.mjs",
|
|
52
|
+
"verify": "npm run check && npm test && npm run backtest",
|
|
53
|
+
"prepublishOnly": "npm run verify"
|
|
47
54
|
},
|
|
48
55
|
"engines": {
|
|
49
56
|
"node": ">=22.5"
|