From 10fdefa7753955a73317ed1318b54e3ab4fe3e02 Mon Sep 17 00:00:00 2001 From: Jonas Alves Date: Sat, 8 Aug 2026 17:05:06 +0100 Subject: [PATCH 1/7] feat(mermaid): register mdi icon pack for architecture-beta diagrams --- docusaurus.config.js | 7 +++++-- package.json | 1 + src/scripts/mermaidIcons.js | 7 +++++++ yarn.lock | 9 ++++++++- 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 src/scripts/mermaidIcons.js diff --git a/docusaurus.config.js b/docusaurus.config.js index 76193c50..508ec90f 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -56,8 +56,11 @@ const config = { locales: ["en"], }, - // Client modules for anchor redirects - clientModules: [require.resolve("./src/anchorRedirects.ts")], + // Client modules for anchor redirects and mermaid icon registration + clientModules: [ + require.resolve("./src/anchorRedirects.ts"), + require.resolve("./src/scripts/mermaidIcons.js"), + ], presets: [ [ diff --git a/package.json b/package.json index ca79f20b..2dba94df 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@docusaurus/plugin-ideal-image": "^3.10.2", "@docusaurus/preset-classic": "^3.10.2", "@docusaurus/theme-mermaid": "^3.10.2", + "@iconify-json/mdi": "^1.2.3", "@mdx-js/react": "^3.1.1", "clsx": "^2.1.0", "docusaurus-plugin-openapi-docs": "^5.1.3", diff --git a/src/scripts/mermaidIcons.js b/src/scripts/mermaidIcons.js new file mode 100644 index 00000000..eae66272 --- /dev/null +++ b/src/scripts/mermaidIcons.js @@ -0,0 +1,7 @@ +import { icons } from "@iconify-json/mdi"; + +if (typeof window !== "undefined") { + import("mermaid").then(({ default: mermaid }) => { + mermaid.registerIconPacks([{ name: icons.prefix, icons }]); + }); +} diff --git a/yarn.lock b/yarn.lock index bcdbbdea..8b419119 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2258,7 +2258,14 @@ resolved "https://registry.yarnpkg.com/@hookform/error-message/-/error-message-2.0.1.tgz#6a37419106e13664ad6a29c9dae699ae6cd276b8" integrity sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg== -"@iconify/types@^2.0.0": +"@iconify-json/mdi@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@iconify-json/mdi/-/mdi-1.2.3.tgz#5e4ee9d8c8aaad04381c8cc6c6edbe3327f031b5" + integrity sha512-O3cLwbDOK7NNDf2ihaQOH5F9JglnulNDFV7WprU2dSoZu3h3cWH//h74uQAB87brHmvFVxIOkuBX2sZSzYhScg== + dependencies: + "@iconify/types" "*" + +"@iconify/types@*", "@iconify/types@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== From fec09171dd5a01afd3321c4c4b36c565f5cfb7f8 Mon Sep 17 00:00:00 2001 From: Jonas Alves Date: Sat, 8 Aug 2026 17:13:48 +0100 Subject: [PATCH 2/7] docs(warehouse-native): scratch-validate Hybrid architecture-beta diagram --- .../_scratch-diagram-preview.mdx | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 docs/web-console-docs/warehouse-native/_scratch-diagram-preview.mdx diff --git a/docs/web-console-docs/warehouse-native/_scratch-diagram-preview.mdx b/docs/web-console-docs/warehouse-native/_scratch-diagram-preview.mdx new file mode 100644 index 00000000..68e8c036 --- /dev/null +++ b/docs/web-console-docs/warehouse-native/_scratch-diagram-preview.mdx @@ -0,0 +1,39 @@ +--- +title: Scratch Diagram Preview +sidebar_position: 999 +--- + +# Scratch preview — delete before merging (Task 4) + +## Hybrid + +```mermaid +%%{init: {"theme": "base", "themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "primaryColor": "#ffffff", "primaryBorderColor": "#CA3721", "primaryTextColor": "#28293d", "lineColor": "#9296a6", "tertiaryColor": "#ffffff", "fontSize": "15px"}}}%% +architecture-beta + service sdk(mdi:cellphone-link)[Your app ABsmartly SDK] + + group abc(mdi:cloud-outline)[ABsmartly default] + service default(mdi:database)[Exposures no filtering and managed goals] in abc + + group ewh(mdi:cloud-outline)[Your warehouse external] + service importsvc(mdi:database-import)[Imported exposures] in ewh + service wgoals(mdi:database)[Your goals] in ewh + service attr(mdi:database)[Your attributes] in ewh + service filtersvc(mdi:filter-outline)[Filter and enrich] in ewh + service query(mdi:magnify)[Query interface] in ewh + + group cloud(mdi:cloud-outline)[ABsmartly Cloud] + service engine(mdi:cog-outline)[Assignment stats and governance] in cloud + + sdk:R --> L:default + default:R --> L:importsvc + importsvc:B --> T:filtersvc + attr:B --> T:filtersvc + filtersvc:R --> L:query + wgoals:R --> L:query + default:B --> T:engine + engine:R --> L:query + query:T --> B:engine +``` + +*Dashed arrows in the original flowchart diagram: the default source's exposures flow into your warehouse on a scheduled "exposures import". Across the privacy boundary between your warehouse and ABsmartly Cloud, ABsmartly runs a "scheduled query" in and only "aggregate results" come back out — no user-level data crosses that boundary.* From c16eb361c59f7baa5895c1cca3663d8ab736ab9e Mon Sep 17 00:00:00 2001 From: Jonas Alves Date: Sat, 8 Aug 2026 17:22:47 +0100 Subject: [PATCH 3/7] docs(warehouse-native): scratch-validate Fully architecture-beta diagram --- .../_scratch-diagram-preview.mdx | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/web-console-docs/warehouse-native/_scratch-diagram-preview.mdx b/docs/web-console-docs/warehouse-native/_scratch-diagram-preview.mdx index 68e8c036..68bc00a7 100644 --- a/docs/web-console-docs/warehouse-native/_scratch-diagram-preview.mdx +++ b/docs/web-console-docs/warehouse-native/_scratch-diagram-preview.mdx @@ -37,3 +37,31 @@ architecture-beta ``` *Dashed arrows in the original flowchart diagram: the default source's exposures flow into your warehouse on a scheduled "exposures import". Across the privacy boundary between your warehouse and ABsmartly Cloud, ABsmartly runs a "scheduled query" in and only "aggregate results" come back out — no user-level data crosses that boundary.* + +## Fully + +```mermaid +%%{init: {"theme": "base", "themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "primaryColor": "#ffffff", "primaryBorderColor": "#CA3721", "primaryTextColor": "#28293d", "lineColor": "#9296a6", "tertiaryColor": "#ffffff", "fontSize": "15px"}}}%% +architecture-beta + service sdk(mdi:cellphone-link)[Your app ABsmartly SDK] + + group wh(mdi:cloud-outline)[Your warehouse default] + service exp(mdi:database)[Exposures] in wh + service goals(mdi:database)[Goals] in wh + service attr(mdi:database)[Your attributes] in wh + service filtersvc(mdi:filter-outline)[Filter and enrich] in wh + service query(mdi:magnify)[Query interface] in wh + + group cloud(mdi:cloud-outline)[ABsmartly Cloud] + service engine(mdi:cog-outline)[Assignment logic stats and metric governance with no user level data stored] in cloud + + sdk:R --> L:exp + exp:B --> T:filtersvc + attr:B --> T:filtersvc + filtersvc:R --> L:query + goals:R --> L:query + engine:R --> L:query + query:T --> B:engine +``` + +*Dashed arrows in the original flowchart diagram: across the privacy boundary between your warehouse and ABsmartly Cloud, ABsmartly runs a "scheduled query" in and only "aggregate results" come back out — no user-level data crosses that boundary.* From 9cd79dd711f6e945eca97d7909a33ec14c1c5328 Mon Sep 17 00:00:00 2001 From: Jonas Alves Date: Sat, 8 Aug 2026 17:30:57 +0100 Subject: [PATCH 4/7] docs(warehouse-native): replace flowchart diagrams with architecture-beta (FT-2119) --- .../_scratch-diagram-preview.mdx | 67 ---------- .../warehouse-native/modes.mdx | 121 +++++++----------- 2 files changed, 49 insertions(+), 139 deletions(-) delete mode 100644 docs/web-console-docs/warehouse-native/_scratch-diagram-preview.mdx diff --git a/docs/web-console-docs/warehouse-native/_scratch-diagram-preview.mdx b/docs/web-console-docs/warehouse-native/_scratch-diagram-preview.mdx deleted file mode 100644 index 68bc00a7..00000000 --- a/docs/web-console-docs/warehouse-native/_scratch-diagram-preview.mdx +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Scratch Diagram Preview -sidebar_position: 999 ---- - -# Scratch preview — delete before merging (Task 4) - -## Hybrid - -```mermaid -%%{init: {"theme": "base", "themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "primaryColor": "#ffffff", "primaryBorderColor": "#CA3721", "primaryTextColor": "#28293d", "lineColor": "#9296a6", "tertiaryColor": "#ffffff", "fontSize": "15px"}}}%% -architecture-beta - service sdk(mdi:cellphone-link)[Your app ABsmartly SDK] - - group abc(mdi:cloud-outline)[ABsmartly default] - service default(mdi:database)[Exposures no filtering and managed goals] in abc - - group ewh(mdi:cloud-outline)[Your warehouse external] - service importsvc(mdi:database-import)[Imported exposures] in ewh - service wgoals(mdi:database)[Your goals] in ewh - service attr(mdi:database)[Your attributes] in ewh - service filtersvc(mdi:filter-outline)[Filter and enrich] in ewh - service query(mdi:magnify)[Query interface] in ewh - - group cloud(mdi:cloud-outline)[ABsmartly Cloud] - service engine(mdi:cog-outline)[Assignment stats and governance] in cloud - - sdk:R --> L:default - default:R --> L:importsvc - importsvc:B --> T:filtersvc - attr:B --> T:filtersvc - filtersvc:R --> L:query - wgoals:R --> L:query - default:B --> T:engine - engine:R --> L:query - query:T --> B:engine -``` - -*Dashed arrows in the original flowchart diagram: the default source's exposures flow into your warehouse on a scheduled "exposures import". Across the privacy boundary between your warehouse and ABsmartly Cloud, ABsmartly runs a "scheduled query" in and only "aggregate results" come back out — no user-level data crosses that boundary.* - -## Fully - -```mermaid -%%{init: {"theme": "base", "themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "primaryColor": "#ffffff", "primaryBorderColor": "#CA3721", "primaryTextColor": "#28293d", "lineColor": "#9296a6", "tertiaryColor": "#ffffff", "fontSize": "15px"}}}%% -architecture-beta - service sdk(mdi:cellphone-link)[Your app ABsmartly SDK] - - group wh(mdi:cloud-outline)[Your warehouse default] - service exp(mdi:database)[Exposures] in wh - service goals(mdi:database)[Goals] in wh - service attr(mdi:database)[Your attributes] in wh - service filtersvc(mdi:filter-outline)[Filter and enrich] in wh - service query(mdi:magnify)[Query interface] in wh - - group cloud(mdi:cloud-outline)[ABsmartly Cloud] - service engine(mdi:cog-outline)[Assignment logic stats and metric governance with no user level data stored] in cloud - - sdk:R --> L:exp - exp:B --> T:filtersvc - attr:B --> T:filtersvc - filtersvc:R --> L:query - goals:R --> L:query - engine:R --> L:query - query:T --> B:engine -``` - -*Dashed arrows in the original flowchart diagram: across the privacy boundary between your warehouse and ABsmartly Cloud, ABsmartly runs a "scheduled query" in and only "aggregate results" come back out — no user-level data crosses that boundary.* diff --git a/docs/web-console-docs/warehouse-native/modes.mdx b/docs/web-console-docs/warehouse-native/modes.mdx index b29a0246..2496dc3d 100644 --- a/docs/web-console-docs/warehouse-native/modes.mdx +++ b/docs/web-console-docs/warehouse-native/modes.mdx @@ -35,48 +35,35 @@ In Hybrid mode, you keep the ABsmartly-managed data source as your default and a ```mermaid %%{init: {"theme": "base", "themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "primaryColor": "#ffffff", "primaryBorderColor": "#CA3721", "primaryTextColor": "#28293d", "lineColor": "#9296a6", "tertiaryColor": "#ffffff", "fontSize": "15px"}}}%% -flowchart TB - SDK(["Your app - ABsmartly SDK"]) - - subgraph ABC["ABsmartly (default)"] - DEFAULT[("Exposures (no filtering)
and managed goals")] - end - - subgraph EWH["Your warehouse (external)"] - IMPORT[("Imported
exposures")] - WGOALS[("Your goals")] - ATTR[("Your attributes")] - FILTER("Filter and enrich") - QUERY("Query interface") - end - - subgraph CLOUD["ABsmartly Cloud"] - ENGINE("Assignment logic, stats and
metric governance") - end - - SDK --> DEFAULT - DEFAULT -.->|"exposures import"| IMPORT - IMPORT --> FILTER - ATTR --> FILTER - FILTER --> QUERY - WGOALS --> QUERY - DEFAULT --> ENGINE - ENGINE -.->|"scheduled query"| QUERY - QUERY -.->|"aggregate results only"| ENGINE - - style ABC fill:#FBEDEA,stroke:#CA3721,stroke-width:1.5px,color:#28293d - style EWH fill:#EEF1FF,stroke:#465BFF,stroke-width:1.5px,color:#28293d - style CLOUD fill:#FBEDEA,stroke:#CA3721,stroke-width:1.5px,color:#28293d - style DEFAULT fill:#ffffff,stroke:#CA3721,stroke-width:1.5px,color:#28293d - style IMPORT fill:#ffffff,stroke:#465BFF,stroke-width:1.5px,color:#28293d - style WGOALS fill:#ffffff,stroke:#465BFF,stroke-width:1.5px,color:#28293d - style ATTR fill:#ffffff,stroke:#465BFF,stroke-width:1.5px,color:#28293d - style FILTER fill:#465BFF,stroke:#465BFF,stroke-width:1.5px,color:#ffffff - style QUERY fill:#ffffff,stroke:#465BFF,stroke-width:1.5px,color:#28293d - style ENGINE fill:#ffffff,stroke:#CA3721,stroke-width:1.5px,color:#28293d - style SDK fill:#ffffff,stroke:#9296a6,stroke-width:1.5px,color:#28293d +architecture-beta + service sdk(mdi:cellphone-link)[Your app ABsmartly SDK] + + group abc(mdi:server)[ABsmartly default] + service default(mdi:database)[Exposures with no filtering and managed goals] in abc + + group ewh(mdi:server-network)[Your warehouse external] + service importsvc(mdi:database-import)[Imported exposures] in ewh + service wgoals(mdi:database)[Your goals] in ewh + service attr(mdi:database)[Your attributes] in ewh + service filtersvc(mdi:filter-outline)[Filter and enrich] in ewh + service query(mdi:magnify)[Query interface] in ewh + + group cloud(mdi:cloud-outline)[ABsmartly Cloud] + service engine(mdi:cog-outline)[Assignment stats and governance] in cloud + + sdk:R --> L:default + default:R --> L:importsvc + importsvc:B --> T:filtersvc + attr:B --> T:filtersvc + filtersvc:R --> L:query + wgoals:R --> L:query + default:B --> T:engine + engine:R --> L:query + query:T --> B:engine ``` +*Across the privacy boundary between your warehouse and ABsmartly Cloud, ABsmartly runs a scheduled query in and only aggregate results come back out — no user-level data crosses that boundary. The default source's exposures flow into your warehouse on a scheduled exposures import.* + Hybrid lets you bring metrics into your warehouse at your own pace: you keep ABsmartly's battle-tested assignment and exposure pipeline, and move as many (or as few) of your goals into your warehouse as you like — gaining filtering and enrichment for each one you move. ## Fully Warehouse Native @@ -90,40 +77,30 @@ Because every exposure already lives in your warehouse, Fully extends Hybrid's w ```mermaid %%{init: {"theme": "base", "themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "primaryColor": "#ffffff", "primaryBorderColor": "#CA3721", "primaryTextColor": "#28293d", "lineColor": "#9296a6", "tertiaryColor": "#ffffff", "fontSize": "15px"}}}%% -flowchart TB - SDK(["Your app - ABsmartly SDK"]) - - subgraph WH["Your warehouse (default)"] - EXP[("Exposures")] - GOALS[("Goals")] - ATTR[("Your attributes")] - FILTER("Filter and enrich") - QUERY("Query interface") - end - - subgraph ABC["ABsmartly Cloud"] - ENGINE("Assignment logic, stats and
metric governance
no user-level data stored") - end - - SDK --> EXP - EXP --> FILTER - ATTR --> FILTER - FILTER --> QUERY - GOALS --> QUERY - ENGINE -.->|"scheduled query"| QUERY - QUERY -.->|"aggregate results only"| ENGINE - - style WH fill:#EEF1FF,stroke:#465BFF,stroke-width:1.5px,color:#28293d - style ABC fill:#FBEDEA,stroke:#CA3721,stroke-width:1.5px,color:#28293d - style EXP fill:#ffffff,stroke:#465BFF,stroke-width:1.5px,color:#28293d - style GOALS fill:#ffffff,stroke:#465BFF,stroke-width:1.5px,color:#28293d - style ATTR fill:#ffffff,stroke:#465BFF,stroke-width:1.5px,color:#28293d - style FILTER fill:#465BFF,stroke:#465BFF,stroke-width:1.5px,color:#ffffff - style QUERY fill:#ffffff,stroke:#465BFF,stroke-width:1.5px,color:#28293d - style ENGINE fill:#ffffff,stroke:#CA3721,stroke-width:1.5px,color:#28293d - style SDK fill:#ffffff,stroke:#9296a6,stroke-width:1.5px,color:#28293d +architecture-beta + service sdk(mdi:cellphone-link)[Your app ABsmartly SDK] + + group wh(mdi:cloud-outline)[Your warehouse default] + service exp(mdi:database)[Exposures] in wh + service goals(mdi:database)[Goals] in wh + service attr(mdi:database)[Your attributes] in wh + service filtersvc(mdi:filter-outline)[Filter and enrich] in wh + service query(mdi:magnify)[Query interface] in wh + + group cloud(mdi:cloud-outline)[ABsmartly Cloud] + service engine(mdi:cog-outline)[Assignment logic stats and metric governance with no user level data stored] in cloud + + sdk:R --> L:exp + exp:B --> T:filtersvc + attr:B --> T:filtersvc + filtersvc:R --> L:query + goals:R --> L:query + engine:R --> L:query + query:T --> B:engine ``` +*Across the privacy boundary between your warehouse and ABsmartly Cloud, ABsmartly runs a scheduled query in and only aggregate results come back out — no user-level data crosses that boundary.* + :::info Why the exposure source matters Exposure-side filtering (bots, scrapers, internal traffic) and attribute enrichment both operate on the exposure stream, and only work once that stream lives inside your warehouse. In **Hybrid**, that's true for goals you source from your warehouse — their imported exposures can be filtered and enriched. It's **not** true for goals that stay managed by ABsmartly, since their exposures never leave the default data source. In **Fully**, every exposure lives in your warehouse, so filtering and enrichment apply to every goal. ::: From 7bd78b784b69d62e108de8e85bdbcfa964c0d2b1 Mon Sep 17 00:00:00 2001 From: Jonas Alves Date: Sat, 8 Aug 2026 21:04:22 +0100 Subject: [PATCH 5/7] fix(warehouse-native): fix dark-mode legibility and layout overlap in architecture-beta diagrams The mermaid init directive forced "theme": "base" with a hardcoded dark navy primaryTextColor, which overrode Docusaurus's automatic per-colorMode mermaid theme and made node labels nearly unreadable in dark mode (the old flowchart diagrams got away with this because their nodes had solid fill backgrounds; architecture-beta nodes render icon-only with no background box). Also two service nodes rendered directly on top of each other in both diagrams due to fcose's default layout, and adjacent group headers visually collided. Removed the theme override so Docusaurus's dark/default mermaid theme takes over color, added architecture-beta layout tuning (padding, nodeSeparation, idealEdgeLengthMultiplier, numIter, seed) for spacing, and adjusted edge port routing on 4 edges to resolve node/group overlap. Topology (which nodes connect to which) is unchanged. --- docs/web-console-docs/warehouse-native/modes.mdx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/web-console-docs/warehouse-native/modes.mdx b/docs/web-console-docs/warehouse-native/modes.mdx index 2496dc3d..aabb2409 100644 --- a/docs/web-console-docs/warehouse-native/modes.mdx +++ b/docs/web-console-docs/warehouse-native/modes.mdx @@ -34,7 +34,7 @@ In Hybrid mode, you keep the ABsmartly-managed data source as your default and a - Because that import lands the exposures inside your warehouse, **goals sourced from your warehouse can filter and enrich those exposures** the same way Fully mode does — strip out bots and internal traffic, or join in your own attributes table. **Goals that stay managed by ABsmartly don't get this**, since their exposures never leave ABsmartly's default data source. ```mermaid -%%{init: {"theme": "base", "themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "primaryColor": "#ffffff", "primaryBorderColor": "#CA3721", "primaryTextColor": "#28293d", "lineColor": "#9296a6", "tertiaryColor": "#ffffff", "fontSize": "15px"}}}%% +%%{init: {"themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "fontSize": "15px", "archEdgeColor": "#9296a6", "archEdgeArrowColor": "#9296a6", "archGroupBorderColor": "#CA3721"}, "architecture": {"padding": 60, "nodeSeparation": 160, "idealEdgeLengthMultiplier": 2.2, "numIter": 6000, "seed": 2}}}%% architecture-beta service sdk(mdi:cellphone-link)[Your app ABsmartly SDK] @@ -52,8 +52,8 @@ architecture-beta service engine(mdi:cog-outline)[Assignment stats and governance] in cloud sdk:R --> L:default - default:R --> L:importsvc - importsvc:B --> T:filtersvc + default:B --> T:importsvc + importsvc:R --> L:filtersvc attr:B --> T:filtersvc filtersvc:R --> L:query wgoals:R --> L:query @@ -76,7 +76,7 @@ Because every exposure already lives in your warehouse, Fully extends Hybrid's w - **Enrich exposures with your own attributes.** You can join in an external **attributes** table to add segmentation dimensions, then slice experiment results by those attributes. ```mermaid -%%{init: {"theme": "base", "themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "primaryColor": "#ffffff", "primaryBorderColor": "#CA3721", "primaryTextColor": "#28293d", "lineColor": "#9296a6", "tertiaryColor": "#ffffff", "fontSize": "15px"}}}%% +%%{init: {"themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "fontSize": "15px", "archEdgeColor": "#9296a6", "archEdgeArrowColor": "#9296a6", "archGroupBorderColor": "#CA3721"}, "architecture": {"padding": 60, "nodeSeparation": 160, "idealEdgeLengthMultiplier": 2.2, "numIter": 6000, "seed": 2}}}%% architecture-beta service sdk(mdi:cellphone-link)[Your app ABsmartly SDK] @@ -90,9 +90,9 @@ architecture-beta group cloud(mdi:cloud-outline)[ABsmartly Cloud] service engine(mdi:cog-outline)[Assignment logic stats and metric governance with no user level data stored] in cloud - sdk:R --> L:exp + sdk:T --> L:exp exp:B --> T:filtersvc - attr:B --> T:filtersvc + attr:T --> B:filtersvc filtersvc:R --> L:query goals:R --> L:query engine:R --> L:query From 380b17e497749198a03076221c76db43d6e2b713 Mon Sep 17 00:00:00 2001 From: Jonas Alves Date: Sat, 8 Aug 2026 21:39:17 +0100 Subject: [PATCH 6/7] fix(warehouse-native): use align row/column directive for clean grid layout The previous fix reduced overlap by hand-tuning individual edge ports, but still left a scattered diagonal layout with a long crossing edge (fcose's force-directed layout has no notion of "tidy grid" on its own). architecture-beta has an explicit `align row {ids}` / `align column {ids}` directive built for exactly this: declaring that a set of nodes share a row or column, which architectureDb turns into hard alignment constraints for the layout solver instead of leaving positioning to force simulation. Restructured both diagrams as a 2-row grid (top row: SDK/sources, bottom row: attributes/filter/query) with explicit align directives, which eliminates the diagonal sprawl and produces mostly-straight edges. Also bumped iconSize (80->100) so wrapped multi-line labels have more width per line, fixing "Assignment ... data stored" clipping past its group's bottom border, and trimmed the label itself slightly (the "logic"/"metric" wording it dropped is already covered in the adjacent prose paragraph, so no content is lost). Topology (which nodes connect to which, and the direction of each edge) is unchanged. --- .../warehouse-native/modes.mdx | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/docs/web-console-docs/warehouse-native/modes.mdx b/docs/web-console-docs/warehouse-native/modes.mdx index aabb2409..1ddb38a9 100644 --- a/docs/web-console-docs/warehouse-native/modes.mdx +++ b/docs/web-console-docs/warehouse-native/modes.mdx @@ -34,7 +34,7 @@ In Hybrid mode, you keep the ABsmartly-managed data source as your default and a - Because that import lands the exposures inside your warehouse, **goals sourced from your warehouse can filter and enrich those exposures** the same way Fully mode does — strip out bots and internal traffic, or join in your own attributes table. **Goals that stay managed by ABsmartly don't get this**, since their exposures never leave ABsmartly's default data source. ```mermaid -%%{init: {"themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "fontSize": "15px", "archEdgeColor": "#9296a6", "archEdgeArrowColor": "#9296a6", "archGroupBorderColor": "#CA3721"}, "architecture": {"padding": 60, "nodeSeparation": 160, "idealEdgeLengthMultiplier": 2.2, "numIter": 6000, "seed": 2}}}%% +%%{init: {"themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "fontSize": "15px", "archEdgeColor": "#9296a6", "archEdgeArrowColor": "#9296a6", "archGroupBorderColor": "#CA3721"}, "architecture": {"iconSize": 100, "padding": 60, "nodeSeparation": 160, "idealEdgeLengthMultiplier": 2.2, "numIter": 6000, "seed": 2}}}%% architecture-beta service sdk(mdi:cellphone-link)[Your app ABsmartly SDK] @@ -51,15 +51,20 @@ architecture-beta group cloud(mdi:cloud-outline)[ABsmartly Cloud] service engine(mdi:cog-outline)[Assignment stats and governance] in cloud + align row sdk default importsvc wgoals + align row attr filtersvc query + align column importsvc filtersvc + align column wgoals query + sdk:R --> L:default - default:B --> T:importsvc - importsvc:R --> L:filtersvc - attr:B --> T:filtersvc + default:R --> L:importsvc + importsvc:B --> T:filtersvc + attr:R --> L:filtersvc filtersvc:R --> L:query - wgoals:R --> L:query + wgoals:B --> T:query default:B --> T:engine - engine:R --> L:query - query:T --> B:engine + engine:L --> R:query + query:R --> L:engine ``` *Across the privacy boundary between your warehouse and ABsmartly Cloud, ABsmartly runs a scheduled query in and only aggregate results come back out — no user-level data crosses that boundary. The default source's exposures flow into your warehouse on a scheduled exposures import.* @@ -76,7 +81,7 @@ Because every exposure already lives in your warehouse, Fully extends Hybrid's w - **Enrich exposures with your own attributes.** You can join in an external **attributes** table to add segmentation dimensions, then slice experiment results by those attributes. ```mermaid -%%{init: {"themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "fontSize": "15px", "archEdgeColor": "#9296a6", "archEdgeArrowColor": "#9296a6", "archGroupBorderColor": "#CA3721"}, "architecture": {"padding": 60, "nodeSeparation": 160, "idealEdgeLengthMultiplier": 2.2, "numIter": 6000, "seed": 2}}}%% +%%{init: {"themeVariables": {"fontFamily": "Manrope, system-ui, sans-serif", "fontSize": "15px", "archEdgeColor": "#9296a6", "archEdgeArrowColor": "#9296a6", "archGroupBorderColor": "#CA3721"}, "architecture": {"iconSize": 100, "padding": 60, "nodeSeparation": 160, "idealEdgeLengthMultiplier": 2.2, "numIter": 6000, "seed": 2}}}%% architecture-beta service sdk(mdi:cellphone-link)[Your app ABsmartly SDK] @@ -88,15 +93,20 @@ architecture-beta service query(mdi:magnify)[Query interface] in wh group cloud(mdi:cloud-outline)[ABsmartly Cloud] - service engine(mdi:cog-outline)[Assignment logic stats and metric governance with no user level data stored] in cloud + service engine(mdi:cog-outline)[Assignment stats and governance with no user level data stored] in cloud + + align row sdk exp goals + align row attr filtersvc query + align column exp filtersvc + align column goals query - sdk:T --> L:exp + sdk:R --> L:exp exp:B --> T:filtersvc - attr:T --> B:filtersvc + attr:R --> L:filtersvc filtersvc:R --> L:query - goals:R --> L:query - engine:R --> L:query - query:T --> B:engine + goals:B --> T:query + engine:L --> R:query + query:R --> L:engine ``` *Across the privacy boundary between your warehouse and ABsmartly Cloud, ABsmartly runs a scheduled query in and only aggregate results come back out — no user-level data crosses that boundary.* From cc08c868c38a79129f6f91348d6ce393848f4d72 Mon Sep 17 00:00:00 2001 From: Jonas Alves Date: Sat, 8 Aug 2026 22:53:49 +0100 Subject: [PATCH 7/7] fix(warehouse-native): align engine with query's row to eliminate diagonal sprawl engine wasn't part of any align row/column constraint, so fcose placed it wherever the force simulation happened to settle -- in practice, far from query in an isolated corner, with the query<->engine edges stretching diagonally across the full canvas. Adding engine to the same align row as query (they're directly connected) keeps it adjacent in the layout, collapsing both edges to short, near-horizontal lines instead of long diagonals. Topology is unchanged -- same two distinct directional edges between query and engine, same edge directions. --- docs/web-console-docs/warehouse-native/modes.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/web-console-docs/warehouse-native/modes.mdx b/docs/web-console-docs/warehouse-native/modes.mdx index 1ddb38a9..161e03ee 100644 --- a/docs/web-console-docs/warehouse-native/modes.mdx +++ b/docs/web-console-docs/warehouse-native/modes.mdx @@ -52,7 +52,7 @@ architecture-beta service engine(mdi:cog-outline)[Assignment stats and governance] in cloud align row sdk default importsvc wgoals - align row attr filtersvc query + align row attr filtersvc query engine align column importsvc filtersvc align column wgoals query @@ -63,8 +63,8 @@ architecture-beta filtersvc:R --> L:query wgoals:B --> T:query default:B --> T:engine - engine:L --> R:query query:R --> L:engine + engine:L --> R:query ``` *Across the privacy boundary between your warehouse and ABsmartly Cloud, ABsmartly runs a scheduled query in and only aggregate results come back out — no user-level data crosses that boundary. The default source's exposures flow into your warehouse on a scheduled exposures import.* @@ -96,7 +96,7 @@ architecture-beta service engine(mdi:cog-outline)[Assignment stats and governance with no user level data stored] in cloud align row sdk exp goals - align row attr filtersvc query + align row attr filtersvc query engine align column exp filtersvc align column goals query @@ -105,8 +105,8 @@ architecture-beta attr:R --> L:filtersvc filtersvc:R --> L:query goals:B --> T:query - engine:L --> R:query query:R --> L:engine + engine:L --> R:query ``` *Across the privacy boundary between your warehouse and ABsmartly Cloud, ABsmartly runs a scheduled query in and only aggregate results come back out — no user-level data crosses that boundary.*