Skip to content

strobe v0.2.0

Choose a tag to compare

@github-actions github-actions released this 26 Oct 22:57
· 346 commits to master since this release

Added

  • choose ANGLE's backend with --gl angle-d3d11|angle-vulkan|angle-gl|angle-metal (#29) (b35bb70)
  • rebuild the app's UI on a shared form grammar, with LAN discovery and approve-only pairing (#26) (4784c43)
  • log when the fullscreen output over the control window loses the focus (D453) (a75c76a)
  • scenes: Blacklight Carpet, UV-lit arcade confetti carpet with coiled helix streamers (D439) (d3eb5e9)
  • adaptive resolution steps down on missed refreshes, not only the mean GPU time (D314) (32e3cc8)
  • audio: on Linux fall back to a pulse or pipewire input when the default will not open (084c6db)
  • control a venue's show machine with a trust file, reconnecting by itself (4da7d2b)
  • a controller id for a laptop and the Host header a trusted proof binds to (3196ef4)
  • app: --audio ambient, the synthetic track without its beat (ac94a3c)
  • app: one click on a scene card makes it live, and LIB flips between Scenes and Controls (f400de0)
  • bench: --probe finds the size where a driver drops work, --window-size bisects the drawable (D289) (958ebca)
  • gfx: STROBE_GL_TRACE records where the renderer draws, and a test pins that it never uses framebuffer 0 (D289) (403d2da)
  • app: venue mode launch flags and trust file on the host (c9eed9b)
  • remote: trusted pairing over the WebSocket protocol (2337d78)
  • remote: trust file and HMAC-SHA256 challenge-response for venue mode (2b19e43)
  • scenes: Acid Mirror gains hairline streaks, crisp edges and more black, and re-seeds at once after a resize (D279) (1a59ae8)
  • scenes: Acid Mirror rebuilt on a mirrored advected feedback buffer (D279) (d0fb00d)
  • scenes: Neon Ribbon Flow rebuilt as layered translucent ribbons (D278) (306c7a4)
  • scenes: Electric Bloom rebuilt as a three-layer glowing garden (D277) (510aa24)
  • scenes: rebuild Chromatic Rise as a feedback-advected, posterised marbling (D276) (59fc280)
  • add scoped desktop-to-desktop remote control (20fc9ef)
  • corpus: --show-window renders in a shown tiny window, for AMD's native WGL (2f2093e)
  • add Chromatic Rise psychedelic marbling scene (a56f864)
  • app: --output-monitor N and --fullscreen put the output on the projector at launch (b731fde)
  • ui: side panel status strip and icon tabs, help bar, panel at 31%, banners that cannot overflow (41b425b)
  • ui: Synesthesia-style shell: rail-switched main view, library grid, persistent side panel (5b61c8b)
  • app: Synesthesia's scenes join the library where it is installed, and its own are never written (D271) (49f3714)
  • scene: one place finds Synesthesia's install and scene folders, and #include uses it (D271) (ee1f47f)

