Skip to content

SRE-988: Use affectedTasks instead of affectedPackages in Turborepo - #9455

Merged
TimDiekmann merged 6 commits into
t/sre-986-dissolve-the-graph-type-defs-crate-into-the-graph-apifrom
t/sre-988-use-affectedtasks-instead-of-affectedpackages-in-turborepo
Aug 31, 2026
Merged

SRE-988: Use affectedTasks instead of affectedPackages in Turborepo#9455
TimDiekmann merged 6 commits into
t/sre-986-dissolve-the-graph-type-defs-crate-into-the-graph-apifrom
t/sre-988-use-affectedtasks-instead-of-affectedpackages-in-turborepo

Conversation

@TimDiekmann

Copy link
Copy Markdown
Member

🌟 What is the purpose of this PR?

CI selects work from turbo's package graph (affectedPackages), which is built from manifests — so a TypeScript package that only consumes a crate's generated types had to declare that crate as an npm dependency just to be selected when the crate changes. Those manifest edges are removed; the relationship is modelled as a task dependency instead, and CI selects with affectedTasks. This unblocks separating the npm and Cargo worlds (SRE-984).

🔗 Related links

🚫 Blocked by

🔍 What does this change?

  • turbo 2.6.3 → 2.10.12 (affectedTasks requires ≥ 2.9)
  • JS → Rust workspace:* dependencies are removed; the TypeScript twins depend on the crate's build:types task and hash its output via inputs with mode: "dependencyOutputs"
  • The codegen crates' build:types/build:wasm gained dependsOn: ["^build"]: affectedness and task hashes only travel along task edges, so without an upstream edge a change in a dependency crate neither re-runs the codegen nor invalidates its cache
  • CI selection is shared in .github/scripts/affected-packages.sh: matrix entries carry one key per affected-and-defined task holding the selection reason, which each job echoes
  • lint.yml gates its steps on those keys; the six per-job turbo run --dry-run existence probes are gone
  • codegen:generate-openapi-specs is renamed to build:openapi

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

📜 Does this require a change to the docs?

The changes in this PR:

  • are internal and do not require a docs change

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

The changes in this PR:

  • affected the execution graph, and the turbo.json's have been updated to reflect this

⚠️ Known issues

  • dependsOn: ["^build"] on the crates' codegen tasks implies real cargo builds once experimentalCargoWorkspaces maps build to Cargo. Acceptable for now: build is a no-op for crates today, and the lines carry TODO(SRE-989) so the chain is replaced before that migration continues.

🐾 Next steps

  • SRE-989: replace the ^build chain with a build-free upstream dependency
  • SRE-984: split the npm and Cargo workspaces

🛡 What tests cover this?

  • The CI workflows on this PR exercise the selection end to end; each matrix job logs why it was selected

❓ How to test this?

  1. Check out the branch and commit a change to a crate (e.g. error-stack)
  2. Run .github/scripts/affected-packages.sh lint:tsc
  3. Confirm downstream TypeScript packages (e.g. @apps/hash-frontend) appear with a TaskDependencyTaskChanged reason

@TimDiekmann TimDiekmann self-assigned this Aug 30, 2026
@vercel

vercel Bot commented Aug 30, 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 30, 2026 12:54pm
hashdotdesign-tokens Ready Ready Preview Aug 30, 2026 12:54pm
petrinaut Ready Ready Preview Aug 30, 2026 12:54pm
petrinaut-docs Ready Ready Preview Aug 30, 2026 12:54pm

Request Review

@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 > backend Owned by the @backend team labels Aug 30, 2026
@TimDiekmann
TimDiekmann deployed to pull-request August 30, 2026 10:51 — with GitHub Actions Active
@codspeed-hq

codspeed-hq Bot commented Aug 30, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 98 untouched benchmarks


Comparing t/sre-988-use-affectedtasks-instead-of-affectedpackages-in-turborepo (6c014b7) with t/sre-986-dissolve-the-graph-type-defs-crate-into-the-graph-api (88ba673)

Open in CodSpeed

