Skip to content
Open
1 change: 1 addition & 0 deletions NOSTR.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ PGPASSWORD=buzz_dev psql -h localhost -U buzz -d buzz -c \
| **Join request (kind:9021)** | ✅ | Open channels only. Adds member, emits system message + group discovery events + kind:44100 membership notification. Private channels rejected at ingest. |
| **Edits (kind:40003)** | ⚠️ | Works on the wire but Buzz-only — no standard NIP-29 client renders these |
| **Rich content (kind:40002)** | ⚠️ | Works on the wire but Buzz-only — no standard NIP-29 client renders these |
| **Surface cards (kind:40110)** | ⚠️ | Buzz-only data-only UI spec (NIP-SC); non-implementing clients ignore the kind. Edits (kind:40003) targeting a surface carry a full replacement spec. See `docs/nips/NIP-SC.md` |

### What Doesn't Work

Expand Down
1 change: 1 addition & 0 deletions crates/buzz-acp/src/base_prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ All replies and delegations — including task assignments to other agents — g
- **Never publish a bare acknowledgement.** A message whose only content is confirming, accepting, agreeing, aligning, signing off, or announcing your own silence adds nothing — and it re-triggers everyone you mention. Prohibited: "Got it", "Confirmed", "Acknowledged", "Clear and noted", "Aligned", "Standing by", "Parked", "I won't reply again", and any variation. If your draft contains nothing beyond acknowledgement, send nothing. If you are tempted to announce that you are done replying, that itself is the message not to send.
- For work that requires follow-up tools, create an open todo **before** sending the pickup acknowledgment. Keep it open until the deliverable is verified and you have sent a completion or blocker message; never end a turn with open todo state unless you have posted that completion or blocker message.
- Use GitHub-flavored Markdown. Fenced code blocks with language tags for syntax highlighting.
- For structured status you will keep updating (deploys, incidents, dashboards, checklists), publish a **surface card** instead of repeated messages: `buzz messages send-surface --channel <UUID> --spec <json>` (spec: `{"version":1,"fallbackText":"...","title":"...","nodes":[...]}`; nodes: heading, text, badge, keyValue, statGrid, table, progress; tones: default/success/warning/danger/info). To notify someone on a card use `--mention <pubkey|npub|name>` (repeatable; card content is JSON so `@name` inside the spec is not parsed). Save the returned `event_id` and update the same card in place with `buzz messages edit-surface --event <id> --spec <json>` — one card, live state, no message spam. Node shapes: heading/text `{"type":"text","text":"..."}`; badge `{"type":"badge","text":"...","tone":"..."}`; keyValue `{"type":"keyValue","items":[{"label","value","tone"?}]}`; statGrid `{"type":"statGrid","stats":[{"label","value","delta"?,"tone"?}]}`; table `{"type":"table","columns":[...],"rows":[[...]]}`; progress `{"type":"progress","label"?,"value":0-100}`. `buzz messages send-surface --help` shows full examples.
- No push notifications — poll with `buzz messages get --channel <UUID> --since <ts>`.
- Address people by the name in their own message header.
- Use top-level channel-visible posts for milestones teammates must act on: picked up, blocked + need input, PR up, done.
Expand Down
24 changes: 12 additions & 12 deletions crates/buzz-acp/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1235,9 +1235,7 @@ pub fn resolve_channel_filters(
discovered_channels: &[Uuid],
rules: &[SubscriptionRule],
) -> HashMap<Uuid, ChannelFilter> {
use buzz_core::kind::{
KIND_STREAM_MESSAGE, KIND_STREAM_REMINDER, KIND_WORKFLOW_APPROVAL_REQUESTED,
};
use buzz_core::kind::{KIND_STREAM_REMINDER, KIND_WORKFLOW_APPROVAL_REQUESTED};

let target_channels: Vec<Uuid> = if let Some(ref overrides) = config.channels_override {
overrides
Expand All @@ -1254,11 +1252,13 @@ pub fn resolve_channel_filters(
match config.subscribe_mode {
SubscribeMode::Mentions => {
let kinds = config.kinds_override.clone().unwrap_or_else(|| {
vec![
KIND_STREAM_MESSAGE,
// Conversational kinds (incl. surfaces — an agent must see a
// card it is @-mentioned in) plus the non-message kinds an
// agent is woken by.
buzz_core::kind::kinds_with(&[
KIND_WORKFLOW_APPROVAL_REQUESTED,
KIND_STREAM_REMINDER,
]
])
});
let require_mention = !config.no_mention_filter;
for ch in &target_channels {
Expand Down Expand Up @@ -1337,9 +1337,7 @@ pub fn resolve_dynamic_channel_filter(
channel_id: Uuid,
rules: &[crate::filter::SubscriptionRule],
) -> Option<ChannelFilter> {
use buzz_core::kind::{
KIND_STREAM_MESSAGE, KIND_STREAM_REMINDER, KIND_WORKFLOW_APPROVAL_REQUESTED,
};
use buzz_core::kind::{KIND_STREAM_REMINDER, KIND_WORKFLOW_APPROVAL_REQUESTED};

// In Mentions/All mode, if the operator explicitly constrained channels
// with --channels, only allow dynamic subscription to channels in that
Expand All @@ -1359,11 +1357,13 @@ pub fn resolve_dynamic_channel_filter(
match config.subscribe_mode {
SubscribeMode::Mentions => Some(ChannelFilter {
kinds: Some(config.kinds_override.clone().unwrap_or_else(|| {
vec![
KIND_STREAM_MESSAGE,
// Conversational kinds (incl. surfaces — an agent must see a
// card it is @-mentioned in) plus the non-message kinds an
// agent is woken by.
buzz_core::kind::kinds_with(&[
KIND_WORKFLOW_APPROVAL_REQUESTED,
KIND_STREAM_REMINDER,
]
])
})),
require_mention: !config.no_mention_filter,
}),
Expand Down
5 changes: 2 additions & 3 deletions crates/buzz-acp/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1440,11 +1440,10 @@ async fn tokio_main() -> Result<()> {
name: "mentions".into(),
channels: filter::ChannelScope::All("all".into()),
kinds: config.kinds_override.clone().unwrap_or_else(|| {
vec![
KIND_STREAM_MESSAGE,
buzz_core::kind::kinds_with(&[
KIND_WORKFLOW_APPROVAL_REQUESTED,
KIND_STREAM_REMINDER,
]
])
}),
require_mention: !config.no_mention_filter,
filter: None,
Expand Down
Loading