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, 地缘政治, 字符串匹配, 无后门, 本地优先, 逆向工具