The CLI binary asks a real in-process daemon over CultNet; the daemon answers
through sources::search against an in-memory source index and a flat embedder.
Pins the citation line, the repo filter and limit, and the refusal naming both
models when the daemon embeds under another digest (Soul test-gaps). common
serve takes any index sink.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Retirement aborted the run on the first repo whose delete failed; it now logs,
names the repo in Refreshed.failed and goes on, leaving that repo's cursor and
mirror to be found again. Names are compared as written, so a repo the forge
now spells in another case is retired under its old spelling instead of kept by
a case-insensitive match while its points carried the old name (Soul
retire-edge-cases).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Retirement read the repo list as complete, so an empty or truncated answer
would have deleted every repo it failed to name (Soul catalog-shrink-retires).
The catalog now carries a shortfall: the pages summed before filtering are
checked against X-Total-Count, and a missing header counts as unvouched. The
run refuses to retire on a short or empty catalog, refreshes the repos it did
see, says so in Refreshed.retirement_withheld, and huginn-sources exits 1.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A failed run from A to B followed by a head C that reverts the files to A's
content diffed A..C as empty and kept the deleted chunks deleted (Soul
cursor-revert-hole: 32 of 40 chunks, cursor at C). With the cursor gone the
next run takes the whole-repo path whatever head it finds.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
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>
Each claim gets its own section in claim order: a follow-up's item verbatim,
a cut spec named as the task, an absent or other claim named by id. A failed
claim read fails the run before any lease or child. Spec
eureka-body:cut_spec:cut-cut-self-run-start-brief.r1, report .h1, Soul
verdict .s1 (promises hold; two Low findings filed).
Co-Authored-By: Claude Opus 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>