Repository navigation
Cycle 6 research gate: select and ship one bounded reliability improvement #35
Description
Goal
Run Cycle 6 as a bounded research/build/merge loop: use fresh AI-agent and gaming reports, audit current OpenController behavior, select one supported code slice, build it in an isolated worktree, stack only when there is a real dependency, independently review the integrated diff, pass checks, merge, update the roadmap, and open the next research gate.
Cycle 5 closeout PR #36 merged at f44fe79, closing gate #29 and milestone 4. Selected issue #20 merged in PR #38 at f20aab9 and closed. This gate closed through Cycle 6 roadmap closeout PR #43 at 66eed51. Cycle 7 research gate #37 is open in milestone 6 and is now unblocked.
Cycle 6 source log (2026-10-04)
| Source/date | Direct observation | Fit and evidence limit |
|---|---|---|
| Codex #34316, 2026-07-20 | User says key-down and key-up arrive back-to-back, so a ZX Spectrum emulator that polls the key matrix often misses input; requests held input or a duration. | Supports clearer hold and release behavior. One user report about keyboard input in another product. |
| Codex #44074, 2026-09-09 | A user measured 1.2–3.8 ms key taps that did not move a browser game and requests bounded holds plus release on cancellation/failure. A second report in the same issue says Unity missed a held drag across frames and requests a 2–3 frame hold. | Concrete reports in one thread; measurements are session-specific and not independent prevalence evidence. |
| Codex #35510, 2026-07-26 | Pygame did not receive Return although the input tool reported success; a commenter reports similar missing events in Satisfactory. | Shows a tool/target delivery gap in another product, not an OpenController defect. |
| Unity MCP #1408, 2026-09-21 | Feature request says an agent can observe Play Mode but cannot press a key or click controls. | Request rather than a failure report; keyboard/mouse injection is outside OpenController's current controller SDK. |
| SDL #16434, 2026-10-03 | A GameSir T3s Switch-mode device is detected on Linux but SDL rejects a calibration response; the Linux joystick interface still works. | Reproducible upstream protocol issue for one device; not SDK-owned. |
| SDL #16237, 2026-09-03 | A Betop controller emits motion events but SDL reports NaN/Inf sensor values; a commenter reproduces related data on another model sharing the driver identity. | Useful sensor-path example within one vendor/driver thread; no general prevalence claim. |
| Moonlight #2017, 2026-09-20 | An 8BitDo device is missing in Moonlight on macOS/SDL; reporter's SDL_JOYSTICK_MFI=0 workaround restores it in a minimal SDL program. |
Strong single-reporter reproduction, upstream SDL/MFi path. |
| Sunshine #5759, 2026-09-19 | A Windows streaming host blocks input for about five seconds while retrying a missing virtual-device broker; installing the broker reduced the delay. | Detailed host startup report; outside OpenController's CLI. |
| Ebitengine #3854, 2026-10-03; Steam for Linux #13601, 2026-09-10 | Ebitengine developer requests a rumble-availability query; Steam user reports working controls but no rumble through one SteamOS path. | Adjacent evidence for truthful capability discovery; neither proves an OpenController issue. |
| Defold #13278, 2026-09-21 | Xbox Series Start/Back actions are absent with Defold's default gamepad database while raw buttons remain visible; disabling that database restores the actions in the tested setup. | Detailed engine mapping issue with a workaround; outside this SDK's game-consumer layer. |
| Steam for Linux #13343, 2026-06-25 | A player reports that controls/layout stop working during long sessions in two games; restart is the only workaround found. | One reporter plus one similar report; cause remains uncertain. |
These are public examples, not a prevalence study. The Codex key-duration reports are evidence about Computer Use surfaces, not proof of a missing OpenController timed-input feature. OpenController already has timed press, persistent setButton, explicit release, safety limits, and adapter capability metadata. Its duration promises adapter sequencing, not frame-observed or game-acknowledged timing.
Coverage limits
- GitHub issue bodies and targeted APIs were reachable. Reddit endpoints continued returning HTTP 403; SDL Discourse and Godot forum searches also returned 403; Anthropic community search was unreachable through the network tunnel.
- Steam Community search was reachable, but relevant results were mostly old (2022–2024). HN/OpenAI forum sources were reachable; they did not add a stronger current controller-SDK issue in this harvest.
- Search focused on Steam/Deck/Linux, SDL, Moonlight/Sunshine, Ebitengine, Godot, Defold, Unity MCP, and AI computer-use reports. It was targeted, not exhaustive. Reactions and comments are attention signals, not affected-user counts. Accessibility coverage remains incomplete.
Repository audit and ranking
Audit basis: current main e6d576987c9085a3377ce0e10791f56ce1994ada; the selected CLI and bridge paths are unchanged from the audit snapshot c0b1a2f.
| Decision | Candidate | Repository fit and evidence | Cost/risk |
|---|---|---|---|
| Selected | #20 native test failure cleanup | nativeTestCommand creates a controller, runs press/move/trigger/neutral sequentially, then disconnects only on the happy path. CLI tests cover plan construction but not failures after connection. Codex #44074 asks for release on failure/cancellation in an adjacent input product; it does not prove this defect caused a user report. |
Low/medium, about 1–2 days. Preserve the primary action error if neutral/disconnect cleanup also fails. |
| Deferred | #33 configured adapter capability metadata | Bridge adapters can advertise touchpad/gyro/profile-HID output even when options suppress those payloads. This is a separate owner/test surface from #20; adjacent Ebitengine/Steam/SDL reports do not show the OpenController mismatch caused those failures. | Low/medium. Keep adapter output capability distinct from OS/game support. |
| Deferred | #34 negative action durations | Safety rejects over-limit durations but not negative ones; negative timed presses skip auto-release. Zero-duration persistent input is intentional and must remain supported. No source directly reports this edge case. | Low. Preserve zero and positive behavior while rejecting values below zero. |
| Deferred | #21 host/game compatibility matrix | Overlaps existing encoder conformance docs and native doctor; collecting meaningful host/game rows requires hardware and consumer environments. | Medium/high; avoid a matrix of untested claims. |
Decision and DAG
Select #20 only. Keep its scope to making opencontroller native test clean up after a connected controller even when an action fails, preserving the primary error if cleanup also fails, and reporting success only after cleanup. Do not fold bridge capability metadata, duration validation, OS/game compatibility, keyboard/mouse injection, or host fixes into this slice.
flowchart TD
A[Cycle 5 gate #29 and closeout] --> B[Cycle 6 gate #35]
B --> C[Implement selected native-test cleanup #20]
C --> D[Independent review and required checks]
D --> E[Merge implementation PR]
E --> F[Roadmap closeout and Cycle 7 research gate]
F --> G[Close Cycle 6 gate #35]
The issue dependency graph must encode both #29 blocks #35 and #20 blocks #35. Deferred issues #33 and #34 remain outside the active milestone.
Checklist
- Refresh dated AI/computer-use and gaming/controller sources; record workarounds, confidence, duplication, and access gaps.
- Audit timed input, capability metadata, native CLI cleanup, and the existing deferred compatibility candidate against current code.
- Rank candidates by first-party gap, user value/evidence, project fit, cost, and risk; select Preserve cleanup and failure context in native test #20 only and defer Track tested and unverified host and game compatibility #21, Align native adapter capabilities with configured bridge outputs #33, and Reject negative controller action durations #34.
- Define the selected scope, failure cases, test plan, non-goals, and DAG before implementation.
- Complete Cycle 5 roadmap closeout and close Cycle 5 research gate: select the next evidence-backed improvement #29 in PR docs: close Cycle 5 and open Cycle 6 gate #36.
- Implement Preserve cleanup and failure context in native test #20 in an isolated worktree with focused failure-injection tests; PR fix(cli): preserve cleanup errors in native test #38 merged and closed the issue.
- Independently review exact head 2a8a5f2; CI test passed and required checks passed. CodeRabbit reported a rate-limit note.
- Update the roadmap and open Cycle 7 gate Cycle 7 research gate: expand the evidence-backed parallel build backlog #37 in PR docs: close out cycle 6 and open cycle 7 gate #43; close Cycle 6 research gate: select and ship one bounded reliability improvement #35 only after implementation and closeout merge.
Acceptance
- The code audit is linked and accurate; outside reports are not presented as OpenController incidents.
- Preserve cleanup and failure context in native test #20 is the only selected Cycle 6 implementation; Track tested and unverified host and game compatibility #21, Align native adapter capabilities with configured bridge outputs #33, and Reject negative controller action durations #34 remain deferred.
- Native test failure paths attempt cleanup after successful connection and preserve the primary failure.
- Independent review, required checks, merge, roadmap closeout, and Cycle 7 gate are complete before Cycle 6 research gate: select and ship one bounded reliability improvement #35 closes.
Closeout (2026-10-05)
Cycle 6 selected #20 only; candidates #21, #33, and #34 remain deferred outside milestone 5. The CLI cleanup behavior and its user-visible combined error details are documented in the merged implementation. External research reports remain context only and are not described as OpenController incidents. Project V2 creation remains blocked by GitHub integration permissions; the ongoing DAG uses milestones, labels, and issue dependencies.
Activity