Skip to content

refactor(core): C++23 Wave bundle (#319 log + #232 gpu_dispatch_env + #136 opt+read_json_model + #154 feature_extractor + #198 cli_parse+vmaf) - #531

Merged
lusoris merged 7 commits into
masterfrom
refactor/cpp23-wave-bundle-319-232-136-154-198
Jun 2, 2026
Merged

lusoris merged 7 commits into
masterfrom
refactor/cpp23-wave-bundle-319-232-136-154-198

Conversation

@lusoris

@lusoris lusoris commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Summary

Bundles 5 sequential C++23 file-rename PRs into one coherent diff:

Each TU compiles in an isolated C++23 static library. Public C ABI is preserved throughout via extern "C" guards. All source .c files that were converted remain in tree as upstream-parity references but are not compiled.

ADR-0108 Deliverables Checklist

Conflict resolution notes

Applied via git am --3way in strict order. All conflicts were in documentation files (rebase-notes.md, state.md, ADR README.md, AGENTS.md files) that accumulated master additions after each source PR was opened. Code conflicts were resolved by keeping the HEAD (bundle-tip) side for code quality fixes and keeping both sides for additive documentation blocks. Post-application fixups applied per-PR:

Build verification

All 5 PRs verified with meson setup + ninja -C (CPU-only, enable_cuda=false enable_sycl=false) after each am step. 837 targets linked cleanly at final tip.

🤖 Generated with Claude Code

lusoris and others added 7 commits June 2, 2026 16:39
Converts core/src/log.c to core/src/log.cpp and wires it into the meson
build as the second C++23 pilot under ADR-0708 (first was dict.c/dict.cpp
per ADR-0727). The log.cpp file existed on master from the earlier
PR #45 attempt but remained inert (meson still referenced log.c, see
PR #205 "Wave 1 INERT" audit). This PR completes the conversion by:

- Adding `extern "C"` guards to core/src/log.h so the header is includable
  from both C and C++ TUs.
- Wrapping the function definitions in log.cpp in `extern "C"` so the
  emitted symbols carry C-mangling (verified via nm: `vmaf_log` and
  `vmaf_set_log_level` are C-mangled exports, same as the prior log.c
  build).
- Replacing the C `static` file-scope log state with a C++ anonymous
  namespace (clang-tidy misc-use-anonymous-namespace clean).
- Compiling log.cpp in an isolated `log_cpp23_lib` static_library with
  `override_options: ['cpp_std=' + libvmaf_cpu_cpp_std]`, mirroring the
  ADR-0708 `metadata_handler_cpp20_lib` pattern so the C++23 override
  does not leak to other TUs.
- Removing log.c from libvmaf_sources; adding `log_cpp23_lib` objects to
  the libvmaf library() target.
- Removing 21 inline `'../src/log.c'` source entries from test executables
  in core/test/meson.build; adding a shared `log_cpp23_test_objects`
  aggregate that those tests pick up via objects:.
- Wiring the orphan `test_log` executable into the fast suite (mirrors
  the orphan-test sweep in draft PR #315) so the formatter / log-level
  filtering coverage is no longer silently dead.

Behaviour is byte-identical to the prior C build: same fprintf format
string, same va_list pass-through, same stderr destination, same ANSI
colour codes. std::print / std::format were considered but rejected to
preserve printf-style varargs at the libvmaf log surface.

Build + test:
  meson setup build-cpu core -Denable_cuda=false -Denable_sycl=false \
                              -Denable_hip=false
  ninja -C build-cpu                   # 726 targets, all link clean
  meson test -C build-cpu --suite=fast # 50/50 pass, incl. new test_log

ABI verification (nm libvmaf.so | grep vmaf_log):
  master:    0000000000000000 t vmaf_log              (LTO-hidden)
             0000000000000000 t vmaf_log.constprop.0  (LTO-hidden)
  this PR:   0000000000000000 T vmaf_log              (externally visible)
             0000000000000000 T vmaf_set_log_level    (externally visible)
The promotion from `t` (local) to `T` (global) is a consequence of
moving the TU into an isolated static_library — the linker can no longer
elide the symbol via LTO. This matches the established
metadata_handler_cpp20_lib precedent (vmaf_metadata_* are also `T` in
master). Neither symbol is marked VMAF_EXPORT, so the public libvmaf
ABI is unchanged.

**Research digest**: ADR-0708 (C++23 internals pilot policy) and the
Wave 1 backlog rationale in ADR-0727 §Context. The log.c migration
recipe is the same as metadata_handler (extern "C", isolated static_lib,
cpp_std override) — no separate research digest needed.

**Decision matrix**: log.c was chosen as the next pilot over mem.c,
opt.c, and fex_ctx_vector.c because (1) its C surface is the smallest of
the four (72 lines, two functions, no out-params), (2) it has zero
callers in the public ABI (vmaf_log / vmaf_set_log_level are internal
diagnostics, not VMAF_EXPORT-marked), and (3) the log.cpp body already
existed in tree from a prior aborted Wave 1 attempt — adopting it is
strictly cheaper than starting fresh from mem.c. See ADR-0708
`## Alternatives considered` for the original ROI ranking.

**AGENTS.md invariant note**: no rebase-sensitive invariants — the log
function semantics, output format, and stderr destination are unchanged.
The rebase-mapping (upstream `libvmaf/src/log.c` → fork
`core/src/log.cpp`) is recorded in docs/rebase-notes.md so future
port-upstream-commit runs target the right file.

**Reproducer / smoke-test command**:
  meson setup build-cpu core -Denable_cuda=false -Denable_sycl=false \
                              -Denable_hip=false
  ninja -C build-cpu
  meson test -C build-cpu test_log --print-errorlogs
  nm build-cpu/src/libvmaf.so | grep -E " T vmaf_log| T vmaf_set_log_level"

**CHANGELOG fragment**: changelog.d/changed/log-c-to-cpp23.md

**Rebase note**: docs/rebase-notes.md — section "log.c → log.cpp C++23
pilot (ADR-0708 Wave 1, 2026-05-30)".

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace the platform-#ifdef pthread_mutex_t/CRITICAL_SECTION lock
bootstrap with std::mutex + std::lock_guard RAII; replace strdup +
nullable char * with std::optional<std::string>; use std::string_view
for the fast-path comparisons; add [[nodiscard]] to the public entry
point. The Windows-specific InitOnceExecuteOnce / CRITICAL_SECTION
branch (~25 LOC) is eliminated entirely.

Compiled as an isolated gpu_dispatch_env_cpp23_lib static library with
override_options=['cpp_std=c++23'], following the ADR-0708 pattern for
metadata_handler_cpp20_lib. Public extern "C" symbol unchanged; all
GPU backends link without modification.

Fast-test gate: 49/49 pass (CPU-only build).

Six deliverables (ADR-0108):
  D1: no digest needed: trivial mechanical conversion
  D2: ADR-0858 §Alternatives considered
  D3: core/AGENTS.md — added invariant #7 for isolated lib pattern
  D4: reproducer: meson setup core/build -Denable_cuda=false && ninja
  D5: changelog.d/changed/adr-0858-cpp23-gpu-dispatch-env.md
  D6: docs/rebase-notes.md — feat/cpp23-gpu-dispatch-env-20260529 entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…pp (ADR-0761)

Activate opt.cpp (completing Wave 1 / ADR-0721) and convert
read_json_model.c → read_json_model.cpp (new, 639 LOC).

Both compile under cpp_std=c++23 in isolated static libraries
(opt_cpp23_lib / read_json_model_cpp23_lib) linked into libvmaf.so
via extract_all_objects(). Public C ABI unchanged.

Changes per file:
- opt.h: extern "C" guards added; opt_cpp23_lib wired into meson
- read_json_model.cpp: nullptr, static_cast<>, [[nodiscard]] on 4 entry
  points; goto-past-init replaced with if/else scoping; C++ <c*> headers
- log.h, model.h, read_json_model.h: extern "C" guards added
- core/src/meson.build: opt_cpp23_lib + read_json_model_cpp23_lib static
  libs; opt.c and read_json_model.c comments in libvmaf_sources
- core/test/meson.build: wave8_cpp23_objects variable; all affected test
  executables updated to use objects instead of direct source compilation
- scripts/ci/coverage-check.sh: updated opt.c -> opt.cpp, read_json_model.c
  -> read_json_model.cpp in critical-coverage exclusion list
- core/src/AGENTS.md: invariant 10 documenting the active .cpp files

predict.c skipped: depends on feature_extractor.h / feature_collector.h
without extern "C" guards; deferred to a later wave.

Build: 49/49 fast-suite pass (CPU-only).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Six void* cast fixups, one atomic_load arithmetic guard, placement-new
pool slot init (avoids copying std::atomic), extern "C" guards on
feature_extractor.h / log.h / opt.h, and extern "C" on opt.cpp
definition. meson.build refs updated; old .c deleted via git rm.

Fast-test gate: 49/49 PASS (CPU-only build-0772).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Convert core/tools/cli_parse.c and core/tools/vmaf.c to C++23 translation
units. Conservative idioms only: nullptr, static_cast, [[nodiscard]],
[[noreturn]], std::string_view for option-string dispatch, and a ModelArrays
RAII struct that replaces the three manual vmaf_model_destroy/free loops in
vmaf.cpp's goto-cleanup block.

- cli_parse.h: extern "C" guards for C caller compatibility
- spinner.h: static internal linkage on spinner[]/spinner_length
- meson.build: cpp files + cpp_args + override_options cpp_std=c++23
- .pre-commit-config.yaml: add --disable-version-check to semgrep entry
  to fix spurious exit-2 from semgrep 1.159.0 version-check notification

Build: CPU-only build in container — 724 targets, zero errors.
Smoke: vmaf --help output identical; Netflix golden pair scores 76.66783
(ADR-0214 PASS; places=4 >= 76.668).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…files

Conflicts in .github/workflows/libvmaf-build-matrix.yml (2 blocks)
and .github/workflows/security-scans.yml (1 block) were committed into
the PR branch prior to this rebase. They produced blank lines or garbled
YAML steps that would fail CI. Remove all conflict markers and restore
the correct content matching the master baseline.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@lusoris
lusoris force-pushed the refactor/cpp23-wave-bundle-319-232-136-154-198 branch from cc65bfd to 8033921 Compare June 2, 2026 14:47
@lusoris
lusoris marked this pull request as ready for review June 2, 2026 14:47
Copilot AI review requested due to automatic review settings June 2, 2026 14:47
@lusoris
lusoris merged commit 9f844f0 into master Jun 2, 2026
41 of 87 checks passed
@lusoris
lusoris deleted the refactor/cpp23-wave-bundle-319-232-136-154-198 branch June 2, 2026 14:47
@lusoris
lusoris removed the request for review from Copilot June 2, 2026 15:10
lusoris added a commit that referenced this pull request Jun 3, 2026
…768) (#564)

Convert two core/src/*.c files to C++23, continuing the ADR-0708 migration
playbook (isolated static_library per TU, cpp_std=c++23 scoped):

- picture_pool.cpp: typedef struct → struct, nullptr, static_cast /
  reinterpret_cast for the C-style first-member inheritance pattern
  (PooledPicturePriv ↔ VmafPicturePrivate).
- gpu_picture_pool.cpp: typedef struct → struct, nullptr, std::malloc /
  std::memset, std::free.

Note: gpu_dispatch_env.cpp was already converted in PR #531 (ADR-0858);
this wave covers only picture_pool and gpu_picture_pool.

Collateral: extern "C" guards added to picture.h, mem.h, ref.h, and
picture_pool.h so the new C++ TUs resolve unmangled C symbols at link time.
All gpu_picture_pool.c references in test/meson.build updated to .cpp.

No user-discoverable surface change (internal build wiring only).

Co-authored-by: Lusoris <lusoris@pm.me>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
lusoris added a commit that referenced this pull request Jun 8, 2026
…omotion + tune-report (#852)

* docs(deprecations): add VmafLegacyQualityRunner entry with ADR-0749 cite

Documents the removal of VmafLegacyQualityRunner (broken after the
float_ansnr feature was dropped in PR #38), with migration pointer to
VmafQualityRunner and a current .json model.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(policy): document container-only canonical artifact publishing (ADR-1102)

Phase 4b.9 decision: the vmaf-dev-mcp container is the exclusive source for
all canonical artifacts (release binaries, published ghcr.io images, CI
benchmark/snapshot artifacts). Host-side builds remain available for
IDE/clangd, debugger, and sanitizer workflows but must not produce published
artifacts.

Changes:
- CLAUDE.md §15: add publishing bullet citing ADR-1102 and publishing.md
- docs/development/publishing.md: new policy doc with rebuild trigger
  conditions and approved host-side use cases
- docs/adr/1102-phase4b9-container-only-publishing.md: decision record
- docs/adr/README.md: add ADR-1102 index row
- changelog.d/added/1102-container-only-publishing-policy.md: fragment
- docs/rebase-notes.md: no rebase impact note

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(cambi): port upstream 721569bc — cambi_high_res_speedup param + motion2 score update

Port Netflix/vmaf commit 721569bc (resource/doc: add cambi_high_res_speedup parameter
and update motion2 score) to fork's relocated doc tree.

Changes applied to fork path equivalents:
- docs/metrics/cambi.md       ← resource/doc/cambi.md:       add cambi_high_res_speedup option
- docs/metrics/confidence-interval.md ← resource/doc/conf_interval.md: update motion2 score
- docs/usage/python.md        ← resource/doc/python.md:      update motion2 score

The cherry-pick was applied with manual conflict resolution due to doc relocation
(ADR-0700 moved resource/doc/ → docs/). Upstream trailing whitespace stripped to
comply with fork's pre-commit gate.

Upstream commit: 721569bc1b18847a396c86575f4698e372454c04
Upstream author: christosb <christosb@netflix.com>

* ci(sycl): calibrate float_ssim for Arc DG2-G10 and promote parity test to required

Adds an `arc:dg2-g10` calibration entry to `scripts/ci/gpu_ulp_calibration.yaml`
with `float_ssim: 5.0e-4` (places=3), resolving T-SYCL-ARC-FLOAT-SSIM-PARITY-2026-06-03.

Two stacked causes drive the relaxed tolerance on DG2-G10 class Intel Arc devices:
(1) CPU path (float_ssim.c / iqa_ssim) uses the L×C×S decomposition with a
    sqrt(var_ref*var_cmp) contrast term; the SYCL kernel (integer_ssim_sycl.cpp)
    uses the Wang 2004 Eq.(13) combined formula (2*covar) — intentional design.
(2) DG2-G10 has shaderFloat64=false; fp32 accumulation drift over 177K pixel SSIM
    values compounds to ~2.7e-4. RTX 4090 (native fp64) passes at places=4.
Empirical max_abs_diff on Arc A380: 2.68e-4. See Research-0985 §3 / ADR-0234.

Also adds a dedicated `sycl-float-ssim-parity` job in `tests-and-quality-gates.yml`
targeting the self-hosted `gpu-full` runner (same gate as `coverage-gpu`), and
promotes it to the required-status list in `required-aggregator.yml`. The aggregator
treats "check not reported" (no GPU runner available) as path-filter-skip/OK, so
the gate degrades gracefully when the Arc runner is offline.

Closes: T-SYCL-ARC-FLOAT-SSIM-PARITY-2026-06-03

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(ci): add ssimulacra2 DG2-G10 SYCL calibration placeholder entry

Add a named calibration entry sycl:0x8086:0x56a* (Intel Arc Alchemist
DG2/G10, Arc A380 class) in scripts/ci/gpu_ulp_calibration.yaml with
ssimulacra2 anchored at the default places=2 (5e-3) tolerance.

This resolves T-SYCL-ARC-SSIMULACRA2-PARITY-2026-06-03 (partial).
Before this change the gate matched Arc A380 only via the coarse
sycl:0x8086:* generic glob, which has no ssimulacra2 override and
therefore fell back to the built-in 5e-3 default silently. The new
DG2-G10 entry makes the match explicit, documents the observed 8.72e-2
divergence, and records the follow-up work inline.

Root cause: fp32-IIR accumulation drift in the 3-pole Charalampidis
blur (ssimulacra2_sycl.cpp::launch_blur) over up to 329 rows of
recurrence state per scale x 6 pyramid scales. Arc A380 lacks native
fp64 (ADR-0220). RTX 4090 passes places=2 without issue.

Follow-up (long-term, T-SYCL-ARC-SSIMULACRA2-PARITY-2026-06-03 §b):
  - Kahan-compensated IIR rewrite in
    core/src/feature/sycl/ssimulacra2_sycl.cpp::launch_blur.
  - CUDA twin in core/src/feature/cuda/ssimulacra2/.
  - Requires Arc A380 hardware access; blocked on self-hosted runner.
  - Replace placeholder with a hardware-validated places=1 (5e-2) value
    once calibration corpus is available.

Also updates docs/state.md to record the partial fix and adds a
changelog fragment.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci(sycl): re-enable clang-tidy-sycl job via synthetic compile_commands

The clang-tidy-sycl CI job was removed on 2026-06-06 because stock LLVM
clang-tidy could not parse SYCL TUs: meson compiles them via CUSTOM_COMMAND
(icpx -fsycl) so they have no entries in compile_commands.json, and without
those entries clang-tidy falls back to default flags where <sycl/sycl.hpp>
cannot be found.

This commit re-enables the job with a two-step approach:

1. scripts/ci/gen-sycl-compile-commands.py — new 120-line script that
   parses build.ninja, extracts CUSTOM_COMMAND entries for SYCL .cpp TUs,
   and synthesises compile_commands.json entries by replacing icpx with
   clang++ and dropping -fsycl.  The -I project include paths and -D flags
   are preserved so clang-tidy can resolve internal headers.

2. scripts/ci/clang-tidy-sycl.sh (unchanged) — existing wrapper that
   injects -isystem<sycl/sycl.hpp path> + -D__SYCL_DEVICE_ONLY__=0.
   The __SYCL_DEVICE_ONLY__ guard covers all __spirv_ControlBarrier and
   __ocl_event_t usages in nd_item.hpp and group.hpp (verified in
   oneAPI 2026.0.0).

The re-added CI job runs on ubuntu-24.04, installs intel-oneapi-compiler-
dpcpp-cpp + clang-tidy-18, sets up a SYCL build tree (CC=icx CXX=icpx
meson setup ... -Denable_sycl=true), calls gen-sycl-compile-commands.py
to augment compile_commands.json, then invokes clang-tidy-sycl.sh on
changed SYCL TUs in parallel.  continue-on-error: true (advisory) until
one green master run confirms the wrapper holds across all 21 SYCL TUs.

File paths updated from pre-ADR-0700 libvmaf/ to core/ throughout.
docs/state.md: T-SYCL-CLANG-TIDY-DISABLED moved from open to resolved.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore(ci): promote docker-image.yml smoke step to blocking

3 consecutive green master runs met the T-DOCKER-SMOKE promotion criterion.

Changes:
- Remove `continue-on-error: true` from the Docker Image Build job.
- Add a CPU score-assertion smoke step: runs `vmaf --backend cpu` inside
  the built image against the 576x324 YUV fixture pair in `testdata/`,
  asserts mean VMAF ≈ 94.32 ± 0.5 (model vmaf_v0.6.1.json). This proves
  the binary executes correctly, not merely that the Dockerfile parses.
- Raise timeout from 30 min to 45 min to accommodate score computation.
- Update docs/state.md: move T-DOCKER-SMOKE row to Recently closed.
- Add changelog.d/chore/promote-docker-smoke-blocking.md fragment.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(vmaf-tune): improve HTML report quality — mobile layout, failed-row affordances, axis alignment

Five concrete issues found in the profile-card renderer:

1. Missing <meta name="viewport"> — without it, every mobile browser
   renders the report at ~980 px desktop width, requiring pinch-zoom
   just to read codec tables.

2. Light-mode --ok / --bad CSS variables were absent from the
   @media (prefers-color-scheme: light) block. The dark-mode green
   (#4caf50) and red (#ef5350) fail WCAG AA contrast against the
   light-mode #fff panel background. Added #2e7d32 / #c62828 overrides
   which clear 4.5:1 on white.

3. Numeric table-header alignment mismatch. td.num right-aligned all
   data cells but <th> headers stayed left-aligned, making columns
   appear shifted. Added th.num selector to the CSS and applied
   class='num' to bitrate, CRF, encode-time, and VMAF header cells
   in both the codec-comparison and sweep-summary tables.

4. Failed-row affordances. Failed CodecRow and sweep rows now carry
   class='failed' on the <tr>, which applies opacity: 0.7 so the
   dimmed row is immediately distinguishable from successful rows.
   The .tag.bad inline span alone was insufficient at a glance.

5. Pre block for the JSON dump had no max-height / scroll cap —
   large reports pushed the JSON block to 60+ rem, forcing the reader
   to scroll past it. Added max-height: 28rem + overflow-y: auto.
   Also added min-width: 320px to .chart svg so charts do not
   collapse below readability on narrow viewports.

Additionally: .table-scroll gets -webkit-overflow-scrolling: touch for
iOS momentum-scroll, and .kv grid falls back to a narrower column on
screens ≤ 480 px.

No logic changes; pure renderer / CSS fixes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore(backlog): close stale T-CPP23-READ-JSON-MODEL row (PR #531 already converted)

The T-CPP23-READ-JSON-MODEL-PENDING-2026-05-29 row in docs/state.md
was stale: the read_json_model.c → read_json_model.cpp C++23 conversion
landed in PR #531 (2026-06-02) as part of ADR-0846 Wave 8. Remove the
Open row and add a Recently Closed entry citing PR #531 + ADR-0846.

No production code changes.

---------

Co-authored-by: Lusoris <lusoris@pm.me>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
@lusoris lusoris added this to the 1.0.0 — First release milestone Sep 4, 2026
lusoris added a commit that referenced this pull request Sep 20, 2026
…cated

core/test/meson.build registered test_log twice: #315 wired it in as an
orphan test, and #531 added a second test() under a comment saying it had
never been registered, so it ran twice in every fast-suite run. The
second registration and its now-false comment go.

Folding the stack duplicated two pieces of docs/state.md: the closed row
for T-HIP-ADM-TESTS-STALE-SHOULD-FAIL, which master already carries from
each stacked branch had revised in turn. The header is one sentence
again, carrying all nine ids. Six resurrected old-register lines in
core/src/feature/hip/AGENTS.md, exact duplicates of the paragraph above
them, are removed.
lusoris added a commit that referenced this pull request Sep 20, 2026
…cated

core/test/meson.build registered test_log twice: #315 wired it in as an
orphan test, and #531 added a second test() under a comment saying it had
never been registered, so it ran twice in every fast-suite run. The
second registration and its now-false comment go.

Folding the stack duplicated two pieces of docs/state.md: the closed row
for T-HIP-ADM-TESTS-STALE-SHOULD-FAIL, which master already carries from
each stacked branch had revised in turn. The header is one sentence
again, carrying all nine ids. Six resurrected old-register lines in
core/src/feature/hip/AGENTS.md, exact duplicates of the paragraph above
them, are removed.
lusoris added a commit that referenced this pull request Sep 20, 2026
…cated

core/test/meson.build registered test_log twice: #315 wired it in as an
orphan test, and #531 added a second test() under a comment saying it had
never been registered, so it ran twice in every fast-suite run. The
second registration and its now-false comment go.

Folding the stack duplicated two pieces of docs/state.md: the closed row
for T-HIP-ADM-TESTS-STALE-SHOULD-FAIL, which master already carries from
each stacked branch had revised in turn. The header is one sentence
again, carrying all nine ids. Six resurrected old-register lines in
core/src/feature/hip/AGENTS.md, exact duplicates of the paragraph above
them, are removed.
lusoris added a commit that referenced this pull request Sep 20, 2026
…cated

core/test/meson.build registered test_log twice: #315 wired it in as an
orphan test, and #531 added a second test() under a comment saying it had
never been registered, so it ran twice in every fast-suite run. The
second registration and its now-false comment go.

Folding the stack duplicated two pieces of docs/state.md: the closed row
for T-HIP-ADM-TESTS-STALE-SHOULD-FAIL, which master already carries from
each stacked branch had revised in turn. The header is one sentence
again, carrying all nine ids. Six resurrected old-register lines in
core/src/feature/hip/AGENTS.md, exact duplicates of the paragraph above
them, are removed.
lusoris added a commit that referenced this pull request Sep 20, 2026
…cated

core/test/meson.build registered test_log twice: #315 wired it in as an
orphan test, and #531 added a second test() under a comment saying it had
never been registered, so it ran twice in every fast-suite run. The
second registration and its now-false comment go.

Folding the stack duplicated two pieces of docs/state.md: the closed row
for T-HIP-ADM-TESTS-STALE-SHOULD-FAIL, which master already carries from
each stacked branch had revised in turn. The header is one sentence
again, carrying all nine ids. Six resurrected old-register lines in
core/src/feature/hip/AGENTS.md, exact duplicates of the paragraph above
them, are removed.
lusoris added a commit that referenced this pull request Sep 20, 2026
…cated

core/test/meson.build registered test_log twice: #315 wired it in as an
orphan test, and #531 added a second test() under a comment saying it had
never been registered, so it ran twice in every fast-suite run. The
second registration and its now-false comment go.

Folding the stack duplicated two pieces of docs/state.md: the closed row
for T-HIP-ADM-TESTS-STALE-SHOULD-FAIL, which master already carries from
each stacked branch had revised in turn. The header is one sentence
again, carrying all nine ids. Six resurrected old-register lines in
core/src/feature/hip/AGENTS.md, exact duplicates of the paragraph above
them, are removed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant