liquid-loop 1.4.0__tar.gz → 1.8.2__tar.gz

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 (40) hide show
  1. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/PKG-INFO +61 -50
  2. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/README.md +60 -49
  3. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/__init__.py +2 -2
  4. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/cli.py +12 -56
  5. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/entropy.py +5 -5
  6. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/rar.py +16 -3
  7. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/selfspin.py +6 -2
  8. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/workspace.py +385 -7
  9. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop.egg-info/PKG-INFO +61 -50
  10. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop.egg-info/SOURCES.txt +8 -0
  11. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/pyproject.toml +1 -1
  12. liquid_loop-1.8.2/tests/test_attention_gain.py +102 -0
  13. liquid_loop-1.8.2/tests/test_cli_version.py +29 -0
  14. liquid_loop-1.8.2/tests/test_lifecycle.py +164 -0
  15. liquid_loop-1.8.2/tests/test_liquid_reweight.py +138 -0
  16. liquid_loop-1.8.2/tests/test_rar.py +106 -0
  17. liquid_loop-1.8.2/tests/test_replay_pressure.py +118 -0
  18. liquid_loop-1.8.2/tests/test_selfspin.py +83 -0
  19. liquid_loop-1.8.2/tests/test_semantica_borrow.py +74 -0
  20. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/LICENSE +0 -0
  21. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/__main__.py +0 -0
  22. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/cognitive_budget.py +0 -0
  23. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/liquid_reweight.py +0 -0
  24. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop/storage.py +0 -0
  25. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop.egg-info/dependency_links.txt +0 -0
  26. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop.egg-info/entry_points.txt +0 -0
  27. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop.egg-info/requires.txt +0 -0
  28. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop.egg-info/top_level.txt +0 -0
  29. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop_exp/liquid_persist_ab.py +0 -0
  30. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/liquid_loop_exp/liquid_recall_ab.py +0 -0
  31. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/setup.cfg +0 -0
  32. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_auth_guard.py +0 -0
  33. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_consensus_expansion.py +0 -0
  34. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_entropy.py +0 -0
  35. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_layer1_persistence.py +0 -0
  36. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_nucleate_dual_track.py +0 -0
  37. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_peek_seal.py +0 -0
  38. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_seal_persistence.py +0 -0
  39. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_self_evolve.py +0 -0
  40. {liquid_loop-1.4.0 → liquid_loop-1.8.2}/tests/test_workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: liquid-loop
3
- Version: 1.4.0
3
+ Version: 1.8.2
4
4
  Summary: Self-Organizing Cognitive Memory for AI Agents — Liquid Loop theory implementation
5
5
  Author: fishbook0001
6
6
  Maintainer: fishbook0001
@@ -50,6 +50,35 @@ Dynamic: license-file
50
50
 
51
51
  ---
52
52
 
53
+ ## 30 秒理解:为什么禁向量?
54
+
55
+ > **向量检索没有「成核门槛」**——单独一条陈述就能进入检索池,并因为"最新"而胜出。
56
+ > 所以一条噪声 / 幻觉 / 误录入就能改写系统的记忆。
57
+ > 液环要求 **≥2 条一致证据才结晶**,单条噪声无法形成记忆。
58
+
59
+ 这句话是可证伪的,有对照实验(同输入流、同种子、baseline 刻意做强):
60
+
61
+ | 系统 | 事实更新类场景 (S1/S2/S3/S5) | **S4 单条噪声注入** | 可解释 |
62
+ |------|------------------------|------------------|-------|
63
+ | naive vector | 12/36 错 | 3/6 错 | ✗ |
64
+ | vector + recency | 3/36 错 | 5/6 错 | ✗ |
65
+ | **vector + recency + slot 过滤**(最强 baseline) | **0/36 错** | **5/6 错** | ✗ |
66
+ | **Liquid Loop** | **0/36 错** | **0/6 错** | ✓ 可回溯到 evidence id |
67
+
68
+ **注意第三行**:最强 baseline 在常规事实更新上已完全追平液环——
69
+ **如果你的场景只是"事实会更新",用向量 + recency + 过滤就够了,不需要液环。**
70
+ 分野只在**输入源不可信**时出现:向量方案无法区分"真实更新"和"一条噪声",液环可以。
71
+
72
+ ```bash
73
+ python3 liquid_core.py # 215 行零依赖内核,看清全部机制
74
+ python3 examples/experiments/vector_vs_liquid_drift.py # 复现上表所有数字
75
+ ```
76
+
77
+ 两个脚本纯标准库,无需 `pip install`,Python 3.9+ 直接跑。
78
+ 完整论证与液环的**成本和适用边界** → **[WHY_NO_VECTOR.md](WHY_NO_VECTOR.md)**
79
+
80
+ ---
81
+
53
82
  ## 核心理念
54
83
 
55
84
  **当前所有 Agent 记忆系统的共同缺陷:依赖外部编辑。**
@@ -74,7 +103,7 @@ Dynamic: license-file
74
103
  | **Anchor** 锚点 | 晶种 | 认知关注点,有稳定性值 s ∈ [0,1] |
