You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[plugins] Composer open scene chrome + input pump #1972
open dispatches {ok=true} but no modal command line: scene needs title/placeholder chrome, and queued capture input needs a host event pump (focus-changed currently revokes before typing arrives).
Titled List scene chrome on every open (no more bare pill), flat production poll-shape feed, owner-initiated drains (verbs pump first, focus.changed pumps while open), and fail-closed degrades for missing capture/submit/editor surfaces. Gates green (67/67 bun tests incl 12 new); headed WS5 evidence in the PR (visible modal, capture-owned typing with zero PTY leak, clean Esc release). Not merged per task; implementer stops at review.
crates/bitty-runtime/src/plugin_runtime/overlay.rs:584-590 — OverlayCapture::input_available() snapshot: live owner + non-empty queue only, non-draining, dead-session-safe (release clears queue in finish_session).
crates/bitty-terminal/src/terminal_app.rs:1262-1269 + 1667-1698 — deliver_overlay_input_available() on the cold tick path in drive_tick, ordered after deliver_overlay_released, max one/tick (O(1)), borrow released pre-VM, never on the input hot path (P0-AC-015).
crates/bitty-runtime/src/plugin_runtime/mod.rs:2789-2797 — declared-kind gating: subscribe without manifest declaration fails not declared in the manifest (covered by overlay_input_available_requires_manifest_declaration).
crates/bitty-runtime/src/runtime/present.rs:3313-3405 — titled List/Column scene paints one pill row per child (title row + input/item rows), centered stack, frame-clipped; other roots stay single flattened pill; empty scene keeps one-cell pill (CTX-1143 fail-open guard). Host owns layout only — no title/placeholder literals host-side.
Acquire-spec hints are presentation-only: crates/bitty-lua/src/host.rs:600-606,1160-1196,1864-1919 — acquire({title, placeholder}) bounded hints, unknown fields ignored; visible chrome comes from the plugin update scene, not the spec.
Remainder location per item
Original body: open dispatches {ok=true} but no modal command line — (a) scene needs title/placeholder chrome, (b) queued capture input needs host pump.
(a) Title/placeholder chrome — COMPOSER-SIDE (done in composer#15, merged 2026-10-12 as 19de526):
lua/composer/init.lua:424M.SCENE_TITLE="Composer", :435-444placeholder_text()/scene_line(), :491-494paint() scene List{Text Composer, Text input-line-or-hint}, :555-556 acquire spec {title, placeholder}, :533-569 open path. Bitty-side counterpart is only the generic row layout above. No bitty work remains on chrome.
Composer GAP (verified on remote main just now): overlay.input.available count = 0 in lua/composer/init.lua; bitty-plugin.toml events = ["overlay.released", "focus.changed"] only — no overlay.input.available declaration or bitty.events.subscribe handler. With declared-kind gating, the host nudge cannot reach composer until this lands. This is the entire remainder of [plugins] Composer open scene chrome + input pump #1972.
Composer-side follow-up (one small task, composer repo): subscribe overlay.input.available mirroring the focus.changed handler — manifest events += "overlay.input.available" + bitty.events.subscribe("overlay.input.available", function() if session.open then M.pump() end end) + unit spec (nudge while open pumps+repaints; while closed no-op; trailing nudge after RELEASED never resurrects) + headed WS5 acceptance per [ux] Host pump driver for overlay capture input (buffer-arrival) #2007. Suggested labels: feat,area:plugins,P1, milestone v0.1.0, Part of bitty#1972 / closes the composer half of bitty#2007.
No new bitty task needed unless headed acceptance finds a host defect; if it does, file it as a separate bitty follow-up with the run dir attached.
Leave #1972 OPEN until the composer nudge-subscription lands + headed acceptance passes.
Verified complete on origin/main. Host half: crates/bitty-terminal/src/terminal_app.rs:1269 (deliver_overlay_input_available called on the drive_tick cold path, ordered after deliver_overlay_released) and :1679 (fn definition); event kind registered at crates/bitty-plugin-host/src/event.rs:225 (EventKind::OverlayInputAvailable) with declared-kind gating (redaction.rs:225); covering tests at crates/bitty-runtime/tests/overlay_capture_api.rs:846 and crates/bitty-terminal/src/tests.rs:1544 (released-before-input.available ordering). Composer half: composer#15 (commit 19de526, scene chrome + input pump) and composer#17 (commit eb05a8fc, subscribe overlay.input.available nudge, closes composer#16). Scene chrome + queued-capture input pump both landed. Closing.
bitty-plugins index pin for plugins/composer is still 2762e34 (pre-#15, pre-#17) — remote composer main is eb05a8f. So the bitty-plugins checkout/registry does not yet ship the #15 chrome fix or the #17 nudge subscription. Remainder is a pin-bump PR in the bitty-plugins repo (owning jurisdiction): advance the plugins/composer pointer to >= eb05a8f (mainline, satisfies the reachable-from-mainline rule), refresh manifest_hash in registry/official/composer.toml per the registry refresh procedure, run the registry gates. No Lua code to write — the implementation already exists upstream.
Suggested NO — a pin-bump task/PR against the existing composer registry entry suffices; no new tracking issue. Left for the commander + owning jurisdiction to schedule.
Activity
Xuepoo commentedon Oct 12, 2026
Composer fix PR: bitty-terminal/composer#15 ([CTX-1157], branch ctx-1157/fix-open-scene-input-pump).
Titled
Listscene chrome on every open (no more bare pill), flat production poll-shape feed, owner-initiated drains (verbs pump first, focus.changed pumps while open), and fail-closed degrades for missing capture/submit/editor surfaces. Gates green (67/67 bun tests incl 12 new); headed WS5 evidence in the PR (visible modal, capture-owned typing with zero PTY leak, clean Esc release). Not merged per task; implementer stops at review.Xuepoo commentedon Oct 12, 2026
Plugin side lands via composer#15 (Part of). Buffer-arrival needs host pump driver: #2007 (area:ui lane). Leaving open until both halves land.
[CTX-1170] feat(host): composer open scene chrome + input pump (#1972)
[CTX-1170] feat(host): composer open scene chrome + input pump (#2034)
Xuepoo commentedon Oct 14, 2026
CTX-1204 recon (read-only, no code): what remains of the modal command line after composer#15 + #2034.
Host-complete? YES — evidence in main
Pump driver live (CTX-1170, PR #2034 merged):
crates/bitty-plugin-host/src/event.rs:225,257,287-288,304-312,360-364—overlay.input.availablekind registered, Observation class, coalescable level-nudge, Ungated{owner, queued}payload (no input bytes cross).crates/bitty-runtime/src/plugin_runtime/overlay.rs:584-590—OverlayCapture::input_available()snapshot: live owner + non-empty queue only, non-draining, dead-session-safe (release clears queue infinish_session).crates/bitty-terminal/src/terminal_app.rs:1262-1269+1667-1698—deliver_overlay_input_available()on the cold tick path indrive_tick, ordered afterdeliver_overlay_released, max one/tick (O(1)), borrow released pre-VM, never on the input hot path (P0-AC-015).crates/bitty-runtime/src/plugin_runtime/mod.rs:2789-2797— declared-kind gating: subscribe without manifest declaration failsnot declared in the manifest(covered byoverlay_input_available_requires_manifest_declaration).crates/bitty-runtime/src/plugin_runtime/redaction.rs:50-66+event.rs:333-364— Ungated view, exhaustive-match policy.capture_fallthrough_input(terminal_app.rs:1928-1974),queued_len/enqueue(overlay.rs:567,mod.rs:1025-1037), push/deliver path.crates/bitty-terminal/src/tests.rs:1544(pump nudge + released-ordering),crates/bitty-runtime/tests/overlay_capture_api.rs:843-983(payload + gating).Scene-chrome capability live (same PR):
crates/bitty-runtime/src/runtime/present.rs:3313-3405— titledList/Columnscene paints one pill row per child (title row + input/item rows), centered stack, frame-clipped; other roots stay single flattened pill; empty scene keeps one-cell pill (CTX-1143 fail-open guard). Host owns layout only — no title/placeholder literals host-side.Acquire-spec hints are presentation-only:
crates/bitty-lua/src/host.rs:600-606,1160-1196,1864-1919—acquire({title, placeholder})bounded hints, unknown fields ignored; visible chrome comes from the pluginupdatescene, not the spec.Remainder location per item
Original body:
opendispatches{ok=true}but no modal command line — (a) scene needs title/placeholder chrome, (b) queued capture input needs host pump.(a) Title/placeholder chrome — COMPOSER-SIDE (done in composer#15, merged 2026-10-12 as
19de526):lua/composer/init.lua:424M.SCENE_TITLE="Composer",:435-444placeholder_text()/scene_line(),:491-494paint()sceneList{Text Composer, Text input-line-or-hint},:555-556acquire spec{title, placeholder},:533-569open path. Bitty-side counterpart is only the generic row layout above. No bitty work remains on chrome.(b) Input pump — SPLIT, host DONE / composer GAP REMAINS:
M.pump()(init.lua:916-977), verb drains (drain_before_verb,:578-589),focus.changeddrain+repaint (:1151-1155, manifestfocus.changed),overlay.releasedhandler (:1135-1143), flat{seq,type,text}feed.overlay.input.availablecount = 0 inlua/composer/init.lua;bitty-plugin.tomlevents =["overlay.released", "focus.changed"]only — nooverlay.input.availabledeclaration orbitty.events.subscribehandler. With declared-kind gating, the host nudge cannot reach composer until this lands. This is the entire remainder of [plugins] Composer open scene chrome + input pump #1972.Proposed scope split + follow-up breakdown
hirepaints modal input line,ctl terminal textzero-leak, Esc clean-closes) once the composer side subscribes; then close [ux] Host pump driver for overlay capture input (buffer-arrival) #2007 + [plugins] Composer open scene chrome + input pump #1972 together.overlay.input.availablemirroring thefocus.changedhandler — manifestevents += "overlay.input.available"+bitty.events.subscribe("overlay.input.available", function() if session.open then M.pump() end end)+ unit spec (nudge while open pumps+repaints; while closed no-op; trailing nudge after RELEASED never resurrects) + headed WS5 acceptance per [ux] Host pump driver for overlay capture input (buffer-arrival) #2007. Suggested labels:feat,area:plugins,P1, milestonev0.1.0, Part of bitty#1972 / closes the composer half of bitty#2007.Leave #1972 OPEN until the composer nudge-subscription lands + headed acceptance passes.
Xuepoo commentedon Oct 14, 2026
Verified complete on origin/main. Host half: crates/bitty-terminal/src/terminal_app.rs:1269 (deliver_overlay_input_available called on the drive_tick cold path, ordered after deliver_overlay_released) and :1679 (fn definition); event kind registered at crates/bitty-plugin-host/src/event.rs:225 (EventKind::OverlayInputAvailable) with declared-kind gating (redaction.rs:225); covering tests at crates/bitty-runtime/tests/overlay_capture_api.rs:846 and crates/bitty-terminal/src/tests.rs:1544 (released-before-input.available ordering). Composer half: composer#15 (commit 19de526, scene chrome + input pump) and composer#17 (commit eb05a8fc, subscribe overlay.input.available nudge, closes composer#16). Scene chrome + queued-capture input pump both landed. Closing.
Xuepoo commentedon Oct 14, 2026
CTX-1215 plugins-recon (investigation only, no code). Post-close verification of the plugins-side remainder.
Bitty-side DONE (this issue is CLOSED, confirmed)
overlay.input.availableregistered, cold-tickdeliver_overlay_input_available(), declared-kind gating.overlay.input.availablesubscription: composer#17 (merged as eb05a8f, closes composer#16) — manifestevents += "overlay.input.available"+bitty.events.subscribe("overlay.input.available", ...)+ unit specs. Verified present on composer remote main today (manifest event + init.lua:1164 subscribe).Exact plugins-side remainder: submodule pin bump (NOT landed)
bitty-pluginsindex pin forplugins/composeris still 2762e34 (pre-#15, pre-#17) — remote composer main is eb05a8f. So thebitty-pluginscheckout/registry does not yet ship the #15 chrome fix or the #17 nudge subscription. Remainder is a pin-bump PR in thebitty-pluginsrepo (owning jurisdiction): advance theplugins/composerpointer to >= eb05a8f (mainline, satisfies the reachable-from-mainline rule), refreshmanifest_hashinregistry/official/composer.tomlper the registry refresh procedure, run the registry gates. No Lua code to write — the implementation already exists upstream.Proposed scope
chore(+ registry), size XS. No manifest/compat changes (composer#17 keptbitty >=0.0.21,<0.1,plugin-api ^1.0).New bitty-plugins issue needed?
Suggested NO — a pin-bump task/PR against the existing
composerregistry entry suffices; no new tracking issue. Left for the commander + owning jurisdiction to schedule.