Repository navigation
Open
Labels
backendBackend/Go relatedBackend/Go relatedenhancementNew feature or requestNew feature or requestfrontendFrontend/Angular relatedFrontend/Angular related
Description
Summary
Non-blocking findings accepted during review of the 2.0.0 Phase 1 pull requests (#969, #970, #971, #972), plus frontend follow-ups the backend changes need. Tracked under #965.
Frontend (needed before 2.0.0 ships)
- Omnibus first load: the login page must explain where the generated token lives (
/opt/scrutiny/config/.auth-token, for example viadocker exec), since auth is now on by default (feat(auth)!: secure defaults for authentication, notifications, request limits, and reports #971). Done in fix(frontend): 2.0 login token guidance, drop report_pdf_path, surface notification URL errors #974. - Remove the
report_pdf_pathsetting fromapp.config.tsanddashboard-settings.component.ts; the backend ignores it now (feat(auth)!: secure defaults for authentication, notifications, request limits, and reports #971). Done in fix(frontend): 2.0 login token guidance, drop report_pdf_path, surface notification URL errors #974. - Surface the 400 returned when saving a
script://or unsafeapprise+notification URL (feat(auth)!: secure defaults for authentication, notifications, request limits, and reports #971). Done in fix(frontend): 2.0 login token guidance, drop report_pdf_path, surface notification URL errors #974. - Show a warning for existing database notification rows that are now skipped; needs a backend flag on
GET /api/settings/notify-urlsfirst (feat(auth)!: secure defaults for authentication, notifications, request limits, and reports #971). - Display the decoded NVMe
critical_warningstatus reasons (fix(smart): detect manufacturer SMART failures for ATA and NVMe and keep them through recalculation #970). The drive page already rendersstatus_reasonas a tooltip (no code change in fix(frontend): 2.0 login token guidance, drop report_pdf_path, surface notification URL errors #974); still unverified on hardware with a warning bit set.
Backend and images (Low)
-
pkg/secrets: after a stale-lock break, the old holder'srelease()removes the new holder's lock. Write a nonce into the lock file and remove it only on match, or re-read after rename until two reads agree. Also consider a wait timeout at least as long as the 30s stale age, so a crashed holder does not fail startup for about 20s (feat(auth)!: secure defaults for authentication, notifications, request limits, and reports #971). -
warnIfInfluxRejectsTokenmatches the error text prefixunauthorized; match on the HTTP 401 status instead so a non-JSON 401 body still produces the hint. Its org lookup also needs org-read permission, so a narrowly scoped token can log a false "token rejected" (feat(docker)!: generated InfluxDB credentials, unprivileged web image, and retention margin #972). -
collector/pkg/config/config.gocomment states "collector config > COLLECTOR_API_TOKEN", but viper ranks environment variables above the config file. Correct the comment (feat(docker)!: generated InfluxDB credentials, unprivileged web image, and retention margin #972). - Devices with
ignore: truestill runsmartctl --info, so a failing ignored device raises aninfoscan error. Skip identification for ignored devices (fix(collector): skip unidentified devices, add exclude list and bounded parallel collection #969). - Scan errors for unidentified devices cannot be muted, because the device is not registered. Document this, or add a mute path keyed by device name (fix(collector): skip unidentified devices, add exclude list and bounded parallel collection #969).
- An unidentified device's failure is a scan-level error, so its existing dashboard row is not marked with a collector error as in 1.x (fix(collector): skip unidentified devices, add exclude list and bounded parallel collection #969).
- Healthcheck for the zfs, btrfs, mdadm, and performance collector images (only the plain
collectorimage has one) (feat(docker)!: generated InfluxDB credentials, unprivileged web image, and retention margin #972). - Verify that InfluxDB 2.9 catches up missed downsample task runs with
now()set to the scheduled time; the retention margin assumes it does (feat(docker)!: generated InfluxDB credentials, unprivileged web image, and retention margin #972). - Persist smartctl
smart_statuswith each measurement so status recalculation cannot drop aFailedSmartbit that came only from it (fix(smart): detect manufacturer SMART failures for ATA and NVMe and keep them through recalculation #970).
Release notes items
- Devices may change from passed to failed after upgrade: real manufacturer threshold failures were never flagged in 1.x (fix(smart): detect manufacturer SMART failures for ATA and NVMe and keep them through recalculation #970).
when_failed: "past"now yields a warning; with warn-level and repeat notifications, such drives notify every run (fix(smart): detect manufacturer SMART failures for ATA and NVMe and keep them through recalculation #970).- NVMe
critical_warning(including the temperature bit) counts as a SMART failure (fix(smart): detect manufacturer SMART failures for ATA and NVMe and keep them through recalculation #970). - Unidentified devices and default virtual-disk models are no longer registered (fix(collector): skip unidentified devices, add exclude list and bounded parallel collection #969).
Metadata
Metadata
Assignees
Labels
backendBackend/Go relatedBackend/Go relatedenhancementNew feature or requestNew feature or requestfrontendFrontend/Angular relatedFrontend/Angular related
Projects
- StatusShow more project fieldsBeta (Saturday)
Activity
Starosdev commentedon Oct 13, 2026
Additional follow-ups from Phase 2 reviews (#974, #975, #976):
Frontend (2.1):
/api/settings/tokens(create shows the token once, list, revoke) (feat(api): scoped API tokens, GET /api/version, and route contract tests #976)GET /api/versionafter login instead of settings responses (feat(api): scoped API tokens, GET /api/version, and route contract tests #976)staleis omitted when unknown (fix(server): guard concurrent collector runs, report stale devices, optional auto-archive #975)Backend:
auto_archivedflag so a device that reports again can be unarchived automatically (needs migration) (fix(server): guard concurrent collector runs, report stale devices, optional auto-archive #975)auto_archive_stale_days(needs a seeded settings row) (fix(server): guard concurrent collector runs, report stale devices, optional auto-archive #975)api_tokens.scopecolumn default is still the legacyfull; change it in the migration baseline (feat(api): scoped API tokens, GET /api/version, and route contract tests #976)SOURCE_DATE_EPOCH,-trimpath) (feat(docker)!: generated InfluxDB credentials, unprivileged web image, and retention margin #972)Starosdev commentedon Oct 13, 2026
Follow-ups from the migration baseline review (#977) and the first Zeus beta test:
precheckSQLiteDatabase(andimport_sqlite.go:40) open"file:"+path+"?mode=ro"without URI-escaping the path. A database path containing#,?, or%can resolve to a different file. No data is lost (the in-Migraterefusal still applies), but the "refused before any write" guarantee does not hold for such paths. Escape the path segment or skip the precheck for those characters (feat(database)!: baseline schema for new SQLite databases and 1.70.0 minimum upgrade version #977).TestPostgres_SchemaDoesNotDependOnCreationVersionbuilds the 1.76 shape from current models minus two documented differences, not from a real v1.76.5 database; a fixture from real v1.76.5 code would also catch other model drift (feat(database)!: baseline schema for new SQLite databases and 1.70.0 minimum upgrade version #977).2020...andm2025...IDs; only the named ID in the message is affected (feat(database)!: baseline schema for new SQLite databases and 1.70.0 minimum upgrade version #977).devices.auto_archivedcolumn) (feat(database)!: baseline schema for new SQLite databases and 1.70.0 minimum upgrade version #977).1.76.5from/api/versionuntil a 2.0 prerelease is tagged; consider a prerelease tag for beta testing (Zeus beta test).Starosdev commentedon Oct 13, 2026
UI findings from the 2.0 beta browser test on Zeus (
scrutiny-beta, image from 47abd6f):<code>paths in the token help text wrap mid-word (/opt/s/crutiny/config/.auth-token); allow breaks only at/or useword-break: keep-allwith horizontal scroll.Verified working: login redirect with
returnUrl, token guidance and docs link, token field and show/hide labels, dashboard and device detail load with no console errors,script://rejection shown withrole="alert"and cleared on Cancel.Starosdev commentedon Oct 14, 2026
Release tooling follow-ups from cutting
v2.0.0-beta.1(#978, #979):.github/scripts/generate-release-notes.shkeeps only PRs with basemaster, so a release cut frombetagets header-only notes and the "Update release notes" step inrelease.yamloverwrites semantic-release's notes with them. Include PRs merged into the release branch (betafor prereleases).release.yamlcomputes the previous tag withgit describe --tags --abbrev=0 <tag>^, which can land on an old prerelease tag (v1.65.0-beta.1) instead of the last stable release. Make the lookup prerelease-aware.:2.0.0-beta.1on GHCR holds the web image (fixed for later prereleases by fix(ci): publish distinct per-image tags for prerelease versions #979); it stays as published.