12 KiB
12 KiB
Current TODO Ledger
Last reviewed: 2026-08-24
Only items in Now are executable after their stated decision gate. A branch name, unchecked requirement, experiment, review suggestion, or deployed behavior is not a TODO by itself.
Now
- Switch screen-audio ceilings live. Keep Opus fixed and serialize 64/128/256 kbps desired profile updates across every current Host, relay, and SFU audio sender. Each endpoint uses fresh
getParameters()/setParameters()readback, ignores stale completions, retains media plus its prior applied value on failure, and applies the latest desired value to future edges. Do not add a remote applied-ack protocol or claim room-wide atomic convergence in this slice. - Switch video codec while paused. Serialize the change with route mutation, freeze exact current route/media bindings, hold new joins, and boundedly renegotiate P2P/relay plus republish SFU while paused. Preparation must not resume a share the user explicitly paused: after it settles, stop the deadline but retain the single room-serial codec owner as one bounded prepared record with no timer. The user's normal Resume first atomically revalidates those bindings in that owner, allocates the next server-monotonic proof attempt, starts the decoded-frame proof deadline, and only then enables the source. Proof request and response carry that exact attempt; Pause invalidates it, so a delayed proof from an earlier Resume cannot settle a later proof window. A binding invalidated by leave or hard route failure exits this proof set and waits for routing to rebuild after the transaction settles. Preparation failure remains paused; proof failure first restores authoritative pause and performs bounded rollback preparation, whose proof waits for the user's next Resume. Rollback proves the prior preference was reapplied plus a newly negotiated actual codec and decoded progress, not literal equality with the old actual codec. No path auto-resumes. Zero targets update only the future-edge preference. Reset
automaticwith empty codec preferences. This is a paused bounded-gap transaction; unpaused make-before-break is a later extension. - Diagnose the dated H.264/blur report. Reproduce the 2026-08-19 then-production release
769de201f7ccagainst currentmainon the same Host/browser/driver/game and one wired direct Viewer, changing one variable at a time. Implement a codec-specific repair only if codec/encoder evidence identifies it; otherwise fix the proven capture, sender, BWE, or lifecycle cause. - Diagnose desktop Host background/minimized performance. On the same machine, dynamic scene, direct Viewer, browser, and fresh share, compare foreground, occluded, minimized, and hidden states while separately verifying actual negotiated VP8/H.264. Correlate capture settings/FPS, frames captured/encoded/sent/decoded, bitrate,
qualityLimitationReason, encode time, browser/game CPU and GPU, and the existing local-preview pause boundary. Treat browser scheduling/throttling and codec effects as hypotheses until measured. Do not spoof page activity, add keepalive timers, or misuse Wake Lock; if current Chrome/Edge cannot preserve the accepted Host behavior through standard Web APIs, record that capability boundary before considering the packaged/native Host. - Remove the unused parent-edge quality-proof surface. Delete the client reporter, protocol message, server dispatch/ack flag, benchmark sender, and tests whose only purpose is the unconsumed
parent-edge-quality-evidencemessage. Keep the existing exact Viewer evidence generation/session gate used by diagnostics. Do not replace the deleted magic packet/loss thresholds with another score, probe, blacklist, or route input. - Make Viewer connection progress, failure recovery, and route timing explicit. Derive one stable stage from existing access, Host presence, route, peer/SFU, media, autoplay, recovery, and bounded-failure state. Keep the overlay until a composited current-generation frame, show
Playonly for actual autoplay rejection, preserve a still-valid old frame during recovery, and expose retry only through the bounded controller. Use one Chinese user-facing vocabulary and typed failures for server restart/room loss, Host stop, Host signaling loss with healthy media, Host crash/offline, route exhaustion, SFU admission, autoplay, and stale-client refresh without exposing private topology identifiers. A failed mobile page must retain privacy-safe stage/revision/code buckets even with zero connection metrics. When the authenticated Host downloads diagnostics, request one current route snapshot containing only each current child's latest demand, queue wait, candidate start, first decoded frame, final route, and closed outcome bucket; do not continuously push it or retain an event history. Use a 20-Viewer burst to report sample count, raw sorted durations, and nearest-rank p50/p95/max before changing the single room-serial operation or its total deadline. - Clarify malformed and unusable room entry without enumeration. Reject non-four-digit input locally with a direct format message. For a well-formed code that cannot be admitted, stop automatically implying that a password is required; show one
ROOM_ACCESS_DENIEDresult covering an unknown/expired room, disabled code entry, wrong/absent password, room full, or bounded admission failure. Offer an optional password retry and tell the Viewer to use the invitation link supplied by the Host; do not imply that the server can provide one. Keepopenrooms direct and do not expose room existence or code-entry policy through distinct errors. - Refine quality selection. Keep exactly three recommended profiles:
1080p60,1080p30, and720p30. Change the default recommended profile to the middle1080p30option. Add480p(854x480) only to the advanced resolution selector; advanced frame rate and bitrate remain independently selected, and no480precommended profile or preset ID is added. Update capture constraints, current/future peer/relay/SFU sender settings, the current-page initial desired state, readback, and tests together; do not persist quality selection or add a label that leaves old sender parameters active. - Finish the room-code entry UI as one responsive control. Preserve the invitation-link controls that are already direct, but redesign the code-only policy/password area to match the compact work surface instead of a nested form panel. The fixed action row contains only
Start sharing, its divider, andJoin room; disclosure is a following sibling and cannot participate in action-row sizing. Prove stable button rectangles, desktop/mobile wrapping, focus, password and disabled states, and no horizontal overflow before integrating the retained UI candidate.
Accepted Later Roadmap
These items are real product work, ordered after the current release boundary; they are not permission to resume an old branch wholesale.
- Mobile Viewer lifecycle. Run Android Chrome and iOS Safari device matrices for autoplay gesture, foreground/background audio, foreground video recovery, lock/page reclamation, rotation, Wi-Fi/cellular migration, and an assigned relay's outbound-media survival or controller failover across those transitions. Preserve the same media element and current reconnect path; do not promise background video composition, background relay continuity, or unsupported lock-screen behavior.
- Real network acceptance. Measure standard ICE/STUN, IPv4/IPv6, independent STUN destinations, SFU ingress/subscription, and bounded failure across representative NATs and mobile networks. Include an all-UDP-blocked case to measure the current explicit failure boundary. Browser pages do not predict ports, classify NATs, probe TCP reachability, or synthesize remote ICE candidates; raw-IP ranking and a room-wide quality score remain out of scope. Parent choice uses the accepted route controller, while current-path local stats and exact Viewer quality evidence remain diagnostic only.
- Platform output only when real. Revisit AirPlay/Cast only when a target browser and physical receiver prove the live
MediaStreamcontract. System mirroring remains external; no placeholder button, custom receiver, or server transcode is scheduled. - Public-server one-click deployment package. After every current functional and real-network item is settled, package the exact application, STUN/SFU, reverse proxy, secrets, health checks and rollback flow for a user-owned public server. Require real domain/TLS/firewall/capacity inputs and never ship credentials or call a partial deployment ready.
- Fully local one-click Host-server package. Package Windows/macOS/Linux Host capture, the exact application server and local state without requiring source, Node or any external Screener/STUN/SFU/tunnel/relay service. Preserve usable direct P2P and use the completed NAT/network evidence to maximize reachability, while reporting public-origin, gateway, NAT and firewall limits truthfully; loopback/LAN success is not universal Internet success.
- Native Host capture backend. At lowest priority, productize a proven Windows native capture path before expanding capture/audio backends to macOS and Linux. Its capture, hardware encode, audio, identity and lifecycle evidence becomes an input to later packages; a source checkout, helper executable, or evaluation ZIP is not a distributable product.
- Native shared encode, Windows first. At lowest priority, prove one hardware encoder output can serve two independent Viewer transports and the Host-SFU publication while each connection retains its own RTP/RTCP, pacing, encryption, feedback, and upload accounting. Productize only after actual access-unit identity, Viewer2/FIFO, heterogeneous feedback, game-resource, browser/hardware, A/V, packaging, and licensing gates pass. Web Host/relay remains standard per-
RTCPeerConnectionencoding because no portable shared-encoder contract exists. - Repository simplification audit. After the current route and room checkpoints and their scoped implementation work settle, inventory components, configuration, migrations, gates, timers, compatibility paths, and tests using the maintenance review. Begin read-only: identify the user behavior each mechanism preserves, quantify the impact of removing it, and compare that value with its whole-system cost. Any accepted feature tradeoff updates its owning contract before complete unused surfaces are removed. This later audit must not become a broad refactor or block current product work.
Product Decisions Needed
| Deployed or retained item | Decision |
|---|---|
| #169 connection self-check | Keep, revise, or remove the user-facing pre-share probe. Do not extend it automatically. |
| #181 selected-pair response counter | Keep as local observation or remove; it has no route authority. |
| #182 signaling watchdog | Confirm Host and mobile/background session semantics before calling it complete. |
These decisions are not permission to continue old branches, and current deployment remains unchanged until a scoped decision is made.
Evidence And Later Work
- Open PR #192 measures synthetic flash/tone timing; it is not an A/V correction feature.
- The Native PR stack #16/#18/#22/#23/#25/#28 and related fanout branches are one research program, not six product TODOs.
- Cap3, resource, route-recovery, Viewer-MBB, signaling-blackhole, Host-generation, SFU-shaping, NAT, mobile, and endurance artifacts remain bounded evidence. Merge or retain them only when a current decision consumes them. Raw-IP ranking, port prediction, NAT classification, AirPlay/Cast receivers, and mobile background guarantees are not implied by the current implementation batch.
- Real heterogeneous-network SFU, mobile lifecycle, audio/A-V device, and endurance/resource acceptance are scheduled at the relevant release boundary.
Candidate Handling
- Preserve the dirty
fix/configurable-relay-capworktree only for user-change audit. Currentmainalready implements the accepted uniform1/2/3endpoint cap; do not merge the worktree's old route implementation or treat it as unfinished cap work. - Preserve dirty or unique worktrees and open stacked branches until reviewed. Never resolve their conflicts by importing old truth into
main. - Sample worktree, branch, PR, artifact, and reparse-point state immediately before cleanup; do not maintain a permanent workspace inventory here.