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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>