screentinker/server/test
ScreenTinker 1bb24e7604 Choose the SQLite driver at runtime, and ship the FFmpeg licence with the binaries
TWO CHANGES, together because they touch the same packager hunks.

1. THE DRIVER.

The BrightSign package used to be MANUFACTURED. scripts/build-server-zip.sh dropped
better-sqlite3 from package.json and then installed db/sqlite-compat.js into
node_modules under that name, so every require resolved to the façade. It worked —
and it shipped a database layer that no test had ever executed. That is the same
shape as the TELEMETRY_COLLECTOR TDZ crash that took production down while 1676
tests and four CI jobs were green: a build-time rewrite cannot be tested by the
build that performs it.

db/sqlite-driver.js now decides at runtime: the native driver when it loads, the
node:sqlite façade otherwise. One artifact, one code path, and — the point — both
branches reachable from a test. ST_SQLITE_DRIVER=node runs the entire suite the way
a player runs it, and a new CI job does exactly that on Node 24 with --omit=optional
so the fallback is reached the same way it is on hardware, not by an env var alone.

better-sqlite3 becomes an optionalDependency, so a host with no compiler installs
cleanly and falls back rather than failing. preflight-deps stops trying to rebuild a
native module on a host that has no toolchain and a working built-in driver — on a
player that was a five-minute node-gyp failure ending in a server that never started.
Asking for the native driver BY NAME (ST_SQLITE_DRIVER=better-sqlite3) still fails
loudly, because a production box that has lost its native module is broken and should
say so rather than quietly running something else.

⚠️ NODE 24 IN PRACTICE. node:sqlite is unflagged only from 23.4; on the 22.x line it
needs --experimental-sqlite and on 20.x it does not exist. So the code probes rather
than comparing versions, the player package pins engines >=24, and the built-in cases
skip on the Node 20 CI job rather than failing there.

Verified on Node 24, both drivers, full suite:
  better-sqlite3   1762 pass / 0 fail
  node:sqlite      1762 pass / 0 fail
and the built payload resolves node:sqlite with no better-sqlite3 present at all.

2. THE LICENCE.

The ffprobe/ffmpeg binaries added in the previous commit are LGPL 2.1 and statically
linked, so the licence text has to travel WITH them — a link on a website is not the
copy the licence asks to accompany the work. The packager now copies
COPYING.LGPLv2.1 and a build README into bin/, and refuses to build if the licence is
missing. legal/third-party.html gains an LGPL section with the written offer required
by section 6 for static linking, and the exact configure line.

