Skip to content

Conversation

@ss2165
Copy link
Member

@ss2165 ss2165 commented Oct 27, 2025

Goals

  • Track descriptions during package loading such that partial descriptions can be provided even if an error is returned
  • Provide a describe cli subcommand for high-level descriptions of a package, primarily for debug purposes feat(cli): describe sub-command #2650. Since we want a description even if some loading stage fails (e.g. extension resolution), tracking partial descriptions is a requirement.

Secondary goals

  • Unify loading approaches across json/model, centralise more validation logic
  • Reduce burden on EnvelopeError - more local errors
  • Replace existing debug extraction (generator, used extensions, envelopeconfig) with single description

Approach

In order to make this PR non-breaking I have deprecated existing reading functions, and introduced new functions that return a full description on successful read, and a partial when error. The deprecated functions are most of the missing test coverage.

Reading naturally falls in to two stages: header and payload. If the header fails no description is valid, so that error does not come with a description. Payload errors can come with descriptions.

In order to build descriptions while loading I introduce the Reader struct to track data across the reading stages. This is handed off to the model Context when that stage takes over.

Partial descriptions

Descriptions are defined in description.rs. They are intended to be small amounts of simple data, so all fields are pub. All fields except the envelope header are optional, a value of None indicates the field has not been set yet.

Appendix: JSON

Since the JSON format is effectively legacy I did not focus much on incremental description tracking, it is more difficult since serde likes to read all at once.

I found a surprise performance regression in JSON loading. In commit af01043 I attempted to address this by removing an unnecessary two stage serde deser, which has swung things in the other direction, improving performance from prior.

Appendix: EnvelopeError

EnvelopeError is used as a catch all for all reading and writing errors. This PR goes some way to introducing new more specific errors for reaeding. EnvelopeError should really in future have the reading errors be taken out of it and renamed to WriteError or similar, then all the conversions from the reading errors can be removed. Removing the deprecated read functions is a pre-requisite for this. The merging of this PR should be accompanied by issues for these follow ups.

Some(generators.join(", "))
}

/// Format a generator value from the metadata.
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved to describe.rs

