Attach Remote keyboard injection to approved controlled sessions

Local launch and managed startup now start the incoming-key owner for
sessions installed with keyboard-inject, using one input-helper
Supervisor retained for the reader lifetime. Delivery rechecks lock,
XTerm handoff and internal reader UI in addition to lease, grant and
deadline. build-cthulhu.sh and both Arch packages build and install
cthulhu-input-helper; a missing helper leaves keyboard input
unavailable without affecting startup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Chase CichorzandClaude Opus 5.5 committed 2026-11-06 16:06:38 -05:00
1 parent c1333c2fdb
commit 27017bef11
13 files changed
+362 -66

No files matched your search

+27 -5
View File
@@ -1,10 +1,10 @@
# Experimental Remote keyboard IPC prerequisite
The protocol 1.1 host recognizes `remote.key`, with public Go types and matching
Python validation. Reader code can explicitly attach a bounded incoming-key
mailbox. No production input owner is attached: ordinary reader sessions return
owner-unavailable, and the external Remote command still discards keyboard
payloads. This is not desktop keyboard control.
Python validation. A bounded incoming-key mailbox is attached in production
for sessions installed with `keyboard-inject`, and the external Remote command
forwards controller keys when keyboard control is approved for the session.
See the production attachment section below; live acceptance is pending.
## Wire contract
@@ -116,7 +116,7 @@ original-epoch cleanup/process-exit barrier; unconfirmed retirement blocks
replacement. The quarantined `app.run_remote_keyboard` worker now joins this
supervisor to the authenticated mailbox with a required policy callback; see
[its lifecycle and native evidence](testing/remote-input-helper.md#quarantined-leasemailbox-worker).
No production reader launch or mailbox owner is attached.
`start_remote_keyboard` is now its production caller; see below.
No capture event API, production Xorg input owner or supervised helper attachment,
core escape/bypass integration or installed Remote keyboard command is
@@ -130,3 +130,25 @@ existing speech regression harness, affected-package vet, a separate reader
build and Tentacles `make check`. The lifecycle regression now checks malformed
typed keys and keeps its unsupported-operation check on Braille. No full reader
suite or native/hardware acceptance was performed; no active reader was replaced.
## Production attachment (2026-11-06)
Local launch and managed-session startup now call `start_remote_keyboard`
for every session installed with `keyboard-inject`, next to the speech owner.
It attaches the mailbox before the child becomes active and runs the existing
lease/mailbox worker with one `remoteinput.Supervisor` retained for the reader
lifetime, so the uncertainty latch survives session replacement. The helper is
`cthulhu-input-helper` beside the reader executable; `build-cthulhu.sh` and both
Arch packages now build and install it. A missing helper or a session without
the grant leaves `remote.key` owner-unavailable and does not affect startup.
Delivery-time policy adds reader lock, XTerm-handoff suspension and active
internal reader UI to the worker's lease, grant and deadline checks; a denied
key revokes the original lease. A clean helper failure retires only that lease
and is announced; unconfirmed cleanup is announced as requiring a reader
restart. Real SDK-process tests cover delivery and lock-policy retirement,
handoff denial before helper launch, and the no-grant and missing-helper cases.
This makes injection reachable from an approved controlled session. It does not
add physical-collision safety, injection provenance, lock/AltGr policy or live
acceptance, which remain required before keyboard control is declared ready.
+3 -3
View File
@@ -5,7 +5,7 @@ its own process. `internal/remoteinput` supplies bounded private IPC, a separate
EOF lifeline, and a three-second heartbeat watchdog. The helper owns its X
connection and stored destination-key ledger on one locked OS thread.
No production reader owner launches this helper or attaches `remote.key`.
At this increment, no production reader owner launched this helper or attached `remote.key`. (Superseded 2026-11-06: see [production attachment](../tentacle-remote-keyboard.md#production-attachment-2026-11-06).)
Remote's UI still offers experimental speech only and discards keyboard traffic.
The ordinary build/install script still builds the reader and Braille helper;
this additional executable is source-built by the private test harness only.
@@ -164,12 +164,12 @@ and Control on a separate X connection before fresh-helper admission.
This launcher is callable only as a quarantined prerequisite. Production reader
startup does not construct it, the mailbox has no production native owner, and
the normal build/install script still does not install the input helper. No native
delivery-time policy or physical collision safety is implied.
delivery-time policy or physical collision safety is implied. (Superseded 2026-11-06: see [production attachment](../tentacle-remote-keyboard.md#production-attachment-2026-11-06).)
### Quarantined lease/mailbox worker
`internal/app.run_remote_keyboard` now joins an explicitly enabled reader key
mailbox to a retained Supervisor. It has no production caller. One worker owns
mailbox to a retained Supervisor. At this increment it had no production caller. (Superseded 2026-11-06: see [production attachment](../tentacle-remote-keyboard.md#production-attachment-2026-11-06).) One worker owns
one session's mailbox and serially sends its transitions; it creates no extra
key queue. Host queued/in-flight budgets remain reserved until helper operation
completion or the full cleanup barrier, including uncertain effects.