fix(archivist): stop filing your conversations, keep what you pin - #70
Merged
Conversation
Talking to the family agent in a thread got filed. A long message became a note, and every reply after it read as a correction to that note, so the archivist kept reclassifying while you were talking to someone else. Inside a thread the archivist now only acts where it answered first -- its own filing threads, where corrections belong. @-mentioning it still works anywhere. The main timeline is unchanged.
One room, several bots. Writes down the signals each of them reads, the thread-ownership rule, and the three gaps still open (the vocative matcher is not shared, scribe has no gate, no per-room off switch).
The thread gate was dropping them. An email's attachments arrive in the thread under its own card, seconds before the archivist's filing lands there, so at that moment the thread belongs to nobody and the school permission slip went on the floor. A source card or an attachment is addressed to the archivist by contract, so no room or thread rule gets a say. Also adds the sequence diagrams for the four ways a family message gets answered.
Document filing and notes/bookmarks, what each is for, and the route each takes. The split is fine; the grain is not. Proposes the thread as the unit the agent judges, with unconditional timeline capture kept underneath so a model failure never loses anything.
In a room with other people in it, a long message is usually just someone talking. Filing those produced notes named after error messages and stray remarks nobody meant to keep. Now the archivist only files a text message on its own when you are the only person in the room. Everywhere else, react 📌 to keep something, which already works at any length and in any room mode. Links, photos, PDFs, voice memos and documents are unchanged.
Two scenarios: chat between people is not filed but 📌 keeps it, and the archivist stays out of a thread another bot is answering in while an @-mention still reaches it there. Parked as `unverified` until a green rig run.
Replying to "no text recognised, please tag it manually" ran your words as a search instead of applying them. The document that most needs you to describe it was the only one that would not accept a description. Every filed document now carries its filing marker, whether or not the classifier had anything to say about it, so a reply in its thread reclassifies it with your message as the input.
Pinning a message filed it in silence and only showed a result once the classifier was done, which on a local model is half a minute of nothing. It now reacts 👀 the moment it picks the message up, the same as a pasted link or an uploaded file. Notes were the one capture shape without it, and 📌 is the only way to keep something in a room with other people in it, so it was the gesture that most needed the reassurance.
The arbitration spec runs green now, so the unverified marker comes off. stacker-bot is invited when the room is created: the room is private, and the send path joins as a plain client, which Synapse refuses. The failed send returned an error dict that the guard read as a pass, so it now checks for success outright. Room names and pasted text carry the scope uid so a run's leavings can be found in a live vault.
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.
The archivist read a long message as material to file. In a room with other people that is usually just somebody talking, and filing it produced notes named after an agent's error message. Its own card then sat in the thread, so every line typed afterwards read as a correction to that note: one paste became a reclassification loop that could not be stopped by talking.
Two rules decide who acts on a message now. With more than one person in the room the archivist stops guessing from shape, and 📌 is how you keep something. A thread belongs to the first bot that answered in it, so a family's conversation with the agent is left alone. An @-mention still reaches the archivist anywhere, and links, files and voice memos are unaffected either way: pasting a URL or dropping a PDF is a deliberate act, not a turn in a conversation.
Pinning now also tells you it landed. A note was the one capture shape that filed in silence, and classification on a local model is half a minute of it. It reacts 👀 on pickup, the same as a link or an upload.
Also here: email attachments keep filing when the mail bot hands off into a thread nobody owns yet, and a scan the archivist could not read can be corrected instead of being a dead end.
docs/design/brain/who-answers.mdis the written version of the two rules, andtests/integration/test_bot_arbitration_e2e.pyis the executable one, green against the rig.