import {C,screen,rect,text,label,icon,line,card,metric,pill,button,tabs,table,chart,progress,aiNote,codeBlock,steps,rowList,field,donut} from './design-lib.mjs';
export const genericScreens=[];
function listPage(id,title,chapter,section,{subtitle,headers,rows,widths,tabs:tabNames,action,summary,target,notes}={}){screen(id,title,chapter,section,()=>{let y=190;if(tabNames){tabs(256,y,1152,tabNames);y+=70;}if(summary){aiNote(256,y,1152,summary[0],summary[1],{h:101,target:summary[2]||null});y+=125;}card(256,y,1152,Math.min(904-y,520),title+' / Workspace',notes||'Search, filter, and inspect the records that matter.',()=>{table(22,90,1108,headers,rows,{widths,rowH:68,targets:rows.map(()=>target)});});if(y+530<934)text(257,y+544,'Saved views retain filters, sorting, scope, and time range.',11,C.muted);},{subtitle,action:action?{label:action[0],target:action[1]}:undefined});}
export function operations(){
screen('metrics','Observability','06 / Observability & operations','Observability',()=>{
tabs(256,186,1152,['Metrics','Logs','Events','Alerts','Operations']);pill(256,255,'eu-prod-01','neutral');pill(391,255,'Last 6 hours','neutral');pill(526,255,'Live · 15s refresh','green');
metric(256,310,271,'CPU','43%','20.6 / 48 cores');metric(547,310,271,'Memory','61%','117 / 192 GiB');metric(838,310,271,'Network ingress','86 MB/s','Across 12 nodes');metric(1129,310,279,'Pod restarts','2','Last 6 hours','amber');
[['CPU utilisation','Cores used / capacity'],['Memory working set','GiB used / requested'],['Network throughput','Receive / transmit · MB/s'],['Pod restarts','By namespace · count']].forEach(([a,b],i)=>card(256+i%2*587,462+Math.floor(i/2)*231,565,212,a,b,()=>{chart(22,84,521,104,{seed:i+1,secondary:i===2});}));
},{subtitle:'Metrics, logs, events, and changes share one time window.',description:'Prometheus integration availability and explicit missing/stale states replace simulated monitoring values.'});

screen('logs','Log explorer','06 / Observability & operations','Observability',()=>{
tabs(256,186,1152,['Metrics','Logs','Events','Alerts','Operations'],1);pill(256,254,'eu-prod-01','neutral');pill(391,254,'commerce','neutral');pill(522,254,'checkout','neutral');pill(643,254,'Last 15 minutes','neutral');button(1248,251,'Pause stream',{w:160,kind:'secondary',icon:'pause'});
rect(256,309,1152,45,C.paper,8,C.line);icon('search',273,323,16);text(302,322,'level:error OR duration_ms > 500',13,C.ink,400,1012,{mono:true});
codeBlock(256,380,1152,360,['10:23:02.113 INFO  checkout-7df8  server ready on :8080','10:23:03.048 INFO  checkout-7df8  request_id=7c2e GET /healthz 200 2ms','10:23:04.241 INFO  checkout-9ac1  request_id=18b4 POST /checkout 200 184ms','10:23:05.177 WARN  checkout-7df8  upstream retry attempt=1 service=inventory','10:23:05.382 INFO  checkout-7df8  upstream retry succeeded duration=205ms','10:23:06.009 INFO  checkout-9ac1  request_id=91ff GET /cart 200 62ms','10:23:06.781 INFO  checkout-7df8  request_id=710a POST /checkout 200 182ms','10:23:07.144 INFO  checkout-9ac1  healthcheck status=healthy','','Live stream · 2 pods · sensitive fields redacted'],{title:'Application logs · UTC · newest at bottom'});
aiNote(256,764,1152,'Explain this time window','Attach the current query and selected lines to an investigation. The cluster, namespace, and time range travel with the evidence.',{h:137,target:'ai-investigation'});
},{subtitle:'A focused log workspace with explicit scope, streaming controls, and explainable filters.'});

listPage('events','Events','06 / Observability & operations','Observability',{subtitle:'Cluster events grouped by resource and repeated occurrence.',tabs:['Metrics','Logs','Events','Alerts','Operations'],headers:['EVENT','RESOURCE','COUNT','LAST SEEN','TYPE'],rows:[['SuccessfulCreate','ReplicaSet / checkout','4','2 min ago',{text:'Normal',kind:'green'}],['Started','Pod / checkout-7df8','1','3 min ago',{text:'Normal',kind:'green'}],['FailedScheduling','Pod / analytics-6b5c4','3','18 min ago',{text:'Warning',kind:'amber'}],['BackOff','Pod / analytics-9m4q1','8','20 min ago',{text:'Warning',kind:'amber'}]],widths:[251,333,99,165,260],target:'pod-detail'});
listPage('alerts','Alerts','06 / Observability & operations','Observability',{subtitle:'Symptoms with ownership, escalation, and linked investigations.',summary:['2 active alerts · 1 investigation running','Related firings are grouped into incidents, with acknowledgement and snooze states kept visible.','inbox'],headers:['ALERT','SCOPE','SEVERITY','STATE','OWNER'],rows:[['Checkout latency above SLO','eu-prod-01 / commerce',{text:'High',kind:'amber'},{text:'Investigating',kind:'blue'},'SRE agent'],['Deployment replicas unavailable','eu-prod-02 / data',{text:'Critical',kind:'red'},{text:'Firing',kind:'red'},'Platform on-call'],['Node memory pressure','All production',{text:'Warning',kind:'amber'},{text:'Resolved',kind:'green'},'Platform on-call']],widths:[342,247,136,178,205],target:'alert-detail',action:['Create alert','alert-create']});
screen('alert-detail','Checkout latency above SLO','06 / Observability & operations','Observability',()=>{
tabs(256,187,1152,['Overview','Firings','Checks','History','Configuration']);pill(256,253,'Investigating','blue');pill(395,253,'High severity','amber');
card(256,307,746,307,'Alert signal','p95 latency > 500 ms for 5 minutes',()=>{chart(22,87,700,168,{seed:3});text(22,270,'Threshold: 500 ms · source: Prometheus',11,C.muted,400,700);});
card(1024,307,384,307,'Routing & ownership',null,()=>{[['Owner','Platform on-call'],['Destination','Slack / #platform'],['Automation','Incident triage'],['State','Acknowledged'],['First fired','09:58 UTC']].forEach(([a,b],i)=>{text(22,81+i*41,a,12,C.muted);text(163,81+i*41,b,12,C.ink,500,199);});});
card(256,638,1152,271,'Linked investigation','TASK-142 · SRE agent',()=>{text(22,88,'Memory pressure was found after the checkout rollout.',18,C.ink,600,1058);text(22,132,'A proposed change is ready for review. The alert stays linked to the recovery receipt.',13,C.muted,400,1070);button(22,192,'Review proposed plan',{w:226,target:'ai-plan',icon:'arrow'});button(267,192,'View firing history',{w:203,target:'agent-runs',kind:'secondary'});});
},{subtitle:'The symptom, the response, and the outcome stay connected.'});

listPage('operations','Operations','06 / Observability & operations','Observability',{subtitle:'Durable infrastructure operations across your workspace.',tabs:['All operations','Running','Needs attention','Completed'],headers:['OPERATION','TARGET','TRIGGERED BY','DURATION','STATUS'],rows:[['Deploy commerce stack','eu-prod-01','Alex Morgan','2m 18s',{text:'Verified',kind:'green'}],['Provision eu-prod-03','Hetzner / Helsinki','Alex Morgan','3m 42s',{text:'Running',kind:'blue'}],['Upgrade observability chart','eu-prod-02','Delivery agent','1m 28s',{text:'Failed',kind:'red'}],['Rotate provider credential','Organisation','Alex Morgan','24s',{text:'Completed',kind:'green'}]],widths:[333,263,216,130,166],target:'operation-detail'});
screen('operation-detail','Deploy commerce / OP-928','06 / Observability & operations','Observability',()=>{
tabs(256,188,1152,['Timeline','Task board','Resources','Logs','Receipt']);pill(256,255,'Completed','green');text(386,261,'Approved by Alex Morgan · 10:18 UTC · 2m 18s',12,C.muted);
card(256,311,743,602,'Execution timeline','Dependencies are respected between waves.',()=>{rowList(22,91,698,[{title:'Validate draft and resource versions',detail:'10:18:02 UTC · exact approved diff matched',status:'Passed'},{title:'Resolve namespace and dependencies',detail:'10:18:11 UTC · PostgreSQL + Redis ready',status:'Done'},{title:'Apply deployment',detail:'10:18:16 UTC · checkout updated',status:'Done'},{title:'Wait for readiness',detail:'10:19:04 UTC · 4 / 4 pods ready',status:'Passed'},{title:'Record operation receipt',detail:'10:20:20 UTC · artifacts and logs saved',status:'Saved'}]);button(22,510,'View change receipt',{w:216,kind:'secondary',target:'ai-execution',icon:'file'});});
card(1021,311,387,297,'Operation context',null,()=>{[['Target','eu-prod-01'],['Stack','commerce'],['Plan','AP-204'],['Source','User-approved AI plan']].forEach(([a,b],i)=>{text(22,81+i*46,a,12,C.muted);text(142,81+i*46,b,12,C.ink,500,223);});});aiNote(1021,631,387,'Recovery is explicit','A failed task exposes retry conditions and rollback options. Completed steps remain visible.',{h:158,target:'state-partial-failure'});
},{subtitle:'One durable record from approval through completion.'});

screen('security','Security center','07 / Security & cost','Security',()=>{
tabs(256,185,1152,[{label:'Overview',target:'security'},{label:'Findings',target:'security-findings'},{label:'Workloads',target:'security-workloads'},{label:'SBOM',target:'security-sbom'},{label:'Policies',target:'security-policies'},{label:'Network exposure',target:'security-network'},{label:'Compliance',target:'compliance'}]);
rect(256,251,1152,51,C.amberSoft,8);icon('info',272,267,18,C.amber);text(303,266,'Coverage is partial. 1 cluster has stale scan data. Last fresh scan: 18 minutes ago.',13,C.amber,500,1034);
metric(256,326,272,'Critical findings','3','18 observed occurrences','red');metric(547,326,272,'Fixable severe','42','Occurrences with a published fix');metric(838,326,272,'Fresh coverage','92%','11 / 12 clusters scanned','amber');metric(1129,326,279,'Accepted risks','2','1 requires review this week','amber');
card(256,477,745,405,'Remediation priorities','Ranked by exploitation, severity, reach, and fix availability',()=>{table(22,86,700,['FINDING','REACH','FIX','PRIORITY'],[['ADV-2026-0142|crypto library · example advisory','4 workloads','Available',{text:'Critical',kind:'red'}],['ADV-2026-0097|RPC library · example advisory','2 workloads','Available',{text:'High',kind:'amber'}],['ADV-2026-0064|base image · example advisory','8 workloads','Available',{text:'High',kind:'amber'}]],{widths:[341,133,111,115],rowH:80,targets:Array(3).fill('security-finding')});});
card(1023,477,385,405,'Actionable risk trend','Last 30 days · observed occurrences',()=>{chart(22,91,340,188,{seed:4});text(22,321,'−28% since the start of this period',14,C.green,600,339);text(22,355,'A stale scan is never counted as clear.',12,C.muted,400,339);});
},{subtitle:'Understand exposure. Prioritize fixes. Preserve review decisions.',action:{label:'Export report',target:'compliance',icon:'file'}});

listPage('security-findings','Security findings','07 / Security & cost','Security',{subtitle:'Unique advisories and observed occurrences are shown separately.',tabs:['All findings','Critical','Fix available','Known exploited','Reviewed'],headers:['FINDING / PACKAGE','SEVERITY','OCCURRENCES','FIX','REVIEW'],rows:[['ADV-2026-0142|crypto library · example',{text:'Critical',kind:'red'},'8 in 4 workloads','Available',{text:'Open',kind:'amber'}],['ADV-2026-0097|RPC library · example',{text:'High',kind:'amber'},'6 in 2 workloads','Available',{text:'Open',kind:'amber'}],['ADV-2026-0064|base image · example',{text:'High',kind:'amber'},'12 in 8 workloads','Available',{text:'Acknowledged',kind:'blue'}],['ADV-2026-0011|utility package · example',{text:'Medium',kind:'neutral'},'2 in 1 workload','Not yet',{text:'Accepted risk',kind:'neutral'}]],widths:[339,163,242,161,203],target:'security-finding'});
screen('security-finding','ADV-2026-0142','07 / Security & cost','Security',()=>{
pill(256,191,'Critical','red');pill(352,191,'Fix available','green');text(499,198,'Illustrative advisory · not a real CVE',11,C.muted);
card(256,252,745,253,'Crypto library vulnerability','Example package advisory for design demonstration',()=>{text(22,87,'A vulnerable dependency is present in four running workloads.\nAn upgrade is available and requires a rebuilt application image.',17,C.ink,400,699);text(22,163,'Installed: 1.2.0       Fixed: 1.2.3       Occurrences: 8',13,C.muted,400,699);text(22,207,'Source: scanner report · last observed 18 minutes ago',11,C.muted,400,699);});
card(1023,252,385,372,'Remediation plan',null,()=>{rowList(22,85,340,[{title:'Update dependency',detail:'Prepare a versioned pull request',icon:'git'},{title:'Rebuild and rescan',detail:'Verify the new image is clear',icon:'shield'},{title:'Review production rollout',detail:'Human approval is required',icon:'user'}]);button(22,306,'Prepare fix with Ankra',{w:340,target:'ai-plan',icon:'spark'});});
card(256,527,745,377,'Affected workloads','Grouped by running image digest',()=>{table(22,86,700,['WORKLOAD','CLUSTER','IMAGE'],[['checkout','eu-prod-01','checkout:v2.8.3'],['identity','eu-prod-01','identity:v1.7.1'],['billing-api','eu-prod-02','billing:v1.4.2']],{widths:[219,220,261],targets:['workload-detail','workload-detail','workload-detail'],rowH:68});});aiNote(1023,647,385,'Review a risk exception','Accepting risk requires an owner, rationale, scope, and expiry. It does not make the vulnerability disappear.',{h:178,target:'security-policies'});
},{subtitle:'Evidence, affected resources, and a path to remediation.'});

screen('cost','Cost intelligence','07 / Security & cost','Cost',()=>{
tabs(256,186,1152,[{label:'Overview',target:'cost'},{label:'Clusters',target:'cost-clusters'},{label:'Workloads',target:'cost-workloads'},{label:'Savings',target:'cost-savings'},{label:'Provider costs',target:'cost-providers'},{label:'Settings',target:'cost-settings'}]);
metric(256,253,272,'Month-to-date spend','€1,942','Provider estimate · EUR','neutral');metric(547,253,272,'Forecast this month','€8,420','7% below last month');metric(838,253,272,'Potential savings','€1,180','3 reviewable opportunities');metric(1129,253,279,'Cost coverage','92%','11 of 12 clusters priced','amber');
card(256,404,745,321,'Spend over time','Last 30 days · actual where available, estimate otherwise',()=>{chart(22,88,700,183,{seed:2});text(22,283,'EUR · excludes platform subscription fees and unpriced resources',10,C.muted,400,699);});
card(1023,404,385,321,'Where the money goes','Monthly forecast by service category',()=>{[['Compute','€6,120',.73],['Storage','€1,460',.17],['Network','€620',.075],['Other','€220',.025]].forEach(([a,b,p],i)=>{text(22,85+i*53,a,12,C.muted);text(280,85+i*53,b,12,C.ink,500);progress(22,112+i*53,340,p);});});
card(256,749,1152,174,'A considered path to lower spend','Recommendations include the supporting utilization data and a proposed change.',()=>{text(22,87,'Right-size staging nodes',17,C.ink,600,595,{target:'cost-savings'});text(22,123,'6 → 3 nodes · 7-day utilisation evidence · rollback available',12,C.muted,400,775);text(896,77,'€420 / mo',26,C.green,600,226);text(896,121,'Review opportunity  →',12,C.green,600,226,{target:'cost-savings'});});
},{subtitle:'See what is known, what is estimated, and what can be improved.'});

screen('cost-savings','Savings opportunities','07 / Security & cost','Cost',()=>{
card(256,192,1152,151,null,null,()=>{label(25,23,'Estimated monthly opportunity');text(25,56,'€1,180',44,C.green,600,400);text(388,71,'3 plans backed by utilisation data.\nNo changes are applied automatically.',15,C.muted,400,680);});
card(256,368,745,522,'Right-size the staging node pool','eu-staging-01 · General pool',()=>{pill(22,87,'€420 / month','green');text(22,135,'Average CPU utilisation is 12% across 6 staging nodes.\nReduce the minimum to 3 while keeping autoscaling to 6.',17,C.ink,500,700);chart(22,223,700,146,{seed:6});text(22,393,'Evidence window: 7 days · forecast confidence: medium\nChecks: pod disruption budgets, capacity headroom, peak demand',12,C.muted,400,700);button(22,458,'Review right-sizing plan',{w:241,target:'ai-plan',icon:'arrow'});});
card(1023,368,385,254,'Other opportunities',null,()=>{text(22,82,'Remove unattached volumes',14,C.ink,600,340);text(22,115,'€180 / month · 14-day inactivity',12,C.muted,400,340);line(22,155,340);text(22,184,'Schedule development capacity',14,C.ink,600,340);text(22,217,'€580 / month · outside working hours',12,C.muted,400,340);});aiNote(1023,645,385,'Tradeoffs stay visible','Savings are estimates. Review resilience, performance, and provider pricing before approving a change.',{h:171,target:null});
},{subtitle:'A savings number is useful when the change behind it is clear.'});

screen('compliance','Compliance workspace','07 / Security & cost','Security',()=>{
tabs(256,188,1152,['Benchmarks','Evidence','Exceptions','Reports']);metric(256,254,369,'Controls passed','184 / 201','Across scanned clusters');metric(647,254,369,'Needs remediation','12','5 high-priority controls','amber');metric(1038,254,370,'Not assessed','5','No evidence available','amber');
card(256,405,1152,453,'Kubernetes benchmark controls','Assessment is evidence-based; this is not a certification claim.',()=>{table(22,91,1108,['CONTROL','SCOPE','EVIDENCE','OWNER','STATUS'],[['Restrict privileged workloads','All production','Policy + admission report','Platform',{text:'Passed',kind:'green'}],['Enforce image provenance','All production','Signature verification','Security',{text:'Passed',kind:'green'}],['Rotate service credentials','eu-prod-02','Rotation overdue','Platform',{text:'Needs action',kind:'amber'}],['Audit private network exposure','onprem-01','Scan unavailable','Security',{text:'Not assessed',kind:'neutral'}]],{widths:[361,217,231,120,179],rowH:69,target:'security-policies'});});
},{subtitle:'Controls, owners, evidence freshness, and exportable assessment reports.',action:{label:'Export report',target:'compliance-report',icon:'file'}});

const families=[
['networking','Networking','05 / Infrastructure','Infrastructure','Services, ingress, policies, and mesh connectivity.', ['Services','Ingresses','Ingress classes','Network policies'],['RESOURCE','NAMESPACE','TYPE','ENDPOINT','HEALTH'],[['checkout','commerce','ClusterIP','10.43.12.80:8080',{text:'Ready',kind:'green'}],['storefront','commerce','Ingress','shop.northstar.example',{text:'Ready',kind:'green'}],['metrics','observability','ClusterIP','10.43.19.14:9090',{text:'Ready',kind:'green'}]],'resource-detail'],
['storage','Storage','05 / Infrastructure','Infrastructure','Claims, volumes, storage classes, and CSI drivers.', ['Claims','Volumes','Storage classes','CSI drivers'],['NAME','NAMESPACE','CAPACITY','CLASS','STATUS'],[['data-postgres-0','commerce','100 GiB','fast-ssd',{text:'Bound',kind:'green'}],['data-redis-0','commerce','10 GiB','fast-ssd',{text:'Bound',kind:'green'}],['prometheus-data','observability','250 GiB','standard',{text:'Bound',kind:'green'}]],'resource-detail'],
['configuration','Configuration & secrets','05 / Infrastructure','Infrastructure','Namespaces, ConfigMaps, secrets, RBAC, and custom resources.', ['ConfigMaps','Secrets','RBAC','Namespaces','CRDs'],['NAME','NAMESPACE','KIND','USED BY','STATUS'],[['checkout-config','commerce','ConfigMap','checkout',{text:'Synced',kind:'green'}],['database-credentials','commerce','Secret · values hidden','PostgreSQL',{text:'Synced',kind:'green'}],['platform-readonly','system','ClusterRole','Platform team',{text:'Synced',kind:'green'}]],'resource-detail'],
['resources','Resource inventory','05 / Infrastructure','Infrastructure','Platform resources, version history, dependencies, and operation jobs.', ['All resources','Cloud','Kubernetes','Changed recently'],['RESOURCE','KIND','OWNER','REVISION','STATE'],[['worker-01','Compute instance','eu-prod-01','v12',{text:'Ready',kind:'green'}],['commerce-db','Persistent volume','commerce','v4',{text:'Ready',kind:'green'}],['checkout','Deployment','commerce','v1842',{text:'Ready',kind:'green'}]],'resource-detail'],
['registries','Chart registries','04 / Applications & delivery','Stacks & catalog','HTTP and OCI chart sources, credentials, indexing, and exclusions.', ['All registries','Organisation','Global'],['REGISTRY','TYPE','CHARTS','LAST SYNC','STATUS'],[['Northstar charts','OCI','24','12 min ago',{text:'Indexed',kind:'green'}],['Community charts','HTTP','186','1 hour ago',{text:'Indexed',kind:'green'}],['Private catalog','OCI','18','3 min ago',{text:'Syncing',kind:'blue'}]],'registry-detail'],
['agent-runs','Agent run history','03 / Intelligence','Intelligence','Durable sessions, costs, results, and required decisions.', ['All runs','Live','Needs attention','Completed'],['RUN','AGENT','DURATION','SPEND','OUTCOME'],[['Checkout latency','SRE agent','18m 24s','€4.20',{text:'Review',kind:'amber'}],['Nightly drift review','Auditor','9m 12s','€2.10',{text:'Verified',kind:'green'}],['Dependency patch','Security reviewer','6m 18s','€1.80',{text:'Verified',kind:'green'}]],'agent-run-detail'],
['conditions','Conditions & insights','03 / Intelligence','Intelligence','Persistent gaps and observations, deduplicated across repeat runs.', ['Open','Acknowledged','Resolved','Recurring'],['CONDITION','SCOPE','FIRST SEEN','RECURRENCE','STATE'],[['Missing resource limits','eu-staging-01','2 days ago','4 occurrences',{text:'Open',kind:'amber'}],['Stale vulnerability scan','onprem-01','Today','1 occurrence',{text:'Open',kind:'amber'}],['Deployment drift','eu-prod-01','Yesterday','2 occurrences',{text:'Resolved',kind:'green'}]],'condition-detail'],
['security-workloads','Workload risk','07 / Security & cost','Security','Image-level exposure with workload ownership and scan freshness.', ['Workloads','Clusters','Images'],['WORKLOAD','IMAGE','CRITICAL','FIXABLE','SCAN'],[['checkout','checkout:v2.8.3','2','8',{text:'Fresh',kind:'green'}],['identity','identity:v1.7.1','1','6',{text:'Fresh',kind:'green'}],['analytics','analytics:v1.9.2','Unknown','Unknown',{text:'Stale',kind:'amber'}]],'security-finding'],
['security-sbom','Software bill of materials','07 / Security & cost','Security','Packages, licenses, image digests, and scanner provenance.', ['Packages','Images','Licenses'],['PACKAGE','VERSION','LICENSE','IMAGES','EXPOSURE'],[['crypto-library','1.2.0','BSD-3-Clause','4',{text:'Fix available',kind:'amber'}],['http-router','2.6.1','MIT','8',{text:'No known finding',kind:'green'}],['runtime-base','1.1.0','Apache-2.0','12',{text:'Review',kind:'amber'}]],'security-finding'],
['security-policies','Policies & risk decisions','07 / Security & cost','Security','Every exception has an owner, scope, rationale, and expiry.', ['Admission policies','Accepted risks','Review queue'],['POLICY / DECISION','SCOPE','OWNER','REVIEW DATE','STATE'],[['Require non-root containers','Production','Security team','Continuous',{text:'Enforced',kind:'green'}],['Temporary legacy image exception','legacy-api','Alex Morgan','14 Sep 2026',{text:'Review due',kind:'amber'}],['Require image signatures','Production','Platform team','Continuous',{text:'Enforced',kind:'green'}]],'policy-detail'],
['security-network','Network exposure','07 / Security & cost','Security','Public endpoints and overly permissive network policies.', ['Public endpoints','Network policies','Reachability'],['ENDPOINT','SERVICE','EXPOSURE','TLS','REVIEW'],[['shop.northstar.example','storefront','Public','Valid',{text:'Expected',kind:'green'}],['api.northstar.example','checkout','Public','Valid',{text:'Expected',kind:'green'}],['debug.northstar.example','debug-console','Public','Valid',{text:'Needs review',kind:'amber'}]],'policy-detail'],
['cost-clusters','Cost by cluster','07 / Security & cost','Cost','Provider-priced cost, utilisation, allocation, and confidence.', ['Clusters','Compare','Unpriced'],['CLUSTER','MONTH TO DATE','FORECAST','UTILISATION','SOURCE'],[['eu-prod-01','€648','€2,810','43% CPU','Provider estimate'],['eu-prod-02','€922','€3,990','61% CPU','Provider estimate'],['eu-staging-01','€290','€1,260','12% CPU','Provider estimate']], 'cost-compare'],
['cost-workloads','Cost by workload','07 / Security & cost','Cost','Allocated workload cost with clear shared-cost attribution.', ['Applications','Namespaces','Unallocated'],['WORKLOAD','CLUSTER','ALLOCATED COST','IDLE SHARE','OWNER'],[['checkout','eu-prod-01','€248 / mo','€28','Commerce'],['storefront','eu-prod-01','€164 / mo','€19','Commerce'],['analytics','eu-prod-02','€412 / mo','€82','Data platform']],'cost-savings'],
['cost-providers','Provider cost sources','07 / Security & cost','Cost','Credentials, currencies, price freshness, and confidence.', ['Connected sources','Coverage'],['SOURCE','CURRENCY','PRICING','LAST UPDATED','COVERAGE'],[['Hetzner production','EUR','List price','2 hours ago',{text:'Complete',kind:'green'}],['AWS production','EUR','Custom estimate','Yesterday',{text:'Complete',kind:'green'}],['Proxmox private','EUR','Internal rate card','3 days ago',{text:'Partial',kind:'amber'}]],'cost-settings'],
['activity-snoozes','Snoozed activity','06 / Observability & operations','Inbox','Temporary noise reduction with a visible owner and expiration.', ['Active snoozes','Expired'],['ITEM','SCOPE','SNOOZED BY','UNTIL','STATE'],[['Nightly maintenance alerts','eu-staging-01','Alex Morgan','Tomorrow · 06:00',{text:'Snoozed',kind:'neutral'}],['Legacy image warning','legacy-api','Sam Chen','14 Sep · 09:00',{text:'Snoozed',kind:'neutral'}]],'inbox']
];
for(const [id,title,chapter,section,subtitle,tabNames,headers,rows,target] of families)listPage(id,title,chapter,section,{subtitle,tabs:tabNames,headers,rows,widths:[315,224,192,183,194],target});
}
