Skip to content

SRE-1114: Fail the deploy when Brunch cannot use its chat model - #9931

Draft
lunelson wants to merge 3 commits into
mainfrom
ln/sre-1114-catch-a-missing-brunch-model-credential-at-deploy-instead-of
Draft

lunelson wants to merge 3 commits into
mainfrom
ln/sre-1114-catch-a-missing-brunch-model-credential-at-deploy-instead-of

Conversation

@lunelson

@lunelson lunelson commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

🌟 Purpose

Brunch could go live without a usable chat model, and nothing noticed until people tried to chat. When its default model moved to OpenAI, the production service had no OpenAI key. Every chat on demo.petrinaut.org failed with Provider is not configured: openai, while /health passed and the deploy stayed green.

This PR makes such a release fail its deploy instead. Brunch now checks its chat model with the provider before it serves, and the deploy workflow waits for each ECS rollout to finish.

🔍 Changes

  • Startup check. In production, apps/brunch-agent/src/chat-model-configuration.ts resolves the selected model and its key as a chat turn does. It then asks the provider for the model's metadata, a free request that runs no inference. Brunch refuses to start when the model is unknown, the key is missing or rejected, or the provider does not offer the model to that key. The refusal is reported like a missing database configuration: a log line, a failure span, then a telemetry flush.
  • Provider outages only warn. When the provider is unreachable, rate-limited or failing, or forbids the metadata request, Brunch logs a model.configuration warning and starts anyway. An outage therefore cannot keep replacement tasks down. The same warning reports any shutdown date the provider has announced for the model.
  • Deploy wait. .github/actions/redeploy-ecs-service now follows the deployment it starts until ECS reports it complete. The step fails when that deployment fails, is rolled back or replaced, reports no rollout state, or takes longer than 30 minutes, and prints the service's recent ECS events. A failed step fails the deploy job and its existing Slack notice. This applies to every ECS service the workflow deploys, not only Brunch.
  • Container smoke. test:docker runs on an internal Docker network. It asserts that the image starts with a warning when the provider is unreachable, and refuses to start without a key.
  • Tested with the brunch-agent unit suite, build:docker plus test:docker, the built server against the real OpenAI and Anthropic APIs with rejected keys, and the deploy script against a stubbed aws CLI covering completion, failure, rollback, replacement, missing rollout state and timeout.

⚠️ Known issues

  • The metadata request cannot prove that a key may generate replies. A restricted OpenAI key can allow model reads but withhold Responses access, and then Brunch starts while every chat fails. Only a real chat turn after deploy, or an alert on failed chats, would catch that.
  • The check runs only when a task starts. A key that is revoked or runs out of quota later still fails chats while /health passes.
  • test:docker still runs only by hand, so CI does not enforce its assertions.
  • What users see when a release refuses to start depends on the service's ECS settings. If ECS keeps the old task until the new one is healthy, nobody notices. If it stops the old task first, Brunch is down until the release is fixed.
  • 30 minutes is a guess, because no deploy has waited for its rollout before. While a step waits, later deploys of the same service queue behind it.

🚫 Blocked by

  • The deploy role github-oidc-hash-cd-deploy needs ecs:DescribeServices on every service in the deploy matrix. Without it, every deploy job fails right after starting its rollout. Its policy lives outside this repository and is not yet confirmed.

@vercel

vercel Bot commented Oct 6, 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 6, 2026 8:19am UTC
hashdotdesign-tokens Ready Ready Preview Oct 6, 2026 8:19am UTC
petrinaut Ready Ready Preview Oct 6, 2026 8:19am UTC
petrinaut-docs Ready Ready Preview Oct 6, 2026 8:19am UTC

Request Review

@codecov

codecov Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 66.50%. Comparing base (25dd9ca) to head (771e1e6).
⚠️ Report is 10 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff            @@
##             main    #9931    +/-   ##
========================================
  Coverage   66.50%   66.50%            
========================================
  Files        1954     1956     +2     
  Lines      215334   215945   +611     
  Branches     8420     8438    +18     
