Skip to content

ci: fix pre-existing /bigobj and Doxygen doc-parse failures blocking all PRs - #80

Merged
Yaraslaut merged 2 commits into
masterfrom
fix-master-ci-preexisting
Aug 12, 2026
Merged

ci: fix pre-existing /bigobj and Doxygen doc-parse failures blocking all PRs#80
Yaraslaut merged 2 commits into
masterfrom
fix-master-ci-preexisting

Conversation

@Yaraslaut

Copy link
Copy Markdown
Member

Summary

Three defects already present on master itself — not introduced by any of the open issue-cluster PRs (#70#79) — surfaced once those PRs started actually exercising the full CI matrix. Confirmed each is genuinely pre-existing by reproducing on an unmodified origin/master checkout.

⚠️ Please review before merging — this touches shared build config and doc comments in files many other branches also touch. Once merged, all 10 open issue-cluster PRs will be rebased onto the new tip.

1. /bigobj needed for examples/forms/main.cpp (MSVC Debug)

cl-debug CI fails with fatal error C1128: number of sections exceeded object file format limit. Root cause: the recent nested-aggregate schema recursion (9002553) pushed a Debug build's COFF section count over MSVC's format limit for this translation unit. Added /bigobj, MSVC-only, matching the existing convention already used in tests/CMakeLists.txt.

2. forms.hpp:996 — Doxygen "parameters/return type not documented"

Root cause (confirmed by temporarily renaming the flagged overload and watching the error follow it): the second equals() overload's @brief opened a backtick code span that closed on the following /// line instead of the same one, corrupting Doxygen's comment-block parsing for that entire block. Rewrapped so each backtick span opens and closes on one line.

3. wire.hpp:317 — Doxygen "end of comment block while expecting </tt>"

Root cause (confirmed by byte-exact bisection): the EscapingWriteOpts doc comment contains a single unpaired literal " character in prose, giving the block an odd total quote count; Doxygen's lexer tracks quote parity across the whole comment block, and an odd count corrupts its state until a bogus <tt>-closing error surfaces later in the same block — there is no actual <tt> tag anywhere nearby. Reworded to name the character in prose instead of using a bare " glyph.

Verification

  • Doc build matched to CI exactly: downloaded Doxygen 1.17.0 (the version .github/workflows/docs.yml pins) and ran cmake --build --target doc — exit 0, zero doc errors, independently re-verified.
  • /bigobj fix independently re-verified: rebuilt morph_forms_demo under a Debug configuration, confirmed the flag appears in examples/forms/CMakeLists.txt correctly scoped to MSVC only.

🤖 Generated with Claude Code

Yaraslau Tamashevich and others added 2 commits August 12, 2026 09:01
main.cpp instantiates schema/rule templates over every demo action type.
Under the cl-debug preset (MSVC, full /Zi debug info, no /Og folding) this
pushes main.cpp.obj's COFF section count past the 32-bit SN_LOFF format's
limit, and MSVC aborts with C1128 ("number of sections exceeded object
file format limit"). /bigobj switches to the extended section-count
format; harmless on Release and on other compilers, so it is applied
unconditionally (guarded by CXX_COMPILER_ID:MSVC) to this one target.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
forms.hpp: the second equals() overload's @brief opened an inline code
span with a backtick right before a "///" line break
(equals(&A::code, then "X")) on the next line, inside a Qt-autobrief
@brief. Doxygen lost the parameter/return docs that followed, reporting
them as undocumented even though @tparam/@param/@return were all
present. Confirmed by isolating each overload in turn: renaming the
second overload made Doxygen point at it specifically, not the first,
ruling out an overload-association mixup. Rewrapping the brief so the
code span opens and closes on the same line fixes it.

wire.hpp: EscapingWriteOpts's doc comment contains a single unpaired
literal double-quote character ("...or a double-quote earlier in the
same string..."), making the block's total count of literal
double-quote characters odd. Bisected with byte-exact reproductions
down to a single line: Doxygen's comment lexer tracks quote parity
across the whole comment block, and an odd count leaves it in a bad
state that surfaces later as a bogus "end of comment block while
expecting command </tt>" error once the block closes. Rewording to
name the character in prose instead of using a bare quote glyph fixes
it.

Both verified against Doxygen 1.17.0 (the version CI installs
explicitly in .github/workflows/docs.yml) via
"cmake --build build --target doc": exit 0, zero "is not documented"
or parse-error lines.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Yaraslaut
Yaraslaut merged commit 918b287 into master Aug 12, 2026
21 of 22 checks passed
@codecov

codecov Bot commented Aug 12, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Yaraslaut pushed a commit that referenced this pull request Aug 12, 2026
FormsController.cpp instantiates schema/rule templates over every demo
action type, the same pattern morph_forms_demo hit (see #80). Under the
cl-debug preset this pushes the .obj's COFF section count past the
32-bit SN_LOFF format's limit, and MSVC aborts with C1128.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Yaraslaut pushed a commit that referenced this pull request Aug 12, 2026
test_quantity_forms.cpp instantiates schema/rule templates over every
Quantity-bearing form type; combined with this branch's added rule
conditions and enforceQuantityBounds, this pushes its .obj's COFF
section count past the 32-bit SN_LOFF format's limit under the
cl-debug preset, aborting with C1128. Same pattern as #80's fix for
morph_forms_demo and this branch's own lab_forms_demo_module fix.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Yaraslaut pushed a commit that referenced this pull request Aug 12, 2026
FormsController.cpp instantiates schema/rule templates over every demo
action type, the same pattern morph_forms_demo hit (see #80). Under the
cl-debug preset this pushes the .obj's COFF section count past the
32-bit SN_LOFF format's limit, and MSVC aborts with C1128.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Yaraslaut pushed a commit that referenced this pull request Aug 12, 2026
This branch's QFWholeCount addition (a zero-decimal declared-precision
override) pushes the file's instantiated-template weight past the
32-bit SN_LOFF format's limit under the cl-debug preset, aborting with
C1128. Same pattern as #80's fix for morph_forms_demo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Yaraslaut added a commit that referenced this pull request Aug 12, 2026
…ENT_ONLY facade drops the model-header dependency (#77)

* Closes #57: FormsControllerCore can compose over a caller-supplied Bridge

FormsControllerCore<Model> previously always built and owned its own
ThreadPoolExecutor + QtExecutor + Bridge over a LocalBackend, so an app
that already had a Bridge (connected to Remote/Socket mode, or shared
across multiple presenters) could not use it without getting a second,
always-local Bridge built underneath it.

Adds a constructor overload, FormsControllerCore(Bridge&, IExecutor*,
schemasJson), that composes over a caller-supplied Bridge/executor
instead of building a private one. The owning single-argument
constructor is unchanged and remains the convenient default. Ownership
of the internal pool/executor/backend bundle is now conditional
(std::optional<OwnedBridge>), engaged only by the owning constructor,
with declaration order preserved so BridgeHandler always tears down
before the Bridge/executor it depends on.

Covered by two new Catch2 cases in test_forms_controller_core.cpp:
submitting through a caller-supplied Bridge, and dispatching correctly
after the caller calls Bridge::switchBackend on that same Bridge.

docs/spec/forms/forms.md updated to describe both constructors.

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

* Closes #61: BRIDGE_REGISTER_ACTION_FOR_CLIENT drops the model-header dependency under MORPH_CLIENT_ONLY

MORPH_CLIENT_ONLY already removes the *link* dependency on a model's
implementation, but BRIDGE_REGISTER_ACTION's Result type is
decltype(std::declval<M&>().execute(std::declval<A>())), which forces M
to be a complete type with execute(A) declared at the registration
site -- ordinarily the model's own header. A pure client therefore
still had to #include that header (and everything it pulls in
transitively -- a persistence mixin's database-driver headers, for a
model backed by one), even though a MORPH_CLIENT_ONLY build never
calls Model::execute at all. A WASM/browser client has no include path
for a native database client library at all, making this a hard build
blocker.

Adds BRIDGE_REGISTER_ACTION_FOR_CLIENT(M, A, RESULT, NAME, ...): emits
the identical ActionTraits<A> specialisation as BRIDGE_REGISTER_ACTION,
except Result is the explicitly-named RESULT argument instead of a
decltype-deduced one. M is then used only as BridgeHandler<M>'s
template tag and ActionExecuteRegistry's dispatch key -- both routes
call only ModelTraits<M>::typeId() and, under MORPH_CLIENT_ONLY, never
reach Model::execute (already gated inside Bridge::executeVia) -- so M
may be forward-declared and never defined anywhere in the client's
link.

New compile/run-check fixture,
tests/compile_checks/client_only_facade_no_model_header.cpp (wired via
try_run() in tests/CMakeLists.txt, following the existing
client_only_no_model_link.cpp/client_only_runtime_throw.cpp pattern),
forward-declares (never defines) its model type and proves the action
still round-trips correctly through toJson/fromJson, and that
BridgeHandler<Model> can be constructed and dispatched through via the
pre-built-binding constructor without the model ever being complete.

docs/spec/core/registry.md documents the new macro, its header-seam
rationale, the pre-built-binding BridgeHandler construction pattern a
client using it needs, and the one thing it cannot verify (RESULT must
match what the real model's execute() actually returns).

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

* docs: close the @cond detail block opened for BRIDGE_REGISTER_ACTION_FOR_CLIENT_*

The new client-facade macro helpers (PICK/_4/_5) opened a second
@cond detail without an intervening @endcond before the pre-existing
BRIDGE_REGISTER_ACTION_PICK/_3/_4 block's own @cond -- Doxygen's
WARN_AS_ERROR=FAIL_ON_WARNINGS gate correctly flagged the unclosed
first block. Close it right after its own macro group, before the
next @cond opens.

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

* ci: add /bigobj to lab_forms_demo_module for MSVC Debug builds

FormsController.cpp instantiates schema/rule templates over every demo
action type, the same pattern morph_forms_demo hit (see #80). Under the
cl-debug preset this pushes the .obj's COFF section count past the
32-bit SN_LOFF format's limit, and MSVC aborts with C1128.

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

---------

Co-authored-by: Yaraslau Tamashevich <y.tamashevich@lastrada.net>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
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