75
104
  | **Evidence** 证据 | 附着粒子 | 锚点下的具体观察,权重指数衰减 w×0.95ᵗ |
76
105
  | **Memory** 结晶 | 结晶体 | 2+ 条一致 Evidence 自动凝聚,有置信度 c |
77
- | **Entropy** 熵值 (LEI) | 流体无序度 | 八维加权(锚点漂移 / 冲突密度 / 碎片 / 活跃间隔 / 价值衰减 / 锚定强度 / CPE 三维) |
106
+ | **Entropy** 熵值 (LEI) | 流体无序度 | 九维加权(锚点漂移 / 冲突密度 / 碎片 / 活跃间隔 / 价值衰减 / 锚定强度 / CPE 三维) |
78
107
 
79
108
  **状态判定:**
80
109
  ```
@@ -134,13 +163,23 @@ state.step(dt=10, decay_rate=0.05)
134
163
  | 实验 | 问题 | 结论 |
135
164
  |------|------|------|
136
165
  | **E2 错误记忆恢复** | 能否主动遗忘错误并恢复? | 80%错误+20%真实 → 反证轨使错误 stability 0.67→0.30、正确升至 0.69 主导 ✅ |
137
- | **E3 多 Agent 冲突** | mesh v2 能否形成稳定共享认知? | A support / B contradiction / C noise → 核心 claim 进入受争议稳定区(0.40),噪声隔离 ✅ |
166
+ | **E3 多 Agent 冲突** | 多 Agent 冲突能否形成稳定共享认知?(MESH 集成已移除) | A support / B contradiction / C noise → 核心 claim 进入受争议稳定区(0.40),噪声隔离 ✅ |
138
167
  | **E1 长期漂移** | 1000 轮随机注入是否收敛? | 300 轮压测 → 48 记忆(≤池×3)、plateau、LEI GREEN、avg_stab 0.80 ✅ |
168
+ | **E4 向量对照** | 与向量方案同台,液环赢在哪? | 最强 baseline(向量+recency+slot) 在常规更新已追平(0/36);**唯 S4 单条噪声注入失守 5/6,液环 0/6** ✅ |
139
169
 
140
170
  ```bash
141
- python3 examples/experiments/run_all.py # 生成 REPORT_v0.8.json
171
+ python3 examples/experiments/run_all.py # E1/E2/E3 → REPORT_v0.8.json
172
+ python3 examples/experiments/vector_vs_liquid_drift.py # E4 向量对照(零依赖,独立可跑)
142
173
  ```
143
174
 
175
+ > **真实管线版 E4(推荐先看这个)**:`examples/faithful/faithful_e4.py` 用**真实**
176
+ > `selfspin.LiquidSelfSpin` + **真实** `workspace.WorkspaceState`(非裸内核),验证
177
+ > "改写 + 噪声输入下的端到端行为",并演示 selfspin「字符重叠聚类」的盲区边界
178
+ > (词汇不重叠的同义 → 无法成核 → 事实流失)。stdlib-only、零依赖,**直接用任意 python3 跑(无需 venv)**:
179
+ > ```bash
180
+ > python3 examples/faithful/faithful_e4.py
181
+ > ```
182
+
144
183
  ---
145
184
 
146
185
  ## 快速开始
@@ -207,47 +246,9 @@ liquid-loop snapshot
207
246
 
208
247
  ---
209
248
 
210
- ## MESH 集成(多智能体共识)
211
-
212
- 液环从 v0.7.0 起内置官方 MESH 集成 `liquid_loop.mesh`,把"多智能体共识协议"落地为可复用代码,作为 agent-mesh 节点的标准接入层。
249
+ ## MESH 集成与 A2A 桥接(已移除)
213
250
 
214
- ```python
215
- from liquid_loop.mesh import validate_evidence, compute_cci, cognitive_health, fetch_state
216
-
217
- # agent 写入前契约自检(零向量:content 必须精确字符串,禁 embedding)
218
- ok, errs = validate_evidence({"agent_id": "vera", "content": "用户偏好简洁输出"})
219
-
220
- # 从 8790 拉取记忆状态,算主体间性共识指数 CCI
221
- items = fetch_state("http://127.0.0.1:8790")
222
- health = cognitive_health(items)
223
- print(health["CCI"], health["consensus_crystals"])
224
- ```
225
-
226
- 零向量哲学:一致性判定走**结构化精确相等 + 审计链哈希**,绝不引入任何 embedding / 相似度。规范详见 `mesh/liquid_loop_mesh_v2_spec.md`。
227
-
228
- ---
229
-
230
- ## 固态 A2A 通道(任意 MCP 客户端接入)
231
-
232
- 把共享液环后端(地址由环境变量 `LIQUID_LOOP_BASE` 决定,默认 `http://127.0.0.1:8790`)封装成一个
233
- **stdio JSON-RPC 的 MCP server**,让任意支持 Model Context Protocol 的客户端(本例以 TRAE SOLO CN 演示)
234
- **原生读写同一份共享记忆**——这就是多 agent 间的固化(solidified)A2A 通道。
235
-
236
- > 后端说明:桥接只做协议翻译,**不内置 8790 服务**;后端由你自己部署(运行你自己的液环 SSE 服务,
237
- > 把地址通过 `LIQUID_LOOP_BASE` 传给桥接)。成核 / 共识 / 审计链全部由后端按液环理论执行。
238
-
239
- ```bash
240
- # 在你的 MCP 客户端注册该 server(以 TRAE 为例;其 code CLI 路径随安装而异,请替换为你的路径)
241
- export PY=python3 # 任意 Python 3.10+ 解释器
242
- export SVR=examples/trae_mesh_mcp/mcp_server.py # 本仓库内路径
243
- export LIQUID_LOOP_BASE=http://127.0.0.1:8790 # 改成你的后端地址
244
- "<path-to-your-trae-code-cli>" \
245
- --add-mcp '{"servers":{"liquidloop-mesh":{"command":"'"$PY"'","args":["'"$SVR"'"]}}}'
246
- ```
247
-
248
- 桥接暴露 `liquidloop_remember` / `liquidloop_recall` / `liquidloop_metrics` 三个工具(写入**必须声明 `agent_id`**)。
249
- 压测脚本与运维说明见 [`examples/trae_mesh_mcp/README.md`](examples/trae_mesh_mcp/README.md)
250
- (直连 + 经桥双路并发,零丢写 / 共识幂等 / 崩溃恢复三关全 PASS;所有路径走环境变量,适配不同部署拓扑)。
251
+ > ⚠️ `liquid_loop.mesh`(多智能体共识协议)与 `examples/trae_mesh_mcp`(stdio MCP 桥接 demo)已于 v0.7.x 后从发行包移除(commit `ac7260e`,过度工程化过滤)。相关 API(`validate_evidence` / `compute_cci` / `cognitive_health` / `fetch_state`)与桥接代码当前不在仓库中;"多 Agent 共享认知"仍属理论目标,未随包发布。
251
252
 
