Commit graph Huginn/crates
Author SHA1 Message Date
b4845aedcd huginn-mind: illegal retractions and non-label choices are stored refusals; claim_in_future follows the stored received_at
DeskBody::IllegalRetraction stores Refused bad_retraction after steps 4-6 (digest carries the form, so it never replays as a plain answer); a choice is any 1-200 byte text, stored Refused choice_invalid when no option label, grammar or not. claim_in_future compares against the whole-second received_at written to the record.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 17:08:40 +00:00
3a1677251b huginn-mind: Member and Steward faculties for desk receipts; pin the body digest, lookup position and sub-second claim
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 16:04:06 +00:00
368217a65a huginn-mind: tests for the desk fix batch (decider list, receipt faculty, older cards, times, notes, NFC, request_id Q1-Q6)
Each test was failed by a hand mutant of the rule it pins.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 15:49:53 +00:00
dcc51c170f huginn-mind: desk answers take the decider list as input, store attribution, received_at and request_id
DeskStamp carries answerer, attribution (Operator/Steward/Member per CultLib PR #72) and the decider
list; membership decides rule 5, the attribution never does. answer_desk and DeskStamp are crate-private.
The receipt names the operator only for the operator's account. counted_answer and R1 consider
options_hash. A stored answer keeps received_at, claim_in_future, request_id and a body digest;
the same (answerer, request_id) and body replays the stored outcome and writes nothing, another
body is request_id_conflict. Notes are Words (1..=4000 bytes, not blank); answered_at must be UTC.
The vector file is re-sliced byte for byte from PR #72 head 2dea6c56.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 15:46:02 +00:00
f1691ffc0d huginn-mind: pin that the desk door is refused before references are read
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 15:28:22 +00:00
5785c0c8c8 huginn-mind: options_hash at the bytes CultLib PR #72 pins
NFC every string, JCS (struct fields in key order through serde_json), SHA-256,
lowercase hex; the seam stays the single owner. Libby's 15 vectors, A-G included,
run as tests; the test fixture hash is gone. Adds unicode-normalization.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 15:26:03 +00:00
719b5104f5 huginn-mind: Mind::answer_desk, the counting door for desk answers
Rules 3-8, R1, R2, R4 of the binding spec; counted_answer derives which answer
counts; Door::Desk is the only door that may write a desk_answer, so Admit,
import and derivation refuse it. options_hash sits behind one seam, failing
closed until the bytes are filled; tests use a named fixture hash.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 15:24:08 +00:00
be35c72a16 eureka-pipeline: the desk_answer kind, tagged DeskOutcome and its key
One kind, key <campaign>:desk_answer:<question label>.n<sequence>, one tagged
outcome (Counted, Revision, Retraction, Refused). Published schema, index row,
golden line and the PipelineKind enum in sibling schemas regenerated.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 15:15:48 +00:00
1a04d0efd9 Merge pull request 'Persona: send chat_read for the newest placed event per room at the echo' (#28) from eureka/chat-read-receipt into main 2026-11-10 14:55:00 +00:00
2f165d8d1e huginn sources --front: search only a repo's front-page files
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>
2026-11-10 14:47:47 +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
a60e83fce9 Merge pull request 'Sources index: skip .obsidian, .voidbot, LICENSE and provenance files' (#26) from eureka/sources-skip-noise into main 2026-11-10 14:24:00 +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
1ee0b86f30 Sources: licence rule narrowed to bare or prose-extension names, chunker version stays 1
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>
2026-11-10 14:06:10 +00:00
6d1766dd72 Sources: skip .obsidian/.voidbot dirs, licence files and *.provenance; bump chunker version to rebuild
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-10 00:44:25 +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
05f593476e Merge pull request 'AlreadyResolved names the closure in force' (#22) from eureka/refusal-names-the-closure into main 2026-11-09 12:10:30 +00:00
f4e419ef45 AlreadyResolved: the correction test takes closed_by from the refusal
Mutating the resolution path's closed_by to the subject fails the test.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 12:08:34 +00:00
563b6f3bf4 Merge pull request 'Import: resolution of a window follow-up or idea is inert' (#23) from eureka/import-inert-resolutions into main 2026-11-09 12:05:24 +00:00
3b35fb8bae Import: order the use list, pin the later-batch collision, state it in the window_writes doc
A follow-up the receiver wrote natively, closed, and a later batch replays is inert to the
daemon now and refused as an identity collision when the batch arrives.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 12:05:24 +00:00
0c4e700b9e Import: the resolution of a follow-up or idea the receiver wrote is inert in the window
inert_in_window covered FollowUp and Idea only, so a receiver's own resolution
of such a record, admitted after the import began, refused the rerun in both
the tool (resume/window_writes) and the daemon (root_holds_native_write).
A Resolution whose subject is a follow-up or idea the plan does not replay
touches nothing planned and now stays beside the replay. One predicate, both
callers; the resolution of a replayed follow-up, or of any other kind, still
refuses.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 11:48:19 +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
69ba61f054 AlreadyResolved names the closure in force, so a wrong closure can be corrected
A closed row is corrected by withdrawing its resolution and resolving the
subject again at the next sequence; admission already allows it, in one batch
too (new test). The refusal gave no way to find it: a Mind that tried to
Withdraw or re-resolve the follow-up itself got AlreadyResolved with only the
subject. It now carries closed_by, the resolution key to withdraw.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 11:41:21 +00: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
Meta Vens
94f235e7ce open lists: order by origin time (an import is as old as it was in the giver), clip each line's item text, name the dropped follow-ups' campaigns
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 11:57:48 +01:00
Meta Vens
31b924704c persona tests: the ask ids carry the instance prefix
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 11:30:17 +01:00
Meta Vens
a9dd115c67 persona: open commitments and asks list oldest first too; headings say so, the count says how many more are not shown
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 11:28:35 +01:00
Meta Vens
970578e167 persona: the follow-ups selection is the default ascending one; no redundant descending flag
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 11:19:36 +01:00
Meta Vens
cab7fb3421 persona: open follow-ups list oldest first, by admission; the bound drops the newest and says so
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 11:08:20 +01:00
Meta Vens
122a968f30 closing rule: acts without a commit close Recorded, Fixed names the merge or squash commit, the reminder bounds Recorded; each flush names its own reason
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 10:27:54 +01:00
Meta Vens
e47eec7e85 brief-done-means-landed: one closing rule for the Self run, told once at start; briefs and flush point to it
A brief that asks for a change closes Fixed by a default-branch commit, not Recorded on an open PR; work waiting on someone else is superseded by her own follow-up. Replaces the three 'Recorded with your answer' sentences.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 10:04:02 +01:00
d0edfdb403 import: publish the amended ImportOutsideCampaign text; pin the outcome-citation path
Soul: the schema carries the refusal's doc comment, so the published response
schema follows it; an imported Superseded{by} naming the receiver's native
follow-up is refused, which a source-only mutant now fails.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 21:55:35 +00:00
9958555d71 import: an imported record never cites or resolves the receiver's own native document
Soul F1: the window left open by `inert_in_window` let a later imported record
withdraw or cite the receiver's native follow-up. Admission now refuses an
imported document that cites or resolves a native document of its own root
(another root's native documents are cited as ever). Stale docs and the import
help name the amended rule.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 21:43:00 +00:00
241a4d5584 Merge origin/main 2026-11-08 21:28:25 +00:00
0f417143f7 import: a follow-up or idea the receiver wrote after the import began no longer blocks the resume
Nibu's stopped import of aetheria-release was refused twice over for her own
run's follow-up chat-s4606-4606: by the verb's resume (a record under the root
not imported from the source) and, had that passed, by admission
(ImportOutsideCampaign, a native write under the root). Both now leave a native
FollowUp or Idea alone when it was admitted after the root's first imported
document, share one predicate (`inert_in_window`), and the verb names what it
left in place and leaves it out of the final verification walk. Every other
native kind (a question, a resolution, a ruling, a target) can answer or
resolve a replayed document and still refuses; a collision on a planned key
still refuses. No evict verb: a receipt cannot be unwritten.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 21:28:25 +00:00
209712e2c9 Merge origin/main into the import-foreign-cite PR: #19 landed the same waiver
The code of this branch is dropped for main's `historic` waiver; what remains
is the committed Finding case (thing2 1815, aetheria-release 2247) and the
kind-agnostic case, which kills a waiver limited to follow-ups.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 21:20:51 +00:00
Meta Vens
e77e0f361b admission: a report's spec is always its own campaign's, so its status check is never skipped
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 21:57:38 +01:00
Meta Vens
8cc62f192e move_tests: a spec's successor lands with its supersession
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 21:56:22 +01:00
Meta Vens
f4f857a7da admission: skip the status check only for a citation into another campaign; drop the unreachable run-claims skip; a test for each live site
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 21:54:59 +01:00
Meta Vens
6beb52e809 move_tests: B's two receipts
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 21:16:43 +01:00
Meta Vens
3b64a1aaa3 admission: an import is not refused for citing a document resolved after its source ordinal
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 21:15:16 +01:00
971d96212f move tests: pin the real Finding case and the kind-agnostic waiver
The replay of a cite of another root's closed document is pinned with a
Finding deferred to a closed follow-up (the thing2 and aetheria-release
cases) and an Idea superseded by a recorded Idea of another root, which
kills a waiver limited to follow-ups.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 20:02:05 +00:00
Meta Vens
48e81bdf80 persona: the work tail names her plans as well as her open follow-ups
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 20:55:13 +01:00
Meta Vens
d386da81bc persona: the work question names her plans and memories, says open pages, and drops the messages clause from no-message lines
WORK_QUESTION also sends her to huginn query over her own plans, frames what she
finds as candidates she weighs, names --cursor, and says every follow-up in her
campaigns is hers whoever filed it. The messages clause is ANSWER_MESSAGES, set
before the question on first lines that carry messages only. Stale prose about
bare later lines is corrected in the body map, MESSAGES_HEADER's comment and one
test name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 20:46:11 +01:00
7218c4a9d7 admission: an import replays a cite of another root's closed follow-up
A resolution's cited referent had to be in force in the receiver. When the
receiver had already imported the other root (cultlib-gaps, aetheria-ew) and
that referent closed later in the giver, the replay of the earlier Deferred
cite was refused with CitesResolvedDocument and the import stopped. The cite
was in force when the giver made it; an import now asks only that the
foreign referent is held (A7), not that it is still open. Same-root cites
replay in the giver's order and keep the rule; native writes keep it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 19:32:01 +00:00