ClementTsang/bottom
72.5
Strong · 29 September 2026
35k
lines of production code
Rust
primary language
2
measurements over time
What this system is
This system is a cross-platform, terminal-based system monitor that collects and displays real-time metrics for CPU, memory, disk, network, and temperature sensors. It provides a highly customizable user interface with modular widgets, supporting time-series graphs, sortable data tables, and granular styling options. The application features advanced process management capabilities, including tree views, priority tracking, and complex regex-based filtering with negation support.
How it got here
2019–2020 — UI architecture redesign and widget enhancements
10 changes.
This period focused on restructuring the application's core architecture, introducing a unified component model for widgets and modular state management. Significant work involved redesigning the canvas rendering logic, adding configurable time-series graphs, and enhancing process and network display capabilities with new utility modules for data formatting and input handling.
2022–2024 — UI component refactoring and configuration overhaul
12 changes.
This period focused on restructuring the application's internal architecture by refactoring the process table and canvas components into modular, reusable primitives. It also involved a comprehensive overhaul of the configuration system, introducing granular per-widget styling, dedicated schema validation, and improved argument parsing. Additionally, platform-specific packaging and desktop integration were enhanced for Windows and Linux.
2025–2026 — modular data collection architecture
14 changes.
The project restructured its system data collection layer into a modular, platform-specific architecture, introducing dedicated modules for batteries, CPU, disks, GPU, memory, network, processes, and temperature. This refactoring enhanced data accuracy and extensibility by leveraging the sysinfo library, implementing cgroup-aware metrics, and adding support for ZFS ARC, process priorities, and Linux hardware sensors. Concurrently, the codebase improved developer workflows with CI scripts for BSD testing, automated demo generation, and local pre-push hooks.
Features
Add BSD test and Git configuration CI scripts
The CI pipeline now includes dedicated shell scripts to support testing on BSD systems and to configure Git identity. The new \scripts/ci/bsd\_tests.sh\ script installs necessary dependencies (such as curl, bash, and OpenSSL) and sets up the Rust toolchain using a pinned version for FreeBSD and NetBSD targets, then executes the test suite with appropriate feature flags. Additionally, \scripts/ci/configure\_git.sh\ was added to globally configure Git user name and email settings within the CI environment.
scripts/ci · high confidence
Add Linux desktop entry for bottom
A .desktop file has been added to the desktop directory to enable integration with Linux desktop environments. This file defines the application as a System Monitor, sets the executable to 'btm', specifies the icon as 'bottom-system-monitor', and categorizes it under System and ConsoleOnly, allowing the application to appear in application menus and launchers.
desktop · high confidence
Add main entrypoint with error hook and stdout reset
The application now includes a main entrypoint (src/bin/main.rs) that initializes the runtime via start\_bottom and implements an error handling hook. If a runtime error occurs and the run\_error\_hook flag is set, the application resets the standard output (reset\_stdout) to ensure the terminal state is cleaned up properly before exiting.
src/bin · high confidence
Added Chocolatey packaging scripts for Windows
New scripts have been added to the \scripts/windows/choco\ directory to automate the creation of a Chocolatey package for the \bottom\ application on Windows. This includes a Python packager (\choco\_packager.py\) that generates the necessary NuSpec and PowerShell installation scripts from templates, enabling users to install the tool via the Chocolatey package manager.
scripts/windows · high confidence
Added optional pre-push git hook for local code quality checks
Developers can now install an optional pre-push git hook that automatically runs \cargo fmt\ and \cargo clippy\ before pushing code, helping to catch formatting and linting issues locally before they reach CI.
scripts/hooks · high confidence
Added schema generation tool for configuration files
A new Rust-based utility located in scripts/schema\_gen has been introduced to automatically generate JSON Schema definitions for the application's configuration file. This tool processes internal widget column variants (such as ProcColumn, DiskWidgetColumn, and TempWidgetColumn) to ensure the generated schema accurately reflects available options, and outputs versioned schema files with appropriate metadata and documentation links.
_scripts/schema\gen · high confidence
Granular widget styling and configuration schema
The configuration system now supports detailed, per-widget styling options. Users can customize widget borders (including type and color), bar fill characters (pipe, block, or square), and specific color schemes for individual components like CPU cores, memory types (RAM, cache, swap, GPU), network RX/TX, disk I/O graphs, and temperature sensors. The schema also introduces global widget background colors and text styling options (bold, italic) for titles and labels, providing finer control over the visual appearance of the dashboard.
src/options/config/style · high confidence
Introduce configurable network graph scaling and legend positioning
Users can now customize how network usage graphs are displayed by choosing between logarithmic and linear Y-axis scaling via the new \network\_scale\_type\ configuration option, and by controlling the legend's location on the graph using the \network\_legend\_position\ setting. These options are exposed in the application's configuration and allow for better visibility of network data across different usage ranges and layout preferences.
src · high confidence
New Linux temperature sensor collection via sysfs and sysinfo
Users on Linux can now see temperature data from hardware sensors (hwmon and coretemp) and CPU components. This change introduces new modules (\linux.rs\ and \sysinfo.rs\) that read sensor data directly from the Linux sysfs interface (\/sys/class/hwmon\, \/sys/devices/platform/coretemp\) and via the \sysinfo\ library, handling device naming, filtering, and unit conversion (millidegrees to Celsius).
src/collection/temperature · high confidence
New modular filter, layout, and state management components
The application introduces three new internal modules to support enhanced widget customization and interaction. The \filter\ module provides a reusable regex-based filtering mechanism that allows users to include or exclude entries based on pattern matching. The \layout\_manager\ module implements a coordinate-based system for managing widget placement, enabling more flexible and granular control over the user interface layout. Additionally, the \states\ module centralizes the management of widget-specific states (such as CPU, memory, and process states) and introduces search state handling for the help dialog, improving how the application tracks and updates UI components during user interaction.
src/app · high confidence
New schema validation and generation tooling
The scripts/schema directory now includes a Python validator (validator.py) that checks configuration files against JSON schemas, supporting features like uncommenting settings and verifying expected validation failures. Additionally, shell scripts (generate.sh and nightly.sh) have been added to automate schema generation using the schema\_gen binary, outputting versioned or nightly JSON schema files.
scripts/schema · high confidence
New shared canvas components for tables, gauges, and scrolling
The \src/canvas/components\ module now exposes a set of reusable UI primitives: a generic \DataTable\ with sortable columns and scroll state, a \PipeGauge\ widget supporting pipe, block, and square bar types, a \ScrollBar\ helper that correctly handles very small heights (≤2) by omitting arrows, a \SearchInput\ renderer for query spans, and a \WidgetCarousel\ for drawing navigation arrows between widgets. These components provide the underlying drawing logic for data tables, process gauges, and dialog scrolling in the application.
src/canvas/components · high confidence
New utility modules for cancellation, data formatting, and input handling
The \src/utils\ directory has been populated with several new modules that provide core functionality for the application. \cancellation\_token.rs\ introduces a \CancellationToken\ to allow threads to sleep while remaining interruptible. \data\_units.rs\ and \conversion.rs\ add support for converting byte and bit values into both decimal (SI) and binary (IEC) prefixed strings, enabling users to view disk and network usage in their preferred format. \input.rs\ provides a generalized \InputFieldState\ for handling grapheme-aware cursor movement and scrolling in search fields. Additionally, \process\_killer.rs\ implements OS-specific logic for terminating processes, \logging.rs\ sets up structured logging via \fern\, and \int\_hash.rs\ provides optimized hash maps for integer keys.
src/utils · high confidence
Process collection now includes priority and platform-specific extensions
The process data collector now exposes the OS-level priority class for each process in the output. On Windows, this is retrieved via the native GetPriorityClass API, and the commit history indicates a fix for a memory leak associated with this retrieval. On Unix systems (macOS and FreeBSD), new platform-specific modules have been added to handle process data collection, including a fallback CPU usage mechanism via the \ps\ command and parent PID resolution on macOS. These changes ensure that process priority is available across supported platforms while maintaining robust CPU and parent process data collection on Unix variants.
src/collection/processes · high confidence
Process view now displays priority and nice values on macOS and FreeBSD
The process collection module for Unix systems has been refactored to harvest and expose process priority and nice values. This change introduces a new \UnixProcessExt\ trait and a \UserTable\ for efficient UID-to-username mapping, integrating with the \sysinfo\ library to populate these fields in the process data. Users will now see priority and nice columns for processes on macOS and FreeBSD, enhancing the visibility of process scheduling attributes in the UI.
src/collection/processes/unix · high confidence
Support for query negation and structured query parsing
The process table query system now supports negation using the \!\ prefix (e.g., \!firefox\ or \!(cpu \> 50)\), allowing users to exclude processes matching specific criteria. This change introduces a new internal query structure (\src/widgets/process\_table/query\) with dedicated modules for handling logical operators (\And\, \Or\), attribute matching (\attribute.rs\), and error handling (\error.rs\). The \Prefix\ enum now includes a \Negate\ variant that inverts the match result of inner expressions, enabling more complex filtering logic in the process table widget.
_src/widgets/process\table/query · high confidence
Windows MSI installer supports per-user installation and shell completions
The Windows installer now allows users to install the application in their local user directory without requiring administrator privileges, in addition to the traditional per-machine installation. It also includes shell completion scripts for PowerShell, Nu, Fish, Bash, and Zsh, and updates the installer UI to use the advanced wizard.
wix · high confidence
Architecture
Introduce structured internal data management modules
The application now organizes its internal data handling into dedicated modules within \src/app/data\. This change introduces \ProcessData\ to manage process harvesting and parent-child mappings, \TimeSeriesData\ to store chunked historical metrics for CPU, memory, network, disk I/O, and temperatures, and \Temperature\ utilities to handle unit conversions between Celsius, Kelvin, and Fahrenheit. The \store.rs\ module centralizes the ingestion of harvested system data, applying settings such as network unit types and zeroing options before storing the state in \InnerData\.
src/app/data · high confidence
New modular data collection architecture
The application has restructured its system data collection layer into a modular, platform-specific architecture. The previous monolithic collection logic has been replaced by dedicated modules for batteries, CPU, disks, GPU, memory, network, processes, and temperature. This change introduces structured data types (e.g., \BatteryData\, \ProcessHarvest\, \NetworkHarvest\) and platform-specific implementations (e.g., Linux-specific process handling, Windows swap usage, FreeBSD disk I/O) to improve maintainability and extensibility. Users benefit from a more robust and organized foundation for system metrics, enabling better support for diverse operating systems and hardware configurations.
src/collection · high confidence
Behavioural changes
Automated demo recording via VHS
The project now uses VHS to automatically generate the demo GIF. A new \demos/demo.tape\ script defines the sequence of terminal commands and interactions (such as navigating widgets, sorting, and searching) that are executed to produce the \demos/demo.gif\ output, replacing manual recording with a reproducible, scripted workflow.
demos · high confidence
Data table component refactored with configurable sorting, column widths, and scroll bars
The data table component has been significantly refactored to support more flexible configuration and improved usability. Users can now configure the default sort order for columns, allowing tables to start in a specific sorted state. Column width management has been enhanced with support for soft, hard, and header-following bounds, enabling better layout control. Additionally, the table now supports configurable scroll bars and scroll position display, improving navigation for large datasets. The component also introduces a \table\_gap\ option to control spacing between headers and rows, and allows for custom widget borders and styling through a dedicated styling module.
_src/canvas/components/data\table · high confidence
Improved memory usage reporting with cgroup support and ZFS ARC visibility
Memory collection now accounts for cgroup limits on Linux, ensuring that reported RAM and swap usage respects container constraints rather than showing host totals. A regression fix caps cgroup v1 'unlimited' sentinel values to the actual physical memory total, preventing inflated metrics. Additionally, the tool now exposes ZFS Adaptive Replacement Cache (ARC) usage on Linux and FreeBSD when the 'zfs' feature is enabled, and refines Windows swap reporting to use performance counters for greater accuracy.
src/collection/memory · high confidence
Introduce shared canvas drawing utilities and border logic
A new \drawing\_utils.rs\ module has been added to \src/canvas\ to centralize common rendering logic. This includes helper functions for creating widget and dialog blocks with configurable borders and styles, as well as logic to automatically hide X-axis labels on time graphs based on height constraints or an auto-hide timeout. The module also defines constants for side borders and auto-hide timing, ensuring consistent visual treatment across canvas widgets.
src/canvas · high confidence
Linux process collection restructured with new fields and parsing fixes
The Linux process collection module has been reorganized into dedicated \mod.rs\ and \process.rs\ files, introducing support for new process attributes including priority, nice value, virtual memory size, and swap usage. The underlying \/proc/\<PID\>/stat\ parser has been updated to correctly handle multi-byte UTF-8 characters in process names, manage malformed comm entries, and parse kernel thread flags, while also adding logic to hide kernel threads from standard views and support thread-level process data.
src/collection/processes/linux · high confidence
New default and light theme palettes for default, gruvbox, and nord
The theme configuration files in \src/options/config/style/themes\ have been rewritten to define explicit color palettes for the \default\, \gruvbox\, and \nord\ themes, including dedicated light variants (\default\_light\_palette\, \gruvbox\_light\_palette\, \nord\_light\_palette\). These changes update the visual appearance of system metrics (RAM, CPU, disk I/O, network, GPU, temperature) and UI elements (borders, table headers, selected text) by assigning specific colors to each style property, ensuring consistent and correct coloring across both dark and light modes for these themes.
src/options/config/style/themes · high confidence
New disk collection subsystem for Unix systems
The disk collection logic in \src/collection/disks/unix\ has been completely rewritten. This new implementation introduces a \FileSystem\ enum to accurately identify and categorize various filesystem types (such as ext4, NTFS, ZFS, and APFS) and distinguishes between physical and virtual partitions. On Linux, it now supports tracking unmounted block devices by reading \/proc/partitions\ and provides improved I/O counter parsing from \/proc/diskstats\. macOS support has been rebuilt using direct IOKit bindings to retrieve disk statistics, while other Unix systems utilize \getfsstat64\ for mount information.
src/collection/disks/unix · high confidence
New help dialog search and improved process kill dialog
The help dialog now supports filtering content via a search input, highlighting matching text in the displayed help sections. The process kill dialog has been refactored to provide better signal selection support on Linux, macOS, and FreeBSD, including proper handling of real-time signals and improved UI state management.
src/canvas/dialogs · high confidence
Process table widget refactored into modular components
The process table widget's internal structure has been reorganized into distinct modules for column definitions, data handling, querying, and sorting. This change introduces a new \ProcColumn\ enum to explicitly define available columns (such as CPU%, Memory, Swap, and Priority) and implements the necessary traits for column headers and sorting logic. The query parsing logic has been moved to a dedicated module to handle process filtering with support for prefixes, boolean operators, and regex, while data formatting and display logic are now separated into their own files. This refactoring improves code maintainability and prepares the widget for easier extension of column types and query capabilities.
_src/widgets/process\table · high confidence
Redesign of basic-mode widgets and network display logic
The basic-mode rendering for CPU, memory, and network widgets has been rewritten to use a new PipeGauge component and improved layout logic. CPU basic mode now supports a dedicated average row and decimal precision options, while memory basic mode displays RAM, swap, cache, and GPU usage with configurable percentage or fraction labels. The network basic widget now features a responsive layout that switches between horizontal and grid arrangements based on terminal width, and includes packet rate and average packet size metrics. Additionally, the network graph widget now supports an optional legacy legend mode and calculates packet statistics for display.
src/canvas/widgets · high confidence
Redesigned widget architecture with configurable tables and time-series graphs
The widget layer has been restructured to use a new, unified component model. All widgets now feature configurable table columns (CPU, Disk, Process, Temperature) with support for custom sort orders and column visibility. Data presentation has been enhanced with optional decimal places for CPU usage and disk I/O, and binary prefix support for disk capacity. Graphical displays have been upgraded to time-series charts (using PercentTimeGraph and AutoYAxisTimeGraph) for CPU, Memory, Network, Disk I/O, and Temperature, replacing previous static or rudimentary rendering. The Process widget now supports a tree view with configurable default collapse/expand states, additional columns (Swap, Virtual Memory, Running Time, GPU metrics), and improved search and sorting logic.
src/widgets · high confidence
Refactored CPU data collection to use sysinfo and support cgroup-aware average usage on Linux
The CPU collection logic in src/collection/cpu/sysinfo.rs has been rewritten to rely on the sysinfo library for gathering per-core and average CPU usage. On Linux, when average CPU usage is enabled, the code now attempts to use cgroup-based CPU percentage data if available, falling back to the global system CPU usage otherwise; on other platforms, it defaults to the global system CPU usage. Additionally, a new helper function retrieves system load averages (1, 5, and 15 minutes) directly via sysinfo's API.
src/collection/cpu · high confidence
Restructured argument parsing and configuration schema
The application's command-line argument parsing and configuration handling have been reorganized. The \src/options/args.rs\ file now defines a unified \BottomArgs\ struct that groups options into distinct sections (General, Process, Temperature, CPU, Memory, Network, Disk, Style, etc.), improving help text organization. The configuration model in \src/options/config.rs\ has been updated to use specific sub-config structs (e.g., \ProcessesConfig\, \CpuConfig\) instead of a flat structure, and includes aliases for backward compatibility (e.g., \network\ for \network\_graph\). A new \OptionError\ type in \src/options/error.rs\ provides clearer, user-facing error messages for both configuration file and command-line argument issues.
src/options · high confidence
Restructured configuration schema with dedicated widget modules
The configuration system has been refactored to organize settings into dedicated modules (cpu, disk, memory, network, process, temperature, and style), replacing the previous flat structure. This change introduces granular control for each widget, including configurable default sort columns and orders for processes, disks, and temperatures, as well as specific display options like showing decimal places for CPU usage, binary prefixes for disk capacities, and packet rate details for network graphs. General settings such as table gaps, GPU usage, and read-only mode are now consolidated in a new flags module, while styling options are grouped under a dedicated style configuration that supports custom themes and per-widget color schemes.
src/options/config · high confidence
Test coverage
Added integration tests for CLI arguments and configuration validation
Added a new suite of integration tests in \tests/integration\ that verify the application's behavior when receiving invalid command-line arguments (such as out-of-range rates or time deltas) and malformed configuration files (including invalid widget types, colors, and sort columns). These tests ensure that the application fails gracefully with clear error messages for these edge cases, and include sanity checks for the \--version\ and \--help\ flags.
tests/integration · high confidence
Dependencies
Update dependencies and lockfiles
Updated the project's dependency manifests and lockfiles to their latest compatible versions, including major bumps for clap (4.x), ratatui (0.30.x), sysinfo (0.39.6), and dirs (7.0.0), alongside routine updates to other crates like regex, serde, and crossterm.
(dependencies) · high confidence
Housekeeping
Initial project scaffolding and documentation
This change establishes the foundational repository structure for the project. It introduces the \CHANGELOG.md\ documenting the upcoming 0.15.0 release (including features like Intel GPU support and binary disk units) and the 0.14.x history, alongside a \README.md\ update. It also adds contributor tracking via \.all-contributorsrc\, defines coding standards in \rustfmt.toml\ and \clippy.toml\, and sets up the build script \build.rs\ to generate shell completions and manpages. Additionally, it includes an \AI\_POLICY.md\ governing AI-assisted contributions, a \Cross.toml\ for cross-compilation targets, and various CI/CD configuration files.
(repo-wide) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 73 → 73 (-0.6)
- Rubric changed (rubric-2026.09.8 → rubric-2026.09.16) — scores are not directly comparable.
Lenses
- Code Health 73 → 72 (-0.4)
- Architecture 93 → 85 (-8.2)
- Maturity 70 → 70 (+0.2)
- Readiness 73 → 72 (-1.2)
- Security 74 → 83 (+8.6)
Resolved (20)
- Documentation: contradicts the code (docs/content/support/official.md)
- Documentation: contradicts the code (docs/content/support/unofficial.md)
- Documentation: written for insiders (docs/content/contribution/documentation.md)
- Duplicated block (11–12 lines × 2) (src/canvas/widgets/mem_graph.rs)
- Hotspot: src/app.rs (src/app.rs)
- Hotspot: src/app/data/time_series.rs (src/app/data/time_series.rs)
- Hotspot: src/app/layout_manager.rs (src/app/layout_manager.rs)
- Hotspot: src/canvas/components/data_table/draw.rs (src/canvas/components/data_table/draw.rs)
- Hotspot: src/canvas/components/time_series/vendored.rs (src/canvas/components/time_series/vendored.rs)
- Hotspot: src/canvas/dialogs/process_kill_dialog.rs (src/canvas/dialogs/process_kill_dialog.rs)
- Hotspot: src/canvas/widgets/disk_io_graph.rs (src/canvas/widgets/disk_io_graph.rs)
- Hotspot: src/canvas/widgets/network_graph.rs (src/canvas/widgets/network_graph.rs)
- Hotspot: src/collection.rs (src/collection.rs)
- Hotspot: src/collection/processes/unix/process_ext.rs (src/collection/processes/unix/process_ext.rs)
- Hotspot: src/lib.rs (src/lib.rs)
- Hotspot: src/options/config/layout.rs (src/options/config/layout.rs)
- Hotspot: src/widgets/process_table/query/prefix.rs (src/widgets/process_table/query/prefix.rs)
- Members sharing a duplicated core (4 members, 50+ identical tokens) (src/app.rs)
- Members sharing a duplicated core (5 members, 50+ identical tokens) (src/canvas/widgets/disk_io_graph.rs)
- TodoComment (scripts/schema_gen/src/main.rs)
New (27)
- Duplicated block (11–12 lines × 2) (src/canvas/widgets/mem_graph.rs)
- FixmeComment (src/canvas/components/pipe_gauge.rs)
- Hotspot: src/canvas/components/pipe_gauge.rs (src/canvas/components/pipe_gauge.rs)
- Inconsistent naming for identical state update operations. While 'force_data_update' is used in some widgets, others use 'force_update_data' (e.g., MemWidgetState, NetWidgetState, ProcWidgetState). This suggests a copy-paste inconsistency or lack of a unified interface for widget state updates.
- Inconsistent naming pattern for query option toggles. The methods are prefixed with 'search_' (e.g., search_toggle_ignore_case), but the underlying config properties in ProcTableConfig use 'is_' prefix (e.g., is_case_sensitive). Furthermore, the toggle methods do not follow the standard Rust convention of simply being named after the property (e.g., 'toggle_ignore_case') or being part of a builder pattern, creating a disconnect between config state and mutation methods.
- Members sharing a duplicated core (4 members, 50+ identical tokens) (src/app.rs)
- Members sharing a duplicated core (5 members, 50+ identical tokens) (src/canvas/widgets/disk_io_graph.rs)
- MethodTooLong: Painter.draw_basic_memory (src/canvas/widgets/mem_basic.rs)
- MethodTooLong: PipeGauge.render (src/canvas/components/pipe_gauge.rs)
- Orphaned files with no living knowledge
- Outdated: clap
- Outdated: clap_complete
- Outdated: clap_complete_nushell
- Outdated: clap_mangen
- Outdated: humantime
- Outdated: indexmap
- Outdated: log
- Outdated: rustix
- Outdated: serde
- Outdated: toml_edit
- …and 7 more
Changes since last survey
- 16 commits — 15 feature/other, 1 fixes
By area
- (root) — 8 commits
- docs/content — 3 commits
- scripts/schema — 1 commit
- src/canvas — 1 commit
- src/collection — 1 commit
- src/options — 1 commit
- src/utils — 1 commit
Notable commits
- fix: bug: fix scrollbar not drawing if the height was 2 or less (#2261)
- change: change: show decimal places for disk usage info (#2266)
- change: deps: bump dirs to 7.0.0 (#2248)
- change: deps: bump mach to 0.7.0 (#2247)
- change: deps: bump nvml to 0.13.0 (#2246)
- change: docs: add abuhurayraniloy as a contributor for code (#2257)
- change: docs: add pederbe as a contributor for code (#2249)
- change: docs: update AI policy formatting (#2252)
- change: docs: update changelog (#2250)
- change: docs: update changelog (#2258)
- change: feat: add configurable binary disk capacity units (#2236)
- change: feature: add more pipe gauge bar fill options (#2245)
- change: feature: add process swap column for Linux (#2224)
- change: feature: support binary prefix option for disk table I/O (#2251)
- change: other: make schema script use same target dir (#2259)
- change: other: make scrollbar enabled by default (#2260)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
ClementTsang/bottom was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 29 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 5ad904068d87dc509c998502906d3ee538803695 — the exact code this score is about.
- Scored under rubric-2026.09.16 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-d46da229e3fd.