Skip to content

[HANDOFF] feat: Node action events (SUPERSEDED — harvest + close) - #233

Closed
Yona-Appletree wants to merge 7 commits into
mainfrom
claude/zen-fermat-2f4e82
Closed

[HANDOFF] feat: Node action events (SUPERSEDED — harvest + close)#233
Yona-Appletree wants to merge 7 commits into
mainfrom
claude/zen-fermat-2f4e82

Conversation

@Yona-Appletree

@Yona-Appletree Yona-Appletree commented Jul 31, 2026

Copy link
Copy Markdown
Member

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

  • Button half → punted to the future input initiative. Node-level
    ButtonEvent was the wrong injection point: record/replay (the heart of
    the input story) needs injection at the input source layer so studio
    presses, replays and real fingers share one recordable pipe.
  • Output test pattern → not a command at all. It becomes a Debug
    slot
    (OutputDef.test_pattern, a bool) under the newly ratified slot
    taxonomy: events → the runtime command channel; ephemeral state
    Debug slots. No wire change is needed, so WIRE_PROTO_VERSION must go
    back to 4
    — the bump on this branch must not land.

Harvest before closing

lp-core/lpc-engine/src/nodes/output/output_node.rs @ 25c3581f3 — the
graph-bypass logic in consume (skip the resolve, repaint the
last-established extent, publish through the shared
publish_channel_buffer, no black frame on release), its FakeResolver
test harness and 9 tests. Recast to read a test_pattern bool from the
effective def each frame instead of holding command state. Everything
TTL / press_id / renewal related is dead.

What is on the branch (all superseded)

  • 47bb38627 wire: ButtonEvent + OutputTestPattern, proto 4→5
  • 935a5321a engine: synthetic button events (click queue, TTL'd press set)
  • 25c3581f3 engine: output test-pattern bypass ← harvest source
  • eb3250c16 studio: ops + faces
  • c3a09bb59 bot: story baselines
  • 2a67f504b studio: skeuomorphic Press restyle (gate feedback)

CI was green through eb3250c16; checks on the newest commit were queued
and not watched.

🤖 Generated with Claude Code

Yona-Appletree and others added 5 commits July 31, 2026 14:55
…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>
@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

CI refreshed the story baselines on this branch

The validate-stories job detected drift and committed the fresh set: 6 changed
in c32cc7f.

Review every PNG in the PR's Files changed view (swipe / onion-skin).
Your local branch is now behind — git pull before pushing again.

Story Before After
studio__node__button-face__default__lg.png studio__node__button-face__default__lg.png@2a67f504bb studio__node__button-face__default__lg.png@c32cc7f929
studio__node__button-face__default__md.png studio__node__button-face__default__md.png@2a67f504bb studio__node__button-face__default__md.png@c32cc7f929
studio__node__button-face__default__sm.png studio__node__button-face__default__sm.png@2a67f504bb studio__node__button-face__default__sm.png@c32cc7f929
studio__node__button-face__held__lg.png studio__node__button-face__held__lg.png@2a67f504bb studio__node__button-face__held__lg.png@c32cc7f929
studio__node__button-face__held__md.png studio__node__button-face__held__md.png@2a67f504bb studio__node__button-face__held__md.png@c32cc7f929
studio__node__button-face__held__sm.png studio__node__button-face__held__sm.png@2a67f504bb studio__node__button-face__held__sm.png@c32cc7f929

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>
@Yona-Appletree Yona-Appletree changed the title feat: Node action events: button press/release/click and output test pattern [HANDOFF] feat: Node action events (SUPERSEDED — harvest + close) Aug 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant