Skip to content

🔀 Backport selected main changes for MQT Core 3.8.0 - #1966

Merged
burgholzer merged 34 commits into
v3.xfrom
agent/backport-3-8
Jul 30, 2026
Merged

🔀 Backport selected main changes for MQT Core 3.8.0#1966
burgholzer merged 34 commits into
v3.xfrom
agent/backport-3-8

Conversation

@burgholzer

@burgholzer burgholzer commented Jul 29, 2026

Copy link
Copy Markdown
Member

🤖 AI text below 🤖

Description

Backport selected changes from main to the maintained v3.x branch in preparation for MQT Core 3.8.0.

The commits are kept separate by upstream change wherever practical. The series includes:

v3 compatibility

This backport deliberately preserves the v3 architecture:

Validation

  • configured and built the complete non-MLIR library
  • configured the MLIR build against LLVM/MLIR 21.1.8
  • built and ran focused DD, FoMaC, QDMI driver/registry/device, and QIR tests
  • verified 435 🐛 Make MQT Core composable as a CMake subproject #1965-affected C++ test cases, with two expected device capability skips
  • configured MQT Core as an embedded CMake subproject with all bundled devices disabled by default
  • configured an embedded build with only the DDSIM QDMI device enabled
  • built and ran the device-free registry suite: 11 tests passed
  • focused Python FoMaC suite: 181 passed, two expected non-MLIR skips
  • regenerated Python stubs without a diff
  • complete lint, lockfile validation, commit-signature audit, and git diff --check passed

The pre-existing v3 test configuration still requires llc even when MLIR is disabled. The non-MLIR library build itself succeeds; MLIR/QIR validation used LLVM/MLIR 21.

Checklist

  • The pull request only contains commits that are focused and relevant to this change.
  • I have added appropriate tests that cover the new/changed functionality.
  • I have updated the documentation to reflect these changes.
  • I have added entries to the changelog for any noteworthy additions, changes, fixes, or removals.
  • I have added migration instructions to the upgrade guide (if needed).
  • The changes follow the project's style guidelines and introduce no new warnings.
  • The changes are fully tested and pass the CI checks.
  • I have reviewed my own code changes.

If PR contains AI-assisted content:

  • Any agent that created, edited, or submitted GitHub content was explicitly authorized for that scope, as required by our AI Usage Guidelines.
  • Every agent-authored or agent-edited public text body begins with the visible disclosure 🤖 *AI text below* 🤖 (titles are exempt).
  • I have disclosed AI assistance in the PR description.
  • I confirm that I have personally reviewed and understood all AI-generated content, and accept full responsibility for it.

burgholzer and others added 30 commits July 29, 2026 23:25
🤖 *AI text below* 🤖

- pin the MQT templates action to the released v1.4.0 revision
- opt Core out of generated `AGENTS.md` synchronization
- maintain a Core-specific `AGENTS.md` with real build, test, binding,
MLIR, documentation, changelog, generated-file, and GitHub-workflow
guidance

The shared `docs/ai_usage.md` remains governed by the MQT templates
repository, while Core's operational agent instructions can describe its
actual layout, commands, generated outputs, and safety constraints. This
implements the hybrid AI-guidance strategy without allowing policy to
silently diverge.

- `prek run --files AGENTS.md .github/workflows/templating.yml`
- `git diff --check`
- rendered-template verification confirmed that `synchronize-agents-md:
false` preserves the local `AGENTS.md`; the rendered documentation build
passed

`uvx nox -s lint` was also run earlier, but is currently blocked by an
unrelated existing `ty` diagnostic in
`python/mqt/core/plugins/qiskit/estimator.py:235`.

After this merges, the templating workflow should create its usual
update PR for the shared AI guide, contribution guide, and pull-request
template. Its diff must leave this custom `AGENTS.md` untouched.

