Repository navigation
Conversation
A thread's title is a kind-45010 artifact with type buzz.thread-title (the name proposed upstream in block#6739): - d = UUIDv5(namespace, "buzz.thread-title:" + root). Folding the type into the name means a future type change gets fresh ids, since NIP-AR never reuses a deleted d. - h = channel, root = thread root, title tag. The title is also copied into content for readers that ignore tags; relay search does not index kind 45010, so titles are not searchable yet. Clearing is op=delete; setting again after a clear is restore. The convention lives in buzz_sdk::thread_title (type, namespace, head selection, write planning, revision builder) so the CLI and the desktop write byte-identical artifacts. CLI: `buzz threads title set|clear|get|list`. Writes plan create/update/delete/restore from the current head and re-read on head conflicts. `set --if-unset` leaves an existing or cleared title alone. buzz-acp: when a human's new top-level channel message mentions agents, the first-mentioned agent is asked to title the thread with --if-unset. Replies, edits, DMs and agent-authored roots never trigger it. Desktop, through Tauri commands (artifact queries are HTTP-only on the relay): - The thread panel header shows the title with an inline editor (pencil, Enter saves, Escape cancels, blank clears). Edits carry the revision they started from, so a concurrent rename is reported, not overwritten. - The title sits on its own line under the author of a thread root in the channel (clickable, opens the thread) and on Inbox rows and the Inbox detail header. - Titles are looked up per root by their derived d, in batches of 100, and lookups made in the same tick share one query, so lookups stay exact however many titles exist. A returned title only counts when its d matches its root. - Artifact events in the open channel refresh titles live. Co-authored-by: Jeff Hedlund <jhedlund@gmail.com> Signed-off-by: Jeff Hedlund <jhedlund@gmail.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
🔐 Codex Security Review
|
This was referenced Oct 23, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Threads in Buzz have no name anyone can set. This adds shared, editable thread titles as a client-only convention on NIP-AR channel artifacts (#7791, #7919). The relay needs no changes.
Convention (
buzz_sdk::thread_title, so the CLI and desktop write byte-identical artifacts):45010typebuzz.thread-titled"buzz.thread-title:" + lowercase root id): one title per thread. The type is folded into the name, so a future type change gets fresh ids (NIP-AR never reuses a deletedd).hroottitlecontentfor readers that ignore tagsRenaming is a normal artifact update from the current head. Clearing is
op=delete, and setting a title after a clear isrestore. Authorization is NIP-AR's: anyone who can post a kind:9 in the channel, agents included, can title a thread.CLI:
buzz threads title set|clear|get|list. Writes plan create/update/delete/restore from the current head and re-read on a head conflict.set --if-unsetleaves an existing or cleared title alone.Agent auto-titling (
buzz-acp): when a human's new top-level channel message mentions agents, the first-mentioned agent is asked to title the thread with--if-unset, the way chat apps name a new conversation. Replies, edits, DMs and agent-authored roots never trigger it, and later mentions never rename a thread.Desktop (through Tauri commands, since artifact queries are HTTP-only on the relay):
d, up to 100 roots per query. Lookups made in the same tick share one query. A returned title only counts when itsdmatches its root. There's no global title list, so lookups stay exact however many titles a community has.Not in this PR:
content, but desktop search hardcodes[9, 40002, 45001, 45003], and the FTS allowlist (fresh installs,nip_rs_search_allowlist.sql) leavessearch_tsvNULLfor kind 45010. Enabling it means widening the allowlist, which rewrites a generated column on populated relays, plus mapping hits back toroot. I'd rather a maintainer decides that separately.Open question:
buzz.*is the reserved artifact type namespace. I usedbuzz.thread-titlebecause this is meant to become a Buzz convention. If you'd rather it start outside the namespace, it's a one-constant change.Related issue
Partially closes #6739 (title plumbing). Related: #8264 (relay threads view; its
/me/threadsrows carry thechannel_id+root_ida title is keyed by), #6067, #5254 (thread search in forums).Testing
thread_title.rs): head selection follows theprevchain rather than timestamps. Also covers the write-plan lifecycle, revisions passing relay validation, ignoring other artifact types, title normalization, root filters naming each derivedd, and that only compare-and-set losses are retryable.--if-unsetskips live and cleared titles but not untitled threads.threadTitles.test.mjs): same-tick lookups share one fetch, invalid ids are skipped, a failed batch rejects every lookup in it. Also covers revision handling on writes, draft trimming and clearing, and UTF-8 byte bounds.thread-titles.spec.ts): name a thread from its header, then clear it. A title another user sets appears before anyone replies.cargo fmtandcargo clippy(0 warnings) are clean. Desktop typecheck, file-size checks and biome on changed files pass.feat/threads-viewtip (which includes this commit): desktop Tauri 3254 passed; desktop unit 161/161; buzz-cli 500 passed; buzz-sdk and the other crates pass; buzz-acp 1046 passed. Five buzz-acp tests inacp.rs/relay(idle/keepalive, blocked recovery, two steer-capture tests) hang or fail the same way on plainmainon this machine, because they drivesh/sleepchild processes.I've run this daily against my own relay since early October, with agents auto-titling threads.