From a7be67891d22fb3fa3f1bda662b2f1a0099a4678 Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 18:31:46 +0100 Subject: [PATCH 01/13] chore: add CODEOWNERS --- .github/CODEOWNERS | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..056e872 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,5 @@ +# Each line is a file pattern followed by one or more owners. +# These owners are requested for review whenever a matching path changes. +# See https://docs.github.com/articles/about-codeowners + +* @bbalouki From 336e0043ac60770ea2d7b789fbb7e4a5cc0ca9aa Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 18:31:55 +0100 Subject: [PATCH 02/13] chore: add GitHub issue templates --- .github/ISSUE_TEMPLATE/bug_report.yml | 102 +++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 8 ++ .github/ISSUE_TEMPLATE/feature_request.yml | 66 +++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..e2d37c4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,102 @@ +name: Bug report +description: Report a parsing, build, or runtime defect in ITCHCPP. +title: "[Bug]: " +labels: ["bug", "triage"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to report a bug. Please search + [existing issues](https://github.com/bbalouki/itchcpp/issues) first to + avoid duplicates. + + - type: textarea + id: description + attributes: + label: Description + description: A clear and concise description of the bug. + validations: + required: true + + - type: textarea + id: repro + attributes: + label: Steps to reproduce + description: > + Minimal, compilable code (or CLI invocation) that reproduces the + issue. Attach or link a sample ITCH file if the bug is data-dependent. + render: cpp + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected behavior + validations: + required: true + + - type: textarea + id: actual + attributes: + label: Actual behavior + description: Include the full error message, stack trace, or sanitizer output if applicable. + validations: + required: true + + - type: input + id: version + attributes: + label: ITCHCPP version + description: Contents of `VERSION.txt`, the pip package version, or the commit SHA. + placeholder: e.g. 1.6.2 + validations: + required: true + + - type: dropdown + id: interface + attributes: + label: Interface + options: + - C++ library + - Python bindings (itchcpp) + - itch-tool CLI + - Build system / CMake + validations: + required: true + + - type: dropdown + id: os + attributes: + label: Operating system + multiple: true + options: + - Linux + - Windows + - macOS + validations: + required: true + + - type: input + id: compiler + attributes: + label: Compiler and version + placeholder: e.g. Clang 18, GCC 13, MSVC 19.38 + validations: + required: true + + - type: input + id: cxx-standard + attributes: + label: C++ standard + placeholder: e.g. 20 or 23 + validations: + required: false + + - type: textarea + id: extra + attributes: + label: Additional context + description: CMake configure flags, vcpkg/Conan setup, or anything else relevant. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..4d2f607 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Question or discussion + url: https://github.com/bbalouki/itchcpp/discussions + about: Ask usage questions or discuss ideas before filing an issue. + - name: Security vulnerability + url: https://github.com/bbalouki/itchcpp/security/policy + about: Report security issues privately, do not open a public issue. See SECURITY.md. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..ff420e9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,66 @@ +name: Feature request +description: Suggest an enhancement for ITCHCPP. +title: "[Feature]: " +labels: ["enhancement", "triage"] +body: + - type: markdown + attributes: + value: | + Thanks for suggesting an improvement. Please search + [existing issues](https://github.com/bbalouki/itchcpp/issues) first to + avoid duplicates. + + - type: textarea + id: problem + attributes: + label: Problem + description: What limitation or gap are you running into? Is it related to a specific message type, transport, or interface (C++, Python, itch-tool)? + validations: + required: true + + - type: textarea + id: solution + attributes: + label: Proposed solution + description: What would you like to happen? Include a sketch of the API or CLI surface if relevant. + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + validations: + required: false + + - type: dropdown + id: area + attributes: + label: Area + multiple: true + options: + - Parser / message decoding + - Feed ingestion / transport (MoldUDP64, SoupBinTCP, pcap) + - Book engine + - Analytics + - Interoperability (CSV/Arrow, itch-tool) + - Python bindings + - Build / packaging (CMake, vcpkg, Conan) + - Documentation + validations: + required: false + + - type: checkboxes + id: breaking + attributes: + label: Compatibility + options: + - label: This would require a breaking change to the public API (see [CONTRIBUTING](../../CONTRIBUTING.md#versioning-and-compatibility-policy)). + required: false + + - type: textarea + id: extra + attributes: + label: Additional context + validations: + required: false From 731751a067013d05b556435d189992a49166abed Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 18:32:09 +0100 Subject: [PATCH 03/13] chore: add pull request template --- .github/PULL_REQUEST_TEMPLATE.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..8a42649 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,24 @@ +## Summary + + + +## Related issues + + + +## Type of change + +- [ ] Bug fix +- [ ] New feature +- [ ] Breaking change (see [CONTRIBUTING](../CONTRIBUTING.md#versioning-and-compatibility-policy)) +- [ ] Documentation +- [ ] Build / CI / tooling + +## Checklist + +- [ ] Code follows the style in [CLAUDE](../CLAUDE.md) (`snake_case`, `PascalCase` types, `m_` members, trailing return types, etc.). +- [ ] `clang-format` and `clang-tidy` pass locally. +- [ ] Tests were added or updated under `tests/` and `ctest` passes. +- [ ] Public API changes are documented with Doxygen `///` comments. +- [ ] [CHANGELOG](../CHANGELOG.md) is updated under `[Unreleased]`. +- [ ] Breaking changes to headers, wire formats, `itch-tool`, or the Python API are called out explicitly above. From 10a3afa4963d0927a59a0875ad17911b0e567ef1 Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 18:32:24 +0100 Subject: [PATCH 04/13] chore: add dependabot config for github-actions and pip --- .github/dependabot.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..eace80a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + commit-message: + prefix: "ci" + + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + commit-message: + prefix: "build" From 96f50ba00678c265d387dbf31e5ceb65870de03d Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 18:32:46 +0100 Subject: [PATCH 05/13] docs: add CHANGELOG.md --- CHANGELOG.md | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9232b53 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,87 @@ +# Changelog + +All notable changes to this project are documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [1.6.2] - 2026-07-11 + +### Fixed + +- Sign-conversion warning in the Arrow/Parquet `WriteTable` chunk size + calculation. + +## [1.6.1] - 2026-07-11 + +### Fixed + +- Arrow/Parquet static targets now link correctly when shared libraries are + not built (`ITCH_WITH_ARROW` with static vcpkg triplets). + +## [1.6.0] - 2026-07-11 + +### Added + +- **Feed ingestion / transport** (`itch/transport/`): `MoldUdp64Decoder` and + `SoupBinDecoder` for live and recovery framing, a `PcapReader` for + `.pcap`/`.pcapng` captures, and a `SequenceTracker` for per-session gap + detection, all implemented in-house with no libpcap dependency. +- **Full-market book engine** (`itch::book::BookManager`, `L3Book`): allocation- + light, multi-symbol L3 order book reconstruction with an object pool, + intrusive FIFO price levels, flat sorted ladders, O(1) order lookup, BBO + change callbacks, and L2/L3 depth snapshots. +- **Zero-copy overlay API** (`itch/overlay.hpp`): lazy typed views + (`MessageView`, `AddOrderView`, ...) that decode only the fields the caller + reads. +- **Analytics** (`itch::analytics`): `BarBuilder` (time/tick/volume clocks), + `Vwap`/`Twap`, spread/mid/depth/queue-imbalance and order-flow-imbalance + helpers, NOII decoding, and auction (opening/closing/halt/IPO) reconstruction. +- **Interoperability**: a dependency-free CSV sink, optional Arrow/Parquet + export (`ITCH_WITH_ARROW`), the `itch-tool` CLI (`stats`, `inspect`, + `filter`, `convert`), and native Python bindings (`itchcpp`, pybind11) + mirroring the pure-Python `itch`/`itchfeed` package layout and semantics. +- **Simulation & ecosystem**: a timestamp-paced `ReplayEngine`, a full ITCH + encoder/writer (`itch/encoder.hpp`) with a guaranteed + `parse(encode(msg)) == msg` round-trip, a `VenuePolicy` extension seam + (`itch::venue::Nasdaq50`) for future venues/versions, and Conan packaging + alongside the existing vcpkg port. +- Doxygen documentation site (`docs/Doxyfile`) published to GitHub Pages on + every push to `main`, and a local `docs` CMake target + (`-DITCH_BUILD_DOCUMENTATION=ON`). +- `CONTRIBUTING.md` documenting the build matrix, code style, and the + versioning/ABI compatibility policy. + +## [1.1.0] - 2026-01-17 + +### Added + +- `itch::LimitOrderBook`, a single-symbol order book built from the message + stream, with an example and dedicated tests. +- CMake `FetchContent` support as an alternative to vcpkg for consuming the + library. + +### Changed + +- Reorganized packaging metadata (moved vcpkg port config to `packaging/`) + and renamed CMake targets/exports for consistency. +- Adopted trailing return types across the codebase and tightened compiler + warnings (`-Wshadow`, sign-conversion, unreferenced parameters). + +## [1.0.0] - 2025-10-29 + +### Added + +- Initial release: an allocation-free, single-pass NASDAQ TotalView-ITCH 5.0 + parser with all message types deserialized into a type-safe `itch::Message` + `std::variant`, plus `std::vector`- and callback-based parsing entry points + with optional message-type filtering. + +[Unreleased]: https://github.com/bbalouki/itchcpp/compare/v1.6.2...HEAD +[1.6.2]: https://github.com/bbalouki/itchcpp/compare/v1.6.1...v1.6.2 +[1.6.1]: https://github.com/bbalouki/itchcpp/compare/v1.6.0...v1.6.1 +[1.6.0]: https://github.com/bbalouki/itchcpp/compare/v1.1.0...v1.6.0 +[1.1.0]: https://github.com/bbalouki/itchcpp/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/bbalouki/itchcpp/releases/tag/v1.0.0 From 9b32437191c2b1f69a6274b9f945b7506916dc49 Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 18:33:16 +0100 Subject: [PATCH 06/13] docs: add Contributor Covenant CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..244197a --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,82 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment include: + +- Demonstrating empathy and kindness toward other people. +- Being respectful of differing opinions, viewpoints, and experiences. +- Giving and gracefully accepting constructive feedback. +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience. +- Focusing on what is best not just for us as individuals, but for the overall + community. + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or advances + of any kind. +- Trolling, insulting or derogatory comments, and personal or political + attacks. +- Public or private harassment. +- Publishing others' private information, such as a physical or email address, + without their explicit permission. +- Other conduct which could reasonably be considered inappropriate in a + professional setting. + +## Enforcement Responsibilities + +Project maintainers are responsible for clarifying and enforcing our standards +of acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +## Scope + +This Code of Conduct applies within all community spaces (issues, pull +requests, discussions) and also applies when an individual is officially +representing the project in public spaces. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the maintainers via a private +[security advisory](https://github.com/bbalouki/itchcpp/security/advisories/new) +or by opening a confidential contact through the repository. All complaints +will be reviewed and investigated promptly and fairly. + +All maintainers are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Maintainers will follow these Community Impact Guidelines in determining the +consequences for any action they deem in violation of this Code of Conduct: + +1. **Correction** - A private, written warning, providing clarity around the + nature of the violation. +2. **Warning** - A warning with consequences for continued behavior, including + temporary avoidance of interaction with the people involved. +3. **Temporary Ban** - A temporary ban from any sort of interaction or public + communication with the community. +4. **Permanent Ban** - A permanent ban from any sort of public interaction + within the community. + +## Attribution + +This Code of Conduct is adapted from the +[Contributor Covenant](https://www.contributor-covenant.org), version 2.1, +available at +https://www.contributor-covenant.org/version/2/1/code_of_conduct.html. From bedb05317bdd0a84776f19f03553a486bc6d2d98 Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 18:33:33 +0100 Subject: [PATCH 07/13] docs: add SECURITY.md --- SECURITY.md | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..be9349e --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,53 @@ +# Security Policy + +## Supported Versions + +ITCHCPP follows [Semantic Versioning](https://semver.org). Security fixes are +made against the latest `1.x` minor release. Older minor versions are not +patched separately. + +| Version | Supported | +| ------- | ------------------ | +| 1.6.x | :white_check_mark: | +| < 1.6 | :x: | + +## Reporting a Vulnerability + +ITCHCPP decodes untrusted, attacker-influenceable binary input (ITCH frames, +MoldUDP64/SoupBinTCP transport framing, and `.pcap`/`.pcapng` captures), so +parser and transport bugs (buffer overflows, out-of-bounds reads, integer +overflow, panics/aborts on malformed input) are treated as security issues, +not just correctness bugs. + +**Please do not open a public GitHub issue for security vulnerabilities.** + +Instead, report privately using +[GitHub Security Advisories](https://github.com/bbalouki/itchcpp/security/advisories/new) +for this repository. Include: + +- A description of the vulnerability and its impact. +- Steps to reproduce, ideally a minimal input file or byte sequence (attach + under the advisory, not in a public issue or PR). +- The affected version (`VERSION.txt` / package version) or commit SHA. +- Whether the issue was found via fuzzing (e.g. `fuzz/parser_fuzzer`, + `fuzz/moldudp64_fuzzer`) or manual review. + +You should expect an initial response within **5 business days**. We will work +with you to confirm the issue, assess severity, and coordinate a fix and +disclosure timeline before any public disclosure. + +## Scope + +In scope: + +- The C++ parser, transport decoders, book engine, and encoder under + `include/itch/` and `src/`. +- The Python bindings (`itchcpp` package). +- The `itch-tool` CLI. + +Out of scope: + +- Vulnerabilities in third-party dependencies (report upstream; note them here + so we can track exposure). +- Denial of service via arbitrarily large, well-formed input (the parser is + designed for high-throughput streaming, not resource capping). From 002daabcbca3034f835c198d3ea47258f841735d Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 19:29:14 +0100 Subject: [PATCH 08/13] =?UTF-8?q?Fix=20FindPythonLibsNew.cmake=20=E2=86=92?= =?UTF-8?q?=20deprecated=20FindPythonInterp=20discovery?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 2e168e5..50aa60b 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -2,6 +2,11 @@ cmake_minimum_required(VERSION 3.25) # The Python bindings are built only when ITCH_BUILD_PYTHON is ON. pybind11 is # resolved through vcpkg or a system install. +# Force pybind11 onto the modern FindPython path; its default legacy +# FindPythonLibsNew.cmake wrapper calls the CMake-deprecated FindPythonInterp +# module, which recent CMake releases (4.x) no longer support, breaking +# configure in isolated build environments such as vcpkg's CI. +set(PYBIND11_FINDPYTHON ON) find_package(pybind11 CONFIG REQUIRED) # The compiled extension is the private `_itchcpp` module imported by the pure From 1564825213f289f582303e8203e5f6abd13a6dad Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 19:40:45 +0100 Subject: [PATCH 09/13] fix: Pinned off windows-latest --- .github/workflows/build.yml | 5 ++++- .github/workflows/publish.yml | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index de88302..d0feb9f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,10 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] + # Pinned off windows-latest: it moved to the Windows Server 2025 / VS 2026 + # image in 2026-06 and the vcpkg benchmark port's configure step does not + # yet build cleanly under that toolchain. Revisit once vcpkg catches up. + os: [ubuntu-latest, windows-2022, macos-latest] build_type: [Release, Debug] cpp_standard: [20, 23] runs-on: ${{ matrix.os }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 7e01d13..670e3c1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,7 +13,9 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-14] + # Pinned off windows-latest: see build.yml for why (VS 2026 image, vcpkg + # benchmark port not yet compatible). + os: [ubuntu-latest, windows-2022, macos-14] steps: - name: Checkout repository uses: actions/checkout@v4 From 1a55ef7dd97d44e42ef5f43055262c60409b8666 Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 19:45:27 +0100 Subject: [PATCH 10/13] fix: key build-and-test caches on matrix.os, not runner.os Switching the windows-latest matrix entry to windows-2022 didn't bust the vcpkg/CMake build caches, since runner.os is "Windows" either way. The job restored a CMakeCache.txt configured under the old runner's VS 2026 generator, which CMake then refuses to reuse under VS 2022: "Does not match the generator used previously". Keying on matrix.os (the concrete label) ties the cache to the actual toolchain instead. --- .github/workflows/build.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d0feb9f..b0a2280 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,9 +33,12 @@ jobs: path: | ${{ env.VCPKG_ROOT }} ~/.cache/vcpkg - key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json') }} + # Keyed on matrix.os (not runner.os) so a runner-image change, which can + # silently swap the compiler/toolset, busts the cache instead of reusing + # binaries or a CMakeCache.txt built by a different toolchain/generator. + key: ${{ matrix.os }}-vcpkg-${{ hashFiles('vcpkg.json') }} restore-keys: | - ${{ runner.os }}-vcpkg- + ${{ matrix.os }}-vcpkg- - name: Set up vcpkg uses: lukka/run-vcpkg@v11 @@ -44,9 +47,9 @@ jobs: uses: actions/cache@v4 with: path: ${{ env.BUILD_DIR }} - key: ${{ runner.os }}-${{ matrix.build_type }}-cmake-${{ hashFiles('CMakeLists.txt', '**/CMakeLists.txt') }} + key: ${{ matrix.os }}-${{ matrix.build_type }}-cmake-${{ hashFiles('CMakeLists.txt', '**/CMakeLists.txt') }} restore-keys: | - ${{ runner.os }}-${{ matrix.build_type }}-cmake- + ${{ matrix.os }}-${{ matrix.build_type }}-cmake- - name: Set VCPKG Triplet shell: bash From 38fbd0a8e1e5c963b3acdd7f499a6c120a2a3df4 Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 21:02:40 +0100 Subject: [PATCH 11/13] fix: bump vcpkg builtin-baseline past broken benchmark port pin The pinned baseline (5bf0c55, 2025-11-28) resolves benchmark to a revision whose portfile passes "-Werror=old-style-cast" as a bare CMake CLI argument instead of a compiler flag. CMake only recognizes its own warning categories (dev, deprecated) for -Werror=, so it rejects the arg outright: "The warning category "old-style-cast" is not known." This broke arm64-osx (and any triplet building benchmark fresh) at configure time. Verified locally that the pinned commit's portfile contains the bad OPTIONS entry, and that the new baseline's benchmark (1.9.5) plus gtest/pybind11/python3 all install and build cleanly. --- vcpkg.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcpkg.json b/vcpkg.json index f268b88..23dfd11 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -22,5 +22,5 @@ ] } }, - "builtin-baseline": "5bf0c55239da398b8c6f450818c9e28d36bf9966" + "builtin-baseline": "bba3de2ac2b2f1d0a8c8abe976ee2f2374a91e94" } From 8a67f042866287571054580fba966251cbb8ac50 Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 21:09:20 +0100 Subject: [PATCH 12/13] fix: drop unsafe restore-keys fallback on vcpkg caches Every job's vcpkg cache used a restore-keys prefix fallback. The builtin-baseline bump changed vcpkg.json's content hash, missing the exact-match key, and the fallback restored a stale $VCPKG_ROOT clone predating that change. Its git history didn't contain the newly pinned baseline commit, so lukka/run-vcpkg's "Set up vcpkg" step failed outright (git exit 128) instead of falling back to a fresh clone. This broke every job across every OS in the last run. Dropping restore-keys means a cache miss just re-clones/rebuilds vcpkg from scratch (a few extra minutes) instead of risking a wrong-vintage clone that can't resolve the pinned baseline. --- .github/workflows/build.yml | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b0a2280..ab00824 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,9 +36,11 @@ jobs: # Keyed on matrix.os (not runner.os) so a runner-image change, which can # silently swap the compiler/toolset, busts the cache instead of reusing # binaries or a CMakeCache.txt built by a different toolchain/generator. + # No restore-keys: a partial-match fallback can restore a vcpkg clone + # from before vcpkg.json last changed, whose git history doesn't + # contain the currently pinned builtin-baseline commit, and + # lukka/run-vcpkg then fails outright instead of re-cloning. key: ${{ matrix.os }}-vcpkg-${{ hashFiles('vcpkg.json') }} - restore-keys: | - ${{ matrix.os }}-vcpkg- - name: Set up vcpkg uses: lukka/run-vcpkg@v11 @@ -120,9 +122,11 @@ jobs: path: | ${{ env.VCPKG_ROOT }} ~/.cache/vcpkg + # No restore-keys: a partial-match fallback can restore a vcpkg clone + # from before vcpkg.json last changed, whose git history doesn't + # contain the currently pinned builtin-baseline commit, and + # lukka/run-vcpkg then fails outright instead of re-cloning. key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json') }} - restore-keys: | - ${{ runner.os }}-vcpkg- - name: Set up vcpkg uses: lukka/run-vcpkg@v11 @@ -158,9 +162,11 @@ jobs: path: | ${{ env.VCPKG_ROOT }} ~/.cache/vcpkg + # No restore-keys: a partial-match fallback can restore a vcpkg clone + # from before vcpkg.json last changed, whose git history doesn't + # contain the currently pinned builtin-baseline commit, and + # lukka/run-vcpkg then fails outright instead of re-cloning. key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json') }} - restore-keys: | - ${{ runner.os }}-vcpkg- - name: Set up vcpkg uses: lukka/run-vcpkg@v11 @@ -202,9 +208,11 @@ jobs: path: | ${{ env.VCPKG_ROOT }} ~/.cache/vcpkg + # No restore-keys: a partial-match fallback can restore a vcpkg clone + # from before vcpkg.json last changed, whose git history doesn't + # contain the currently pinned builtin-baseline commit, and + # lukka/run-vcpkg then fails outright instead of re-cloning. key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json') }} - restore-keys: | - ${{ runner.os }}-vcpkg- - name: Set up vcpkg uses: lukka/run-vcpkg@v11 @@ -290,9 +298,10 @@ jobs: path: | ${{ env.VCPKG_ROOT }} ~/.cache/vcpkg + # No restore-keys: see build-and-test's Cache vcpkg step for why a + # partial-match fallback is unsafe here (it could also cross-match the + # non-python vcpkg cache, an even less appropriate restore target). key: ${{ runner.os }}-vcpkg-python-${{ hashFiles('vcpkg.json') }} - restore-keys: | - ${{ runner.os }}-vcpkg- - name: Set up vcpkg uses: lukka/run-vcpkg@v11 @@ -335,9 +344,11 @@ jobs: path: | ${{ env.VCPKG_ROOT }} ~/.cache/vcpkg + # No restore-keys: a partial-match fallback can restore a vcpkg clone + # from before vcpkg.json last changed, whose git history doesn't + # contain the currently pinned builtin-baseline commit, and + # lukka/run-vcpkg then fails outright instead of re-cloning. key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json') }} - restore-keys: | - ${{ runner.os }}-vcpkg- - name: Set up vcpkg uses: lukka/run-vcpkg@v11 From 0e7acd8ed203917f21e0958bcd5732e25e53fd74 Mon Sep 17 00:00:00 2001 From: bbalouki Date: Thu, 16 Jul 2026 21:27:32 +0100 Subject: [PATCH 13/13] fix: point builtin-baseline at a real, pushed microsoft/vcpkg commit The previous baseline (bba3de2) was grabbed from a local vcpkg checkout that was actually sitting on a personal working branch (bbalouki-itch, tracking a fork) with local-only history layered on top of upstream - that commit was never pushed to microsoft/vcpkg. Every job's "Set up vcpkg" step failed identically (git exit 128, "fatal: unable to read tree") because a genuine clone of microsoft/vcpkg.git can never find a commit that only exists locally. Verified this one for real: fetched origin/master directly, confirmed bba3de2 is NOT an ancestor of it, then built the manifest (gtest, benchmark) against 43643e1 in an isolated git worktree bootstrapped from scratch, independent of any pre-existing local vcpkg state. --- vcpkg.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcpkg.json b/vcpkg.json index 23dfd11..af28dbe 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -22,5 +22,5 @@ ] } }, - "builtin-baseline": "bba3de2ac2b2f1d0a8c8abe976ee2f2374a91e94" + "builtin-baseline": "43643e1f5cf73db40d0d4bd610183348eb09b24e" }