What's missing
There is no way to edit a forum post (kind:45001) or a forum comment (kind:45003) in Buzz.
Forum cards expose a Delete action and nothing else, so the only way to fix a typo in a
long-form post is to delete it and repost, which loses the event id that every reply,
reaction and mention already points at.
This is not a relay limitation. The relay already accepts and stores the edit. Desktop
fetches it and then throws it away.
Evidence: the relay accepts it today
Measured on a private, ephemeral forum channel:
| Event |
Kind |
Result |
2d65a211c38e1f5bb9c552d6a68ded90f6ecd1b8b84236da8ab21a86d439484a |
45001 |
post created |
e85cda57c2d7271c9a856f9b08c306781524263b735f90f8e3bd2fcd93f03b76 |
40003 |
edit of the post, e tag -> the 45001, accepted and stored |
e68aa989f4dd272a9f18bf31f5368326692d31af0187f89a28a86514497b6ebc |
45003 |
comment created |
b1efa0248076c7acfba690efd158075a659eb97ea91bae8fbed32fedbf55eea2 |
40003 |
edit of the comment, accepted and stored |
After both edits, reading the 45001 still returns the original content.
Why it works at the write layer
validate_edit_ownership (crates/buzz-relay/src/handlers/ingest.rs:920) checks only that
the signer is the target's effective author (or the owning human of the authoring agent) and
that the target lives in the same channel. It never inspects the target's kind. Compare
validate_forum_vote_target in the same file (:1001), which explicitly requires
KIND_FORUM_POST or KIND_FORUM_COMMENT at :1034. The edit validator has no equivalent
gate, so a 40003 aimed at a 45001 is valid by construction.
build_edit (crates/buzz-sdk/src/builders.rs:389) is likewise kind-agnostic on the target.
Where it stops
desktop/src-tauri/src/commands/messages/forum.rs does query kind:40003 events for the
rows it returns (:183, :238), but only to compute link-preview suppression (:122).
The edit's content is never applied to the message.
get_forum_thread (forum.rs:253) explicitly filters kind:40003 out of the reply list.
- No edit affordance exists in the UI.
ForumPostCard.tsx:113 and ForumThreadPanel.tsx:107
and :254 render DeleteActionMenu and nothing else.
Note that the data is already delivered: the CLI thread filter
(crates/buzz-cli/src/commands/messages.rs:439) lists 40003 among the reply kinds, and the
edit event does come back alongside the root. This is a folding gap, not a fetching gap.
Why it matters
Forum channels are the long-form surface (VISION.md:19, :28). Long-form is exactly where
a post is a living document: correcting a spec, fixing a broken link, adding acceptance
criteria after discussion. Chat messages (kind:9) can be edited; the surface built for text
that people actually revise cannot.
Repost-and-delete is not equivalent. It breaks every e tag pointing at the old id: replies
are orphaned, reactions are lost, and any agent that stored the id now references a tombstone.
Suggested fix
Client-side only. No relay change, no new event kind, no spec change.
- Fold kind:40003 content onto the target in
forum_message_from_event, the same way the
chat path already folds edits, and stop discarding 40003 at forum.rs:253.
- Add an Edit action beside Delete in
DeleteActionMenu (or a shared post-action menu) for
posts and comments the current identity authored.
- Render the usual "edited" marker for parity with chat.
Related
Environment
Read against main at commit cd0d33f0, ahead of desktop-v0.5.17.
What's missing
There is no way to edit a forum post (kind:45001) or a forum comment (kind:45003) in Buzz.
Forum cards expose a Delete action and nothing else, so the only way to fix a typo in a
long-form post is to delete it and repost, which loses the event id that every reply,
reaction and mention already points at.
This is not a relay limitation. The relay already accepts and stores the edit. Desktop
fetches it and then throws it away.
Evidence: the relay accepts it today
Measured on a private, ephemeral forum channel:
2d65a211c38e1f5bb9c552d6a68ded90f6ecd1b8b84236da8ab21a86d439484ae85cda57c2d7271c9a856f9b08c306781524263b735f90f8e3bd2fcd93f03b76etag -> the 45001, accepted and storede68aa989f4dd272a9f18bf31f5368326692d31af0187f89a28a86514497b6ebcb1efa0248076c7acfba690efd158075a659eb97ea91bae8fbed32fedbf55eea2After both edits, reading the 45001 still returns the original content.
Why it works at the write layer
validate_edit_ownership(crates/buzz-relay/src/handlers/ingest.rs:920) checks only thatthe signer is the target's effective author (or the owning human of the authoring agent) and
that the target lives in the same channel. It never inspects the target's kind. Compare
validate_forum_vote_targetin the same file (:1001), which explicitly requiresKIND_FORUM_POSTorKIND_FORUM_COMMENTat:1034. The edit validator has no equivalentgate, so a 40003 aimed at a 45001 is valid by construction.
build_edit(crates/buzz-sdk/src/builders.rs:389) is likewise kind-agnostic on the target.Where it stops
desktop/src-tauri/src/commands/messages/forum.rsdoes query kind:40003 events for therows it returns (
:183,:238), but only to compute link-preview suppression (:122).The edit's content is never applied to the message.
get_forum_thread(forum.rs:253) explicitly filters kind:40003 out of the reply list.ForumPostCard.tsx:113andForumThreadPanel.tsx:107and
:254renderDeleteActionMenuand nothing else.Note that the data is already delivered: the CLI thread filter
(
crates/buzz-cli/src/commands/messages.rs:439) lists 40003 among the reply kinds, and theedit event does come back alongside the root. This is a folding gap, not a fetching gap.
Why it matters
Forum channels are the long-form surface (
VISION.md:19,:28). Long-form is exactly wherea post is a living document: correcting a spec, fixing a broken link, adding acceptance
criteria after discussion. Chat messages (kind:9) can be edited; the surface built for text
that people actually revise cannot.
Repost-and-delete is not equivalent. It breaks every
etag pointing at the old id: repliesare orphaned, reactions are lost, and any agent that stored the id now references a tombstone.
Suggested fix
Client-side only. No relay change, no new event kind, no spec change.
forum_message_from_event, the same way thechat path already folds edits, and stop discarding 40003 at
forum.rs:253.DeleteActionMenu(or a shared post-action menu) forposts and comments the current identity authored.
Related
was built for kind:9 and nothing else.
get/historystill return the original.Environment
Read against
mainat commitcd0d33f0, ahead ofdesktop-v0.5.17.