You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Lossless processing (max-speed replay, non-realtime mock) is now lossless and
reproducible for processors with several inputs: secondary inputs use back-pressure
instead of dropping their oldest samples, time-based joins wait for the data (not for a
host-time timeout) and are never trimmed, and the join buffers are trimmed by time behind
the primary. A raw secondary stream with nothing at a frame's time (a gap, or a stream
that ended) stops holding the frame once the primary is 1 s of device time ahead.
A processor returning something that is not an Emit/tuple or a list of them (a bare
payload, a float) is counted as an error instead of silently ending its worker — which
also hung a lossless replay for good; any unexpected error in a worker's loop is counted
and the worker carries on.
Quitting the app (closing the window, Ctrl-C in ariastreamlab app --browser or ariastreamlab design) waits for a session started from the browser to finalise; before,
the process exited first and left its manifest at status: running.
The experiment's logging section (level, format) is applied; it was ignored because
the import-time defaults were never replaced. Reconfiguring keeps the session's logs/session.log handler.
Live sessions: the device monitor survives unexpected errors (thermal mitigation reported
without a temperature, an unparseable quality score, …) — before, one such error ended the
thread and with it the stall detection that stops a session the glasses have stopped.
The quality-stats parser no longer raises on a non-numeric score.
Tests: the example-project tests no longer assume a non-realtime mock session is still
running 0.3 s after it starts.
Dashboard, sessions it did not start: Sessions → delete refuses the session attached to
the dashboard whatever started it (ariastreamlab run, a notebook, a protocol script) —
before, only a browser-started run was protected — and a session another process is still
writing (manifest running, a file changed in the last 2 min). Run on Design and replay on Sessions refuse to start while any session is attached, instead of starting a
second session against the same glasses and taking the dashboard over.
Dashboard on the network (host: "0.0.0.0"): Design, Sessions and Setup — which
read and write files, delete sessions, install packages and start sessions — answer only
the computer running the experiment; other machines get the monitor. A warning is logged
when the server listens beyond loopback, and the tutorial says what is exposed.
Replay controls act at once: pause, seek, speed and stop interrupt the pacing wait
instead of waiting for the next sample — across a multi-second hole in a recording they
were dead for the whole gap (30 s at 0.25×) and stop() timed out. Seeking a paused replay
keeps it paused at the target (it used to resume), and the position shows the target.
Markers and intervals added during a replay (dashboard buttons, mark()/begin()/end()
without at_ns) are stamped at the replay position; the host-clock estimate they used
was wrong after a pause, a seek or at any speed other than 1×.
VRS replay after a seek or with --start: sequence numbers continue from each stream's
record index in the file instead of restarting at 0 (the statistics saw duplicates and
the recorded sequence_number was wrong).
Experiment.open() cleans up when it fails half-way (an unknown processor type, a
storage or dashboard error): the statistics thread and whatever else had started are
stopped, and a session directory that already exists is finalised as crashed instead of
staying running.
Experiment.wait() raises the error that ended a session started with start() (no
glasses found, a source failure…); before, it returned True and a protocol loop went on
annotating a session that had stopped.
Ctrl-C ends a session normally (completed, with an "interrupted" warning) whether it was
pressed during run() or in the protocol loop of a start()ed session; the latter used
to mark it crashed.
An Experiment is one session: open()/run() after close() raise instead of writing
an empty "completed" session that carried the first one's statistics.
Release workflow: a tag is published only after the whole CI suite (lint, types, import
contracts, tests on Ubuntu and macOS, wheel build) passes on that tag; the tag must be vX.Y.Z and reaches the shell through an environment variable (a crafted tag name given
to the manual re-publish could run commands); the workflow token is read-only except for
the publishing job, and every third-party action is pinned to a commit.