@sleep2agi/agent-network-dashboard 0.5.3-preview.240 → 0.5.3-preview.242

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +5 -5
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +2 -2
  14. package/.next/server/app/_not-found.rsc +2 -2
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/admin.html +2 -2
  23. package/.next/server/app/admin.rsc +2 -2
  24. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  25. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  27. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  30. package/.next/server/app/index.html +2 -2
  31. package/.next/server/app/index.rsc +3 -3
  32. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  34. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  36. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  37. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/login.html +2 -2
  39. package/.next/server/app/login.rsc +3 -3
  40. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  41. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  45. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  46. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/logs.html +2 -2
  48. package/.next/server/app/logs.rsc +2 -2
  49. package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
  50. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  52. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  54. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  55. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/messages.html +2 -2
  57. package/.next/server/app/messages.rsc +2 -2
  58. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  59. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
  61. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  63. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  64. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/node.html +2 -2
  66. package/.next/server/app/node.rsc +2 -2
  67. package/.next/server/app/node.segments/_full.segment.rsc +2 -2
  68. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  69. package/.next/server/app/node.segments/_index.segment.rsc +2 -2
  70. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  72. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  73. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  74. package/.next/server/app/nodes.html +2 -2
  75. package/.next/server/app/nodes.rsc +2 -2
  76. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  77. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  78. package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
  79. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  81. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  82. package/.next/server/app/page_client-reference-manifest.js +1 -1
  83. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/server-logs.html +2 -2
  85. package/.next/server/app/server-logs.rsc +2 -2
  86. package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
  87. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  88. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  89. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  90. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  91. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app/settings/networks.html +2 -2
  94. package/.next/server/app/settings/networks.rsc +2 -2
  95. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  96. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  97. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  98. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  99. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  100. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  101. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  102. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/settings/tokens.html +2 -2
  105. package/.next/server/app/settings/tokens.rsc +2 -2
  106. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  109. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  110. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  111. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  112. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/settings.html +2 -2
  114. package/.next/server/app/settings.rsc +3 -3
  115. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  116. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  118. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  120. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  121. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  122. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  123. package/.next/server/app/tasks.html +2 -2
  124. package/.next/server/app/tasks.rsc +2 -2
  125. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  126. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  127. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  128. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  130. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  131. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  132. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  133. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +2 -2
  134. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  135. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  136. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  137. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  138. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  139. package/.next/server/middleware-build-manifest.js +3 -3
  140. package/.next/server/pages/404.html +2 -2
  141. package/.next/server/pages/500.html +1 -1
  142. package/.next/static/chunks/{0xam8-c13i0hj.css → 0culr_bidzj0m.css} +1 -1
  143. package/.next/static/chunks/{0qtwrl.z42tp2.js → 0ko8pl1vfb11p.js} +1 -1
  144. package/.next/static/chunks/{09mmy8l-4b2ix.js → 0saf_mmcwyn~f.js} +1 -1
  145. package/.next/static/chunks/{10mgpmqxdfqj3.js → 0tkm-ra70hdnw.js} +1 -1
  146. package/.next/static/chunks/{0bin~7-npgcjx.js → 0zd~0rv.o9d6h.js} +2 -2
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +17 -9
  150. package/app/globals.css +87 -2
  151. package/package.json +1 -1
  152. package/scripts/topo-h2-triple-axis-breath-test.mjs +7 -3
  153. package/scripts/topo-panel-titles-triple-axis-breath-test.mjs +161 -0
  154. package/scripts/topo-r717-triple-axis-tier-pattern-test.mjs +12 -5
  155. package/scripts/topo-respiratory-patterns-catalog-test.mjs +4 -4
  156. package/scripts/topo-respiratory-triple-axis-surfaces-catalog-test.mjs +2 -2
  157. package/scripts/topo-zoom-level-triple-axis-breath-test.mjs +148 -0
  158. /package/.next/static/{Elk45KtDHnwGqcI6BcPUR → nbnCw0V7u-b5rEvB2Od8_}/_buildManifest.js +0 -0
  159. /package/.next/static/{Elk45KtDHnwGqcI6BcPUR → nbnCw0V7u-b5rEvB2Od8_}/_clientMiddlewareManifest.js +0 -0
  160. /package/.next/static/{Elk45KtDHnwGqcI6BcPUR → nbnCw0V7u-b5rEvB2Od8_}/_ssgManifest.js +0 -0
