Skip to content

fix(bind): four Python glue gaps found binding finance-query - #204

Open
Verdenroz wants to merge 8 commits into
feat/py-featuresfrom
fix/bind-finance-query
Open

Verdenroz wants to merge 8 commits into
feat/py-featuresfrom
fix/bind-finance-query

Conversation

@Verdenroz

@Verdenroz Verdenroz commented Sep 20, 2026 •

Copy link
Copy Markdown
Owner

What changed

Binding finance-query's Ticker surface to Python turned up four separate gaps in the pyo3 backend: a non_exhaustive plain enum had no catch-all arm and failed to compile against a real crate, a tuple struct's positional fields weren't legal Rust identifiers, a data-carrying enum's own payload got reported as a gap instead of crossing, and a map or map-of-lists holding an exported type came back as the raw Rust value instead of its Python handle class. Each fix carries its own regression, and the demo packages are regenerated so bind gen --check is clean again.

Why

Each fix removes a gap or a compile failure the pyo3 backend hit while binding a real, non-synthetic crate's surface, not something found in the existing golden fixtures.

How was this tested

  • cargo fmt --all -- --check
  • cargo clippy --workspace --all-targets -- -D warnings
  • cargo test --workspace (all green, including the 137 golden tests, unchanged where the fix didn't touch their output)
  • cargo test -p soothfast-bind --test python_smoke -- --ignored (builds and installs a real wheel)
  • make check
  • cargo soothfast bind gen -p soothfast-demo --check (all twelve backends, exit 0)
  • make gate BASE=master not run: this branch targets feat/py-features and touches only soothfast-bind and soothfast-demo, neither a BENCH_CRATE, so the merge-base gate doesn't apply to this diff.

Checklist

  • make check passes (fmt, clippy -D warnings, cargo test --workspace)
  • make gate BASE=master passes, or any intentional cost change is explained above (does not apply to this diff, see above)
  • Tests added/updated for new behavior (not required for docs/CI-only changes)
  • Public API items have /// doc comments
  • No new dependency, or its justification is included above (see Dependency Policy)
  • Docs (README.md, docs/, soothfast:bind/soothfast:claim markers) updated if behavior changed

- finance-query's SentimentLabel (#[non_exhaustive]) failed to build:
  the glue's From<foreign> for mirrored conversion matched every known
  variant with no wildcard arm, which rustc rejects across a crate
  boundary once the source can gain variants without notice
- add a catch-all arm to both foreign-to-mirrored conversions,
  unreachable for a binding built against the crate it was generated
  from, matching the error hierarchy's existing non_exhaustive handling
- regression: soothfast-bind/src/pyo3/glue.rs unit test renders a plain
  enum's conversions and asserts the catch-all arm is present; it fails
  against the pre-fix body (confirmed by temporarily reverting
  plain_enum) and passes after

Gates run: cargo fmt --all -- --check, cargo clippy -p soothfast-bind
--all-targets -- -D warnings, cargo test -p soothfast-bind --lib (45
passed). Not run: workspace-wide clippy/test, shape_matrix --ignored
(reproduces the same bug in the cabi-derived backends, out of scope
for this Python-only brief; reported to the reviewer separately).
- cargo test -p soothfast-bind (not --lib) caught what the scoped run
  missed: tests/goldens/python/src/lib.rs still had Level's conversion
  without the wildcard arm 6432188 added
- also trims the comment above arms() to two lines per review
- a non-plain enum always binds as an opaque handle (plan/mod.rs:270-
  276); pyo3's handle_class never reads Class.variants field types, so
  an UnmappedForeign gap on one reports a type that can never actually
  cross on any backend
- resolve.rs recorded it anyway: the tuple-variant loop in
  adt.rs::variant_fields called Resolver::resolve directly with no
  visibility check at all, and finance-query's real Provider::Custom
  (CustomId) shape hits exactly this
- route both tuple and named variant field resolution through
  resolve_unreported, the same "resolved but never crosses" path
  private struct fields already use

Regression: soothfast-bind/tests/surface.rs, a self-contained rustdoc
document (not the shared fixture, so no golden touches) with a tuple
variant over an unmapped foreign type. Confirmed failing pre-fix
(temporarily reverted adt.rs, reran):
  UnmappedForeign { at: "shape::Stamped::At.0", path: "std::time::Duration" }
passes after.

Gates run: cargo fmt --all -- --check, cargo clippy -p soothfast-bind
--all-targets -- -D warnings, cargo test -p soothfast-bind (all
suites, 137 golden + 46 unit + 21 surface, all green, no golden
regen needed). Not run: workspace-wide clippy/test.
- adt.rs names a tuple field's position by its Rust index ("0", "1"),
  legal as a tuple index but not as an identifier anywhere else;
  finance-query's FactsByTaxonomy(HashMap<...>) renders `fn 0(&self)`
  in the Python glue and `def 0(self)` in the stub, neither of which
  compiles or parses
- every backend's own *_ident/rust_ident wraps the same shared
  naming::escape, so a leading-digit rule there covers all of them at
  once; Accessor.field itself has to stay the raw Rust access
  expression (`self.0.0`), so the rename can only happen where the
  target-language name is read out, never in the plan

Regression: tests/idioms.rs, an isolated tuple-struct document (not
the shared fixture) asserting the Python glue's getter is `fn _0`, the
stub's is `def _0`, and the repr shows `_0=`. Confirmed failing
pre-fix (temporarily reverted naming.rs): `fn 0(&self)`. Also a unit
test beside escape for a bare digit-leading name.

Gates run: cargo fmt --all -- --check, cargo clippy -p soothfast-bind
--all-targets -- -D warnings, cargo test -p soothfast-bind (all
suites green, 137 golden unchanged, no regen needed). Not run:
workspace-wide clippy/test.
- variant_named_fields duplicated named_fields except for the resolve
  call; named_fields now takes a reported flag, true for a struct's
  own fields (unmapped is a gap), false for an enum variant's (never
  a gap, since a data-carrying enum stays opaque regardless)
