Log Fix Branch
概述
当用户要的是“直接执行并修复”,而不是“只给建议”时,使用这个 skill。
目标是完成一整条闭环:
- 读取相关日志样本
- 把日志里的失败信号和当前已检出的代码仓库关联起来
- 直接在当前分支上修复问题
- 用尽量小但可靠的方式完成验证
这个 skill 适合“先看日志,再修当前分支”这一类任务,而不是只做高层分析。
期望输入
优先接受以下任一输入:
- 本地日志文件路径,例如
/var/log/app/error.log - 一个包含日志文件的本地目录
- 远端日志路径,例如
user@host:/path/to/log - 远端日志路径,例如
ssh://user@host/path/to/log - 用户明确给出的读取命令,例如
ssh api-prod 'journalctl -u my-service -n 300 --no-pager' - 辅助线索,例如请求 ID、时间戳、接口名、panic 文本、异常名、用户侧症状
如果日志来源缺失或有歧义,只询问最小必要信息,不要一次问很多。
工作流
1. 建立当前仓库上下文
先确认当前仓库状态,而不是立刻改代码:
- 运行
git branch --show-current - 运行
git status --short - 先看项目结构和可能的测试入口
- 把已有但不相关的 worktree 改动视为用户已有工作,不要误改或回退
2. 安全读取日志
读取日志时优先稳妥、收敛、只读:
- 对本地文件路径或 SSH 路径,优先使用
scripts/read_log_sample.py - 如果用户给的是远端命令,远端动作保持只读,不要直接修改线上环境
- 从小样本开始,通常先读
100-300行 - 尽早按时间戳、请求 ID、
ERROR、WARN、panic、exception、接口名等关键字缩小范围 - 如果给的是目录,优先检查最近更新、最可能相关的日志文件
3. 形成明确假设
在改代码前,先把日志信号收敛成一个具体判断:
- 把日志证据对应到一个具体代码路径或失败模式
- 用一句话说清“怀疑的根因是什么”
- 明确区分哪些是日志直接证明的,哪些只是推断
没有形成具体假设之前,不要贸然修改代码。
4. 直接修当前分支
当日志和代码路径已经能对应上时:
- 直接修改当前已检出的仓库
- 优先做最小、聚焦、可解释的修复
- 如果存在清晰切口,就补充或更新测试
- 如果问题属于纯转换逻辑、边界条件或解析逻辑,优先提炼成一个小的纯函数再测试
目标不是顺手重构整个模块,而是优先修掉日志已经证明的问题。
5. 用最小验证闭环
验证时遵循“足够证明即可”:
- 运行最小的命令来证明修复是否有效
- 优先跑仓库原生的单元测试或包级测试
- 如果完整复现条件不可得,至少要验证触发失败的分支、解析逻辑、保护条件或边界条件
6. 清晰汇报结果
最终输出应说明:
- 日志里出现了什么关键信号
- 怀疑的根因是什么
- 改了什么代码
- 做了什么验证
- 还剩哪些假设或风险
远端日志规则
- 远端访问只用于读取和排查,不用于修改线上系统
- 优先使用当前环境中已经可用的 SSH alias 或主机访问方式
- 如果日志来自
journalctl,而服务名不明确,就询问准确的服务名或读取命令,除非上下文里已经很清楚 - 如果问题根因只存在于远端配置或基础设施,不在当前仓库里,就停止并明确说明边界
- 如果 SSH 需要未知密码、OTP、跳板机流程,而当前环境没有现成配置,就暂停并询问准确访问方式
推荐命令
对于本地或远端文件路径:
python3 /Users/edy/.codex/skills/log-fix-branch/scripts/read_log_sample.py \
"/path/or/user@host:/path" \
--lines 200 \
--grep 'ERROR|panic|exception'
对于用户直接给出的远端命令:
ssh api-prod 'journalctl -u my-service -n 300 --no-pager'
然后根据日志内容去检查仓库、定位失败路径并修复当前分支。
决策规则
以下情况可以自主继续:
- 日志里的失败明显可以映射到当前仓库
- 有一条合理且具体的修复路径
- 可以用较小范围的验证来证明修复
以下情况才暂停并询问用户:
- 用户没有给出可用的日志来源
- 日志证据明显指向另一个仓库
- 唯一修复方式是线上配置或基础设施变更
- 存在多个互相冲突、同样合理的根因,当前证据不足以区分
如果被阻塞,只问一个简短、具体的问题。
提示词示例
Use $log-fix-branch. 日志在 /var/log/myapp/app.log,帮我直接修复当前分支。Use $log-fix-branch. 日志在 deploy@10.0.0.8:/data/logs/api/error.log,按日志修当前分支。Use $log-fix-branch. 先执行 ssh api-prod 'journalctl -u billing -n 300 --no-pager',然后修这个仓库里的 bug。
资源
- 查看 references/log-source-formats.md 了解支持的日志来源格式与示例
- 使用
scripts/read_log_sample.py从本地或 SSH 可访问的日志文件中读取紧凑样本