Skip to content

Improve Rust test fixtures and assertions - #706

Merged
leynos merged 5 commits into
mainfrom
test-quality-sweep
Sep 27, 2026
Merged

leynos merged 5 commits into
mainfrom
test-quality-sweep

Conversation

@leynos

@leynos leynos commented Sep 23, 2026 •

Copy link
Copy Markdown
Owner

Summary

This branch makes test setup and assertions fallible where failure is possible, replaces redundant assertion and extraction sequences, and removes twelve source-level lint expectations. Fixed non-zero test budgets now fail at compile time if changed to zero. The callback helpers retain their original first-poll timing.

This is the test-quality layer above #705 (harden-dev-tooling). Spelling, structural module moves, production lint fixes, and final enforcement remain in later layers.

Review walkthrough

Validation

On 08c834f76b138757d41b9722ef93ea3019b628d5 against the merged #705
landing commit 1dadc1c, the full own-configuration commit gates passed
sequentially: make check-fmt, make spelling, make lint, make typecheck,
make test, make markdownlint, make nixie, make test-doc,
make test-workflow-contracts, make formal-pr, and mbake validate Makefile.
The test suite includes the zero_test_budget trybuild contract. The five
child commits replayed with exact = range-diff results; the PR changes the
original 15 test paths and docs/developers-guide.md. Current-head
build-test
and CodeQL
completed successfully.

Notes

This layer is above merged #705
and below #708. Spelling follows
in #709, then module moves in
#710. CodeRabbit's current
Docstring Coverage check passes at 88.24% (51 functions). Its Developer
Documentation warning is resolved by the new guide section, and
CodeRabbit confirmed approval.

References

@coderabbitai

coderabbitai Bot commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Team

Run ID: 4584fa9f-609d-471f-853a-89aec766c841

📥 Commits

Reviewing files that changed from the base of the PR and between 0e1e29a and fc3268d.

📒 Files selected for processing (8)
  • src/client/tests/error_handling.rs
  • src/client/tests/lifecycle.rs
  • src/fragment/tests/adapter_tests.rs
  • src/message_assembler/budget_tests.rs
  • tests/compile_error.rs
  • tests/support/non_zero.rs
  • tests/ui/zero_test_budget.rs
  • tests/ui/zero_test_budget.stderr
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • leynos/monotony (auto-detected)
  • leynos/rust-prover-tools (auto-detected)
  • leynos/mapsplice (auto-detected)
  • leynos/whitaker (auto-detected) → reviewed against open PR #362 test-quality-sweep instead of the default branch
  • leynos/mdtablefix (auto-detected)
  • leynos/typos-config-builder (auto-detected)
  • leynos/nixie (auto-detected)
  • leynos/shared-actions (auto-detected)
  • leynos/mxd (auto-detected)
  • leynos/mxd-www (auto-detected)

Included review availability: 2 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 3 reviews per hour.


Summary

  • Reuse test callbacks while preserving their first-poll timing. Remove obsolete Clippy lint expectations.
  • Add a const-checked nz! macro for test budgets. A zero budget now fails at compile time, with a compile-fail fixture that checks the diagnostic.
  • Use fallible setup and assertions in response, frame-header, fragment-adapter and server-runtime tests.
  • Add shared response-test checks for frame count and payload length. Preserve the existing predicates and diagnostic text.
  • Simplify streaming payload generation and assertions.
  • This test-only change is part of the layered work targeting issue #705.

Validation

The author reports that formatting, lint, typecheck, workflow-contract checks and workspace tests passed sequentially on the final tree. The author also reports that CodeScene passed all six gates on the current head. Docstring Coverage remains unverified; no current-head count or pass result was confirmed.

Walkthrough

This change updates test helpers and assertions across inbound decoding, client callbacks and streaming, fragmentation, message assembly, server runtime, and response tests. It replaces several assertion-based checks with propagated or descriptive errors, and uses reusable futures and compile-time non-zero budget construction.

Changes

Test Helper and Assertion Updates

