diff --git a/docs/release-control/v6/internal/subsystems/cloud-paid.md b/docs/release-control/v6/internal/subsystems/cloud-paid.md
index ac8c279e3..ef94ac38a 100644
--- a/docs/release-control/v6/internal/subsystems/cloud-paid.md
+++ b/docs/release-control/v6/internal/subsystems/cloud-paid.md
@@ -1105,6 +1105,12 @@ default billing and pricing surfaces should use concise monitored-system copy,
while the full counted-unit definition appears only behind explicit disclosure
such as `View counting rules` instead of sitting as always-visible explanatory
chrome.
+The same boundary also owns the warning-banner shorthand: customer-facing
+monitored-system warnings should describe the current counted total in plain
+language such as `16 monitored systems currently counted`, and any Community
+overflow/setup-slot message must explain the included monitored systems plus the
+temporary setup slot in customer terms rather than compressing the contract
+into slash-style quota strings that imply Pulse is counting every child device.
Those same billing-facing surfaces must also describe the commercial contract in
customer terms: monitored systems, plan limits, subscription status, and
license status. They must not revive legacy `installed-agent` wording or vague
diff --git a/frontend-modern/src/components/Commercial/__tests__/MonitoredSystemDefinitionDisclosure.test.tsx b/frontend-modern/src/components/Commercial/__tests__/MonitoredSystemDefinitionDisclosure.test.tsx
index 76d272602..002117d27 100644
--- a/frontend-modern/src/components/Commercial/__tests__/MonitoredSystemDefinitionDisclosure.test.tsx
+++ b/frontend-modern/src/components/Commercial/__tests__/MonitoredSystemDefinitionDisclosure.test.tsx
@@ -8,14 +8,16 @@ describe('MonitoredSystemDefinitionDisclosure', () => {
render(() => );
expect(
- screen.getByText('Billing is based on monitored systems. Child resources are included.'),
+ screen.getByText(
+ 'Pulse counts top-level monitored systems. Child resources underneath them are included.',
+ ),
).toBeInTheDocument();
expect(screen.getByRole('button', { name: 'View counting rules' })).toHaveAttribute(
'aria-expanded',
'false',
);
expect(
- screen.queryByText(/a monitored system is a top-level machine or cluster/i),
+ screen.queryByText(/a monitored system is a top-level monitored root/i),
).not.toBeInTheDocument();
fireEvent.click(screen.getByRole('button', { name: 'View counting rules' }));
@@ -25,15 +27,18 @@ describe('MonitoredSystemDefinitionDisclosure', () => {
'true',
);
expect(
- screen.getByText(/a monitored system is a top-level machine or cluster/i),
+ screen.getByText(/a monitored system is a top-level monitored root/i),
).toBeInTheDocument();
+ expect(screen.getByText(/docker host, kubernetes cluster, proxmox node/i)).toBeInTheDocument();
});
it('does not expose brief summary copy unless requested', () => {
render(() => );
expect(
- screen.queryByText('Billing is based on monitored systems. Child resources are included.'),
+ screen.queryByText(
+ 'Pulse counts top-level monitored systems. Child resources underneath them are included.',
+ ),
).not.toBeInTheDocument();
});
@@ -45,7 +50,7 @@ describe('MonitoredSystemDefinitionDisclosure', () => {
'true',
);
expect(
- screen.getByText(/a monitored system is a top-level machine or cluster/i),
+ screen.getByText(/a monitored system is a top-level monitored root/i),
).toBeInTheDocument();
});
});
diff --git a/frontend-modern/src/components/Settings/__tests__/MonitoredSystemLedgerPanel.test.tsx b/frontend-modern/src/components/Settings/__tests__/MonitoredSystemLedgerPanel.test.tsx
index 266675696..88614f3ff 100644
--- a/frontend-modern/src/components/Settings/__tests__/MonitoredSystemLedgerPanel.test.tsx
+++ b/frontend-modern/src/components/Settings/__tests__/MonitoredSystemLedgerPanel.test.tsx
@@ -372,13 +372,13 @@ describe('MonitoredSystemLedgerPanel', () => {
expect(screen.getAllByText('server-b (PBS Server via PBS)').length).toBeGreaterThan(0);
expect(
screen.getByText(
- 'Review the monitored systems currently counted against your Pulse Pro plan limit.',
+ 'Review the top-level monitored systems currently counted against your plan limit.',
),
).toBeInTheDocument();
expect(screen.getByRole('button', { name: 'View counting rules' })).toBeInTheDocument();
expect(
screen.queryByText(
- /a monitored system is a top-level machine or cluster pulse actively monitors/i,
+ /a monitored system is a top-level monitored root such as a docker host, kubernetes cluster, proxmox node/i,
),
).not.toBeInTheDocument();
@@ -386,7 +386,7 @@ describe('MonitoredSystemLedgerPanel', () => {
expect(
screen.getByText(
- /a monitored system is a top-level machine or cluster pulse actively monitors/i,
+ /a monitored system is a top-level monitored root such as a docker host, kubernetes cluster, proxmox node/i,
),
).toBeInTheDocument();
expect(screen.getByText('server-b')).toBeInTheDocument();
@@ -580,7 +580,9 @@ describe('MonitoredSystemLedgerPanel', () => {
'true',
);
expect(
- screen.getByText(/a monitored system is a top-level machine or cluster/i),
+ screen.getByText(
+ /a monitored system is a top-level monitored root such as a docker host, kubernetes cluster, proxmox node/i,
+ ),
).toBeInTheDocument();
});
});
diff --git a/frontend-modern/src/components/shared/__tests__/MonitoredSystemLimitWarningBanner.test.tsx b/frontend-modern/src/components/shared/__tests__/MonitoredSystemLimitWarningBanner.test.tsx
index 5e768ea70..80434b873 100644
--- a/frontend-modern/src/components/shared/__tests__/MonitoredSystemLimitWarningBanner.test.tsx
+++ b/frontend-modern/src/components/shared/__tests__/MonitoredSystemLimitWarningBanner.test.tsx
@@ -207,7 +207,7 @@ describe('MonitoredSystemLimitWarningBanner', () => {
));
- expect(screen.getByText('Monitored systems: 5/6')).toBeInTheDocument();
+ expect(screen.getByText('5 monitored systems currently counted')).toBeInTheDocument();
expect(screen.getByText('Learn more')).toHaveAttribute(
'href',
'/settings/system/billing/usage?details=counting-rules',
@@ -264,7 +264,7 @@ describe('MonitoredSystemLimitWarningBanner', () => {
));
- expect(screen.getByText('Monitored systems: 5/6')).toBeInTheDocument();
+ expect(screen.getByText('5 monitored systems currently counted')).toBeInTheDocument();
expect(
screen.getByText(
/You also have 3 resources connected via API or legacy collectors \(2 Proxmox nodes, 1 Docker host\) that count once toward your monitored-system cap when the same top-level system is discovered canonically\./i,
@@ -272,7 +272,12 @@ describe('MonitoredSystemLimitWarningBanner', () => {
).toBeInTheDocument();
expect(screen.getByText('Install v6 collectors')).toHaveAttribute('href', '/settings');
expect(
- screen.getByText('Includes 1 temporary onboarding slot \(14d remaining\)', { exact: false }),
+ screen.getByText(
+ 'Community includes 5 monitored systems. 1 temporary setup slot is active (14d remaining)',
+ {
+ exact: false,
+ },
+ ),
).toBeInTheDocument();
expect(screen.getByText('Learn more')).toHaveAttribute(
'href',
@@ -300,7 +305,7 @@ describe('MonitoredSystemLimitWarningBanner', () => {
));
- expect(screen.queryByText('Monitored systems: 5/6')).not.toBeInTheDocument();
+ expect(screen.queryByText('5 monitored systems currently counted')).not.toBeInTheDocument();
expect(mockTrackUpgradeMetricEvent).not.toHaveBeenCalled();
});
});
diff --git a/frontend-modern/src/utils/__tests__/monitoredSystemPresentation.test.ts b/frontend-modern/src/utils/__tests__/monitoredSystemPresentation.test.ts
index a26857e7b..aacbdbfe8 100644
--- a/frontend-modern/src/utils/__tests__/monitoredSystemPresentation.test.ts
+++ b/frontend-modern/src/utils/__tests__/monitoredSystemPresentation.test.ts
@@ -49,15 +49,16 @@ import {
describe('monitoredSystemPresentation', () => {
it('returns canonical ledger labels and fallback copy', () => {
expect(getMonitoredSystemLedgerPresentation()).toEqual({
- briefSummary: 'Billing is based on monitored systems. Child resources are included.',
+ briefSummary:
+ 'Pulse counts top-level monitored systems. Child resources underneath them are included.',
sectionTitle: 'Monitored Systems',
panelTitle: 'Monitored System Ledger',
disclosureButtonLabel: 'View counting rules',
disclosureHideLabel: 'Hide counting rules',
disclosureDefinition:
- 'A monitored system is a top-level machine or cluster Pulse actively monitors. Each system counts once no matter how Pulse collects it. Child resources like VMs, containers, pods, disks, backups, and services are included.',
+ 'A monitored system is a top-level monitored root such as a Docker host, Kubernetes cluster, Proxmox node, standalone host, or TrueNAS system. Each root counts once no matter how Pulse collects it. Child resources like VMs, containers, pods, disks, backups, and services underneath that root are included.',
ledgerDescription:
- 'Review the monitored systems currently counted against your Pulse Pro plan limit.',
+ 'Review the top-level monitored systems currently counted against your plan limit.',
tableNameLabel: 'Name',
tableStatusLabel: 'Status',
tableLatestIncludedSignalLabel: 'Latest Included Signal',
@@ -122,7 +123,8 @@ describe('monitoredSystemPresentation', () => {
learnMoreLabel: 'Learn more',
installCollectorsLabel: 'Install v6 collectors',
upgradeLabel: 'Upgrade to add more',
- overflowSummaryPrefix: 'Includes 1 temporary onboarding slot',
+ overflowSummaryPrefix:
+ 'Community includes 5 monitored systems. 1 temporary setup slot is active',
legacyConnectionSuffix:
'that count once toward your monitored-system cap when the same top-level system is discovered canonically.',
},
@@ -142,13 +144,14 @@ describe('monitoredSystemPresentation', () => {
},
});
expect(getMonitoredSystemBriefSummary()).toBe(
- 'Billing is based on monitored systems. Child resources are included.',
+ 'Pulse counts top-level monitored systems. Child resources underneath them are included.',
);
expect(getMonitoredSystemDisclosureToggleLabel(false)).toBe('View counting rules');
expect(getMonitoredSystemDisclosureToggleLabel(true)).toBe('Hide counting rules');
- expect(getMonitoredSystemDisclosureDefinition()).toContain('top-level machine or cluster');
+ expect(getMonitoredSystemDisclosureDefinition()).toContain('Docker host');
+ expect(getMonitoredSystemDisclosureDefinition()).toContain('Proxmox node');
expect(getMonitoredSystemLedgerDescription()).toBe(
- 'Review the monitored systems currently counted against your Pulse Pro plan limit.',
+ 'Review the top-level monitored systems currently counted against your plan limit.',
);
expect(getMonitoredSystemLedgerLoadingState()).toEqual({
text: 'Loading monitored system usageā¦',
@@ -224,7 +227,7 @@ describe('monitoredSystemPresentation', () => {
expect(getMonitoredSystemLimitInstallCollectorsLabel()).toBe('Install v6 collectors');
expect(getMonitoredSystemLimitUpgradeLabel()).toBe('Upgrade to add more');
expect(formatMonitoredSystemLimitSummary({ current: 5, limit: 6 })).toBe(
- 'Monitored systems: 5/6',
+ '5 monitored systems currently counted',
);
expect(
formatMonitoredSystemLegacyConnectionBreakdown({
@@ -243,7 +246,7 @@ describe('monitoredSystemPresentation', () => {
'You also have 3 resources connected via API or legacy collectors (2 Proxmox nodes, 1 Docker host) that count once toward your monitored-system cap when the same top-level system is discovered canonically.',
);
expect(formatMonitoredSystemOverflowSummary(14)).toBe(
- 'Includes 1 temporary onboarding slot (14d remaining)',
+ 'Community includes 5 monitored systems. 1 temporary setup slot is active (14d remaining)',
);
expect(formatMonitoredSystemOverflowSummary(undefined)).toBe('');
});
diff --git a/frontend-modern/src/utils/monitoredSystemPresentation.ts b/frontend-modern/src/utils/monitoredSystemPresentation.ts
index 3c7e329b1..ed3c50420 100644
--- a/frontend-modern/src/utils/monitoredSystemPresentation.ts
+++ b/frontend-modern/src/utils/monitoredSystemPresentation.ts
@@ -9,15 +9,16 @@ const titleCaseWords = (value: string): string =>
.join(' ');
const MONITORED_SYSTEM_LEDGER_PRESENTATION = {
- briefSummary: 'Billing is based on monitored systems. Child resources are included.',
+ briefSummary:
+ 'Pulse counts top-level monitored systems. Child resources underneath them are included.',
sectionTitle: 'Monitored Systems',
panelTitle: 'Monitored System Ledger',
disclosureButtonLabel: 'View counting rules',
disclosureHideLabel: 'Hide counting rules',
disclosureDefinition:
- 'A monitored system is a top-level machine or cluster Pulse actively monitors. Each system counts once no matter how Pulse collects it. Child resources like VMs, containers, pods, disks, backups, and services are included.',
+ 'A monitored system is a top-level monitored root such as a Docker host, Kubernetes cluster, Proxmox node, standalone host, or TrueNAS system. Each root counts once no matter how Pulse collects it. Child resources like VMs, containers, pods, disks, backups, and services underneath that root are included.',
ledgerDescription:
- 'Review the monitored systems currently counted against your Pulse Pro plan limit.',
+ 'Review the top-level monitored systems currently counted against your plan limit.',
tableNameLabel: 'Name',
tableStatusLabel: 'Status',
tableLatestIncludedSignalLabel: 'Latest Included Signal',
@@ -82,7 +83,7 @@ const MONITORED_SYSTEM_LEDGER_PRESENTATION = {
learnMoreLabel: 'Learn more',
installCollectorsLabel: 'Install v6 collectors',
upgradeLabel: 'Upgrade to add more',
- overflowSummaryPrefix: 'Includes 1 temporary onboarding slot',
+ overflowSummaryPrefix: 'Community includes 5 monitored systems. 1 temporary setup slot is active',
legacyConnectionSuffix:
'that count once toward your monitored-system cap when the same top-level system is discovered canonically.',
},
@@ -349,7 +350,7 @@ export function formatMonitoredSystemLimitSummary(limit: {
current: number;
limit: number;
}): string {
- return `Monitored systems: ${limit.current}/${limit.limit}`;
+ return `${limit.current} monitored systems currently counted`;
}
export function formatMonitoredSystemLegacyConnectionBreakdown(
diff --git a/tests/integration/tests/54-monitored-system-billing-focus.spec.ts b/tests/integration/tests/54-monitored-system-billing-focus.spec.ts
index a449a1a89..d82a75eba 100644
--- a/tests/integration/tests/54-monitored-system-billing-focus.spec.ts
+++ b/tests/integration/tests/54-monitored-system-billing-focus.spec.ts
@@ -193,7 +193,9 @@ async function openPageWithUrgentMonitoredSystemBanner(page: Page) {
waitUntil: 'domcontentloaded',
});
await expect(
- page.getByRole('status').filter({ hasText: 'Monitored systems: 16/5' }),
+ page
+ .getByRole('status')
+ .filter({ hasText: '16 monitored systems currently counted' }),
).toBeVisible();
}
@@ -211,7 +213,7 @@ test.describe('Monitored-system billing focus', () => {
const banner = page
.getByRole('status')
- .filter({ hasText: 'Monitored systems: 16/5' });
+ .filter({ hasText: '16 monitored systems currently counted' });
await banner.getByRole('link', { name: 'Learn more' }).click();
await page.waitForURL(
@@ -278,7 +280,9 @@ test.describe('Monitored-system billing focus', () => {
});
await expect(
- page.getByRole('status').filter({ hasText: 'Monitored systems:' }),
+ page
+ .getByRole('status')
+ .filter({ hasText: 'monitored systems currently counted' }),
).toHaveCount(0);
await expect(
page.getByRole('link', { name: 'Upgrade to add more' }),
diff --git a/tests/integration/tests/55-self-hosted-upgrade-return.spec.ts b/tests/integration/tests/55-self-hosted-upgrade-return.spec.ts
index 8da8c2c6b..fedb98188 100644
--- a/tests/integration/tests/55-self-hosted-upgrade-return.spec.ts
+++ b/tests/integration/tests/55-self-hosted-upgrade-return.spec.ts
@@ -346,11 +346,13 @@ async function openMonitoredSystemUpgradeArrival(page: Page) {
waitUntil: "domcontentloaded",
});
await expect(
- page.getByRole("status").filter({ hasText: "Monitored systems: 16/5" }),
+ page
+ .getByRole("status")
+ .filter({ hasText: "16 monitored systems currently counted" }),
).toBeVisible();
await page
.getByRole("status")
- .filter({ hasText: "Monitored systems: 16/5" })
+ .filter({ hasText: "16 monitored systems currently counted" })
.getByRole("link", { name: "Upgrade to add more" })
.click();
await page.waitForURL(