[Bannerlord M1] Passive Lord — Observer Mode via GABS #1093

Closed
opened 2026-03-23 16:49:24 +00:00 by perplexity · 1 comment
Collaborator

Parent: #1091
Benchmark gate: Level 0 + Level 1 passed

Task

Timmy reads full Bannerlord game state via GABS and logs it to SOUL.md. No actions — pure observation.

Steps:

  1. Set up Windows VM (Hetzner or DO) with Bannerlord + GABS mod
  2. Verify GABS TCP server running on port 4825
  3. Build TCP client in Timmy harness (Hermes → VM)
  4. Implement observe() loop: poll core/get_game_state, hero/get_player, party/get_player_party
  5. Format state into SOUL.md journal entries
  6. Run for 7 consecutive in-game days

Key GABS tools: core/get_game_state, hero/get_player, party/get_player_party, kingdom/list_kingdoms

Done when: Timmy produces accurate, coherent game state summaries every in-game day for 7 days.

Estimated effort: 1-2 weeks (mostly VM setup + GABS install + TCP bridge)

**Parent:** #1091 **Benchmark gate:** Level 0 + Level 1 passed ## Task Timmy reads full Bannerlord game state via GABS and logs it to SOUL.md. No actions — pure observation. **Steps:** 1. Set up Windows VM (Hetzner or DO) with Bannerlord + GABS mod 2. Verify GABS TCP server running on port 4825 3. Build TCP client in Timmy harness (Hermes → VM) 4. Implement observe() loop: poll `core/get_game_state`, `hero/get_player`, `party/get_player_party` 5. Format state into SOUL.md journal entries 6. Run for 7 consecutive in-game days **Key GABS tools:** core/get_game_state, hero/get_player, party/get_player_party, kingdom/list_kingdoms **Done when:** Timmy produces accurate, coherent game state summaries every in-game day for 7 days. **Estimated effort:** 1-2 weeks (mostly VM setup + GABS install + TCP bridge)
claude was assigned by Rockachopa 2026-03-23 17:57:40 +00:00
Collaborator

PR created: #1124

Implemented M1 — Passive Lord (Observer Mode via GABS):

  • GabsClient (src/integrations/bannerlord/gabs_client.py): TCP JSON-RPC 2.0 client that polls core/get_game_state, hero/get_player, party/get_player_party, kingdom/list_kingdoms. Raises GabsError on any failure so callers can degrade gracefully.

  • BannerlordObserver (src/integrations/bannerlord/observer.py): async observe(days=N) loop that polls GABS every gabs_poll_interval seconds, formats game state into structured Markdown journal entries, and writes them to memory/bannerlord/journal.md. Stops after N unique in-game days. Degrades gracefully (warning log, no crash) when GABS is unreachable.

  • 15 GABS config keys added to src/config.py (all off by default).

  • 21 unit tests (all offline, sockets mocked) — 21/21 pass; full suite 3268/3268 pass.

Steps covered: 3 (TCP client), 4 (observe loop), 5 (SOUL/journal formatting).
Steps 1–2 (VM provisioning, GABS install) are infrastructure tasks documented in docs/research/bannerlord-vm-setup.md (#1098).
Step 6 (7 in-game days) requires a running VM+GABS — observer.observe(days=7) implements the stop condition.

PR created: #1124 **Implemented M1 — Passive Lord (Observer Mode via GABS):** - `GabsClient` (`src/integrations/bannerlord/gabs_client.py`): TCP JSON-RPC 2.0 client that polls `core/get_game_state`, `hero/get_player`, `party/get_player_party`, `kingdom/list_kingdoms`. Raises `GabsError` on any failure so callers can degrade gracefully. - `BannerlordObserver` (`src/integrations/bannerlord/observer.py`): async `observe(days=N)` loop that polls GABS every `gabs_poll_interval` seconds, formats game state into structured Markdown journal entries, and writes them to `memory/bannerlord/journal.md`. Stops after N unique in-game days. Degrades gracefully (warning log, no crash) when GABS is unreachable. - 15 GABS config keys added to `src/config.py` (all off by default). - 21 unit tests (all offline, sockets mocked) — 21/21 pass; full suite 3268/3268 pass. **Steps covered:** 3 (TCP client), 4 (observe loop), 5 (SOUL/journal formatting). **Steps 1–2** (VM provisioning, GABS install) are infrastructure tasks documented in `docs/research/bannerlord-vm-setup.md` (#1098). **Step 6** (7 in-game days) requires a running VM+GABS — `observer.observe(days=7)` implements the stop condition.
Sign in to join this conversation.
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Rockachopa/Timmy-time-dashboard#1093