Skip to content

FE-1495: Prevent Brunch TypeScript contracts from drifting - #9312

Merged
lunelson merged 2 commits into
mainfrom
ln/fe-1495-typescript-contracts
Aug 26, 2026
Merged

FE-1495: Prevent Brunch TypeScript contracts from drifting#9312
lunelson merged 2 commits into
mainfrom
ln/fe-1495-typescript-contracts

Conversation

@lunelson

@lunelson lunelson commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

🌟 What is the purpose of this PR?

Brunch's TypeScript contracts could drift because its packages lacked a scoped, type-aware lint policy, and several runtime schemas, SDK payloads, and test protocols were restated as independent handwritten types. Stacked on the strategy and documentation work, this pull request makes those boundaries mechanically strict inside Brunch without imposing the policy on unrelated HASH workspaces.

🔗 Related links

🚫 Blocked by

🔍 What does this change?

Brunch packages and apps/brunch-agent now run Oxlint with multi-file analysis, type-aware rules, and compiler diagnostics, using shared presets under .config/oxlint/brunch/. Persisted records, AI SDK wire values, plugin proposals, and test protocols derive their TypeScript types from the schemas or library contracts that already own those values. Package Oxlint configs encode the existing harness / binding / plugin / transport direction rules.

🏗️ Agent notes

Stacked as ln/fe-1437-hash-monorepo-importln/fe-1494-strategic-controlsthis branchln/fe-1480-resolve-decision.

This branch was previously ln/fe-xxxx-tooling-expanse. After restack it contains only the two commits that are unique to FE-1495; the ten documentation/strategy commits live on #9311.

Commits

  • 77bd7cb1ca Add comprehensive Oxlint policy for Brunch
  • b052dda955 Unify Brunch TypeScript contract ownership

