Commit Graph
20 Commits
Author SHA1 Message Date
dave 7ca5339450 huskies: merge 944 2026-05-13 05:07:28 +00:00
dave cd214d7246 huskies: merge 899 2026-05-12 23:16:25 +00:00
dave 937792f208 huskies: merge 898 2026-05-12 21:33:41 +00:00
TimmyandClaude Opus 4.7 d78dd9e8f9 feat(934): typed Stage enum replaces directory-string state model
The state machine's `Stage` enum becomes the source of truth for pipeline
state. Six stages of work land together:

  1. Clean wire vocabulary (`coding`, `merge`, `merge_failure`, ...) replaces
     legacy directory-style strings (`2_current`, `4_merge`, ...) on the wire.
     `Stage::from_dir` accepted both during deployment; new writes always
     emit the clean form via `stage_dir_name`. Lexicographic `dir >= "5_done"`
     checks in lifecycle.rs become typed `matches!` checks since the new
     vocabulary doesn't sort in pipeline order.
  2. `crdt_state::write_item` takes typed `&Stage`, serialising via
     `stage_dir_name` at the CRDT boundary. `#[cfg(test)] write_item_str`
     parses legacy strings for test fixtures.
  3. `WorkItem::stage()` returns typed `crdt_state::Stage`; `stage_str()`
     is gone from the public API. Projection dispatches on the typed enum.
  4. `frozen` becomes an orthogonal CRDT register. `Stage::Frozen` and
     `PipelineEvent::Freeze`/`Unfreeze` are removed; `transition_to_frozen`/
     `unfrozen` set the flag directly without touching the stage register.
  5. Watcher sweep and `tool_update_story`'s `blocked` setter route through
     `apply_transition` so the typed transition table validates every
     stage change. `update_story` gains a `frozen` field for symmetry.
  6. One-shot startup migration rewrites pre-934 directory-style stage
     registers (and sets `frozen=true` on items previously at `7_frozen`).
     `Stage::from_dir` drops legacy aliases. The db boundary keeps a small
     normaliser so callers with legacy strings (MCP, tests) still work.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 22:31:59 +01:00
dave 93443e2ff1 huskies: merge 921 2026-05-12 21:09:52 +00:00
dave 19b7edb60c huskies: merge 918 2026-05-12 16:36:09 +00:00
dave 379ff16d3e huskies: merge 905 2026-05-12 15:02:58 +00:00
TimmyandClaude Opus 4.7 734d3f2eb0 fix(gateway): bot.toml is read; perm_rx channel stays open
Two latent bugs in `service/gateway/io.rs::spawn_gateway_bot`, exposed
today after a long-overdue gateway rebuild:

1. The permission channel sender was bound as `_perm_tx` (the underscore
   prefix signalling "unused") and dropped at function return. The
   matrix bot's permission_listener task — which holds `perm_rx` for
   its lifetime per story 884 — then saw the channel close immediately
   and exited with "perm_rx channel closed" 1s after starting. Net
   effect: the listener was effectively absent on every gateway boot,
   so non-MCP tool permission requests had no destination at all
   (separate from the architectural mismatch that 898 will fix; this
   was a strictly worse "listener never even ran" version of the same
   problem). Bind as `perm_tx` and `mem::forget` it to keep the
   channel open for the gateway's lifetime, mirroring the existing
   `shutdown_tx` pattern two lines below.

2. `bot_name` was hardcoded to `"Assistant"`, ignoring
   `bot.toml::display_name`. So the gateway's matrix bot announced
   itself as "Assistant" and treated user messages addressed to
   "Timmy" (the actual configured display_name) as unaddressed,
   silently dropping them. `ambient_rooms` and
   `permission_timeout_secs` were similarly ignored. Load
   `BotConfig::load(config_dir)` and apply the same field plumbing
   the standard-mode initialisation in `main.rs:211-232` already
   uses.

Symptoms seen in production today:
- gateway.log: `Sending startup announcement: Assistant is online.`
  followed by repeated `Ignoring unaddressed message from
  @yossarian:crashlabs.io` lines.
- gateway.log: `permission listener started` immediately followed
  (same timestamp) by `permission listener exiting (perm_rx channel
  closed)`.

After this lands, rebuild the gateway binary and restart so it picks
up `bot.toml` correctly and the listener stays alive for the bot's
lifetime.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 15:28:06 +01:00
dave 11d111360d huskies: merge 858 2026-04-29 10:47:18 +00:00
dave b7db6d6aae huskies: merge 775 2026-04-28 12:25:59 +00:00
dave 0c2789b2c1 huskies: merge 768 2026-04-28 10:12:27 +00:00
dave fb5a21cfbb huskies: merge 778 2026-04-28 10:01:10 +00:00
dave 38e828979c huskies: merge 766 2026-04-28 08:59:13 +00:00
dave 0d14fffe1c huskies: merge 762 2026-04-28 01:31:16 +00:00
dave d1a2393b32 huskies: merge 760 2026-04-28 00:22:29 +00:00
dave 272a592a4d huskies: merge 735_story_attach_statuseventbuffer_to_each_agent_session_scoped_per_project_reset_on_restart 2026-04-27 18:06:11 +00:00
dave 65d2fb210c huskies: merge 655_bug_matrix_bot_spawns_its_own_timerstore_instead_of_using_shared_appcontext_timer_store 2026-04-27 11:32:51 +00:00
dave d8f9be5b23 huskies: merge 641_story_unified_status_update_delivery_across_chat_web_ui_and_top_level_agent_context 2026-04-26 02:27:34 +00:00
dave 4b089c1ed8 huskies: merge 626_refactor_introduce_services_bundle_and_migrate_appcontext_matrix_transport 2026-04-25 15:08:46 +00:00
dave 360bca45c8 huskies: merge 617_story_split_gateway_into_service_and_transport 2026-04-24 18:43:26 +00:00