It also drops Sharp, which that page still listed although #263 removed it, and names
what actually does the image work now (jimp, @jsquash/webp, @jsquash/avif).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014kfhrUPit5MCqxeTQyqr56
2026-08-18 20:57:05 -05:00
..
helpers test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
148-eviction-storm.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
148-half-open.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
156-schedule-read-path.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
admin-plans-visibility.test.js Show every plan on the admin tab, with who is on each 2026-07-29 19:36:10 -05:00
admin-users.test.js SSO-only: close the backdoor, the unilateral disable, and the fresh-install fail-open 2026-08-11 07:23:28 -05:00
agency-digest.test.js feat(api): batched email digest for agency uploads (#73) 2026-06-14 13:59:37 -05:00
agency-folder.test.js feat(agency): per-token upload folder — auto-created, subtree-confined (#158) (#171) 2026-07-12 21:23:25 -05:00
agency-gate.test.js feat(api): agency portal endpoints + router.param target seam (#73) 2026-06-13 22:48:42 -05:00
agency-layouts.test.js feat(api): GET /api/agency/layouts - device-free layout geometry (#73) 2026-06-14 13:53:30 -05:00
agency-list.test.js feat(api): GET /api/agency/playlists - a token's designated targets (#73) 2026-06-14 13:08:07 -05:00
agency-scope.test.js feat(api): agency-token security primitive - off-ladder scope + agencyGate (#73) 2026-06-13 21:30:38 -05:00
agency.test.js fix(uploads): derive stored type from file content, and never serve uploads as documents 2026-07-25 11:47:09 -05:00
ai-design.test.js fix(ai): de-overlap generated text + layer shapes behind text (#41) 2026-06-09 12:57:41 -05:00
api.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
apitoken-unit.test.js test(api): close #92 follow-up coverage gaps 2026-06-12 20:10:36 -05:00
apk-signature.test.js feat(device-owner): tier foundation + QR provisioning + content-expiry & device enhancements (#168) 2026-07-12 19:41:07 -05:00
billing-authz.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
billing-endpoint.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
billing-token-mint.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
billing-unit.test.js feat(#146): usage metering + admin-gated Billable Screens report (contract system-of-record) 2026-07-01 20:45:27 -05:00
block-authz.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
boot-health.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
branding.test.js feat(branding): instance-level default white-label branding (#15) 2026-06-08 16:55:22 -05:00
brightscript-api-surface.test.js BrightSign: find the LAN address on any interface, and say when there is none 2026-08-10 11:47:23 -05:00
brightsign-bridge.test.js BrightSign: report IPv6, the attached display and the active video mode 2026-08-10 15:30:40 -05:00
brightsign-capabilities.test.js Make the Tizen and BrightSign players do what they say they do 2026-08-06 10:51:15 -05:00
brightsign-host-diagnostics.test.js Run the ScreenTinker server on the player it serves (#288) 2026-08-18 15:16:09 -05:00
brightsign-native-capture.test.js A BrightSign photographs itself, using BrightSign's own API 2026-08-07 17:28:00 -05:00
brightsign-package.test.js Run the ScreenTinker server on the player it serves (#288) 2026-08-18 15:16:09 -05:00
brightsign-payload-install.test.js Run the ScreenTinker server on the player it serves (#288) 2026-08-18 15:16:09 -05:00
brightsign-screen-state.test.js Make the on-device server opt-in, and stop the status port answering the LAN (#291) 2026-08-18 16:32:37 -05:00
brightsign-snapshot-queue.test.js Let a BrightSign host COLLECT its capture request over HTTP 2026-08-07 14:15:06 -05:00
brightsign-sync.test.js Finish the BrightSign port: native sync, offline fallback, multicast guard 2026-08-04 21:43:42 -05:00
brightsign-update.test.js Remote screenshots use the framebuffer, and an opted-in tester can move forward 2026-08-05 12:33:34 -05:00
capability-declaration.test.js Make the parity matrix true, and stop three controls that do nothing 2026-08-06 10:24:10 -05:00
clear-device-playlist.test.js Let a display's playlist actually be cleared 2026-07-30 18:29:18 -05:00
client-ip-attribution.test.js fix(logging): gate CF-Connecting-IP on a Cloudflare peer, not any trusted proxy 2026-07-26 10:23:04 -05:00
config-paths.test.js chore(version): single-source VERSION, env-configurable data paths, bump tooling 2026-06-10 12:56:03 -05:00
content-ack-dedup.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
content-ack-flood.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
content-ack-limiter.test.js fix(#143): content-ack flood control — per-device rate budget + loop-lag valve 2026-06-27 22:21:57 -05:00
content-ack-valve.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
content-batch-ops.test.js feat(content): batch operations — multi-select, batch delete, batch move (#224) 2026-07-23 12:29:44 -05:00
content-expiry.test.js feat(device-owner): tier foundation + QR provisioning + content-expiry & device enhancements (#168) 2026-07-12 19:41:07 -05:00
content-multi-upload.test.js feat(content): multi-file upload (#222) 2026-07-23 11:38:37 -05:00
content-range-resume.test.js Resume interrupted content downloads instead of restarting from zero 2026-08-05 14:54:09 -05:00
content-replace-metadata.test.js QA: close four ways a control or an asset lied about itself 2026-08-06 16:12:29 -05:00
content-revision.test.js Offline media on every player, and a revision so the cache can still be updated 2026-08-05 15:27:36 -05:00
content-search-filter-sort.test.js feat(content): server-side search, type filter, and sort (#221) 2026-07-23 11:38:22 -05:00
content-subtitles.test.js feat(content): subtitle/caption support as a content property (#223) 2026-07-23 12:33:35 -05:00
content-unstable-connection.test.js feat(content): unstable-connection mode — cap YouTube at 720p for weak WiFi (#220) 2026-07-23 11:38:18 -05:00
crash-beacon-location.test.js Record where a player crashed, not just what it said 2026-07-28 14:17:43 -05:00
dashboard-debug-log-controls.test.js Freeze and copy the live debug log, and unstick the control row 2026-08-07 19:26:03 -05:00
debug-throughput.test.js feat(#146): /api/status.debug throughput counters (gauges -> gauges + work done) 2026-06-30 23:24:32 -05:00
device-block-and-auth.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
device-capabilities-persist.test.js Make the parity matrix true, and stop three controls that do nothing 2026-08-06 10:24:10 -05:00
device-command-gating.test.js Keep display.power on the Android baseline 2026-08-06 18:10:52 -05:00
device-controls-hidden.test.js Run the ScreenTinker server on the player it serves (#288) 2026-08-18 15:16:09 -05:00
device-events.test.js feat(diagnostics): device incident log — offline cause, network-vs-reboot, display-sleep (#175) 2026-07-13 11:26:04 -05:00
device-hardware-identity.test.js BrightSign: real telemetry and hardware identity, not a block of nulls 2026-08-05 10:03:33 -05:00
device-info-empty-refresh.test.js Treat an empty device_info as "nothing new", not as "forget what you know" 2026-07-30 21:09:11 -05:00
device-owner-qr.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
device-pairing-notify.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
device-serialization-scope.test.js Scope device serialization to what each endpoint actually needs 2026-07-27 20:40:40 -05:00
device-settings-workspace-confined.test.js Apply a saved device snapshot only inside the workspace it was taken in 2026-07-30 20:56:59 -05:00
device-zone-contract.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
directory-board-render.test.js Directory board: JSON/CSV import + logo-replaces-title + fix images on player (#195) 2026-07-16 13:53:34 -05:00
directory-search.test.js Directory search: don't let the platform keyboard cover our own (#275) 2026-08-14 08:59:31 -05:00
edid-parse.test.js Run the ScreenTinker server on the player it serves (#288) 2026-08-18 15:16:09 -05:00
email-nodemailer-live.test.js Clear the high-severity advisories that reach production (#276) 2026-08-14 09:47:08 -05:00
email-transport.test.js feat(email): SMTP transport as an alternative to Microsoft Graph [#173] (#179) 2026-07-13 15:56:22 -05:00
email-verify.test.js feat(auth,tizen): TOTP 2FA UI, email verification on signup, Tizen SSSP install 2026-07-22 21:08:50 -05:00
evicted-socket-rearm.test.js fix(#148) patch2: per-device session-settle debounce — absorb duplicate-socket storms 2026-07-02 19:12:46 -05:00
fingerprint-identity-collision.test.js Wire the BrightSign bridge into the web player 2026-08-04 21:07:47 -05:00
fingerprint-reclaim.test.js fix(pairing): reinstalled panel reclaims its device row instead of being blocked [Bold] (#180) 2026-07-13 23:07:50 -05:00
fingerprint-stale-device-id.test.js Only store a device fingerprint against a device that still exists 2026-07-28 13:54:40 -05:00
flap-limiter.test.js fix(#146) B: sustained flap-rate limiter (the trigger fix), SNAT-safe identity chain 2026-06-30 20:59:53 -05:00
flap-paired-exemption.test.js fix(#148) Item 1: exempt paired+authenticated devices from the flap-limiter quarantine 2026-07-02 14:59:25 -05:00
flap-quarantine.test.js fix(#146) P0: auto-quarantine is in-memory + time-limited, never a DB block 2026-06-30 21:56:20 -05:00
fsutil.test.js Stop database snapshots losing their permissions (#289) 2026-08-18 15:24:39 -05:00
getting-started-checklist.test.js Node 22 preparation: upgrade runbook, changelog notes, and the one test that breaks (#265) 2026-08-13 12:37:36 -05:00
ghcr-check.test.js feat(dashboard): version indicator + GHCR update check (#165) 2026-07-10 22:40:06 -05:00
group-command-mixed-fleet.test.js Make the parity matrix true, and stop three controls that do nothing 2026-08-06 10:24:10 -05:00
group-delete-schedule-conversion.test.js Keep a workspace on schedules that outlive their device group 2026-07-30 20:53:21 -05:00
group-sync-backend-api.test.js Wire BrightSign native sync end to end, chosen per group 2026-08-05 10:06:18 -05:00
group-sync-backend-resolution.test.js Wire BrightSign native sync end to end, chosen per group 2026-08-05 10:06:18 -05:00
group-sync-clock.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
group-sync-native-wiring.test.js Wire BrightSign native sync end to end, chosen per group 2026-08-05 10:06:18 -05:00
heartbeat-deleted-device.test.js Put Members in the nav, reveal titles on touch, and stop a stale heartbeat killing a socket 2026-07-28 20:00:35 -05:00
i18n-keys-exist.test.js Let a locale ship without every string translated (#286) 2026-08-18 09:37:56 -05:00
i18n-tokens.test.js test(api): close #92 follow-up coverage gaps 2026-06-12 20:10:36 -05:00
identity-platform-preserved.test.js Judge capability baselines against the SHIPPED source, not the working tree 2026-08-06 18:01:24 -05:00
identity-resolver.test.js fix(#146) P1.1: resolveIdentity short-circuits on device_id (zero-lookup hot path) 2026-06-30 21:57:55 -05:00
image-ops.test.js Drop sharp: pure-JS image ops on a worker thread (#263) 2026-08-13 11:40:13 -05:00
item-duration-default.test.js Default a video playlist item to the clip's own length (#237) 2026-08-06 09:36:53 -05:00
kill-switches.test.js fix(#146) P1.3: per-feature env kill switches + fallout doc section 2026-06-30 22:03:00 -05:00
kiosk-style-containment.test.js Validate kiosk style values as CSS rather than as HTML 2026-07-27 22:28:47 -05:00
layout-save-preserves-bindings.test.js Save a layout by diffing its zones, not by deleting and re-inserting them 2026-07-30 20:51:28 -05:00
limiter-rejection-recorded.test.js Record auth rate-limit rejections so they can be measured 2026-07-28 14:01:00 -05:00
limiter-telemetry.test.js Record auth rate-limit rejections so they can be measured 2026-07-28 14:01:00 -05:00
log-selfprotect.test.js fix(#146) P3.7: coalescer carries the PEAK numeric over the window 2026-06-30 22:10:45 -05:00
login-form-state.test.js Keep every field on screen during first-run setup (#287) 2026-08-18 14:50:54 -05:00
login-identifier-first.test.js Keep every field on screen during first-run setup (#287) 2026-08-18 14:50:54 -05:00
login-lockout.test.js feat(auth): bound password login per account, not only per IP 2026-07-26 14:07:16 -05:00
loop-lag-empty-window.test.js Report zero event-loop lag when a window recorded no samples 2026-07-28 14:11:32 -05:00
loop-lag-integration.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
loop-lag-sample-count.test.js #240: stop the morning wave buying itself a blocking checkpoint 2026-08-06 20:22:21 -05:00
loop-lag.test.js feat(#142): event-loop lag telemetry (perf_hooks) + bounded storage 2026-06-27 19:01:08 -05:00
max-file-size-config.test.js Parse MAX_FILE_SIZE, and document what else caps an upload 2026-07-28 20:40:14 -05:00
media-mute.test.js Mute reaches YouTube items — it never did, and failed opposite ways per player 2026-08-05 10:50:59 -05:00
media-orientation.test.js fix(content+android): rotation-aware media — portrait upright on dashboard AND player (#170) (#172) 2026-07-12 22:05:11 -05:00
media-probe-nonblocking.test.js Probe video asynchronously — the sweep would have blocked the loop per file 2026-08-07 08:42:34 -05:00
media-proxy.test.js feat: transition engine — GL wipes across web, Tizen & Android (+ image↔video) (#204) 2026-07-20 16:45:32 -05:00
mute.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
numeric-code.test.js fix(devices): generate access-gating six-digit codes with a CSPRNG 2026-07-26 14:24:03 -05:00
observability-units.test.js feat(#146): always-on devices_connected + admin-toggleable /api/status debug block 2026-07-01 18:45:40 -05:00
offline-alert-per-outage.test.js Alert once per outage instead of once per dedup window 2026-07-28 12:50:14 -05:00
oidc-account-linking.test.js Link start cannot be navigated to: a bearer token does not survive it 2026-08-12 14:44:23 -05:00
oidc-email-verified-policy.test.js Customer Entra tenants: verify the domain, then be believed 2026-08-11 23:05:25 -05:00
oidc-sso.test.js SSO-only: close the backdoor, the unilateral disable, and the fresh-install fail-open 2026-08-11 07:23:28 -05:00
openapi-contract.test.js Show a panel's IPv6, and size the pairing code to the screen it is on 2026-08-07 08:06:45 -05:00
operator-block.test.js fix(#146) D: operator block — close the device_id-less gap + dashboard toggle 2026-06-30 21:28:04 -05:00
operator-permissions.test.js fix(roles): make platform_operator assignable + add deny/assign regression tests 2026-06-05 12:44:39 -05:00
orientation-style.test.js Portrait on the web player was 420px off-screen — rotating a box does not move it 2026-08-05 12:58:50 -05:00
ota-allow-managed-config.test.js Add an operator override for self-update on MDM-managed panels 2026-07-28 23:07:30 -05:00
ota-beta-channel.test.js Let a display opt in to pre-release builds, so a test build is not reverted under the tester 2026-07-30 18:35:31 -05:00
ota-breaker-device-forgive.test.js Clear a device's OTA rate state when it proves its identity 2026-07-27 22:28:47 -05:00
ota-breaker-patchn.test.js fix(ota): treat legacy -patchN as a released version so the old fleet is offered updates 2026-07-08 23:21:26 -05:00
ota-breaker.test.js fix(#144): OTA update-check circuit-breaker + phantom guard + per-device keying 2026-06-28 23:36:52 -05:00
ota-check.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
ota-hardening.test.js fix(#146) P1.2: band-aware download caps — serve freely when healthy 2026-06-30 22:00:28 -05:00
ota-two-channel.test.js Serve a beta APK alongside the stable one, and let a display move between them 2026-07-30 19:12:46 -05:00
pair-lockout.test.js fix(api): harden device pairing against brute-force (#87) 2026-06-12 20:16:12 -05:00
pairing-code-liveness.test.js fix(pairing): expire a pairing code on device liveness, not row age 2026-07-27 10:59:38 -05:00
pairing-race.test.js fix(pairing): close deferred-offline reclaim race + idempotent same-code adopt (#192) 2026-07-15 16:05:50 -05:00
password-reset.test.js feat(auth): self-service password reset 2026-07-27 11:19:39 -05:00
pip-overlay.test.js fix(tizen): decode-gated image double-buffer to kill the black flash between stills [#187] (#193) 2026-07-15 18:29:39 -05:00
pip-write-authorization.test.js Hold overlay pushes to the same write check as every other fleet action 2026-07-30 20:46:03 -05:00
play-log-reference-resolution.test.js Resolve proof-of-play references instead of trusting the reported id 2026-07-27 21:15:44 -05:00
play-log-widget-attribution.test.js Attribute a widget play to the widget that played 2026-07-28 19:06:56 -05:00
player-boot-tdz.test.js Fix a boot-time TDZ that bricked a player across reboots 2026-08-07 20:39:14 -05:00
player-cache-policy.test.js Offline media on every player, and a revision so the cache can still be updated 2026-08-05 15:27:36 -05:00
player-capabilities.test.js A baseline moves when the fix reaches SCREENS, which is not one rule 2026-08-06 22:54:45 -05:00
player-capture-hardware-plane.test.js Screenshots: prove pixels arrived instead of assuming the draw worked 2026-08-05 10:01:03 -05:00
player-declared-capabilities.test.js Stop claiming offline cache on a runtime that refuses to run a service worker 2026-08-05 19:34:52 -05:00
player-identity-reset.test.js Wire the BrightSign bridge into the web player 2026-08-04 21:07:47 -05:00
player-live-debug-log.test.js Make the live debug log work on the web player, and so on BrightSign 2026-08-07 18:31:18 -05:00
player-media-error-multiadvance.test.js One broken clip, one skip: stop media errors advancing the playlist N times 2026-08-07 19:12:16 -05:00
player-media-health.test.js fix(#146): web player — guard PlayerMediaHealth calls by METHOD, not object (stale-module TypeError) 2026-07-01 22:19:22 -05:00
player-parity-baselines.test.js Stop Android panels losing controls when they update 2026-08-10 10:31:33 -05:00
player-reconnect-supervisor.test.js Re-establish a player socket the server closed 2026-07-28 16:38:19 -05:00
player-repair-mode.test.js Recover an unpaired player without needing a keyboard 2026-07-28 13:17:22 -05:00
player-screen-scaling.test.js Show a panel's IPv6, and size the pairing code to the screen it is on 2026-08-07 08:06:45 -05:00
player-sw-scope.test.js Merge 1.9.30: fail loudly on a missing asset; stop an empty playlist wiping the cache 2026-08-06 17:45:34 -05:00
player-transition-hardware-plane.test.js Export shared modules to the browser even when Node is in the page 2026-08-07 10:36:50 -05:00
player-volume-command.test.js Make the volume slider real, and stop an empty playlist wiping the cache 2026-08-06 16:18:25 -05:00
player-widget-frame-origin.test.js Add org-level widget sandbox isolation toggle with warnings 2026-08-10 21:14:42 +00:00
playlist-build-cost.test.js test(#146) P2.5: buildPlaylistPayload cost under mass reconnect — mitigated 2026-06-30 22:08:55 -05:00
preflight-deps.test.js Choose the SQLite driver at runtime, and ship the FFmpeg licence with the binaries 2026-08-18 20:57:05 -05:00
preview-frame.test.js Preview a rotated display the way people see it, not the way its framebuffer is 2026-08-06 09:38:31 -05:00
preview-skip.test.js Let the playlist preview skip, so reviewing item 8 does not cost seven durations 2026-08-06 09:35:16 -05:00
provisioning-cleanup.test.js fix(#146) A: non-blocking maintenance — chunked+yield+band-gate all sweeps 2026-06-30 20:55:05 -05:00
provisioning.test.js fix(api): consolidate device pairing to /pair, remove vestigial bare endpoint (#90) 2026-06-12 20:13:16 -05:00
raspberry-pi-setup.test.js Pi installer: stop advertising what was never installed (#245) 2026-08-10 10:50:34 -05:00
reconnect-storm-load.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
reconnect-throttle-integration.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
reconnect-throttle.test.js fix(#142): load-aware per-device reconnect throttle (the outage fix) 2026-06-27 19:18:00 -05:00
recovery-grant.test.js fix(auth): back break-glass recovery with a revocable, auditable grant 2026-07-26 14:49:03 -05:00
register-insert-crash.test.js fix(#146): crash-hardening — one device's handler throw can't take down the fleet 2026-06-29 23:38:11 -05:00
remote-capability-gate.test.js QA: close four ways a control or an asset lied about itself 2026-08-06 16:12:29 -05:00
schedule-calendar-expansion.test.js Let a locale ship without every string translated (#286) 2026-08-18 09:37:56 -05:00
schedule-content-item.test.js Make a content-only schedule actually put that content on the screen 2026-07-30 22:26:58 -05:00
schedule-eval.test.js feat(scheduling): per-item schedule blocks (#74 dayparting, #75 auto-expire) 2026-06-11 15:46:41 -05:00
schedule-grid-math.test.js Draw a schedule that runs past midnight 2026-07-28 19:28:04 -05:00
schedule-instance-format.test.js Stop schedules landing on the wrong date (#284) 2026-08-18 09:14:23 -05:00
schedule-modal-date.test.js Stop schedules landing on the wrong date (#284) 2026-08-18 09:14:23 -05:00
schedule-recurrence-end.test.js Make a recurring schedule respect its start and end dates 2026-07-30 22:22:59 -05:00
schedule-timezone-inheritance.test.js Store a schedule in the timezone its screen runs in 2026-07-28 09:43:46 -05:00
schedule-week-all-screens.test.js Show every screen's schedule on one calendar 2026-07-28 12:16:19 -05:00
scheduled-reboot.test.js feat(device-owner): tier foundation + QR provisioning + content-expiry & device enhancements (#168) 2026-07-12 19:41:07 -05:00
schema-check.test.js fix(db): observable migrations + fail-fast schema verification (#37) 2026-06-09 09:31:52 -05:00
screenshot-authorization.test.js fix(devices): authorize the screenshot route on the device's workspace 2026-07-26 14:17:54 -05:00
security-fixes.test.js fix(security): patch quick-win findings from the codebase review 2026-06-08 19:02:19 -05:00
session-settle.test.js fix(#148) patch2: per-device session-settle debounce — absorb duplicate-socket storms 2026-07-02 19:12:46 -05:00
session-token-resolution.test.js Update sharp to 0.35.x, and repair the corrupt PNG fixture it exposed 2026-07-27 21:15:44 -05:00
settings-pin.test.js The settings PIN can be rotated and set from the dashboard 2026-08-05 13:44:15 -05:00
socket-handler-isolation.test.js fix(#146): crash-hardening — one device's handler throw can't take down the fleet 2026-06-29 23:38:11 -05:00
sqlite-driver.test.js Choose the SQLite driver at runtime, and ship the FFmpeg licence with the binaries 2026-08-18 20:57:05 -05:00
ssrf-guard.test.js feat: transition engine — GL wipes across web, Tizen & Android (+ image↔video) (#204) 2026-07-20 16:45:32 -05:00
status-debug-toggle.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
status-log-prune-hardening.test.js test: widen CI-fragile event-loop-gap timing bars (flaky prune/storm asserts) 2026-07-08 17:31:27 -05:00
status-log-prune.test.js fix(#146) A: non-blocking maintenance — chunked+yield+band-gate all sweeps 2026-06-30 20:55:05 -05:00
storm-harness.test.js test: widen CI-fragile event-loop-gap timing bars (flaky prune/storm asserts) 2026-07-08 17:31:27 -05:00
stripe-checkout.test.js feat(stripe): enable promotion codes on checkout sessions (#227) 2026-07-23 23:44:18 -05:00
sw-content-prefetch.test.js Offline media on every player, and a revision so the cache can still be updated 2026-08-05 15:27:36 -05:00
sw-prune-guard.test.js Fail loudly on a missing asset, and stop an empty playlist wiping the cache 2026-08-06 16:31:53 -05:00
sync-backend.test.js Drop the user-agent fallback — it could never fire 2026-08-05 10:30:10 -05:00
tcp-keepalive.test.js fix(#148) Items 2-4: mark-offline closes the socket + tighten ping + TCP keepalive 2026-07-02 14:59:25 -05:00
telemetry-collector.test.js Show screens deployed on the landing page (#277) 2026-08-14 10:07:50 -05:00
telemetry-ipv6.test.js Show a panel's IPv6, and size the pairing code to the screen it is on 2026-08-07 08:06:45 -05:00
telemetry-temperature.test.js BrightSign: real telemetry and hardware identity, not a block of nulls 2026-08-05 10:03:33 -05:00
telemetry.test.js Install statistics: send on opt-in, name a blocked firewall, and add an operator collector (#268) 2026-08-13 19:00:37 -05:00
tenant-cascade-migration.test.js fix(db): cascade tenant resources on workspace/org delete (#18 follow-up) 2026-06-08 16:01:52 -05:00
text-widget-font-size.test.js Stop shrinking hand-written text widgets into illegibility 2026-07-30 20:28:28 -05:00
thumbnail-backfill.test.js Backfill missing thumbnails at boot, and say when ffmpeg is absent 2026-08-07 09:30:32 +01:00
thumbnail-proxy.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
tizen-eval-drift.test.js feat(scheduling): per-item schedule blocks (#74 dayparting, #75 auto-expire) 2026-06-11 15:46:41 -05:00
tizen-image-blackflash.test.js fix(tizen): decode-gated image double-buffer to kill the black flash between stills [#187] (#193) 2026-07-15 18:29:39 -05:00
tizen-media-cache.test.js Make the Tizen and BrightSign players do what they say they do 2026-08-06 10:51:15 -05:00
tizen-volume.test.js Make the Tizen and BrightSign players do what they say they do 2026-08-06 10:51:15 -05:00
totp-keyrotation.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
totp-unit.test.js feat(auth,tizen): TOTP 2FA UI, email verification on signup, Tizen SSSP install 2026-07-22 21:08:50 -05:00
totp.test.js feat(auth,tizen): TOTP 2FA UI, email verification on signup, Tizen SSSP install 2026-07-22 21:08:50 -05:00
transition-config.test.js feat: transition engine — GL wipes across web, Tizen & Android (+ image↔video) (#204) 2026-07-20 16:45:32 -05:00
trial-expiry.test.js fix(subscription): make the trial-expiry auto-downgrade actually fire (#228) 2026-07-24 15:51:46 -05:00
unblock-clears-saved-block.test.js Make unblock stick, and say so when a device is refused 2026-07-29 18:44:11 -05:00
upload-content-type-safety.test.js fix(uploads): derive stored type from file content, and never serve uploads as documents 2026-07-25 11:47:09 -05:00
uploads-missing-file-404.test.js Fail loudly on a missing asset, and stop an empty playlist wiping the cache 2026-08-06 16:31:53 -05:00
user-deletion.test.js feat(admin): Delete Organization + Workspace with cascade (#36) 2026-06-09 09:22:21 -05:00
v4-core-liveness.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
v4-core-refresh-gate.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
v4-exit-signal-phase3.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
v4-exit-signal.test.js test(ci): OS-assigned ephemeral ports for subprocess suites — kill the port-collision flake (#176) 2026-07-13 09:51:40 -05:00
version-precedence.test.js Every build from alpha10 onward sorted below alpha8 (#270) 2026-08-13 20:20:17 -05:00
wal-checkpoint-starvation-floor.test.js The checkpointer startup line no longer describes a policy it stopped having 2026-08-06 22:12:01 -05:00
wal-checkpointer-no-workers.test.js Run the ScreenTinker server on the player it serves (#288) 2026-08-18 15:16:09 -05:00
wall-geometry.test.js Describe a portrait video wall as portrait, and stop a wall hiding its screens 2026-08-06 09:46:31 -05:00
wall-payload.test.js Describe a portrait video wall as portrait, and stop a wall hiding its screens 2026-08-06 09:46:31 -05:00
widget-preview-stays-isolated.test.js Keep the widget editor's Preview isolated, whatever the org setting says 2026-08-11 15:53:57 -05:00
widget-render-xss.test.js fix(security): sanitize public widget render to close stored XSS 2026-06-08 19:11:14 -05:00
widget-sandbox-isolation-setting.test.js Add org-level widget sandbox isolation toggle with warnings 2026-08-10 21:14:42 +00:00
widget-sandbox-ui-guardrails.test.js Add org-level widget sandbox isolation toggle with warnings 2026-08-10 21:14:42 +00:00
widget-telemetry-bounded.test.js fix(widgets): bound the unauthenticated telemetry store, and stop it writing rows 2026-07-26 10:36:09 -05:00
youtube-shorts.test.js fix(content): render YouTube Shorts in 9:16 instead of a landscape frame (#184) (#189) 2026-07-15 08:41:43 -05:00