diff --git a/docs/diagrams/gmw-architecture.html b/docs/diagrams/gmw-architecture.html new file mode 100644 index 00000000..69631ee5 --- /dev/null +++ b/docs/diagrams/gmw-architecture.html @@ -0,0 +1,15002 @@ + + + + + + + GMW — Guild Moderation Watcher Diagram + + + + + + + + +
+ +
+
+
+

GMW — Guild Moderation Watcher

+
+
+ + + + + + + +
+ + GMW — Guild Moderation Watcher + An architecture diagram generated by Archify. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Redis · pub/sub :6379 · imrnes — Tailscale shared state · events + PCM + + + + Redis + pub/sub :6379 + events + PCM + + + + PostgreSQL · shared state :6432 · imrnes — Tailscale shared state + + + + PostgreSQL + shared state :6432 + + + + Discord Guilds · channels · voice · reactions · Architecture component + + + + Discord Guilds + channels · voice · reactions + + + + discord-gateway · selfbot :4016 · orangevps — Nix/systemd · discord.js-selfbot-v13 + + + + discord-gateway + selfbot :4016 + discord.js-selfbot-v13 + + + + gmw-backend · Express · oRPC · WS :4001 · orangevps — Nix/systemd · Drizzle ORM + + + + gmw-backend + Express · oRPC · WS :4001 + Drizzle ORM + + + + nginx proxy · reverse proxy :4009 · orangevps — Nix/systemd · nginx + + + + nginx proxy + reverse proxy :4009 + nginx + + + + AI Moderation · LLM caller · embeddings · orangevps — Nix/systemd + + + + AI Moderation + LLM caller · embeddings + + + + gmw-frontend · Next.js 16 SSR :4017 · orangevps — Nix/systemd · React 19 · Tailwind v4 + + + + gmw-frontend + Next.js 16 SSR :4017 + React 19 · Tailwind v4 + + + + 9router LLM · text + vision API · Architecture component · AI_LLM_BASE_URL + + + + 9router LLM + text + vision API + AI_LLM_BASE_URL + + + + Dashboard Users · browser · partysocket · Architecture component + + + + Dashboard Users + browser · partysocket + + + + + + selfbot events + + + + capture → analyze + + + + publish events + + + + redis-bridge → WS + + + + text + vision + + + + agentic chatbot + + + + Drizzle SQL + + + + /api · /ws · /trpc + + + + SSR + static + + + + HTTPS dashboard + + + + + + imrnes — Tailscale shared state + + + + + orangevps — Nix/systemd + + + + + +

+ + + + + + + + + +
+ + +
+
+
+
+

Capture

+
+
    +
  • • Selfbot gateway listens to guild events + voice streams
  • +
  • • AI moderation runs LLM on messages, attachments, transcripts
  • +
+
+ +
+
+
+

Application

+
+
    +
  • • oRPC over HTTP + WS (partysocket auto-reconnect)
  • +
  • • Next.js 16 SSR dashboard · nginx :4009 reverse proxy
  • +
+
+ +
+
+
+

Shared State

+
+
    +
  • • Redis pub/sub relays events + live PCM audio
  • +
  • • PostgreSQL via Drizzle persists messages & assessments
  • +
+
+
+ +
+ + + + diff --git a/docs/diagrams/gmw-architecture.json b/docs/diagrams/gmw-architecture.json new file mode 100644 index 00000000..46f31965 --- /dev/null +++ b/docs/diagrams/gmw-architecture.json @@ -0,0 +1,43 @@ +{ + "schema_version": 1, + "diagram_type": "architecture", + "meta": { + "title": "GMW — Guild Moderation Watcher", + "output": "gmw-architecture.html", + "quality_profile": "showcase", + "viewBox": [1140, 620] + }, + "components": [ + { "id": "redis", "type": "messagebus", "label": "Redis", "sublabel": "pub/sub :6379", "pos": [300, 40], "size": [140, 60], "tag": "events + PCM" }, + { "id": "pg", "type": "database", "label": "PostgreSQL", "sublabel": "shared state :6432", "pos": [640, 40], "size": [140, 60] }, + { "id": "discord", "type": "external", "label": "Discord Guilds", "sublabel": "channels · voice · reactions", "pos": [40, 240], "size": [140, 60] }, + { "id": "gateway", "type": "backend", "label": "discord-gateway", "sublabel": "selfbot :4016", "pos": [260, 240], "size": [140, 60], "tag": "discord.js-selfbot-v13" }, + { "id": "backend", "type": "backend", "label": "gmw-backend", "sublabel": "Express · oRPC · WS :4001", "pos": [640, 240], "size": [140, 60], "tag": "Drizzle ORM" }, + { "id": "proxy", "type": "cloud", "label": "nginx proxy", "sublabel": "reverse proxy :4009", "pos": [960, 240], "size": [140, 60], "tag": "nginx" }, + { "id": "ai", "type": "backend", "label": "AI Moderation", "sublabel": "LLM caller · embeddings", "pos": [260, 400], "size": [140, 60] }, + { "id": "frontend", "type": "frontend", "label": "gmw-frontend", "sublabel": "Next.js 16 SSR :4017", "pos": [960, 400], "size": [140, 60], "tag": "React 19 · Tailwind v4" }, + { "id": "llm", "type": "cloud", "label": "9router LLM", "sublabel": "text + vision API", "pos": [260, 540], "size": [140, 60], "tag": "AI_LLM_BASE_URL" }, + { "id": "browser", "type": "external", "label": "Dashboard Users", "sublabel": "browser · partysocket", "pos": [960, 540], "size": [140, 60] } + ], + "boundaries": [ + { "kind": "region", "label": "imrnes — Tailscale shared state", "wraps": ["redis", "pg"] }, + { "kind": "region", "label": "orangevps — Nix/systemd", "wraps": ["gateway", "ai", "backend", "proxy", "frontend"] } + ], + "connections": [ + { "id": "c1", "from": "discord", "to": "gateway", "label": "selfbot events", "variant": "emphasis" }, + { "id": "c2", "from": "gateway", "to": "ai", "label": "capture → analyze", "labelDy": 24 }, + { "id": "c3", "from": "gateway", "to": "redis", "label": "publish events", "fromSide": "top", "toSide": "bottom" }, + { "id": "c4", "from": "redis", "to": "backend", "label": "redis-bridge → WS" }, + { "id": "c5", "from": "ai", "to": "llm", "label": "text + vision", "labelDy": 24 }, + { "id": "c6", "from": "backend", "to": "llm", "label": "agentic chatbot", "variant": "dashed" }, + { "id": "c7", "from": "backend", "to": "pg", "label": "Drizzle SQL" }, + { "id": "c8", "from": "proxy", "to": "backend", "label": "/api · /ws · /trpc" }, + { "id": "c9", "from": "proxy", "to": "frontend", "label": "SSR + static", "labelDy": 24 }, + { "id": "c10", "from": "browser", "to": "frontend", "label": "HTTPS dashboard", "variant": "emphasis" } + ], + "cards": [ + { "dot": "cyan", "title": "Capture", "items": ["Selfbot gateway listens to guild events + voice streams", "AI moderation runs LLM on messages, attachments, transcripts"] }, + { "dot": "emerald", "title": "Application", "items": ["oRPC over HTTP + WS (partysocket auto-reconnect)", "Next.js 16 SSR dashboard · nginx :4009 reverse proxy"] }, + { "dot": "rose", "title": "Shared State", "items": ["Redis pub/sub relays events + live PCM audio", "PostgreSQL via Drizzle persists messages & assessments"] } + ] +} \ No newline at end of file diff --git a/docs/diagrams/gmw-architecture.visual-check.1440x900.dark.png b/docs/diagrams/gmw-architecture.visual-check.1440x900.dark.png new file mode 100644 index 00000000..dd16e9fd Binary files /dev/null and b/docs/diagrams/gmw-architecture.visual-check.1440x900.dark.png differ diff --git a/docs/diagrams/gmw-architecture.visual-check.1440x900.light.png b/docs/diagrams/gmw-architecture.visual-check.1440x900.light.png new file mode 100644 index 00000000..ce2f5556 Binary files /dev/null and b/docs/diagrams/gmw-architecture.visual-check.1440x900.light.png differ diff --git a/docs/diagrams/gmw-architecture.visual-check.2048x1320.dark.png b/docs/diagrams/gmw-architecture.visual-check.2048x1320.dark.png new file mode 100644 index 00000000..66cc9213 Binary files /dev/null and b/docs/diagrams/gmw-architecture.visual-check.2048x1320.dark.png differ diff --git a/docs/diagrams/gmw-architecture.visual-check.2048x1320.light.png b/docs/diagrams/gmw-architecture.visual-check.2048x1320.light.png new file mode 100644 index 00000000..b001e5cc Binary files /dev/null and b/docs/diagrams/gmw-architecture.visual-check.2048x1320.light.png differ diff --git a/docs/diagrams/gmw-architecture.visual-check.html b/docs/diagrams/gmw-architecture.visual-check.html new file mode 100644 index 00000000..1d99fd01 --- /dev/null +++ b/docs/diagrams/gmw-architecture.visual-check.html @@ -0,0 +1,32 @@ + + + + + +Archify automated browser evidence · gmw-architecture.html + + + +