252
253
  ---
253
254
 
@@ -268,7 +269,7 @@ export LIQUID_LOOP_BASE=http://127.0.0.1:8790 # 改成你的后端地址
268
269
  ↓
269
270
  Memory State ←──────────────┐
270
271
  ↓ │
271
- LEI Evaluation (八维熵) │
272
+ LEI Evaluation (九维熵) │
272
273
  ↓ │
273
274
  Decay / Reinforcement ────────┘
274
275
  ↓
@@ -321,22 +322,32 @@ Liquid Loop 是唯一完全自组织 + 零 LLM 管理的系统。
321
322
 
322
323
  ```
323
324
  liquid-loop/
325
+ ├── liquid_core.py # ★ 215 行零依赖最小内核(单文件可跑,读它就懂全部机制)
326
+ ├── WHY_NO_VECTOR.md # ★ 禁向量的完整论证 + 对照实验数据 + 适用边界
324
327
  ├── liquid_loop/
325
328
  │ ├── __init__.py # 公共 API 导出
326
329
  │ ├── workspace.py # 核心数据模型 + AuditChain + auto_classify + decay
327
330
  │ ├── storage.py # JSON 持久化 + 审计链写入
328
- │ ├── entropy.py # 八维熵值计算(含 CPE 三维)
329
- │ ├── mesh/ # MESH v2 多智能体共识协议集成(validate_evidence / compute_cci / ...)
331
+ │ ├── entropy.py # 九维熵值计算(6 基础 + CPE 三维)
330
332
  │ └── cli.py # Click CLI (11 命令)
331
333
  ├── examples/
332
- │ └── quickstart.py
333
- ├── tests/ # 待补充
334
+ │ ├── quickstart.py
335
+ │ ├── experiments/
336
+ │ │ ├── e1_drift.py / e2_recovery.py / e3_conflict.py # 液环自证实验
337
+ │ │ └── vector_vs_liquid_drift.py # ★ E4 向量对照(零依赖·核心机制 demo)
338
+ │ └── faithful/
339
+ │ └── faithful_e4.py # ★ 真实管线 E4(selfspin→WorkspaceState,零依赖 无污染)
340
+ ├── tests/
334
341
  ├── pyproject.toml
335
342
  ├── README.md
336
343
  ├── LICENSE
337
344
  └── CHANGELOG.md
338
345
  ```
339
346
 
347
+ > **`liquid_core.py` 与完整版行为一致性已验证**:结晶 / 反证 / 共识轨 / step 衰减
348
+ > 四场景 stability 数值完全相同(4/4 PASS)。内核是可信的教学与审计入口,
349
+ > 不是简化到失真的玩具。
350
+
340
351
  ---
341
352
 
342
353
  ## 开发
@@ -352,7 +363,7 @@ pytest -v
352
363
 
353
364
  ## 路线图
354
365
 
