Skip to content

Release/2026.11.2 - #25

Open
ConnorHaggerty wants to merge 5 commits into
mainfrom
release/2026.11.2
Open

Release/2026.11.2#25
ConnorHaggerty wants to merge 5 commits into
mainfrom
release/2026.11.2

Conversation

@ConnorHaggerty

@ConnorHaggerty ConnorHaggerty commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Summary

GPUs, watched processes, and cards for the list widgets

Type

  • Bug fix
  • Feature
  • Refactor / cleanup
  • Docs

Proposed commit message

GPUs, watched processes with rocm and nvidia smi.
Cards for the list widgets instead of text for better flow and interactivity

Checklist

  • Tests pass: cd server && USE_SQLITE=true VIGIL_SIGNING_KEY_SEED=<seed> .venv/bin/python manage.py test
  • Migrations added if any model changed (makemigrations)
  • If this is a release, version bumped in lockstep: settings.py (VIGIL_VERSION) and agent/vigil_agent/__version__.py — those two only; the expected agent version is detected, not configured
  • No edition (Pro / Enterprise) code added to this Community repo
  • Extension contract intact (docs/pro-extension-points.md): KNOWN_EVENTS stable, no edition imports in core
  • No AI / Co-Authored-By attribution in commits
  • No secrets, keys, or signing seeds committed

Testing

Passes all Tests

The six list widgets rendered flat rows of text into a scroll box, which
read as a wall at any tile size. Each row is now a card with a left edge in
the colour of what it is about — severity for alerts and findings, run
state for history, up or down for containers and automations — a title, a
thin sub-line and a right column. Clicking one goes to the page that owns
it, flashing the panel it landed on so the click has somewhere to arrive.

The host widget was a dot, a name and an OS string. It now renders the same
.host-card templates/_host_card.html defines, so it gets the OS logo, tags,
mode badge, the five live metric bars and the detail drawer. Nothing has
included that template since the classic dashboard was retired, so this is
the only place host cards exist and the widget owns their behaviour: the
template's inline onclick handlers become delegated listeners here, because
these values are hostnames reported by agents.

Three field names were wrong against the API. Alerts carry fired_at, tasks
carry completed_at, and automations have always carried last_run — the
widget read last_fired_at, so every automation reported "never".

refreshHostCards() takes a root to scope to, show_search is implemented
rather than merely declared, and the host widget defaults to nine rows
because one row of real cards does not fit in five.
The agent only ever sampled the busiest ten processes, so a chart of one
named service was full of holes exactly when the service was behaving, and
an outage looked the same as a quiet period. process_watch names processes
sampled at every scrape regardless of rank; processes sharing a name are
summed with the live count beside them, so a watched name that is not
running reports zero rather than nothing at all.

GPU telemetry from nvidia-smi and rocm-smi, collected only when the tool is
present and silent when it is not — a host with no GPU is the ordinary case,
not a failure. Utilisation, memory, temperature and power per card, with
fan, clocks, PCIe link and ECC counters behind gpu_extended because the wide
set is roughly twice the points per GPU per check-in. memory_percent is
derived agent-side rather than left for the dashboard to divide two series
that may not have arrived together.

Three widgets: GPU status, process monitor (one named process charted, and
it says outright when the name is not on the watch list, because gaps then
mean it dropped out of the ranking rather than stopped), and top processes
rebuilt as cards with an inline SVG sparkline each — not Chart.js, which
would be a dozen canvases in one tile.

Widget settings pick tasks, playbooks and hosts through the searchable
picker modal instead of a dropdown, which cannot search and is unusable past
a screenful. The host list comes from the site-scoped endpoint the widget
itself uses, not the picker's own machine list — that one is admin-only and
was not site-scoped at all, which is fixed here too.

The widget-defaults guard keyed off a setting named "metric", which caught
an ordinary choice field that names no metric. It now keys off the type.
The rebuild ceremony asked every time whether you understood that Vigil was
served over plain HTTP. Asked inside the ceremony it read as another box to
clear on the way to the button, which is the opposite of what an
acknowledgement is for. It is now a standing decision about the instance,
recorded in Settings under Transport Security with the admin who made it and
when — this is a deliberate downgrade of the instance's posture, and "who
agreed to this" is the question asked afterwards. It can be withdrawn, and
the pane says whether it is presently doing anything. The per-request flag
still works for API callers.

The rebuild job no longer asks for a completion tag or a playbook to run
afterwards. The install profile already carries completion_tags, and a
playbook that should run on a rebuilt machine is what auto-enroll is for —
it fires when the machine checks back in carrying the profile's tags, and it
keeps working for a machine rebuilt by any other route. Two ways to say the
same thing meant the ceremony asked twice and the answers could disagree.

The columns stay so existing jobs read back, and a request still carrying
either field is ignored rather than refused. The agent: namespace guard the
job used to carry is unaffected: it lives on the profile serializer, where
tags are actually set, and there is now a test saying so.
Four changes already on this branch, given a version number so an operator
can tell this build from 2026.11.1 on the About page.

The dashboard's six list widgets became cards, and the host widget renders
the real host card again rather than a dot and a name. The agent reads GPUs
from nvidia-smi and rocm-smi where either exists, and samples the processes
named in process_watch at every check-in instead of only the busiest ten.
Plain-text transport is acknowledged once in Settings, by a named admin,
rather than inside every rebuild. The rebuild ceremony no longer asks for a
completion tag or a post-rebuild playbook, both of which the install profile
and auto-enrolment already answer.

v2026.11.1 is tagged and pushed, so this is 2026.11.2 rather than an
amendment to it.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant