[verified] Fix reboot action label and cold-open build progress #33

Merged
astaranix merged 1 commit from astaranix/details-reboot-and-live-progress into main 2026-09-13 22:39:38 -04:00 AGit
Owner

Fix

  • Show Update available in the top-left button when a candidate exists; reserve Reboot required for the no-update state. Keep permissions, busy/pending requests, stale observations, and shutdown gates unchanged.
  • Tag recognized Nix build counters before journald can drop their one-time aggregate start. Preserve raw diagnostics, bound activity tracking, and retain build failure propagation through pipefail.
  • Recover cold-open progress using a separate current-boot, 100-match, five-second-bounded reverse journal query while the ordinary follower supplies live updates. A filtered --follow --lines query only looks back through the raw tail, so it cannot provide this history.
  • Keep counter timestamps separate from retained phase timestamps, and drain complete queued records before handling child EOF. Replay cannot revert newer counts or activation, and closing/shutdown reaps the optional replay child.

Verification

  • Independent security and correctness reviews both approved exact tree 46f03a6d45, with no security or logic findings; export bytes and the complete diff digest were independently verified.
  • Red/green regressions cover the native Iced button label/action, lost aggregate-start identity, progress replay, and stale-counter merging.
  • Default Rust all-target suite: 202 passed, 2 ignored. No-default-features suite: 80 passed. Both ignored real-producer tests were explicitly executed and passed.
  • Built a real unprivileged nh derivation emitting 750 compiler-output lines. Its counters survived output-tail eviction. Imported its annotated output into an offline journal fixture, removed every aggregate start, and retained 650 builder lines: real journalctl recovered 9 typed counter records and displayed 0 completed / 1 expected while the raw 100-record tail contained no counters. Journal metadata for this probe was explicitly synthetic; no production journal or system update was changed.
  • Five streaming-annotator tests passed, including large-ID precision, bounded tracking, reused/stopped IDs, raw/malformed output, and pre-EOF flushing. Transactional apply tests preserve exact build-failure exit 42 and prevent activation after failure.
  • All 20 Details unit tests passed in a separate fontless process.
  • Built the actual aarch64-linux updater and Rust tray, no-default package tests, shell tests, lock check, Wayland/X11 desktop smoke, and X11 geometry smoke using pinned nixpkgs eaad089433ca2bb662274377d33df3d0e51ef28b. Store outputs and geometry proof were read back.
  • Formatting and staged whitespace checks pass. Strict Clippy remains non-green on the same 24 distinct baseline diagnostics; full identity comparison found no additions or removals.
  • One existing three-second rapid-reopen fixture timed out during simultaneous Nix compilation; ten isolated repetitions, a full serial run, and the later full parallel suite passed without loosening the deadline.

Scope and limitations

No system activation or installed-tray restart was performed. No new production dependency, privileged helper, state file, or journal rate-limit change was introduced. The legacy C++ tray and request authorization are unchanged. Historical untyped runs whose aggregate start was already lost cannot be reconstructed; the source-side fix applies to new runs after deployment. Progress remains indeterminate when no usable typed counters exist, and expected totals remain explicitly labelled as Nix estimates rather than percentages.