Lint policy

  • Presets: .config/oxlint/brunch/base.json and react.json.
  • Per-package .oxlintrc.json files extend those presets and enable typeAware plus typeCheck.
  • lint:eslint / fix:eslint add --type-check so compiler diagnostics fail the task.
  • no-restricted-imports encodes: no @local/*; no Petrinaut from Brunch libraries or the Brunch server; harness independent of bindings/plugins/transports/Flue; plugins storage-blind and substrate-independent; transports independent of bindings.

Contract ownership

Types are inferred from Valibot schemas or imported from the owning library rather than restated:

  • capture-store envelopes, issues, events, and JSON-compatible values
  • session-log entries
  • sweep-protocol statuses
  • plugin descriptors
  • reply-protocol / AI SDK UI-message-stream chunks
  • ask input/output parsers
  • baseline-runner and architecture-test fixtures

apps/brunch-agent depends on ai so application tests can use the SDK's published types instead of local copies. Intentional standalone types remain at historical archive and pruned-CI boundaries.

Verification already run on the branch

Brunch formatting, Oxlint, tsgo, Vite build, and Vitest across the four libraries and the application.

Pre-Merge Checklist 🚀

🚢 Has this modified a publishable library?

This PR:

  • does not modify any publishable blocks or libraries, or modifications do not need publishing

Brunch packages remain private. The ai dependency is on the private application workspace.

📜 Does this require a change to the docs?

The changes in this PR:

  • are internal and do not require a docs change

AGENTS.md records the Oxlint invocation for agents working in the Brunch context. No user-facing Petrinaut docs change.

🕸️ Does this require a change to the Turbo Graph?

The changes in this PR:

  • do not affect the execution graph

Existing lint:eslint tasks gain flags and config files; no new workspace or turbo.json change.

⚠️ Known issues

Standalone types at historical archive documents and pruned-CI helpers are intentional and out of policy scope.

🐾 Next steps

  • FE-1480 / #9313 — projection/realization authority boundary and design-convergence order

🛡 What tests cover this?

  • Package and application lint:eslint (Oxlint with type-aware rules and compiler diagnostics)
  • Package and application lint:tsc
  • Existing Vitest suites, updated where handwritten DTO copies were replaced
  • Architecture tests still pass under the stricter lint

❓ How to test this?

  1. Run:

    turbo run lint:eslint lint:tsc test:unit build \
      --filter '@hashintel/brunch-agent' \
      --filter '@hashintel/brunch-agent-binding-flue' \
      --filter '@hashintel/brunch-agent-transport-aisdk' \
      --filter '@hashintel/brunch-agent-plugin-gherkin' \
      --filter '@apps/brunch-agent'
  2. Confirm a forbidden import (for example @hashintel/petrinaut from packages/core) fails Oxlint with the configured message.

📹 Demo

Not applicable — lint policy and type-ownership changes only.

@github-actions github-actions Bot added area/deps Relates to third-party dependencies (area) area/infra Relates to version control, CI, CD or IaC (area) area/libs Relates to first-party libraries/crates/packages (area) type/eng > frontend Owned by the @frontend team area/tests New or updated tests area/apps labels Aug 24, 2026
@vercel

vercel Bot commented Aug 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
hash Ready Ready Preview Aug 26, 2026 10:51am
petrinaut Ready Ready Preview Aug 26, 2026 10:51am
petrinaut-docs Ready Ready Preview Aug 26, 2026 10:51am
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
hashdotdesign-tokens Ignored Ignored Preview Aug 26, 2026 10:51am

Request Review

lunelson commented Aug 24, 2026

Copy link
Copy Markdown
Contributor Author

@lunelson lunelson changed the title Add comprehensive Oxlint policy for Brunch FE-1495: Prevent Brunch TypeScript contracts from drifting Aug 24, 2026
@codecov

codecov Bot commented Aug 24, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 60.22%. Comparing base (7010fca) to head (ddecada).

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #9312   +/-   ##
=======================================
  Coverage   60.22%   60.22%           
=======================================
  Files        1430     1430           
  Lines      140558   140558           
  Branches     6609     6609           
=======================================
  Hits        84658    84658           
  Misses      54823    54823           
  Partials     1077     1077           
Flag Coverage Δ
apps.hash-api 14.66% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@lunelson
lunelson marked this pull request as ready for review August 24, 2026 16:20
@cursor

cursor Bot commented Aug 24, 2026

Copy link
Copy Markdown

PR Summary

Low Risk
Tooling and type-refactor only; no intended runtime behavior change beyond stricter lint and schema-aligned parsing at existing boundaries.

Overview
Brunch workspaces now run Oxlint with shared presets under .config/oxlint/brunch/ (base + React), type-aware rules, and --type-check so compiler diagnostics fail lint:eslint. Per-package .oxlintrc.json files extend those presets and enforce import boundaries (no Petrinaut, no @local/*, harness/plugin/transport/binding direction).

TypeScript contracts are tied to their owning schemas or libraries instead of duplicate handwritten types: capture-store and session-log envelopes derive from Valibot (JsonValueSchema, ReadonlyDeep), sweep statuses and reply-protocol kinds are exported from core, and application/transport tests use the ai package’s UIMessageChunk types plus small shared result modules.

Supporting fixes include prune CI copying .config/oxlint/brunch, replacing console.log with process.stdout.write for opt-in diagnostics, and targeted oxlint-disable comments where runtime guards or Vitest matchers are intentional.

Reviewed by Cursor Bugbot for commit ddecada. Bugbot is set up for automated code reviews on this repo. Configure here.

@codspeed-hq

codspeed-hq Bot commented Aug 24, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 98 untouched benchmarks


Comparing ln/fe-1495-typescript-contracts (ddecada) with main (f897a69)1

Open in CodSpeed

Footnotes

  1. No successful run was found on main (7010fca) during the generation of this report, so f897a69 was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

lunelson and others added 2 commits August 26, 2026 12:41
Enable type-aware and compiler-backed linting across the Brunch packages, share scoped rules with the app, and resolve the initial diagnostics without widening repository policy.

Co-authored-by: Cursor <cursoragent@cursor.com>
Derive persisted, transport, and test types from their schemas and library contracts so runtime boundaries and TypeScript consumers cannot drift independently.

Co-authored-by: Cursor <cursoragent@cursor.com>
@lunelson
lunelson force-pushed the ln/fe-1495-typescript-contracts branch from 39828d1 to ddecada Compare August 26, 2026 10:42
@lunelson
lunelson deployed to pull-request August 26, 2026 10:42 — with GitHub Actions Active
@lunelson
lunelson deployed to pull-request August 26, 2026 10:42 — with GitHub Actions Active
@lunelson
lunelson added this pull request to the merge queue Aug 26, 2026
Merged via the queue into main with commit 6e2b92d Aug 26, 2026
213 checks passed
@lunelson
lunelson deleted the ln/fe-1495-typescript-contracts branch August 26, 2026 11:27
@github-actions

Copy link
Copy Markdown
Contributor

Benchmark results

@rust/hash-graph-benches – Integrations

policy_resolution_large

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2002 $$29.0 \mathrm{ms} \pm 269 \mathrm{μs}\left({\color{gray}4.68 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$3.60 \mathrm{ms} \pm 23.2 \mathrm{μs}\left({\color{gray}-0.199 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 1002 $$14.0 \mathrm{ms} \pm 117 \mathrm{μs}\left({\color{red}10.5 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 3314 $$45.8 \mathrm{ms} \pm 378 \mathrm{μs}\left({\color{gray}2.20 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$15.7 \mathrm{ms} \pm 209 \mathrm{μs}\left({\color{gray}3.89 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 1527 $$26.2 \mathrm{ms} \pm 338 \mathrm{μs}\left({\color{gray}1.75 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 2078 $$29.9 \mathrm{ms} \pm 244 \mathrm{μs}\left({\color{red}5.21 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.89 \mathrm{ms} \pm 26.9 \mathrm{μs}\left({\color{gray}0.154 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 1033 $$15.3 \mathrm{ms} \pm 118 \mathrm{μs}\left({\color{red}13.5 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_medium

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 102 $$3.98 \mathrm{ms} \pm 29.9 \mathrm{μs}\left({\color{gray}2.21 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$3.11 \mathrm{ms} \pm 24.0 \mathrm{μs}\left({\color{gray}1.90 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 52 $$3.48 \mathrm{ms} \pm 25.0 \mathrm{μs}\left({\color{gray}0.338 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 269 $$5.39 \mathrm{ms} \pm 46.1 \mathrm{μs}\left({\color{gray}2.12 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$3.61 \mathrm{ms} \pm 30.7 \mathrm{μs}\left({\color{gray}-0.245 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 108 $$4.21 \mathrm{ms} \pm 33.8 \mathrm{μs}\left({\color{gray}-0.490 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 133 $$4.60 \mathrm{ms} \pm 32.4 \mathrm{μs}\left({\color{gray}2.79 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.59 \mathrm{ms} \pm 25.8 \mathrm{μs}\left({\color{gray}2.73 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 63 $$4.30 \mathrm{ms} \pm 40.4 \mathrm{μs}\left({\color{gray}4.59 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_none

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2 $$2.73 \mathrm{ms} \pm 30.6 \mathrm{μs}\left({\color{gray}0.817 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.56 \mathrm{ms} \pm 21.9 \mathrm{μs}\left({\color{gray}-0.433 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 2 $$2.68 \mathrm{ms} \pm 18.6 \mathrm{μs}\left({\color{gray}-1.337 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 8 $$3.01 \mathrm{ms} \pm 28.2 \mathrm{μs}\left({\color{gray}1.41 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.77 \mathrm{ms} \pm 23.2 \mathrm{μs}\left({\color{gray}0.148 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 3 $$2.95 \mathrm{ms} \pm 19.2 \mathrm{μs}\left({\color{gray}-2.757 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_small

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 52 $$3.19 \mathrm{ms} \pm 21.1 \mathrm{μs}\left({\color{gray}3.18 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.88 \mathrm{ms} \pm 21.0 \mathrm{μs}\left({\color{gray}3.53 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 26 $$3.18 \mathrm{ms} \pm 31.0 \mathrm{μs}\left({\color{red}5.07 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 94 $$3.58 \mathrm{ms} \pm 26.4 \mathrm{μs}\left({\color{gray}2.86 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$3.16 \mathrm{ms} \pm 24.4 \mathrm{μs}\left({\color{gray}4.45 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 27 $$3.47 \mathrm{ms} \pm 26.1 \mathrm{μs}\left({\color{gray}3.83 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 66 $$3.54 \mathrm{ms} \pm 23.5 \mathrm{μs}\left({\color{gray}3.11 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.12 \mathrm{ms} \pm 28.2 \mathrm{μs}\left({\color{gray}3.28 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 29 $$3.48 \mathrm{ms} \pm 24.1 \mathrm{μs}\left({\color{gray}2.76 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_complete

Function Value Mean Flame graphs
entity_by_id;one_depth 1 entities $$44.2 \mathrm{ms} \pm 348 \mathrm{μs}\left({\color{gray}0.292 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 10 entities $$34.9 \mathrm{ms} \pm 254 \mathrm{μs}\left({\color{gray}2.47 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 25 entities $$37.4 \mathrm{ms} \pm 303 \mathrm{μs}\left({\color{gray}0.802 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 5 entities $$34.1 \mathrm{ms} \pm 246 \mathrm{μs}\left({\color{gray}4.34 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 50 entities $$45.1 \mathrm{ms} \pm 270 \mathrm{μs}\left({\color{red}6.92 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 1 entities $$51.9 \mathrm{ms} \pm 351 \mathrm{μs}\left({\color{gray}2.96 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 10 entities $$42.5 \mathrm{ms} \pm 307 \mathrm{μs}\left({\color{gray}4.15 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 25 entities $$91.6 \mathrm{ms} \pm 689 \mathrm{μs}\left({\color{gray}-0.693 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 5 entities $$36.2 \mathrm{ms} \pm 334 \mathrm{μs}\left({\color{red}5.09 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 50 entities $$257 \mathrm{ms} \pm 1.25 \mathrm{ms}\left({\color{gray}0.044 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 1 entities $$11.2 \mathrm{ms} \pm 87.8 \mathrm{μs}\left({\color{gray}0.828 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 10 entities $$11.3 \mathrm{ms} \pm 68.2 \mathrm{μs}\left({\color{gray}0.084 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 25 entities $$11.3 \mathrm{ms} \pm 77.0 \mathrm{μs}\left({\color{gray}-0.697 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 5 entities $$11.2 \mathrm{ms} \pm 79.0 \mathrm{μs}\left({\color{gray}-0.295 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 50 entities $$11.2 \mathrm{ms} \pm 66.2 \mathrm{μs}\left({\color{gray}-0.720 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_linkless

Function Value Mean Flame graphs
entity_by_id 1 entities $$11.1 \mathrm{ms} \pm 69.8 \mathrm{μs}\left({\color{gray}-0.898 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10 entities $$11.2 \mathrm{ms} \pm 72.3 \mathrm{μs}\left({\color{gray}-3.253 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 100 entities $$11.1 \mathrm{ms} \pm 68.1 \mathrm{μs}\left({\color{gray}-1.995 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 1000 entities $$11.3 \mathrm{ms} \pm 69.1 \mathrm{μs}\left({\color{gray}0.339 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10000 entities $$11.6 \mathrm{ms} \pm 91.4 \mathrm{μs}\left({\color{gray}-0.533 \mathrm{\%}}\right) $$ Flame Graph

representative_read_entity

Function Value Mean Flame graphs
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/block/v/1 $$11.6 \mathrm{ms} \pm 80.3 \mathrm{μs}\left({\color{gray}-0.438 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/book/v/1 $$11.9 \mathrm{ms} \pm 76.3 \mathrm{μs}\left({\color{gray}1.19 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/building/v/1 $$11.5 \mathrm{ms} \pm 54.0 \mathrm{μs}\left({\color{gray}-2.658 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/organization/v/1 $$11.7 \mathrm{ms} \pm 73.3 \mathrm{μs}\left({\color{gray}-0.975 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/page/v/2 $$11.7 \mathrm{ms} \pm 84.1 \mathrm{μs}\left({\color{gray}-0.340 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/person/v/1 $$11.6 \mathrm{ms} \pm 62.0 \mathrm{μs}\left({\color{gray}-1.522 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/playlist/v/1 $$11.6 \mathrm{ms} \pm 69.5 \mathrm{μs}\left({\color{gray}-0.630 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/song/v/1 $$11.6 \mathrm{ms} \pm 78.9 \mathrm{μs}\left({\color{gray}0.210 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/uk-address/v/1 $$11.7 \mathrm{ms} \pm 79.2 \mathrm{μs}\left({\color{gray}-0.179 \mathrm{\%}}\right) $$ Flame Graph

representative_read_entity_type

Function Value Mean Flame graphs
get_entity_type_by_id Account ID: bf5a9ef5-dc3b-43cf-a291-6210c0321eba $$8.68 \mathrm{ms} \pm 56.4 \mathrm{μs}\left({\color{gray}-0.419 \mathrm{\%}}\right) $$ Flame Graph

representative_read_multiple_entities

Function Value Mean Flame graphs
entity_by_property traversal_paths=0 0 $$59.7 \mathrm{ms} \pm 538 \mathrm{μs}\left({\color{red}5.79 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=255 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true $$113 \mathrm{ms} \pm 762 \mathrm{μs}\left({\color{gray}1.91 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$68.1 \mathrm{ms} \pm 564 \mathrm{μs}\left({\color{red}5.08 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true $$77.8 \mathrm{ms} \pm 526 \mathrm{μs}\left({\color{gray}3.60 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true $$86.2 \mathrm{ms} \pm 546 \mathrm{μs}\left({\color{gray}0.840 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true $$91.3 \mathrm{ms} \pm 489 \mathrm{μs}\left({\color{gray}2.60 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=0 0 $$43.7 \mathrm{ms} \pm 284 \mathrm{μs}\left({\color{gray}1.25 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=255 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true $$72.9 \mathrm{ms} \pm 604 \mathrm{μs}\left({\color{gray}1.16 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$49.9 \mathrm{ms} \pm 366 \mathrm{μs}\left({\color{gray}0.694 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true $$59.4 \mathrm{ms} \pm 429 \mathrm{μs}\left({\color{gray}0.655 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true $$61.6 \mathrm{ms} \pm 517 \mathrm{μs}\left({\color{gray}0.059 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true $$61.6 \mathrm{ms} \pm 411 \mathrm{μs}\left({\color{gray}1.28 \mathrm{\%}}\right) $$

scenarios

Function Value Mean Flame graphs
full_test query-limited $$123 \mathrm{ms} \pm 661 \mathrm{μs}\left({\color{gray}-2.932 \mathrm{\%}}\right) $$ Flame Graph
full_test query-unlimited $$135 \mathrm{ms} \pm 727 \mathrm{μs}\left({\color{gray}-2.589 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-limited $$20.1 \mathrm{ms} \pm 154 \mathrm{μs}\left({\color{gray}4.49 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-unlimited $$557 \mathrm{ms} \pm 1.79 \mathrm{ms}\left({\color{red}5.63 \mathrm{\%}}\right) $$ Flame Graph

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/apps area/deps Relates to third-party dependencies (area) area/infra Relates to version control, CI, CD or IaC (area) area/libs Relates to first-party libraries/crates/packages (area) area/tests New or updated tests type/eng > frontend Owned by the @frontend team

Development

Successfully merging this pull request may close these issues.

2 participants