Commit graph Huginn/crates/mind-body
Author SHA1 Message Date
211cfe5e82 SwarmWriter::open refuses a store holding a record it does not read
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-14 09:35:31 +00:00
0c2d1e2cab ControlWriter::open refuses a store holding a record it does not read
The CultLib pin makes a pull carry unregistered records instead of refusing; the writer guards like the heartbeat store does.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-14 09:31:17 +00:00
477482b1a0 Pin CultLib 75188fde (stamp hardening #175; includes #171 #172 #174)
The workspace's one CultLib pin moves 8fc74c70 -> 75188fdefa0b4baf131dbfd94e77d06a965f0cc6
(cultcache-rs 0.2.0 -> 0.3.1, cultnet-rs 0.1.0 -> 0.3.0 in the lock; the lock drops
the crates the old revision alone needed and gains sha2/stacker for the new one).

Adaptations the new cultcache-rs forces:
- CacheBackingStore::push/push_all return the stamps written; the five test
  stores follow (store.rs, receipt.rs, read_tests.rs).
- A pull now carries a record no registered type claims instead of refusing it,
  so the heartbeat writer's open() checks foreign_records() and keeps its
  fail-closed refusal of an old initiative store.
- A cache refuses writes until it has pulled, and a zero-byte file is not a
  store: two test fixtures pull first / plant a real store.

Not deployed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-14 09:14:30 +00:00
f09bc56e77 Chat: basis follow (conversation-following), counted by is_for (#65)
Wire string exactly `follow` (Bifrost #74); one constant FOLLOW_UP_BASIS; Soul pass at eeaaad9 PASS, finding fixed at c71be9d. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-12 12:24:20 +00:00
232764bf78 Persona saves a named attachment into her sandbox (BIFROST_CHAT_FETCH, off by default) (#64)
Specs cut-persona-save-attachment.r7; Soul s1, s2; flag off, not deployed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-12 02:07:13 +00:00
Meta Vens
ecf147dbd7 Merge hands/eureka-body-flush-keeps-unseen-revision: a flush spends no unseen revision (cut-flush-keeps-unseen-revision h1; Soul s1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 23:55:45 +01:00
Meta Vens
b721c3eac7 Merge hands/eureka-body-usage-per-turn: one usage line per turn (cut-usage-per-turn h1-h2; Soul s1-s2)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 23:37:30 +01:00
Meta Vens
51a13b7e82 mind-body: only an answer to a revision line spends a waiting stale-send revision
A flush answer never showed her the revision, so spending it acked a batch she
had not answered. final_reply stays the send-basis switch.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 23:28:19 +01:00
Meta Vens
8b18434282 mind-body: pin that a flush answer does not spend a stale-send revision she was never told
Fails at base: the flush acks delivery 1 and drops the revision.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 23:23:36 +01:00
Meta Vens
43c3b1c047 usage-per-turn: the capture reports both TTL cache writes (0), so its lines carry them
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 23:18:41 +01:00
Meta Vens
65642dcf3c usage-per-turn: model ids are field-safe and the cache-write TTL split is carried
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 23:18:41 +01:00
Meta Vens
b920f3f81f usage-per-turn: the captured error result carries result_index 0 and no usage
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 22:16:57 +01:00
Meta Vens
fbedfdce2f usage-per-turn: the three journal-exact tests expect the usage line after each result
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 22:13:16 +01:00
Meta Vens
e719aa3766 usage-per-turn: every result writes one usage line to the unit's journal, from its per-turn usage
usage_line reads model_usage_since_last_result (never the cumulative modelUsage);
write_result writes it after the result line, so Self runs and Persona turns share it.
Unreported usage says "not reported", never zeros.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 22:06:15 +01:00
b4f3a48a8f chat ingest core: room scope, credential scrub, chunker, refresh_chat, steward purge (#60) 2026-11-11 20:53:00 +00:00
ec8ba4b84c persona: renumber-in-flight test lets the clock run
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 17:15:19 +00:00
8a801d09dc persona: an event told in this process is not told again under a new seq
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 17:11:12 +00:00
51835636b8 persona: an event counts as answered only once its ack landed
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 17:00:33 +00:00
5f7314c668 persona: an event answered once is not told again under a new seq
A mouth that restarts keeps its seq counter but loses its pending, so its unacked events come back from the homeserver under fresh,
higher seqs. The client keyed everything on seq and told them twice. Progress now remembers the answered event ids; a delivery whose event
was answered is dropped from the poll and acked through (leading run only).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 16:57:01 +00:00
e988ecd521 persona: renumber test uses messages addressed to her
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 16:54:21 +00:00
5bd58b6e3f persona: test that events a restarted mouth renumbers are told once
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 16:52:34 +00:00
6ff4c50b29 chat_client: ext values in reply_to drop the link, not the poll; trace holds the quote line
- ElementVisitor reads newtype-struct, some and enum shapes (msgpack ext, timestamp) as Other, so that delivery's reply link drops with the
  warning and the message is delivered unchanged. Lists inside the link are skipped, not recursed into.
- The excerpt strip also removes U+034F, U+115F, U+1160, U+17B4, U+17B5, U+180B-180D, U+2800, U+3164; the header and the ReplyTo doc say an
  emptied excerpt reads as no text.
- trace_inputs records the quote line she was shown under the message.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 16:49:50 +00:00
94eb9401a5 public_surface: regenerate for the reply link
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 16:28:12 +00:00
2fb649e6ff mind-persona: BIFROST_CHAT_PENDING_V4=1 turns the reply link request on
Exactly "1" is on, anything else is off, nothing is echoed.

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
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
5e8573235b Vendor Bifrost chat_pending.v4 fixtures as persona-chat-v8
Byte copies of Bifrost tests/fixtures/persona-chat-v6/*.msgpack at
dc35c4a2542e868df6d5c06f2166732ac6be37ac (reply-to, no-reply-to,
reply-to-redacted answers; chat_pending_request.v3). Spec:
gamecult-chat:cut_spec:cut-chat-reply-link-decode.r2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-11 16:14:05 +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