What's new in v0.9.14
v0.9.14 makes the database energy-waste figure exist on every run. In v0.9.13 it needed Alumet measuring the database cgroup and only appeared in the daemon. Now, when no such measurement is available (a batch analyze, a managed database, or no [green.alumet.database] at all), perf-sentinel estimates the figure from the modeled energy of the window's SQL spans and tags it as estimated, so the database-side waste is never silently absent. The figure also shows on all three surfaces and is published in the periodic disclosure, always kept out of every energy and carbon total. Everything is additive, so a consumer that ignores the new fields parses unchanged.
Database waste on every run
green_summary.database_waste is now produced whether or not a database is measured. With [green.alumet.database] declared and a live reading, the energy is the measured cgroup window energy, tagged model = "alumet_rapl". Without it, the energy is estimated from the region-resolved SQL spans exactly as scoring resolved them, tagged model = "estimated", a re-presented share of the report totals rather than additional energy. A declared database that never delivers a reading emits nothing and carries its energy over to the next window, so the period is never double counted. The model field carries the provenance on every display, so an estimate is never mistaken for a measurement.
Shown on every surface
The batch text report gains a Database waste: line and the SQL share of the I/O op counts. The HTML dashboard's Green panel gains a database waste card and the SQL share on the I/O waste ratio card. The query monitor Energy tab keeps the line it gained in v0.9.13. The measured figure reads "excluded from totals" because it is genuinely additional CPU energy, the estimated figure reads "within the report totals" because it is a share of the numbers already reported, so the two provenances are never confused.
Published in the disclosure (schema v1.4)
The periodic disclosure gains aggregate.database_waste, the database-side avoidable energy and carbon summed over the period at both thresholds, the operator's and the binary-pinned canonical one, with its provenance models and a measured versus estimated window split. Each archived window carries the matching disclosure_waste.database block. The figure is an informational lower bound kept out of total_energy_kwh and total_carbon_kgco2eq. An older reader parses a v1.4 report unchanged, and an older report rehashes identically on this binary, because every new field defaults when it is absent.
Why this is a patch and not a minor
The new behavior is additive. database_waste was already an optional object in v0.9.13, and it now simply appears on more runs and with an extra model tag, so a consumer that ignores it parses exactly as before. No configuration changes to produce the estimated figure, it falls out of the normal scoring pass and stays excluded from every total. The disclosure moves to schema v1.4, but every added field defaults when absent, so both older readers and older reports stay valid and content hashes stay stable.
Validation
The release was validated in the simulation lab against the v0.9.14 binary, recorded as PASS. The ten anti-pattern detectors all fired as expected, and the batch and CLI scenarios all matched. The estimated fallback was exercised end to end: a batch run with no database declared produced the estimated figure on the text report, the JSON, and the HTML dashboard, always a subset of the report energy. The disclosure was checked on a mixed archive, the measured and estimated windows summed to the published counts, the provenance split held, and total_energy_kwh and total_carbon_kgco2eq did not move whether or not the database block was present. The content hash round-trip failed closed on a tampered report, and a declared-but-undelivered database emitted no figure, so the period is not double counted. The full Rust suite passes green, clippy is clean at -D warnings on Rust 1.97.1, and the default and --no-default-features builds both pass.
Verifying this release
# Binary integrity via SLSA Build L3 attestation
gh attestation verify perf-sentinel-linux-amd64 \
--repo robintra/perf-sentinel
# A periodic disclosure produced by this binary
perf-sentinel verify-hash --report perf-sentinel-report.json \
--expected-identity "https://github.com/robintra/perf-sentinel/.github/workflows/release.yml@refs/tags/v0.9.14" \
--expected-issuer "https://token.actions.githubusercontent.com"gh CLI 2.49 or newer required for gh attestation verify.
Full Changelog: v0.9.13...v0.9.14