/// Read a Package in json format from an io reader.
/// Returns package and the combined extension registry
/// of the provided registry and the package extensions.
pub(super) fn from_json_reader(
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved to reader.rs

@codecov
Copy link

codecov bot commented Oct 27, 2025

Codecov Report

❌ Patch coverage is 78.13084% with 117 lines in your changes missing coverage. Please review.
✅ Project coverage is 83.36%. Comparing base (a1ce622) to head (334e96b).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
hugr-core/src/envelope/reader.rs 75.46% 37 Missing and 16 partials ⚠️
hugr-core/src/envelope/description.rs 83.91% 32 Missing ⚠️
hugr-core/src/envelope.rs 65.00% 14 Missing ⚠️
hugr-core/src/envelope/header.rs 59.09% 9 Missing ⚠️
hugr-cli/src/hugr_io.rs 33.33% 4 Missing ⚠️
hugr-core/src/import.rs 93.18% 1 Missing and 2 partials ⚠️
hugr-cli/src/convert.rs 50.00% 0 Missing and 1 partial ⚠️
hugr-cli/src/mermaid.rs 50.00% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2639      +/-   ##
==========================================
- Coverage   83.37%   83.36%   -0.02%     
==========================================
  Files         259      261       +2     
  Lines       50652    51015     +363     
  Branches    46213    46576     +363     
==========================================
+ Hits        42233    42527     +294     
- Misses       6051     6120      +69     
  Partials     2368     2368              
Flag Coverage Δ
python 91.46% <ø> (ø)
rust 82.58% <78.13%> (-0.02%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 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.

assert_matches!(check(&hugr, &registry), Ok(()));
}

#[test]
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

error is no longer thrown

@ss2165 ss2165 force-pushed the ss/push-stplquvkmuwx branch from 8ebd2e7 to 1792a90 Compare October 27, 2025 17:47
@codspeed-hq
Copy link

codspeed-hq bot commented Oct 27, 2025

CodSpeed Performance Report

Merging #2639 will improve performances by 23.17%

Comparing ss/push-stplquvkmuwx (334e96b) with main (a1ce622)

Summary

⚡ 5 improvements
✅ 20 untouched

Benchmarks breakdown

Benchmark BASE HEAD Change
circuit_roundtrip/json[1000] 252.3 ms 204.8 ms +23.17%
circuit_roundtrip/json[100] 22.4 ms 19.6 ms +14.7%
circuit_roundtrip/json[10] 2.5 ms 2.1 ms +14.25%
circuit_roundtrip/json[1] 448.4 µs 398.5 µs +12.52%
simple_cfg_serialize/json 433.8 µs 381 µs +13.86%

@ss2165 ss2165 changed the title feat: track package descriptions when loading, use in CLI describe command feat: track package descriptions when loading; CLI describe command Oct 27, 2025
@ss2165 ss2165 force-pushed the ss/push-stplquvkmuwx branch 3 times, most recently from 5f2ab49 to 2ebcbe3 Compare October 28, 2025 15:33
@ss2165 ss2165 requested a review from aborgna-q October 28, 2025 15:33
@ss2165 ss2165 marked this pull request as ready for review October 28, 2025 15:33
@ss2165 ss2165 requested a review from a team as a code owner October 28, 2025 15:33
@ss2165 ss2165 force-pushed the ss/push-stplquvkmuwx branch from beed3c2 to c3c4b64 Compare October 28, 2025 18:18
@ss2165 ss2165 requested a review from Copilot October 28, 2025 19:01
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR introduces a describe CLI subcommand that provides high-level descriptions of HUGR packages for debugging purposes. It tracks package descriptions during loading, enabling partial descriptions even when errors occur. The implementation centralizes package loading logic through a new Reader struct and deprecates the existing read_envelope function in favor of read_described_envelope, which returns both a description and the package.

Key changes:

  • New describe CLI command with table and JSON output formats
  • Package description tracking via PackageDesc, ModuleDesc, and ExtensionDesc structures
  • Refactored envelope reading to use EnvelopeReader for unified loading and description tracking

Reviewed Changes

Copilot reviewed 21 out of 22 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
hugr-core/src/envelope/description.rs Defines description structures for packages, modules, and extensions
hugr-core/src/envelope/reader.rs New reader implementation that tracks descriptions during loading
hugr-core/src/envelope.rs Deprecates read_envelope, introduces read_described_envelope and ReadError
hugr-core/src/import.rs Adds import_described_hugr to return module descriptions alongside results
hugr-cli/src/describe.rs Implements the describe CLI subcommand with table and JSON output
hugr-cli/src/hugr_io.rs Updates input handling to support described envelopes
Comments suppressed due to low confidence (1)

hugr-cli/src/describe.rs:1

  • Debug macro dbg!() should not be used in production code. Remove the dbg!() wrapper and use .assert() directly.
//! Convert between different HUGR envelope formats.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@ss2165 ss2165 force-pushed the ss/push-stplquvkmuwx branch from c3c4b64 to d429940 Compare October 28, 2025 22:16
let items = values
.iter()
.zip(variant.iter())
.map(|(value, typ)| self.import_value(*value, *typ))
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typos

@ss2165 ss2165 force-pushed the ss/push-stplquvkmuwx branch from 6709cbc to d83cebc Compare October 29, 2025 11:48
@ss2165 ss2165 changed the title feat: track package descriptions when loading; CLI describe command feat: track package descriptions when loading Oct 29, 2025
@ss2165 ss2165 force-pushed the ss/push-stplquvkmuwx branch from d83cebc to 35bf8fa Compare October 29, 2025 12:32
@ss2165 ss2165 requested a review from Copilot October 29, 2025 12:42
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Copilot reviewed 17 out of 17 changed files in this pull request and generated 4 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@ss2165 ss2165 force-pushed the ss/push-stplquvkmuwx branch from 35bf8fa to 5b2ae6c Compare October 29, 2025 12:49
@ss2165 ss2165 requested review from a team and aborgna-q and removed request for a team October 29, 2025 14:31
Copy link
Collaborator

@doug-q doug-q left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is big, I'll do another pass.

I like this a lot

use crate::import::ImportError;
use crate::{Extension, import::import_package};

// TODO centralise all core metadata keys in one place.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make an issue for this and link it.

flag_ids: Vec<usize>,
},
/// Error raised while checking for breaking extension version mismatch.
// no longer used
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we deprecate this variant?

}

