Repository navigation
Cycle 5 research gate: select the next evidence-backed improvement #29
Description
Goal
Complete Cycle 5 as a bounded, evidence-led cycle: refresh AI and gaming workflow reports, audit current OpenController ownership and gaps, rank candidates, then select one measurable improvement or record a no-build decision. End with independent review, required checks, merge, roadmap closeout, and a Cycle 6 research gate.
Cycle 4 implementation and closeout are complete: issue #22 merged in PR #25 at 8eb744c, and PR #30 closed gate #23. This gate is active.
Fresh source log (2026-10-04)
| Source/date | Direct observation | Relevance and limit |
|---|---|---|
| Clash Royale agent report on HN #46297477, 2025-12-17 | Builder reports about 7 seconds per screenshot/vision/decision/tool cycle; staggered three agents produced a move every 2–3 seconds and an automatic opening action established tempo. | Timed game agents may benefit from reusable low-overhead actions, but controller plumbing cannot speed model reasoning. One self-reported project. |
| T-Rex Runner attempt on HN #43963570, 2025-05-12 | Author says a Claude/Playwright attempt failed because latency was too high. | One attempt, no timing breakdown; cannot distinguish model, tool, browser, or input latency. |
| OpenAI Developer Community: Pokémon Silver with Computer Use, 2026-09-26 | User says setup, navigation, repeated dialogue, and simple movement consume Computer Use allowance and asks for a lower-cost control mode. | One product request; may not transfer to other agents or controller SDKs. |
| Steam for Linux #13665, 2026-09-29 | Steam Machine reporter says Steam recreates its virtual pad on app launch, leaving already-running apps with stale handles until restart. | Detailed upstream Steam lifecycle report; no OpenController ownership. |
| Steam for Linux #13418, 2026-07-15 | Steam Deck user says returning from Discord leaves a game without controller input until the game restarts. | One host lifecycle report, not an SDK defect. |
| Jellyfin Web #8379, 2026-08-19 | Two DS4 devices overwrite one shared gamepad state, making TV navigation erratic. | Independent application-level state ownership example. |
| Cockpit #3088, 2026-09-22 | ROV operators ask that a current primary joystick retain control when another gamepad connects; current code forwards all devices. | Adjacent non-gaming multi-input ownership request. |
| Selkies #431, 2026-09-29; ROMM #46, 2026-09-17 | Same reporter cross-posted a browser/virtual-slot conflict and said reinitializing Game Mode restored input; reproducibility was uncertain. | Counted as one report, not two. Host/browser ownership remains outside this SDK. |
| PortareOS #436, 2026-09-29; DuelBox-Web #133, 2026-08-19; Chrome proposal #1313, 2026-08-14 | One hardware report estimates a polling contribution, one project requests a browser/input-family latency harness, and one Chrome proposal describes event-driven input. | Sparse adjacent evidence; no OpenController-specific latency failure or adoption proof. |
These are dated public reports and requests, not prevalence estimates. External host and application failures are not evidence of defects in OpenController.
Coverage limits
- HN Algolia and OpenAI Discourse JSON were reachable for targeted searches. Reddit, Google search, and SDL Discourse search returned HTTP 403.
- Steam Community search worked, but the relevant results found were old and low value for this decision.
- GitHub issue/API searches covered Steam for Linux, SDL-related candidates, Selkies/ROMM, Jellyfin Web, Cockpit, Tanks, and latency seeds. Search was targeted, not exhaustive.
- No clear current recurring AI-agent-specific controller problem was found. No result count, comments, or reactions are used as a prevalence estimate. Accessibility-community coverage remains open.
Repository audit and ranking
Audit target: integrated main at 62e8b95, including the core ControllerHub, browser exports, native bridge identity, tests, latency fields, and current README. The ControllerHub README called hub.createController, which the public class does not implement; it exposes add/get/has/list/states/disconnectAll. Existing tests covered two dry-run controllers with distinct IDs and profile entries but did not assert separate state, duplicate-ID rejection, or reuse after disconnectAll. The SDK does not discover physical devices or own browser/OS slot identity.
| Rank/decision | Candidate | User value and repository fit | Cost/risk and confidence |
|---|---|---|---|
| Selected | #27 ControllerHub logical ID contract | Direct first-party docs/API mismatch plus missing duplicate-ID and lifecycle tests. External reports show a related ownership-conflict category but do not prove prevalence or an OpenController defect. | Low/medium, about 1–2 days. High confidence in the repository mismatch; low confidence in prevalence. |
| Deferred | #26 browser hardware routing check | A real-browser routing guide may help, but current-main audit found no validated host/browser/hardware path. | Medium/high; one adjacent project QA report and manual device requirements. |
| Deferred | #28 input latency at explicit SDK boundaries | Some status latency is supplied rather than measured; no end-to-end SDK boundary was established. | Medium; sparse adjacent evidence and clock/overclaim risk. |
Decision and implementation DAG
Selection: issue #27 corrected the README API example, added a typed runnable counterpart, made duplicate rejection cover concurrent additions and failed construction cleanup, explicitly asserted per-controller state isolation, tested ID reuse after disconnectAll, and documented caller-owned IDs plus the requirement to await additions before disconnectAll. It does not add physical discovery, automatic mapping, native adapter sharing, or host/browser reconnect claims.
Issues #26 and #28 remain deferred. Issue #27 closed when PR #32 merged; PR #31 records the decision. This gate now awaits its roadmap closeout. Cycle 6 gate #35 is open and blocked by both #29 and selected implementation #20.
flowchart TD
A[Cycle 4 closeout PR #30; gate #23 closed] --> B[Refresh public evidence]
B --> C[Audit main 62e8b95]
C --> D[Select #27; defer #26 and #28]
D --> E[Correct ControllerHub docs and test logical ID lifecycle]
E --> F[Independent review and required checks]
F --> G[Merge implementation PR stack]
G --> H[Roadmap closeout and Cycle 6 gate]
H --> I[Close Cycle 5 gate #29]
Checklist
- Refresh dated reports across AI/game-agent forums, HN, OpenAI Developer Community, Steam, GitHub projects, and related controller workflows; record Reddit, Google, SDL Discourse, Steam Community, and accessibility coverage limits.
- Record source dates, workflows, stated workarounds or absence, evidence strength, and limits; count the Selkies/ROMM cross-post once and make no prevalence claim.
- Audit current main, ControllerHub docs/code/tests, browser exports, native identity, and latency measurement boundaries.
- Rank candidates by user value, evidence strength, project fit, cost, and risk; select Fix ControllerHub docs and test logical ID lifecycle #27 and defer Verify controller routing with a user-run browser hardware check #26/Measure input latency at explicit SDK boundaries #28.
- Define the selected scope, acceptance, non-goals, test plan, and dependency before implementation.
- Delegate the decision record and implementation to gpt-6-luna agents in isolated worktrees; fetch at integration points. PR docs: record Cycle 5 research decision #31 records the research decision; PR fix(core): clarify controller hub logical ID lifecycle #32 implements the selected issue.
- Implement Fix ControllerHub docs and test logical ID lifecycle #27 in PR fix(core): clarify controller hub logical ID lifecycle #32; independent gpt-6-luna review found no blocker after fixes, GitHub CI passed, and the builder reports core tests (62/62), typecheck, runnable typed example, and full
release:checkpassing. Issue Fix ControllerHub docs and test logical ID lifecycle #27 closed on merge ate6d5769. - Merge the Cycle 5 roadmap closeout and close Cycle 5 research gate: select the next evidence-backed improvement #29. Cycle 6 gate Cycle 6 research gate: select and ship one bounded reliability improvement #35 and selected issue Preserve cleanup and failure context in native test #20 are open behind Cycle 5 research gate: select the next evidence-backed improvement #29; Cycle 6 research gate: select and ship one bounded reliability improvement #35 also depends on Preserve cleanup and failure context in native test #20.
Acceptance
- Current-main source evidence and code audit are linked and accurately scoped.
- One bounded issue is selected; deferred issues remain outside active work.
- Issue Fix ControllerHub docs and test logical ID lifecycle #27 tests and corrects the real ControllerHub API contract without claiming hardware identity or host behavior.
- The implementation is independently reviewed, required checks pass, and PRs docs: record Cycle 5 research decision #31/fix(core): clarify controller hub logical ID lifecycle #32 follow the dependency graph.
- The roadmap and next gate exist before Cycle 5 closes.
Activity