Commit graph Idunn/src
Author SHA1 Message Date
Meta Vens
0e09488c19 idunn-launch tests: wait_until takes FnMut
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 20:09:26 +02:00
Meta Vens
d94150d396 idunn-launch: release root is the launcher's own release; docs for foreign workloads; probe, spawner and authority tests
Not built at this commit; verified at the head by the final job.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 19:58:21 +02:00
Meta Vens
6866d75536 idunn-launch tests: lease gate, foreign lease, lease loss, stateless, route challenge, verbatim splice, closed placeholders, child exit (unbuilt)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 19:10:58 +02:00
Meta Vens
b9f27ce1e7 idunn-launch: presence launcher, lease hold, closed-set config renderer, route acceptor (unbuilt)
Does not build-verified yet; tests follow. drivers.rs: holder-side lease read, one lease-binding rule shared with grant.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 18:53:29 +02:00
Meta Vens
491459e6a0 State kind external-directory: process-owned directory, lease-gated like external-file
Not built or tested yet; verified at the end of the cut.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 18:47:20 +02:00
Meta Vens
8760a4fab3 A boot lift that errs fails closed
If the boot lift returned Err, boot logged and served with nothing held, so
every pending continuity abort ran and stopped a running candidate. Boot now
sets lift_unsettled; retry_held_lift runs the lift for each continuity abort
until one succeeds, and no abort step runs before. Boot's call moves into
Engine::boot_lift so the failure is testable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 01:51:57 +02:00
Meta Vens
c4edc66c48 The boot lift yields to a Deploy by the continuity's own yield test
The lift kept an abort running for any awaits_handover Deploy, so a braked
Deploy released a held record to an abort that stopped the only copy of the
body. One predicate, deploy_the_continuity_yields_to (candidate unproven, a
waiting Deploy that deploy_can_move), is now what both the deadline's yield
and the lift ask (rulings c2d-yield-only-unproven-to-movable,
c2c-lift-defers-on-observe-error).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 01:50:46 +02:00
Meta Vens
b993615c69 Negative tests: the lift must not yield to a braked waiting Deploy
Two tests, from Soul's h2 attacks: a running candidate at boot beside a braked
stop-then-start Deploy at its Sealing tail, and a held (unobservable)
candidate when such a Deploy appears. Both must leave the candidate unstopped.
They fail here: the lift treats any awaits_handover Deploy as a reason to keep
aborting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 01:47:48 +02:00
Meta Vens
b119e500ad c2d fix 2/2: a continuity yields only while unproven, and only to a Deploy that can move
serving_proven (Committing, or routing evidence recorded) ends the yield:
yields_to_a_deploy replaces retries_forward, and wait_for_owner reads it, so
a Deploy no longer waits on an owner that will keep serving. deploy_can_move
asks the deployment brake live for a Deploy at its Sealing tail, so a braked
Deploy draws no yield and the yield happens once the brake releases. The
tests of 04389e6 are repaired to reach their worlds (the failures they
showed at 1beca61 were the right ones). Rulings
c2d-yield-only-unproven-to-movable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 21:43:34 +02:00
Meta Vens
04389e6afc c2d fix 1/2: negative tests, no yield to a serving continuity or a braked Deploy
Fail at 1beca61 (the c2d logic is 81bfb03's): a Committing continuity past
its deadline yields to a waiting Deploy and stops serving; a stop-then-start
Deploy at its Sealing tail with the deployment brake unreleased draws the
yield. The second test releases the brake and pins that the yield then
happens and closes the continuity's operator-required incident Recovered.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 21:38:10 +02:00
Meta Vens
1beca61ac4 c2c fix 3/3: the refusal table's recorded-withdrawal case ends at the lift
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 21:31:36 +02:00
Meta Vens
35d9c7fcf8 c2c fix 2/3: the lift defers on an observe error; the retry exit is worded from the driver
An abort over a candidate the boot lift could not observe is held in
process memory: resume_candidate runs no step of it and retries the lift
each pass (retry_held_lift) until observation answers Ok (lifted) or the
driver proves the candidate dead (the abort proceeds). The predicate and
write move into consider_lifting_continuity_abort, which boot and the
retry share. Ruling c2c-lift-defers-on-observe-error.

The page and the expire refusal name the manual exit from the plan's
workload binding: a unit to stop for systemd, a process to kill for a
host actuator.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 21:30:18 +02:00
Meta Vens
11f7fdbf09 c2c fix 1/3: negative test, a lift that cannot observe must not let the abort stop the candidate
Fails at 81bfb03: an observe error leaves the abort running and its first
step stops the candidate. Also pins the lease_withdrawal==Complete conjunct
(case LeaseWithdrawalRecordedComplete) and makes the refusal table's
dead-candidate case provably dead (SwitchWorkload::bury).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 21:28:06 +02:00
Meta Vens
4e66a65758 c2d stateful yield test: drop the Fencing half the seeded Deploy cannot honestly assert
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 20:10:18 +02:00
Meta Vens
09bd127643 c2d: stateful yield test, an Odin-shaped continuity yields its lease to a waiting Deploy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 20:09:28 +02:00
Meta Vens
f79deecdb7 c2d tests: the helper stops short of the deadline; each test passes it 2026-10-19 20:07:30 +02:00
Meta Vens
fd6e3e65af c2d yield table: show how row (i) ends 2026-10-19 20:06:48 +02:00
Meta Vens
a868321259 c2d yield table: name the row an error comes from
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 20:06:00 +02:00
Meta Vens
196e0dc884 c2d: a resolver write spends the resume backoff; the boot lift leaves a yield
resume_candidate removes the transaction's backoff when the resolver
moved its record, so a yield abort is not held behind the forward retry's
backoff (ruling c2d-yield-mechanics). return_wedged_continuity_aborts_forward
skips an abort whose target holds a Deploy awaiting the handover. Tests:
the yield table, the unit rows, the c2b waiter-still-ends row, the
backoff spend, and lift case (vii).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 20:03:48 +02:00
Meta Vens
4f68809f0b Continuity yields to a Deploy awaiting the handover (ruling continuity-yields-to-deploy)
A continuity past its deadline at or past Fencing begins its own
post-fencing abort when a Deploy on its target awaits the handover; the
waiter keeps waiting on an owner that retries forward. Adds
retries_forward and awaits_handover, both derived.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 19:59:37 +02:00
Meta Vens
a7ad3de559 c2d negative: a waiting Deploy must land over a forward-retrying continuity past its deadline
Red at e529858: the waiter ends FailedBeforeFencing owner-left-to-operator.
The yield (ruling continuity-yields-to-deploy) lands in the next commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 19:58:09 +02:00
Meta Vens
e5298584a4 Merge origin/main (bounded_detail hotfix) into idunn/reincarnation-c2
Conflict in begin_post_fencing_abort: kept c2's now_millis binding and
the hotfix's bounded_detail in place of truncate. The owner-wait note
written by wait_for_owner now goes through bounded_detail too; every
other c2/c2b/c2c detail writer already did.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 19:34:20 +02:00
Meta Vens
ec45906ead bounded_detail: use std char-boundary floor/ceil instead of hand loops
The hand loops hung under mutation (infinite loops); std does it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 19:07:23 +02:00
Meta Vens
8f00df079f Sealing-failure test: clear the resume backoff between ticks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:40:52 +02:00
Meta Vens
bff308aea7 Cut c2c: expire's refusal names its reason without reading the deadline predicate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:39:32 +02:00
Meta Vens
18c5b643a7 Every persisted detail goes through bounded_detail; delete truncate
require_detail judges bytes, truncate cut chars, so a long multibyte build
error made the abort write invalid and wedged the record in Sealing.
bounded_detail keeps head and tail within 2048 bytes, drops NUL, and
never returns empty. Also bounds gate-wait notes, cancel notes, and the
continuity deferral reason at their writers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:37:38 +02:00
Meta Vens
cc4a72ad43 Cut c2c: a record left to the operator backs off to the continuity cap
ResumeBackoff stores the ceiling it was armed with and the skip check reads it.
resume_ceiling is the continuity cap (300 s) for a record that leaves_to_operator
and the short cap otherwise, for every such record: a forward-retrying
continuity, a stateful deploy, a wedged abort, a drain. A step that returns Ok
without moving a record left to the operator is backed off like a failed
attempt, so a silent candidate is challenged once per backoff, not every poll.
Nothing in TargetSupervision is touched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:37:03 +02:00
Meta Vens
81ab69046b Negative test: long multibyte sealing failure must abort and free the target
Fails at 5b421c3 (abort write refused by require_detail).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:36:55 +02:00
Meta Vens
063409489e Cut c2c: a continuity past Fencing retries forward and pages, never aborts
PhaseEnd::RetryForward: phase_end answers it for every continuity at or past
Fencing, because aborting restores the body its candidate already runs (ruling
c2c-retry-decided-by-record). The resolver leaves it to the operator
(operator-required incident, report_once) and the phase step keeps running.
leaves_to_operator covers it. DeploymentTransaction::expirable is the one
spelling the expire CLI, the spent-request retirement and the resolver's
requested flag read: a continuity past Fencing cannot be expired. Deploy keeps
abort-to-incumbent and the stateful operator-required arm.

Tests: the PhaseEnd table, the Routing deadline forward retry and its incident
episode, the stateful deadline, expiry refusal and spent-request retirement,
and a deployment still aborting to its incumbent. Abort-mechanics tests begin
their aborts directly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:33:29 +02:00
Meta Vens
58f213fe15 Cut c2c: boot lift returns a wedged continuity abort to forward retry
A pre-c2c Idunn aborted a continuity at its phase deadline, which stops the
only running copy of the admitted body. At boot, a continuity abort that has
not stopped its running candidate (candidate_cleanup Pending, lease_withdrawal
not Complete, workload observed, issued lease exact on disk) is withdrawn and
the record retimed, the exact inverse of begin_post_fencing_abort. Negative
tests carry the live shapes of tx-4eaed669 (Routing, adopted lease) and
tx-039b91e9 (AwaitingReady, granted lease); the lift's refusals are pinned per
predicate input.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:24:22 +02:00
Meta Vens
8230c544ac Cut c2b fix: a pre-fencing abort keeps its deadline through its last cleanup write (a Sealing waiter's abort could not finish) 2026-10-19 17:58:13 +02:00
Meta Vens
9844806eb1 Cut c2b fix: the waiter's own entry attempt drives the owner harness 2026-10-19 17:56:28 +02:00
Meta Vens
95e8076618 Cut c2b fix: the stop-first owner harness uses the host-actuator world with its workload port 2026-10-19 17:55:04 +02:00
Meta Vens
2ff57533b1 Cut c2b fix: a test world runs a host-actuator target's workload through its own port 2026-10-19 17:53:58 +02:00
Meta Vens
c6805d48a7 Cut c2b fix: restore stop_first_binding's runner split 2026-10-19 17:51:38 +02:00
Meta Vens
8b6c539a6a Cut c2b fix: the stop-first harness owner runs on a systemd unit 2026-10-19 17:51:02 +02:00
Meta Vens
a254a3e6a5 Cut c2b fix: pin the forever-waits at the waiter, the pre-fence abort deadline, the stateful incident lifecycle and the archive vanish
Negative tests (a)(b)(c) are one marked harness that ages a deadline only when
one exists and ends on the waiter's own record, so at the base they fail at the
waiter assertion (still waiting), not at setup. (c) now runs the Odin gate-wait
it names: a stop-then-start continuity on a systemd unit observes and waits,
where the host-actuator step of a world with no actuator errs at once.

New: a stop-first owner's wedged pre-fence abort pages and ends its waiter; a
waiter's own wedged pre-fence abort pages beside a standing owner; a stateful
deploy's incident is silent under an early expiry, one per episode, and closes
while the record goes on; an unparsable drain plan is bounded; a transaction
gone from both live set and history stays a fault.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 17:49:14 +02:00
Meta Vens
21849eb097 Cut c2b fix: a drain whose stored plan no longer parses is bounded, not unbounded
deadline_for_current_activity's drain arm returned None when parsed_inputs
failed (the running binary re-parses and re-admits the frozen binding), which
left the drain with no deadline, unpaged, and disarmed every waiter behind it.
The retire time is now the promotion plus the drain when the binding parses,
and otherwise now; the frozen committing duration from it bounds the drain.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 17:48:03 +02:00
Meta Vens
0bfadcfc71 Cut c2b test: pin the stateful-deploy arm of leaves_to_operator and the incident close predicate
Survivors of cargo mutants --in-diff on 9ea6c71..126d710: the OperatorRequired
clause of leaves_to_operator (now a table beside phase_end) and the close
predicate (a vanished subject closes while another transaction is still left).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 16:10:11 +02:00
Meta Vens
126d710de3 Cut c2b: operator-required incident, opened at the decision site and closed when spent
IncidentCondition::OperatorRequired (subject: transaction id) opens in
leave_to_operator, only for a record that leaves_to_operator, and closes as
recovered in close_spent_operator_incidents once no transaction in the
snapshot is left to the operator. Incident writes are never progress.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:39:42 +02:00
Meta Vens
a14055115c Cut c2b: owner deadlines; a waiter never waits on an owner Idunn will not finish
wait_for_owner disarms a waiter Warming deadline (the owner bounds the wait)
and ends the waiter through its own pre-fencing abort when the owner leaves to
the operator (owner-left-to-operator); it never aborts the owner. The resolver
times Warming for every transaction, lifts a deadline onto a record that needs
one, skips an owned waiter, and leaves an abort or drain past its deadline to
the operator (report only; the incident follows). Rulings c2b-waiter-ends-on-
operator-owner, c2b-warming-deadline, c2b-abort-and-drain-deadlines.

Negative tests recorded failing at 9ea6c71.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:37:21 +02:00
Meta Vens
86926c4e42 Cut c2b: one derivation of every deadline; Warming, aborts and drains are timed
WARMING_DEADLINE_SECONDS and PRE_FENCING_ABORT_DEADLINE_SECONDS are Idunn
constants (no PhaseDeadlines field: plan ids stay). DEADLINE_PHASES is the one
spelling of the deadline range. deadline_for_current_activity derives the
duration of a phase, an abort from its beginning, or a drain to its retire;
retime is the only non-test writer. leaves_to_operator is derived from it.
Validation asks for an activity, not a post-fencing phase. Records written by
this cut are forward-only (ruling c2b-forward-only-records).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:23:59 +02:00
Meta Vens
ffb22e368b Cut c2b: the post-fencing abort stops its candidate before revoking the lifetime-held lease
ruling c2b-abort-stops-before-revoke; fixes follow-up
ghostlight-abort-lease-before-stop. Mirrors advance_fencing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:15:47 +02:00
Meta Vens
3265ccb575 Cut c2b test: an abort stops a candidate that holds its lease before revoking it
Negative test for ghostlight-abort-lease-before-stop: the candidate holds the
lease lock until stopped. Recorded failing at this commit; the fix follows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:15:07 +02:00
Meta Vens
9ea6c71921 Cut 2 test: the stop-first fixture builds without a network input
A host-native runner has no network profile, so the host-actuator recipe
drops the external input the systemd recipe fetches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:01:59 +02:00
Meta Vens
94d3b53b55 Cut 2 fixes: stop-then-start handover fixture, supervision owner skip, rebase preflight, archive-as-progress
- Add an engine-level stop-then-start fixture (route-less host-actuator plan)
  and a test that two such transactions never both enter Starting, in either
  order; it kills enter taking the CAS only at Fencing and takes_target_at
  ignoring the rollout. Discharges follow-up stop-first-handover-fixture.
- Pin supervision's skip of an owned target: a fenced generation is not
  refreshed from Odin, and a stop-first owner's stopped incumbent is not
  restarted.
- The rebase test now carries a route preflight, so keeping it dies.
- The step that ends a transaction archives it inside its write; the progress
  read now treats a terminal archived record as progress, not a fault.
- enter's doc no longer claims every phase move goes through it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:00:49 +02:00
Meta Vens
6ea0d127d8 Cut 2 test: a finished transaction retired mid-handover is not a lost race
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 12:15:19 +02:00
Meta Vens
dd8707b5a2 Cut 2: pin the candidate-port reservation and the rebase guards directly
candidate_ports_in_use is the one reading of which ports admitted, live and
draining transactions hold. Tests pin it, select_candidate_port's routed and
unrouted answers, and the three conditions under which a transaction is not
rebased.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 12:14:46 +02:00
Meta Vens
1953bf233b Cut 2: one per-target lookup, and tests that kill the survivors it exposed
ControlSnapshot::on_target is the one place a transaction is filed under a
target; target_owner, the supervision gates and the handover read it.
Tests: ownership is per target and names only a holder; a draining target is
not restarted until its cleanup ends; the admitted Expected is repaired
beside a building deployment; a live continuity alone holds back a second
mint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:57:31 +02:00
Meta Vens
a7bfbc2296 Cut 2 tests: a launching switch workload, so a real continuity restart runs beside a deployment
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:22:58 +02:00