# 每日推文总结自动化预检和失败补跑链路 ## 诊断流程样例\n\n| 步骤 | 检查项 | 输入 | 成功信号 | 失败信号 | 动作 |\n| --- | --- | --- | --- | --- | --- |\n| 1 | repo 与 worktree | 当前 cwd、`git status --short`、`git show HEAD:skills/twitter-fetcher/SKILL.md` | worktree 有脚本,或 HEAD 可读 canonical 版本 | `skills/twitter-fetcher/*` 被删且 HEAD 不可读 | 停止真实抓取,报告代码链路缺失 |\n| 2 | roster | `.claude/skills/config.json` 的 `skills.twitter-fetcher.users` | users 非空并列出账号数 | 只有 API key,没有 users | 写 `preflight_failed.json`,提示补 roster 或从旧 state 回收 |\n| 3 | provider/DNS | `TWITTERAPI_IO_KEY`、`SOCIALDATA_API_KEY`、`api.twitterapi.io`、`api.socialdata.tools` | 至少一个 provider DNS 可解析,key 存在 | 两个 host 都 `[Errno 8] nodename nor servname provided` | 判定环境网络阻塞,不误判为账号为空或脚本 bug |\n| 4 | 输出目录 | `~/Downloads/twitter_output`、Odyssey research、repo `.codex_tmp` | 目标目录可 touch/delete | iCloud 或 Downloads `Operation not permitted` | 切到 `.codex_tmp/twitter_fetcher_runs/<date>/` 写失败态产物 |\n| 5 | 补跑状态 | `state.json` | 包含 `target_date`、`failed_checks`、`rerun_command` | 没有可复用上下文 | 生成手动/自动补跑命令 |\n\n### 示例输出\n\n```json\n{\n \"status\": \"blocked\",\n \"target_date\": \"2026-05-02\",\n \"failed_checks\": [\"missing_roster\", \"twitter_fetcher_deleted_in_worktree\", \"provider_dns_failed\", \"research_dir_not_writable\"],\n \"safe_fallback_dir\": \".codex_tmp/twitter_fetcher_runs/2026-05-02\",\n \"rerun_command\": \"scripts/run_daily_tweet_summary.sh --date 2026-05-02 --resume .codex_tmp/twitter_fetcher_runs/2026-05-02/state.json\"\n}\n```