- out() only converted Ty::Class, Optional(Class), and List(Class);
  any other composition (Map(_, Class), Map(_, List(Class)),
  Optional(List(Class)), a Class inside a Tuple) fell through to
  `expr.to_string()` and returned the raw Rust value instead of the
  Python handle class.
- Regression covers a Clone struct read through a map field, a map of
  lists, and a free fn returning a map, since all three go through
  the same out() call. Before the fix, the generated getters read
  `self.0.by_name.clone()` and `self.0.groups.clone()` verbatim, with
  no `Item(...)` wrapping at all.
- soothfast-demo/bindings/python's mirrored-enum conversions were
  stale: the last regen predates the non_exhaustive catch-all arm
  landing in the pyo3 backend, so `bind gen --check` was failing.
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:33 — with GitHub Actions Active
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:33 — with GitHub Actions Active
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:33 — with GitHub Actions Active
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:33 — with GitHub Actions Active
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:33 — with GitHub Actions Active
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:33 — with GitHub Actions Active
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:33 — with GitHub Actions Active
- d939b5a made a tuple struct's positional fields cross as _0, _1,
  ... in every language, since a bare index is not an identifier;
  the reference table never said so.
@soothfast-bot

soothfast-bot Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

soothfast gate

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=3.49% thresholds: instructions +5% ir +5% walltime +10.5% alloc/size +5% polls/wakes +5%
NOTE: noise floor 3.49% raised the walltime threshold to +10.5% (deterministic metrics unaffected)
ok    soothfast_measure::bench_summarize walltime_median_ns 644792.0 -> 644792.0 (+0.0%)
ok    soothfast_measure::bench_summarize allocs 4 -> 4 (allowed <= 4)
ok    soothfast_measure::bench_summarize alloc_bytes 524288 -> 524288 (allowed <= 550502)
ok    soothfast_measure::bench_sweep_evaluate walltime_median_ns 18.0 -> 18.0 (+0.0%)
ok    soothfast_measure::bench_sweep_evaluate allocs 0 -> 0 (allowed <= 0)
ok    soothfast_measure::bench_sweep_evaluate alloc_bytes 0 -> 0 (allowed <= 0)
ok    soothfast_measure::bench_summarize assert alloc: allocs 4 <= 8
ok    soothfast_measure::bench_summarize assert complexity: claimed O(n log n); growth drift x1.23 over sizes [1024, 4096, 16384] (limit x2.5)
ok    soothfast_measure::bench_sweep_evaluate assert alloc: allocs 0 <= 0
gate: passed (2 item(s))

@soothfast-bot

soothfast-bot Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

