Story: Hotfix: CI builds red across all OSs on the payload decode fold and the ascot member

Table of Contents

This page documents a story in Sprint 25. It captures the goal, current status, acceptance criteria, and the tasks that compose it.

1. Goal

Main's GitHub Actions builds are red on every OS. Six independent defects sit behind that, and one PR carries the fix for all of them.

The Linux gcc and Nightly Build jobs fail with -Wchanges-meaning: bond_instrument_data declares a member named ascot whose type is also named ascot, and gcc 16 rejects the collision. The member is renamed to ascot_row.

The Linux clang, macOS AppleClang and Nightly Build clang jobs segfault the compiler itself, inside clang's TransformCXXFoldExpr, while instantiating decode_with_legs for the rates family. That function folds a fold expression over an immediately-invoked generic lambda; rewriting it as the recursive helper pair the neighbouring decode_flat already uses removes the crash and keeps the behaviour identical.

The Windows MSVC jobs fail with C4251 promoted to C2220 on ores.platform's exported exception classes, which carry a std::string member. Every consumer is in-tree and built by the same toolchain, so the warning is disabled for MSVC alone, with the reason recorded in the build file.

The Windows clang jobs fail with nine -Werror,-Wunused-function diagnostics on the generated ores.ore domain.cpp. The generated XSDCPP_MAYBE_UNUSED macro expands to the unused attribute only under GNUC, so clang on Windows loses it. The file is generated, so the fix is a per-file Windows-scoped suppression that names xsdcpp as the home of the real fix.

Two supporting defects round out the set. The .clang-tidy config carries a Warnings key that is not part of the schema, so every clang-tidy invocation aborts, and the Nightly Include Hygiene job is exactly such an invocation. That same workflow never installs Qt6, so its configure step fails before any check runs.

A sixth defect is masked rather than visible. Every job dies at the build today, so no job reaches its test step, and ctest runs after the build. The ORE v1.8.17 schema moved the currency and the contract month off the trade-side BondFutureData and onto the bond future reference datum, and the inline document in the bond future exporter test still carries the old shape, so the loader rejects it. That failure is pre-existing on main, and it would have turned every job red again as soon as the build fixes landed. The document now carries the three elements the schema keeps on the trade side, which is the shape the sibling mapper roundtrip suite already uses.

2. Status

Field Value
State DONE
Parent sprint Sprint 25
Now Nothing.
Waiting on Nothing.
Next Nothing.
Last touched 2026-09-13

3. Acceptance

  • The renamed ascot_row member and its call sites build clean under gcc, with the -Wchanges-meaning diagnostic gone.
  • decode_with_legs no longer crashes clang 19 or AppleClang, and it decodes the same payloads as before.
  • The Windows MSVC and Windows clang jobs get past the C4251 and unused-function errors.
  • The .clang-tidy config parses, so clang-tidy runs, and the Nightly Include Hygiene job reaches its include check.
  • The bond future exporter test document matches the v17 schema, so ctest passes on every OS once the build fixes land.
  • The local build, ctest, roundtrip and site build stay green on Linux, and the continuous CI on every OS returns to green after the merge.

4. Tasks

Task State Start End Description
Implement Hotfix: CI builds red across all OSs on the payload decode fold and the ascot member DONE 2026-09-13 2026-09-13 Rename the ascot member of bond_instrument_data and update its call sites; rewrite decode_with_legs as the recursive helper pair; disable C4251 for MSVC and the unused-function warning for Windows clang; repair the .clang-tidy config; install Qt6 in the nightly include-hygiene job. Verify with the full build and ctest, then raise the single hotfix PR.

5. Decisions

  • One PR carries all six fixes. The defects are independent, but they all redden the same workflows, and a single branch keeps the recovery of CI reviewable as one unit.
  • The ascot member is renamed rather than type-qualified. gcc's -Wchanges-meaning rejects a member whose name repeats its own type name, and the rename is the smallest change that clears it.
  • The with-legs decode takes the shape decode_flat already uses, rather than a new shared abstraction. A shared helper would have to fold again, which is the construct that crashes clang.
  • The Windows suppressions are scoped to the one generated file and name xsdcpp as the home of the real fix. Editing generated output by hand is not an option.
  • C4251 is disabled for MSVC alone, with the reason recorded next to the flag: every consumer is in-tree and built by the same toolchain.
  • The bond future test document fix is in scope. It is pre-existing, but CI runs ctest after the build, so leaving it out would redden every job again the moment the build fixes landed.

6. Out of scope

Emacs 29.3 (Org mode 9.6.15)