v0.5.10: update changelog
This commit is contained in:
357
CHANGELOG.md
357
CHANGELOG.md
@@ -1654,3 +1654,360 @@ behaviour is reintroduced).
|
||||
**Outcome:** DONE (delivered as test ZIP v0.5.2; commit only after the owner
|
||||
confirms the ZIP works, especially that in BASIC the Check Alive is visible,
|
||||
read-only even with "Panel editable Date and Fee" on, and shown as a Date).
|
||||
|
||||
---
|
||||
|
||||
## 27. v0.5.3 - BASIC mode: build the will against "now" (not Check Alive) + clearer "cannot build" message
|
||||
|
||||
**Date:** 2026-07-04
|
||||
|
||||
**Goal (owner request, two related fixes):**
|
||||
|
||||
1. In BASIC mode, pressing Check (or rebuilding after a change) could refuse to
|
||||
(re)build the will and show "Balance is too low, or CheckAlive is in the
|
||||
past. Skipped", even with a healthy balance. Root cause found by tracing the
|
||||
real code with the owner: will construction filters heirs by
|
||||
`delivery_time > from_locktime`, and `from_locktime` is `date_to_check` = the
|
||||
Check Alive. In BASIC the Check Alive is hidden and NOT editable, so when its
|
||||
(fixed) default ends up LATER than the delivery time, every heir is excluded
|
||||
and the will cannot be built. The Check Alive must never govern construction
|
||||
in BASIC.
|
||||
2. The "Skipped" message itself was misleading: it claimed the Check Alive was
|
||||
"in the past", whereas the real blocking condition is the opposite - the
|
||||
Check Alive is LATER than the delivery time.
|
||||
|
||||
**What changed:**
|
||||
|
||||
- `bal/gui/qt/window.py` (`build_will`): the `from_locktime` passed to
|
||||
`get_transactions` is now `datetime.now().timestamp()` when
|
||||
`is_basic_mode()` is true, instead of `self.date_to_check` (the Check Alive).
|
||||
In BASIC an heir is kept as long as its delivery time is in the future,
|
||||
independently of the non-editable Check Alive. ADVANCED mode is unchanged
|
||||
(still uses `date_to_check`). Deliberately scoped to CONSTRUCTION only:
|
||||
`check_will_expired` / `check_amounts` / `is_will_valid` still use
|
||||
`date_to_check` exactly as before, keeping the change targeted and low-risk
|
||||
(the broad `date_to_check` rewrite tried in the discarded v0.5.4 line is NOT
|
||||
reintroduced).
|
||||
- Known, owner-accepted limitation: a delivery time equal to "today" (same
|
||||
instant) may still not build, because `now()` includes the current time of
|
||||
day. The owner will test this edge case separately.
|
||||
- `bal/gui/qt/dialogs.py`: replaced the misleading build-failure message with
|
||||
the owner-approved wording: "Could not build the will. Possible reasons: the
|
||||
Check Alive date is later than the delivery time (it must be earlier), the
|
||||
balance is too low, or the heirs' shares are below the minimum. Skipped".
|
||||
Text only; the message still appears under exactly the same condition
|
||||
(`build_will()` returned nothing) as before.
|
||||
|
||||
**Verification:**
|
||||
|
||||
- Full test suite: `266 passed`, plus the same 2 pre-existing, unrelated
|
||||
failures (stale `baltx_fees=100` expectation vs the v0.5.0 default of `20`).
|
||||
- `ruff`: no new errors (only pre-existing star-import noise and the
|
||||
pre-existing `F841` at dialogs.py, both present in clean v0.5.0).
|
||||
- Windows behaviour (especially the delivery-time-equals-today edge case) to be
|
||||
confirmed by the owner from the test ZIP.
|
||||
|
||||
**Outcome:** DONE (delivered as test ZIP v0.5.3; commit only after the owner
|
||||
confirms it works, in particular that in BASIC the will now (re)builds and the
|
||||
new message is clear).
|
||||
|
||||
---
|
||||
|
||||
## 28. v0.5.4 - BASIC mode: Check Alive fully ignored at the root (date_to_check = now())
|
||||
|
||||
**Date:** 2026-07-04
|
||||
|
||||
**Goal (owner-approved, Option B "fix the root"):** After v0.5.3 fixed only the
|
||||
build path, the owner hit "No Heirs" on Check even with heirs present, in BASIC
|
||||
AND ADVANCED. A full map of every Check Alive usage (see the analysis
|
||||
spreadsheet) showed the Check Alive is read in ~11 places, all through the SAME
|
||||
value `self.date_to_check`, and only some were mode-gated. Fixing them one by
|
||||
one was whack-a-mole. Option B fixes the single root instead.
|
||||
|
||||
**Root cause:** `self.date_to_check` (window.py, init_class_variables) was
|
||||
ALWAYS set to the Check Alive (threshold), in BASIC and ADVANCED. Every
|
||||
downstream check reads it: the build filter (get_locktimes/get_transactions),
|
||||
the heir count in check_willexecutors_and_heirs (source of "No Heirs" when
|
||||
delivery < Check Alive), check_will_expired, check_amounts, and the
|
||||
"locktime is lower than threshold" guard. In BASIC the Check Alive is hidden
|
||||
and not editable, so whenever its fixed value ended up later than the delivery
|
||||
time, these checks wrongly blocked the will.
|
||||
|
||||
**What changed:**
|
||||
|
||||
- `bal/gui/qt/window.py` (`init_class_variables`): in BASIC mode
|
||||
`self.date_to_check` is now set to `datetime.now().timestamp()` instead of
|
||||
the Check Alive. Every downstream check is therefore evaluated against "now"
|
||||
(i.e. the Check Alive effectively does not exist in BASIC), while the
|
||||
delivery time (locktime) is still fully enforced. ADVANCED mode is unchanged
|
||||
and keeps using the user-controlled Check Alive. This single change covers
|
||||
every point in the usage map at once.
|
||||
- `bal/gui/qt/window.py` (`build_will`): removed the now-redundant per-mode
|
||||
branch added in v0.5.3 (it computed now() locally for the build filter).
|
||||
Since `date_to_check` is already now() in BASIC from the root fix, build_will
|
||||
simply passes `self.date_to_check` again - one source of truth, no duplicate
|
||||
logic.
|
||||
- The CheckAliveError "you are alive -> postpone" guard was already skipped in
|
||||
BASIC and is unchanged.
|
||||
|
||||
**Why this differs from the discarded v0.5.4-era experiments:** the earlier
|
||||
broken attempt set date_to_check to `locktime - 2h` (odd and fragile). This
|
||||
sets it to plain `now()`, which is the natural meaning of "the Check Alive does
|
||||
not apply in BASIC".
|
||||
|
||||
**Verification:**
|
||||
|
||||
- Full test suite: `266 passed`, plus the same 2 pre-existing, unrelated
|
||||
failures (stale `baltx_fees=100` expectation vs the v0.5.0 default of `20`).
|
||||
- `ruff`: no new errors (only pre-existing star-import noise).
|
||||
- Windows behaviour to be confirmed by the owner from the test ZIP: in BASIC
|
||||
the "No Heirs" / "cannot rebuild" problems should be gone; ADVANCED unchanged.
|
||||
|
||||
**Outcome:** DONE (delivered as test ZIP v0.5.4; commit only after the owner
|
||||
confirms it works in BASIC and that ADVANCED is unaffected).
|
||||
|
||||
---
|
||||
|
||||
## 29. v0.5.5 - ADVANCED defaults to RAW (1y/30d); Check Alive hidden again in BASIC
|
||||
|
||||
**Date:** 2026-07-04
|
||||
|
||||
**Goal (owner request, two GUI changes):**
|
||||
|
||||
1. In ADVANCED mode, both the Delivery time and the Check Alive fields should
|
||||
default to the RAW editor (showing "1y" / "30d") instead of the calendar
|
||||
("Date") editor.
|
||||
2. In BASIC mode, hide the Check Alive field again everywhere (revert the
|
||||
v0.5.2 experiment that showed it read-only in the main window).
|
||||
|
||||
**What changed (all in `bal/gui/qt/widgets.py`, GUI only):**
|
||||
|
||||
- `BalTimeEditWidget.__init__` (default editor selection): in ADVANCED mode the
|
||||
default editor is now forced to RAW (index 0) for both fields (Delivery time
|
||||
and Check Alive both derive from this class). BASIC mode still forces the
|
||||
Date editor (index 1) and hides the Raw/Date selector, as before. Because the
|
||||
relative defaults already exist in plugin_base
|
||||
(`default_will_settings_relative` -> locktime "1y", threshold "30d"), the RAW
|
||||
editor opens showing "1y" / "30d". If the stored value happens to be an
|
||||
absolute timestamp, the forced-RAW path substitutes the relative default so
|
||||
the field never shows a bare timestamp number. The user can still switch to
|
||||
Date manually (the selector is visible in ADVANCED); only the initial choice
|
||||
changed.
|
||||
- `WillSettingsWidget.__init__` and `apply_user_type_visibility`: the Check
|
||||
Alive (threshold) row is hidden in BASIC in BOTH layouts again (main window
|
||||
and wizard), reverting the v0.5.2 "visible read-only in the main window"
|
||||
behaviour.
|
||||
- `apply_editable_dates`: reverted the v0.5.2 threshold read-only special-case
|
||||
back to the original single line (no longer needed now that the Check Alive
|
||||
is hidden in BASIC).
|
||||
|
||||
**Verification:**
|
||||
|
||||
- Full test suite: `266 passed`, plus the same 2 pre-existing, unrelated
|
||||
failures (stale `baltx_fees=100` expectation vs the v0.5.0 default of `20`).
|
||||
- `ruff`: no new errors (only pre-existing star-import noise).
|
||||
- Windows behaviour to be confirmed by the owner: in ADVANCED both fields open
|
||||
in RAW showing 1y/30d; in BASIC the Check Alive is no longer visible anywhere.
|
||||
|
||||
**Outcome:** DONE (delivered as test ZIP v0.5.5; commit only after the owner
|
||||
confirms it works).
|
||||
|
||||
---
|
||||
|
||||
## 30. v0.5.6 - Five small UX fixes (tooltips, empty-ics warning, revert forced RAW, message reword, Check Alive red highlight)
|
||||
|
||||
**Date:** 2026-07-04
|
||||
|
||||
**Goal (owner request, five items in one release):**
|
||||
|
||||
1. Add a "Local time (not UTC)" note to the Delivery time AND Check Alive
|
||||
tooltips.
|
||||
2. When the calendar export has no reminder events (delivery date too close or
|
||||
already passed), warn the user and do NOT create an empty .ics file.
|
||||
3. Revert the v0.5.5 "always RAW in ADVANCED" default back to the 0.5.0
|
||||
behaviour (default editor follows the stored value's format).
|
||||
4. Reword "Inheritance already executed (on blockchain)" to "An inheritance of
|
||||
this wallet is already executed (on blockchain)".
|
||||
5. Highlight the Check Alive box with a soft red when it is later than the
|
||||
delivery time (ADVANCED only).
|
||||
|
||||
**What changed:**
|
||||
|
||||
- `bal/gui/qt/widgets.py`:
|
||||
- `ThresholdTimeWidget.help_text` and `LockTimeWidget.help_text`: appended a
|
||||
note that the date/time is in the computer's Local time, not UTC (#1).
|
||||
- `BalTimeEditWidget.__init__`: removed the v0.5.5 forced-RAW-in-ADVANCED
|
||||
block; the default editor again follows the stored value (absolute number
|
||||
-> Date, relative "1y"/"30d" -> Raw). BASIC still forces the Date editor
|
||||
and hides the selector (#3).
|
||||
- `WillSettingsWidget.on_locktime_change`: if the Check Alive timestamp is
|
||||
>= the delivery time, tint the Check Alive box soft red (#FCE4E4, border
|
||||
#E9A8A8) with an explanatory tooltip; clear it when the relationship is
|
||||
valid. ADVANCED only (the field is hidden in BASIC) (#5).
|
||||
- `bal/gui/qt/dialogs.py`:
|
||||
- `_ics_provider`: returns None when there are no reminder events (instead of
|
||||
a header-only .ics), so the caller can warn (#2).
|
||||
- Reworded the "inheritance already executed" message (#4).
|
||||
- `bal/gui/qt/calendar.py`:
|
||||
- `_ensure_ics`: when the provider returns no content, show the warning
|
||||
"No reminders were saved: the delivery date is too close (or already
|
||||
passed)" and create no file (#2).
|
||||
|
||||
**Verification:**
|
||||
|
||||
- Full test suite: `266 passed`, plus the same 2 pre-existing, unrelated
|
||||
failures (stale `baltx_fees=100` expectation vs the v0.5.0 default of `20`).
|
||||
- `ruff`: no new errors (only pre-existing star-import noise and a pre-existing
|
||||
E401 in calendar.py, present in clean v0.5.0).
|
||||
- Manual check: `_ics_provider` returns events for a far delivery date and None
|
||||
for a delivery date of "today" (0 days), confirming the empty-events warning
|
||||
path.
|
||||
- Windows/visual confirmation (soft-red tint, tooltips, calendar warning) to be
|
||||
done by the owner from the test ZIP.
|
||||
|
||||
**Outcome:** DONE (delivered as test ZIP v0.5.6; commit only after the owner
|
||||
confirms it works).
|
||||
|
||||
---
|
||||
|
||||
## 31. v0.5.7 - Consistent Raw/Date default per mode, including runtime switch
|
||||
|
||||
**Date:** 2026-07-04
|
||||
|
||||
**Goal (owner request):** Make the Raw/Date editor default simple and
|
||||
consistent, both at startup and when toggling BASIC<->ADVANCED at runtime:
|
||||
* BASIC -> always the Date (calendar) editor, selector hidden.
|
||||
* ADVANCED -> RAW by default (showing "1y"/"30d"), selector visible so the
|
||||
user can switch to Date manually; a manual Date choice must be
|
||||
respected on later runtime mode switches (not forced back to RAW).
|
||||
|
||||
**Background:** v0.5.6 (ToDo #3) had reverted to the value-driven default and
|
||||
left the runtime switch untouched, so switching ADVANCED->BASIC at runtime could
|
||||
leave a field stuck on RAW while the selector was hidden (and BASIC->ADVANCED
|
||||
did not restore RAW). This makes the behaviour explicit and symmetric.
|
||||
|
||||
**What changed (all in `bal/gui/qt/widgets.py`):**
|
||||
|
||||
- `BalTimeEditWidget.__init__`: default editor is now chosen by MODE, not by the
|
||||
stored value's format: BASIC -> Date (index 1); ADVANCED -> RAW (index 0). In
|
||||
ADVANCED, if the stored value is an absolute timestamp, the relative default
|
||||
("1y"/"30d") is loaded into the RAW editor so it never shows a bare number.
|
||||
- Added `self._user_picked_editor` flag plus `_on_user_picked_editor`, connected
|
||||
to the combo's `activated` signal (fires only on real user interaction, not on
|
||||
programmatic index changes). This records a manual Raw/Date choice.
|
||||
- `apply_user_type_visibility`: besides showing/hiding the selector, it now sets
|
||||
the active editor on a runtime switch: BASIC -> always Date; ADVANCED -> RAW
|
||||
unless the user had manually picked an editor, in which case their choice is
|
||||
left untouched. Wrapped in try/except so a cosmetic editor switch can never
|
||||
break mode toggling.
|
||||
|
||||
**Verification:**
|
||||
|
||||
- Full test suite: `266 passed`, plus the same 2 pre-existing, unrelated
|
||||
failures (stale `baltx_fees=100` expectation vs the v0.5.0 default of `20`).
|
||||
- `ruff`: no new errors (only pre-existing star-import / E401 noise).
|
||||
- Windows/interactive confirmation (startup defaults + runtime BASIC<->ADVANCED
|
||||
switch, including a manual Date choice being respected) to be done by the
|
||||
owner from the test ZIP.
|
||||
|
||||
**Outcome:** DONE (delivered as test ZIP v0.5.7; commit only after the owner
|
||||
confirms it works).
|
||||
|
||||
---
|
||||
|
||||
## 32. v0.5.8 - Fix: Check Alive red highlight no longer hides the up/down arrows
|
||||
|
||||
**Date:** 2026-07-04
|
||||
|
||||
**Problem (owner-reported, screenshot):** the soft-red highlight added in v0.5.6
|
||||
(ToDo #5) made the Check Alive box lose its native up/down spin arrows. Cause:
|
||||
the stylesheet set a `border` on the whole container; styling the border of a
|
||||
QDateTimeEdit / QAbstractSpinBox via stylesheet makes Qt stop drawing its native
|
||||
sub-controls (the spin arrows).
|
||||
|
||||
**Fix (`bal/gui/qt/widgets.py`, `on_locktime_change`):** the warning styling now
|
||||
sets ONLY a `background-color` (no border), and scopes the rule to the inner
|
||||
editor widget types (`QDateTimeEdit, QLineEdit, QAbstractSpinBox`) instead of the
|
||||
whole container, so the tint still shows but the native up/down arrows are
|
||||
preserved.
|
||||
|
||||
**Verification:**
|
||||
- Full test suite: `266 passed` (same 2 pre-existing unrelated failures).
|
||||
- `ruff`: no new errors.
|
||||
- Visual confirmation (arrows present + soft-red tint) to be done by the owner
|
||||
from the test ZIP.
|
||||
|
||||
**Outcome:** DONE (delivered as test ZIP v0.5.8; commit only after confirmation).
|
||||
|
||||
---
|
||||
|
||||
## 33. v0.5.9 - Clearer 3-point "could not build the will" message
|
||||
|
||||
**Date:** 2026-07-04
|
||||
|
||||
**Goal (owner request):** Now that the Check Alive box turns soft red when it is
|
||||
later than the delivery time (v0.5.6/v0.5.8), that mistake is hard to make, so
|
||||
the build-failure message was rewritten as a clearer, numbered 3-point list.
|
||||
|
||||
**What changed (`bal/gui/qt/dialogs.py`, text only):** the message shown when
|
||||
`build_will()` returns nothing is now:
|
||||
|
||||
Could not build the will ! Possible reasons:
|
||||
1- the Balance of wallet is too low to cover the fees for miners and will executors,
|
||||
2- the Heirs' shares are below the minimum (Dust UTXO, less than 546 Satoshi),
|
||||
3- the Check Alive Date/Time is later than the delivery time (it must be earlier),
|
||||
Skipped
|
||||
|
||||
Line breaks use "\n", which the message panel converts to <br> (see the render
|
||||
that joins labels with <br><br> and replaces \n), so the three points appear on
|
||||
separate lines. Same trigger condition and warning colour as before; text only.
|
||||
|
||||
**Verification:**
|
||||
- Full test suite: `266 passed` (same 2 pre-existing unrelated failures).
|
||||
- `ruff`: no new errors.
|
||||
- Visual confirmation of the multi-line layout to be done by the owner.
|
||||
|
||||
**Outcome:** DONE (delivered as test ZIP v0.5.9; commit only after confirmation).
|
||||
|
||||
---
|
||||
|
||||
## 34. v0.5.10 - Pressing CHECK no longer resets a manual Date/RAW choice (Opzione 2)
|
||||
|
||||
**Date:** 2026-07-04
|
||||
|
||||
**Problem (owner-reported):** In ADVANCED, manually setting the Check Alive and
|
||||
Delivery time boxes to Date and then pressing CHECK snapped them back to RAW.
|
||||
|
||||
**Cause:** v0.5.7 put the per-mode editor default (BASIC->Date, ADVANCED->RAW)
|
||||
inside `BalTimeEditWidget.apply_user_type_visibility`, which is invoked from
|
||||
`BalWindow.update_all()` - and update_all() also runs on every CHECK/refresh, not
|
||||
only on a real USER TYPE change. So CHECK re-applied the RAW default.
|
||||
|
||||
**Fix (Opzione 2 - separate the two concerns):**
|
||||
|
||||
- `bal/gui/qt/widgets.py`:
|
||||
- `BalTimeEditWidget.apply_user_type_visibility`: reverted to flipping ONLY the
|
||||
Raw/Date combo visibility (no editor change), so it is side-effect free on
|
||||
every refresh/CHECK.
|
||||
- New `BalTimeEditWidget.apply_user_type_editor_default`: holds the per-mode
|
||||
editor default (BASIC->Date; ADVANCED->RAW unless the user picked manually).
|
||||
- New `WillSettingsWidget.apply_user_type_editor_default`: applies it to both
|
||||
the locktime and threshold boxes.
|
||||
- `bal/gui/qt/plugin.py`:
|
||||
- New `_apply_editor_default_on_toolbars()` helper that reaches the WILL/HEIR
|
||||
toolbars of every open window and applies the editor default.
|
||||
- `on_user_type_change` now calls it ONLY on a real USER TYPE change (both the
|
||||
normal switch and the revert-to-BASIC path), right before `update_all()`.
|
||||
|
||||
**Result:** CHECK no longer touches the active editor (the transaction-list
|
||||
refresh in update_all() at `will_list_widget.update_will(...)` is untouched, so
|
||||
the list still updates on CHECK). The per-mode default is applied only when the
|
||||
user actually switches BASIC<->ADVANCED, and a manual Date choice is preserved.
|
||||
|
||||
**Verification:**
|
||||
- Full test suite: `266 passed` (same 2 pre-existing unrelated failures).
|
||||
- `ruff`: no new errors.
|
||||
- Interactive confirmation (Date stays on CHECK; switch still applies defaults;
|
||||
transaction list still refreshes) to be done by the owner from the test ZIP.
|
||||
|
||||
**Outcome:** DONE (delivered as test ZIP v0.5.10; commit only after confirmation).
|
||||
|
||||
Reference in New Issue
Block a user