Repository navigation
Spec: an action sends exactly what was asked - #161
Merged
Merged
Conversation
Section 2 now states the rule once: a request sends the frames of the setting or action it names, nothing before them and nothing after them. Two kinds of frames belong to a request: the frames the camera's protocol defines for that one operation, and the stop of a continuing action nobody can end any more. Clients chain no second request. The switch to the static tracking mode that gimbal.move and gimbal.turn carried over from 0.13 is gone. The moves leave tracking.mode alone, touch no group, and are not refused while the tracking is on; what the camera does with a manual move while it tracks is the new camera item CAM-34. Migration notes, the CLI and the widget say that a client that wants the tracking off sends tracking.mode=static itself. Section 15.1 records the change after approval (row 88). The field ledger drops the static short command from both move rows. The W0 plan follows: fake-a only moves, touches nothing for a move, and the test that pinned the switch is replaced by one that pins one operation and an unchanged tracking mode. The plan's code was extracted and rebuilt (fmt, clippy -D warnings, every test); the regenerated description files and schema did not change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The daemon no longer stops a turn when the camera falls asleep or a keep:true turn at shutdown; the only stop it sends is the end the request set (a turn without keep:true lasts as long as its connection). Section 2 names that end, the unit-keeping yaw encoding of gimbal.turn and the preset rewind exception; 3.2 and track A drop the carried tracking switch; W3 drops the README lines about it; tracks B, C and D get checks for the one-request rule; CAM-7 no longer fixes its outcome; 15.1 row 88 lists every touched section and row 89 records the stops. W0 plan: protocol-2 rule 6 no longer reads as a camera promise; spec coverage names section 2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
preset.save without a name sends no rename frame and the daemon invents no "Preset <slot + 1>" (0.13 did). What the camera reports as the name of an unnamed preset is a camera item, CAM-35. A client may show its own placeholder for an empty name as display only and never writes it to the camera. Spec 2, 4.3, 4.4, 6.2, 9.1, 10.3, 12.2, 12.3, 14 and 15.1 (row 90), the field ledger row of preset.save, and the W0 plan: both fakes store an empty name for an unnamed preset (their own behaviour), and a new test pins one act without a rename and the stored name. The plan's code was rebuilt: fmt, clippy -D warnings and 185 tests pass; the new test fails when the default name is put back; the generated files did not change. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
nofuturekid
force-pushed
the
docs/no-own-logic
branch
from
November 13, 2026 12:12
c4d0b75 to
6a34edc
Compare
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.
The principle
Spec section 2 now states it once: a request sends exactly what it names: the frames of that setting or action, nothing before them and nothing after them. The daemon never switches an automatic control or a tracking mode off on its own. What the camera then does is camera behaviour: the state shows it, and until it is recorded it is a camera item. The CLI and the widget never chain a second request to the one the user made. Every other place in the spec refers back to section 2.
The owner asked to keep the daemon free of logic of its own. The tracking switch carried over from 0.13 was such logic and contradicted section 2, so it is gone. Section 15.1 (new, "Changes after approval") records it as row 88.
Removed
gimbal.moveandgimbal.turnno longer switchtracking.modetostaticbefore they move. They send only the move, leave the tracking mode alone, and are not refused while the tracking is on. A client that wants the tracking off sendsset tracking.mode=staticitself, as its own request.gimbal.moveandgimbal.turnno longer list the short command16 02 00 00before the move frame.fake-a,gimbal.moveandgimbal.turnno longer settracking.mode=static, and theirtouchedis empty. The test "4.4: a move switches tracking to static" is replaced bya_move_while_tracking_sends_only_the_move, which pins the opposite: withtracking.mode=normal, each move reaches the fake as exactly one operation, the mode staysnormal, and nothing is touched. The assertion messages name spec 2.Added so that the rule can be checked
setcauses oneapplyper leaf, adocauses oneact, and nothing else reaches the fake.gimbal --pan/--tiltandgimbal rate(12.2), the CLI's "one request per command" (6.2), the widget chains nothing (12.3, 10.3 D), notes in the three gimbal parity rows, and one sentence in rule 6 ofdocs/protocol-2.mdin the W0 plan.Presets saved without a name
preset.savewithoutnamesends the preset and no name: no rename frame follows, and obsbot4linux no longer inventsPreset <slot + 1>(0.13 did). What the camera reports as the name of an unnamed preset is a new camera item, CAM-35 (stage A, CS-1). A client may show its own placeholder for an empty name, as pure display, and must not write it to the camera (CLI 6.2, widget 12.3). Migration note in 12.2; row 90 of 15.1; the field-ledger row ofpreset.savesends the rename frame only when a name is given. In the W0 plan both fakes store an empty name for an unnamed preset (their own behaviour, labelled so), and the new testa_preset_saved_without_a_name_gets_nonepins: one act and no rename, the stored name empty; with a name, the name is stored.Stops the daemon sent on its own
Also removed (row 89): the stop when the camera falls asleep while a turn runs, and the best-effort stop of a
keep:trueturn on daemon shutdown. The client that started a turn can still end it, andgimbal.stopworks from any connection and after a restart. 0.13 sent neither.What stays, and why
gimbal.turnwithoutkeep:truelasts as long as its connection, so its stop is sent when that connection closes, a daemon shutdown included (5.6, 5.9).gimbal.turnunder mirror xor invert: it is the encoding in the one turn frame that keeps "pan positive = the camera turns to its left" true for bothgimbal.moveandgimbal.turn(4.2, 4.4). It is not a second command.hand.area_reset;power_on.start.modeand the start-pose actions write back;preset.deleteand ofview.save;Verification
rebuildworkspace (with the files the plan adds, and without stage G'slegacy/modules, which the plan's code does not use). This round was rebuilt:cargo fmt --check,cargo clippy --workspace --all-targets --locked -- -D warningsandcargo test --workspace --lockedpass, 185 tests (184 before the new one).scripts/regenerate.shproduced the description files (1875, 1875 and 289 lines) and the schema; the stale tests pass and nothing the plan says about them changed.fake-amakes the new test fail (left: "Preset 1",right: ""); putting the tracking switch back makesa_move_while_tracking_sends_only_the_movefail.Documentation only. The groundwork plan and the README are not touched.
🤖 Generated with Claude Code