Commit graph Huginn/crates
Author SHA1 Message Date
Meta Vens
c2ff5b78f6 heartbeat tests: the open Persona turns in the busy fixtures have a live unit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 00:06:35 +01:00
Meta Vens
cbb90d5811 heartbeat: busy is the slot's reading of life, so a dead Persona holder is closed by the next launch
A brake hold that stops her unit left an in-force run that counted as busy
forever; the row was never launched, so slot step 0 never closed it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 00:02:39 +01:00
Meta Vens
c8f887f31f heartbeat tests: a dead Persona holder is not busy; a live one is
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 00:02:38 +01:00
Meta Vens
153678a321 Merge origin/main (fb19703, held-questions successor cut) into eureka-body/persona-session
The one conflict was the public-surface snapshot: the branch's new
launch::StopScope line beside main's LaunchOutcome::Tripped { run } line;
both kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 21:43:29 +01:00
Meta Vens
64d6edc0f6 Huginn persona: ack nothing once the session has failed, so a line answered after a batch's third refusal cannot ack past it (Soul s3 ack-passes-batch-after-refusal-bound)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 21:18:19 +01:00
Meta Vens
5cce3484a3 Huginn persona tests: a line answered after a batch's third refusal must not ack past it (red at 1fc3470; Soul s3 ack-passes-batch-after-refusal-bound)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 21:17:42 +01:00
Meta Vens
1fc3470661 persona tests: read the retold line's content, not its JSON-escaped text
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 20:23:47 +01:00
Meta Vens
b23a01fa8b persona: a second refused reply merges into the pending retell, and a refusal bound belongs to the batch (s2 retell-overwrite-loses-batch, ack-frozen-by-refused-retell)
The single retell slot becomes one merged Retell (every refused delivery not yet told again, in seq order, with the refusals of the most-refused one), so the ack rule's lowest unanswered seq never loses a batch. The refusal count travels with the batch through its Written line and echo instead of resetting on any answer; a batch's third refusal ends the session by the existing failure path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 20:20:34 +01:00
Meta Vens
0715fbdb59 persona tests: the freeze test alternates answers with the retold batch's refusals, so only a per-batch bound ends it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 20:19:01 +01:00
Meta Vens
4400c32c1e persona: tests for a second refusal losing the first retell and a retold batch freezing the ack (s2 retell-overwrite-loses-batch, ack-frozen-by-refused-retell)
Soul's probe_ack.rs reproductions as committed tests, with a Timed child that moves the clock past a poll; they fail at bde8ef6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 20:16:30 +01:00
Meta Vens
bde8ef68f9 public surface: StopScope as the tripwire prints it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 19:21:48 +01:00
Meta Vens
59a769081c persona: no ack while an unanswered delivery lies below the answered seq
Deliveries are told in seq order, so an unanswered one below an answered seq
means nothing answered lies below it; the ack waits for the retold batch's
answer. The test reads the next process's opening line as JSON.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 19:18:17 +01:00
Meta Vens
bcbad56c04 persona tests: return the acks directly (clippy let_and_return)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 19:14:34 +01:00
Meta Vens
94af948981 persona tests: the ack never passes a retold batch, the brake read between sessions, a poll after the echo
Soul s1 retell-ack-passes-unanswered, between-sessions-read-unpinned and
poll-retell-guard-unpinned. after_echo moves the clock when the echo is
handed out, so a poll falls due while the turn runs and unanswered 1 is
pending; the old during-based test jumped before the driver read the clock.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 19:13:42 +01:00
Meta Vens
0f19eecbe1 persona: the ack is decided once, in PersonaInbox::result, from what is still unanswered
act no longer acks. result acks through the highest answered seq of the
process, never past a delivery still told and unanswered (the retold batch or
a line written and not yet echoed), and only forward. Soul s1
retell-ack-passes-unanswered: a newer turn's ack passed a retold batch, so a
session ending first lost it and the retell's answer acked a lower seq.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 19:13:42 +01:00
Meta Vens
aab25a5a00 sandbox: the scratch is read-only to her, only claude-config is writable
Soul s1 scratch-symlink-deputy-write: she could plant a link at the
instructions file in the unit's RUNTIME_DIRECTORY and the organ's next write
followed it onto any path the unit's user can write, the hidden trace included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 19:11:48 +01:00
Meta Vens
edfbf9ce25 mind-control: swarm brake hold stops every Mind's units, through the one stopper
stop_all becomes SystemdLauncher::stop(StopScope): a Mind's two exact units,
or the swarm's mind-self@*.service and mind-persona@*.service globs. Both
holds write first, then stop whatever the write's outcome, with the same four
outcomes. Soul s1 swarm-hold-leaves-live-turn-running: a held swarm brake left
a live Persona turn running with its shell until the turn ended.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 19:11:21 +01:00
Meta Vens
14e7838813 persona tests: the hold-between-sessions test back on the 1 s clock
A 1 ms clock never reaches the session's idle timers (the loop guard fired); the other two new tests passed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 17:51:32 +01:00
Meta Vens
fa3d819be5 persona tests: a quiet clock for the hold between sessions, a poll during a turn, the rotation flush text
Written from mut3's survivors (process-boundary brake read, poll seq bound, flush_text); not yet run when committed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 17:50:24 +01:00
Meta Vens
5add8a9ecd persona tests: lease expiry, a hold between sessions, a result with no structured output, request ids by batch
Written from the first mutation run's survivors (unix_ms, the process-boundary brake read, record_refusal, the batch-id arm).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 15:28:49 +01:00
Meta Vens
ffcd2666c5 Restore LF line endings on the files the WIP commits converted to CRLF
The base is LF; the wip commits rewrote whole files as CRLF, hiding the real diff. Content unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 13:45:37 +01:00
Meta Vens
fb197039b6 retire test: the briefs staying in force is the proof; run closures are resolutions too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 12:33:15 +01:00
Meta Vens
9c58d5620f The gate reads the hold itself at admission; the heartbeat no longer writes resolutions on an answer
open_and_launch decides what an open question holds, once, after the breaker reads and just before the admission: LaunchRequest.held and Held's Default are gone, so no caller can launch a held item and a caller's earlier read (claimable) is advisory only. launch::retire_answered and its heartbeat call are deleted: whoever answers retire resolves the claims, and the hold persists until they do. The retire option text is restored to the r4 wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 12:29:55 +01:00
Meta Vens
359ae784ec wip10 2026-11-01 12:12:52 +01:00
Meta Vens
ad35cd28e0 wip9 2026-11-01 12:09:50 +01:00
Meta Vens
39f3623af1 wip7 2026-11-01 12:06:09 +01:00
Meta Vens
354af5a192 wip6 2026-11-01 12:04:15 +01:00
Meta Vens
08a6959195 wip5 2026-11-01 12:02:56 +01:00
Meta Vens
7ffddd8673 wip4 2026-11-01 11:59:16 +01:00
Meta Vens
93a6f2d2e9 wip3 2026-11-01 11:58:43 +01:00
Meta Vens
cfbe183468 wip2 2026-11-01 11:56:42 +01:00
Meta Vens
ee0bf1201d wip persona-session (local, does not build tests) 2026-11-01 11:54:25 +01:00
Meta Vens
9003624c3e queue test: the held items are a set, open holds first
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 06:23:13 +01:00
Meta Vens
79e4cac5fd blocked selects the held questions by key alone; the retire test pins which run's claims an answer retires
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 06:20:11 +01:00
Meta Vens
fa5c65c6f4 cli test: the hold of spec B is its own run's question and not A's
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 05:43:30 +01:00
Meta Vens
b1f0654f54 tests: blocked tells a second run's question from the first; a free brief writes no closing note
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 05:42:47 +01:00
Meta Vens
0e7b044d61 mind-body: the public surface spells the hold snapshot; holds and retire_answered stay crate-private
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 04:18:18 +01:00
Meta Vens
4c217faf22 queue tests: drop a merged duplicate of the daemon-port test body; slice the one claim
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 04:14:03 +01:00
Meta Vens
532855d21a queue, launch tests: read the hold through the snapshot the tests build
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 04:12:34 +01:00
Meta Vens
3e48e122af hold: one decider of what a question holds, read once per launch; a dead Self holder no longer stalls the successor; retire is read
s5 findings of cut-self-session-live:
- blocked-recipe-misses-run-held-spec: eureka_state::hold is the one decider
  (a question holds the item it is raised in, or every claim of the run it is
  raised in; an answer of retire keeps holding the claims still in force).
  queue::on_hold and `huginn blocked` both read it.