## Fix - Show Update available in the top-left button when a candidate exists; reserve Reboot required for the no-update state. Keep permissions, busy/pending requests, stale observations, and shutdown gates unchanged. - Tag recognized Nix build counters before journald can drop their one-time aggregate start. Preserve raw diagnostics, bound activity tracking, and retain build failure propagation through pipefail. - Recover cold-open progress using a separate current-boot, 100-match, five-second-bounded reverse journal query while the ordinary follower supplies live updates. A filtered --follow --lines query only looks back through the raw tail, so it cannot provide this history. - Keep counter timestamps separate from retained phase timestamps, and drain complete queued records before handling child EOF. Replay cannot revert newer counts or activation, and closing/shutdown reaps the optional replay child. ## Verification - Independent security and correctness reviews both approved exact tree 46f03a6d45e01235cd47928cfa840e112debe756, with no security or logic findings; export bytes and the complete diff digest were independently verified. - Red/green regressions cover the native Iced button label/action, lost aggregate-start identity, progress replay, and stale-counter merging. - Default Rust all-target suite: 202 passed, 2 ignored. No-default-features suite: 80 passed. Both ignored real-producer tests were explicitly executed and passed. - Built a real unprivileged nh derivation emitting 750 compiler-output lines. Its counters survived output-tail eviction. Imported its annotated output into an offline journal fixture, removed every aggregate start, and retained 650 builder lines: real journalctl recovered 9 typed counter records and displayed 0 completed / 1 expected while the raw 100-record tail contained no counters. Journal metadata for this probe was explicitly synthetic; no production journal or system update was changed. - Five streaming-annotator tests passed, including large-ID precision, bounded tracking, reused/stopped IDs, raw/malformed output, and pre-EOF flushing. Transactional apply tests preserve exact build-failure exit 42 and prevent activation after failure. - All 20 Details unit tests passed in a separate fontless process. - Built the actual aarch64-linux updater and Rust tray, no-default package tests, shell tests, lock check, Wayland/X11 desktop smoke, and X11 geometry smoke using pinned nixpkgs eaad089433ca2bb662274377d33df3d0e51ef28b. Store outputs and geometry proof were read back. - Formatting and staged whitespace checks pass. Strict Clippy remains non-green on the same 24 distinct baseline diagnostics; full identity comparison found no additions or removals. - One existing three-second rapid-reopen fixture timed out during simultaneous Nix compilation; ten isolated repetitions, a full serial run, and the later full parallel suite passed without loosening the deadline. ## Scope and limitations No system activation or installed-tray restart was performed. No new production dependency, privileged helper, state file, or journal rate-limit change was introduced. The legacy C++ tray and request authorization are unchanged. Historical untyped runs whose aggregate start was already lost cannot be reconstructed; the source-side fix applies to new runs after deployment. Progress remains indeterminate when no usable typed counters exist, and expected totals remain explicitly labelled as Nix estimates rather than percentages.
## Fix

- Show Update available in the top-left button when a candidate exists; reserve Reboot required for the no-update state. Keep permissions, busy/pending requests, stale observations, and shutdown gates unchanged.
- Tag recognized Nix build counters before journald can drop their one-time aggregate start. Preserve raw diagnostics, bound activity tracking, and retain build failure propagation through pipefail.
- Recover cold-open progress using a separate current-boot, 100-match, five-second-bounded reverse journal query while the ordinary follower supplies live updates. A filtered --follow --lines query only looks back through the raw tail, so it cannot provide this history.
- Keep counter timestamps separate from retained phase timestamps, and drain complete queued records before handling child EOF. Replay cannot revert newer counts or activation, and closing/shutdown reaps the optional replay child.

## Verification

- Independent security and correctness reviews both approved exact tree 46f03a6d45, with no security or logic findings; export bytes and the complete diff digest were independently verified.
- Red/green regressions cover the native Iced button label/action, lost aggregate-start identity, progress replay, and stale-counter merging.
- Default Rust all-target suite: 202 passed, 2 ignored. No-default-features suite: 80 passed. Both ignored real-producer tests were explicitly executed and passed.
- Built a real unprivileged nh derivation emitting 750 compiler-output lines. Its counters survived output-tail eviction. Imported its annotated output into an offline journal fixture, removed every aggregate start, and retained 650 builder lines: real journalctl recovered 9 typed counter records and displayed 0 completed / 1 expected while the raw 100-record tail contained no counters. Journal metadata for this probe was explicitly synthetic; no production journal or system update was changed.
- Five streaming-annotator tests passed, including large-ID precision, bounded tracking, reused/stopped IDs, raw/malformed output, and pre-EOF flushing. Transactional apply tests preserve exact build-failure exit 42 and prevent activation after failure.
- All 20 Details unit tests passed in a separate fontless process.
- Built the actual aarch64-linux updater and Rust tray, no-default package tests, shell tests, lock check, Wayland/X11 desktop smoke, and X11 geometry smoke using pinned nixpkgs eaad089433ca2bb662274377d33df3d0e51ef28b. Store outputs and geometry proof were read back.
- Formatting and staged whitespace checks pass. Strict Clippy remains non-green on the same 24 distinct baseline diagnostics; full identity comparison found no additions or removals.
- One existing three-second rapid-reopen fixture timed out during simultaneous Nix compilation; ten isolated repetitions, a full serial run, and the later full parallel suite passed without loosening the deadline.

## Scope and limitations

No system activation or installed-tray restart was performed. No new production dependency, privileged helper, state file, or journal rate-limit change was introduced. The legacy C++ tray and request authorization are unchanged. Historical untyped runs whose aggregate start was already lost cannot be reconstructed; the source-side fix applies to new runs after deployment. Progress remains indeterminate when no usable typed counters exist, and expected totals remain explicitly labelled as Nix estimates rather than percentages.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
astaranix/nixos-updater!33
No description provided.