355
- - [x] 多 Agent 液环耦合(`liquid_loop.mesh` v2 共识协议,2026-07-15 落地)
366
+ - [ ] 多 Agent 液环耦合(`liquid_loop.mesh` 已移除,见 commit ac7260e)
356
367
  - [x] **[v0.8] 反证轨(Evidence Graph)**:Evidence 分 support / contradiction,一致增稳、冲突降稳,驱动 memory stability score(不再"一致即真")
357
368
  - [x] **[v0.8] 显式时间动力学**:`M(t+1) = M(t) + reinforcement − decay − contradiction_penalty`,让记忆成为"过程"而非"对象"(真正的液态循环)
358
369
  - [x] **[v0.8] 三实验全 PASS**:E2 错误记忆恢复 → E3 多 agent 冲突 → E1 长期漂移(见上节)
@@ -11,6 +11,35 @@
11
11
 
12
12
  ---
13
13
 
14
+ ## 30 秒理解:为什么禁向量?
15
+
16
+ > **向量检索没有「成核门槛」**——单独一条陈述就能进入检索池,并因为"最新"而胜出。
17
+ > 所以一条噪声 / 幻觉 / 误录入就能改写系统的记忆。
18
+ > 液环要求 **≥2 条一致证据才结晶**,单条噪声无法形成记忆。
19
+
20
+ 这句话是可证伪的,有对照实验(同输入流、同种子、baseline 刻意做强):
21
+
22
+ | 系统 | 事实更新类场景 (S1/S2/S3/S5) | **S4 单条噪声注入** | 可解释 |
23
+ |------|------------------------|------------------|-------|
24
+ | naive vector | 12/36 错 | 3/6 错 | ✗ |
25
+ | vector + recency | 3/36 错 | 5/6 错 | ✗ |
26
+ | **vector + recency + slot 过滤**(最强 baseline) | **0/36 错** | **5/6 错** | ✗ |
27
+ | **Liquid Loop** | **0/36 错** | **0/6 错** | ✓ 可回溯到 evidence id |
28
+
29
+ **注意第三行**:最强 baseline 在常规事实更新上已完全追平液环——
30
+ **如果你的场景只是"事实会更新",用向量 + recency + 过滤就够了,不需要液环。**
31
+ 分野只在**输入源不可信**时出现:向量方案无法区分"真实更新"和"一条噪声",液环可以。
32
+
33
+ ```bash
34
+ python3 liquid_core.py # 215 行零依赖内核,看清全部机制
35
+ python3 examples/experiments/vector_vs_liquid_drift.py # 复现上表所有数字
36
+ ```
37
+
38
+ 两个脚本纯标准库,无需 `pip install`,Python 3.9+ 直接跑。
39
+ 完整论证与液环的**成本和适用边界** → **[WHY_NO_VECTOR.md](WHY_NO_VECTOR.md)**
40
+
41
+ ---
42
+
14
43
  ## 核心理念
15
44
 
16
45
  **当前所有 Agent 记忆系统的共同缺陷:依赖外部编辑。**
@@ -35,7 +64,7 @@
35
64
  | **Anchor** 锚点 | 晶种 | 认知关注点,有稳定性值 s ∈ [0,1] |
36
65
  | **Evidence** 证据 | 附着粒子 | 锚点下的具体观察,权重指数衰减 w×0.95ᵗ |
37
66
  | **Memory** 结晶 | 结晶体 | 2+ 条一致 Evidence 自动凝聚,有置信度 c |
38
- | **Entropy** 熵值 (LEI) | 流体无序度 | 八维加权(锚点漂移 / 冲突密度 / 碎片 / 活跃间隔 / 价值衰减 / 锚定强度 / CPE 三维) |
67
+ | **Entropy** 熵值 (LEI) | 流体无序度 | 九维加权(锚点漂移 / 冲突密度 / 碎片 / 活跃间隔 / 价值衰减 / 锚定强度 / CPE 三维) |
39
68
 
40
69
  **状态判定:**
41
70
  ```
@@ -95,13 +124,23 @@ state.step(dt=10, decay_rate=0.05)
95
124
  | 实验 | 问题 | 结论 |
96
125
  |------|------|------|
97
126
  | **E2 错误记忆恢复** | 能否主动遗忘错误并恢复? | 80%错误+20%真实 → 反证轨使错误 stability 0.67→0.30、正确升至 0.69 主导 ✅ |
98
- | **E3 多 Agent 冲突** | mesh v2 能否形成稳定共享认知? | A support / B contradiction / C noise → 核心 claim 进入受争议稳定区(0.40),噪声隔离 ✅ |
127
+ | **E3 多 Agent 冲突** | 多 Agent 冲突能否形成稳定共享认知?(MESH 集成已移除) | A support / B contradiction / C noise → 核心 claim 进入受争议稳定区(0.40),噪声隔离 ✅ |
99
128
  | **E1 长期漂移** | 1000 轮随机注入是否收敛? | 300 轮压测 → 48 记忆(≤池×3)、plateau、LEI GREEN、avg_stab 0.80 ✅ |
129
+ | **E4 向量对照** | 与向量方案同台,液环赢在哪? | 最强 baseline(向量+recency+slot) 在常规更新已追平(0/36);**唯 S4 单条噪声注入失守 5/6,液环 0/6** ✅ |
100
130
 
101
131
  ```bash