- hold-read-not-one-snapshot: on_hold returns a Held snapshot that the request
  carries; claimable, queue and the gate read it, none reads it again.
- dead-self-holder-stalls-successor: launch::slot is the one reader of whether
  a holder lives; claimable asks it, a dead holder is closed by the launch and
  the beat's trace says so.
- retire-answer-reopens: launch::retire_answered resolves the claims of an
  answered-retire question Withdrawn; the beat runs it before reading briefs.
- held-note-threshold-unpinned: a test pins the note for exactly one held brief.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 04:11:38 +01:00
Meta Vens
9faeb94035 queue, heartbeat tests: a question in another item's run is no boundary; no held brief, no held note
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 02:55:43 +01:00
Meta Vens
5a6b458c57 mind-body: public surface spells the Trip variant as the tool prints it; a new brief's own empty runs are not the five's
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 02:31:43 +01:00
Meta Vens
fdf4eb7738 launch: build the trip question's text from a &str
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 02:27:59 +01:00
Meta Vens
8011516198 launch, heartbeat: fix the trip question's text type and an unused import
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 02:27:11 +01:00
Meta Vens
345c61eb1b heartbeat tests: one question per cause, an answer or withdrawal reopens the bundle, a hold reaches only its claims
Replaces the Mind-wide fresh-brief-waits test with the scenarios of the
run-scoped hold; fail_bundle and beats stay.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 02:09:49 +01:00
Meta Vens
1b19180555 queue: one owner of the hold; a trip belongs to the run whose end tripped it and its question holds that run's claims
Cut claimable's Mind-wide stop on any follow-up question and queue's inline
blocked loop. queue::on_hold is the one reader of what an in-force question
holds (a question raised in a run holds that run's claims, anything else holds
itself); queue, inbox::derive and the open_and_launch gate read it.
Breaker::Trip names the newest ended counted run; the breaker question is
raised in that run; the boundary is the newest of a question raised in the item
and a run claiming it that a question is raised in, so an answer or withdrawal
gives every claim of the run a fresh count. The trip and the held-brief wait
are written to the heartbeat trace.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 02:09:49 +01:00
Meta Vens
2fb2608249 heartbeat: a successor trip is the Mind's stop, one question per cause, not one per brief
A Self run claims up to 64 briefs and each empty run counts against all of
them, so one cause tripped the briefs in turn, one question per brief per beat.
claimable now returns nothing while a question is open in any follow-up of the
Mind; the answer reopens the briefs with a fresh count.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 01:20:28 +01:00
Meta Vens
d1e3e1dbec heartbeat tests: a Self run leaves her Persona idle, a Persona turn marks her busy (mutants)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 21:35:36 +01:00
Meta Vens
41431a4dfd heartbeat: the beat gives a Self run to a Mind whose Self holds briefs; an open breaker question blocks its brief
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 21:08:39 +01:00
Meta Vens
55484c02ef self-session-live: public surface drops impl Brief
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 21:02:06 +01:00