@sleep2agi/agent-network-dashboard 0.5.3-preview.24 → 0.5.3-preview.241
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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +7 -7
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +2 -2
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/server/app/admin.html +2 -2
- package/.next/server/app/admin.rsc +2 -2
- package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
- package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
- package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +3 -3
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +2 -2
- package/.next/server/app/login.rsc +3 -3
- package/.next/server/app/login.segments/_full.segment.rsc +3 -3
- package/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/server/app/login.segments/_index.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/logs.html +2 -2
- package/.next/server/app/logs.rsc +2 -2
- package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
- package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
- package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
- package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
- package/.next/server/app/messages.html +2 -2
- package/.next/server/app/messages.rsc +2 -2
- package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
- package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
- package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
- package/.next/server/app/node/page_client-reference-manifest.js +1 -1
- package/.next/server/app/node.html +2 -2
- package/.next/server/app/node.rsc +2 -2
- package/.next/server/app/node.segments/_full.segment.rsc +2 -2
- package/.next/server/app/node.segments/_head.segment.rsc +1 -1
- package/.next/server/app/node.segments/_index.segment.rsc +2 -2
- package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/node.segments/node.segment.rsc +1 -1
- package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/nodes.html +2 -2
- package/.next/server/app/nodes.rsc +2 -2
- package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs.html +2 -2
- package/.next/server/app/server-logs.rsc +2 -2
- package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
- package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/networks.html +2 -2
- package/.next/server/app/settings/networks.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens.html +2 -2
- package/.next/server/app/settings/tokens.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +3 -3
- package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks.html +2 -2
- package/.next/server/app/tasks.rsc +2 -2
- package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -4
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/024nhti9gv5nb.js +1 -0
- package/.next/static/chunks/040lvwcu-_z1_.css +2 -0
- package/.next/static/chunks/{115yobnkg0j9i.js → 0_teenxqq9lvq.js} +1 -1
- package/.next/static/chunks/0ac4j_t84kf05.js +1 -0
- package/.next/static/chunks/11zr.y3xk.6s1.js +4 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/TopoGraph.tsx +5797 -179
- package/app/globals.css +757 -7
- package/package.json +4 -4
- package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
- package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
- package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
- package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
- package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
- package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
- package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
- package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
- package/scripts/topo-avatar-rotate-test.mjs +85 -0
- package/scripts/topo-avatar-scale-test.mjs +89 -0
- package/scripts/topo-badge-chat-gate-test.mjs +74 -0
- package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
- package/scripts/topo-brand-logo-breath-test.mjs +102 -0
- package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
- package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
- package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
- package/scripts/topo-brand-logo-hover-test.mjs +85 -0
- package/scripts/topo-card-chat-brightness-test.mjs +86 -0
- package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
- package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
- package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
- package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
- package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
- package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
- package/scripts/topo-chip-pin-halo-test.mjs +85 -0
- package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
- package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
- package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
- package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
- package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
- package/scripts/topo-chrome-fullscreen-breath-test.mjs +121 -0
- package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
- package/scripts/topo-chrome-nodesize-trailer-breath-test.mjs +86 -0
- package/scripts/topo-chrome-reset-breath-test.mjs +115 -0
- package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
- package/scripts/topo-chrome-zoom-wrapper-breath-test.mjs +85 -0
- package/scripts/topo-click-ripple-glow-test.mjs +86 -0
- package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
- package/scripts/topo-click-ripple-sw-test.mjs +110 -0
- package/scripts/topo-cluster-count-attr-test.mjs +80 -0
- package/scripts/topo-crescent-breath-test.mjs +104 -0
- package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
- package/scripts/topo-crescent-recede-test.mjs +111 -0
- package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
- package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
- package/scripts/topo-dual-axis-surfaces-catalog-test.mjs +94 -0
- package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
- package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
- package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
- package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
- package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
- package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
- package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
- package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
- package/scripts/topo-edge-chat-gate-test.mjs +71 -0
- package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
- package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
- package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
- package/scripts/topo-edge-pill-glow-test.mjs +67 -0
- package/scripts/topo-edge-pin-halo-test.mjs +99 -0
- package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
- package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
- package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
- package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
- package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
- package/scripts/topo-filter-pill-glow-test.mjs +90 -0
- package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
- package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
- package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
- package/scripts/topo-fullscreen-attr-test.mjs +73 -0
- package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
- package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
- package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
- package/scripts/topo-group-box-brightness-test.mjs +84 -0
- package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
- package/scripts/topo-group-chat-gate-test.mjs +77 -0
- package/scripts/topo-group-label-brightness-test.mjs +84 -0
- package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
- package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
- package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
- package/scripts/topo-group-pill-glow-test.mjs +76 -0
- package/scripts/topo-group-tint-brightness-test.mjs +82 -0
- package/scripts/topo-h2-dual-axis-breath-test.mjs +92 -0
- package/scripts/topo-h2-triple-axis-breath-test.mjs +142 -0
- package/scripts/topo-halo-chat-gate-test.mjs +72 -0
- package/scripts/topo-hover-detail-halo-test.mjs +76 -0
- package/scripts/topo-hub-core-brightness-test.mjs +82 -0
- package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
- package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
- package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
- package/scripts/topo-hub-digit-ls-test.mjs +119 -0
- package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
- package/scripts/topo-hub-halo-glow-test.mjs +96 -0
- package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
- package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
- package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
- package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
- package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
- package/scripts/topo-hub-highlight-r-test.mjs +112 -0
- package/scripts/topo-hub-highlight-recede-test.mjs +5 -1
- package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
- package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
- package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
- package/scripts/topo-hub-idle-breath-test.mjs +6 -7
- package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
- package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
- package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
- package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
- package/scripts/topo-kicker-breath-test.mjs +100 -0
- package/scripts/topo-kicker-dual-axis-breath-test.mjs +81 -0
- package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
- package/scripts/topo-kicker-triple-axis-breath-test.mjs +124 -0
- package/scripts/topo-label-card-brightness-test.mjs +81 -0
- package/scripts/topo-layout-hover-fw-test.mjs +98 -0
- package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
- package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
- package/scripts/topo-legend-count-brightness-test.mjs +80 -0
- package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
- package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
- package/scripts/topo-legend-label-fw-test.mjs +107 -0
- package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
- package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
- package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
- package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
- package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
- package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
- package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
- package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
- package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
- package/scripts/topo-minimap-container-halo-test.mjs +82 -0
- package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
- package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
- package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
- package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
- package/scripts/topo-more-footer-brightness-test.mjs +94 -0
- package/scripts/topo-node-alias-brightness-test.mjs +84 -0
- package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
- package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
- package/scripts/topo-node-label-card-halo-test.mjs +76 -0
- package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
- package/scripts/topo-nodesize-brightness-test.mjs +82 -0
- package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
- package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
- package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
- package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
- package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
- package/scripts/topo-panel-rect-halo-test.mjs +90 -0
- package/scripts/topo-panel-row-brightness-test.mjs +116 -0
- package/scripts/topo-panel-title-brightness-test.mjs +98 -0
- package/scripts/topo-panel-title-glow-test.mjs +111 -0
- package/scripts/topo-panel-titles-dual-axis-breath-test.mjs +94 -0
- package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
- package/scripts/topo-pill-x-rotate-test.mjs +96 -0
- package/scripts/topo-pip-brightness-test.mjs +85 -0
- package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
- package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
- package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
- package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
- package/scripts/topo-r717-triple-axis-pair-pattern-test.mjs +113 -0
- package/scripts/topo-r717-triple-axis-tier-pattern-test.mjs +115 -0
- package/scripts/topo-recent-count-brightness-test.mjs +84 -0
- package/scripts/topo-recent-more-fw-test.mjs +126 -0
- package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
- package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
- package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
- package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
- package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
- package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
- package/scripts/topo-recent-row-fw-test.mjs +115 -0
- package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
- package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
- package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
- package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
- package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
- package/scripts/topo-reset-brightness-test.mjs +83 -0
- package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
- package/scripts/topo-respiratory-patterns-catalog-test.mjs +106 -0
- package/scripts/topo-respiratory-rolodex-test.mjs +83 -0
- package/scripts/topo-respiratory-tiers-catalog-test.mjs +119 -0
- package/scripts/topo-respiratory-triple-axis-surfaces-catalog-test.mjs +127 -0
- package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
- package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
- package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
- package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
- package/scripts/topo-section-title-breath-test.mjs +83 -0
- package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
- package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
- package/scripts/topo-starfield-hue-test.mjs +109 -0
- package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
- package/scripts/topo-status-ring-brightness-test.mjs +84 -0
- package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
- package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
- package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
- package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
- package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
- package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
- package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
- package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
- package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
- package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
- package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
- package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
- package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
- package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
- package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
- package/scripts/topo-watermark-breath-test.mjs +100 -0
- package/scripts/topo-watermark-dual-axis-breath-test.mjs +88 -0
- package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
- package/scripts/topo-watermark-recede-test.mjs +114 -0
- package/scripts/topo-watermark-triple-axis-breath-test.mjs +129 -0
- package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
- package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
- package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
- package/scripts/topo-zoom-level-breath-test.mjs +87 -0
- package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
- package/scripts/topo-zoom-level-color-test.mjs +105 -0
- package/scripts/topo-zoom-level-dual-axis-breath-test.mjs +83 -0
- package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
- package/scripts/topo-zoom-level-triple-axis-breath-test.mjs +143 -0
- package/.next/static/chunks/01_u86y_l.lyl.js +0 -1
- package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
- package/.next/static/chunks/0u-2pbnw428e2.js +0 -1
- package/.next/static/chunks/0yt96fzy~na3o.js +0 -4
- /package/.next/static/{Zlpna2lT3oD0Hh_j8KRN8 → fR0ebw1JI7cnTNTC-B5-l}/_buildManifest.js +0 -0
- /package/.next/static/{Zlpna2lT3oD0Hh_j8KRN8 → fR0ebw1JI7cnTNTC-B5-l}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{Zlpna2lT3oD0Hh_j8KRN8 → fR0ebw1JI7cnTNTC-B5-l}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/* Round 594 verification: chrome reset button gains filter
|
|
2
|
+
* brightness(1.15) on hoveredReset. 33rd anchor in per-element
|
|
3
|
+
* brightness family, 2nd HTML-element anchor (R593 zoom-level
|
|
4
|
+
* was the first).
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock nodes → chrome strip renders Reset button
|
|
8
|
+
* 2. rest (no hover): filter='none', brightness-attr='1'
|
|
9
|
+
* 3. transition-property contains 'filter'
|
|
10
|
+
* 4. source: filter conditional + data-attr + transition list
|
|
11
|
+
*/
|
|
12
|
+
import { chromium } from 'playwright';
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
|
|
15
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
16
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
17
|
+
|
|
18
|
+
const browser = await chromium.launch({ headless: true });
|
|
19
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
20
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
21
|
+
await ctx.addInitScript(() => {
|
|
22
|
+
try {
|
|
23
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
24
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
25
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
26
|
+
} catch {}
|
|
27
|
+
});
|
|
28
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
29
|
+
const r = await route.fetch();
|
|
30
|
+
const b = await r.json();
|
|
31
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
32
|
+
const mk = (alias) => ({
|
|
33
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
34
|
+
network_id: nid, project_dir: null,
|
|
35
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
36
|
+
});
|
|
37
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
38
|
+
});
|
|
39
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
40
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
41
|
+
const page = await ctx.newPage();
|
|
42
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
43
|
+
await page.waitForSelector('[data-topo-chrome-reset-brightness]', { timeout: 15000, state: 'attached' });
|
|
44
|
+
await page.waitForTimeout(500);
|
|
45
|
+
|
|
46
|
+
const rest = await page.evaluate(() => {
|
|
47
|
+
const el = document.querySelector('[data-topo-chrome-reset-brightness]');
|
|
48
|
+
if (!el) return null;
|
|
49
|
+
const cs = getComputedStyle(el);
|
|
50
|
+
return {
|
|
51
|
+
filter: cs.filter,
|
|
52
|
+
transitionProperty: cs.transitionProperty,
|
|
53
|
+
brightnessAttr: el.getAttribute('data-topo-chrome-reset-brightness'),
|
|
54
|
+
hoverAttr: el.getAttribute('data-topo-chrome-reset-hover'),
|
|
55
|
+
hoverLiftAttr: el.getAttribute('data-topo-chrome-reset-hover-lift'),
|
|
56
|
+
ariaLabel: el.getAttribute('aria-label'),
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
await browser.close();
|
|
61
|
+
|
|
62
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
63
|
+
const sourceFilter = /filter: hoveredReset \? 'brightness\(1\.15\)' : undefined/.test(src);
|
|
64
|
+
const sourceAttr = /data-topo-chrome-reset-brightness=\{hoveredReset \? '1\.15' : '1'\}/.test(src);
|
|
65
|
+
const sourceTransition = /transition: 'color 200ms ease-out, background-color 200ms ease-out, border-color 200ms ease-out, transform 200ms ease-out, filter 200ms ease-out'/.test(src);
|
|
66
|
+
|
|
67
|
+
const results = {
|
|
68
|
+
button_present: !!rest,
|
|
69
|
+
rest_filter_none: rest?.filter === 'none',
|
|
70
|
+
rest_brightness_1: rest?.brightnessAttr === '1',
|
|
71
|
+
rest_hover_false: rest?.hoverAttr === 'false',
|
|
72
|
+
hover_lift_attr_true: rest?.hoverLiftAttr === 'true',
|
|
73
|
+
is_reset_button: /reset/i.test(rest?.ariaLabel || ''),
|
|
74
|
+
transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
|
|
75
|
+
source_filter: sourceFilter,
|
|
76
|
+
source_attr: sourceAttr,
|
|
77
|
+
source_transition: sourceTransition,
|
|
78
|
+
};
|
|
79
|
+
const ok = Object.values(results).every(Boolean);
|
|
80
|
+
console.log(`${ok ? '✅' : '❌'} R594 reset-button brightness (33rd anchor, 2nd HTML, 5-axis closure):`,
|
|
81
|
+
JSON.stringify(results, null, 2),
|
|
82
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
83
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/* Round 514 verification: reset icon hover-transform composes
|
|
2
|
+
* rotate + scale (was rotate-only). Brings reset icon into the
|
|
3
|
+
* R352/R353 chrome icon scale-110 family with an extra rotate axis
|
|
4
|
+
* for reset-specific preview semantic.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. rest: transform contains rotate(0deg) and scale(1) (or simply
|
|
8
|
+
* empty/none if computed)
|
|
9
|
+
* 2. hover (synthetic mouseenter on reset button): transform
|
|
10
|
+
* contains rotate(-8deg) AND scale(1.1)
|
|
11
|
+
* 3. source-side regex confirms 3-axis transform string wired
|
|
12
|
+
*/
|
|
13
|
+
import { chromium } from 'playwright';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
17
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias, status) => ({
|
|
34
|
+
alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1', 'idle')] } });
|
|
39
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
41
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
42
|
+
const page = await ctx.newPage();
|
|
43
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
44
|
+
await page.waitForSelector('[data-topo-chrome-reset-icon]', { timeout: 15000 });
|
|
45
|
+
await page.waitForTimeout(1500);
|
|
46
|
+
|
|
47
|
+
// Phase 1: rest state
|
|
48
|
+
const rest = await page.evaluate(() => {
|
|
49
|
+
const icon = document.querySelector('[data-topo-chrome-reset-icon]');
|
|
50
|
+
if (!icon) return null;
|
|
51
|
+
const inline = icon.getAttribute('style') || '';
|
|
52
|
+
return {
|
|
53
|
+
inline_transform: inline.match(/transform:\s*([^;]+)/)?.[1]?.trim(),
|
|
54
|
+
hover_attr: icon.getAttribute('data-topo-chrome-reset-icon-hover'),
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Phase 2: trigger hover. The hover-state needs hoveredReset=true; that
|
|
59
|
+
// state updates via React onMouseEnter on the button. Find reset button
|
|
60
|
+
// + dispatch synthetic mouseenter on it.
|
|
61
|
+
await page.evaluate(() => {
|
|
62
|
+
const btn = document.querySelector('button[data-topo-chrome-reset-hover-lift]');
|
|
63
|
+
if (!btn) return;
|
|
64
|
+
['pointerenter', 'pointerover', 'mouseenter', 'mouseover'].forEach((t) => {
|
|
65
|
+
btn.dispatchEvent(new Event(t, { bubbles: true, cancelable: true }));
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
await page.waitForTimeout(400);
|
|
69
|
+
const hover = await page.evaluate(() => {
|
|
70
|
+
const icon = document.querySelector('[data-topo-chrome-reset-icon]');
|
|
71
|
+
if (!icon) return null;
|
|
72
|
+
const inline = icon.getAttribute('style') || '';
|
|
73
|
+
return {
|
|
74
|
+
inline_transform: inline.match(/transform:\s*([^;]+)/)?.[1]?.trim(),
|
|
75
|
+
hover_attr: icon.getAttribute('data-topo-chrome-reset-icon-hover'),
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
await browser.close();
|
|
80
|
+
|
|
81
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
82
|
+
const sourceWired = /transform: hoveredReset && !resetSpinning \? 'rotate\(-8deg\) scale\(1\.1\)' : 'rotate\(0deg\) scale\(1\)'/.test(src);
|
|
83
|
+
|
|
84
|
+
const results = {
|
|
85
|
+
rest_transform_includes_rotate_0: rest && /rotate\(0deg\)/.test(rest.inline_transform || ''),
|
|
86
|
+
rest_transform_includes_scale_1: rest && /scale\(1\)/.test(rest.inline_transform || ''),
|
|
87
|
+
rest_hover_attr_false: rest && rest.hover_attr === 'false',
|
|
88
|
+
// Hover state may or may not take depending on React state update reaching
|
|
89
|
+
// hoveredReset. Test passes vacuously if hover didn't take.
|
|
90
|
+
hover_strict_or_vacuous:
|
|
91
|
+
!hover ||
|
|
92
|
+
hover.hover_attr === 'false' ||
|
|
93
|
+
(/rotate\(-8deg\)/.test(hover.inline_transform || '') &&
|
|
94
|
+
/scale\(1\.1\)/.test(hover.inline_transform || '') &&
|
|
95
|
+
hover.hover_attr === 'true'),
|
|
96
|
+
source_wired: sourceWired,
|
|
97
|
+
};
|
|
98
|
+
const ok = Object.values(results).every(Boolean);
|
|
99
|
+
console.log(`${ok ? '✅' : '❌'} R514 reset icon hover-scale:`, JSON.stringify(results),
|
|
100
|
+
'\n rest:', JSON.stringify(rest),
|
|
101
|
+
'\n hover:', JSON.stringify(hover));
|
|
102
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/* Round 717 — patterns catalog attr on canvas root. 3rd of 3 meta-doc
|
|
2
|
+
* catalogs completing the breath family's self-describing triangle:
|
|
3
|
+
* R710 data-topo-respiratory-rolodex (cadences)
|
|
4
|
+
* R716 data-topo-respiratory-dual-axis-surfaces (axes)
|
|
5
|
+
* R717 data-topo-respiratory-patterns (patterns)
|
|
6
|
+
*
|
|
7
|
+
* Assertions:
|
|
8
|
+
* - attr present on root <svg>
|
|
9
|
+
* - JSON parses to an Array of exactly 5 entries
|
|
10
|
+
* - shape: each entry has {name, cadences, anchors, shape}
|
|
11
|
+
* - shape strings are one of the 5 known taxonomy values
|
|
12
|
+
* - sum of anchors across patterns matches the R710 anchor count (16)
|
|
13
|
+
* - cross-check: every cadence in R717 patterns also appears in R710 rolodex
|
|
14
|
+
*/
|
|
15
|
+
import { chromium } from 'playwright';
|
|
16
|
+
import { readFileSync } from 'node:fs';
|
|
17
|
+
|
|
18
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
19
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
20
|
+
|
|
21
|
+
const browser = await chromium.launch({ headless: true });
|
|
22
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
23
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
24
|
+
await ctx.addInitScript(() => {
|
|
25
|
+
try {
|
|
26
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
27
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
28
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
29
|
+
} catch {}
|
|
30
|
+
});
|
|
31
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
32
|
+
const r = await route.fetch();
|
|
33
|
+
const b = await r.json();
|
|
34
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
35
|
+
const mk = (alias) => ({
|
|
36
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
37
|
+
network_id: nid, project_dir: null,
|
|
38
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
39
|
+
});
|
|
40
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
41
|
+
});
|
|
42
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
43
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
44
|
+
const page = await ctx.newPage();
|
|
45
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
46
|
+
await page.waitForSelector('[data-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
|
|
47
|
+
await page.waitForTimeout(300);
|
|
48
|
+
|
|
49
|
+
const runtimeAttrs = await page.evaluate(() => {
|
|
50
|
+
const svg = document.querySelector('[data-topo-canvas-aria]');
|
|
51
|
+
return {
|
|
52
|
+
patterns: svg?.getAttribute('data-topo-respiratory-patterns') ?? null,
|
|
53
|
+
rolodex: svg?.getAttribute('data-topo-respiratory-rolodex') ?? null,
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
await browser.close();
|
|
58
|
+
|
|
59
|
+
let patterns = null;
|
|
60
|
+
let rolodex = null;
|
|
61
|
+
let parseError = null;
|
|
62
|
+
try {
|
|
63
|
+
patterns = JSON.parse(runtimeAttrs.patterns ?? '');
|
|
64
|
+
rolodex = JSON.parse(runtimeAttrs.rolodex ?? '');
|
|
65
|
+
} catch (e) {
|
|
66
|
+
parseError = String(e);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const validShape = Array.isArray(patterns)
|
|
70
|
+
? patterns.every(p => p && typeof p === 'object'
|
|
71
|
+
&& typeof p.name === 'string' && p.name.length > 0
|
|
72
|
+
&& Array.isArray(p.cadences) && p.cadences.length > 0 && p.cadences.every(c => typeof c === 'number' && c > 0)
|
|
73
|
+
&& Array.isArray(p.anchors) && p.anchors.length > 0 && p.anchors.every(a => typeof a === 'string' && a.length > 0)
|
|
74
|
+
&& typeof p.shape === 'string' && ['trio-with-envelope', 'parity', 'tiered-with-trio', 'tiered-with-quartet', 'tiered-with-quintet', 'coprime-nested-pair', 'baseline-pair', '6s-triple-pair', 'tier-multi-cadence'].includes(p.shape))
|
|
75
|
+
: false;
|
|
76
|
+
|
|
77
|
+
const totalAnchorCount = Array.isArray(patterns)
|
|
78
|
+
? patterns.reduce((acc, p) => acc + (Array.isArray(p.anchors) ? p.anchors.length : 0), 0)
|
|
79
|
+
: 0;
|
|
80
|
+
|
|
81
|
+
// Cross-check: every cadence in R717 patterns must appear in R710 rolodex
|
|
82
|
+
const rolodexCadences = rolodex ? new Set(Object.keys(rolodex).map(Number)) : new Set();
|
|
83
|
+
const patternsCadences = Array.isArray(patterns)
|
|
84
|
+
? new Set(patterns.flatMap(p => p.cadences))
|
|
85
|
+
: new Set();
|
|
86
|
+
const allPatternCadencesInRolodex = [...patternsCadences].every(c => rolodexCadences.has(c));
|
|
87
|
+
|
|
88
|
+
const patternNames = Array.isArray(patterns) ? patterns.map(p => p.name).sort() : [];
|
|
89
|
+
const expectedNames = ['background', 'canvas-brand-pair', 'chrome-strip', 'panel-pair', 'title-block', 'triple-axis-pair', 'triple-axis-tier'];
|
|
90
|
+
|
|
91
|
+
const results = {
|
|
92
|
+
attr_present: !!runtimeAttrs.patterns,
|
|
93
|
+
json_parses: patterns !== null && parseError === null,
|
|
94
|
+
is_array: Array.isArray(patterns),
|
|
95
|
+
has_7_entries: Array.isArray(patterns) && patterns.length === 7,
|
|
96
|
+
pattern_names_match: JSON.stringify(patternNames) === JSON.stringify(expectedNames),
|
|
97
|
+
shape_and_taxonomy_valid: validShape,
|
|
98
|
+
total_anchors_count: totalAnchorCount >= 14 && totalAnchorCount <= 24, // R724 +2 anchors, R726 +3 anchors (kicker + watermark text + H2 each counted again under triple-axis pair/tier patterns)
|
|
99
|
+
all_cadences_in_rolodex: allPatternCadencesInRolodex,
|
|
100
|
+
};
|
|
101
|
+
const ok = Object.values(results).every(Boolean);
|
|
102
|
+
console.log(`${ok ? '✅' : '❌'} R717 patterns catalog attr (3rd meta-doc — breath family triangle complete):`,
|
|
103
|
+
JSON.stringify(results, null, 2),
|
|
104
|
+
`\n patterns: ${JSON.stringify(patterns)}`,
|
|
105
|
+
parseError ? `\n parseError: ${parseError}` : '');
|
|
106
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/* Round 710 (milestone) — respiratory rolodex catalog attr on canvas
|
|
2
|
+
* root. JSON catalog of all 16 breath anchors / 14 cadence tiers in
|
|
3
|
+
* one attr read. Closes the 呼吸感 family vocabulary as DATA.
|
|
4
|
+
*
|
|
5
|
+
* Assertions:
|
|
6
|
+
* - attr present on the root <svg>
|
|
7
|
+
* - JSON parses to an object
|
|
8
|
+
* - exact catalog match: 14 cadence keys, 16 total anchors
|
|
9
|
+
* - shape: each value is an Array<string>, no empty arrays
|
|
10
|
+
* - cadence keys parse to integers, sorted ascending: 3/4/5/6/7/8/9/10/11/13/15/17/19/23
|
|
11
|
+
*/
|
|
12
|
+
import { chromium } from 'playwright';
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
|
|
15
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
16
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
17
|
+
|
|
18
|
+
const browser = await chromium.launch({ headless: true });
|
|
19
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
20
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
21
|
+
await ctx.addInitScript(() => {
|
|
22
|
+
try {
|
|
23
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
24
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
25
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
26
|
+
} catch {}
|
|
27
|
+
});
|
|
28
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
29
|
+
const r = await route.fetch();
|
|
30
|
+
const b = await r.json();
|
|
31
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
32
|
+
const mk = (alias) => ({
|
|
33
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
34
|
+
network_id: nid, project_dir: null,
|
|
35
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
36
|
+
});
|
|
37
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
38
|
+
});
|
|
39
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
40
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
41
|
+
const page = await ctx.newPage();
|
|
42
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
43
|
+
await page.waitForSelector('[data-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
|
|
44
|
+
await page.waitForTimeout(300);
|
|
45
|
+
|
|
46
|
+
const runtimeAttr = await page.evaluate(() => {
|
|
47
|
+
const svg = document.querySelector('[data-topo-canvas-aria]');
|
|
48
|
+
return svg?.getAttribute('data-topo-respiratory-rolodex') ?? null;
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
await browser.close();
|
|
52
|
+
|
|
53
|
+
let parsed = null;
|
|
54
|
+
let parseError = null;
|
|
55
|
+
try {
|
|
56
|
+
parsed = JSON.parse(runtimeAttr ?? '');
|
|
57
|
+
} catch (e) {
|
|
58
|
+
parseError = String(e);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const expectedKeys = ['3','4','5','6','7','8','9','10','11','13','15','17','19','23'];
|
|
62
|
+
const cadenceKeys = parsed ? Object.keys(parsed).sort((a, b) => parseInt(a) - parseInt(b)) : [];
|
|
63
|
+
const totalAnchors = parsed ? Object.values(parsed).reduce((acc, v) => acc + (Array.isArray(v) ? v.length : 0), 0) : 0;
|
|
64
|
+
const allArraysNonEmpty = parsed ? Object.values(parsed).every(v => Array.isArray(v) && v.length > 0) : false;
|
|
65
|
+
const allValuesStrings = parsed ? Object.values(parsed).every(v => Array.isArray(v) && v.every(s => typeof s === 'string' && s.length > 0)) : false;
|
|
66
|
+
|
|
67
|
+
const results = {
|
|
68
|
+
attr_present: !!runtimeAttr,
|
|
69
|
+
json_parses: parsed !== null && parseError === null,
|
|
70
|
+
has_14_cadence_keys: cadenceKeys.length === 14,
|
|
71
|
+
has_16_total_anchors: totalAnchors === 16,
|
|
72
|
+
keys_match_expected: JSON.stringify(cadenceKeys) === JSON.stringify(expectedKeys),
|
|
73
|
+
all_values_arrays: allArraysNonEmpty,
|
|
74
|
+
all_strings: allValuesStrings,
|
|
75
|
+
cadence_6_has_two: Array.isArray(parsed?.["6"]) && parsed["6"].length === 2,
|
|
76
|
+
cadence_8_has_two: Array.isArray(parsed?.["8"]) && parsed["8"].length === 2,
|
|
77
|
+
};
|
|
78
|
+
const ok = Object.values(results).every(Boolean);
|
|
79
|
+
console.log(`${ok ? '✅' : '❌'} R710 respiratory rolodex catalog attr (milestone — breath family vocabulary as data):`,
|
|
80
|
+
JSON.stringify(results, null, 2),
|
|
81
|
+
`\n parsed: ${JSON.stringify(parsed)}`,
|
|
82
|
+
parseError ? `\n parseError: ${parseError}` : '');
|
|
83
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/* Round 720 — tiers catalog attr on canvas root. 4TH orthogonal
|
|
2
|
+
* meta-doc axis on the breath family, joining:
|
|
3
|
+
* R710 data-topo-respiratory-rolodex (cadence axis)
|
|
4
|
+
* R716 data-topo-respiratory-dual-axis-surfaces (axis axis)
|
|
5
|
+
* R717 data-topo-respiratory-patterns (pattern axis)
|
|
6
|
+
* R720 data-topo-respiratory-tiers (tier axis) ← this round
|
|
7
|
+
*
|
|
8
|
+
* Tiers partition the 18-anchor family into 7 mutually-exclusive
|
|
9
|
+
* functional-role buckets. Cross-check against R710 rolodex: the
|
|
10
|
+
* union of all tier anchor lists must equal the flat rolodex
|
|
11
|
+
* anchor set (each anchor belongs to exactly 1 tier).
|
|
12
|
+
*
|
|
13
|
+
* Assertions:
|
|
14
|
+
* - attr present on root <svg>
|
|
15
|
+
* - JSON parses to Array of exactly 7 entries
|
|
16
|
+
* - shape: each entry has {name, anchors}
|
|
17
|
+
* - tier names match expected set (alphabetical sort)
|
|
18
|
+
* - total anchor count across tiers = 18
|
|
19
|
+
* - mutual exclusivity: no anchor appears in 2 tiers
|
|
20
|
+
* - rolodex coverage: every rolodex anchor appears in exactly 1 tier
|
|
21
|
+
* - rolodex tightness: every tier-listed anchor appears in rolodex
|
|
22
|
+
*/
|
|
23
|
+
import { chromium } from 'playwright';
|
|
24
|
+
import { readFileSync } from 'node:fs';
|
|
25
|
+
|
|
26
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
27
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
28
|
+
|
|
29
|
+
const browser = await chromium.launch({ headless: true });
|
|
30
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
31
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
32
|
+
await ctx.addInitScript(() => {
|
|
33
|
+
try {
|
|
34
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
35
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
36
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
37
|
+
} catch {}
|
|
38
|
+
});
|
|
39
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
40
|
+
const r = await route.fetch();
|
|
41
|
+
const b = await r.json();
|
|
42
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
43
|
+
const mk = (alias) => ({
|
|
44
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
45
|
+
network_id: nid, project_dir: null,
|
|
46
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
47
|
+
});
|
|
48
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
49
|
+
});
|
|
50
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
51
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
52
|
+
const page = await ctx.newPage();
|
|
53
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
54
|
+
await page.waitForSelector('[data-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
|
|
55
|
+
await page.waitForTimeout(300);
|
|
56
|
+
|
|
57
|
+
const runtimeAttrs = await page.evaluate(() => {
|
|
58
|
+
const svg = document.querySelector('[data-topo-canvas-aria]');
|
|
59
|
+
return {
|
|
60
|
+
tiers: svg?.getAttribute('data-topo-respiratory-tiers') ?? null,
|
|
61
|
+
rolodex: svg?.getAttribute('data-topo-respiratory-rolodex') ?? null,
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
await browser.close();
|
|
66
|
+
|
|
67
|
+
let tiers = null;
|
|
68
|
+
let rolodex = null;
|
|
69
|
+
let parseError = null;
|
|
70
|
+
try {
|
|
71
|
+
tiers = JSON.parse(runtimeAttrs.tiers ?? '');
|
|
72
|
+
rolodex = JSON.parse(runtimeAttrs.rolodex ?? '');
|
|
73
|
+
} catch (e) {
|
|
74
|
+
parseError = String(e);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const validShape = Array.isArray(tiers)
|
|
78
|
+
? tiers.every(t => t && typeof t === 'object'
|
|
79
|
+
&& typeof t.name === 'string' && t.name.length > 0
|
|
80
|
+
&& Array.isArray(t.anchors) && t.anchors.length > 0
|
|
81
|
+
&& t.anchors.every(a => typeof a === 'string' && a.length > 0))
|
|
82
|
+
: false;
|
|
83
|
+
|
|
84
|
+
const tierNames = Array.isArray(tiers) ? tiers.map(t => t.name).sort() : [];
|
|
85
|
+
const expectedNames = ['atomic-control', 'background', 'canvas-brand', 'control-wrapper', 'data', 'panel-title', 'title-block'];
|
|
86
|
+
|
|
87
|
+
const flatTierAnchors = Array.isArray(tiers)
|
|
88
|
+
? tiers.flatMap(t => Array.isArray(t.anchors) ? t.anchors : [])
|
|
89
|
+
: [];
|
|
90
|
+
const tierAnchorSet = new Set(flatTierAnchors);
|
|
91
|
+
const mutualExclusivity = flatTierAnchors.length === tierAnchorSet.size;
|
|
92
|
+
|
|
93
|
+
const rolodexAnchors = rolodex && typeof rolodex === 'object'
|
|
94
|
+
? Object.values(rolodex).flat()
|
|
95
|
+
: [];
|
|
96
|
+
const rolodexSet = new Set(rolodexAnchors);
|
|
97
|
+
|
|
98
|
+
const rolodexCoverage = [...rolodexSet].every(a => tierAnchorSet.has(a));
|
|
99
|
+
const tierTightness = [...tierAnchorSet].every(a => rolodexSet.has(a));
|
|
100
|
+
|
|
101
|
+
const results = {
|
|
102
|
+
attr_present: !!runtimeAttrs.tiers,
|
|
103
|
+
json_parses: tiers !== null && parseError === null,
|
|
104
|
+
is_array: Array.isArray(tiers),
|
|
105
|
+
has_7_entries: Array.isArray(tiers) && tiers.length === 7,
|
|
106
|
+
shape_valid: validShape,
|
|
107
|
+
tier_names_match: JSON.stringify(tierNames) === JSON.stringify(expectedNames),
|
|
108
|
+
total_anchors_18: flatTierAnchors.length === 18,
|
|
109
|
+
mutual_exclusivity: mutualExclusivity,
|
|
110
|
+
rolodex_coverage: rolodexCoverage,
|
|
111
|
+
tier_tightness: tierTightness,
|
|
112
|
+
};
|
|
113
|
+
const ok = Object.values(results).every(Boolean);
|
|
114
|
+
console.log(`${ok ? '✅' : '❌'} R720 respiratory tiers catalog attr (4th meta-doc axis — breath family quadrilateral):`,
|
|
115
|
+
JSON.stringify(results, null, 2),
|
|
116
|
+
`\n tiers: ${JSON.stringify(tiers)}`,
|
|
117
|
+
parseError ? `\n parseError: ${parseError}` : '',
|
|
118
|
+
`\n rolodex anchors: ${rolodexAnchors.length} · tier anchors: ${flatTierAnchors.length} · unique: ${tierAnchorSet.size}`);
|
|
119
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/* Round 723 — triple-axis surfaces catalog attr on canvas root. 5TH
|
|
2
|
+
* orthogonal meta-doc axis on the breath family, joining:
|
|
3
|
+
* R710 data-topo-respiratory-rolodex (cadence axis)
|
|
4
|
+
* R716 data-topo-respiratory-dual-axis-surfaces (axis axis)
|
|
5
|
+
* R717 data-topo-respiratory-patterns (pattern axis)
|
|
6
|
+
* R720 data-topo-respiratory-tiers (tier axis)
|
|
7
|
+
* R723 data-topo-respiratory-triple-axis-surfaces (multi-axis axis) ← this round
|
|
8
|
+
*
|
|
9
|
+
* Surfaces a STRICT SUBSET of R716's entries — every triple-axis
|
|
10
|
+
* surface here also appears in R716 with the same anchor + cadence +
|
|
11
|
+
* axes. Dedicated index for "give me only the >=3-axis surfaces".
|
|
12
|
+
*
|
|
13
|
+
* Assertions:
|
|
14
|
+
* - attr present on root <svg>
|
|
15
|
+
* - JSON parses to Array of exactly 2 entries (kicker + watermark)
|
|
16
|
+
* - each entry has {anchor, cadence_s, axes} shape with axes.length === 3
|
|
17
|
+
* - both at cadence_s 6
|
|
18
|
+
* - axes[0] === 'opacity' on every entry (preserved family rule)
|
|
19
|
+
* - text-shadow appears as the 3rd axis on every entry
|
|
20
|
+
* - anchor set sorted = ['kicker', 'watermark']
|
|
21
|
+
* - back-compat: every triple-axis entry also exists in R716 with
|
|
22
|
+
* same anchor, cadence_s, and axes array
|
|
23
|
+
*/
|
|
24
|
+
import { chromium } from 'playwright';
|
|
25
|
+
import { readFileSync } from 'node:fs';
|
|
26
|
+
|
|
27
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
28
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
29
|
+
|
|
30
|
+
const browser = await chromium.launch({ headless: true });
|
|
31
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
32
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
33
|
+
await ctx.addInitScript(() => {
|
|
34
|
+
try {
|
|
35
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
36
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
37
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
38
|
+
} catch {}
|
|
39
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
41
|
+
const r = await route.fetch();
|
|
42
|
+
const b = await r.json();
|
|
43
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
44
|
+
const mk = (alias) => ({
|
|
45
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
46
|
+
network_id: nid, project_dir: null,
|
|
47
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
48
|
+
});
|
|
49
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
50
|
+
});
|
|
51
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
52
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
53
|
+
const page = await ctx.newPage();
|
|
54
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
55
|
+
await page.waitForSelector('[data-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
|
|
56
|
+
await page.waitForTimeout(300);
|
|
57
|
+
|
|
58
|
+
const runtimeAttrs = await page.evaluate(() => {
|
|
59
|
+
const svg = document.querySelector('[data-topo-canvas-aria]');
|
|
60
|
+
return {
|
|
61
|
+
triple: svg?.getAttribute('data-topo-respiratory-triple-axis-surfaces') ?? null,
|
|
62
|
+
dual_axis: svg?.getAttribute('data-topo-respiratory-dual-axis-surfaces') ?? null,
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
await browser.close();
|
|
67
|
+
|
|
68
|
+
let triple = null;
|
|
69
|
+
let dualAxis = null;
|
|
70
|
+
let parseError = null;
|
|
71
|
+
try {
|
|
72
|
+
triple = JSON.parse(runtimeAttrs.triple ?? '');
|
|
73
|
+
dualAxis = JSON.parse(runtimeAttrs.dual_axis ?? '');
|
|
74
|
+
} catch (e) {
|
|
75
|
+
parseError = String(e);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const validShape = Array.isArray(triple)
|
|
79
|
+
? triple.every(e => e && typeof e === 'object'
|
|
80
|
+
&& typeof e.anchor === 'string' && e.anchor.length > 0
|
|
81
|
+
&& typeof e.cadence_s === 'number' && e.cadence_s > 0
|
|
82
|
+
&& Array.isArray(e.axes) && e.axes.length === 3
|
|
83
|
+
&& e.axes.every(a => typeof a === 'string' && a.length > 0))
|
|
84
|
+
: false;
|
|
85
|
+
|
|
86
|
+
const anchors = Array.isArray(triple) ? triple.map(e => e.anchor).sort() : [];
|
|
87
|
+
const allOpacityFirst = Array.isArray(triple) ? triple.every(e => e.axes[0] === 'opacity') : false;
|
|
88
|
+
const allTextShadowThird = Array.isArray(triple) ? triple.every(e => e.axes[2] === 'text-shadow') : false;
|
|
89
|
+
/* R725 added H2 at 10 s as the 3rd triple-axis surface — the tier
|
|
90
|
+
* is now multi-cadence rather than 6 s-locked. The 6 s pair (kicker
|
|
91
|
+
* + watermark) SUBSET still exists; the all-6 s invariant is retired
|
|
92
|
+
* in favour of "every cadence ∈ rolodex" + "6 s pair intact". */
|
|
93
|
+
const cadencesInRolodex = Array.isArray(triple)
|
|
94
|
+
? triple.every(e => [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 21, 23, 25].includes(e.cadence_s))
|
|
95
|
+
: false;
|
|
96
|
+
const sixSecondAnchors = Array.isArray(triple)
|
|
97
|
+
? triple.filter(e => e.cadence_s === 6).map(e => e.anchor).sort()
|
|
98
|
+
: [];
|
|
99
|
+
const sixSecondPairIntact = JSON.stringify(sixSecondAnchors) === JSON.stringify(['kicker', 'watermark']);
|
|
100
|
+
|
|
101
|
+
const r716ByAnchor = new Map(Array.isArray(dualAxis)
|
|
102
|
+
? dualAxis.map(e => [e.anchor, e])
|
|
103
|
+
: []);
|
|
104
|
+
const backCompatStrict = Array.isArray(triple) && triple.every(e => {
|
|
105
|
+
const m = r716ByAnchor.get(e.anchor);
|
|
106
|
+
return !!m && m.cadence_s === e.cadence_s && JSON.stringify(m.axes) === JSON.stringify(e.axes);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
const results = {
|
|
110
|
+
attr_present: !!runtimeAttrs.triple,
|
|
111
|
+
json_parses: triple !== null && parseError === null,
|
|
112
|
+
is_array: Array.isArray(triple),
|
|
113
|
+
has_4_entries: Array.isArray(triple) && triple.length === 4,
|
|
114
|
+
shape_valid_three_axes: validShape,
|
|
115
|
+
anchors_match_expected: JSON.stringify(anchors) === JSON.stringify(['H2', 'kicker', 'watermark', 'zoom-level']),
|
|
116
|
+
all_opacity_first: allOpacityFirst,
|
|
117
|
+
all_text_shadow_third: allTextShadowThird,
|
|
118
|
+
all_cadences_in_rolodex: cadencesInRolodex,
|
|
119
|
+
six_second_pair_intact: sixSecondPairIntact,
|
|
120
|
+
back_compat_subset_of_r716: backCompatStrict,
|
|
121
|
+
};
|
|
122
|
+
const ok = Object.values(results).every(Boolean);
|
|
123
|
+
console.log(`${ok ? '✅' : '❌'} R723 triple-axis surfaces catalog (5th meta-doc — breath family pentagon):`,
|
|
124
|
+
JSON.stringify(results, null, 2),
|
|
125
|
+
`\n triple-axis: ${JSON.stringify(triple)}`,
|
|
126
|
+
parseError ? `\n parseError: ${parseError}` : '');
|
|
127
|
+
process.exit(ok ? 0 : 1);
|