Automated browser evidence

gmw-architecture.html · visual-check containment pass · perceptual visual review pending

+
+
+ light 1440 by 900 +
LIGHT · 1440×900 · containment pass
+
+
+ dark 1440 by 900 +
DARK · 1440×900 · containment pass
+
+
+ light 2048 by 1320 +
LIGHT · 2048×1320 · containment pass
+
+
+ dark 2048 by 1320 +
DARK · 2048×1320 · containment pass
+
+
+ + diff --git a/docs/diagrams/gmw-architecture.visual-check.json b/docs/diagrams/gmw-architecture.visual-check.json new file mode 100644 index 00000000..47b54164 --- /dev/null +++ b/docs/diagrams/gmw-architecture.visual-check.json @@ -0,0 +1,548 @@ +{ + "schemaVersion": 1, + "ok": true, + "command": "visual-check", + "evidenceKind": "automated-browser", + "status": "pass", + "visualReview": "pending", + "artifact": { + "path": "/home/code/GMW/docs/diagrams/gmw-architecture.html", + "sha256": "8a9646053eb562bd79f674764521f96856d74da603476459c0aeedce53ab7573", + "bytes": 811554 + }, + "state": { + "detail": "read", + "motion": "still" + }, + "chrome": { + "status": "available", + "executable": "/bin/google-chrome" + }, + "diagnostics": [], + "containment": { + "status": "pass", + "viewports": [ + { + "width": 1440, + "height": 900, + "theme": "light", + "innerWidth": 1440, + "innerHeight": 900, + "scrollWidth": 1440, + "scrollHeight": 900, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1163, + "diagramWidth": 1133, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.752105263157895, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 51, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light" + }, + { + "width": 1600, + "height": 1000, + "theme": "light", + "innerWidth": 1600, + "innerHeight": 1000, + "scrollWidth": 1600, + "scrollHeight": 1000, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1207, + "diagramWidth": 1177, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.8, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 51, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light" + }, + { + "width": 1920, + "height": 1080, + "theme": "light", + "innerWidth": 1920, + "innerHeight": 1080, + "scrollWidth": 1920, + "scrollHeight": 1080, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1383, + "diagramWidth": 1353, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.8, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 51, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light" + }, + { + "width": 2048, + "height": 1320, + "theme": "light", + "innerWidth": 2048, + "innerHeight": 1320, + "scrollWidth": 2048, + "scrollHeight": 1320, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1797, + "diagramWidth": 1747, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.8, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 41, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light" + } + ] + }, + "readability": { + "status": "pass", + "minimumProjectedNodeTextPx": 6, + "viewports": [ + { + "width": 1440, + "height": 900, + "theme": "light", + "innerWidth": 1440, + "innerHeight": 900, + "scrollWidth": 1440, + "scrollHeight": 900, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1163, + "diagramWidth": 1133, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.752105263157895, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 51, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light" + }, + { + "width": 1600, + "height": 1000, + "theme": "light", + "innerWidth": 1600, + "innerHeight": 1000, + "scrollWidth": 1600, + "scrollHeight": 1000, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1207, + "diagramWidth": 1177, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.8, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 51, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light" + }, + { + "width": 1920, + "height": 1080, + "theme": "light", + "innerWidth": 1920, + "innerHeight": 1080, + "scrollWidth": 1920, + "scrollHeight": 1080, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1383, + "diagramWidth": 1353, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.8, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 51, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light" + }, + { + "width": 2048, + "height": 1320, + "theme": "light", + "innerWidth": 2048, + "innerHeight": 1320, + "scrollWidth": 2048, + "scrollHeight": 1320, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1797, + "diagramWidth": 1747, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.8, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 41, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light" + } + ] + }, + "viewerChrome": { + "status": "pass", + "viewports": [ + { + "width": 1440, + "height": 900, + "theme": "light", + "innerWidth": 1440, + "innerHeight": 900, + "scrollWidth": 1440, + "scrollHeight": 900, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1163, + "diagramWidth": 1133, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.752105263157895, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 51, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light" + }, + { + "width": 1600, + "height": 1000, + "theme": "light", + "innerWidth": 1600, + "innerHeight": 1000, + "scrollWidth": 1600, + "scrollHeight": 1000, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1207, + "diagramWidth": 1177, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.8, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 51, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light" + }, + { + "width": 1920, + "height": 1080, + "theme": "light", + "innerWidth": 1920, + "innerHeight": 1080, + "scrollWidth": 1920, + "scrollHeight": 1080, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1383, + "diagramWidth": 1353, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.8, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 51, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light" + }, + { + "width": 2048, + "height": 1320, + "theme": "light", + "innerWidth": 2048, + "innerHeight": 1320, + "scrollWidth": 2048, + "scrollHeight": 1320, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1797, + "diagramWidth": 1747, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.8, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 41, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light" + } + ] + }, + "captures": { + "status": "pass", + "screenshots": [ + { + "width": 1440, + "height": 900, + "theme": "light", + "innerWidth": 1440, + "innerHeight": 900, + "scrollWidth": 1440, + "scrollHeight": 900, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1163, + "diagramWidth": 1133, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.752105263157895, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 51, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light", + "file": "gmw-architecture.visual-check.1440x900.light.png" + }, + { + "width": 1440, + "height": 900, + "theme": "dark", + "innerWidth": 1440, + "innerHeight": 900, + "scrollWidth": 1440, + "scrollHeight": 900, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1163, + "diagramWidth": 1133, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.752105263157895, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 51, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "dark", + "file": "gmw-architecture.visual-check.1440x900.dark.png" + }, + { + "width": 2048, + "height": 1320, + "theme": "light", + "innerWidth": 2048, + "innerHeight": 1320, + "scrollWidth": 2048, + "scrollHeight": 1320, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1797, + "diagramWidth": 1747, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.8, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 41, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "light", + "file": "gmw-architecture.visual-check.2048x1320.light.png" + }, + { + "width": 2048, + "height": 1320, + "theme": "dark", + "innerWidth": 2048, + "innerHeight": 1320, + "scrollWidth": 2048, + "scrollHeight": 1320, + "overflowX": false, + "overflowY": false, + "ok": true, + "readerWidth": 1797, + "diagramWidth": 1747, + "viewBoxWidth": 1140, + "minimumProjectedNodeTextPx": 7.8, + "minimumProjectedNodeText": "channels · voice · reactions", + "minimumProjectedNodeTextDetail": "context", + "minimumRequiredNodeTextPx": 6, + "readabilityOk": true, + "hasLegend": false, + "hasNavigationDock": true, + "legendDockIntersectionArea": 0, + "dockStageIntersectionArea": 0, + "dockStageGap": 10.21875, + "requiredDockStageGap": 10, + "viewerChromeStageOk": true, + "viewerChromeReserve": 41, + "viewerChromeActive": true, + "viewerChromeOk": true, + "resolvedTheme": "dark", + "file": "gmw-architecture.visual-check.2048x1320.dark.png" + } + ], + "contactSheet": "gmw-architecture.visual-check.html" + }, + "sidecars": { + "receipt": "gmw-architecture.visual-check.json", + "contactSheet": "gmw-architecture.visual-check.html" + } +}