Commit graph Huginn/crates/mind-body/src
Author SHA1 Message Date
ec2d11efe8 persona: show a valid reply_to as one organ-framed quote_line
The quote is data on its own line after its message, every variable part
quoted, role derived from the sender id. Dropped links never render.

Spec: gamecult-chat:cut_spec:cut-chat-reply-link-decode.r4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 16:28:12 +00:00
cd3066dde9 chat_rudp: opt-in chat_pending.v4 request with step-down, warned set
RudpChat::with_reply_link asks the v4 kind first and steps down one rung per
UnknownKind refusal (v4 -> v2 -> v1); flag off sends today's bytes. The
dropped-reply warning prints once per event id and reply_defects counts them.

Spec: gamecult-chat:cut_spec:cut-chat-reply-link-decode.r4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 16:28:12 +00:00
aad5e204a2 chat_client: decode Bifrost chat_pending.v4 reply_to as a lenient ReplyLink
ChatDelivery gains reply_to (tuple index 14): Absent, Quote(ReplyTo) or
Dropped(ReplyViolation). A reply_to outside the contract is dropped whole and
never fails the poll; reply_warnings words and deduplicates the organ-side
warning. Sender and event id are held to Matrix id shapes; the excerpt is
bounded at 240 code points as sent, then stripped of invisible characters.
Adds the v4 consts and the unicode-general-category direct dependency
(already in Cargo.lock).

Spec: gamecult-chat:cut_spec:cut-chat-reply-link-decode.r4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 16:28:12 +00:00
6d6aea7059 Merge pull request 'mind-self-run: redact URL userinfo from Self result text' (#50) from eureka-body/self-run-redact-url-userinfo into main 2026-11-11 14:21:27 +00:00
4e4f3a7f3b redact: treat git+https and ws/wss bare userinfo as a token
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 14:21:14 +00:00
08afef830f redact: read the authority as URL parsers do
Userinfo is everything before the last @ of the authority, which ends at / ? # backslash, quotes,
brackets, angle brackets or ASCII whitespace; a path @ (github.com/@user, pkg@1.2.3, a//b@c) is left
alone, non-ASCII stays inside userinfo. Protocol-relative // opens an authority only at a word start.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 14:15:12 +00:00
f4951db649 Merge pull request 'mind-stream: the Projector is her own connector caller on Haiku; a brake hold stops mind-stream@ too' (#47) from hands/eureka-body-stream-projector-kit into main 2026-11-11 14:13:51 +00:00
b19e57a6d3 redact: only ASCII whitespace ends a candidate run
NBSP, U+2028 and other Unicode whitespace stay inside userinfo, so a secret holding them is redacted whole.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 14:06:19 +00:00
2d9e959c56 redact: drop needless mut
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 14:03:14 +00:00
9bd6936ea6 redact: char-safe, fail-closed run rule; cover Persona/Sleep structured output
Candidate run is everything to the next whitespace, userinfo up to its last @; protocol-relative
// and the narrow word:secret@host.tld/ shape are covered; scanning no longer slices inside a
multibyte character. persona::structured_output redacts each string through the same function.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 14:01:35 +00:00
480f94875b mind-self-run: redact URL userinfo from a result's text before journal and reply
One function, redact_url_userinfo, owned by result_text: the journal line and the admitted
PipelineReply both read the result through it, and redaction runs before the reply is chunked.
scheme://user:tok@h and http(s)/ftp(s)://tok@h become scheme://<redacted>@h; ssh://git@h stays.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 13:53:22 +00:00
f8558a12a3 persona: a rule's words are four words of her own line outside any quotation form or quoted reply; tests pin later lines and title control
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 12:48:32 +00:00
692586d607 Merge origin/main into hands/eureka-body-steward-rulings
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 12:42:04 +00:00
0f2652d7fa mind-body: chat_pending.v3 tail_gaps, a defaulted fourth field; a named room is unknown in the first line, never quiet
Bifrost b2e0bb2 sends [persona, deliveries, tail, tail_gaps]; a three-field decode failed LengthMismatch. The field defaults empty, so three-field answers still decode, and render_tail splits unknown (named) from quiet (unnamed, no line).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 12:27:42 +00:00
a26bce249d persona: a rule's words are a clause of her own line outside quotation, its campaign is checked before any effect, a co-stewarded repo is not a rule, and the repo fault names her repos; tests pin the survivors
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 12:26:47 +00:00
3389ead5a2 Merge remote-tracking branch 'origin/hands/eureka-body-persona-mind-role' into hands/eureka-body-steward-rulings 2026-11-11 12:17:43 +00:00
c243d731eb persona tests: pin the addressing table at every site that reads a role
Soul s1 findings trace-and-render-wiring-unpinned and tail-and-earlier-role-unpinned:
trace inputs, earlier and tail lines, tail and burst size measures, the tell's
people and open_direct refusal now fail when handed an empty table.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 12:09:40 +00:00
aa15dfb36e stream tests: the key reader's rules pinned in every shape Soul mutated
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 12:07:22 +00:00
bf3f610b66 mind-stream: the thought's model comes from the Projector; connector key reader and membrane pin tested; swarm stop line derived
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 11:58:12 +00:00
416fd7f719 persona: rule records a peer steward's decision as authority Steward; addressing rows carry stewarded repos; recall names the decider
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 11:56:53 +00:00
4e9d1dbd23 stream tests: take the recorded request id by value
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 11:40:35 +00:00
8a324186cf mind-control: a brake hold stops mind-stream@ with the Mind's other units
The hold's unit list is one owner (held_templates); the operator line is printed from stop_args.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 11:37:34 +00:00
ee72561716 mind-stream: the Projector is her own connector caller; Ollama keeps only the raw continuer
KitProjector sends one tool-less kit turn per tick as caller <instance>; OllamaStream's /api/chat Projector and StreamModel are deleted, replaced by the Projector and Continuer ports.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 11:37:34 +00:00
8018322b2a persona tests: goldens read libby as role=mind
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 11:37:21 +00:00
69f9003b9b persona: another Mind reads as role=mind from the swarm's addressing table
Config::sender is deleted; sender_role over the session's addressing decides a
sender's role on message, earlier and tail lines, trace inputs, the names a
memory may be about, and who she may open a direct with.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 11:35:11 +00:00
37be2cd305 mind-self-run: the child's HUGINN_SESSION is its run's label
Spawner::spawn takes the session to export; the Self run gives the bare run label (the spelling the run's opening receipt carries). The Persona gives none.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 09:21:26 +00:00
0ee9c0228e Room tail: consumer-cap, hostile-field and key-dedupe tests; real three-field v3 over RUDP; a fully deduped tail is not called quiet; deploy-order note
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 08:34:51 +00:00
7eb0440e00 Room tail comes from the mouth's chat_pending.v3 tail field; the in-process accumulator is deleted
ChatPending gains a defaulted Option tail (old two-field mouths still decode), Chat::pending returns it, and a process's first line renders it: speakable rooms only, 20 per room and 60 in all, byte bound counting framing, quoted untrusted data, dedupe by event id against waiting deliveries, a marker for dropped lines and for rooms with none, and an unavailable note when the mouth sends no tail. A failed first poll fails the start as Chat again.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 08:24:23 +00:00
9c1a5dba07 Persona process opens with the tail of her rooms: lines the mouth delivered through the ack, bounded, framed as untrusted data, unavailable noted
Matrix is the record and the mouth its only reader: the tail is assembled from the deliveries and contexts the mouth already sends (no new endpoint, no stored copy). Newest 60 lines / 24 KiB, oldest dropped with a marker; public sessions read the rooms she may speak in, a DM session its own room alone; a first poll that fails degrades to a tail-unavailable note instead of failing the wake.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 07:50:14 +00:00
fa90daf8e6 Address-only wake tests: the stale-send revision, an unaddressed line behind a told one, the retried ack, and a project-only message told as a message
The Soul's surviving mutants n01, n08, n09 and the vacuous project test (n07, n11) now fail the suite.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 07:27:19 +00:00
2f04e13ea5 Address-only wake: a DM is hers whatever the basis; the quiet ack reads her projects' names from her mind; no quiet ack while a stale send waits; a refused ack in a poll is retried
Soul findings F1, F2, F3 and F6 on PR 43.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 07:13:07 +00:00
50d8e60102 Persona wakes on address only: chat_pending_request.v2 / chat_pending.v3 basis and form; unaddressed deliveries are acked in sequence and tell no one
Consumer half of ruling eureka-body:ruling:addressed-delivery-only. A delivery is for a Persona when it is a message and Matrix says
direct/tag/reply, or its mentions or text name her (address::is_for); notices, edits, @room and a nil basis (unproven) wake no one on
their own. The heartbeat's off-beat wake keeps its sender gate. The Persona acks the leading run of what is not hers in one ack and a
live session is told only what is hers. A mouth that does not serve the v2 request is asked the v1 way. Golden bytes pinned from Bifrost
tests/fixtures/persona-chat-v5; the public-surface snapshot is regenerated.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 06:43:46 +00:00
05a6726738 Tests kill three open_direct mutants: schema field description, non-UnknownKind refusal, payload-persona mismatch
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 00:14:55 +00:00
88a36386a5 open_direct hears the mouth's UnknownKind refusal and is told not sent; one creation-policy text for the schema and the DailyLimit notice; pin InvitePending wording
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 23:46:35 +00:00
e43a7343f8 Chat RUDP test: an open the mouth refuses as UnknownKind ends the wait and is heard (failing: the refusal is ignored); MouthRefused error type
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 23:44:30 +00:00
63d1825628 Pin the InvitePending notice: tell her not to send another invite
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 20:26:19 +00:00
732ed009f2 Persona: pin the schema a Direct session runs under; describe open_direct in the module doc
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 19:25:06 +00:00
bd53de4ec6 Persona: her reply may carry one open_direct, bounded and sent after the says
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>
2026-11-10 18:58:13 +00:00
4bb5cd6657 Open-direct: the chat wire types and trait method, and the failing Persona tests
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 18:51:10 +00:00
cc5937d37c Open-direct wire: Bifrost's v4 fixtures and the failing codec tests
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>
2026-11-10 18:47:29 +00:00
db50e16a8a Persona: report the newest placed event per room as chat_read at the echo
One gamecult.persona.chat_read.v1 [persona, room, event_id, at_unix_ms] per room per echoed batch,
sent over the same RUDP endpoint as chat_ack, from PersonaInbox::echoed (the CLI has taken the line).
Newest placed event only; no event ids on earlier lines. Display-only: a failed report is dropped.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 14:46:44 +00:00
59aca09c62 Self run: a refused reply holds back the replies behind it, so a long result reaches the mind in order
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 14:21:04 +00:00
8073a7c3bc Self run test: the whitespace tail of a long result is never offered to the mind
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 14:08:14 +00:00
6c5f83e607 Self run: a whitespace-only piece of a long result is no reply; every piece answers the briefs (tested)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 14:07:35 +00:00
6734cafafa Self run: deliver a result whole, never clipped
The journal line carries the full result; a result longer than a reply's
bound is emitted as consecutive replies (-r{n}), cut at character
boundaries, with the same answers. RESULT_TEXT_LIMIT and the
[truncated] marker are deleted.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 00:43:36 +00:00
Meta Vens
72aa58050e tests: pin the exact-fit follow-up line and the six-campaign note edge
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 12:43:10 +01:00
Meta Vens
e31c87cfb9 tests: the bound test's open count follows the clip; the import test checks follow-ups
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 12:07:07 +01:00
Meta Vens
c50bc9a511 tests: counts follow the clip; the import test names its labels
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 12:04:55 +01:00
Meta Vens
7c919a2146 open lists: origin order for follow-ups only (an import never carries a memory); tests follow the clip
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 12:02:59 +01:00
Meta Vens
e52e34397d testkit: one committed_imported
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 11:59:06 +01:00