WIP: Character creator: the Vitruvian body (CharMorph, CC0) replaces MakeHuman's mesh #139

Draft
khyretos wants to merge 1 commit from khyretos/claude/creator-vitruvian into claude/creator-polish AGit
Owner

The creator's realistic body is CharMorph Vitruvian's skin (26k vertices, a real nose, lips, eyelids) with its own 4K skin maps, in the same pack format, so sliders, rig, clothes, hair and share codes work unchanged. tools/makehuman/vitruvian_pack.py makes it; KKE_HUMAN_BODY=makehuman brings the old body back. Stacked on #137. Full notes: handoff files/creator-vitruvian-pr.md

The creator's realistic body is CharMorph Vitruvian's skin (26k vertices, a real nose, lips, eyelids) with its own 4K skin maps, in the same pack format, so sliders, rig, clothes, hair and share codes work unchanged. tools/makehuman/vitruvian_pack.py makes it; KKE_HUMAN_BODY=makehuman brings the old body back. Stacked on #137. Full notes: handoff files/creator-vitruvian-pr.md
Character creator: the Vitruvian body (CharMorph, CC0) replaces MakeHuman's mesh
Some checks failed
CI / dependencies (pull_request) Successful in 16s
CI / std-includes (pull_request) Successful in 22s
CI / shipping-build (pull_request) Failing after 4m1s
Benchmarks / benchmarks (pull_request) Failing after 7m52s
Docs site / site (pull_request) Successful in 24s
CI / android (pull_request) Failing after 4m38s
CI / build-test-and-coverage (pull_request) Failing after 9m34s
lint / megalinter (pull_request) Successful in 3m19s
CI / release-build (pull_request) Failing after 12m40s
Windows (native) / build (pull_request) Failing after 6m21s
Windows (native) / test (pull_request) Has been skipped
Windows (native) / publish (pull_request) Has been skipped
e687c9351c
Kees: the models look like cavemen and I never did the high-fidelity
models he asked for from the sources he gave. MakeHuman's 13,000 vertex
face and body were the problem, however the sliders were set.

- assets/humans/vitruvian.kkhpack: CharMorph Vitruvian's skin (26,000
  vertices, a real nose, lips, eyelids, ears, fingers) in the same pack
  format, so the sliders, rig, clothes, hair, eyes and share codes work on
  it unchanged. MakeHuman's 1,280 targets, skin weights, skeleton and
  helper meshes are carried onto it; the default sliders land on
  Vitruvian's own shape (MakeHuman's default macro offsets are subtracted).
- vitruvian_skin_{albedo,normal,roughness}.jpg: Vitruvian's own 4K UDIM
  skin repacked as one 4096 atlas (12 MB as PNG would have been 52).
- tools/makehuman/vitruvian_pack.py makes both (under two minutes).
  Body-type targets are smoothed (sigma 18 mm): MakeHuman's fine detail
  (nipples, ribs) did not line up and left creased chests and flank
  swells at 8 mm. Eyeballs are fitted to Vitruvian's own, so brows and
  lashes land on the face. Helper meshes ride a smooth field, or the
  clothes came out lumpy with ragged hems.
- The creator uses it when the pack is there; KKE_HUMAN_BODY=makehuman
  brings the old body back. Hair is drawn fuller (more strands per guide,
  wider spread) on the better head.
- Tests: the Vitruvian pack has MakeHuman's sliders and rig on a finer
  body, default sliders give a person and the archetypes differ, eyes
  brows and hair sit on the face, every garment fits it.

Not in this commit: anime shading from the toon-shader sources, the
mouth, the crown parting, more hair styles on the new head.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Collaborator

Title

WIP: Character creator: the Vitruvian body (CharMorph, CC0) replaces MakeHuman's mesh


User description

The creator's realistic body is CharMorph Vitruvian's skin (26k vertices, a real nose, lips, eyelids) with its own 4K skin maps, in the same pack format, so sliders, rig, clothes, hair and share codes work unchanged. tools/makehuman/vitruvian_pack.py makes it; KKE_HUMAN_BODY=makehuman brings the old body back. Stacked on #137. Full notes: handoff files/creator-vitruvian-pr.md


PR Type

Enhancement


Description

  • Replaces MakeHuman mesh with Vitruvian body (26k vertices)

  • Adds vitruvian_pack.py to generate pack and 4K skin maps

  • Updates character creator to load Vitruvian by default

  • Extends tests for Vitruvian body compatibility


Diagram Walkthrough

flowchart LR
  A["CharMorph Vitruvian"] -->|"mesh & maps"| B["vitruvian.kkhpack"]
  C["MakeHuman Pack"] -.->|"rig & targets"| B
  D["vitruvian_pack.py"] -->|"generates"| B
  E["Character Creator"] -->|"loads"| B
  F["Tests"] -->|"validates"| B

File Walkthrough

Relevant files
Enhancement
3 files
CharacterCreatorModule.cpp
Switches default human pack to Vitruvian with env override
+22/-5   
CharacterCreatorModule.h
Adds m_skinPrefix field for Vitruvian texture prefix         
+1/-0     
vitruvian_pack.py
New script to build Vitruvian pack from CharMorph data     
+676/-0 
Tests
1 files
test_human.cpp
Adds Vitruvian body tests for rig, sliders and hair           
+122/-0 
Documentation
2 files
credits.json
Credits CharMorph Vitruvian authors and CC0 licence           
+11/-0   
HUMANS.md
Documents Vitruvian body integration and generation steps
+61/-3   
Configuration changes
2 files
DEPENDENCIES.md
Registers Vitruvian pack and maps as new dependencies       
+1/-0     
CMakeLists.txt
Copies Vitruvian pack and skin maps to runtime assets       
+2/-1     
Additional files
1 files
vitruvian.kkhpack [link]   