========================================
+ Hits       143200   143610   +410     
- Misses      70535    70730   +195     
- Partials     1599     1605     +6     
Flag Coverage Δ
apps.hash-ai-worker-ts 2.04% <ø> (ø)
apps.hash-api 15.35% <ø> (ø)
blockprotocol.type-system 41.37% <ø> (+3.22%) ⬆️
durable-kernel 86.65% <ø> (ø)
error-stack 90.55% <ø> (ø)
harpc-codec 84.61% <ø> (ø)
harpc-net 96.25% <ø> (ø)
harpc-tower 67.11% <ø> (ø)
harpc-types 0.00% <ø> (ø)
harpc-wire-protocol 93.85% <ø> (ø)
hash-codec 72.09% <ø> (ø)
hash-config 83.57% <ø> (ø)
hash-graph 14.11% <ø> (ø)
hash-graph-api 36.80% <ø> (+0.59%) ⬆️
hash-graph-atlas 80.00% <ø> (ø)
hash-graph-authentication 97.63% <ø> (ø)
hash-graph-authorization 68.47% <ø> (+0.79%) ⬆️
hash-graph-embeddings 91.54% <ø> (ø)
hash-graph-postgres-store 31.96% <ø> (+0.01%) ⬆️
hash-graph-store 51.60% <ø> (ø)
hash-graph-temporal-versioning 50.53% <ø> (ø)
hash-graph-types 0.00% <ø> (ø)
hash-graph-validation 85.37% <ø> (ø)
hash-middleware 89.60% <ø> (ø)
hashql-ast 90.01% <ø> (ø)
hashql-compiletest 28.71% <ø> (ø)
hashql-core 81.41% <ø> (ø)
hashql-diagnostics 72.85% <ø> (ø)
hashql-eval 79.77% <ø> (ø)
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 3.27% <ø> (ø)
local.hash-graph-sdk 10.02% <ø> (ø)
local.hash-isomorphic-utils 12.22% <ø> (ø)
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 6, 2026

Copy link
Copy Markdown

Merging this PR will degrade performance by 15.93%

⚠️ 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

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

❌ 2 regressed benchmarks
✅ 96 untouched benchmarks

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Benchmark BASE HEAD Efficiency
❌ bit_matrix/dense/iter_row[64] 137.2 ns 166.4 ns -17.53%
❌ bit_matrix/dense/iter_row[200] 174.7 ns 203.9 ns -14.31%
⚠️ as_constant < 1 ns < 1 ns N/A
⚠️ constant_equal < 1 ns < 1 ns N/A
⚠️ constant_not_equal < 1 ns < 1 ns N/A
⚠️ access < 1 ns < 1 ns N/A
⚠️ runtime_equal < 1 ns < 1 ns N/A
⚠️ runtime_not_equal < 1 ns < 1 ns N/A

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing ln/sre-1114-catch-a-missing-brunch-model-credential-at-deploy-instead-of (771e1e6) with main (27bc07e)1

Open in CodSpeed

Footnotes

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

@github-actions