@@ -110,9 +110,9 @@ const results = {
110
110
  attr_present: !!runtimeAttrs.triple,
111
111
  json_parses: triple !== null && parseError === null,
112
112
  is_array: Array.isArray(triple),
113
- has_3_entries: Array.isArray(triple) && triple.length === 3,
113
+ has_6_entries: Array.isArray(triple) && triple.length === 6,
114
114
  shape_valid_three_axes: validShape,
115
- anchors_match_expected: JSON.stringify(anchors) === JSON.stringify(['H2', 'kicker', 'watermark']),
115
+ anchors_match_expected: JSON.stringify(anchors) === JSON.stringify(['H2', 'kicker', 'legend', 'recent', 'watermark', 'zoom-level']),
116
116
  all_opacity_first: allOpacityFirst,
117
117
  all_text_shadow_third: allTextShadowThird,
118
118
  all_cadences_in_rolodex: cadencesInRolodex,
@@ -0,0 +1,148 @@
1
+ /* Round 727 — zoom-level readout becomes the 4TH triple-axis breath
2
+ * surface and FIRST chrome-tier (data-tier) member to gain text-shadow.
3
+ * R703 opacity (9 s) + R715 transform-scale (9 s) joined by R727
4
+ * text-shadow (9 s) — all 3 axes share the 9 s cadence in phase.
5
+ *
6
+ * Multi-cadence triple-axis tier post-R727 (4 members across 3 cadences):
7
+ * 6 s kicker + watermark (title-block + canvas-brand tiers)
8
+ * 9 s zoom-level readout (data tier) ← this round
9
+ * 10 s H2 section title (title-block tier)
10
+ *
11
+ * Glow tuning: blur 5 px (smaller pill surface), alpha 0.25 (mid-range
12
+ * between R721 kicker 0.30 sharp+bright and R725 H2 0.22 mellow-slow).
13
+ *
14
+ * Assertions:
15
+ * - CSS keyframes 0%/100% has opacity 1 + scale(1) + text-shadow: none
16
+ * - CSS keyframes 50% has opacity 0.85 + scale(0.996) + text-shadow 0 0 5px rgba(34,211,238,0.25)
17
+ * - .anet-topo-chrome-zoom-level-breath rule binds 9 s cadence (R703 preserved)
18
+ * - hover-gate selector still present (R703 leaf-element gate)
19
+ * - prefers-reduced-motion guard still present
20
+ * - runtime zoom-level span has the breath class
21
+ * - R716 catalog zoom-level entry axes = ["opacity", "transform-scale", "text-shadow"]
22
+ * - R723 catalog has 4 entries (was 3 pre-R727)
23
+ * - R723 catalog includes zoom-level with cadence 9 + axes triple
24
+ * - text-shadow now appears on 4 surfaces (kicker + watermark + H2 + zoom-level)
25
+ * - 6 s pair (kicker + watermark) still intact (R724 invariant)
26
+ * - R726 tier pattern cadences = [6, 9, 10] (R727 extended from [6, 10])
27
+ */
28
+ import { chromium } from 'playwright';
29
+ import { readFileSync } from 'node:fs';
30
+
31
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
32
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
33
+
34
+ const browser = await chromium.launch({ headless: true });
35
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
36
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
37
+ await ctx.addInitScript(() => {
38
+ try {
39
+ localStorage.setItem('anet-theme', 'cyber');
40
+ localStorage.setItem('anet-topo-layout', 'ring');
41
+ sessionStorage.setItem('anet_v3_auth', '1');
42
+ } catch {}
43
+ });
44
+ await ctx.route('**/api/hub/status*', async (route) => {
45
+ const r = await route.fetch();
46
+ const b = await r.json();
47
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
48
+ const mk = (alias) => ({
49
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
50
+ network_id: nid, project_dir: null,
51
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
52
+ });
53
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
54
+ });
55
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
56
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
57
+ const page = await ctx.newPage();
58
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
59
+ await page.waitForSelector('[data-topo-chrome-zoom-level]', { timeout: 15000, state: 'attached' });
60
+ await page.waitForTimeout(300);
61
+
62
+ const runtimeState = await page.evaluate(() => {
63
+ const zl = document.querySelector('[data-topo-chrome-zoom-level]');
64
+ if (!zl) return null;
65
+ const cs = getComputedStyle(zl);
66
+ const svg = document.querySelector('[data-topo-canvas-aria]');
67
+ return {
68
+ has_class: zl.classList.contains('anet-topo-chrome-zoom-level-breath'),
69
+ anim_name: cs.animationName,
70
+ anim_duration: cs.animationDuration,
71
+ dual_axis: svg?.getAttribute('data-topo-respiratory-dual-axis-surfaces') ?? null,
72
+ triple_axis: svg?.getAttribute('data-topo-respiratory-triple-axis-surfaces') ?? null,
73
+ patterns: svg?.getAttribute('data-topo-respiratory-patterns') ?? null,
74
+ };
75
+ });
76
+
77
+ await browser.close();
78
+
79
+ const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
80
+ const cssKf0_Triple = /@keyframes anet-topo-chrome-zoom-level-breath-kf\s*\{[\s\S]*?0%,\s*100%\s*\{[\s\S]*?opacity:\s*1[\s\S]*?transform:\s*scale\(1\)[\s\S]*?text-shadow:\s*none[\s\S]*?\}/.test(cssSrc);
81
+ const cssKf50_Triple = /@keyframes anet-topo-chrome-zoom-level-breath-kf\s*\{[\s\S]*?50%\s*\{[\s\S]*?opacity:\s*0\.85[\s\S]*?transform:\s*scale\(0\.996\)[\s\S]*?text-shadow:\s*0\s+0\s+5px\s+rgba\(34,\s*211,\s*238,\s*0\.25\)/.test(cssSrc);
82
+ const cssClassBound9s = /\.anet-topo-chrome-zoom-level-breath\s*\{[\s\S]*?animation:\s*anet-topo-chrome-zoom-level-breath-kf\s+9s\s+ease-in-out\s+infinite/.test(cssSrc);
83
+ const cssHoverGate = /\.anet-topo-chrome-zoom-level-breath\[data-topo-chrome-zoom-level-hover="true"\]\s*\{\s*animation:\s*none/.test(cssSrc);
84
+ const cssReducedMotion = /@media\s*\(prefers-reduced-motion:\s*reduce\)\s*\{[\s\S]*?\.anet-topo-chrome-zoom-level-breath\s*\{\s*animation:\s*none/.test(cssSrc);
85
+
86
+ const runtimeAnimOk = runtimeState?.anim_name === 'anet-topo-chrome-zoom-level-breath-kf' || runtimeState?.anim_name === 'none';
87
+
88
+ let dualAxisCatalog = null;
89
+ let tripleAxisCatalog = null;
90
+ let patterns = null;
91
+ try {
92
+ dualAxisCatalog = JSON.parse(runtimeState?.dual_axis ?? '');
93
+ tripleAxisCatalog = JSON.parse(runtimeState?.triple_axis ?? '');
94
+ patterns = JSON.parse(runtimeState?.patterns ?? '');
95
+ } catch {}
96
+
97
+ const zlDualEntry = Array.isArray(dualAxisCatalog) ? dualAxisCatalog.find(e => e.anchor === 'zoom-level') : null;
98
+ const zlTripleInR716 = !!zlDualEntry
99
+ && Array.isArray(zlDualEntry.axes)
100
+ && JSON.stringify(zlDualEntry.axes) === JSON.stringify(['opacity', 'transform-scale', 'text-shadow']);
101
+
102
+ const zlTripleEntry = Array.isArray(tripleAxisCatalog) ? tripleAxisCatalog.find(e => e.anchor === 'zoom-level') : null;
103
+ const zlInTripleCatalog = !!zlTripleEntry
104
+ && zlTripleEntry.cadence_s === 9
105
+ && JSON.stringify(zlTripleEntry.axes) === JSON.stringify(['opacity', 'transform-scale', 'text-shadow']);
106
+
107
+ const textShadowAnchors = Array.isArray(dualAxisCatalog)
108
+ ? dualAxisCatalog.filter(e => Array.isArray(e.axes) && e.axes.includes('text-shadow')).map(e => e.anchor).sort()
109
+ : [];
110
+ /* R728 added recent + legend to the text-shadow set (now 6 total).
111
+ * R727's specific claim was "zoom-level is in the text-shadow set" —
112
+ * widen the cardinality assertion. */
113
+ const zoomLevelInTextShadowSet = textShadowAnchors.includes('zoom-level');
114
+
115
+ const sixSecondAnchors = Array.isArray(tripleAxisCatalog)
116
+ ? tripleAxisCatalog.filter(e => e.cadence_s === 6).map(e => e.anchor).sort()
117
+ : [];
118
+ const sixSecondPairIntact = JSON.stringify(sixSecondAnchors) === JSON.stringify(['kicker', 'watermark']);
119
+
120
+ const tierEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'triple-axis-tier') : null;
121
+ /* R728 extended tier cadences to [6, 8, 9, 10]. R727's claim was that
122
+ * 9 is in the tier — widen to "9 ∈ tier.cadences". */
123
+ const tierIncludes9 = tierEntry && Array.isArray(tierEntry.cadences) && tierEntry.cadences.includes(9);
124
+
125
+ const results = {
126
+ zoom_level_present: !!runtimeState,
127
+ has_breath_class: runtimeState?.has_class === true,
128
+ runtime_anim_zl_kf: runtimeAnimOk,
129
+ css_0_100_triple_axis: cssKf0_Triple,
130
+ css_50_triple_axis_with_glow: cssKf50_Triple,
131
+ css_class_binds_9s: cssClassBound9s,
132
+ css_hover_gate_kept: cssHoverGate,
133
+ css_reduced_motion_guard: cssReducedMotion,
134
+ r716_zoom_level_three_axes: zlTripleInR716,
135
+ r723_at_least_four_entries: Array.isArray(tripleAxisCatalog) && tripleAxisCatalog.length >= 4,
136
+ r723_zoom_level_entry: zlInTripleCatalog,
137
+ zoom_level_in_text_shadow_set: zoomLevelInTextShadowSet,
138
+ six_second_pair_still_intact: sixSecondPairIntact,
139
+ r726_tier_includes_9s: !!tierIncludes9,
140
+ };
141
+ const ok = Object.values(results).every(Boolean);
142
+ console.log(`${ok ? '✅' : '❌'} R727 zoom-level triple-axis breath (4th triple-axis surface, 1st chrome data-tier @ 9s):`,
143
+ JSON.stringify(results, null, 2),
144
+ `\n ZL R716 entry: ${JSON.stringify(zlDualEntry)}`,
145
+ `\n ZL R723 entry: ${JSON.stringify(zlTripleEntry)}`,
146
+ `\n text-shadow surfaces: ${JSON.stringify(textShadowAnchors)}`,
147
+ `\n R726 tier cadences: ${JSON.stringify(tierEntry?.cadences)}`);
148
+ process.exit(ok ? 0 : 1);