## Title WIP: Character creator: the Vitruvian body (CharMorph, CC0) replaces MakeHuman's mesh ___ ### **User description** The creator's realistic body is CharMorph Vitruvian's skin (26k vertices, a real nose, lips, eyelids) with its own 4K skin maps, in the same pack format, so sliders, rig, clothes, hair and share codes work unchanged. tools/makehuman/vitruvian_pack.py makes it; KKE_HUMAN_BODY=makehuman brings the old body back. Stacked on #137. Full notes: handoff files/creator-vitruvian-pr.md ___ ### **PR Type** Enhancement ___ ### **Description** - Replaces MakeHuman mesh with Vitruvian body (26k vertices) - Adds `vitruvian_pack.py` to generate pack and 4K skin maps - Updates character creator to load Vitruvian by default - Extends tests for Vitruvian body compatibility ___ ### Diagram Walkthrough ```mermaid flowchart LR A["CharMorph Vitruvian"] -->|"mesh & maps"| B["vitruvian.kkhpack"] C["MakeHuman Pack"] -.->|"rig & targets"| B D["vitruvian_pack.py"] -->|"generates"| B E["Character Creator"] -->|"loads"| B F["Tests"] -->|"validates"| B ``` <details> <summary><h3> File Walkthrough</h3></summary> <table><thead><tr><th></th><th align="left">Relevant files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><details><summary>3 files</summary><table> <tr> <td><strong>CharacterCreatorModule.cpp</strong><dd><code>Switches default human pack to Vitruvian with env override</code></dd></td> <td><a href="https://git.kreative-kompas.com/khyretos/kk-engine/src/branch/refs/pull/139/head/engine/src/modules/CharacterCreatorModule.cpp">+22/-5</a>&nbsp; &nbsp; </td> </tr> <tr> <td><strong>CharacterCreatorModule.h</strong><dd><code>Adds m_skinPrefix field for Vitruvian texture prefix</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://git.kreative-kompas.com/khyretos/kk-engine/src/branch/refs/pull/139/head/engine/include/kke/modules/CharacterCreatorModule.h">+1/-0</a>&nbsp; &nbsp; &nbsp; </td> </tr> <tr> <td><strong>vitruvian_pack.py</strong><dd><code>New script to build Vitruvian pack from CharMorph data</code>&nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://git.kreative-kompas.com/khyretos/kk-engine/src/branch/refs/pull/139/head/tools/makehuman/vitruvian_pack.py">+676/-0</a>&nbsp; </td> </tr> </table></details></td></tr><tr><td><strong>Tests</strong></td><td><details><summary>1 files</summary><table> <tr> <td><strong>test_human.cpp</strong><dd><code>Adds Vitruvian body tests for rig, sliders and hair</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://git.kreative-kompas.com/khyretos/kk-engine/src/branch/refs/pull/139/head/tests/test_human.cpp">+122/-0</a>&nbsp; </td> </tr> </table></details></td></tr><tr><td><strong>Documentation</strong></td><td><details><summary>2 files</summary><table> <tr> <td><strong>credits.json</strong><dd><code>Credits CharMorph Vitruvian authors and CC0 licence</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://git.kreative-kompas.com/khyretos/kk-engine/src/branch/refs/pull/139/head/assets/humans/credits.json">+11/-0</a>&nbsp; &nbsp; </td> </tr> <tr> <td><strong>HUMANS.md</strong><dd><code>Documents Vitruvian body integration and generation steps</code></dd></td> <td><a href="https://git.kreative-kompas.com/khyretos/kk-engine/src/branch/refs/pull/139/head/docs/HUMANS.md">+61/-3</a>&nbsp; &nbsp; </td> </tr> </table></details></td></tr><tr><td><strong>Configuration changes</strong></td><td><details><summary>2 files</summary><table> <tr> <td><strong>DEPENDENCIES.md</strong><dd><code>Registers Vitruvian pack and maps as new dependencies</code>&nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://git.kreative-kompas.com/khyretos/kk-engine/src/branch/refs/pull/139/head/docs/DEPENDENCIES.md">+1/-0</a>&nbsp; &nbsp; &nbsp; </td> </tr> <tr> <td><strong>CMakeLists.txt</strong><dd><code>Copies Vitruvian pack and skin maps to runtime assets</code>&nbsp; &nbsp; &nbsp; &nbsp; </dd></td> <td><a href="https://git.kreative-kompas.com/khyretos/kk-engine/src/branch/refs/pull/139/head/CMakeLists.txt">+2/-1</a>&nbsp; &nbsp; &nbsp; </td> </tr> </table></details></td></tr><tr><td><strong>Additional files</strong></td><td><details><summary>1 files</summary><table> <tr> <td><strong>vitruvian.kkhpack</strong></td> <td><a href="https://git.kreative-kompas.com/khyretos/kk-engine/src/branch/refs/pull/139/head/assets/humans/vitruvian.kkhpack">[link]</a>&nbsp; &nbsp; </td> </tr> </table></details></td></tr></tr></tbody></table> </details> ___
Collaborator

PR Reviewer Guide 🔍

📋 Focus areas: 🔴 2 open · ✅ 0 handled. Every push re-checks them; a handled area moves to Resolved findings at the bottom.

⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
🧪 PR contains tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

Hard-coded file paths for skin maps

