Skip to content

Releases: Hebbian-Robotics/hflow

v0.2.4

Choose a tag to compare

@kstonekuan kstonekuan released this 30 Aug 21:10

Security

GHSA-57x4-5jwm-2xg8 (#271): curate(..., constrained=True) interpolated caller SQL into a COPY statement, so a tenant could smuggle a second statement past the sandbox and run arbitrary DDL/DML on the connection. curate() now parses with extract_statements and refuses anything that is not exactly one SELECT.

Severity is Low. hflow serve, the only tenant-SQL surface shipped here, was never affected: its curation routes have always applied the same one-SELECT rule before any interpolation. Reaching the vulnerable path meant calling curate() directly from an integration without that guard. Even then the lockdown held everywhere it mattered, since constrained connections materialize the catalog in memory before the constraints land, so file access, ATTACH, extension loading, and the catalog's own files all stayed refused. What an attacker gained was arbitrary statements against a throwaway in-memory copy of data they were already permitted to query, on a connection closed at the end of the call.

Reported by @Raghav7-tech, who also wrote the fix.

Upgrade if you call curate(..., constrained=True) or open_catalog_connection(..., constrained=True) with SQL you did not write.

Note this narrows what curate() accepts: PIVOT is now refused, because DuckDB expands it into a CREATE plus a SELECT. DESCRIBE and SUMMARIZE now pass where they were previously parser errors.

Added

  • First-class LeRobot v3 dataset import: hflow.import_lerobot_dataset and hflow import lerobot.
  • DuckDB catalog UI.
  • First-class model evaluation evidence.
  • EgoSuite hand evaluation example, with natural sampling (#262, #270).
  • hflow serve warns when it binds past loopback, since the server authenticates nobody (#269).
  • camera_frame_stats reports <topic>/decode_deficit_pct: messages that arrived but did not decode, separate from the existing rate-based deficit. camera_frame_stats version 1 to 2 (#265).

Fixed

  • LeRobot converter output decodes in full; B-frames disabled (#251).
  • doctor chunk purity proxy checks the provenance group map (#252), and per-group chunk time order is enforced (#256).
  • Egocentric contact-sheet enrichment resolves its camera explicitly (#253).
  • Hand-count evaluation schema constrains its value set (#258).
  • VideoEpisodeSpec refuses bools and non-finite numbers, matching its sibling validator (#277).
  • Both evaluation examples refuse missing and malformed summaries with exit 2 instead of a traceback (#272, #290).

Tests

  • Module boundaries are enforced mechanically: hflow.testing may not reach the canonical writer, and nothing under src/hflow/ may import hflow_server at module scope (#263).
  • Malformed H.264 input guards, and the snapshot export symlink and null-episode_id refusals, are pinned (#282, #283).
  • Five workspace and catalog refusal cases (#249).

Full changelog: v0.2.3...v0.2.4

HFlow 0.2.3

Choose a tag to compare

@kstonekuan kstonekuan released this 29 Aug 04:22

The transform now repairs one thing it used to refuse: a foxglove.CompressedVideo stream missing its access-unit delimiters is fixed by inserting them, with no re-encode, so the slice data is untouched and conforming messages stay byte-identical. Standard recordings that could not be canonicalized before now can be.

Beyond that this is a hardening release. Roughly a dozen entry points that accepted values they should never have accepted now refuse them at the boundary, with a message naming the field: TransformConfig (bool and out-of-range crf, non-finite gop_seconds), Threshold (infinite and bool values, plus a large-int OverflowError), contact_sheet (tile_width and bool sizing arguments), SyntheticEpisodeSpec, data-root parsing (an empty root silently meant the current directory), and batch planning.

The LeRobot converter reads any Dataset v3 repository from its own metadata instead of PushT constants, converting every selected camera, and python -m hflow works alongside the console script.

TRANSFORM_BEHAVIOR_VERSION moved from 5 to 7. Canonical output for video episodes can differ from 0.2.2, so pipeline_version and episode_id change and a re-ingest rewrites those episodes rather than reusing them. State-only episodes are unaffected.

The new refusals are a behaviour change. A pipeline passing a value the list above now rejects will raise where it previously ran. Every one of them was accepting something meaningless, but the failure is at construction rather than later.

What's Changed

New Contributors

Full Changelog: v0.2.2...v0.2.3

HFlow 0.2.2

Choose a tag to compare

@kstonekuan kstonekuan released this 26 Aug 01:52

HFlow now uses explicit, author-declared versions for checks, enrichments, and derived channels. Every registration must pass version=, and authors bump it when results are no longer comparable. HFlow no longer fingerprints Python functions, so the version contract is portable across SDK languages.

This is an intentional pre-1.0 breaking change. Existing pipelines must add explicit versions before upgrading.

What's Changed

  • fix: Reject inverted or negative interval bounds on append by @VedantMadane in #174
  • Cache frame_stats per video to fix doubled decode cost by @Sagar-024 in #175
  • fix: refuse non-finite catalog measurements by @sharonyao1127 in #176
  • docs: describe benchmark report as published and fix stale claims by @tasodoufu in #179
  • fix(catalog): report a crashed critical check as unverified by @chiruu12 in #180
  • fix(checks): skip defaults whose keys the pipeline already emitted (#177) by @Sagar-024 in #178
  • fix(dataset): select only ok episodes by default by @chiruu12 in #183

New Contributors

Full Changelog: v0.2.1...v0.2.2

HFlow 0.2.1

Choose a tag to compare

@kstonekuan kstonekuan released this 25 Aug 05:13
030548b

HFlow 0.2.1 makes the current pre-v1 workflow available as an installable release.

Highlights:

  • Add opinionated project defaults through hflow.toml, automatic built-in checks, dataset manifests, and planned re-ingest.
  • Export portable dataset snapshots as standard Parquet tables with optional copied media for tools such as Renumics Spotlight and FiftyOne.
  • Expand deterministic quality checks and declarative gates, including opt-in motion and MediaPipe hand-presence checks.
  • Improve catalog provenance, curation diagnostics and dry runs, staged execution, runtime validation, and error reporting.
  • Add reproducible stress and LeRobot PushT examples.

This is a pre-v1 release. Stored-data compatibility remains explicit and versioned; review the repository documentation when upgrading.

Full changelog: v0.2.0...v0.2.1

HFlow 0.2.0

Choose a tag to compare

@kstonekuan kstonekuan released this 20 Aug 07:07

First community release of HFlow by Hebbian Robotics.

Highlights:

  • Build physical-AI data pipelines from plain Python transforms, checks, labels, and enrichments.
  • Process episodes locally with no scheduler, or render an Airflow 3 runtime for durable batch execution.
  • Write canonical MCAP episodes with provenance and curate Parquet catalogs with DuckDB SQL.
  • Use local, S3, GCS, or Azure data roots.

This is a pre-v1 release. The Hebbian Robotics project begins at 0.2.0; the older PyPI 0.1.x files belong to the unrelated project that previously held the package name.