/// Get a string representation of an OpType for description purposes.
pub fn op_string(op: &OpType) -> String {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think these are user visible strings.
I wonder if it would be better to just use Display here? that's mostly what you're doing, I wonder if tweaking you do should be done in Display. That would probably be breaking.

I suggest a snapshot test of this. We have experienced buggy Display getting to users before which is pretty embarrassing.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I didn't want to mess with Display for optype, this is specialised to "descriptions", where I've made the choice to show function names and signatures. I will rename and add unit test.

}
}

fn extend_option_vec<T: Clone>(vec: &mut Option<Vec<T>>, items: impl IntoIterator<Item = T>) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is called a partial vec above. I prefer option vec. If you want a crate for this check out stable-vec

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

renamed to OptionVec

@ss2165 ss2165 force-pushed the ss/push-stplquvkmuwx branch from f6d8675 to d6350c9 Compare October 30, 2025 13:03
@ss2165 ss2165 requested a review from doug-q October 30, 2025 13:03
@ss2165 ss2165 force-pushed the ss/push-stplquvkmuwx branch from d6350c9 to f32406d Compare October 30, 2025 13:26
Copy link
Collaborator

@doug-q doug-q left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not obvious to me that Described is worth it.

This isn't a Monad as written, the key monadic method is like and_then

Comment on lines 181 to 183
Ok(_) => Ok(res.map(Result::unwrap)),
Err(_) => Err(ReadError::Payload {
inner: res.map(|r| Box::new(r.expect_err("matched on error"))),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you need

fn transpose(from: Described<Result<T,E>>) -> Result<Described<T>,Described<E>>

@ss2165 ss2165 force-pushed the ss/push-stplquvkmuwx branch from f32406d to f51da3c Compare October 30, 2025 13:56
@ss2165
Copy link
Member Author

ss2165 commented Oct 30, 2025

It's not obvious to me that Described is worth it.

Agreed - which is why I've put the whole thing in a private module and only exposed DescribedPackage. I'm curious to see if we get more use out of it in future (for adding more debug information as we come across it), but also happy to just take out that commit if you feel strongly.

Edit: now reverted

@ss2165 ss2165 force-pushed the ss/push-stplquvkmuwx branch from f51da3c to fe20cc4 Compare October 31, 2025 13:46
@ss2165 ss2165 requested review from doug-q and removed request for aborgna-q October 31, 2025 13:46
Copy link
Collaborator

@doug-q doug-q left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some nits, but looks great.

/// Error raised while checking for breaking extension version mismatch.
#[deprecated(since = "0.24.1")]
#[error(transparent)]
#[allow(deprecated)]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's just always better to #[expect(deprecated)]?

}

/// High-level description of a HUGR package.
#[derive(Debug, Clone, PartialEq, Default, serde::Serialize)]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's weird to have serialize but no deserialize. I guess we don't need it right now but this is a public type, I prefer to give deserialize too

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm happy to add it for cases where derive just works but there are a couple of to-string serialisations I use for which I don't think it's writing a parser, so won't add for those.


/// Returns the generator(s) of the package modules, if any.
/// Concatenates multiple generators with commas.
pub fn generator(&self) -> Option<String> {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe it doesn't matter, but this will "break" for generators that include commas.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it doesn't matter, this string is not intended to be structured

}

/// Returns an iterator over the packaged extension descriptions.
pub fn packaged_extensions(&self) -> impl Iterator<Item = &Option<ExtensionDesc>> {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wouldn't this be more useful with Item = &ExtensionDesc?

}
}

impl<E: AsRef<crate::Extension>> From<&E> for ExtensionDesc {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we are using AsRef on our interface we should really impl AsRef<Extension> for Extension e.g. https://doc.rust-lang.org/std/primitive.str.html#impl-AsRef%3Cstr%3E-for-str

}
}

#[derive(Debug, Clone, PartialEq, serde::Serialize)]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like Deserialize

serializer.serialize_str(op_string(op_type).as_str())
}

#[derive(Debug, Clone, PartialEq, Default, serde::Serialize)]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

plz deserialize

Comment on lines +183 to +192
Err(e) => Err(ReadError::Payload {
source: Box::new(e),
partial_description: desc,
}),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is the main point of the whole operation, give a partial description on error.
Is it tested? (coverage checker broken for me right now).
This behaviour isn't described in docs (maybe docs on ReadError are enough)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there is coverage, see https://app.codecov.io/gh/CQCL/hugr/pull/2639?src=pr&el=tree&filepath=hugr-core/src/envelope.rs#1b6c34164c5688f367beb900f3954593-R182

a full integration test of the behaviour is included in the follow up PR #2650 via cli tests

I will add docs, thanks

@ss2165 ss2165 force-pushed the ss/push-stplquvkmuwx branch from fe20cc4 to 334e96b Compare November 3, 2025 10:21
@ss2165 ss2165 enabled auto-merge November 3, 2025 10:22
@ss2165 ss2165 added this pull request to the merge queue Nov 3, 2025
Merged via the queue into main with commit 349dd61 Nov 3, 2025
30 of 31 checks passed
@ss2165 ss2165 deleted the ss/push-stplquvkmuwx branch November 3, 2025 10:33
This was referenced Nov 3, 2025
github-merge-queue bot pushed a commit that referenced this pull request Nov 3, 2025
Closes #2603 

See base PR for more context: #2639

The `describe` CLI command loads the package with a description and:
- If successful prints the description as tables to output
- If error prints partial description to output and error to stderror
- If --json flag is passed outputs as json instead, for use with other
tools


## Help
<img width="762" height="932" alt="image"
src="https://github.com/user-attachments/assets/adf53b06-652a-4967-afcb-88e9cabfaad8"
/>


## Summary
<img width="1056" height="337" alt="image"
src="https://github.com/user-attachments/assets/f0882eb3-2b80-421d-9de7-614dc4e42c7c"
/>


## JSON (nushell render)

<img width="1449" height="261" alt="image"
src="https://github.com/user-attachments/assets/7a2728cc-a0d4-417c-b938-06b26d409d47"
/>

---------

Co-authored-by: Alec Edgington <[email protected]>
github-merge-queue bot pushed a commit that referenced this pull request Nov 3, 2025
## 🤖 New release

* `hugr-model`: 0.24.0 -> 0.24.1 (✓ API compatible changes)
* `hugr-core`: 0.24.0 -> 0.24.1 (✓ API compatible changes)
* `hugr-llvm`: 0.24.0 -> 0.24.1 (✓ API compatible changes)
* `hugr-passes`: 0.24.0 -> 0.24.1 (✓ API compatible changes)
* `hugr-persistent`: 0.3.1 -> 0.3.2 (✓ API compatible changes)
* `hugr`: 0.24.0 -> 0.24.1 (✓ API compatible changes)
* `hugr-cli`: 0.24.0 -> 0.24.1 (✓ API compatible changes)

<details><summary><i><b>Changelog</b></i></summary><p>

## `hugr-model`

<blockquote>

##
[0.24.1](hugr-model-v0.24.0...hugr-model-v0.24.1)
- 2025-11-03

### Bug Fixes

