Commit Graph
100 Commits
Author SHA1 Message Date
Nils Andreas Svee b555451448 test(cli): make integration synchronization deterministic (#61) 2026-08-10 23:21:00 +07:00
Nils Andreas Svee 8924cc531c test(client): use protocol encoders in fake peers 2026-08-10 22:53:36 +07:00
Nils Andreas Svee e5c08997ed test(cli): use protocol encoders in fake peers 2026-08-10 21:55:54 +07:00
Nils Andreas Svee f0f9277469 test: trim redundant coverage 2026-08-10 21:06:49 +07:00
Nils Andreas Svee 186c6eba97 docs: add clean-room docs/specs and agent guidance 2026-08-10 18:54:22 +07:00
Nils Andreas Svee 8c31f14419 Merge pull request #55 from Lochnair/fix/managed-timeout-budget
fix(managed): bound timeout work per poll
2026-08-10 11:14:52 +07:00
Nils Andreas Svee 301542186a test(cli): bound peer-close synchronization waits 2026-08-10 11:09:00 +07:00
Nils Andreas Svee 04ea4af079 test(cli): synchronize multi-target peer close 2026-08-10 11:00:12 +07:00
Nils Andreas Svee 1f69c04274 test(managed): verify sparse timeout backlog progress 2026-08-10 10:30:36 +07:00
Nils Andreas Svee edb634146c fix(managed): retain timeout backlog fairness 2026-08-10 10:25:10 +07:00
Nils Andreas Svee ab9912b3d5 test(managed): cover timeout backlog scheduling 2026-08-10 02:06:41 +07:00
Nils Andreas Svee ec7baebe3a fix(managed): bound timeout discovery 2026-08-10 01:59:13 +07:00
Nils Andreas Svee f65998ff70 refactor(client): make deadline indexing allocation-free 2026-08-10 01:56:49 +07:00
Nils Andreas Svee 4632e310d7 test(managed): verify timeout budget fairness 2026-08-10 01:18:38 +07:00
Nils Andreas Svee a67331a297 fix(managed): bound timeout work per poll 2026-08-10 01:05:41 +07:00
Nils Andreas Svee 9769a1b49e refactor(client): index pending probe deadlines 2026-08-10 01:00:50 +07:00
Nils Andreas Svee fe3a4dc8e5 Merge pull request #54 from Lochnair/renovate/github-actions
chore(deps): update github actions
2026-08-10 00:45:41 +07:00
Nils Andreas Svee 24d36d41d8 Merge pull request #53 from Lochnair/fix/managed-liveness-control
fix(managed): harden liveness and control bounds
2026-08-10 00:38:45 +07:00
Nils Andreas Svee 8d47dc9c6e test(managed): cover stopping admission overlap 2026-08-10 00:27:18 +07:00
Nils Andreas Svee dd396a8b5a test(managed): verify bounded control progress 2026-08-10 00:06:31 +07:00
Nils Andreas Svee dd1182d24d fix(managed): harden control admission 2026-08-10 00:05:48 +07:00
Nils Andreas Svee 1c6b4be915 fix(client): bound asynchronous opening work 2026-08-09 23:45:19 +07:00
Nils Andreas Svee c8d7c7eda2 Merge pull request #52 from Lochnair/refactor/managed-frontend-cutover
refactor(managed): remove legacy runtime
2026-08-09 22:05:17 +07:00
Nils Andreas Svee 33fe01f252 refactor(irtt-client): gate functions that are only used with tokio enabled 2026-08-09 22:03:45 +07:00
Nils Andreas Svee 36eaa90e2a fix(cli): harden managed frontend cutover 2026-08-09 21:51:20 +07:00
Nils Andreas Svee c599c84715 refactor(managed): remove legacy runtime 2026-08-09 20:58:36 +07:00
Nils Andreas Svee 1a9e8f28aa refactor(cli): use unified managed frontend 2026-08-09 20:27:22 +07:00
Nils Andreas Svee 9de95b303c feat(managed): support subscribed blocking start 2026-08-09 20:21:12 +07:00
Nils Andreas Svee f3ea8e030a Merge pull request #51 from Lochnair/blocking-managed-owner
feat(managed): add blocking managed owner
2026-08-09 20:07:50 +07:00
Nils Andreas Svee 93fed6dce6 fix(managed): bound blocking runtime shutdown 2026-08-09 20:02:35 +07:00
Nils Andreas Svee 749306394c test(managed): verify blocking owner lifecycle 2026-08-09 19:18:38 +07:00
Nils Andreas Svee 03ee6e2f28 feat(managed): add blocking managed owner 2026-08-09 19:10:56 +07:00
Nils Andreas Svee 53d29f4cf9 Merge pull request #50 from Lochnair/feat/tokio-managed-target-updates
feat(managed): add dynamic target generations
2026-08-09 19:03:54 +07:00
Nils Andreas Svee de902722e7 test(managed): verify dynamic target generations 2026-08-09 18:52:16 +07:00
Nils Andreas Svee 89ec57d48c feat(managed): add transactional target updates 2026-08-09 18:51:46 +07:00
Nils Andreas Svee 87b41bb379 Merge pull request #49 from Lochnair/feat/tokio-managed-task
feat(managed): add unified Tokio managed task
2026-08-05 00:19:17 +07:00
Nils Andreas Svee 99b6ddfead fix(managed): preserve drain and pacing invariants 2026-08-05 00:09:46 +07:00
Nils Andreas Svee 8445c0cd99 fix(managed): harden stop and deadline ordering 2026-08-04 23:19:18 +07:00
Nils Andreas Svee 1af8afcfae fix(managed): correct pacing and drain cleanup 2026-08-04 22:33:00 +07:00
Nils Andreas Svee 1cb6e07706 test(managed): verify unified task lifecycle 2026-08-04 20:59:42 +07:00
Nils Andreas Svee fd3c29e63a feat(managed): add unified Tokio managed task 2026-08-04 20:38:52 +07:00
Nils Andreas Svee 49b34bf85c Merge pull request #48 from Lochnair/refactor/async-client-poll-core
refactor(client): share pollable async transactions
2026-08-04 20:10:04 +07:00
Nils Andreas Svee a24898ada6 refactor(client): share pollable async transactions 2026-08-04 19:17:33 +07:00
Nils Andreas Svee 0f02bf54ec Merge pull request #47 from Lochnair/feat/tokio-async-client
feat(client): add Tokio async client
2026-08-04 16:46:00 +07:00
Nils Andreas Svee b67dcfb425 test(client): focus async adapter coverage 2026-08-04 16:28:27 +07:00
Nils Andreas Svee 2f7932862a fix(client): reformat tokio dependency entry 2026-08-04 15:54:41 +07:00
Nils Andreas Svee b1e32d543c test(client): verify async lifecycle equivalence 2026-08-04 15:34:20 +07:00
Nils Andreas Svee 62a9c8899e feat(client): add Tokio async client 2026-08-04 15:34:19 +07:00
Nils Andreas Svee a542d4edf1 feat(client): add optional Tokio socket support 2026-08-04 15:29:35 +07:00
Nils Andreas Svee 069da5cee9 Merge pull request #46 from Lochnair/fix/managed-opening-drain
fix(managed): bound opening receiver drains
2026-08-04 14:39:23 +07:00
Nils Andreas Svee 56f54a7b4e fix(managed): classify opening overflow as configuration 2026-08-04 14:24:40 +07:00
Nils Andreas Svee 04e7893e3e fix(managed): bound opening receiver drains 2026-08-04 14:22:23 +07:00
Nils Andreas Svee a2d9b5af81 Merge pull request #45 from Lochnair/fix/transactional-close
fix(client): make session closing transactional
2026-08-04 13:54:46 +07:00
Nils Andreas Svee 3948e3dec9 fix(client): timestamp close events after send 2026-08-04 13:44:33 +07:00
Nils Andreas Svee ef19c45c1f fix(managed): transact group session close 2026-08-04 13:08:38 +07:00
Nils Andreas Svee 357e1356ea fix(client): transact blocking session close 2026-08-04 13:03:51 +07:00
Nils Andreas Svee da731edd0d refactor(session): prepare close transactions 2026-08-04 12:59:27 +07:00
Nils Andreas Svee d3a18b0331 Merge pull request #43 from Lochnair/refactor/transactional-opening
refactor(client): make session opening transactional
2026-08-04 12:45:58 +07:00
Nils Andreas Svee 185e0bf3e4 fix(managed): drain queued opening replies before retry 2026-08-04 12:34:13 +07:00
Nils Andreas Svee dd74f3800e fix(client): preserve no-test opening semantics 2026-08-04 12:18:31 +07:00
Nils Andreas Svee e270183f5d refactor(managed): transact group session opening 2026-08-04 12:12:05 +07:00
Nils Andreas Svee ff27ec24c6 refactor(client): transact blocking session opening 2026-08-04 12:11:32 +07:00
Nils Andreas Svee dad4d2a298 refactor(session): prepare opening transactions 2026-08-04 12:11:32 +07:00
Nils Andreas Svee 983aec5bab Merge pull request #44 from Lochnair/fix/probe-send-timestamps
fix(client): separate probe admission and send timing
2026-08-04 11:48:08 +07:00
Nils Andreas Svee e642f962d4 fix(client): separate probe admission and send timing 2026-08-04 11:36:25 +07:00
Nils Andreas Svee 8de478777d Merge pull request #42 from Lochnair/refactor/transactional-probes
refactor(client): make probe sends transactional
2026-08-04 01:13:39 +07:00
Nils Andreas Svee 9bc2ac90b3 refactor(client): commit probe sends transactionally 2026-08-04 01:04:42 +07:00
Nils Andreas Svee b5d0b1e52e refactor(probe): preflight pending insertion 2026-08-04 00:53:26 +07:00
Nils Andreas Svee 1a189854e7 Merge pull request #41 from Lochnair/feat/directional-codecs
feat(proto): add directional packet codecs
2026-08-04 00:48:25 +07:00
Nils Andreas Svee cabe0f6c24 feat(proto): add directional echo codecs 2026-08-04 00:34:12 +07:00
Nils Andreas Svee cc7f7fc9b2 feat(proto): add directional open and close codecs 2026-08-04 00:30:08 +07:00
Nils Andreas Svee e908c4ce4f refactor(proto): centralize packet envelope handling 2026-08-04 00:27:45 +07:00
Nils Andreas Svee 6ba76abca0 Merge pull request #40 from Lochnair/refactor/probe-scheduling
refactor(client): move probe scheduling out of SessionMachine
2026-08-04 00:16:21 +07:00
Nils Andreas Svee 1920d5e33c test(managed): make probe pacing assertions deterministic 2026-08-04 00:11:27 +07:00
Nils Andreas Svee 22b8bb80ea refactor(client): separate probe scheduling from session state 2026-08-04 00:11:27 +07:00
Nils Andreas Svee 549efa8330 Merge pull request #38 from Lochnair/refactor/session-machine-state
Make session lifecycle state explicit
2026-08-03 23:41:59 +07:00
Nils Andreas Svee 4b4adc518c refactor(session): consolidate client session lifecycle 2026-07-31 11:10:23 +07:00
Nils Andreas Svee dc827908d9 refactor(session): separate negotiation from session state 2026-07-31 11:08:25 +07:00
Nils Andreas Svee dfe0534905 test(managed): cover group late replies during final drain
Exercise a real one-target ManagedClientGroup through timeout, Draining, a gated retained reply, LateReply classification, local close, and authoritative TargetFinished publication. Synchronize release after EchoLoss and a scheduler-handled no-op update so the ordering is deterministic rather than delay-dependent.

Add a silent-server control that verifies completion only after the final-drain deadline, and assert bounded join, queued-event draining through disconnection, target counters, terminal outcome equality, and group aggregates in both cases.

Harden the analogous single-client late-drain test with a viable one-probe run window and packet-shape checks. No production final-drain behavior change was required.
2026-07-28 15:55:18 +07:00
Nils Andreas Svee 7cc55bd619 fix(managed): decouple peer-close control from event delivery
Add a scheduler-owned saturating peer-close counter shared with the group session. Update it before best-effort TargetFinished publication so bounded subscriber overflow cannot hide the live shutdown condition, while retaining the existing events, bounded history, and aggregate accounting.

Make grouped CLI and TUI supervision consult the durable count on each existing activity loop and funnel both count and event observations through one-shot stop policy. Preserve interruption suppression, queued-event draining, structured failures, drop reporting, and peer-close diagnostic precedence.

Cover scheduler-only accounting, non-peer exclusions, receiver and removal races, deterministic capacity-one DropOldest eviction with an active target, frontend one-shot policy, and the existing process-level peer-close and interruption behavior.
2026-07-28 15:49:53 +07:00
Nils Andreas Svee bbe3261eb3 fix(managed): record peer closure in the receiver
After publishing the authenticated reply classification and session-close events, mark the target PeerClosed while the receiver still holds its lock. Wake the scheduler to publish and account for the single authoritative terminal outcome.

Add controlled-order regressions proving later scheduler sends and target removal cannot overwrite peer-close provenance, counters remain intact, and ordinary replies stay active.
2026-07-28 14:55:30 +07:00
Nils Andreas Svee dfe9adb36e fix(managed): block while dynamic groups are idle
Block the group scheduler on its control channel when no opening, pacing, or final-drain deadline exists. Preserve bounded timed waits whenever scheduled work remains.

Cover no-deadline blocking, channel disconnection, deadline wakeups, and empty dynamic-group update, stop, and drop behavior with bounded tests.
2026-07-28 14:48:57 +07:00
Nils Andreas Svee 6af4663b6e fix(cli): drive single-target runs with ManagedClient
Replace the manual single-target ClientSession loops in the stream and TUI adapters with ManagedClient::start_with_subscription so the existing worker owns opening, deadline-aware pacing, receive handling, timeout polling, draining, and close.

Use bounded subscription waits for interruption and input polling, drain queued events before and after join, and report per-subscription drops without changing output, statistics, labels, summaries, warning, or peer-close policy. Add process and unit regressions for 10 ms cadence, interruption, final-event draining, TUI terminal state, and overflow visibility.
2026-07-28 14:42:02 +07:00
Nils Andreas Svee 080d45ca67 fix(cli): stop continuous groups on peer closure
Record a continuous peer-closed TargetFinished event as the reason for requesting group shutdown and stop each CLI/TUI group at most once. Drain the managed subscription and join before applying exit policy so queued output and target failures are preserved.

Give peer closure precedence over the cancellation caused by that internal stop while keeping explicit interruption and finite-run behavior distinct. Add bounded process regressions for partial closure, mixed failures, queued rows, and interruption plus focused TUI policy coverage.
2026-07-28 14:29:15 +07:00
Nils Andreas Svee 83fb98dbfd test(managed): cover silent opening timeouts
Exercise the ordinary OpenTimeout path with a bound UDP peer that receives every configured opening attempt but never replies.

Bound event disconnection and join completion with one strict deadline, then verify the authoritative terminal event, structured failure, aggregate counters, and retained outcome.
2026-07-28 10:23:56 +07:00
Nils Andreas Svee 58d11f1dec fix(cli): fail continuous runs on peer closure
Keep PeerClosed as a distinct successful library outcome while treating it as an error at the CLI and TUI boundary for uninterrupted continuous runs.

Track aggregate peer-close outcomes independently of bounded recent history and cover finite, continuous, grouped, mixed-failure, interruption, and TUI status behavior.
2026-07-28 10:23:47 +07:00
Nils Andreas Svee 8ea4c2f8a4 docs(managed): document lifecycle outcome contracts
Document terminal group events, structured failure decisions, explicit static versus dynamic completion, empty desired-set behavior, bounded join history, dropped-event detection, and missed-slot pacing.
2026-07-28 01:04:44 +07:00
Nils Andreas Svee 6adec06442 fix(managed): expose dropped subscription events
Track a monotonic discarded-event count per bounded subscription for all overflow policies, including after hub sealing or disconnection. Preserve nonblocking publication and existing queue policies.

Warn once in streaming CLI output and mark TUI summaries/status as incomplete when DropOldest discarded events. Add exact overflow-counter and incomplete-marker regressions.
2026-07-28 01:04:43 +07:00
Nils Andreas Svee 41cd2a9589 fix(managed): skip missed probe slots
Advance delayed managed schedules to the latest due cadence slot and then directly to the first future deadline. Apply the same absolute-cadence behavior to the single runner and group burst/staggered pacing, while leaving the manual Client send API caller-paced.

Bound receive waits by the next send deadline so 10 ms intervals are not hidden behind the managed socket timeout. Add deterministic delayed-slot, finite-end, burst, staggered, and receive-bound regressions.
2026-07-28 01:04:43 +07:00
Nils Andreas Svee 5381cfc992 fix(managed): bound completed target retention
Retain only the 256 most recent target outcomes in the final group snapshot while tracking total, successful, failed, and discarded outcome counts. Publish each authoritative TargetFinished event before inserting into the bounded history.

Update CLI/TUI exit decisions to use aggregate counts and add a dynamic churn regression proving every outcome remains observable while join retention stays bounded.
2026-07-28 01:04:42 +07:00
Nils Andreas Svee 8e58c0f04b fix(managed): keep empty dynamic groups idle
Track desired membership separately from active target state and make natural completion an explicit group policy. Empty authoritative updates now remove all targets without terminating the scheduler, while static CLI groups retain all-target completion.

Document that construction still requires an address-family-defining target and add regressions for empty replacement, later re-addition, idle control responsiveness, idle cancellation, and finite static completion.
2026-07-28 01:04:42 +07:00
Nils Andreas Svee 4398d25d4b fix(cli): report multi-target failures and return nonzero
Consume structured per-target outcomes in the streaming CLI and TUI so mixed failures remain visible while successful targets still produce output. Return a failure status when every target fails, and keep interruption behavior distinct.

Add strict-timeout integration coverage for mixed continuous completion and all-open-failure exit status, plus focused TUI outcome-state tests.
2026-07-28 01:04:42 +07:00
Nils Andreas Svee 97aac829ec fix(managed): publish terminal outcomes for failed targets
Extend the managed group stream with authoritative per-target terminal outcomes and structured failure classifications. Final client events are published first, followed by exactly one TargetFinished outcome for success, peer close, no-test, opening/runtime failure, removal, or cancellation.

Scheduler-owned cleanup now stops the receiver and seals subscriptions on natural completion, eliminating the event-consumer/join circular wait while preserving queued drain. TargetEventSubscription now yields ManagedGroupEvent, so consumers must handle Client and TargetFinished variants.

Strict-timeout regressions cover mixed success/failure, all-open failure, runtime failure, no-test ordering, removal, cancellation, and disconnection before join.
2026-07-28 00:07:18 +07:00
Nils Andreas Svee 3e0047e505 fix(managed): seal completed event hubs
Store hub closure under the same lock as subscriber registration so permanent shutdown cannot race with a late subscription. Sealing remains idempotent, wakes current consumers, preserves queued events for draining, rejects future subscribers, and ignores later publications.

Regression tests cover queued drain, blocking wakeup, idempotent sealing, and late subscription rejection.
2026-07-27 23:59:51 +07:00
Nils Andreas Svee 1bf44a1746 fix(client): honor authenticated close before correlation
Treat a decoded, authenticated, token-matched close flag as a session-level signal after classifying the packet. Classification events now deterministically precede SessionClosed for pending, duplicate, retained-timeout, evicted-late, and untracked sequences.

Wrong-token and bad-HMAC close packets remain non-terminal. Public event documentation records the ordering contract, and focused regressions cover every correlation class.
2026-07-27 23:58:16 +07:00
Nils Andreas Svee 91db85cc63 fix(client): preserve peer-close counters and provenance
Snapshot sent counters when a runtime leaves its live session state, and expose PeerClosed from the single managed runner instead of folding it into TestComplete. Group timeout polling now recognizes a peer-closed runtime before attempting another operation, preserving the same provenance and counters.

Regression coverage verifies single and group peer-close outcomes, finite completion, cancellation, no-test completion, and final counters.
2026-07-27 23:55:04 +07:00
Nils Andreas Svee 40167ab51a chore: update msrv to 1.88 to reflect ratatui's msrv 2026-07-27 20:51:10 +07:00
Nils Andreas Svee a311b1e0e4 chore: update README to be more clear 2026-07-27 20:28:04 +07:00
Nils Andreas Svee 15abd7c3ad chore(deps): ignore release workflow in renovate updates
Exclude .github/workflows/release.yml from Renovate to prevent automated dependency updates from interfering with sensitive release processes.
2026-07-23 11:38:17 +07:00
Nils Andreas Svee 8f39ebe8aa ci: downgrade runner to ubuntu-22.04 and enable full features
Revert the GitHub Actions runner to ubuntu-22.04 for better compatibility and ensure the "full" feature set is passed to cargo-dist during the build process.
2026-07-05 00:33:11 +07:00