import InfoBox from '../components/InfoBox.astro';
import PullQuote from '../components/PullQuote.astro';

Three small fixes landed around the same question: where does the game’s interface actually end? A physical keyboard changes an on-screen control, a development container depends on the computer hosting it, and a rapid series of taps can still belong to the browser instead of the game. None of these boundaries are inside the game engine, but all of them affect whether the game feels reliable.

## Make physical input visible

The on-screen keyboard already reacted to pointer presses, but typing on a physical keyboard left it still. I wanted the displayed key to acknowledge the input for players glancing down at the controls, and for the [scripted gameplay recordings](/posts/gameplay-recording-and-icons#script-the-demonstration-not-the-result) that drive the real keyboard through Playwright. The agent added one shared key-mapping path for keydown and keyup, including the control keys whose browser names differ from their labels in the game.

<InfoBox title="The visible contract">
  Pressing a physical letter, direction key, backspace, or enter now highlights the same button a
  pointer would press. Three focused tests joined a suite of 1,217 passing tests, and the rendered
  class was checked in the development server rather than inferred from component state alone.
</InfoBox>

## Put the fix on the side that owns the problem

The same boundary rule applied to the workshop. Long-running development sessions stopped when the host computer slept, and nothing inside its container could prevent the host from making that decision. The solution therefore runs on the host and follows the container’s lifetime. Since the implementation environment could not exercise the real host command, the agent tested the lifecycle with controlled stand-ins: start, duplicate-start protection, normal shutdown, and startup failure. A link to the development blog also joined the game footer in this pass, making the connection visible from the product rather than only from repository history.

## Claim the browser gesture explicitly

The final edge appeared when two players on iOS repeatedly tapped backspace and Safari interpreted the rhythm as a zoom gesture. The code change was one CSS declaration on the shared key style, but the important decision was broader: keyboard buttons are manipulation controls, so the page should say which touch behavior belongs to them instead of relying on browser heuristics. The full suite reached 1,218 passing tests, Chromium confirmed the computed behavior, and typing still worked through the rendered keyboard. The next useful pass is to keep looking at these ownership seams, especially where device behavior can override an interface that seems complete on a desktop.

<PullQuote>A boundary bug is often fixed on the side that actually owns the boundary.</PullQuote>