(cherry picked from commit ec2a388)
Assisted-by: GPT-5.6 via Codex
This pull request updates the files in this repository with the latest
changes from the MQT Templates repository.
For details on the respective changes, see the
[changelog](https://github.com/munich-quantum-toolkit/templates/blob/main/CHANGELOG.md)
as well as the [upgrade
guide](https://github.com/munich-quantum-toolkit/templates/blob/main/UPGRADING.md).

Co-authored-by: mqt-app[bot] <219534693+mqt-app[bot]@users.noreply.github.com>
(cherry picked from commit b01a4c6)
Assisted-by: GPT-5.6 via Codex
🤖 *AI text below* 🤖

## Summary

- add `.agent/PLANS.md`, a repository-local ExecPlan specification for
substantial agent-driven work
- direct agents to use task-specific ExecPlans for complex features and
significant refactors
- preserve the upstream ExecPlan structure while adding MQT Core
worktree, policy, and validation requirements

## Why

Long-running, cross-cutting Core work benefits from a self-contained
plan that records progress, decisions, discoveries, verification, and
recovery steps. This makes work easier to review, resume, and hand off
between agents without making lightweight fixes bureaucratic.

## Validation

- `prek run --files AGENTS.md .agent/PLANS.md`
- `git diff --check`

`uvx nox -s lint` was also run but remains blocked by the existing
unrelated `ty` diagnostic in
`python/mqt/core/plugins/qiskit/estimator.py:235`.

(cherry picked from commit a228a3d)
Assisted-by: GPT-5.6 via Codex
🤖 *AI text below* 🤖

## Summary

- remove the requirement for checked-in ExecPlans to name a task
worktree and branch
- require repository-relative scope and paths instead
- explicitly prohibit local filesystem paths, developer accounts,
checkout locations, and ephemeral branches

## Why

ExecPlans are committed repository artifacts and must remain portable
across clones, machines, and contributors. The previous wording
encouraged local development setup details to leak into plans.

## Validation

- `prek run --files .agent/PLANS.md`
- `git diff --check`
- `uvx nox -s lint`

(cherry picked from commit b5cb918)
Assisted-by: GPT-5.6 via Codex
🤖 *AI text below* 🤖

Keep cache-producing agent workflows self-contained in each MQT Core
worktree.
This avoids sandbox failures when `uv`, `uvx`, `ccache`, or `sccache`
attempt to
access cache directories outside the active workspace, while leaving
ordinary
contributors free to configure their own caches.

This pull request:

- adds `.agent/run.sh` to run agent commands with worktree-local `uv`,
tool,
  XDG, `prek`, `ccache`, and `sccache` state;
- adds `.agent/clean-caches.sh` for explicit cleanup after a significant
batch
  of work;
- configures the CMake presets to use worktree-local compiler caches
capped at
  4 GiB each;
- updates `AGENTS.md` to require the wrapper for cache-producing agent
commands
  and document cleanup expectations;
- deliberately does not set `tool.uv.cache-dir` in `pyproject.toml`, so
  non-agent workflows retain their preferred cache configuration.

The cleanup helper targets only the worktree-local `.cache` directory
and leaves
build trees and other worktree state intact.

- `./.agent/run.sh prek run --files AGENTS.md CMakePresets.json
.agent/run.sh
  .agent/clean-caches.sh pyproject.toml`
- `./.agent/run.sh uvx nox -s lint`
- shell syntax checks for both helper scripts
- CMake preset discovery
- local `uv` and `ccache` configuration checks
- focused CMake configure and build using the localized compiler cache
- cleanup verification confirming that build output remains intact
- `git diff --check origin/main...HEAD`

- [x] The pull request only contains commits that are focused and
relevant to
  this change.
- [x] I have added appropriate tests that cover the new/changed
functionality,
  or documented why automated tests are not needed.
- [x] I have updated the documentation to reflect these changes.
- [x] The changes follow the project's style guidelines and introduce no
new
  warnings.
- [x] The changes are fully tested and pass the relevant checks.
- [x] I have reviewed my own code changes.

**If PR contains AI-assisted content:**

- [x] Any agent that created, edited, or submitted GitHub content was
explicitly
  authorized for that scope, as required by our AI Usage Guidelines.
- [x] Every agent-authored or agent-edited public text body begins with
the
  visible disclosure `🤖 *AI text below* 🤖` (titles are exempt).
- [x] AI-assisted commits include an
  `Assisted-by: [Model Name] via [Tool Name]` footer.
- [x] I confirm that I have personally reviewed and understood all
AI-generated
  content, and accept full responsibility for it.

(cherry picked from commit 85851b3)
Assisted-by: GPT-5.6 via Codex
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[scikit-build-core](https://redirect.github.com/scikit-build/scikit-build-core)
([changelog](https://scikit-build-core.readthedocs.io/en/latest/changelog.html))
| `~=0.12` → `~=1.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/scikit-build-core/1.0.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/scikit-build-core/0.12.2/1.0.3?slim=true)
|

---

### Release Notes

<details>
<summary>scikit-build/scikit-build-core (scikit-build-core)</summary>

###
[`v1.0.3`](https://redirect.github.com/scikit-build/scikit-build-core/releases/tag/v1.0.3):
Version 1.0.3

[Compare
Source](https://redirect.github.com/scikit-build/scikit-build-core/compare/v1.0.2...v1.0.3)

This patch release polishes the setuptools compatibility plugin:
`config_settings` are now threaded through to the build command, the
source tree stays clean in strict editable mode, and the `SubCommand`
protocol is fully implemented.

Fixes:

- Complete the setuptools `SubCommand` protocol by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1502](https://redirect.github.com/scikit-build/scikit-build-core/issues/1502)
- Thread `config_settings` to the build command by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1499](https://redirect.github.com/scikit-build/scikit-build-core/issues/1499)
- Keep source tree clean in strict editable mode by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1501](https://redirect.github.com/scikit-build/scikit-build-core/issues/1501)

Documentation:

- Put uv first in installer tabs and add it to config-settings by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1507](https://redirect.github.com/scikit-build/scikit-build-core/issues/1507)
- List choices for Literal options in the README table by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1506](https://redirect.github.com/scikit-build/scikit-build-core/issues/1506)
- Touch up README options tables, setuptools docs by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1504](https://redirect.github.com/scikit-build/scikit-build-core/issues/1504)
- Show the projects list as a card grid with language/binding badges by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1503](https://redirect.github.com/scikit-build/scikit-build-core/issues/1503)
- Add high-star projects to the known projects list by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1497](https://redirect.github.com/scikit-build/scikit-build-core/issues/1497)

CI and testing:

- Make linkcheck retry timeouts from slow hosts by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1505](https://redirect.github.com/scikit-build/scikit-build-core/issues/1505)
- Forward `-C` config-settings in downstream editable install by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1498](https://redirect.github.com/scikit-build/scikit-build-core/issues/1498)

**Full Changelog**:
<scikit-build/scikit-build-core@v1.0.2...v1.0.3>

###
[`v1.0.2`](https://redirect.github.com/scikit-build/scikit-build-core/releases/tag/v1.0.2):
Version 1.0.2

[Compare
Source](https://redirect.github.com/scikit-build/scikit-build-core/compare/v1.0.1...v1.0.2)

This patch release fixes redirect editable installs so that PEP 302
import hooks (such as `beartype.claw`) that register a `sys.path_hooks`
entry are honored for redirected modules.

Fixes:

- Resolve redirected modules through `sys.path_hooks` by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1493](https://redirect.github.com/scikit-build/scikit-build-core/issues/1493)

Internal:

- Stop using deprecated `build.util.project_wheel_metadata` in
[#&#8203;1494](https://redirect.github.com/scikit-build/scikit-build-core/issues/1494)

**Full Changelog**:
<scikit-build/scikit-build-core@v1.0.1...v1.0.2>

###
[`v1.0.1`](https://redirect.github.com/scikit-build/scikit-build-core/releases/tag/v1.0.1):
Version 1.0.1

[Compare
Source](https://redirect.github.com/scikit-build/scikit-build-core/compare/v1.0.0...v1.0.1)

<!-- Release notes generated using configuration in .github/release.yml
at main -->

This patch release fixes two bugs: shared namespace packages were being
truncated in redirect editable installs, and the wheel timestamp clamp
could overflow on 32-bit `time_t` platforms.

Fixes:

- Don't truncate shared namespaces in redirect mode by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1483](https://redirect.github.com/scikit-build/scikit-build-core/issues/1483)
- Wheel timestamp clamp overflows on 32-bit `time_t` platforms by
[@&#8203;henryiii](https://redirect.github.com/henryiii) in
[#&#8203;1484](https://redirect.github.com/scikit-build/scikit-build-core/issues/1484)

Internal:

- Update pre-commit hooks in
[#&#8203;1480](https://redirect.github.com/scikit-build/scikit-build-core/issues/1480)

**Full Changelog**:
<scikit-build/scikit-build-core@v1.0.0...v1.0.1>

###
[`v1.0.0`](https://redirect.github.com/scikit-build/scikit-build-core/releases/tag/v1.0.0):
Version 1.0.0

[Compare
Source](https://redirect.github.com/scikit-build/scikit-build-core/compare/v0.12.2...v1.0.0)

We've worked through over 100 issues and ran extensive review sweeps,
fixing over 90 bugs and adding 40+ features! We've added support for PEP
803 (free-threaded stable ABI), PEP 808 (partially dynamic metadata),
PEP 829 (`.start` files), and experimental PEP 817 (variants). Editable
installs are much better, with lots of edge cases fixed, like namespace
packages and resource discovery. For rebuilds, which are still
experimental, loaders expose a manual `rebuild()`, inplace mode now
supports rebuilds, and rebuilds can optionally target a persistent
install tree (which removes several caveats). The setuptools and
hatchling plugins are no longer experimental and Hatchling supports
editable installs. There's a new unified `scikit-build` CLI, including
an `init` command to scaffold new projects. Wheels can be reproducible.
Dynamic metadata follows a spec with entry-point discovery and uses
`[[tool.dynamic-metadata]]`, and you can write your own plugins. There
are new settings: an `env` table for setting environment variables,
`install.targets`, `force-include` for SDists and wheels,
`sdist.resolve-symlinks`, and a `${SKBUILD_<TREE>_DIR}` prefix for
targeting wheel trees; existing settings gained `sdist.inclusion-mode =
"explicit"` and list-valued `cmake.build-type`. Imports are lazy on
Python 3.15+ (PEP 810), making CLI and backend startup faster. Lots of
documentation has been added and updated, along with new examples and
samples. We've also polished f2py-cmake and cython-cmake.

As (almost) always, if you set a minimum-version, your build should be
unaffected. Behavior changes to be aware of: SDists now resolve symlinks
by default, with an `sdist.resolve-symlinks` setting providing `"all"`,
`"external"`, `"none"`, and `"classic"` modes. The old names of renamed
configuration fields (`cmake.minimum-version`, `ninja.minimum-version`,
`cmake.verbose`, and `cmake.targets`) now error unless `minimum-version`
is set, and the deprecated `tool.scikit-build.metadata` table warns if
minimum-version is not set. The empty `pyproject` extra was removed;
installers like pip, build, and uv merely warn if you still request it.

Also see [the announcement
post](https://iscinumpy.dev/post/scikit-build-core-1-0).

Features:

- CLI:
- unified `scikit-build` command with submodules as subcommands in
[#&#8203;1355](https://redirect.github.com/scikit-build/scikit-build-core/issues/1355)
- add `init` command to scaffold starter projects in
[#&#8203;1357](https://redirect.github.com/scikit-build/scikit-build-core/issues/1357)
- Configuration providers:
- entry-point configuration providers in
[#&#8203;1406](https://redirect.github.com/scikit-build/scikit-build-core/issues/1406)
- New settings:
- `env`: settable environment variables in
[#&#8203;1377](https://redirect.github.com/scikit-build/scikit-build-core/issues/1377)
(replaces
[#&#8203;1370](https://redirect.github.com/scikit-build/scikit-build-core/issues/1370),
unreleased)
- `install.targets` for custom install targets in
[#&#8203;1371](https://redirect.github.com/scikit-build/scikit-build-core/issues/1371)
- `sdist.force-include`, `wheel.force-include` to map files to include
in
[#&#8203;1364](https://redirect.github.com/scikit-build/scikit-build-core/issues/1364);
entries are served live in redirect editable installs in
[#&#8203;1441](https://redirect.github.com/scikit-build/scikit-build-core/issues/1441)
- `wheel.reproducible` allows building a reproducible wheel (with some
setup) in
[#&#8203;1389](https://redirect.github.com/scikit-build/scikit-build-core/issues/1389)
- `editable.rebuild-dir` at a persistent install tree (opt-in) in
[#&#8203;1375](https://redirect.github.com/scikit-build/scikit-build-core/issues/1375)
- Updated settings:
- `cmake.build-type` now can be a list for multiple builds in
[#&#8203;1386](https://redirect.github.com/scikit-build/scikit-build-core/issues/1386)
- `wheel.packages` can now include single module files in
[#&#8203;1395](https://redirect.github.com/scikit-build/scikit-build-core/issues/1395)
- `cmake.build-type` honors `CMAKE_BUILD_TYPE` from the environment in
[#&#8203;1372](https://redirect.github.com/scikit-build/scikit-build-core/issues/1372)
- add `"explicit"` SDist inclusion-mode (opt-in include) in
[#&#8203;1249](https://redirect.github.com/scikit-build/scikit-build-core/issues/1249)
- resolve symlinks by default by
[@&#8203;Doekin](https://redirect.github.com/Doekin) in
[#&#8203;1265](https://redirect.github.com/scikit-build/scikit-build-core/issues/1265),
with `"external"`, `"classic"`, and `"none"` (store directory symlinks)
modes in
[#&#8203;1434](https://redirect.github.com/scikit-build/scikit-build-core/issues/1434)
- support PEP 803, the free-threaded stable ABI, including the combined
`abi3.abi3t` wheel tag, in
[#&#8203;1269](https://redirect.github.com/scikit-build/scikit-build-core/issues/1269)
and
[#&#8203;1382](https://redirect.github.com/scikit-build/scikit-build-core/issues/1382)
- Other settings:
- add `${SKBUILD_<TREE>_DIR}` prefix for wheel-tree targeting in
[#&#8203;1379](https://redirect.github.com/scikit-build/scikit-build-core/issues/1379)
- add `{name}` placeholder for template-formatted settings in
[#&#8203;1445](https://redirect.github.com/scikit-build/scikit-build-core/issues/1445)
- warn on the deprecated `tool.scikit-build.metadata` table, and error
on renamed config fields, unless an old minimum-version is set, in
[#&#8203;1397](https://redirect.github.com/scikit-build/scikit-build-core/issues/1397)
and
[#&#8203;1399](https://redirect.github.com/scikit-build/scikit-build-core/issues/1399)
- Dynamic metadata:
- support `[[tool.dynamic-metadata]]` in
[#&#8203;1390](https://redirect.github.com/scikit-build/scikit-build-core/issues/1390)
and
[#&#8203;1416](https://redirect.github.com/scikit-build/scikit-build-core/issues/1416)
- honor the `dynamic_wheel` hook when building SDists in
[#&#8203;1433](https://redirect.github.com/scikit-build/scikit-build-core/issues/1433)
- emit METADATA 2.6 for PEP 808 partially-dynamic fields, via vendored
pyproject-metadata 0.12.1, in
[#&#8203;1454](https://redirect.github.com/scikit-build/scikit-build-core/issues/1454)
and
[#&#8203;1455](https://redirect.github.com/scikit-build/scikit-build-core/issues/1455)
- Experimental:
- add experimental PEP 817 variant support in
[#&#8203;1284](https://redirect.github.com/scikit-build/scikit-build-core/issues/1284)
- Editable:
- PEP 829 (`.start` files) support in
[#&#8203;1297](https://redirect.github.com/scikit-build/scikit-build-core/issues/1297)
- expose `rebuild()` on redirect and inplace module loaders in
[#&#8203;1403](https://redirect.github.com/scikit-build/scikit-build-core/issues/1403)
and
[#&#8203;1411](https://redirect.github.com/scikit-build/scikit-build-core/issues/1411)
- Plugins:
- de-experimentalize the setuptools and hatchling plugins in
[#&#8203;1358](https://redirect.github.com/scikit-build/scikit-build-core/issues/1358)
- include plugin extras for setuptools/hatchling, and warn if the extra
is missing from `build-system.requires`, in
[#&#8203;1290](https://redirect.github.com/scikit-build/scikit-build-core/issues/1290)
and
[#&#8203;1344](https://redirect.github.com/scikit-build/scikit-build-core/issues/1344)
- Hatchling plugin:
- editable install support in
[#&#8203;1282](https://redirect.github.com/scikit-build/scikit-build-core/issues/1282)
- reject `wheel.exclude` as unsupported in
[#&#8203;1431](https://redirect.github.com/scikit-build/scikit-build-core/issues/1431)
- Setuptools plugin:
- inplace editable support in
[#&#8203;1278](https://redirect.github.com/scikit-build/scikit-build-core/issues/1278)
- add `cmake_install_dir` and `cmake_install_target` in
[#&#8203;1286](https://redirect.github.com/scikit-build/scikit-build-core/issues/1286)
and
[#&#8203;1374](https://redirect.github.com/scikit-build/scikit-build-core/issues/1374)
- add `cmake_process_manifest_hook` in
[#&#8203;1285](https://redirect.github.com/scikit-build/scikit-build-core/issues/1285)
- allow `cmake_with_sdist=False` in
[#&#8203;1287](https://redirect.github.com/scikit-build/scikit-build-core/issues/1287)
- honor `SKBUILD_CONFIGURE_OPTIONS` and `SKBUILD_BUILD_OPTIONS` in the
wrapper in
[#&#8203;1394](https://redirect.github.com/scikit-build/scikit-build-core/issues/1394)

Fixes:

- Settings:
- accept override-only settings via config-settings in
[#&#8203;1307](https://redirect.github.com/scikit-build/scikit-build-core/issues/1307)
- flag scalar config-settings assignment to dict fields in
[#&#8203;1435](https://redirect.github.com/scikit-build/scikit-build-core/issues/1435)
- entry-point providers: treat their config as dynamic for validation
gates, with robust signature dispatch and duplicate-name handling, in
[#&#8203;1424](https://redirect.github.com/scikit-build/scikit-build-core/issues/1424)
and
[#&#8203;1425](https://redirect.github.com/scikit-build/scikit-build-core/issues/1425)
- allow `=` inside dict-style env var values like `SKBUILD_CMAKE_DEFINE`
in
[#&#8203;1311](https://redirect.github.com/scikit-build/scikit-build-core/issues/1311)
- accept plain strings for list/table fields in config-settings (e.g.
`-Cwheel.packages=src/pkg`) in
[#&#8203;1323](https://redirect.github.com/scikit-build/scikit-build-core/issues/1323)
- don't crash on overrides mixing `inherit` with top-level fields in
[#&#8203;1323](https://redirect.github.com/scikit-build/scikit-build-core/issues/1323)
- apply `if.state` overrides when computing `get_requires_for_build_*`
in
[#&#8203;1322](https://redirect.github.com/scikit-build/scikit-build-core/issues/1322)
- render `{root}` correctly in templated settings such as `build-dir` in
[#&#8203;1318](https://redirect.github.com/scikit-build/scikit-build-core/issues/1318)
- JSON schema no longer rejects valid `cmake.define` lists in
[#&#8203;1306](https://redirect.github.com/scikit-build/scikit-build-core/issues/1306)
- Dynamic metadata:
- load provider-path providers via a meta-path finder in
[#&#8203;1366](https://redirect.github.com/scikit-build/scikit-build-core/issues/1366)
- correct the `DynamicMetadataProtocol.dynamic_metadata` signature in
[#&#8203;1365](https://redirect.github.com/scikit-build/scikit-build-core/issues/1365)
- combine same-field `dynamic_wheel` reports with OR in
[#&#8203;1437](https://redirect.github.com/scikit-build/scikit-build-core/issues/1437)
- error on unknown keys in `regex`/`template` plugin settings instead of
silently ignoring them in
[#&#8203;1319](https://redirect.github.com/scikit-build/scikit-build-core/issues/1319)
- handle typed `vcs_versioning.overrides` in mypy in
[#&#8203;1388](https://redirect.github.com/scikit-build/scikit-build-core/issues/1388)
- Wheel:
- auto-discover namespace packages in wheel builds in
[#&#8203;1385](https://redirect.github.com/scikit-build/scikit-build-core/issues/1385)
- don't error when a `wheel.packages` source is CMake-generated in
[#&#8203;1440](https://redirect.github.com/scikit-build/scikit-build-core/issues/1440)
- use `Path.as_posix()` for including generated files in SDist/wheel by
[@&#8203;shiftinv](https://redirect.github.com/shiftinv) in
[#&#8203;1381](https://redirect.github.com/scikit-build/scikit-build-core/issues/1381)
- clamp `SOURCE_DATE_EPOCH` to the ZIP timestamp range in
[#&#8203;1423](https://redirect.github.com/scikit-build/scikit-build-core/issues/1423)
- emit installer-compatible `abi3t` wheel tag in
[#&#8203;1380](https://redirect.github.com/scikit-build/scikit-build-core/issues/1380)
- honor `CMAKE_OSX_DEPLOYMENT_TARGET` in the wheel platform tag in
[#&#8203;1338](https://redirect.github.com/scikit-build/scikit-build-core/issues/1338)
- honor an explicit empty `license-files` to disable license collection
in
[#&#8203;1311](https://redirect.github.com/scikit-build/scikit-build-core/issues/1311)
and
[#&#8203;1322](https://redirect.github.com/scikit-build/scikit-build-core/issues/1322)
- write `location = "source"` generated files as UTF-8, don't crash on
subdirectories inside the scripts install dir, and fully prune
consecutive excluded directories in
[#&#8203;1322](https://redirect.github.com/scikit-build/scikit-build-core/issues/1322)
- SDist:
- don't crash on dangling symlinks with `resolve-symlinks = "all"`, and
detect symlink loops when walking the source tree, in
[#&#8203;1341](https://redirect.github.com/scikit-build/scikit-build-core/issues/1341)
and
[#&#8203;1421](https://redirect.github.com/scikit-build/scikit-build-core/issues/1421)
- don't prune directories matched only by glob includes in default
inclusion mode in
[#&#8203;1339](https://redirect.github.com/scikit-build/scikit-build-core/issues/1339)
- Editable:
- make namespace package installs importable, including remapped
namespace packages, in
[#&#8203;1346](https://redirect.github.com/scikit-build/scikit-build-core/issues/1346)
and
[#&#8203;1427](https://redirect.github.com/scikit-build/scikit-build-core/issues/1427)
- fix import subpackage propagation in
[#&#8203;1304](https://redirect.github.com/scikit-build/scikit-build-core/issues/1304)
- don't treat versioned sonames as importable modules in
[#&#8203;1337](https://redirect.github.com/scikit-build/scikit-build-core/issues/1337)
- add symlinked module's real dir to `__path__` in
[#&#8203;1335](https://redirect.github.com/scikit-build/scikit-build-core/issues/1335)
- `importlib.resources.files()` in redirect mode in
[#&#8203;1279](https://redirect.github.com/scikit-build/scikit-build-core/issues/1279)
- recognize Cython `__init__.pxd`/`.pyx` as package indicators by
[@&#8203;vyasr](https://redirect.github.com/vyasr) in
[#&#8203;1292](https://redirect.github.com/scikit-build/scikit-build-core/issues/1292)
- debounce rebuild to once per process in
[#&#8203;1368](https://redirect.github.com/scikit-build/scikit-build-core/issues/1368)
- `rebuild()` no longer hides the build output on failed rebuilds in
[#&#8203;1318](https://redirect.github.com/scikit-build/scikit-build-core/issues/1318)
- refuse to wipe a populated rebuild-dir, and use safe install/build
paths for manual `rebuild()`, in
[#&#8203;1400](https://redirect.github.com/scikit-build/scikit-build-core/issues/1400)
and
[#&#8203;1429](https://redirect.github.com/scikit-build/scikit-build-core/issues/1429)
- only block absolute `wheel.install-dir` for rebuilds in
[#&#8203;1334](https://redirect.github.com/scikit-build/scikit-build-core/issues/1334)
- CMake:
- cap `SKBUILD_PROJECT_VERSION` to four components in
[#&#8203;1369](https://redirect.github.com/scikit-build/scikit-build-core/issues/1369)
- strip flags from sysconfig CC/CXX to just the executable, keeping
compiler wrappers, in
[#&#8203;1331](https://redirect.github.com/scikit-build/scikit-build-core/issues/1331)
and
[#&#8203;1418](https://redirect.github.com/scikit-build/scikit-build-core/issues/1418)
- generator handling: detect two-token `-G Ninja` and `-G` in
`CMAKE_ARGS`, detect multi-config generators set via
`cmake.define.CMAKE_GENERATOR` so the right `--config` is used, and
apply full Ninja handling to `Ninja Multi-Config` in
[#&#8203;1320](https://redirect.github.com/scikit-build/scikit-build-core/issues/1320)
and
[#&#8203;1352](https://redirect.github.com/scikit-build/scikit-build-core/issues/1352)
- free-threaded Windows import library and two-token `-D` parsing in
[#&#8203;1422](https://redirect.github.com/scikit-build/scikit-build-core/issues/1422)
- don't skip the ninja requirement when the generator is forced to Ninja
in
[#&#8203;1442](https://redirect.github.com/scikit-build/scikit-build-core/issues/1442)
- more reliably find the Python library on Windows in
[#&#8203;1310](https://redirect.github.com/scikit-build/scikit-build-core/issues/1310)
- warn when CMake will build a mismatched `x86_64` extension on macOS in
[#&#8203;1404](https://redirect.github.com/scikit-build/scikit-build-core/issues/1404)
- `-DCMAKE_SYSTEM_PROCESSOR` in the CMake args suppresses `ARCHFLAGS`
handling on macOS, as documented, in
[#&#8203;1320](https://redirect.github.com/scikit-build/scikit-build-core/issues/1320)
- comments inside `cmake_minimum_required(...)` no longer break
`cmake.version = "CMakeLists.txt"`, and unparsable files fall back
gracefully in
[#&#8203;1319](https://redirect.github.com/scikit-build/scikit-build-core/issues/1319)
- File API: properly handle `Union` by
[@&#8203;LecrisUT](https://redirect.github.com/LecrisUT) in
[#&#8203;1272](https://redirect.github.com/scikit-build/scikit-build-core/issues/1272);
read the toolchains reply, tolerate optional link fields, and restore
missing `Target.sources`/`InstallRule.type` fields in
[#&#8203;1311](https://redirect.github.com/scikit-build/scikit-build-core/issues/1311)
and
[#&#8203;1319](https://redirect.github.com/scikit-build/scikit-build-core/issues/1319)
- CLI:
- argument parsing and clear errors for common mistakes in
[#&#8203;1426](https://redirect.github.com/scikit-build/scikit-build-core/issues/1426)
- Hatchling plugin:
- ignore hatchling's reserved enable-by-default hook option in
[#&#8203;1419](https://redirect.github.com/scikit-build/scikit-build-core/issues/1419)
- don't double the `wheel.install-dir` prefix, which made wheels
unimportable, in
[#&#8203;1321](https://redirect.github.com/scikit-build/scikit-build-core/issues/1321)
- Setuptools plugin:
- wrapper path and classic scikit-build compatibility fixes in
[#&#8203;1295](https://redirect.github.com/scikit-build/scikit-build-core/issues/1295)
and
[#&#8203;1316](https://redirect.github.com/scikit-build/scikit-build-core/issues/1316)
- protect `SetupError` in
[#&#8203;1293](https://redirect.github.com/scikit-build/scikit-build-core/issues/1293)
- accept `wheel-free-setuptools` extra in the plugin warning in
[#&#8203;1413](https://redirect.github.com/scikit-build/scikit-build-core/issues/1413)
- don't require `editable.mode` for `build_ext --inplace` in
[#&#8203;1432](https://redirect.github.com/scikit-build/scikit-build-core/issues/1432)
- build-type list rejection, `package_dir` editable root, and
free-threaded limited-API gate in
[#&#8203;1428](https://redirect.github.com/scikit-build/scikit-build-core/issues/1428)
- resolve overrides with the correct `wheel`/`editable` state in
[#&#8203;1321](https://redirect.github.com/scikit-build/scikit-build-core/issues/1321)
- Sweeps:
- many further small fixes across settings, wheel, editable, File API,
generator detection, and the plugins from extensive review sweeps in
[#&#8203;1305](https://redirect.github.com/scikit-build/scikit-build-core/issues/1305),
[#&#8203;1306](https://redirect.github.com/scikit-build/scikit-build-core/issues/1306),
[#&#8203;1311](https://redirect.github.com/scikit-build/scikit-build-core/issues/1311),
[#&#8203;1318](https://redirect.github.com/scikit-build/scikit-build-core/issues/1318),
[#&#8203;1319](https://redirect.github.com/scikit-build/scikit-build-core/issues/1319),
[#&#8203;1320](https://redirect.github.com/scikit-build/scikit-build-core/issues/1320),
[#&#8203;1321](https://redirect.github.com/scikit-build/scikit-build-core/issues/1321),
[#&#8203;1322](https://redirect.github.com/scikit-build/scikit-build-core/issues/1322),
and
[#&#8203;1323](https://redirect.github.com/scikit-build/scikit-build-core/issues/1323)

Documentation:

- New guides and FAQs:
- add a workspaces and monorepos guide in
[#&#8203;1444](https://redirect.github.com/scikit-build/scikit-build-core/issues/1444)
- add a Windows debug builds note in
[#&#8203;1450](https://redirect.github.com/scikit-build/scikit-build-core/issues/1450)
- FAQ for IDE IntelliSense / `compile_commands.json` in
[#&#8203;1447](https://redirect.github.com/scikit-build/scikit-build-core/issues/1447)
- explain target output paths on MSVC / multi-config generators in
[#&#8203;1446](https://redirect.github.com/scikit-build/scikit-build-core/issues/1446)
- FAQ on coverage and debugging (gcov/gcovr/GDB) in
[#&#8203;1409](https://redirect.github.com/scikit-build/scikit-build-core/issues/1409)
- tips for shipping a ctypes-loaded shared library in
[#&#8203;1408](https://redirect.github.com/scikit-build/scikit-build-core/issues/1408)
- FAQ for dependency library in `site-packages/bin` or `lib` in
[#&#8203;1393](https://redirect.github.com/scikit-build/scikit-build-core/issues/1393)
- document `cmake.module` entry point and metadata states in
[#&#8203;1360](https://redirect.github.com/scikit-build/scikit-build-core/issues/1360)
- 1.0 refresh:
- dedupe, simplify, and restructure the documentation in
[#&#8203;1448](https://redirect.github.com/scikit-build/scikit-build-core/issues/1448)
- review and refresh documentation for the 1.0 release in
[#&#8203;1402](https://redirect.github.com/scikit-build/scikit-build-core/issues/1402)
- add missing versionadded/versionchanged directives for 1.0 in
[#&#8203;1405](https://redirect.github.com/scikit-build/scikit-build-core/issues/1405)
- refresh stale guidance and version pins in
[#&#8203;1361](https://redirect.github.com/scikit-build/scikit-build-core/issues/1361)
- fix incorrect config keys and stale claims in
[#&#8203;1359](https://redirect.github.com/scikit-build/scikit-build-core/issues/1359)
- remove documented unimplemented search settings in
[#&#8203;1354](https://redirect.github.com/scikit-build/scikit-build-core/issues/1354)
- show config-settings and env var forms in the config reference in
[#&#8203;1347](https://redirect.github.com/scikit-build/scikit-build-core/issues/1347)
- use `-C` instead of `--config-settings` in examples in
[#&#8203;1451](https://redirect.github.com/scikit-build/scikit-build-core/issues/1451)
- minor cleanup and style check in
[#&#8203;1453](https://redirect.github.com/scikit-build/scikit-build-core/issues/1453)
- fix typos and grammar in
[#&#8203;1362](https://redirect.github.com/scikit-build/scikit-build-core/issues/1362)
- Clarifications and fixes:
- clarify `wheel.packages` semantics (top-level, not a find/where) in
[#&#8203;1407](https://redirect.github.com/scikit-build/scikit-build-core/issues/1407)
- address post-merge review notes on entry-point config in
[#&#8203;1438](https://redirect.github.com/scikit-build/scikit-build-core/issues/1438)
- fix `sdist.inclusion-mode` name and dynamic-metadata field requirement
in
[#&#8203;1420](https://redirect.github.com/scikit-build/scikit-build-core/issues/1420)
- clarify README example and unify `cmake_minimum_required` ranges in
[#&#8203;1392](https://redirect.github.com/scikit-build/scikit-build-core/issues/1392)
- improve docs on source in
[#&#8203;1276](https://redirect.github.com/scikit-build/scikit-build-core/issues/1276)
- avoid a common timeout in
[#&#8203;1308](https://redirect.github.com/scikit-build/scikit-build-core/issues/1308)
- Examples:
- use cython-cmake and f2py-cmake in getting started examples in
[#&#8203;1353](https://redirect.github.com/scikit-build/scikit-build-core/issues/1353)
- link `Python::Module` in the Fortran example for CMake 4.x in
[#&#8203;1373](https://redirect.github.com/scikit-build/scikit-build-core/issues/1373)
- Site:
- fix RTD version and render GitHub-style admonitions in
[#&#8203;1410](https://redirect.github.com/scikit-build/scikit-build-core/issues/1410)
- make sphinx-tippy tooltips follow the active theme in
[#&#8203;1349](https://redirect.github.com/scikit-build/scikit-build-core/issues/1349)
- add GitHub icon to header icon row in
[#&#8203;1387](https://redirect.github.com/scikit-build/scikit-build-core/issues/1387)
- add more projects using scikit-build-core, including pyarrow by
[@&#8203;raulcd](https://redirect.github.com/raulcd), in
[#&#8203;1266](https://redirect.github.com/scikit-build/scikit-build-core/issues/1266)
and
[#&#8203;1309](https://redirect.github.com/scikit-build/scikit-build-core/issues/1309)

CI and testing:

- Cover uv as an install frontend via a workspace in
[#&#8203;1443](https://redirect.github.com/scikit-build/scikit-build-core/issues/1443)
- Add Python 3.15 and 3.15t to CI in
[#&#8203;1383](https://redirect.github.com/scikit-build/scikit-build-core/issues/1383)
- Skip heavy test matrix on docs-only changes in
[#&#8203;1356](https://redirect.github.com/scikit-build/scikit-build-core/issues/1356)
- Adapt to setuptools-scm 10 / vcs-versioning 2 warnings in
[#&#8203;1350](https://redirect.github.com/scikit-build/scikit-build-core/issues/1350)
- Exclude pytest 9.1.0 (params-fixture override regression) in
[#&#8203;1329](https://redirect.github.com/scikit-build/scikit-build-core/issues/1329)
- Pin old-CMake Windows rows to windows-2022, add a VS 2026 row in
[#&#8203;1326](https://redirect.github.com/scikit-build/scikit-build-core/issues/1326)
- Reduce test-suite wall-clock time in
[#&#8203;1325](https://redirect.github.com/scikit-build/scikit-build-core/issues/1325)
- Fix Windows `PermissionError` from concurrent wheelhouse lock races,
and clean up incomplete or old editable wheels in the wheelhouse, in
[#&#8203;1283](https://redirect.github.com/scikit-build/scikit-build-core/issues/1283)
and
[#&#8203;1288](https://redirect.github.com/scikit-build/scikit-build-core/issues/1288)
- Secure GitHub Actions workflows in
[#&#8203;1302](https://redirect.github.com/scikit-build/scikit-build-core/issues/1302)
- Use native uv integration in RTD in
[#&#8203;1274](https://redirect.github.com/scikit-build/scikit-build-core/issues/1274)
- Stub macOS lipo arch probe for fake-subprocess tests in
[#&#8203;1313](https://redirect.github.com/scikit-build/scikit-build-core/issues/1313)
and
[#&#8203;1314](https://redirect.github.com/scikit-build/scikit-build-core/issues/1314)
- Migrate beakerlib test to python script by
[@&#8203;LecrisUT](https://redirect.github.com/LecrisUT) in
[#&#8203;1376](https://redirect.github.com/scikit-build/scikit-build-core/issues/1376)

Internal:

- Faster startup via lazy imports (PEP 810) in
[#&#8203;1415](https://redirect.github.com/scikit-build/scikit-build-core/issues/1415)
- Unify wheel build orchestration across backend and hatch plugin in
[#&#8203;1345](https://redirect.github.com/scikit-build/scikit-build-core/issues/1345)
- Rename editable files to `_editable_skbc_<name>` in
[#&#8203;1332](https://redirect.github.com/scikit-build/scikit-build-core/issues/1332)
- Drop the empty `pyproject` extra in
[#&#8203;1398](https://redirect.github.com/scikit-build/scikit-build-core/issues/1398)
- Remove `orjson` from dependencies in
[#&#8203;1333](https://redirect.github.com/scikit-build/scikit-build-core/issues/1333)
- Support `uvx scikit-build-core` too in
[#&#8203;1396](https://redirect.github.com/scikit-build/scikit-build-core/issues/1396)
- Add a utils package by
[@&#8203;LecrisUT](https://redirect.github.com/LecrisUT) in
[#&#8203;1268](https://redirect.github.com/scikit-build/scikit-build-core/issues/1268)
- Simplification cleanups from a repo sweep in
[#&#8203;1312](https://redirect.github.com/scikit-build/scikit-build-core/issues/1312)
- Use local `TYPE_CHECKING = False` instead of importing from typing in
[#&#8203;1412](https://redirect.github.com/scikit-build/scikit-build-core/issues/1412)
- Adapt to better pathspec types in
[#&#8203;1277](https://redirect.github.com/scikit-build/scikit-build-core/issues/1277)

##### New Contributors

- [@&#8203;raulcd](https://redirect.github.com/raulcd) made their first
contribution in
[#&#8203;1266](https://redirect.github.com/scikit-build/scikit-build-core/pull/1266)
- [@&#8203;shiftinv](https://redirect.github.com/shiftinv) made their
first contribution in
[#&#8203;1381](https://redirect.github.com/scikit-build/scikit-build-core/pull/1381)
- [@&#8203;Doekin](https://redirect.github.com/Doekin) made their first
contribution in
[#&#8203;1265](https://redirect.github.com/scikit-build/scikit-build-core/pull/1265)

**Full Changelog**:
<scikit-build/scikit-build-core@v0.12.2...v1.0.0>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "every weekend"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/munich-quantum-toolkit/core).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNjUuMSIsInVwZGF0ZWRJblZlciI6IjQzLjI2NS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJweXRob24iXX0=-->

---------

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Haag <121057143+denialhaag@users.noreply.github.com>
(cherry picked from commit 70ea613)
Assisted-by: GPT-5.6 via Codex
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
(cherry picked from commit b027e18)
Assisted-by: GPT-5.6 via Codex
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
(cherry picked from commit 5788b46)
Assisted-by: GPT-5.6 via Codex
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
(cherry picked from commit 96b6517)
Assisted-by: GPT-5.6 via Codex
This pull request updates the files in this repository with the latest
changes from the MQT Templates repository.
For details on the respective changes, see the
[changelog](https://github.com/munich-quantum-toolkit/templates/blob/main/CHANGELOG.md)
as well as the [upgrade
guide](https://github.com/munich-quantum-toolkit/templates/blob/main/UPGRADING.md).

Co-authored-by: mqt-app[bot] <219534693+mqt-app[bot]@users.noreply.github.com>
(cherry picked from commit da48c79)
Assisted-by: GPT-5.6 via Codex
🤖 *AI text below* 🤖

- Update all reusable workflow pins to the immutable v2.2.1 release
commit.
- Share one scikit-build-core build directory across Python test
sessions.
- Configure coverage.py's `sysmon` core and parallel data collection
centrally.
- Require pytest-cov 7.1 for the coverage configuration.

The shared build directory lets the minimum- and regular-resolution nox
sessions reuse the same CMake and Ninja state. On Windows, reusable
workflows v2.2.1 initialize native MSVC and use Ninja so the existing
job-local `sccache` installation is active.

The final test-only experiment passed on macOS and Windows in [run
30434315809](https://github.com/munich-quantum-toolkit/core/actions/runs/30434315809).
The full Core CI run for the same source revision also passed on every
supported runner in [run
30434310296](https://github.com/munich-quantum-toolkit/core/actions/runs/30434310296).

The strongest reuse was on Windows: after the minimum-resolution builds,
all five regular-resolution sessions completed in 47 seconds and
`sccache` reported a 35.93% hit rate in [run
30404816970](https://github.com/munich-quantum-toolkit/core/actions/runs/30404816970).

- [x] `uv lock --check`
- [x] Full Core lint session
- [x] macOS and Windows performance experiment
- [x] Full Core CI matrix
- [x] No mutable workflow references or benchmark-only workflow remain
- [ ] I confirm that I have personally reviewed and understood all
AI-generated content, and accept full responsibility for it.

---------

Co-authored-by: Daniel Haag <121057143+denialhaag@users.noreply.github.com>
(cherry picked from commit 3e3c7ba)
Assisted-by: GPT-5.6 via Codex
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
(cherry picked from commit 9a9433d)
Assisted-by: GPT-5.6 via Codex
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
(cherry picked from commit 32a5226)
Assisted-by: GPT-5.6 via Codex
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
(cherry picked from commit 54b264e)
Assisted-by: GPT-5.6 via Codex
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
(cherry picked from commit afd855b)
Assisted-by: GPT-5.6 via Codex
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
(cherry picked from commit 07fafad)
Assisted-by: GPT-5.6 via Codex
🤖 *AI text below* 🤖

Complete the public `qdmi::toString` mappings for the child-device
session parameter and device property introduced with child-device
support. This keeps diagnostics and property-name formatting exhaustive
for the current QDMI enum surface.

This small fix was identified while reviewing #1912 and is extracted
because it has no dependency on configurable device discovery. The
existing child-device changelog entry now also attributes this follow-up
to #1952 and retains the original human author attribution.

- Focused child-device string-conversion tests: 2 passed
- Complete FoMaC C++ test binary: 171 passed
- `uvx nox -s lint`
- `git diff --check`

- [x] The pull request only contains commits that are focused and
relevant to this change.
- [x] I have added appropriate tests that cover the changed
functionality.
- [x] Documentation and migration guidance are not needed for this
diagnostic-string completion.
- [x] The existing changelog entry includes this PR and all human
authors.
- [x] The change follows the project's style guidelines and introduces
no new warnings.
- [x] The changes are fully tested and pass the relevant local checks.
- [x] I have reviewed my own code changes.

**If PR contains AI-assisted content:**

- [x] Any agent that created, edited, or submitted GitHub content was
explicitly authorized for that scope, as required by our [AI Usage
Guidelines](https://github.com/munich-quantum-toolkit/core/blob/main/docs/ai_usage.md).
- [x] Every agent-authored or agent-edited public text body begins with
the visible disclosure `🤖 *AI text below* 🤖` (titles are exempt).
- [x] AI-assisted commits include an `Assisted-by: [Model Name] via
[Tool Name]` footer.
- [x] I confirm that I have personally reviewed and understood all
AI-generated content, and accept full responsibility for it.

(cherry picked from commit 537a694)
Assisted-by: GPT-5.6 via Codex
🤖 *AI text below* 🤖

## Description

CMake 4.3 writes a `cmake_test_discovery_*.json` bookkeeping file to the
directory passed to `gtest_discover_tests(WORKING_DIRECTORY ...)`. Our
test helpers passed source directories there because the same argument
also controls the runtime working directory of each discovered test. As
a result, configuring and building tests could dirty the source tree.

Run GoogleTest discovery from the current binary directory so the
bookkeeping file remains a build artifact. Preserve the existing runtime
working directory by setting the discovered tests' `WORKING_DIRECTORY`
property separately. The property name is deferred through a generator
expression so CMake's argument parser does not interpret it as a second
discovery option.

This is extracted from #1912 because it is independent of the QDMI
configuration work.

## Validation

- Configured and built representative targets with CMake 4.3.2.
- Confirmed that no `cmake_test_discovery_*.json` files appear outside
`build/`.
- Confirmed that the ordinary helper still runs a FoMaC test from its
source directory.
- Confirmed that the custom-working-directory helper still runs an IR
test from its configured build directory.
- `uvx nox -s lint`
- `git diff --check`

## Checklist

- [x] The pull request only contains commits that are focused and
relevant to this change.
- [x] I have added appropriate tests that cover the new/changed
functionality. (Existing tests exercise both helper variants.)
- [x] I have updated the documentation to reflect these changes. (No
user-facing documentation change is needed.)
- [x] I have added entries to the changelog for any noteworthy
additions, changes, fixes, or removals. (Not user-facing.)
- [x] I have added migration instructions to the upgrade guide (if
needed). (No migration is needed.)
- [x] The changes follow the project's style guidelines and introduce no
new warnings.
- [x] The changes are fully tested and pass the CI checks. (Local checks
pass; CI is pending.)
- [x] I have reviewed my own code changes.

**If PR contains AI-assisted content:**

- [x] Any agent that created, edited, or submitted GitHub content was
explicitly authorized for that scope, as required by our [AI Usage
Guidelines](https://github.com/munich-quantum-toolkit/core/blob/main/docs/ai_usage.md).
- [x] Every agent-authored or agent-edited public text body begins with
the visible disclosure `🤖 *AI text below* 🤖` (titles are exempt).
- [x] AI-assisted commits include an `Assisted-by: [Model Name] via
[Tool Name]` footer.
- [x] I confirm that I have personally reviewed and understood all
AI-generated content, and accept full responsibility for it.

(cherry picked from commit d14b33f)
Assisted-by: GPT-5.6 via Codex
🤖 *AI text below* 🤖

## Description

This updates the locally maintained MQT Core agent guide with lessons
from
recent reviews:

- keep tests in the corresponding test tree, organized by the subsystem
that
owns the behavior, and reserve subprocess tests for genuine CLI
contracts;
- avoid promoting optional production tools into the default build
solely for
  testing; and
- keep MLIR pass, pipeline, and option descriptions aligned with their
actual
  scope, defaults, limitations, and failure modes.

It also keeps agent reviews focused on substantive contribution quality.
The
shared human-facing AI policy is being updated separately in
munich-quantum-toolkit/templates#383.

## Checklist

- [x] The pull request only contains commits that are focused and
relevant to this change.
- [x] No behavioral tests are needed for this documentation-only change.
- [x] I have updated the documentation to reflect these changes.
- [x] No changelog entry is needed for this internal agent-guide update.
- [x] No migration instructions are needed.
- [x] The changes follow the project's style guidelines and introduce no
new warnings.
- [x] The full local lint suite passes.
- [x] I have reviewed my own code changes.

**If PR contains AI-assisted content:**

- [x] The agent-managed GitHub actions were explicitly authorized for
this scope.
- [x] This agent-authored PR description begins with the required
visible disclosure.
- [x] I confirm that I have reviewed and understood the AI-generated
content and accept full responsibility for it.

(cherry picked from commit 7c8aeb2)
Assisted-by: GPT-5.6 via Codex
🤖 *AI text below* 🤖

## Description

Simplify the cibuildwheel configuration after the reusable packaging
workflow
moved to cibuildwheel v4:

- remove the unsupported `cp313t-*` skip selector;
- rely on cibuildwheel v4's built-in ABI3 audit instead of appending a
duplicate
  audit to the repair command.

The generic `cp3??t-*` test skip remains because test dependencies do
not yet
provide the required free-threaded wheels. Consequently, `cp314t`
continues to
be built but is not tested in the wheel job.

The corresponding migration guidance is documented in

[workflows#424](munich-quantum-toolkit/workflows#424).

## Validation

- `uvx --from cibuildwheel==4.1.0 cibuildwheel --platform macos
--print-build-identifiers .`
- `uvx nox --non-interactive -s lint`
- `git diff --check`

## Checklist

- [x] The pull request only contains commits that are focused and
relevant to
  this change.
- [x] Tests are not applicable to this build-configuration cleanup.
- [x] Documentation, changelog, and upgrade-guide changes are not needed
in
  this consumer repository; migration guidance lives in workflows#424.
- [x] The changes follow the project's style guidelines and introduce no
new
  warnings.
- [x] The local validation checks pass.
- [x] I have reviewed the proposed changes.

**If PR contains AI-assisted content:**

- [x] The agent was explicitly authorized to create these pull requests.
- [x] This body begins with the required visible disclosure.
- [x] The AI-assisted commit includes an
  `Assisted-by: GPT-5.6 via Codex` footer.
- [x] I confirm that I have personally reviewed and understood all
AI-generated
  content, and accept full responsibility for it.

(cherry picked from commit 369e4ae)
Assisted-by: GPT-5.6 via Codex
🤖 *AI text below* 🤖

## Summary

- pin the templating workflow to the exact v1.4.2 release commit
- apply the generated Release Drafter schema migration and AI-disclosure
policy updates
- rename the custom Core category to `CI & Tooling` and include the
`tooling` label

This supersedes the stale v1.4.1-generated changes in #1963. In
particular, rendering v1.4.2 no longer changes the MLIR dependency
semantics in `docs/installation.md`.

## Validation

- `./.agent/run.sh uvx nox --non-interactive -s lint`
- `git diff --check`
- rendered from signed release commit
`d0c5adb86d19a5095f871cb6184cfdab298e943c`

## AI assistance

GPT-5.6 via Codex rendered the released templates, prepared the rollout
changes, and ran the validation. I reviewed the resulting diff and
checks.

(cherry picked from commit df4bd76)
Assisted-by: GPT-5.6 via Codex
Backport-of: 85a65460dd98a841f47fa44d016181ad55f31e55
Assisted-by: GPT-5.6 via Codex
🤖 *AI text below* 🤖

## Summary
- Add `ThreeQubitGateMatrix` / `makeThreeQubitGateDD` for direct
bottom-up DD construction of three-qubit gates (same style as
`makeGateDD` / `makeTwoQubitGateDD`), starting with RCCX via
`opToThreeQubitGateMatrix`.
- Use MSB-among-operands bit order for three-qubit matrices
(`targets[0]` = high bit), matching `makeTwoQubitGateDD` and QCO
(`embed` / `CtrlOp`); RCCX is the `5/6/7` form (not the Qiskit
little-endian `3/5/7` labeling).
- Route RCCX through the new path in `getStandardOperationDD` instead of
the multiply-based construction.
- Share control-wrapping, range checks, and terminal materialization
helpers across 1q/2q/3q gate DD builders.
- Wire QCO `buildFunctionality` / `simulate` dense path through
`makeThreeQubitGateDD` for 3-wire unitaries (plain copy; full-width
`makeDDFromMatrix` still remaps QCO MSB → global DD LSB).
- Consolidate RCCX DD construction tests (target permutations, overload
wrappers, extra pos/neg controls) and cover partial-width 3q dense `inv`
in QCO DD functionality tests.

## Checklist

<!---
This checklist serves as a reminder of a couple of things that ensure
your pull request will be merged swiftly.
-->

- [x] The pull request only contains commits that are focused and
relevant to this change.
- [x] I have added appropriate tests that cover the new/changed
functionality.
- [x] I have updated the documentation to reflect these changes.
- [x] I have added entries to the changelog for any noteworthy
additions, changes, fixes, or removals.
- [ ] I have added migration instructions to the upgrade guide (if
needed).
- [ ] The changes follow the project's style guidelines and introduce no
new warnings.
- [ ] The changes are fully tested and pass the CI checks.
- [x] I have reviewed my own code changes.

**If PR contains AI-assisted content:**

- [x] Any agent that created, edited, or submitted GitHub content was
explicitly authorized for that scope, as required by our [AI Usage
Guidelines](https://github.com/munich-quantum-toolkit/core/blob/main/docs/ai_usage.md).
- [x] Every agent-authored or agent-edited public text body begins with
the visible disclosure `🤖 *AI text below* 🤖` (titles are exempt).
- [ ] AI-assisted commits include an `Assisted-by: [Model Name] via
[Tool Name]` footer.
- [x] I confirm that I have personally reviewed and understood all
AI-generated content, and accept full responsibility for it.

---------

Signed-off-by: Lukas Burgholzer <burgholzer@me.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Lukas Burgholzer <burgholzer@me.com>
Backport-of: b43afaf
Assisted-by: GPT-5.6 via Codex
First contribution to UnitaryHACK for me! 🎉 And man, I've enjoyed
working on this one! 😀

> [!NOTE]
> The current PR still does not cover all the functionality proposed in
the #1695 issue. In particular, the support for QIR adaptive base
modules and strings is not yet implemented. But the current solution is
ready for review.

There are two main pieces of work:
1. The introduction of an MQT Core QIR JIT library (`MQT::CoreQIRJIT`,
`src/qir/jit`). This library contains almost all of the previous
`Runner.cpp` code: LLVM JIT initialization, QIR runtime symbols
registration, and program execution. Compared to that previous Runner
code, it also lets you parse an IR directly from a string, and not only
from a file. The main purpose of the QIR JIT library is to encapsulate
the LLVM JIT code so that it can also be used from the QDMI device. The
interface is a `qir::jit::Session` type that can be constructed from an
input file or from a byte string (text for LLVM assembly or binary for
LLVM bitcode), and then run with or without arguments (e.g., the Runner
CLI can run a JIT program with arguments, and the QDMI device without
arguments).
2. The job submission in `Device.cpp`. By using the MQT Core QIR JIT
library, the device can just run a JIT program, get the results, and
process them (filter zero and one addresses, sort the addresses, and
transform the measurements into a bit string).

The new functionality is tested via two tests in
`results_sampling_test.cpp`, one that exercises the QIR base module
path, and the other that exercises the QIR base string path.

For this PR I have used Claude Opus 4.7, mainly from a CLion terminal,
and for different purposes: from understanding existing code, to
drafting code snippets, catching bugs and typos, running clang-format
and clang-tidy and proposing fixes for clang-tidy warnings, reviewing
wording in commit messages and docs...

Fixes #1695

<!---
This checklist serves as a reminder of a couple of things that ensure
your pull request will be merged swiftly.
-->

- [X] The pull request only contains commits that are focused and
relevant to this change.
- [X] I have added appropriate tests that cover the new/changed
functionality.
- [X] I have updated the documentation to reflect these changes.
- [X] I have added entries to the changelog for any noteworthy
additions, changes, fixes, or removals.
- [X] I have added migration instructions to the upgrade guide (if
needed).
- [X] The changes follow the project's style guidelines and introduce no
new warnings.
- [X] The changes are fully tested and pass the CI checks.
- [X] I have reviewed my own code changes.

**If PR contains AI-assisted content:**

- [X] I have disclosed the use of AI tools in the PR description as per
our [AI Usage
Guidelines](https://github.com/munich-quantum-toolkit/core/blob/main/docs/ai_usage.md).
- [X] AI-assisted commits include an `Assisted-by: [Model Name] via
[Tool Name]` footer.
- [X] I confirm that I have personally reviewed and understood all
AI-generated content, and accept full responsibility for it.

---------

Signed-off-by: Roberto Turrado Camblor <rturrado@gmail.com>
Co-authored-by: Yannick Stade <100073938+ystade@users.noreply.github.com>
(cherry picked from commit 12cf546)
Assisted-by: GPT-5.6 via Codex
## Description

This PR fixes the QIR function names for adjoint gates. For example,
`__quantum__qis__sdg__body` is replaced with `__quantum__qis__s__adj`.

## Checklist

- [x] The pull request only contains commits that are focused and
relevant to this change.
- [x] ~~I have added appropriate tests that cover the new/changed
functionality.~~
- [x] ~~I have updated the documentation to reflect these changes.~~
- [x] I have added entries to the changelog for any noteworthy
additions, changes, fixes, or removals.
- [x] ~~I have added migration instructions to the upgrade guide (if
needed).~~
- [x] The changes follow the project's style guidelines and introduce no
new warnings.
- [x] The changes are fully tested and pass the CI checks.
- [x] I have reviewed my own code changes.

Backport-of: 334da06e6ad68686706234775788d51407c307ba
Assisted-by: GPT-5.6 via Codex
(cherry picked from commit a8cb36f)
Assisted-by: GPT-5.6 via Codex
This PR completes the QIR Output Schemas support in the runtime.
PR #1799 added the non-bit `__quantum__rt__*_record_output` entry points
in MQT Core's own `label: value` format.
This follow-up switches the runtime to the spec-mandated tab-separated
output records, adds `HEADER` and per-shot `START` / `METADATA` / `END`
framing, and drives the Labeled / Ordered schema selection from the QIR
program's `output_labeling_schema` function attribute.

QIR Output Schemas spec:
https://github.com/qir-alliance/qir-spec/tree/main/specification/output_schemas

1. **The QIR program drives the schema selection**.
`JitSession::initialize` reads the `output_labeling_schema` attribute
from the entry-point function and calls `Runtime::setOutputSchema`.
The value `ordered` selects Ordered; any other value, a valueless
attribute, or a missing attribute selects Labeled (the Runtime's chosen
default; the spec does not define one).
2. **QIR record-output calls delegate to a per-type Runtime API**.
`Runtime` exposes per-type output methods:
`output{Result,Bool,Int,Float,Tuple,Array}`.
Each `__quantum__rt__*_record_output` in `QIR.cpp` becomes a one-line
delegation.
The methods share a private `outputType` helper that emits
`OUTPUT\t<TYPE>\t<value>[\tlabel]\n` and honors the active schema (label
column dropped in Ordered mode).
3. **Runtime exposes framing to clients**.
`Runtime` exposes `outputProgramHeader`, `outputShotStart`,
`outputShotEnd`.
The `mqt-core-qir-runner` and the DDSIM QDMI Device emit the two
`HEADER` records once before running, and bracket each shot with `START`
/ `END`.
`outputShotStart` also emits
`METADATA\toutput_labeling_schema\t<schema>\n` so the output is
self-describing.

Tests:
`test_qir_runtime.cpp` covers the framing shape, per-type line shape,
and Labeled vs. Ordered branches.
`test_jit_session.cpp` covers the attribute-driven schema selection for
`ordered`, `labeled`, and absent-attribute cases.

Fixes #1798

- [x] The pull request only contains commits that are focused and
relevant to this change.
- [x] I have added appropriate tests that cover the new/changed
functionality.
- [x] I have updated the documentation to reflect these changes.
- [x] I have added entries to the changelog for any noteworthy
additions, changes, fixes, or removals.
- [ ] I have added migration instructions to the upgrade guide (if
needed).
- [x] The changes follow the project's style guidelines and introduce no
new warnings.
- [ ] The changes are fully tested and pass the CI checks.
- [x] I have reviewed my own code changes.

**If PR contains AI-assisted content:**

- [x] I have disclosed the use of AI tools in the PR description as per
our [AI Usage
Guidelines](https://github.com/munich-quantum-toolkit/core/blob/main/docs/ai_usage.md).
- [x] AI-assisted commits include an `Assisted-by: [Model Name] via
[Tool Name]` footer.
- [x] I confirm that I have personally reviewed and understood all
AI-generated content, and accept full responsibility for it.

---------

Signed-off-by: rturrado <rturrado@gmail.com>
Signed-off-by: Roberto Turrado Camblor <rturrado@gmail.com>
(cherry picked from commit afd8180)
Assisted-by: GPT-5.6 via Codex
🤖 *AI text below* 🤖

This PR extracts the additive, MQT Core 3.x-compatible QDMI
configuration
foundation from #1901. It adds stable device identities and configurable
discovery while retaining the current client interface, `qdmi::Driver`,
FoMaC,
Qiskit, and neutral-atom APIs.

The breaking object-model refactor remains in #1901 and will be rebased
onto
this foundation.

- Discover versioned definitions from `qdmi.json`, `[tool.qdmi]`,
environment
  configuration, packaged fragments, and C++ runtime overrides.
- Merge definitions by stable device ID with field-wise precedence,
explicit
disabled-ID reservation, strict validation, relative-path resolution,
and
  explicit or isolated configuration modes.
- Register and open devices by stable ID through C++, FoMaC, and Python.
Fresh
  opens create independent sessions and apply per-call overrides without
  changing the configured client catalog.
- Generate relocatable fragments for built-in devices and export neutral
`QDMI_DEVICE_ID`, `QDMI_DEVICE_PREFIX`, and `QDMI_MANIFEST_NAME` CMake
target
metadata. Installed consumers can copy selected device runtimes without
  project-specific loader code.
- Vendor the current toml++ single header used by the native TOML
parser.
- Document administration, project, environment, C++, Python,
relocation, and
  static-consumer workflows.

The public QDMI client C interface, `MQT::CoreQDMIDriver`, the FoMaC
object
model, and the existing Qiskit and neutral-atom APIs remain available.
The
unstable C++ `Driver::addDynamicDeviceLibrary` and Python
`add_dynamic_device_library` entry points are replaced by
`DeviceDefinition`
registration and stable-ID opening; `UPGRADING.md` documents that
migration.

Configuration discovery and registration do not load device code. A
library is
loaded when a stable ID is explicitly opened or when the configured
client
catalog is first materialized. Separately installed device wheels are
not
scanned automatically; they can register a fallback definition or have
their
runtime and generated fragment colocated by the consuming build.

- Release configure and complete 471-step build with LLVM/MLIR 22.1.3
- QDMI Driver suite: 109 passed
- Registry suite: 12 passed
- FoMaC suite: 174 passed
- Neutral-atom FoMaC suite: 2 passed
- Imported-device consumer tests: 2 passed
- DDSIM suite: 45 passed
- QIR JIT, runtime, and runner suites: 9, 63, and 5 passed
- Python stub generation through the aggregate wheel target
- `uvx nox -s lint`
- `git diff --check`

Fixes #1362
Fixes #1363

(cherry picked from commit 72c5f5f)
Assisted-by: GPT-5.6 via Codex
🤖 *AI text below* 🤖

- add exact-byte FoMaC submission and retrieval for binary QDMI programs
while preserving null-terminated text handling
- expose the complete standard QDMI program-format enum in Python and
enforce text/binary representation contracts
- let embedding projects reuse an existing `spdlog::spdlog` target when
adding MQT Core as a subdirectory
- exercise textual QASM and real QIR bitcode paths through the DDSIM
QDMI device

This is an independent prerequisite for the QDMI integration in
NVIDIA/cuda-quantum#4882. It does not depend on #1912 and can merge
separately. Stable-ID device registration and selective provider
composition remain part of #1912. QIR support is provided
unconditionally by MQT Core following #1953; this PR does not add
feature or capability negotiation.

- release configure and focused build with LLVM/MLIR 22.1.3
- 172 native FoMaC tests
- 47 DDSIM QDMI device tests, including QIR string and binary profiles
- 178 focused Python FoMaC tests
- focused parent-provided `spdlog::spdlog` CMake configure test
- full repository lint
- warning-as-error documentation build

---------

Signed-off-by: Lukas Burgholzer <burgholzer@me.com>
(cherry picked from commit d5ae60e)
Assisted-by: GPT-5.6 via Codex
Use the v3 qc::Qubit type while ordering and wrapping gate controls, cast only at the DD node boundary, and keep the final QDMI malformed-program fixture name. Acknowledge intentionally discarded registry test paths and apply the formatter and updated Ruff suppression syntax required by the maintenance backports.

These adaptations preserve the upstream behavior without v3 conversion warnings, test build failures, or lint drift.

Assisted-by: GPT-5.6 via Codex
Make bundled DDSIM, neutral-atom, and superconducting QDMI devices independently selectable and disable them by default when MQT Core is embedded. Keep the driver, FoMaC, and device-independent registry tests available without bundled devices, and avoid modifying an embedding project's MLIR documentation target.

Adapt the current PR head to v3 by retaining optional MLIR 21 support and the v3 documentation roles.

Backport-of: cdc7403
Assisted-by: GPT-5.6 via Codex
@burgholzer burgholzer added the backport Changes that have been backported to a stable release branch label Jul 29, 2026
@burgholzer burgholzer self-assigned this Jul 29, 2026

@burgholzer burgholzer left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I believe this looks pretty good already.

Comment thread .github/workflows/ci.yml Outdated
Comment thread .github/workflows/templating.yml Outdated
@codecov

codecov Bot commented Jul 29, 2026

Copy link
Copy Markdown

Assisted-by: GPT-5.6 via Codex
Assisted-by: GPT-5.6 via Codex
Assisted-by: GPT-5.6 via Codex
@burgholzer
burgholzer merged commit 27ed885 into v3.x Jul 30, 2026
43 checks passed
@burgholzer
burgholzer deleted the agent/backport-3-8 branch July 30, 2026 07:23
@burgholzer burgholzer added the minor Minor version update label Jul 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport Changes that have been backported to a stable release branch minor Minor version update

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants