Skip to content

BE-826: Load explicit TOML files in hash-config - #9553

Merged
TimDiekmann merged 3 commits into
mainfrom
t/codex/be-826-load-explicit-toml-files-in-hash-config
Sep 7, 2026
Merged

BE-826: Load explicit TOML files in hash-config#9553
TimDiekmann merged 3 commits into
mainfrom
t/codex/be-826-load-explicit-toml-files-in-hash-config

Conversation

@TimDiekmann

@TimDiekmann TimDiekmann commented Sep 6, 2026

Copy link
Copy Markdown
Member

🌟 What is the purpose of this PR?

Allow HASH applications to load required TOML files on top of programmatic defaults. Files have predictable precedence, and failures identify the source without including rejected values or TOML source excerpts.

🔗 Related links

🚫 Blocked by

None.

🔍 What does this change?

  • Add repeatable Loader::with_toml_file(path), with file reads deferred until load.
  • Apply every file above all defaults, regardless of builder-call order. Later files replace scalars and arrays; maps merge recursively.
  • Add typed read and parse errors. Read failures retain their I/O cause; malformed TOML reports its path and position without retaining the parser error or source excerpt.
  • Derive LoadError display messages and document the API with an executable file example.

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:

  • require changes to docs which are made as part of this PR

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

The changes in this PR:

  • do not affect the execution graph

⚠️ Known issues

This slice accepts required TOML files only. Profiles, discovery, optional files, other formats, environment variables, CLI integration, and a public provenance API are outside its scope.

🐾 Next steps

Choose the next configuration source or inspection feature as a separate, small change.

🛡 What tests cover this?

  • Eleven file integration tests cover deferred reads, precedence, merging, correction of an earlier mistyped value, empty file layers, missing files, directories, invalid UTF-8, malformed TOML, invalid values, and missing required fields.
  • Six Insta snapshots check complete error reports alongside typed error assertions and checks that rejected values are absent before snapshot normalization.
  • yarn workspace @rust/hash-config test:unit passes all 30 tests, including snapshots, and both executable doctests.
  • Clippy with all features/targets and warnings denied, Rustdoc generation, and git diff --check pass.

❓ How to test this?

  1. Run yarn workspace @rust/hash-config test:unit.
  2. Run cargo clippy --package hash-config --all-features --all-targets --no-deps -- -D warnings.

📹 Demo

Given hash-graph.toml:

host = "localhost"
#[derive(serde::Deserialize)]
struct Config {
    host: String,
    port: u16,
}

let config = hash_config::Loader::new()
    .with_defaults(serde_json::json!({ "port": 5432 }))
    .with_toml_file("hash-graph.toml")
    .load::<Config>()?;

assert_eq!(config.host, "localhost");
assert_eq!(config.port, 5432);

Copilot AI balanced review requested due to automatic review settings September 6, 2026 13:40
@vercel

vercel Bot commented Sep 6, 2026

Copy link
Copy Markdown

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

4 Skipped Deployments
Project Deployment Actions Updated
hash Ignored Ignored Preview Sep 6, 2026 7:55pm UTC
hashdotdesign-tokens Ignored Ignored Preview Sep 6, 2026 7:55pm UTC
petrinaut Skipped Skipped Sep 6, 2026 7:55pm UTC
petrinaut-docs Skipped Skipped Sep 6, 2026 7:55pm UTC

Request Review

@cursor

cursor Bot commented Sep 6, 2026

Copy link
Copy Markdown

PR Summary

Low Risk
Changes are confined to the internal hash-config crate with extensive tests; no app wiring yet, though misconfigured required file paths will fail startup once consumers adopt the API.

Overview
hash-config can now stack required TOML files on top of programmatic defaults via Loader::with_toml_file. Reads happen at load, not when the path is registered.

Precedence: every file layer beats all defaults, independent of builder call order. Among files, later entries override scalars and whole arrays; nested maps still merge. load merges defaults first, then each file in registration order.

Errors: LoadError adds ReadFile and ParseFile (with path), uses derive_more for display text, and keeps diagnostics safe to log—rejected values and TOML excerpts stay out of reports. Malformed TOML only attaches line/column, not the parser error or source text.

Coverage includes integration tests for precedence, multi-file merge, deferred read, and failure modes, plus Insta snapshots for full error output; existing default-layer tests now use assert_matches! on LoadError.

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

@github-actions github-actions Bot added area/deps Relates to third-party dependencies (area) area/libs Relates to first-party libraries/crates/packages (area) type/eng > backend Owned by the @backend team area/tests New or updated tests labels Sep 6, 2026

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 reviewed changes have comprehensive coverage and no unresolved issues.

