feat(steamdeck): consume deck-pose and deck-slice as flake inputs #925

Merged
lytedev merged 1 commit from deck-pose-flake-inputs into main 2026-08-04 16:08:50 -05:00
Owner

Extracts the markerless pose-input program out of this repo into two standalone repositories, and reduces this repo's share to flake inputs plus host wiring.

  • deck-pose — the daemon, the lyte.deck-pose NixOS module, its docs, and the phantom-gesture defect. Owns the wire protocol, now written down as an explicit contract in its doc/protocol.md.
  • deck-slice — the game. Pins deck-pose as a flake input, and uses it for checks.protocol-drift.

Why

This work sat on the unmerged deck-pose-wip branch (#915, ~10k lines). A host runs exactly one generation, so every deploy from main removed deck-pose from the Deckmain did not know it existed. That already happened once. Reduced to two inputs, this side is small enough to merge, after which the Deck keeps its configuration.

History

Split with git-filter-repo, so the original commits survive in both repos (17 and 12 respectively) — they carry the root-cause writeups (normalised-coordinate One Euro constants, int8 being 12x slower than float32, the writeText coercion, the %t-vs-/run/user/1000 socket ownership bug, the collapsed-interval hand speed). A single import commit would have thrown those away for no gain.

The new risk, and what guards it

The protocol is a cross-repo boundary now: a daemon change no longer appears in the same diff as the game consuming it, and the failure mode is silent — the game's match stops matching and the feature quietly does nothing. So deck-slice's checks.protocol-drift reads the message types and event kinds the pinned daemon can emit out of its source and fails if the game names none of them. Running it found five kinds the game never mentioned; all are ignored deliberately, and main.gd now records each and why.

Verified

  • nix build .#nixosConfigurations.steamdeck.config.system.build.toplevel — green, including deck-pose's cargo test against this fleet's nixpkgs-unstable rather than the 26.05 its own CI pins.
  • nix build + nix flake check green in both new repos from clean clones.

Needs a decision

Both new repos are private, so the inputs are pinned over git+ssh:// — an anonymous git+https fetch 404s and nix has no credentials to offer. A CI runner without the forge key cannot evaluate the steamdeck host. Making both public (as nixos-deckmode already is) and switching to git+https removes that; it is a one-line change in three places once the repos are flipped.

#915

Supersedes it — close without merging once this lands.

Extracts the markerless pose-input program out of this repo into two standalone repositories, and reduces this repo's share to flake inputs plus host wiring. - **[deck-pose](https://git.lyte.dev/lytedev/deck-pose)** — the daemon, the `lyte.deck-pose` NixOS module, its docs, and the phantom-gesture defect. **Owns the wire protocol**, now written down as an explicit contract in its `doc/protocol.md`. - **[deck-slice](https://git.lyte.dev/lytedev/deck-slice)** — the game. Pins deck-pose as a flake input, and uses it for `checks.protocol-drift`. ## Why This work sat on the unmerged `deck-pose-wip` branch (#915, ~10k lines). A host runs exactly one generation, so **every deploy from `main` removed deck-pose from the Deck** — `main` did not know it existed. That already happened once. Reduced to two inputs, this side is small enough to merge, after which the Deck keeps its configuration. ## History Split with `git-filter-repo`, so the original commits survive in both repos (17 and 12 respectively) — they carry the root-cause writeups (normalised-coordinate One Euro constants, int8 being 12x slower than float32, the `writeText` coercion, the `%t`-vs-`/run/user/1000` socket ownership bug, the collapsed-interval hand speed). A single import commit would have thrown those away for no gain. ## The new risk, and what guards it The protocol is a cross-repo boundary now: a daemon change no longer appears in the same diff as the game consuming it, and the failure mode is silent — the game's `match` stops matching and the feature quietly does nothing. So deck-slice's `checks.protocol-drift` reads the message types and event kinds the **pinned** daemon can emit out of its source and fails if the game names none of them. Running it found five kinds the game never mentioned; all are ignored deliberately, and `main.gd` now records each and why. ## Verified - `nix build .#nixosConfigurations.steamdeck.config.system.build.toplevel` — green, including deck-pose's `cargo test` against this fleet's nixpkgs-unstable rather than the 26.05 its own CI pins. - `nix build` + `nix flake check` green in both new repos from clean clones. ## Needs a decision Both new repos are **private**, so the inputs are pinned over `git+ssh://` — an anonymous `git+https` fetch 404s and nix has no credentials to offer. **A CI runner without the forge key cannot evaluate the steamdeck host.** Making both public (as `nixos-deckmode` already is) and switching to `git+https` removes that; it is a one-line change in three places once the repos are flipped. ## #915 Supersedes it — close without merging once this lands.
feat(steamdeck): consume deck-pose and deck-slice as flake inputs
All checks were successful
/ check-format (push) Successful in 11s
/ build (push) Successful in 6m25s
6c138d00e1
The markerless pose-input daemon and the slice game it drives are now their
own repositories, and this wires them in:

  https://git.lyte.dev/lytedev/deck-pose    daemon + the lyte.deck-pose module
  https://git.lyte.dev/lytedev/deck-slice   the game

They used to live here, as ~10k lines on the unmerged deck-pose-wip branch
(PR #915). Unmerged had a concrete cost: a host runs exactly one generation,
so every deploy from main removed deck-pose from the Deck, because main did
not know it existed. That happened. This repo's share is now three small
pieces — two inputs, an overlay line each, and the host wiring — which is
mergeable today, after which the Deck keeps its configuration.

Both are pinned over ssh rather than https because the repos are private:
an anonymous git+https fetch 404s and nix has no credentials to offer, so
these inputs need the forge key to resolve (a CI runner without one cannot
evaluate steamdeck). Making both public, as nixos-deckmode already is, and
switching to git+https removes that requirement — worth doing.

The overlays are applied (rather than taking the input flakes' prebuilt
packages) so both build against THIS package set. Taking the prebuilt
outputs would put a second nixpkgs closure — an entire second onnxruntime
and godot — onto a handheld for no benefit. steamdeck.nix therefore also
sets lyte.deck-pose.package explicitly, because the module's own default
pins deck-pose's build and would undo that.

Verified: nixosConfigurations.steamdeck builds, including deck-pose's
cargo test against this fleet's nixpkgs-unstable rather than the pinned
26.05 its own CI uses.

issues/open/deck-pose.md stays here as the program's home — it is the plan
and the open questions, not the code — and now points at where each piece
went. Its status lines are corrected to match reality: the game is played
on the Deck with an OBSBOT Meet 2, so 'no consumer yet' and 'untested on
the Deck' were false. Open Q1 is narrowed from 'does it hold' to 'the
latency numbers have still never been captured on the target', and Q2 is
answered.

The protocol is a cross-repo boundary now, which is the real risk this
split introduces. It is written down in deck-pose's doc/protocol.md, and
deck-slice's checks.protocol-drift fails when the game has never heard of
a message type the pinned daemon can emit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CtnYWFX9eMBH7oK3gmcMMs
lytedev deleted branch deck-pose-flake-inputs 2026-08-04 16:08:51 -05:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lytedev/nix!925
No description provided.