Fixed

  • keep a relative trust-file path as the whole path it named (89780dc)
  • move a remote whose system-chosen address went away to the new one (0a70ffe)
  • withdraw a remote command answered busy instead of running it later (1df81af)
  • a refused command line exits 2, not the 1 of a fault (D454) (32a28be)
  • a render-scale change keeps the warming and outgoing scenes' pictures (D440) (c206984)
  • a playlist that does not load at launch leaves a scene playing (D452) (5f858e2)
  • an --output-monitor that is not connected at launch is waited for (D451) (de65374)
  • a fullscreen launch puts no crash or stop box over its show (D450) (91a3072)
  • an atomic write syncs its temporary file before the rename (D438) (f65ea18)
  • an anchored show waiting for its time follows the wall clock (D437) (e7caa66)
  • Hold is refused until a cue is playing (D436) (78bdc8d)
  • a save that changes nothing the show plays is not a reload (D435) (80d4f71)
  • a hold survives a reload or an edit of the playlist (D433) (bce7306)
  • an edit above the live cue no longer moves the show to another cue (D432) (f6a7202)
  • a held cue is not moved on by an audio event (D431) (bf56e9a)
  • an anchored show is placed in the run nearest now across midnight (D430) (c77ad3b)
  • a GL driver message repeated every frame is summarised once a minute (D422) (0a82f75)
  • a MIDI fader flood keeps its latest value and cannot crowd out a note (D421) (10f669c)
  • an audio stream that stops calling back without an error is noticed and reopened (D420) (c17c6e7)
  • say why the lexical callback lookup throws its exception away (D267, D414) (64f838f)
  • a code-paired desktop takes back its own lease from a dead connection (25e3999)
  • a Shadertoy re-import never replaces a folder that is not an import of the same shader (D418) (92d577b)
  • a desktop capture over the JPEG limit is sent smaller, not dropped (eb241d5)
  • a Shadertoy texture's file name never collides with a generated file or another URL (D417) (8e2bf60)
  • a Shadertoy export saved as UTF-16 with a byte-order mark imports (D416) (b39cb71)
  • a Shadertoy global initialised from iChannelTime or iChannelResolution sees its value (D415) (ef8028e)
  • a remote Ctrl+click leaves no Ctrl held in the host's UI (80d916b)
  • event callbacks declared with let or const fire, and a function may be passed itself (D414) (de57140)
  • a desktop viewer squeezed to no width sends no NaN to the host (3044cb2)
  • a script's unhandled promise rejection is a console error, once per reason (D413) (2cfb5e4)
  • the palette's highlight stays on its entry when the list is rebuilt (576acd3)
  • a dropdown with mismatched lists and an untyped vec3 control keep their scene (D412) (40234ce)
  • a crowded frame never drops a macro key's release (3ebab54)
  • only the samplers a pass reads take texture units (D411) (9f0af44)
  • a control window that loses focus lets go of its held macro keys (5d9234e)
  • a pass past the texture limit is refused by name, and a relative one is clamped (D410) (0862236)
  • the output's monitor is followed by what it is, not its place in the list (57f2add)
  • a playlist's show time counts in f64, so its synthetic beat keeps pace (e3eccdc)
  • the scene clock counts in f64, so TIME keeps real time hours in (1cfd28c)
  • format a context value before taking the facts lock (a326870)
  • speed and traveler controls integrate in f64, so they keep their pace hours in (55040f8)
  • report once when the crash monitor dies during a show (604ae7a)
  • prune session logs by modification time, not by file name (95a940a)
  • keep only the newest twenty crash reports and minidumps (991de58)
  • give the crash monitor's system probe a ten-second budget (b3ef10d)
  • a macro counter at u32::MAX no longer overflows on add (D376) (2654061)
  • an OSC double beyond the f32 range is clamped, not infinite (D375) (dc7b880)
  • the OSC listener binds again after a socket error (D374) (8d0a789)
  • strobe-io builds clean with the midi feature off, and CI checks it (50c6ef8)
  • a non-Unicode argument no longer kills the app before logging starts (da6a65f)
  • cargo xtask symbolicate finds a dump given relative to where it was run (22ec132)
  • a failure that keeps coming back no longer pushes the others out (D381) (59141af)
  • a session log stops growing at 64 MiB (D380) (6b16957)
  • an unattended run's crash monitor raises no message box (f3a5b11)
  • the crash monitor lets the crashed app die before its notice (f76de82)
  • the synthetic track's clocks glide instead of jumping on every beat, hours into a show (D330) (3e88c07)
  • a fader whose range cannot reach its control picks it up at the nearest end instead of never (D373) (a7d4505)
  • a MIDI device that is unplugged or switched off lets go of the pads it was holding (D372) (faf8b7f)
  • /strobe/fav/0 and a mapping to fav slot or cue 0 no longer recall slot 1 or cue 1 (cbd2560)
  • a fader moved while its control was missing from the scene no longer jumps the control when it returns (53dbcf5)
  • unplugging one of two identical MIDI controllers no longer silences the other (af2d75f)
  • a program change or OSC trigger mapped to a command fires every time, not only the first (D371) (87acc56)
  • OSC datagrams with deeply nested arrays are refused instead of overflowing the listener's stack (D370) (61ec6ad)
  • a browser-listener import no longer ends the Import panel's own import early or leaves a Replace prompt in the app (31e852b)
  • a fav slot with no preset recalled on the playing scene restores its starting look and clears the active preset (dac49c8)
  • STROBE_REDUCED_MOTION no longer saves reduced motion into ui.toml as the operator's own choice (522bc17)
  • an unreadable ui.toml is kept as ui.toml.bak instead of being written over with the defaults (D352) (53a3cef)
  • saving ui.toml or show-control.json never renames another Strobe's half-written temporary file (4aef115)
  • an input chosen while capture is still opening is no longer ignored (8ee2f52)
  • --audio ambient's clocks glide instead of jumping on every beat (fbe8c80)
  • a Shadertoy global initialised from iResolution or iTime sees its value (D361) (8376fe9)
  • keys pressed over the output window keep their modifiers, so Shift+Right skips the section and Ctrl+B does not black out (D351) (412f1c9)
  • a key capture whose field is closed gives the keyboard back instead of leaving every shortcut dead (D350) (3346eb6)
  • a macro key let go while a text field or the palette has focus lets its macro go (41fe3a4)
  • a rewritten import token file is made owner-only on Unix (167308a)
  • a Shadertoy helper named like an SSF library function compiles (D360) (44b64aa)
  • a very long shader id no longer makes a folder name too long to write (76834e7)
  • a shader titled like a Windows device gets a folder Windows can make (edb67a3)
  • a device reopened at another sample rate keeps the clocks and tapped tempo (11ddc14)
  • an API key file saved by Notepad with a byte-order mark is read (d0d40e3)
  • a Shadertoy export saved with a byte-order mark imports (4c19d30)
  • a shader's title, author or tab name cannot break its generated comment lines (c041a33)
  • the spectrum and waveform fall silent when the input stalls (a313277)
  • a microphone's DC offset no longer reads as bass that never stops (31e395a)
  • copying the live audio frame no longer allocates on every render frame (2cc9d74)
  • a script's throw undefined is reported as what it threw, not as out of memory (c18a9e3)
  • setup and update declared with a top-level let or const run instead of being silently ignored (D326) (6198199)
  • a script fault that keeps coming back is logged and reported once, not thirty times a second (D325) (40ff39e)
  • setControl and setUniform read at most one component past what they take from an array (7af762c)
  • a script's load-time frame runs under the load budget, so a slow first update still declares its uniforms (D324) (288e932)
  • a scene cued again starts its script over, not from its last cue's state (D323) (1b601c6)
  • a script number past f32::MAX reaches the shader as zero, not infinity (80ad935)
  • a script's promise callbacks run at the end of the frame that queued them (D322) (c6dbae5)
  • a script's runaway recursion throws instead of overflowing a 1 MiB thread (D321) (a44afd9)
  • a stall does not step a settled scale; put-off verdicts and lock expiry are logged (D320) (031d5d0)
  • a settled scale steps again only when recent misses average 1.5 times the drop line (D319) (f8ea5cd)
  • the late lock expires with backoff, and a verdict on disturbed windows is put off (D318) (3cba150)
  • after a late step pays, the load line no longer gates the next one (D317) (b5fb2cf)
  • a late step pays when it cuts the missed refreshes by a fifth and by 5 points (D316) (b403e2e)
  • a late drop that does not cut the missed refreshes is undone, and the covered control window runs only its chores (D315) (d5378a8)
  • a minimised control window draws nothing but still loads, acts and compiles (D314) (83a4d1b)
  • a scene file that is not UTF-8 loads instead of failing the scene (2c48e0b)
  • a rebuilt GL context keeps the operator's meta settings (323555d)
  • refuse a control named after a GLSL keyword or an SSF library name (4d2a198)
  • one value that is not a number no longer loses a whole preset (7570e62)
  • a byte-order mark no longer fails a scene, shader, include or preset (8502269)
  • scenes: acid mirror keeps its noise in the feedback pass (D310) (f1dbff6)
  • scenes: electric bloom draws every layer at full size again (D310) (12831be)
  • gfx: prime every GL context with one 16x16 draw, so AMD WGL stops dropping large draws (D311) (94cf8e6)
  • app: the desktop viewer redraws for a new image or input, not at 30 Hz (6fb033a)
  • app: a covered host window streams at 5 Hz, not every 400 ms (6f8a95c)
  • app: a fast mouse no longer ends a desktop remote session (3799cc0)
  • remote: a session ends once its client is no longer paired (ec438a2)
  • remote: pointer moves no longer fill the host's input queue (4297f51)
  • remote: stopping never waits on a wake-up connection (7b183e5)
  • spell out pow on GLSL ES so a negative base is NaN as on native GL (D301) (1fde3b8)
  • show: a slow scene no longer stretches its cue past real time (D299) (97b2d20)
  • show: an unpainted control window alone does not make an output close quit (9965bf2)
  • app: the reconnect card states the real wait and attempt (7fcfb17)
  • app: a pure controller does not log a missing library as an error (7fb6939)
  • audio: log the forced audio source once, where the choice is final (992372b)
  • show: a dropdown override past its options is refused, not clamped (87e52a7)
  • show: a show that ends a second time clears its resume point again (b976057)
  • playlist: an anchored show that crosses midnight picks up after midnight (f3c119a)
  • show: saving the playlist no longer restarts the live scene (15476bd)
  • show: the cue log names the loop pass as such (26e3dce)
  • show: a render size that failed to allocate is retried every 5 s, reported once (3cfc797)
  • show: a pinned scene in a playlist gets the mouse in its own pixels (9fadaf3)
  • show: closing the output quits when the control window is out of reach (D298) (fca485e)
  • show: a jump into a warming scene gets its own cue's settings (a5b6d89)
  • show: a scene cued again starts with its passes cleared (D297) (6055d35)
  • gfx: an offscreen window reports the size it was given, not the size asked (20edd15)
  • bench: --probe reads a float target through an RGBA8 copy on GLES (9e4e1a5)
  • a trust file that cannot be read brings up the form instead of failing silently (5b1dac6)
  • a trusted controller restarts its backoff only after a frame, not on pairing (102f796)
  • gfx: upload texture rows tightly packed, not at GL's 4-byte alignment (971b694)
  • scene: run global initializers in main on desktop too, so sprinkles is not black (0037fcf)
  • app: keep the output's swap wait while the loop drives the control window (c812236)
  • app: run the control frame from the event loop when Windows withholds its paints (e96573b)
  • app: do not print a laptop command that does not exist yet (92f4965)
  • remote: bind a trust proof to the address the connection reached (dd8c2f5)
  • app: compile the playlist from output frames when the control window stops painting (fca44a5)
  • app: compile the playlist from output frames when the control window stops painting (4460897)
  • gfx: restart a kept pass that a restarted pass reads (96aeeeb)
  • gfx: keep the passes a resize does not change (a5cd1fd)
  • ui: scroll the connect form's address field into view in small windows (9b75aa0)
  • app: close the desktop viewer's socket when its worker ends (5ae8fcf)
  • ui: make the desktop viewer keep its image, time out, and be findable (7e2125a)
  • remote: count only authenticated clients as connected (610a9ca)
  • scenes: Neon Ribbon Flow is more saturated and has no reversed smoothstep (D278) (0339fe1)
  • scenes: Electric Bloom's petal tips lose their black dots, and the scene is 9% cheaper (D277) (dbf43b2)
  • scenes: Chromatic Rise loses its row artifact and gains long drags, an acid palette and a clock (D276) (db06bec)
  • app: keep remote desktop input from widening access or stalling the show (b7b311a)
  • remote: end a full desktop grant with its switch, and show who holds the controls (48f8b39)
  • update rustls for current security advisories (0f28d44)
  • gfx: adaptive resolution judges a drop on settled frames and locks only after two strikes, for a while (D280) (9af6f34)
  • scene: pin the final pass only when the shader texel-fetches a root-sized pass (D280) (698b3d8)
  • app: the load log names the size a pinned scene really draws at (D280) (f6c554e)
  • gfx: a scene with root-sized literal passes renders its final pass at that size, and adaptive resolution stops cutting what costs nothing (D280) (a5338b5)
  • ui: fav slots in reach from every tab, and a short drawer gives the preview up before the controls (e0125aa)
  • ui: the side panel follows the window by a flag, not a 440 sentinel, and a version-1 ui.toml drops the old inspector width (8eb0c3c)
  • bench: a run whose every frame is black fails instead of reporting timings (dd371ee)
  • app: no error box nobody can see: unattended runs and service sessions only log (81e7fbf)
  • app: a screenshot run ends when the control window never draws (e033f71)

