VNC window kind: libraries vs our own RFB client, measured #223
Open
opened 2026-10-15 09:08:14 +00:00 by kayg
·
21 comments
No Branch/Tag specified
main
j470b-server-mesh-rejoin
mesh-compat-382
j444b-d381-key-wins-flood
j461b-macos-utun-reader-thread
j475b-remove-host-motion
fix-reconnect-new-link
j481-d380
dev
j479-mesh-soak
fix/j476-host-facts
j475-motion-pill-split
j470-mac-node-join
root-upgrade-d376
j474-review-merge
latency-targets-120hz
nightly-suite-shards
gotatun-pin-j469
macos-utun-reader-thread
fix-flood-echo-stall
wip/j416
motion-fast-ease-out
mesh-addhost-j259
takeover-close-terminals-d368
kbd-instant-followups
fix-trust-key-double-click
nightly-suite-partial-report
appwin-icons-j207
rusqlite-slice1
swipe-content-first-d374
mesh-mtu-381
addhost-instant-open
glass-contrast-d365-mock
glass-contrast-d365
signout-followups-442
fix-startup-toast-red
research-gotatun-matrix-j317
themes-sync-j304
fix-load-flakes
fix-nix-zig-patch
fix-compute01-browser-baseline
ratchet-size-baseline-419
predict-auto-d130
revoke-coverage-d367
nightly-suite-queue-timeout
nightly-browser-suite
fix-rustsec-2026-0459
fonts-ioskeley-obel
log-retention-d375
fix-kbd-no-anim-427
fix-dev-red-specs-2
takeover-proof-305-j205
wip/j410-server-pump
ui-consistency-d372
fix-osc52-clipboard
libghostty-vt-1.0
forget-retired-host-d369
j404-merge-426
fix-setup-lock-race
fix-touch-select-426
revoke-access-report-ui
fix-predictive-echo-specs
fix-selinux-agent-exec
wip/j395-checkpoint2
wip/j395
j391-review-scratch
ui-consistency-j195-deferred-rebased
fix-rustc-paths-421
decisions-wording-341
fix-install-suite-red
fix-dev-rtt-specs
fix-pending-removal-align
fix-privileged-skip
fix-install-suite-404
review-j368
mesh-dns-j254
revoke-access-report-d356b
revoke-privilege-round5
fix-removal-confirm
review-j360
gotatun-rotation-367
deps-refresh-340
review-j354
review-J351
review-j350
addhost-takeover-d359
revoke-report-items-347
revoke-end-sessions-d362
review-j348
size-mesh-ssh-346
size-trim-337
revoke-access-diff-d356
j259-pre-rebase-b06c5a6
j305-ended-at-start-spec
addhost-sudo-consent
fix-layout-real-specs-411
fix-shell-open-411
fix-console-hosts-373
fix-shell-exit
fuzz-host-name-353
fix-host-details-410
macos-filter-j197
research-gotatun-tricks
revoke-p3-j216l
stale-state-pill
revoke-followups-j216k
revoke-progress-j216e
backup/macos01-20261106/lume/j197
backup/macos01-20261106/lume/appwin-icons-j207-stash0
backup/macos01-20261106/claude/stash-0
backup/macos01-20261106/claude/stash-1
backup/macos01-20261106/claude/J80-macos-s1
backup/macos01-20261106/claude/J80
backup/macos01-20261106/claude/J80-slice1-20261102
backup/macos01-20261106/claude/J16b-appwin-on-dev
backup/macos01-20261106/claude/appwin-launch-idle-146
backup/macos01-20261106/claude/J80-s1-run
wip/j259
trust-285-p3c
runtime-lock-j216f
mesh-ssh-p3-j175
tun-proof-p3b
trust-285-p3
terminal-polish-j271
tun-proof-p3
ssh-install-flakes-j216i
fuzz-fixes-j264
trust-285-a
trust-285-b
restart-oversized-fixture-j198
backup/macos01-20261106/lume/appwin-icons-j207
restart-bound-j216h
up-preflight-p3-j198
backup/macos01-20261106/lume/j251
up-preflight-j198
wip/up-preflight-j198-j245-p2
wip/up-preflight-j198-j245-p1
agent-fsync-offloop-j196
wip/up-preflight-j198-j245
settings-offscreen-j231
wip/up-preflight-j198-j226-inspection
wip/j103f
themes-j206
wip/up-preflight-j198-j226
flakes-j216c
backup/macos01-20261106/claude/j197
flakes-j216b
backup/macos01-20261106/claude/j197-red
wip/up-preflight-j198-review
flakes-j216
backup/macos01-20261106/claude/appwin-icons-j207
engineering-j208b
appwin-mock-j209
toast-stack-j165
engineering-j208
decisions-d351
decisions-d350
decisions-d349
appearance-presets-mock-j129
decisions-d348
docs-audit-spec
doc-coverage-baseline-raise
decisions-d347
decisions-d346b
decisions-d346
j88h-profile
ui-consistency-j195-deferred
ui-consistency-j195
engineering-practices-j194
preferred-login-ui-j166
signin-pools-263-j174
macos-node-265-s1
decisions-d345
decisions-d344
proxy-cgroup-j164
verify-quick-fuzz-329
proxy-start-io-j168
timing-flakes-j163
up-263-s1
mcp-events-j147
verify-quick-fuzz-j158
proxy-p3-j159
agent-resource-j157-detect
wip/j103d-final
remote-cancel-hang-j155
proxy-traefik-281-j62d
j149-verify-quick
proxy-traefik-281-j62b
j150-drop-unnamed
wip/j79d-red-r4
wip/j103d-d332
rootless-toast-j142
wip/j103d-head
wip/j103d
j125c-mcp
macos-build-j136
backup/macos01-20261106/claude/j136
wip/j79d-red-cli
wip/j79d-red-server
j121-link-liveness
j118c-tracer-failures
wip/j79c-head
release-desktop-j131
j124c-signed-macos
wip/j79c-red-p3
wip/j79c-red-p23
wip/j79c-red-p22
merge-j128-check
perf-deferred-j128
sidebar-toggle-260
j127-shortcut-changed-dot
j125-mcp
j118-tracer-failures
j126-account-summary
settings-sections-mock-j92
j120-pinch-lock
sidebar-292
backup/macos01-20261106/claude/j120
taste-2026-11-03
row-actions-242-215
backup/macos01-20261106/claude/stash-0-untracked
backup/macos01-20261106/claude/J80-265-s1-run
backup/macos01-20261106/claude/J80-macos-s1-20261102
j112-canvas-commands
ui-no-overshoot-scroll
fix-recovery-restart
backup/macos01-20261106/claude/stash-1-untracked
taste-2026-11-02
size-baseline-ratchet
machine-cards-structure-j108
j109-boot-copy-mockups
fix-dev-red
wip/up-263-s1
j95b-settings-rows
proxy-traefik-281
j95-option-rows
docs-human-j91
docs-keys-palette
fix-flood-1013-270-j38d
mesh-ssh-s1
mesh-ssh-s0
addhost-d291-tunnel
test-stability-load
mesh-relay-220
repro-296
shim-thp-off-24
mesh-pins-258-v2
mesh-dns
signin-d311-merged
docs-pages
ui-size-283
fix-ui-batch-specs
wip/j12b-edge-update
gate-on-arm
fix-rename-sync-293
trust-285-j60b
fix-focus-ring-clip
integ-ui-1101
edge-update-v2
signin-d311
taste-2026-11-01
layout-per-tab-250
ui-approved-splitopt-224
ui-approved-splitopt-224-on-dev
icon-text-centre-282
ui-approved-189-212-216
research-reverse-proxy
transfer-budget-320
review-mesh-pins-258-r2
sidebar-pill-259
review-mesh-relay-220
wip/j12-edge-update-v2
nix-package
status-crash-loop-237
fix-dev-test-failures
fix-fixture-socket-path
wip/mesh-relay-220-pre-dev-advance-rebase
fix-canvas-side-clip
research-head-to-head
frosted-real-256
review-mesh-pins-258
wip/mesh-relay-220-pre-final-rebase
review-layout-per-tab-250-r2
broad-suite-triage
nix-devshell
review-status-crash-loop-237-r3
wip/nix-devshell-pre-p3
taste-frosted-real
wip/code-serve-demo-2026-10-30
wip/code-serve-glass-2026-10-30
wip/code-serve-clusters-2026-10-30
wip/code-merge-release94-dev-2026-10-30
wip/rproxy-delta-scratch-2026-10-30
wip/stale-note-257-staged-2026-10-30
wip/d241-size-staged-2026-10-30
review-broad-suite-207
wip/mesh-pins-258-pre-split
wip/mesh-relay-220-pre-rebase
mesh-measure-220
plan-211-update
review-edge-autoupdate-r3
perf24-reconnect
review-stale-note-r2
release-prod-live
d241-shell-marker
review-mesh-pins-server-258
review-revocation-r3
review-setup-token-r2
review-sync-journal-r3
wip/review-mesh-pins-258-prune-review-1995fee46
frosted-scroll-256
sync-journal-r3
revocation-per-account-wip
review-tokio-asyncfd-0386
review-sync-p3s
wip/stash-8by64-stash0-2026-10-30
mesh-drag-r2
setup-token-data-wip
release-9-4
auth-busy-1013
mesh-view-overlap
sync-p3s
review-auth-busy-wake
review-readd-r8-wip
mesh-drag-bounds
audit-auth-93
app-windows-stream-start
review-authority-cap-r3
app-windows-r7-measure
readd-minimal-r6
readd-minimal-r5
app-windows-r7-soak
readd-minimal-r4
app-windows-r7
app-windows-r6
readd-minimal-r3
readd-minimal-r2
readd-minimal
merge-release8-dev
review-busy-page-liveness-r2
review-busy-page-liveness
mesh-view-trim
review-authority-read-retry-r2
review-remove-uninstall-r2
release-retry-reattach
release-retry
review-remove-uninstall
review-authority-read-retry
app-windows-ship
mesh-autoswitch-p2
mesh-ssh
mesh-relay
mesh-macos-node
screen-and-control
session-labels
review-real-logins-r5
review-real-logins-r4
review-real-logins-r3
shim-memory-r2
review-real-logins-r2
shim-memory
shadow-addhost-instant
shadow-real-logins
shadow-same-session-flood
shadow-prod-perf-fix
hosts-from-server
app-windows-real
app-windows-transport
release-prod-6w
mesh-policy-verify
quiet-close-toast
dev-merge-r4
review-mesh-agent-transport
review-app-windows-transport
settings-roundtrip
review-release-pipeline-r4
mesh-agent-transport
ended-strip-fix
review-audit-ca-update-d244
settings-rows
phone-width
signout-clear
fix-restart-tests
dev-merge-rp
signer-hardening
review-audit-ca-update
terminal-fidelity
review-audit-ca-update-wip
mesh-integrate
review-mesh-agent-transport-515d3712
review-mesh-dataplane-feec1988
mesh-dataplane
signout
research-canvas-node
wip/review-renderer-cost
wip/review-terminal-fidelity
padlock-glyph
review-release-pipeline-2e95b689
phone-polish
sidebar-polish
inbox-generic
review-mesh-dataplane-378d4055
prod-batch
ui-inbox
ui-ca-unlock
ui-machine-sections
review-mesh-dataplane-a5f744fb
tls-session-prod
session-bounds-prod
fix-dead-session
session-bounds
tls-session
palette-polish
shortcuts-d222
research-appmeta
phone-gutter
ui-centre-button
wip/ui-centre-button
wip/tls-session
review-addhost-breakit
ui-platform
renderer-cost
remote-agents
mesh-api
ssh-bootstrap
prod-hotfix2
prod-fixes
review-remote-agents
review-mesh-dataplane
session-life
research-browser
review-mesh-api
research-capture
review-mesh-api-round3
review-mesh-api-round1
gate-stability
review-gate-stability
review-relay-direct
review-mesh-api-findings
proto-sessions
font-picker
proto-addhost
proto-windows
mesh-core
latency-gate
research-bsd
research-discovery
keytray-mods
mock-core
ui-tweaks
fix-motion-sel
fix-motion
integrate2
fix-robust
t-web
t-server
vt-ghostty
fix-snap-echo
t-web-auth
review-vt2
t-agent
lane-protocol
lane-shim
lane-auth
s1-base
s1-contracts
s1-workspace
No results found.
No labels
launch-qa
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/infraternal#223
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Owner 2026-10-15: VNC becomes a first-class window kind, not only a fallback (extends D104, D200, D221). Research: Rust RFB libraries vs our own implementation, and the pipeline choice. Measured candidates go to the owner (CLAUDE.md foundational choices).
Started research-vnc on branch research-vnc at base/head
e972f91dad. Read #223 (no comments) and the related VNC research issue #23 (all eight comments), plus CLAUDE.md, DECISIONS.md, docs/ARCHITECTURE.md and docs/PROCESS.md. Continuing #23's earlier browser-only decode findings, which are not pipeline or target evidence. No library or architecture selected; owner grill remains the outcome.Pipeline reuse finding:
crates/plugins/desktop/src/media.rs,session.rsandapps/tracer/src/canvas/appwin/decode.worker.on-demand.tsshow the app-window session carries bounded H.264/HEVC access units, caches keyframes for join/resume, and decodes with WebCodecs in a worker. Its measured encoder implementation iscrates/plugins/desktop/native/Encoder.swift(VideoToolbox). QEMU'sui/vnc.hlists rectangle encoders and its RFB path has no H.264 encoding, so QEMU would require an added RFB decode + video encode step to reuse that browser path. D88 rejects a WASM bridge for client logic; an RFB protocol engine is client logic, so the browser-decoder candidate needs a TypeScript path unless the owner changes D88. No candidate or architecture selected.Continuing #223 on branch
research-vnc; base SHAe972f91dad67ac1f1274a4e4cd70df24ee052bc1(clean worktree). Read all #223 and parent #23 comments. This pass covers the owner’s Proxmox-node correction, current Rust client libraries and macOS security types, reuse against the current app-window implementation, and real-target pipeline measurements. No library or pipeline selected.Fast-forwarded
research-vncfrome972f91toorigin/dev67010de(D282 only). Recheckedorigin/app-windows-ship:crates/plugins/desktop/src/media.rsandsession.rshold immutable H.264/HEVC access units, retain a keyframe for joins, and bound viewers at 5;apps/tracer/src/canvas/appwin/decode.worker.on-demand.tsdecodes with WebCodecs in a worker. The source encoder is Swift VideoToolbox, so that implementation is Mac-only; Linux VNC would need a separate encoder. Perf VM preflight: QEMU and KVM available; initial load average 1.08/1.43/0.82. No benchmark VM started yet.Source review (2026-10-15): Proxmox documents
pveshas a root-only local API shell;pvecmdocuments cluster-wide pmxcfs configuration and multi-master nodes.qm vncproxysource requiresLC_PVE_TICKET, sets it as QEMU's temporary VNC password and expires it after 30 seconds;Helpers::vnc_socketresolves/var/run/qemu-server/<vmid>.vnc. Recommendation for the agent path: discover withpvesh, use Proxmox'sqm vncproxyprocess pipe with a short-lived in-memory ticket, and keep one upstream RFB session per VM for viewer fan-out. Remote-node proxy startup and web-console concurrency still need a real PVE cluster check.Sources: https://github.com/proxmox/pve-docs/blob/master/pvesh.adoc ; https://github.com/proxmox/pve-docs/blob/master/pvecm.adoc ; https://github.com/proxmox/qemu-server/blob/master/src/PVE/CLI/qm.pm ; https://github.com/proxmox/qemu-server/blob/master/src/PVE/QemuServer/Helpers.pm ; https://github.com/proxmox/qemu-server/blob/master/debian/changelog
Additional Rust candidate found in the current source search: DeskVNC workspace version 0.27.2 is MIT OR Apache-2.0, pre-1.0, maintained by one engineer. Its internal
vnc-coreadvertises Tokio, RFB 3.3–3.8, QEMU key/LED/pointer extensions, ContinuousUpdates, VeNCrypt/X.509, RA2 and Apple Diffie-Hellman type 30; the project architecture declaresforbid(unsafe_code)on network-facing crates. It claims interoperability with QEMU and macOS Screen Sharing but gives no macOS version matrix. The crate is not independently published, and no isolated binary-size result was found. This is the strongest Rust source candidate to evaluate, not a selection.Sources: https://github.com/psmux/DeskVNC ; https://github.com/psmux/DeskVNC/blob/main/docs/ARCHITECTURE.md ; https://github.com/psmux/DeskVNC/blob/main/Cargo.toml
Proxmox source detail:
qm vncproxyasserts the VM config exists on the current node before opening that node's/var/run/qemu-server/<vmid>.vncsocket. A root agent must run the process pipe on the VM's owner node; for other cluster nodes it needs the node API/WebSocket path or Proxmox's root SSH route. The report now records both paths and marks remote-node behavior for a real-cluster functional check.Measurement harness and QEMU guest are ready; this job has been queued behind the host-wide build slot for about 48 minutes. No perf VM lock is held by this job. Waiting for the orchestrator slot to run the requested target measurements, then for an available perf lock.
Perf VM run complete: QEMU 10.0.13, Alpine 3.24.2, 1280x800, 4 vCPU, Chromium Headless Shell 153.0.8010.12. One-viewer idle (8 s): 0 RFB bytes, QEMU 6.5% CPU, Chromium aggregate 13.25%, RSS 750.45/551.27 MiB. Five-viewer idle (8 s): 0 RFB bytes, QEMU 6.625%, Chromium aggregate 38.5%, RSS 759.29/1,304.13 MiB; page heaps 10.0–17.1 MB. First-pixel join: 817.08 ms for the initial viewer, 748.55–896.93 ms for four additional viewers. Full-frame join and input-to-pixel p50/p99 remain unmeasured. The 755 B nominal scroll interval coincided with delayed terminal typing; typing/scroll/video rates are excluded. Pipelines A and C remain unmeasured. Raw instrumentation:
Research report committed at
2ce4930d. The committed report includes the Rust candidate survey, client-size scope, Proxmox/macOS findings, and valid perf-VM idle observations: 0 RFB bytes/8 s for one and five viewers; QEMU CPU 6.5%/6.625%; Chromium aggregate CPU 13.25%/38.5%; first-pixel joins 817.08 ms and 748.55–896.93 ms. Input p50/p99, full-frame join, active workloads, and pipelines A/C remain unmeasured. Finalscripts/verify fastis queued through the host build slot.At
2ce4930d, the firstscripts/verify fastfailed four meshnode_statetests atDirectory::newwithENOENT; its static build also resolved Zig under another job's missing target path. The test helper usesCARGO_TARGET_DIRas its temporary-directory parent. One focused agent-feature test passed withCARGO_TARGET_DIRpinned to this worktree's absolutetargetpath. I have queued one final-gate rerun with that same absolute path so tests and the static compiler use this worktree's toolchain. First transcript:The corrected gate measured the stripped static x86_64 binary at 22,277,392 bytes against the repository cap of 22,204,304 bytes (+73,088 bytes over cap).
git diff 67010de9199eb5e7b2ac2d3540b5fcc902e51430..2ce4930ddf4494631ae33b689140ff7a7795e51bcontains onlyresearch/vnc/REPORT.md, so executable-source/config/dependency delta against the merge base is 0 bytes. The size overage is therefore present in the merge-base source set; the gate is continuing through the aarch64 static build.Finished at
2ce4930ddf4494631ae33b689140ff7a7795e51bonresearch-vnc. The report isresearch/vnc/REPORT.md. The pipeline B QEMU/RFB browser-decoder run measured initial first-pixel at 817.08 ms and four later joins at 748.55, 766.31, 896.93, and 772.20 ms; it did not establish full-frame join or valid input-to-pixel latency. The report recommends starting with browser RFB decode for the Proxmox local-agent path, then measuring any server re-encode or passthrough path before choosing it. No Mac was used. Raw final gate log: verify-fast-absolute.log.The report-only commit adds 0 executable bytes against merge base
67010de9199e. The final gate's static binaries exceed the existing caps by 73,088 bytes (x86_64) and 66,368 bytes (aarch64); both full byte counts are below. Finalscripts/verify fastsummary, verbatim:Started design lane on branch
vnc-designat base SHA88332a4850d9f78b922f878fdd4770c9dff4f2f5. Read all 13 comments on #223 and all 8 comments on parent research issue #23. Carrying forward the QEMU measurements and their limitations; D282 requires our own RFB client and leaves pipeline decisions to measured candidates.Research findings for #223:
No library or RFB pipeline was selected by the research; D282 already selects an in-house client. Existing issue measurements remain the only target numbers: QEMU with one and five viewers produced 0 RFB bytes in 8 seconds idle; initial first-pixel join was 817.08 ms and later joins were 748.55–896.93 ms. Full-frame join and input-to-pixel latency remain unmeasured.
Architecture and corpus findings for #223:
origin/app-windows-shipatbdb0ffc509c2c0f406b5c5467a522d56be04892f.crates/plugins/desktop/src/session.rskeeps a shared latest frame, caps the session at five viewers, uses one controller lease, and releases held input on handover/drop.apps/tracer/src/canvas/appwin/stream.tsdetaches hidden viewers and the on-demand worker decodes off the UI thread. This is the lifecycle/fan-out pattern to reuse; it is not an RFB implementation.rfbproxy) but no sanitized recorded QEMU or macOS session file suitable as a public fixture. Plan: record a deterministic QEMU test pattern in the perf-VM harness; use synthetic macOS handshake/update cases until a public sample exists. https://github.com/pmdumuid/rfbproxyDesign consequence: maintain one upstream connection and canonical framebuffer per target; reuse the app-window fan-out/control lifecycle, while bounding per-viewer queues and repairing missed RFB deltas with a snapshot.
Design doc committed:
013037b7.research/vnc/DESIGN.mdhas 199 lines covering the Screens 5 feature map, noVNC/Proxmox reports and fixes, Rust session/TypeScript canvas architecture, encoding and security order, budgets, sample corpus and eight build slices. Existing #223 perf-VM baseline cited: QEMU 10.0.13 at 1280x800; one/five-viewer idle traffic was 0 RFB bytes over 8 s; first-pixel join was 817.08 ms for the first viewer and 748.55–896.93 ms for later viewers. Final gate and branch/base static-size comparison pending.013037b7finalscripts/verify fastfinding:auth::tests::socket_tests::review_liveness::review_mesh_watch_reports_liveness_expiry_without_another_editfailed; all other reported Rust tests passed. The static builds passed trust checks but exceeded current D243 caps: x86_64 22,329,104 bytes vs 22,204,304 (+124,800); aarch64 19,752,920 bytes vs 19,638,744 (+114,176). This commit changes onlyresearch/vnc/DESIGN.md; merge-base comparison is pending to confirm source and binary deltas. Baseline liveness test is pending in the same load window.Baseline check status: branch
013037b7, merge base88332a4850d9f78b922f878fdd4770c9dff4f2f5. The isolated auth liveness reruns and same-recipe x86_64/aarch64 size builds remain queued behind the host-wide build-slot cap (about 16 minutes as of 2026-10-15 19:15 UTC). The check is still queued; no code change is needed. I will record both results after a slot opens.Baseline confirmation remains queued after 45 minutes in the host-wide build-slot wrapper (2026-10-15 19:45 UTC). The command is still active and has not started; it will run the merge-base liveness test and static size builds when capacity opens. No change is needed from the owner.
Finished design-only lane. Branch
vnc-design, base88332a4850d9f78b922f878fdd4770c9dff4f2f5, head013037b74895e2f4177668517cf38a6e6b8e8331(pushed toorigin/vnc-design).research/vnc/DESIGN.mdis 199 lines and covers the feature map, reported console annoyances and responses, Rust/TypeScript architecture, codec and security ordering, budgets, conformance corpus, staged implementation plan, and owner questions. No product code changed.Evidence:
review_mesh_watch_reports_liveness_expiry_without_another_edittest failed under parallel load. In the same busy window the isolated test passed at merge base (load 5.02/4.29/6.09; 10.90 s) and branch (7.98/7.81/7.04; 11.62 s). The complete diff is onlyresearch/vnc/DESIGN.md.bun x tsc --project tsconfig.json, tracer/browser bundle and transfer checks, and 37 protocol tests passed; the stream comparison covered 134 streams and 11,439 schedules with zero divergences.Verbatim final
scripts/verify fastRust summary and static-size output:The full gate stopped before its integrated TypeScript phase at the Rust test and static-size failures; the separate TypeScript-half run above passed. Worktree is clean at the pushed head.
Open owner questions in the design:
kayg referenced this issue2026-10-28 17:53:56 +00:00