soothfast gate

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.05% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_site::bench_highlight walltime_median_ns 2181609.0 -> 2181609.0 (+0.0%)
ok    soothfast_site::bench_highlight allocs 88069 -> 88069 (allowed <= 92472)
ok    soothfast_site::bench_highlight alloc_bytes 2079336 -> 2079336 (allowed <= 2183302)
ok    soothfast_site::bench_md_render walltime_median_ns 2089972.0 -> 2089972.0 (+0.0%)
ok    soothfast_site::bench_md_render allocs 68118 -> 68118 (allowed <= 71523)
ok    soothfast_site::bench_md_render alloc_bytes 3502526 -> 3502526 (allowed <= 3677652)
ok    soothfast_site::bench_highlight assert complexity: claimed O(n); growth drift x1.12 over sizes [128, 512, 2048] (limit x2.5)
ok    soothfast_site::bench_md_render assert complexity: claimed O(n); growth drift x1.00 over sizes [256, 1024, 4096] (limit x2.5)
gate: passed (2 item(s))

@soothfast-bot

soothfast-bot Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

soothfast gate

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.09% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_report::bench_llms_render walltime_median_ns 219860.3 -> 219860.3 (+0.0%)
ok    soothfast_report::bench_llms_render allocs 7191 -> 7191 (allowed <= 7550)
ok    soothfast_report::bench_llms_render alloc_bytes 1197537 -> 1197537 (allowed <= 1257413)
ok    soothfast_report::bench_perf_table walltime_median_ns 660903.0 -> 660903.0 (+0.0%)
ok    soothfast_report::bench_perf_table allocs 8204 -> 8204 (allowed <= 8614)
ok    soothfast_report::bench_perf_table alloc_bytes 465747 -> 465747 (allowed <= 489034)
ok    soothfast_report::bench_llms_render assert complexity: claimed O(n); growth drift x0.93 over sizes [64, 256, 1024] (limit x2.5)
ok    soothfast_report::bench_perf_table assert complexity: claimed O(n); growth drift x1.00 over sizes [64, 256, 1024] (limit x2.5)
gate: passed (2 item(s))

@soothfast-bot

soothfast-bot Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

soothfast gate

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.53% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_registry::bench_fnv1a walltime_median_ns 64460.7 -> 64460.7 (+0.0%)
ok    soothfast_registry::bench_fnv1a allocs 0 -> 0 (allowed <= 0)
ok    soothfast_registry::bench_fnv1a alloc_bytes 0 -> 0 (allowed <= 0)
ok    soothfast_registry::bench_yield_chain walltime_median_ns 295.0 -> 295.0 (+0.0%)
ok    soothfast_registry::bench_yield_chain allocs 1 -> 1 (allowed <= 1)
ok    soothfast_registry::bench_yield_chain alloc_bytes 24 -> 24 (allowed <= 25)
ok    soothfast_registry::bench_yield_chain polls 9 -> 9 (allowed <= 9)
ok    soothfast_registry::bench_yield_chain wakes 8 -> 8 (allowed <= 8)
ok    soothfast_registry::bench_fnv1a assert alloc: allocs 0 <= 0
ok    soothfast_registry::bench_fnv1a assert complexity: claimed O(n); growth drift x1.23 over sizes [1024, 8192, 65536] (limit x2.5)
ok    soothfast_registry::bench_yield_chain assert alloc: allocs 1 <= 1
gate: passed (2 item(s))

@soothfast-bot

soothfast-bot Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

soothfast gate

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.01% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_docs::bench_claim_parse walltime_median_ns 156.4 -> 156.4 (+0.0%)
ok    soothfast_docs::bench_claim_parse allocs 6 -> 6 (allowed <= 6)
ok    soothfast_docs::bench_claim_parse alloc_bytes 170 -> 170 (allowed <= 178)
ok    soothfast_docs::bench_markdown_scan walltime_median_ns 218309.6 -> 218309.6 (+0.0%)
ok    soothfast_docs::bench_markdown_scan allocs 4114 -> 4114 (allowed <= 4319)
ok    soothfast_docs::bench_markdown_scan alloc_bytes 338400 -> 338400 (allowed <= 355320)
ok    soothfast_docs::bench_claim_parse assert p99: p99 160ns <= 50000ns
ok    soothfast_docs::bench_markdown_scan assert complexity: claimed O(n); growth drift x1.09 over sizes [512, 2048, 8192] (limit x2.5)
gate: passed (2 item(s))