Layer / File(s) Summary
Client callback and streaming test helpers
src/client/tests/*
Client tests use reusable futures for callback counts and state updates. Streaming tests report payload mismatches and unexpected items, and generate the repeating byte pattern with a u8 range cycle.
Fragmentation configuration and non-zero budget fixtures
src/fragment/tests/adapter_tests.rs, src/message_assembler/budget_tests.rs, src/message_assembler/budget_enforcement_tests.rs, tests/support/non_zero.rs, tests/compile_error.rs, tests/ui/zero_test_budget.rs, tests/ui/zero_test_budget.stderr
Fragmentation tests construct configuration directly. Assembly budget fixtures use the nz! macro, and a compile-fail test checks its zero-value guard.
Decode and frame-header result handling
src/app/inbound_handler/tests.rs, src/message_assembler/tests.rs
Tests check decode and header parsing results explicitly.
Runtime and response test error reporting
src/server/runtime/tests.rs, tests/response.rs
Runtime tests propagate timeout and server errors. Response tests use helpers that return errors for frame-count and payload-length mismatches.

Priority: ⬇️ Low

Change: Other

Merge Risk: ⚪ Minimal · up to fc326

No concrete correctness or runtime risk was identified in the test-only changes; the PR is mergeable with normal checks.

🚥 Pre-merge checks | ✅ 14 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Developer Documentation ⚠️ Warning Fail the check. The pull request adds the shared internal nz! test macro in tests/support/non_zero.rs, includes it from fragment and message-assembler tests, and adds a compile-fail UI contract fo… Update docs/developers-guide.md in the test-infrastructure section. Document tests/support/non_zero.rs, both nz! forms, the compile-time rejection of zero values, the modules that include the helper, and the required tests/ui/*.rs p…
✅ Passed checks (14 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 88.24% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 51 functions across 14 files. (1 skipped: 1…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Testing (Overall) ✅ Passed Pass. The reviewed range changes test code only; it introduces no production functionality or production behaviour. The existing tests retain substantive behavioural oracles: client error and lifecycl…
User-Facing Documentation ✅ Passed Treat the documentation check as passed. The reviewed diff changes only Rust test modules, test helpers, response assertions, and a compile-fail fixture. It adds no user-facing API, application behavi…
Module-Level Documentation ✅ Passed Accept the module documentation check. Every changed Rust module has a leading //! description of its test or fixture purpose, including the new tests/ui/zero_test_budget.rs. The new `tests/suppor…
Testing (Unit And Behavioural) ✅ Passed Pass the check. The reviewed range changes only test modules and test fixtures. Existing tests still cover client error paths, lifecycle state propagation, streaming termination and failures, fragment…
Testing (Property / Proof) ✅ Passed Pass the testing check. The pull request changes test-only code and does not introduce a production invariant over a broad input or state space. test_body keeps the existing 0–255 cycling contract w…
Testing (Compile-Time / Ui) ✅ Passed Pass the compile-time/UI check. The pull request adds tests/ui/zero_test_budget.rs and registers it with trybuild::TestCases::compile_fail in tests/compile_error.rs. The matching `zero_test_budg…
Unit Architecture ✅ Passed Pass the Unit Architecture check. The PR changes test code only and does not alter production query or command paths. It makes fallibility more visible: parse_header now returns io::Result, respon…
Domain Architecture ✅ Passed Keep the change. The reviewed range changes only test modules and test support files. It adds test-only futures, assertion helpers, compile-time fixture checks, and mock error handling. It does not ch…
Observability ✅ Passed Pass the Observability check. The authoritative diff changes only test modules, test fixtures, compile-fail fixtures, and test assertions. It adds no production operational behaviour, logging, metrics…
Title check ✅ Passed The title accurately summarises the main changes to Rust test fixtures and assertions. No roadmap or issue number is required because the description references related pull requests, not a roadmap it…
Description check ✅ Passed The description directly explains the test-quality changes, affected areas, validation results, and related pull requests.
Full details: Developer Documentation

Explanation

Fail the check. The pull request adds the shared internal nz! test macro in tests/support/non_zero.rs, includes it from fragment and message-assembler tests, and adds a compile-fail UI contract for zero budgets. The authoritative diff adds no developer-guide or design-document update. docs/developers-guide.md documents the existing trybuild workflow and general fallible test helpers, but it does not document the new nz! abstraction, its compile-time non-zero invariant, or its supported usage.

Resolution

Update docs/developers-guide.md in the test-infrastructure section. Document tests/support/non_zero.rs, both nz! forms, the compile-time rejection of zero values, the modules that include the helper, and the required tests/ui/*.rs plus .stderr registration pattern. Mark any related roadmap item complete only if this change actually completes one.


Count each callback when its future wakes.
Check each frame and report what differs.
Build non-zero limits before tests run.
Pass errors onward when checks fail.
Let the test suite trace each result.

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

@sourcery-ai

sourcery-ai Bot commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

The PR hardens Rust test code by surfacing setup and assertion failures with context, simplifying redundant checks, replacing lint-suppressed callback and byte-generation patterns, and enforcing non-zero fixture budgets at compile time without changing tested behavior or callback first-poll timing.

File-Level Changes

Change Details Files
Make fallible test setup and parsing report contextual errors instead of relying on redundant assertions or allowed unwraps.
  • Propagate timeout, parsing, mutex, and response-validation failures with descriptive messages.
  • Collapse is_ok/expect and is_some/expect assertion sequences into direct extraction or result propagation.
src/app/inbound_handler/tests.rs
src/client/tests/streaming.rs
src/fragment/tests/adapter_tests.rs
src/message_assembler/tests.rs
src/server/runtime/tests.rs
tests/response.rs
Replace test-only lint suppressions with simpler helpers and equivalent implementations while preserving callback timing and generated data.
  • Extract lifecycle and error callback futures using futures::future::lazy, retaining first-poll side effects.
  • Generate streaming bytes by cycling over the full u8 range rather than modulo and truncating casts.
  • Remove twelve source-level lint expectations.
src/client/tests/error_handling.rs
src/client/tests/lifecycle.rs
src/client/tests/send_streaming_infra.rs
src/server/runtime/tests.rs
src/message_assembler/tests.rs
Add compile-time validation for non-zero test fixture budgets and constants.
  • Replace the panicking NonZeroUsize helper with a const-checked nz! macro.
  • Use compile-time checked constants for fragment payload and message-size limits.
  • Update budget enforcement and fragment tests without changing fixture values.
src/message_assembler/budget_tests.rs
src/message_assembler/budget_enforcement_tests.rs
src/fragment/tests/adapter_tests.rs

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

codescene-access[bot]

This comment was marked as outdated.

@leynos
leynos added this pull request to stack #707 September 23, 2026 20:04
codescene-access[bot]

This comment was marked as outdated.

leynos commented Sep 23, 2026 •

Copy link
Copy Markdown
Owner Author

CodeScene’s duplication finding for tests/response.rs on the original head was addressed by the second test-quality commit, now b8b9da516c98ac7d95502d20169144b0a70e9427 after a patch-identical restack. The single_response_frame and check_payload_length helpers consolidate the repeated checks while preserving each predicate and error message. The focused response integration suite passed 24/24 before the restack; the full sequential gates passed on the current head, including Clippy, Whitaker, and workspace tests. CodeScene now passes all six gates on this exact head: https://codescene.io/projects/68308/delta/results/7666549.

The original finding was posted as a CodeScene review/check rather than an inline review thread, so this top-level comment records its disposition.

codescene-access[bot]

This comment was marked as outdated.

codescene-access[bot]

This comment was marked as outdated.

@leynos
leynos marked this pull request as ready for review September 24, 2026 03:31

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sorry @leynos, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 10 hours and 28 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-24T07:30:32.008771Z fc3268d Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@coderabbitai coderabbitai Bot added the Issue label Sep 24, 2026
@leynos
leynos marked this pull request as draft September 24, 2026 04:11
codescene-access[bot]

This comment was marked as outdated.

@leynos
leynos marked this pull request as ready for review September 24, 2026 04:26

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sorry @leynos, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 9 hours and 33 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

leynos commented Sep 24, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai Have the following failed checks now been resolved?

If further work is required, please provide an AI agent prompt for the remaining work to be done to address these failures.

Do not treat warnings as optional or aspirational.

Previously failed pre-merge checks

Check name Previous status Current-head repair and evidence
Docstring Coverage Warning: 79.59% below 80.00% Commit aeeeea38 documents the touched client callback helper's recording and return behaviour in src/client/tests/error_handling.rs. Please recount coverage on head aeeeea38f26ae9c3265d3ef9677ed0eff2a641c2.
Testing (Compile-Time / Ui) Warning: no compile-failure coverage for the nz! zero-budget guard Commit aeeeea38 extracts the actual nz! macro into shared tests/support/non_zero.rs, imports that same macro in both unit tests and the trybuild UI fixture, registers the compile-fail case in tests/compile_error.rs, and checks its E0080 diagnostic in the authored .stderr fixture. Focused red/green proof and the full sequential repository gates passed.

@coderabbitai

coderabbitai Bot commented Sep 24, 2026

Copy link
Copy Markdown
Contributor

Tip

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
printf 'HEAD: '; git rev-parse HEAD
printf 'Target exists: '; git rev-parse aeeeea38f26ae9c3265d3ef9677ed0eff2a641c2 || true
printf '\nChanged files on target commit:\n'
git show --format=fuller --stat --no-renames aeeeea38f26ae9c3265d3ef9677ed0eff2a641c2 | head -95
printf '\nRelevant filenames:\n'
fd '^(error_handling\.rs|non_zero\.rs|compile_error\.rs|.*non_zero.*\.stderr|.*non_zero.*\.rs|budget_tests\.rs|budget_enforcement_tests\.rs)$' .
printf '\nCoverage configuration and references:\n'
rg -n -i -C2 'docstring.coverage|docstring_coverage|79\.59|80\.00|documentation coverage|compile_error|trybuild' -g '!Cargo.lock' -g '!*.stderr' . | head -220
printf '\nOutlines:\n'
for f in src/client/tests/error_handling.rs tests/support/non_zero.rs tests/compile_error.rs src/message_assembler/budget_tests.rs; do if test -f "$f"; then echo "== $f"; ast-grep outline "$f" --items all | head -100; fi; done

Length of output: 7085


🏁 Script executed:

#!/bin/bash
set -u
printf 'HEAD and parents:\n'; git rev-list --parents -n 1 HEAD
printf '\nRelevant files:\n'; fd '^(error_handling\.rs|non_zero\.rs|compile_error\.rs|.*non_zero.*\.stderr|budget_tests\.rs|budget_enforcement_tests\.rs)$' .
printf '\nCoverage references:\n'; rg -n -i -C2 'docstring.coverage|docstring_coverage|79\.59|80\.00|documentation coverage|trybuild' --glob '!Cargo.lock' --glob '!*.stderr' . | sed -n '1,150p'
printf '\nFile outlines:\n'
for f in src/client/tests/error_handling.rs tests/support/non_zero.rs tests/compile_error.rs src/message_assembler/budget_tests.rs; do if test -f "$f"; then echo "== $f"; ast-grep outline "$f" --items all | sed -n '1,75p'; fi; done
printf '\nTargeted file contents:\n'
for f in src/client/tests/error_handling.rs tests/support/non_zero.rs tests/compile_error.rs src/message_assembler/budget_tests.rs; do if test -f "$f"; then echo "== $f"; nl -ba "$f" | sed -n '1,130p'; fi; done
printf '\nMacro-related uses:\n'; rg -n -C2 'non_zero\.rs|nz!\(|compile_fail|E0080|record_setup' src/client/tests src/message_assembler tests | sed -n '1,195p'

Length of output: 29212


🏁 Script executed:

#!/bin/bash
set -u
printf 'PR metadata:\n'
gh pr view 706 --repo leynos/wireframe --json headRefOid,baseRefOid,mergeBaseRefOid,statusCheckRollup,files --jq '{headRefOid,baseRefOid,mergeBaseRefOid,checks: [.statusCheckRollup[]? | {name,conclusion,status}],files:[.files[] | {path,additions,deletions}]}' 2>&1 | sed -n '1,180p'
printf '\nChanged callback helper and UI file:\n'
nl -ba src/client/tests/lifecycle.rs | sed -n '1,65p'
nl -ba tests/ui/zero_test_budget.rs
cat tests/ui/zero_test_budget.stderr
printf '\nPR diff callbacks and new compile case:\n'
gh api repos/leynos/wireframe/pulls/706/files --paginate --jq '.[] | select(.filename == "src/client/tests/error_handling.rs" or .filename == "src/client/tests/lifecycle.rs" or .filename == "tests/support/non_zero.rs" or .filename == "tests/compile_error.rs" or .filename == "tests/ui/zero_test_budget.rs") | {filename,patch}' 2>&1 | sed -n '1,205p'
printf '\nLocal documentation/coverage guidance:\n'
rg -n -i -C2 'docstring|coverage threshold|document.*helper|80%' AGENTS.md docs/documentation-style-guide.md .github Makefile | sed -n '1,135p'

Length of output: 15430


🏁 Script executed:

#!/bin/bash
set -u
printf 'PR metadata and checks:\n'
gh pr view 706 --repo leynos/wireframe --json headRefOid,baseRefOid,statusCheckRollup,files --jq '{headRefOid,baseRefOid,checks: [.statusCheckRollup[]? | {name,conclusion,status}],files:[.files[] | .path]}' 2>&1
printf '\nCheck runs:\n'
gh api repos/leynos/wireframe/commits/aeeeea38f26ae9c3265d3ef9677ed0eff2a641c2/check-runs --jq '.check_runs[] | {name,conclusion,status,details_url}' 2>&1
printf '\nDeclarations introduced in PR (plus immediate preceding doc comments):\n'
gh api repos/leynos/wireframe/pulls/706/files --paginate | python -c '
import json,sys,re
files=json.load(sys.stdin)
for f in files:
 patch=f.get("patch","")
 if not patch: continue
 arr=patch.splitlines()
 hits=[]
 for i,line in enumerate(arr):
  if re.match(r"^\+\s*(?:pub(?:\([^)]*\))?\s+)?(?:async\s+)?(?:fn|macro_rules!)\s+",line):
   k=i-1
   while k>=0 and arr[k].startswith("+") and not arr[k][1:].strip():k-=1
   docs=[]
   while k>=0 and arr[k].startswith("+") and arr[k][1:].lstrip().startswith(("///","//!")):
    docs.append(arr[k][1:].strip());k-=1
   hits.append((line[1:].strip(),bool(docs)))
 if hits:
  print(f["filename"],"added declarations:",len(hits),"documented:",sum(d for _,d in hits))
  for decl,doc in hits:print(" ", "DOC" if doc else "UNDOC", decl[:100])
' 2>&1 | sed -n '1,195p'

Length of output: 5798


🏁 Script executed:

#!/bin/bash
set -u
printf 'Commit metadata:\n'
gh api repos/leynos/wireframe/commits/aeeeea38f26ae9c3265d3ef9677ed0eff2a641c2 --jq '{parents:[.parents[].sha], files:[.files[]|{filename,patch}]}' | sed -n '1,140p'
printf '\nPR comments containing coverage or UI concerns:\n'
gh api repos/leynos/wireframe/issues/706/comments --paginate --jq '.[] | select(.body | test("79.59|Docstring Coverage|compile.failure|zero.test.budget";"i")) | {user:.user.login,body:.body}' | sed -n '1,145p'
printf '\nPR review bodies with metric:\n'
gh api repos/leynos/wireframe/pulls/706/reviews --paginate --jq '.[] | select((.body // "") | test("79.59|Docstring Coverage|80.00";"i")) | {user:.user.login,body:.body}' | sed -n '1,110p'
printf '\nPR inline review comments with metric:\n'
gh api repos/leynos/wireframe/pulls/706/comments --paginate --jq '.[] | select((.body // "") | test("79.59|Docstring Coverage|80.00";"i")) | {user:.user.login,body:.body}' | sed -n '1,110p'

Length of output: 22131


🏁 Script executed:

#!/bin/bash
set -u
printf 'Function documentation vicinity in new touched files:\n'
nl -ba tests/compile_error.rs | sed -n '1,25p'
nl -ba tests/ui/zero_test_budget.rs | sed -n '1,25p'
printf '\nDoc coverage in previously selected 11 files (simple declaration count with immediate doc comments):\n'
python - <<'PY'
import re
paths = ["src/app/inbound_handler/tests.rs","src/client/tests/error_handling.rs","src/client/tests/lifecycle.rs","src/client/tests/send_streaming_infra.rs","src/client/tests/streaming.rs","src/fragment/tests/adapter_tests.rs","src/message_assembler/budget_enforcement_tests.rs","src/message_assembler/budget_tests.rs","src/message_assembler/tests.rs","src/server/runtime/tests.rs","tests/response.rs"]
total=doc=0
for p in paths:
    a=open(p).read().splitlines()
    functions=[]
    for i,line in enumerate(a):
        if re.match(r'^\s*(?:(?:pub(?:\([^)]*\))?|async|unsafe|const)\s+)*fn\s+[A-Za-z_]\w*\b',line):
            j=i-1
            while j>=0 and (a[j].strip().startswith('#[') or a[j].strip()==''): j-=1
            documented= j>=0 and a[j].lstrip().startswith('///')
            functions.append((i+1,documented,line.strip()))
    total+=len(functions);doc+=sum(x[1] for x in functions)
    print(p, len(functions), sum(x[1] for x in functions))
print("Total all declared functions:",total,"documented:",doc)
PY
printf '\nLatest commit function additions:\n'
gh api repos/leynos/wireframe/commits/aeeeea38f26ae9c3265d3ef9677ed0eff2a641c2 --jq '.files[] | [.filename, .status, .patch] | `@tsv`' | grep -E 'tests/compile_error.rs|tests/ui/zero_test_budget.rs|src/client/tests/lifecycle.rs' | cut -c1-700

Length of output: 4897


🏁 Script executed:

#!/bin/bash
set -u
printf 'CI test job relevant log lines:\n'
gh run view 35954609642 --repo leynos/wireframe --job 107490147090 --log 2>&1 | rg -n -i -C2 'zero_test_budget|compile_tests|compile_error|trybuild|cargo test|test result|error:|unable to' | sed -n '1,155p'
printf '\nPrior pre-merge check scope from review summary:\n'
gh api repos/leynos/wireframe/issues/706/comments --paginate --jq '.[] | select(.user.login == "coderabbitai[bot]") | .body' | rg -n -C2 'Docstring coverage is 79.59|Analyzed 49 functions|Files selected for processing' | sed -n '1,60p'

Length of output: 16245


@leynos, the compile-time/UI check is resolved. The docstring coverage check is not yet verified as resolved.

Check Current assessment
Testing (Compile-Time / Ui) Resolved. tests/compile_error.rs registers zero_test_budget.rs. The fixture uses the same nz! macro as the budget tests, and its .stderr file checks for E0080. The current-head CI job passed wireframe::compile_error::compile_tests.
Docstring Coverage Unresolved. Commit aeeeea38 documents record_setup in src/client/tests/lifecycle.rs, not record_error_count in src/client/tests/error_handling.rs. The earlier 79.59% result covered 49 touched functions in 11 files. The head also touches compile_tests and adds the UI fixture’s main. I cannot confirm an updated percentage without the check’s function-selection and docstring-counting rules. The passing GitHub checks do not report this percentage.

If the original count was 39/49, documenting one function gives 40/49 (81.63%) only if the scope stays fixed. If the two newly touched functions also count and remain undocumented, the result is 40/51 (78.43%). Do not use either conditional calculation as a passing result.

AI agent prompt for the remaining work:

On PR `#706` at commit aeeeea38f26ae9c3265d3ef9677ed0eff2a641c2, resolve the Docstring Coverage pre-merge warning. Treat the 80.00% threshold as required.

Re-run the exact diff-scoped function and docstring count used by the pre-merge check against the current PR head. Report the function list, documented count, total count, percentage, and counting rules. Account for the newly touched tests/compile_error.rs::compile_tests and tests/ui/zero_test_budget.rs::main. Do not assume that the old 49-function denominator still applies.

Add accurate function-level documentation to enough undocumented touched helpers to meet or exceed 80.00%. Check src/client/tests/error_handling.rs::record_error_count and the callback helpers in src/client/tests/lifecycle.rs. Preserve callback first-poll behaviour. Re-run the docstring check and the relevant repository gates. Report the final count and results. Do not mark the warning resolved until the current-head count passes.

You are interacting with an AI system.

@leynos
leynos marked this pull request as draft September 24, 2026 04:37

leynos commented Sep 24, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai Have the following failed checks now been resolved?

If further work is required, please provide an AI agent prompt for the remaining work to be done to address these failures.

Do not treat warnings as optional or aspirational.

Remaining failed pre-merge check

Check name Previous status Current-head repair and requested verification
Docstring Coverage Warning: 39/49 touched functions documented (79.59%), below 80.00% Commit 6ac653bad30576e167f2191fef433365a70efaad adds accurate Rustdoc to record_error_count, record_count, record_teardown_state, compile_tests, and the trybuild UI main. Previous commit aeeeea38 documented record_setup. The expected .stderr line shift was updated and the focused trybuild case plus all sequential repository gates passed. Please run your exact diff-scoped function-selection and docstring-counting rules against this current head, report documented/total/percentage, and identify any remaining undocumented touched functions if below 80.00%. A local 45/51 projection is conditional because your Organization UI counting rules are not available locally; it is not asserted as a verified result.

codescene-access[bot]

This comment was marked as outdated.

@coderabbitai

coderabbitai Bot commented Sep 24, 2026

Copy link
Copy Markdown
Contributor

Tip

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -u
printf 'HEAD '; git rev-parse HEAD
printf 'PR metadata:\n'
gh pr view 706 --repo leynos/wireframe --json headRefOid,baseRefOid,files,statusCheckRollup --jq '{headRefOid,baseRefOid,files:[.files[].path],checks:[.statusCheckRollup[]? | {name,conclusion,status}]}'
printf '\nTarget commit summary:\n'
git show --format=fuller --stat --no-renames 6ac653bad30576e167f2191fef433365a70efaad | head -75
printf '\nFile outlines:\n'
for f in src/client/tests/error_handling.rs src/client/tests/lifecycle.rs tests/compile_error.rs tests/ui/zero_test_budget.rs tests/support/non_zero.rs; do
  if test -f "$f"; then echo "== $f"; ast-grep outline "$f" --items all | head -65; fi
done
printf '\nPrior coverage source context:\n'
gh api repos/leynos/wireframe/issues/706/comments --paginate --jq '.[] | select(.user.login == "coderabbitai[bot]") | .body' | rg -n -C4 'Docstring coverage is 79.59|Analyzed 49 functions|Files selected for processing|Docstring Coverage' | head -115
printf '\nCoverage configs:\n'
rg -n -i -C2 'docstring.coverage|docstring_coverage|79\.59|documentation coverage|coverage.*80' -g '!Cargo.lock' . | head -100

Length of output: 16742


🏁 Script executed:

#!/bin/bash
set -u
echo 'Original report files and context:'
gh api repos/leynos/wireframe/issues/706/comments --paginate --jq '.[] | select(.user.login == "coderabbitai[bot]" and (.body | contains("79.59%"))) | .body' | sed -n '47,95p'
echo 'Function vicinity in changed helper files:'
for f in src/client/tests/error_handling.rs src/client/tests/lifecycle.rs tests/compile_error.rs tests/ui/zero_test_budget.rs tests/support/non_zero.rs; do
  echo "== $f"; nl -ba "$f" | head -55
done
echo 'Per-file full-function counts, immediate Rustdoc and undocumented functions:'
python - <<'PY'
import re, subprocess
paths=subprocess.check_output(['git','diff','--name-only','742a718452f42df6fc373dbdabfbc613a497a4c0','HEAD'],text=True).splitlines()
total=doc=0
for p in paths:
    if not p.endswith('.rs') or p.endswith('.stderr'):continue
    a=open(p).read().splitlines()
    functions=[]
    for i,line in enumerate(a):
        if re.match(r'^\s*(?:(?:pub(?:\([^)]*\))?|async|unsafe|const)\s+)*fn\s+[A-Za-z_]\w*\b',line):
            j=i-1
            while j>=0 and (a[j].strip().startswith('#[') or a[j].strip()==''): j-=1
            documented= j>=0 and a[j].lstrip().startswith('///')
            functions.append((i+1,documented,line.strip()))
    total+=len(functions);doc+=sum(x[1] for x in functions)
    print(p, len(functions), sum(x[1] for x in functions))
    for line,hasdoc,decl in functions:
        if not hasdoc: print('  UNDOC', line,decl[:100])
print('TOTAL',doc,total,round(doc/total*100,2) if total else 0)
PY
echo 'Changed-file diff summary:'
git diff --stat 742a718452f42df6fc373dbdabfbc613a497a4c0 HEAD | tail -20

Length of output: 9882


🏁 Script executed:

#!/bin/bash
set -euo pipefail
python - <<'PY'
import re, subprocess, json
files=json.loads(subprocess.check_output(['gh','pr','view','706','--repo','leynos/wireframe','--json','files'],text=True))['files']
total=doc=0
for f in files:
    p=f['path']
    if not p.endswith('.rs'): continue
    a=open(p).read().splitlines()
    functions=[]
    for i,line in enumerate(a):
        if re.match(r'^\s*(?:(?:pub(?:\([^)]*\))?|async|unsafe|const)\s+)*fn\s+[A-Za-z_]\w*\b',line):
            j=i-1
            while j>=0 and (a[j].strip().startswith('#[') or a[j].strip()==''): j-=1
            documented= j>=0 and a[j].lstrip().startswith('///')
            functions.append((i+1,documented,line.strip()))
    total+=len(functions);doc+=sum(x[1] for x in functions)
    print(p, f'{sum(x[1] for x in functions)}/{len(functions)}')
    for line,hasdoc,decl in functions:
        if not hasdoc: print('  UNDOC', line,decl[:110])
print('WHOLE_CHANGED_FILES_TOTAL',doc,total,f'{doc/total*100:.2f}%' if total else '')
PY
printf '\nLatest PR check names from API:\n'
gh api repos/leynos/wireframe/commits/6ac653bad30576e167f2191fef433365a70efaad/check-runs --jq '.check_runs[] | [.name,.status,.conclusion] | `@tsv`'

Length of output: 7502


🏁 Script executed:

#!/bin/bash
set -u
echo 'Outline options:'
ast-grep outline --help | head -105
echo 'Expanded sample:'
ast-grep outline src/client/tests/lifecycle.rs --items all --view expanded | head -105
echo 'PR patch sample (plus declarations):'
gh api repos/leynos/wireframe/pulls/706/files --paginate --jq '.[] | select(.filename == "src/client/tests/lifecycle.rs" or .filename == "tests/response.rs" or .filename == "tests/compile_error.rs") | {filename,patch}' | head -110
echo 'GitHub base comparison availability:'
gh api 'repos/leynos/wireframe/compare/742a718452f42df6fc373dbdabfbc613a497a4c0...0e1e29a5d93fa24728cef4ffd007fbc532146616' --jq '{status,files:[.files[]|{filename,changes}]}' 2>&1 | head -75

Length of output: 18449


🏁 Script executed:

#!/bin/bash
echo 'Outline JSON sample:'
ast-grep outline src/client/tests/lifecycle.rs --items all --json=stream | head -8
echo 'ast-grep function match JSON sample:'
ast-grep run --lang rust --pattern 'fn $NAME($$$ARGS) { $$$BODY }' src/client/tests/lifecycle.rs --json=stream | head -2 | cut -c1-1300
echo 'Original compared patches preview:'
gh api 'repos/leynos/wireframe/compare/742a718452f42df6fc373dbdabfbc613a497a4c0...0e1e29a5d93fa24728cef4ffd007fbc532146616' --jq '.files[] | [.filename, (.patch // "" | split("\n") | map(select(startswith("@@"))) | join(" | "))] | `@tsv`' | head -15

Length of output: 7741


🏁 Script executed:

#!/bin/bash
set -euo pipefail
python - <<'PY'
import subprocess,json,re,base64
repo='leynos/wireframe'; base='742a718452f42df6fc373dbdabfbc613a497a4c0'; old='0e1e29a5d93fa24728cef4ffd007fbc532146616'
def api(endpoint):
    return json.loads(subprocess.check_output(['gh','api',f'repos/{repo}/{endpoint}'],text=True))
def lines_added(patch):
    lines=set(); n=0
    for line in patch.splitlines():
        m=re.match(r'^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@',line)
        if m:n=int(m[1]);continue
        if line.startswith('+') and not line.startswith('+++'):lines.add(n);n+=1
        elif line.startswith(' '):n+=1
    return lines
def outline(text):
    result=subprocess.run(['ast-grep','outline','--lang','rust','--items','all','--json=stream'],input=text,text=True,capture_output=True)
    if result.returncode:raise RuntimeError(result.stderr[:500])
    data=json.loads(result.stdout.strip().splitlines()[-1])
    return [x for x in data['items'] if x['symbolType']=='function']
def count(files, ref, original=False):
    totals=[0,0]; found=[]
    for f in files:
        path=f['filename']
        if not path.endswith('.rs'):continue
        if original:
            blob=api(f'contents/{path}?ref={ref}')
            content=base64.b64decode(blob['content']).decode()
        else:
            content=open(path).read()
        added=lines_added(f.get('patch') or '')
        entries=outline(content)
        a=content.splitlines()
        selected=[]
        for x in entries:
            s=x['range']['start']['line']+1
            e=x['range']['end']['line']+1
            # Count changed body, signature, or contiguous preceding Rustdoc and attributes.
            i=s-2
            while i>=0 and (a[i].strip().startswith(('///','#[','//!')) or not a[i].strip()): i-=1
            start=i+2
            if not any(start<=n<=e for n in added):continue
            i=s-2
            while i>=0 and (a[i].strip().startswith('#[') or not a[i].strip()):i-=1
            documented=i>=0 and a[i].lstrip().startswith('///')
            selected.append((x['name'],s,documented))
            totals[0]+=documented;totals[1]+=1
        print(path, sum(x[2] for x in selected),len(selected), 'UNDOC',[(x[0],x[1]) for x in selected if not x[2]])
        found.extend((path,*x) for x in selected)
    print('TOTAL',*totals, f'{totals[0]/totals[1]*100:.2f}%' if totals[1] else '', 'files', len(files))
    return found
print('ORIGINAL HEAD (added-line/function overlap):')
prior=api(f'compare/{base}...{old}')['files']
count(prior,old,True)
print('CURRENT HEAD (added-line/function overlap):')
latest=json.loads(subprocess.check_output(['gh','api',f'repos/{repo}/pulls/706/files','--paginate'],text=True))
count(latest,'HEAD')
PY

Length of output: 3308


🏁 Script executed:

#!/bin/bash
set -u
python - <<'PY'
import subprocess,json,base64
ref='0e1e29a5d93fa24728cef4ffd007fbc532146616'
for path in ['src/app/inbound_handler/tests.rs','src/client/tests/error_handling.rs']:
    blob=json.loads(subprocess.check_output(['gh','api',f'repos/leynos/wireframe/contents/{path}?ref={ref}'],text=True))
    txt=base64.b64decode(blob['content']).decode()
    output=subprocess.run(['ast-grep','outline','--lang','rust','--items','all','--json=stream'],input=txt,text=True,capture_output=True)
    print(path, 'source_lines',len(txt.splitlines()), 'outline_status',output.returncode, 'output_lines',len(output.stdout.splitlines()))
    print('outline_begin',output.stdout[:400])
    print('outline_end',output.stdout[-400:])
    print('err',output.stderr[:100])
PY

Length of output: 2785


🏁 Script executed:

#!/bin/bash
set -euo pipefail
python - <<'PY'
import subprocess,json,re,base64,tempfile,os
repo='leynos/wireframe'; base='742a718452f42df6fc373dbdabfbc613a497a4c0'; old='0e1e29a5d93fa24728cef4ffd007fbc532146616'
def api(endpoint):
    return json.loads(subprocess.check_output(['gh','api',f'repos/{repo}/{endpoint}'],text=True))
def lines_added(patch):
    lines=set(); n=0
    for line in patch.splitlines():
        m=re.match(r'^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@',line)
        if m:n=int(m[1]);continue
        if line.startswith('+') and not line.startswith('+++'):lines.add(n);n+=1
        elif line.startswith(' '):n+=1
    return lines
def outline(path):
    result=subprocess.run(['ast-grep','outline',path,'--lang','rust','--items','all','--json=stream'],text=True,capture_output=True,check=True)
    data=json.loads(result.stdout.strip().splitlines()[-1])
    return [x for x in data['items'] if x['symbolType']=='function']
def count(files,original=False):
    totals=[0,0]
    for f in files:
        path=f['filename']
        if not path.endswith('.rs'):continue
        if original:
            blob=api(f'contents/{path}?ref={old}')
            content=base64.b64decode(blob['content']).decode()
            with tempfile.NamedTemporaryFile(suffix='.rs',mode='w',encoding='utf8') as tmp:
                tmp.write(content);tmp.flush();entries=outline(tmp.name)
        else:
            content=open(path).read();entries=outline(path)
        added=lines_added(f.get('patch') or '')
        a=content.splitlines(); selected=[]
        for x in entries:
            s=x['range']['start']['line']+1;e=x['range']['end']['line']+1
            if s>len(a):raise RuntimeError((path,s,len(a)))
            i=s-2
            while i>=0 and (a[i].strip().startswith(('///','#[','//!')) or not a[i].strip()): i-=1
            start=i+2
            if not any(start<=n<=e for n in added):continue
            i=s-2
            while i>=0 and (a[i].strip().startswith('#[') or not a[i].strip()):i-=1
            documented=i>=0 and a[i].lstrip().startswith('///')
            selected.append((x['name'],s,documented))
            totals[0]+=documented;totals[1]+=1
        print(path, sum(x[2] for x in selected),len(selected),'UNDOC',[(x[0],x[1]) for x in selected if not x[2]])
    print('TOTAL',*totals, f'{totals[0]/totals[1]*100:.2f}%' if totals[1] else '', 'files', len(files))
print('ORIGINAL HEAD:')
count(api(f'compare/{base}...{old}')['files'],True)
print('CURRENT HEAD:')
latest=json.loads(subprocess.check_output(['gh','api',f'repos/{repo}/pulls/706/files','--paginate'],text=True))
count(latest)
PY

Length of output: 6544


@leynos, the Docstring Coverage warning is not yet verified as resolved.

I confirmed that PR #706 points to 6ac653bad30576e167f2191fef433365a70efaad. All six functions named in your comment have Rustdoc on that head.

The earlier result was 39/49 (79.59%). If the original counting rules still select those 49 functions and also select the two documented functions in the new files, the result is 45/51 (88.24%). That is a projection, not a verified check result.

I could not reproduce the original 39/49 count from the available diff and AST data. GitHub also does not report a current-head Docstring Coverage result. Therefore, I cannot give an exact current count or identify the Organization UI’s remaining undocumented functions. Keep the warning unresolved until the check reports at least 80.00%.

AI agent prompt for the remaining verification work:

On leynos/wireframe PR `#706`, verify Docstring Coverage at head 6ac653bad30576e167f2191fef433365a70efaad. Treat the 80.00% threshold as required.

Run the same diff-scoped function-selection and Rustdoc-counting rules that produced the original 39/49 (79.59%) warning. Report the current function inventory, documented count, total count, percentage, and any undocumented selected functions. Include tests/compile_error.rs::compile_tests and tests/ui/zero_test_budget.rs::main if those rules select them. Do not substitute a whole-file count or the projected 45/51 result for the check result.

If coverage is below 80.00%, add accurate Rustdoc to enough selected functions to pass. Re-run the exact coverage check and relevant repository gates. Report the final results. Do not mark the warning resolved without a passing current-head coverage result.

You are interacting with an AI system.

@leynos
leynos marked this pull request as ready for review September 24, 2026 04:50

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sorry @leynos, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 9 hours and 9 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@leynos
leynos removed this pull request from stack #707 September 24, 2026 05:19
@leynos
leynos added this pull request to stack #715 September 24, 2026 05:20
@leynos
leynos marked this pull request as draft September 24, 2026 07:12
codescene-access[bot]

This comment was marked as outdated.

@leynos
leynos marked this pull request as ready for review September 24, 2026 07:28

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sorry @leynos, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 6 hours and 31 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@buzzybee-df12

Copy link
Copy Markdown
Collaborator

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot removed the Issue label Sep 25, 2026
Base automatically changed from harden-dev-tooling to main September 26, 2026 23:36
leynos added 5 commits September 27, 2026 04:57
Keep fixed test inputs non-zero at compile time, propagate fallible
helper errors, and preserve callback timing without nested closures.
Replace redundant assertions and numeric lint expectations with
equivalent source-level test logic.
Extract fallible frame and payload-length checks shared by response tests.
Keep the same predicates and diagnostic text while reducing CodeScene
duplication in the test-quality layer.
Share the const non-zero guard across budget fixtures and a trybuild UI
case, so a zero budget has a checked compile error. Document when the
client setup helper records its invocation and returns teardown state.
Explain when the client callback futures mutate their counters and state.
Document the trybuild runner and zero-budget entry point to address the
PR's changed-function documentation warning. Keep the compile-fail
snapshot aligned with the new source line.
Explain both nz! forms, their compile-time zero check, and the shared include sites. Record the trybuild UI contract so new fixture values retain compile-fail coverage.
@wafflecat-df12

Copy link
Copy Markdown
Collaborator

@coderabbitai The Developer Documentation warning in #706 (comment) is addressed on current head 08c834f76b138757d41b9722ef93ea3019b628d5 by the developer-guide section. It identifies tests/support/non_zero.rs, both nz!(value) and nz!(value, "message"), compile-time rejection of zero, the fragment-adapter and message-assembler include sites, and the tests/ui/ compile-fail source plus registered .stderr expectation. The full sequential commit gates passed on this head, including make check-fmt, make lint, make typecheck, make test, make markdownlint, and make nixie. Please confirm that this actionable concern is resolved. Your current summary also reports Docstring Coverage at 88.24%, superseding the earlier unverified-coverage comment.

@coderabbitai

coderabbitai Bot commented Sep 27, 2026

Copy link
Copy Markdown
Contributor

Tip

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -u
printf 'Local HEAD and PR head:\n'
git rev-parse HEAD
gh pr view 706 --repo leynos/wireframe --json headRefOid,statusCheckRollup --jq '{headRefOid, checks:[.statusCheckRollup[]? | {name,status,conclusion}]}'
printf '\nGuide location and outline:\n'
fd '^developers-guide\.md$' .
ast-grep outline docs/developers-guide.md --items all | head -75
printf '\nGuide cited section:\n'
nl -ba docs/developers-guide.md | sed -n '962,1035p'
printf '\nMacro and fixture references:\n'
rg -n -C2 'macro_rules! nz|include!|zero_test_budget|compile_fail|test budget must be non-zero' tests/support/non_zero.rs tests/compile_error.rs tests/ui/zero_test_budget.rs src/fragment/tests/adapter_tests.rs src/message_assembler/budget_tests.rs src/message_assembler/budget_enforcement_tests.rs | head -150
printf '\nOriginal warning and current summary excerpts:\n'
gh api repos/leynos/wireframe/issues/comments/5802047210 --jq '{user:.user.login, body:.body}' | head -110
gh api repos/leynos/wireframe/issues/706/comments --paginate --jq '.[] | select((.body // "") | test("88.24|Developer Documentation";"i")) | {user:.user.login,body:.body}' | tail -135
printf '\nCommit checks:\n'
gh api repos/leynos/wireframe/commits/08c834f76b138757d41b9722ef93ea3019b628d5/check-runs --jq '.check_runs[] | [.name,.status,.conclusion] | @tsv' | head -65

Length of output: 56520


🏁 Script executed:

#!/bin/bash
set -euo pipefail
printf 'Developer-guide test-infrastructure section:\n'
nl -ba docs/developers-guide.md | sed -n '1148,1205p'
printf '\nDeveloper-guide diff in PR:\n'
gh api repos/leynos/wireframe/pulls/706/files --paginate --jq '.[] | select(.filename == "docs/developers-guide.md") | {filename,patch}'
printf '\nCompile-time fixture expectations:\n'
nl -ba tests/compile_error.rs | head -17
nl -ba tests/ui/zero_test_budget.rs | head -18
rg -n -C2 'E0080|test budget must be non-zero' tests/ui/zero_test_budget.stderr
printf '\nOriginal summary docstring entry:\n'
gh api repos/leynos/wireframe/issues/comments/5802047210 --jq '.body' | rg -n -C2 'Docstring coverage is 88.24|Developer Documentation|Analyzed 51'

Length of output: 9223


@wafflecat-df12, treat the Developer Documentation concern as resolved on head 08c834f76b138757d41b9722ef93ea3019b628d5. The new section in docs/developers-guide.md at Line 1165 covers both nz! forms, compile-time rejection of zero, the include sites, and the registered compile-fail fixture with its .stderr expectation.

Treat the earlier unverified Docstring Coverage comment as superseded. The CodeRabbit summary reports 88.24%, above the required 80.00% threshold. GitHub still showed some checks in progress when I inspected this head, so I cannot independently confirm that every current-head CI check has completed.

You are interacting with an AI system.

@wafflecat-df12

Copy link
Copy Markdown
Collaborator

@coderabbitai approve

@coderabbitai

coderabbitai Bot commented Sep 27, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Comments resolved and changes approved.

@leynos
leynos merged commit 43b90a3 into main Sep 27, 2026
11 checks passed
@leynos
leynos deleted the test-quality-sweep branch September 27, 2026 03:19
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.

3 participants