# X/订阅源管理的 API readiness、费用、权限与限速恢复链路
## Before / After
| 环节 | Before | After |
| --- | --- | --- |
| 前置检查 | 脚本运行后才发现 `X_CLIENT_ID` 缺失、`client-not-enrolled` 或 `CreditsDepleted` | 先跑 `x-api-readiness`,按 credentials、credits、scope、permission、rate-limit 给出阻塞项 |
| OAuth 权限 | 遇到读/写失败后临时重新 Authorize app | 工具明确提示缺哪个 scope、是否需要升级 App 写权限、是否需要重新授权 |
| 批量取关 | 306 个批量任务中途 429,第一版未写最终审计,真实完成数需要人工追 | 每个账号即时审计,失败时保留错误和剩余名单,可从 `remaining.csv` 续跑 |
| 恢复策略 | 依赖人工记忆“已经取关约 100 个,剩余 206” | `audit.jsonl` 是事实源,`rate_limit_state.json` 记录限速桶和建议恢复时间 |
## 升级后的诊断流程样例
```bash
cd ~/Documents/info-bu
python .agents/skills/subscribe-hub/scripts/x_api_readiness.py \
--operation write_unfollow \
--target-count 306 \
--config .agents/skills/subscribe-hub/config.json \
--out out/x_api_readiness_$(date +%F).json
```
预期输出:
```json
{
"operation": "write_unfollow",
"ready": false,
"checks": {
"credentials": {"status": "ok"},
"credits": {"status": "ok", "remaining_hint": "sufficient_for_smoke_unknown_for_bulk"},
"oauth_scope": {"status": "fail", "missing": ["users.write"]},
"app_permission": {"status": "fail", "reason": "write_permission_missing"},
"rate_limit": {"status": "ok", "reset_at": null}
},
"next_actions": [
"Upgrade X app permission to Read and write",
"Re-authorize app with users.write scope",
"Re-run readiness before batch unfollow"
]
}
```
批量脚本只在 `ready=true` 时执行;若执行中收到 429,立即停止当前批次,写入失败账号、限速 reset 时间和剩余名单。下一次执行:
```bash
python .agents/skills/subscribe-hub/scripts/x_unfollow_batch.py \
--input out/x_unfollow/remaining.csv \
--audit out/x_unfollow/audit.jsonl \
--resume
```
成功标准:审计文件中 `unfollowed + skipped + failed + remaining` 数量等于原始输入数量,且没有账号只存在于内存进度里。