@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:35 — with GitHub Actions Active
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:35 — with GitHub Actions Active
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:35 — with GitHub Actions Active
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:35 — with GitHub Actions Active
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:35 — with GitHub Actions Active
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:35 — with GitHub Actions Active
@Verdenroz
Verdenroz deployed to soothfast-bot September 20, 2026 03:35 — with GitHub Actions Active
@soothfast-bot

soothfast-bot Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

soothfast gate

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.10% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_spec::bench_openapi_diff walltime_median_ns 5084389.0 -> 5084389.0 (+0.0%)
ok    soothfast_spec::bench_openapi_diff allocs 77722 -> 77722 (allowed <= 81608)
ok    soothfast_spec::bench_openapi_diff alloc_bytes 10815487 -> 10815487 (allowed <= 11356261)
ok    soothfast_spec::bench_openapi_document walltime_median_ns 1900734.0 -> 1900734.0 (+0.0%)
ok    soothfast_spec::bench_openapi_document allocs 30152 -> 30152 (allowed <= 31659)
ok    soothfast_spec::bench_openapi_document alloc_bytes 4715065 -> 4715065 (allowed <= 4950818)
ok    soothfast_spec::bench_serialize_yaml walltime_median_ns 6305516.0 -> 6305516.0 (+0.0%)
ok    soothfast_spec::bench_serialize_yaml allocs 74277 -> 74277 (allowed <= 77990)
ok    soothfast_spec::bench_serialize_yaml alloc_bytes 8533615 -> 8533615 (allowed <= 8960295)
ok    soothfast_spec::bench_openapi_diff assert complexity: claimed O(n); growth drift x1.40 over sizes [16, 64, 256] (limit x2.5)
ok    soothfast_spec::bench_openapi_document assert complexity: claimed O(n); growth drift x1.50 over sizes [16, 64, 256] (limit x2.5)
ok    soothfast_spec::bench_serialize_yaml assert complexity: claimed O(n); growth drift x1.17 over sizes [16, 64, 256] (limit x2.5)
gate: passed (3 item(s))

@soothfast-bot

soothfast-bot Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

soothfast gate

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.08% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_sdk::bench_emit_typescript walltime_median_ns 1718688.0 -> 1718688.0 (+0.0%)
ok    soothfast_sdk::bench_emit_typescript allocs 42930 -> 42930 (allowed <= 45076)
ok    soothfast_sdk::bench_emit_typescript alloc_bytes 2938940 -> 2938940 (allowed <= 3085887)
ok    soothfast_sdk::bench_lower walltime_median_ns 1071001.0 -> 1071001.0 (+0.0%)
ok    soothfast_sdk::bench_lower allocs 23907 -> 23907 (allowed <= 25102)
ok    soothfast_sdk::bench_lower alloc_bytes 2064788 -> 2064788 (allowed <= 2168027)
ok    soothfast_sdk::bench_emit_typescript assert complexity: claimed O(n); growth drift x0.98 over sizes [16, 64, 256] (limit x2.5)
ok    soothfast_sdk::bench_lower assert complexity: claimed O(n); growth drift x1.26 over sizes [16, 64, 256] (limit x2.5)
gate: passed (2 item(s))

@github-actions

github-actions Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

soothfast gate

soothfast-measure

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.09% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_measure::bench_summarize walltime_median_ns 660227.0 -> 660227.0 (+0.0%)
ok    soothfast_measure::bench_summarize allocs 4 -> 4 (allowed <= 4)
ok    soothfast_measure::bench_summarize alloc_bytes 524288 -> 524288 (allowed <= 550502)
ok    soothfast_measure::bench_sweep_evaluate walltime_median_ns 25.2 -> 25.2 (+0.0%)
ok    soothfast_measure::bench_sweep_evaluate allocs 0 -> 0 (allowed <= 0)
ok    soothfast_measure::bench_sweep_evaluate alloc_bytes 0 -> 0 (allowed <= 0)
ok    soothfast_measure::bench_summarize assert alloc: allocs 4 <= 8
ok    soothfast_measure::bench_summarize assert complexity: claimed O(n log n); growth drift x1.21 over sizes [1024, 4096, 16384] (limit x2.5)
ok    soothfast_measure::bench_sweep_evaluate assert alloc: allocs 0 <= 0
gate: passed (2 item(s))

soothfast-registry

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.07% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_registry::bench_fnv1a walltime_median_ns 81502.7 -> 81502.7 (+0.0%)
ok    soothfast_registry::bench_fnv1a allocs 0 -> 0 (allowed <= 0)
ok    soothfast_registry::bench_fnv1a alloc_bytes 0 -> 0 (allowed <= 0)
ok    soothfast_registry::bench_yield_chain walltime_median_ns 142.1 -> 142.1 (+0.0%)
ok    soothfast_registry::bench_yield_chain allocs 1 -> 1 (allowed <= 1)
ok    soothfast_registry::bench_yield_chain alloc_bytes 24 -> 24 (allowed <= 25)
ok    soothfast_registry::bench_yield_chain polls 9 -> 9 (allowed <= 9)
ok    soothfast_registry::bench_yield_chain wakes 8 -> 8 (allowed <= 8)
ok    soothfast_registry::bench_fnv1a assert alloc: allocs 0 <= 0
ok    soothfast_registry::bench_fnv1a assert complexity: claimed O(n); growth drift x1.01 over sizes [1024, 8192, 65536] (limit x2.5)
ok    soothfast_registry::bench_yield_chain assert alloc: allocs 1 <= 1
gate: passed (2 item(s))

soothfast-docs

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.06% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_docs::bench_claim_parse walltime_median_ns 232.7 -> 232.7 (+0.0%)
ok    soothfast_docs::bench_claim_parse allocs 6 -> 6 (allowed <= 6)
ok    soothfast_docs::bench_claim_parse alloc_bytes 170 -> 170 (allowed <= 178)
ok    soothfast_docs::bench_markdown_scan walltime_median_ns 436204.0 -> 436204.0 (+0.0%)
ok    soothfast_docs::bench_markdown_scan allocs 4114 -> 4114 (allowed <= 4319)
ok    soothfast_docs::bench_markdown_scan alloc_bytes 338400 -> 338400 (allowed <= 355320)
ok    soothfast_docs::bench_claim_parse assert p99: p99 248ns <= 50000ns
ok    soothfast_docs::bench_markdown_scan assert complexity: claimed O(n); growth drift x1.10 over sizes [512, 2048, 8192] (limit x2.5)
gate: passed (2 item(s))

soothfast-spec

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.12% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_spec::bench_openapi_diff walltime_median_ns 5105336.0 -> 5105336.0 (+0.0%)
ok    soothfast_spec::bench_openapi_diff allocs 77722 -> 77722 (allowed <= 81608)
ok    soothfast_spec::bench_openapi_diff alloc_bytes 10815487 -> 10815487 (allowed <= 11356261)
ok    soothfast_spec::bench_openapi_document walltime_median_ns 1908736.0 -> 1908736.0 (+0.0%)
ok    soothfast_spec::bench_openapi_document allocs 30152 -> 30152 (allowed <= 31659)
ok    soothfast_spec::bench_openapi_document alloc_bytes 4715065 -> 4715065 (allowed <= 4950818)
ok    soothfast_spec::bench_serialize_yaml walltime_median_ns 6572655.0 -> 6572655.0 (+0.0%)
ok    soothfast_spec::bench_serialize_yaml allocs 74277 -> 74277 (allowed <= 77990)
ok    soothfast_spec::bench_serialize_yaml alloc_bytes 8533615 -> 8533615 (allowed <= 8960295)
ok    soothfast_spec::bench_openapi_diff assert complexity: claimed O(n); growth drift x1.39 over sizes [16, 64, 256] (limit x2.5)
ok    soothfast_spec::bench_openapi_document assert complexity: claimed O(n); growth drift x1.52 over sizes [16, 64, 256] (limit x2.5)
ok    soothfast_spec::bench_serialize_yaml assert complexity: claimed O(n); growth drift x1.16 over sizes [16, 64, 256] (limit x2.5)
gate: passed (3 item(s))

soothfast-sdk

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.16% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_sdk::bench_emit_typescript walltime_median_ns 2216632.0 -> 2216632.0 (+0.0%)
ok    soothfast_sdk::bench_emit_typescript allocs 42930 -> 42930 (allowed <= 45076)
ok    soothfast_sdk::bench_emit_typescript alloc_bytes 2938940 -> 2938940 (allowed <= 3085887)
ok    soothfast_sdk::bench_lower walltime_median_ns 1443124.0 -> 1443124.0 (+0.0%)
ok    soothfast_sdk::bench_lower allocs 23907 -> 23907 (allowed <= 25102)
ok    soothfast_sdk::bench_lower alloc_bytes 2064788 -> 2064788 (allowed <= 2168027)
ok    soothfast_sdk::bench_emit_typescript assert complexity: claimed O(n); growth drift x0.99 over sizes [16, 64, 256] (limit x2.5)
ok    soothfast_sdk::bench_lower assert complexity: claimed O(n); growth drift x1.30 over sizes [16, 64, 256] (limit x2.5)
gate: passed (2 item(s))

soothfast-demo

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.16% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_demo::bench_deviations_all walltime_median_ns 11608.2 -> 11608.2 (+0.0%)
ok    soothfast_demo::bench_deviations_all allocs 1 -> 1 (allowed <= 1)
ok    soothfast_demo::bench_deviations_all alloc_bytes 131072 -> 131072 (allowed <= 137625)
ok    soothfast_demo::bench_deviations_into walltime_median_ns 11485.4 -> 11485.4 (+0.0%)
ok    soothfast_demo::bench_deviations_into allocs 0 -> 0 (allowed <= 0)
ok    soothfast_demo::bench_deviations_into alloc_bytes 0 -> 0 (allowed <= 0)
ok    soothfast_demo::bench_summary_get walltime_median_ns 0.6 -> 0.6 (+0.0%)
ok    soothfast_demo::bench_summary_get allocs 0 -> 0 (allowed <= 0)
ok    soothfast_demo::bench_summary_get alloc_bytes 0 -> 0 (allowed <= 0)
ok    soothfast_demo::bench_summary_new walltime_median_ns 620793.0 -> 620793.0 (+0.0%)
ok    soothfast_demo::bench_summary_new allocs 4 -> 4 (allowed <= 4)
ok    soothfast_demo::bench_summary_new alloc_bytes 524288 -> 524288 (allowed <= 550502)
ok    soothfast_demo::bench_deviations_all assert alloc: allocs 1 <= 1
ok    soothfast_demo::bench_deviations_all assert complexity: claimed O(n); growth drift x0.97 over sizes [1024, 4096, 16384] (limit x2.5)
ok    soothfast_demo::bench_deviations_into assert alloc: allocs 0 <= 0
ok    soothfast_demo::bench_deviations_into assert complexity: claimed O(n); growth drift x1.00 over sizes [1024, 4096, 16384] (limit x2.5)
ok    soothfast_demo::bench_summary_get assert alloc: allocs 0 <= 0
ok    soothfast_demo::bench_summary_new assert alloc: allocs 4 <= 6
ok    soothfast_demo::bench_summary_new assert complexity: claimed O(n log n); growth drift x1.10 over sizes [1024, 4096, 16384] (limit x2.5)
gate: passed (4 item(s))

soothfast-report

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.20% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_report::bench_llms_render walltime_median_ns 313918.0 -> 313918.0 (+0.0%)
ok    soothfast_report::bench_llms_render allocs 7191 -> 7191 (allowed <= 7550)
ok    soothfast_report::bench_llms_render alloc_bytes 1197537 -> 1197537 (allowed <= 1257413)
ok    soothfast_report::bench_perf_table walltime_median_ns 872123.5 -> 872123.5 (+0.0%)
ok    soothfast_report::bench_perf_table allocs 8204 -> 8204 (allowed <= 8614)
ok    soothfast_report::bench_perf_table alloc_bytes 465747 -> 465747 (allowed <= 489034)
ok    soothfast_report::bench_llms_render assert complexity: claimed O(n); growth drift x0.95 over sizes [64, 256, 1024] (limit x2.5)
ok    soothfast_report::bench_perf_table assert complexity: claimed O(n); growth drift x0.95 over sizes [64, 256, 1024] (limit x2.5)
gate: passed (2 item(s))

soothfast-site

gate: measuring merge-base of origin/feat/py-features in worktree (interleaved rounds)
gate: bench binaries identical (code and data match) — no measurable change possible
gate: gating backend = walltime
gate: build=08f03a noise_floor=0.08% thresholds: instructions +5% ir +5% walltime +10.0% alloc/size +5% polls/wakes +5%
ok    soothfast_site::bench_highlight walltime_median_ns 3052939.0 -> 3052939.0 (+0.0%)
ok    soothfast_site::bench_highlight allocs 88069 -> 88069 (allowed <= 92472)
ok    soothfast_site::bench_highlight alloc_bytes 2079336 -> 2079336 (allowed <= 2183302)
ok    soothfast_site::bench_md_render walltime_median_ns 3021540.0 -> 3021540.0 (+0.0%)
ok    soothfast_site::bench_md_render allocs 68118 -> 68118 (allowed <= 71523)
ok    soothfast_site::bench_md_render alloc_bytes 3502526 -> 3502526 (allowed <= 3677652)
ok    soothfast_site::bench_highlight assert complexity: claimed O(n); growth drift x1.19 over sizes [128, 512, 2048] (limit x2.5)
ok    soothfast_site::bench_md_render assert complexity: claimed O(n); growth drift x1.01 over sizes [256, 1024, 4096] (limit x2.5)
gate: passed (2 item(s))

bind: soothfast-demo

�[1m�[92m   Compiling�[0m proc-macro2 v1.0.107
�[1m�[92m   Compiling�[0m unicode-ident v1.0.24
�[1m�[92m   Compiling�[0m quote v1.0.47
�[1m�[92m   Compiling�[0m linkme-impl v0.3.37
�[1m�[92m   Compiling�[0m linkme v0.3.37
�[1m�[92m   Compiling�[0m libc v0.2.189
�[1m�[92m   Compiling�[0m syn v3.0.4
�[1m�[92m   Compiling�[0m soothfast-macros v0.3.2 (/home/runner/work/soothfast/soothfast/soothfast-macros)
�[1m�[92m    Checking�[0m soothfast-registry v0.3.2 (/home/runner/work/soothfast/soothfast/soothfast-registry)
�[1m�[92m    Checking�[0m soothfast-measure v0.3.2 (/home/runner/work/soothfast/soothfast/soothfast-measure)
�[1m�[92m    Checking�[0m soothfast v0.3.2 (/home/runner/work/soothfast/soothfast/soothfast)
�[1m�[92m Documenting�[0m soothfast-demo v0.3.2 (/home/runner/work/soothfast/soothfast/soothfast-demo)
�[1m�[92m    Finished�[0m `dev` profile [unoptimized + debuginfo] target(s) in 2.97s
�[1m�[92m   Compiling�[0m proc-macro2 v1.0.107
�[1m�[92m   Compiling�[0m unicode-ident v1.0.24
�[1m�[92m   Compiling�[0m quote v1.0.47
�[1m�[92m   Compiling�[0m linkme-impl v0.3.37
�[1m�[92m   Compiling�[0m linkme v0.3.37
�[1m�[92m   Compiling�[0m libc v0.2.189
�[1m�[92m   Compiling�[0m syn v3.0.4
�[1m�[92m   Compiling�[0m soothfast-macros v0.3.2 (/home/runner/work/soothfast/soothfast/.soothfast/worktrees/47a72d8641d679dfe862c594a1e9a0488c879af9/soothfast-macros)
�[1m�[92m    Checking�[0m soothfast-registry v0.3.2 (/home/runner/work/soothfast/soothfast/.soothfast/worktrees/47a72d8641d679dfe862c594a1e9a0488c879af9/soothfast-registry)
�[1m�[92m    Checking�[0m soothfast-measure v0.3.2 (/home/runner/work/soothfast/soothfast/.soothfast/worktrees/47a72d8641d679dfe862c594a1e9a0488c879af9/soothfast-measure)
�[1m�[92m    Checking�[0m soothfast v0.3.2 (/home/runner/work/soothfast/soothfast/.soothfast/worktrees/47a72d8641d679dfe862c594a1e9a0488c879af9/soothfast)
�[1m�[92m Documenting�[0m soothfast-demo v0.3.2 (/home/runner/work/soothfast/soothfast/.soothfast/worktrees/47a72d8641d679dfe862c594a1e9a0488c879af9/soothfast-demo)
�[1m�[92m    Finished�[0m `dev` profile [unoptimized + debuginfo] target(s) in 2.99s
bind gate: no binding surface changes vs origin/feat/py-features

This branch was successfully deployed

1 active deployment
soothfast-bot — b5704776 Deployed Sep 20, 2026 by Verdenroz via gate (soothfast-site) / gate #487
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant