Persona: open_direct, her ask that the mouth open a DM with a person she was shown #32

Merged
eureka merged 4 commits from eureka/persona-open-direct into main 2026-11-10 20:22:48 +00:00
Owner

A Persona may now ask her mouth to open a direct message with a person her session was shown. Spec eureka-body:cut_spec:cut-persona-open-direct.r1; rulings and questions mind-dm-request-shape (own request/receipt pair), mind-dm-consent-home (the invite is the ask; Matrix holds consent), mind-dm-after-decline (a decline stands until the person writes first).

  • chat_client: chat_open_direct_request.v1 / chat_open_direct_receipt.v1, ChatOpenDirectRequest, ChatOpenDirectReceipt (ids present exactly for Opened and Existing, else it does not decode), DirectOutcome (13 names incl. DailyLimit), Chat::open_direct, and Refusal::UnknownKind so Bifrost's unknown-kind refusal fixture decodes. Fixtures in tests/fixtures/persona-chat-v4/ are Bifrost main 73c6f50's bytes, verified equal to the forge copy.
  • persona.rs: PersonaReply.open_direct (required, nullable; the schema admits it only in a Public session), bounded in decode_reply (Public only, with shown/not a Mind/not herself, text 1..4000 bytes), sent after the says with request id {batch}-d (-r{turn}-d when revised) under a brake re-read. A refusal or a silent mouth is one notice role=organ line on her next line, never a failed step. No consent state, counter, env or config is added.
  • Stale-reply note and the notice sentence of the messages header now name the open.

Not run here: clippy -D warnings already fails on main with this toolchain (rust 1.99: too_many_arguments, unused now_ms, .is_multiple_of, cloned slices); none are in this diff. Tests ran under unshare -Ur (the control store wants a root-owned directory). persona_bin tests need a live mind and fail here.

🤖 Generated with Claude Code

A Persona may now ask her mouth to open a direct message with a person her session was shown. Spec `eureka-body:cut_spec:cut-persona-open-direct.r1`; rulings and questions `mind-dm-request-shape` (own request/receipt pair), `mind-dm-consent-home` (the invite is the ask; Matrix holds consent), `mind-dm-after-decline` (a decline stands until the person writes first). - `chat_client`: `chat_open_direct_request.v1` / `chat_open_direct_receipt.v1`, `ChatOpenDirectRequest`, `ChatOpenDirectReceipt` (ids present exactly for Opened and Existing, else it does not decode), `DirectOutcome` (13 names incl. DailyLimit), `Chat::open_direct`, and `Refusal::UnknownKind` so Bifrost's unknown-kind refusal fixture decodes. Fixtures in `tests/fixtures/persona-chat-v4/` are Bifrost main 73c6f50's bytes, verified equal to the forge copy. - `persona.rs`: `PersonaReply.open_direct` (required, nullable; the schema admits it only in a Public session), bounded in `decode_reply` (Public only, `with` shown/not a Mind/not herself, text 1..4000 bytes), sent after the says with request id `{batch}-d` (`-r{turn}-d` when revised) under a brake re-read. A refusal or a silent mouth is one `notice role=organ` line on her next line, never a failed step. No consent state, counter, env or config is added. - Stale-reply note and the `notice` sentence of the messages header now name the open. Not run here: `clippy -D warnings` already fails on main with this toolchain (rust 1.99: too_many_arguments, unused `now_ms`, `.is_multiple_of`, cloned slices); none are in this diff. Tests ran under `unshare -Ur` (the control store wants a root-owned directory). `persona_bin` tests need a live mind and fail here. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Fixtures copied byte-for-byte from Bifrost main 73c6f50 (tests/fixtures/persona-chat-v4/), verified equal to the handoff copy.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Public sessions only; with a person her session was shown (not a Mind, not herself); text 1..4000 bytes; brakes re-read before the open; a refusal or a mouth that does not answer is a notice on her next line, never a failed step. No consent state is kept: the mouth reads it from Matrix.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
eureka merged commit 8fef8bdd9e into main 2026-11-10 20:22:48 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
GameCult/Huginn!32
No description provided.