github-actions Bot commented Oct 6, 2026

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 $$26.0 \mathrm{ms} \pm 253 \mathrm{μs}\left({\color{gray}-0.657 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$3.45 \mathrm{ms} \pm 17.9 \mathrm{μs}\left({\color{gray}0.376 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 1002 $$12.5 \mathrm{ms} \pm 160 \mathrm{μs}\left({\color{gray}2.00 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 3314 $$43.4 \mathrm{ms} \pm 432 \mathrm{μs}\left({\color{gray}0.801 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$14.5 \mathrm{ms} \pm 153 \mathrm{μs}\left({\color{gray}-1.292 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 1527 $$23.7 \mathrm{ms} \pm 244 \mathrm{μs}\left({\color{gray}-0.908 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 2078 $$26.8 \mathrm{ms} \pm 233 \mathrm{μs}\left({\color{gray}-1.138 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.79 \mathrm{ms} \pm 21.9 \mathrm{μs}\left({\color{gray}0.980 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 1033 $$13.3 \mathrm{ms} \pm 148 \mathrm{μs}\left({\color{gray}1.28 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_medium

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 102 $$3.81 \mathrm{ms} \pm 25.8 \mathrm{μs}\left({\color{gray}0.636 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$3.01 \mathrm{ms} \pm 18.9 \mathrm{μs}\left({\color{gray}-0.750 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 52 $$3.40 \mathrm{ms} \pm 18.3 \mathrm{μs}\left({\color{gray}0.326 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 269 $$5.24 \mathrm{ms} \pm 41.9 \mathrm{μs}\left({\color{gray}0.278 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$3.61 \mathrm{ms} \pm 21.8 \mathrm{μs}\left({\color{gray}0.417 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 108 $$4.21 \mathrm{ms} \pm 36.2 \mathrm{μs}\left({\color{gray}1.40 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 133 $$4.47 \mathrm{ms} \pm 33.3 \mathrm{μs}\left({\color{gray}0.466 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.50 \mathrm{ms} \pm 21.1 \mathrm{μs}\left({\color{gray}0.758 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 63 $$4.13 \mathrm{ms} \pm 27.2 \mathrm{μs}\left({\color{gray}-0.426 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_none

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2 $$2.71 \mathrm{ms} \pm 21.4 \mathrm{μs}\left({\color{gray}-0.976 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.70 \mathrm{ms} \pm 15.7 \mathrm{μs}\left({\color{gray}-0.004 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 2 $$2.84 \mathrm{ms} \pm 23.0 \mathrm{μs}\left({\color{gray}0.587 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 8 $$3.07 \mathrm{ms} \pm 17.7 \mathrm{μs}\left({\color{gray}-1.049 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.90 \mathrm{ms} \pm 17.6 \mathrm{μs}\left({\color{gray}0.374 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 3 $$3.19 \mathrm{ms} \pm 24.4 \mathrm{μs}\left({\color{gray}0.491 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_small

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 52 $$3.14 \mathrm{ms} \pm 26.1 \mathrm{μs}\left({\color{gray}1.45 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.84 \mathrm{ms} \pm 18.9 \mathrm{μs}\left({\color{gray}0.959 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 26 $$2.99 \mathrm{ms} \pm 20.3 \mathrm{μs}\left({\color{gray}1.43 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 94 $$3.51 \mathrm{ms} \pm 25.8 \mathrm{μs}\left({\color{gray}-0.572 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$3.11 \mathrm{ms} \pm 21.5 \mathrm{μs}\left({\color{gray}0.101 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 27 $$3.33 \mathrm{ms} \pm 20.0 \mathrm{μs}\left({\color{gray}0.635 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 66 $$3.43 \mathrm{ms} \pm 23.8 \mathrm{μs}\left({\color{gray}0.500 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.10 \mathrm{ms} \pm 24.7 \mathrm{μs}\left({\color{gray}-1.402 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 29 $$3.33 \mathrm{ms} \pm 21.4 \mathrm{μs}\left({\color{gray}0.214 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_complete

Function Value Mean Flame graphs
entity_by_id;one_depth 1 entities $$31.3 \mathrm{ms} \pm 166 \mathrm{μs}\left({\color{gray}-0.419 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 10 entities $$69.5 \mathrm{ms} \pm 573 \mathrm{μs}\left({\color{gray}-2.404 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 25 entities $$35.2 \mathrm{ms} \pm 199 \mathrm{μs}\left({\color{gray}0.663 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 5 entities $$37.4 \mathrm{ms} \pm 266 \mathrm{μs}\left({\color{gray}-2.088 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 50 entities $$41.2 \mathrm{ms} \pm 308 \mathrm{μs}\left({\color{gray}0.124 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 1 entities $$33.0 \mathrm{ms} \pm 168 \mathrm{μs}\left({\color{gray}0.703 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 10 entities $$409 \mathrm{ms} \pm 1.07 \mathrm{ms}\left({\color{gray}-0.102 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 25 entities $$89.4 \mathrm{ms} \pm 809 \mathrm{μs}\left({\color{red}5.47 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 5 entities $$70.3 \mathrm{ms} \pm 520 \mathrm{μs}\left({\color{gray}-1.238 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 50 entities $$299 \mathrm{ms} \pm 1.40 \mathrm{ms}\left({\color{gray}0.176 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 1 entities $$10.2 \mathrm{ms} \pm 56.7 \mathrm{μs}\left({\color{gray}-0.242 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 10 entities $$10.5 \mathrm{ms} \pm 90.0 \mathrm{μs}\left({\color{gray}1.08 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 25 entities $$10.6 \mathrm{ms} \pm 66.3 \mathrm{μs}\left({\color{gray}1.17 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 5 entities $$10.4 \mathrm{ms} \pm 66.6 \mathrm{μs}\left({\color{gray}-0.559 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 50 entities $$10.5 \mathrm{ms} \pm 81.8 \mathrm{μs}\left({\color{gray}0.373 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_linkless

Function Value Mean Flame graphs
entity_by_id 1 entities $$10.3 \mathrm{ms} \pm 59.4 \mathrm{μs}\left({\color{gray}-0.040 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10 entities $$10.3 \mathrm{ms} \pm 64.1 \mathrm{μs}\left({\color{gray}0.358 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 100 entities $$10.3 \mathrm{ms} \pm 64.5 \mathrm{μs}\left({\color{gray}-0.438 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 1000 entities $$10.4 \mathrm{ms} \pm 84.7 \mathrm{μs}\left({\color{gray}1.41 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10000 entities $$10.7 \mathrm{ms} \pm 80.4 \mathrm{μs}\left({\color{gray}1.20 \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.7 \mathrm{ms} \pm 68.6 \mathrm{μs}\left({\color{gray}0.015 \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 63.0 \mathrm{μs}\left({\color{gray}-0.438 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/building/v/1 $$10.7 \mathrm{ms} \pm 86.2 \mathrm{μs}\left({\color{gray}0.771 \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 75.2 \mathrm{μs}\left({\color{gray}-0.061 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/page/v/2 $$11.0 \mathrm{ms} \pm 93.2 \mathrm{μs}\left({\color{gray}3.10 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/person/v/1 $$10.8 \mathrm{ms} \pm 96.5 \mathrm{μs}\left({\color{gray}1.44 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/playlist/v/1 $$10.8 \mathrm{ms} \pm 66.7 \mathrm{μs}\left({\color{gray}1.34 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/song/v/1 $$10.8 \mathrm{ms} \pm 96.8 \mathrm{μs}\left({\color{gray}0.049 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/uk-address/v/1 $$10.8 \mathrm{ms} \pm 76.1 \mathrm{μs}\left({\color{gray}1.50 \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 $$7.93 \mathrm{ms} \pm 57.1 \mathrm{μs}\left({\color{gray}1.33 \mathrm{\%}}\right) $$ Flame Graph

representative_read_multiple_entities

Function Value Mean Flame graphs
entity_by_property traversal_paths=0 0 $$55.9 \mathrm{ms} \pm 731 \mathrm{μs}\left({\color{gray}2.87 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=255 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true $$107 \mathrm{ms} \pm 729 \mathrm{μs}\left({\color{gray}0.306 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$61.5 \mathrm{ms} \pm 524 \mathrm{μs}\left({\color{gray}0.289 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true $$70.2 \mathrm{ms} \pm 572 \mathrm{μs}\left({\color{gray}-0.334 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true $$78.8 \mathrm{ms} \pm 601 \mathrm{μs}\left({\color{gray}-1.031 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true $$85.8 \mathrm{ms} \pm 658 \mathrm{μs}\left({\color{gray}0.543 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=0 0 $$44.4 \mathrm{ms} \pm 355 \mathrm{μs}\left({\color{gray}-0.013 \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 $$71.7 \mathrm{ms} \pm 465 \mathrm{μs}\left({\color{gray}0.541 \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.6 \mathrm{ms} \pm 395 \mathrm{μs}\left({\color{gray}-0.466 \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.5 \mathrm{ms} \pm 440 \mathrm{μs}\left({\color{gray}1.09 \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 445 \mathrm{μs}\left({\color{gray}0.633 \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.7 \mathrm{ms} \pm 558 \mathrm{μs}\left({\color{gray}1.42 \mathrm{\%}}\right) $$

scenarios

Function Value Mean Flame graphs
full_test query-limited $$116 \mathrm{ms} \pm 611 \mathrm{μs}\left({\color{gray}1.76 \mathrm{\%}}\right) $$ Flame Graph
full_test query-unlimited $$128 \mathrm{ms} \pm 737 \mathrm{μs}\left({\color{gray}0.760 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-limited $$17.7 \mathrm{ms} \pm 225 \mathrm{μs}\left({\color{gray}-3.800 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-unlimited $$546 \mathrm{ms} \pm 1.30 \mathrm{ms}\left({\color{red}7.60 \mathrm{\%}}\right) $$ Flame Graph

This branch was successfully deployed

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

Labels

area/apps area/infra Relates to version control, CI, CD or IaC (area) area/tests New or updated tests

Development

Successfully merging this pull request may close these issues.

1 participant