Pull request overview

Adds deferred TOML file loading to hash-config with deterministic precedence and redacted diagnostics.

Changes:

  • Adds repeatable Loader::with_file.
  • Introduces typed read and parse errors.
  • Adds integration and snapshot coverage.
File summaries
File Description
libs/@local/config/tests/snapshots/files__file_non_utf8.snap Captures invalid UTF-8 diagnostics.
libs/@local/config/tests/snapshots/files__file_missing.snap Captures missing-file diagnostics.
libs/@local/config/tests/snapshots/files__file_missing_required_value.snap Captures missing-field diagnostics.
libs/@local/config/tests/snapshots/files__file_malformed_redaction.snap Captures redacted parse diagnostics.
libs/@local/config/tests/snapshots/files__file_invalid_value.snap Captures invalid-value diagnostics.
libs/@local/config/tests/snapshots/files__file_directory.snap Captures directory-read diagnostics.
libs/@local/config/tests/files.rs Tests precedence, merging, errors, and redaction.
libs/@local/config/src/lib.rs Integrates and documents file-backed loading.
libs/@local/config/src/file.rs Implements TOML reading and parsing.
libs/@local/config/src/error.rs Adds typed file errors.
libs/@local/config/Cargo.toml Adds implementation and test dependencies.
Cargo.lock Records resolved dependency changes.
Review details
  • Files reviewed: 11/12 changed files
  • Comments generated: 0
  • Review effort level: Balanced

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

@codecov

codecov Bot commented Sep 6, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 91.17647% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 60.89%. Comparing base (eea4e1f) to head (92c0150).
⚠️ Report is 18 commits behind head on main.

Files with missing lines Patch % Lines
libs/@local/config/src/file.rs 92.00% 1 Missing and 1 partial ⚠️
libs/@local/config/src/lib.rs 88.88% 1 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main    #9553   +/-   ##
=======================================
  Coverage   60.89%   60.89%           
=======================================
  Files        1461     1462    +1     
  Lines      146725   146754   +29     
  Branches     6744     6744           
