cambridgetcg/ww3-intelligence
GitHub: cambridgetcg/ww3-intelligence
一个本地优先的地缘政治观测框架,通过不可变账本和确定性投影实现可审查的证据收集与解读。
Stars: 0 | Forks: 0
# WW3 观测框架
一个小型、本地的框架,用于收集地缘政治源记录,并
在其基础上构建可检查的解读。
默认产物是一个不可变的观测账本以及确定性的
源投影。它不是预言机,也不需要 LLM、
仪表板、后台服务或向量数据库。
版本化的源和行动者注册表添加了明确的发布者、编辑控制、
权限范围和身份上下文。它们不包含任何真实性、可信度、
权力、可靠性或动机评分。这里的源身份仅指
根据本地注册表中的 HTTPS 规范 URL 主机检查的声明的源 ID;
它不是发布者或传输身份验证。
## 默认数据流
```
bounded source adapter / agent JSON
↓
immutable Observation
↓
versioned source projection ──→ CLI / JSON / optional terminal or dashboard UI
├── explicit casefile ──→ passages + source context + actor mentions
│ ├── optional local RhetorLint marks
│ └── assessment validation
└── explicit model opt-in ──→ AnalysisRun → derived Event/branches
```
SQLite 是规范的。投影是已存储
Observation 的可重现视图,而不是另一个已存储的声明。Event JSONL 文件仅属于
可选的模型派生兼容层。
## 轻量级路径
核心安装包含 Click、Peewee、Requests、feedparser 和
python-dotenv。它可以:
- 获取有界的 USGS 或 RSS 批次,一次获取一个新闻源;
- 获取有界的 GDACS 多重灾害记录;
- 接受来自文件或标准输入的标准化 JSON 记录或 JSON 数组;
- 标准化并追加不可变的 Observation,并进行精确内容去重;
- 将同一源记录下更改的内容链接为修订;
- 渲染有界的、JSON 安全的结构化源字段(带有特定于源的
小型测量/警报事实投影),无需推断;
- 暴露可供 Agent 读取的观测收件箱和解读输出;
- 构建有界的案例文件,包含确切的可见段落、声称的源/主机
一致性上下文,以及保守的已注册行动者别名匹配。
它不分配重要性、可信度、地缘政治类别、
确认、权力、升级、影响、意图或概率。行动者匹配
仅标识可见的文本跨度。这些分析性声明保留在显式
评估或可选的模型派生层中。
## 安装
仅核心收集和投影:
```
python -m venv .venv
.venv/bin/pip install -r requirements.txt
cp .env.example .env
```
可选表面是独立的,这样收集器就不会引入 Pandas、
Plotly、Streamlit、Rich 或测试栈:
```
.venv/bin/pip install -r requirements-tui.txt
.venv/bin/pip install -r requirements-dashboard.txt
.venv/bin/pip install -r requirements-dev.txt
```
## 收集与解读
预览真实的源获取,而无需打开或修改 SQLite:
```
.venv/bin/python ww3.py ingest usgs --dry-run
.venv/bin/python ww3.py ingest gdacs --dry-run --limit 50
.venv/bin/python ww3.py ingest news --dry-run --limit 100
```
无需模型工作即可捕获记录:
```
.venv/bin/python ww3.py ingest usgs
.venv/bin/python ww3.py ingest gdacs --limit 100
.venv/bin/python ww3.py ingest news --limit 200
.venv/bin/python ww3.py observations
.venv/bin/python ww3.py observations --json
.venv/bin/python ww3.py interpret OBSERVATION_ID
.venv/bin/python ww3.py interpret OBSERVATION_ID --json
```
无需打开 SQLite 即可检查版本化注册表:
```
.venv/bin/python ww3.py sources
.venv/bin/python ww3.py sources --json
```
活动的 RSS 集合区分了新闻编辑室报道、第一方声明和
`institutional-publication` 记录。USGS 提供主要测量数据,
GDACS 提供 `automated-alert` 记录。这些角色描述的是记录本身,而
不是其真实性或可信度。第一方或机构发布可以
证明一个行动者在其权限范围内发布、宣布或执行了某事;
它不能证明发布内的每一项声明都是真实的。
同样,多个发布者本身并不能建立独立的佐证:它们可能共享一个通讯社、
引用同一个来源,或者重复相同的声明。
Agent 和本地工具可以将单个记录或数组直接通过管道传输到同一个
收集边界:
```
printf '%s' '{"source":"manual","type":"statement","raw_text":{"title":"Source statement"}}' \
| .venv/bin/python ww3.py capture --json
```
最低输入契约是 `source`、`type` 和 `raw_text`。`raw_text` 可以
是字符串或 JSON 值。有用的可选字段包括 `source_record_id`、
`canonical_url`、`published_at`、`fetched_at`、`location_name`、`geo_lat`、
`geo_lon`、`source_confidence` 和 `synthetic`。
`capture` 每次调用最多接受 16 MiB 和 1,000 条记录。较大的 Agent
导出应拆分为明确的批次。
`source_confidence` 是一个遗留的由收集器提供的捕获/解析提示。新的 RSS、
USGS 和 GDACS 适配器将其设置为 `not-assessed`。它不是源可信度、
事实置信度、佐证或真实性。
## 案例文件、修辞与评估
从明确的 Observation ID 构建确定性的证据包,或者省略
ID 以使用最新的有界集合:
```
.venv/bin/python ww3.py casefile 17 23 41 --json
.venv/bin/python ww3.py casefile --limit 20 --json
```
案例文件包含源上下文、声称的 ID/规范主机一致性
状态、有界的可见文本段落、稳定的段落 ID,以及已注册行动者的
提及跨度。只有那些声称的源 ID 具有 HTTPS 规范主机且与注册表一致的
非合成记录,才会计入已知的发布者、
编辑控制组和内容角色计数中。缺失、不安全、不匹配、
未注册或无法验证的主机则不会计入。即使是一致的主机也不是
加密发布者身份验证,也不能证明注册的收集器
获取了该记录;生成的发布者/控制组计数并不是
佐证结果。
行动者匹配是有界的,且可能不完整。每次观测的扫描元数据
和案例文件 `actor_visibility_status` 会报告截断情况。提及量和
输出的顺序是所选文本中的可见性,而不是完整的行动者列表或
权力、责任、同意或意图的衡量标准。
案例文件最多接受 100 个唯一的已存储 Observation,当省略 ID 时
默认为最近的 20 个。`--rhetorlint` 的上限为 8 个 Observation、
16 MiB 返回的注解 JSON,以及跨案例文件的 8,192 个标记。
对于每个 Observation,桥接器最多分析 8 个段落和 64 KiB 的
可见文本,具有 5 秒的本地运行时超时。
RhetorLint 是一个独立的、显式的本地注解步骤:
```
.venv/bin/python ww3.py rhetoric OBSERVATION_ID --json
.venv/bin/python ww3.py casefile 17 23 --rhetorlint --json
```
桥接器会在 `../rhetorlint-spec` 发现同级检出,或者读取
显式的 `RHETORLINT_ROOT`。`RHETORLINT_NODE` 可以选择一个 Node 可执行文件;
否则将从 `PATH` 中解析 `node`。它会验证并记录本地的
reference-core 和 English-rules 哈希值,然后从
一次性临时快照中执行确切的副本。桥接器本身没有 npm/npx/download 路径,但
`RHETORLINT_ROOT` 和 `RHETORLINT_NODE` 选择的代码将以
当前用户的权限执行。这是一个受信任的本地代码边界,而不是
文件系统、进程或网络沙箱;请仅使用您信任的检出和可执行文件。
RhetorLint 在可见的源文本中标记语言模式。它的标记并不代表
真实性、欺骗性、可信度、行动者意图或佐证的发现,并且
零匹配仅意味着当前的 English 规则未匹配到任何内容。
RhetorLint `strip` 输出被故意省略,因为删除诸如
“reportedly”或“allegedly”之类的词可能会抹除证据限定词。
然后,可以将 Agent 或人工评估与不可变的案例文件进行核对:
```
.venv/bin/python ww3.py validate-assessment assessment.json
.venv/bin/python ww3.py validate-assessment assessment.json --json
cat assessment.json | .venv/bin/python ww3.py validate-assessment - --json
```
`ww3.assessment/v1` 验证器要求每个声明引用确切的段落
跨度,并命名其已注册的 `subject_actor_ids`。说话者/记者/发布者
归属是独立的;发布者模式另外还需要匹配的
注册表发布者和 HTTPS 规范主机一致性,这仍然不是身份验证。
权力仅表示为与证据相关联的基础,绝不是分数。每个
条目都有一个唯一的 `power_basis_id`,并标识一个行动者、领域、
`time_scope`、工作流状态、限制和证伪条件。其必需的 `scope`
对关系进行分类,并列出地理位置、操作和相关的
已注册行动者;双边杠杆必须准确命名一个交易对手。每个
相关行动者必须与焦点行动者共同出现,既作为声明主体
也作为可见别名,并以逐字记录的支撑能力证据呈现。这可以防止
情境能力悄然变成普遍的权力声明。意图是一个
可证伪的假设,具有唯一的 `hypothesis_id`、`rationale`、`time_scope`、工作流状态和证据
链接,这些链接声明为 `supports` 或 `contradicts` 并附带理由。至少有一个
支撑性声明必须是逐字记录的行动/公开立场/否认证据,其
确切跨度明确指出了行动者的姓名;仅凭能力或转述是无效的。
备选项和证伪条件是
必需的,并且故意没有设计意图置信度或概率
字段。成功的验证建立的是结构性证据链接,而不是表明
声明、权力基础或假设是真实的。请参阅 `spec/assessment.schema.json`
和 `spec/README.md`。
## 可选的模型派生分析
模型分析需要两个独立的选择:
1. 显式运行 `analyze-observation ID` 或传递 `ingest --analyze`;以及
2. 显式设置 `WW3_DISABLE_LLM=0`(也接受 `false`、`no` 或 `off`)。
```
.venv/bin/python ww3.py analyze-observation OBSERVATION_ID
.venv/bin/python ww3.py runs
.venv/bin/python ww3.py list
.venv/bin/python ww3.py provenance EVENT_ID
```
仅启用该设置永远不会触发分析。如果分析被禁用或
本地 Claude CLI 不可用,CLI 将在声称创建了
AnalysisRun 之前退出。现有的隔离租约、schema 验证、单源
确认上限和原子 Event/branch 写入仍然有效。
`migrate-legacy-event EVENT_ID` 仅用于旧的 `RawLeaf` 行。它不是
正常的观测分析命令。
迁移注意事项:先前的 `analyze EVENT_ID` 命令现在是
`migrate-legacy-event EVENT_ID`,除非提供 `--analyze`,否则普通的 `ingest SOURCE` 不再创建
派生的 Events。请更新任何本地脚本,以便在新路径中使用带有 `analyze-observation` 的 Observation ID。
## 命令效果
| 命令 | 外部网络 | 本地写入 | 模型 |
|---|---|---|---|
| `ingest SOURCE --dry-run` | 选择的源 HTTP | 无 | 从不 |
| `ingest SOURCE` | 选择的源 HTTP | Observations | 从不 |
| `sources` | 无 | 无 | 从不 |
| `capture` | 无 | Observations | 从不 |
| `observations`, `interpret` | 无 | 若账本不存在则初始化;否则读取 | 从不 |
| `casefile ...` (不带 rhetoric) | 无 | 若账本不存在则初始化;否则读取 | 从不 |
| `rhetoric ID`, `casefile --rhetorlint` | 无桥接获取;配置的代码不受网络限制 | 账本初始化加上不受限制的本地代码;WW3 不存储任何注解 | 无 WW3 模型调用;配置的代码不受限制 |
| `validate-assessment FILE` | 无 | 初始化账本;评估结果不存储 | 从不 |
| `feed --watch` | USGS/RSS/GDACS HTTP | Observations | 从不 |
| `analyze-observation ID` | 本地 Claude 可能会联系其提供商 | AnalysisRun, Event/branches, event JSONL | 显式调用 |
| `ingest SOURCE --analyze` | 源 HTTP 加模型提供商 | Observations 和派生分析 | 显式调用 |
可选的终端源信息流优先收集:
```
.venv/bin/python ww3.py feed
.venv/bin/python ww3.py feed --watch
```
监视器故意没有分析模式。请单独分析选定的 Observation
ID,以便收集间隔不会被长时间的模型调用所拖延。
它为 USGS(5 分钟)、RSS(10 分钟,共 200 条
记录)和 GDACS(15 分钟,50 条记录)保持独立的有界循环。
可选仪表板在 Source Observations 页面上启动:
```
.venv/bin/streamlit run dashboard/app.py
```
## 已发布的文档
GitHub Pages 在
上发布静态文档/规范界面。部署仅复制
`site/` 下的文件以及源注册表、行动者注册表和评估
JSON Schema。它不托管 Python 收集器、SQLite 账本、信息源、
observations、RhetorLint 进程、仪表板或模型派生分析。
`.github/workflows/pages.yml` 在推送到
`main` 后执行该有界部署。`.github/workflows/ci.yml` 单独运行隔离测试套件。
## 证据和能力限制
普通的收集/投影命令路径保证了框架代码
不会调用 Claude 或写入模型派生的 Events。它保留了有界的
源响应、不可变的标准化内容、捕获的出处、
精确内容去重以及 POSIX 权限适用时的仅限所有者的本地状态。
CLI 源收集默认每次运行 200 条记录。新闻将此上限分配给
配置的信息源;直接 RSS 适配器调用默认每个信息源 100 条
记录,直接 USGS 适配器调用默认为 200 条。调用者可以显式选择更小的有界
限制。
它不建立源真实性、真实性、佐证、独立性、
新鲜度、完整性、意图或权力。发布或颁布并不是
一揽子真实性发现;发布者的多样性不等于佐证;行动者提及
量不代表权力。规范主机一致性不是身份验证,并且
遗留的 `source_confidence` 不代表可信度。它尚未聚类
联合报道、保留每次重复获取或仅元数据的更改、
将 A→B→A 作为第三次出现保留、加密数据库、匿名化网络
流量,或施加通用的
内存/实际时间限制。HTTP 读取是有上限和计时的;解析器
仍然会将每个有界的响应实体化。信息源失败按源报告,
并不代表没有发生任何事件的证据。
活动的源和行动者注册表是有限的、手工整理的,目前
仅限英语。目前还没有实时验证的官方中国适配器或多语言
本地报告层。评估验证检查确切的谱系和
契约结构;它无法确定评估者是否选择了正确的
主体行动者、声明类型、证据效果、权力描述或意图
理由。
## 测试
```
.venv/bin/python -m pytest -q
```
该套件使用一次性的 DB 和流路径,阻止 DNS/socket 访问,
替换真实的 Claude 可执行文件,并验证收集操作永远不会写入
Event JSONL。它必须保持存储库中被忽略的数据库和流
不变。
## 现有本地数据
历史 SQLite 文件和 JSONL 状态被 Git 忽略,不会被测试重写。
现有的派生 Events 仍然可用。收集操作不会删除或重试较旧的
失败模型运行。历史虚构的地缘政治种子
脚本和报告被故意排除在公共源树之外。
标签:Python, SQLite, 地缘政治, 字符串匹配, 无后门, 本地优先, 逆向工具