@TimDiekmann
TimDiekmann force-pushed the t/sre-988-use-affectedtasks-instead-of-affectedpackages-in-turborepo branch from b466b76 to 6607e4d Compare August 30, 2026 11:09
@TimDiekmann
TimDiekmann deployed to pull-request August 30, 2026 11:10 — with GitHub Actions Active
@vercel
vercel Bot temporarily deployed to Preview – petrinaut August 30, 2026 11:20 Inactive
@vercel
vercel Bot temporarily deployed to Preview – petrinaut-docs August 30, 2026 11:20 Inactive
@TimDiekmann
TimDiekmann deployed to pull-request August 30, 2026 11:21 — with GitHub Actions Active
@TimDiekmann
TimDiekmann deployed to pull-request August 30, 2026 11:21 — with GitHub Actions Active
@TimDiekmann TimDiekmann changed the title SRE-988: Use affectedTasks instead of affectedPackages in Turborepo SRE-988: Use affectedTasks instead of affectedPackages in Turborepo Aug 30, 2026
@github-actions github-actions Bot added area/apps > hash* Affects HASH (a `hash-*` app) area/apps > hash-api Affects the HASH API (app) type/eng > frontend Owned by the @frontend team area/apps area/apps > hash-graph labels Aug 30, 2026
@TimDiekmann
TimDiekmann marked this pull request as ready for review August 30, 2026 12:40
@cursor

cursor Bot commented Aug 30, 2026

Copy link
Copy Markdown

PR Summary

Medium Risk
Changes CI matrices, deploy/lint gating, Docker prune closures, and the monorepo task graph—incorrect affected or prune logic could skip jobs or ship broken images, though behavior is exercised by workflows on the PR.