=======================================
+ Hits        89343    89373   +30     
+ Misses      56264    56262    -2     
- Partials     1118     1119    +1     
Flag Coverage Δ
rust.hash-config 78.41% <91.17%> (+3.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.

@codspeed-hq

codspeed-hq Bot commented Sep 6, 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

Performance Changes

Benchmark BASE HEAD Efficiency
⚠️ 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

Comparing t/codex/be-826-load-explicit-toml-files-in-hash-config (92c0150) with main (8828644)

Open in CodSpeed

Comment thread libs/@local/config/src/file.rs
@vercel
vercel Bot temporarily deployed to Preview – petrinaut September 6, 2026 19:55 Inactive
@vercel
vercel Bot temporarily deployed to Preview – petrinaut-docs September 6, 2026 19:55 Inactive
@TimDiekmann
TimDiekmann requested a review from indietyp September 6, 2026 20:12
@github-actions

github-actions Bot commented Sep 6, 2026

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 $$27.1 \mathrm{ms} \pm 246 \mathrm{μs}\left({\color{gray}2.28 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$3.58 \mathrm{ms} \pm 31.1 \mathrm{μs}\left({\color{lightgreen}-5.144 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 1002 $$12.4 \mathrm{ms} \pm 91.3 \mathrm{μs}\left({\color{lightgreen}-8.277 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 3314 $$43.9 \mathrm{ms} \pm 346 \mathrm{μs}\left({\color{lightgreen}-5.798 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$15.7 \mathrm{ms} \pm 135 \mathrm{μs}\left({\color{gray}-0.174 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 1527 $$25.1 \mathrm{ms} \pm 198 \mathrm{μs}\left({\color{gray}-0.078 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 2078 $$27.9 \mathrm{ms} \pm 208 \mathrm{μs}\left({\color{gray}3.60 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.73 \mathrm{ms} \pm 17.0 \mathrm{μs}\left({\color{gray}-2.507 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 1033 $$14.1 \mathrm{ms} \pm 109 \mathrm{μs}\left({\color{gray}0.456 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_medium

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 102 $$3.82 \mathrm{ms} \pm 30.1 \mathrm{μs}\left({\color{gray}-0.815 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$3.05 \mathrm{ms} \pm 18.6 \mathrm{μs}\left({\color{gray}-1.969 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 52 $$3.44 \mathrm{ms} \pm 24.6 \mathrm{μs}\left({\color{gray}-1.917 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 269 $$5.17 \mathrm{ms} \pm 36.6 \mathrm{μs}\left({\color{gray}-3.055 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$3.60 \mathrm{ms} \pm 20.9 \mathrm{μs}\left({\color{gray}-0.703 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 108 $$4.13 \mathrm{ms} \pm 26.7 \mathrm{μs}\left({\color{gray}-4.150 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 133 $$4.52 \mathrm{ms} \pm 30.6 \mathrm{μs}\left({\color{gray}0.400 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.60 \mathrm{ms} \pm 45.3 \mathrm{μs}\left({\color{gray}0.796 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 63 $$4.29 \mathrm{ms} \pm 30.9 \mathrm{μs}\left({\color{gray}-0.980 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_none

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2 $$2.80 \mathrm{ms} \pm 17.4 \mathrm{μs}\left({\color{gray}0.939 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.76 \mathrm{ms} \pm 16.2 \mathrm{μs}\left({\color{gray}3.38 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 2 $$2.85 \mathrm{ms} \pm 16.5 \mathrm{μs}\left({\color{gray}0.455 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 8 $$3.08 \mathrm{ms} \pm 17.1 \mathrm{μs}\left({\color{gray}-1.346 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.98 \mathrm{ms} \pm 20.5 \mathrm{μs}\left({\color{gray}4.32 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 3 $$3.17 \mathrm{ms} \pm 21.1 \mathrm{μs}\left({\color{gray}0.247 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_small

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 52 $$3.18 \mathrm{ms} \pm 18.8 \mathrm{μs}\left({\color{gray}2.74 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.81 \mathrm{ms} \pm 18.8 \mathrm{μs}\left({\color{gray}-0.805 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 26 $$3.02 \mathrm{ms} \pm 20.4 \mathrm{μs}\left({\color{gray}0.336 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 94 $$3.50 \mathrm{ms} \pm 21.2 \mathrm{μs}\left({\color{gray}0.038 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$3.10 \mathrm{ms} \pm 20.0 \mathrm{μs}\left({\color{gray}1.40 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 27 $$3.31 \mathrm{ms} \pm 18.7 \mathrm{μs}\left({\color{gray}-1.118 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 66 $$3.44 \mathrm{ms} \pm 24.0 \mathrm{μs}\left({\color{gray}1.57 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.12 \mathrm{ms} \pm 14.9 \mathrm{μs}\left({\color{gray}2.81 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 29 $$3.44 \mathrm{ms} \pm 28.1 \mathrm{μs}\left({\color{gray}3.16 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_complete

Function Value Mean Flame graphs
entity_by_id;one_depth 1 entities $$31.5 \mathrm{ms} \pm 171 \mathrm{μs}\left({\color{gray}0.488 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 10 entities $$69.3 \mathrm{ms} \pm 499 \mathrm{μs}\left({\color{gray}2.94 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 25 entities $$35.6 \mathrm{ms} \pm 348 \mathrm{μs}\left({\color{gray}-1.186 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 5 entities $$38.9 \mathrm{ms} \pm 455 \mathrm{μs}\left({\color{gray}3.18 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 50 entities $$40.8 \mathrm{ms} \pm 214 \mathrm{μs}\left({\color{gray}-4.428 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 1 entities $$32.9 \mathrm{ms} \pm 168 \mathrm{μs}\left({\color{gray}-1.314 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 10 entities $$411 \mathrm{ms} \pm 1.15 \mathrm{ms}\left({\color{gray}4.66 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 25 entities $$94.7 \mathrm{ms} \pm 591 \mathrm{μs}\left({\color{red}6.79 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 5 entities $$70.5 \mathrm{ms} \pm 392 \mathrm{μs}\left({\color{gray}-0.519 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 50 entities $$311 \mathrm{ms} \pm 1.39 \mathrm{ms}\left({\color{red}12.4 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 1 entities $$10.8 \mathrm{ms} \pm 71.1 \mathrm{μs}\left({\color{red}6.43 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 10 entities $$10.6 \mathrm{ms} \pm 71.0 \mathrm{μs}\left({\color{gray}1.78 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 25 entities $$10.9 \mathrm{ms} \pm 77.9 \mathrm{μs}\left({\color{gray}4.65 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 5 entities $$10.7 \mathrm{ms} \pm 66.3 \mathrm{μs}\left({\color{gray}3.64 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 50 entities $$10.5 \mathrm{ms} \pm 74.8 \mathrm{μs}\left({\color{gray}0.624 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_linkless

Function Value Mean Flame graphs
entity_by_id 1 entities $$10.4 \mathrm{ms} \pm 67.9 \mathrm{μs}\left({\color{gray}0.918 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10 entities $$10.7 \mathrm{ms} \pm 72.4 \mathrm{μs}\left({\color{red}6.01 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 100 entities $$10.3 \mathrm{ms} \pm 57.8 \mathrm{μs}\left({\color{gray}1.55 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 1000 entities $$10.5 \mathrm{ms} \pm 73.3 \mathrm{μs}\left({\color{gray}1.49 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10000 entities $$10.9 \mathrm{ms} \pm 61.7 \mathrm{μs}\left({\color{gray}2.99 \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.2 \mathrm{ms} \pm 64.9 \mathrm{μs}\left({\color{gray}4.84 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/book/v/1 $$11.8 \mathrm{ms} \pm 68.8 \mathrm{μs}\left({\color{red}10.0 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/building/v/1 $$11.2 \mathrm{ms} \pm 73.4 \mathrm{μs}\left({\color{red}5.52 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/organization/v/1 $$11.4 \mathrm{ms} \pm 72.6 \mathrm{μs}\left({\color{red}7.27 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/page/v/2 $$11.5 \mathrm{ms} \pm 80.1 \mathrm{μs}\left({\color{red}7.49 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/person/v/1 $$11.7 \mathrm{ms} \pm 132 \mathrm{μs}\left({\color{red}9.87 \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 68.9 \mathrm{μs}\left({\color{gray}-0.078 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/song/v/1 $$10.9 \mathrm{ms} \pm 59.2 \mathrm{μs}\left({\color{gray}1.97 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/uk-address/v/1 $$10.9 \mathrm{ms} \pm 64.4 \mathrm{μs}\left({\color{gray}0.626 \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.95 \mathrm{ms} \pm 67.8 \mathrm{μs}\left({\color{gray}1.70 \mathrm{\%}}\right) $$ Flame Graph

representative_read_multiple_entities

Function Value Mean Flame graphs
entity_by_property traversal_paths=0 0 $$59.4 \mathrm{ms} \pm 719 \mathrm{μs}\left({\color{red}7.36 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=255 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true $$117 \mathrm{ms} \pm 992 \mathrm{μs}\left({\color{red}11.4 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$64.6 \mathrm{ms} \pm 624 \mathrm{μs}\left({\color{red}5.32 \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.8 \mathrm{ms} \pm 424 \mathrm{μs}\left({\color{gray}0.287 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true $$79.4 \mathrm{ms} \pm 436 \mathrm{μs}\left({\color{gray}-1.988 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true $$90.4 \mathrm{ms} \pm 687 \mathrm{μs}\left({\color{gray}4.47 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=0 0 $$49.4 \mathrm{ms} \pm 373 \mathrm{μs}\left({\color{red}9.90 \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 $$84.1 \mathrm{ms} \pm 539 \mathrm{μs}\left({\color{red}15.8 \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 $$59.1 \mathrm{ms} \pm 442 \mathrm{μs}\left({\color{red}15.7 \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 $$67.9 \mathrm{ms} \pm 461 \mathrm{μs}\left({\color{red}12.9 \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 $$72.5 \mathrm{ms} \pm 469 \mathrm{μs}\left({\color{red}16.0 \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 $$71.3 \mathrm{ms} \pm 429 \mathrm{μs}\left({\color{red}11.9 \mathrm{\%}}\right) $$

scenarios

Function Value Mean Flame graphs
full_test query-limited $$122 \mathrm{ms} \pm 523 \mathrm{μs}\left({\color{gray}-3.372 \mathrm{\%}}\right) $$ Flame Graph
full_test query-unlimited $$134 \mathrm{ms} \pm 475 \mathrm{μs}\left({\color{gray}-1.960 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-limited $$23.6 \mathrm{ms} \pm 145 \mathrm{μs}\left({\color{gray}-4.697 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-unlimited $$539 \mathrm{ms} \pm 1.08 \mathrm{ms}\left({\color{gray}-0.395 \mathrm{\%}}\right) $$ Flame Graph

@TimDiekmann
TimDiekmann added this pull request to the merge queue Sep 7, 2026
Merged via the queue into main with commit 23b4c0b Sep 7, 2026
220 checks passed
@TimDiekmann
TimDiekmann deleted the t/codex/be-826-load-explicit-toml-files-in-hash-config branch September 7, 2026 10:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/deps Relates to third-party dependencies (area) area/libs Relates to first-party libraries/crates/packages (area) area/tests New or updated tests type/eng > backend Owned by the @backend team

Development

Successfully merging this pull request may close these issues.

3 participants