query-embed-on-cpu, follow-up daemon-embedder-gpu-pool: huginn-daemon takes
repeated --ollama-url (GPU hosts) and --reserve-ollama-url (CPU hosts) and
builds the same EmbedderPool as huginn-sources, through one ollama::pool
constructor. A lone --ollama-url is a pool of one.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
pool-blackhole-stalls: each due endpoint's identity is read on its own thread
under a 5 s bound, and a batch waits for reads only while no healthy primary
exists to start on, so a dark endpoint never delays work a healthy one can do.
pool-pins-first-identity: the pool is told the model the collection was built
with (Embedder::built_under, called by reconcile and refresh before the
identity read) and never writes with an endpoint serving another; it adopts a
model only when there is no collection, in list order.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Squash of eureka-body/self-run-closes-run 55dd620..93f93c1 (Soul go; orphan
sweep cut: the mind admits one Self run in force and launch's close_dead closes
a dead holder). Operator: 'Look into the stale runs issue' and 'why has this
xenos filth not been replaced with nice clean CLI yet'.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A mention string, display name or name list could write the word you into
the quoted join and pass for her own id. Now only to_you=true, derived from
her own sender id, says a message names her. Restores the newline escape in
the line format.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mouth delivers each message's mentions but the turn input never showed
them, so a Persona could not tell a reply to another Mind from one to her.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A link is checked by canonicalising it in the source against the canonical
seed root, so a link through another in-tree link cannot escape.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The persona document is replaced by design (compare-and-swap on updatedAt), so
its second put is a second receipt naming one identity. AdmissionIndex::build
read that as a doubled A10 write and refused every view and query. The persona
type has no admission facts there now; Mind::persona reads its own receipt. A
pipeline document written by two receipts still refuses.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The gate body moves out of the ignored test into one function over a Mind, now
also refusing a receipted pipeline write with no stored document. The ignored
test is a thin caller; CI plants each fault on a 135-document store.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Mind::view becomes validate_ref then Reader::at(head).view(id); Reader::view is
its lookup, so a caller holding one Reader views many documents from one
snapshot. stored_documents_read_back (ignored, HUGINN_MIND_SNAPSHOT) decodes,
validates, rekeys, re-prepares and views every stored document through one
Reader: O(N) where the deleted per-document Mind::view loop was O(N^2).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
mind::tests::snapshot_admits_and_reads_back (an O(N^2) per-document Mind::view loop
plus the six idunn-watchdog resolutions and over-64-byte withdrawals of the
2026-10-01 migration) and eureka-pipeline tests::stored_documents_read_back go,
with the leaf README's real-store section. The one gate follows in huginn-mind.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
With projection gone the walk spreads Selection::default(); an explicit
descending: false was a mutant no test could tell from the default.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The previous commit's test admitted a Superseded resolution of a question,
which admission refuses. Cite r2 through subject and superseded_by instead.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>