Skip to content

Harden QuickBook format#125

Merged
wpak-ai merged 5 commits into
cppalliance:developfrom
whisper67265:feature/harden-quickbook-format
Jun 22, 2026
Merged

Harden QuickBook format#125
wpak-ai merged 5 commits into
cppalliance:developfrom
whisper67265:feature/harden-quickbook-format

Conversation

@whisper67265

@whisper67265 whisper67265 commented Jun 17, 2026

Copy link
Copy Markdown
Collaborator

Close #115, close #116.

Summary by CodeRabbit

Release Notes

  • Bug Fixes

    • Improved QuickBook parsing robustness near end-of-input and clarified behavior for content beyond the recursion depth limit.
  • New Features

    • Added QuickBook parser benchmarks to CI, generating artifacts and supporting optional regression gating against stored baselines.
  • Tests

    • Expanded Hypothesis property/fuzz coverage for QuickBook parsing, Unicode edge cases, and translation/segment invariants.
    • Tuned test execution with dedicated Hypothesis profiles and updated pytest/benchmark configuration.
  • Documentation

    • Updated README and CI docs with benchmark run, comparison, and baseline refresh guidance.

@coderabbitai

coderabbitai Bot commented Jun 17, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 747541e5-58a7-442a-b820-3313c99fa5a5

📥 Commits

Reviewing files that changed from the base of the PR and between 5c5177d and 4082e5a.

📒 Files selected for processing (1)
  • README.md
✅ Files skipped from review due to trivial changes (1)
  • README.md

📝 Walkthrough

Walkthrough

Fixes a backslash-escape EOF boundary bug in the QuickBook parser. Adds Hypothesis property-based fuzz testing to validate parser safety, segment invariants, and translation round-trips. Introduces pytest-benchmark performance testing with synthetic document generation, peak memory profiling, and CI automation including baseline artifact tracking and local comparison support. Configures both testing frameworks as dev dependencies with environment-driven profile selection and pytest markers.

Changes

QuickBook parser fuzz testing and benchmarking