Overview
CI and tooling now drive package selection from Turbo’s task graph instead of the package manifest graph, so TypeScript packages can react to Rust crate changes without fake workspace:* npm dependencies on @rust/* packages.

Turbo is bumped 2.6.3 → 2.10.12 (required for affectedTasks). New .github/scripts/affected-packages.sh runs turbo query with affectedTasks(base: HEAD^) and emits a GitHub Actions matrix with per-task keys and human-readable selection reasons; lint, test, bench, codspeed, and deploy workflows call it instead of inline affectedPackages queries. Matrix jobs log those reasons via a Show selection reason step, and lint gates each linter on matrix['lint:…'] instead of six turbo run --dry-run probes.

JS↔Rust coupling moves into turbo.json: codegen / build tasks use explicit dependsOn like @rust/hash-codec#build:types plus inputs with dependencyOutputs; corresponding package.json workspace deps on Rust twins are removed. Crate build:types / WASM tasks gain dependsOn: ["^build"] (with SRE-989 TODOs). Root build:types^build:types is dropped; lint:tsc no longer depends on build:types. codegen:generate-openapi-specs is renamed build:openapi.

Pruning follows task edges: prune.py and new prune-scopes.sh union package and task-graph dependencies; fixpoint_expand now pulls direct deps into scopes. App Dockerfiles run turbo prune $(prune-scopes.sh …) so cross-package dependsOn is included in image builds.

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

@github-advanced-security

Copy link
Copy Markdown
Contributor

You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool.

What Enabling Code Scanning Means:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 6c014b7. Configure here.

Comment thread .github/workflows/lint.yml
Comment thread .github/workflows/lint.yml
@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 $$25.8 \mathrm{ms} \pm 181 \mathrm{μs}\left({\color{gray}-1.520 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$3.39 \mathrm{ms} \pm 20.8 \mathrm{μs}\left({\color{gray}-3.991 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 1002 $$12.1 \mathrm{ms} \pm 81.6 \mathrm{μs}\left({\color{gray}-0.822 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 3314 $$42.7 \mathrm{ms} \pm 356 \mathrm{μs}\left({\color{gray}-0.499 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$14.5 \mathrm{ms} \pm 164 \mathrm{μs}\left({\color{lightgreen}-7.107 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 1527 $$23.5 \mathrm{ms} \pm 194 \mathrm{μs}\left({\color{gray}-1.810 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 2078 $$27.7 \mathrm{ms} \pm 216 \mathrm{μs}\left({\color{red}5.19 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.73 \mathrm{ms} \pm 17.9 \mathrm{μs}\left({\color{gray}-2.988 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 1033 $$13.3 \mathrm{ms} \pm 99.9 \mathrm{μs}\left({\color{gray}0.692 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_medium

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 102 $$3.74 \mathrm{ms} \pm 30.4 \mathrm{μs}\left({\color{gray}0.517 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$3.01 \mathrm{ms} \pm 15.1 \mathrm{μs}\left({\color{gray}-0.045 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 52 $$3.39 \mathrm{ms} \pm 24.9 \mathrm{μs}\left({\color{gray}1.16 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 269 $$5.08 \mathrm{ms} \pm 35.3 \mathrm{μs}\left({\color{gray}-1.056 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$3.56 \mathrm{ms} \pm 24.4 \mathrm{μs}\left({\color{gray}-0.568 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 108 $$4.10 \mathrm{ms} \pm 26.8 \mathrm{μs}\left({\color{gray}0.002 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 133 $$4.35 \mathrm{ms} \pm 32.3 \mathrm{μs}\left({\color{gray}0.076 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.49 \mathrm{ms} \pm 27.0 \mathrm{μs}\left({\color{gray}-0.336 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 63 $$4.04 \mathrm{ms} \pm 23.2 \mathrm{μs}\left({\color{gray}-0.943 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_none

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2 $$2.66 \mathrm{ms} \pm 13.3 \mathrm{μs}\left({\color{gray}-1.073 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.51 \mathrm{ms} \pm 12.8 \mathrm{μs}\left({\color{gray}-0.135 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 2 $$2.65 \mathrm{ms} \pm 17.2 \mathrm{μs}\left({\color{gray}-0.672 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 8 $$2.94 \mathrm{ms} \pm 17.6 \mathrm{μs}\left({\color{gray}0.889 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.74 \mathrm{ms} \pm 16.4 \mathrm{μs}\left({\color{gray}0.374 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 3 $$3.01 \mathrm{ms} \pm 28.2 \mathrm{μs}\left({\color{gray}3.38 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_small

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 52 $$3.02 \mathrm{ms} \pm 22.4 \mathrm{μs}\left({\color{gray}-0.763 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.74 \mathrm{ms} \pm 17.7 \mathrm{μs}\left({\color{gray}-0.314 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 26 $$2.93 \mathrm{ms} \pm 16.8 \mathrm{μs}\left({\color{gray}-2.061 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 94 $$3.36 \mathrm{ms} \pm 20.9 \mathrm{μs}\left({\color{gray}-0.997 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$3.01 \mathrm{ms} \pm 19.2 \mathrm{μs}\left({\color{gray}0.798 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 27 $$3.28 \mathrm{ms} \pm 18.7 \mathrm{μs}\left({\color{gray}-0.081 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 66 $$3.33 \mathrm{ms} \pm 22.6 \mathrm{μs}\left({\color{gray}-0.722 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.95 \mathrm{ms} \pm 17.0 \mathrm{μs}\left({\color{gray}0.530 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 29 $$3.29 \mathrm{ms} \pm 20.0 \mathrm{μs}\left({\color{gray}0.105 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_complete

Function Value Mean Flame graphs
entity_by_id;one_depth 1 entities $$41.3 \mathrm{ms} \pm 182 \mathrm{μs}\left({\color{gray}-4.245 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 10 entities $$32.1 \mathrm{ms} \pm 148 \mathrm{μs}\left({\color{gray}-4.077 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 25 entities $$35.1 \mathrm{ms} \pm 189 \mathrm{μs}\left({\color{gray}-0.897 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 5 entities $$31.0 \mathrm{ms} \pm 172 \mathrm{μs}\left({\color{gray}-2.555 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 50 entities $$40.6 \mathrm{ms} \pm 191 \mathrm{μs}\left({\color{gray}-1.892 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 1 entities $$48.7 \mathrm{ms} \pm 240 \mathrm{μs}\left({\color{gray}-0.660 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 10 entities $$39.5 \mathrm{ms} \pm 290 \mathrm{μs}\left({\color{gray}-0.680 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 25 entities $$89.5 \mathrm{ms} \pm 589 \mathrm{μs}\left({\color{gray}-1.972 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 5 entities $$43.9 \mathrm{ms} \pm 3.80 \mathrm{ms}\left({\color{red}32.6 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 50 entities $$251 \mathrm{ms} \pm 944 \mathrm{μs}\left({\color{lightgreen}-15.409 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 1 entities $$10.3 \mathrm{ms} \pm 70.6 \mathrm{μs}\left({\color{gray}-1.259 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 10 entities $$10.3 \mathrm{ms} \pm 54.7 \mathrm{μs}\left({\color{gray}-0.368 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 25 entities $$10.5 \mathrm{ms} \pm 82.5 \mathrm{μs}\left({\color{gray}0.962 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 5 entities $$10.2 \mathrm{ms} \pm 54.6 \mathrm{μs}\left({\color{gray}-1.193 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 50 entities $$10.4 \mathrm{ms} \pm 76.7 \mathrm{μs}\left({\color{gray}0.056 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_linkless

Function Value Mean Flame graphs
entity_by_id 1 entities $$10.3 \mathrm{ms} \pm 70.5 \mathrm{μs}\left({\color{gray}-0.821 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10 entities $$10.3 \mathrm{ms} \pm 66.5 \mathrm{μs}\left({\color{gray}0.980 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 100 entities $$10.3 \mathrm{ms} \pm 61.4 \mathrm{μs}\left({\color{gray}-0.754 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 1000 entities $$10.3 \mathrm{ms} \pm 60.8 \mathrm{μs}\left({\color{gray}0.878 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10000 entities $$10.8 \mathrm{ms} \pm 76.2 \mathrm{μs}\left({\color{gray}0.980 \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 $$10.6 \mathrm{ms} \pm 64.4 \mathrm{μs}\left({\color{gray}0.031 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/book/v/1 $$10.7 \mathrm{ms} \pm 69.8 \mathrm{μs}\left({\color{gray}0.331 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/building/v/1 $$10.5 \mathrm{ms} \pm 53.0 \mathrm{μs}\left({\color{gray}-1.707 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/organization/v/1 $$10.7 \mathrm{ms} \pm 63.7 \mathrm{μs}\left({\color{gray}0.124 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/page/v/2 $$10.6 \mathrm{ms} \pm 70.9 \mathrm{μs}\left({\color{gray}-0.989 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/person/v/1 $$10.9 \mathrm{ms} \pm 83.4 \mathrm{μs}\left({\color{gray}1.17 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/playlist/v/1 $$10.7 \mathrm{ms} \pm 71.6 \mathrm{μs}\left({\color{gray}0.355 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/song/v/1 $$10.7 \mathrm{ms} \pm 60.2 \mathrm{μs}\left({\color{gray}-2.341 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/uk-address/v/1 $$10.7 \mathrm{ms} \pm 61.6 \mathrm{μs}\left({\color{gray}1.39 \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.04 \mathrm{ms} \pm 53.2 \mathrm{μs}\left({\color{gray}2.94 \mathrm{\%}}\right) $$ Flame Graph

representative_read_multiple_entities

Function Value Mean Flame graphs
entity_by_property traversal_paths=0 0 $$55.7 \mathrm{ms} \pm 516 \mathrm{μs}\left({\color{gray}1.61 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=255 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true $$109 \mathrm{ms} \pm 674 \mathrm{μs}\left({\color{gray}2.89 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$63.0 \mathrm{ms} \pm 684 \mathrm{μs}\left({\color{gray}1.07 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true $$72.3 \mathrm{ms} \pm 473 \mathrm{μs}\left({\color{gray}1.42 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true $$80.7 \mathrm{ms} \pm 437 \mathrm{μs}\left({\color{gray}1.06 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true $$87.6 \mathrm{ms} \pm 594 \mathrm{μs}\left({\color{gray}3.50 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=0 0 $$43.3 \mathrm{ms} \pm 259 \mathrm{μs}\left({\color{gray}1.93 \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.5 \mathrm{ms} \pm 604 \mathrm{μs}\left({\color{gray}2.40 \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 $$50.2 \mathrm{ms} \pm 350 \mathrm{μs}\left({\color{gray}3.26 \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 $$58.9 \mathrm{ms} \pm 500 \mathrm{μs}\left({\color{gray}2.41 \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 $$60.1 \mathrm{ms} \pm 284 \mathrm{μs}\left({\color{gray}0.356 \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 $$60.9 \mathrm{ms} \pm 324 \mathrm{μs}\left({\color{gray}0.726 \mathrm{\%}}\right) $$

scenarios

Function Value Mean Flame graphs
full_test query-limited $$127 \mathrm{ms} \pm 539 \mathrm{μs}\left({\color{gray}-3.989 \mathrm{\%}}\right) $$ Flame Graph
full_test query-unlimited $$139 \mathrm{ms} \pm 545 \mathrm{μs}\left({\color{gray}-3.929 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-limited $$17.6 \mathrm{ms} \pm 127 \mathrm{μs}\left({\color{gray}-0.688 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-unlimited $$556 \mathrm{ms} \pm 954 \mathrm{μs}\left({\color{gray}-0.769 \mathrm{\%}}\right) $$ Flame Graph

@lunelson lunelson left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! Makes a lot of sense

Comment thread .github/scripts/affected-packages.sh
@TimDiekmann
TimDiekmann added this pull request to the merge queue Aug 31, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue because a pull request earlier in the stack was removed Aug 31, 2026
@TimDiekmann
TimDiekmann added this pull request to the merge queue Aug 31, 2026
An error occurred while trying to automatically change base from t/sre-986-dissolve-the-graph-type-defs-crate-into-the-graph-api to t/sre-982-remove-the-graph-api-packages-javascript-surface August 31, 2026 10:57
Merged via the queue into main with commit 8ab6f46 Aug 31, 2026
219 checks passed
@TimDiekmann
TimDiekmann deleted the t/sre-988-use-affectedtasks-instead-of-affectedpackages-in-turborepo branch August 31, 2026 11:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/apps > hash* Affects HASH (a `hash-*` app) area/apps > hash-api Affects the HASH API (app) area/apps > hash-graph 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) type/eng > backend Owned by the @backend team type/eng > frontend Owned by the @frontend team

Development

Successfully merging this pull request may close these issues.

4 participants