Address the two failing CI checks:
- Module layering: document the new RPGActor::release binding in rpg.md
and bind getAttackSpeed/getAttackTimesAdd so the doc matches the bindings.
- Architecture contracts:
- ecs-system: register the 10 new RPG systems (LevelSystem, VitalsSystem,
TraitSystem, ClassSystem, QuestSystem, Tracker, Battle, BattleSystem,
EquipmentSystem, LootSystem) in scripts/architecture_contracts.json.
- api-lifetime: add @ownership/@lifetime Doxygen to raw-pointer accessors
(registry find() and Battle actor/event accessors).
- api-shape: mark script-facing bool operations as compatibility facades
in their Doxygen; rename QuestSystem::requiresMet -> hasMetRequirements
so the predicate name passes the lexical predicate check.
Pre-existing dev failure: Procgen.cpp binds addFunc('getBool'/'setBool')
without documenting them in procgen.md, which fails the script-binding
documentation check for any PR against dev. Acknowledge the gap via the
known-gaps allowlist (unrelated to the logging change).
Add 7 shaders to the stylize module, exposed through the existing
Style* runtime and Squirrel API (no new module or bindings):
- Mesh materials (reuse mesh3d_toon.vert): rim light, dissolve,
hologram, snow accumulation.
- Post passes: vignette, chromatic aberration, film grain.
Original GLSL implementations of common techniques, not verbatim
copies (see docs/dev/ported-material-shaders.md for licensing).
Adds EffectShaders.{h,cpp} with param tables + uniform binding +
shader creation, wired via delegation from StyleShaders.cpp, plus
SPIR-V embeds and per-module tests (test/stylize_effects.cpp).
scripts/check_bindings.py now treats pre-existing doc gaps as registered
debt: scripts/check_bindings_gaps.txt (module:binding, regenerated via
--write-gaps, 857 entries) turns them into warnings, while any NEW bound
name missing from its doc chapter fails the check. make check/bindings and
the CI layering job now run the full --strict check instead of the ten
newly-authored chapters, so docs cannot silently drift from bindings
anywhere in the tree.
Resolved conflicts:
- test/*: keep the shared Fixtures.h migration (drop the per-file
openGfxWindow copies that dev still had).
- vulkan/Graphics.cpp: keep dev's extName loop variable rename AND the
headless set_headless() line.
Local win32-debug build + headless/sampler/mocks/binding tests pass after
forcing a rebuild of EVProcgen (stale object from the pre-merge tree caused
a duplicate PbrTextureSet::destroy symbol).
- scripts/check_bindings.py: scans every addFunc/addVar in src/modules and
greps the matching docs/usr/modules chapter. Missing names are warnings by
default (large pre-existing doc debt); --strict + --modules turn them into
CI failures. Wired as make check/bindings and a step in the CI layering
job for the ten newly-authored chapters (avatar, buildingfx, camera,
database, dialogue, grid, housegen, sceneloader, stylize, virtualgeometry),
so those chapters cannot silently drift from the bindings.
- test/binding_selfcheck.cpp: builds a script VM with every module exposed,
constructs the light modules and asserts curated hot bindings exist
(eve.reflect itself is covered by the existing ReflectScript test).
- EVENGINE_ENABLE_STRICT_WARNINGS option: MSVC /W4 /WX, GCC/Clang
-Wall -Wextra -Werror, with documented noise suppressions and
-isystem/-external:I for third-party headers; enabled on the
Windows/Linux debug CI jobs.
- Fix warnings across engine, modules and tests exposed by the gate,
including real bugs (incomplete-type deletes, Timespan microsecond
overflow, overload hiding, enum switch gaps, dead code).
- Add Linux ASan+UBSan job, example smoke step, python-tools test
job, ruff config (scripts+tools), weekly Linux coverage job and a
CodeQL workflow.
CI hit a python socket timeout connecting to the embedded MCP server,
likely because the sed-triggered hot reload delayed frame-loop MCP pumping
on a slower runner. Bump the socket timeout to 30s, retry eve_status, and
dump the eve log tail on failure so future CI failures carry the actual
engine output.
Render 14 examples with the prebuilt eve host and capture the actual
swapchain frame via gfx.saveFramePng (capture_root.nut wrapper), then
publish the PNGs under docs/images/examples with a gallery README and a
link from the user guide.
Adds scripts/capture_example.ps1 + scripts/capture_root.nut for
regenerating the captures on any example.
With --debug the engine routes Squirrel print() into the DevTools console,
so 'DevTools attached' never reaches stdout/stderr and the log-grep test
always timed out. The test now starts eve with --mcp-port, waits for the
stderr 'MCP listening' line, and verifies attachment + hot reload through
the embedded MCP server (eve_status attached + eve_eval lab.reloads).
sq_newslot(-3) expects a [table, key, value] three-level stack; the code
pushed only the value, so the slot write silently targeted the native
frame's mode argument (a string, not a table) and was skipped. Handles
therefore had methods but empty _path/_data, making read()/getSize()
throw 'file not readable' on every platform where the stack layout
did not accidentally alias the table.
Fix cardgame's ui.sameLine() calls to pass an id (the binding requires
one), and make the example smoke failure output print non-frame-error
lines so future CI failures carry the real root cause instead of being
buried under per-frame error spam.