102
- python3 examples/experiments/run_all.py # 生成 REPORT_v0.8.json
132
+ python3 examples/experiments/run_all.py # E1/E2/E3 → REPORT_v0.8.json
133
+ python3 examples/experiments/vector_vs_liquid_drift.py # E4 向量对照(零依赖,独立可跑)
103
134
  ```
104
135
 
136
+ > **真实管线版 E4(推荐先看这个)**:`examples/faithful/faithful_e4.py` 用**真实**
137
+ > `selfspin.LiquidSelfSpin` + **真实** `workspace.WorkspaceState`(非裸内核),验证
138
+ > "改写 + 噪声输入下的端到端行为",并演示 selfspin「字符重叠聚类」的盲区边界
139
+ > (词汇不重叠的同义 → 无法成核 → 事实流失)。stdlib-only、零依赖,**直接用任意 python3 跑(无需 venv)**:
140
+ > ```bash
141
+ > python3 examples/faithful/faithful_e4.py
142
+ > ```
143
+
105
144
  ---
106
145
 
107
146
  ## 快速开始
@@ -168,47 +207,9 @@ liquid-loop snapshot
168
207
 
169
208
  ---
170
209
 
171
- ## MESH 集成(多智能体共识)
172
-
173
- 液环从 v0.7.0 起内置官方 MESH 集成 `liquid_loop.mesh`,把"多智能体共识协议"落地为可复用代码,作为 agent-mesh 节点的标准接入层。
210
+ ## MESH 集成与 A2A 桥接(已移除)
174
211
 
175
- ```python
176
- from liquid_loop.mesh import validate_evidence, compute_cci, cognitive_health, fetch_state
177
-
178
- # agent 写入前契约自检(零向量:content 必须精确字符串,禁 embedding)
179
- ok, errs = validate_evidence({"agent_id": "vera", "content": "用户偏好简洁输出"})
180
-
181
- # 从 8790 拉取记忆状态,算主体间性共识指数 CCI
182
- items = fetch_state("http://127.0.0.1:8790")
183
- health = cognitive_health(items)
184
- print(health["CCI"], health["consensus_crystals"])
185
- ```
186
-
187
- 零向量哲学:一致性判定走**结构化精确相等 + 审计链哈希**,绝不引入任何 embedding / 相似度。规范详见 `mesh/liquid_loop_mesh_v2_spec.md`。
188
-
189
- ---
190
-
191
- ## 固态 A2A 通道(任意 MCP 客户端接入)
192
-
193
- 把共享液环后端(地址由环境变量 `LIQUID_LOOP_BASE` 决定,默认 `http://127.0.0.1:8790`)封装成一个
194
- **stdio JSON-RPC 的 MCP server**,让任意支持 Model Context Protocol 的客户端(本例以 TRAE SOLO CN 演示)
195
- **原生读写同一份共享记忆**——这就是多 agent 间的固化(solidified)A2A 通道。
196
-
197
- > 后端说明:桥接只做协议翻译,**不内置 8790 服务**;后端由你自己部署(运行你自己的液环 SSE 服务,
198
- > 把地址通过 `LIQUID_LOOP_BASE` 传给桥接)。成核 / 共识 / 审计链全部由后端按液环理论执行。
199
-
200
- ```bash
201
- # 在你的 MCP 客户端注册该 server(以 TRAE 为例;其 code CLI 路径随安装而异,请替换为你的路径)
202
- export PY=python3 # 任意 Python 3.10+ 解释器
203
- export SVR=examples/trae_mesh_mcp/mcp_server.py # 本仓库内路径
204
- export LIQUID_LOOP_BASE=http://127.0.0.1:8790 # 改成你的后端地址
205
- "<path-to-your-trae-code-cli>" \
206
- --add-mcp '{"servers":{"liquidloop-mesh":{"command":"'"$PY"'","args":["'"$SVR"'"]}}}'
207
- ```
208
-
209
- 桥接暴露 `liquidloop_remember` / `liquidloop_recall` / `liquidloop_metrics` 三个工具(写入**必须声明 `agent_id`**)。
210
- 压测脚本与运维说明见 [`examples/trae_mesh_mcp/README.md`](examples/trae_mesh_mcp/README.md)
211
- (直连 + 经桥双路并发,零丢写 / 共识幂等 / 崩溃恢复三关全 PASS;所有路径走环境变量,适配不同部署拓扑)。
212
+ > ⚠️ `liquid_loop.mesh`(多智能体共识协议)与 `examples/trae_mesh_mcp`(stdio MCP 桥接 demo)已于 v0.7.x 后从发行包移除(commit `ac7260e`,过度工程化过滤)。相关 API(`validate_evidence` / `compute_cci` / `cognitive_health` / `fetch_state`)与桥接代码当前不在仓库中;"多 Agent 共享认知"仍属理论目标,未随包发布。
212
213
 
