status:现在到底跑着什么
status 读 worktree、清单和它的运行记录,然后把运行事实原样返回。它是每个会话开局的命令,也被允许说“我看不见”。
四种事实,不是一种
产品把 shell 一行命令会揉在一起的东西拆开。活着的进程、绑定的端口、通过的健康检查、退出原因,是四种不同的事实,一种不能推出下一种。
| 事实 | 它回答的问题 | 它从哪里来 |
|---|---|---|
| 进程 | 进程还活着吗? | 运行记录:pid、开始、结束、退出码。 |
| 监听 | 实际绑定了哪个地址? | 监听观察,连同它自己的可信状态。 |
| 健康 | 服务通过它的健康检查吗? | 声明的 HTTP、TCP 或命令检查。 |
| 退出 | 如果结束了,为什么? | 最近一次退出原因,以及它指向的日志。 |
hello-worktree · main
api running :21730 health 200
worker running no port
2 services · manifest oberth.yaml
怎么读这张表
人读的表格按项目、服务、依赖、代码和失败原因排序。每个服务行同时带上声明的端口和当前的运行事实;失败区只显示最近一次退出,而且只有它仍是该服务当前的 last_exit 时才显示。
- 无端口 worker 显示为
no port。它通过运行记录观察,不靠监听。 port: auto在分配前显示auto port unassigned;这不是失败。- 只有清单没有声明的监听才会单独列出。属于某个服务的端口跟服务显示在一起。
code_changed_since_start说明进程跑的是比 checkout 旧的代码,并给出重启提示。这是代码事实,不是运行失败。
给 agent:--brief 与 --json
oberth status --json --brief
--json 的顶层对象是 worktree。--brief 只保留运行事实,所以是最便宜的起点;完整读取才会加上 git 摘要、草稿、变化列表和每个服务的清单字段。
worktree.identity是wt_…值,down --identity和数据路径都用它。worktree.services[]带running、port_actual、health_status、pid和run_id。exits[]带原因、退出码,以及一个只指向真实存在证据的hint。observation只在监听表不可信时出现;它缺席,说明这张表可用。
观察失败的时候
沙箱、权限墙或平台变化都可能打断监听扫描。引擎会报告 observation_empty、observation_unrecognized、observation_incomplete、observation_blind 或 observation_bind_denied。这些码没有一个是“没有东西在监听”,更不是“没在运行”。人读的表会写 listening unknown;port: auto 的候选端口靠实际绑定确认,而不是相信空表。
oberth doctor --only listener_observation
在失败的同一种进程里运行它。如果结果是 blind,换到普通终端重试,或在那里运行 oberth serve --detach;不要在沙箱里反复重开,再把超时读成失败。