docs: record production deployment [skip ci]
* docs: record 6634 production deployment [skip ci] * docs: record 6634 production deployment [skip ci] * docs: keep deployment truth current [skip ci] * docs: keep deployment truth current [skip ci]
This commit is contained in:
1 parent
f6a8d533d7
commit
3581cc46cb
4 files changed
+36
-245
No files matched your search
@@ -4,7 +4,7 @@ Screener is a private, low-latency screen-sharing project for one game player an
|
||||
|
||||
The first measurable Web proof of concept is implemented. A host captures a screen, window, or browser tab and shares a numeric room code. Rooms default to a private fragment invitation whose capability authorizes only one room; a Host may explicitly choose public watching by room code after site access. During a share, the host can change between three ceiling profiles without reopening the source picker: 1080p60 at 8 Mbps, 1080p30 at 5 Mbps, and 720p30 at 3 Mbps. The host can also temporarily pause the picture or switch sources. Rooms are random and temporary by default. A site-access-protected deployment can optionally use SQLite-backed room numbers starting at `1`, reusable links, and a waiting state after sharing stops. Lightweight deployments may keep independent direct WebRTC connections. The flagship deployment enables the all-room controller with bounded peer descendants and LiveKit SFU roots; short-lived TURN may be authorized only for a controller-selected exceptional media edge. The default room capacity is eight viewers and deployments may configure 1 through 16, but that admission limit is not a performance promise.
|
||||
|
||||
This is not yet a broadly validated production release. Production runs exact `16f6eab27bdfb1c15cdbd814a35864f4f18be767` with the all-room bounded peer/SFU-UDP controller; ordinary peer ICE remains STUN-only, and short-lived TURN is configured only for controller-selected exceptional media edges. The optional Windows native sender remains source-only and is not a production runtime. Mobile devices are Web viewers only; ordinary Android and iOS browsers do not expose reliable screen capture for a Web Host. Real cross-network SFU/TURN media, game audio, a sustained 1:8 room, mobile browser lifecycle behavior, and latency targets still require the documented manual test matrix.
|
||||
This is not yet a broadly validated production release; [Current status](./docs/status.md) owns the deployed revision and validation evidence. The current flagship boundary is the all-room bounded peer/SFU-UDP controller, with ordinary peer ICE kept STUN-only and short-lived TURN limited to controller-selected exceptional media edges. The optional Windows native sender remains source-only and is not a production runtime. Mobile devices are Web viewers only; ordinary Android and iOS browsers do not expose reliable screen capture for a Web Host. Real cross-network SFU/TURN media, game audio, a sustained 1:8 room, mobile browser lifecycle behavior, and latency targets still require the documented manual test matrix.
|
||||
|
||||
## Run locally
|
||||
|
||||
|
||||
+22
-225
@@ -20,26 +20,33 @@ tracked coturn example remains `stun-only`; the shared host retains its older
|
||||
authenticated-relay daemon configuration and firewall range. The application
|
||||
does not pre-advertise TURN credentials to ordinary peers.
|
||||
|
||||
Production currently runs exact `ecc794d6f01ff8e90cc07a267d221daaac8da9e1`
|
||||
Production currently runs exact `6634cb9fca8278b44d57e5fcddcbaf9f0dc9b137`
|
||||
on the existing shared public IP, with local/public health 200 and SQLite v3
|
||||
integrity. The 951,317-byte artifact has SHA-256
|
||||
`22c82d0e06f34abb746ee9e652821deebeea0174643b31ec6e21e159933f5431`.
|
||||
The 2026-08-21T02:37:28Z UTC cutover held the deployment lock for 2,646.166 ms;
|
||||
local health returned 425.531 ms after service stop (364.286 ms after the symlink
|
||||
integrity. The 957,434-byte artifact has SHA-256
|
||||
`89ff05dbd4d642ed8364a1e230b26b6f4e1dab5a879a0d40a14364e3a26a5cf7`.
|
||||
The 2026-08-21T03:53:23Z UTC cutover held the deployment lock for 2,755.457 ms;
|
||||
local health returned 551.381 ms after service stop (478.335 ms after the symlink
|
||||
switch). Screener, LiveKit, coturn, and nginx are active/running with
|
||||
observed `NRestarts=0`. SQLite v3 contains five rooms including room `1`, with the
|
||||
service owner/mode and database hash preserved. `SITE_ACCESS_PASSWORD`,
|
||||
service owner/mode `screener:screener`/0600 and SHA-256
|
||||
`aef724ae52c4107be8ec8791e72f8dcaa11b0ec849fb432d022e2cfb9cfe0974`.
|
||||
`SITE_ACCESS_PASSWORD`,
|
||||
`/api/site-access`, and the nginx limiter replaced their retired Host-admission
|
||||
names in the prior access cutover; this release preserved the environment hash
|
||||
and the old endpoint remains 404. Exact
|
||||
`16f6eab27bdfb1c15cdbd814a35864f4f18be767`
|
||||
is the immediate rollback target; exact `22119b907d3cf03ce8b06d6fb4596ce1a26fedd7`
|
||||
remains a secondary rollback.
|
||||
This release deploys the window/full-display audio picker hints, audio `music`
|
||||
hint, interval A/V loss percentages, audio codec/format/bitrate/jitter details,
|
||||
and the one-per-room `peer-selected` attempt cap excluding Host ingress. The
|
||||
selected-edge UDP tuple remains configured with TTL 120. This cutover triggered
|
||||
no browser, TURN, SFU, or other media canary and remains configuration evidence.
|
||||
`ecc794d6f01ff8e90cc07a267d221daaac8da9e1` is the immediate rollback target;
|
||||
exact `16f6eab27bdfb1c15cdbd814a35864f4f18be767` and
|
||||
`22119b907d3cf03ce8b06d6fb4596ce1a26fedd7` remain secondary and tertiary.
|
||||
This release gives active SFU Viewers LiveKit connection state/stats instead of
|
||||
P2P waiting/ICE-unknown placeholders. Details show P2P or SFU and add TURN only
|
||||
for an actually selected relay candidate; exact-upstream presence feeds the
|
||||
on-demand Host topology. The release also requests a 128,000 bit/s screen-audio send
|
||||
ceiling on P2P/relay and LiveKit SFU, disables SFU DTX, and uses `balanced` for
|
||||
recommended profiles and advanced defaults. The browser still owns degradation,
|
||||
and the audio value is a requested/read-back ceiling rather than an audible-quality
|
||||
or stereo guarantee. The selected-edge UDP tuple remains configured with TTL 120.
|
||||
This cutover triggered no browser, media, SFU, TURN, or performance canary and
|
||||
remains exact-source, build, configuration, and deployment evidence.
|
||||
A separate earlier local Screener canary using exact `16f6eab` source and the
|
||||
production LiveKit/coturn tuple later proved active Host-ingress relay function
|
||||
without using the production application room or database; it is not
|
||||
@@ -125,7 +132,7 @@ ICE. The accepted ladder is direct/peer UDP, then the revision-bound SFU/UDP
|
||||
virtual parent, then optional authenticated TURN for one controller-selected
|
||||
exceptional edge. LiveKit participants receive only revision-bound `sfu-config`
|
||||
URL/token messages and negotiate within LiveKit's separate ICE domain. The
|
||||
selected-edge TURN config/wire is deployed in the current `c27df22` release with one
|
||||
selected-edge TURN config/wire is deployed in the current `6634cb9` release with one
|
||||
UDP URL and a 120-second credential TTL. It was not exercised by a real media
|
||||
session during this cutover.
|
||||
|
||||
@@ -352,216 +359,6 @@ v2 database separately for diagnosis, restore the exact v1 backup with service
|
||||
ownership and mode `0600`, verify integrity and `user_version = 1`, and only then
|
||||
start the old binary. Never point the old binary at the migrated v2 file.
|
||||
|
||||
Production completed this migration at 2026-08-20 03:06 +08 on exact
|
||||
`bbe4654a7a9b`; its artifact SHA-256 is
|
||||
`3C09AF81BCE68B51DD9E36E1C253A880D8D6F24BB498A090CF815AB196C392AA`.
|
||||
A stopped, read-only-verified v1 backup retained all four rooms;
|
||||
the v2 integrity/schema and locked-private digest checks passed, including room
|
||||
`1`. site access and a cookie-free private Viewer denial also passed. An
|
||||
earlier artifact attempt was rolled back after hard-linked dependencies let a
|
||||
permission change make the rollback release unreadable for 3m11s; the final release has an
|
||||
independent dependency tree and zero shared regular-file inodes.
|
||||
|
||||
The code-only initial-connect recovery deployed at 2026-08-20 09:40 +08 on
|
||||
exact `89e6d7649169`; its artifact SHA-256 is
|
||||
`39B62039FCFB05281F78FCF85C964C520E2BB2FE5661ADA4758D598A7DF6CEC1`.
|
||||
Health returned in 1.09 seconds, the v2 database still contained four rooms and
|
||||
room `1`, and environment, nginx, and LiveKit state were unchanged. At 09:37 a
|
||||
bare `systemctl is-active` treated the expected stopped state as an error under
|
||||
strict shell and caused an immediate healthy rollback; no new application had
|
||||
failed. The later explicit `ActiveState` sequence completed successfully.
|
||||
|
||||
The admission-policy and anonymous-entry cutover deployed between
|
||||
2026-08-20 11:13:42 and 11:13:43 +08 on exact
|
||||
`05f98d10ecd174427fc969f3ba2d510f12c74eb3`; its artifact SHA-256 is
|
||||
`FF938E8D59428F08B3F162DEA6DCF842A4705A94D3153967814CCE9AD6CBD94D`.
|
||||
The full gate passed 25 test files/369 tests before the atomic code/environment
|
||||
switch. Health and the built asset returned 200; SQLite v2 with four rooms
|
||||
including room `1` and zero Screener/LiveKit restarts were preserved. Chrome
|
||||
kept all four anonymous entry routes neutral until authorization; the current admission key returned 200,
|
||||
while the former and an incorrect key returned 401. Rolling this cutover back
|
||||
requires exact `89e6d7649169` together with its environment backup at
|
||||
`/etc/screener/backups/05f98d10-precutover-20260820T110654+0800`.
|
||||
|
||||
One failed validation assertion printed the stateless admission cookie only in
|
||||
the operator's private test output. It did not enter the repository, service
|
||||
logs, shell history, release artifact, browser profile, or temporary files. No
|
||||
value is retained here; the cookie has no server-side state and expires within
|
||||
12 hours.
|
||||
|
||||
Local quality reparenting deployed between 2026-08-20 11:41:22 and 11:41:23
|
||||
+08 on exact `d4bc421828c4b74f55195723aace290ffc0e5f9d`; its artifact SHA-256 is
|
||||
`3F8CF25F8D989CBDF38DBBCAC4A261C349E44B72D274A944B877540056171A08`.
|
||||
The immutable release is `/opt/screener/releases/d4bc421828c4`, its upload is
|
||||
`/opt/screener/uploads/screener-d4bc421828c4.tar.gz`, and the pre-switch target
|
||||
record is `/opt/screener/backups/current-before-d4bc421828c4.txt`.
|
||||
The gate passed 25 test files/378 tests, typecheck and both builds. The 760ms
|
||||
code-only switch kept health and `index-YdNLg2E8.js` at 200, SQLite integrity
|
||||
and four rooms including room `1`, Screener/LiveKit restarts at 0/0, and
|
||||
environment/nginx/LiveKit hashes unchanged. Its immediate rollback is
|
||||
`05f98d10ecd1` with the same environment and SQLite v2. A pre-cutover inode gate
|
||||
caught two internal esbuild hard links; hash-equal copy replacement broke them
|
||||
before the switch, so no running or rollback release was affected.
|
||||
At 11:44:15 +08 Screener and LiveKit were still active/running with zero restarts,
|
||||
used 39,198,720 and 79,269,888 bytes, and had no error-priority journal entries
|
||||
or cgroup high/max/OOM events; host available memory was 373,469,184 bytes.
|
||||
No quality/reparent log or real-room trigger appeared, so this verifies the
|
||||
deployed code and containment, not reparenting behavior.
|
||||
|
||||
Viewer presence plus deterministic relay-admission rescue switched from
|
||||
`2026-08-20T15:33:21.720345870+08:00` to health-ready at
|
||||
`2026-08-20T15:33:22.282829810+08:00`; its gate finished at
|
||||
`2026-08-20T15:33:23.051172737+08:00` on exact
|
||||
`31bee238bc1e901e823f34e50737e202dc4b04bf`. The 889,710-byte immutable upload
|
||||
is `/opt/screener/uploads/screener-31bee238bc1e-20260820T071907Z.zip` with
|
||||
SHA-256 `C759A33A50EC3E272F07BCC00F2043CA0042446078472CAFA66CBD406EC925D9`,
|
||||
and the active release is `/opt/screener/releases/31bee238bc1e`.
|
||||
The gate passed 28 test files/421 tests and both builds. Restart-to-health took
|
||||
560.607 ms; 20 ms probing observed 437.137 ms unavailable. External health,
|
||||
the asset hash, three neutral entry routes, SQLite integrity/version 2/four
|
||||
rooms including room `1`, and the exact revision passed. Screener, LiveKit,
|
||||
coturn, and nginx remained active with zero automatic restarts; only Screener
|
||||
had the one planned restart. Environment, nginx, LiveKit, coturn, firewall,
|
||||
listeners, exact-room/SFU caps, and disabled application TURN tuple were
|
||||
unchanged.
|
||||
At the `2026-08-20T15:39:07.082219441+08:00` audit, Screener used 38,031,360
|
||||
bytes with zero cgroup low/high/max/OOM events. The pre-cutover rollback is exact
|
||||
`7fea60ef6f2ad14a9ac1c23a89a523d91bbb97e4` with
|
||||
`/opt/screener/backups/31bee238bc1e-precutover-20260820T073321Z`.
|
||||
No temporary symlink, deployment process, browser profile, or held deployment
|
||||
lock remained; the immutable upload, active release, and backups are retained.
|
||||
No real room triggered admission rescue, so this verifies deployment and
|
||||
rollback readiness, not the new route transition or media quality.
|
||||
|
||||
The sole Host display-name cutover attempt used exact source
|
||||
`61a87ae47e38abc943cef47b3d7318bb51bf86d6` and artifact
|
||||
`screener-61a87ae47e38abc943cef47b3d7318bb51bf86d6-20260820T143538Z.tar.gz`
|
||||
(883597 bytes, SHA-256
|
||||
`d5b4d6cc567ba96ce37f8eb9934dd5822c64dc084796047d5f6d6217e2e74acb`). It ran at
|
||||
`2026-08-20T16:09Z`; the prepare-to-release switch and health gate passed, but a
|
||||
post-cutover assertion compared against stale `NRestarts=31` data and triggered
|
||||
automatic rollback. The application and database were not the cause. Rollback
|
||||
left `fdd14ba0d9b5` active and healthy, with SQLite v3 retaining four rooms
|
||||
including room `1`; the current Screener, LiveKit, coturn, and nginx services
|
||||
each report `NRestarts=0`. Host display-name remains source-only/not deployed.
|
||||
No selected-edge TURN enablement occurred.
|
||||
|
||||
The all-room routing and selected-edge configuration cutover used exact source
|
||||
`cf149df2411798cd632cc92a562b0a35146e0c1b` and immutable artifact
|
||||
`screener-cf149df2411798cd632cc92a562b0a35146e0c1b-20260820T173812Z-git.tar.gz`
|
||||
(893,953 bytes, SHA-256
|
||||
`80918716aefdbb958289b06b6f31551b78dbbaf7fb0f16980eb38d127e158e14`). The
|
||||
single lock-held run started at 2026-08-20T17:48:24.554Z and finished at
|
||||
2026-08-20T17:48:33.809Z (9,256.904 ms). Screener stopped at
|
||||
17:48:29.425Z, the symlink switched at 17:48:29.478Z, and local health was
|
||||
ready at 17:48:29.988Z: 562.657 ms from stop, or 509.983 ms from switch.
|
||||
The two transient local connection-refused probes were within that normal
|
||||
restart window; no browser or media benchmark was run.
|
||||
|
||||
The final release removed `PEER_ASSISTED_ROOM_IDS`, set
|
||||
`PEER_ASSISTED_MEDIA=true` for every room, and configured one selected-edge
|
||||
TURN/UDP URL with a 120-second TTL. Ordinary peer ICE remained STUN-only; the
|
||||
coturn, nginx, LiveKit, firewall, and listener baselines were preserved, while
|
||||
the application environment changed only for the selected tuple and retained
|
||||
root ownership and mode 0600. Local/public health, the built asset, three neutral
|
||||
routes, and the anonymous site-access boolean passed. SQLite v3 integrity,
|
||||
owner/mode, checksum, five-room count, and room `1` were unchanged.
|
||||
Screener, LiveKit, coturn, and nginx were active/running with
|
||||
`NRestarts=0` at the final audit. The selected-edge tuple was not exercised
|
||||
by a real TURN session and no SFU frame or quality result was claimed.
|
||||
|
||||
This release also carries the Web Host display-name path and the best-effort
|
||||
window-scoped display-audio request hint. Native H.264 opt-in source remains
|
||||
available in the repository, but no packaged native sender was deployed; VP8
|
||||
remains the Web default. The prior stale `NRestarts=31` rollback is historical
|
||||
evidence only, and the final wrapper records restart counts without asserting
|
||||
an obsolete baseline.
|
||||
|
||||
The subsequent flagship cutover used exact source
|
||||
`c27df2235ecc0be17816f642ca49028e30380a34` and immutable artifact
|
||||
`screener-c27df2235ecc0be17816f642ca49028e30380a34-20260820T190108Z-git.tar.gz`
|
||||
(912,999 bytes, SHA-256
|
||||
`1c7f06e2608414f0a4facf8577c8b49a8fefb831e20826c0e23fa0d1e85240d6`).
|
||||
The one lock-held cutover ran from 2026-08-20T19:03:10.569Z to
|
||||
19:03:11.232Z: 662 ms total, 552 ms from service stop to local health, and
|
||||
543 ms from symlink switch to local health. The environment and SQLite
|
||||
checksums were unchanged; SQLite v3 retained five rooms including room `1`
|
||||
with owner/mode `screener:screener`/0600. Local/public health, the built asset,
|
||||
root, and room route returned 200, all four services remained active/running,
|
||||
and exact `cf149df2411798cd632cc92a562b0a35146e0c1b` became the rollback release.
|
||||
No browser, TURN, SFU, or media canary was run, so this is deployment/config
|
||||
evidence only.
|
||||
|
||||
The LiveKit two-layer RID fix cutover used exact source
|
||||
`22119b907d3cf03ce8b06d6fb4596ce1a26fedd7` and immutable artifact
|
||||
`screener-22119b907d3cf03ce8b06d6fb4596ce1a26fedd7-20260820T221200Z-git.tar.gz`
|
||||
(660,626 bytes, SHA-256
|
||||
`3cbd8f6be82fa615fa2861ff1be0eba6c98f3f7d9acb73a0ba5c21a2ff4c661c`).
|
||||
The exact source passed typecheck, both builds, and 30 test files/440 tests.
|
||||
The one lock-held cutover completed at 2026-08-20T22:17:44.589825032Z;
|
||||
the lock was held for 1,695.676 ms, stop-to-health took 507.877 ms, and
|
||||
symlink-to-health took 479.483 ms. The release and its immediate
|
||||
`fd76277b05d4` rollback share zero regular-file inodes.
|
||||
|
||||
Environment, nginx, LiveKit, coturn, nftables, listener, and SQLite hashes were
|
||||
unchanged. SQLite v3 retained five rooms including room `1` with owner/mode
|
||||
`screener:screener`/0600. Local/public health, root, room `1`, the built asset,
|
||||
site-access status, and the retired-endpoint 404 passed; all four services were
|
||||
active/running with their observed `NRestarts=0`. No browser, SFU media, TURN,
|
||||
or performance canary ran. This deploys the `q,h` guard and preserves exact
|
||||
`fd76277b05d491af8840b28f3132b7ff445d3cbe` as the rollback release; the one-SFU-
|
||||
root functional evidence remains the separate localhost Chrome run.
|
||||
|
||||
The pending Host-ingress retry cutover used exact source
|
||||
`16f6eab27bdfb1c15cdbd814a35864f4f18be767` and immutable artifact
|
||||
`screener-16f6eab27bdfb1c15cdbd814a35864f4f18be767-20260820T233516Z-git.tar.gz`
|
||||
(1,027,423 bytes, SHA-256
|
||||
`74e0274ab11a162cb9dd4be1c34bb6b639e2ea76005969c30ae3a1daa656742f`).
|
||||
Fresh `npm ci` plus the exact-source gate passed typecheck, both builds, and 30
|
||||
test files/445 tests. The one lock-held cutover completed at
|
||||
2026-08-20T23:45:02.296255986Z; the lock was held for 10,237.892 ms,
|
||||
stop-to-health took 640.561 ms, and symlink-to-health took 570.188 ms. The new
|
||||
release and exact `22119b907d3c` rollback share zero regular-file inodes.
|
||||
|
||||
Environment, nginx, LiveKit, coturn, nftables, listener, and SQLite hashes were
|
||||
unchanged. SQLite v3 retained five rooms including room `1` with owner/mode
|
||||
`screener:screener`/0600. Local/public health, root, room `1`, the built asset,
|
||||
site-access status, and the retired-endpoint 404 passed; all four services were
|
||||
active/running with their observed `NRestarts=0`. Backup
|
||||
`/opt/screener/backups/16f6eab27bdf-precutover-20260820T234457Z` retains the
|
||||
prior environment, database, and exact current target. This deploys the one-use
|
||||
initial/active Host-ingress selected retry; no browser, SFU media, TURN relay,
|
||||
or performance canary ran during that cutover. The later post-deploy functional
|
||||
canary is recorded above and does not change this cutover record.
|
||||
|
||||
The Web audio, A/V diagnostics, and per-room selected-last-mile cap cutover used
|
||||
exact source `ecc794d6f01ff8e90cc07a267d221daaac8da9e1` and immutable artifact
|
||||
`screener-ecc794d6f01ff8e90cc07a267d221daaac8da9e1-20260821T022454Z-git.tar.gz`
|
||||
(951,317 bytes, SHA-256
|
||||
`22c82d0e06f34abb746ee9e652821deebeea0174643b31ec6e21e159933f5431`).
|
||||
Fresh exact-source `npm ci` plus `npm run check` passed typecheck, both builds,
|
||||
and 30 test files/452 tests. The lock-held cutover ran from
|
||||
2026-08-21T02:37:28.219189514Z to 02:37:30.865127203Z: 2,646.166 ms total,
|
||||
425.531 ms from service stop to local health, and 364.286 ms from symlink switch
|
||||
to local health. The release and exact `16f6eab27bdf` rollback share zero
|
||||
regular-file inodes.
|
||||
|
||||
Environment, nginx, LiveKit, coturn, nftables, listener, and SQLite hashes were
|
||||
unchanged. SQLite v3 retained five rooms including room `1`, owner/mode
|
||||
`screener:screener`/0600, and SHA-256
|
||||
`6762f92759258278ec13c6acb69e1f0fa6f9247d798a917b419748c3b54341b6`.
|
||||
Local/public health, root, room `1`, the exact built asset, site-access status,
|
||||
and retired-endpoint 404 passed; all four services were active/running with
|
||||
observed `NRestarts=0`. The all-room controller retained an SFU-root cap of two,
|
||||
ordinary STUN-only ICE, and one selected-edge UDP tuple at TTL 120. Source
|
||||
inspection confirmed at most one pending/answered `peer-selected` attempt per
|
||||
room while `host-sfu-ingress` remains independent. Backup
|
||||
`/opt/screener/backups/ecc794d6f01f-precutover-20260821T023728Z` preserves the
|
||||
exact `16f6eab27bdfb1c15cdbd814a35864f4f18be767` rollback; exact
|
||||
`22119b907d3cf03ce8b06d6fb4596ce1a26fedd7` remains secondary. This rollout ran
|
||||
no browser, media, SFU, TURN, or performance canary; the earlier exact-`16f6eab`
|
||||
Host-ingress functional evidence was not rerun.
|
||||
|
||||
Enabling persistence does not migrate rooms that existed only in memory. The
|
||||
deployment restart invalidates those temporary links; the first subsequently
|
||||
created persistent room receives ID `1`.
|
||||
|
||||
@@ -31,8 +31,8 @@ Last updated: 2026-08-21
|
||||
- C+B quality reparenting is edge-local and cooldown-bound; no score, timer, or global parent penalty.
|
||||
- Flagship media is UDP; HTTPS/WSS stays TLS/TCP; the old release remains rollback-only.
|
||||
- Treat settings as ceilings and degradation as unclassified. Use correlated Host A+B/Viewer C and one-variable evidence; never force AV1, infer by UA, or create a composite score.
|
||||
- Web requests window audio and offers system audio for full displays; both are browser hints. Returned tracks use the `music` hint. Native Win11 process audio stays source-only; one Viewer got 495 Opus packets.
|
||||
- Presence is control-plane-only and exposes the exact active upstream for Host diagnostics; it does not create media. Web Host names stay socket/localStorage-only; Native remains outside the capability boundary.
|
||||
- Web window/system-audio requests are browser hints; tracks use `music`. P2P/relay/SFU senders request 128,000 bit/s and SFU disables DTX; this is a ceiling, not a quality/stereo guarantee. Native Win11 process audio stays source-only; one Viewer got 495 Opus packets.
|
||||
- Presence reports exact active upstream and feeds the on-demand Host topology; it never creates media. Details label P2P/SFU and show TURN only for an actual relay. Web Host names stay socket/localStorage-only; Native remains outside the boundary.
|
||||
- Do not add scene detection, dynamic-FPS control, or forced AV1 without negotiation, encode, game, CPU/GPU, and sender evidence.
|
||||
- ADR-0002 grant/public access, the v3 room-password migration, and Web Host display names are deployed. Names/presence remain session-only without account or roster tables.
|
||||
|
||||
@@ -43,18 +43,15 @@ Last updated: 2026-08-21
|
||||
## Current Implementation
|
||||
|
||||
- The repository is one npm package using Node.js 24, React, TypeScript, Vite, native WebRTC, `ws`, Zod, Vitest, and separate coturn.
|
||||
- Production at `https://share.bonfire.icu` is exact `ecc794d6f01ff8e90cc07a267d221daaac8da9e1`; artifact 951,317 bytes, SHA-256 `22c82d0e06f34abb746ee9e652821deebeea0174643b31ec6e21e159933f5431`. Cutover took 2,646.166 ms lock/425.531 ms stop-health/364.286 ms switch-health. Rollback is exact `16f6eab27bdfb1c15cdbd814a35864f4f18be767`; `22119b907d3cf03ce8b06d6fb4596ce1a26fedd7` is secondary.
|
||||
- `main` is ahead only in non-runtime gate/export, tooling, and docs work. Windows Native stays source-only; Host-ingress retry and the per-room selected-last-mile cap are deployed.
|
||||
- The four services are active/running with observed `NRestarts=0`; local/public health are 200. SQLite v3 has five rooms including room `1`, with DB owner/mode `screener:screener`/0600.
|
||||
- Production ordinary ICE is STUN-only; all-room config is SFU roots <=2, one selected-edge UDP tuple/TTL 120, and at most one pending/answered `peer-selected` per room excluding Host ingress. The `ecc794d` rollout ran no browser/media/TURN canary; an earlier exact-`16f6eab` canary used production LiveKit/coturn without app/DB writes and proved active Host ingress only.
|
||||
- Production at `https://share.bonfire.icu` is exact `6634cb9fca8278b44d57e5fcddcbaf9f0dc9b137`; its 957,434-byte artifact SHA-256 is `89ff05dbd4d642ed8364a1e230b26b6f4e1dab5a879a0d40a14364e3a26a5cf7`. Cutover was 2,755.457 ms lock/551.381 ms stop-health/478.335 ms switch-health. Rollbacks are `ecc794d`, then `16f6eab` and `22119b9`.
|
||||
- Active SFU Viewers use LiveKit state/stats, not P2P waiting/ICE-unknown placeholders. Exact route/topology and `balanced` defaults are deployed. Windows Native stays source-only.
|
||||
- Four services are active/running at `NRestarts=0`; local/public health are 200. SQLite v3 has five rooms, SHA-256 `aef724ae52c4107be8ec8791e72f8dcaa11b0ec849fb432d022e2cfb9cfe0974`, owner/mode `screener:screener`/0600.
|
||||
- Production keeps ordinary ICE STUN-only, SFU roots <=2, selected-edge UDP TTL 120, and one pending/answered `peer-selected` attempt per room excluding Host ingress. This rollout ran no browser/media/SFU/TURN/performance canary; earlier exact-`16f6eab` evidence proves active Host ingress only.
|
||||
- Production requires the independent site-access secret through `SITE_ACCESS_PASSWORD`. Its stateless cookie authorizes creation/Host and permits code-only Viewer attempts; valid private fragment grants remain direct. Public-watch accepts site access plus code, while private code-only entry additionally requires the room password. The env, endpoint, cookie, and nginx limiter naming migrated atomically; anonymous failures stay neutral, and there are no accounts/JWT/session rows.
|
||||
- Production uses nginx, Node.js 24.19.0, coturn 4.17.2, and LiveKit 1.13.5 on UDP 7882 (TCP fallback off). Ordinary peer ICE receives no TURN; the selected-edge tuple is configured only for the current controller edge, with no credential pre-advertised to ordinary peers. Coturn retains the old authenticated-relay ports. Services are healthy with zero restarts.
|
||||
- ADR-0005 rejects `PEER_ASSISTED_ROOM_IDS`; `PEER_ASSISTED_MEDIA=true` enables every room and ordinary peers stay STUN-only. Initial or active Host ingress may consume one bound relay-only grant; ready/abort clears it and failure restores peer baseline. Stale room-ID config fails startup; `screener-v2` is the only deployed wire.
|
||||
- Chrome 151/LiveKit localhost A/B cut failure-to-active/render from 1.481/2.257 seconds to 0.200/0.320; 31 new frames and 25 ms sampling kept host edges at two. It is headless synthetic 720p30 and includes SDK/network prewarm, not public-network evidence.
|
||||
- Chrome 151 synthetic topology/quality runs kept fanout 2/1 and decoding; one relay close recovered in 5.32 seconds. Control evidence only.
|
||||
- Deployed Web uses LiveKit 2.22.0 `q,h`. Chrome 151 proves local SFU/UDP and, separately, active selected TURN/UDP Host ingress against production media services with Viewer frame progress and clean stop. Initial/peer-selected relay, BWE, and C+B remain open.
|
||||
- C+B uses three hard-bad pairs, one-use samples and guarded intent/cooldown. Deployed admission rescue moves the oldest childless zero-capacity Host leaf below an unassigned one-slot relay in one revision; no score/timer/global rebalance. Deployment passed, but no real room triggered it.
|
||||
- Web names, window/system-audio picker hints, audio `music`, interval A/V loss%, and audio codec/format/bitrate/jitter are deployed. Native WGC/MF stays source-only: 203 rendered frames, 500 Opus packets, matched PID/LUID `VideoEncode`. VP8 remains default.
|
||||
|
||||
## Provisional Quality Targets
|
||||
|
||||
|
||||
+7
-10
@@ -4,10 +4,10 @@ Last updated: 2026-08-21
|
||||
|
||||
## Phase
|
||||
|
||||
Production at `https://share.bonfire.icu` is exact `ecc794d6f01ff8e90cc07a267d221daaac8da9e1`; artifact 951,317 bytes, SHA-256 `22c82d0e06f34abb746ee9e652821deebeea0174643b31ec6e21e159933f5431`.
|
||||
Cutover: 2,646.166 ms lock/425.531 ms stop-health/364.286 ms switch-health; SQLite v3/five rooms/four active services, observed `NRestarts=0`. Rollback is exact `16f6eab`; `22119b9` remains secondary.
|
||||
Ordinary ICE is STUN-only; all-room limits are SFU roots <=2 and one `peer-selected` attempt excluding Host ingress; selected UDP TTL is 120. This rollout ran no media canary; earlier exact-`16f6eab` Host-ingress proof remains separate.
|
||||
Web window/system-audio and music hints, interval A/V loss%, and audio codec/format/bitrate/jitter are deployed. Native stays source-only; Web defaults VP8.
|
||||
Production at `https://share.bonfire.icu` is exact `6634cb9fca8278b44d57e5fcddcbaf9f0dc9b137`; artifact 957,434 bytes, SHA-256 `89ff05dbd4d642ed8364a1e230b26b6f4e1dab5a879a0d40a14364e3a26a5cf7`.
|
||||
Cutover: 2,755.457 ms lock/551.381 ms stop-health/478.335 ms switch-health. SQLite v3/five rooms has SHA-256 `aef724ae52c4107be8ec8791e72f8dcaa11b0ec849fb432d022e2cfb9cfe0974`, owner/mode `screener:screener`/0600. Four services are active/running at `NRestarts=0`; rollbacks are `ecc794d`, then `16f6eab` and `22119b9`.
|
||||
Ordinary ICE is STUN-only; limits are SFU roots <=2, one `peer-selected` attempt excluding Host ingress, and selected UDP TTL 120. This rollout ran no browser/media/SFU/TURN/performance canary; earlier exact-`16f6eab` Host-ingress proof remains separate.
|
||||
SFU Viewers use LiveKit state/stats, not P2P waiting/ICE-unknown placeholders; details label P2P/SFU and TURN only for an actual relay. Exact topology, a 128,000 bit/s audio ceiling and `balanced` defaults are deployed. The ceiling is not a quality/stereo guarantee. Native stays source-only; Web defaults VP8.
|
||||
|
||||
## Execution Principle
|
||||
|
||||
@@ -17,13 +17,11 @@ Flagship; parallel; min run/smoke/rollback; benchmark later. Active UI/config/lo
|
||||
|
||||
- Capture precedes room creation; source/quality changes and AV pause preserve peers. Recommended profiles and advanced defaults use `balanced`; clarity/fluid remain explicit. The browser chooses degradation; readback/stats report actual behavior.
|
||||
- Production access is `screener-v2`: a valid private fragment grant enters directly; every code-only Viewer must first hold site access, after which public-watch accepts the code and private rooms still require their room password. `SITE_ACCESS_PASSWORD`, `/api/site-access`, and the site-access cookie are deployed atomically; raw credentials are never stored.
|
||||
- Source UI: adjacent nickname edit, distinct site/room prompts, shared inline/`/join` room-code form; production has prior UI. Presence exposes exact upstream/topology.
|
||||
- Source UI uses adjacent nickname editing, distinct site/room prompts, and a shared inline/`/join` room-code form; production still has the prior UI. Deployed presence exposes exact active upstream/topology and remains control-plane-only.
|
||||
- Native v2 is source-only (memory rooms, 300s reclaim); it follows authenticated direct-child assignments up to two and fails unsupported SFU/selected ingress boundedly.
|
||||
- PR #44's STUN-only/SFU-UDP router and token-free fallback prewarm are process-enabled for all normal rooms: roots <=2, browser relay <=1, bounded failure. Room `1` is historical smoke; mobile/iPad viewers are leaves, healthy edges sticky, and HTTPS/WSS stays TLS/TCP.
|
||||
- After an answer, a generation-bound 15s initial-connect deadline enters ICE restart; success/replacement/disposal cancels it. It is deployed but not mobile-verified.
|
||||
- Production `q,h` is deployed; an exact-source/production-media canary proves active Host ingress without production app/DB.
|
||||
- Room `1` C+B reparenting remains uncalibrated. Deployed admission rescue promotes an unassigned one-slot relay over the oldest childless zero-capacity Host leaf, with no scores or periodic optimization.
|
||||
- Web roster, audio picker/music hints, interval A/V loss%, and audio codec/format/bitrate/jitter are deployed.
|
||||
|
||||
## Verified Evidence
|
||||
|
||||
@@ -37,12 +35,11 @@ Flagship; parallel; min run/smoke/rollback; benchmark later. Active UI/config/lo
|
||||
- Access protocol/config/HTTP/storage/SQLite/signaling focused tests pass, including commit-first teardown and v1 rollback.
|
||||
- Native wire/session tests enforce at most two authoritative children, no presence-created edge, stale-revision ignore, and one bounded unsupported-route failure per revision.
|
||||
- Production caps pending/answered `peer-selected` at one per room; Host ingress is independent. Focused admission/release/rollback/STUN-only tests pass; earlier Chrome proves active Host-ingress function only.
|
||||
- Host names, Web audio, all-room routing, Host selected ingress and AV/audio diagnostics are active. Retained hidden-tab media counters progressed; audible/mobile proof remains open.
|
||||
- Exact `ecc794d` passed typecheck, builds and 452 tests. Deploy preserved config/network/SQLite hashes; SQLite v3/five rooms, routes/assets/SiteAccess and four zero-restart services passed. Rollback is `16f6eab`; `22119b9` is secondary.
|
||||
- Exact `6634cb9` passed typecheck, both builds, hygiene and 31 test files/459 tests from fresh inputs. Deployment preserved configuration hashes; DB, local/public health, root/room/asset/SiteAccess, retired-endpoint 404 and four zero-restart services passed.
|
||||
|
||||
## Unverified Boundaries
|
||||
|
||||
- The `ecc794d` cutover ran no browser/media/TURN canary. Earlier exact-`16f6eab` proof covers active Host ingress only; initial/peer last mile, external cohorts, admission rescue, quality/resources/performance and game blur remain open.
|
||||
- The `6634cb9` cutover ran no browser/media/SFU/TURN/performance canary. Earlier `16f6eab` proof covers Host ingress only; audible quality, last mile, external cohorts, admission rescue, resources/performance and game blur remain open.
|
||||
- Mobile is Viewer-only. Its persistent audible media element keeps media/signaling active while the page lives; iOS lock-screen, reclamation and background reconnection remain device gates. AirPlay/system mirroring is local output; live WebRTC `srcObject` has no portable in-app TV-output contract.
|
||||
- Silent partitions can wait 30 to 60 seconds for heartbeat detection before the default 5-second grace; this remains unverified.
|
||||
- The former release reportedly sustained bandwidth-limited blur on a capable LAN; Host refresh recovered while Viewer refresh did not. The new deployment has not yet reproduced or cleared it.
|
||||
|
||||
Reference in new issue
Block a user