Changelog
User-visible updates to Remote Screen. Newest release notes appear first.
2026-06-07 — Worker v68: Merkle pipeline off on patch path
Worker WORKER_VERSION 68
-
Worker: Classic todo edits no longer run Merkle rebuild/persist on every patch; Control v2 / ws-merkle paused until re-enabled.
2026-05-17 — Display v67: signed-out banner safe area
Display PHONE_UI_VERSION 67 · SW cache v299
-
Display: “Sign in again” banner clears the notch/status bar on iPhone (safe-area padding + scroll offset).
2026-05-17 — Control v245 / Display v66: signed-out WebSocket UX
Control LAPTOP_UI_VERSION 245 · Display PHONE_UI_VERSION 66 · SW cache v298
-
Control / Display: Expired session no longer looks like endless grey reconnect — after failed connect,
/api/me on the 1st and 3rd try; signed out shows a banner and stops retrying; live sessions still reconnect quietly.
- Login:
?return= sends you back to the screen you opened after sign-in (safe paths only).
2026-05-12 — Control v244 / Worker v67: Merkle socket hints (optimistic hydrate)
Control LAPTOP_UI_VERSION 244 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 67 · SW cache v297
-
Worker: WS attachments may include a compact
merkleHint so the DO can skip an extra merkle/head read when rehydrating Merkle after wake; telemetry on optimistic hit vs hint repair.
2026-05-12 — Control v244 / Worker v66: welcome patchMode + recovery ring inspect
Control LAPTOP_UI_VERSION 244 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 66 · SW cache v297
-
Protocol/API:
merkle_welcome / outline / delta summaries add patchMode: "rebuilt" when Merkle source is rebuilt; storage-inspect reports merkle/recovery/v1 size and per-role transition counts; analytics on ring storage clip.
2026-05-12 — Control v244 / Worker v65: durable Merkle recovery ring
Control LAPTOP_UI_VERSION 244 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 65 · SW cache v297
-
Protocol/API: Per-role Merkle recovery ring is stored in DO KV (
merkle/recovery/v1), loaded after wake, clipped to fit storage.put limits — pull recovery survives hibernation when the blob was persisted.
2026-05-12 — Control v244 / Worker v64: merkle_push source + patchMode
Control LAPTOP_UI_VERSION 244 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 64 · SW cache v297
-
Protocol/API:
merkle_push.merkle includes honest source and patchMode (incremental vs rebuilt); cold DO RAM rehydrates Merkle from durable storage before the patch so typing can stay incremental after sleep.
2026-05-12 — Control v244 / Worker v63: no todoWire on merkle_push
Control LAPTOP_UI_VERSION 244 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 63 · SW cache v297
-
Protocol/API: Full
todoWire only on welcome/outline — merkle_push stays lite (merkle + optional microchange).
2026-05-12 — Control v243 / Worker v62: untyped-change recovery label
Control LAPTOP_UI_VERSION 243 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 62 · SW cache v296
-
Control (v2):
merkle_push:untyped_change replaces the old “structural / large touch” wording — means no microchange type matched, not necessarily a huge edit.
2026-05-12 — Control v242 / Worker v62: Merkle recovery callsite tags
Control LAPTOP_UI_VERSION 242 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 62 · SW cache v295
-
Control (v2):
[merkle-v2-recovery][callsite] on warn paths; recovery requestId prefixes with callsite for correlation.
2026-05-12 — Control v241 / Worker v62: recovery empty-bundle fallback
Control LAPTOP_UI_VERSION 241 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 62 · SW cache v294
-
Control (v2):
merkle_recovery_response with no lineage/hints triggers outline pull and [merkle-v2-recovery] warn.
2026-05-12 — Control v240 / Worker v62: Merkle microchange-first push + pull recovery
Control LAPTOP_UI_VERSION 240 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 62 · SW cache v293
-
Protocol/API:
merkle_push drops lineage/hints; merkle_recovery_request → merkle_recovery_response (with merkle summary) + optional merkle_recovery_ack use a per-role DO ring buffer for catch-up bundles.
-
Control (v2):
[merkle-v2-recovery] console.warn when pulling recovery or on unknown_anchor (then outline fallback).
2026-05-12 — Control v239: v2 Merkle console trace for structural edits
Control LAPTOP_UI_VERSION 239 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 61 · SW cache v292
-
Control (v2): DevTools
console.log/warn for sparse-hint merge, lineage-only, delta/outline responses — indent/outdent (no microchange) no longer silent next to title/done verify lines.
2026-05-12 — Control v238: v2 hint merge hardening (add subtask)
Control LAPTOP_UI_VERSION 238 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 61 · SW cache v291
-
Control (v2): Ignore malformed
merkle_push sparse hints, safe sort, and safer task-tree patching so structural edits (e.g. new subtask) do not throw in the console.
2026-05-11 — Control v237 / Worker v61: Merkle push todoWire + verify warnings
Control LAPTOP_UI_VERSION 237 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 61 · SW cache v290
-
Protocol/API:
merkle_push can carry todoWire with microchange (subprotocol clients, under size cap) so the mirror stays current.
-
Control (v2): Clearer
console.warn paths when microchange verify cannot run or disagrees with the server snapshot.
2026-05-11 — Worker v60: Merkle WS subprotocol echo
Control LAPTOP_UI_VERSION 236 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 60 · SW cache v288
-
Fix:
ws-merkle 101 response includes Sec-WebSocket-Protocol when merkle.v1+todowire was requested so the browser completes the handshake.
2026-05-11 — Control v236 / Worker v59: merkle microchange (title/done)
Control LAPTOP_UI_VERSION 236 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 59 · SW cache v287
-
Protocol/API: Optional
merkle_push.microchange (task_title_done_v1) when only task titles/checkboxes changed; subprotocol merkle.v1+todowire adds optional todoWire on welcome/outline for hash verification.
-
Control (v2): Uses that subprotocol, applies microchange to the tree, and checks the root via
merkle-client.mjs.
2026-05-11 — Control v235 / Worker v58: lineage + sparse hints
Control LAPTOP_UI_VERSION 235 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 58 · SW cache v286
-
Protocol/API:
merkle_push carries lineage (hashes along the recompute chain) and optional hints; section/root hints are omitted when that structure did not change, so typing stays lean.
-
Control (v2): Merges lineage hashes, applies sparse hints, skips full outline when only rollups moved, outline fallback only when hint merge fails.
2026-05-11 — Control v234 / Worker v57: tightbeam hints + v2 merge
Control LAPTOP_UI_VERSION 234 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 57 · SW cache v285
-
Protocol/API: Each
merkle_push touched entry includes a compact hint (task title/done/children, section title/roots, or root section order) so v2 can patch its tree without asking for the full outline on every edit.
-
Control (v2): Local merge from hints + hash map for deltas; outline_request only as a fallback when merge can’t complete. Root-only pushes (huge touch sets) go through merkle_delta_request first.
2026-05-11 — Control v233 / Worker v56: Merkle tightbeam + outline pull
Control LAPTOP_UI_VERSION 233 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 56 · SW cache v284
-
Protocol/API:
merkle_push is now a tightbeam (root summary plus optional bounded touched id/hash entries on incremental paths). Full document outlines move to an explicit client request: merkle_outline_request → merkle_outline_response (welcome and delta responses still include outlines where needed).
-
Control (v2):
/control-v2.html applies tightbeam updates immediately and debounces outline fetches so burst edits coalesce into fewer tree pulls.
2026-05-11 — Worker v55: Merkle WS ping/pong removed
Control LAPTOP_UI_VERSION 232 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 55 · SW cache v283
-
Protocol/API: The Merkle WebSocket no longer handles
merkle_ping / merkle_pong — rely on the normal WebSocket ping/pong layer instead.
2026-05-11 — Worker v54: Control v2 document tree
Control LAPTOP_UI_VERSION 232 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 54 · SW cache v282
-
Protocol/API: Merkle WebSocket payloads now carry a bounded outline (sections and nested task titles) alongside the root hash summary, so v2 clients can render the board without dumping raw Merkle maps.
-
Control (v2):
/control-v2.html draws that outline as an indented tree (done tasks struck through); very large boards show a truncation hint.
2026-05-11 — Worker v53: Merkle WebSocket + v2 shell
Control LAPTOP_UI_VERSION 232 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 53 · SW cache v281
-
Protocol/API: New session WebSocket at
/api/screens/:id/ws-merkle (query role=laptop|phone|admin) for Merkle-only frames; uses the same Durable Object hibernation WebSocket API as the main screen socket. After successful doc writes, connected Merkle clients receive a compact merkle_push with the updated root hash.
-
Control (v2): New page
/control-v2.html shows the current Merkle root (read-only). The dashboard lists a v2 shell link per screen.
2026-05-11 — Worker v52: Merkle delta probe
Control LAPTOP_UI_VERSION 232 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 52 · SW cache v280
-
Protocol/API: Signed admin can now ask for a bounded Merkle delta from a known root/hash map, or receive an explicit full-resync response when the base is unknown or too large to answer cheaply.
2026-05-11 — Worker v51: Durable Merkle storage
Control LAPTOP_UI_VERSION 232 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 51 · SW cache v279
-
Protocol/API: Merkle state now survives Durable Object hibernation via a small head record and bounded chunked hash-map storage, with rebuild-from-document fallback when stored Merkle data is incomplete or corrupt.
2026-05-11 — Worker v50: Merkle root hash surface
Control LAPTOP_UI_VERSION 232 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 50 · SW cache v278
-
Protocol/API: Signed admin snapshot and storage inspection now report a compact Merkle root hash summary so agents can compare document state without reading the full tree.
2026-05-11 — Control v232: Offline section borders
Control LAPTOP_UI_VERSION 232 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 49 · SW cache v277
-
Control: When the socket is disconnected, section cards use the same 1px solid black (
#000) border treatment as Display, so the offline gray background still reads clearly without changing border width.
2026-05-11 — Display v65: Offline section borders
Control LAPTOP_UI_VERSION 231 · Display PHONE_UI_VERSION 65 · Worker WORKER_VERSION 49 · SW cache v276
-
Display: When the socket is disconnected, section cards keep a 1px border but switch to solid black (
#000) so the chrome reads clearly against the gray offline page background without changing border width.
2026-05-11 — Worker v49: Incremental Merkle updates
Control LAPTOP_UI_VERSION 231 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 49 · SW cache v275
-
Protocol/API: The internal Merkle document projection now updates incrementally on warm normal document writes, avoiding a full subtree hash rebuild for routine task edits. Full rebuild remains reserved for cold state and recovery restore.
2026-05-11 — Worker v48: Merkle document hook
Control LAPTOP_UI_VERSION 231 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 48 · SW cache v274
-
Protocol/API: Remote Screen now derives an internal Merkle document projection after successful document writes. This does not change Control or Display sync yet; it prepares the Worker for a future root-hash / delta read surface.
2026-05-11 — Control v231: Ghost row only when it matters
Control LAPTOP_UI_VERSION 231 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v273
-
Control: The extra “New task…” row at the very bottom of a busy board is gone. You still get it on an empty screen, when you use Add task… in an empty section, or when you arrow down from the last task to start the next one in that section’s flow.
2026-05-11 — Control v230: Visible-nav cache module split
Control LAPTOP_UI_VERSION 230 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v272
-
Control (maintainer): The frozen visible task order cache and incremental nav sync after patches now live in
/control-visible-nav.mjs (loaded next to laptop-app.mjs); behavior unchanged for operators.
2026-05-11 — Control v229: Remove section — incremental DOM
Control LAPTOP_UI_VERSION 229 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v271
-
Control: Removing an empty section now removes that section’s DOM shell and resyncs remaining section grids and headers instead of rebuilding the whole tree (full
render() only when the doc is empty or resync cannot match the model).
2026-05-11 — Control v228: Drag-drop — incremental DOM for plain moves
Control LAPTOP_UI_VERSION 228 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v270
-
Control: Dropping tasks after a drag now updates row DOM in place when the operation is only
move patches — no full-tree rebuild. Drops that split/merge sections or use section_reanchor still use a full render.
2026-05-11 — Control v227: New section (Ctrl+S) — incremental DOM
Control LAPTOP_UI_VERSION 227 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v269
-
Control: Adding a section with Ctrl+S now mounts one new section shell and the ghost row in place instead of rebuilding the entire todo tree — much snappier on large boards.
2026-05-11 — Control v226: Remove section — header sync after incremental add
Control LAPTOP_UI_VERSION 226 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v268
-
Control: After creating a task with an incremental DOM update (new row without a full tree render), the section header is rebuilt so Remove section hides as soon as the section is no longer removable — fixing a stale header left over from when the section was empty.
2026-05-11 — Control v225: Section drag — incremental DOM (no full render)
Control LAPTOP_UI_VERSION 225 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v267
-
Control: Reordering sections by dragging the shell now reorders existing
.todo-section nodes and resyncs each section grid when possible, instead of always calling deprecatedFullTreeRender — faster on large boards; full tree only on hard mismatch.
2026-05-11 — Control v224: tryIncrement bail — always warm full rebuild from doc
Control LAPTOP_UI_VERSION 224 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v266
-
Control: After a todo patch, if the fast incremental nav-cache path bails but the cache was already warm, Control now recomputes the visible-order list from the current
doc in one pass instead of dropping the cache and logging a generic bail warning — including mixed batches (e.g. new section + add). Optional globalThis.__CONTROL_NAV_REBUILD_LOG for console.info when the list actually changes.
2026-05-11 — Control v223: Structural section patches — warm nav cache rebuild
Control LAPTOP_UI_VERSION 223 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v265
-
Control: Pure section structure batches (
section_split / section_unsplit / section_reanchor / section_set_title + collapsed-header extras_set only) rebuild the visible-order cache in one walk instead of clearing it and logging a bail warning. Mixed ops still use the old path.
2026-05-11 — Control v222: Show/Hide archived — incremental visible-nav cache
Control LAPTOP_UI_VERSION 222 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v264
-
Control: Toggling Show archived / Hide archived often updates the frozen visible-order cache by replacing one section’s slice instead of clearing the whole cache (warm path +
navSlicesMetaVerify); cold cache or mismatch still full-invalidates.
2026-05-11 — Control v221: Fix duplicate variable (v220 load error)
Control LAPTOP_UI_VERSION 221 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v263
-
Control: Removes accidental duplicate
lastTodosSnapshotWireFromServer declaration that broke Control load in v220.
2026-05-11 — Control v220: Skip duplicate todos snapshot on reconnect
Control LAPTOP_UI_VERSION 220 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v262
-
Control: If the websocket sends the same todos JSON bytes as the last applied snapshot (common after reconnect when nothing changed on the server), Control does not replace
doc, clear the visible-nav cache, or run a full render().
2026-05-11 — Control v219: Visible nav — console warnings on expensive paths
Control LAPTOP_UI_VERSION 219 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v261
-
Control: Browser console
[remote-screen visible-nav] warnings when incremental visible-nav cache bails on a warm cache, or when Show/Hide archived / new-root rollback forces a full cache clear — full websocket hydrates stay quiet. Helps notice O(screen) fallbacks in prod.
-
Docs:
HANDOFF.md / CONTROL_VISIBLE_NAV_ORDER_STATUS.md / CONTROL_VISIBLE_NAV_ORDER_INDEX.md — operator stance on silent fallbacks and the Show/Hide archived rough edge.
2026-05-11 — Control v218: Visible nav cache — auto-kind sync, stub slice, ghost reuse
Control LAPTOP_UI_VERSION 218 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v260
-
Control: Warm nav cache sync on auto-kind patch paths; incremental whitelist extended for section title, collapsed-section extras, and section-stub facets; ghost arrow order reuses the frozen visible list when possible (
CONTROL_VISIBLE_NAV_ORDER_STATUS.md).
-
Handoff: Agent
npm test — use bash -lc + source ~/.nvm/nvm.sh when npm is missing from PATH (same as deploy).
2026-05-10 — Control v217: Visible nav cache — remove + multi add/move
Control LAPTOP_UI_VERSION 217 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v259
-
Control: Nav cache slice merge supports multi-
add/multi-move, remove combined with other incremental ops when deletes hit visible rows, and safer facet_remove handling (CONTROL_VISIBLE_NAV_ORDER_INDEX.md).
2026-05-10 — Control v216: Visible nav cache — section slice merge
Control LAPTOP_UI_VERSION 216 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v258
-
Control: Warm nav cache can refresh via per-section slice replacement for single
add/move, _archived facet puts, and facet_remove of archive rows (see CONTROL_VISIBLE_NAV_ORDER_INDEX.md).
2026-05-10 — Control v215: Visible nav cache — incremental applyTodoPatch
Control LAPTOP_UI_VERSION 215 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v257
-
Control: Warm
controlVisibleTaskNavOrder() cache is often updated in place for common applyTodoPatch batches (archived hides, removes, toggles, titles, links) instead of forcing a full rebuild — see CONTROL_VISIBLE_NAV_ORDER_INDEX.md.
2026-05-10 — Control v214: Visible nav order snapshot cache
Control LAPTOP_UI_VERSION 214 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v256
-
Control:
controlVisibleTaskNavOrder() reuses a frozen list until the doc or archived-visibility toggles invalidate it (CONTROL_VISIBLE_NAV_ORDER_INDEX.md).
2026-05-10 — Control v213: Archive completed — one visible-nav walk
Control LAPTOP_UI_VERSION 213 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v255
-
Control: Incremental Archive completed no longer runs a second full
controlVisibleTaskNavOrder() pass to pick focus (same neighbor behavior; doc CONTROL_VISIBLE_NAV_ORDER_INDEX.md).
2026-05-10 — Control v212: Archive profiling hook (dev)
Control LAPTOP_UI_VERSION 212 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v254
-
Control: Optional Archive completed timing slices for operator benchmarks (
__CONTROL_ARCHIVE_PROFILE) — no change to default Control behavior when disabled.
2026-05-10 — Control v211: Archive completed — defer Related panel
Control LAPTOP_UI_VERSION 211 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v253
-
Control: Archive completed refreshes the Related panel and moves focus on the next animation frame so row removal can paint first.
2026-05-10 — Control v210: Archive completed — neighbor focus (fix scroll to top)
Control LAPTOP_UI_VERSION 210 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v252
-
Control: After Archive completed, focus moves to the next or previous still-visible task using order captured before archiving — not the first task in the doc — so the page no longer jumps to the top when your cursor was on an archived row.
2026-05-10 — Control v209: Archive completed — blur before strip
Control LAPTOP_UI_VERSION 209 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v251
-
Control: When Archive completed removes hidden rows, if your cursor was in one of those rows the title input is blurred first so the page does not scroll-jump to the top.
2026-05-10 — Control v208: console warnings for deprecated full-tree renders
Control LAPTOP_UI_VERSION 208 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v250
-
Control: Narrow-target flows that still use a full-tree
render() run through deprecatedFullTreeRender — each call logs a console.warn (with the callsite tag) before painting, to highlight incremental-DOM migration candidates in DevTools.
2026-05-10 — Control v207: Archive completed incremental DOM
Control LAPTOP_UI_VERSION 207 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v249
-
Control: Archive completed tries to update the section surgically (strip archived rows, refresh header buttons, focus) instead of running a full-tree
render() every time.
2026-05-10 — Control v206: require render() callsite (abort if missing)
Control LAPTOP_UI_VERSION 206 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v248
-
Control: Full-tree
render() no longer runs when the callsite string is missing or blank — same hard requirement style as Display (no silent full rebuild after console.error).
2026-05-10 — Control v205 / Display v64: enforced render() callsite strings
Control LAPTOP_UI_VERSION 205 · Display PHONE_UI_VERSION 64 · Worker WORKER_VERSION 47 · SW cache v247
-
Control · Display: Every full-tree
render() must include a non-empty callsite label (second argument on Control, first on Display). npm test runs verify:render-callsites; bad calls log console.error, and Display avoids repainting when the callsite is missing.
2026-05-10 — Control v204: remove + Empty section button (Ctrl+S unchanged)
Control LAPTOP_UI_VERSION 204 · Display PHONE_UI_VERSION 63 · Worker WORKER_VERSION 47 · SW cache v246
-
Control: Section headers no longer show the + Empty section pill. Ctrl+S (the Control key, not ⌘ on macOS) still adds an empty section below the current section when a task row has focus — same behavior as the removed control.
2026-05-10 — Control v203 / Display v63: Display section collapse
Control LAPTOP_UI_VERSION 203 · Display PHONE_UI_VERSION 63 · Worker WORKER_VERSION 47 · SW cache v245
-
Protocol: Display may send
extras_set for controlSectionHeadCollapsed only — same persisted collapse list as Control.
-
Display: Section headers get ▶ / ▼ toggles; collapsed sections hide tasks and sync with Control through the shared document.
2026-05-10 — Control v202 / Display v62: Archive completed at facet cap
Control LAPTOP_UI_VERSION 202 · Display PHONE_UI_VERSION 62 · Worker WORKER_VERSION 46 · SW cache v244
-
Todo doc: facet assignment ceiling raised (
MAX_FACETS 500 → 2048). Archive completed reuses or uses stable arv1_<taskId> ids for _archived so the action does not silently fail when the assignment table was already full.
2026-05-10 — Control v201: admin runner archive + reload hooks
Control LAPTOP_UI_VERSION 201 · Display PHONE_UI_VERSION 61 · Worker WORKER_VERSION 46 · SW cache v243
-
Control · admin runner: Runner scripts may call
archiveCompletedForSectionById("ssec_…") (same behavior as Archive completed) and scheduleReloadAfterRunner("reason") so the tab reloads after admin_runner_result returns.
2026-05-10 — Control v200: Archive completed works again
Control LAPTOP_UI_VERSION 200 · Display PHONE_UI_VERSION 61 · Worker WORKER_VERSION 46 · SW cache v242
-
Control: Archive completed always refreshes the UI after archiving — the incremental DOM-only path could leave the screen unchanged when its checks failed.
2026-05-10 — Control v199: section header buttons unified
Control LAPTOP_UI_VERSION 199 · Display PHONE_UI_VERSION 61 · Worker WORKER_VERSION 46 · SW cache v241
-
Control: Show archived, Archive completed, and + Empty section share the same compact pill styling (border, padding, hover).
2026-05-10 — Display v61: status bar edge-to-edge gradient (viewport-fit=cover)
Control LAPTOP_UI_VERSION 198 · Display PHONE_UI_VERSION 61 · Worker WORKER_VERSION 46 · SW cache v240
-
Display (iPhone home-screen app):
viewport-fit=cover, the same gradient on html and body, and black-translucent status bar so the background continues under the clock/battery strip instead of a solid white band. Light theme-color and manifest colors match the page.
2026-05-10 — Control v197 / Display v60: Display gradient + lighter section cards
Control LAPTOP_UI_VERSION 197 · Display PHONE_UI_VERSION 60 · Worker WORKER_VERSION 46 · SW cache v239
-
Display: Page background matches Control — same multi-layer radial + diagonal gradient with
background-attachment: fixed.
-
Control & Display: Section shells use a more transparent white fill (alpha 0.44) over the gradient.
2026-05-10 — Control v196 / Display v59: semi-transparent section panels
Control LAPTOP_UI_VERSION 196 · Display PHONE_UI_VERSION 59 · Worker WORKER_VERSION 46 · SW cache v238
-
Control & Display: Todo section cards use a softly translucent white fill so the layered background shows through slightly, with a tinted border for a clean edge.
2026-05-10 — Control v195: Archive completed without full render
Control LAPTOP_UI_VERSION 195 · Display PHONE_UI_VERSION 58 · Worker WORKER_VERSION 46 · SW cache v237
-
Control: Archive completed removes hidden done rows from the DOM surgically (when you are not viewing Show archived), syncs header buttons and focus — instead of nuking
#root with a full render(). Another Control tab merging the same archive batch over the websocket uses the same path.
2026-05-10 — Display v58: surgical title patches + patch telemetry
Control LAPTOP_UI_VERSION 194 · Display PHONE_UI_VERSION 58 · Worker WORKER_VERSION 46 · SW cache v236
-
Display:
todo_patch messages that contain only task setTitle and section_set_title ops update the visible title nodes directly instead of rebuilding the entire list DOM — nicer when Control continuously edits titles while you watch Display. Anything else still triggers a normal full render cycle.
-
Debugging:
window.__REMOTE_SCREEN_DISPLAY_PATCH_LAST reports the latest patch handling (surgicalTitles vs full) beside the existing __REMOTE_SCREEN_DISPLAY_RENDER_CALLS render log ring.
2026-05-10 — Control v194 / Display v57: section_split stable id on wire
Control LAPTOP_UI_VERSION 194 · Display PHONE_UI_VERSION 57 · Worker WORKER_VERSION 46 · SW cache v235
-
Protocol:
section_split can include a client-chosen stable sectionId (ssec_…) so the Durable Object and Control assign the same section key. Fixes + Empty section → task → rename (without refresh) where the UI sent section_set_title for one ssec_ while the server kept titles under a different id until reload.
-
Control: New splits from empty section, detach, Shift+Enter marker moves, and section reorder / drag reconciliation include that id.
2026-05-10 — Control v193: section rename commit uses live doc title
Control LAPTOP_UI_VERSION 193 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 45 · SW cache v234
-
Control: Finishing a section title edit (Enter) now diffs against the current
doc title for that section id, not the snapshot from when the editor opened — avoids skipping sendPatch after mergeSectionTitleInputIntoDoc already merged the new title during render(), which left the DO / Display stuck on New section.
2026-05-10 — Control v192: fix incremental insert-above after empty stub
Control LAPTOP_UI_VERSION 192 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 45 · SW cache v233
-
Control: Add task above on the first visible row after an empty stub (or first child under a stub-only parent) was inserting the row at the bottom of the section until reload — DOM anchor resolution for surgical adds is fixed.
2026-05-10 — Control v191: default soft gradient background
Control LAPTOP_UI_VERSION 191 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 45 · SW cache v232
-
Control:
laptop.html default body uses the same subtle multi-layer gradient (indigo / rose / teal over cool white) as the recent runner tweak — fixed attachment and full-viewport min height.
2026-05-10 — Control v190: Enter at line start inserts task above
Control LAPTOP_UI_VERSION 190 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 45 · SW cache v231
-
Control: On a non-empty title, Enter with the caret collapsed at the beginning adds a sibling above (same as Shift+Enter) and focuses it. Caret elsewhere still uses the usual first child / sibling below behavior.
2026-05-10 — Worker v45: Display WebSocket blockade off after restore
Control LAPTOP_UI_VERSION 189 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 45 · SW cache v230
-
Worker / DO:
DISPLAY_WEBSOCKET_HARD_REJECT in src/display-ws-recovery-gate.ts is false — phone (Display) sockets can connect again. GET …/recovery-status returns phoneWsBlocked: false.
2026-05-10 — Control v189: DO storage pie — drop Σ from actionLog slice
Control LAPTOP_UI_VERSION 189 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 44 · SW cache v230
-
Control: Footprint pie legend label is actionLog (no summation glyph); slices already imply categorized totals.
2026-05-10 — Control v188: DO storage — remove hypothetical merge footnote
Control LAPTOP_UI_VERSION 188 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 44 · SW cache v229
-
Control: The DO storage panel no longer shows the hypothetical merge over DO cap line — it was clutter for the sidebar; use
admin-cli storage-inspect when you need that probe.
2026-05-10 — Control v187: fix hypothetical merge copy (DO storage)
Control LAPTOP_UI_VERSION 187 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 44 · SW cache v228
-
Control: The DO storage footnote for hypothetical merge over cap now describes the real probe (staging + tail as one JSON array / UTF‑8 estimate), not the entire action log as one blob, and no longer hand-waves with “OK”.
2026-05-10 — Control v186: DO storage panel — lean footnotes under action log
Control LAPTOP_UI_VERSION 186 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 44 · SW cache v227
-
Control: The DO storage overview no longer repeats stats below Action log layers (definition list, document outline dump, sample sealed keys). A single muted line keeps approximate activity entry count and max seq; the hypothetical merge-over-cap note stays when the API flags it.
2026-05-10 — Control v185: DO storage lastFrame compact shard rows
Control LAPTOP_UI_VERSION 185 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 44 · SW cache v226
-
Control: In the DO storage panel, lastFrame v2 rows for multi-shard docs use the same compact row height for Shard N and Tail (byte proportions are still shown in the labels). Single-shard documents keep the taller proportional slab.
2026-05-10 — Control v184: DO storage lastFrame tail-on-top + merged total
Control LAPTOP_UI_VERSION 184 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 44 · SW cache v225
-
Control: In the DO storage panel, lastFrame v2 shard “pancakes” put Tail first (top), matching Action log layers. When there are multiple shards, a muted line shows Merged UTF‑8 total next to the merged document size so large body shards (e.g. 128.0 KiB) read cleanly beside the full merged KiB.
2026-05-10 — Worker v44: action_log_defrag (admin-ws + CLI)
Control LAPTOP_UI_VERSION 183 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 44 · SW cache v224
-
Admin: WebSocket
action_log_defrag repacks the v1 action log (sealed / staging / tail) at the current 128 KiB big-chunk budget without re-numbering seq. CLI: node scripts/admin-cli.mjs action-log-defrag <screenId>.
2026-05-10 — Worker v43: 128 KiB compaction chunk budget
Control LAPTOP_UI_VERSION 183 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 43 · SW cache v224
-
Worker / DO:
BIG_CHUNK_MAX_UTF8 is now 131072 bytes (128 KiB) for lastFrame v2 shards and action-log big-tier packing; last-frame-defrag default probe start matches the writer.
2026-05-10 — Worker v42: admin-ws last_frame_defrag + CLI last-frame-defrag
Control LAPTOP_UI_VERSION 183 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 42 · SW cache v224
-
Admin: Signed admin WebSocket command
last_frame_defrag reprobes lastFrame v2 shard size (default 132 KiB UTF‑8 budget, 2 KiB step). CLI: node scripts/admin-cli.mjs last-frame-defrag <screenId> with optional --start / --step / --floor (bytes).
2026-05-10 — Control v183: lastFrame v2 shards as pancake layers
Control LAPTOP_UI_VERSION 183 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 41 · SW cache v224
-
Control: lastFrame v2 uses the same stacked “pancake” presentation as Action log layers (Shard 1 · UTF-8 · …, Tail · UTF-8 · … on the last chunk when there are multiple).
2026-05-10 — Control v182 / Worker v41: lastFrame v2 shard bar + per-shard sizes
Control LAPTOP_UI_VERSION 182 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 41 · SW cache v223
-
Control: DO storage lastFrame v2 uses a proportional row (flex by UTF‑8 bytes per shard), highlights the tail shard, and shows a compact size legend.
-
Worker / API:
storage-inspect / GET …/do-storage-overview add lastFrameShardUtf8Bytes; signed-admin tree output lists shard UTF‑8 byte counts when available.
2026-05-10 — Worker v40: lastFrame v2 shard put copies UTF-8 slices
Control LAPTOP_UI_VERSION 181 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 40 · SW cache v222
-
Each v2 chunk is written with
new Uint8Array(slice) so DO storage.put does not treat the whole merged UTF‑8 backing buffer as the value (~131 KiB reject vs ~4 KiB logical chunk).
2026-05-10 — Worker v39: admin storage-probe (lastFrame/v2 keys)
Control LAPTOP_UI_VERSION 181 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 39 · SW cache v222
-
Signed admin / CLI:
storage-probe lists durable lastFrame/v2/* keys with naive size estimates, parsed meta, and a rewrite plan for the merged frame — for debugging DO storage.put rejections next to storage-inspect.
2026-05-09 — Worker v38: lastFrame trim step 4 KiB
Control LAPTOP_UI_VERSION 181 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 38 · SW cache v222
-
Worker / DO: Each
lastFrame v2 retry now shaves 4 KiB off the per-chunk budget (was 8 KiB). Undershoot clamps to the same 4 KiB minimum chunk size instead of failing early.
2026-05-09 — Worker v37: lastFrame retry trims chunk size
Control LAPTOP_UI_VERSION 181 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 37 · SW cache v222
-
Worker / DO: When a
lastFrame v2 binary shard hits the DO size ceiling, the writer now shaves 8 KiB off the per-chunk budget and retries (instead of halving), matching “barely over limit” failures with fewer full rewrite passes.
2026-05-09 — Worker v36: lastFrame v2 adapts to DO put limits
Control LAPTOP_UI_VERSION 181 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 36 · SW cache v222
-
Worker / DO: Large
lastFrame v2 shard writes that hit Cloudflare’s single-value size limit automatically use smaller chunks (halving down to 4 KiB) and rewrite the inactive prefix until persistence succeeds; oversized legacy lastFrame string puts fall through to v2 instead of hard-failing.
2026-05-09 — Control v181: DO storage backup download
Control LAPTOP_UI_VERSION 181 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 35 · SW cache v222
-
Control / Worker: DO Storage panel adds Download backup (tasks + activity) —
GET /api/screens/:id/do-storage-backup (session + screen ownership, INTERNAL_DO_ADMIN_SECRET required) exports lastFrameRaw, merged actionLog, and v1 shard metadata (same shape as signed-admin storage-export).
2026-05-09 — Display recovery: DO hard-rejects Display WS (no env toggle)
Control LAPTOP_UI_VERSION 180 · Display PHONE_UI_VERSION 56 · Worker WORKER_VERSION 34 · SW cache v221
-
Worker / DO:
DISPLAY_WEBSOCKET_HARD_REJECT in src/display-ws-recovery-gate.ts makes ScreenRoom refuse every role=phone WebSocket upgrade with HTTP 403 until you set it false and redeploy (see repo changelog).
2026-05-09 — Display recovery: PHONE_WS_RECOVERY_BLOCK + restore-last-frame
Control LAPTOP_UI_VERSION 180 · Display PHONE_UI_VERSION 55 · Worker WORKER_VERSION 33 · SW cache v220
-
Display / Worker: With
PHONE_WS_RECOVERY_BLOCK set, the Display skips WebSocket, shows an upload banner, and POST /api/screens/…/restore-last-frame restores the Durable Object lastFrame from the cached task list. Phone upgrades return 403 phone_ws_blocked while active.
2026-05-09 — Worker v32: defensive lastFrame + action-log ordering
Control LAPTOP_UI_VERSION 180 · Display PHONE_UI_VERSION 54 · Worker WORKER_VERSION 32 · SW cache v219
-
Worker / DO: Persist merged
lastFrame before appending the action log (no audit rows without a matching snapshot on frame write failure). First-time / repaired large v2 docs stage on the alternate shard prefix and only drop primary chunks after meta commits.
2026-05-09 — Worker v31: safe large lastFrame v2 persistence
Control LAPTOP_UI_VERSION 180 · Display PHONE_UI_VERSION 54 · Worker WORKER_VERSION 31 · SW cache v218
-
Worker / DO: Large todo JSON shards use a smaller per-chunk budget so binary values stay under the Durable Object single-value limit, and v2 saves double-buffer so a failed write does not wipe the last good snapshot (legacy + meta layout detailed in repo changelog).
2026-05-07 — Control v180: multi-select clear on plain click
Control LAPTOP_UI_VERSION 180 · Display PHONE_UI_VERSION 54 · Worker WORKER_VERSION 30 · SW cache v217
-
Control: Non-shift mousedown on title/checkbox collapses the shift-range in state but now also refreshes selection chrome (incremental path), so highlights match without a full
render().
2026-05-07 — Control v179: incremental shift-click multi-select
Control LAPTOP_UI_VERSION 179 · Display PHONE_UI_VERSION 54 · Worker WORKER_VERSION 30 · SW cache v216
-
Control: Shift-click range selection no longer triggers a full-page
render(); it reuses the same incremental path as arrow-key range moves (selection chrome, Related, focus).
2026-05-07 — Control v178: multi-select focusin guard
Control LAPTOP_UI_VERSION 178 · Display PHONE_UI_VERSION 54 · Worker WORKER_VERSION 30 · SW cache v215
-
Control: Fixing
focusin so expanding a selection no longer clears it when the range-end title field receives focus after render() or incremental nav (still collapses multi-select when focus moves to a different row, e.g. Tab).
2026-05-07 — Control v177 / Display v54: Control + Display render() callsite debug
Control LAPTOP_UI_VERSION 177 · Display PHONE_UI_VERSION 54 · Worker WORKER_VERSION 30 · SW cache v214
-
Display:
render(debugCallsite?) → console + window.__REMOTE_SCREEN_DISPLAY_RENDER_CALLS.
-
Control:
render(focusOpts?, debugCallsite?) → console + window.__REMOTE_SCREEN_CONTROL_RENDER_CALLS.
2026-05-06 — Control v176 / Display v53: persisted section collapse (extras_set)
Control LAPTOP_UI_VERSION 176 · Display PHONE_UI_VERSION 53 · Worker WORKER_VERSION 30 · SW cache v212
-
Control / protocol: Section collapse is stored in
doc.extras.controlSectionHeadCollapsed via extras_set patches (persists with the room document / last frame), not only in this browser’s localStorage.
-
Control: Remote
extras_set-only patches refresh section headers and collapse chrome without a full-tree render().
-
Display: Version bump only (shared
todo-doc change; Display does not send extras_set).
2026-05-06 — Control v175: section collapse without full-tree render
Control LAPTOP_UI_VERSION 175 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v211
-
Control: Collapse / expand now toggles visibility via the existing section-shell class + rebuilds only that section’s chrome (header buttons), instead of tearing down the whole Control DOM with each click.
Still falls back to a full
render() while the section title is inline-editing or when the expected shell is absent.
2026-05-06 — Control v174: smoother relay patches (Started bursts)
Control LAPTOP_UI_VERSION 174 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v210
-
Control: Multiple server
todo_patch messages arriving back-to-back are applied in one batch (microtask coalesce), cutting repeated full render() work when many rows update (e.g. Started facets). Incremental row sync also runs when a shift range is active, and Neuron badges stay correct after incremental row refreshes.
2026-05-06 — Control v173: collapse section (minimal header)
Control LAPTOP_UI_VERSION 173 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v209
-
Control: Section headers include a disclosure toggle (▼ /
▶): collapsed sections show only stable id preview + section title (+ toggle); task grid and auxiliary header buttons stay hidden until you expand. Choice is remembered per Control URL / screen via
localStorage (remote-screen:laptop-section-head-collapsed:screen).
2026-05-06 — Control v172: clear multi-select when a title field takes focus
Control LAPTOP_UI_VERSION 172 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v208
-
Control:
Editing a row via Tab or other paths that rely on
focusin now collapses an active shift range to that row
(exitMultiSelectToTaskRow), matching click-to-edit behavior (mousedown
· pointerCollapseRange).
2026-05-06 — Control v171: collapsed selection range without scanning the section
Control LAPTOP_UI_VERSION 171 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v207
-
Control:
selectionRangeFromState short-circuits when anchor === focus so
syncTodoRowSelectionChrome does not build full visible-section lists for a single selected row.
2026-05-06 — Control v170: add_below_breakdown admin probe
Control LAPTOP_UI_VERSION 170 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v206
-
Control: Probe
add_below_breakdown measures per-step cost for add-below-last-root (apply, insert, patch, finalize substeps).
2026-05-06 — Control v169: pruneSelection without flatIds when collapsed
Control LAPTOP_UI_VERSION 169 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v205
-
Control: When selection anchor equals focus (typical after
collapseSelectionTo),
pruneSelection no longer builds flatIds(doc) — avoids copying every task id on every incremental finalize.
2026-05-06 — Control v168: one fewer replay for add + auto kind
Control LAPTOP_UI_VERSION 168 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v204
-
Control:
applyTodoPatchWithAutoKindForNewRoot applies kOps on top of the already-folded post-add doc — avoids replaying the add through
applyDocOps(prior, [...]).
2026-05-06 — Control v167: fast-path selection chrome when not multi-select
Control LAPTOP_UI_VERSION 167 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v203
-
Control:
syncTodoRowSelectionChrome skips the per-row walk when the selection range is not multi-select; clears only stale selected chrome. Cuts incremental-add overhead on large boards.
2026-05-06 — Control v166: CONTROL_UI_BUILD_ID in admin runner scripts
Control LAPTOP_UI_VERSION 166 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v202
-
Control:
runner --script now passes CONTROL_UI_BUILD_ID so scripts can compare the
live module to /laptop-app.mjs and schedule navigation (works before a probe-only bundle is loaded).
2026-05-06 — Control v165: admin probe sync_control_bundle (relay refresh)
Control LAPTOP_UI_VERSION 165 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v201
-
Control: Probe
sync_control_bundle compares the live module to
/laptop-app.mjs; if stale, reloads via performUiNavigationReload after the
runner ACK — refresh from admin-cli runner without manual hard reload.
2026-05-06 — Control v164: defer Related panel after local incremental add
Control LAPTOP_UI_VERSION 164 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v200
-
Control: Local incremental adds (
tryFinishLocalAddIncremental) focus the new title input
first; full Related rebuild runs on the next animation frame so Enter-add does not block on
fillRelatedPanelContent on large docs.
2026-05-06 — Control v163: incremental_add_trace admin probe
Control LAPTOP_UI_VERSION 163 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v199
-
Control: New
admin_runner probe incremental_add_trace (optional
incremental_add_trace:<ssec_…>) exercises add + auto kind, reports
resolveInsert / insertOk / patchOk and timing, then removes the throwaway row.
2026-05-06 — Control v162: find section grid when data-section-id lags after patch
Control LAPTOP_UI_VERSION 162 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v198
-
Control: Incremental row inserts and related paths resolve the section list grid with
findSectionListGrid: try the current data-section-id, then fall back to finding a row under
that section’s roots and walking to .todo-list-grid. Avoids spurious full render() when the shell id
is briefly stale after add + kind (or similar) on large boards.
2026-05-06 — Control v161: single-fold kind facet after root moves (outdent, drag, detach)
Control LAPTOP_UI_VERSION 161 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v197
-
When a task becomes a root in bugs / improvements via
outdent, shift multi-outdent, drag-drop, or detach, the client now applies
move (+ section) ops and the automatic kind facet in one document fold pass (same idea as v160 for new adds).
2026-05-06 — Control v160: faster auto kind facet on new bug/improvement roots
Control LAPTOP_UI_VERSION 160 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v196
-
Merged add + automatic kind facet ops into one document fold pass for new roots in
bugs / improvements, cutting duplicate fold work on very large todo boards.
2026-05-05 — Control v159: section title edits without full list rebuild when safe
Control LAPTOP_UI_VERSION 159 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v195
-
Control: Renaming a section updates only that section’s header when the edit does not reshape the document’s section list; structural changes from folding still reload the tree. Escape cancels without saving (blur is detached first so the field does not commit on cancel).
2026-05-05 — Control v158: incremental refresh for facets, links, promote
Control LAPTOP_UI_VERSION 158 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v194
-
Control: Editing facets, links, or Bug / Improvement / Clear from Related (plus Ctrl+T and ⌃⇧S for Started) updates the focused row’s badges and the Related panel without rebuilding the whole list. Rearranging roots after promote still uses an incremental move when possible; otherwise the app falls back to a full rebuild.
2026-05-05 — Control v157: no Delete selected bar (layout-stable multi-select)
Control LAPTOP_UI_VERSION 157 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v193
-
Control: The Delete selected button at the top of the list is removed so selecting several tasks no longer pushes content down. Use Delete, Backspace, or ⌘⌫ to remove the selection, same as before.
2026-05-05 — Control v156: multi-select exit with Ctrl/Alt + horizontal arrows
Control LAPTOP_UI_VERSION 156 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v192
-
Control: While several rows are selected, Ctrl or Alt/Option with ←/→ collapses the selection to the focused row before the browser runs word or subword caret movement. ⌘⇧ horizontal arrows are unchanged.
2026-05-05 — Control v155: exit multi-select with caret keys (meta±⇧ rules)
Control LAPTOP_UI_VERSION 155 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v191
-
Control: When several rows are selected, ArrowLeft/Right, ⌘↑/↓ (not with ⇧), and ⌘←/→ (not with ⇧) collapse the selection to the row whose title is focused so the browser can move the caret as usual. ⌘⇧ arrows stay as before for possible future row movement.
2026-05-05 — Control v154: bulk delete selected without full list rebuild when safe
Control LAPTOP_UI_VERSION 154 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v190
-
Control: With several rows selected, Delete selected removes them in one patch and, when the outcome is straightforward (sections still have visible tasks, archive header state does not require a full rebuild, and each removed row was present in the DOM), updates the list in place instead of reloading the whole tree.
2026-05-05 — Control v153: done toggles skip full list rebuild for archive chrome
Control LAPTOP_UI_VERSION 153 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v189
-
Control: After toggling done on one or many rows, the app updates checkboxes incrementally and refreshes the section Archive completed / Show archived controls in place when that is all that changed — instead of rebuilding the whole list every time that header state flips (which caused long pauses on the last uncheck in some orders). Row sync targets
.todo-row-wrap[data-todo-id] explicitly.
2026-05-05 — Control v151: multi-select checkbox toggles stay fast
Control LAPTOP_UI_VERSION 151 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v187
-
Control: With several tasks selected, checking or unchecking done updates the whole selection at once, leaves the range selected, and skips a full list rebuild when the section "Archive completed" control does not need to appear or disappear.
2026-05-05 — Control v150: multi-select Tab indent without full rebuild
Control LAPTOP_UI_VERSION 150 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v186
-
Control: When several rows are selected and you Tab or Shift+Tab to indent or outdent them all at once, the list reorders in place instead of flashing a full reload — unless something looks inconsistent, in which case it still does a safe full refresh.
2026-05-05 — Control v149: snappier Enter, Tab, and delete
Control LAPTOP_UI_VERSION 149 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v185
-
Control: Creating tasks with Enter (and committing the ghost row), indent/outdent with Tab, sibling moves with ⌘↑/↓, and deleting an empty row try to update the list in place instead of tearing down the entire tree — large boards should feel much quicker. Layout still does a full refresh when a section becomes empty, archive header buttons need to change, you use multi-select indent, or something does not match expectations.
2026-05-05 — Control v148: surgical remote row inserts
Control LAPTOP_UI_VERSION 148 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v184
-
Control: Relayed add patches from another client can insert new rows without rebuilding the whole list when the batch stays small and safe; other cases still do a full refresh. Link/facet removals that only affect on-screen rows update those rows (and Related when it matters) without nuking the tree when the resolved tasks are not visible.
2026-05-05 — Control v147: incremental ghost row mount
Control LAPTOP_UI_VERSION 147 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v183
-
Control: Moving focus to/from the ghost "new task" row (and clearing its draft with Escape / ⌘⌫) updates the DOM incrementally so list navigation does not do a full rebuild on every step. Unusual multi-ghost ordering still falls back to a full refresh.
2026-05-05 — Control v146: lighter arrow-key navigation
Control LAPTOP_UI_VERSION 146 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v182
-
Control: Arrow Up / Down between task rows (including Shift range and Ctrl cross-section jump) no longer tears down the whole list on every keypress — only focus, selection styling, Related, and title merge update. Jumping to the ghost “new task” row still does a full refresh so that row can mount.
2026-05-04 — Control v145: higher task tree limit
Control LAPTOP_UI_VERSION 145 · Display PHONE_UI_VERSION 52 · Worker WORKER_VERSION 30 · SW cache v181
-
Doc: Maximum tasks per screen raised from 500 to 100,000 (persisted size limits still apply).
2026-05-04 — Control v144: toast when task cap reached
Control LAPTOP_UI_VERSION 144 · Display PHONE_UI_VERSION 51 · Worker WORKER_VERSION 29 · SW cache v180
-
Control: At the 500 task document limit, new adds no longer send a worthless
todo_patch; you get a clear toast instead of a silent failure.
2026-05-04 — Control v143: focus after relay patch
Control LAPTOP_UI_VERSION 143 · Display PHONE_UI_VERSION 51 · Worker WORKER_VERSION 29 · SW cache v179
-
Control: When the server relays a todo patch, full re-render restores keyboard focus using the current selection if the browser focus is not on a task or ghost title field — so Enter keeps creating new rows (avoids a dead keyboard after section work when focus landed on the page chrome).
2026-05-04 — Control v142: lastFrame storage visual
Control LAPTOP_UI_VERSION 142 · Display PHONE_UI_VERSION 51 · Worker WORKER_VERSION 29 · SW cache v178
-
Control: DO storage overview shows lastFrame as a legacy slab or v2 shard stack instead of plain text rows.
2026-05-04 — Control v141: Action log pancake stack
Control LAPTOP_UI_VERSION 141 · Display PHONE_UI_VERSION 51 · Worker WORKER_VERSION 29 · SW cache v177
-
Control: DO storage overview shows action-log tail, staging, and sealed as a stacked “pancake” visualization (counts + sizes; sealed discs for each chunk up to 24).
2026-05-04 — Control v140: DO storage pie chart (d3)
Control LAPTOP_UI_VERSION 140 · Display PHONE_UI_VERSION 51 · Worker WORKER_VERSION 29 · SW cache v176
-
Control: DO storage breakdown is a d3 pie chart with slice percentages and a labeled legend (
/storage-pie.mjs, loaded when the panel opens).
2026-05-04 — Control v139: Screen tray + DO storage panel
Control LAPTOP_UI_VERSION 139 · Display PHONE_UI_VERSION 51 · Worker WORKER_VERSION 29 · SW cache v175
-
Control: Tray is now the screen tray (
#screen-tray). New storage icon opens a right-hand DO storage breakdown (sizes, action-log sealed chunk count, outline, sample keys).
API: GET /api/screens/:id/do-storage-overview for signed-in owners (same payload shape as admin storage-inspect).
2026-05-04 — Control v138: ⌘↑⌘↓ native text nav in title fields
Control LAPTOP_UI_VERSION 138 · Display PHONE_UI_VERSION 51 · Worker WORKER_VERSION 29 · SW cache v174
-
Control: ⌘↑ / ⌘↓ on task and ghost title inputs let the browser handle default caret movement again.
⌘⇧↑ / ⌘⇧↓ (and ⌘⌃ arrows) still reorder the row vertically.
2026-05-04 — Presence tray Display hover hold + exit ping
Control LAPTOP_UI_VERSION 137 · Display PHONE_UI_VERSION 51 · Worker WORKER_VERSION 29 · SW cache v173
-
Presence tray Display icon: mouseenter sends
tray_roundtrip with
trayPhase: "enter" (first RTT); Display keeps a green hold while the pointer stays on the icon.
mouseleave sends trayPhase: "exit" for transition back to white and a second RTT.
2026-05-04 — Control v136: Ghost row before cross-section on ↓
Control LAPTOP_UI_VERSION 136 · Display PHONE_UI_VERSION 50 · Worker WORKER_VERSION 28 · SW cache v172
-
Control: Plain Arrow down from the last row in a section focuses the trailing new row (ghost) again. Hold Ctrl while pressing ↓ on that row to jump straight to the next section’s first task. Shift+↓ still extends selection across the boundary.
2026-05-04 — Control v135: Section-edge arrow navigation + ⌘↑⌘↓ scroll
Control LAPTOP_UI_VERSION 135 · Display PHONE_UI_VERSION 50 · Worker WORKER_VERSION 28 · SW cache v171
-
Control: Arrow down from the last task in a section jumps to the next section when there is a following task, instead of always opening that section’s trailing “new row” ghost. ⌘↑ / ⌘↓ on title fields no longer let the page scroll when the combo is unused.
2026-05-04 — Control v134: Hotkey dispatch refactor
Control LAPTOP_UI_VERSION 134 · Display PHONE_UI_VERSION 50 · Worker WORKER_VERSION 28 · SW cache v170
-
Control: Global shortcuts share a single capture listener (less work per key). Task/ghost row keys skip most logic while typing plain characters; bulk delete selection is resolved once per Backspace/Delete key.
2026-05-04 — Control v133: Enter prepends child when parent has children
Control LAPTOP_UI_VERSION 133 · Display PHONE_UI_VERSION 50 · Worker WORKER_VERSION 28 · SW cache v169
-
Control: Enter on a task that already has subtasks inserts a new row above its existing children. Leaf tasks still insert a sibling below (unchanged).
2026-05-04 — Control v132: Meta+Enter toggles all selected tasks
Control LAPTOP_UI_VERSION 132 · Display PHONE_UI_VERSION 50 · Worker WORKER_VERSION 28 · SW cache v168
-
Control: With shift-range multi-select, ⌘↩ (Meta+Enter) now marks every selected row done/undone in one patch batch (same selection model as bulk delete).
2026-05-04 — Control v131: Related panel hint trim
Control LAPTOP_UI_VERSION 131 · Display PHONE_UI_VERSION 50 · Worker WORKER_VERSION 28 · SW cache v167 · 8328163
-
Control: Removed long instructional paragraphs from Related (Actions, Promote, Started, Facets); link target field no longer shows the “type 2+ chars” tip—hint appears only when there is match feedback.
2026-05-04 — Control v130 / Display v50 / Worker v28: Neuron over WebSocket + streaming
Control LAPTOP_UI_VERSION 130 · Display PHONE_UI_VERSION 50 · Worker WORKER_VERSION 28 · SW cache v166
-
Worker: Screen WS handshake passes
X-Screen-Neuron-Allow (same wtr gate as Neuron HTTP). ScreenRoom accepts neuron_subtask_request from Control, streams Workers AI SSE, and sends neuron_subtask_chunk / neuron_subtask_done or neuron_subtask_error on the same socket.
-
Control: Ctrl+N / Ctrl+Shift+N use the screen WebSocket when connected (placeholder row, live title updates, then neuron facet). HTTP
POST …/neuron-subtask remains if the socket is not open.
2026-05-04 — Control v129 / Display v50 / Worker v27: Neuron reasoning facet + Kimi 2.6
Control LAPTOP_UI_VERSION 129 · Display PHONE_UI_VERSION 50 · Worker WORKER_VERSION 27 · SW cache v165
-
Worker: Neuron JSON can include
reasoning + answerFrom; structured neuron facet on the new row (legacy string facet still accepted).
-
Control: Related panel shows expandable “AI reasoning”; purple AI·R badge when the title came from reasoning.
-
Display: Same AI·R badge treatment.
-
Models:
@cf/moonshotai/kimi-k2.6 in the picker.
2026-05-04 — Worker v26: Kimi Neuron reads reasoning + tuned run options
Worker WORKER_VERSION 26 · SW cache v164
-
Worker: When Kimi returns no
message.content, Neuron falls back to reasoning_content / reasoning. Kimi calls pass chat_template_kwargs to discourage hidden thinking-only completions and use a higher max_completion_tokens budget.
2026-05-04 — Control v128 / Worker v25: richer Neuron API errors
Control LAPTOP_UI_VERSION 128 · Worker WORKER_VERSION 25 · SW cache v163
-
Worker: Neuron
POST …/neuron-subtask returns structured fields (message, detail, model, runShape) on failures, not only error.
-
Control: Error toasts show the combined detail so debugging is easier from the UI.
2026-05-04 — Control v127 / Worker v24: activity log pushed over WebSocket
Control LAPTOP_UI_VERSION 127 · Worker WORKER_VERSION 24 · SW cache v162
-
Worker: After each saved todo patch, the screen DO sends
action_log_delta to connected Control tabs so the activity list stays current.
-
Control: Removed the periodic
/actions poll; one fetch when the socket opens, then deltas on the wire.
2026-05-04 — Worker v23: Neuron parses Kimi / chat-style AI responses
Worker WORKER_VERSION 23 · SW cache v161
-
Worker: Neuron no longer treats Kimi (and other models that return
choices[].message.content) as empty — fixes 502 empty_response after a successful AI.run.
2026-05-04 — Worker v22: Neuron default model Kimi K2.5
Worker WORKER_VERSION 22 · SW cache v160
-
Worker: Ctrl+N Neuron default (no
model in the POST body) uses @cf/moonshotai/kimi-k2.5 instead of Llama 3.2 3B. The model picker list includes the same model.
2026-05-04 — Control v126 / Worker v21: Ctrl+Shift+N model picker + neuron-models API
Control LAPTOP_UI_VERSION 126 · Worker WORKER_VERSION 21 · SW cache v159
-
Worker:
GET /api/screens/:screenId/neuron-models returns allowlisted Workers AI models ({ v: 1, models }) for the same wtr-only gate as Neuron.
-
Worker:
POST …/neuron-subtask accepts optional model (allowlisted id); default unchanged.
-
Control: Ctrl+Shift+N opens a keyboard model sheet, then runs Neuron with the chosen model. Ctrl+N still uses the default model.
2026-05-04 — Control v125: Ctrl+N keeps focus on parent
Control LAPTOP_UI_VERSION 125 · SW cache v158
-
Control: After Workers AI adds a subtask (Ctrl+N), selection and keyboard focus stay on the parent row you invoked it from instead of moving into the new child.
2026-05-04 — Control v124: no hover tooltip on task id chip
Control LAPTOP_UI_VERSION 124 · SW cache v157
-
Control: The per-task id preview chip no longer sets a browser
title tooltip on hover. Double-click to copy the full id is unchanged.
2026-05-04 — Control v123: surgical DOM for checkbox / ⌘Enter toggle
Control LAPTOP_UI_VERSION 123 · SW cache v156
-
Control: Marking a task done or not done via the row checkbox or ⌘Enter refreshes that row’s checkbox, title text, badges, and inline ref hint without rebuilding the whole list when the section chrome does not need to change (when Archive completed would appear or disappear, Control still does a full render).
2026-05-04 — Control v122: no task-id hover on title field
Control LAPTOP_UI_VERSION 122 · SW cache v155
-
Control: The task title
<input> no longer uses the browser tooltip to show the full task id when you are not editing an inline @ reference (the small id chip still has “double-click to copy”).
2026-05-04 — Worker v20: Neuron model sees title only
Worker WORKER_VERSION 20
-
Worker: Neuron
AI.run prompt is one instruction line plus the submitted title only (no “Parent task:” block). parentTaskId is still required on the POST body for the app; it is not sent to the model.
2026-05-04 — Worker v19: Neuron prompt matches 2k cap
Worker WORKER_VERSION 19
-
Worker: Neuron system prompt updated so it no longer says “max 120 characters”; it reflects the ~2000-character subtask limit.
2026-05-04 — Worker v18: Neuron max_tokens 2000 · text cap 2000 chars
Worker WORKER_VERSION 18
-
Worker:
POST …/neuron-subtask uses max_tokens: 2000; stored subtask title trimmed to 2000 characters (was 512).
2026-05-04 — Worker v17: Neuron max_tokens 512
Worker WORKER_VERSION 17
-
Worker:
POST …/neuron-subtask now calls Workers AI with max_tokens: 512 (was 128) so generation is less likely to stop early; the subtask title is still trimmed to 512 characters for the todo doc.
2026-05-04 — Control v121 / Display v49 / Worker v16: Workers AI subtask (Ctrl+N, wtr only)
Control UI v121 · Display UI v49 · Worker WORKER_VERSION 16 · SW cache v154
-
Worker:
POST /api/screens/:screenId/neuron-subtask — session + screen ownership; only the wtr username may call it; returns { v: 1, text, model } from Workers AI (@cf/meta/llama-3.2-3b-instruct). Requires the Workers AI wrangler [ai] binding.
-
Control: Ctrl+N on a focused task requests one AI subtask title, inserts it as a child, and sets facet dim
neuron on the new row. AI badge on Control and Display for those tasks.
2026-05-04 — Worker v15: sharded lastFrame for large docs
Worker WORKER_VERSION 15 · SW cache v153
-
Worker / DO: Very large todo JSON is persisted as v2 UTF-8 byte chunks under
lastFrame/v2/ (binary values) instead of one huge string, lifting the practical cap imposed by the 128 KiB single-value limit. Legacy single-key lastFrame remains for normal-sized docs. Persistence order avoids deleting the last good copy before the replacement is written; reads fall back to legacy if v2 is incomplete.
2026-05-04 — Control v120: admin runner addSiblingBelow
Control UI v120 · SW cache v152
-
Control: Signed
admin_runner scripts can invoke addSiblingBelow(taskId) — the same path as Enter on a focused task title (new empty sibling plus automatic kind facet in bugs / improvements sections). The helper returns the new task id for follow-up remove in scripts.
2026-05-04 — Worker v14: DO string size meter for lastFrame
Worker WORKER_VERSION 14
-
Worker / DO: Durable Object
storage.put string values are metered at roughly UTF-16 code units × 2 bytes, not UTF-8. last_frame_too_large preflight, storage-inspect lastFrameOverLimit, admin storage tree output, and tagged storage_put errors now use that estimate (estDoBytes vs utf8) so diagnostics match Cloudflare’s RangeError threshold.
2026-05-04 — Worker v12 / Control v119: action-log shard margin + merge errors
Worker v12 · Control UI v119 · SW cache v151
-
Worker / DO: Action-log “big” chunks target 96 KiB UTF-8 (was 110 KiB) so sealed/staging values stay further under the 128 KiB single-value limit. Failed merges can return
last_frame_too_large or durable_storage_put_rejected with a short detail instead of an uncaught RangeError.
2026-05-04 — Worker v11 / Control v119: action-log DO cap + runner section index
Worker v11 · Control UI v119 · SW cache v150
-
Worker / DO: Chunked action log appends normalize the merged tail before persisting it, compact oversized staging even when the micro tail is small, and seal using the same
{ events } byte measure as import repack — fixes RangeError: Values cannot be larger than 131072 bytes on some large staging + tail combinations.
-
Control: Admin
runner exposes sectionHeaderDropRootIndex for scripts that need the flat index at the end of a section (same as header drop targets).
-
Admin:
storage / storage-inspect tree adds estimated merge tail→staging UTF-8 size, max layer bytes, and largest sealed chunk among the first 2000 keys (with a cap note when truncated).
2026-05-04 — Control v118: safer relay patches (incremental rows)
Control UI v118 · SW cache v149
-
Control: Relayed
todo_patch from another tab or admin can update checkbox, title, kind / Started badges, and the inline ref hint on rows that already exist, without rebuilding the whole list, when the patch does not add/remove/move tasks or change sections. Patches that need structural updates still do a full refresh.
2026-05-03 — Control v117: Ctrl+Shift+S toggles Started
Control UI v117 · SW cache v148
-
Control: Ctrl+Shift+S toggles the Started (
_workStarted) timestamp on the focused task; plain Ctrl+S still inserts a new empty section only without Shift.
2026-05-03 — Display v48: tray ping flash back to mint green
Display UI v48 · SW cache v147
-
Display:
tray_ping full-page flash uses light mint (#bbf7d0) again instead of forest green.
2026-05-03 — Control v116: room tray ping — grey while outbound, ease to white on pong
Control UI v116 · SW cache v146
-
Control: The room / DO tray round-trip switches the page to a soft warm grey as soon as the ping goes out; when the result arrives, the background eases back to white.
2026-05-03 — Display v47: snappier tray ping flash
Display UI v47 · SW cache v145
-
Display: Shorter ping flash hold, faster transition into forest green, slightly quicker default background transition for the fade back.
2026-05-03 — Display v46: tray ping flash uses forest green
Display UI v46 · SW cache v144
-
Display: The
tray_ping full-page flash uses #228b22 (forest green) instead of light mint.
2026-05-03 — Display v45: tray ping green flash renews on repeat ping
Display UI v45 · SW cache v143
-
Display: A new
tray_ping restarts the green flash from full strength (drops the class, then applies it again on the next frames) so rapid pings do not sit on a decaying tint.
2026-05-03 — Control v115: tray hover RTT (no click debounce)
Control UI v115 · SW cache v142
-
Control: Presence tray hover still measures round-trip; the short “ignore click after hover” window is removed.
2026-05-03 — Control v114: presence tray hover runs round-trip
Control UI v114 · SW cache v141
-
Control: Hovering a connection tray icon runs the same latency check as a click; a quick click after hover does not fire twice.
2026-05-03 — Worker v9: presence on disconnect (closing socket omitted from counts)
Worker WORKER_VERSION 9 · SW cache v140
-
ScreenRoom: Close/error handlers no longer treat the closing WebSocket as still connected when computing
presence / presence_edge, so Control does not briefly show Display online after killing the app.
2026-05-03 — Control v113 / Worker v8: presence edges, admin tray slot, DO reconcile
Control UI v113 · Worker WORKER_VERSION 8 · SW cache v139 · Display UI v44
-
ScreenRoom:
presence adds admin; presence_edge when a role count hits or leaves zero; on each HTTP fetch and each inbound WS message, reconcile live getWebSockets() counts vs tracked state so abrupt disconnects still push updates to Control.
-
Control: Tray icons for admin tooling + Display follow
presence_edge; first column is the admin client; slightly lighter grey when “off”.
-
Display: Ignores
presence_edge.
2026-05-03 — Control v112: vertical presence tray (ms left of icons)
Control UI v112 · SW cache v138
-
Control: Connection tray stacks vertically under the top-right; round-trip ms sit to the left of each icon.
2026-05-03 — Control v111 / Display v44 / Worker v6: tray round-trip (admin / phone / room)
Control UI v111 · Display UI v44 · Worker WORKER_VERSION 6 · SW cache v137
-
Tray:
tray_roundtrip with target=admin|phone|room; DO uses tray_ping / tray_pong for admin and Display paths; room is an immediate result. admin:session auto-answers admin tray_ping (stderr shows frames).
-
Display: Green flash only for
tray_ping from the tray phone path.
2026-05-03 — Control v108: presence tray load-order fix
Control UI v108 · SW cache v134
-
Control: Fixes a startup
ReferenceError (presence tray vs setWsOnline(false)) by hoisting socket + tray state before the first offline sync.
2026-05-03 — Control v107: connection tray (Control / Display / room) + DO presence
Control UI v107 · Display UI v41 · Worker WORKER_VERSION 3 · SW cache v133
-
Control: Small fixed icons under the top of the viewport: Control and Display light up (solid) when the Durable Object sees those clients connected; the room icon lights when this tab’s WebSocket is up. Tap any icon to show a quick round-trip ms label (~3s, then fade).
-
Protocol: WebSocket
hello carries presence; live presence updates broadcast on connect/disconnect; client_ping / client_pong for timing.
-
Display: Ignores the new frames so older parsing paths stay safe.
2026-05-03 — Control v106: UI update toast copy (automatic reloads + acknowledge)
Control UI v106 · SW cache v132
-
Control: Cards for “newer UI available” and the post–auto-reload summary now say explicitly that reloads were automatic (vs the Reload button), use acknowledge on dismiss, and the multi-hop summary labels each line as one automatic full reload.
2026-05-03 — Control v105: Ctrl+T poke facet · admin-session poke hooks
Control UI v105 · SW cache v131
-
Control: With focus in a task title, Ctrl+T toggles a
poke facet (ISO timestamp on, off on second press). Facets panel includes a short hint.
-
admin-session (macOS): Relayed
todo_patch pokes run /bin/sh -c with POKE_* env; default prepends to ./admin-local-poke/poke-$POKE_SCREEN_ID.log, optional ADMIN_SESSION_POKE_CMD.
2026-05-03 — admin-session: snapshot, storage, view, todo edits · DO storage-inspect sockets by role
Developer tooling · Worker WORKER_VERSION 2 · SW cache v130
-
admin-session: REPL commands
snapshot, storage (DO KV / actionLog tree + WebSocket counts by role), view / view <taskId> (unicode subtree), and add / move / rename / toggle / delete via signed HTTP todo-patch (same as admin-cli patch).
-
ScreenRoom:
storage-inspect JSON includes webSocketsByRole (laptop / phone / admin).
2026-05-03 — DO hello: workerVersion
ScreenRoom WebSocket protocol · SW cache v129
-
The first message after a screen WebSocket upgrade is still
hello; it now includes workerVersion (Worker / DO build id, starting at 1). Same field on admin, Control, and Display connects. Bump WORKER_VERSION in src/client-versions.ts when you ship DO changes worth distinguishing.
2026-05-03 — Dev tools: npm run admin:session (REPL + admin-ws transcript)
Developer tooling (no Control/Display UI version bump)
-
Scripts:
npm run admin:session opens a signed admin-ws to the screen DO; WebSocket traffic logs on stderr as [ws >>] / [ws <<]; help, ping, raw, verbose on|off, exit. Shared handshake lives in scripts/admin-ws-auth.mjs (also used by admin-cli ping). See ADMIN_SESSION.md.
2026-05-03 — Control v104: Ctrl+S new section below current
Control UI v104 · SW cache v128
-
Control: Control+S (the Control key, not ⌘) adds an empty section below the section for the focused task — same as + Empty section from that section’s header. Ignored for multi-select, screen/section title edits, and related-link composer fields.
2026-05-03 — Control v103: hide Archive completed + Remove section when N/A
Control UI v103 · SW cache v127
-
Control: Archive completed and Remove section are omitted from the section header unless they apply — no disabled placeholders.
2026-05-03 — Control v102 / Display v40: toast fade-out
Control UI v102 · Display UI v40 · SW cache v126
-
Control + Display: Toasts that dismiss or time out use a quick opacity fade (~200ms) before they go away. Respects prefers-reduced-motion: reduce (no animation).
2026-05-03 — Control v101: Remove section when section looks empty
Control UI v101 · SW cache v125
-
Control: Remove section is available when the section has no visible tasks — not only stub-only. Typical case: completed tasks were archived and hidden; the button removes the whole section and every task in it (including hidden archived).
2026-05-03 — Control v100: double-click to edit section titles + screen title
Control UI v100 · SW cache v124
-
Control: Section headers and the main screen heading use double-click to enter edit mode (single click no longer does). Enter / Space when focused still opens edit.
2026-05-03 — Control v99: Related panel Started controls
Control UI v99 · SW cache v123
-
Related → Started: Mark started now sets the same
_workStarted timestamp as agent/admin tooling; Clear Started removes it. Not shown for done tasks or multi-select.
2026-05-03 — Control v98 / Display v39: UI update toast UX
Control UI v98 · Display UI v39 · SW cache v122
-
Control: Hover-to-dismiss for the green post-update summary applies to the whole card, not only the thin strip. The yellow “new UI” toast still avoids hover-dismiss over the Reload button; tap-to-dismiss works on the rest of the card.
-
Display: Dismiss taps are absorbed in the capture phase and removal runs after a frame so touches do not fall through to the task list behind the toast.
touch-action: manipulation on the card.
2026-05-03 — Display v38: version-only bump (testing)
Display UI v38 · SW cache v121
-
No user-facing Display changes — version number only for exercising stale-client reload /
hello flows after deploy.
2026-05-03 — Control v97: Ctrl+⌘ arrow moves task (alternate to ⌘⇧)
Control UI v97 · SW cache v120
-
Move task in list order: Ctrl+Meta+↑ / ↓ (e.g. ⌃⌘ on macOS) in addition to the existing Meta+Shift+↑ / ↓. Plain Meta+Arrow still leaves native caret movement in the title field.
2026-05-03 — Control v96: section id chip shows suffix after ssec_
Control UI v96 · SW cache v119
-
The five-character **section header** chip no longer uses only the
ssec_ prefix; it shows the start of the stable id after that prefix. Double-click still copies the full ssec_… id.
2026-05-03 — Display v37: resilient bootstrap + runner debug hook
Display UI v37 · SW cache v118
-
WebSocket connect runs even if the first
render() throws; bad offline cache or snapshot parse failures show a toast. window.__REMOTE_SCREEN_PHONE_DEBUG() for signed admin runner on Display.
2026-05-03 — Display v35: tap anywhere on auto-update toast to dismiss
Display UI v35 · SW cache v116
-
The green post–auto-update summary is dismissible with a tap anywhere on the card, not only the bottom strip (
cursor: pointer on the whole toast).
2026-05-03 — Display v34: scroll restore after tasks load
Display UI v34 · SW cache v115
-
Display now matches Control: saved scroll for a UI reload is applied after the todo list hydrates (or after a short delay on an empty list).
2026-05-03 — Control v94: scroll restore after tasks load
Control UI v94 · SW cache v114
-
After an auto- or manual UI reload, saved scroll position is applied only once the todo list has hydrated from the server (or after a short delay on an empty list), so the page is not scrolled while the main column is still empty.
2026-05-03 — Control v92 / Display v32: dismiss tap + Display post-load auto-update toast
Control UI v92 · Display UI v32 · SW cache v112
-
Control: update toasts dismiss on tap or hover (not hover-only).
-
Display: same idle auto-reload + green after-load summary as Control (separate
sessionStorage key per screen). Yellow “newer UI” bar only while a list control is focused.
2026-05-03 — Control v89: toast after auto-update (not before)
Control UI v89 · SW cache v109
-
When Control auto-reloads on a newer build, you get a dismissible summary after load (green toast) — including a count if several updates stacked before you dismissed. The yellow “new version available” toast now appears only while you’re editing and reload is blocked.
2026-05-03 — Control v88: dummy bump (screen recording vs v87)
Control UI v88 · SW cache v108
-
No code changes — bump only. Stay on v87 in Control, deploy this, then reconnect: toast + console for a clean play-by-play capture.
2026-05-03 — Control v87: dummy bump (toast test vs v86)
Control UI v87 · SW cache v107
-
No code changes — bump only. Leave Control on v86, ship this, let the socket reconnect: you should get the v87 update toast and
[ui-update] console lines.
2026-05-03 — Control v86: [ui-update] console diagnostics
Control UI v86 · SW cache v106
-
DevTools console lines prefixed
[ui-update]: which Control version loaded, whether hello thinks you’re stale, which update toasts mount or skip, and whether reload is idle auto vs Reload now.
2026-05-03 — Control v85: dummy version bump (verify UI-update flow)
Control UI v85 · SW cache v105
-
No product change — version and service-worker cache only, so you can open Control on an older tab and watch the “newer Control UI” toast / idle reload behavior against prod.
2026-05-03 — Control v84: UI-update toasts paint before auto-reload
Control UI v84 · SW cache v104
-
When the server reports a newer Control build and nothing is blocking reload, the page used to reload in the same JavaScript turn as the toast was created, so the bottom-right “new UI” toasts never got a paint. Auto-reload is now kicked off after the next frames, so you can see the notice (or dismiss it) when the tab would have reloaded immediately.
2026-05-03 — Control v83: wider Control layout (main column)
Control UI v83 · SW cache v103
-
The Control page max width is about 60% larger (
calc(56rem × 1.6)). The two-column grid still gives the flexible column to the main todo surface, so the extra space shows up in control-main, not the related panel strip.
2026-05-03 — Control v80: section header drop past stub markers
Control UI v80 · SW cache v100
-
When a section starts with an empty-section stub, dropping a task on that section’s header now inserts at the first real root (or just after the stub), not at the stub’s flat index — the old slot sat in the previous section’s slice and looked like the bottom of the section above.
2026-05-03 — Control v82 / Display v30: section_reanchor for adjacent cross-section drops
Control UI v82 · Display UI v30 · SW cache v102
-
Dragging the last task of one section to just before the first task of the next (already next to each other in the flat list) now updates the section marker via
section_reanchor, so the task actually joins the next section instead of a no-op move that only showed up in the action list.
2026-05-03 — Control v81: stacked UI-update toasts (hover to dismiss)
Control UI v81 · SW cache v101
-
Newer Control builds show a bottom-right toast per server version (stacked if several ship while you stay on an old tab). Each toast stays until you hover the dismiss strip or hit Reload now; idle auto-reload still runs when nothing is focused.
2026-05-03 — Control v79: Reload now saves scroll before the banner disappears
Control UI v79 · SW cache v99
-
Scroll position for post-reload restore is captured before the “newer UI” banner is removed, so removing that sticky strip does not throw off
window.scrollY first.
2026-05-03 — Control v78: keep typing through remote updates & reconnect
Control UI v78 · SW cache v98
-
While you are editing a task title, new-task ghost, or section title, incoming WebSocket doc updates merge the field’s current text back into the document before the UI is rebuilt, and your caret position is restored afterward.
2026-05-03 — Control v77: section header drops go to the top of that section
Control UI v77 · SW cache v97
-
Dragging tasks onto a section title row now inserts at the start of that section’s roots (not after its last root, which could feel like the bottom of the section above).
2026-05-03 — Control v76: auto-reload + scroll restore on UI update
Control UI v76 · SW cache v96
-
When a newer Control build is available, the page reloads automatically after you leave task / section / screen title inputs (and the related-link fields). Scroll position is saved and restored across the reload.
-
Reload now on the banner still forces an immediate refresh.
2026-05-03 — Control v75: drag-drop works over the id column
Control UI v75 · SW cache v95
-
When dragging from the task id chip, drag-over and drop now apply across the id + title row (same placement bands as before), so you do not have to move the pointer into the title field for the drop to register.
2026-05-03 — Control v74: shift+click range select within a section
Control UI v74 · SW cache v94
-
Shift+click another task in the same section selects every visible row between your current focus and that click (same order as the list). Shift+click in a different section moves the selection to that task only.
2026-05-03 — Control v73: add task in archived-only sections
Control UI v73 · SW cache v93
-
When every task in a section is hidden as archived (or the section has no visible rows), Control shows Add task… so you can insert a new root without revealing archived rows first.
2026-05-03 — action-log-import: large logs repack safely
Worker / DO · admin-cli action-log-import
-
Bulk merge + repack now writes sealed → staging → tail from oldest to newest so each stored value stays under the platform size cap; big exported
actionLog.json merges no longer rely on one oversized put.
2026-05-03 — Chunked screen activity log (actionLog v1)
Control UI v72 · Display UI v29 · SW cache v92
-
Worker / DO: activity history is stored in chunked durable keys (small hot tail + larger segments) instead of one JSON blob capped at 2000 rows / 128 KiB.
-
GET /api/screens/…/actions: optional since_seq for incremental fetch; response includes max_seq.
-
Control & Display: if one activity row would exceed the server size limit, the patch is rejected and a clear toast explains shortening facet text or links.
2026-05-03 — WebSocket errors: DO always replies; Control & Display toasts
Control UI v71 · Display UI v28 · SW cache v91
-
Worker / DO: malformed or oversize frames and failed
todo_patch merges now get an explicit { ok: false, kind, error, … } message instead of silence; unexpected errors during merge return todo_patch_failed with a short detail.
-
Control & Display: those failures surface as a brief on-screen toast so you do not have to watch the WS panel for missing acks.
2026-05-02 — Relay: stale sockets won’t drop patches or 500 admin-cli
SW cache v89 (worker-only)
-
Worker: each peer
WebSocket.send for incremental todo_patch is isolated — one dead tab no longer throws after the doc is saved, so admin-cli patch returns 200 and other tabs still receive the relay.
2026-05-02 — Admin todo-patch at the DO + Display validation
Control UI v70 · Display UI v27 · SW cache v88
-
Admin: signed
POST …/screens/todo-patch applies ops inside the Durable Object (same persistence as Control) and relays incremental patches to every connected tab. Use admin-cli patch … --json or --file — no Control window needed for scripted edits.
-
Display: rejects applying a relayed patch when the merged doc would be invalid (stale cache vs DO); reload Display if that happens.
2026-05-02 — Worker: live relay is incremental patches only
Control UI v70 · Display UI v26 · SW cache v87
-
Worker / relay: After each merged Control patch, the server relays the canonical
todo_patch to other tabs — not a full document snapshot. Full v:2 todos payloads stay for first load / hydrate.
2026-05-02 — Relay full todos after patches + Control handler order
Control UI v69 · Display UI v25 · SW cache v86
-
Worker / relay: After each merged Control patch, the server relays the persisted todo document wholesale to every connected viewer except the editor who sent the patch.
-
Control: WebSocket handling applies relayed
v:2 todos snapshots before treating bare { ok: true } as an ack (same ordering idea as Display).
2026-05-02 — Display: parseTodoDoc folds section extras before validation
Control UI v67 · Display UI v24 · SW cache v83
-
Display / todo-doc: Full snapshots from the wire now migrate stable section keys (
foldSectionTitlesOntoCanonicalKeys) before strict validation, so the viewer replaces IndexedDB/cache with the server doc instead of rejecting legacy shapes and staying on a stale base for incremental patches.
2026-05-02 — Display: patches aren’t swallowed by ok-only frames
Control UI v66 · Display UI v23 · SW cache v82
-
Display: WebSocket handling now applies full snapshots and
todo_patch updates before ignoring bare { ok: true } acks, so relayed doc traffic cannot be skipped by mistake.
2026-05-02 — Display: live patches keep section model in sync
Control UI v66 · Display UI v22 · SW cache v81
-
Display: each
todo_patch from the relay now runs the same section-title / stable-id normalization as full document loads, so new tasks show up live again (not only after refresh).
2026-05-02 — Section reorder: whole-block targets
Control UI v66 · Display UI v21 · SW cache v80
-
Control: dragging a section can end over any part of another section’s card (tasks included), not only the thin header strip; highlights apply to the full section shell.
-
Control: start reorder from the section header row as well as the id chip (buttons and inputs stay click-only).
2026-05-02 — Archive completed tasks per section
Control UI v65 · Display UI v21 · SW cache v79
-
Control: each section header has Archive completed (sets
_archived on done tasks in that section) plus Show archived / Hide archived.
-
Display: archived completed tasks stay out of the default section list until you choose Show archived.
-
Unchecking a task removes its
_archived marker; persisted docs are normalized like other reserved facets.
2026-05-02 — Section id chip = task id chip (Control)
Control UI v64 · SW cache v78
-
Section headers show the same monospace id hint as tasks (short preview). Double-click copies the full stable section id; drag from the chip still reorders sections. The old ⋮⋮ handle beside the id is gone.
-
Wake-up doc: every operator
next → message is spelled out as the mandatory admin-cli board cadence (always scaffold at least one child row, then start/toggle per slice).
2026-05-02 — ⌘⌫ respects multi-select (Control)
Control UI v63 · SW cache v77
-
With two or more tasks selected, Meta+Backspace now removes the whole selection (same as
Delete / plain Backspace in that state), not only the focused row.
2026-05-02 — Agent handoff doc
HANDOFF.md · SW cache v76
-
Cold-start narrative for agents/operators was renamed from
MEMORY_CARE_WAKE_UP_NOTE.md to HANDOFF.md; legacy filenames remain stubs that point here.
2026-05-02 — Queue walkthrough example (docs)
IMPLEMENTATION_PLAN.md · SW cache v75
-
Wake-up sheet now includes a concrete start → child start → toggle rhythm (with an illustrative narrative in the doc as one possible mental model).
2026-05-02 — Start + subtasks: progressive Started
Operator · admin-cli start … -- · SW cache v74
-
Children after
-- are created as a plan outline only the parent is marked Started. Run start on each child id when that step actually begins so observers see one active slice at a time.
2026-05-02 — Started badge vs completed tasks
Control UI v62 · Display UI v20 · SW cache v73
-
Done tasks no longer show Started when old data still had a marker, and saved docs are cleaned as patches flow through the server and clients.
2026-05-02 — Started badge clears when done
Control UI v61 · Display UI v19 · SW cache v71
-
Checking a task done now drops the _workStarted marker automatically, so the Started label does not stay on finished items.
2026-05-02 — Kind facet when outdenting / detaching
Control UI v60 · SW cache v70
-
Moving a task to the top level inside bugs or improvements (outdent, detach, or drag) now sets the same kind facet as adding a new row there — and replaces an old kind row instead of stacking duplicates.
2026-05-02 — Next-task lifecycle (docs)
Operator · IMPLEMENTATION_PLAN.md · SW cache v69
-
Wake-up sheet now describes the full next → loop:
start on a child id when you pick up that row, toggle as slices ship, and a quick snapshot before closing the parent so scaffold placeholders don’t linger.
2026-05-02 — Start + subtask titles (CLI)
Operator · admin-cli
-
start <screenId> <taskId> [--target …] -- "First child" "Second child" — everything after -- becomes a new subtask under that task in the same request as the started marker. The JSON result lists new ids in scaffold.
2026-05-02 — Task started
Control UI v59 · Display UI v18 · SW cache v68
-
Started badge on tasks that have been marked in progress via
admin-cli start (or the same _workStarted facet). Hover for the timestamp.
2026-05-02 — Section ids
Control UI v58 · Display UI v17 · SW cache v67
-
Each section has a stable ssec_… id (not tied to the first task’s id). Titles and DOM
data-section-id use that id; Control now runs the same fold step locally after edits so the list matches what the server saves.
2026-05-02 — Empty stub sections
Control UI v57 · SW cache v66
-
Remove section appears on the header when the section is still stub-only (no real tasks). The old stub anchor row is gone on Control — empty sections are just the title and the + row, like Display.
2026-05-02 — Detach
Control UI v56 · SW cache v65
-
Detach lives under Related → Actions with shortcut ⌘D; the per-row Detach button is removed.
2026-05-02 — Auto kind in bugs / improvements
Control UI v55 · SW cache v64
-
New top-level tasks added in a section titled bugs or improvements get the matching kind facet automatically.
2026-05-02 — Copy id feedback
Control UI v54 · SW cache v63
-
After you double-click a task id chip to copy it, a small Copied toast confirms it worked.
2026-05-02 — Empty section
Control UI v53 · Display UI v16 · SW cache v62
-
+ Empty section on a section header creates a new section that starts empty (stub anchor in the doc; Display hides it). Type in the + row to add the first real task.
2026-05-02 — Promote kind
Control UI v52 · SW cache v61
-
Related → Promote: tag a task as bug or improvement (facet
kind); top-level tasks can jump into matching bugs / improvements sections. Clear removes the tag.
2026-05-02 — Task id copy
Control UI v51 · SW cache v60
-
Double-click the short task id chip on a row to copy the full id to the clipboard.
2026-05-02 — Drag reorder
Control UI v50 · SW cache v59
-
Fixed click-drag so moving a task down the list lands in the gap you aim for (same parent). It used to skip one slot; keyboard nudge was already fine.
2026-05-01 — Shift+Enter / section boundary
Control UI v49 · SW cache v58
-
Shift+Enter on the first task of a section (after the first section) no longer drops the new line into the previous section — the section marker moves with the new root.
2026-05-01 — Selection
Control UI v48 · SW cache v57
-
Fixed a bug where shift-selecting toward the bottom new-task row could silently select every task from your anchor to the end of the list; Delete then removed all of them. Selection ranges no longer use that row as a “select to end” endpoint.
2026-05-01 — Detach
Control UI v47 · SW cache v56
-
Detach places the new section before the next section’s first task (or at the bottom), so it doesn’t open inside an existing section when that section had several roots.
2026-05-01 — admin · Display
Display UI v15 · SW cache v55
-
Signed admin runner / ping can target the Display tab with
--target phone (see admin-cli).
2026-05-01 (later still)
Control UI v46 · SW cache v53
Control (admin)
-
Signed admin runner scripts in the open Control tab can call
patch(ops) (and helpers like randomTodoId) to apply the same document ops as the UI — not only read the document.
2026-05-01 (later)
Control UI v45 · Display UI v13 · SW cache v52
Control + Display (shared doc)
-
Deleting the first task in a section keeps the section split and title: the next top-level task in that section becomes the new section marker, and the title is carried over.
2026-05-01
Control UI v44 · Display UI v12 · SW cache v51
Control UI v44
-
Section titles after header reorder: server + parse merge stray
extras.sectionTitles keys onto each section’s canonical
sec_<firstRoot> key so labels like a prose title aren’t left on an orphan key when the section’s leading root changed.
Control UI v43
-
Section header drag reorder: split markers (
extras.sectionRoots) reconcile from secondary section starts only
(sectionMarkerRootsFromVisualOrder), avoiding bad section_unsplit/section_split pairs after root move ops.
-
Each Control
<section class="todo-section"> sets data-section-id for DOM ↔ model checks (e.g. admin runner).
Control UI v42
-
Admin ping correlation stored on the admin WebSocket
serializeAttachment payload so admin_pong can still deliver
admin_ping_result after WS hibernation (in-memory waiters alone do not survive).
Control UI v41
-
Fixed ScreenRoom
settleRunner: waiter must not be deleted before finish, otherwise admin_pong / runner replies never emitted admin_ping_result on the admin socket.
Control UI v40
-
Worker → Durable Object admin WebSocket upgrade keeps the real
/api/screens/:id/admin-ws path (not a synthetic
/admin-ws) so duplex framing matches the client; optional ADMIN_CLI_VERBOSE=1 for admin-cli ping logs.
Control UI v39
-
Signed admin ping over WebSocket:
GET /api/screens/:id/admin-ws (Ed25519 headers, empty-body digest),
then admin_ping frame → laptop admin_ping / admin_pong →
admin_ping_result on admin socket. CLI:
node scripts/admin-cli.mjs ping <screenId> (ws package).
Control UI v38
-
Signed admin API (
POST /api/admin/v1/…): list users, list screens by user, DO snapshot, and laptop WS debug runner
(script / probe: "sections"). Needs ADMIN_ED25519_PUBLIC_KEY_B64 +
INTERNAL_DO_ADMIN_SECRET; use scripts/admin-sign.mjs to sign (300s TTL).
-
scripts/admin-cli.mjs + .env.admin.example: call the same endpoints from the shell via
.env.admin.local (gitignored) and an Ed25519 admin.pem.
-
npm run admin:bootstrap generates keys and env stubs;
npm run admin:apply-worker-vars pushes secrets with Wrangler.
-
ScreenRoom admin runner: completion path always returns HTTP (safe JSON encoding) so admin runner requests do not hang on bad payloads.
Control UI v37
- Fixed section reordering to re-normalize section split markers so sections no longer disappear after header drag moves.
Control UI v36
- Added an explicit section drag handle (
⋮⋮) so section reordering drag start is reliable.
Control UI v34
- Added drag-and-drop section reordering by dragging section headers with before/after target zones.
Control UI v33
- Applied strict per-release Control UI version bump policy to keep update banners consistent.
Control UI v32
- Added multi-select
Tab indent and Shift+Tab outdent with top-ancestor filtering.
- Fixed section-header drops so moves no longer land in the wrong section due to traveling split markers.
- Switched drag targeting to overlap-sensitive row edges/center without always-visible between-row lanes.
- Added drag-and-drop task moves across sections (between-row sibling, on-row child, header append-to-end).
- Added ghost-row down-arrow continuation into the next section.
- Enabled section title editing persistence and top-level detach into standalone sections.
- Made ghost row contextual to section end or empty-screen state instead of always visible.
- Restored default grouped section behavior unless explicit section split markers exist.
Control UI v31
- Introduced multi-section screens with detachable subtrees and editable section ids/titles on Control and Display.
Control UI v30
- Large multi-delete actions now send in 64-op chunks so phone clients stay in sync.
Control UI v29
- Related panel link composer now keeps focus and typed target prefix during polling/rerenders.
Control UI v28
- Added visible inline
:j lookup hint row under task inputs.
Control UI v27
- Made
:j lookup cursor-aware while editing anywhere in task text.
Control UI v26
- Added manual link composer, mention backlinks, quick-link actions, and outgoing/incoming link grouping.
Control UI v25
- Shipped initial link composition/backlink workflow in the Control related panel.
Display UI v11
- Display now renders the new section model and section titles alongside task trees.
Display UI v10
- Display now preloads last-known tasks/title from IndexedDB before websocket sync.
Display UI v9
- Phone PWA install now captures the currently open screen URL as launch start URL.
Service worker cache v42
- Manifest fetch is network-first and uses referer fallback to avoid stale root launch URLs on home-screen installs.
Other deployed updates
- Added in-app changelog page and linked it from Home, screens, passkeys, and login history.
- Auth credential/login verification endpoints now tolerate partially migrated D1 schemas.
2026-04-30
Control UI v24 · Display UI v8 · SW cache v40
Control UI v24
- Restored native Meta+Arrow cursor movement in inputs while keeping Meta+Shift+Arrow for sibling moves.
Control UI v23
- Added
:j...: id mention lookup + auto mention-link creation.
Control UI v22
- Added Recent actions panel with live polling.
Control UI v21
- Removed redundant tree-derived related blocks after links/facets shipped.
Control UI v20
- Switched sibling move to Meta+Shift+Arrow.
Control UI v19
- Added facets editor/actions in related panel.
Control UI v18
- Added links editor/listing in related panel.
Control UI v17
- Fixed Shift+Arrow multi-select anchor behavior.
Control UI v16
- Hardened merge-safe role/extras handling in todo-doc.
Control UI v15
- Added mirror-hover between panel and list rows.
Control UI v14
- Introduced initial two-column related panel scaffold.
Display UI v8
- Tolerant handling for richer document ops/data while keeping display write surface constrained.
Display UI v5
- Added realtime screen-title hydration and update handling.
Display UI v4
- Tightened phone row/grid alignment and safe-area layout.
Display UI v3
- Introduced explicit Control/Display UI version handshake baseline.
Service worker progression
- v40: Switched modules/service worker to network-first update behavior.
- v30-v39: Incremental cache updates while related panel, links/facets, and action feed landed.
Earlier same-day foundations
- Keyboard-first outliner flow, ghost root row, and heading sync/persistence.
- Websocket reconnect and service-worker activation improvements for deploy reliability.
Your screens ·
Passkeys ·
Home