The skinMaterial function in CharacterCreatorModule.cpp (lines 796-801) uses a lambda to search for skin texture files, but it only checks for .jpg and .png extensions. This is problematic because the PR introduces new JPEG files (vitruvian_skin_*.jpg) while the old code expected PNGs. Although the lambda attempts to find either extension, relying on file extensions rather than a more robust asset loading mechanism or configuration could lead to runtime errors if the file naming convention changes or if the build system produces files with unexpected extensions. Additionally, the logic assumes the files are located directly in m_humansDir, which might not account for subdirectories or different packaging strategies in the future.

// A map is a .jpg (Vitruvian's 4096 atlas: small files) or a .png (the MakeHuman bake).
auto map = [&](const char* name) {
    for (const char* ext : { ".jpg", ".png" })
        if (const std::string f = m_humansDir + "/" + m_skinPrefix + name + ext; fs::exists(f)) return f;
    return std::string();
};
Potential resource leak in main()

In the main() function of vitruvian_pack.py (line 664), the log function is defined as a local closure that prints to stdout. While this is generally acceptable for CLI tools, there is no explicit cleanup or error handling for the args.out_dir directory if an exception occurs after os.makedirs(args.out_dir, exist_ok=True) (line 661) but before the pack or maps are written. If an error occurs during build_pack or build_maps, the partially created output directory will remain, potentially leaving stale data. It would be better to wrap the main logic in a try-finally block to ensure cleanup or at least log the error more explicitly before exiting.

def log(*a):
    print(f"[{time.time() - t0:4.0f}s]", *a, flush=True)

pack, uv_tris = build_pack(read_pack(args.makehuman_pack), args.vitruvian_npz, args.vitruvian_dir, log)
with open(os.path.join(args.out_dir, "vitruvian.kkhpack"), "wb") as f:
    f.write(pack)
log(f"vitruvian.kkhpack {len(pack) / 1e6:.1f} MB")
if not args.no_maps:
    build_maps(args.vitruvian_dir, uv_tris, args.tile, args.out_dir, log)

## PR Reviewer Guide 🔍 <!-- pr-agent:review:full --> 📋 **Focus areas:** 🔴 2 open · ✅ 0 handled. Every push re-checks them; a handled area moves to *Resolved findings* at the bottom. <table> <tr><td>⏱️&nbsp;<strong>Estimated effort to review</strong>: 2 🔵🔵⚪⚪⚪</td></tr> <tr><td>🧪&nbsp;<strong>PR contains tests</strong></td></tr> <tr><td>🔒&nbsp;<strong>No security concerns identified</strong></td></tr> <tr><td>⚡&nbsp;<strong>Recommended focus areas for review</strong><br><br> <details><summary><a href='https://git.kreative-kompas.com/khyretos/kk-engine/src/branch/refs/pull/139/head/engine/src/modules/CharacterCreatorModule.cpp#L796-L801'><strong>Hard-coded file paths for skin maps</strong></a> The `skinMaterial` function in `CharacterCreatorModule.cpp` (lines 796-801) uses a lambda to search for skin texture files, but it only checks for `.jpg` and `.png` extensions. This is problematic because the PR introduces new JPEG files (`vitruvian_skin_*.jpg`) while the old code expected PNGs. Although the lambda attempts to find either extension, relying on file extensions rather than a more robust asset loading mechanism or configuration could lead to runtime errors if the file naming convention changes or if the build system produces files with unexpected extensions. Additionally, the logic assumes the files are located directly in `m_humansDir`, which might not account for subdirectories or different packaging strategies in the future. </summary> ```c++ // A map is a .jpg (Vitruvian's 4096 atlas: small files) or a .png (the MakeHuman bake). auto map = [&](const char* name) { for (const char* ext : { ".jpg", ".png" }) if (const std::string f = m_humansDir + "/" + m_skinPrefix + name + ext; fs::exists(f)) return f; return std::string(); }; ``` </details> <details><summary><a href='https://git.kreative-kompas.com/khyretos/kk-engine/src/branch/refs/pull/139/head/tools/makehuman/vitruvian_pack.py#L664-L673'><strong>Potential resource leak in main()</strong></a> In the `main()` function of `vitruvian_pack.py` (line 664), the `log` function is defined as a local closure that prints to stdout. While this is generally acceptable for CLI tools, there is no explicit cleanup or error handling for the `args.out_dir` directory if an exception occurs after `os.makedirs(args.out_dir, exist_ok=True)` (line 661) but before the pack or maps are written. If an error occurs during `build_pack` or `build_maps`, the partially created output directory will remain, potentially leaving stale data. It would be better to wrap the main logic in a try-finally block to ensure cleanup or at least log the error more explicitly before exiting. </summary> ```python def log(*a): print(f"[{time.time() - t0:4.0f}s]", *a, flush=True) pack, uv_tris = build_pack(read_pack(args.makehuman_pack), args.vitruvian_npz, args.vitruvian_dir, log) with open(os.path.join(args.out_dir, "vitruvian.kkhpack"), "wb") as f: f.write(pack) log(f"vitruvian.kkhpack {len(pack) / 1e6:.1f} MB") if not args.no_maps: build_maps(args.vitruvian_dir, uv_tris, args.tile, args.out_dir, log) ``` </details> </td></tr> </table> <!-- pr-agent-review-state:v1 {"findings":[{"body":"**Potential resource leak in main()**\n\nIn the `main()` function of `vitruvian_pack.py` (line 664), the `log` function is defined as a local closure that prints to stdout. While this is generally acceptable for CLI tools, there is no explicit cleanup or error handling for the `args.out_dir` directory if an exception occurs after `os.makedirs(args.out_dir, exist_ok=True)` (line 661) but before the pack or maps are written. If an error occurs during `build_pack` or `build_maps`, the partially created output directory will remain, potentially leaving stale data. It would be better to wrap the main logic in a try-finally block to ensure cleanup or at least log the error more explicitly before exiting.","finding_id":"6283ab43305b","first_seen":"2026-10-27T21:06:07.924990Z","last_seen":"2026-10-27T21:06:07.924990Z","last_seen_head_sha":"e687c9351cd1d22e3b8dd8f25a69d3d11d46c186","line_end":673,"line_start":664,"path":"tools/makehuman/vitruvian_pack.py","state":"ACTIVE"},{"body":"**Hard-coded file paths for skin maps**\n\nThe `skinMaterial` function in `CharacterCreatorModule.cpp` (lines 796-801) uses a lambda to search for skin texture files, but it only checks for `.jpg` and `.png` extensions. This is problematic because the PR introduces new JPEG files (`vitruvian_skin_*.jpg`) while the old code expected PNGs. Although the lambda attempts to find either extension, relying on file extensions rather than a more robust asset loading mechanism or configuration could lead to runtime errors if the file naming convention changes or if the build system produces files with unexpected extensions. Additionally, the logic assumes the files are located directly in `m_humansDir`, which might not account for subdirectories or different packaging strategies in the future.","finding_id":"7b3e1ad54008","first_seen":"2026-10-27T21:06:07.924990Z","last_seen":"2026-10-27T21:06:07.924990Z","last_seen_head_sha":"e687c9351cd1d22e3b8dd8f25a69d3d11d46c186","line_end":801,"line_start":796,"path":"engine/src/modules/CharacterCreatorModule.cpp","state":"ACTIVE"}],"last_run":{"complete":true,"excluded_files":[],"head_sha":"e687c9351cd1d22e3b8dd8f25a69d3d11d46c186","kind":"full","run_id":"https://git.kreative-kompas.com/khyretos/kk-engine/commit/e687c9351cd1d22e3b8dd8f25a69d3d11d46c186"},"schema_version":1} -->
Collaborator

