Reconciles the staged-projection / Diagnostics feature work with the origin/main CI quality-gate commits, and prepares the v0.7.0 release.
Merge
origin/main had diverged (5 CI commits vs 8 feature commits). Merge commit resolves 8 conflicts; the origin side of each was lint-only, so the feature imports were kept and the ruff fixes re-applied (E402 noqa in fenris-monitor, F401 re-export noqa in the TUI, unused imports dropped). A clock-fragile TUI test was made date-independent.
Release prep
pyproject.toml -> 0.7.0
CHANGELOG: [Unreleased] -> [0.7.0] - 2026-10-06
Validation
ruff check src/ tests/ clean
pytest: 1005 passed, 43 skipped
jscpd exit 0
Reconciles the staged-projection / Diagnostics feature work with the origin/main CI quality-gate commits, and prepares the v0.7.0 release.
## Merge
origin/main had diverged (5 CI commits vs 8 feature commits). Merge commit resolves 8 conflicts; the origin side of each was lint-only, so the feature imports were kept and the ruff fixes re-applied (E402 noqa in fenris-monitor, F401 re-export noqa in the TUI, unused imports dropped). A clock-fragile TUI test was made date-independent.
## Release prep
- pyproject.toml -> 0.7.0
- CHANGELOG: [Unreleased] -> [0.7.0] - 2026-10-06
## Validation
- ruff check src/ tests/ clean
- pytest: 1005 passed, 43 skipped
- jscpd exit 0
Use lifetime written bytes from the current segment's newest published
sample in the headline formula, select the Percentage-Used-implied
baseline after two increments in the segment (otherwise show the
too-coarse fact), and judge horizon agreement across existing horizons.
Make the vacuous projection tests assert unconditionally and add
coverage for implied-baseline gating and single-horizon agreement.
Report a projection stage, an evidence ladder and the sustained-regime
write rate from compute_projection, per ADR 0012. A provisional lifespan
appears after 3 observed hours and carries the hours observed and a
short-horizon spread; the complete-local-day condition becomes a fact
instead of a gate, and the write rate replaces the lifespan when no
baseline applies. The TUI and CLI render the stage, ladder count and
full ladder, and drop their own two-sample pre-gates.
Add a b key and a no-baseline banner that open a form for rated TBW and an
optional source URL. The value is persisted as an unverified override through
fenris-monitor baseline set under the existing polkit action, and the outcome
is reported synchronously. Verified overrides stay CLI-only (ADR 0012 section 7).
Move activity data assembly out of tui.py into activity_readout, behind
readout(conn, selection, now). Dashboard and fenris-monitor enable now show
local time with a timezone label, inspected points keep a secondary UTC line,
and the legacy UTC-relabelled day and hour branches are gone. Time formatting
(including freshness_age_human) lives in timefmt. Hour offsets now render as
+05:30 to match day labels.
Declare every dashboard key as a Binding on the widget that owns it, and
generate the footer, activity tool chips and help screen from those
bindings so they cannot drift. The footer collapses to "? help · q quit"
under 80x24.
Add Home/End and PgUp/PgDn (one week) navigation, mouse-wheel selection on
the graphs, click-to-focus on every panel, and clickable footer chips.
Tab and Shift+Tab now visit only the dashboard panels.
Toggle a Diagnostics panel with i, built on the Activity readout. It swaps
in for the Drive pane and shows the decoded critical_warning, power-on
hours, power cycles, unsafe shutdowns, media errors and available spare
with their change over the selection, and per-hour (Day) or per-day
(History) temperature min/avg/max, active/idle/powered-off/unknown split
and coverage. History bars draw reads beside writes while it is open, and a
set critical_warning shows as a badge in the endurance outlook without
affecting the projection. Counter deltas are withheld across a controller
segment change.
Record host read and write commands, controller busy time, error log
entries, warning and critical temperature time, and thermal management
transitions from the existing smartctl -a -j acquisition. Schema 7 adds
nullable columns to samples so legacy rows read as unknown, and the
Diagnostics panel shows each counter with its change.
Reconcile the staged-projection and Diagnostics feature work with the CI
quality-gate changes from origin/main. The origin side of every conflict was
lint-only, so the feature imports were kept and the ruff fixes re-applied:
- keep the branch's added imports (timefmt, activity_readout, projection
ladder helpers) and drop the unused ones ruff reported
- restore `noqa: E402` on the post-bootstrap imports in fenris-monitor and
keep the `noqa: F401` re-exports in the TUI that tests assert on
- make the TUI monitoring-glyph test clock-relative instead of pinned to a
fixed date
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Reconciles the staged-projection / Diagnostics feature work with the origin/main CI quality-gate commits, and prepares the v0.7.0 release.
Merge
origin/main had diverged (5 CI commits vs 8 feature commits). Merge commit resolves 8 conflicts; the origin side of each was lint-only, so the feature imports were kept and the ruff fixes re-applied (E402 noqa in fenris-monitor, F401 re-export noqa in the TUI, unused imports dropped). A clock-fragile TUI test was made date-independent.
Release prep
Validation
PR Reviewer Guide 🔍
(Review updated until commit
ef9e7fa7a8)Here are some key observations to aid the review process:
⚠️ Review coverage: The following files were not included in this review because of the token budget:
src/fenris/activity_readout.pytests/test_activity_readout.pytests/test_projection.pytests/test_tui_navigation.pytests/test_issue_111.pytests/test_staged_projection.pytests/test_tui_baseline_entry.pytests/test_tui.pysrc/fenris/activity_plot.pysrc/fenris/status.pytests/test_tui_diagnostics.pytests/test_dashboard_design.pytests/test_staged_projection_callers.pysrc/fenris/collector.pysrc/fenris/store.pytests/test_live_graph.pysrc/fenris/timefmt.pytests/test_collector_history_tracer.pytests/test_activity_plot.pysrc/fenris/themes.pytests/test_local_day.pytests/test_issue_97.pysrc/fenris/monitor.pysrc/fenris/activity_selection.pytests/test_status_composition.pytests/test_acceptance_sweep.pytests/test_monitor.pysrc/fenris/status_composition.pytests/test_issue_72_edge_cases.pytests/test_measured_activity.pyREADME.mddocs/adr/0012-staged-projection-and-evidence-ladder.mdCONTEXT.mdCHANGELOG.mddocs/spec/glint-dashboard-design.mdpyproject.tomlPersistent review updated to latest commit
ef9e7fa7a8