Skip to content

SRE-1172: Link a cached prebuilt AWS-LC in CI instead of compiling it every run - #10010

Merged
indietyp merged 15 commits into
mainfrom
claude/sre-1172-prebuilt-aws-lc-in-ci
Oct 13, 2026
Merged

indietyp merged 15 commits into
mainfrom
claude/sre-1172-prebuilt-aws-lc-in-ci

Conversation

@claude

@claude claude Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Requested via Slack thread

🌟 Purpose

Every CI job that compiles Rust rebuilds AWS-LC from C in the aws-lc-sys build script. sccache already serves those 391 C and assembly objects, but each hit is a fetch from R2 (about 0.17s) plus a local preprocessor run. sccache's direct mode, which skips that run, only works with a local disk cache. The build script also gets one jobserver token while the rest of the graph is compiling, so the fetches run almost one at a time. In the hash-graph compile that is about 100 of 290 seconds (#10005), and rustls, reqwest, tonic and everything above them wait for it.

This PR builds AWS-LC once per aws-lc-sys version, runner image and architecture, and profile, stores the install in the Actions cache, and has aws-lc-sys link it instead of compiling AWS-LC.

🔍 Changes

  • install-tools runs the new install-aws-lc action in every job that installs Rust. The action restores the AWS-LC install from the Actions cache, building it on a miss. It then sets AWS_LC_SYS_SYSTEM_DIR_<host> and AWS_LC_SYS_STATIC_<host>=1, which put aws-lc-sys 0.45.0 on its system-library path.
  • On a miss, build-prefix.sh takes the aws-lc-sys source cargo fetched and checksummed for cargo metadata, builds the AWS-LC it bundles with AWS-LC's own CMake build, and installs the static library, headers and the Rust bindings that build generates with GENERATE_RUST_BINDINGS. The build is static and crypto-only, needs no Go or Perl because the crate ships pregenerated assembly, and keeps the crate's aws_lc_0_45_0 symbol prefix. bindgen-cli is a CI mise tool.
  • There is one install per profile. Jobs default to dev, and the bench and CodSpeed jobs, which build with the optimized bench profile, pass aws_lc_profile: release and link a Release build.
  • The cache key is the aws-lc-sys version from cargo pkgid, the runner image (ImageOS) and architecture, the profile, and a hash of the action's files and the CI mise config and lockfile, which pin bindgen-cli. cargo pkgid reads Cargo.lock without downloading anything. There are no restore keys, so any change builds a new install.
  • The variables name the host target, so a cross-compile builds AWS-LC from source as before.
  • A checkout without the action, such as the base branch the integration bench compares against, skips it and compiles AWS-LC from source, since that revision's mise tools lack bindgen-cli.
  • turbo.json passes AWS_LC_SYS_* through, so tasks in strict environment mode see the variables.

hash-graph compile in CI, cargo build --bin hash-graph --all-features on ubuntu-24.04, measured with a temporary workflow that this PR has since removed:

aws-lc-sys build script Whole compile
Compiling AWS-LC (#10005, and a run on this PR) 98s, 97s 290s, 293s
Linking the cached AWS-LC 0.0s 239s

Locally, built against the install, the hash-graph-authentication (135) and hash-secret (48) unit tests pass, and hash-graph links. A rustls TLS 1.3 handshake plus AES-GCM, Ed25519, X25519 and HKDF checks give the same results against the dev and release installs as against a source build. The symbols the bindings name are all defined in the installed library, apart from the FIPS-only BORINGSSL_integrity_test.

⚠️ Known issues

  • Docker image builds compile inside the image, without install-tools or access to the Actions cache, so they still build AWS-LC from source.

🤖 Generated with Claude Code

https://claude.ai/code/session_01MY9Fuaaeq21mwQc4hdjxYM

`install-tools` now restores an AWS-LC install prefix from the Actions cache, building it from
the workspace's `aws-lc-sys` on a miss, and points `aws-lc-sys` at it through
`AWS_LC_SYS_SYSTEM_DIR_<host>` and `AWS_LC_SYS_STATIC_<host>`. The prefix holds the library,
headers and bindings of an ordinary `dev` source build, so the linked result matches compiling it.
Bench and CodSpeed jobs build with optimized profiles and keep compiling AWS-LC.
@github-actions github-actions Bot added the area/infra Relates to version control, CI, CD or IaC (area) label Oct 12, 2026
@claude
claude Bot deployed to pull-request October 12, 2026 18:36 Active
@claude
claude Bot deployed to pull-request October 12, 2026 18:36 Active
Comment thread .github/actions/install-aws-lc/action.yml Outdated
Comment thread .github/actions/install-aws-lc/action.yml
Comment thread .github/actions/install-aws-lc/action.yml Fixed
Comment thread .github/actions/install-aws-lc/action.yml Fixed
@codecov

codecov Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 67.96%. Comparing base (9d99b72) to head (14a0490).
⚠️ Report is 14 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #10010      +/-   ##
==========================================
- Coverage   67.97%   67.96%   -0.02%     
==========================================
  Files        1945     1946       +1     
  Lines      201707   201826     +119     
  Branches     8288     8314      +26     
==========================================
+ Hits       137107   137163      +56     
- Misses      62981    63039      +58     
- Partials     1619     1624       +5     
Flag Coverage Δ
apps.hash-ai-worker-ts 2.04% <ø> (-0.01%) ⬇️
apps.hash-api 15.33% <ø> (+<0.01%) ⬆️
blockprotocol.type-system 41.37% <ø> (ø)
durable-kernel 86.65% <ø> (-0.03%) ⬇️
error-stack 90.55% <ø> (ø)
harpc-codec 84.61% <ø> (ø)
harpc-net 96.26% <ø> (-0.02%) ⬇️
harpc-tower 67.11% <ø> (ø)
harpc-types 0.00% <ø> (ø)
harpc-wire-protocol 93.85% <ø> (ø)
hash-codec 72.09% <ø> (ø)
hash-config 83.57% <ø> (ø)
hash-graph 21.28% <ø> (ø)
hash-graph-api 37.15% <ø> (-0.17%) ⬇️
hash-graph-atlas 79.99% <ø> (+<0.01%) ⬆️
hash-graph-authentication 97.52% <ø> (ø)
hash-graph-authorization 68.47% <ø> (ø)
hash-graph-embeddings 91.92% <ø> (ø)
hash-graph-postgres-store 31.94% <ø> (-0.03%) ⬇️
hash-graph-store 50.95% <ø> (-0.12%) ⬇️
hash-graph-temporal-versioning 50.53% <ø> (ø)
hash-graph-types 0.00% <ø> (ø)
hash-graph-validation 85.37% <ø> (ø)
hash-integrations-definition 89.38% <ø> (ø)
hash-middleware 89.63% <ø> (ø)
hash-secret 99.50% <ø> (ø)
hashql-ast 90.01% <ø> (ø)
hashql-compiletest 28.71% <ø> (ø)
hashql-core 81.41% <ø> (ø)
hashql-diagnostics 72.85% <ø> (ø)
hashql-eval 81.10% <ø> (ø)
hashql-hir 89.10% <ø> (ø)
hashql-mir 87.22% <ø> (ø)
hashql-syntax-jexpr 94.77% <ø> (ø)
local.claude-hooks 0.00% <ø> (ø)
local.harpc-client 51.49% <ø> (ø)
local.hash-backend-utils 6.01% <ø> (+2.73%) ⬆️
local.hash-graph-sdk 9.79% <ø> (ø)
local.hash-isomorphic-utils 12.05% <ø> (-0.18%) ⬇️
problematic 90.09% <ø> (ø)
railroad-plugin 45.28% <ø> (ø)

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.

@codspeed

codspeed Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

Merging this PR will not alter performance

⚠️ 6 benchmarks measured no execution time

Nothing ran under measurement, usually because the compiler removed the code under test. These results are not comparable, so they count as unchanged.

Preventing compiler optimizations

✅ 98 untouched benchmarks


Comparing claude/sre-1172-prebuilt-aws-lc-in-ci (14a0490) with main (7acbf0b)

Open in CodSpeed

…the environment

Every job that installs Rust now links a prebuilt AWS-LC. Jobs building with an optimized profile
select a `release` prefix instead of compiling AWS-LC, and each profile has its own cache entry.
The composite action reads expressions through `env` rather than interpolating them into scripts.
@claude
claude Bot deployed to pull-request October 12, 2026 18:50 Active
@claude
claude Bot deployed to pull-request October 12, 2026 18:50 Active
@vercel

vercel Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated
hash Ready Ready Preview Oct 13, 2026 8:55am UTC
hashdotdesign-tokens Ready Ready Preview Oct 13, 2026 8:55am UTC
petrinaut Ready Ready Preview Oct 13, 2026 8:55am UTC
petrinaut-docs Ready Ready Preview Oct 13, 2026 8:55am UTC

Request Review

`build-prefix.sh` now downloads the locked `aws-lc-sys` crate, checks it against the Cargo.lock
checksum, and builds and installs its bundled AWS-LC with CMake and the Rust bindings that build
generates, keeping the crate's symbol prefix. The cache key moves to `cache-key.py`, which reads
Cargo.lock with `tomllib`.
The CI mise environment pins `bindgen-cli`, and the cache key includes the version on `PATH`.
`build-prefix.sh` reports its build time as a notice, which marks the jobs that missed the cache.
`bindgen-cli` moves from the `ci` mise environment to an `aws-lc` environment that
`build-prefix.sh` installs on a cache miss, so other jobs no longer install it. The cache key
covers the pinned version through the environment's config and lockfile, and a failing compiler
version probe names the command. The temporary compile timings workflow is removed.
indietyp
indietyp previously approved these changes Oct 13, 2026
@indietyp
indietyp requested review from TimDiekmann and a balanced review from Copilot October 13, 2026 07:24

Copilot AI 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.

🟢 Approval recommended

The cache keying, profile wiring, native build configuration, and environment propagation are internally consistent.

0 open findings

What changed in this PR

Adds cached, prebuilt AWS-LC artifacts to reduce Rust compilation time in CI.

Changes:

  • Adds an action to build, cache, restore, and link AWS-LC.
  • Configures benchmark jobs to use release artifacts.
  • Installs pinned bindgen-cli and forwards AWS-LC environment variables through Turbo.
File Description
turbo.json Passes AWS-LC variables to Turbo tasks.
.github/​workflows/​codspeed.yml Selects release AWS-LC for CodSpeed.
.github/​workflows/​bench.yml Selects release AWS-LC for benchmarks.
.github/​actions/​install-tools/​action.yml Integrates AWS-LC installation into Rust setup.
.github/​actions/​install-aws-lc/​build-prefix.sh Builds and installs prefixed AWS-LC artifacts.
.github/​actions/​install-aws-lc/​action.yml Implements cache restoration, creation, and environment setup.
.config/​mise/​mise.ci.lock Locks the new bindgen tool version.
.config/​mise/​config.ci.toml Adds bindgen-cli to CI tooling.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@TimDiekmann TimDiekmann left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Review written by Claude on behalf of Tim.

Much smaller now, thanks. One thing on the cache key inline, the rest are nits:

  • install-tools/action.yml:21: the aws_lc_profile description is hard to parse. I'd reuse the wording of profile in install-aws-lc.
  • The PR body says "once per aws-lc-sys version, profile and toolchain", but the key has no toolchain in it (and doesn't need one).
  • build-prefix.sh:21: dirname "$(…)" swallows a failing cargo metadata, so the error then surfaces as cmake not finding ./aws-lc.
  • action.yml:22: bench installs base and head into the same $RUNNER_TEMP/aws-lc-release, so a miss on head installs on top of the base prefix. An rm -rf "$prefix" before configuring keeps the cached tree clean.

Comment thread .github/actions/install-aws-lc/action.yml Outdated
The key uses `ImageOS` instead of `RUNNER_OS`, so jobs on `ubuntu-latest` stop sharing an
install with `ubuntu-24.04` jobs once the label moves to a newer image. `build-prefix.sh` fails
with its own error when `cargo metadata` fails, removes a previous install before building, and
names the image in its notice. The `aws_lc_profile` description reuses the `profile` wording.
@claude
claude Bot deployed to pull-request October 13, 2026 08:40 Active
@claude
claude Bot deployed to pull-request October 13, 2026 08:40 Active
Comment thread .github/actions/install-aws-lc/action.yml
@claude

claude Bot commented Oct 13, 2026

Copy link
Copy Markdown
Contributor Author

@TimDiekmann the four nits from your review are in 14a0490:

  • aws_lc_profile now reuses the profile wording from install-aws-lc.
  • The PR body says once per aws-lc-sys version, runner image and architecture, and profile, matching the key.
  • build-prefix.sh runs cargo metadata on its own line and fails with ::error::\cargo metadata --locked` failed(or "lists no aws-lc-sys package"), instead of leaving cmake to complain about./aws-lc`.
  • build-prefix.sh removes the prefix before building, so a head miss in the bench no longer installs over the base install.

🤖 Generated with Claude Code

@indietyp
indietyp enabled auto-merge October 13, 2026 09:36
@github-actions

Copy link
Copy Markdown
Contributor

Benchmark results

hash-graph-benches – Integrations

policy_resolution_large

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2002 $$20.0 \mathrm{ms} \pm 156 \mathrm{μs}\left({\color{gray}-2.164 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.66 \mathrm{ms} \pm 15.3 \mathrm{μs}\left({\color{gray}1.43 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 1002 $$9.75 \mathrm{ms} \pm 91.3 \mathrm{μs}\left({\color{lightgreen}-5.670 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 3314 $$34.0 \mathrm{ms} \pm 291 \mathrm{μs}\left({\color{gray}-2.859 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$11.8 \mathrm{ms} \pm 102 \mathrm{μs}\left({\color{gray}-0.096 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 1527 $$20.6 \mathrm{ms} \pm 177 \mathrm{μs}\left({\color{gray}0.867 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 2078 $$21.2 \mathrm{ms} \pm 160 \mathrm{μs}\left({\color{gray}0.006 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.89 \mathrm{ms} \pm 18.6 \mathrm{μs}\left({\color{gray}-0.797 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 1033 $$11.9 \mathrm{ms} \pm 122 \mathrm{μs}\left({\color{gray}2.66 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_medium

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 102 $$2.93 \mathrm{ms} \pm 18.8 \mathrm{μs}\left({\color{gray}0.624 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.41 \mathrm{ms} \pm 15.1 \mathrm{μs}\left({\color{gray}3.67 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 52 $$2.68 \mathrm{ms} \pm 18.1 \mathrm{μs}\left({\color{gray}1.97 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 269 $$4.18 \mathrm{ms} \pm 29.1 \mathrm{μs}\left({\color{gray}2.65 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$2.88 \mathrm{ms} \pm 20.5 \mathrm{μs}\left({\color{gray}2.91 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 108 $$3.36 \mathrm{ms} \pm 24.7 \mathrm{μs}\left({\color{gray}3.06 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 133 $$3.51 \mathrm{ms} \pm 33.5 \mathrm{μs}\left({\color{gray}2.12 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.75 \mathrm{ms} \pm 16.8 \mathrm{μs}\left({\color{gray}2.30 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 63 $$3.23 \mathrm{ms} \pm 22.2 \mathrm{μs}\left({\color{gray}1.95 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_none

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2 $$2.18 \mathrm{ms} \pm 12.9 \mathrm{μs}\left({\color{gray}0.763 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.15 \mathrm{ms} \pm 13.0 \mathrm{μs}\left({\color{gray}2.21 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 2 $$2.25 \mathrm{ms} \pm 16.5 \mathrm{μs}\left({\color{gray}2.50 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 8 $$2.45 \mathrm{ms} \pm 18.4 \mathrm{μs}\left({\color{gray}2.34 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.30 \mathrm{ms} \pm 14.6 \mathrm{μs}\left({\color{gray}3.10 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 3 $$2.53 \mathrm{ms} \pm 15.1 \mathrm{μs}\left({\color{gray}1.59 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_small

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 52 $$2.43 \mathrm{ms} \pm 15.1 \mathrm{μs}\left({\color{gray}0.873 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.22 \mathrm{ms} \pm 12.5 \mathrm{μs}\left({\color{gray}2.24 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 26 $$2.37 \mathrm{ms} \pm 17.2 \mathrm{μs}\left({\color{gray}0.633 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 94 $$2.80 \mathrm{ms} \pm 19.7 \mathrm{μs}\left({\color{gray}1.96 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$2.45 \mathrm{ms} \pm 17.3 \mathrm{μs}\left({\color{gray}-0.296 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 27 $$2.67 \mathrm{ms} \pm 21.6 \mathrm{μs}\left({\color{gray}2.00 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 66 $$2.71 \mathrm{ms} \pm 17.5 \mathrm{μs}\left({\color{gray}0.950 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.48 \mathrm{ms} \pm 17.8 \mathrm{μs}\left({\color{gray}2.46 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 29 $$2.68 \mathrm{ms} \pm 23.3 \mathrm{μs}\left({\color{gray}2.36 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_complete

Function Value Mean Flame graphs
entity_by_id;one_depth 1 entities $$25.7 \mathrm{ms} \pm 178 \mathrm{μs}\left({\color{gray}1.78 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 10 entities $$54.8 \mathrm{ms} \pm 397 \mathrm{μs}\left({\color{gray}0.569 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 25 entities $$28.0 \mathrm{ms} \pm 203 \mathrm{μs}\left({\color{gray}-0.148 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 5 entities $$30.0 \mathrm{ms} \pm 217 \mathrm{μs}\left({\color{gray}0.213 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 50 entities $$33.0 \mathrm{ms} \pm 175 \mathrm{μs}\left({\color{gray}0.573 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 1 entities $$27.1 \mathrm{ms} \pm 214 \mathrm{μs}\left({\color{red}5.64 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 10 entities $$322 \mathrm{ms} \pm 1.24 \mathrm{ms}\left({\color{gray}0.431 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 25 entities $$70.9 \mathrm{ms} \pm 486 \mathrm{μs}\left({\color{gray}1.10 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 5 entities $$57.2 \mathrm{ms} \pm 366 \mathrm{μs}\left({\color{gray}3.98 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 50 entities $$218 \mathrm{ms} \pm 1.21 \mathrm{ms}\left({\color{gray}2.54 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 1 entities $$8.49 \mathrm{ms} \pm 79.9 \mathrm{μs}\left({\color{red}5.97 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 10 entities $$8.68 \mathrm{ms} \pm 87.7 \mathrm{μs}\left({\color{gray}2.66 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 25 entities $$9.16 \mathrm{ms} \pm 76.4 \mathrm{μs}\left({\color{red}8.00 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 5 entities $$8.41 \mathrm{ms} \pm 56.1 \mathrm{μs}\left({\color{gray}2.77 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 50 entities $$8.90 \mathrm{ms} \pm 155 \mathrm{μs}\left({\color{red}5.94 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_linkless

Function Value Mean Flame graphs
entity_by_id 1 entities $$8.45 \mathrm{ms} \pm 79.1 \mathrm{μs}\left({\color{gray}4.78 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10 entities $$9.06 \mathrm{ms} \pm 78.2 \mathrm{μs}\left({\color{red}6.39 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 100 entities $$8.85 \mathrm{ms} \pm 75.3 \mathrm{μs}\left({\color{red}9.48 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 1000 entities $$8.89 \mathrm{ms} \pm 74.2 \mathrm{μs}\left({\color{red}7.24 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10000 entities $$9.16 \mathrm{ms} \pm 61.4 \mathrm{μs}\left({\color{red}8.74 \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 $$8.76 \mathrm{ms} \pm 72.1 \mathrm{μs}\left({\color{gray}4.10 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/book/v/1 $$9.56 \mathrm{ms} \pm 87.9 \mathrm{μs}\left({\color{red}15.0 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/building/v/1 $$8.88 \mathrm{ms} \pm 61.2 \mathrm{μs}\left({\color{red}6.94 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/organization/v/1 $$8.86 \mathrm{ms} \pm 63.7 \mathrm{μs}\left({\color{red}6.43 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/page/v/2 $$8.73 \mathrm{ms} \pm 73.3 \mathrm{μs}\left({\color{gray}3.75 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/person/v/1 $$8.87 \mathrm{ms} \pm 77.8 \mathrm{μs}\left({\color{red}6.71 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/playlist/v/1 $$9.21 \mathrm{ms} \pm 77.3 \mathrm{μs}\left({\color{red}10.3 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/song/v/1 $$8.79 \mathrm{ms} \pm 54.7 \mathrm{μs}\left({\color{gray}4.81 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/uk-address/v/1 $$8.81 \mathrm{ms} \pm 56.7 \mathrm{μs}\left({\color{red}5.44 \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 $$6.42 \mathrm{ms} \pm 47.7 \mathrm{μs}\left({\color{red}5.61 \mathrm{\%}}\right) $$ Flame Graph

representative_read_multiple_entities

Function Value Mean Flame graphs
entity_by_property traversal_paths=0 0 $$48.3 \mathrm{ms} \pm 372 \mathrm{μs}\left({\color{red}7.75 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=255 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true $$89.2 \mathrm{ms} \pm 595 \mathrm{μs}\left({\color{gray}0.369 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$52.6 \mathrm{ms} \pm 516 \mathrm{μs}\left({\color{gray}2.23 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true $$60.3 \mathrm{ms} \pm 510 \mathrm{μs}\left({\color{gray}-0.381 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true $$65.9 \mathrm{ms} \pm 482 \mathrm{μs}\left({\color{gray}-1.439 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true $$72.9 \mathrm{ms} \pm 606 \mathrm{μs}\left({\color{gray}0.230 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=0 0 $$38.3 \mathrm{ms} \pm 257 \mathrm{μs}\left({\color{gray}1.63 \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 $$61.2 \mathrm{ms} \pm 425 \mathrm{μs}\left({\color{red}5.71 \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 $$43.5 \mathrm{ms} \pm 330 \mathrm{μs}\left({\color{gray}1.57 \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 $$50.5 \mathrm{ms} \pm 412 \mathrm{μs}\left({\color{gray}0.609 \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 $$52.2 \mathrm{ms} \pm 338 \mathrm{μs}\left({\color{gray}1.88 \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 $$52.6 \mathrm{ms} \pm 422 \mathrm{μs}\left({\color{gray}2.31 \mathrm{\%}}\right) $$

scenarios

Function Value Mean Flame graphs
full_test query-limited $$93.7 \mathrm{ms} \pm 409 \mathrm{μs}\left({\color{gray}1.26 \mathrm{\%}}\right) $$ Flame Graph
full_test query-unlimited $$103 \mathrm{ms} \pm 442 \mathrm{μs}\left({\color{gray}0.863 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-limited $$17.9 \mathrm{ms} \pm 140 \mathrm{μs}\left({\color{gray}-1.177 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-unlimited $$428 \mathrm{ms} \pm 828 \mathrm{μs}\left({\color{red}5.51 \mathrm{\%}}\right) $$ Flame Graph

@claude
claude Bot requested review from TimDiekmann and indietyp and removed request for TimDiekmann and indietyp October 13, 2026 09:58
@indietyp
indietyp added this pull request to the merge queue Oct 13, 2026
Merged via the queue into main with commit 136b588 Oct 13, 2026
237 checks passed
@indietyp
indietyp deleted the claude/sre-1172-prebuilt-aws-lc-in-ci branch October 13, 2026 12:02

This branch was successfully deployed

5 active deployments
Preview – hash — 14a04900 Deployed Oct 13, 2026 by vercel[bot]
Preview – petrinaut-docs — 14a04900 Deployed Oct 13, 2026 by vercel[bot]
Preview – petrinaut — 14a04900 Deployed Oct 13, 2026 by vercel[bot]
Preview – hashdotdesign-tokens — 14a04900 Deployed Oct 13, 2026 by vercel[bot]
pull-request — 14a04900 Deployed Oct 13, 2026 by claude[bot] via Sourcemaps (@apps/hash-ai-worker-ts) #39545
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/infra Relates to version control, CI, CD or IaC (area)

Development

Successfully merging this pull request may close these issues.

5 participants