style(portal): clarify suspended overview posture

This commit is contained in:
rcourtman 2026-03-28 01:56:30 +00:00
parent 887c8d3168
commit ac798ea2d8
4 changed files with 20 additions and 9 deletions

View file

@ -1,5 +1,5 @@
{
"source_hash": "53ef52e68bc30e2c6f494ddab770cd1a0c307b7b7521a22db366b067e603235f",
"source_hash": "fff9a599aa20c8a365424cb8744df17dde3d643784358165e71e9b3ab07d786c",
"build_inputs": [
"package.json",
"tsconfig.json",

View file

@ -1836,10 +1836,10 @@
var checkingCount = countWorkspacesByHealth(workspaces, "checking");
var unhealthyCount = countWorkspacesByHealth(workspaces, "unhealthy");
var suspendedCount = countWorkspacesByState(workspaces, "suspended");
var postureTitle = unhealthyCount > 0 ? "Hosted posture needs review" : checkingCount > 0 ? "Hosted posture is still settling" : "Hosted posture is stable";
var postureCopy = unhealthyCount > 0 ? "One or more workspaces still need attention before the hosted fleet is trustworthy." : checkingCount > 0 ? "The hosted fleet is mostly healthy, but some workspaces are still waiting on a completed health check." : "The hosted fleet is healthy and ready for routine operator work.";
var nextStepTitle = unhealthyCount > 0 ? "Start in Workspaces" : checkingCount > 0 ? "Review pending checks" : "Fleet is clear";
var nextStepCopy = unhealthyCount > 0 ? "One or more workspaces need review before you treat the hosted fleet as trustworthy." : checkingCount > 0 ? "The fleet is mostly healthy, but there are still workspaces waiting on a completed health check." : "Hosted posture looks stable. Move into team or account services only if you need to change access or billing.";
var postureTitle = unhealthyCount > 0 ? "Hosted posture needs review" : checkingCount > 0 ? "Hosted posture is still settling" : suspendedCount > 0 ? "Active fleet is stable" : "Hosted posture is stable";
var postureCopy = unhealthyCount > 0 ? "One or more workspaces still need attention before the hosted fleet is trustworthy." : checkingCount > 0 ? "The hosted fleet is mostly healthy, but some workspaces are still waiting on a completed health check." : suspendedCount > 0 ? "Active hosted workspaces are healthy while suspended workspaces stay parked until you resume them." : "The hosted fleet is healthy and ready for routine operator work.";
var nextStepTitle = unhealthyCount > 0 ? "Start in Workspaces" : checkingCount > 0 ? "Review pending checks" : suspendedCount > 0 ? "Active fleet is clear" : "Fleet is clear";
var nextStepCopy = unhealthyCount > 0 ? "One or more workspaces need review before you treat the hosted fleet as trustworthy." : checkingCount > 0 ? "The fleet is mostly healthy, but there are still workspaces waiting on a completed health check." : suspendedCount > 0 ? "Active hosted workspaces look stable. Resume a suspended workspace only when you are ready to bring it back into the operator path." : "Hosted posture looks stable. Move into team or account services only if you need to change access or billing.";
var nextStepChecklist = unhealthyCount > 0 ? '<div class="overview-next-checklist"><div class="overview-next-check"><strong>1. Review attention items</strong><span>Open the fleet and inspect any workspace marked as checking or needs attention.</span></div><div class="overview-next-check"><strong>2. Resolve operator blockers</strong><span>Use Team if the right people are not already attached to the hosted account.</span></div><div class="overview-next-check"><strong>3. Escalate billing separately</strong><span>Keep account billing or self-hosted license work out of the workspace review flow.</span></div></div>' : checkingCount > 0 ? '<div class="overview-next-checklist"><div class="overview-next-check"><strong>1. Verify pending health checks</strong><span>Open the workspaces still settling and confirm they are safe to operate.</span></div><div class="overview-next-check"><strong>2. Keep the roster lean</strong><span>Review Team only if a pending workspace needs a different operator mix.</span></div><div class="overview-next-check"><strong>3. Leave billing as a separate action</strong><span>Use account services or billing only when the hosted fleet is already understood.</span></div></div>' : '<div class="overview-next-checklist"><div class="overview-next-check"><strong>1. Use Workspaces for the next operational task</strong><span>Open a client workspace directly when you are ready to do hosted work.</span></div><div class="overview-next-check"><strong>2. Use Team for access changes only</strong><span>Keep roster changes explicit instead of mixing them into routine workspace work.</span></div><div class="overview-next-check"><strong>3. Use account services when the task is commercial</strong><span>Licenses, refunds, privacy, and self-hosted billing stay in their own section.</span></div></div>';
var nextStepActions = '<div class="overview-next-actions"><button class="btn-primary btn-compact" type="button" data-shell-action="activate-section" data-shell-section="workspaces">Open workspaces</button><button class="btn-secondary btn-compact" type="button" data-shell-action="activate-section" data-shell-section="' + (account.can_manage ? "team" : "services") + '">' + (account.can_manage ? "Review team access" : "Open account services") + "</button></div>";
return '<section class="account-content-panel account-content-panel-overview"><div class="account-stage-header account-stage-header-overview"><div><div class="account-panel-kicker">Overview</div><h3>Hosted posture</h3><p>Start here to judge fleet posture, pick the next operator action, and keep commercial account work separate from hosted operations.</p></div></div><div class="account-command-deck"><div class="account-overview-card"><div class="account-overview-lead"><div class="account-panel-kicker">Fleet posture</div><h3>' + escapeHTML(postureTitle) + "</h3><p>" + escapeHTML(postureCopy) + '</p><div class="account-overview-callout">' + escapeHTML(

View file

@ -283,6 +283,9 @@ describe('shell view', function() {
expect(html).toContain('Suspended until you resume it');
expect(html).toContain('Active fleet is stable');
expect(html).toContain('Active hosted workspaces are healthy while suspended workspaces stay parked until you resume them.');
expect(html).toContain('Active fleet is clear');
expect(html).toContain('Active hosted workspaces look stable. Resume a suspended workspace only when you are ready to bring it back into the operator path.');
expect(html).toContain('Active hosted workspaces are healthy. Suspended workspaces stay parked until you resume them.');
expect(html).toContain('Suspended stays parked');
});

View file

@ -350,22 +350,30 @@ function renderAccountOverviewSection(account: PortalAccountSummary): string {
? 'Hosted posture needs review'
: checkingCount > 0
? 'Hosted posture is still settling'
: 'Hosted posture is stable';
: suspendedCount > 0
? 'Active fleet is stable'
: 'Hosted posture is stable';
var postureCopy = unhealthyCount > 0
? 'One or more workspaces still need attention before the hosted fleet is trustworthy.'
: checkingCount > 0
? 'The hosted fleet is mostly healthy, but some workspaces are still waiting on a completed health check.'
: 'The hosted fleet is healthy and ready for routine operator work.';
: suspendedCount > 0
? 'Active hosted workspaces are healthy while suspended workspaces stay parked until you resume them.'
: 'The hosted fleet is healthy and ready for routine operator work.';
var nextStepTitle = unhealthyCount > 0
? 'Start in Workspaces'
: checkingCount > 0
? 'Review pending checks'
: 'Fleet is clear';
: suspendedCount > 0
? 'Active fleet is clear'
: 'Fleet is clear';
var nextStepCopy = unhealthyCount > 0
? 'One or more workspaces need review before you treat the hosted fleet as trustworthy.'
: checkingCount > 0
? 'The fleet is mostly healthy, but there are still workspaces waiting on a completed health check.'
: 'Hosted posture looks stable. Move into team or account services only if you need to change access or billing.';
: suspendedCount > 0
? 'Active hosted workspaces look stable. Resume a suspended workspace only when you are ready to bring it back into the operator path.'
: 'Hosted posture looks stable. Move into team or account services only if you need to change access or billing.';
var nextStepChecklist = unhealthyCount > 0
? (
'<div class="overview-next-checklist">' +