explainer: drop "Always on: Hardware metrics" chip group

The always-on framing read as unavoidable surveillance — a reason not to
install the agent, not a reason to want it. The paragraph above already
names what the agent collects (CPU/disk temps, SMART, power, Ceph/RAID)
in concrete benefit-focused terms; the chip was redundant and its label
backfired.

Only the "Off by default, opt in per host" group remains, covering
Assistant commands and Patrol remediation — users specifically want
these framed as opt-in because they involve command execution.

Test restructure: split the old combined "capabilities + trust facts"
case into two focused tests, with explicit guards that neither the
"Always on" label nor the "Hardware metrics" chip reappears.
This commit is contained in:
rcourtman
2026-04-20 10:12:20 +01:00
parent e8e5da703d
commit 12c9261a51
2 changed files with 24 additions and 31 deletions
@@ -21,8 +21,6 @@ const persistDismissed = () => {
}
};
const ALWAYS_ON_CAPABILITIES = ['Hardware metrics'];
const OPT_IN_CAPABILITIES = ['Assistant commands', 'Patrol remediation'];
const AGENT_FACTS = [
@@ -113,34 +111,18 @@ export const ConnectionsExplainer: Component = () => {
only path.
</p>
<div class="mt-4 space-y-2">
<div>
<div class="mb-1 text-[10px] font-semibold uppercase tracking-wide text-muted">
Always on
</div>
<div class="flex flex-wrap gap-1.5">
<For each={ALWAYS_ON_CAPABILITIES}>
{(label) => (
<span class="inline-flex items-center rounded-full border border-border bg-surface px-2 py-0.5 text-[11px] font-medium text-base-content">
{label}
</span>
)}
</For>
</div>
<div class="mt-4">
<div class="mb-1 text-[10px] font-semibold uppercase tracking-wide text-muted">
Off by default, opt in per host
</div>
<div>
<div class="mb-1 text-[10px] font-semibold uppercase tracking-wide text-muted">
Off by default, opt in per host
</div>
<div class="flex flex-wrap gap-1.5">
<For each={OPT_IN_CAPABILITIES}>
{(label) => (
<span class="inline-flex items-center rounded-full border border-dashed border-border bg-surface px-2 py-0.5 text-[11px] font-medium text-muted">
{label}
</span>
)}
</For>
</div>
<div class="flex flex-wrap gap-1.5">
<For each={OPT_IN_CAPABILITIES}>
{(label) => (
<span class="inline-flex items-center rounded-full border border-dashed border-border bg-surface px-2 py-0.5 text-[11px] font-medium text-muted">
{label}
</span>
)}
</For>
</div>
</div>
@@ -29,12 +29,23 @@ describe('ConnectionsExplainer', () => {
expect(screen.getByText(/Primary source for workloads/i)).toBeInTheDocument();
});
it('surfaces concrete agent capabilities and trust facts users care about', () => {
it('calls out that Assistant / Patrol command execution is opt-in, not default', () => {
render(() => <ConnectionsExplainer />);
for (const capability of ['Hardware metrics', 'Assistant commands', 'Patrol remediation']) {
expect(screen.getByText(/off by default, opt in per host/i)).toBeInTheDocument();
for (const capability of ['Assistant commands', 'Patrol remediation']) {
expect(screen.getByText(capability)).toBeInTheDocument();
}
// The old "Always on: Hardware metrics" framing read as unavoidable
// surveillance. The agent paragraph already names what it collects;
// we don't restate it as an always-on chip.
expect(screen.queryByText(/^Always on$/i)).toBeNull();
expect(screen.queryByText('Hardware metrics')).toBeNull();
});
it('surfaces trust facts users care about', () => {
render(() => <ConnectionsExplainer />);
for (const fact of ['Single Go binary', '~13 MB download', 'No runtime dependencies', 'Open source']) {
expect(screen.getByText(fact)).toBeInTheDocument();
}