Performance

  • show the paired list without waiting for a save to reach the disk (95f11da)
  • a warm-up the show no longer needs is parked at once (D434) (11a9105)
  • the LAN address shown to the operator is cached and refreshed every 10 seconds (D341) (7447859)
  • a script frame allocates nothing of its own, and uniforms are bound once at the seal (D340) (4f263af)
  • scenes: acid mirror evaluates its broad noise at reduced size (2ae8956)
  • scenes: electric bloom draws its soft back and front layers at half size (b452e56)
  • scenes: chromatic rise evaluates its broad noise at a quarter size (4580a46)
  • scenes: bloom orbs draws its lights at half size (7b9ba9c)
  • scenes: domain warp evaluates its inner warp fields at a third of the size (9eeb9bf)
  • scenes: voronoi glass rejects cells by distance before hashing them (9c31b06)
  • ui: library cards borrow their name, folder and byline instead of copying them each frame (30f10f9)

Changed

  • rustfmt the start-up sweep's app changes (D451-D453) (e604eed)
  • say why the session log cap's closing writes are discarded (D267) (5e03e9a)

Documentation

  • bring the docs up to date with the UI rework, approve-only pairing and ANGLE's backends (f0cedde)
  • record the native file pickers as checked on Windows (5240789)
  • show the reworked Library view in the README (c889e81)
  • record the remote and venue-mode bug sweep in the roadmap and audit (ef06297)
  • fix the exe path in the M26 close-out (cdd2ee0)
  • fix two Windows paths in the M26 close-out (de6ab62)
  • record the end of the M26 soak and the mini PC's show set-up on 68c7749 (572f638)
  • record the start-up and shutdown sweep (D450-D454) in the roadmap and audit (ffc95e5)
  • record the GL renderer bug sweep (D440) (57916df)
  • record the soak's clean third day and Windows servicing during it (M26) (b9179a1)
  • the soak is back to day-1 numbers once nothing covers the output (M26) (95666f7)
  • windows over the fullscreen output cost the soak 5-11% of refreshes (M26 day 2) (8add971)
  • scene 13's memory on the mini PC is a flat plateau, not a leak (M26) (eab0953)
  • record the first full soak day on 3c1bde1 (M26) (ce9b3ef)
  • record the show build's first soak day and the first lock expiry on hardware (M26) (9c6a2a4)
  • record the playlist and show-run bug sweep (D430-D437) (2131c8a)
  • record why the control window's view models still allocate, and the follow-ups in the roadmap (9477813)
  • record the follow-up bug sweep of scenes, the player, scripts and Shadertoy import (D410-D418) (b20d232)
  • list every clock that grows with show time, and open the Shadertoy clock and mic-switch questions (50167e2)
  • record the show-control sweep follow-ups in the roadmap (0e6706d)
  • say what a crash report and a minidump give away before they are shared (a5fe877)
  • record the show-control bug sweep in the roadmap (7e7869c)
  • list the show-control fixes a real MIDI controller still has to confirm (f6274c5)
  • CLAUDE.md's Windows cross-check commands match what xtask ci runs (5655035)
  • roadmap brought up to date (D290 verified, D301 failed on hardware, adaptive work done) (9a4ed26)
  • D320 verified on the projector (mini PC Task M25) (ecb880b)
  • D311 and D310 verified on the Vega 3 (mini PC Task M17) (0924b99)
  • D310 after review, with llvmpipe ratios and the Vega 3 re-measurement (ff4338a)
  • benchmark and log the venue-GPU scene pass (D297) (a1d107f)
  • describe D301's two scene constructs in words (ba39557)
  • the AMD check for D301, Q28 on native pow, and the roadmap entry (79a17cb)
  • allow strobe.exe through Windows Firewall before an unattended venue start (85af6ce)
  • hardware evidence for D290, venue mode on loopback, and Linux under WSL2 (aadc967)
  • WSL2 GPU and audio setup, and the check script picks D3D12 there (D296) (2958c88)
  • note the covered control window and venue mode in the architecture companion (44346aa)
  • keep the mini-PC probe's stdout, and state the trace's real cost (D296) (cc40cf8)
  • minipc: the first JaJa PDX show, four hours with no crash restarts (08375c2)
  • Linux as a documented platform, with a check script (D294) (2b4d009)
  • --audio ambient in the user guide (fdcb76a)
  • D294, the laptop side of venue mode, in the guide, roadmap and audit (5f09af9)
  • D292 makes ANGLE's Vulkan and Metal backends the second backend (f782cee)
  • run the G-03 spike over the full Synesthesia corpus (ea4491e)
  • add high-resolution architecture PNG export (5df7808)
  • add source-researched engine architecture infographic (78a69c9)
  • D291 one-click scenes and the Scenes and Controls pages (2195446)
  • move the G-03 front-end research under docs/research (43ccdd3)
  • D290 keeps the swap wait for a driven window and corrects a rejected option (50062a0)
  • D290, the mini PC's control window starved of paints, and the hotfix verification (bf2568c)
  • D289, the AMD black-above-160x90 audit and the mini-PC diagnostic run (1a80ade)
  • D288 venue mode, user guide, roadmap and status audit (bcdf95f)
  • D287 restarts a kept pass that a restarted pass reads (9d559fd)
  • D287, a resize keeps the passes whose size it does not change (03c8e77)
  • amd: the rebuilt scenes 13-16 cost under one domain-warp on the RX 580 (Task A12) (c879851)
  • record the desktop viewer polish (D286) (d28eced)
  • hardware: desktop remote control between the RX 580 and the T480 passes (A11, Task 45) (6620d82)
  • the pre-merge review of scenes 13-16, measured (D276-D279) (b81b20d)
  • put D277-D279 in numeric order, before D280 (96d72c8)
  • record the desktop remote's review hardening and known limits (D275) (dd5db8c)
  • normalize decision log trailing whitespace (af6656d)
  • record desktop control validation on current base (0665aea)
  • amd: D280 holds on the RX 580, and the probe rightly undoes futile drops (Task A10) (5507a13)
  • D280 pins only texel-reading scenes and gives the probe two strikes and an expiring lock (62204ed)
  • neon_city shows the whole frame at every render scale; roadmap and compatibility (D280) (551fb9e)
  • D280, the final pass of a root-sized absolute-pass scene is pinned (5eb8307)
  • renumber the layout decisions D272-D276 as D281-D285 (3104667)
  • the side panel's follow flag, the ui.toml migration and the fav slots above the tabs (D272, D274) (6ea521e)
  • minipc: ANGLE bench at 1920x1200, and AMD's hidden window draws nothing (Task M3) (6898c2c)
  • minipc: High performance, never sleep, as the owner set it for shows (d41c25b)
  • minipc: the released v0.1.0 on the JaJa projector mini-PC (Task M2, R-03) (cdfab8e)
  • the Synesthesia-style layout (D272-D276), UI_DESIGN sections 4, 5, 7, 12 and 22, the guide and the roadmap (2efe752)
  • t480: Synesthesia's 90 scenes are 90/90 on Intel, the spectrum fills the row (Tasks 39-41) (607ec8d)
  • amd: neon_city is a render-scale bug, beamers is colour and time (Tasks A8, A9) (0da9b5d)
  • Synesthesia's installed scenes in the library, read-only where they are its own (D271) (ea3be5c)
  • open-questions: list R14 in order in the resolved table (3fa3ab6)
  • record the v0.1.0 release (Q12 resolved, R-05 done, D270) (23c181c)