- Correct conversion of `table::Term::Tuple` to `ast::Term`
([#2653](#2653))
</blockquote>

## `hugr-core`

<blockquote>

##
[0.24.1](hugr-core-v0.24.0...hugr-core-v0.24.1)
- 2025-11-03

### Bug Fixes

- validation outside entrypoint, normalize_cfgs w/ nonlocal edges
([#2633](#2633))
- SiblingSubgraph::try_from_nodes for non-entrypoint region
([#2655](#2655))
- Correct conversion of `table::Term::Tuple` to `ast::Term`
([#2653](#2653))

### New Features

- track package descriptions when loading
([#2639](#2639))
- *(cli)* describe sub-command
([#2650](#2650))
</blockquote>

## `hugr-llvm`

<blockquote>

##
[0.24.0](hugr-llvm-v0.23.0...hugr-llvm-v0.24.0)
- 2025-10-13

### New Features

- LLVM lowering for borrow arrays using bitmasks
([#2574](#2574))
- *(py, core, llvm)* add `is_borrowed` op for BorrowArray
([#2610](#2610))

### Refactor

- [**breaking**] consistent inout order in borrow array
([#2621](#2621))
</blockquote>

## `hugr-passes`

<blockquote>

##
[0.24.1](hugr-passes-v0.24.0...hugr-passes-v0.24.1)
- 2025-11-03

### Bug Fixes

- validation outside entrypoint, normalize_cfgs w/ nonlocal edges
([#2633](#2633))
</blockquote>

## `hugr-persistent`

<blockquote>

##
[0.3.2](hugr-persistent-v0.3.1...hugr-persistent-v0.3.2)
- 2025-11-03

### New Features

- *(persistent)* More efficient HugrView iterators for PersistentHugr
([#2595](#2595))
</blockquote>

## `hugr`

<blockquote>

##
[0.24.1](hugr-v0.24.0...hugr-v0.24.1)
- 2025-11-03

### Bug Fixes

- validation outside entrypoint, normalize_cfgs w/ nonlocal edges
([#2633](#2633))
- SiblingSubgraph::try_from_nodes for non-entrypoint region
([#2655](#2655))
- Correct conversion of `table::Term::Tuple` to `ast::Term`
([#2653](#2653))

### New Features

- track package descriptions when loading
([#2639](#2639))
- *(cli)* describe sub-command
([#2650](#2650))
</blockquote>

## `hugr-cli`

<blockquote>

##
[0.24.1](hugr-cli-v0.24.0...hugr-cli-v0.24.1)
- 2025-11-03

### New Features

- track package descriptions when loading
([#2639](#2639))
- *(cli)* describe sub-command
([#2650](#2650))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).
@hugrbot hugrbot mentioned this pull request Nov 3, 2025
github-merge-queue bot pushed a commit that referenced this pull request Nov 4, 2025
## 🤖 New release

* `hugr-model`: 0.24.1 -> 0.24.2
* `hugr-core`: 0.24.1 -> 0.24.2
* `hugr-llvm`: 0.24.1 -> 0.24.2
* `hugr-passes`: 0.24.1 -> 0.24.2 (✓ API compatible changes)
* `hugr`: 0.24.1 -> 0.24.2 (✓ API compatible changes)
* `hugr-cli`: 0.24.1 -> 0.24.2 (✓ API compatible changes)
* `hugr-persistent`: 0.3.2 -> 0.3.3

<details><summary><i><b>Changelog</b></i></summary><p>

## `hugr-model`

<blockquote>

##
[0.24.1](hugr-model-v0.24.0...hugr-model-v0.24.1)
- 2025-11-03

### Bug Fixes

- Correct conversion of `table::Term::Tuple` to `ast::Term`
([#2653](#2653))
</blockquote>

## `hugr-core`

<blockquote>

##
[0.24.1](hugr-core-v0.24.0...hugr-core-v0.24.1)
- 2025-11-03

### Bug Fixes

- validation outside entrypoint, normalize_cfgs w/ nonlocal edges
([#2633](#2633))
- SiblingSubgraph::try_from_nodes for non-entrypoint region
([#2655](#2655))
- Correct conversion of `table::Term::Tuple` to `ast::Term`
([#2653](#2653))

### New Features

- track package descriptions when loading
([#2639](#2639))
- *(cli)* describe sub-command
([#2650](#2650))
</blockquote>

## `hugr-llvm`

<blockquote>

##
[0.24.0](hugr-llvm-v0.23.0...hugr-llvm-v0.24.0)
- 2025-10-13

### New Features

- LLVM lowering for borrow arrays using bitmasks
([#2574](#2574))
- *(py, core, llvm)* add `is_borrowed` op for BorrowArray
([#2610](#2610))

### Refactor

- [**breaking**] consistent inout order in borrow array
([#2621](#2621))
</blockquote>

## `hugr-passes`

<blockquote>

##
[0.24.2](hugr-passes-v0.24.1...hugr-passes-v0.24.2)
- 2025-11-03

### Bug Fixes

- ReplaceTypes: operate on whole Hugr, with set_regions
([#2662](#2662))
</blockquote>

## `hugr`

<blockquote>

##
[0.24.2](hugr-v0.24.1...hugr-v0.24.2)
- 2025-11-03

### Bug Fixes

- ReplaceTypes: operate on whole Hugr, with set_regions
([#2662](#2662))
</blockquote>

## `hugr-cli`

<blockquote>

##
[0.24.1](hugr-cli-v0.24.0...hugr-cli-v0.24.1)
- 2025-11-03

### New Features

- track package descriptions when loading
([#2639](#2639))
- *(cli)* describe sub-command
([#2650](#2650))
</blockquote>

## `hugr-persistent`

<blockquote>

##
[0.3.2](hugr-persistent-v0.3.1...hugr-persistent-v0.3.2)
- 2025-11-03

### New Features

- *(persistent)* More efficient HugrView iterators for PersistentHugr
([#2595](#2595))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).
This was referenced Nov 5, 2025
github-merge-queue bot pushed a commit that referenced this pull request Nov 6, 2025
## 🤖 New release

* `hugr-model`: 0.24.2 -> 0.24.3 (✓ API compatible changes)
* `hugr-core`: 0.24.2 -> 0.24.3
* `hugr-llvm`: 0.24.2 -> 0.24.3 (✓ API compatible changes)
* `hugr-passes`: 0.24.2 -> 0.24.3 (✓ API compatible changes)
* `hugr`: 0.24.2 -> 0.24.3 (✓ API compatible changes)
* `hugr-cli`: 0.24.2 -> 0.24.3 (✓ API compatible changes)
* `hugr-persistent`: 0.3.3 -> 0.3.4

<details><summary><i><b>Changelog</b></i></summary><p>

## `hugr-model`

<blockquote>

##
[0.24.1](hugr-model-v0.24.0...hugr-model-v0.24.1)
- 2025-11-03

### Bug Fixes

- Correct conversion of `table::Term::Tuple` to `ast::Term`
([#2653](#2653))
</blockquote>

## `hugr-core`

<blockquote>

##
[0.24.1](hugr-core-v0.24.0...hugr-core-v0.24.1)
- 2025-11-03

### Bug Fixes

- validation outside entrypoint, normalize_cfgs w/ nonlocal edges
([#2633](#2633))
- SiblingSubgraph::try_from_nodes for non-entrypoint region
([#2655](#2655))
- Correct conversion of `table::Term::Tuple` to `ast::Term`
([#2653](#2653))

### New Features

- track package descriptions when loading
([#2639](#2639))
- *(cli)* describe sub-command
([#2650](#2650))
</blockquote>

## `hugr-llvm`

<blockquote>

##
[0.24.3](hugr-llvm-v0.24.2...hugr-llvm-v0.24.3)
- 2025-11-06

### Bug Fixes

- BorrowArray discard handler allows elements to be borrowed
([#2666](#2666))
</blockquote>

## `hugr-passes`

<blockquote>

##
[0.24.3](hugr-passes-v0.24.2...hugr-passes-v0.24.3)
- 2025-11-06

### Bug Fixes

- BorrowArray discard handler allows elements to be borrowed
([#2666](#2666))
</blockquote>

## `hugr`

<blockquote>

##
[0.24.3](hugr-v0.24.2...hugr-v0.24.3)
- 2025-11-06

### Bug Fixes

- BorrowArray discard handler allows elements to be borrowed
([#2666](#2666))
</blockquote>

## `hugr-cli`

<blockquote>

##
[0.24.1](hugr-cli-v0.24.0...hugr-cli-v0.24.1)
- 2025-11-03

### New Features

- track package descriptions when loading
([#2639](#2639))
- *(cli)* describe sub-command
([#2650](#2650))
</blockquote>

## `hugr-persistent`

<blockquote>

##
[0.3.2](hugr-persistent-v0.3.1...hugr-persistent-v0.3.2)
- 2025-11-03

### New Features

- *(persistent)* More efficient HugrView iterators for PersistentHugr
([#2595](#2595))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).
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.

4 participants