Zero, nine and blank texts answer Refused naming `texts` and never reach the
index; two texts are one queued search. Cut
gamecult-chat:cut_spec:cut-source-query-texts.r1.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
search() embeds each distinct trimmed text (Instruct:-prefixed) in one batch,
searches once per vector, and fuses with reciprocal rank (k=60, depth 50) only
when more than one text remains; one text is searched top_k deep and answers
with the cosine scores as before. Cut
gamecult-chat:cut_spec:cut-source-query-texts.r1, commit 3.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
fuse is a pure generic function over ranked lists and a key closure, with
FUSE_K = 60 (Cormack, Clarke, Buttcher, SIGIR 2009) and FUSE_DEPTH = 50 named
beside CORPUS. Nothing calls it yet. Cut
gamecult-chat:cut_spec:cut-source-query-texts.r1, commit 2.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
SourceQuery gains `texts` (one to eight, SOURCE_TEXTS_MAX) beside the
transitional `text`; check() refuses neither, both, more than eight and blank
entries, naming `texts`. SourceHit.score documents cosine versus reciprocal-rank
sum. Published request and response schemas regenerated. Cut
gamecult-chat:cut_spec:cut-source-query-texts.r1, commit 1.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Newest first by admission ordinal, cursor strictly below, counts over the showable set, limit 0 is
counts and stamp. Whole record to the peer-checked socket; the trust boundary is pinned in the
desk_door module doc and the DeskRequest/DeskResponse docs. Published schemas regenerated.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Types ForkCard/Record/Entry/List, ForkCursor and ForkLimit validated at decode, DeskRequest::Forks
gains status/cursor/limit flat, DeskResponse gains Forks and Fork, the daemon dispatches to
Mind::desk_forks/desk_fork (stubs). Vectors vendored at CultLib e57fbaee. The tests pin the rules
the next commit implements; DESK_READS_UNBUILT and its test are gone.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
desk_door.rs owns who may speak, the socket's life and the frame bounds; Daemon::handle_desk owns which Mind method answers (Answer via desk_answer, the replay flag gating index.committed; Forks and Fork refused Unavailable until desk-door-reads). startup returns Started; run takes the door; its five callers pass it or None. desk_wire::answer_ref is the one spelling of a stored answer's ref.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
SourceQuery gains `front` (serde default false, so an old client's request
decodes as before). The one owner of the list is sources::FRONT_PAGE_FILES;
the Qdrant filter matches `path` against it with MatchAny on the existing
keyword index, composed with the `repo` condition. The CLI prints the
citation line range as before.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The skip list now matches `license`, `licence`, `copying` only with no extension or md/txt/rst, so src/license.rs and Copying.cs stay indexed. CHUNKER_VERSION is back to 1: a bump rebuilds the live collection; the already-indexed noise paths go by a one-time delete_by sweep instead (work/sweep/sweep-sources-noise.py, same rule).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The giver: (Campaign, Moved) joins the matrix; a Moved to this mind refuses MoveToSelf and a withdrawn Moved MoveIsFinal; any staged document rooted at a moved campaign, derived ones included, refuses CampaignMoved; Docs::closing_resolution reads every other document under the root closed by the Moved, and the image fans status_changed out so an earlier as_of still reads in force. The oracle derives the same fallback independently.
The receiver: PipelineProvenance.imported_from (optional, absent from every other receipt and from the digest) names the source receipt and the externals the batch cites. An import derives nothing, refuses its own instance, a Moved outcome, and an external this mind holds; a listed external stands in for an absent referent. mind-body persona.rs gains one outcome_words arm for the new variant.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
address.rs is the one rule for whether a delivery is for a Mind (tag, or a name as a whole word, a listed name exactly as written and a derived or her own in any case); heartbeat's addresses and names_whole_word move into it, the Persona's to_you and own stagger rank call it. eureka-pipeline PipelineStewardship gains names (absent when empty); facts, schemas and golden follow.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The failed-upsert revert test now expects chunks of two commits, since
nothing is deleted before the new chunks land.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Source refresh now upserts a repo's new chunks first and deletes what is
left in scope under another commit afterwards, so a failed embed never
removes indexed content (embed-outage-empties-repo). The cursor is still
dropped before the first write.
The pool's reserve endpoints use EmbedBounds::RESERVE (30 s a text, 60 s
floor) instead of the GPU default (reserve-bounded-like-a-gpu).
Co-Authored-By: Claude Opus 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>