Layer / File(s) Summary
QuickBook parser EOF boundary fix and documentation update
src/boost_weblate/utils/quickbook.py
Module documentation clarified that recursive parsing beyond the depth limit (10) silently skips nested translatable content rather than raising an error. _find_bracket_end backslash-escape advance changed from fixed +2 to min(2, n - i) to prevent index overrun at end of string.
Testing dependencies and pytest configuration
pyproject.toml, .github/workflows/ci-test.yml, tests/conftest.py
hypothesis==6.155.3 added to all three dev dependency groups. Pytest configuration updated to exclude plugin and benchmark tests by default, register benchmark and fuzz markers, and configure tool.pytest-benchmark (min_rounds, warmup). Manifest checker ignore rules expanded to exclude benchmark artifacts. HYPOTHESIS_PROFILE=ci set in CI workflow env. Hypothesis ci and dev profiles registered in conftest.py with profile-specific max_examples and deadline, loaded from HYPOTHESIS_PROFILE environment variable.
Hypothesis fuzz property tests for QuickBook parser and translation
tests/utils/test_quickbook.py
Hypothesis and tracemalloc imports added. Extended imports to include _apply_translations and _clean_cell_text utility functions. Hypothesis strategies added to generate arbitrary safe text, structured nested documents (sections, admonitions, blocks), and Unicode-edge variants (RTL marks, ZWJ/ZWNJ, combining marks, emoji). Property test with offset validation helper asserts parser bounds safety, segment offset invariants, identity translation round-trips, and QuickBookFile.parse filesrc preservation. Fuzz corpus tests cover empty input, large unclosed brackets, section nesting beyond recursion cap, RTL-wrapped headings, invalid UTF-8 decode, and very long/large inputs.
Benchmark tests for QuickBook parser performance
tests/utils/test_quickbook.py
Synthetic QuickBook document generation with LRU caching and size validation. @pytest.mark.benchmark tests measure parsing throughput on generated fixtures, full QuickBookFile.parse latency, and peak memory consumption using tracemalloc with 1MB threshold assertion.
CI benchmark workflow and artifact handling
.github/workflows/ci-benchmark.yml, .github/workflows/ci.yml, .benchmarks/Linux-CPython-3.14-64bit/0001_baseline.json, .gitignore
New reusable workflow ci-benchmark.yml runs pytest benchmark tests with optional baseline comparison, generates markdown summary of timing and memory metrics, and uploads benchmark-results.json artifact with PR-based naming. Baseline JSON fixture contains machine metadata, commit state, and comprehensive benchmark results with timing statistics. .github/workflows/ci.yml integrates new benchmark job alongside lint and test. .gitignore updated to ignore benchmark artifacts while allowing committed baseline.
Benchmark workflow and local testing documentation
.github/WORKFLOWS.md, README.md
.github/WORKFLOWS.md documents benchmark workflow table entry, fixture execution approach, artifact output, baseline comparison with regression gating, environment variable controls, and refresh instructions. README.md CI section lists benchmark job; "Contributing" section adds "Parser benchmarks" subsection with local execution commands, baseline comparison with default regression threshold, baseline save/refresh, and example observed metrics.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐇 With Hypothesis I fuzz through brackets deep,
And benchmark tests clock each parsing leap—
No EOF surprises, just min(2, n - i) care,
From baseline baselines to artifacts fair.
Property, performance, and peace of mind,
A safer parser we've designed! 🌿

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (1 warning, 2 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.52% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title "Harden QuickBook format" is vague and does not clearly describe the main changes. While it loosely relates to parser improvements, it does not convey that the PR adds fuzz/property testing, fixes a critical backslash-escape bug, or introduces benchmark infrastructure. Consider a more descriptive title such as "Add Hypothesis fuzz tests and fix QuickBook parser backslash handling" or "Harden QuickBook parser with property tests and edge-case fixes".
Out of Scope Changes check ❓ Inconclusive Most changes are in-scope for hardening the parser and adding fuzz tests. However, benchmark infrastructure (.benchmarks/, ci-benchmark.yml, pytest-benchmark config, and memory profiling) extends beyond issue #115's stated scope of fuzz testing and is more aligned with performance validation. Clarify whether benchmark infrastructure and memory profiling are intentional additions to this PR or should be separated into a follow-up for performance validation and regression detection.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed All acceptance criteria from issue #115 are met: Hypothesis profiles configured in conftest.py; arbitrary/structured/Unicode strategies added; property tests for parse safety, offset invariants, identity round-trip, and bounded output; targeted fuzz corpus tests covering empty input, unclosed brackets, depth-beyond-cap, RTL headings, invalid UTF-8, long lines, and large sections; end-of-string backslash fix in _find_bracket_end; parser docs updated; and CI configured with HYPOTHESIS_PROFILE environment variable.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
tests/utils/test_quickbook.py (1)

486-490: ⚡ Quick win

Add a deterministic regression test for the EOF trailing-backslash bracket case.

Line 486 fuzz corpus is broad, but it does not explicitly pin the exact _find_bracket_end boundary that this PR hardens. A direct regression test here will keep this fix protected even if strategy weighting changes.

Proposed diff
 `@pytest.mark.fuzz`
 def test_fuzz_corpus_unclosed_brackets() -> None:
     data = "[" * 5000
     _parse_qbk(data)
     assert _apply_translations(data, lambda s: s) == data
 
 
+@pytest.mark.fuzz
+def test_fuzz_corpus_trailing_escape_before_eof() -> None:
+    data = "[h2 trailing escape \\"
+    assert _find_bracket_end(data, 0) == -1
+    assert _parse_qbk(data) == []
+    assert _apply_translations(data, lambda s: s) == data
+
+
 `@pytest.mark.fuzz`
 def test_fuzz_corpus_section_depth_beyond_cap() -> None:
     data = "[section " + "[nested\n" * 15 + "body\n" * 15
     _parse_qbk(data)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/utils/test_quickbook.py` around lines 486 - 490, The current
test_fuzz_corpus_unclosed_brackets is a broad fuzz test that does not explicitly
cover the specific boundary condition for EOF trailing-backslash bracket cases
that the PR hardens. Add a new deterministic regression test function that
directly tests the exact scenario where _find_bracket_end encounters a backslash
followed by an unclosed bracket at the end of file. This targeted test will
ensure the specific fix for this boundary condition in _find_bracket_end remains
protected even if the fuzz test strategy changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@tests/utils/test_quickbook.py`:
- Around line 486-490: The current test_fuzz_corpus_unclosed_brackets is a broad
fuzz test that does not explicitly cover the specific boundary condition for EOF
trailing-backslash bracket cases that the PR hardens. Add a new deterministic
regression test function that directly tests the exact scenario where
_find_bracket_end encounters a backslash followed by an unclosed bracket at the
end of file. This targeted test will ensure the specific fix for this boundary
condition in _find_bracket_end remains protected even if the fuzz test strategy
changes.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c2ce18da-4ca9-4fe7-9442-703165ae3f0a

📥 Commits

Reviewing files that changed from the base of the PR and between ec49aeb and 66d1f92.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (5)
  • .github/workflows/ci-test.yml
  • pyproject.toml
  • src/boost_weblate/utils/quickbook.py
  • tests/conftest.py
  • tests/utils/test_quickbook.py

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
.github/workflows/ci-benchmark.yml (1)

51-83: ⚡ Quick win

Publish the benchmark table to the GitHub job summary, not only logs.

The script builds markdown output but currently only prints to stdout. Writing it to $GITHUB_STEP_SUMMARY makes results immediately visible in the Actions UI.

♻️ Suggested patch
     - name: Benchmark summary
       if: always()
       run: |
-        uv run --group dev python - <<'PY'
+        uv run --group dev python - <<'PY'
         import json
+        import os
         from pathlib import Path
 
         path = Path("benchmark-results.json")
         if not path.is_file():
             print("benchmark-results.json not found; skipping summary")
             raise SystemExit(0)
 
         data = json.loads(path.read_text(encoding="utf-8"))
-        print("## QuickBook parser benchmark summary")
-        print()
-        print("| Benchmark | Mean (s) | Min (s) | Max (s) |")
-        print("|-----------|----------|---------|---------|")
+        lines = []
+        lines.append("## QuickBook parser benchmark summary")
+        lines.append("")
+        lines.append("| Benchmark | Mean (s) | Min (s) | Max (s) |")
+        lines.append("|-----------|----------|---------|---------|")
         for bench in data.get("benchmarks", []):
             name = bench.get("name", "?")
             stats = bench.get("stats", {})
             mean_s = stats.get("mean", 0.0)
             min_s = stats.get("min", 0.0)
             max_s = stats.get("max", 0.0)
             extra = bench.get("extra_info", {})
             if extra.get("peak_mib") is not None:
-                print(
-                    f"| {name} (peak memory) | {extra['peak_mib']} MiB | — | — |"
-                )
+                lines.append(
+                    f"| {name} (peak memory) | {extra['peak_mib']} MiB | — | — |"
+                )
                 continue
-            print(
-                f"| {name} | {mean_s:.4f} | {min_s:.4f} | {max_s:.4f} |"
-            )
+            lines.append(f"| {name} | {mean_s:.4f} | {min_s:.4f} | {max_s:.4f} |")
+
+        summary = "\n".join(lines)
+        print(summary)
+        step_summary = os.environ.get("GITHUB_STEP_SUMMARY")
+        if step_summary:
+            Path(step_summary).write_text(summary + "\n", encoding="utf-8")
         PY
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci-benchmark.yml around lines 51 - 83, The benchmark
summary script prints markdown output only to stdout, making it visible only in
the workflow logs rather than the GitHub Actions job summary. Modify the Python
script within the PY heredoc block to write the output to the file specified by
the $GITHUB_STEP_SUMMARY environment variable. Instead of using print statements
throughout the script, capture or redirect all the markdown output (the header,
table headers, and table rows) to write to the file path obtained from the
GITHUB_STEP_SUMMARY environment variable. This will make the benchmark results
immediately visible in the Actions UI.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In @.github/workflows/ci-benchmark.yml:
- Around line 51-83: The benchmark summary script prints markdown output only to
stdout, making it visible only in the workflow logs rather than the GitHub
Actions job summary. Modify the Python script within the PY heredoc block to
write the output to the file specified by the $GITHUB_STEP_SUMMARY environment
variable. Instead of using print statements throughout the script, capture or
redirect all the markdown output (the header, table headers, and table rows) to
write to the file path obtained from the GITHUB_STEP_SUMMARY environment
variable. This will make the benchmark results immediately visible in the
Actions UI.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1a2b59da-7a6f-43c1-97f7-fef9581e49ab

📥 Commits

Reviewing files that changed from the base of the PR and between 66d1f92 and 40da0e3.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (8)
  • .benchmarks/Linux-CPython-3.14-64bit/0001_baseline.json
  • .github/WORKFLOWS.md
  • .github/workflows/ci-benchmark.yml
  • .github/workflows/ci.yml
  • .gitignore
  • README.md
  • pyproject.toml
  • tests/utils/test_quickbook.py
✅ Files skipped from review due to trivial changes (2)
  • .github/workflows/ci.yml
  • .github/WORKFLOWS.md
🚧 Files skipped from review as they are similar to previous changes (2)
  • pyproject.toml
  • tests/utils/test_quickbook.py

@whisper67265

Copy link
Copy Markdown
Collaborator Author

@coderabbitai, full review.

@coderabbitai

coderabbitai Bot commented Jun 17, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
echo "=== quickbook.py ==="
cat src/boost_weblate/utils/quickbook.py

echo ""
echo "=== tests/utils/test_quickbook.py ==="
cat tests/utils/test_quickbook.py

echo ""
echo "=== tests/conftest.py ==="
cat tests/conftest.py

echo ""
echo "=== pyproject.toml ==="
cat pyproject.toml

echo ""
echo "=== .github/workflows/ci-test.yml ==="
cat .github/workflows/ci-test.yml

echo ""
echo "=== .github/workflows/ci-benchmark.yml ==="
cat .github/workflows/ci-benchmark.yml

echo ""
echo "=== .github/workflows/ci.yml ==="
cat .github/workflows/ci.yml

echo ""
echo "=== .gitignore ==="
cat .gitignore

echo ""
echo "=== .github/WORKFLOWS.md ==="
cat .github/WORKFLOWS.md

Length of output: 69090



@whisper67265 Here is the full review.


Review of PR #125 — Harden QuickBook format

src/boost_weblate/utils/quickbook.py

The EOF fix in _find_bracket_end is correct. When i == n-1 (a trailing \ at end-of-string), min(2, n - i) evaluates to 1, advancing to n and exiting the loop cleanly instead of reading text[n]. The docstring update ("silently skips") also accurately describes the depth-cap behaviour.


tests/utils/test_quickbook.py

1. Redundant length assertion before equality check (minor)

In test_parse_qbk_fuzz_properties:

result = _apply_translations(data, lambda s: s)
assert len(result) <= len(data)   # implied by the line below; gives worse diagnostics
assert result == data

The <= inequality is always satisfied when result == data. Swap the order so the stronger assertion fires first with a clearer failure message:

result = _apply_translations(data, lambda s: s)
assert result == data

2. Hardcoded peak-memory limit is fragile

_PEAK_MEMORY_LIMIT_BYTES = 12 * 1024 * 1024

The inline comment acknowledges this is "2× observed peak on ubuntu-latest / Python 3.14". tracemalloc measurements vary with GC pressure, Python minor versions, and runner load. Consider making this configurable via an environment variable with the constant as a fallback:

_PEAK_MEMORY_LIMIT_BYTES = int(
    os.environ.get("QBK_PEAK_MEMORY_LIMIT_BYTES", 12 * 1024 * 1024)
)

3. sys.path manipulation is intentional but should be commented

conftest.py's pytest_configure already inserts src/ into sys.path under pytest. The duplicate insertion at module level in the test file is intentional to support standalone execution (python tests/utils/test_quickbook.py), but a reader may try to remove it as dead code. A one-liner comment would prevent that:

# Needed for standalone execution (python tests/utils/test_quickbook.py);
# pytest picks this up via conftest.pytest_configure instead.
sys.path.insert(0, str(_REPO_ROOT / "src"))

4. _assert_segment_offsets paragraph invariant gap

The helper validates msgid↔span equality only for no_wrap=True segments. For paragraphs and lists (no_wrap=False) only the span-non-empty check fires. An off-by-one in the paragraph accumulation loop would pass undetected. Consider adding a loose check for the unwrapped case:

if not seg.no_wrap and seg.msgid:
    # msgid normalises soft-wrapped lines; at minimum every word in msgid
    # must appear in the raw span.
    assert all(word in raw for word in seg.msgid.split()), (
        f"paragraph msgid word not found in span: {seg.msgid!r} vs {raw!r}"
    )

pyproject.toml ⚠️

fuzz marker is not excluded from the default test run

addopts = ["-m", "not plugin and not benchmark"]

The fuzz marker is documented as "may be slow locally" but is not in the exclusion filter. Under the ci Hypothesis profile (50 examples) it is fast enough, but local developers who haven't set HYPOTHESIS_PROFILE=ci will run with the ci profile anyway (conftest default) — so this is manageable. However, for consistency with benchmark, consider excluding it too and noting that running pytest -m fuzz opt-in:

addopts = ["-m", "not plugin and not benchmark and not fuzz"]

.github/workflows/ci-benchmark.yml ⚠️

Benchmark comparison default is true on every push — potential flakiness

BENCHMARK_COMPARE_ENABLED: ${{ vars.BENCHMARK_COMPARE_ENABLED || 'true' }}
BENCHMARK_COMPARE_FAIL: ${{ vars.BENCHMARK_COMPARE_FAIL || 'mean:20%' }}

Free GitHub Actions runners have notable run-to-run variance (±15–30% is common). A 20% threshold will occasionally trigger false regressions on busy runners. Options:

  • Widen the default to mean:30% or mean:40% while keeping the documented baseline refresh instructions.
  • Or default BENCHMARK_COMPARE_ENABLED to false and enable it only on pushes to main/develop (not PRs).

.github/workflows/ci.yml (minor)

benchmark job has no needs: guard

jobs:
  lint:
    uses: ./.github/workflows/ci-lint.yml
  test:
    uses: ./.github/workflows/ci-test.yml
  benchmark:
    uses: ./.github/workflows/ci-benchmark.yml   # runs even when test fails

Benchmark results are meaningless if the test suite is broken. Adding needs: [test] avoids wasting 15 minutes of runner time on broken branches:

benchmark:
  needs: [test]
  uses: ./.github/workflows/ci-benchmark.yml

Summary

Severity File Finding
✅ Correct quickbook.py EOF fix in _find_bracket_end is sound
⚠️ Fragile test_quickbook.py Hardcoded _PEAK_MEMORY_LIMIT_BYTES
⚠️ Flaky CI ci-benchmark.yml Default 20% comparison threshold on free runners
Minor ci.yml benchmark should needs: [test]
Minor test_quickbook.py Redundant len(result) <= len(data) assertion
Minor pyproject.toml fuzz not excluded from default run
Nit test_quickbook.py sys.path duplication should be commented

The core bug fix and overall test structure are solid. The Hypothesis strategy composition is well-done and the corpus tests cover real-world edge cases. The main actionable items are the benchmark comparison threshold and the needs: guard in ci.yml.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
README.md (1)

386-416: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Make the benchmark threshold wording consistent.

The prose still says default 20% mean, but the command and CI note use mean:30%. That mismatch will confuse anyone trying to reproduce or refresh the baseline.

♻️ Suggested fix
-Compare against the committed baseline and fail on regression (default 20% mean):
+Compare against the committed baseline and fail on regression (default 30% mean):
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 386 - 416, The prose text in the benchmark section
contains a mismatch with the actual command configuration. The opening line
states "default 20% mean" in parentheses, but the bash command immediately below
uses `--benchmark-compare-fail=mean:30%`, and the CI configuration note also
references `mean:30%`. Update the parenthetical text that says "default 20%
mean" to "default 30% mean" to match the actual threshold values used in the
commands and CI configuration throughout this section.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@README.md`:
- Around line 386-416: The prose text in the benchmark section contains a
mismatch with the actual command configuration. The opening line states "default
20% mean" in parentheses, but the bash command immediately below uses
`--benchmark-compare-fail=mean:30%`, and the CI configuration note also
references `mean:30%`. Update the parenthetical text that says "default 20%
mean" to "default 30% mean" to match the actual threshold values used in the
commands and CI configuration throughout this section.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4a519e53-f5bc-4349-9332-3880ff62f029

📥 Commits

Reviewing files that changed from the base of the PR and between 0702778 and 5c5177d.

📒 Files selected for processing (7)
  • .github/WORKFLOWS.md
  • .github/workflows/ci-benchmark.yml
  • .github/workflows/ci-test.yml
  • .github/workflows/ci.yml
  • README.md
  • pyproject.toml
  • tests/utils/test_quickbook.py
✅ Files skipped from review due to trivial changes (1)
  • .github/WORKFLOWS.md
🚧 Files skipped from review as they are similar to previous changes (5)
  • .github/workflows/ci-test.yml
  • .github/workflows/ci.yml
  • pyproject.toml
  • .github/workflows/ci-benchmark.yml
  • tests/utils/test_quickbook.py

Comment thread README.md Outdated
@AuraMindNest

Copy link
Copy Markdown
Collaborator

@coderabbitai, resume.

@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown

@AuraMindNest: Sure, resuming automatic reviews for this PR.

✅ Action performed

Reviews resumed.

@henry0816191 henry0816191 requested review from wpak-ai and removed request for henry0816191 June 18, 2026 23:46
@wpak-ai wpak-ai merged commit 115a8d2 into cppalliance:develop Jun 22, 2026
18 of 19 checks passed
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.

Parser benchmarks for large QuickBook files Fuzz/property-based tests for QuickBook parser

4 participants