Hamilton is a Python framework for building dataflows as explicit function graphs, and recent activity in Hamilton is more about pipeline correctness than new surface area. The useful thread is small but practical: release scripts now survive local path changes, with_columns rejects ambiguous dataframe inputs, Driver gets variable lookup helpers, and graph collection styling gets a fix.
Release scripts get safer reruns ¶
The largest patch is the release hardening change, which touched Apache release upload and local package verification. In scripts/apache_release_helper.py, generated source and wheel artifacts are now returned as absolute paths. That matters because the upload path runs after package creation has changed directories. A path can be valid in the package build directory and invalid from the repository root.
The same change makes the SVN candidate directory step more tolerant. If svn mkdir reports that the release candidate directory already exists, the helper continues to import files instead of treating that specific state as fatal. That is useful after a partial upload, where the operator wants to rerun the same candidate flow instead of cleaning remote state by hand.
Verification scripts also got the same path discipline. Scripts such as scripts/verify-sub-packages/verify_contrib.sh, scripts/verify-sub-packages/verify_lsp.sh, scripts/verify-sub-packages/verify_sdk.sh, and scripts/verify-sub-packages/verify_ui.sh now resolve ARTIFACTS_DIR before later work moves into /tmp. For data teams, this is release supply chain hygiene, not runtime behavior. It reduces manual repair during package candidate validation.
Recursive dataframe modifiers reject ambiguous input ¶
The with_columns guard is a small API constraint with a direct data pipeline payoff. The change requires callers to set exactly one of pass_dataframe_as, columns_to_pass, or on_input when using the recursive with_columns path. The touched files are hamilton/function_modifiers/recursive.py and tests/function_modifiers/test_recursive.py.
That rule is worth calling out because dataframe context is easy to make vague. A caller can want the whole dataframe, a subset of columns, or a specific input binding. Allowing more than one mode invites unclear behavior and late failures. Hamilton now rejects the ambiguous configuration at the decorator boundary, which is the right place for this check.
In ETL code, earlier failure is usually cheaper than clever fallback behavior. A graph step that accepts a muddy dataframe input contract can produce wrong column expectations downstream. The stricter guard makes the input shape decision explicit before the graph is useful enough to confuse a reviewer.
Driver helpers make variable lookup explicit ¶
The Driver helper change adds helper surface for variable lookup in hamilton/driver.py, with coverage in tests/test_hamilton_driver.py. The commit summary does not point to a large behavioral shift. It does point to a better place for lookup logic to live.
Driver is the object most Hamilton users already hold after constructing a graph. If user code needs to ask which variables exist, or inspect whether a named output can be resolved, a Driver helper is cleaner than reaching into graph internals. That matters for orchestration glue, notebook checks, test fixtures, and small command line utilities that wrap Hamilton graphs.
The practical benefit is less custom introspection code around each project. Data platforms tend to accumulate local helper functions for graph inspection. Moving common lookup operations onto Driver gives those wrappers a smaller job and gives Hamilton tests a central contract to protect.
Graph output got a contract fix ¶
The collect visualization fix touched hamilton/graph.py and tests/test_graph.py. The commit subject says it fixes edge styling for collect visualization. That sounds cosmetic until the graph is used as a review artifact.
Hamilton graphs are often read by humans before they are trusted in production. Edges show dependency direction, fan in points, and where collection operations sit in the flow. If collect edges render with the wrong styling, reviewers can read the wrong shape into the graph even when the execution path is correct.
This is a small change in the diff, but it belongs in the same correctness bucket as the recursive decorator guard. The code path is not about raw compute speed. It is about whether the project presents the same dataflow contract to code and to people.
What to watch ¶
- Treat this as a correctness pass, not a feature release. The API visible item is the Driver lookup helper.
- Audit
with_columnsusage that mixespass_dataframe_as,columns_to_pass, andon_input. Those cases should now fail earlier. - If you cut internal packages from Hamilton, copy the absolute path behavior into local release automation and check rerun behavior after a partial upload.