elb-pr/sleuth
GitHub: elb-pr/sleuth
一套基于六阶段情报方法论的开源情报分析工具包,通过结构化工作流将散乱的公开信息调查转化为具备完整证据链和概率推理的专业级情报报告。
Stars: 18 | Forks: 4
Sleuth
非常适合记者、研究人员和私人调查员。
是的……也包括你。没关系。我开发了这个东西,我也不是其中任何一种人。
现在是晚上 11:14,星期二。十一月,这从凝结在玻璃边缘的水汽中显而易见,在画面底部的潮湿枝孢菌中形成水滴和缓慢的图案。公寓位于佩卡姆,三楼,唯一亮着的灯是台灯,投下一个可能被误认为是旧尼古丁污渍的黄色圆锥体,直接印在显示器正上方的墙上。显示器不予理会,用它自己的冷蓝色推回去。除了一对颧骨的边缘和偶尔被吸入丑陋颜色混合物中的一缕烟雾外,其他一切都处于一种特定的黑暗中。房间里散发着冷咖啡的气味,以及其背后微弱的有机物气息,这是建筑物在夜间的缓慢呼气,在过去两个小时里,Sarah 一直利用这两者来保持清醒。
Sarah Lawton 34 岁。她是一名自由调查记者,这在实践中意味着她独自工作,自费购买 PACER 的访问权限,并在十一年的时间里培养出了一种经过精细校准的直觉,能判断出一组数字何时在对她撒谎。她身材娇小,留着短发,有一种特定的静谧感,这是一种已经学会将耐心视为专业技能的人才有的特质。她的同事形容她“不屈不挠”。她的编辑形容她“委任她是一场噩梦,但不发表她的文章是不可能的”。她的屏幕上有一个名字,一家开曼群岛的公司注册信息,一个出现在三个不同司法管辖区且拼写略有不同的受益所有人,以及一系列无法完全自洽的转账记录。
她已经盯着这个看了六个小时。她打开了一个终端。
## 快速开始
### Claude Desktop、Mobile 和 Web
`skills/claude-sleuth` 文件夹作为 Claude 技能上传。Claude 会读取 SKILL.md。任务运行器随即激活。
### CLI
```
git clone https://github.com/elb-pr/claude-sleuth.git
cd claude-sleuth
pip install ".[all]"
python3 scripts/task_runner.py next
```
## 任务运行器
终端返回一行内容。任务 1.1。操作方向。在调查收集任何来源之前,它需要一个主题、一个 PLAN 文档和一组种子实体。Sarah 读了两遍。她在这个案子上工作了六个小时,却没有将这三样东西正式记录下来。她打开了一个新文件。
```
python3 scripts/task_runner.py next # read current task and required resources
python3 scripts/task_runner.py done # verify checklist, advance to next task
python3 scripts/task_runner.py status # progress overview by phase
python3 scripts/task_runner.py notebook # view the Investigation Notebook
python3 scripts/task_runner.py jump t6.2 # jump to a specific task
```
她花了四十分钟完成任务 1.1。她输入 `done`。清单上有七项。五项立即通过。第六项——PLAN 的正当性证明,即关于为什么这项调查符合公共利益的正式声明——需要重写。她重写了它。第七项通过。任务运行器前进到 1.2。
## 标准
到了午夜,她进入了第二阶段,而 Admiralty 评级标准是第一个让她慢下来的东西。
她在晚上 9 点找到的那个论坛帖子,上面有账号和一家空壳公司的名字,没有作者,没有日期,也没有佐证链接。`source_grader.py` 将其评定为 F-6。可靠性 F:无法评估来源。可信度 6:无法判断真实性。脚本没有争辩。它记录下该来源并将其搁置。在过去的两个小时里,Sarah 一直把那个帖子作为心理锚点。她删除了引用它的笔记,然后重新开始。
| 标准 | 用途 |
|---|---|
| **Admiralty 6x6** | 在任何主张进入记录之前,独立对来源的可靠性(A–F)和可信度(1–6)进行评级 |
| **ACH** | 通过不一致性原则得出结论——存活的假设是反对它的证据最少的 |
| **ICD 203** | 将所有概率语言映射到 7 级量表。不允许使用模糊的限定词 |
ICD 203 量表是第二个让她慢下来的东西。她输入“这些转账很可能与马耳他的控股公司有关”,但流水线不接受。“很可能” 不是一个标准术语。她看了一下量表。
| 术语 | 范围 |
|---|---|
| 几乎不可能 | < 5% |
| 非常不可能 | 5–20% |
| 不可能 | 20–45% |
| 一半一半 | 45–55% |
| 可能 | 55–80% |
| 非常可能 | 80–95% |
| 几乎肯定 | > 95% |
她想了一会儿。她输入:可能。55% 到 80%。流水线接受了。
## 流水线
六个阶段。每个阶段都取决于上一个阶段。
```
flowchart LR
P1["Phase 1\nOperational\nDirection"] --> P2["Phase 2\nIntelligence\nCollection"]
P2 --> P3["Phase 3\nCollation &\nEntity Resolution"]
P3 --> P4["Phase 4\nChronological &\nRelational"]
P4 --> P5["Phase 5\nHypothesis\nReasoning"]
P5 --> P6["Phase 6\nFinal Reporting"]
P1 -.- P1a["STEEPLES\nPLAN justification\nSeed entities"]
P2 -.- P2a["Source grading\nEvidence hashing\nTiered collection"]
P3 -.- P3a["POLE records\nFellegi-Sunter\nEntity resolution"]
P4 -.- P4a["UTC timeline\nDiGraph analysis\nMedia authentication"]
P5 -.- P5a["ACH matrix\nSensitivity analysis\nDeception analysis"]
P6 -.- P6a["ICD 203 briefing\nHash audit\nCSDb closure"]
```
阶段描述
阶段 1 是操作方向。调查确定其主题、范围及其结束的条件。STEEPLES 分析。PLAN 正当性证明。种子实体被记录并锁定。Sarah 在此花费了四十分钟,然后才被允许继续。
阶段 2 是情报收集。每个来源在证据进入记录之前都要进行评级。每条数据在捕获的瞬间都会进行哈希处理。Sarah 找到了一份 2019 年的 Companies House 文件,上面直接写明了受益所有人。它被评为 A-1。可靠性 A:来源可靠,毫无疑问。可信度 1:已由其他独立来源确认。哈希值被记录。监管链开始。
阶段 3 是整理与实体解析。到凌晨 12:30,Sarah 有十四条实体记录。其中两条有相同的名字、SE5 的一个地址以及一份 2019 年的公司注册信息,但其中一个姓氏拼写是双 n,另一个是单 n。她运行了 `entity_resolver.py`。Fellegi-Sunter 算法处理了完整记录并返回了 0.94 的匹配概率。它们是同一个人。记录被合并。调查继续使用十三个实体。
阶段 4 是时间和关系处理。从经过验证的事件中构建 UTC 时间线。当 Sarah 发现 2021 年 3 月到 7 月之间存在空白时,她将其记录为一个空白。她没有用伪装成事实的推断去填补它。她将其标记为一条调查线索并继续前进。
阶段 5 是假设推理。Sarah 有两个假设。第一个:这些转账是一个避税结构,激进但合法。第二个:它们是逃避制裁计划的一部分。ACH 矩阵测试每一个假设,不是寻找支持它的证据,而是寻找反驳它的证据。有三条证据与假设 1 不一致。有一条证据与假设 2 不一致。假设 2 存活下来。
阶段 6 是最终报告。符合 ICD 203 标准的简报。SHA-256 哈希审计。监管链完整,否则报告不能离开这个房间。
## 脚本参考
该工具包包含十五个 Python 脚本。
| 脚本 | 用途 |
|---|---|
| `task_runner.py` | 驱动 56 个任务的流水线(`next`、`done`、`status`、`jump`、`peek`、`notebook`、`reset`) |
| `template_builder.py` | 按阶段、步骤或任务 ID 从 `templates/` 组装 Markdown 工作文档 |
| `source_grader.py` | Admiralty 6x6 来源可靠性和可信度评级,并附带行动建议 |
| `entity_resolver.py` | Fellegi-Sunter 概率记录链接;对唯一标识符进行确定性匹配 |
| `corporate_intel.py` | 聚合来自 UK Companies House、SEC EDGAR、GLEIF LEI 和 ICIJ Offshore Leaks 的公司数据 |
| `domain_intel.py` | 通过 DNS、RDAP、crt.sh、Shodan InternetDB 进行域侦察——无需身份验证 |
| `username_enum.py` | 使用 Maigret、Sherlock 或 WhatsMyName 在社交平台上进行异步用户名枚举 |
| `sanctions_screen.py` | 针对 OFAC SDN、UK HMT 及其他公共制裁名单进行模糊名称匹配 |
| `evidence_preservation.py` | 取证式网络捕获:屏幕截图、HTML、WARC、Wayback 提交、SHA-256 监管链 |
| `content_archiver.py` | 通过 yt-dlp、gallery-dl 和 Playwright 进行异步媒体下载和编目,并生成清单 |
| `chronological_matrix.py` | UTC 标准化时间线构建;空白检测、来源冲突标记、CSV 导出 |
| `network_graph.py` | 有向 POLE 关系图;入度/出度、PageRank、社区检测、HTML/GEXF 导出 |
| `geolocation.py` | EXIF GPS 提取、太阳位置/阴影分析、历史天气关联、反向地理编码 |
| `financial_analysis.py` | SEC EDGAR 财务异常检测:Benford's Law(本福特定律)、同比差异、Altman Z-Score |
| `report_generator.py` | 通过 Jinja2 模板生成符合 ICD 203 标准的简报和调查结果备忘录;可选 WeasyPrint PDF 导出 |
凌晨 1 点,Sarah 对目标公司的 SEC EDGAR 文件运行了 `financial_analysis.py`。Benford's Law 标记了三年报告交易中首位数字的分布。数字 1 的预期频率为 30.1%。观测到的频率为 14.3%。脚本将其标记为异常,并以置信度记录了该发现。她盯着它看了很久。然后她打开笔记本,输入了一条新记录。
## 安装
Python 3.10 或更高版本。
### Claude Desktop、移动端或网页端
下载 zip 文件,或克隆仓库,然后将文件夹拖放到 Claude 中。
### CLI
```
git clone https://github.com/elb-pr/claude-sleuth.git
cd claude-sleuth
pip install .
pip install ".[all]"
pip install ".[geo,graph,sanctions,corporate]"
```
### 通过设置脚本
```
python3 scripts/setup.py --modules core geo graph sanctions corporate
python3 scripts/setup.py --list
python3 scripts/setup.py --dry-run all
```
可选依赖组
| 组 | 涵盖内容 |
|---|---|
| `identity` | Sherlock、Maigret——用户名枚举 |
| `social` | yt-dlp、gallery-dl、Playwright——社交媒体存档 |
| `network` | dnspython、ipwhois、tldextract——域名和基础设施 |
| `corporate` | edgartools——SEC EDGAR 财务文件 |
| `sanctions` | rapidfuzz、jellyfish——制裁名单的模糊名称匹配 |
| `geo` | geopandas、geopy、pysolar、exifread——地理定位和空间 |
| `nlp` | spaCy、NLTK、scikit-learn——实体提取 |
| `graph` | NetworkX、pyvis、Plotly——网络可视化 |
| `archiving` | waybackpy、warcio、trafilatura——证据保存 |
| `documents` | pdfplumber、pytesseract、Pillow——OCR 和文档处理 |
| `reporting` | Jinja2、WeasyPrint、docxtpl——HTML/PDF/Word 输出 |
| `entity_resolution` | recordlinkage——概率记录去重 |
## MCP 服务器
三个服务器。两个托管。一个自托管。服务器 URL 位于 `.claude/mcp.json` 中。
| 服务器 | 用途 | 链接 |
|---|---|---|
| **Thinking Toolkit** | 12 种技术的推理框架。在任何僵局、相互竞争的框架或卡壳点都会调用 `diagnose` | [Smithery](https://server.smithery.ai/elbpr/thinking-toolkit) |
| **Pigeon Superstition Superposition** | 基于文献证据的 16 节认知替代画像。每当综合主体信息时,画像就会向前推进 | [Smithery](https://server.smithery.ai/elbpr/pigeon-superstition-superposition) |
| **CSDb** | 通过 Cloudflare D1 实现跨会话的持久调查状态。存储实体、关系、时间线、证据、评级和调查笔记本 | 通过 `server/` 自行托管 |
到凌晨 1:30,Pigeon Superstition Superposition 画像已经有十六个部分。Sarah 完全根据公开文件构建了它:公司文件、一份 2017 年的证词记录、一种始终在季度报告期前两周进行的董事任命模式,以及该调查对象接受行业出版物采访的三次记录,在这些采访中,他对公司结构的描述以微小而具体的方式发生了改变,她现在怀疑这是故意的。画像不需要采访。它不需要访问权限。它只需要记录,而记录是详尽的。
### CSDb 自托管
```
cd server
./setup.sh
```
CSDb 跨会话存储每个实体、每条时间线条目、每个评级过的来源。当 Sarah 合上笔记本电脑并在第二天早上再次打开时,调查会完全停留在她离开时的位置。
## 数据标准
应用于所有输出的约定
时间戳为 ISO 8601 格式,标准化为 UTC。
实体记录遵循 POLE 模式。必填字段:`source`、`date_observed`、`analyst_id`、`confidence`。
网络边包含 `source_node`、`target_node`、`relationship_type` 和 `evidence_ref`。它们是定向的,从源到目标。没有方向的关系不是关系。它是谣言。
证据在捕获时使用 SHA-256 哈希、捕获时间戳、分析师 ID 和存储位置进行保存并记录。
概率语言完全使用 ICD 203 标准。
现在是将近凌晨 2 点。杯子已经冷了,并且冷了很久。Sarah 已经小时没有离开书桌了。屏幕上:一份单一的文档,一条归因发现的链条,每一条都带有一个来源评级、一个哈希值、一个来自固定量表的置信度评级。那四十七个标签页已经消失了。姓氏有两种拼写的受益所有人是同一个人,而且一直都是。2021 年 3 月到 7 月之间的空白有了一个标签:未决的调查线索,标记为跟进。假设 2 存活。假设 1 已死。
她回读了一遍摘要。这些转账非常可能是逃避制裁计划的一部分。非常可能。80% 到 95%。
这足以公开发表了。
标签:AI智能体, Claude, CVE检测, ESC4, OSINT, Python, 任务编排, 假设推理, 关系处理, 多阶段处理, 实体解析, 情报分析, 新闻调查, 无后门, 无线安全, 时序分析, 特征检测, 特权检测, 研究工具, 私家侦探, 网络诊断, 自动化代理, 调查研究, 逆向工具