Repository navigation
feat(actions): stop_project ActionCue, the authored end of an unattended show (869fhjdq5) - #35
Merged
Merged
Conversation
…ded show (869fhjdq5)
A stop_project ActionCue (cuems-utils >= 0.1.0rc17 carries the XSD value)
stops the show exactly as an operator STOP does. Every node reveals it;
the handler is pure and NodeEngine._action_result_sink sends the
controller a STATUS op {cue, run_seq} (nowait, like a follow message).
The controller validates it like _relay_follow (adopted sender, cue in the
project and of the right type, running, current run_seq), releases the
lock and runs stop_script: running=no, every cue 0, nodes re-arm. The
first valid message wins; the other nodes' messages are dropped at INFO.
The node never stops itself: a 3 s watchdog compares STOP/load receipts
and only logs when none arrived.
On the node the cue is a hard chain break: nothing after it is unrolled
at arrival and no go_at_end follow fires from it. Disabled, it is
transparent (rehearsal mode).
Two hardenings the unattended case needs: cue ADD/UPDATE operations are
ignored while the show is not running (a node's late start report after
a STOP could leave the stop cue at 1 or 100), and STOP restarts the arm
watchdog ("Re-arm after STOP stalled") so a failed re-arm is logged.
Removes the dead script_finished aggregator and _finished_nodes that
dec95e9 left on the controller (869fhjdp8). Requires cuemsutils >= rc17.
Tests: test_action_cue (stop_project, other project actions still
rejected), test_controller_stop_project (relay guards, ADD gate, arm
watchdog after STOP), test_node_stop_project (notify, watchdog, sink,
chain break), test_controller_gating cleaned. Targeted run on .111: 218
passed; the full suite runs when the rig window allows.
Design: cuems-RELATIONS Plans/2026-10-15-engine-stop-project-actioncue.md
…(869fhjdq5) CLAUDE.md: running=yes after the last cue is by design; the stop_project contract end to end, its journal lines, the chain break, the cue ADD gate and the arm watchdog after STOP. docs/unattended-playback.md: the two operator recipes (stop_project for play-once kiosks, play loop-back for attract loops), placement, rehearsal, the re-arm window, persistent auto-load and version requirements. docs/index.md links it.
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.
A
stop_projectActionCue is the authored end of an unattended show (museums, kiosks; ClickUp 869fhjdq5). When revealed, it stops the show exactly as an operator STOP does:running no, every cue reset to 0, nodes re-armed. The next GO plays from the top. The engine still never infers an end. After the last cue it keepsrunning = yesby design, which is now documented.How it works
NodeEngine._action_result_sinksends the controller a STATUS opstop_project {cue, run_seq}without waiting. It skips the send when a STOP or load is already pending, or when no run is in progress._relay_follow: adopted sender, cue in the project and of the right type, show running, currentrun_seq. It then releases the lock and callsstop_script. The first valid op wins; the other nodes' copies are dropped at INFO.go_at_endfires from it. A disabled stop cue is transparent, which gives a rehearsal mode.Hardenings shipped with it
running != yes. Before this, a node's late start report after a STOP could leave a cue at 1, then 100.stop_scriptrestarts the arm watchdog, so a failed re-arm logsRe-arm after STOP stalledinstead of every/gogetting a silent 409.Cleanup
script_finishedaggregator and_finished_nodes, left over sincedec95e9(ClickUp 869fhjdp8).Packaging
cuemsutils >= 0.1.0rc17(utils PR) for the schema value. The whole cluster must run the same engine, as with the follow relay.Docs
CLAUDE.mddescribes the contract and the journal lines.docs/unattended-playback.mdgives the operator recipes: stop at the end, theplayloop-back, rehearsal mode, an end-show button, versions.Tests
test_action_cue,test_controller_stop_projectandtest_node_stop_project;test_controller_gatingcleaned up.Rig
On test2 (controller + node01), drills D0–D8 all pass:
/gocueon the stop cue, the Auto-continue chain break, a simultaneous operator STOP and the kiosk flow.Details are in
cuems-RELATIONS/Plans/2026-10-15-engine-stop-project-actioncue.md§12. The plan was reviewed by Opus: APPROVE-WITH-CHANGES, with all findings folded in.