PR Code Suggestions ✨

No code suggestions found for the PR.

## PR Code Suggestions ✨ <!-- pr-agent:improve:no-suggestions --> No code suggestions found for the PR.

🧹 Lint report · ❌ 38 problems in 6 checks · 🧹 3 formatting checks to tidy

Nothing here blocks the merge (report only).

Check Errors Warnings Files
❌ MARKDOWN · markdownlint 24 0 255
❌ CPP · cppcheck 9 0 957
❌ YAML · yamllint 2 0 57
❌ BASH · shellcheck 1 0 11
❌ DOCKERFILE · hadolint 1 0 9
❌ REPOSITORY · trivy 1 0 –
MARKDOWN · markdownlint: first lines of the output
See documentation on https://megalinter.io/9.4.0/descriptors/markdown_markdownlint/
-----------------------------------------------
❌ [ERROR] for workspace /workspace/khyretos/kk-engine
Linter raw log:
docs/ANDROID.md:87 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/ANDROID.md:128 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/ANDROID.md:136 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/ANDROID.md:149 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/ANDROID.md:163 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/ANDROID.md:186 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/ASSETS.md:155 error MD046/code-block-style Code block style [Expected: fenced; Actual: indented]
docs/HISTORY.md:21 error MD025/single-title/single-h1 Multiple top-level headings in the same document [Context: " Kreative Kompas Engine (KKE)"]
docs/HISTORY.md:520 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/HISTORY.md:727 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/HISTORY.md:734 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/HISTORY.md:2031 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/HISTORY.md:2090 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/MODDING.md:13 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/NETWORKING.md:114 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/PLATFORMS.md:48 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/PROCEDURAL_ANIMATION.md:36 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/PROCEDURAL_ANIMATION.md:284 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
games/racing/README.md:34 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
games/racing/README.md:76:91 error MD056/table-column-count Table column count [Expected: 4; Actual: 3; Too few cells, row will be missing data]
games/racing/README.md:77:89 error MD056/table-column-count Table column count [Expected: 4; Actual: 3; Too few cells, row will be missing data]
…
CPP · cppcheck: first lines of the output
See documentation on https://megalinter.io/9.4.0/descriptors/cpp_cppcheck/
-----------------------------------------------
✅ [SUCCESS] benchmarks/kke_bench/main.cpp
✅ [SUCCESS] benchmarks/kke_benchmark/main.cpp
✅ [SUCCESS] engine/include/engine/Buffer.h
✅ [SUCCESS] engine/include/engine/Mesh.h
✅ [SUCCESS] engine/include/engine/Pipeline.h
✅ [SUCCESS] engine/include/engine/Renderer.h
✅ [SUCCESS] engine/include/engine/SwapChain.h
✅ [SUCCESS] engine/include/engine/VulkanCheck.h
✅ [SUCCESS] engine/include/engine/VulkanDevice.h
✅ [SUCCESS] engine/include/engine/Window.h
✅ [SUCCESS] engine/include/kke/AnimEvents.h
✅ [SUCCESS] engine/include/kke/AnimRig.h
✅ [SUCCESS] engine/include/kke/Animator.h
✅ [SUCCESS] engine/include/kke/AnimeRenderer.h
✅ [SUCCESS] engine/include/kke/Application.h
✅ [SUCCESS] engine/include/kke/AssetCatalog.h
✅ [SUCCESS] engine/include/kke/AudioMixer.h
✅ [SUCCESS] engine/include/kke/AutoRig.h
✅ [SUCCESS] engine/include/kke/BenchRecorder.h
✅ [SUCCESS] engine/include/kke/BenchmarkReport.h
✅ [SUCCESS] engine/include/kke/Bloom.h
✅ [SUCCESS] engine/include/kke/BodyShape.h
✅ [SUCCESS] engine/include/kke/BreakGraph.h
…
YAML · yamllint: first lines of the output
See documentation on https://megalinter.io/9.4.0/descriptors/yaml_yamllint/
-----------------------------------------------
❌ [ERROR] for workspace /workspace/khyretos/kk-engine
Linter raw log:
games/goblin_horde/data/heroes.yml
  53:11     error    too many spaces after colon  (colons)
  63:11     error    too many spaces after colon  (colons)
BASH · shellcheck: first lines of the output
See documentation on https://megalinter.io/9.4.0/descriptors/bash_shellcheck/
-----------------------------------------------
❌ [ERROR] for workspace /workspace/khyretos/kk-engine
Linter raw log:
In tools/packaging/package.sh line 130:
	done < <(find "$stage" "$stage/benchmark" -maxdepth 1 -type f \( -name "*$exe" -o -name '*.dll' \) $([ -z "$exe" ] && echo "-perm -u+x") -print0)
                                                                                                           ^-- SC2046 (warning): Quote this to prevent word splitting.
For more information:
  https://www.shellcheck.net/wiki/SC2046 -- Quote this to prevent word splitt...
DOCKERFILE · hadolint: first lines of the output
See documentation on https://megalinter.io/9.4.0/descriptors/dockerfile_hadolint/
-----------------------------------------------
❌ [ERROR] for workspace /workspace/khyretos/kk-engine
Linter raw log:
docker/android.Dockerfile:19 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check
docker/appimage.Dockerfile:38 SC2016 info: Expressions don't expand in single quotes, use double quotes for that.
docker/appimage.Dockerfile:51 DL3003 warning: Use WORKDIR to switch to a directory
docker/appimage.Dockerfile:57 DL3003 warning: Use WORKDIR to switch to a directory
docker/appimage.Dockerfile:63 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check
docker/appimage.Dockerfile:63 DL3003 warning: Use WORKDIR to switch to a directory
docker/appimage.Dockerfile:73 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check
docker/appimage.Dockerfile:73 DL3003 warning: Use WORKDIR to switch to a directory
docker/ci.Dockerfile:42 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check
docker/ci.Dockerfile:56 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check
docker/server/Dockerfile:22 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check
docker/vm.Dockerfile:22 SC2086 info: Double quote to prevent globbing and word splitting.
docker/vm.Dockerfile:29 DL3003 warning: Use WORKDIR to switch to a directory
docker/vm.Dockerfile:29 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check
website/Dockerfile:9 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check
REPOSITORY · trivy: first lines of the output
See documentation on https://megalinter.io/9.4.0/descriptors/repository_trivy/
-----------------------------------------------
❌ [ERROR] for workspace /workspace/khyretos/kk-engine
Linter raw log:
2026-10-27T21:15:22Z	INFO	[vulndb] Need to update DB
2026-10-27T21:15:22Z	INFO	[vulndb] Downloading vulnerability DB...
2026-10-27T21:15:22Z	INFO	[vulndb] Downloading artifact...	repo="mirror.gcr.io/aquasec/trivy-db:2"
2.29 MiB / 130.09 MiB [->____________________________________________________________] 1.76% ? p/s ?10.01 MiB / 130.09 MiB [---->________________________________________________________] 7.69% ? p/s ?19.71 MiB / 130.09 MiB [--------->__________________________________________________] 15.15% ? p/s ?25.31 MiB / 130.09 MiB [--------->_____________________________________] 19.45% 38.41 MiB p/s ETA 2s36.50 MiB / 130.09 MiB [------------->_________________________________] 28.06% 38.41 MiB p/s ETA 2s46.57 MiB / 130.09 MiB [---------------->______________________________] 35.80% 38.41 MiB p/s ETA 2s54.36 MiB / 130.09 MiB [------------------->___________________________] 41.79% 39.05 MiB p/s ETA 1s60.33 MiB / 130.09 MiB [--------------------->_________________________] 46.38% 39.05 MiB p/s ETA 1s69.84 MiB / 130.09 MiB [------------------------->_____________________] 53.69% 39.05 MiB p/s ETA 1s78.55 MiB / 130.09 MiB [---------------------------->__________________] 60.39% 39.14 MiB p/s ETA 1s87.25 MiB / 130.09 MiB [------------------------------->_______________] 67.07% 39.14 MiB p/s ETA 1s97.28 MiB / 130.09 MiB [----------------------------------->___________] 74.78% 39.14 MiB p/s ETA 0s106.66 MiB / 130.09 MiB [------------------------------------->________] 81.99% 39.63 MiB p/s ETA 0s116.73 MiB / 130.09 MiB [----------------------------------------->____] 89.73% 39.63 MiB p/s ETA 0s127.89 MiB / 130.09 MiB [--------------------------------------------->] 98.31% 39.63 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 39.59 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 39.59 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 39.59 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 37.04 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 37.04 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 37.04 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 34.65 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 34.65 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 34.65 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 32.41 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 32.41 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 32.41 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 30.32 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 30.32 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 30.32 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 28.37 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 28.37 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 28.37 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 26.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 26.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 26.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 24.82 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 24.82 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 24.82 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 23.22 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 23.22 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 23.22 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 21.72 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 21.72 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 21.72 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 20.32 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 20.32 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 20.32 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 19.01 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 19.01 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 19.01 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 17.78 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 17.78 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 17.78 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 16.64 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 16.64 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 16.64 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 15.56 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 15.56 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 15.56 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 14.56 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 14.56 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 14.56 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 13.62 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 13.62 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 13.62 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 12.74 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 12.74 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 12.74 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 11.92 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 11.92 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 11.92 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 11.15 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 11.15 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 11.15 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 10.43 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 10.43 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 10.43 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 9.76 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 9.76 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 9.76 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 9.13 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 9.13 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 9.13 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 8.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 8.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 8.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 7.99 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 7.99 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 7.99 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 7.47 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 7.47 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 7.47 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.99 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.99 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.99 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.12 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.12 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.12 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 5.72 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 5.72 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 5.72 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------------] 100.00% 6.22 MiB p/s 21s2026-10-27T21:15:44Z	INFO	[vulndb] Artifact successfully downloaded	repo="mirror.gcr.io/aquasec/trivy-db:2"
2026-10-27T21:15:44Z	INFO	[vuln] Vulnerability scanning is enabled
2026-10-27T21:15:44Z	INFO	[misconfig] Misconfiguration scanning is enabled
2026-10-27T21:15:44Z	INFO	[checks-client] Need to update the checks bundle
2026-10-27T21:15:44Z	INFO	[checks-client] Downloading the checks bundle...
234.57 KiB / 234.57 KiB [------------------------------------------------------] 100.00% ? p/s 200ms2026-10-27T21:15:48Z	WARN	[rego] Module will be skipped as current version of Trivy is older than minimum trivy version required - please update Trivy to use this module	file_path="root/.cache/trivy/policy/content/policies/cloud/policies/aws/cloudfront/enable_logging.rego" minimum_trivy_version="0.72.0"
2026-10-27T21:15:49Z	ERROR	[dockerfile scanner] Failed to parse file	file_path="docker/server/Dockerfile.dockerignore" err="parse dockerfile instruction: parse instruction \".git\": unknown instruction: .git"
2026-10-27T21:15:49Z	INFO	Number of language-specific files	num=0
2026-10-27T21:15:49Z	INFO	Detected config files	num=9
Report Summary
┌──────────────────────────────┬────────────┬─────────────────┬───────────────────┐
│            Target            │    Type    │ Vulnerabilities │ Misconfigurations │
├──────────────────────────────┼────────────┼─────────────────┼───────────────────┤
│ benchmarks/docker/Dockerfile │ dockerfile │        -        │         2         │
├──────────────────────────────┼────────────┼─────────────────┼───────────────────┤
│ docker/android.Dockerfile    │ dockerfile │        -        │         2         │
├──────────────────────────────┼────────────┼─────────────────┼───────────────────┤
│ docker/appimage.Dockerfile   │ dockerfile │        -        │         5         │
…

