[HANDOFF] feat: Node action events (SUPERSEDED — harvest + close) - #233
Closed
Yona-Appletree wants to merge 7 commits into
Closed
[HANDOFF] feat: Node action events (SUPERSEDED — harvest + close)#233Yona-Appletree wants to merge 7 commits into
Yona-Appletree wants to merge 7 commits into
Conversation
…roto 5
Two new WireNodeCommand variants riding the runtime node-command channel
(docs/adr/2026-07-27-runtime-node-command-channel.md growth policy):
ButtonEvent { Click | Press { press_id, ttl_ms } | Release { press_id } }
and OutputTestPattern { Clear | Solid { r, g, b }, ttl_ms }. Playlist's
exhaustive match gains a wildcard reject arm (normal data-level rejection
for unsupported commands). Runtime implementations follow in later
commits.
Plan: lp2025/2026-07-31-1025-node-actions
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
OutputTestPattern handling on OutputNode: Solid stores (rgb, expires_at) — rejected before a first frame establishes the channel extent; consume skips the graph resolve entirely while the pattern holds and repaints the last-established samples; expiry falls through to the normal resolve the same frame (no black frame); Clear is idempotent. Re-send replaces and renews atomically (TTL-renewal principle, default 2000 ms). Plan: lp2025/2026-07-31-1025-node-actions Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… set ButtonEvent handling on ButtonNode: clicks queue and phase one produce at a time; sustained presses live in a fixed 4-slot set keyed by client press_id, renewed by re-send and swept against the produce clock (deadline stamped on first produce — handle_command's frame clock is a different domain). Effective pressed = hardware OR click OR any active press; down/held/up edges derive from changes in effective state, so overlapping sources add no spurious edges and neither source releases the other. Edge sequence is now node-owned: with two sources feeding one logical button, forwarding the hardware event's own sequence could collide on (id, seq) and defeat consumer dedup. Plan: lp2025/2026-07-31-1025-node-actions Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ButtonEventOp / OutputTestPatternOp copy the playlist-activate dispatch shape (NodeId resolved at dispatch time, Accepted quiet + verdict-chase, Rejected as warning notice) through a shared dispatch_node_command helper. New hand-built faces: ButtonFace's windowed simulate-press control (tap<300ms → Click; hold → Press + 1s renewals, Release on pointer-up, pointer-capture, TTL-only teardown) and OutputFace's test-pattern toggle (solid white + 1s renewals while on, Clear on off, epoch-guarded loop). Held state wears the live family, pattern-on wears attention — never violet (bound/bus) or green (good/valid), pinned by unit tests. Stories for both faces; baselines stay CI-captured. Plan: lp2025/2026-07-31-1025-node-actions Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Captured in the pinned CI environment by run: https://github.com/light-player/lightplayer/actions/runs/30672524955
Contributor
CI refreshed the story baselines on this branchThe Review every PNG in the PR's Files changed view (swipe / onion-skin). |
Gate feedback restyle: the button face's control becomes a knob-family momentary push-button — housing ring, radial-gradient cap that depresses under the pointer, live-blue ring only once the hold is real — labeled just "Press" rather than "Simulate press"; section label "controls". Superseded by the ephemeral/debug-slots design (2026-08-01): the button half of node-actions is punted to the future input initiative. Committed so the exploration is not lost. DO NOT MERGE this branch. Plan: lp2025/2026-07-31-1736-ephemeral-slots Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Captured in the pinned CI environment by run: https://github.com/light-player/lightplayer/actions/runs/30708165875
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.












UNFINISHED / SUPERSEDED — DO NOT MERGE. This branch holds a design
direction that was replaced on 2026-08-01. It is kept open only as a
harvest source; close it once the harvest below has landed elsewhere.
Plan: lp2025/2026-07-31-1736-ephemeral-slots
Path: ~/.photomancer/planning/lp2025/2026-07-31-1736-ephemeral-slots/plan.md (to be written)
Handoff: ~/.photomancer/planning/lp2025/2026-07-31-1736-ephemeral-slots/2026-08-01-0926-handoff.md
Why it is superseded
ButtonEventwas the wrong injection point: record/replay (the heart ofthe input story) needs injection at the input source layer so studio
presses, replays and real fingers share one recordable pipe.
slot (
OutputDef.test_pattern, a bool) under the newly ratified slottaxonomy: events → the runtime command channel; ephemeral state →
Debug slots. No wire change is needed, so
WIRE_PROTO_VERSIONmust goback to 4 — the bump on this branch must not land.
Harvest before closing
lp-core/lpc-engine/src/nodes/output/output_node.rs@25c3581f3— thegraph-bypass logic in
consume(skip the resolve, repaint thelast-established extent, publish through the shared
publish_channel_buffer, no black frame on release), itsFakeResolvertest harness and 9 tests. Recast to read a
test_patternbool from theeffective def each frame instead of holding command state. Everything
TTL /
press_id/ renewal related is dead.What is on the branch (all superseded)
47bb38627wire:ButtonEvent+OutputTestPattern, proto 4→5935a5321aengine: synthetic button events (click queue, TTL'd press set)25c3581f3engine: output test-pattern bypass ← harvest sourceeb3250c16studio: ops + facesc3a09bb59bot: story baselines2a67f504bstudio: skeuomorphic Press restyle (gate feedback)CI was green through
eb3250c16; checks on the newest commit were queuedand not watched.
🤖 Generated with Claude Code