Skip to content

FE-1270: Extract Python bindings for the Petrinaut CLI into @local/petrinaut-python - #9228

Draft
kube wants to merge 1 commit into
cf/fe-1413-arch-docs-cover-petrinaut-cli-and-attach-a-usage-manualfrom
cf/fe-1270-create-python-bindings-to-petrinaut-core
Draft

FE-1270: Extract Python bindings for the Petrinaut CLI into @local/petrinaut-python#9228
kube wants to merge 1 commit into
cf/fe-1413-arch-docs-cover-petrinaut-cli-and-attach-a-usage-manualfrom
cf/fe-1270-create-python-bindings-to-petrinaut-core

Conversation

@kube

@kube kube commented Aug 16, 2026

Copy link
Copy Markdown
Collaborator

🌟 What is the purpose of this PR?

The only way to use Petrinaut from Python was a copy-paste subprocess wrapper in the CLI's docs, while apps/petrinaut-opt carried its own hardened client that exposed just 2 of the CLI's 5 protocol methods. This PR extracts that client into a reusable package — libs/@local/petrinaut-python — so the AI lab can run simulations and optimization studies from Python directly, and the optimizer service consumes the same code instead of a private copy.

Stack #9226: FE-1410FE-1411FE-1408FE-1413this PR → (next: FE-1412).

🔗 Related links

🔍 What does this change?

New package @local/petrinaut-python (internal-only, stdlib-only, POSIX-only)

  • PetrinautSession — one CLI process per session: from_model_file / from_model (stdin bootstrap), healthz(), metadata(), run(params), a generic request(method, params) escape hatch, context-manager lifecycle, and the hardened close(graceful=) semantics the optimizer relies on.
  • OptimizationSession(PetrinautSession) — opaque-manifest studies: describe_optimization(), objective(values), and evaluate(values) returning the full result including per-seed replicates.
  • The transport is petrinaut-opt's client moved, not rewritten: env scrubbing, bounded reads, process-group SIGTERM→SIGKILL shutdown are byte-for-byte (git tracks the move at 70/84% similarity). PetrinautRequestError aliases PetrinautRunError for the generic reading.

Monorepo wiring (the first cross-package Python dependency in the repo)

  • petrinaut-opt depends on it as an editable uv path dependency, mirrored as a workspace:* edge in package.json — uv deps are invisible to Turbo, and without the mirror, CI pruning deletes the lib and lib changes never trigger the service's tests.
  • codegen inputs now include uv.lock and the bindings' sources, so the OpenAPI drift gate can't serve a stale cache.
  • Docker: the python-deps stage keeps the repo layout so the path dep resolves, and the runner copies the bindings source (editable install). deploy.yml's path filter gains the new lib.

Retired

  • apps/petrinaut-opt/src/petrinaut_client.py (moved), PYTHON_INTEGRATION.md, examples/python_stdio.py. MODEL_EXAMPLES.md and the usage manual now use the bindings.

Pre-Merge Checklist 🚀

🚢 Has this modified a publishable library?

This PR:

  • modifies workspaces but not a publishable library (@local/petrinaut-python is private and internal-only)

📜 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
    • Bindings README, MODEL_EXAMPLES.md, and the usage manual's Python section. In-app user docs unaffected.

