From a954c5047f71dc06619b853358dba7b517b1b1bc Mon Sep 17 00:00:00 2001 From: cjkas Date: Fri, 16 Oct 2026 22:49:17 +0200 Subject: [PATCH] docs: close the shade behaviour reconcile (Q24, Q25) Co-Authored-By: Claude Opus 5.5 --- docs/SHADE_BEHAVIOUR_PLAN.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/SHADE_BEHAVIOUR_PLAN.md b/docs/SHADE_BEHAVIOUR_PLAN.md index 8871259..cb752cd 100644 --- a/docs/SHADE_BEHAVIOUR_PLAN.md +++ b/docs/SHADE_BEHAVIOUR_PLAN.md @@ -1,6 +1,6 @@ # Plan: deepen the shade behaviour -**Status:** design settled (see "Decisions"). PR A is #46. PR B (`refactor/shade-behaviour`) is built: the behaviour is in `ShadeBehaviour`, pinned by `test_shadebehaviour`. The reconcile order is the open question (below). +**Status:** done, apart from the device runs. PR A is #46 and PR B is #47 (the behaviour is in `ShadeBehaviour`, pinned by `test_shadebehaviour`). The reconcile fixes Q18–Q22 are one PR each, stacked on #47. Q23 is deferred and Q24 is left for later. **Written:** 2026-10-16, on top of `refactor/split-transports` (PR #44, the top of the LoopQueue stack #40–#44, which is not yet merged or run on a device). Line numbers refer to that branch. **Start here:** read [GLOSSARY.md](../GLOSSARY.md), [ADR-0002](adr/0002-loop-task-is-the-only-writer-of-the-shade-model.md) and [LOOP_QUEUE_PLAN.md](LOOP_QUEUE_PLAN.md) first. Their decisions are not reopened here. @@ -84,14 +84,14 @@ The decisions are the user's. Each question comes with a recommended answer, and ### Still open -- **Reconcile: what is decided first, and in what order.** The candidates, each pinned by a "today:" test in `test_shadebehaviour` unless marked: +- **Reconcile.** Every candidate is now fixed, deferred or left for later (Q17–Q24). Each was pinned by a "today:" test in `test_shadebehaviour` unless marked: - ~~`settingPos` is never cleared on a lift arrival, so a later step also sends a stop.~~ Fixed (Q18). - ~~Up and My on tilt-only shades differ between the web, a remote and a group.~~ Fixed (Q22). - An integrated tilt sent to a lift target without a tilt turns its slats back with an Up after the stop (`test_today_integrated_tilt_turns_back_after_a_lift_target`). Deferred (Q23). - ~~A remote step uses the step size this shade last *sent*.~~ Fixed (Q19). - ~~A group's SunFlag or Flag doesn't make other groups work their flags out again.~~ Fixed (Q20). - - The self-echo (Q5) and merging group commands into the frame rule (Q8). - - `lastFrame` doing two jobs (the Q6 revisit). + - The self-echo (Q5) and merging group commands into the frame rule (Q8). Possible later (Q24). + - `lastFrame` doing two jobs (the Q6 revisit). Possible later (Q24). - ~~The 500 ms long-press deadline isn't wrap-safe.~~ Fixed (Q21). ## Constraints @@ -165,3 +165,5 @@ The decisions are the user's. Each question comes with a recommended answer, and - **Q22. A tilt-only shade's lift is pinned at 100 on every path** (web, remote, group; Up, Down, My, idle or moving), and those commands act on the tilt only. Before, the remote and group My paths and the web's My while moving left a lift that something had moved, and `tick` then simulated it travelling. `test_tilt_only_lift_stays_down_whatever_the_source` checks the 18 combinations. - **Q23. Integrated tilt turning back: deferred.** No integrated-tilt motor is at hand to watch, and reconcile only changes what has been checked on a real motor. The behaviour stays, still labelled "today:", until someone with such a shade can say whether the turn-back is clean. +- **Q24. The structural changes are left for later:** dropping the self-echo, merging group commands into the frame rule, and splitting `lastFrame`'s two jobs. None of them fixes anything a user would notice, each touches every command path, and the behaviour they would move is now pinned by tests, so they can be picked up any time. +- **Q25. One PR per fix,** stacked on #47, each run on a device before it merges.