diff --git a/Service-Bus.md b/Service-Bus.md index f00cea8..3f1e054 100644 --- a/Service-Bus.md +++ b/Service-Bus.md @@ -148,6 +148,9 @@ Current topic families: | `topology.{id}.status` | Mutator | `{state, reason}` | | `decky.{id}.state` | _reserved_ | — | | `decky.{id}.traffic` | _reserved_ | — | +| `decky.{name}.service_added` | Engine (services_live) | `{decky_name, service_name, topology_id?, services}` — live add of a single service to a deployed decky (fleet OR MazeNET). Published only after compose `up -d --no-deps --build -` succeeds. Substrate-watching consumers (correlator, dashboard) reconcile shape off this without waiting for the next `decnet-state.json` snapshot. `topology_id` is null for fleet deckies. Note: leaf is `service_added` (underscore), not `service.added` — bus segments are NATS-style tokens and can't contain dots. | +| `decky.{name}.service_removed` | Engine (services_live) | `{decky_name, service_name, topology_id?, services}` — live remove. Compose `stop` + `rm -f` of the service container, then DB persist + compose re-render so a future `up -d` doesn't bring it back. Same payload shape as the `added` event; `services` is the post-mutation list. | +| `decky.{name}.service_config_changed` | Engine (services_live) | `{decky_name, service_name, topology_id?, service_config, recreated}` — published when the schema-driven Inspector form persists a new per-service config. `service_config` is the post-validation dict (unknown keys dropped, types coerced). `recreated=true` when the operator hit **Apply** (force-recreate of `-` to pick up the new env, destructive); `false` for **Save** (DB + compose only). Note: this topic is an audit-trail signal, not a propagation trigger — for swarm fleet deckies and agent-pinned topologies the master propagates the change directly via `AgentClient.deploy` / `apply_topology` (see `_redispatch_fleet_shard` / `_resync_agent_topology` in `decnet/engine/services_live.py`). | | `orchestrator.traffic.{decky_id}` | Orchestrator | `{kind: "traffic", protocol: "ssh", action, src_decky_uuid, dst_decky_uuid, success, payload, ts}` — synthetic inter-decky SSH traffic generated to keep the fleet from looking suspiciously static | | `orchestrator.file.{decky_id}` | Orchestrator | `{kind: "file", protocol: "ssh", action, dst_decky_uuid, success, payload, ts}` — synthetic file create or edit (`action="file:create"` / `"file:edit"`) performed inside a decky via `docker exec`. Driven by the realism planner; rare ticks (~3%) carry callback-bearing canary content. | | `orchestrator.email.{decky_id}` | Orchestrator | `{kind: "email", mail_decky_uuid, thread_id, message_id, in_reply_to, sender_email, recipient_email, subject, language, success, ts}` — one fake corporate email persona-driven by the realism content engine and dropped into a mail decky's spool. `decky_id` is the mail decky (the IMAP/POP3 host serving the mailbox). Producer changed from a separate `emailgen` worker to the unified orchestrator in the realism migration; topic shape is unchanged. |