Repository navigation
Conversation
…e shrunk prototype inventory acceptanceStatus[0] (still unmet) notes that nine prototype modules add invalid-state rules through GetStateValidation (SDK v8), SparkGame and VisualScript use IConsole/ModuleLog, and the inventory lost 15 private-header entries, and names what remains (ECS components, EventBus, subsystem headers, seven *EngineSystems.cpp). acceptanceStatus[1] lists the new SDK and engine files and the PrototypeModuleKit_Helpers count (5 with ImGui / 4 without). ENGINE_READINESS_HANDOFF.md re-rendered; tools/site-data/validate.py passes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The three swap-race regressions raise the family from 18 to 21 on POSIX and 20 on Windows, where the mod.json symlink swap is compiled out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PostProcessPass::Tonemapping now executes on the Linux RHI path. When the PostProcessingPipeline enables it with the variant the shipped PostProcess shader implements (ACES, contrast 1), BeginFrame routes the scene into the R16G16B16A16_FLOAT hdrLighting target through a format-matched forward pipeline, and RenderScene ends with RenderPostProcessing, which binds FullscreenQuad + PostProcess (GLSL on OpenGL, SPIR-V on Vulkan), its constants and a linear-clamp sampler, and draws the HDR scene into the back buffer. A frame asking for tone mapping the pass cannot perform renders to the back buffer, is counted in tonemap.rejectedFrames, logged once, and reports no post pass. Shutdown drains the device before releasing the render targets the last draw reads. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… and entries
The GOV-400 font lane made parse_package_rules() require an embeddedFonts
block, which the rules fixture in Tests/Tools/test_generate_sbom.py lacked:
18 of 46 tests errored (that suite runs in CI and as a CTest). Give the
fixture a non-matching embeddedFonts block so the real rules file stays
fail-closed.
generate-sbom.py reconcile also failed every font entry
cmake/SparkThirdPartyAudit.cmake writes into the packaged inventory
('<family> (editor font)', '<family> (font embedded in <component>)') as an
unlocked dependency. Fonts are the notice gate's, not dependencies.lock's:
report them under fontEntries and keep failing any other unlocked name.
New test fails on the old reconcile and passes now; SBOM suite 47 OK.
Also corrects the embedded-fonts.json description to name the real
embeddedFonts.markers key.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The character row encoder writes a subnormal float as its shortest form
("1e-40"), which std::stof refused with out_of_range, so a saved character
could never load again. The decoder now reads floats through
StringUtils::ParseFloatingExact (from_chars acceptance rules, available on
every lane's standard library), which also refuses the leading space, plus
sign and hex forms the encoder never writes.
The rts-save-snapshot corpus is marked -text like every other corpus, so a
CRLF checkout cannot change the bytes its content digest pins. Also applies
clang-format 18.1.3 to two harnesses.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nts description fix Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ctor starts The windowed hosts (SparkEngineWindowsInit LoadAndInitModules, then InitConsole -> GameplayLifecycleShared) load game modules before the lifecycle calls InvalidStateDetector::Initialize(). With the SDK v8 route as first landed, IStateValidation::AddRule refused every rule a module added from OnLoad on those hosts, and Initialize() cleared the list anyway, so no prototype module rule would ever have run there. - InvalidStateDetector::Initialize() no longer clears m_rules; Shutdown() still empties it, so nothing survives from an earlier run. - EngineSdkStateValidation::AddRule no longer refuses while the detector is not initialized; it still refuses an empty name, category or check. - IStateValidation.h, InvalidStateDetector.h and Creating-a-Game-Module.md describe the new contract. PrototypeModuleKit_StateRulesRegisterThroughSdkContext now adds a rule through a real EngineContext while the detector is shut down, requires it to be kept, to survive Initialize() and to run on the host's scan. Against the previous engine code the test fails (4 assertions: AddRule false, rule count, HasRule, runs == 0). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… it records CreateTonemapPass moves from GraphicsDeviceResourcesLinuxShaders.cpp (which it pushed past the 500-line .cpp threshold) into GraphicsRenderPipelinesLinux.cpp next to RenderPostProcessing, declared in GraphicsEngineRHI.h. The forward and tone-mapping pass tests brace every control-statement body. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GatewayAreaControl.cpp braces 85 -> 84: the epoch-state reader moved to GatewayAreaControlState.cpp, whose statements are braced. Measured with clang-tidy 18.1.8 (all checks) on every changed shipped-product TU, base c14bca6 vs head, deduplicated by (path, line, column, check) as the budget counts; no other (file, check) pair changed. The build-matrix inventory picks up the six new fuzz executables and the shifted Tests/CMakeLists.txt lines, SparkGameMMO's module content inventory records MMOCharacterRecord.{h,cpp} and its Utils/StringUtils.h include, and module.json pins the four new MMOPersistence_ tests (17 -> 21). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nt lines The per-platform SEC3Gameplay count block shifted later Tests/CMakeLists.txt registrations by eight lines; only line numbers and line-derived ids change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ws record
SparkFuzzRTSPersistence failed to compile from the standalone fuzz-policy
project: RTSPersistence.h reaches Spark/Version.h, whose generated
Spark/GeneratedVersion.h was not on the target's include path. It now reuses
the header generated for SparkFuzzReflectedScene, like the chat target.
mmo-character-record listed MMOPersistenceSystem.cpp, so marking it fuzzed also
counted the inventory, guild, guild-member and id-suffix row decoders in that
file, which no harness drives. The file moves to a new blocked
mmo-persistence-rows record (137 parsers, 87 without a target); the fuzzed
record keeps MMOCharacterRecord.{h,cpp}.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nto r3/gov400-fonts Both lines hardened the GOV-400 notice gates; every conflict keeps both behaviours: - PackageNoticeCoverageRules.json: the embeddedFonts block and the systemRuntime/noticeText payload rules, assetManifests and firstPartyRoots; the description names both. - generate_third_party_notices.py and ValidateStagedPackageNotices.cmake: embedded-font rule parsing and binary scanning (before rule lookup, so it also runs on first-party binaries in closed world) alongside the system-runtime, notice-text, closed-world and strict asset-manifest checks. PackageCoverage is built by keyword so the new counters cannot be transposed. The pass summary keeps the embedded-font count and the closed-world line. - SparkThirdPartyAudit.cmake: the notice gets the embedded-font entries and the optional MSVC runtime entry. - TestInstallTreeNoticeCoverage.cmake and the Python parity check parse the merged summary line and compare the embedded-font count across both implementations. - Tests and GOV-400-DECISIONS.md: the union of both sides' cases and text. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…8 notice hardening) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SparkFuzzRTSPersistence linked RTSPersistence.cpp and RTSCommandSystem.cpp for Validate and IsCommandValid, but GNU ld reports the undefined references of Capture, Apply and the command system's unit/pathfinder calls even in sections --gc-sections drops, so the target never linked. RTSPersistence::Validate (its validators braced, logic unchanged) and RTSCommandSystem::IsCommandValid move to Core/RTSPersistenceValidation.cpp; the target links that file and the codec only. SparkTests compiles the new file beside the RTS sources it already lists; the module globs it. The SEC-120 acceptance note now reports the measured 50 of 137 parsers fuzzed (it still said 10 of 141); the criterion stays unmet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GraphicsEngineLinuxFrame.cpp (SPARK_LOG_ONCE) and GraphicsRenderPipelinesLinux.cpp (SPARK_LOG_ERROR) used the logging macros without including Utils/LogMacros.h, so SparkEngineLib did not compile on Linux. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…braced RTSPersistence.cpp braces 27 -> 5 and RTSCommandSystem.cpp braces 18 -> 17, measured with clang-tidy 18.1.8 (all checks, deduplicated) on the changed translation units, base c14bca6 vs head; RTSPersistenceValidation.cpp reports no diagnostics of its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…console and state-validation adapters SparkGame now registers its showcase commands through IEngineContext::GetConsole() and its Base rule through GetStateValidation(). The hand-written host contexts in TestModuleABI (NullEngineContext), TestSparkGameShowcase (ShowcaseHostContext) and TestLIFE200ModuleReloadReal (Life200EngineContext) returned nullptr for both, so the module ran without commands and 9 tests failed on Linux gcc Debug at e4367c0 (ModuleABI_SparkGameShutdownReleasesHostRegistryCallbacksBeforeUnload, six SparkGameShowcase_*, both LIFE200_SparkGame*); all of them pass at the base c14bca6. Each context now holds the production EngineSdkConsole and EngineSdkStateValidation, as the real EngineContext does, so the assertions on the host SimpleConsole and InvalidStateDetector are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds the six targets to the fuzz-policy wiki page: what each harness drives and checks, the defects its regression seeds pin, the pre-fix replays that abort, the 151-second local campaign counts, the mmo-persistence-rows split and the RTS validator move. No target has hosted runtime evidence yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mapping passes Criteria 2 and 3 stay unmet: the forward draw-list and tone-mapping passes now bind and draw on Lavapipe under a forced validation layer with zero errors (local runs only), but the shadow, deferred and remaining post passes have no Linux RHI pipeline and there is no vulkan-lavapipe job. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # Tools/clang-tidy-budget.json # docs/readiness/build-matrix-inventory.json
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # Tools/clang-tidy-budget.json # docs/readiness/build-matrix-inventory.json
…Game.cpp tidy improvement Hosted run on 5c95219: - Blocking CodeQL (c-cpp) reported two new cpp/wrong-type-format-argument findings in Tests/Fixtures/CrashArtifactSandboxProbe.cpp: DWORD values (GetLastError, the integrity RID, the child exit code) passed to %lu/%lx. Cast each to unsigned long so the argument type matches the conversion on every data model. - Clang-Tidy: GameModules/SparkGameFPS/Source/Game/Game.cpp bugprone-exception-escape budget 1 is stale (0 remain after the MOD-310 and fps-visible-frame merge); remove the entry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eforeModules orders against console startup Moving SparkGame onto ModuleLog dropped the "Loading SparkGame showcase module" line that cmake/RunSparkLinuxSDLConsoleStartup.cmake locates to prove the module loads after SimpleConsole initializes, so that test failed with "no SparkGame OnLoad evidence". Log the same text through the SDK logger. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gets The first 151-second campaign's logs were lost to a machine restart, so the campaign was rerun at 76f3f25 (Clang 21 libFuzzer, ASan and UBSan, 151 s each, no crash, leak, timeout or artifact) and the page now quotes those counts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ylibs The closed-world first-party rule for game-module libraries matched the Linux lib*.so naming but not macOS lib*.dylib, so on build-macos LicenseInventory_InstallTreeNoticeCoverage classified the 11 installed module dylibs and their .sparkabi sidecars as unclassified (497 uncovered instead of the 475 NOASSERTION assets). Extend the pattern to .dylib and pin every platform's module naming in the closed-world parity cases, with a non-Spark dylib that must stay unclassified. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…g drain SecureTransport_Handshake_LowOrderHelloFloodDoesNoCryptoWork counted the server's ConnectRejected replies with a single non-blocking drain right after Update(). The server sends all 50 synchronously, but macOS loopback delivery is asynchronous, and build-macos OpenGL saw 47 of 50. Wait up to two seconds for all of them, then drain the rest, so the exact count is still enforced and an extra reject still fails. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…quotes only The windows-vs2022 Release "Execute documented subsystem commands" step failed on wiki/advanced/Testing.md:585, whose filter -R '^FPSVisibleFrame_(CheckerContract|AuthoredAndFallback)$' was cut at the regex '|' as if it were a pipeline. The truncated selection could not be queried, the step exited 1, and the later Run Tests step never ran, so build/ctest-junit.xml was never written. shell_segments() now splits on ; & | and newlines outside single or double quotes, and falls back to splitting on every operator when a quote is unbalanced, so a malformed command is never split less than before. The checker, the static work-item validator and preset_references share it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d matrix resolves them
The Windows Shipping build-matrix parity check has reported 7 blocking
findings since the fuzz-replay executables landed: add_executable(${_target})
inside spark_add_fuzz_replay() was an unresolvable name, so the configured
windows-validation targets SparkFuzzReplay{Archive,CrashManifest,JsonUtils,
SceneManifest} had no source declaration (configured-target-undeclared) and
a fourth target-name-unresolved warning appeared. The pending-authority
validator also still pinned the SparkGameModule.cmake warning at line 190
after b6331ac re-baselined it to 245.
Each replay executable is now a literal add_executable() and
spark_fuzz_replay_test() attaches the shared settings and the corpus test;
the generated build graph and test registrations are byte-identical to
before. The pending validator pins the moved line (same warning, no new
accepted finding); inventory and parity baselines are regenerated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Code Coverage (GCC + lcov)Per-Subsystem Coverage
Selected-subsystem coverage: 57.1% (83307/145928 lines) LCOV corpus coverage: 58.6% (102461/174767 lines); 28839 instrumented lines are outside the threshold table. |
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Code Coverage (GCC + lcov)Per-Subsystem Coverage
Selected-subsystem coverage: 56.8% (83562/147136 lines) LCOV corpus coverage: 58.4% (102716/175975 lines); 28839 instrumented lines are outside the threshold table. |
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Code Coverage (GCC + lcov)Per-Subsystem Coverage
Selected-subsystem coverage: 0% (0/0 lines) LCOV corpus coverage: 0% (0/0 lines); 0 instrumented lines are outside the threshold table. |
Code Coverage (GCC + lcov)Per-Subsystem Coverage
Selected-subsystem coverage: 56.8% (83562/147136 lines) LCOV corpus coverage: 58.4% (102716/175975 lines); 28839 instrumented lines are outside the threshold table. |
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Code Coverage (GCC + lcov)Per-Subsystem Coverage
Selected-subsystem coverage: 56.9% (83754/147303 lines) LCOV corpus coverage: 58.4% (102908/176142 lines); 28839 instrumented lines are outside the threshold table. |
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Code Coverage (GCC + lcov)Per-Subsystem Coverage
Selected-subsystem coverage: 56.9% (83819/147357 lines) LCOV corpus coverage: 58.4% (102973/176196 lines); 28839 instrumented lines are outside the threshold table. |
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Code Coverage (GCC + lcov)Per-Subsystem Coverage
Selected-subsystem coverage: 56.9% (83823/147357 lines) LCOV corpus coverage: 58.4% (102977/176196 lines); 28839 instrumented lines are outside the threshold table. |
Signed-off-by: Krill <natew94@gmail.com>
Signed-off-by: Krill <natew94@gmail.com>
Code Coverage (GCC + lcov) |
Code Coverage (GCC + lcov)Per-Subsystem Coverage
Selected-subsystem coverage: 56.9% (83826/147357 lines) LCOV corpus coverage: 58.4% (102980/176196 lines); 28839 instrumented lines are outside the threshold table. |
Windows modifier handling now resolves physical Shift/Ctrl/Alt sides while preserving generic unions and frame edges. Installed FPS dispatch captures GUI output with closed stdin. H8/H9 were reconstructed from retained thread patch output because the unpublished Git objects were unavailable. Existing assertions, selections, timeouts, skip ceilings and release gates remain intact.
Draft head 1a8dfbd; installed-qualification product 7a07294 is pinned at all seven sites in the dedicated workflow. Later commits update Shipping reproducibility, test source-root/port handling, material-size arithmetic, Clang-Tidy budgets, TSan statistics validation, Windows test-lane accounting, MSI transform staging and the generated build-matrix inventory.
Hosted installed ABI10 weather qualification passed at the pinned
7a072946aproduct revision on current-head run 37503158807: both source contracts and installed-native jobs succeeded.The material editor now decodes saved
.spkmatvalues transactionally, including all ten parameter types, texture paths with spaces, UV transforms, render state and the legacyAmbient Occlusionslot. Missing, malformed, duplicate, nonfinite and out-of-project inputs preserve the active dirty material. Double-clicking a contained.spkmatasset opens the persistent Material Editor.At earlier product revision 3e4c296, fresh MSVC Release configure/build passed with 2,450 dependency records and zero foreign dependencies. All 44 selected native gates passed in 520.09 seconds. Main suite: 8,176 passed, zero failed, 23 skipped; 277,424 assertions passed. The ten-case material gate passed 91 assertions, and normal Windows corpus replay passed all eight seeds. At current head
1a8dfbd65, a clean MSVC Release build passed, followed by all 44 selected native CTest gates in onevcvars64run (560.22 seconds). This includes the full engine suite, installed SDK consumer, installer and notice coverage, editor/package/runtime, graphics, security and recovery drills.The production parser has a sanitizer-backed fuzz target and eight-seed corpus. At
eea548479, Windows MSVC libFuzzer/ASan passed 50,000 iterations. Linux Clang/libc++ ASan+UBSan built and passed the smoke target at an earlier revision; hosted fuzz compilation and all 75 smoke targets also passed earlier. FuzzPolicy and all 244 adversarial policy cases passed locally ateea548479. Clang-Tidy debt was reduced from 15,660 to 15,659.At
aed904c9c, deterministic documentation passed two isolated generations plus links, anchors, manifests and routes. The current head1a8dfbd65refreshed the exact build-matrix inventory after the CMake test-lane split; local inventory parity and hosted source contracts passed. Explicit MSVC CMake configure and Release build passed at the current head.Fresh ZIP, NSIS and MSI packages were generated from a clean
1a8dfbd65Release build. The ZIP's Engine, Editor and FPS binaries matched that build byte for byte when packaged. The unsigned per-user MSI passed identity/version, install, installed FPS runtime, exact-hash repair, uninstall and external data preservation. A read-only copy of that MSI produced the interruption transform without changing the input or leaving a temporary MSI. Owned-window relocated FPS input/save/load/negative/lifecycle acceptance passed. A disposable Blank3D module rebuilt against the relocated SDK used 103 package headers, zero engine-source headers, and ran 713 frames with zero lifecycle faults. A later explicit reconfigure relinked the same commit to different binary hashes for the 44-gate batch; the package binding is to the first clean build, and hosted Shipping remains a separate gate.At earlier product revision 3e4c296, direct relocated-editor testing opened the authored material at roughness 0.248, changed and saved it at 0.348, then verified 0.348 in a fresh editor process. Both D3D11/WARP editor runs had zero presentation failures. The
1a8dfbd65relocated editor separately loaded the disposable project and rendered 10,000 D3D11/WARP frames without a presentation failure. Current-head click/save interaction remains unverified because gated UI control is currently disabled.Hosted Windows Shipping reproducibility passed at
eea548479: 33 installed outputs compared, zero differences or missing outputs, and both independent builds passed strict closure of all 17 locked dependencies (Build run 37470843883).At
eea548479, Linux TSan ran 8,340 cases (8,325 passed, 15 skipped, zero test failures) but failed on one reported data race reached while a deferred Vulkan command list was freed; both conflicting accesses are in libVkLayer_khronos_validation. The validated artifact is retained from Build run 37470843883. A same-revision rerun was cancelled by a PR push before tests began; the new1a8dfbd65CI run must retest TSan. The finding is under investigation; no suppression or skip-ceiling change has been made.Draft; not fully merge-ready or public-release qualified. Prior Build run 37470843883 at
eea548479finished red: required Linux TSan reported a race, the Shipping SparkGameFPS MSI interruption drill could not open its temporary database, and aggregate statistics and the Required CI Gate failed downstream. Clang-Tidy, VS2022 Release, CodeQL, installed ABI10, Windows installer, Windows Shipping matrix, and 33/33-output Shipping reproducibility passed at that revision. Advisory VS2026 Release also failed: its main suite reached the 240-second wrapper timeout after starting 8,128 of 8,309 cases, and the fail-closed CPU-floor scan withheld 14.44-reviewed CRT/STL exemptions from 14.51 PDBs. Advisory MSan was cancelled at the two-hour job limit with only partial test evidence. The MSI and VS2026 test-population fixes were pushed ataed904c9c; current head1a8dfbd65refreshes the stale generated inventory. Exact-head installed ABI10 and local 44-gate native qualification passed, but Build run 37503168539 remains queued and exact-head Wiki/Site Data runs were cancelled. No 14.51 CPU-floor exemption or TSan suppression has been granted. Signed clean-host upgrade/rollback, protected producer authority, broader panel/gameplay/multiplayer/hardware coverage and final hosted analysis remain pending. No merge or release is authorized.