🕸️ 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
    • @apps/petrinaut-opt@local/petrinaut-python@hashintel/petrinaut-cli edges (the latter so the bindings' e2e test always runs against a fresh CLI bundle); widened codegen inputs.

⚠️ Known issues

  • The bindings are POSIX-only (os.killpg, select on descriptors) — documented, not guarded.
  • The Unix-socket transport and Windows support are deliberately out of scope.

🛡 What tests cover this?

  • Bindings (23 tests): the optimizer client suite moved and re-pointed; new coverage for from_model_file/from_model bootstrap behaviour, healthz/metadata/run, error-frame recovery, request() passthrough, manifest-path sessions, evaluate with replicates; an end-to-end test spawning the real built dist/cli.js (deterministic same-seed rerun included) — the first Python test in the repo to exercise the real CLI.
  • petrinaut-opt (75 tests): full suite plus the OpenAPI drift gate, now importing the package.

❓ How to test this?

turbo run test:unit --filter @local/petrinaut-python --filter @apps/petrinaut-opt

🤖 Generated with Claude Code

Adds libs/@local/petrinaut-python: a stdlib-only, POSIX-only package
wrapping the CLI's JSON-lines protocol. PetrinautSession serves a model
(from a file or over stdin) with healthz/metadata/run plus a generic
request escape hatch; OptimizationSession adds describe/evaluate/
objective over an opaque manifest, with evaluate exposing per-seed
replicates. The code is petrinaut-opt's hardened client, generalized:
spawn scrubbing, bounded reads, process-group shutdown are unchanged.

petrinaut-opt consumes the package as an editable uv path dependency,
mirrored as a workspace:* edge so Turbo pruning and change detection see
it; its codegen inputs, the Docker python-deps/runner stages, and the
deploy path filter follow. The old src/petrinaut_client.py, the
PYTHON_INTEGRATION.md walkthrough, and examples/python_stdio.py are
retired; MODEL_EXAMPLES.md and the usage manual now use the bindings.
A new end-to-end pytest drives the real built CLI bundle.
@vercel

vercel Bot commented Aug 16, 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 16, 2026 6:23pm
hashdotdesign-tokens Ready Ready Preview Aug 16, 2026 6:23pm
petrinaut Ready Ready Preview Aug 16, 2026 6:23pm

@github-actions github-actions Bot added area/deps Relates to third-party dependencies (area) area/infra Relates to version control, CI, CD or IaC (area) area/libs Relates to first-party libraries/crates/packages (area) type/eng > frontend Owned by the @frontend team type/eng > backend Owned by the @backend team area/tests New or updated tests area/apps type/legal Owned by the @legal team labels Aug 16, 2026
@kube kube self-assigned this Aug 16, 2026
@kube kube changed the title FE-1270: Extract Python bindings for the Petrinaut CLI FE-1270: Extract Python bindings for the Petrinaut CLI into @local/petrinaut-python Aug 16, 2026
@kube
kube deployed to pull-request August 16, 2026 18:06 — with GitHub Actions Active
@kube
kube deployed to pull-request August 16, 2026 18:06 — with GitHub Actions Active
@codspeed-hq

codspeed-hq Bot commented Aug 16, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 98 untouched benchmarks


Comparing cf/fe-1270-create-python-bindings-to-petrinaut-core (c1e9f74) with main (1f543d0)1

Open in CodSpeed

Footnotes

  1. No successful run was found on cf/fe-1413-arch-docs-cover-petrinaut-cli-and-attach-a-usage-manual (a44e5b9) during the generation of this report, so main (1f543d0) was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

@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 $$26.7 \mathrm{ms} \pm 208 \mathrm{μs}\left({\color{gray}3.47 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$3.59 \mathrm{ms} \pm 39.3 \mathrm{μs}\left({\color{red}5.82 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 1002 $$12.5 \mathrm{ms} \pm 92.1 \mathrm{μs}\left({\color{gray}1.80 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 3314 $$43.8 \mathrm{ms} \pm 368 \mathrm{μs}\left({\color{gray}0.235 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$14.5 \mathrm{ms} \pm 103 \mathrm{μs}\left({\color{gray}1.06 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 1527 $$24.5 \mathrm{ms} \pm 147 \mathrm{μs}\left({\color{gray}1.99 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 2078 $$27.8 \mathrm{ms} \pm 221 \mathrm{μs}\left({\color{gray}2.31 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.95 \mathrm{ms} \pm 38.6 \mathrm{μs}\left({\color{red}5.13 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 1033 $$13.3 \mathrm{ms} \pm 80.3 \mathrm{μs}\left({\color{gray}-2.594 \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 34.9 \mathrm{μs}\left({\color{gray}2.47 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.99 \mathrm{ms} \pm 16.7 \mathrm{μs}\left({\color{gray}-0.554 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 52 $$3.32 \mathrm{ms} \pm 15.6 \mathrm{μs}\left({\color{gray}-0.796 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 269 $$5.17 \mathrm{ms} \pm 33.3 \mathrm{μs}\left({\color{gray}1.91 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$3.53 \mathrm{ms} \pm 19.1 \mathrm{μs}\left({\color{gray}-0.401 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 108 $$4.07 \mathrm{ms} \pm 25.4 \mathrm{μs}\left({\color{gray}-0.297 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 133 $$4.39 \mathrm{ms} \pm 30.0 \mathrm{μs}\left({\color{gray}1.46 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.44 \mathrm{ms} \pm 19.8 \mathrm{μs}\left({\color{gray}-1.780 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 63 $$4.02 \mathrm{ms} \pm 19.4 \mathrm{μs}\left({\color{gray}-0.754 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_none

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 2 $$2.70 \mathrm{ms} \pm 19.6 \mathrm{μs}\left({\color{gray}2.67 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.48 \mathrm{ms} \pm 11.3 \mathrm{μs}\left({\color{gray}-0.521 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 2 $$2.64 \mathrm{ms} \pm 14.9 \mathrm{μs}\left({\color{gray}-0.082 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 8 $$2.92 \mathrm{ms} \pm 17.9 \mathrm{μs}\left({\color{gray}-0.107 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$2.72 \mathrm{ms} \pm 13.6 \mathrm{μs}\left({\color{gray}0.417 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 3 $$2.89 \mathrm{ms} \pm 15.1 \mathrm{μs}\left({\color{gray}-1.461 \mathrm{\%}}\right) $$ Flame Graph

policy_resolution_small

Function Value Mean Flame graphs
resolve_policies_for_actor user: empty, selectivity: high, policies: 52 $$3.28 \mathrm{ms} \pm 30.0 \mathrm{μs}\left({\color{red}8.73 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: low, policies: 1 $$2.80 \mathrm{ms} \pm 20.4 \mathrm{μs}\left({\color{gray}1.84 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: empty, selectivity: medium, policies: 26 $$3.05 \mathrm{ms} \pm 18.1 \mathrm{μs}\left({\color{red}5.58 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: high, policies: 94 $$3.94 \mathrm{ms} \pm 51.4 \mathrm{μs}\left({\color{red}15.3 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: low, policies: 1 $$3.05 \mathrm{ms} \pm 17.3 \mathrm{μs}\left({\color{gray}2.37 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: seeded, selectivity: medium, policies: 27 $$3.28 \mathrm{ms} \pm 23.4 \mathrm{μs}\left({\color{gray}2.47 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: high, policies: 66 $$4.01 \mathrm{ms} \pm 43.5 \mathrm{μs}\left({\color{red}19.7 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: low, policies: 1 $$3.03 \mathrm{ms} \pm 17.8 \mathrm{μs}\left({\color{gray}1.80 \mathrm{\%}}\right) $$ Flame Graph
resolve_policies_for_actor user: system, selectivity: medium, policies: 29 $$3.28 \mathrm{ms} \pm 22.2 \mathrm{μs}\left({\color{gray}-0.609 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_complete

Function Value Mean Flame graphs
entity_by_id;one_depth 1 entities $$41.6 \mathrm{ms} \pm 271 \mathrm{μs}\left({\color{gray}-1.961 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 10 entities $$32.7 \mathrm{ms} \pm 239 \mathrm{μs}\left({\color{gray}-2.507 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 25 entities $$36.5 \mathrm{ms} \pm 206 \mathrm{μs}\left({\color{gray}3.41 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 5 entities $$32.0 \mathrm{ms} \pm 211 \mathrm{μs}\left({\color{gray}-0.679 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;one_depth 50 entities $$42.5 \mathrm{ms} \pm 235 \mathrm{μs}\left({\color{gray}2.36 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 1 entities $$49.1 \mathrm{ms} \pm 243 \mathrm{μs}\left({\color{gray}-0.635 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 10 entities $$40.2 \mathrm{ms} \pm 282 \mathrm{μs}\left({\color{gray}0.473 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 25 entities $$84.7 \mathrm{ms} \pm 622 \mathrm{μs}\left({\color{lightgreen}-5.765 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 5 entities $$33.9 \mathrm{ms} \pm 197 \mathrm{μs}\left({\color{gray}0.286 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;two_depth 50 entities $$299 \mathrm{ms} \pm 857 \mathrm{μs}\left({\color{red}18.2 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 1 entities $$10.9 \mathrm{ms} \pm 82.3 \mathrm{μs}\left({\color{gray}0.414 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 10 entities $$11.1 \mathrm{ms} \pm 80.0 \mathrm{μs}\left({\color{gray}-0.841 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 25 entities $$11.0 \mathrm{ms} \pm 83.5 \mathrm{μs}\left({\color{gray}1.52 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 5 entities $$11.0 \mathrm{ms} \pm 71.7 \mathrm{μs}\left({\color{gray}1.15 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id;zero_depth 50 entities $$11.1 \mathrm{ms} \pm 75.5 \mathrm{μs}\left({\color{gray}1.56 \mathrm{\%}}\right) $$ Flame Graph

read_scaling_linkless

Function Value Mean Flame graphs
entity_by_id 1 entities $$10.9 \mathrm{ms} \pm 62.5 \mathrm{μs}\left({\color{gray}-1.680 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10 entities $$11.1 \mathrm{ms} \pm 112 \mathrm{μs}\left({\color{gray}0.814 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 100 entities $$11.1 \mathrm{ms} \pm 73.1 \mathrm{μs}\left({\color{gray}0.475 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 1000 entities $$10.9 \mathrm{ms} \pm 61.4 \mathrm{μs}\left({\color{lightgreen}-5.259 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id 10000 entities $$11.3 \mathrm{ms} \pm 71.6 \mathrm{μs}\left({\color{gray}-0.220 \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.3 \mathrm{ms} \pm 57.8 \mathrm{μs}\left({\color{gray}-1.208 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/book/v/1 $$11.4 \mathrm{ms} \pm 64.4 \mathrm{μs}\left({\color{gray}1.73 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/building/v/1 $$11.4 \mathrm{ms} \pm 80.2 \mathrm{μs}\left({\color{gray}-2.029 \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 65.9 \mathrm{μs}\left({\color{gray}-3.786 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/page/v/2 $$11.3 \mathrm{ms} \pm 54.9 \mathrm{μs}\left({\color{gray}1.01 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/person/v/1 $$11.3 \mathrm{ms} \pm 56.0 \mathrm{μs}\left({\color{gray}0.908 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/playlist/v/1 $$11.4 \mathrm{ms} \pm 80.8 \mathrm{μs}\left({\color{gray}-1.226 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/song/v/1 $$11.5 \mathrm{ms} \pm 99.1 \mathrm{μs}\left({\color{gray}2.15 \mathrm{\%}}\right) $$ Flame Graph
entity_by_id entity type ID: https://blockprotocol.org/@alice/types/entity-type/uk-address/v/1 $$11.3 \mathrm{ms} \pm 47.0 \mathrm{μs}\left({\color{gray}-0.728 \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.37 \mathrm{ms} \pm 45.5 \mathrm{μs}\left({\color{gray}1.65 \mathrm{\%}}\right) $$ Flame Graph

representative_read_multiple_entities

Function Value Mean Flame graphs
entity_by_property traversal_paths=0 0 $$57.7 \mathrm{ms} \pm 388 \mathrm{μs}\left({\color{gray}3.73 \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 701 \mathrm{μs}\left({\color{gray}-1.234 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$66.0 \mathrm{ms} \pm 612 \mathrm{μs}\left({\color{red}5.13 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true $$75.3 \mathrm{ms} \pm 565 \mathrm{μs}\left({\color{gray}1.11 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true $$83.4 \mathrm{ms} \pm 567 \mathrm{μs}\left({\color{gray}0.729 \mathrm{\%}}\right) $$
entity_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true $$88.7 \mathrm{ms} \pm 674 \mathrm{μs}\left({\color{gray}-3.038 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=0 0 $$43.4 \mathrm{ms} \pm 270 \mathrm{μs}\left({\color{gray}0.842 \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 $$70.9 \mathrm{ms} \pm 386 \mathrm{μs}\left({\color{gray}-2.620 \mathrm{\%}}\right) $$
link_by_source_by_property traversal_paths=2 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false $$49.1 \mathrm{ms} \pm 242 \mathrm{μs}\left({\color{gray}0.491 \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.3 \mathrm{ms} \pm 414 \mathrm{μs}\left({\color{gray}-0.981 \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.3 \mathrm{ms} \pm 447 \mathrm{μs}\left({\color{gray}-3.157 \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.7 \mathrm{ms} \pm 424 \mathrm{μs}\left({\color{gray}-4.070 \mathrm{\%}}\right) $$

scenarios

Function Value Mean Flame graphs
full_test query-limited $$124 \mathrm{ms} \pm 576 \mathrm{μs}\left({\color{gray}-0.084 \mathrm{\%}}\right) $$ Flame Graph
full_test query-unlimited $$136 \mathrm{ms} \pm 464 \mathrm{μs}\left({\color{gray}0.814 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-limited $$18.9 \mathrm{ms} \pm 133 \mathrm{μs}\left({\color{gray}0.107 \mathrm{\%}}\right) $$ Flame Graph
linked_queries query-unlimited $$573 \mathrm{ms} \pm 1.06 \mathrm{ms}\left({\color{gray}1.90 \mathrm{\%}}\right) $$ Flame Graph

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

Labels

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

Development

Successfully merging this pull request may close these issues.

1 participant