213
214
  ---
214
215
 
@@ -229,7 +230,7 @@ export LIQUID_LOOP_BASE=http://127.0.0.1:8790 # 改成你的后端地址
229
230
  ↓
230
231
  Memory State ←──────────────┐
231
232
  ↓ │
232
- LEI Evaluation (八维熵) │
233
+ LEI Evaluation (九维熵) │
233
234
  ↓ │
234
235
  Decay / Reinforcement ────────┘
235
236
  ↓
@@ -282,22 +283,32 @@ Liquid Loop 是唯一完全自组织 + 零 LLM 管理的系统。
282
283
 
283
284
  ```
284
285
  liquid-loop/
286
+ ├── liquid_core.py # ★ 215 行零依赖最小内核(单文件可跑,读它就懂全部机制)
287
+ ├── WHY_NO_VECTOR.md # ★ 禁向量的完整论证 + 对照实验数据 + 适用边界
285
288
  ├── liquid_loop/
286
289
  │ ├── __init__.py # 公共 API 导出
287
290
  │ ├── workspace.py # 核心数据模型 + AuditChain + auto_classify + decay
288
291
  │ ├── storage.py # JSON 持久化 + 审计链写入
289
- │ ├── entropy.py # 八维熵值计算(含 CPE 三维)
290
- │ ├── mesh/ # MESH v2 多智能体共识协议集成(validate_evidence / compute_cci / ...)
292
+ │ ├── entropy.py # 九维熵值计算(6 基础 + CPE 三维)
291
293
  │ └── cli.py # Click CLI (11 命令)
292
294
  ├── examples/
293
- │ └── quickstart.py
294
- ├── tests/ # 待补充
295
+ │ ├── quickstart.py
296
+ │ ├── experiments/
297
+ │ │ ├── e1_drift.py / e2_recovery.py / e3_conflict.py # 液环自证实验
298
+ │ │ └── vector_vs_liquid_drift.py # ★ E4 向量对照(零依赖·核心机制 demo)
299
+ │ └── faithful/
300
+ │ └── faithful_e4.py # ★ 真实管线 E4(selfspin→WorkspaceState,零依赖 无污染)
301
+ ├── tests/
295
302
  ├── pyproject.toml
296
303
  ├── README.md
297
304
  ├── LICENSE
298
305
  └── CHANGELOG.md
299
306
  ```
300
307
 
308
+ > **`liquid_core.py` 与完整版行为一致性已验证**:结晶 / 反证 / 共识轨 / step 衰减
309
+ > 四场景 stability 数值完全相同(4/4 PASS)。内核是可信的教学与审计入口,
310
+ > 不是简化到失真的玩具。
311
+
301
312
  ---
302
313
 
303
314
  ## 开发
@@ -313,7 +324,7 @@ pytest -v
313
324
 
314
325
  ## 路线图
315
326
 
316
- - [x] 多 Agent 液环耦合(`liquid_loop.mesh` v2 共识协议,2026-07-15 落地)
327
+ - [ ] 多 Agent 液环耦合(`liquid_loop.mesh` 已移除,见 commit ac7260e)
317
328
  - [x] **[v0.8] 反证轨(Evidence Graph)**:Evidence 分 support / contradiction,一致增稳、冲突降稳,驱动 memory stability score(不再"一致即真")
318
329
  - [x] **[v0.8] 显式时间动力学**:`M(t+1) = M(t) + reinforcement − decay − contradiction_penalty`,让记忆成为"过程"而非"对象"(真正的液态循环)
319
330
  - [x] **[v0.8] 三实验全 PASS**:E2 错误记忆恢复 → E3 多 agent 冲突 → E1 长期漂移(见上节)
@@ -1,5 +1,5 @@
1
- """Liquid Loop — Workspace Cognitive Runtime v1.1.0 (v1.0.0 + 液态重排引擎 Liquid Reweight: τ(x)黏滞唤醒 + 液态召回, 实证 97% 精度)"""
2
- __version__ = "1.4.0"
1
+ """Liquid Loop — Workspace Cognitive Runtime v1.8.2 (禁向量·活态液态神经网络:成核门槛/反证轨/老化回收/原理优先成核/因果演化/软取代supersede+治理查询state_at/impact/duplicates)"""
2
+ __version__ = "1.8.2"
3
3
 
