Skip to main content
Glama
README.md
# 推演沙盘 · 判断账本

简体中文 | [English](./README.en.md)

![Node](https://img.shields.io/badge/Node-%E2%89%A522.5-339933)
![MCP](https://img.shields.io/badge/MCP-21%E5%B7%A5%E5%85%B7-6C5CE7)
![平台](https://img.shields.io/badge/%E5%B9%B3%E5%8F%B0-Windows_%7C_macOS_%7C_Linux-2D7DD2)
![测试](https://img.shields.io/badge/%E7%94%A8%E4%BE%8B-1200%2B-4C9A2A)
![红线](https://img.shields.io/badge/%E7%BA%A0%E7%BA%A7-8_%E6%9D%A1-EB4D4B)
![License](https://img.shields.io/badge/License-Apache--2.0-EAC435)

> **记录你的判断,然后证明它没有说谎。**
>
> **把判断力做成契约,让任何 agent 都无法替你下结论。**

大部分「帮你猜」的 App 做的是让你**感觉**准一点。这个做的是相反的事:
**它不猜。它只做一件别人不做的事——记下你怎么想的,然后证明你事后没改口。**

```
   你写下一道题               它做的三件事
   ┌──────────────┐      ┌────────────────────────────────┐
   │ 明天上海最高  │      │  ①  记账  原样记下你的确信度     │
   │ 气温 > 35°C  │ ───▶ │       只写不改,每条带指纹       │
   │     60%      │      │  ②  判分  到期自动去查真值       │
   └──────────────┘      │       按题型分开算                │
                         │  ③  复盘  指出你系统性偏哪儿     │
   ┌──────────────┐      └────────────────────────────────┘
   │ Brier 0.2259 │ ◀───  「天气类你准,汇率类你说大了 19%」
   └──────────────┘
```

---

## 它解决什么问题

你一定有过这种时刻:

> 3 月觉得某只股票会涨。8 月回头看,跌了。
> 于是你悄悄把 3 月那条记录改成了「我觉得会跌」。

没有人会阻止你。Fitbit、Evernote、甚至你手机自带的备忘录,**都能改**——
因为拦你等于得罪用户。

**这本账不改。** 不是靠自律,是账本只写不改,每条记录都带指纹。

所以它能回答一个别人回答不了的问题:**你自己知道你在哪儿系统性看错吗?**

不是「你这次错了」——那是运气。**是「凡是遇到这类事,你就偏乐观」。**

---

## 它刻意不做的事(比上面那条更重要)

| 它不做 | 为什么 |
|---|---|
| ❌ 不替你猜 | 那是专家的事。它替你猜就等于替你说谎 |
| ❌ 不给建议 | 「该关注汇率」这类话是理财顾问的事,而且会误导人 |
| ❌ 不碰你的私钥 | 默认只在你自己的机器上跑 |
| ❌ 不承诺任何分数 | 下面那份成绩单很难看,但它是真的 |

★**你填的概率就是你的判断,一字不差。** 你写 60% 就是 60%,它不会偷偷改成 55%。

---

## 30 秒上手

```bash
git clone https://github.com/rui08984-dot/tuiyan-sandbox.git
cd tuiyan-sandbox
npm run bootstrap       # 一条命令装齐所有子包(引擎 / 后端 / 前端)
npm run doctor          # 看差什么、为什么、怎么办(三十秒)
cd p1b && node gates/gates.cjs   # 四道闸门
```

★**为什么要 `bootstrap` 而不是 `npm install`**:本仓库有**三个嵌套的 `package.json`**
(引擎 `p1a-terminal`、后端 `p1b`、前端 `p1b/web`),各自有各自的依赖树。
只装根目录的话,引擎和前端都不装,闸门会红在「原生模块不可 require / vite 找不到」——
而报错信息离根因很远。`bootstrap` 按依赖顺序一次装齐。

★**为什么要 `doctor`**:生产库(含真实玩家信息的那份)按设计**不入库**,
所以克隆下来缺它是正常的,一批读数会因此看不到数据。`doctor` 会直接告诉你缺什么、为什么、有三条路可走 ——
而不是让你在 `no such table: predictions` 里猜。

**不需要任何 API key。** 第一次启动是强制 mock 模式,你能用到全部只读功能。

Windows 用户也可以直接下载绿色包解压双击(见 [Releases](https://github.com/rui08984-dot/tuiyan-sandbox/releases))。

### 平台支持(只写验过的)

| 平台 | 状态 |
|---|---|
| **Windows x64** | ✅ 已验——四道闸门与发行体检全绿,绿色包在此构建 |
| macOS | ⚠️ **未验**(引擎理论上可用,缺原生模块实测) |
| Linux | ⚠️ **未验**(同上) |

★没验过的平台就写没验过。**把没做过的事写成做过了,是这个项目最不想要的一种错。**

---

## 五分钟看明白它怎么用

```
1. 写一道有答案的事      「明天下不下雨」
2. 写上你有多确信        60%
3. 到期了它自己去查真值   下雨了 / 没下
4. 跟你那个 60% 算个分
5. 攒够一批后告诉你      「天气类你准,汇率类你系统性说大了 19%」
```


---

### 六层分类是整个项目的骨架

**不是六个算法模型,是六种「这事到底能不能算」的判法。**

| 层 | 大白话 | 例子 | 你的分数 |
|---|---|---|---:|
| **L1 决定论** | 有确定答案,纯算 | 明年日食几号几分几秒 | **0.0000(满分)** |
| **L2 常态** | 有历史规律,取平均 | 某人平均投多少球 | 0.2403 |
| **L3 短窗** | 有机制但混沌 | 汇率、短期行情 | 0.2386 |
| **L4 自反** | 你的判断会改变结果 | 「我觉得这股票要跌」 | **不用**(会自我实现) |
| **L5 纯随机** | 数学上不可能赢 | 抛硬币、抽奖 | 0.1578 |
| **L6 对抗** | 有人在跟你对着干 | 博弈、谈判 | 0.1755 |

★**为什么必须分层**:L1 能拿满分,L5 数学上就赢不了。
把它们混在一起算一个总平均,等于**拿天气预报去跟抛硬币比**。
分了层你才知道「你在哪一层准、在哪一层根本不该指望准」。

---

## ★诚实成绩单(不好看,但是真的)

```
Brier 分    0.2259   vs  永远瞎填 50% 的 0.2500
           ★但跟「随手按你给的比例掷骰子」的 0.2267 —— 不可区分
账本条数   1994 条
你亲手写的 ★ 0 条
```

**读法**:这个项目现在测的是「你准不准」,答案基本是**「你和运气差不多」**。

等你在上面手写了几十条自己的判断,它才开始告诉你真正有用的东西。

★那 1994 条是机器灌的示范数据,**不是你的成绩**——首页会一直挂着这句话提醒你。

---

## 三种用法

### ① 当 app 用(最简单)

上面那个「30 秒上手」就是。适合:你只想自己用。

### ② 装进别的程序(MCP,最推荐)

```jsonc
// 你的 AI 客户端配置里加这段,它启动时会自动握手
{
  "mcpServers": {
    "p1b": { "command": "node", "args": ["/绝对路径/p1b-sandbox/p1b/mcp/index.cjs"] }
  }
}
```

装上之后你可以直接对它说:

| 你这么说 | 它会 |
|---|---|
| 「帮我记一道:明天会不会下雨」 | 归类 → 查拒收门 → 落进不可改的账本 |
| 「我在哪类事上偏得厉害」 | 按题型分开算,指出系统性偏差 |
| 「这题算不算随机」 | 六层判定 + 为什么这么判 |
| 「这批数据被改过吗」 | 冻结哈希 + 锚点闸 + 契约一致性 |

★**完整能力目录**(21 个工具 / 62 个 HTTP 端点 / 18 条命令,每条含「它不做什么」):
[能力目录](docs/mcp/CAPABILITY-CATALOG.md)

### ③ 当库用(最轻)

```js
const { rankHabits } = require('./p1b/src/disclosure/habitRank.mjs');
```

不用起服务、不用配任何东西。**想把打分逻辑塞进自己产品的人走这条最短。**

---

## ★8 条红线(对外版,可直接复制)

1. 生成的文本在**生成时**即写入元数据隐式标识,不做事后补写
2. 工具描述与返回文本中,**不出现荐下注语义**(荐下注语义 + 绝对化措辞,完整清单见 [RIGHTS](docs/RIGHTS.md))
3. **默认不联网。** 取数必须显式确认
4. 服务端强制出网白名单,不提供任何绕过反爬的路径
5. 外部价格/赔率原样返回并附来源与时间戳,标注为**「市场共识数据」**,不加工、不推断、不建议
6. **默认本地部署,不提供境外托管。** 你的账本默认不离开你的机器
7. 账本**不写入**姓名、邮箱、工号等可识别信息
8. **默认不记录调用方身份**,只保留不含身份的聚合统计

---

## 常见问题

**Q:它能提高我的判断力吗?**
A:能,但有前提。它给你的是**「你在哪类事上看多了」**——这个别的工具都不给。
但要拿到这个反馈,你得**自己手写几十条判断**。现在账本里真人写的还是 0 条。

**Q:为什么我的分数这么难看?**
A:因为好看是假的。它宁可难看也不好看。

**Q:数据会传到网上吗?**
A:不会。默认本地跑,不联网上报(只有你自己开 token 才会)。

**Q:我要不要填 API key?**
A:不要也能用,只读功能全部可用。填了 key 才能让 AI 帮你分析。

**Q:接自己的 AI 客户端会改我的数据吗?**
A:不会。21 个 MCP 工具里**真正能写账本的是 0 个**——写操作全部在确认闸后。

---

## 给开发者

先做一次体检——`node p1b/scripts/secret-preflight.cjs`(不联网、不打印密钥本体,只打指纹):

- `node scripts/plan-audit.cjs` —— 机械核对 30 项
- `cd p1b && node gates/gates.cjs` —— 四道闸门:后端 / 构建 / 前端 / 类型
- `node p1b/scripts/audit-release.cjs --tree out/p1b-sandbox-v0.1.1-win-x64` —— 发行体检 15 项

| 形态 | 数量 | 入口 |
|---|---:|---|
| HTTP 端点 | 62 | `p1b/src/routes/` |
| MCP 工具 | 21 | `p1b/mcp/`(★**0 个能真写账本**) |
| CLI 命令 | 18 | `p1b/cli/` |
| 取数源 | 53 | `docs/specs/kind-目录表.md` |
| 六层算子 | 6 | `p1b/src/engines/` |

★**联动组合**(直线/回溯/回环)含收敛条件与投毒测试:
[联动链与组合契约](docs/mcp/CHAIN-AND-COMPOSITION.md)

★**能力是怎么盘出来的**:158 个能力面逐行对账,**没有一项是凭印象写的**。

---

## 许可

Apache-2.0,见 [LICENSE](LICENSE)。商业形态与红线全文见 [docs/RIGHTS.md](docs/RIGHTS.md)。