feat(runtime): observability + no-progress detector (Phase 1) (#13)
Phase 1 of plans/autonomous-survival-bot-prd.md. The bot must always be able to answer "what am I doing and why am I not doing more?" without parsing the log stream. New modules: - runtime/state.js: pure FSM classifier emitting emergency / working / recovering / planning / social / idle from snapshot + reflex context. - runtime/no-progress.js: sliding-window detector that watches position and inventory; when both are unchanged for 60 s+, emits one stable reason code from REASONS (waiting_for_day, night_hostile_nearby, no_food_source, inventory_full, no_reachable_target, planner_empty, awaiting_action_cooldown). - runtime/viewer.js: optional prismarine-viewer launcher behind VIEWER_PORT. Lazy import so the dep is not required by default. Wiring: - runtime/bot.js: tick() now computes runtimeState + noProgressReason every tick and stamps them on the snapshot along with activeSkill, currentMilestone (read from plan.md, cached 30 s), lastResult, failuresByCode and lastEscalation. - runtime/bot.js: dispatchAction records lastResult and lastFailureAt for the recovering-state classifier. - runtime/planner.js: exports isPlannerBusy(), readNextMilestone() and planExists() so the runtime can show planning state + current milestone without spawning extra Pi calls. - runtime/config.js: adds VIEWER_PORT support. TUI: - tui/tui.tsx: StatusBar gains a state badge, current-skill row, milestone row, no-progress reason warning, last-result line with ok/fail color, failures-by-class summary and last-escalation age. Co-authored-by: Yuriy Mayatnikov <mayatnikov@me.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit was merged in pull request #13.
This commit is contained in:
@@ -150,6 +150,31 @@ should only suggest what to do *with the existing tools*. If a deeper
|
||||
problem is happening, the failure-tracker (see Self-improvement) will
|
||||
file a proposal instead.
|
||||
|
||||
## Observability (Phase 1 — survival-bot pivot)
|
||||
|
||||
Every STATUS snapshot now carries fields the TUI uses to answer
|
||||
"what is the bot doing and why isn't it doing more?" without
|
||||
parsing the log stream:
|
||||
|
||||
| Field | Meaning |
|
||||
|-------|---------|
|
||||
| `runtimeState` | finite-state classification: `emergency` / `working` / `recovering` / `planning` / `social` / `idle` (see `runtime/state.js`). |
|
||||
| `activeSkill` | current dispatched action label, or the last one if idle. |
|
||||
| `currentMilestone` | first uncompleted line from `state/<host>/plan.md` (cached 30 s). |
|
||||
| `lastResult` | `{ label, ok, code, detail, ts }` of the most recent dispatched action. |
|
||||
| `noProgressReason` | one of `waiting_for_day`, `night_hostile_nearby`, `no_food_source`, `inventory_full`, `no_reachable_target`, `planner_empty`, `awaiting_action_cooldown`, … emitted when position + inventory have not changed for ≥60 s (see `runtime/no-progress.js`). |
|
||||
| `failuresByCode` | rolling counts of recent failures grouped by class (`bug` / `timeout` / `feature-gap` / `other`). |
|
||||
| `lastEscalation` | `{ ts, ageMs }` of the most recent Pi auto-escalation. |
|
||||
| `reflexPaused` | mirror of the local pause flag (so TUI shows the right state immediately). |
|
||||
|
||||
### Optional: prismarine-viewer
|
||||
|
||||
Set `VIEWER_PORT=<port>` in `.env` to launch
|
||||
[`prismarine-viewer`](https://github.com/PrismarineJS/prismarine-viewer)
|
||||
in-process. The package is **not** a default dep — install it explicitly
|
||||
(`npm i prismarine-viewer`) before enabling. If missing, the runtime
|
||||
logs a warning and continues.
|
||||
|
||||
## In-game chat (dialog-only)
|
||||
|
||||
As of the Phase 0 survival-bot pivot, MC chat does **not** drive bot
|
||||
|
||||
Reference in New Issue
Block a user