Internal

  • say outright that a renamed copy of Strobe is still not for sale (300ea85)
  • let anyone run Strobe for pay, restricting only selling Strobe itself (eab613a)
  • license Strobe as MIT with the Commons Clause (6e83bc8)
  • bump the version to 0.2.0 (f6eaf67)
  • deps: bump the cargo-patch group across 1 directory with 3 updates (#28) (d881dab)
  • deps: bump the github-actions group across 1 directory with 2 updates (#27) (a886092)
  • upgrade egui, egui-winit and egui_glow to 0.37 together (#25) (71da2f4)
  • rustls-webpki 0.103.16 and webpki-roots 1.0.10 for RUSTSEC-2026-0381/0382 (ed727d2)
  • a Nix flake with a dev shell, a software-GL shell and a wrapped package (D294) (0c43a41)
  • remove temporary PNG render workflow (89ce99b)
  • deps: bump rustls to 0.23.46 for the RUSTSEC advisories against 0.23.45 (f1a157c)
  • take base64 from the workspace like every other dependency (52d4a66)
  • ignore a strobe-syn-corpus clone inside the checkout (2061e54)

Tests

  • re-bless the autocontrol goldens for the shorter Shadertoy shim (D361) (ec6ff4c)
  • the load-budget script test survives a descheduled thread on a loaded machine (cce6520)
  • drop a blank line the area 4 merge left in the render tests (845f087)
  • show: a cue's overrides reach the picture each time its scene plays (fc87072)
  • script: time the setUniform budget as the best of five frames (b1b97ca)
  • remote: give the revoke-all trust assertion a message (363a0db)