🧹 Formatting only (layout, no behaviour; the nightly lint-fix job applies these as a PR): YAML · prettier (57 files checked), BASH · shfmt (11 files checked), JSON · prettier (147 files checked)

✅ Clean: actionlint, git_diff, gitleaks, grype, jsonlint, secretlint, stylelint, trufflehog, xmllint

MegaLinter on soucouyant · full logs in the Actions run · comment /improve for AI fix suggestions

<!-- kk-lint --> ## 🧹 Lint report · ❌ 38 problems in 6 checks · 🧹 3 formatting checks to tidy Nothing here blocks the merge (report only). | | Check | Errors | Warnings | Files | |---|---|---:|---:|---:| | ❌ | MARKDOWN · markdownlint | 24 | 0 | 255 | | ❌ | CPP · cppcheck | 9 | 0 | 957 | | ❌ | YAML · yamllint | 2 | 0 | 57 | | ❌ | BASH · shellcheck | 1 | 0 | 11 | | ❌ | DOCKERFILE · hadolint | 1 | 0 | 9 | | ❌ | REPOSITORY · trivy | 1 | 0 | – | <details><summary>MARKDOWN · markdownlint: first lines of the output</summary> ```text See documentation on https://megalinter.io/9.4.0/descriptors/markdown_markdownlint/ ----------------------------------------------- ❌ [ERROR] for workspace /workspace/khyretos/kk-engine Linter raw log: docs/ANDROID.md:87 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/ANDROID.md:128 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/ANDROID.md:136 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/ANDROID.md:149 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/ANDROID.md:163 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/ANDROID.md:186 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/ASSETS.md:155 error MD046/code-block-style Code block style [Expected: fenced; Actual: indented] docs/HISTORY.md:21 error MD025/single-title/single-h1 Multiple top-level headings in the same document [Context: " Kreative Kompas Engine (KKE)"] docs/HISTORY.md:520 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/HISTORY.md:727 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/HISTORY.md:734 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/HISTORY.md:2031 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/HISTORY.md:2090 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/MODDING.md:13 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/NETWORKING.md:114 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/PLATFORMS.md:48 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/PROCEDURAL_ANIMATION.md:36 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] docs/PROCEDURAL_ANIMATION.md:284 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] games/racing/README.md:34 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] games/racing/README.md:76:91 error MD056/table-column-count Table column count [Expected: 4; Actual: 3; Too few cells, row will be missing data] games/racing/README.md:77:89 error MD056/table-column-count Table column count [Expected: 4; Actual: 3; Too few cells, row will be missing data] … ``` </details> <details><summary>CPP · cppcheck: first lines of the output</summary> ```text See documentation on https://megalinter.io/9.4.0/descriptors/cpp_cppcheck/ ----------------------------------------------- ✅ [SUCCESS] benchmarks/kke_bench/main.cpp ✅ [SUCCESS] benchmarks/kke_benchmark/main.cpp ✅ [SUCCESS] engine/include/engine/Buffer.h ✅ [SUCCESS] engine/include/engine/Mesh.h ✅ [SUCCESS] engine/include/engine/Pipeline.h ✅ [SUCCESS] engine/include/engine/Renderer.h ✅ [SUCCESS] engine/include/engine/SwapChain.h ✅ [SUCCESS] engine/include/engine/VulkanCheck.h ✅ [SUCCESS] engine/include/engine/VulkanDevice.h ✅ [SUCCESS] engine/include/engine/Window.h ✅ [SUCCESS] engine/include/kke/AnimEvents.h ✅ [SUCCESS] engine/include/kke/AnimRig.h ✅ [SUCCESS] engine/include/kke/Animator.h ✅ [SUCCESS] engine/include/kke/AnimeRenderer.h ✅ [SUCCESS] engine/include/kke/Application.h ✅ [SUCCESS] engine/include/kke/AssetCatalog.h ✅ [SUCCESS] engine/include/kke/AudioMixer.h ✅ [SUCCESS] engine/include/kke/AutoRig.h ✅ [SUCCESS] engine/include/kke/BenchRecorder.h ✅ [SUCCESS] engine/include/kke/BenchmarkReport.h ✅ [SUCCESS] engine/include/kke/Bloom.h ✅ [SUCCESS] engine/include/kke/BodyShape.h ✅ [SUCCESS] engine/include/kke/BreakGraph.h … ``` </details> <details><summary>YAML · yamllint: first lines of the output</summary> ```text See documentation on https://megalinter.io/9.4.0/descriptors/yaml_yamllint/ ----------------------------------------------- ❌ [ERROR] for workspace /workspace/khyretos/kk-engine Linter raw log: games/goblin_horde/data/heroes.yml 53:11 error too many spaces after colon (colons) 63:11 error too many spaces after colon (colons) ``` </details> <details><summary>BASH · shellcheck: first lines of the output</summary> ```text See documentation on https://megalinter.io/9.4.0/descriptors/bash_shellcheck/ ----------------------------------------------- ❌ [ERROR] for workspace /workspace/khyretos/kk-engine Linter raw log: In tools/packaging/package.sh line 130: done < <(find "$stage" "$stage/benchmark" -maxdepth 1 -type f \( -name "*$exe" -o -name '*.dll' \) $([ -z "$exe" ] && echo "-perm -u+x") -print0) ^-- SC2046 (warning): Quote this to prevent word splitting. For more information: https://www.shellcheck.net/wiki/SC2046 -- Quote this to prevent word splitt... ``` </details> <details><summary>DOCKERFILE · hadolint: first lines of the output</summary> ```text See documentation on https://megalinter.io/9.4.0/descriptors/dockerfile_hadolint/ ----------------------------------------------- ❌ [ERROR] for workspace /workspace/khyretos/kk-engine Linter raw log: docker/android.Dockerfile:19 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check docker/appimage.Dockerfile:38 SC2016 info: Expressions don't expand in single quotes, use double quotes for that. docker/appimage.Dockerfile:51 DL3003 warning: Use WORKDIR to switch to a directory docker/appimage.Dockerfile:57 DL3003 warning: Use WORKDIR to switch to a directory docker/appimage.Dockerfile:63 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check docker/appimage.Dockerfile:63 DL3003 warning: Use WORKDIR to switch to a directory docker/appimage.Dockerfile:73 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check docker/appimage.Dockerfile:73 DL3003 warning: Use WORKDIR to switch to a directory docker/ci.Dockerfile:42 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check docker/ci.Dockerfile:56 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check docker/server/Dockerfile:22 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check docker/vm.Dockerfile:22 SC2086 info: Double quote to prevent globbing and word splitting. docker/vm.Dockerfile:29 DL3003 warning: Use WORKDIR to switch to a directory docker/vm.Dockerfile:29 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check website/Dockerfile:9 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check ``` </details> <details><summary>REPOSITORY · trivy: first lines of the output</summary> ```text See documentation on https://megalinter.io/9.4.0/descriptors/repository_trivy/ ----------------------------------------------- ❌ [ERROR] for workspace /workspace/khyretos/kk-engine Linter raw log: 2026-10-27T21:15:22Z INFO [vulndb] Need to update DB 2026-10-27T21:15:22Z INFO [vulndb] Downloading vulnerability DB... 2026-10-27T21:15:22Z INFO [vulndb] Downloading artifact... repo="mirror.gcr.io/aquasec/trivy-db:2" 2.29 MiB / 130.09 MiB [->____________________________________________________________] 1.76% ? p/s ?10.01 MiB / 130.09 MiB [---->________________________________________________________] 7.69% ? p/s ?19.71 MiB / 130.09 MiB [--------->__________________________________________________] 15.15% ? p/s ?25.31 MiB / 130.09 MiB [--------->_____________________________________] 19.45% 38.41 MiB p/s ETA 2s36.50 MiB / 130.09 MiB [------------->_________________________________] 28.06% 38.41 MiB p/s ETA 2s46.57 MiB / 130.09 MiB [---------------->______________________________] 35.80% 38.41 MiB p/s ETA 2s54.36 MiB / 130.09 MiB [------------------->___________________________] 41.79% 39.05 MiB p/s ETA 1s60.33 MiB / 130.09 MiB [--------------------->_________________________] 46.38% 39.05 MiB p/s ETA 1s69.84 MiB / 130.09 MiB [------------------------->_____________________] 53.69% 39.05 MiB p/s ETA 1s78.55 MiB / 130.09 MiB [---------------------------->__________________] 60.39% 39.14 MiB p/s ETA 1s87.25 MiB / 130.09 MiB [------------------------------->_______________] 67.07% 39.14 MiB p/s ETA 1s97.28 MiB / 130.09 MiB [----------------------------------->___________] 74.78% 39.14 MiB p/s ETA 0s106.66 MiB / 130.09 MiB [------------------------------------->________] 81.99% 39.63 MiB p/s ETA 0s116.73 MiB / 130.09 MiB [----------------------------------------->____] 89.73% 39.63 MiB p/s ETA 0s127.89 MiB / 130.09 MiB [--------------------------------------------->] 98.31% 39.63 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 39.59 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 39.59 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 39.59 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 37.04 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 37.04 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 37.04 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 34.65 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 34.65 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 34.65 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 32.41 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 32.41 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 32.41 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 30.32 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 30.32 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 30.32 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 28.37 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 28.37 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 28.37 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 26.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 26.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 26.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 24.82 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 24.82 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 24.82 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 23.22 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 23.22 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 23.22 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 21.72 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 21.72 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 21.72 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 20.32 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 20.32 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 20.32 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 19.01 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 19.01 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 19.01 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 17.78 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 17.78 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 17.78 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 16.64 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 16.64 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 16.64 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 15.56 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 15.56 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 15.56 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 14.56 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 14.56 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 14.56 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 13.62 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 13.62 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 13.62 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 12.74 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 12.74 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 12.74 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 11.92 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 11.92 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 11.92 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 11.15 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 11.15 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 11.15 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 10.43 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 10.43 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------->] 100.00% 10.43 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 9.76 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 9.76 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 9.76 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 9.13 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 9.13 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 9.13 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 8.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 8.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 8.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 7.99 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 7.99 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 7.99 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 7.47 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 7.47 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 7.47 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.99 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.99 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.99 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.54 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.12 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.12 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 6.12 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 5.72 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 5.72 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [--------------------------------------------->] 100.00% 5.72 MiB p/s ETA 0s130.09 MiB / 130.09 MiB [-------------------------------------------------] 100.00% 6.22 MiB p/s 21s2026-10-27T21:15:44Z INFO [vulndb] Artifact successfully downloaded repo="mirror.gcr.io/aquasec/trivy-db:2" 2026-10-27T21:15:44Z INFO [vuln] Vulnerability scanning is enabled 2026-10-27T21:15:44Z INFO [misconfig] Misconfiguration scanning is enabled 2026-10-27T21:15:44Z INFO [checks-client] Need to update the checks bundle 2026-10-27T21:15:44Z INFO [checks-client] Downloading the checks bundle... 234.57 KiB / 234.57 KiB [------------------------------------------------------] 100.00% ? p/s 200ms2026-10-27T21:15:48Z WARN [rego] Module will be skipped as current version of Trivy is older than minimum trivy version required - please update Trivy to use this module file_path="root/.cache/trivy/policy/content/policies/cloud/policies/aws/cloudfront/enable_logging.rego" minimum_trivy_version="0.72.0" 2026-10-27T21:15:49Z ERROR [dockerfile scanner] Failed to parse file file_path="docker/server/Dockerfile.dockerignore" err="parse dockerfile instruction: parse instruction \".git\": unknown instruction: .git" 2026-10-27T21:15:49Z INFO Number of language-specific files num=0 2026-10-27T21:15:49Z INFO Detected config files num=9 Report Summary ┌──────────────────────────────┬────────────┬─────────────────┬───────────────────┐ │ Target │ Type │ Vulnerabilities │ Misconfigurations │ ├──────────────────────────────┼────────────┼─────────────────┼───────────────────┤ │ benchmarks/docker/Dockerfile │ dockerfile │ - │ 2 │ ├──────────────────────────────┼────────────┼─────────────────┼───────────────────┤ │ docker/android.Dockerfile │ dockerfile │ - │ 2 │ ├──────────────────────────────┼────────────┼─────────────────┼───────────────────┤ │ docker/appimage.Dockerfile │ dockerfile │ - │ 5 │ … ``` </details> 🧹 Formatting only (layout, no behaviour; the nightly lint-fix job applies these as a PR): YAML · prettier (57 files checked), BASH · shfmt (11 files checked), JSON · prettier (147 files checked) ✅ Clean: actionlint, git_diff, gitleaks, grype, jsonlint, secretlint, stylelint, trufflehog, xmllint <sub>MegaLinter on soucouyant · full logs in the Actions run · comment <code>/improve</code> for AI fix suggestions</sub>
Some checks failed
CI / dependencies (pull_request) Successful in 16s
CI / std-includes (pull_request) Successful in 22s
CI / shipping-build (pull_request) Failing after 4m1s
Benchmarks / benchmarks (pull_request) Failing after 7m52s
Docs site / site (pull_request) Successful in 24s
CI / android (pull_request) Failing after 4m38s
CI / build-test-and-coverage (pull_request) Failing after 9m34s
lint / megalinter (pull_request) Successful in 3m19s
CI / release-build (pull_request) Failing after 12m40s
Windows (native) / build (pull_request) Failing after 6m21s
Windows (native) / test (pull_request) Has been skipped
Windows (native) / publish (pull_request) Has been skipped
This pull request is marked as a work in progress.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin +refs/pull/139/head:khyretos/claude/creator-vitruvian
git switch khyretos/claude/creator-vitruvian

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch claude/creator-polish
git merge --no-ff khyretos/claude/creator-vitruvian
git switch khyretos/claude/creator-vitruvian
git rebase claude/creator-polish
git switch claude/creator-polish
git merge --ff-only khyretos/claude/creator-vitruvian
git switch khyretos/claude/creator-vitruvian
git rebase claude/creator-polish
git switch claude/creator-polish
git merge --no-ff khyretos/claude/creator-vitruvian
git switch claude/creator-polish
git merge --squash khyretos/claude/creator-vitruvian
git switch claude/creator-polish
git merge --ff-only khyretos/claude/creator-vitruvian
git switch claude/creator-polish
git merge khyretos/claude/creator-vitruvian
git push origin claude/creator-polish
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
khyretos/kk-engine!139
No description provided.