# 推文日报抓取预检诊断工具
类型:`diagnostic-tool`
风险:`low`
## 诊断流程样例
### 输入
- repo: `/Users/bytedance/Documents/Codex/2026-04-21-https-github-com-haopenglau-skills/repo`
- target_date: `2026-05-03`
- expected_output_dir: `/Users/bytedance/Library/Mobile Documents/com~apple~CloudDocs/odyssey/0 收集箱/research`
### 运行
```bash
python scripts/twitter_fetcher_preflight_doctor.py \
--repo /Users/bytedance/Documents/Codex/2026-04-21-https-github-com-haopenglau-skills/repo \
--target-date 2026-05-03 \
--json-out .codex_tmp/twitter_fetcher_preflight_20260503.json \
--markdown-out .codex_tmp/twitter_fetcher_preflight_20260503.md
```
### 检查矩阵
| 阶段 | 检查 | 通过信号 | 失败信号 | 建议动作 |
|---|---|---|---|---|
| 仓库 | `skills/twitter-fetcher` 工作树和 HEAD | 文件存在,或 HEAD 可读 canonical 脚本 | 工作树删除且 HEAD 也不可读 | 先修仓库/确认删除意图 |
| 配置 | `.claude/skills/config.json` | `skills.twitter-fetcher.users` 非空 | roster 缺失或为空 | 先补账号名单,不开抓 |
| provider | env key + DNS | 至少一个 provider 可解析且有 key | 两个 host 都 DNS fail | 判定环境级网络阻塞 |
| 输出 | Downloads、Odyssey、`.codex_tmp` 写入 | 目标目录可写 | 目标不可写但 `.codex_tmp` 可写 | 只写 fallback trace |
| 自动化 | `CODEX_HOME` 展开 | memory 路径在用户目录 | 命中 `/automations` | 修复环境变量展开 |
### 示例输出摘要
```text
overall_status: fail
blocking_reasons:
- missing_roster: .claude/skills/config.json 缺 skills.twitter-fetcher.users
- provider_dns_failed: api.socialdata.tools 与 api.twitterapi.io 均无法解析
- target_not_writable: Odyssey research 目录 Operation not permitted
next_action: 不运行 daily_tweet_summary.py;先补 roster、修 DNS/网络和目录权限;诊断产物写入 .codex_tmp。
```
### 判定
这类失败不应被日报脚本解释成“没有推文”或“回复链补全失败”。preflight 直接阻断抓取,并输出可复查的根因清单。