4
4
  from .workspace import (
5
5
  WorkspaceState, Anchor, Evidence, Memory, Conflict,
@@ -87,7 +87,7 @@ def init():
87
87
 
88
88
  @main.command()
89
89
  def status():
90
- """显示当前认知状态(CPE八维熵值)"""
90
+ """显示当前认知状态(CPE九维熵值)"""
91
91
  s = _load()
92
92
  ent = calculate(s)
93
93
  level = "GREEN" if ent < 0.3 else ("YELLOW" if ent < 0.6 else "RED")
@@ -96,7 +96,7 @@ def status():
96
96
  click.echo(f"熵值: {ent:.4f} [{level}] | 最新活动: {latest_ev}")
97
97
  click.echo(f"CPE干预: {s.cpe_regularization_count}次 | 版本: {s.version}")
98
98
 
99
- # 八维熵值快速
99
+ # 九维熵值快速
100
100
  det = calculate_detail(s)
101
101
  click.echo(f" [原五维] 漂移{det['anchor_drift']:.2f} 冲突{det['conflict_density']:.2f} 碎片{det['evidence_fragmentation']:.2f} 活动{det['activity_gap']:.2f} 价值{det['value_decay']:.2f}")
102
102
  click.echo(f" [CPE三维] 回顾{det['cpe_retrospective_decay']:.2f} 漂移{det['cpe_behavioral_drift']:.2f} 泛化{det['cpe_generalization_erosion']:.2f}")
@@ -235,7 +235,7 @@ def relation_list():
235
235
 
236
236
  @main.command()
237
237
  def check():
238
- """检查工作区熵值(八维)"""
238
+ """检查工作区熵值(九维)"""
239
239
  s = _load()
240
240
  det = calculate_detail(s)
241
241
  ent = det["combined"]
@@ -501,10 +501,10 @@ def cpe_status():
501
501
  else:
502
502
  click.echo(f" 活跃侵蚀告警: 无")
503
503
 
504
- # 八维熵值详情
504
+ # 九维熵值详情
505
505
  from .entropy import calculate_detail
506
506
  det = calculate_detail(s)
507
- click.echo(f"\n━━━ 八维熵值详情 ━━━")
507
+ click.echo(f"\n━━━ 九维熵值详情 ━━━")
508
508
  click.echo(f" 综合熵: {det['combined']:.4f}")
509
509
  click.echo(f" ── 基础五维 ──")
510
510
  click.echo(f" 锚点漂移: {det['anchor_drift']:.4f}")
@@ -519,57 +519,13 @@ def cpe_status():
519
519
  click.echo(f" 泛化崩塌(CPE): {det['cpe_generalization_erosion']:.4f}")
520
520
 
521
521
 
522
+ @main.command()
523
+ def version():
524
+ """显示当前版本号"""
525
+ from . import __version__
526
+ click.echo(f"liquid-loop {__version__}")
527
+
528
+
522
529
  if __name__ == "__main__":
523
530
  main()
524
531
 
525
- @cli.command()
526
- @click.argument("content")
527
- @click.option("--evidence-ids", help="证据ID列表,逗号分隔")
528
- def memory_add(content: str, evidence_ids: str):
529
- """添加一条记忆结晶"""
530
- state = load_state()
531
- eids = [eid.strip() for eid in evidence_ids.split(",")] if evidence_ids else None
532
- state.add_memory(content, eids)
533
- save_state(state)
534
- click.echo(f"Memory added: {content[:50]}...")
535
-
536
- @cli.command()
537
- def memory_list():
538
- """列出所有记忆结晶"""
539
- state = load_state()
540
- if not state.memories:
541
- click.echo("No memories yet")
542
- return
543
- for m in state.memories:
544
- click.echo(f" {m.id[:8]} | conf={m.confidence:.2f} | {m.content[:60]}...")
545
-
546
- @cli.command()
547
- @click.argument("anchor_id")
548
- def conflict_resolve(anchor_id: str):
549
- """标记冲突为已解决(移除该锚点的冲突记录)"""
550
- state = load_state()
551
- before = len(state.conflicts)
552
- state.conflicts = [c for c in state.conflicts if c.anchor_a != anchor_id]
553
- after = len(state.conflicts)
554
- save_state(state)
555
- click.echo(f"Resolved {before - after} conflict(s) for anchor {anchor_id}")
556
-
557
- @cli.command()
558
- @click.argument("anchor_id")
559
- @click.argument("description")
560
- def anchor_describe(anchor_id: str, description: str):
561
- """手动设置锚点描述"""
562
- state = load_state()
563
- anchor = next((a for a in state.anchors if a.id == anchor_id or a.name == anchor_id), None)
564
- if not anchor:
565
- click.echo(f"Anchor not found: {anchor_id}")
566
- return
567
- anchor.description = description
568
- save_state(state)
569
- click.echo(f"Anchor '{anchor.name}' description updated")
570
-
571
- @cli.command()
572
- def version():
573
- """显示版本号"""
574
- from . import __version__
575
- click.echo(f"liquid-loop {__version__}")
@@ -52,7 +52,7 @@ def activity_gap(state: WorkspaceState) -> float:
52
52
  return min(gap / timedelta(days=7), 1.0)
53
53
 
54
54
 
55
- # 熵值分量(综合见 calculate,八维加权含 CPE 三维)
55
+ # 熵值分量(综合见 calculate,九维加权含 CPE 三维)
56
56
 
57
57
  def value_decay_entropy(state: WorkspaceState) -> float:
58
58
  """锚点价值衰减熵。0=全部高价值, 1=全部低价值 — 纯函数,不改 state"""
@@ -173,7 +173,7 @@ def cpe_dimension_entropy(state: WorkspaceState) -> dict:
173
173
 
174
174
 
175
175
  # ==============================================================================
176
- # 综合熵值(八维加权 — CPE三维 + 原六维去重后五维 = 八维)
176
+ # 综合熵值(九维加权 — 六维基础 + CPE三维 = 九维)
177
177
  # ==============================================================================
178
178
 
179
179
  def calculate(state: WorkspaceState,
@@ -182,9 +182,9 @@ def calculate(state: WorkspaceState,
182
182
  w_decay: float = 0.10, w_strength: float = 0.10,
183
183
  w_retro: float = 0.15, w_behavior: float = 0.10,
184
184
  w_generalize: float = 0.10) -> float:
185
- """综合熵值 0.0-1.0(八维加权 — 新增CPE三维)
185
+ """综合熵值 0.0-1.0(九维加权 — 新增CPE三维)
186
186
 
187
- CPE 三维权重合计 0.35,与原五维(0.65)形成均衡。
187
+ CPE 三维权重合计 0.35,与六维基础(0.65)形成均衡。
188
188
  """
189
189
  return (
190
190
  w_drift * anchor_drift(state) +
@@ -200,7 +200,7 @@ def calculate(state: WorkspaceState,
200
200
 
201
201
 
202
202
  def calculate_detail(state: WorkspaceState) -> dict:
203
- """返回八维详细熵值(用于 display 和诊断)"""
203
+ """返回九维详细熵值(用于 display 和诊断)"""
204
204
  return {
205
205
  "anchor_drift": anchor_drift(state),
206
206
  "conflict_density": conflict_density(state),
@@ -20,7 +20,13 @@ import time
20
20
  from datetime import datetime
21
21
 
22
22
  # ── token / entity extraction ──────────────────────────────
23
- _TOKEN = re.compile(r"[a-z0-9_]+", re.I)
23
+ _TOKEN = re.compile(r"[a-z0-9_]+|[\u4e00-\u9fff]", re.I)
24
+ # 中文按单字切(与 selfspin 同源字符级:中文单字 + 英数串),虚词/高频字作
25
+ # 停用过滤,避免噪声。此前仅 [a-z0-9_]+ → 中文 _tokens 恒空 → 中文检索失效。
26
+ _CJK = re.compile(r"[\u4e00-\u9fff]")
27
+ _STOP_CJK = set(
28
+ "的了吗呢吧啊哟哦嗯是与我不人都和也就很着没看说自己这那它她什么怎么哪"
29
+ )
24
30
  _NAME = re.compile(r"\b([A-Z][a-z]+(?:\s+[A-Z][a-z]+){0,3})\b")
25
31
  _ACR = re.compile(r"\b([A-Z]{2,6})\b")
26
32
  _DATE = re.compile(
@@ -98,8 +104,15 @@ def _struct_entities(text: str) -> set:
98
104
 
99
105
 
100
106
  def _tokens(text: str) -> set:
101
- return {t.lower() for t in _TOKEN.findall(text or "")
102
- if len(t) >= 3 and t.lower() not in _STOP}
107
+ out: set = set()
108
+ for t in _TOKEN.findall(text or ""):
109
+ tl = t.lower()
110
+ if _CJK.match(t): # 中文单字:保留(过滤虚词)
111
+ if tl not in _STOP_CJK:
112
+ out.add(tl)
113
+ elif len(tl) >= 3 and tl not in _STOP: # 英文 / 数字:原逻辑
114
+ out.add(tl)
115
+ return out
103
116
 
104
117
 
105
118
  def _jaccard(a: str, b: str) -> float:
@@ -44,6 +44,7 @@ import re
44
44
  import json
45
45
  import time
46
46
  import hashlib
47
+ import logging
47
48
  import argparse
48
49
  import urllib.request
49
50
  import urllib.error
@@ -174,6 +175,7 @@ class LiquidSelfSpin:
174
175
  # 液态重排持久化(v1.2.0):激活态跨会话保持「活」
175
176
  self.liquid_persist = True
176
177
  self.liquid_cache_dir = os.path.expanduser("~/.liquidloop")
178
+ self._persist_errors = 0 # 持久化失败计数(去吞错:让故障可观测)
177
179
  self._lr = None # 持久化 LiquidReweight 实例(懒构造,复用跨 recall)
178
180
 
179
181
  # ── 本地快自转:摄入 ──
@@ -192,8 +194,10 @@ class LiquidSelfSpin:
192
194
  for f in self._facts[report_id]:
193
195
  lr.propagate(self._liquid_anchor_id(f), f, steps=1)
194
196
  lr.save()
195
- except Exception:
196
- pass
197
+ except Exception as e:
198
+ self._persist_errors += 1
199
+ logging.getLogger(__name__).warning(
200
+ "liquid persist failed for %s: %s", report_id, e)
197
201
  return len(self._facts[report_id])
198
202
 
199
203
  # ── 液态重排持久化支持(v1.2.0)──